|
|
@@ -118,11 +118,20 @@ void v4l2_device_unregister(struct v4l2_device *v4l2_dev)
|
|
|
if (sd->flags & V4L2_SUBDEV_FL_IS_I2C) {
|
|
|
struct i2c_client *client = v4l2_get_subdevdata(sd);
|
|
|
|
|
|
- /* We need to unregister the i2c client explicitly.
|
|
|
- We cannot rely on i2c_del_adapter to always
|
|
|
- unregister clients for us, since if the i2c bus
|
|
|
- is a platform bus, then it is never deleted. */
|
|
|
- if (client)
|
|
|
+ /*
|
|
|
+ * We need to unregister the i2c client
|
|
|
+ * explicitly. We cannot rely on
|
|
|
+ * i2c_del_adapter to always unregister
|
|
|
+ * clients for us, since if the i2c bus is a
|
|
|
+ * platform bus, then it is never deleted.
|
|
|
+ *
|
|
|
+ * Device tree or ACPI based devices must not
|
|
|
+ * be unregistered as they have not been
|
|
|
+ * registered by us, and would not be
|
|
|
+ * re-created by just probing the V4L2 driver.
|
|
|
+ */
|
|
|
+ if (client &&
|
|
|
+ !client->dev.of_node && !client->dev.fwnode)
|
|
|
i2c_unregister_device(client);
|
|
|
continue;
|
|
|
}
|
|
|
@@ -131,7 +140,7 @@ void v4l2_device_unregister(struct v4l2_device *v4l2_dev)
|
|
|
if (sd->flags & V4L2_SUBDEV_FL_IS_SPI) {
|
|
|
struct spi_device *spi = v4l2_get_subdevdata(sd);
|
|
|
|
|
|
- if (spi)
|
|
|
+ if (spi && !spi->dev.of_node && !spi->dev.fwnode)
|
|
|
spi_unregister_device(spi);
|
|
|
continue;
|
|
|
}
|