23 Feb, 2017

40 commits

  • Add mxc in driver/Konfig and driver/Makefile.

    Signed-off-by: Gao Pan

    Gao Pan
     
  • The API devm_request_and_ioremap meets compile error
    on branch imx_4.1.y. It is recommend to replace the api
    with devm_ioremap_resource.

    Signed-off-by: Gao Pan

    Gao Pan
     
  • Add the option to enable SIM driver build.

    Signed-off-by: Luwei Zhou
    Signed-off-by: Gao Pan
    (cherry picked from 0f7a6fa3c141bfc7333d9056639b7a5b1154ed1d)

    Luwei Zhou
     
  • The EMV4.3 has strict requirement about the reset sequence. The old code use the mdelay, udelay to
    achievet, which is not precise enough. Replace it with the timer interrupt. The EMV4.3 requires
    40000~45000 clock cycles duration when reset is low.

    Signed-off-by: Luwei Zhou
    (cherry picked from a006fe283c8b97f0a711cb0829bfbdaaf4a5f31f)

    Luwei Zhou
     
  • In EMV4.3 after warm/cold reset, there would be a receiving window. The receiving
    window would be 42000 clock length.If the receiving window expires without receiving
    one byte, IFD need to take actions as EMV4.3 spec. The driver need to support this
    to identify the sequence of the receiving window expiring event and the receiving event.
    Since theinterrupt latency in linux OS is not certain, we need to tune this setting to
    pass the cases. Current tuning parameter can work.

    Signed-off-by: Luwei Zhou
    (cherry picked from faf1d8d881a6ad2c6b88fdf312cef142996937c1)

    Luwei Zhou
     
  • The CWT timer is used to detect the the character interval in the data traffic.
    When tx, SIM IP can guarantee the interval based our setting. When RX, we need
    to enalbe the CWT timer to check whether the interval is in the range. This patch
    fix this.

    Signed-off-by: Luwei Zhou
    (cherry picked from 9c92dfd070e7427eb1e0166f368b89b4a7ac1bff)

    Luwei Zhou
     
  • Modify the driver to support the SIM on i.MX6UL-EVK platform. The main modification is:
    1. Add port index to support different port on platform.
    2. Add POS-CARD support. The POS card has external IC to assert when SVEN to low. Add support.
    3. Using a function to calculate the strict timing delay.

    Signed-off-by: Luwei Zhou
    (cherry picked from 17d1315b0704e2db63ee6bd7aaefa0c796f53104)

    Luwei Zhou
     
  • This driver is based on the current code which runs the the EMV test on the i.MX258 platform.
    Since there are still many cases that can't pass on the i.MX258 and i.MX7d platform. The
    driver will need to be improved after per-test work. Just check in as a base code. There
    would be definitly some timing improvement work to do in the future.

    Signed-off-by: Luwei Zhou
    (cherry picked from 3ac1ad5b2a68ecb052ccacca4ac7459ead04415e)

    Luwei Zhou
     
  • There is official workaound for TKT238285, so remove the limitation
    for i.mx6dl.

    Signed-off-by: Robin Gong

    Robin Gong
     
  • We set both wartermark of txfifo and rxfifo 32 as half of fifo length 64.
    That will cause easy rxfifo overflow:
    If there is 31 bytes in rxfifo, rx script will wait the next dma request
    (the 32th data come into the rxfifo) and schedule out to tx script. Once
    tx script start to run, the rx script need to wait tx script finish even
    if its priority higher than tx. Meanwhile, spi slave device may input
    data continous, plus the rx data which triggered by new tx script(32 bytes).
    That will quickly consume whole 64 bytes fifo, so we keep 16bytes availbale
    even in the worst case new tx script triggered during two rx transfer. That
    may slow down tx slightly, but better than overflow and RX DMA timeout.

    Signed-off-by: Robin Gong
    (cherry picked from commit 16043ad0ad96aa04a90614e473aa17980af4b8af)
    (cherry picked from commit 819efee83b7b1f47685dca6fad6bbe17f1c42092)
    (cherry picked from commit 5c4c7d05bbba0ea2b26ef2f3ae83119d5eada235)

    Robin Gong
     
  • There is occasion that dma callback come late after the substream is released.
    Then there will be kernel dump.

    [] (imx_pcm_dma_complete) from [] (sdma_handle_channel_loop.isra.25+0x48/0x54)
    [] (sdma_handle_channel_loop.isra.25) from [] (sdma_tasklet+0xa0/0x1d4)
    [] (sdma_tasklet) from [] (tasklet_action+0x64/0xf8)
    [] (tasklet_action) from [] (__do_softirq+0x104/0x218)
    [] (__do_softirq) from [] (irq_exit+0xa8/0xec)
    [] (irq_exit) from [] (handle_IRQ+0x3c/0x90)
    [] (handle_IRQ) from [] (gic_handle_irq+0x28/0x5c)
    [] (gic_handle_irq) from [] (__irq_svc+0x40/0x70)

    The reason is the sdma tasklet is async with audio substream release. ALSA
    think when terminate dma, the dma should be stopped and no callback be called.

    This patch is to add new api dma_sync_wait_tasklet(), which is called in
    snd_dmaengine_pcm_close(). It will make sure the callback not be called
    after this funtion. Tasklet_kill is to wait scheduled tasklet end.

    Tasklet_kill can't be added to terminate dma function, because terminate dma
    function may be called in interrupt, but tasklet_kill can't be called in
    interrupt context.

    Signed-off-by: Shengjiu Wang
    (cherry picked from commit 9815881b6acaa72a705e1fa3c26a852fc81bfce5)

    Shengjiu Wang
     
  • As SSI has dual fifo, add src_dualfifo and dst_dualfifo in imx_dma_data
    to support dual fifo in DMA_DEV_TO_DEV.

    Signed-off-by: Shengjiu Wang
    (cherry picked from commit cfde1308f170166a0099ca39ee8733895f9626f0)

    Shengjiu Wang
     
  • Use SET_LATE_SYSTEM_SLEEP_PM_OPS rather than the common sleep pm ops to ensure
    sdma has resumed back before all other module drivers which use sdma resume
    back.

    Signed-off-by: Robin Gong
    (cherry picked from commit a7f8725509b494c3073b1bcca63252d5c61bb80d)

    Robin Gong
     
  • Enable Mega/Fast support for i.mx7d. Need save and restore SDMA registers.

    Signed-off-by: Robin Gong
    (cherry picked from commit 4e1ea64c5d360ebc4f8168c1fcdee314b547bd13)

    Robin Gong
     
  • The SDMA driver not consider the case of event_id0 is 0. That make uart6 rx
    not working.

    Signed-off-by: Robin Gong
    (cherry picked from commit dbcacbcb3a885d7569e9e415035b1dd06c4a117b)
    (cherry picked from commit 6dfdbe41a7d6ab7e6fae5d6fb4d73435839beff3)

    Robin Gong
     
  • Current ecspi rom script didn't take care of rxfifo overflow risk. Add new
    ecspi tx script to check the rxfifo status, if it is near to full(>=48 bytes),
    do not copy data to txfifo which will trigger data push into rxfifo. Because
    rx script may not read rxfifo in time, we have to consider it.

    Signed-off-by: Robin Gong
    (cherry picked from commit 17f472aa698aba0af5da4566df447e23306f4289)
    (cherry picked from commit 90c929d7d1a3f8e196641b5ed7a33d2ee03bd63c)
    (cherry picked from commit 6d76bdcf2097e4198217edf27363cf6ba2e6542a)

    Robin Gong
     
  • cherry-pick below patch from v3.14.y:
    ENGR00319473: dma: imx-sdma: support sdma restore from
    mega/fast power down status

    Support sdma suspend and resume interface to restore from mega/fast power down.

    Signed-off-by: Robin Gong
    (cherry picked from commit 682fd1f47ab9cb69382fa0e8d20a830ae99c26fc)
    (cherry picked from commit dd17fa18b9a0c11f8bce3b87f792775d96e461c1)

    Robin Gong
     
  • This patch is just created by so many confilict while cherry-pick
    from v3.10 a6a6cf911f85a3a09f763195478d422c571b9565.

    Signed-off-by: Robin Gong
    (cherry picked from commit c070364148de0331152700850f5cb5577dbb504e)

    Robin Gong
     
  • cherry-pick below patch from v3.14.y:
    ENGR00329948-3: dma: imx-sdma: Add hdmi audio support
    in sdma

    There's a missing script for hdmi audio support in current sdma driver,
    thus add it.

    This HDMI script doesn't use bd to copy memory like a normal one does
    but only to update the memory address for HDMI internal AHB DMA and
    then trigger its procedure automatically.

    Signed-off-by: Shengjiu Wang
    Signed-off-by: Robin Gong
    (cherry picked from commit dafddac916a03ae4477e2de7c1b7ad291f956f68)

    Shengjiu Wang
     
  • ENGR00286273-1 dma: imx-sdma: allocate memory from iram

    We try to allocate memory from SoC internal SRAM so that we can turn off
    voltage of external DDR to save power. Surely, if we failed to get the
    iram DT node or allocate memory due to no enough SRAM space, we would
    allow SDMA driver to allocate memory in a traditional way.

    Signed-off-by: Nicolin Chen
    Signed-off-by: Robin Gong
    (cherry picked from commit f6924fbdb90d1f01266fc018caff953457e04d34)
    (cherry picked from commit 7b643e5c9119ac43b937816fd1b785d2b859b05f)

    Nicolin Chen
     
  • For UART, we need use old chn_real_count to know the real rx count even in
    cylic dma mode, because UART driver use cyclic mode to increase performance
    without any data loss.

    Signed-off-by: Robin Gong
    (cherry picked from commit 398cee2ad110c4f183e553af0564fbdcbe8548cb)

    Robin Gong
     
  • cherry-pick below patch from v3.14.y:

    ENGR00329822-01 dmaengine: imx: fix loop mode issue

    Fix loop mode issue that calling dmaengine_tx_status() can get
    right state.residue value.

    Signed-off-by: Fugang Duan
    Signed-off-by: Robin Gong
    (cherry picked from commit 37e17f10b35c34317def08704e4b4edf5aa23894)
    (cherry picked from commit 00cc7021317ac6efb460eb1b9bc3bd8aa6ad73c2)

    Fugang Duan
     
  • This patch updates all clk driver from L3.14.y, as
    cherry-pick all clk related patch needs to handle
    about 40 patches conflicts, so just copy it from
    L3.14.y as it is an independent driver, for commit
    log, please refer to L3.14.y.

    Signed-off-by: Anson Huang

    Anson Huang
     
  • Due to incorrect placement of the clock gate cell in the ldb_di[x]_clk
    tree, the glitchy parent mux of ldb_di[x]_clk can cause a glitch to
    enter the ldb_di_ipu_div divider. If the divider gets locked up, no
    ldb_di[x]_clk is generated, and the LVDS display will hang when the
    ipu_di_clk is sourced from ldb_di_clk.

    To fix the problem, both the new and current parent of the ldb_di_clk
    should be disabled before the switch. This patch ensures that correct
    steps are followed when ldb_di_clk parent is switched in the beginning
    of boot. The glitchy muxes are then registered as read-only. The clock
    parent can be selected using the assigned-clocks and
    assigned-clock-parents properties of the ccm device tree node:

    &clks {
    assigned-clocks = ,
    ;
    assigned-clock-parents = ,
    ;
    };

    The issue is explained in detail in EB821 ("LDB Clock Switch Procedure &
    i.MX6 Asynchronous Clock Switching Guidelines") [1].

    [1] http://www.nxp.com/files/32bit/doc/eng_bulletin/EB821.pdf

    Signed-off-by: Ranjani Vaidyanathan
    Signed-off-by: Fabio Estevam
    Signed-off-by: Philipp Zabel
    Reviewed-by: Akshay Bhat
    Tested-by Joshua Clayton
    Tested-by: Charles Kang
    Signed-off-by: Shawn Guo

    Fabio Estevam
     
  • Due to incorrect placement of the clock gate cell in the ldb_di[x]_clk
    tree, the glitchy parent mux of ldb_di[x]_clk can cause a glitch to
    enter the ldb_di_ipu_div divider. If the divider gets locked up, no
    ldb_di[x]_clk is generated, and the LVDS display will hang when the
    ipu_di_clk is sourced from ldb_di_clk.

    To fix the problem, both the new and current parent of the ldb_di_clk
    should be disabled before the switch. As this can not be guaranteed by
    the clock framework during runtime, make the ldb_di[x]_sel muxes read-only.
    A workaround to set the muxes once during boot could be added to the
    kernel or bootloader.

    Signed-off-by: Philipp Zabel
    Signed-off-by: Fabio Estevam
    Signed-off-by: Shawn Guo

    Philipp Zabel
     
  • MMDC CH1 is not used on i.MX6Q, so the handshake needed to change the
    parent of periph2_sel or the divider of mmdc_ch1_axi_podf will never
    succeed.
    Disable the handshake mechanism to allow changing the frequency of
    mmdc_ch1_axi, allowing to use it as a possible source for the LDB DI
    clock.

    Signed-off-by: Philipp Zabel
    Signed-off-by: Fabio Estevam
    Signed-off-by: Shawn Guo

    Philipp Zabel
     
  • Porting the pxp-v4l2 output driver to imx_4.1.y branch.

    Signed-off-by: Fancy Fang

    Fancy Fang
     
  • Add request_bus_freq() and release_bus_freq() calls to the
    various drivers to ensure that the DDR and AHB are the requested
    frequency before the driver starts its task.

    Signed-off-by: Fugang Duan

    Fugang Duan
     
  • Design team change the ahb's clk parent options but
    did NOT update the DOC accordingly in time, so the
    AHB/IPG's clk rate in clk tree is incorrect, AHB is
    67.5MHz and IPG is 33.75MHz, but using scope to
    monitor them, they are actually 135MHz and 67.5MHz,
    update the clk parent option to make clk tree info
    correct.

    Signed-off-by: Anson Huang

    Anson Huang
     
  • * Fix PLL Audio/Video Numerator/Denominator register offsets
    * In imx7d pll register CCM_ANALOG_PLL_VIDEO_NUM and
    CCM_ANALOG_PLL_VIDEO_DENOM offset is different with imx6.
    For imx7D the correct setting should be:
    PLL_NUM_OFFSET 0x20
    PLL_DENOM_OFFSET 0x30
    * Add additional macros to handle imx7d audio/video
    pll num/demom offset settings.

    Signed-off-by: Adrian Alonso
    [Octavian: use IMX_PLLV3_AV_IMX7 instead of cpu_is_imx7d()]
    Signed-off-by: Octavian Purdila

    Adrian Alonso
     
  • DRAM PLL is a audio/video type PLL, need to correct
    it to get correct ops of PLL.

    There is a test_div placed before DRAM PLL's gate, so
    add this test div clk.

    Signed-off-by: Anson Huang

    Anson Huang
     
  • It's excessive to use prefix for the parameters when you do
    modprobe mmc-block mmcblk.perdev_minors=16

    Make this available only for built-in case.

    Signed-off-by: Andy Shevchenko
    Signed-off-by: Ulf Hansson
    (cherry picked from commit 5b67cd9c5ee0722022cba7d20552320325457434)

    Andy Shevchenko
     
  • Dereference the charger->psy after the power_supply is created to fix the
    null pointer issue.

    Signed-off-by: Li Jun

    Li Jun
     
  • remove a duplicated pm notify.

    Signed-off-by: Bai Ping

    Bai Ping
     
  • i.MX7D has a silicon issue on full speed termination after A device ends
    a session, which causes it can not detect data pulse from B device if
    A device isn't in low power mode, this patch work around it by override
    Termsel bit to be 1 for FS mode termination. After A device detects data
    pulse or turns on vbus, this override will be cleared and disabled.

    Signed-off-by: Li Jun
    (cherry picked from commit 1ec37968c892efbb1925784446a75d35e8bda228)

    Li Jun
     
  • Adds imx7d usb charger detection support.

    Signed-off-by: Li Jun

    Li Jun
     
  • At some situations, the ehci_bus_suspend may not set PORT_SUSPEND
    due to port is not enabled, so add flag ehci->bus_suspended to
    check if ehci_bus_suspend set PORT_SUSPEND or not.

    We see "ci_hdrc ci_hdrc.0: timeout waiting for SUSPEND" wrongly when
    plug in an unsupported usb device, in that case, the PORT_PE is cleared
    and bus_suspend is called.

    Signed-off-by: Peter Chen
    (cherry picked from commit 82cfe6c31ee55e5aab1a057a5aaf853b7bb6cd07)
    (cherry picked from commit a4fe7e55e84944962d6a7be7bd404865d376811e)

    Peter Chen
     
  • We do not want (care) the interrupt during we remove the otg function,
    so move it beforehand.

    Signed-off-by: Peter Chen
    (cherry picked from commit 9ae22c687fd161dfff2e81512b50143fa154b9bb)

    Peter Chen
     
  • The interrupt may occur (due to remove process may block interrupt)
    after we remove hcd, in that case, we should not call hcd's interrupt
    handler, otherwise, below NULL pointer dereference will occur, the reason
    for this is we call free_irq later than hcd's. So after hcd has been
    removed, we should not call hcd interrupt handler.

    ci_hdrc ci_hdrc.0: remove, state 1
    usb usb1: USB disconnect, device number 1
    ci_hdrc ci_hdrc.0: USB bus 1 deregistered
    [] (handle_irq_event) from [] (handle_fasteoi_irq+0x84/0x14c)
    [] (handle_fasteoi_irq) from [] (generic_handle_irq+0x2c/0x3c)
    [] (generic_handle_irq) from [] (handle_IRQ+0x40/0x90)
    [] (handle_IRQ) from [] (gic_handle_irq+0x2c/0x5c)
    [] (gic_handle_irq) from [] (__irq_svc+0x40/0x70)
    Exception stack(0x80db1f18 to 0x80db1f60)
    1f00: 80db1f60 3b9aca00
    1f20: 06f86934 0000000d 80dbe1c8 80dbe1c8 ee71e0d0 00000000 06f5bb01 0000000d
    1f40: 80db0000 00000000 00000017 80db1f60 00000009 8049c19c 000d0013 ffffffff
    [] (__irq_svc) from [] (cpuidle_enter_state+0x54/0xe4)
    [] (cpuidle_enter_state) from [] (cpuidle_idle_call+0xb4/0x14c)
    [] (cpuidle_idle_call) from [] (arch_cpu_idle+0x8/0x44)
    [] (arch_cpu_idle) from [] (cpu_startup_entry+0x100/0x14c)
    [] (cpu_startup_entry) from [] (start_kernel+0x350/0x35c)
    --[ end trace 1160f590a7b228b3 ]--
    Unable to handle kernel NULL pointer dereference at virtual address 000000b0
    pgd = 80004000
    [000000b0] *pgd=00000000
    Internal error: Oops: 17 1 PREEMPT SMP ARM
    Modules linked in: ci_hdrc_imx usbmisc_imx ci_hdrc udc_core ehci_hcd phy_mxs_usb mxc_v4l2_capture ipu_bg_overlay_sdc ipu_still ipu_prp_enc adv7180_tvin ipu_csi_enc v4l2_int_device ipu_fg_overlay_sdc mxc_mlb mxc_dcic evbug [last unloaded: phy_mxs_usb]
    CPU: 0 PID: 0 Comm: swapper/0 Tainted: G W 3.14.38-usb-host-otg-02047-ga4dec77 #13
    task: 80dbbae8 ti: 80db0000 task.ti: 80db0000
    PC is at usb_hcd_irq+0x4/0x38
    LR is at handle_irq_event_percpu+0x50/0x180
    pc : [] lr : [] psr: a00d0193
    sp : 80db1e98 ip : fffffffa fp : 00000000
    r10: 80e1f13f r9 : d8009900 r8 : 0000004b
    r7 : 00000000 r6 : 00000000 r5 : d800995c r4 : d8f2dec0
    r3 : d2234010 r2 : d2234010 r1 : 00000000 r0 : 0000004b
    Flags: NzCv IRQs off FIQs on Mode SVC_32 ISA ARM Segment kernel
    Control: 10c53c7d Table: 6920004a DAC: 00000015
    Process swapper/0 (pid: 0, stack limit = 0x80db0238)
    Stack: (0x80db1e98 to 0x80db2000)
    1e80: d2234010 8006907c
    1ea0: 0000004b ee71da00 d8009900 d800995c d8f2dec0 f4a00100 06f5bb01 0000000d
    1ec0: 80db0000 800691e8 d8009900 d800995c 00000000 8006c02c 8006bfa8 0000004b
    1ee0: 0000004b 800687f4 80dace54 8000ed4c f4a0010c 80db8970 80db1f18 8000856c
    1f00: 00000009 8049c19c 000d0013 ffffffff 80db1f4c 80012240 80db1f60 3b9aca00
    1f20: 06f86934 0000000d 80dbe1c8 80dbe1c8 ee71e0d0 00000000 06f5bb01 0000000d
    1f40: 80db0000 00000000 00000017 80db1f60 00000009 8049c19c 000d0013 ffffffff
    1f60: 06f86934 0000000d 80dc4a54 ee71e0d0 80db8574 ee71e0d0 00000000 00000000
    1f80: 00000000 80e797f8 80dbe1c8 8049c2e0 00000000 80db0000 80db8574 806fe48c
    1fa0: 80db0038 80e1f13d 80e1f13d 8000f07c 00000000 8006876c ffffffff 80d52b10
    1fc0: ffffffff ffffffff 80d5258c 00000000 00000000 80d9ef30 00000000 10c53c7d
    1fe0: 80db84fc 80d9ef2c 80dbcb80 1000406a 412fc09a 10008074 00000000 00000000
    [] (usb_hcd_irq) from [] (handle_irq_event_percpu+0x50/0x180)
    [] (handle_irq_event_percpu) from [] (handle_irq_event+0x3c/0x5c)
    [] (handle_irq_event) from [] (handle_fasteoi_irq+0x84/0x14c)
    [] (handle_fasteoi_irq) from [] (generic_handle_irq+0x2c/0x3c)
    [] (generic_handle_irq) from [] (handle_IRQ+0x40/0x90)
    [] (handle_IRQ) from [] (gic_handle_irq+0x2c/0x5c)
    [] (gic_handle_irq) from [] (__irq_svc+0x40/0x70)
    Exception stack(0x80db1f18 to 0x80db1f60)
    1f00: 80db1f60 3b9aca00
    1f20: 06f86934 0000000d 80dbe1c8 80dbe1c8 ee71e0d0 00000000 06f5bb01 0000000d
    1f40: 80db0000 00000000 00000017 80db1f60 00000009 8049c19c 000d0013 ffffffff
    [] (__irq_svc) from [] (cpuidle_enter_state+0x54/0xe4)
    [] (cpuidle_enter_state) from [] (cpuidle_idle_call+0xb4/0x14c)
    [] (cpuidle_idle_call) from [] (arch_cpu_idle+0x8/0x44)
    [] (arch_cpu_idle) from [] (cpu_startup_entry+0x100/0x14c)
    [] (cpu_startup_entry) from [] (start_kernel+0x350/0x35c)
    Code: 11a002a0 03a00001 e12fff1e e92d4008 (e59130b0)
    --[ end trace 1160f590a7b228b4 ]--
    Kernel panic - not syncing: Fatal exception in interrupt
    CPU2: stopping
    CPU: 2 PID: 1483 Comm: modprobe Tainted: G D W 3.14.38-usb-host-otg-02047-ga4dec77 #13
    [] (unwind_backtrace) from [] (show_stack+0x10/0x14)
    [] (show_stack) from [] (dump_stack+0x7c/0xbc)
    [] (dump_stack) from [] (handle_IPI+0x144/0x158)
    [] (handle_IPI) from [] (gic_handle_irq+0x58/0x5c)
    [] (gic_handle_irq) from [] (__irq_svc+0x40/0x70)
    Exception stack(0xd96c5dc0 to 0xd96c5e08)
    5dc0: d800995c 0000004b 00000000 00072004 d8f2dec0 d8009900 d800995c 0000004b
    5de0: d800995c a00f0013 00000000 010f2280 fffffffa d96c5e08 00000000 8006926c
    5e00: 000f0013 ffffffff
    [] (__irq_svc) from [] (synchronize_irq+0x18/0xa8)
    [] (synchronize_irq) from [] (__free_irq+0xfc/0x1c4)
    [] (__free_irq) from [] (free_irq+0x4c/0xa4)
    [] (free_irq) from [] (release_nodes+0x16c/0x1cc)
    [] (release_nodes) from [] (__device_release_driver+0x78/0xcc)
    [] (__device_release_driver) from [] (device_release_driver+0x1c/0x28)
    [] (device_release_driver) from [] (bus_remove_device+0xdc/0x108)
    [] (bus_remove_device) from [] (device_del+0x100/0x1a4)
    [] (device_del) from [] (platform_device_del+0x18/0x9c)
    [] (platform_device_del) from [] (platform_device_unregister+0xc/0x20)
    [] (platform_device_unregister) from [] (ci_hdrc_remove_device+0xc/0x20 [ci_hdrc])
    [] (ci_hdrc_remove_device [ci_hdrc]) from [] (ci_hdrc_imx_remove+0x2c/0xdc [ci_hdrc_imx])
    [] (ci_hdrc_imx_remove [ci_hdrc_imx]) from [] (platform_drv_remove+0x18/0x30)
    [] (platform_drv_remove) from [] (__device_release_driver+0x70/0xcc)
    [] (__device_release_driver) from [] (driver_detach+0xac/0xb0)
    [] (driver_detach) from [] (bus_remove_driver+0x4c/0xa0)
    [] (bus_remove_driver) from [] (SyS_delete_module+0x11c/0x17c)
    [] (SyS_delete_module) from [] (ret_fast_syscall+0x0/0x30)
    CPU3: stopping
    CPU: 3 PID: 0 Comm: swapper/3 Tainted: G D W 3.14.38-usb-host-otg-02047-ga4dec77 #13
    [] (unwind_backtrace) from [] (show_stack+0x10/0x14)
    [] (show_stack) from [] (dump_stack+0x7c/0xbc)
    [] (dump_stack) from [] (handle_IPI+0x144/0x158)
    [] (handle_IPI) from [] (gic_handle_irq+0x58/0x5c)
    [] (gic_handle_irq) from [] (__irq_svc+0x40/0x70)
    Exception stack(0xd80b1f50 to 0xd80b1f98)
    1f40: d80b1f98 3b9aca00 256aed09 0000000d
    1f60: 80dbe1c8 80dbe1c8 ee7360d0 00000000 25477984 0000000d d80b0000 00000000
    1f80: 00000017 d80b1f98 00000009 8049c19c 00070013 ffffffff
    [] (__irq_svc) from [] (cpuidle_enter_state+0x54/0xe4)
    [] (cpuidle_enter_state) from [] (cpuidle_idle_call+0xb4/0x14c)
    [] (cpuidle_idle_call) from [] (arch_cpu_idle+0x8/0x44)
    [] (arch_cpu_idle) from [] (cpu_startup_entry+0x100/0x14c)
    [] (cpu_startup_entry) from [] (0x10008624)
    CPU1: stopping

    Signed-off-by: Peter Chen
    Signed-off-by: Li Jun
    (cherry picked from commit 402f2d38e22007e931dc3dd52a69c0fed88452bf)

    Peter Chen
     
  • When do usb driver module load and unload loop test for A-device, the
    hrtimer may be cancelled during otg state machine running, so after
    the hrtimer is cancelled, the otg state machine may start it again by
    adding a new timer, this will cause the hrtimer will be active after
    its function memory is freed by module unload. This patch is to fix it
    by trying to hold the fsm mutex lock before setting otg state to be
    undefined, then otg hrtimer will be cancelled after current otg fsm
    transition completes, and no new timer will be added.

    Signed-off-by: Li Jun
    (cherry picked from commit 8c3ab4f22bc34675aeb8f9c62e69b450a179be0f)
    (cherry picked from commit 95c8590c5232eeb9d054ac7504455a90a133f05a)

    Li Jun