mbox series

[v3,0/5] Set bus_info field in framework

Message ID 20220309163112.11708-1-sakari.ailus@linux.intel.com
Headers show
Series Set bus_info field in framework | expand

Message

Sakari Ailus March 9, 2022, 4:31 p.m. UTC
Hi folks,

This innocuous-looking patchset moves setting the bus_info fields in
struct media_device and struct v4l2_capability from drivers to the
framework for PCI and platform devices. USB and I²C devices are possible,
too, but not yet implemented. Using this is optional so that drivers which
have special requirements or archaic bugs are unaffected.

If people like this, I'll see if the same could be done to the driver
fields.

I have patches for USB, too, but those require changes in USB core
(namely exporting the relevant functions).

since v2:

- Move non-redundant documentation on media_device_init() to the header.

- Fix struct name in media_device_register() documentation (new patch).

- media_set_bus_info() sets the bus_info field unconditionally, reflect
  this in the documentation.

- Document that media_set_bus_info() isn't meant to be called from
  drivers.

since v1:

- Make media_set_bus_info() a function, pass field size as an argument.

- Drop a few bad driver changes. Remove now-redundant local variables.

- Document the functionality for media_device_init(), V4L2 side doesn't
  have a proper place for documentation and I don't think it's something
  that should go to this set.

- Remove redundant kerneldoc in mc-device.c.

- Set bus_info in querycap unconditionally, before calling driver callback
  that can override it.

Sakari Ailus (4):
  mc: Remove redundant documentation
  mc: Provide a helper for setting bus_info field
  mc: Set bus_info in media_device_init()
  v4l: ioctl: Set bus_info in v4l_querycap()

 drivers/media/common/saa7146/saa7146_video.c  |  1 -
 drivers/media/mc/mc-device.c                  | 19 ++--------
 drivers/media/pci/bt8xx/bttv-driver.c         |  2 -
 drivers/media/pci/cx18/cx18-ioctl.c           |  2 -
 drivers/media/pci/cx88/cx88-blackbird.c       |  1 -
 drivers/media/pci/cx88/cx88-video.c           |  1 -
 drivers/media/pci/dt3155/dt3155.c             |  3 --
 drivers/media/pci/intel/ipu3/ipu3-cio2-main.c |  6 ---
 drivers/media/pci/ivtv/ivtv-ioctl.c           |  1 -
 drivers/media/pci/meye/meye.c                 |  1 -
 drivers/media/pci/saa7134/saa7134-video.c     |  1 -
 drivers/media/pci/saa7164/saa7164-encoder.c   |  1 -
 drivers/media/pci/saa7164/saa7164-vbi.c       |  1 -
 .../media/pci/solo6x10/solo6x10-v4l2-enc.c    |  2 -
 drivers/media/pci/solo6x10/solo6x10-v4l2.c    |  2 -
 drivers/media/pci/sta2x11/sta2x11_vip.c       |  2 -
 drivers/media/pci/tw5864/tw5864-video.c       |  1 -
 drivers/media/pci/tw68/tw68-video.c           |  3 --
 drivers/media/pci/tw686x/tw686x-video.c       |  2 -
 .../media/platform/allegro-dvt/allegro-core.c |  5 ---
 drivers/media/platform/davinci/vpbe_display.c |  2 -
 drivers/media/platform/davinci/vpif_capture.c |  2 -
 drivers/media/platform/davinci/vpif_display.c |  2 -
 drivers/media/platform/exynos-gsc/gsc-m2m.c   |  5 ---
 drivers/media/platform/exynos4-is/common.c    |  2 -
 drivers/media/platform/exynos4-is/fimc-lite.c |  4 --
 drivers/media/platform/imx-jpeg/mxc-jpeg.c    |  4 --
 .../media/platform/marvell-ccic/cafe-driver.c |  1 -
 .../media/platform/mtk-jpeg/mtk_jpeg_core.c   |  2 -
 .../media/platform/qcom/camss/camss-video.c   |  4 --
 drivers/media/platform/rcar-vin/rcar-core.c   |  2 -
 drivers/media/platform/rcar-vin/rcar-v4l2.c   |  4 --
 drivers/media/platform/rcar_jpu.c             |  2 -
 drivers/media/platform/s5p-jpeg/jpeg-core.c   |  2 -
 drivers/media/platform/s5p-mfc/s5p_mfc_dec.c  |  2 -
 drivers/media/platform/s5p-mfc/s5p_mfc_enc.c  |  2 -
 drivers/media/platform/stm32/stm32-dcmi.c     |  2 -
 .../platform/sunxi/sun4i-csi/sun4i_csi.c      |  2 -
 .../platform/sunxi/sun4i-csi/sun4i_v4l2.c     |  4 --
 .../platform/sunxi/sun6i-csi/sun6i_csi.c      |  2 -
 drivers/media/platform/ti-vpe/cal-video.c     |  4 --
 drivers/media/platform/ti-vpe/cal.c           |  2 -
 drivers/media/platform/vsp1/vsp1_drv.c        |  2 -
 drivers/media/platform/vsp1/vsp1_histo.c      |  2 -
 drivers/media/platform/vsp1/vsp1_video.c      |  2 -
 drivers/media/radio/radio-maxiradio.c         |  2 -
 drivers/media/v4l2-core/v4l2-ioctl.c          |  4 ++
 include/media/media-device.h                  | 37 ++++++++++++++++---
 48 files changed, 39 insertions(+), 125 deletions(-)

Comments

Laurent Pinchart March 16, 2022, 9:18 a.m. UTC | #1
Hi Sakari,

Thank you for the patch.

On Wed, Mar 09, 2022 at 06:31:10PM +0200, Sakari Ailus wrote:
> The bus_info or a similar field exists in a lot of structs, yet drivers
> tend to set the value of that field by themselves in a determinable way.
> Thus provide a helper for doing this. To be used in subsequent patches.
> 
> Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
> ---
>  include/media/media-device.h | 30 +++++++++++++++++++++++++++---
>  1 file changed, 27 insertions(+), 3 deletions(-)
> 
> diff --git a/include/media/media-device.h b/include/media/media-device.h
> index bc015d2cf541..2122d15bde4e 100644
> --- a/include/media/media-device.h
> +++ b/include/media/media-device.h
> @@ -13,12 +13,13 @@
>  
>  #include <linux/list.h>
>  #include <linux/mutex.h>
> +#include <linux/pci.h>
> +#include <linux/platform_device.h>
>  
>  #include <media/media-devnode.h>
>  #include <media/media-entity.h>
>  
>  struct ida;
> -struct device;
>  struct media_device;
>  
>  /**
> @@ -181,8 +182,7 @@ struct media_device {
>  	atomic_t request_id;
>  };
>  
> -/* We don't need to include pci.h or usb.h here */
> -struct pci_dev;
> +/* We don't need to include usb.h here */
>  struct usb_device;
>  
>  #ifdef CONFIG_MEDIA_CONTROLLER
> @@ -502,4 +502,28 @@ static inline void __media_device_usb_init(struct media_device *mdev,
>  #define media_device_usb_init(mdev, udev, name) \
>  	__media_device_usb_init(mdev, udev, name, KBUILD_MODNAME)
>  
> +
> +/**
> + * media_set_bus_info() - Set bus_info field
> + *
> + * @bus_info:		Variable where to write the bus info (char array)
> + * @bus_info_size:	Length of the bus_info
> + * @dev:		Related struct device
> + *
> + * Sets bus information based on &dev. This is currently done for PCI and
> + * platform devices. dev is required to be non-NULL for this to happen.
> + *
> + * This function is not meant to be called from drivers.
> + */
> +static inline void
> +media_set_bus_info(char *bus_info, size_t bus_info_size, struct device *dev)
> +{
> +	if (!dev)
> +		strscpy(bus_info, "no bus info", bus_info_size);
> +	else if (dev_is_platform(dev))
> +		snprintf(bus_info, bus_info_size, "platform:%s", dev_name(dev));
> +	else if (dev_is_pci(dev))
> +		snprintf(bus_info, bus_info_size, "PCI:%s", dev_name(dev));
> +}

I wouldn't inline this, as it's not used in any hot path, and will
generate quite a bit of code. Apart from that,

Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>

> +
>  #endif
Laurent Pinchart March 16, 2022, 9:22 a.m. UTC | #2
Hi Sakari,

Thank you for the patch.

On Wed, Mar 09, 2022 at 06:31:11PM +0200, Sakari Ailus wrote:
> Set bus_info field based on struct device in media_device_init() and
> remove corresponding code from drivers.
> 
> Also update media_device_init() documentation: the dev field must be now
> initialised before calling it.
> 
> Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
> ---
>  drivers/media/mc/mc-device.c                       | 4 ++++
>  drivers/media/pci/intel/ipu3/ipu3-cio2-main.c      | 2 --
>  drivers/media/platform/rcar-vin/rcar-core.c        | 2 --
>  drivers/media/platform/stm32/stm32-dcmi.c          | 2 --
>  drivers/media/platform/sunxi/sun4i-csi/sun4i_csi.c | 2 --
>  drivers/media/platform/sunxi/sun6i-csi/sun6i_csi.c | 2 --
>  drivers/media/platform/ti-vpe/cal.c                | 2 --
>  drivers/media/platform/vsp1/vsp1_drv.c             | 2 --
>  include/media/media-device.h                       | 6 +++---
>  9 files changed, 7 insertions(+), 17 deletions(-)
> 
> diff --git a/drivers/media/mc/mc-device.c b/drivers/media/mc/mc-device.c
> index 094647fdb866..824d89b325a6 100644
> --- a/drivers/media/mc/mc-device.c
> +++ b/drivers/media/mc/mc-device.c
> @@ -700,6 +700,10 @@ void media_device_init(struct media_device *mdev)
>  
>  	atomic_set(&mdev->request_id, 0);
>  
> +	if (!*mdev->bus_info)

	if (!mdev->bus_info[0])

could be a bit more readable, up to you.

Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>

> +		media_set_bus_info(mdev->bus_info, sizeof(mdev->bus_info),
> +				   mdev->dev);
> +
>  	dev_dbg(mdev->dev, "Media device initialized\n");
>  }
>  EXPORT_SYMBOL_GPL(media_device_init);
> diff --git a/drivers/media/pci/intel/ipu3/ipu3-cio2-main.c b/drivers/media/pci/intel/ipu3/ipu3-cio2-main.c
> index 0e9b0503b62a..b15fac775e14 100644
> --- a/drivers/media/pci/intel/ipu3/ipu3-cio2-main.c
> +++ b/drivers/media/pci/intel/ipu3/ipu3-cio2-main.c
> @@ -1777,8 +1777,6 @@ static int cio2_pci_probe(struct pci_dev *pci_dev,
>  	cio2->media_dev.dev = dev;
>  	strscpy(cio2->media_dev.model, CIO2_DEVICE_NAME,
>  		sizeof(cio2->media_dev.model));
> -	snprintf(cio2->media_dev.bus_info, sizeof(cio2->media_dev.bus_info),
> -		 "PCI:%s", pci_name(cio2->pci_dev));
>  	cio2->media_dev.hw_revision = 0;
>  
>  	media_device_init(&cio2->media_dev);
> diff --git a/drivers/media/platform/rcar-vin/rcar-core.c b/drivers/media/platform/rcar-vin/rcar-core.c
> index 0186ae235113..1099cab7d95d 100644
> --- a/drivers/media/platform/rcar-vin/rcar-core.c
> +++ b/drivers/media/platform/rcar-vin/rcar-core.c
> @@ -94,8 +94,6 @@ static int rvin_group_init(struct rvin_group *group, struct rvin_dev *vin,
>  
>  	strscpy(mdev->driver_name, KBUILD_MODNAME, sizeof(mdev->driver_name));
>  	strscpy(mdev->model, match->compatible, sizeof(mdev->model));
> -	snprintf(mdev->bus_info, sizeof(mdev->bus_info), "platform:%s",
> -		 dev_name(mdev->dev));
>  
>  	media_device_init(mdev);
>  
> diff --git a/drivers/media/platform/stm32/stm32-dcmi.c b/drivers/media/platform/stm32/stm32-dcmi.c
> index c4c65d852525..09a743cd7004 100644
> --- a/drivers/media/platform/stm32/stm32-dcmi.c
> +++ b/drivers/media/platform/stm32/stm32-dcmi.c
> @@ -1997,8 +1997,6 @@ static int dcmi_probe(struct platform_device *pdev)
>  
>  	/* Initialize media device */
>  	strscpy(dcmi->mdev.model, DRV_NAME, sizeof(dcmi->mdev.model));
> -	snprintf(dcmi->mdev.bus_info, sizeof(dcmi->mdev.bus_info),
> -		 "platform:%s", DRV_NAME);
>  	dcmi->mdev.dev = &pdev->dev;
>  	media_device_init(&dcmi->mdev);
>  
> diff --git a/drivers/media/platform/sunxi/sun4i-csi/sun4i_csi.c b/drivers/media/platform/sunxi/sun4i-csi/sun4i_csi.c
> index 80a10f238bbe..18e6c65f4737 100644
> --- a/drivers/media/platform/sunxi/sun4i-csi/sun4i_csi.c
> +++ b/drivers/media/platform/sunxi/sun4i-csi/sun4i_csi.c
> @@ -173,8 +173,6 @@ static int sun4i_csi_probe(struct platform_device *pdev)
>  	strscpy(csi->mdev.model, "Allwinner Video Capture Device",
>  		sizeof(csi->mdev.model));
>  	csi->mdev.hw_revision = 0;
> -	snprintf(csi->mdev.bus_info, sizeof(csi->mdev.bus_info), "platform:%s",
> -		 dev_name(csi->dev));
>  	media_device_init(&csi->mdev);
>  	csi->v4l.mdev = &csi->mdev;
>  
> diff --git a/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi.c b/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi.c
> index fc96921b0583..a971587dbbd1 100644
> --- a/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi.c
> +++ b/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi.c
> @@ -733,8 +733,6 @@ static int sun6i_csi_v4l2_init(struct sun6i_csi *csi)
>  	strscpy(csi->media_dev.model, "Allwinner Video Capture Device",
>  		sizeof(csi->media_dev.model));
>  	csi->media_dev.hw_revision = 0;
> -	snprintf(csi->media_dev.bus_info, sizeof(csi->media_dev.bus_info),
> -		 "platform:%s", dev_name(csi->dev));
>  
>  	media_device_init(&csi->media_dev);
>  	v4l2_async_nf_init(&csi->notifier);
> diff --git a/drivers/media/platform/ti-vpe/cal.c b/drivers/media/platform/ti-vpe/cal.c
> index 4a4a6c5983f7..11f67abc2f38 100644
> --- a/drivers/media/platform/ti-vpe/cal.c
> +++ b/drivers/media/platform/ti-vpe/cal.c
> @@ -884,8 +884,6 @@ static int cal_media_init(struct cal_dev *cal)
>  	mdev->dev = cal->dev;
>  	mdev->hw_revision = cal->revision;
>  	strscpy(mdev->model, "CAL", sizeof(mdev->model));
> -	snprintf(mdev->bus_info, sizeof(mdev->bus_info), "platform:%s",
> -		 dev_name(mdev->dev));
>  	media_device_init(mdev);
>  
>  	/*
> diff --git a/drivers/media/platform/vsp1/vsp1_drv.c b/drivers/media/platform/vsp1/vsp1_drv.c
> index 502c7d9d6890..1f73c48eb738 100644
> --- a/drivers/media/platform/vsp1/vsp1_drv.c
> +++ b/drivers/media/platform/vsp1/vsp1_drv.c
> @@ -243,8 +243,6 @@ static int vsp1_create_entities(struct vsp1_device *vsp1)
>  	mdev->dev = vsp1->dev;
>  	mdev->hw_revision = vsp1->version;
>  	strscpy(mdev->model, vsp1->info->model, sizeof(mdev->model));
> -	snprintf(mdev->bus_info, sizeof(mdev->bus_info), "platform:%s",
> -		 dev_name(mdev->dev));
>  	media_device_init(mdev);
>  
>  	vsp1->media_ops.link_setup = vsp1_entity_link_setup;
> diff --git a/include/media/media-device.h b/include/media/media-device.h
> index 2122d15bde4e..9e71a951f412 100644
> --- a/include/media/media-device.h
> +++ b/include/media/media-device.h
> @@ -225,6 +225,9 @@ static inline __must_check int media_entity_enum_init(
>   *
>   * - dev must point to the parent device
>   * - model must be filled with the device model name
> + *
> + * The bus_info field is set by media_device_init() for PCI and platform devices
> + * if the field begins with '\0'.
>   */
>  void media_device_init(struct media_device *mdev);
>  
> @@ -249,9 +252,6 @@ void media_device_cleanup(struct media_device *mdev);
>   * The caller is responsible for initializing the &media_device structure
>   * before registration. The following fields of &media_device must be set:
>   *
> - *  - &media_device.dev must point to the parent device (usually a &pci_dev,
> - *    &usb_interface or &platform_device instance).
> - *
>   *  - &media_device.model must be filled with the device model name as a
>   *    NUL-terminated UTF-8 string. The device/model revision must not be
>   *    stored in this field.
Laurent Pinchart March 16, 2022, 9:24 a.m. UTC | #3
On Wed, Mar 16, 2022 at 11:18:13AM +0200, Laurent Pinchart wrote:
> Hi Sakari,
> 
> Thank you for the patch.
> 
> On Wed, Mar 09, 2022 at 06:31:10PM +0200, Sakari Ailus wrote:
> > The bus_info or a similar field exists in a lot of structs, yet drivers
> > tend to set the value of that field by themselves in a determinable way.
> > Thus provide a helper for doing this. To be used in subsequent patches.
> > 
> > Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
> > ---
> >  include/media/media-device.h | 30 +++++++++++++++++++++++++++---
> >  1 file changed, 27 insertions(+), 3 deletions(-)
> > 
> > diff --git a/include/media/media-device.h b/include/media/media-device.h
> > index bc015d2cf541..2122d15bde4e 100644
> > --- a/include/media/media-device.h
> > +++ b/include/media/media-device.h
> > @@ -13,12 +13,13 @@
> >  
> >  #include <linux/list.h>
> >  #include <linux/mutex.h>
> > +#include <linux/pci.h>
> > +#include <linux/platform_device.h>
> >  
> >  #include <media/media-devnode.h>
> >  #include <media/media-entity.h>
> >  
> >  struct ida;
> > -struct device;
> >  struct media_device;
> >  
> >  /**
> > @@ -181,8 +182,7 @@ struct media_device {
> >  	atomic_t request_id;
> >  };
> >  
> > -/* We don't need to include pci.h or usb.h here */
> > -struct pci_dev;
> > +/* We don't need to include usb.h here */
> >  struct usb_device;
> >  
> >  #ifdef CONFIG_MEDIA_CONTROLLER
> > @@ -502,4 +502,28 @@ static inline void __media_device_usb_init(struct media_device *mdev,
> >  #define media_device_usb_init(mdev, udev, name) \
> >  	__media_device_usb_init(mdev, udev, name, KBUILD_MODNAME)
> >  
> > +
> > +/**
> > + * media_set_bus_info() - Set bus_info field
> > + *
> > + * @bus_info:		Variable where to write the bus info (char array)
> > + * @bus_info_size:	Length of the bus_info
> > + * @dev:		Related struct device
> > + *
> > + * Sets bus information based on &dev. This is currently done for PCI and
> > + * platform devices. dev is required to be non-NULL for this to happen.
> > + *
> > + * This function is not meant to be called from drivers.
> > + */
> > +static inline void
> > +media_set_bus_info(char *bus_info, size_t bus_info_size, struct device *dev)
> > +{
> > +	if (!dev)
> > +		strscpy(bus_info, "no bus info", bus_info_size);
> > +	else if (dev_is_platform(dev))
> > +		snprintf(bus_info, bus_info_size, "platform:%s", dev_name(dev));
> > +	else if (dev_is_pci(dev))
> > +		snprintf(bus_info, bus_info_size, "PCI:%s", dev_name(dev));
> > +}
> 
> I wouldn't inline this, as it's not used in any hot path, and will
> generate quite a bit of code. Apart from that,

But the function is only called in two places, and we'd have to export
it, and handle the case where MC is disabled. Possibly not worth it,
although it would be nice to not inline it if possible. If there's a
suitable location to make that easy let's do so, otherwise you can keep
it inline.

(By the way, at some point we may want to not make MC optional)

> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> 
> > +
> >  #endif
Sakari Ailus March 16, 2022, 9:50 a.m. UTC | #4
On Wed, Mar 16, 2022 at 11:24:32AM +0200, Laurent Pinchart wrote:
> On Wed, Mar 16, 2022 at 11:18:13AM +0200, Laurent Pinchart wrote:
> > Hi Sakari,
> > 
> > Thank you for the patch.
> > 
> > On Wed, Mar 09, 2022 at 06:31:10PM +0200, Sakari Ailus wrote:
> > > The bus_info or a similar field exists in a lot of structs, yet drivers
> > > tend to set the value of that field by themselves in a determinable way.
> > > Thus provide a helper for doing this. To be used in subsequent patches.
> > > 
> > > Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
> > > ---
> > >  include/media/media-device.h | 30 +++++++++++++++++++++++++++---
> > >  1 file changed, 27 insertions(+), 3 deletions(-)
> > > 
> > > diff --git a/include/media/media-device.h b/include/media/media-device.h
> > > index bc015d2cf541..2122d15bde4e 100644
> > > --- a/include/media/media-device.h
> > > +++ b/include/media/media-device.h
> > > @@ -13,12 +13,13 @@
> > >  
> > >  #include <linux/list.h>
> > >  #include <linux/mutex.h>
> > > +#include <linux/pci.h>
> > > +#include <linux/platform_device.h>
> > >  
> > >  #include <media/media-devnode.h>
> > >  #include <media/media-entity.h>
> > >  
> > >  struct ida;
> > > -struct device;
> > >  struct media_device;
> > >  
> > >  /**
> > > @@ -181,8 +182,7 @@ struct media_device {
> > >  	atomic_t request_id;
> > >  };
> > >  
> > > -/* We don't need to include pci.h or usb.h here */
> > > -struct pci_dev;
> > > +/* We don't need to include usb.h here */
> > >  struct usb_device;
> > >  
> > >  #ifdef CONFIG_MEDIA_CONTROLLER
> > > @@ -502,4 +502,28 @@ static inline void __media_device_usb_init(struct media_device *mdev,
> > >  #define media_device_usb_init(mdev, udev, name) \
> > >  	__media_device_usb_init(mdev, udev, name, KBUILD_MODNAME)
> > >  
> > > +
> > > +/**
> > > + * media_set_bus_info() - Set bus_info field
> > > + *
> > > + * @bus_info:		Variable where to write the bus info (char array)
> > > + * @bus_info_size:	Length of the bus_info
> > > + * @dev:		Related struct device
> > > + *
> > > + * Sets bus information based on &dev. This is currently done for PCI and
> > > + * platform devices. dev is required to be non-NULL for this to happen.
> > > + *
> > > + * This function is not meant to be called from drivers.
> > > + */
> > > +static inline void
> > > +media_set_bus_info(char *bus_info, size_t bus_info_size, struct device *dev)
> > > +{
> > > +	if (!dev)
> > > +		strscpy(bus_info, "no bus info", bus_info_size);
> > > +	else if (dev_is_platform(dev))
> > > +		snprintf(bus_info, bus_info_size, "platform:%s", dev_name(dev));
> > > +	else if (dev_is_pci(dev))
> > > +		snprintf(bus_info, bus_info_size, "PCI:%s", dev_name(dev));
> > > +}
> > 
> > I wouldn't inline this, as it's not used in any hot path, and will
> > generate quite a bit of code. Apart from that,
> 
> But the function is only called in two places, and we'd have to export
> it, and handle the case where MC is disabled. Possibly not worth it,
> although it would be nice to not inline it if possible. If there's a
> suitable location to make that easy let's do so, otherwise you can keep
> it inline.

There's no such location currently. If one will be added, this should be
moved there. But it's not really worth a new kernel module at the moment.

> 
> (By the way, at some point we may want to not make MC optional)

Yes.

> 
> > Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>

Thanks!