usb: dwc3-msm: Add support for controller power collapse

Starting from msm USB core version 1.2.0, if usb cable is
disconnected controller power collapse is allowed. Hence
add support to vote for Global Distributed Switch
Controller (GDSC) when usb cable is connected and remove
the vote when cable is disconnected to shut down the
controller power.

Signed-off-by: Hemant Kumar <hemantk@codeaurora.org>
Signed-off-by: Pranav Vashi <neobuddy89@gmail.com>
USB: msm_otg: Host: Allow XO shutdown only if no session is active

Currently msm_otg driver allows VDD minimization during host bus
suspend and depends on MPM for USB remote wakeup on platforms,
where D+ and D- lines are routed to MPM. As part of VDD minimization,
PHY will be put into retention state in which pull down resistors
are disabled. This scenario could cause issues without HW rework of
connecting pull down resistors on data lines. Hence don't allow
XO shutdown during host bus suspend if session is active.

Change-Id: Ic7274072cc4f266574cf45030bcadc469091c333
Signed-off-by: Vijayavardhan Vennapusa <vvreddy@codeaurora.org>
Signed-off-by: Pranav Vashi <neobuddy89@gmail.com>
USB: msm_otg: Add voting for sleep clock

USB PHY is provided sleep clock on few platform which is
required to enable for USB PHY functionality. Hence add
support to vote sleep clock if it exists.

CRs-Fixed: 518353
Change-Id: I67006bfe3fbe9b3ad3e1d1e2ddb0e8e060437bd7
Signed-off-by: Mayank Rana <mrana@codeaurora.org>
Signed-off-by: Pranav Vashi <neobuddy89@gmail.com>
USB: msm_otg: Correct USB PHY Reset sequence on newer platform

On few legacy platforms, USB PHY is having dedicated reset clk.
It is used to reset USB PHY after putting USB PHY into low power
mode and for calibration of USB PHY. Putting USB PHY into low
power mode is causing ulpi read/write timeout as expected USB PHY
reset clk is not available on newer platform. Hence remove USB PHY
reset clk usage and related reset code.

For 28nm PHY, Reset USB PHY after resestting USB LINK. Also reset
USB PHY using USB_PHY_PON bit with USB_OTG_HS_PHY_CTRL register
after programming USB PHY Override registers as suggested with
hardware programming guidelines. Also debug out important USB
register when ulpi read/write timeout is seen with USB PHY.

CRs-Fixed: 511102
CRs-Fixed: 511397
Change-Id: I8f0f49211a64aa6eac7643cd91a652aed40132e3
Signed-off-by: Mayank Rana <mrana@codeaurora.org>
Signed-off-by: Pranav Vashi <neobuddy89@gmail.com>
EHCI: HSIC: Disable CPU Idle states before resuming the port

The CPU idle states are disabled to reduce the USB GPT interrupt
latency during bus resume.  The pm_qos_update_request() is blocked
until all the online cores are brought out of idle states. If this
call is blocked for longer time than resume signaling, the resume
sequence is repeated again.  Fix it by calling pm_qos_update_request()
before resuming the port.  This patch also fixes a trivial bug related
to swfi_latency and standalone_latency handling in resume and reset
paths.

CRs-Fixed: 515547
Change-Id: I651910bf3ac296914af3642718bca3aa07d0d407
Signed-off-by: Pavankumar Kondeti <pkondeti@codeaurora.org>
Signed-off-by: Pranav Vashi <neobuddy89@gmail.com>
usb: msm_otg: Fix null ref pointer crash for some targets

Adding a check to ensure bus_scale_table exists in the platform data
before accessing it. This fix is good for targets which do not have
the bus_scale_table defined in the platform data.

Change-Id: I4ec1ce53b4b7cf545e8aae207e611fb8402ab491
Signed-off-by: Ido Shayevitz <idos@codeaurora.org>
Signed-off-by: Pranav Vashi <neobuddy89@gmail.com>
USB: gadget: composite: Don't enable endpoints if already enabled

As part of USBCV complaince, host sends set interface request
after set configuration request. This will reenable the endpoints
which are already enabled. This could cause WARN_ON message by
DCD. Hence check whether config is active or not and allow to call
function driver's set_alt if alternate setting is non zero.

CRs-Fixed: 486281
Change-Id: Id90c50f364b446329a38cd3b7389e4d0638d9023
Signed-off-by: Vijayavardhan Vennapusa <vvreddy@codeaurora.org>
Signed-off-by: Pranav Vashi <neobuddy89@gmail.com>
USB: dwc3: Don't handle USB/Link Status change event for RESUME

USB3 device controller will generate resume wakeup detected event
and also USB/Link status change event when USB Host initiates a
resume condition on the USB bus. Due to this, controller driver
calls gadget_driver->resume two times. This is leading to driver
sending missed disconnect uevent to userspace when it schedules
android_work to send uevent for second resume. As calling resume
from ULSTChng event is reduntant and hence should be removed.

CRs-Fixed: 548429
Change-Id: I8448dd42b20b84eebb68da1a1c83ea2849221f45
Signed-off-by: Vijayavardhan Vennapusa <vvreddy@codeaurora.org>
Signed-off-by: Pranav Vashi <neobuddy89@gmail.com>
USB: dwc3: Clear USB2PHY_SUSP bit during disconnect

Currently GUSB2PHY_SUSP bit is set in GUSB2PHYCFG(0) register
as part of initialization sequence and not clearing that bit
after that. If this bit is set during charger detection, it is
causing issues with VDP_SRC and IDM_SINK like VDP_SRC is not getting
applied within time, IDM_SINK is not large enough, due to which
battery charging complaince tests are failing with complaince test
device. Hence set this bit during peripheral/host start and clear
the bit while stopping peripheral/host role.

Also reduce the debouncing delay which should be in range [0-120]msec
for VBUS. Otherwise seeing battery charging complaince tests fail
due to bigger delay.

CRs-Fixed: 543926
Change-Id: I9ea87a19b43ce7804748dd3735ac436f77cdf933
Signed-off-by: Vijayavardhan Vennapusa <vvreddy@codeaurora.org>

Conflicts:
	drivers/usb/dwc3/gadget.c
Signed-off-by: Pranav Vashi <neobuddy89@gmail.com>
USB: android: Schedule work only if suspended variable is changed

currently as part of USB link status change event for U3 -> U0,
DWC3 controller driver is not calling driver resume. This results
in not updating suspended status in composite layer due to which
disconnect, configured and then disconnect events are sent to userspace.
This might cause problems for some userspace applications. Hence handle
USB link status event for resume by reverting the commit b217f5007d
("USB: dwc3: Don't handle USB/Link Status change event for RESUME").
Fix actual issue of disconnect sent during suspend/resume in android.c
by scheduling work only if the suspended status is changed to notify
userspace.

CRs-Fixed: 569639
Change-Id: If4fe6f3e8087d3bc972705ff40e4f94f597e2d09
Signed-off-by: Vijayavardhan Vennapusa <vvreddy@codeaurora.org>
Signed-off-by: Pranav Vashi <neobuddy89@gmail.com>
USB: android: Prevent change of host mac address of 'rndis0' interface

On windows 7 platform, previously allocated ip address is maintained.
However, Host MAC address of 'rndis0' interface is changed when the
tethering driver re-enumerated. Thus, the tethering network driver
can't be allocated ip address from dhcp. It causes connection delay
between host and phone for usb tethering.

This patch prevents from changing Host MAC address of 'rndis0' interface.
In other words, this patch maintains the Host MAC address allocated by
userspace although the driver is re-enumerated.

CRs-Fixed: 534083
Change-Id: I94176ec010fc2cf5c57c35ed31a311dd747200bd
Signed-off-by: Vijayavardhan Vennapusa <vvreddy@codeaurora.org>
Signed-off-by: Pranav Vashi <neobuddy89@gmail.com>
USB: gadget: ether: Clean up req->buf to avoid wild pointer

When OOM, the req->buf will fail to get memory from kmalloc.
And all the req->buf in dev->tx_reqs will be freed in the
error handler. But they are not cleared to NULL. So they are
not allocated while below function got called again.

int alloc_tx_buffer(struct eth_dev *dev)
{
   list_for_each(act, &dev->tx_reqs) {
       if ((!req->buf)         ->3. it can't allocate again.
          req->buf = kmalloc();->1. it fails to get memory as OOM.
       if (!req->buf)
          goto free_buf;
        ...
   }
   return 0;
free_buf:
   ...
   kfree(req->buf);             ->2. It's freed.
   return -ENOMEM;
}
So these pointers will be freed multi times. What's worse,
once they are used as normally, system maybe be panic due to
wild pointer.
CRs-fixed: 571628
Change-Id: I96eb21553eb4840c02331d68056ea0eca9a25552
Signed-off-by: Figo Wang <figow@codeaurora.org>>
Signed-off-by: Pranav Vashi <neobuddy89@gmail.com>
ASoC: msm: qdsp6v2: Clear ION handle after freeing

Once ion memory is freed ion handle should be set to
NULL to avoid double free or any unintended access.
This change clears the ION handle after freeing up
the memory.

Change-Id: I37d76fe2641c111fa4376eff8f7e45f6795414ca
Signed-off-by: Gopikrishnaiah Anandan <agopik@codeaurora.org>
Signed-off-by: Pranav Vashi <neobuddy89@gmail.com>
msm: usb: Add multi-lun support for UMS

UMS(usb mass storage) need a new lun for internal
storage.So add a new lun number for internal mass storage.

Change-Id: I17ccb8f85d458567a1f1b35366b8b0834397601f
Signed-off-by: Jin Wu <jinw@codeaurora.org>
Signed-off-by: Pranav Vashi <neobuddy89@gmail.com>
usb: gadget: Allow non-default and non-zero ITC value

Allow setting ITC value provided from device tree. In case no value
provided from device tree, check the CI13XXX_ZERO_ITC flag, and
if set use the value of 0 as the ITC.

Change-Id: I9333124913b7ae737eabc8eb5d154d99ac184ee8
Signed-off-by: Amit Blay <ablay@codeaurora.org>
Signed-off-by: Pranav Vashi <neobuddy89@gmail.com>
usb: gadget: ci13xxx_udc: pass platform data from msm_otg driver

This change fixes the way ci13xxx_msm driver is probed. The
driver will not be created by device tree, but will be created
by the msm_otg.

Change-Id: I82f9b0ccb601f12364c3b6e3c681dc607d3f9af5
Signed-off-by: Amit Blay <ablay@codeaurora.org>
Signed-off-by: Pranav Vashi <neobuddy89@gmail.com>
usb: gadget: Add link power management support

Link Power Management (a.k.a. L1) is similar to the existing usb bus
suspend/resume/remote-wakeup, but has transitional latencies of tens
of microseconds between power states (instead of three to greater than
20 millisecond latencies of the USB 2.0 suspend/resume).

Change-Id: I8ae493534702e658c24f384a6b705b08e9ea9d05
Signed-off-by: Shimrit Malichi <smalichi@codeaurora.org>
Signed-off-by: Pranav Vashi <neobuddy89@gmail.com>
usb: gadget: bam_data: Wait for BAM reset only on A2 BAM

Previous change 'usb: gadget: Fix race condition in connect/disconnect'
introduced a bug which adds unnecessary delay waiting for bam
reset completion after usb cable disconnection. BAM reset completion
is not needed for IPA bam type. Fix it by waiting for bam reset only
for A2 bam.

Change-Id: I491e5ff561b226711ec80d281a3c7dbb91a91f96
CRs-Fixed: 503808
Signed-off-by: Bar Weiner <bweiner@codeaurora.org>
Signed-off-by: Pranav Vashi <neobuddy89@gmail.com>
usb: gadget: u_bam: Lock access to port_usb in start/stop transfers

Add protection to access to port_usb fields in start/stop transfers.
Otherwise the functions might compete with disconnect sequence
and null dereference might occur.

Change-Id: I7e62ddd98adc414cadf426daae900c5db04939ee
Signed-off-by: Lena Salman <esalman@codeaurora.org>
Signed-off-by: Pranav Vashi <neobuddy89@gmail.com>
usb: dwc3-msm: remove use of global context variable (DBM)

Remove usage of the global context variable in the gadget and DBM
functions by passing a dwc3_msm pointer directly.  This will allow
the driver to eventually support multiple instances.

Change-Id: I0fdc5d703b3fd445e83226534f07743461c96f4c
Signed-off-by: Jack Pham <jackp@codeaurora.org>
Signed-off-by: Pranav Vashi <neobuddy89@gmail.com>