|
@@ -181,6 +181,8 @@ struct ssif_addr_info {
|
|
|
struct device *dev;
|
|
|
struct i2c_client *client;
|
|
|
|
|
|
+ struct i2c_client *added_client;
|
|
|
+
|
|
|
struct mutex clients_mutex;
|
|
|
struct list_head clients;
|
|
|
|
|
@@ -1641,15 +1643,7 @@ static int ssif_probe(struct i2c_client *client, const struct i2c_device_id *id)
|
|
|
|
|
|
out:
|
|
|
if (rv) {
|
|
|
- /*
|
|
|
- * Note that if addr_info->client is assigned, we
|
|
|
- * leave it. The i2c client hangs around even if we
|
|
|
- * return a failure here, and the failure here is not
|
|
|
- * propagated back to the i2c code. This seems to be
|
|
|
- * design intent, strange as it may be. But if we
|
|
|
- * don't leave it, ssif_platform_remove will not remove
|
|
|
- * the client like it should.
|
|
|
- */
|
|
|
+ addr_info->client = NULL;
|
|
|
dev_err(&client->dev, "Unable to start IPMI SSIF: %d\n", rv);
|
|
|
kfree(ssif_info);
|
|
|
}
|
|
@@ -1669,7 +1663,8 @@ static int ssif_adapter_handler(struct device *adev, void *opaque)
|
|
|
if (adev->type != &i2c_adapter_type)
|
|
|
return 0;
|
|
|
|
|
|
- i2c_new_device(to_i2c_adapter(adev), &addr_info->binfo);
|
|
|
+ addr_info->added_client = i2c_new_device(to_i2c_adapter(adev),
|
|
|
+ &addr_info->binfo);
|
|
|
|
|
|
if (!addr_info->adapter_name)
|
|
|
return 1; /* Only try the first I2C adapter by default. */
|
|
@@ -1842,7 +1837,7 @@ static int ssif_platform_remove(struct platform_device *dev)
|
|
|
return 0;
|
|
|
|
|
|
mutex_lock(&ssif_infos_mutex);
|
|
|
- i2c_unregister_device(addr_info->client);
|
|
|
+ i2c_unregister_device(addr_info->added_client);
|
|
|
|
|
|
list_del(&addr_info->link);
|
|
|
kfree(addr_info);
|