diff options
Diffstat (limited to 'drivers/i2c/i2c-core-acpi.c')
| -rw-r--r-- | drivers/i2c/i2c-core-acpi.c | 19 | 
1 files changed, 15 insertions, 4 deletions
| diff --git a/drivers/i2c/i2c-core-acpi.c b/drivers/i2c/i2c-core-acpi.c index d6037a328669..14ae0cfc325e 100644 --- a/drivers/i2c/i2c-core-acpi.c +++ b/drivers/i2c/i2c-core-acpi.c @@ -445,6 +445,11 @@ static struct i2c_client *i2c_acpi_find_client_by_adev(struct acpi_device *adev)  	return i2c_find_device_by_fwnode(acpi_fwnode_handle(adev));  } +static struct i2c_adapter *i2c_acpi_find_adapter_by_adev(struct acpi_device *adev) +{ +	return i2c_find_adapter_by_fwnode(acpi_fwnode_handle(adev)); +} +  static int i2c_acpi_notify(struct notifier_block *nb, unsigned long value,  			   void *arg)  { @@ -471,11 +476,17 @@ static int i2c_acpi_notify(struct notifier_block *nb, unsigned long value,  			break;  		client = i2c_acpi_find_client_by_adev(adev); -		if (!client) -			break; +		if (client) { +			i2c_unregister_device(client); +			put_device(&client->dev); +		} + +		adapter = i2c_acpi_find_adapter_by_adev(adev); +		if (adapter) { +			acpi_unbind_one(&adapter->dev); +			put_device(&adapter->dev); +		} -		i2c_unregister_device(client); -		put_device(&client->dev);  		break;  	} | 
