| From 1cc9056759e1f500de5e401afd4b0acff90cc653 Mon Sep 17 00:00:00 2001 |
| From: Jacopo Mondi <jacopo@jmondi.org> |
| Date: Sat, 9 May 2020 11:04:49 +0200 |
| Subject: [PATCH] media: v4l2-fwnode: Add helper to parse device |
| properties |
| |
| Add an helper function to parse common device properties in the same |
| way as v4l2_fwnode_endpoint_parse() parses common endpoint properties. |
| |
| Parse the 'rotation' and 'orientation' properties from the firmware |
| interface. |
| |
| Signed-off-by: Jacopo Mondi <jacopo@jmondi.org> |
| Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl> |
| Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org> |
| |
| Commit 344897ef1d9b33e246b64e255d807ca6c053f349 upstream |
| |
| Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> |
| --- |
| drivers/media/v4l2-core/v4l2-fwnode.c | 42 ++++++++++++++++++++++++ |
| include/media/v4l2-fwnode.h | 47 +++++++++++++++++++++++++++ |
| 2 files changed, 89 insertions(+) |
| |
| --- a/drivers/media/v4l2-core/v4l2-fwnode.c |
| +++ b/drivers/media/v4l2-core/v4l2-fwnode.c |
| @@ -599,6 +599,48 @@ void v4l2_fwnode_put_link(struct v4l2_fw |
| } |
| EXPORT_SYMBOL_GPL(v4l2_fwnode_put_link); |
| |
| +int v4l2_fwnode_device_parse(struct device *dev, |
| + struct v4l2_fwnode_device_properties *props) |
| +{ |
| + struct fwnode_handle *fwnode = dev_fwnode(dev); |
| + u32 val; |
| + int ret; |
| + |
| + memset(props, 0, sizeof(*props)); |
| + |
| + props->orientation = V4L2_FWNODE_PROPERTY_UNSET; |
| + ret = fwnode_property_read_u32(fwnode, "orientation", &val); |
| + if (!ret) { |
| + switch (val) { |
| + case V4L2_FWNODE_ORIENTATION_FRONT: |
| + case V4L2_FWNODE_ORIENTATION_BACK: |
| + case V4L2_FWNODE_ORIENTATION_EXTERNAL: |
| + break; |
| + default: |
| + dev_warn(dev, "Unsupported device orientation: %u\n", val); |
| + return -EINVAL; |
| + } |
| + |
| + props->orientation = val; |
| + dev_dbg(dev, "device orientation: %u\n", val); |
| + } |
| + |
| + props->rotation = V4L2_FWNODE_PROPERTY_UNSET; |
| + ret = fwnode_property_read_u32(fwnode, "rotation", &val); |
| + if (!ret) { |
| + if (val >= 360) { |
| + dev_warn(dev, "Unsupported device rotation: %u\n", val); |
| + return -EINVAL; |
| + } |
| + |
| + props->rotation = val; |
| + dev_dbg(dev, "device rotation: %u\n", val); |
| + } |
| + |
| + return 0; |
| +} |
| +EXPORT_SYMBOL_GPL(v4l2_fwnode_device_parse); |
| + |
| static int |
| v4l2_async_notifier_fwnode_parse_endpoint(struct device *dev, |
| struct v4l2_async_notifier *notifier, |
| --- a/include/media/v4l2-fwnode.h |
| +++ b/include/media/v4l2-fwnode.h |
| @@ -110,6 +110,36 @@ struct v4l2_fwnode_endpoint { |
| }; |
| |
| /** |
| + * V4L2_FWNODE_PROPERTY_UNSET - identify a non initialized property |
| + * |
| + * All properties in &struct v4l2_fwnode_device_properties are initialized |
| + * to this value. |
| + */ |
| +#define V4L2_FWNODE_PROPERTY_UNSET (-1U) |
| + |
| +/** |
| + * enum v4l2_fwnode_orientation - possible device orientation |
| + * @V4L2_FWNODE_ORIENTATION_FRONT: device installed on the front side |
| + * @V4L2_FWNODE_ORIENTATION_BACK: device installed on the back side |
| + * @V4L2_FWNODE_ORIENTATION_EXTERNAL: device externally located |
| + */ |
| +enum v4l2_fwnode_orientation { |
| + V4L2_FWNODE_ORIENTATION_FRONT, |
| + V4L2_FWNODE_ORIENTATION_BACK, |
| + V4L2_FWNODE_ORIENTATION_EXTERNAL |
| +}; |
| + |
| +/** |
| + * struct v4l2_fwnode_device_properties - fwnode device properties |
| + * @orientation: device orientation. See &enum v4l2_fwnode_orientation |
| + * @rotation: device rotation |
| + */ |
| +struct v4l2_fwnode_device_properties { |
| + enum v4l2_fwnode_orientation orientation; |
| + unsigned int rotation; |
| +}; |
| + |
| +/** |
| * struct v4l2_fwnode_link - a link between two endpoints |
| * @local_node: pointer to device_node of this endpoint |
| * @local_port: identifier of the port this endpoint belongs to |
| @@ -234,6 +264,23 @@ int v4l2_fwnode_parse_link(struct fwnode |
| void v4l2_fwnode_put_link(struct v4l2_fwnode_link *link); |
| |
| /** |
| + * v4l2_fwnode_device_parse() - parse fwnode device properties |
| + * @dev: pointer to &struct device |
| + * @props: pointer to &struct v4l2_fwnode_device_properties where to store the |
| + * parsed properties values |
| + * |
| + * This function parses and validates the V4L2 fwnode device properties from the |
| + * firmware interface, and fills the @struct v4l2_fwnode_device_properties |
| + * provided by the caller. |
| + * |
| + * Return: |
| + * % 0 on success |
| + * %-EINVAL if a parsed property value is not valid |
| + */ |
| +int v4l2_fwnode_device_parse(struct device *dev, |
| + struct v4l2_fwnode_device_properties *props); |
| + |
| +/** |
| * typedef parse_endpoint_func - Driver's callback function to be called on |
| * each V4L2 fwnode endpoint. |
| * |