summaryrefslogtreecommitdiff
path: root/drivers/mmc
diff options
context:
space:
mode:
authorSujit Reddy Thumma <sthumma@codeaurora.org>2013-08-06 11:21:33 +0530
committerSubhash Jadavani <subhashj@codeaurora.org>2016-05-27 10:28:48 -0700
commit6f092797e7859446617ecfe7668d0b40be932717 (patch)
treecde79d734f731276dafceee00c65c63371359cec /drivers/mmc
parent0931642c2067ccadea5af291634c1d9acc764de1 (diff)
mmc: sdhci-msm: Fix incorrect flags passed during spin_unlock_irqrestore
Fix following bug - foo_bar1(int arg1, unsigned long flags) { spin_unlock_irqrestore(lock, flags); // step 1 <do something>; spin_lock_irqsave(lock, flags); // step 2 } foo_bar() { unsinged long flags; spin_lock_irqsave(lock, flags); // step 3 foo_bar1(arg1, flags); spin_unlock_irqrestore(lock, flags); // step 4 } The "flags" might be changed in step 4 due to irqrestore and irqsave in foo_bar1(). Change-Id: I42366f7acdde022705f4b3dd06122d54ad817078 Signed-off-by: Sujit Reddy Thumma <sthumma@codeaurora.org>
Diffstat (limited to 'drivers/mmc')
-rw-r--r--drivers/mmc/host/sdhci-msm.c12
1 files changed, 7 insertions, 5 deletions
diff --git a/drivers/mmc/host/sdhci-msm.c b/drivers/mmc/host/sdhci-msm.c
index 020677d7ab48..ef7fd50bb56e 100644
--- a/drivers/mmc/host/sdhci-msm.c
+++ b/drivers/mmc/host/sdhci-msm.c
@@ -1262,16 +1262,18 @@ static int sdhci_msm_bus_get_vote_for_bw(struct sdhci_msm_host *host,
*/
static inline int sdhci_msm_bus_set_vote(struct sdhci_msm_host *msm_host,
int vote,
- unsigned long flags)
+ unsigned long *flags)
{
struct sdhci_host *host = platform_get_drvdata(msm_host->pdev);
int rc = 0;
+ BUG_ON(!flags);
+
if (vote != msm_host->msm_bus_vote.curr_vote) {
- spin_unlock_irqrestore(&host->lock, flags);
+ spin_unlock_irqrestore(&host->lock, *flags);
rc = msm_bus_scale_client_update_request(
msm_host->msm_bus_vote.client_handle, vote);
- spin_lock_irqsave(&host->lock, flags);
+ spin_lock_irqsave(&host->lock, *flags);
if (rc) {
pr_err("%s: msm_bus_scale_client_update_request() failed: bus_client_handle=0x%x, vote=%d, err=%d\n",
mmc_hostname(host->mmc),
@@ -1304,7 +1306,7 @@ static void sdhci_msm_bus_work(struct work_struct *work)
/* 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);
+ msm_host->msm_bus_vote.min_bw_vote, &flags);
} else
pr_warning("%s: %s: Transfer in progress. skipping bus voting to 0 bandwidth\n",
mmc_hostname(host->mmc), __func__);
@@ -1326,7 +1328,7 @@ static void sdhci_msm_bus_cancel_work_and_set_vote(struct sdhci_host *host,
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);
+ sdhci_msm_bus_set_vote(msm_host, vote, &flags);
spin_unlock_irqrestore(&host->lock, flags);
}