Merge tag 'pinctrl-v5.1-1' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw...
[sfrench/cifs-2.6.git] / drivers / i2c / i2c-core-base.c
index 28460f6a60cc15220c9a8748b3bd688e81244c37..cb6c5cb0df0b3d5438521127110940b8f4cc56f8 100644 (file)
@@ -430,7 +430,7 @@ static int i2c_device_remove(struct device *dev)
        dev_pm_clear_wake_irq(&client->dev);
        device_init_wakeup(&client->dev, false);
 
-       client->irq = 0;
+       client->irq = client->init_irq;
 
        return status;
 }
@@ -741,10 +741,11 @@ i2c_new_device(struct i2c_adapter *adap, struct i2c_board_info const *info)
        client->flags = info->flags;
        client->addr = info->addr;
 
-       client->irq = info->irq;
-       if (!client->irq)
-               client->irq = i2c_dev_irq_from_resources(info->resources,
+       client->init_irq = info->irq;
+       if (!client->init_irq)
+               client->init_irq = i2c_dev_irq_from_resources(info->resources,
                                                         info->num_resources);
+       client->irq = client->init_irq;
 
        strlcpy(client->name, info->type, sizeof(client->name));
 
@@ -1232,6 +1233,7 @@ static int i2c_register_adapter(struct i2c_adapter *adap)
        if (!adap->lock_ops)
                adap->lock_ops = &i2c_adapter_lock_ops;
 
+       adap->locked_flags = 0;
        rt_mutex_init(&adap->bus_lock);
        rt_mutex_init(&adap->mux_lock);
        mutex_init(&adap->userspace_clients_lock);
@@ -1865,6 +1867,8 @@ int __i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
 
        if (WARN_ON(!msgs || num < 1))
                return -EINVAL;
+       if (WARN_ON(test_bit(I2C_ALF_IS_SUSPENDED, &adap->locked_flags)))
+               return -ESHUTDOWN;
 
        if (adap->quirks && i2c_check_for_quirks(adap, msgs, num))
                return -EOPNOTSUPP;