23 Dec, 2014
1 commit
-
TI-Feature: rpmsg
TI-Tree: git://git.ti.com/rpmsg/rpmsg.git
TI-Branch: rpmsg-ti-linux-3.14.y* 'rpmsg-ti-linux-3.14.y' of git://git.ti.com/rpmsg/rpmsg:
ARM: dts: AM4372: Add ti,mbox-send-noirq to wkup_m3 mailbox
ARM: dts: AM33XX: Add ti,mbox-send-noirq to wkup_m3 mailbox
mailbox/omap: Add ti,mbox-send-noirq quirk to fix AM33xx CPU IdleSigned-off-by: Texas Instruments Auto Merger
20 Dec, 2014
2 commits
-
…ux-kernel/audio-display-linux-feature-tree into ti-linux-3.14.y
TI-Feature: audio-display
TI-Tree: git://git.ti.com/~darrene/ti-linux-kernel/audio-display-linux-feature-tree.git
TI-Branch: audio-display-ti-linux-3.14.y* 'audio-display-ti-linux-3.14.y' of git://git.ti.com/~darrene/ti-linux-kernel/audio-display-linux-feature-tree:
ASoC: tlv320aic31xx: Do not ignore errors in aic31xx_device_init()
video/logo: prevent use of logos after they have been freed
drm/omap: fix race conditon in DMM
drm/omap: fix race condition with dev->obj_listSigned-off-by: Dan Murphy <DMurphy@ti.com>
-
…-linux-feature-tree into ti-linux-3.14.y
TI-Feature: power_management_base
TI-Tree: git://git.ti.com/~kristo/ti-linux-kernel/pm-linux-feature-tree.git
TI-Branch: pm-ti-linux-3.14.y* 'pm-ti-linux-3.14.y' of git://git.ti.com/~kristo/ti-linux-kernel/pm-linux-feature-tree:
ARM: OMAP2: pm33xx: Bump firmware version requirement to 0x190
remoteproc: wkup_m3_rproc: Modify wkup_m3_ping to not use interrupts
remoteproc: wkup_m3: Defer probe until wkup_m3_pm_ops are populated
ARM: OMAP2+: pm33xx: Only pass i2c volt scale offsets for DeepSleep
ARM: dts: AM4372: Add ti,mbox-send-noirq to wkup_m3 mailbox
ARM: dts: AM33XX: Add ti,mbox-send-noirq to wkup_m3 mailbox
mailbox/omap: Add ti,mbox-send-noirq quirk to fix AM33xx CPU IdleSigned-off-by: Dan Murphy <DMurphy@ti.com>
19 Dec, 2014
7 commits
-
Bump PM firmware minimum version requirement to 0x190 to fix AM335x
cpuidle that uses the CM3 for MPU clock gating.Signed-off-by: Dave Gerlach
-
…rnel/platform-linux-feature-tree into ti-linux-3.14.y
TI-Feature: platform_base
TI-Tree: git://git.ti.com/~rrnayak/ti-linux-kernel/platform-linux-feature-tree.git
TI-Branch: platform-ti-linux-3.14.y* 'platform-ti-linux-3.14.y' of git://git.ti.com/~rrnayak/ti-linux-kernel/platform-linux-feature-tree:
ARM: OMAP2+: hwmod: Fix _wait_target_ready() for hwmods without syscSigned-off-by: Texas Instruments Auto Merger <lcpd_integration@list.ti.com>
-
[ Upstream commit a72d2abbe5752f3a773c4d8b7b41ae41f617f772 ]
We need to return the error codes from aic31xx_device_init() and return
from the i2c_probe with the error code.
We will have kernel panic (NULL pointer dereference) in
regulator_register_notifier() in case the devm_regulator_bulk_get() fails
(with -EPROBE_DEFER for example).Signed-off-by: Peter Ujfalusi
Signed-off-by: Mark Brown
Cc: stable@vger.kernel.orgConflicts:
sound/soc/codecs/tlv320aic31xx.c
Signed-off-by: Jyri Sarha
-
There are quite a few hwmods that don't have sysconfig register and so
_find_mpu_rt_port(oh) will return NULL thus preventing ready state check
on those modules after the module is enabled.This can potentially cause a bus access error if the module is accessed
before the module is ready.Get rid of the redundant _find_mpu_rt_port() check from the _wait_target_ready()
funcion for all the SoCs. The following PRCM register access that checks the
module ready state has nothing to do with module's SYSCONFIG or mpu_rt_port.e.g. this fixes the below DCAN bus access error on AM437x-gp-evm.
[ 16.672978] ------------[ cut here ]------------
[ 16.677885] WARNING: CPU: 0 PID: 1580 at drivers/bus/omap_l3_noc.c:147 l3_interrupt_handler+0x234/0x35c()
[ 16.687946] 44000000.ocp:L3 Custom Error: MASTER M2 (64-bit) TARGET L4_PER_0 (Read): Data Access in User mode during Functional access
[ 16.700654] Modules linked in: xhci_hcd btwilink ti_vpfe dwc3 videobuf2_core ov2659 bluetooth v4l2_common videodev ti_am335x_adc kfifo_buf industrialio c_can_platform videobuf2_dma_contig media snd_soc_tlv320aic3x pixcir_i2c_ts c_can dc
[ 16.731144] CPU: 0 PID: 1580 Comm: rpc.statd Not tainted 3.14.26-02561-gf733aa036398 #180
[ 16.739747] Backtrace:
[ 16.742336] [] (dump_backtrace) from [] (show_stack+0x18/0x1c)
[ 16.750285] r6:00000093 r5:00000009 r4:eab5b8a8 r3:00000000
[ 16.756252] [] (show_stack) from [] (dump_stack+0x20/0x28)
[ 16.763870] [] (dump_stack) from [] (warn_slowpath_common+0x6c/0x8c)
[ 16.772408] [] (warn_slowpath_common) from [] (warn_slowpath_fmt+0x38/0x40)
[ 16.781550] r8:c05d1f90 r7:c0730844 r6:c0730448 r5:80080003 r4:ed0cd210
[ 16.788626] [] (warn_slowpath_fmt) from [] (l3_interrupt_handler+0x234/0x35c)
[ 16.797968] r3:ed0cd480 r2:c0730508
[ 16.801747] [] (l3_interrupt_handler) from [] (handle_irq_event_percpu+0x54/0x1bc)
[ 16.811533] r10:ed005600 r9:c084855b r8:0000002a r7:00000000 r6:00000000 r5:0000002a
[ 16.819780] r4:ed0e6d80
[ 16.822453] [] (handle_irq_event_percpu) from [] (handle_irq_event+0x30/0x40)
[ 16.831789] r10:eb2b6938 r9:eb2b6960 r8:bf011420 r7:fa240100 r6:00000000 r5:0000002a
[ 16.840052] r4:ed005600
[ 16.842744] [] (handle_irq_event) from [] (handle_fasteoi_irq+0x74/0x128)
[ 16.851702] r4:ed005600 r3:00000000
[ 16.855479] [] (handle_fasteoi_irq) from [] (generic_handle_irq+0x28/0x38)
[ 16.864523] r4:0000002a r3:c0066164
[ 16.868294] [] (generic_handle_irq) from [] (handle_IRQ+0x38/0x8c)
[ 16.876612] r4:c081c640 r3:00000202
[ 16.880380] [] (handle_IRQ) from [] (gic_handle_irq+0x30/0x5c)
[ 16.888328] r6:eab5ba38 r5:c0804460 r4:fa24010c r3:00000100
[ 16.894303] [] (gic_handle_irq) from [] (__irq_svc+0x40/0x50)
[ 16.902193] Exception stack(0xeab5ba38 to 0xeab5ba80)
[ 16.907499] ba20: 00000000 00000006
[ 16.916108] ba40: fa1d0000 fa1d0008 ed3d3000 eab5bab4 ed3d3460 c0842af4 bf011420 eb2b6960
[ 16.924716] ba60: eb2b6938 eab5ba8c eab5ba90 eab5ba80 bf035220 bf07702c 600f0013 ffffffff
[ 16.933317] r7:eab5ba6c r6:ffffffff r5:600f0013 r4:bf07702c
[ 16.939317] [] (c_can_plat_read_reg_aligned_to_16bit [c_can_platform]) from [] (c_can_get_berr_counter+0x38/0x64 [c_can])
[ 16.952696] [] (c_can_get_berr_counter [c_can]) from [] (can_fill_info+0x124/0x15c [can_dev])
[ 16.963480] r5:ec8c9740 r4:ed3d3000
[ 16.967253] [] (can_fill_info [can_dev]) from [] (rtnl_fill_ifinfo+0x58c/0x8fc)
[ 16.976749] r6:ec8c9740 r5:ed3d3000 r4:eb2b6780
[ 16.981613] [] (rtnl_fill_ifinfo) from [] (rtnl_dump_ifinfo+0xf0/0x1dc)
[ 16.990401] r10:ec8c9740 r9:00000000 r8:00000000 r7:00000000 r6:ebd4d1b4 r5:ed3d3000
[ 16.998671] r4:00000000
[ 17.001342] [] (rtnl_dump_ifinfo) from [] (netlink_dump+0xa8/0x1e0)
[ 17.009772] r10:00000000 r9:00000000 r8:c0503318 r7:ebf3e6c0 r6:ebd4d1b4 r5:ec8c9740
[ 17.018050] r4:ebd4d000
[ 17.020714] [] (netlink_dump) from [] (__netlink_dump_start+0x104/0x154)
[ 17.029591] r6:eab5bd34 r5:ec8c9980 r4:ebd4d000
[ 17.034454] [] (__netlink_dump_start) from [] (rtnetlink_rcv_msg+0x110/0x1f4)
[ 17.043778] r7:00000000 r6:ec8c9980 r5:00000f40 r4:ebf3e6c0
[ 17.049743] [] (rtnetlink_rcv_msg) from [] (netlink_rcv_skb+0xb4/0xc8)
[ 17.058449] r8:eab5bdac r7:ec8c9980 r6:c05054f4 r5:ec8c9980 r4:ebf3e6c0
[ 17.065534] [] (netlink_rcv_skb) from [] (rtnetlink_rcv+0x24/0x2c)
[ 17.073854] r6:ebd4d000 r5:00000014 r4:ec8c9980 r3:c0504110
[ 17.079846] [] (rtnetlink_rcv) from [] (netlink_unicast+0x180/0x1ec)
[ 17.088363] r4:ed0c6800 r3:c0504110
[ 17.092113] [] (netlink_unicast) from [] (netlink_sendmsg+0x2ac/0x380)
[ 17.100813] r10:00000000 r8:00000008 r7:ec8c9980 r6:ebd4d000 r5:eab5be70 r4:eab5bee4
[ 17.109083] [] (netlink_sendmsg) from [] (sock_sendmsg+0x90/0xb0)
[ 17.117305] r10:00000000 r9:eab5a000 r8:becdda3c r7:0000000c r6:ea978400 r5:eab5be70
[ 17.125563] r4:c05103c4
[ 17.128225] [] (sock_sendmsg) from [] (SyS_sendto+0xb8/0xdc)
[ 17.136001] r6:becdda5c r5:00000014 r4:ecd37040
[ 17.140876] [] (SyS_sendto) from [] (ret_fast_syscall+0x0/0x30)
[ 17.148923] r10:00000000 r8:c000e804 r7:00000122 r6:becdda5c r5:0000000c r4:becdda5c
[ 17.157169] ---[ end trace 2b71e15b38f58bad ]---Signed-off-by: Roger Quadros
-
If the probe of an fb driver has been deferred due to missing
dependencies, and the probe is later ran when a module is loaded, the
fbdev framework will try to find a logo to use.However, the logos are __initdata, and have already been freed. This
causes sometimes page faults, if the logo memory is not mapped,
sometimes other random crashes as the logo data is invalid, and
sometimes nothing, if the fbdev decides to reject the logo (e.g. the
random value depicting the logo's height is too big).This patch adds a late_initcall function to mark the logos as freed. In
reality the logos are freed later, and fbdev probe may be ran between
this late_initcall and the freeing of the logos. In that case we will
miss drawing the logo, even if it would be possible.Signed-off-by: Tomi Valkeinen
Signed-off-by: Jyri Sarha -
The omapdrm DMM code sometimes crashes with:
WARNING: CPU: 0 PID: 1235 at lib/list_debug.c:36 __list_add+0x8c/0xbc()
list_add double add: new=e9265368, prev=e90139c4, next=e9265368.This is caused by the code calling release_engine() twice for the same
engine.dmm_txn_commit(wait=true) call is supposed to wait until the DMM
transaction has been finished. And it does that, but it does not wait
for the irq handler to finish.What happens is that the irq handler is triggered, and it either wakes
up the thread that called dmm_txn_commit(), or that thread never even
slept because the transaction was finished in the HW very quickly. That
thread then continues executing, even if the irq handler is not yet
finished, and a new transaction may be initiated. If that transaction is
async (i.e. wait=false), a 'async' flag is set to true. The original irq
handler, which has yet not finished, then sees the transaction as
'async', even if it was supposed to be 'sync'.When that happens, the irq handler does an extra release_engine() call
because it thinks it need to release the engine, leading to the crash.This patch fixes the issue by using completion to ensure that the irq
handler has finished before a dmm_txn_commit(wait=true) may continue.Signed-off-by: Tomi Valkeinen
Signed-off-by: Jyri Sarha -
omap_gem_objects are added to dev->obj_list in omap_gem_new, and removed
in omap_gem_free_object. Unfortunately there's no locking for
dev->obj_list, which eventually leads to a crash:WARNING: CPU: 1 PID: 1123 at lib/list_debug.c:59 __list_del_entry+0xa4/0xe0()
list_del corruption. prev->next should be e9281344, but was ea722b84Add a spinlock to protect dev->obj_list.
Signed-off-by: Tomi Valkeinen
Signed-off-by: Jyri Sarha
17 Dec, 2014
8 commits
-
The wkup_m3 needs the ability to receive messages in noirq context
during cpuidle transition. Change wkup_m3_ping to not use any mailbox
interrupts during ping now that the mailbox driver can handle sending
the message in noirq context.Signed-off-by: Dave Gerlach
-
Defer probe till remowkup_m3_pm_ops are populated. This is to ensure
that wkup_m3 is probed after the wkup_m3_pm_ops are populated by the
mach-omap2 init call. This ensures clean initialization of m3.Signed-off-by: Keerthy
Acked-by: Dave Gerlach -
The offsets for i2c voltage scaling sequence were being set directly
into IPC register 5 and being passed for all PM operations. This is
incorrect as only DeepSleep0 should scale voltage, not standby or
cpuidle. Instead we should store the value when it is calculated
and only pass for DeepSleep operation, not cpuidle operation.Signed-off-by: Dave Gerlach
-
Add ti,mbox-send-noirq to wkup_m3 mailbox so that messages using
wkup_m3 mailbox are sent without triggering any further interrupts.
This is required to be able to send multiple messages to the WkupM3
after the mailbox usage logic adjustment in the wkup_m3_ipc driver.Signed-off-by: Keerthy
Acked-by: Dave Gerlach
[s-anna@ti.com: revise commit description]
Signed-off-by: Suman Anna -
Add ti,mbox-send-noirq to wkup_m3 mailbox so that messages using
wkup_m3 mailbox are sent without triggering any further interrupts.
This is needed to achieve lower power numbers during CPU idle on
AM33xx.Tested-by: Keerthy
Signed-off-by: Dave Gerlach
[s-anna@ti.com: revise commit description]
Signed-off-by: Suman Anna -
The mailbox framework controls the transmission queue and requires
either its controller implementations or clients to run the state
machine for the Tx queue. The OMAP mailbox controller uses a Tx-ready
interrupt as the equivalent of a Tx-done interrupt to run this Tx
queue state-machine.The WkupM3 processor on AM33xx and AM43xx SoCs is used to offload
certain PM tasks, like doing the necessary operations for Device
PM suspend/resume or for entering lower c-states during cpuidle.The CPUIdle on AM33xx requires the messages to be sent without
having to trigger the Tx-ready interrupts, as the interrupt
would immediately terminate the CPUIdle operation. Support for
this has been added by introducing a DT quirk, "ti,mbox-send-noirq"
and using it to modify the normal OMAP mailbox controller behavior
on the sub-mailboxes used to communicate with the WkupM3 remote
processor. This also requires the wkup_m3_ipc driver to adjust
its mailbox usage logic to run the Tx state machine.NOTE:
- AM43xx does not communicate with WkupM3 for CPU Idle, so is
not affected by this behavior. But, it uses the same IPC driver
for PM suspend/resume functionality, so requires the quirk as
well, because of changes to the common wkup_m3_ipc driver.Signed-off-by: Dave Gerlach
[s-anna@ti.com: revise logic and update comments/patch description]
Signed-off-by: Suman Anna -
Pull in the updated remoteproc feature branch that includes the
updates to the OMAP mailbox driver required for AM33xx/AM43xx
PM fixes.* 'rproc-linux-3.14.y' of git://git.ti.com/rpmsg/remoteproc:
ARM: dts: AM4372: Add ti,mbox-send-noirq to wkup_m3 mailbox
ARM: dts: AM33XX: Add ti,mbox-send-noirq to wkup_m3 mailbox
mailbox/omap: Add ti,mbox-send-noirq quirk to fix AM33xx CPU IdleSigned-off-by: Suman Anna
-
Pull in the updated mailbox feature branch into the remoteproc
tree, this adds a mailbox quirk to fix AM33xx CPU Idle and the
associated updates for the mailbox communication to work with
the WkupM3 remote processor on AM33xx/AM43xx SoCs.* 'mailbox-linux-3.14.y' of git://git.ti.com/rpmsg/mailbox:
ARM: dts: AM4372: Add ti,mbox-send-noirq to wkup_m3 mailbox
ARM: dts: AM33XX: Add ti,mbox-send-noirq to wkup_m3 mailbox
mailbox/omap: Add ti,mbox-send-noirq quirk to fix AM33xx CPU IdleSigned-off-by: Suman Anna
16 Dec, 2014
22 commits
-
…egration-tree/connectivity-ti-linux-kernel into ti-linux-3.14.y
* 'connectivity-ti-linux-3.14.y' of git://git.ti.com/connectivity-integration-tree/connectivity-ti-linux-kernel: (27 commits)
ARM: dts: dra7: make usb1 of dra7-evm and dra72-evm as OTG
ARM: dts: am437x-gp-evm: Move pinctrl data to dwc3_omap wrapper from usb_phy
usb: dwc3: dwc3-omap: USB DRVVBUS pinctrl state should be set from wrapper
usb: host: xhci: Call suspend/resume depending on DRD state
usb: dwc3: gadget: Mark freed EPs as NULL
usb: dwc3: dwc3-omap: Fix disable IRQ
usb: dwc3: Save/Restore OTG registers while suspend/resume
arm: dts: am43x evms: Make usb1 as OTG
arm: dts: exynos5250: Add named interrupt property for dwc3
arm: dts: dra7: Add named interrupt property for dwc3
arm: dts: omap5: Add named interrupt property for dwc3
arm: dts: am4372: Add named interrupt property for dwc3
usb: dwc3: otg: Add the initial otg driver for dwc3.
usb: dwc3: core: Add DWC3 OTG specific register defines
usb: dwc3: gadget: Adapt gadget to drd library
usb: dwc3: Add seperate dwc3_gadget object to support gadget release
usb: dwc3: core: Adapt to named interrupts
usb: dwc3: dwc3-omap: Make the wrapper interrupt shared
usb: dwc3: core: Add dwc3_drd_helper function
usb: host: xhci: Adapt xhci to use usb drd library
... -
Make USB1 of dra7-evm and dra72-evm as OTG.
Signed-off-by: George Cherian
Signed-off-by: Sekhar Nori -
Now that we switch pinctrl states from dwc3-omap wrapper driver,
add the pinctrl data to wrapper node.Signed-off-by: George Cherian
Signed-off-by: Sekhar Nori -
The USB DRVVBUS pinctrl state should be changed from the wrapper driver
rather than from the PHY driver. While testing suspend with DRD enabled,
it is seen that we miss interrupts since the pin state is switched to
default later by the PHY driver where as the wrapper driver starts using
the pin before that.To avoid this maintain pin states in wrapper driver.
Signed-off-by: George Cherian
[nsekhar@ti.com: updates to patch description]
Signed-off-by: Sekhar Nori -
It's quite possible that the system might enter suspend after switching
role from host to device. In such scenarios, the xhci platform device is
still valid but the HCD will be removed. With the help of DRD library
determine the state and call suspend/resume accordingly.Signed-off-by: George Cherian
Signed-off-by: Sekhar Nori -
The freed EPs should be marked as NULL else any further
access would cause issues. This was seen while testing suspend/resume
with DRD enabled. While at it, check for valid ep0 and ep1 during
suspend /resume.ep0 and ep1 are freed while switching from host to device mode.
Now that we make it NULL after freeing check the validity during
suspend/resume.Signed-off-by: George Cherian
[nsekhar@ti.com: minor tweaks to patch description]
Signed-off-by: Sekhar Nori -
In the wrapper the IRQ disable should be done by writing 1's to the
IRQ*_CLR register. Existing code is broken because it instead writes
zeros to IRQ*_SET register.Fix this by adding functions dwc3_omap_write_irqmisc_clr() and
dwc3_omap_write_irq0_clr() which do the right thing.Signed-off-by: George Cherian
[nsekhar@ti.com: minor tweaks to patch description]
Signed-off-by: Sekhar Nori -
With DRD enabled, OTG registers can lose context during suspend
resume. Save the registers during suspend and restore them
while resuming.Signed-off-by: George Cherian
[nsekhar@ti.com: minor tweaks to patch description]
Signed-off-by: Sekhar Nori -
USB1 of am43x EPOS EVM, am437x GP EVM and am437x SK EVM can be used as OTG.
Enable the same.Signed-off-by: George Cherian
Signed-off-by: Sekhar Nori -
Add interrupt names so that the same can be used for OTG easily.
Signed-off-by: George Cherian
Signed-off-by: Sekhar Nori -
Add interrupt names so that the same can be used for OTG easily.
Signed-off-by: George Cherian
Signed-off-by: Sekhar Nori -
Add interrupt names so that the same can be used for OTG easily.
Signed-off-by: George Cherian
Signed-off-by: Sekhar Nori -
Add interrupt names so that the same can be used for OTG easily.
Signed-off-by: Felipe Balbi
Signed-off-by: George Cherian
Signed-off-by: Sekhar Nori -
Add the Initial OTG driver for dwc3.
Currently support only
* ID based Role switching.Signed-off-by: George Cherian
Signed-off-by: Sekhar Nori -
Add OTG reggister defines to DWC3 core.h
Signed-off-by: George Cherian
Signed-off-by: Sekhar Nori -
Adapt the dwc3 gadget to use drd library functions.
In preparation to support DRD on dwc3.Signed-off-by: George Cherian
[nsekhar@ti.com: fix sparse warnings]
Signed-off-by: Sekhar Nori -
With the current implementation it's impossible to release the gadget.
Add a separate dwc3_gadget object to dwc3 structure so that the same
can be freed during the gadget release.
This is in prepration to adapt dwc3 gadget driver to drd library.
DRD library uses usb_del/add_gadget_udc while switching roles between
HOST and DEVICE modes. If the usb_gadget is not released during usb_del_gadget_udc,
the subsequent usb_add_gadget_udc would try to initialize an already initialized
kobject. To avoid this make sure we have an easily freeable object.Signed-off-by: George Cherian
Signed-off-by: Sekhar Nori -
Add support to use interrupt names,
Following are the interrupt names
Peripheral Interrupt - peripheral
HOST Interrupt - host
OTG Interrupt - otgSigned-off-by: Felipe Balbi
Signed-off-by: George Cherian
Signed-off-by: Sekhar Nori -
OTG interrupt and wrapper is shared
Signed-off-by: George Cherian
Signed-off-by: Sekhar Nori -
This helper function, facilitates to re-initialize the event buffers.
It re-initilizes the event buffers while switching role from
HOST to DEVICE mode.The DWC3 IP shares internal RAM for both HOST and Device specific registers.
So while switching roles from HOST to Device modes, it's required to
re-initialize the EVENT buffer registers for the Device mode to continue
work properly. dwc3_event_buffers_setup() is exported out from core.c via
wrapper dwc3_core_gadget_helper() which will be invoked from dwc3 otg driver.Signed-off-by: George Cherian
Signed-off-by: Sekhar Nori -
Adapt the xhci-plat driver to use drd library functions.
In prepration to support DRD on dwc3.Signed-off-by: George Cherian
Signed-off-by: Sekhar Nori -
Pass the quir flag XHCI_DRD_SUPPORT from DWC3 host to xhci platform driver.
This enables xhci driver to handle deallocation's differently while in DRD mode.
Pass the quirk flag XHCI_NEEDS_LHC_RESET from DWC3 host to xhci platform
driver. This enables to do LHRESET during xhci_reset().Signed-off-by: George Cherian
Signed-off-by: Sekhar Nori