Loading drivers/mmc/host/sdhci-msm.c +9 −83 Original line number Diff line number Diff line Loading @@ -2229,33 +2229,6 @@ static inline int sdhci_msm_bus_set_vote(struct sdhci_msm_host *msm_host, return rc; } /* * Internal work. Work to set 0 bandwidth for msm bus. */ static void sdhci_msm_bus_work(struct work_struct *work) { struct sdhci_msm_host *msm_host; struct sdhci_host *host; unsigned long flags; msm_host = container_of(work, struct sdhci_msm_host, msm_bus_vote.vote_work.work); host = platform_get_drvdata(msm_host->pdev); if (!msm_host->msm_bus_vote.client_handle) return; spin_lock_irqsave(&host->lock, flags); /* don't vote for 0 bandwidth if any request is in progress */ if (!host->mrq) { sdhci_msm_bus_set_vote(msm_host, msm_host->msm_bus_vote.min_bw_vote, &flags); } else pr_warn("%s: %s: Transfer in progress. skipping bus voting to 0 bandwidth\n", mmc_hostname(host->mmc), __func__); spin_unlock_irqrestore(&host->lock, flags); } /*****************************************************************************\ * * * MSM Command Queue Engine (CQE) * Loading Loading @@ -2441,7 +2414,7 @@ static void sdhci_msm_cqe_add_host(struct sdhci_host *host, * This function cancels any scheduled delayed work and sets the bus * vote based on bw (bandwidth) argument. */ static void sdhci_msm_bus_cancel_work_and_set_vote(struct sdhci_host *host, static void sdhci_msm_bus_get_and_set_vote(struct sdhci_host *host, unsigned int bw) { int vote; Loading @@ -2449,31 +2422,12 @@ static void sdhci_msm_bus_cancel_work_and_set_vote(struct sdhci_host *host, struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host); struct sdhci_msm_host *msm_host = pltfm_host->priv; cancel_delayed_work_sync(&msm_host->msm_bus_vote.vote_work); spin_lock_irqsave(&host->lock, flags); vote = sdhci_msm_bus_get_vote_for_bw(msm_host, bw); sdhci_msm_bus_set_vote(msm_host, vote, &flags); spin_unlock_irqrestore(&host->lock, flags); } #define MSM_MMC_BUS_VOTING_DELAY 200 /* msecs */ /* This function queues a work which will set the bandwidth requiement to 0 */ static void sdhci_msm_bus_queue_work(struct sdhci_host *host) { unsigned long flags; struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host); struct sdhci_msm_host *msm_host = pltfm_host->priv; spin_lock_irqsave(&host->lock, flags); if (msm_host->msm_bus_vote.min_bw_vote != msm_host->msm_bus_vote.curr_vote) queue_delayed_work(system_wq, &msm_host->msm_bus_vote.vote_work, msecs_to_jiffies(MSM_MMC_BUS_VOTING_DELAY)); spin_unlock_irqrestore(&host->lock, flags); } static int sdhci_msm_bus_register(struct sdhci_msm_host *host, struct platform_device *pdev) { Loading Loading @@ -2544,22 +2498,11 @@ static void sdhci_msm_bus_voting(struct sdhci_host *host, u32 enable) if (!msm_host->msm_bus_vote.client_handle) return; bw = sdhci_get_bw_required(host, ios); if (enable) { sdhci_msm_bus_cancel_work_and_set_vote(host, bw); bw = sdhci_get_bw_required(host, ios); sdhci_msm_bus_get_and_set_vote(host, bw); } else { /* * If clock gating is enabled, then remove the vote * immediately because clocks will be disabled only * after SDHCI_MSM_MMC_CLK_GATE_DELAY and thus no * additional delay is required to remove the bus vote. */ #ifdef CONFIG_MMC_CLKGATE if (host->mmc->clkgate_delay) sdhci_msm_bus_cancel_work_and_set_vote(host, 0); else #endif sdhci_msm_bus_queue_work(host); sdhci_msm_bus_get_and_set_vote(host, 0); } } Loading Loading @@ -3489,8 +3432,7 @@ static int sdhci_msm_enable_controller_clock(struct sdhci_host *host) if (!IS_ERR(msm_host->pclk)) clk_disable_unprepare(msm_host->pclk); remove_vote: if (msm_host->msm_bus_vote.client_handle) sdhci_msm_bus_cancel_work_and_set_vote(host, 0); sdhci_msm_bus_voting(host, 0); out: return rc; } Loading Loading @@ -3619,8 +3561,7 @@ static int sdhci_msm_prepare_clocks(struct sdhci_host *host, bool enable) clk_disable_unprepare(msm_host->pclk); atomic_set(&msm_host->controller_clock, 0); remove_vote: if (msm_host->msm_bus_vote.client_handle) sdhci_msm_bus_cancel_work_and_set_vote(host, 0); sdhci_msm_bus_voting(host, 0); out: return rc; } Loading Loading @@ -5170,9 +5111,6 @@ static int sdhci_msm_probe(struct platform_device *pdev) if (ret) goto sleep_clk_disable; if (msm_host->msm_bus_vote.client_handle) INIT_DELAYED_WORK(&msm_host->msm_bus_vote.vote_work, sdhci_msm_bus_work); sdhci_msm_bus_voting(host, 1); /* Setup regulators */ Loading Loading @@ -5502,8 +5440,7 @@ static int sdhci_msm_probe(struct platform_device *pdev) vreg_deinit: sdhci_msm_vreg_init(&pdev->dev, msm_host->pdata, false); bus_unregister: if (msm_host->msm_bus_vote.client_handle) sdhci_msm_bus_cancel_work_and_set_vote(host, 0); sdhci_msm_bus_voting(host, 0); sdhci_msm_bus_unregister(msm_host); sleep_clk_disable: if (!IS_ERR(msm_host->sleep_clk)) Loading Loading @@ -5588,10 +5525,9 @@ static int sdhci_msm_remove(struct platform_device *pdev) sdhci_msm_setup_pins(pdata, true); sdhci_msm_setup_pins(pdata, false); if (msm_host->msm_bus_vote.client_handle) { sdhci_msm_bus_cancel_work_and_set_vote(host, 0); sdhci_msm_bus_voting(host, 0); if (msm_host->msm_bus_vote.client_handle) sdhci_msm_bus_unregister(msm_host); } sdhci_pltfm_free(pdev); Loading Loading @@ -5663,16 +5599,6 @@ static int sdhci_msm_runtime_suspend(struct device *dev) defer_disable_host_irq: disable_irq(msm_host->pwr_irq); /* * Remove the vote immediately only if clocks are off in which * case we might have queued work to remove vote but it may not * be completed before runtime suspend or system suspend. */ if (!atomic_read(&msm_host->clks_on)) { if (msm_host->msm_bus_vote.client_handle) sdhci_msm_bus_cancel_work_and_set_vote(host, 0); } if (host->is_crypto_en) { ret = sdhci_msm_ice_suspend(host); if (ret < 0) Loading drivers/mmc/host/sdhci-msm.h +0 −1 Original line number Diff line number Diff line Loading @@ -158,7 +158,6 @@ struct sdhci_msm_bus_vote { int min_bw_vote; int max_bw_vote; bool is_max_bw_needed; struct delayed_work vote_work; struct device_attribute max_bus_bw; }; Loading Loading
drivers/mmc/host/sdhci-msm.c +9 −83 Original line number Diff line number Diff line Loading @@ -2229,33 +2229,6 @@ static inline int sdhci_msm_bus_set_vote(struct sdhci_msm_host *msm_host, return rc; } /* * Internal work. Work to set 0 bandwidth for msm bus. */ static void sdhci_msm_bus_work(struct work_struct *work) { struct sdhci_msm_host *msm_host; struct sdhci_host *host; unsigned long flags; msm_host = container_of(work, struct sdhci_msm_host, msm_bus_vote.vote_work.work); host = platform_get_drvdata(msm_host->pdev); if (!msm_host->msm_bus_vote.client_handle) return; spin_lock_irqsave(&host->lock, flags); /* don't vote for 0 bandwidth if any request is in progress */ if (!host->mrq) { sdhci_msm_bus_set_vote(msm_host, msm_host->msm_bus_vote.min_bw_vote, &flags); } else pr_warn("%s: %s: Transfer in progress. skipping bus voting to 0 bandwidth\n", mmc_hostname(host->mmc), __func__); spin_unlock_irqrestore(&host->lock, flags); } /*****************************************************************************\ * * * MSM Command Queue Engine (CQE) * Loading Loading @@ -2441,7 +2414,7 @@ static void sdhci_msm_cqe_add_host(struct sdhci_host *host, * This function cancels any scheduled delayed work and sets the bus * vote based on bw (bandwidth) argument. */ static void sdhci_msm_bus_cancel_work_and_set_vote(struct sdhci_host *host, static void sdhci_msm_bus_get_and_set_vote(struct sdhci_host *host, unsigned int bw) { int vote; Loading @@ -2449,31 +2422,12 @@ static void sdhci_msm_bus_cancel_work_and_set_vote(struct sdhci_host *host, struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host); struct sdhci_msm_host *msm_host = pltfm_host->priv; cancel_delayed_work_sync(&msm_host->msm_bus_vote.vote_work); spin_lock_irqsave(&host->lock, flags); vote = sdhci_msm_bus_get_vote_for_bw(msm_host, bw); sdhci_msm_bus_set_vote(msm_host, vote, &flags); spin_unlock_irqrestore(&host->lock, flags); } #define MSM_MMC_BUS_VOTING_DELAY 200 /* msecs */ /* This function queues a work which will set the bandwidth requiement to 0 */ static void sdhci_msm_bus_queue_work(struct sdhci_host *host) { unsigned long flags; struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host); struct sdhci_msm_host *msm_host = pltfm_host->priv; spin_lock_irqsave(&host->lock, flags); if (msm_host->msm_bus_vote.min_bw_vote != msm_host->msm_bus_vote.curr_vote) queue_delayed_work(system_wq, &msm_host->msm_bus_vote.vote_work, msecs_to_jiffies(MSM_MMC_BUS_VOTING_DELAY)); spin_unlock_irqrestore(&host->lock, flags); } static int sdhci_msm_bus_register(struct sdhci_msm_host *host, struct platform_device *pdev) { Loading Loading @@ -2544,22 +2498,11 @@ static void sdhci_msm_bus_voting(struct sdhci_host *host, u32 enable) if (!msm_host->msm_bus_vote.client_handle) return; bw = sdhci_get_bw_required(host, ios); if (enable) { sdhci_msm_bus_cancel_work_and_set_vote(host, bw); bw = sdhci_get_bw_required(host, ios); sdhci_msm_bus_get_and_set_vote(host, bw); } else { /* * If clock gating is enabled, then remove the vote * immediately because clocks will be disabled only * after SDHCI_MSM_MMC_CLK_GATE_DELAY and thus no * additional delay is required to remove the bus vote. */ #ifdef CONFIG_MMC_CLKGATE if (host->mmc->clkgate_delay) sdhci_msm_bus_cancel_work_and_set_vote(host, 0); else #endif sdhci_msm_bus_queue_work(host); sdhci_msm_bus_get_and_set_vote(host, 0); } } Loading Loading @@ -3489,8 +3432,7 @@ static int sdhci_msm_enable_controller_clock(struct sdhci_host *host) if (!IS_ERR(msm_host->pclk)) clk_disable_unprepare(msm_host->pclk); remove_vote: if (msm_host->msm_bus_vote.client_handle) sdhci_msm_bus_cancel_work_and_set_vote(host, 0); sdhci_msm_bus_voting(host, 0); out: return rc; } Loading Loading @@ -3619,8 +3561,7 @@ static int sdhci_msm_prepare_clocks(struct sdhci_host *host, bool enable) clk_disable_unprepare(msm_host->pclk); atomic_set(&msm_host->controller_clock, 0); remove_vote: if (msm_host->msm_bus_vote.client_handle) sdhci_msm_bus_cancel_work_and_set_vote(host, 0); sdhci_msm_bus_voting(host, 0); out: return rc; } Loading Loading @@ -5170,9 +5111,6 @@ static int sdhci_msm_probe(struct platform_device *pdev) if (ret) goto sleep_clk_disable; if (msm_host->msm_bus_vote.client_handle) INIT_DELAYED_WORK(&msm_host->msm_bus_vote.vote_work, sdhci_msm_bus_work); sdhci_msm_bus_voting(host, 1); /* Setup regulators */ Loading Loading @@ -5502,8 +5440,7 @@ static int sdhci_msm_probe(struct platform_device *pdev) vreg_deinit: sdhci_msm_vreg_init(&pdev->dev, msm_host->pdata, false); bus_unregister: if (msm_host->msm_bus_vote.client_handle) sdhci_msm_bus_cancel_work_and_set_vote(host, 0); sdhci_msm_bus_voting(host, 0); sdhci_msm_bus_unregister(msm_host); sleep_clk_disable: if (!IS_ERR(msm_host->sleep_clk)) Loading Loading @@ -5588,10 +5525,9 @@ static int sdhci_msm_remove(struct platform_device *pdev) sdhci_msm_setup_pins(pdata, true); sdhci_msm_setup_pins(pdata, false); if (msm_host->msm_bus_vote.client_handle) { sdhci_msm_bus_cancel_work_and_set_vote(host, 0); sdhci_msm_bus_voting(host, 0); if (msm_host->msm_bus_vote.client_handle) sdhci_msm_bus_unregister(msm_host); } sdhci_pltfm_free(pdev); Loading Loading @@ -5663,16 +5599,6 @@ static int sdhci_msm_runtime_suspend(struct device *dev) defer_disable_host_irq: disable_irq(msm_host->pwr_irq); /* * Remove the vote immediately only if clocks are off in which * case we might have queued work to remove vote but it may not * be completed before runtime suspend or system suspend. */ if (!atomic_read(&msm_host->clks_on)) { if (msm_host->msm_bus_vote.client_handle) sdhci_msm_bus_cancel_work_and_set_vote(host, 0); } if (host->is_crypto_en) { ret = sdhci_msm_ice_suspend(host); if (ret < 0) Loading
drivers/mmc/host/sdhci-msm.h +0 −1 Original line number Diff line number Diff line Loading @@ -158,7 +158,6 @@ struct sdhci_msm_bus_vote { int min_bw_vote; int max_bw_vote; bool is_max_bw_needed; struct delayed_work vote_work; struct device_attribute max_bus_bw; }; Loading