Commit 5fd934d7 authored by Ezequiel Garcia's avatar Ezequiel Garcia Committed by Mauro Carvalho Chehab

media: renesas-ceu: Use v4l2_async_notifier_add_*_subdev

The use of v4l2_async_notifier_add_subdev will be discouraged.
Drivers are instead encouraged to use a helper such as
v4l2_async_notifier_add_i2c_subdev.

This fixes a misuse of the API, as v4l2_async_notifier_add_subdev
should get a kmalloc'ed struct v4l2_async_subdev,
removing some boilerplate code while at it.

Use the appropriate helper: v4l2_async_notifier_add_i2c_subdev
or v4l2_async_notifier_add_fwnode_remote_subdev, which handles
the needed setup, instead of open-coding it.

Using v4l2-async to allocate the driver-specific structs,
requires to change struct ceu_subdev so the embedded
struct v4l2_async_subdev is now the first element.
Signed-off-by: default avatarEzequiel Garcia <ezequiel@collabora.com>
Reviewed-by: default avatarJacopo Mondi <jacopo+renesas@jmondi.org>
Reviewed-by: default avatarHelen Koike <helen.koike@collabora.com>
Signed-off-by: default avatarSakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+huawei@kernel.org>
parent 50fe0de0
...@@ -152,8 +152,8 @@ static inline struct ceu_buffer *vb2_to_ceu(struct vb2_v4l2_buffer *vbuf) ...@@ -152,8 +152,8 @@ static inline struct ceu_buffer *vb2_to_ceu(struct vb2_v4l2_buffer *vbuf)
* ceu_subdev - Wraps v4l2 sub-device and provides async subdevice. * ceu_subdev - Wraps v4l2 sub-device and provides async subdevice.
*/ */
struct ceu_subdev { struct ceu_subdev {
struct v4l2_subdev *v4l2_sd;
struct v4l2_async_subdev asd; struct v4l2_async_subdev asd;
struct v4l2_subdev *v4l2_sd;
/* per-subdevice mbus configuration options */ /* per-subdevice mbus configuration options */
unsigned int mbus_flags; unsigned int mbus_flags;
...@@ -174,7 +174,7 @@ struct ceu_device { ...@@ -174,7 +174,7 @@ struct ceu_device {
struct v4l2_device v4l2_dev; struct v4l2_device v4l2_dev;
/* subdevices descriptors */ /* subdevices descriptors */
struct ceu_subdev *subdevs; struct ceu_subdev **subdevs;
/* the subdevice currently in use */ /* the subdevice currently in use */
struct ceu_subdev *sd; struct ceu_subdev *sd;
unsigned int sd_index; unsigned int sd_index;
...@@ -1195,7 +1195,7 @@ static int ceu_enum_input(struct file *file, void *priv, ...@@ -1195,7 +1195,7 @@ static int ceu_enum_input(struct file *file, void *priv,
if (inp->index >= ceudev->num_sd) if (inp->index >= ceudev->num_sd)
return -EINVAL; return -EINVAL;
ceusd = &ceudev->subdevs[inp->index]; ceusd = ceudev->subdevs[inp->index];
inp->type = V4L2_INPUT_TYPE_CAMERA; inp->type = V4L2_INPUT_TYPE_CAMERA;
inp->std = 0; inp->std = 0;
...@@ -1230,7 +1230,7 @@ static int ceu_s_input(struct file *file, void *priv, unsigned int i) ...@@ -1230,7 +1230,7 @@ static int ceu_s_input(struct file *file, void *priv, unsigned int i)
return 0; return 0;
ceu_sd_old = ceudev->sd; ceu_sd_old = ceudev->sd;
ceudev->sd = &ceudev->subdevs[i]; ceudev->sd = ceudev->subdevs[i];
/* /*
* Make sure we can generate output image formats and apply * Make sure we can generate output image formats and apply
...@@ -1423,7 +1423,7 @@ static int ceu_notify_complete(struct v4l2_async_notifier *notifier) ...@@ -1423,7 +1423,7 @@ static int ceu_notify_complete(struct v4l2_async_notifier *notifier)
* ceu formats. * ceu formats.
*/ */
if (!ceudev->sd) { if (!ceudev->sd) {
ceudev->sd = &ceudev->subdevs[0]; ceudev->sd = ceudev->subdevs[0];
ceudev->sd_index = 0; ceudev->sd_index = 0;
} }
...@@ -1467,8 +1467,8 @@ static const struct v4l2_async_notifier_operations ceu_notify_ops = { ...@@ -1467,8 +1467,8 @@ static const struct v4l2_async_notifier_operations ceu_notify_ops = {
/* /*
* ceu_init_async_subdevs() - Initialize CEU subdevices and async_subdevs in * ceu_init_async_subdevs() - Initialize CEU subdevices and async_subdevs in
* ceu device. Both DT and platform data parsing use * ceu device. Both DT and platform data parsing use
* this routine. * this routine.
* *
* Returns 0 for success, -ENOMEM for failure. * Returns 0 for success, -ENOMEM for failure.
*/ */
...@@ -1495,6 +1495,7 @@ static int ceu_parse_platform_data(struct ceu_device *ceudev, ...@@ -1495,6 +1495,7 @@ static int ceu_parse_platform_data(struct ceu_device *ceudev,
const struct ceu_platform_data *pdata) const struct ceu_platform_data *pdata)
{ {
const struct ceu_async_subdev *async_sd; const struct ceu_async_subdev *async_sd;
struct v4l2_async_subdev *asd;
struct ceu_subdev *ceu_sd; struct ceu_subdev *ceu_sd;
unsigned int i; unsigned int i;
int ret; int ret;
...@@ -1510,21 +1511,17 @@ static int ceu_parse_platform_data(struct ceu_device *ceudev, ...@@ -1510,21 +1511,17 @@ static int ceu_parse_platform_data(struct ceu_device *ceudev,
/* Setup the ceu subdevice and the async subdevice. */ /* Setup the ceu subdevice and the async subdevice. */
async_sd = &pdata->subdevs[i]; async_sd = &pdata->subdevs[i];
ceu_sd = &ceudev->subdevs[i]; asd = v4l2_async_notifier_add_i2c_subdev(&ceudev->notifier,
async_sd->i2c_adapter_id,
INIT_LIST_HEAD(&ceu_sd->asd.list); async_sd->i2c_address,
sizeof(*ceu_sd));
ceu_sd->mbus_flags = async_sd->flags; if (IS_ERR(asd)) {
ceu_sd->asd.match_type = V4L2_ASYNC_MATCH_I2C;
ceu_sd->asd.match.i2c.adapter_id = async_sd->i2c_adapter_id;
ceu_sd->asd.match.i2c.address = async_sd->i2c_address;
ret = v4l2_async_notifier_add_subdev(&ceudev->notifier,
&ceu_sd->asd);
if (ret) {
v4l2_async_notifier_cleanup(&ceudev->notifier); v4l2_async_notifier_cleanup(&ceudev->notifier);
return ret; return PTR_ERR(asd);
} }
ceu_sd = to_ceu_subdev(asd);
ceu_sd->mbus_flags = async_sd->flags;
ceudev->subdevs[i] = ceu_sd;
} }
return pdata->num_subdevs; return pdata->num_subdevs;
...@@ -1536,7 +1533,8 @@ static int ceu_parse_platform_data(struct ceu_device *ceudev, ...@@ -1536,7 +1533,8 @@ static int ceu_parse_platform_data(struct ceu_device *ceudev,
static int ceu_parse_dt(struct ceu_device *ceudev) static int ceu_parse_dt(struct ceu_device *ceudev)
{ {
struct device_node *of = ceudev->dev->of_node; struct device_node *of = ceudev->dev->of_node;
struct device_node *ep, *remote; struct device_node *ep;
struct v4l2_async_subdev *asd;
struct ceu_subdev *ceu_sd; struct ceu_subdev *ceu_sd;
unsigned int i; unsigned int i;
int num_ep; int num_ep;
...@@ -1578,20 +1576,16 @@ static int ceu_parse_dt(struct ceu_device *ceudev) ...@@ -1578,20 +1576,16 @@ static int ceu_parse_dt(struct ceu_device *ceudev)
} }
/* Setup the ceu subdevice and the async subdevice. */ /* Setup the ceu subdevice and the async subdevice. */
ceu_sd = &ceudev->subdevs[i]; asd = v4l2_async_notifier_add_fwnode_remote_subdev(
INIT_LIST_HEAD(&ceu_sd->asd.list); &ceudev->notifier, of_fwnode_handle(ep),
sizeof(*ceu_sd));
remote = of_graph_get_remote_port_parent(ep); if (IS_ERR(asd)) {
ceu_sd->mbus_flags = fw_ep.bus.parallel.flags; ret = PTR_ERR(asd);
ceu_sd->asd.match_type = V4L2_ASYNC_MATCH_FWNODE;
ceu_sd->asd.match.fwnode = of_fwnode_handle(remote);
ret = v4l2_async_notifier_add_subdev(&ceudev->notifier,
&ceu_sd->asd);
if (ret) {
of_node_put(remote);
goto error_cleanup; goto error_cleanup;
} }
ceu_sd = to_ceu_subdev(asd);
ceu_sd->mbus_flags = fw_ep.bus.parallel.flags;
ceudev->subdevs[i] = ceu_sd;
of_node_put(ep); of_node_put(ep);
} }
......
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