Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit aac39233 authored by Osvaldo Banuelos's avatar Osvaldo Banuelos
Browse files

power: qcom: apm: acquire spinlock during APM mode transitions



In order to guarantee the APM switch sequence is not preempted as
well as to provide synchronization in the event the APM switch mode
APIs are called concurrently, introduce a per-APM controller spinlock
which must be acquired and released during the VDD_APCC to VDD_MX
and VDD_MX to VDD_APCC switch sequences.

Change-Id: I630498c512c58cf07754553b75357375158a544c
Signed-off-by: default avatarOsvaldo Banuelos <osvaldob@codeaurora.org>
parent 738fe103
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -81,6 +81,7 @@ struct msm_apm_ctrl_dev {
	struct list_head	list;
	struct device		*dev;
	enum msm_apm_supply	supply;
	spinlock_t		lock;
	void __iomem		*reg_base;
	void __iomem		*apcs_csr_base;
	void __iomem		**apcs_spm_events_addr;
@@ -219,6 +220,9 @@ static int msm_apm_switch_to_mx(struct msm_apm_ctrl_dev *ctrl_dev)
	int i, timeout = MSM_APM_SWITCH_TIMEOUT_US;
	u32 regval;
	int ret = 0;
	unsigned long flags;

	spin_lock_irqsave(&ctrl_dev->lock, flags);

	/* Perform revision-specific programming steps */
	if (ctrl_dev->version < HMSS_VERSION_1P2) {
@@ -292,6 +296,8 @@ static int msm_apm_switch_to_mx(struct msm_apm_ctrl_dev *ctrl_dev)
		dev_dbg(ctrl_dev->dev, "APM supply switched to MX\n");
	}

	spin_unlock_irqrestore(&ctrl_dev->lock, flags);

	return ret;
}

@@ -300,6 +306,9 @@ static int msm_apm_switch_to_apcc(struct msm_apm_ctrl_dev *ctrl_dev)
	int i, timeout = MSM_APM_SWITCH_TIMEOUT_US;
	u32 regval;
	int ret = 0;
	unsigned long flags;

	spin_lock_irqsave(&ctrl_dev->lock, flags);

	/* Perform revision-specific programming steps */
	if (ctrl_dev->version < HMSS_VERSION_1P2) {
@@ -373,6 +382,8 @@ static int msm_apm_switch_to_apcc(struct msm_apm_ctrl_dev *ctrl_dev)
		dev_dbg(ctrl_dev->dev, "APM supply switched to APCC\n");
	}

	spin_unlock_irqrestore(&ctrl_dev->lock, flags);

	return ret;
}

@@ -566,6 +577,7 @@ static int msm_apm_probe(struct platform_device *pdev)
	}

	INIT_LIST_HEAD(&ctrl->list);
	spin_lock_init(&ctrl->lock);
	ctrl->dev = dev;
	platform_set_drvdata(pdev, ctrl);