1. 14 Jan, 2014 1 commit
  2. 13 Jan, 2014 39 commits
    • Dong Aisheng's avatar
      mmc: sdhci-esdhc-imx: fix warning during module remove function · a7f2be94
      Dong Aisheng authored
      Since the clock is managed by runtime pm currently, we do not need
      disable it again during driver remove function, or it will cause
      clock disable count mismatch issue since the clocks have already been disabled.
      
      The issue can be simply reproduced by unbind the devices via sysfs.
      mx6slevk:/sys/bus/platform/drivers/sdhci-esdhc-imx# echo 2194000.usdhc > unbind
      mmc1: card aaaa removed
      ------------[ cut here ]------------
      WARNING: CPU: 0 PID: 657 at drivers/clk/clk.c:842 __clk_disable+0x68/0x88()
      Modules linked in:
      CPU: 0 PID: 657 Comm: sh Not tainted 3.13.0-rc1+ #285
      Backtrace:
      [<80012160>] (dump_backtrace+0x0/0x10c) from [<80012438>] (show_stack+0x18/0x1c)
       r6:80481370 r5:00000000 r4:8088ecc8 r3:00000000
      [<80012420>] (show_stack+0x0/0x1c) from [<80616b14>] (dump_stack+0x84/0x9c)
      [<80616a90>] (dump_stack+0x0/0x9c) from [<80027158>] (warn_slowpath_common+0x70/0x94)
       r5:00000009 r4:00000000
      [<800270e8>] (warn_slowpath_common+0x0/0x94) from [<80027220>] (warn_slowpath_null+0x24/0x2c)
       r8:bec4ff78 r7:0000000e r6:bf91d800 r5:bf81d080 r4:bf81d080
      [<800271fc>] (warn_slowpath_null+0x0/0x2c) from [<80481370>] (__clk_disable+0x68/0x88)
      [<80481308>] (__clk_disable+0x0/0x88) from [<8048148c>] (clk_disable+0x20/0x2c)
       r4:200f0113 r3:bf95ec00
      [<8048146c>] (clk_disable+0x0/0x2c) from [<80463bd8>] (sdhci_esdhc_imx_remove+0x64/0xa4)
       r5:bf81d080 r4:bfabb010
      [<80463b74>] (sdhci_esdhc_imx_remove+0x0/0xa4) from [<8032e82c>] (platform_drv_remove+0x20/0x24)
       r6:808ae0e0 r5:808ae0e0 r4:bf91d810 r3:80463b74
      [<8032e80c>] (platform_drv_remove+0x0/0x24) from [<8032d010>] (__device_release_driver+0x78/0xd0)
      [<8032cf98>] (__device_release_driver+0x0/0xd0) from [<8032d090>] (device_release_driver+0x28/0x34)
       r5:bf91d810 r4:bf91d844
      [<8032d068>] (device_release_driver+0x0/0x34) from [<8032c0c8>] (unbind_store+0x80/0xc4)
       r5:bf91d810 r4:80899ba0
      [<8032c048>] (unbind_store+0x0/0xc4) from [<8032b648>] (drv_attr_store+0x28/0x34)
       r7:bed73100 r6:0000000e r5:00000000 r4:8032b620
      [<8032b620>] (drv_attr_store+0x0/0x34) from [<80140580>] (sysfs_write_file+0x1b0/0x1e4)
      [<801403d0>] (sysfs_write_file+0x0/0x1e4) from [<800dcda0>] (vfs_write+0xb4/0x190)
      [<800dccec>] (vfs_write+0x0/0x190) from [<800dd3e4>] (SyS_write+0x44/0x80)
       r9:0000000e r8:00000000 r7:01a00408 r6:bf3b1c00 r5:00000000
      r4:00000000
      [<800dd3a0>] (SyS_write+0x0/0x80) from [<8000e900>] (ret_fast_syscall+0x0/0x48)
       r9:bec4e000 r8:8000eac4 r7:00000004 r6:76f5fb40 r5:01a00408
      r4:0000000e
      ---[ end trace a0897d268e6233b2 ]---
      
      If without runtime pm, we just run as before to match the clock enable
      in probe function.
      Signed-off-by: default avatarDong Aisheng <b29396@freescale.com>
      Acked-by: default avatarShawn Guo <shawn.guo@linaro.org>
      Signed-off-by: default avatarChris Ball <chris@printf.net>
      a7f2be94
    • Dong Aisheng's avatar
      mmc: sdhci-esdhc-imx: fix access hardirq-unsafe lock in atomic context · a974862f
      Dong Aisheng authored
      Sometimes we may meet the following lockdep issue.
      The root cause is .set_clock callback is executed with spin_lock_irqsave
      in sdhci_do_set_ios. However, the IMX set_clock callback will try to access
      clk_get_rate which is using a mutex lock.
      
      The fix avoids access mutex in .set_clock callback by initializing the
      pltfm_host->clock at probe time and use it later instead of calling
      clk_get_rate again in atomic context.
      
      [ INFO: HARDIRQ-safe -> HARDIRQ-unsafe lock order detected ]
      3.13.0-rc1+ #285 Not tainted
      ------------------------------------------------------
      kworker/u8:1/29 [HC0[0]:SC0[0]:HE0:SE1] is trying to acquire:
       (prepare_lock){+.+...}, at: [<80480b08>] clk_prepare_lock+0x44/0xe4
      
      and this task is already holding:
       (&(&host->lock)->rlock#2){-.-...}, at: [<804611f4>] sdhci_do_set_ios+0x20/0x720
      which would create a new lock dependency:
       (&(&host->lock)->rlock#2){-.-...} -> (prepare_lock){+.+...}
      
      but this new dependency connects a HARDIRQ-irq-safe lock:
       (&(&host->lock)->rlock#2){-.-...}
      ... which became HARDIRQ-irq-safe at:
        [<8005f030>] mark_lock+0x140/0x6ac
        [<80060760>] __lock_acquire+0xb30/0x1cbc
        [<800620d0>] lock_acquire+0x70/0x84
        [<8061d2f0>] _raw_spin_lock+0x30/0x40
        [<80460668>] sdhci_irq+0x24/0xa68
        [<8006b1d4>] handle_irq_event_percpu+0x54/0x18c
        [<8006b350>] handle_irq_event+0x44/0x64
        [<8006e50c>] handle_fasteoi_irq+0xa0/0x170
        [<8006a8f0>] generic_handle_irq+0x30/0x44
        [<8000f238>] handle_IRQ+0x54/0xbc
        [<8000864c>] gic_handle_irq+0x30/0x64
        [<80013024>] __irq_svc+0x44/0x5c
        [<80614c58>] printk+0x38/0x40
        [<804622a8>] sdhci_add_host+0x844/0xbcc
        [<80464948>] sdhci_esdhc_imx_probe+0x378/0x67c
        [<8032ee88>] platform_drv_probe+0x20/0x50
        [<8032d48c>] driver_probe_device+0x118/0x234
        [<8032d690>] __driver_attach+0x9c/0xa0
        [<8032b89c>] bus_for_each_dev+0x68/0x9c
        [<8032cf44>] driver_attach+0x20/0x28
        [<8032cbc8>] bus_add_driver+0x148/0x1f4
        [<8032dce0>] driver_register+0x80/0x100
        [<8032ee54>] __platform_driver_register+0x50/0x64
        [<8084b094>] sdhci_esdhc_imx_driver_init+0x18/0x20
        [<80008980>] do_one_initcall+0x108/0x16c
        [<8081cca4>] kernel_init_freeable+0x10c/0x1d0
        [<80611c50>] kernel_init+0x10/0x120
        [<8000e9c8>] ret_from_fork+0x14/0x2c
      
      to a HARDIRQ-irq-unsafe lock:
       (prepare_lock){+.+...}
      ... which became HARDIRQ-irq-unsafe at:
      ...  [<8005f030>] mark_lock+0x140/0x6ac
        [<8005f604>] mark_held_locks+0x68/0x12c
        [<8005f780>] trace_hardirqs_on_caller+0xb8/0x1d8
        [<8005f8b4>] trace_hardirqs_on+0x14/0x18
        [<8061a130>] mutex_trylock+0x180/0x20c
        [<80480ad8>] clk_prepare_lock+0x14/0xe4
        [<804816a4>] clk_notifier_register+0x28/0xf0
        [<80015120>] twd_clk_init+0x50/0x68
        [<80008980>] do_one_initcall+0x108/0x16c
        [<8081cca4>] kernel_init_freeable+0x10c/0x1d0
        [<80611c50>] kernel_init+0x10/0x120
        [<8000e9c8>] ret_from_fork+0x14/0x2c
      
      other info that might help us debug this:
      
       Possible interrupt unsafe locking scenario:
      
             CPU0                    CPU1
             ----                    ----
        lock(prepare_lock);
                                     local_irq_disable();
                                     lock(&(&host->lock)->rlock#2);
                                     lock(prepare_lock);
        <Interrupt>
          lock(&(&host->lock)->rlock#2);
      
       *** DEADLOCK ***
      
      3 locks held by kworker/u8:1/29:
       #0:  (kmmcd){.+.+.+}, at: [<8003db18>] process_one_work+0x128/0x468
       #1:  ((&(&host->detect)->work)){+.+.+.}, at: [<8003db18>] process_one_work+0x128/0x468
       #2:  (&(&host->lock)->rlock#2){-.-...}, at: [<804611f4>] sdhci_do_set_ios+0x20/0x720
      
      the dependencies between HARDIRQ-irq-safe lock and the holding lock:
      -> (&(&host->lock)->rlock#2){-.-...} ops: 330 {
         IN-HARDIRQ-W at:
                          [<8005f030>] mark_lock+0x140/0x6ac
                          [<80060760>] __lock_acquire+0xb30/0x1cbc
                          [<800620d0>] lock_acquire+0x70/0x84
                          [<8061d2f0>] _raw_spin_lock+0x30/0x40
                          [<80460668>] sdhci_irq+0x24/0xa68
                          [<8006b1d4>] handle_irq_event_percpu+0x54/0x18c
                          [<8006b350>] handle_irq_event+0x44/0x64
                          [<8006e50c>] handle_fasteoi_irq+0xa0/0x170
                          [<8006a8f0>] generic_handle_irq+0x30/0x44
                          [<8000f238>] handle_IRQ+0x54/0xbc
                          [<8000864c>] gic_handle_irq+0x30/0x64
                          [<80013024>] __irq_svc+0x44/0x5c
                          [<80614c58>] printk+0x38/0x40
                          [<804622a8>] sdhci_add_host+0x844/0xbcc
                          [<80464948>] sdhci_esdhc_imx_probe+0x378/0x67c
                          [<8032ee88>] platform_drv_probe+0x20/0x50
                          [<8032d48c>] driver_probe_device+0x118/0x234
                          [<8032d690>] __driver_attach+0x9c/0xa0
                          [<8032b89c>] bus_for_each_dev+0x68/0x9c
                          [<8032cf44>] driver_attach+0x20/0x28
                          [<8032cbc8>] bus_add_driver+0x148/0x1f4
                          [<8032dce0>] driver_register+0x80/0x100
                          [<8032ee54>] __platform_driver_register+0x50/0x64
                          [<8084b094>] sdhci_esdhc_imx_driver_init+0x18/0x20
                          [<80008980>] do_one_initcall+0x108/0x16c
                          [<8081cca4>] kernel_init_freeable+0x10c/0x1d0
                          [<80611c50>] kernel_init+0x10/0x120
                          [<8000e9c8>] ret_from_fork+0x14/0x2c
         IN-SOFTIRQ-W at:
                          [<8005f030>] mark_lock+0x140/0x6ac
                          [<80060204>] __lock_acquire+0x5d4/0x1cbc
                          [<800620d0>] lock_acquire+0x70/0x84
                          [<8061d40c>] _raw_spin_lock_irqsave+0x40/0x54
                          [<8045e4a4>] sdhci_tasklet_finish+0x1c/0x120
                          [<8002b538>] tasklet_action+0xa0/0x15c
                          [<8002b778>] __do_softirq+0x118/0x290
                          [<8002bcf4>] irq_exit+0xb4/0x10c
                          [<8000f240>] handle_IRQ+0x5c/0xbc
                          [<8000864c>] gic_handle_irq+0x30/0x64
                          [<80013024>] __irq_svc+0x44/0x5c
                          [<80614c58>] printk+0x38/0x40
                          [<804622a8>] sdhci_add_host+0x844/0xbcc
                          [<80464948>] sdhci_esdhc_imx_probe+0x378/0x67c
                          [<8032ee88>] platform_drv_probe+0x20/0x50
                          [<8032d48c>] driver_probe_device+0x118/0x234
                          [<8032d690>] __driver_attach+0x9c/0xa0
                          [<8032b89c>] bus_for_each_dev+0x68/0x9c
                          [<8032cf44>] driver_attach+0x20/0x28
                          [<8032cbc8>] bus_add_driver+0x148/0x1f4
                          [<8032dce0>] driver_register+0x80/0x100
                          [<8032ee54>] __platform_driver_register+0x50/0x64
                          [<8084b094>] sdhci_esdhc_imx_driver_init+0x18/0x20
                          [<80008980>] do_one_initcall+0x108/0x16c
                          [<8081cca4>] kernel_init_freeable+0x10c/0x1d0
                          [<80611c50>] kernel_init+0x10/0x120
                          [<8000e9c8>] ret_from_fork+0x14/0x2c
         INITIAL USE at:
                         [<8005f030>] mark_lock+0x140/0x6ac
                         [<8005ff0c>] __lock_acquire+0x2dc/0x1cbc
                         [<800620d0>] lock_acquire+0x70/0x84
                         [<8061d40c>] _raw_spin_lock_irqsave+0x40/0x54
                         [<804611f4>] sdhci_do_set_ios+0x20/0x720
                         [<80461924>] sdhci_set_ios+0x30/0x3c
                         [<8044cea0>] mmc_power_up+0x6c/0xd0
                         [<8044dac4>] mmc_start_host+0x60/0x70
                         [<8044eb3c>] mmc_add_host+0x60/0x88
                         [<8046225c>] sdhci_add_host+0x7f8/0xbcc
                         [<80464948>] sdhci_esdhc_imx_probe+0x378/0x67c
                         [<8032ee88>] platform_drv_probe+0x20/0x50
                         [<8032d48c>] driver_probe_device+0x118/0x234
                         [<8032d690>] __driver_attach+0x9c/0xa0
                         [<8032b89c>] bus_for_each_dev+0x68/0x9c
                         [<8032cf44>] driver_attach+0x20/0x28
                         [<8032cbc8>] bus_add_driver+0x148/0x1f4
                         [<8032dce0>] driver_register+0x80/0x100
                         [<8032ee54>] __platform_driver_register+0x50/0x64
                         [<8084b094>] sdhci_esdhc_imx_driver_init+0x18/0x20
                         [<80008980>] do_one_initcall+0x108/0x16c
                         [<8081cca4>] kernel_init_freeable+0x10c/0x1d0
                         [<80611c50>] kernel_init+0x10/0x120
                         [<8000e9c8>] ret_from_fork+0x14/0x2c
       }
       ... key      at: [<80e040e8>] __key.26952+0x0/0x8
       ... acquired at:
         [<8005eb60>] check_usage+0x3d0/0x5c0
         [<8005edac>] check_irq_usage+0x5c/0xb8
         [<80060d38>] __lock_acquire+0x1108/0x1cbc
         [<800620d0>] lock_acquire+0x70/0x84
         [<8061a210>] mutex_lock_nested+0x54/0x3c0
         [<80480b08>] clk_prepare_lock+0x44/0xe4
         [<8048188c>] clk_get_rate+0x14/0x64
         [<8046374c>] esdhc_pltfm_set_clock+0x20/0x2a4
         [<8045d70c>] sdhci_set_clock+0x4c/0x498
         [<80461518>] sdhci_do_set_ios+0x344/0x720
         [<80461924>] sdhci_set_ios+0x30/0x3c
         [<8044c390>] __mmc_set_clock+0x44/0x60
         [<8044cd4c>] mmc_set_clock+0x10/0x14
         [<8044f8f4>] mmc_init_card+0x1b4/0x1520
         [<80450f00>] mmc_attach_mmc+0xb4/0x194
         [<8044da08>] mmc_rescan+0x294/0x2f0
         [<8003db94>] process_one_work+0x1a4/0x468
         [<8003e850>] worker_thread+0x118/0x3e0
         [<80044de0>] kthread+0xd4/0xf0
         [<8000e9c8>] ret_from_fork+0x14/0x2c
      
      the dependencies between the lock to be acquired and HARDIRQ-irq-unsafe lock:
      -> (prepare_lock){+.+...} ops: 395 {
         HARDIRQ-ON-W at:
                          [<8005f030>] mark_lock+0x140/0x6ac
                          [<8005f604>] mark_held_locks+0x68/0x12c
                          [<8005f780>] trace_hardirqs_on_caller+0xb8/0x1d8
                          [<8005f8b4>] trace_hardirqs_on+0x14/0x18
                          [<8061a130>] mutex_trylock+0x180/0x20c
                          [<80480ad8>] clk_prepare_lock+0x14/0xe4
                          [<804816a4>] clk_notifier_register+0x28/0xf0
                          [<80015120>] twd_clk_init+0x50/0x68
                          [<80008980>] do_one_initcall+0x108/0x16c
                          [<8081cca4>] kernel_init_freeable+0x10c/0x1d0
                          [<80611c50>] kernel_init+0x10/0x120
                          [<8000e9c8>] ret_from_fork+0x14/0x2c
         SOFTIRQ-ON-W at:
                          [<8005f030>] mark_lock+0x140/0x6ac
                          [<8005f604>] mark_held_locks+0x68/0x12c
                          [<8005f7c8>] trace_hardirqs_on_caller+0x100/0x1d8
                          [<8005f8b4>] trace_hardirqs_on+0x14/0x18
                          [<8061a130>] mutex_trylock+0x180/0x20c
                          [<80480ad8>] clk_prepare_lock+0x14/0xe4
                          [<804816a4>] clk_notifier_register+0x28/0xf0
                          [<80015120>] twd_clk_init+0x50/0x68
                          [<80008980>] do_one_initcall+0x108/0x16c
                          [<8081cca4>] kernel_init_freeable+0x10c/0x1d0
                          [<80611c50>] kernel_init+0x10/0x120
                          [<8000e9c8>] ret_from_fork+0x14/0x2c
         INITIAL USE at:
                         [<8005f030>] mark_lock+0x140/0x6ac
                         [<8005ff0c>] __lock_acquire+0x2dc/0x1cbc
                         [<800620d0>] lock_acquire+0x70/0x84
                         [<8061a0c8>] mutex_trylock+0x118/0x20c
                         [<80480ad8>] clk_prepare_lock+0x14/0xe4
                         [<80482af8>] __clk_init+0x1c/0x45c
                         [<8048306c>] _clk_register+0xd0/0x170
                         [<80483148>] clk_register+0x3c/0x7c
                         [<80483b4c>] clk_register_fixed_rate+0x88/0xd8
                         [<80483c04>] of_fixed_clk_setup+0x68/0x94
                         [<8084c6fc>] of_clk_init+0x44/0x68
                         [<808202b0>] time_init+0x2c/0x38
                         [<8081ca14>] start_kernel+0x1e4/0x368
                         [<10008074>] 0x10008074
       }
       ... key      at: [<808afebc>] prepare_lock+0x38/0x48
       ... acquired at:
         [<8005eb94>] check_usage+0x404/0x5c0
         [<8005edac>] check_irq_usage+0x5c/0xb8
         [<80060d38>] __lock_acquire+0x1108/0x1cbc
         [<800620d0>] lock_acquire+0x70/0x84
         [<8061a210>] mutex_lock_nested+0x54/0x3c0
         [<80480b08>] clk_prepare_lock+0x44/0xe4
         [<8048188c>] clk_get_rate+0x14/0x64
         [<8046374c>] esdhc_pltfm_set_clock+0x20/0x2a4
         [<8045d70c>] sdhci_set_clock+0x4c/0x498
         [<80461518>] sdhci_do_set_ios+0x344/0x720
         [<80461924>] sdhci_set_ios+0x30/0x3c
         [<8044c390>] __mmc_set_clock+0x44/0x60
         [<8044cd4c>] mmc_set_clock+0x10/0x14
         [<8044f8f4>] mmc_init_card+0x1b4/0x1520
         [<80450f00>] mmc_attach_mmc+0xb4/0x194
         [<8044da08>] mmc_rescan+0x294/0x2f0
         [<8003db94>] process_one_work+0x1a4/0x468
         [<8003e850>] worker_thread+0x118/0x3e0
         [<80044de0>] kthread+0xd4/0xf0
         [<8000e9c8>] ret_from_fork+0x14/0x2c
      
      stack backtrace:
      CPU: 2 PID: 29 Comm: kworker/u8:1 Not tainted 3.13.0-rc1+ #285
      Workqueue: kmmcd mmc_rescan
      Backtrace:
      [<80012160>] (dump_backtrace+0x0/0x10c) from [<80012438>] (show_stack+0x18/0x1c)
       r6:00000000 r5:00000000 r4:8088ecc8 r3:bfa11200
      [<80012420>] (show_stack+0x0/0x1c) from [<80616b14>] (dump_stack+0x84/0x9c)
      [<80616a90>] (dump_stack+0x0/0x9c) from [<8005ebb4>] (check_usage+0x424/0x5c0)
       r5:80979940 r4:bfa29b44
      [<8005e790>] (check_usage+0x0/0x5c0) from [<8005edac>] (check_irq_usage+0x5c/0xb8)
      [<8005ed50>] (check_irq_usage+0x0/0xb8) from [<80060d38>] (__lock_acquire+0x1108/0x1cbc)
       r8:bfa115e8 r7:80df9884 r6:80dafa9c r5:00000003 r4:bfa115d0
      [<8005fc30>] (__lock_acquire+0x0/0x1cbc) from [<800620d0>] (lock_acquire+0x70/0x84)
      [<80062060>] (lock_acquire+0x0/0x84) from [<8061a210>] (mutex_lock_nested+0x54/0x3c0)
       r7:bfa11200 r6:80dafa9c r5:00000000 r4:80480b08
      [<8061a1bc>] (mutex_lock_nested+0x0/0x3c0) from [<80480b08>] (clk_prepare_lock+0x44/0xe4)
      [<80480ac4>] (clk_prepare_lock+0x0/0xe4) from [<8048188c>] (clk_get_rate+0x14/0x64)
       r6:03197500 r5:bf0e9aa8 r4:bf827400 r3:808ae128
      [<80481878>] (clk_get_rate+0x0/0x64) from [<8046374c>] (esdhc_pltfm_set_clock+0x20/0x2a4)
       r5:bf0e9aa8 r4:bf0e9c40
      [<8046372c>] (esdhc_pltfm_set_clock+0x0/0x2a4) from [<8045d70c>] (sdhci_set_clock+0x4c/0x498)
      [<8045d6c0>] (sdhci_set_clock+0x0/0x498) from [<80461518>] (sdhci_do_set_ios+0x344/0x720)
       r8:0000003b r7:20000113 r6:bf0e9d68 r5:bf0e9aa8 r4:bf0e9c40
      r3:00000000
      [<804611d4>] (sdhci_do_set_ios+0x0/0x720) from [<80461924>] (sdhci_set_ios+0x30/0x3c)
       r9:00000004 r8:bf131000 r7:bf131048 r6:00000000 r5:bf0e9aa8
      r4:bf0e9800
      [<804618f4>] (sdhci_set_ios+0x0/0x3c) from [<8044c390>] (__mmc_set_clock+0x44/0x60)
       r5:03197500 r4:bf0e9800
      [<8044c34c>] (__mmc_set_clock+0x0/0x60) from [<8044cd4c>] (mmc_set_clock+0x10/0x14)
       r5:00000000 r4:bf0e9800
      [<8044cd3c>] (mmc_set_clock+0x0/0x14) from [<8044f8f4>] (mmc_init_card+0x1b4/0x1520)
      [<8044f740>] (mmc_init_card+0x0/0x1520) from [<80450f00>] (mmc_attach_mmc+0xb4/0x194)
      [<80450e4c>] (mmc_attach_mmc+0x0/0x194) from [<8044da08>] (mmc_rescan+0x294/0x2f0)
       r5:8065f358 r4:bf0e9af8
      [<8044d774>] (mmc_rescan+0x0/0x2f0) from [<8003db94>] (process_one_work+0x1a4/0x468)
       r8:00000000 r7:bfa29eb0 r6:bf80dc00 r5:bf0e9af8 r4:bf9e3f00
      r3:8044d774
      [<8003d9f0>] (process_one_work+0x0/0x468) from [<8003e850>] (worker_thread+0x118/0x3e0)
      [<8003e738>] (worker_thread+0x0/0x3e0) from [<80044de0>] (kthread+0xd4/0xf0)
      [<80044d0c>] (kthread+0x0/0xf0) from [<8000e9c8>] (ret_from_fork+0x14/0x2c)
       r7:00000000 r6:00000000 r5:80044d0c r4:bf9e7f00
      
      Fixes: 0ddf03c9 mmc: esdhc-imx: parse max-frequency from devicetree
      Signed-off-by: default avatarDong Aisheng <b29396@freescale.com>
      Acked-by: default avatarShawn Guo <shawn.guo@linaro.org>
      Tested-by: default avatarPhilippe De Muyter <phdm@macqel.be>
      Cc: stable <stable@vger.kernel.org> # 3.13
      Signed-off-by: default avatarChris Ball <chris@printf.net>
      a974862f
    • Wolfram Sang's avatar
      mmc: core: sd: implement proper support for sd3.0 au sizes · 9288cac0
      Wolfram Sang authored
      This reverts and updates commit 77776fd0 ("mmc: sd: fix the
      maximum au_size for SD3.0"). The au_size for SD3.0 cannot be achieved
      by a simple bit shift, so this needs to be implemented differently.
      Also, don't print the warning in case of 0 since 'not defined' is
      different from 'invalid'.
      Signed-off-by: default avatarWolfram Sang <wsa@the-dreams.de>
      Acked-by: default avatarJaehoon Chung <jh80.chung@samsung.com>
      Reviewed-by: default avatarH Hartley Sweeten <hsweeten@visionengravers.com>
      Cc: stable <stable@vger.kernel.org> # [3.12, 3.13]
      Signed-off-by: default avatarChris Ball <chris@printf.net>
      9288cac0
    • Alexandre Belloni's avatar
      mmc: atmel-mci: add vmmc-supply support · 9e7861f5
      Alexandre Belloni authored
      Other MMC hosts handle a regulator named vmmc-supply that allows to power
      the MMC card or SDIO device before communicating on the bus.
      Signed-off-by: default avatarAlexandre Belloni <alexandre.belloni@free-electrons.com>
      Acked-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
      Acked-by: default avatarLudovic Desroches <ludovic.desroches@atmel.com>
      Signed-off-by: default avatarChris Ball <chris@printf.net>
      9e7861f5
    • David Cohen's avatar
      mmc: sdhci-pci: add broken HS200 quirk for Intel Merrifield · 390145f9
      David Cohen authored
      Due to unknown hw issue so far, Merrifield is unable to enable HS200
      support. This patch adds quirk to avoid SDHCI to initialize with error
      below:
      
      [   53.850132] CPU: 0 PID: 0 Comm: swapper/0 Tainted: G W
      3.12.0-rc6-00037-g3d7c8d9-dirty #36
      [   53.850150] Hardware name: Intel Corporation Merrifield/SALT BAY,
      BIOS 397 2013.09.12:11.51.40
      [   53.850167]  00000000 00000000 ee409e48 c18816d2 00000000 ee409e78
      c123e254 c1acc9b0
      [   53.850227]  00000000 00000000 c1b14148 000003de c16c03bf c16c03bf
      ee75b480 ed97c54c
      [   53.850282]  ee75b480 ee409e88 c123e292 00000009 00000000 ee409ef8
      c16c03bf c1207fac
      [   53.850339] Call Trace:
      [   53.850376]  [<c18816d2>] dump_stack+0x4b/0x79
      [   53.850408]  [<c123e254>] warn_slowpath_common+0x84/0xa0
      [   53.850436]  [<c16c03bf>] ? sdhci_send_command+0xb4f/0xc50
      [   53.850462]  [<c16c03bf>] ? sdhci_send_command+0xb4f/0xc50
      [   53.850490]  [<c123e292>] warn_slowpath_null+0x22/0x30
      [   53.850516]  [<c16c03bf>] sdhci_send_command+0xb4f/0xc50
      [   53.850545]  [<c1207fac>] ? native_sched_clock+0x2c/0xb0
      [   53.850575]  [<c14c1f93>] ? delay_tsc+0x73/0xb0
      [   53.850601]  [<c14c1ebe>] ? __const_udelay+0x1e/0x20
      [   53.850626]  [<c16bdeb3>] ? sdhci_reset+0x93/0x190
      [   53.850654]  [<c16c05b0>] sdhci_finish_data+0xf0/0x2e0
      [   53.850683]  [<c16c130f>] sdhci_irq+0x31f/0x930
      [   53.850713]  [<c12cb080>] ? __buffer_unlock_commit+0x10/0x20
      [   53.850740]  [<c12cbcd7>] ? trace_buffer_unlock_commit+0x37/0x50
      [   53.850773]  [<c1288f3c>] handle_irq_event_percpu+0x5c/0x220
      [   53.850800]  [<c128bc96>] ? handle_fasteoi_irq+0x16/0xd0
      [   53.850827]  [<c128913a>] handle_irq_event+0x3a/0x60
      [   53.850852]  [<c128bc80>] ? unmask_irq+0x30/0x30
      [   53.850878]  [<c128bcce>] handle_fasteoi_irq+0x4e/0xd0
      [   53.850895]  <IRQ>  [<c1890b52>] ? do_IRQ+0x42/0xb0
      [   53.850943]  [<c1890a31>] ? common_interrupt+0x31/0x38
      [   53.850973]  [<c12b00d8>] ? cgroup_mkdir+0x4e8/0x580
      [   53.851001]  [<c1208d32>] ? default_idle+0x22/0xf0
      [   53.851029]  [<c1209576>] ? arch_cpu_idle+0x26/0x30
      [   53.851054]  [<c1288505>] ? cpu_startup_entry+0x65/0x240
      [   53.851082]  [<c18793d5>] ? rest_init+0xb5/0xc0
      [   53.851108]  [<c1879320>] ? __read_lock_failed+0x18/0x18
      [   53.851138]  [<c1bf6a15>] ? start_kernel+0x31b/0x321
      [   53.851164]  [<c1bf652f>] ? repair_env_string+0x51/0x51
      [   53.851190]  [<c1bf6363>] ? i386_start_kernel+0x139/0x13c
      [   53.851209] ---[ end trace 92777f5fe48d33f2 ]---
      [   53.853449] mmcblk0: error -84 transferring data, sector 11142162, nr
      304, cmd response 0x0, card status 0x0
      [   53.853476] mmcblk0: retrying using single block read
      [   55.937863] sdhci: Timeout waiting for Buffer Read Ready interrupt
      during tuning procedure, falling back to fixed sampling clock
      [   56.207951] sdhci: Timeout waiting for Buffer Read Ready interrupt
      during tuning procedure, falling back to fixed sampling clock
      [   66.228785] mmc0: Timeout waiting for hardware interrupt.
      [   66.230855] ------------[ cut here ]------------
      Signed-off-by: default avatarDavid Cohen <david.a.cohen@linux.intel.com>
      Reviewed-by: default avatarChuanxiao Dong <chuanxiao.dong@intel.com>
      Acked-by: default avatarDong Aisheng <b29396@freescale.com>
      Cc: stable <stable@vger.kernel.org> # [3.13]
      Signed-off-by: default avatarChris Ball <chris@printf.net>
      390145f9
    • David Cohen's avatar
      mmc: sdhci: add quirk for broken HS200 support · 13868bf2
      David Cohen authored
      This patch defines a quirk for platforms unable to enable HS200 support.
      Signed-off-by: default avatarDavid Cohen <david.a.cohen@linux.intel.com>
      Reviewed-by: default avatarChuanxiao Dong <chuanxiao.dong@intel.com>
      Acked-by: default avatarDong Aisheng <b29396@freescale.com>
      Cc: stable <stable@vger.kernel.org> # [3.13]
      Signed-off-by: default avatarChris Ball <chris@printf.net>
      13868bf2
    • Soren Brinkmann's avatar
      mmc: arasan: Add driver for Arasan SDHCI · e3ec3a3d
      Soren Brinkmann authored
      Add a driver for Arasan's SDHCI controller core.
      Signed-off-by: default avatarSoren Brinkmann <soren.brinkmann@xilinx.com>
      Acked-by: Rob Herring <rob.herring@calxeda.com> [binding]
      Acked-by: default avatarMichal Simek <monstr@monstr.eu>
      Signed-off-by: default avatarChris Ball <chris@printf.net>
      e3ec3a3d
    • Zhangfei Gao's avatar
      mmc: dw_mmc: add dw_mmc-k3 for k3 platform · 036f29d5
      Zhangfei Gao authored
      Add dw_mmc-k3.c for k3v2, support sd/emmc
      Signed-off-by: default avatarZhangfei Gao <zhangfei.gao@linaro.org>
      Signed-off-by: default avatarZhigang Wang <brooke.wangzhigang@huawei.com>
      Acked-by: default avatarArnd Bergmann <arnd@arndb.de>
      Signed-off-by: default avatarChris Ball <chris@printf.net>
      036f29d5
    • Zhangfei Gao's avatar
      mmc: dw_mmc: use slot-gpio to handle cd pin · bf626e55
      Zhangfei Gao authored
      Suggested by Jaehoon: Use slot-gpio to handle cd-gpio
      Add function dw_mci_of_get_cd_gpio to check "cd-gpios" from dts.
      mmc_gpio_request_cd and mmc_gpio_get_cd are used to handle cd pin
      Signed-off-by: default avatarZhangfei Gao <zhangfei.gao@linaro.org>
      Acked-by: default avatarJaehoon Chung <jh80.chung@samsung.com>
      Acked-by: default avatarArnd Bergmann <arnd@arndb.de>
      Signed-off-by: default avatarChris Ball <chris@printf.net>
      bf626e55
    • Adam Lee's avatar
      mmc: sdhci-pci: add support of O2Micro/BayHubTech SD hosts · 01acf691
      Adam Lee authored
      Add O2Micro/BayHubTech SD Host DeviceId 8520 support.
      Add O2Micro/BayHubTech SD Host DeviceId 8420 & 8421 support.
      Add O2Micro/BayHubTech SD Host DeviceId 8620 & 8621 support.
      
      These card readers are used in laptops like Lenovo ThinkPad W540,
      Dell Latitude E5440, Dell Latitude E6540.
      Signed-off-by: default avatarPeter Guo <peter.guo@bayhubtech.com>
      Signed-off-by: default avatarAdam Lee <adam.lee@canonical.com>
      Signed-off-by: default avatarChris Ball <chris@printf.net>
      01acf691
    • Adam Lee's avatar
      mmc: sdhci-pci: break out definitions to header file · 522624f9
      Adam Lee authored
      Break out definitions in sdhci-pci.c to sdhci-pci.h, for introducing
      module files like sdhci-pci-xxx.c
      Signed-off-by: default avatarAdam Lee <adam.lee@canonical.com>
      Signed-off-by: default avatarChris Ball <chris@printf.net>
      522624f9
    • Kuninori Morimoto's avatar
      mmc: tmio: fixup compile error · 1e0bf16c
      Kuninori Morimoto authored
      This patch fixes the below compile error:
      
      ${LINUX}/drivers/mmc/host/tmio_mmc.c: In function 'tmio_mmc_probe':
      ${LINUX}/drivers/mmc/host/tmio_mmc.c:93:35: \
      	error: 'res_ctl' undeclared (first use in this function)
      ${LINUX}/drivers/mmc/host/tmio_mmc.c:93:35: \
      	note: each undeclared identifier is reported only \
      	once for each function it appears in
      Reported-by: default avatarArnd Bergmann <arnd@arndb.de>
      Signed-off-by: default avatarKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
      Acked-by: default avatarSimon Horman <horms+renesas@verge.net.au>
      Signed-off-by: default avatarChris Ball <chris@printf.net>
      1e0bf16c
    • Chris Ball's avatar
      MAINTAINERS: mmc: Update Chris Ball's email address. · 6e443244
      Chris Ball authored
      I'm no longer at OLPC.  (The old email address still works for now.)
      Signed-off-by: default avatarChris Ball <chris@printf.net>
      6e443244
    • Laurent Pinchart's avatar
      mmc: sh_mmcif: Enable driver compilation with COMPILE_TEST · 9ccb0bd0
      Laurent Pinchart authored
      This helps increasing build testing coverage.
      Signed-off-by: default avatarLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
      Acked-by: default avatarSimon Horman <horms@verge.net.au>
      Signed-off-by: default avatarChris Ball <cjb@laptop.org>
      9ccb0bd0
    • Laurent Pinchart's avatar
      mmc: sdhi: Enable driver compilation with COMPILE_TEST · ff0fa48f
      Laurent Pinchart authored
      This helps increasing build testing coverage.
      
      The driver doesn't compile on (at least) x86 due (possibly among others)
      to missing readsw/writesw I/O accessors, restrict compilation to SUPERH
      or ARM.
      
      Whether the CTL_DMA_ENABLE register is part of the standard TMIO
      controller or is Renesas-specific is unknown and impossible to test as
      we have no current or planned TMIO DMA users other than SUPERH and
      ARCH_SHMOBILE. Writing to the register is thus conditionally compiled
      for SUPERH and ARCH_SHMOBILE only. Adding ARCH_SHMOBILE_MULTI to the
      list would extend this to multiarch kernels, but would break the driver
      for non-shmobile platforms if the register is Renesas-specific. We can
      thus get rid of the conditional compilation completely without
      introducing any further issue, and let future non-Renesas users deal
      with the situation if it turns out to be a the problem.
      Signed-off-by: default avatarLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
      Acked-by: default avatarSimon Horman <horms@verge.net.au>
      Signed-off-by: default avatarChris Ball <cjb@laptop.org>
      ff0fa48f
    • Stephen Warren's avatar
      mmc: tegra: add support for Tegra124 · 67debea3
      Stephen Warren authored
      Tegra124's MMC controller is very similar to earlier SoC generations,
      and can be supported by the same driver.
      
      However, there are some non-backwards-compatible HW differences, and
      hence a new DT compatible value must be used to describe the HW. This
      patch updates the driver to support that new compatible value.
      
      That said, the HW differences are only relevant when enabling certain
      high-performance transfer modes. Since the driver is currently very
      simple and doesn't enable those modes, we don't actually need to address
      any of these HW differences in the code yet, hence the simple nature of
      this patch.
      Signed-off-by: default avatarStephen Warren <swarren@nvidia.com>
      Reviewed-by: default avatarThierry Reding <treding@nvidia.com>
      Signed-off-by: default avatarChris Ball <cjb@laptop.org>
      67debea3
    • Laurent Pinchart's avatar
      mmc: sh_mmcif: Fix compilation warning on 64-bit platforms · 538f4696
      Laurent Pinchart authored
      Casting an integer to a void * generates a "cast to pointer from integer
      of different size" warning. Cast the integer to an unsigned long first
      to fix it.
      Signed-off-by: default avatarLaurent Pinchart <laurent.pinchart@ideasonboard.com>
      Signed-off-by: default avatarChris Ball <cjb@laptop.org>
      538f4696
    • Laurent Pinchart's avatar
      mmc: sh_mmcif: Factorize DMA channel request and configuration code · e5a233cb
      Laurent Pinchart authored
      The channel request and configuration code is duplicated for the rx and
      tx channels. Create a function that requests a single channel and call
      it twice instead.
      Signed-off-by: default avatarLaurent Pinchart <laurent.pinchart@ideasonboard.com>
      Signed-off-by: default avatarChris Ball <cjb@laptop.org>
      e5a233cb
    • Kuninori Morimoto's avatar
      mmc: SDHI: add SoC specific workaround via HW version · e3c418f1
      Kuninori Morimoto authored
      One of Renesas SDHI chip needs workaround to use it, and, we can judge
      it based on chip version.  This patch adds very quick-hack workaround
      method, since we still don't know how many chips need workaround in
      the future.
      Signed-off-by: default avatarKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
      Signed-off-by: default avatarChris Ball <cjb@laptop.org>
      e3c418f1
    • Kuninori Morimoto's avatar
      mmc: tmio: add new TMIO_MMC_HAVE_HIGH_REG flags · 5d60e500
      Kuninori Morimoto authored
      The accessibility checking method to the higher register was added by
      69d1fe18 (mmc: tmio: only access registers above 0xff, if available)
      But, it doesn't care 32bit register.  It is impossible to calculate it
      from the resource size, since there is 16/32 bit register IP (e.g. VERSION
      is located on 0xe2 if 16bit register, but it is located on 0x1c4 if 32bit
      register).
      
      This patch adds new TMIO_MMC_HAVE_HIGH_REG flags, tmio_mmc driver has it,
      and sh_mobile_sdhi doesn't have it today.
      Signed-off-by: default avatarKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
      Signed-off-by: default avatarChris Ball <cjb@laptop.org>
      5d60e500
    • Kuninori Morimoto's avatar
      mmc: tmio: bus_shift become tmio_mmc_data member · 3b159a6e
      Kuninori Morimoto authored
      .bus_shift is used to 16/32bit register access offset calculation on
      tmio driver.  tmio_mmc_xxx is used from Toshiba/Renesas now, but this
      bus_shift value depends on HW IP.  This patch moves .bus_shift to
      tmio_mmc_data member and sets it on each driver.
      Signed-off-by: default avatarKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
      Signed-off-by: default avatarChris Ball <cjb@laptop.org>
      3b159a6e
    • Kuninori Morimoto's avatar
      mmc: tmio: use -EPROBE_DEFER if driver can't find regulator · 05fae4a7
      Kuninori Morimoto authored
      Current tmio driver tries to use default ocr_avail if 1) it couldn't
      find regulator and 2) if platform data doesn't have ocr_mask.
      But, there is no guarantee that regulator driver probe is faster than
      TMIO driver probe.  TMIO driver will not use regulator in such case.
      
      By this patch, TMIO driver returns -EPROBE_DEFER if it couldn't find
      regulator and if platform doesn't have ocr_mask.  Because, there is a
      possibility that regulator has not been probed, but the user expects it.
      
      This patch changes tmio_mmc_host_probe() behavior, but there is no user
      who has conflict.
      Signed-off-by: default avatarKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
      Signed-off-by: default avatarChris Ball <cjb@laptop.org>
      05fae4a7
    • Sascha Hauer's avatar
      mmc: mxs: use mmc_of_parse to parse devicetree properties · d1a1dfb2
      Sascha Hauer authored
      Use generic helper function. This also adds support for the cd-gpios and
      max-frequency devicetree properties.
      Signed-off-by: default avatarSascha Hauer <s.hauer@pengutronix.de>
      Signed-off-by: default avatarChris Ball <cjb@laptop.org>
      d1a1dfb2
    • Sascha Hauer's avatar
      mmc: mxs: use mmc_gpio_get_ro for detecting read-only status · abd37ccc
      Sascha Hauer authored
      This also fixes that the read-only gpio was used without being
      requested.
      Signed-off-by: default avatarSascha Hauer <s.hauer@pengutronix.de>
      Signed-off-by: default avatarChris Ball <cjb@laptop.org>
      abd37ccc
    • Sascha Hauer's avatar
      mmc: mxs: use standard flag for cd inverted · 6c3331d3
      Sascha Hauer authored
      We have a MMC_CAP2_CD_ACTIVE_HIGH flag, so use it rather than a custom
      driver specific flag.
      Signed-off-by: default avatarSascha Hauer <s.hauer@pengutronix.de>
      Signed-off-by: default avatarChris Ball <cjb@laptop.org>
      6c3331d3
    • Sascha Hauer's avatar
      mmc: mxs: use standard flag for broken card detection · a91fe279
      Sascha Hauer authored
      Use the standard MMC_CAP_NEEDS_POLL flag rather than a custom broken_cd
      flag. The original code used to just return true in the card detection
      function for broken card detection. The MMC_CAP_NEEDS_POLL works different,
      but was introduced for the same purpose, so assume the code works correct
      now.
      Signed-off-by: default avatarSascha Hauer <s.hauer@pengutronix.de>
      Signed-off-by: default avatarChris Ball <cjb@laptop.org>
      a91fe279
    • Sascha Hauer's avatar
      mmc: mxs: use standard flag for non-removable status · c5f4bc84
      Sascha Hauer authored
      The standard caps already have a MMC_CAP_NONREMOVABLE flag. Use it
      rather than a custom non_removable flag.
      Signed-off-by: default avatarSascha Hauer <s.hauer@pengutronix.de>
      Signed-off-by: default avatarChris Ball <cjb@laptop.org>
      c5f4bc84
    • Sascha Hauer's avatar
      mmc: Do not call get_cd for non removable cards · c1b55bfc
      Sascha Hauer authored
      Non removable cards are always present, so do not call get_cd for them.
      Signed-off-by: default avatarSascha Hauer <s.hauer@pengutronix.de>
      Acked-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
      Signed-off-by: default avatarChris Ball <cjb@laptop.org>
      c1b55bfc
    • Mika Westerberg's avatar
      mmc: sdhci-acpi: add new ACPI ID · 07c001c1
      Mika Westerberg authored
      Newer Intel PCHs with LPSS have the same SDHCI controller than Haswell but
      ACPI ID is different. Add this ID to the driver list.
      Signed-off-by: default avatarMika Westerberg <mika.westerberg@linux.intel.com>
      Acked-by: default avatarAdrian Hunter <adrian.hunter@intel.com>
      Signed-off-by: default avatarChris Ball <cjb@laptop.org>
      07c001c1
    • Laurent Pinchart's avatar
      mmc: sh_mobile_sdhi: Convert to clk_prepare/unprepare · 00fb3d2a
      Laurent Pinchart authored
      Turn clk_enable() and clk_disable() calls into clk_prepare_enable() and
      clk_disable_unprepare() to get ready for the migration to the common
      clock framework.
      Signed-off-by: default avatarLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
      Acked-by: default avatarGuennadi Liakhovetski <g.liakhovetski@gmx.de>
      Signed-off-by: default avatarChris Ball <cjb@laptop.org>
      00fb3d2a
    • Fabio Estevam's avatar
      mmc: sdhci-esdhc-imx: Use NULL instead of zero · a50145f9
      Fabio Estevam authored
      Fix the following sparse warning:
      
      drivers/mmc/host/sdhci-esdhc-imx.c:617:35: warning: Using plain integer as NULL pointer
      Signed-off-by: default avatarFabio Estevam <fabio.estevam@freescale.com>
      Cc: Shawn Guo <shawn.guo@linaro.org>
      Signed-off-by: default avatarChris Ball <cjb@laptop.org>
      a50145f9
    • Chuansheng Liu's avatar
      mmc: sdhci: Setting the host->mrq to NULL before executing tuning · 63c21180
      Chuansheng Liu authored
      In function sdhci_request(), it is possible to do the tuning execution
      like below:
      
      sdhci_request() {
      	spin_lock_irqsave(&host->lock, flags);
      	host->mrq = mrq;
      	...
      	spin_unlock_irqrestore(&host->lock, flags);
      
      <=== Here it is possible one pending finish_tasklet get running
           and it will operate the original mrq, and notified the mrq
           is done, and causes memory corruption.
      
      	sdhci_execute_tuning(mmc, tuning_opcode);
      	spin_lock_irqsave(&host->lock, flags);
      	host->mrq = mrq;
      ...
      }
      
      In the above race place, the original mrq should not be finished wrongly,
      so here before unlock the spinlock, we need to set the host->mrq to NULL
      to avoid this case.
      Signed-off-by: default avatarLiu, Chuansheng <chuansheng.liu@intel.com>
      Signed-off-by: default avatarChris Ball <cjb@laptop.org>
      63c21180
    • Guennadi Liakhovetski's avatar
      mmc: tmio: remove myself as a maintainer · 00411135
      Guennadi Liakhovetski authored
      Since I'm currently unable to dedicate sufficient time to driver
      maintainership, remove myself from the maintainers list.
      Signed-off-by: default avatarGuennadi Liakhovetski <g.liakhovetski@gmx.de>
      Signed-off-by: default avatarChris Ball <cjb@laptop.org>
      00411135
    • Ludovic Desroches's avatar
      mmc: atmel-mci: fix timeout errors in SDIO mode when using DMA · 66b512ed
      Ludovic Desroches authored
      With some SDIO devices, timeout errors can happen when reading data.
      To solve this issue, the DMA transfer has to be activated before sending
      the command to the device. This order is incorrect in PDC mode. So we
      have to take care if we are using DMA or PDC to know when to send the
      MMC command.
      
      Cc: stable <stable@vger.kernel.org> # 3.2+
      Signed-off-by: default avatarLudovic Desroches <ludovic.desroches@atmel.com>
      Acked-by: default avatarNicolas Ferre <nicolas.ferre@atmel.com>
      Signed-off-by: default avatarChris Ball <cjb@laptop.org>
      66b512ed
    • Kuninori Morimoto's avatar
      mmc: tmio: don't overwrite caps2 · dd006b30
      Kuninori Morimoto authored
      02cb3221 ("mmc: tmio: support caps2 flags") added caps2 support on
      tmio, but it overwrites mmc_of_parse() settings.  This patch fixes it.
      Signed-off-by: default avatarKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
      Acked-by: default avatarLaurent <laurent.pinchart@ideasonboard.com>
      Signed-off-by: default avatarChris Ball <cjb@laptop.org>
      dd006b30
    • Ray Jui's avatar
      mmc: fix host release issue after discard operation · f662ae48
      Ray Jui authored
      Under function mmc_blk_issue_rq, after an MMC discard operation,
      the MMC request data structure may be freed in memory. Later in
      the same function, the check of req->cmd_flags & MMC_REQ_SPECIAL_MASK
      is dangerous and invalid. It causes the MMC host not to be released
      when it should.
      
      This patch fixes the issue by marking the special request down before
      the discard/flush operation.
      
      Reported by: Harold (SoonYeal) Yang <haroldsy@broadcom.com>
      Signed-off-by: default avatarRay Jui <rjui@broadcom.com>
      Reviewed-by: default avatarSeungwon Jeon <tgih.jun@samsung.com>
      Acked-by: default avatarSeungwon Jeon <tgih.jun@samsung.com>
      Cc: stable <stable@vger.kernel.org>
      Signed-off-by: default avatarChris Ball <cjb@laptop.org>
      f662ae48
    • Dong Aisheng's avatar
      mmc: sdhci-esdhc-imx: add runtime pm support · 89d7e5c1
      Dong Aisheng authored
      The root clock will be disabled in runtime pm to save power.
      Signed-off-by: default avatarDong Aisheng <b29396@freescale.com>
      Acked-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
      Signed-off-by: default avatarChris Ball <cjb@laptop.org>
      89d7e5c1
    • Dong Aisheng's avatar
      mmc: sdhci-esdhc-imx: fix runtime pm unbalance issue · ce090a4e
      Dong Aisheng authored
      Since we're using common esdhc_send_command for tuning commands and
      the core code will call pm_runtime_put after command is finished.
      So we add a pm_runtime_get_sync here to get the balance.
      Signed-off-by: default avatarDong Aisheng <b29396@freescale.com>
      Acked-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
      Signed-off-by: default avatarChris Ball <cjb@laptop.org>
      ce090a4e
    • Dong Aisheng's avatar
      mmc: esdhc-imx: clearing SDHCI_CTRL_EXEC_TUNING should not affect other bits · 8b2bb0ad
      Dong Aisheng authored
      Current code will clear all turning related bits like ESDHC_STD_TUNING_EN
      and ESDHC_MIX_CTRL_FBCLK_SEL when clear SDHCI_CTRL_EXEC_TUNING.
      This may cause the card which has already passed the turning to become
      unwork since the turning status lost.
      We observed this failure when enable runtime pm.
      
      BTW, imx needs to enable ESDHC_MIX_CTRL_FBCLK_SEL bit for turned clock.
      The FBCLK_SEL will be cleared when SDHCI_CTRL_TUNED_CLK is cleared
      and SDHCI_CTRL_EXEC_TUNING is not set.
      This is used in case we change to another normal card from a UHS card
      in the same slot. FBCLK_SEL is not needed for normal card.
      
      After that, SDHCI_CTRL_EXEC_TUNING will only affect ESDHC_MIX_CTRL_EXE_TUNE.
      Clearing it does not affect the turned card to remain working on UHS mode.
      Signed-off-by: default avatarDong Aisheng <b29396@freescale.com>
      Acked-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
      Signed-off-by: default avatarChris Ball <cjb@laptop.org>
      8b2bb0ad