soc: swr-mstr: Vote for core vote before clock request
For soundwire devices, if core vote function is available, do a core vote before doing a clock request. This way we retain any hardware votes needed before doing a read or write. Change-Id: If29b5f102be4f2d60e6d71cae70ac43e3fdaa00c Signed-off-by: Karthikeyan Mani <kmani@codeaurora.org>
This commit is contained in:

committed by
Gerrit - the friendly Code Review server

parent
8d40a06347
commit
1d750fe50f
@@ -301,6 +301,15 @@ static int swrm_clk_request(struct swr_mstr_ctrl *swrm, bool enable)
|
|||||||
ret = -ENODEV;
|
ret = -ENODEV;
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
if (swrm->core_vote) {
|
||||||
|
ret = swrm->core_vote(swrm->handle, true);
|
||||||
|
if (ret) {
|
||||||
|
dev_err_ratelimited(swrm->dev,
|
||||||
|
"%s: clock enable req failed",
|
||||||
|
__func__);
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
}
|
||||||
swrm->clk_ref_count++;
|
swrm->clk_ref_count++;
|
||||||
if (swrm->clk_ref_count == 1) {
|
if (swrm->clk_ref_count == 1) {
|
||||||
ret = swrm->clk(swrm->handle, true);
|
ret = swrm->clk(swrm->handle, true);
|
||||||
@@ -2123,6 +2132,7 @@ static int swrm_probe(struct platform_device *pdev)
|
|||||||
swrm->swrm_base_reg, SWRM_MAX_REGISTER);
|
swrm->swrm_base_reg, SWRM_MAX_REGISTER);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
swrm->core_vote = pdata->core_vote;
|
||||||
swrm->clk = pdata->clk;
|
swrm->clk = pdata->clk;
|
||||||
if (!swrm->clk) {
|
if (!swrm->clk) {
|
||||||
dev_err(&pdev->dev, "%s: swrm->clk is NULL\n",
|
dev_err(&pdev->dev, "%s: swrm->clk is NULL\n",
|
||||||
@@ -2584,7 +2594,12 @@ static int swrm_runtime_suspend(struct device *dev)
|
|||||||
mutex_lock(&swrm->reslock);
|
mutex_lock(&swrm->reslock);
|
||||||
usleep_range(100, 105);
|
usleep_range(100, 105);
|
||||||
}
|
}
|
||||||
swrm_clk_request(swrm, false);
|
ret = swrm_clk_request(swrm, false);
|
||||||
|
if (ret) {
|
||||||
|
dev_err(dev, "%s: swrmn clk failed\n", __func__);
|
||||||
|
ret = 0;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
if (swrm->clk_stop_mode0_supp) {
|
if (swrm->clk_stop_mode0_supp) {
|
||||||
if (swrm->wake_irq > 0) {
|
if (swrm->wake_irq > 0) {
|
||||||
|
@@ -91,6 +91,7 @@ struct swr_ctrl_platform_data {
|
|||||||
int (*write)(void *handle, int reg, int val);
|
int (*write)(void *handle, int reg, int val);
|
||||||
int (*bulk_write)(void *handle, u32 *reg, u32 *val, size_t len);
|
int (*bulk_write)(void *handle, u32 *reg, u32 *val, size_t len);
|
||||||
int (*clk)(void *handle, bool enable);
|
int (*clk)(void *handle, bool enable);
|
||||||
|
int (*core_vote)(void *handle, bool enable);
|
||||||
int (*reg_irq)(void *handle, irqreturn_t(*irq_handler)(int irq,
|
int (*reg_irq)(void *handle, irqreturn_t(*irq_handler)(int irq,
|
||||||
void *data), void *swr_handle, int type);
|
void *data), void *swr_handle, int type);
|
||||||
};
|
};
|
||||||
@@ -120,6 +121,7 @@ struct swr_mstr_ctrl {
|
|||||||
int (*write)(void *handle, int reg, int val);
|
int (*write)(void *handle, int reg, int val);
|
||||||
int (*bulk_write)(void *handle, u32 *reg, u32 *val, size_t len);
|
int (*bulk_write)(void *handle, u32 *reg, u32 *val, size_t len);
|
||||||
int (*clk)(void *handle, bool enable);
|
int (*clk)(void *handle, bool enable);
|
||||||
|
int (*core_vote)(void *handle, bool enable);
|
||||||
int (*reg_irq)(void *handle, irqreturn_t(*irq_handler)(int irq,
|
int (*reg_irq)(void *handle, irqreturn_t(*irq_handler)(int irq,
|
||||||
void *data), void *swr_handle, int type);
|
void *data), void *swr_handle, int type);
|
||||||
int irq;
|
int irq;
|
||||||
|
Reference in New Issue
Block a user