msm: cpufreq: Implement suspend/resume for cpufreq driver

Cpufreq suspend variable get's updated in kernel pm notifier
callback which gets called in process context. This will create
window where cpufreq governor may try to change the frequency
before suspend variable is updated while resume.

Define suspend/resume for cpufreq driver to update suspend variable
in atomic context.

Don't update the policy->cur upon cpufreq driver failure.

CRs-fixed: 423791
Change-Id: Id78705f5c3b8bf801c6253e9362299280903769f
Signed-off-by: Anji Jonnala <anjir@codeaurora.org>
Signed-off-by: Goberu Gopal <ggober@codeaurora.org>
(cherry picked from commit d39b199d76430d2fc341bb4e63338eb31fb408cd)
Merge "msm: cpufreq: Implement suspend/resume for cpufreq driver"
mmc: card: abort the suspend if the card is busy

mmc_blk_suspend() is triggered when system is going into suspend which
then waits for the mmcqd thread (which processes active MMC transfer
requests) to complete all queued transfer requests but if mmcqd has
multiple requests to be processed at this point, mmc_blk_suspend() may
very well sleep for duration longer than DPM (Device Power Management)
timeout (currently 12 sec) causing the DPM timeout bug.

To fix this issue, mmc_blk_suspend() checks if there are any more pending
MMC requests in progress or not and if there are any, it returns error
which should abort the ongoing system suspend.

CRs-Fixed: 439192
Change-Id: I51a31cf43c8da4944617d1c4441a27cc6577926f
Signed-off-by: Subhash Jadavani <subhashj@codeaurora.org>
Merge "mmc: card: abort the suspend if the card is busy"
diag: Add concurrency protection to writes on smd data channels

Currently, diag does not protect against multiple threads writing
on a diag smd data channel at the same time. Make changes to protect
against concurrent writes on the same smd data channel.

CRs-Fixed: 455354

Change-Id: I6892db6ab55c402959b65a1eaad2f985094455ad
Signed-off-by: Dixon Peterson <dixonp@codeaurora.org>
Merge "diag: Add concurrency protection to writes on smd data channels"
qdsp5: audio: Fix crash in audpp driver due to invalid state

AUDPP driver state is not reset if disable fails and this
results in crash as next AUDPP enable assumes that it is
already in enabled state and tries to access some invalid
data

Change-Id: Ibcb5c83e110d2e09f5d3d15c62e12fbbbc040bb4
Signed-off-by: Sriranjan Srikantam <cssrika@codeaurora.org>
Merge "qdsp5: audio: Fix crash in audpp driver due to invalid state"
mmc: core: Don't cancel detect work during MMC suspend

When MMC host is suspending the cancellation of the MMC detect
work is in progress. And mmc_rescan() which had triggered for
SD card is blocked since mmcqd/1 has acquired the host lock.
The mmcqd/1 is waiting to proceed for the card status check.
Meanwhile, a write request is received on eMMC but it cannot
proceed as it is waiting for the ongoing runtime suspend to finish.

"kworker/0:1"
----
-000|need_resched()
-001|schedule_timeout(timeout = 2147483647)
-002|wait_for_common(x = 0xD9391E90, ?, state = 2, iowait = 0)
-003|flush_workqueue(wq = 0xD92DCA80)
-004|mmc_suspend_host(host = 0xD8B20000)
-005|msmsdcc_runtime_suspend(dev = 0xC08B0598)
-006|pm_generic_runtime_suspend(?)
-007|__rpm_callback(cb = 0xC02F1BD8, dev = 0xC08B0598)
-008|rpm_suspend(dev = 0xC08B0598, rpmflags = 2)
-009|pm_runtime_work(work = 0xC08B065C)
-010|process_one_work(worker = 0xD9367F40, work = 0xC08B065C)
-011|worker_thread(__worker = 0xD9367F40)
-012|kthread(_create = 0xD924FF18)
-013|kernel_thread_exit(asm)
 ---|end of frame
    |

"kworker/u:4"
----
-000|need_resched()
-001|__mmc_claim_host(host = 0xD8B21000, abort = 0x0)
-002|mmc_sd_detect(host = 0xD8B21000)
-003|mmc_rescan(work = 0xD8B212A0)
-004|process_one_work(worker = 0xCDB12440, work = 0xD8B212A0)
-005|worker_thread(__worker = 0xCDB12440)
-006|kthread(_create = 0xD8BC7F18)
-007|kernel_thread_exit(asm)
 ---|end of frame
    |

mmcqd/1 (running)
----
-000|need_resched()
-001|schedule_timeout(timeout = 2147483647)
-002|io_schedule_timeout(timeout = 2147483647)
-003|wait_for_common(x = 0xD8633E2C, ?, state = 2, iowait = 1)
-004|mmc_wait_for_req_done(host = 0xD8B21000, mrq = 0xD8633E1C)
-005|mmc_wait_for_cmd(host = 0xD8B21000, cmd = 0xD8633E50, retries = 5)
-006|get_card_status(card = 0xD8D8B800, status = 0xD8633EA4, retries = 5)
-007|mmc_blk_err_check(card = 0xD8D8B800, areq = 0xD8624440)
-008|mmc_start_req(host = 0xD8B21000, areq = 0x0, error = 0xD8633F4C)
-009|mmc_blk_issue_rw_rq(mq = 0xD8624008, ?)
-010|mmc_blk_issue_rq(mq = 0xD8624008, req = 0x0)
-011|mmc_queue_thread(d = 0xD8624008)
-012|kthread(_create = 0xD9397D80)
-013|kernel_thread_exit(asm)
 ---|end of frame
    |

mmcqd/0
----
-000|need_resched()
-001|rpm_resume(dev = 0xC08B0598, rpmflags = 4)
-002|__pm_runtime_resume(dev = 0xC08B0598, rpmflags = 4)
-003|msmsdcc_enable(mmc = 0xD8B20000)
-004|__mmc_claim_host(host = 0xD8B20000, abort = 0x0)
-005|mmc_blk_issue_rq(mq = 0xD8C43008, req = 0xC52C9798)
-006|mmc_queue_thread(d = 0xD8C43008)
-007|kthread(_create = 0xD9397D80)
-008|kernel_thread_exit(asm)
 ---|end of frame
    |

So remove the cancellation of the detect work for the
MMC suspend to proceed and avoid this deadlock.

Change-Id: Id79d6b81e992b08039d639b1c0f6c2eb4a79df62
Signed-off-by: Pratibhasagar V <pratibha@codeaurora.org>
msm: board-msm7627a-wlan: Fix incorrect wlan regulator cleanup

Wlan regulator handlers which are obtained in qrf6285_init_regs()
should not be freed. Freeing those handler using regulator_put()
would cause power regulator module to access invalid handlers in
sup-sequence power up/down sequence and lead kernel to panic.
This patch removes regulator_put() call in wlan_switch_regulators().

During power down sequence, there are changes in wlan_switch_regulators()
to enter into infinite while loop (ie, index is not decremented for power
down case). Fixed now.

Current wlan_switch_regulators() functions ignores to turn of all wlan
regulator when one of wlan regulator turn off fails. Ideally, it should
try to turn off all wlan related regulators without considering failures.

CRs-fixed: 471086
Change-Id: Ia4dbf81a3edd12ccbcf4d5870615549cb63dfbc3
Signed-off-by: Jimmy Chen <jzchen@codeaurora.org>
Merge "msm: board-msm7627a-wlan: Fix incorrect wlan regulator cleanup"
Merge "mmc: core: Don't cancel detect work during MMC suspend"