1. 23 3月, 2015 36 次提交
  2. 19 3月, 2015 1 次提交
  3. 04 2月, 2015 3 次提交
    • P
      mmc: sdhci-s3c: solve problem with sleeping in atomic context · 017210d1
      Paul Osmialowski 提交于
      This change addresses following problem:
      
      [    2.560726] ------------[ cut here ]------------
      [    2.565341] WARNING: CPU: 0 PID: 1 at kernel/locking/lockdep.c:2744 lockdep_trace_alloc+0xec/0x118()
      [    2.574439] DEBUG_LOCKS_WARN_ON(irqs_disabled_flags(flags))
      [    2.579821] Modules linked in:
      [    2.583038] CPU: 0 PID: 1 Comm: swapper/0 Tainted: G        W      3.18.0-next-20141216-00002-g4ff197fc1902-dirty #1318
      [    2.593796] Hardware name: SAMSUNG EXYNOS (Flattened Device Tree)
      [    2.599892] [<c0014c44>] (unwind_backtrace) from [<c0011bbc>] (show_stack+0x10/0x14)
      [    2.607612] [<c0011bbc>] (show_stack) from [<c04953b8>] (dump_stack+0x70/0xbc)
      [    2.614822] [<c04953b8>] (dump_stack) from [<c0023444>] (warn_slowpath_common+0x74/0xb0)
      [    2.622885] [<c0023444>] (warn_slowpath_common) from [<c0023514>] (warn_slowpath_fmt+0x30/0x40)
      [    2.631569] [<c0023514>] (warn_slowpath_fmt) from [<c0063644>] (lockdep_trace_alloc+0xec/0x118)
      [    2.640246] [<c0063644>] (lockdep_trace_alloc) from [<c00df52c>] (__kmalloc+0x3c/0x1cc)
      [    2.648240] [<c00df52c>] (__kmalloc) from [<c0394970>] (clk_fetch_parent_index+0xb8/0xd4)
      [    2.656390] [<c0394970>] (clk_fetch_parent_index) from [<c0394a6c>] (clk_calc_new_rates+0xe0/0x1fc)
      [    2.665415] [<c0394a6c>] (clk_calc_new_rates) from [<c0394b40>] (clk_calc_new_rates+0x1b4/0x1fc)
      [    2.674181] [<c0394b40>] (clk_calc_new_rates) from [<c0395408>] (clk_set_rate+0x50/0xc8)
      [    2.682265] [<c0395408>] (clk_set_rate) from [<c0377708>] (sdhci_cmu_set_clock+0x68/0x16c)
      [    2.690503] [<c0377708>] (sdhci_cmu_set_clock) from [<c03735cc>] (sdhci_do_set_ios+0xf0/0x64c)
      [    2.699095] [<c03735cc>] (sdhci_do_set_ios) from [<c0373b48>] (sdhci_set_ios+0x20/0x2c)
      [    2.707080] [<c0373b48>] (sdhci_set_ios) from [<c035ddf0>] (mmc_power_up+0x118/0x1fc)
      [    2.714889] [<c035ddf0>] (mmc_power_up) from [<c035ecd0>] (mmc_start_host+0x44/0x6c)
      [    2.722615] [<c035ecd0>] (mmc_start_host) from [<c035fd60>] (mmc_add_host+0x58/0x7c)
      [    2.730341] [<c035fd60>] (mmc_add_host) from [<c037454c>] (sdhci_add_host+0x968/0xd94)
      [    2.738240] [<c037454c>] (sdhci_add_host) from [<c0377b60>] (sdhci_s3c_probe+0x354/0x52c)
      [    2.746406] [<c0377b60>] (sdhci_s3c_probe) from [<c0283b58>] (platform_drv_probe+0x48/0xa4)
      [    2.754733] [<c0283b58>] (platform_drv_probe) from [<c02824e8>] (driver_probe_device+0x13c/0x37c)
      [    2.763585] [<c02824e8>] (driver_probe_device) from [<c02827bc>] (__driver_attach+0x94/0x98)
      [    2.772003] [<c02827bc>] (__driver_attach) from [<c0280a60>] (bus_for_each_dev+0x54/0x88)
      [    2.780163] [<c0280a60>] (bus_for_each_dev) from [<c0281b48>] (bus_add_driver+0xe4/0x200)
      [    2.788322] [<c0281b48>] (bus_add_driver) from [<c0282dfc>] (driver_register+0x78/0xf4)
      [    2.796308] [<c0282dfc>] (driver_register) from [<c00089b0>] (do_one_initcall+0xac/0x1f0)
      [    2.804473] [<c00089b0>] (do_one_initcall) from [<c0673d94>] (kernel_init_freeable+0x10c/0x1d8)
      [    2.813153] [<c0673d94>] (kernel_init_freeable) from [<c0490058>] (kernel_init+0x28/0x108)
      [    2.821398] [<c0490058>] (kernel_init) from [<c000f268>] (ret_from_fork+0x14/0x2c)
      [    2.828939] ---[ end trace 03cc00e539849d1f ]---
      
      clk_set_rate() tries to take clk's prepare_lock mutex while being in atomic
      context entered in sdhci_do_set_ios().
      
      The solution is inspired by similar situation in sdhci_set_power() also called
      from sdhci_do_set_ios():
      
                      spin_unlock_irq(&host->lock);
                      mmc_regulator_set_ocr(mmc, mmc->supply.vmmc, vdd);
                      spin_lock_irq(&host->lock);
      
      Note that since sdhci_s3c_set_clock() sets SDHCI_CLOCK_CARD_EN, proposed change
      first resets this bit. It is reset anyway (by setting SDHCI_CLOCK_INT_EN bit
      only) after call to clk_set_rate() in order to wait for the clock to stabilize
      and is set again as soon as the clock becomes stable.
      Signed-off-by: NPaul Osmialowski <p.osmialowsk@samsung.com>
      Tested-by: NJaehoon Chung <jh80.chung@samsung.com>
      Acked-by: NJaehoon Chung <jh80.chung@samsung.com>
      Signed-off-by: NUlf Hansson <ulf.hansson@linaro.org>
      017210d1
    • M
      mmc: pwrseq: add driver for emmc hardware reset · 726b6324
      Marek Szyprowski 提交于
      This patch provides a simple mmc-pwrseq-emmc driver, which controls
      single gpio line. It perform standard eMMC hw reset procedure, as
      descibed by Jedec 4.4 specification. This procedure is performed just
      after MMC core enabled power to the given mmc host (to fix possible
      issues if bootloader has left eMMC card in initialized or unknown
      state), and before performing complete system reboot (also in case of
      emergency reboot call). The latter is needed on boards, which doesn't
      have hardware reset logic connected to emmc card and (limited or broken)
      ROM bootloaders are unable to read second stage from the emmc card if
      the card is left in unknown or already initialized state.
      Signed-off-by: NMarek Szyprowski <m.szyprowski@samsung.com>
      Signed-off-by: NUlf Hansson <ulf.hansson@linaro.org>
      726b6324
    • A
      mmc: moxart: fix probe logic · 3981c516
      Arnd Bergmann 提交于
      Jonas Jensen wanted to submit a patch for these, but apparently
      forgot about it. I stumbled over this symptom first:
      
      drivers/built-in.o: In function `moxart_probe':
      :(.text+0x2af128): undefined reference to `of_dma_request_slave_channel'
      
      This is because of_dma_request_slave_channel is an internal helper
      and not exported to loadable module. I'm changing the driver to
      use dma_request_slave_channel_reason() instead.
      
      Further problems from inspection:
      
      * The remove function must not call kfree on the host pointer,
        because it is allocated together with the mmc_host.
      
      * The clock is never released
      
      * The dma_cap_mask_t is completely unused and can be removed
      
      * deferred probing does not work if the dma driver is loaded
        after the mmc driver.
      
      This patch should fix all of the above.
      Signed-off-by: NArnd Bergmann <arnd@arndb.de>
      Signed-off-by: NJonas Jensen <jonas.jensen@gmail.com>
      Signed-off-by: NUlf Hansson <ulf.hansson@linaro.org>
      3981c516