diff --git a/drivers/i2c/busses/i2c-imx.c b/drivers/i2c/busses/i2c-imx.c index 9ed5965536ea..cda7662e35bd 100644 --- a/drivers/i2c/busses/i2c-imx.c +++ b/drivers/i2c/busses/i2c-imx.c @@ -832,14 +832,12 @@ static void i2c_imx_slave_init(struct imx_i2c_struct *i2c_imx) static int i2c_imx_reg_slave(struct i2c_client *client) { struct imx_i2c_struct *i2c_imx = i2c_get_adapdata(client->adapter); + unsigned long flags; int ret; if (i2c_imx->slave) return -EBUSY; - i2c_imx->slave = client; - i2c_imx->last_slave_event = I2C_SLAVE_STOP; - /* Resume */ ret = pm_runtime_resume_and_get(i2c_imx->adapter.dev.parent); if (ret < 0) { @@ -847,6 +845,11 @@ static int i2c_imx_reg_slave(struct i2c_client *client) return ret; } + spin_lock_irqsave(&i2c_imx->slave_lock, flags); + i2c_imx->slave = client; + i2c_imx->last_slave_event = I2C_SLAVE_STOP; + spin_unlock_irqrestore(&i2c_imx->slave_lock, flags); + i2c_imx_slave_init(i2c_imx); return 0;