From: Hans de Goede <hdegoede@redhat.com>
To: Sakari Ailus <sakari.ailus@linux.intel.com>
Cc: Mark Gross <markgross@kernel.org>,
Andy Shevchenko <andy@kernel.org>, Pavel Machek <pavel@ucw.cz>,
Lee Jones <lee@kernel.org>,
Linus Walleij <linus.walleij@linaro.org>,
Daniel Scally <djrscally@gmail.com>,
Laurent Pinchart <laurent.pinchart@ideasonboard.com>,
Mauro Carvalho Chehab <mchehab@kernel.org>,
platform-driver-x86@vger.kernel.org, linux-leds@vger.kernel.org,
linux-gpio@vger.kernel.org, Kate Hsuan <hpa@redhat.com>,
Mark Pearson <markpearson@lenovo.com>,
Andy Yeh <andy.yeh@intel.com>, Hao Yao <hao.yao@intel.com>,
linux-media@vger.kernel.org
Subject: Re: [PATCH v5 07/11] media: v4l2-core: Make the v4l2-core code enable/disable the privacy LED if present
Date: Fri, 27 Jan 2023 11:29:57 +0100 [thread overview]
Message-ID: <cd2ca584-6914-0882-4cfc-c5edee0adf54@redhat.com> (raw)
In-Reply-To: <Y8qOYlAm4flqe1tp@paasikivi.fi.intel.com>
Hi Sakari,
On 1/20/23 13:51, Sakari Ailus wrote:
> Hi Hans,
>
> On Fri, Jan 20, 2023 at 12:45:20PM +0100, Hans de Goede wrote:
>> Make v4l2_async_register_subdev_sensor() try to get a privacy LED
>> associated with the sensor and extend the call_s_stream() wrapper to
>> enable/disable the privacy LED if found.
>>
>> This makes the core handle privacy LED control, rather then having to
>> duplicate this code in all the sensor drivers.
>>
>> Suggested-by: Sakari Ailus <sakari.ailus@linux.intel.com>
>> Acked-by: Linus Walleij <linus.walleij@linaro.org>
>> Signed-off-by: Hans de Goede <hdegoede@redhat.com>
>> ---
>> Changes in v4 (requested by Laurent Pinchart):
>> - Move the led_get() call to v4l2_async_register_subdev_sensor() and
>> make errors other then -ENOENT fail the register() call.
>> - Move the led_disable_sysfs() call to be done at led_get() time, instead
>> of only disabling the sysfs interface when the sensor is streaming.
>> ---
>> drivers/media/v4l2-core/v4l2-fwnode.c | 15 +++++++++++++++
>> drivers/media/v4l2-core/v4l2-subdev.c | 18 ++++++++++++++++++
>> include/media/v4l2-subdev.h | 3 +++
>> 3 files changed, 36 insertions(+)
>>
>> diff --git a/drivers/media/v4l2-core/v4l2-fwnode.c b/drivers/media/v4l2-core/v4l2-fwnode.c
>> index c8a2264262bc..cfac1e2ae501 100644
>> --- a/drivers/media/v4l2-core/v4l2-fwnode.c
>> +++ b/drivers/media/v4l2-core/v4l2-fwnode.c
>> @@ -16,6 +16,7 @@
>> */
>> #include <linux/acpi.h>
>> #include <linux/kernel.h>
>> +#include <linux/leds.h>
>> #include <linux/mm.h>
>> #include <linux/of.h>
>> #include <linux/property.h>
>> @@ -1295,6 +1296,20 @@ int v4l2_async_register_subdev_sensor(struct v4l2_subdev *sd)
>> if (WARN_ON(!sd->dev))
>> return -ENODEV;
>>
>> +#if IS_REACHABLE(CONFIG_LEDS_CLASS)
>> + sd->privacy_led = led_get(sd->dev, "privacy-led");
>> + if (IS_ERR(sd->privacy_led) && PTR_ERR(sd->privacy_led) != -ENOENT)
>> + return dev_err_probe(sd->dev, PTR_ERR(sd->privacy_led), "getting privacy LED\n");
>> +
>> + if (!IS_ERR_OR_NULL(sd->privacy_led)) {
>> + mutex_lock(&sd->privacy_led->led_access);
>> + led_sysfs_disable(sd->privacy_led);
>> + led_trigger_remove(sd->privacy_led);
>> + led_set_brightness(sd->privacy_led, 0);
>> + mutex_unlock(&sd->privacy_led->led_access);
>> + }
>> +#endif
>> +
>> notifier = kzalloc(sizeof(*notifier), GFP_KERNEL);
>> if (!notifier)
>> return -ENOMEM;
>> diff --git a/drivers/media/v4l2-core/v4l2-subdev.c b/drivers/media/v4l2-core/v4l2-subdev.c
>> index 4988a25bd8f4..f33e943aab3f 100644
>> --- a/drivers/media/v4l2-core/v4l2-subdev.c
>> +++ b/drivers/media/v4l2-core/v4l2-subdev.c
>> @@ -9,6 +9,7 @@
>> */
>>
>> #include <linux/ioctl.h>
>> +#include <linux/leds.h>
>> #include <linux/mm.h>
>> #include <linux/module.h>
>> #include <linux/slab.h>
>> @@ -322,6 +323,14 @@ static int call_s_stream(struct v4l2_subdev *sd, int enable)
>> {
>> int ret;
>>
>> +#if IS_REACHABLE(CONFIG_LEDS_CLASS)
>> + if (!IS_ERR_OR_NULL(sd->privacy_led)) {
>> + if (enable)
>> + led_set_brightness(sd->privacy_led, sd->privacy_led->max_brightness);
>> + else
>> + led_set_brightness(sd->privacy_led, 0);
>> + }
>> +#endif
>> ret = sd->ops->video->s_stream(sd, enable);
>>
>> if (!enable && ret < 0) {
>> @@ -1050,6 +1059,14 @@ EXPORT_SYMBOL_GPL(__v4l2_subdev_init_finalize);
>>
>> void v4l2_subdev_cleanup(struct v4l2_subdev *sd)
>
> v4l2_subdev_cleanup() is currently called by drivers using V4L2 subdev
> state at the moment, making it unsuitable for the purpose of releasing the
> privacy led.
>
> Could you move this to v4l2_async_unregister_subdev() instead?
Good point.
Looking into this also made me realize that I forgot to cleanup
the LED reference (and re-enable sysfs control) in case of
errors in v4l2_async_register_subdev_sensor() after getting it.
Fixing this requires adding a v4l2_subdev_put_privacy_led()
helper. At which point it makes sense to also put the code
to get the led in a v4l2_subdev_get_privacy_led() helper
and then all privacy-led code lives inside a v4l2-subdev.c
removing the need for:
[PATCH v5 06/11] media: v4l2-core: Built async and fwnode code into videodev.ko
all together :) So I'll drop that from v6 of this series to
make the series simpler.
Regards,
Hans
>
>> {
>> +#if IS_REACHABLE(CONFIG_LEDS_CLASS)
>> + if (!IS_ERR_OR_NULL(sd->privacy_led)) {
>> + mutex_lock(&sd->privacy_led->led_access);
>> + led_sysfs_enable(sd->privacy_led);
>> + mutex_unlock(&sd->privacy_led->led_access);
>> + led_put(sd->privacy_led);
>> + }
>> +#endif
>> __v4l2_subdev_state_free(sd->active_state);
>> sd->active_state = NULL;
>> }
>> @@ -1090,6 +1107,7 @@ void v4l2_subdev_init(struct v4l2_subdev *sd, const struct v4l2_subdev_ops *ops)
>> sd->grp_id = 0;
>> sd->dev_priv = NULL;
>> sd->host_priv = NULL;
>> + sd->privacy_led = NULL;
>> #if defined(CONFIG_MEDIA_CONTROLLER)
>> sd->entity.name = sd->name;
>> sd->entity.obj_type = MEDIA_ENTITY_TYPE_V4L2_SUBDEV;
>> diff --git a/include/media/v4l2-subdev.h b/include/media/v4l2-subdev.h
>> index b15fa9930f30..0547313f98cc 100644
>> --- a/include/media/v4l2-subdev.h
>> +++ b/include/media/v4l2-subdev.h
>> @@ -38,6 +38,7 @@ struct v4l2_subdev;
>> struct v4l2_subdev_fh;
>> struct tuner_setup;
>> struct v4l2_mbus_frame_desc;
>> +struct led_classdev;
>>
>> /**
>> * struct v4l2_decode_vbi_line - used to decode_vbi_line
>> @@ -982,6 +983,8 @@ struct v4l2_subdev {
>> * appropriate functions.
>> */
>>
>> + struct led_classdev *privacy_led;
>> +
>> /*
>> * TODO: active_state should most likely be changed from a pointer to an
>> * embedded field. For the time being it's kept as a pointer to more
>
next prev parent reply other threads:[~2023-01-27 10:30 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-01-20 11:45 [PATCH v5 00/11] leds: lookup-table support + int3472/media privacy LED support Hans de Goede
2023-01-20 11:45 ` [PATCH v5 01/11] leds: led-class: Add missing put_device() to led_put() Hans de Goede
2023-01-27 11:00 ` Lee Jones
2023-01-20 11:45 ` [PATCH v5 02/11] leds: led-class: Add led_module_get() helper Hans de Goede
2023-01-27 11:06 ` Lee Jones
2023-01-20 11:45 ` [PATCH v5 03/11] leds: led-class: Add __devm_led_get() helper Hans de Goede
2023-01-27 11:06 ` Lee Jones
2023-01-20 11:45 ` [PATCH v5 04/11] leds: led-class: Add generic [devm_]led_get() Hans de Goede
2023-01-27 11:07 ` Lee Jones
2023-01-20 11:45 ` [PATCH v5 05/11] [RFC] leds: led-class: Add devicetree support to led_get() Hans de Goede
2023-01-27 10:59 ` Lee Jones
2025-08-25 13:43 ` Aleksandrs Vinarskis
2023-01-20 11:45 ` [PATCH v5 06/11] media: v4l2-core: Built async and fwnode code into videodev.ko Hans de Goede
2023-01-20 12:47 ` Sakari Ailus
2023-01-27 10:01 ` Hans de Goede
2023-01-20 11:45 ` [PATCH v5 07/11] media: v4l2-core: Make the v4l2-core code enable/disable the privacy LED if present Hans de Goede
2023-01-20 12:51 ` Sakari Ailus
2023-01-27 10:29 ` Hans de Goede [this message]
2023-01-20 11:45 ` [PATCH v5 08/11] platform/x86: int3472/discrete: Refactor GPIO to sensor mapping Hans de Goede
2023-01-20 11:45 ` [PATCH v5 09/11] platform/x86: int3472/discrete: Create a LED class device for the privacy LED Hans de Goede
2023-01-20 11:45 ` [PATCH v5 10/11] platform/x86: int3472/discrete: Move GPIO request to skl_int3472_register_clock() Hans de Goede
2023-01-20 11:45 ` [PATCH v5 11/11] platform/x86: int3472/discrete: Get the polarity from the _DSM entry Hans de Goede
2023-01-27 11:08 ` [PATCH v5 00/11] leds: lookup-table support + int3472/media privacy LED support Lee Jones
2023-01-27 11:23 ` Hans de Goede
2023-01-27 14:58 ` Lee Jones
2023-01-27 17:14 ` [GIT PULL] Immutable branch from LEDs due for the v6.3 merge window Lee Jones
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=cd2ca584-6914-0882-4cfc-c5edee0adf54@redhat.com \
--to=hdegoede@redhat.com \
--cc=andy.yeh@intel.com \
--cc=andy@kernel.org \
--cc=djrscally@gmail.com \
--cc=hao.yao@intel.com \
--cc=hpa@redhat.com \
--cc=laurent.pinchart@ideasonboard.com \
--cc=lee@kernel.org \
--cc=linus.walleij@linaro.org \
--cc=linux-gpio@vger.kernel.org \
--cc=linux-leds@vger.kernel.org \
--cc=linux-media@vger.kernel.org \
--cc=markgross@kernel.org \
--cc=markpearson@lenovo.com \
--cc=mchehab@kernel.org \
--cc=pavel@ucw.cz \
--cc=platform-driver-x86@vger.kernel.org \
--cc=sakari.ailus@linux.intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).