1. 08 4月, 2015 1 次提交
  2. 11 3月, 2015 18 次提交
  3. 09 3月, 2015 2 次提交
    • F
      usb: musb: core: improve musb_interrupt() a bit · 31a0ede0
      Felipe Balbi 提交于
      instead of using manually spelled out bit-shits
      and iterate over each of the 16-bits (one for
      each endpoint) on each direction, we can make use
      of for_each_set_bit() which internally uses
      find_first_bit().
      
      This makes the code slightly more readable while
      also making we only iterate over bits which are
      actually set.
      Signed-off-by: NFelipe Balbi <balbi@ti.com>
      31a0ede0
    • F
      usb: musb: core: fix TX/RX endpoint order · e3c93e1a
      Felipe Balbi 提交于
      As per Mentor Graphics' documentation, we should
      always handle TX endpoints before RX endpoints.
      
      This patch fixes that error while also updating
      some hard-to-read comments which were scattered
      around musb_interrupt().
      
      This patch should be backported as far back as
      possible since this error has been in the driver
      since it's conception.
      
      Cc: <stable@vger.kernel.org>
      Signed-off-by: NFelipe Balbi <balbi@ti.com>
      e3c93e1a
  4. 23 2月, 2015 1 次提交
    • F
      usb: musb: core: add pm_runtime_irq_safe() · 3e43a072
      Felipe Balbi 提交于
      We need a pm_runtime_get_sync() call from
      within musb_gadget_pullup() to make sure
      registers are accessible at that time.
      
      The problem is that musb_gadget_pullup() is
      called with IRQs disabled and, because of that,
      we need to tell pm_runtime that this pm_runtime_get_sync()
      is IRQ safe.
      
      We can simply add pm_runtime_irq_safe(), however, because
      we need to make our read/write accessor function pointers
      have been initialized before trying to use them. This means
      that all pm_runtime initialization for musb_core needs to
      be moved down so that when we call pm_runtime_irq_safe(),
      the pm_runtime_get_sync() that it calls on the parent, won't
      cause a crash due to NULL musb_read/write accessors.
      Reported-by: NPali Rohár <pali.rohar@gmail.com>
      Signed-off-by: NFelipe Balbi <balbi@ti.com>
      3e43a072
  5. 05 2月, 2015 1 次提交
    • B
      usb: musb: fix device hotplug behind hub · 9298b4aa
      Bin Liu 提交于
      The commit 889ad3b "usb: musb: try a race-free wakeup" breaks device
      hotplug enumeraitonn when the device is connected behind a hub while usb
      autosuspend is enabled.
      
      Adding finish_resume_work into runtime resume callback fixes the issue.
      
      Also resume root hub is required to resume the bus from runtime suspend,
      so move musb_host_resume_root_hub() back to its original location, where
      handles RESUME interrupt.
      Signed-off-by: NBin Liu <b-liu@ti.com>
      Tested-by: NTony Lindgren <tony@atomide.com>
      Signed-off-by: NFelipe Balbi <balbi@ti.com>
      9298b4aa
  6. 25 11月, 2014 4 次提交
  7. 18 11月, 2014 2 次提交
    • G
      usb: musb: core: Disable the Interrupts till BABBLE is fully handled · f905bc68
      George Cherian 提交于
      Disable the MUSB interrupts till MUSB is recovered fully from BABBLE
      condition. There are chances that we could get multiple interrupts
      till the time the babble recover work gets scheduled. Sometimes
      this could even end up in an endless loop making MUSB itself unusable.
      Reported-by: NFelipe Balbi <balbi@ti.com>
      Signed-off-by: NGeorge Cherian <george.cherian@ti.com>
      Signed-off-by: NFelipe Balbi <balbi@ti.com>
      f905bc68
    • S
      usb: musb: core: make sure musb is in RPM_ACTIVE on resume · a1fc1920
      Sebastian Andrzej Siewior 提交于
      On am335x-evm with musb in host mode and using it as a wakeup source the
      following happens once the CPU comes out of suspend to ram:
      |PM: Wakeup source MPU_WAKE
      |PM: noirq resume of devices complete after 15.453 msecs
      |PM: early resume of devices complete after 2.222 msecs
      |PM: resume of devices complete after 507.351 msecs
      |Restarting tasks ...
      |------------[ cut here ]------------
      |WARNING: CPU: 0 PID: 322 at drivers/usb/core/urb.c:339 usb_submit_urb+0x494/0x4c8()
      |URB cc0db380 submitted while active
      |[<c0348e64>] (usb_submit_urb) from [<c0340f94>] (hub_activate+0x2b8/0x49c)
      |[<c0340f94>] (hub_activate) from [<c03411dc>] (hub_resume+0x14/0x1c)
      |[<c03411dc>] (hub_resume) from [<c034be10>] (usb_resume_interface.isra.4+0xdc/0x110)
      |[<c034be10>] (usb_resume_interface.isra.4) from [<c034beb0>] (usb_resume_both+0x6c/0x13c)
      |[<c034beb0>] (usb_resume_both) from [<c034cca4>] (usb_runtime_resume+0x10/0x14)
      |[<c034cca4>] (usb_runtime_resume) from [<c02bbd80>] (__rpm_callback+0x2c/0x60)
      |[<c02bbd80>] (__rpm_callback) from [<c02bbdd4>] (rpm_callback+0x20/0x74)
      |[<c02bbdd4>] (rpm_callback) from [<c02bcc48>] (rpm_resume+0x380/0x548)
      |[<c02bcc48>] (rpm_resume) from [<c02bcb00>] (rpm_resume+0x238/0x548)
      |[<c02bcb00>] (rpm_resume) from [<c02bd08c>] (__pm_runtime_resume+0x64/0x94)
      |[<c02bd08c>] (__pm_runtime_resume) from [<c034b5a4>] (usb_autopm_get_interface+0x18/0x5c)
      |[<c034b5a4>] (usb_autopm_get_interface) from [<c03438b8>] (hub_thread+0x10c/0x115c)
      |[<c03438b8>] (hub_thread) from [<c005a70c>] (kthread+0xbc/0xd8)
      |---[ end trace 036aa5fe78203142 ]---
      |hub 1-0:1.0: activate --> -16
      |hub 2-0:1.0: activate --> -16
      
      The reason for this backtrace is the attempt of the USB code to resume
      the HUB twice and thus enqueue the status URB twice.
      Alan Stern was a great help by explaining how the USB code supposed to
      work and what is most likely the problem. The root problem is that after
      resume the musb runtime-suspend state remains RPM_SUSPENDED.
      According to git log it RPM was added for the omap2430 platform. If I
      understand it correct the omap2430 invokes a get on musb once a cable is
      connected and a put once the cable is gone. In between the device could
      go auto-idle/off. Not sure what happens when the device goes into suspend
      but then I guess it was gadget only.
      On DSPS I see only a get in probe and put in remove function. This would
      forbid RPM from working but then the devices enterns suspended state
      anyway :)
      
      To get rid of this warning, I set the device state to RPM_ACTIVE which
      the expected state.
      
      Cc: Alan Stern <stern@rowland.harvard.edu>
      Cc: <stable@vger.kernel.org>
      Signed-off-by: NSebastian Andrzej Siewior <bigeasy@linutronix.de>
      Signed-off-by: NFelipe Balbi <balbi@ti.com>
      a1fc1920
  8. 08 11月, 2014 1 次提交
  9. 06 11月, 2014 2 次提交
    • S
      usb: musb: try a race-free wakeup · baadd52f
      Sebastian Andrzej Siewior 提交于
      Attaching a keyboard, using it as a wakeup via
      |for f in $(find /sys/devices/ocp.3/47400000.usb -name wakeup)
      |do
      |	echo enabled > $f
      |done
      
      going into standby
      |  echo standby >  /sys/power/state
      
      and now a wake up by a pressing a key.
      What happens is that the system wakes up but the USB device is dead. The
      USB stack tries to send a few control URBs but nothing comes back.
      Eventually it gaves up and the device remains dead:
      |[  632.559678] PM: Wakeup source USB1_PHY
      |[  632.581074] PM: noirq resume of devices complete after 21.261 msecs
      |[  632.607521] PM: early resume of devices complete after 10.360 msecs
      |[  632.616854] net eth2: initializing cpsw version 1.12 (0)
      |[  632.704126] net eth2: phy found : id is : 0x4dd074
      |[  636.704048] libphy: 4a101000.mdio:00 - Link is Up - 1000/Full
      |[  638.444620] usb 1-1: reset low-speed USB device number 2 using musb-hdrc
      |[  653.713435] usb 1-1: device descriptor read/64, error -110
      |[  669.093435] usb 1-1: device descriptor read/64, error -110
      |[  669.473424] usb 1-1: reset low-speed USB device number 2 using musb-hdrc
      |[  684.743436] usb 1-1: device descriptor read/64, error -110
      |[  690.065097] PM: resume of devices complete after 57450.744 msecs
      |[  690.076601] PM: Finishing wakeup.
      |[  690.076627] Restarting tasks ...
      
      It seems that since we got woken up via MUSB_INTR_RESUME the
      musb_host_finish_resume() callback is executed before the
      resume-callbacks of the PHY and glue layer are invoked. If I delay it
      until the glue layer resumed then I don't see this problem.
      
      I also move musb_host_resume_root_hub() into that callback since I don't
      see any reason in doing anything resume-link if there are still pieces
      not restored.
      Signed-off-by: NSebastian Andrzej Siewior <bigeasy@linutronix.de>
      Signed-off-by: NFelipe Balbi <balbi@ti.com>
      baadd52f
    • S
      usb: musb: core: check link status on resume · b87fd2f7
      Sebastian Andrzej Siewior 提交于
      The am335x-evmsk support two kinds of suspend:
      - standby
        the USB device remains powered while the system goes into suspend
      
      - mem
        the USB device becomes powerless while the system goes into suspend.
      
      In the "standby" case the device resumes quickly. In the "mem" case the
      system hangs for a few seconds. It seems to me that the USB-device has
      no address (it was disconnected) and the USB stack thinks that it is
      fully operational and GetPortStatus returns the status from before the
      suspend so it is not a big help here.
      
      This adds a check in the resume path to see if the device mode (A or B)
      and the speed is the same. If the device went missing between
      suspend/resume (VBUS went down) then MUSB seems to go into B mode and
      HS/FS bits are cleared. In that case we clear the port1_status bits and
      assume a disconnect. Once the stack learns this it does a "logical
      disconnect" and removes the USB-device quickly. Should the device remain
      connected during the suspend then MUSB will receives a "CONNECT" interrupt.
      Signed-off-by: NSebastian Andrzej Siewior <bigeasy@linutronix.de>
      Signed-off-by: NFelipe Balbi <balbi@ti.com>
      b87fd2f7
  10. 04 11月, 2014 3 次提交
  11. 20 10月, 2014 1 次提交
  12. 16 7月, 2014 3 次提交
  13. 01 7月, 2014 1 次提交
    • D
      usb: musb: use is_host_active() to distinguish between host and gadget mode · c03da38d
      Daniel Mack 提交于
      On AM33xx platforms, unplugging a device in the middle of an active
      transfer leads to a drop of MUSB_DEVCTL_HM in MUSB_DEVCTL before the
      system is informed about a disconnect. This consequently makes the musb
      core call the gadget code to handle the interrupt request, which then
      crashes the kernel because the relevant pointers haven't been set up
      for gadget mode.
      
      To fix this, use is_host_active() rather than (devctl & MUSB_DEVCTL_HM)
      in musb_interrupt() and musb_dma_completion() to detect whether the
      controller is in host or peripheral mode. This information is provided
      by the driver logic and does not rely on register contents.
      Signed-off-by: NDaniel Mack <zonque@gmail.com>
      Signed-off-by: NFelipe Balbi <balbi@ti.com>
      c03da38d