Skip to content

Commit

Permalink
i2c: sprd: Prevent i2c accesses after suspend is called
Browse files Browse the repository at this point in the history
Add one flag to indicate if the i2c controller has been in suspend state,
which can prevent i2c accesses after i2c controller is suspended following
system suspend.

Signed-off-by: Baolin Wang <baolin.wang@linaro.org>
Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
  • Loading branch information
wangbaolin719 authored and Wolfram Sang committed Apr 27, 2018
1 parent 23a2772 commit da33aa0
Showing 1 changed file with 16 additions and 0 deletions.
16 changes: 16 additions & 0 deletions drivers/i2c/busses/i2c-sprd.c
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,7 @@ struct sprd_i2c {
u32 count;
int irq;
int err;
bool is_suspended;
};

static void sprd_i2c_set_count(struct sprd_i2c *i2c_dev, u32 count)
Expand Down Expand Up @@ -283,6 +284,9 @@ static int sprd_i2c_master_xfer(struct i2c_adapter *i2c_adap,
struct sprd_i2c *i2c_dev = i2c_adap->algo_data;
int im, ret;

if (i2c_dev->is_suspended)
return -EBUSY;

ret = pm_runtime_get_sync(i2c_dev->dev);
if (ret < 0)
return ret;
Expand Down Expand Up @@ -586,11 +590,23 @@ static int sprd_i2c_remove(struct platform_device *pdev)

static int __maybe_unused sprd_i2c_suspend_noirq(struct device *pdev)
{
struct sprd_i2c *i2c_dev = dev_get_drvdata(pdev);

i2c_lock_adapter(&i2c_dev->adap);
i2c_dev->is_suspended = true;
i2c_unlock_adapter(&i2c_dev->adap);

return pm_runtime_force_suspend(pdev);
}

static int __maybe_unused sprd_i2c_resume_noirq(struct device *pdev)
{
struct sprd_i2c *i2c_dev = dev_get_drvdata(pdev);

i2c_lock_adapter(&i2c_dev->adap);
i2c_dev->is_suspended = false;
i2c_unlock_adapter(&i2c_dev->adap);

return pm_runtime_force_resume(pdev);
}

Expand Down

0 comments on commit da33aa0

Please sign in to comment.