Commit 0d51ebd3 authored by Tommi Franttila's avatar Tommi Franttila Committed by Mauro Carvalho Chehab

[media] v4l2-device: Don't unregister ACPI/Device Tree based devices

When a V4L2 sub-device backed by a DT or ACPI based device was removed,
the device was unregistered as well which certainly was not intentional,
as the client device would not be re-created by simply reinstating the
V4L2 sub-device (indeed the device would have to be there first!).

Skip unregistering the device in case it has non-NULL of_node or fwnode.
Signed-off-by: default avatarTommi Franttila <tommi.franttila@intel.com>
Signed-off-by: default avatarSakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: default avatarHans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@osg.samsung.com>
parent 16dfe72f
...@@ -118,11 +118,20 @@ void v4l2_device_unregister(struct v4l2_device *v4l2_dev) ...@@ -118,11 +118,20 @@ void v4l2_device_unregister(struct v4l2_device *v4l2_dev)
if (sd->flags & V4L2_SUBDEV_FL_IS_I2C) { if (sd->flags & V4L2_SUBDEV_FL_IS_I2C) {
struct i2c_client *client = v4l2_get_subdevdata(sd); 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 * We need to unregister the i2c client
unregister clients for us, since if the i2c bus * explicitly. We cannot rely on
is a platform bus, then it is never deleted. */ * i2c_del_adapter to always unregister
if (client) * 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); i2c_unregister_device(client);
continue; continue;
} }
...@@ -131,7 +140,7 @@ void v4l2_device_unregister(struct v4l2_device *v4l2_dev) ...@@ -131,7 +140,7 @@ void v4l2_device_unregister(struct v4l2_device *v4l2_dev)
if (sd->flags & V4L2_SUBDEV_FL_IS_SPI) { if (sd->flags & V4L2_SUBDEV_FL_IS_SPI) {
struct spi_device *spi = v4l2_get_subdevdata(sd); struct spi_device *spi = v4l2_get_subdevdata(sd);
if (spi) if (spi && !spi->dev.of_node && !spi->dev.fwnode)
spi_unregister_device(spi); spi_unregister_device(spi);
continue; continue;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment