From: Ricardo Ribalda <ribalda@chromium.org>
To: Laurent Pinchart <laurent.pinchart@ideasonboard.com>,
Mauro Carvalho Chehab <mchehab@kernel.org>,
Sakari Ailus <sakari.ailus@linux.intel.com>,
Hans de Goede <hansg@kernel.org>,
Linus Walleij <linus.walleij@linaro.org>,
Bartosz Golaszewski <brgl@bgdev.pl>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: linux-kernel@vger.kernel.org, linux-media@vger.kernel.org,
Yunke Cao <yunkec@chromium.org>,
linux-gpio@vger.kernel.org, linux-usb@vger.kernel.org,
Ricardo Ribalda <ribalda@chromium.org>,
Hans Verkuil <hverkuil@kernel.org>,
Hans de Goede <hansg@kernel.org>
Subject: [PATCH v5 4/5] media: uvcvideo: Make gpio_unit entity-less
Date: Fri, 18 Jul 2025 15:29:13 +0000 [thread overview]
Message-ID: <20250718-uvc-subdev-v5-4-a5869b071b0d@chromium.org> (raw)
In-Reply-To: <20250718-uvc-subdev-v5-0-a5869b071b0d@chromium.org>
Now that we do not need to export a control there is no need to create
an entity. Move the uvc_gpio structure to uvc_device.
Signed-off-by: Ricardo Ribalda <ribalda@chromium.org>
---
drivers/media/usb/uvc/uvc_driver.c | 7 -------
drivers/media/usb/uvc/uvc_gpio.c | 39 +++++++++++++++-----------------------
drivers/media/usb/uvc/uvc_status.c | 4 ++--
drivers/media/usb/uvc/uvcvideo.h | 2 +-
4 files changed, 18 insertions(+), 34 deletions(-)
diff --git a/drivers/media/usb/uvc/uvc_driver.c b/drivers/media/usb/uvc/uvc_driver.c
index 89a4ac8a358f508220bca43078964bc2a8a6c4a5..b79d276732bc80ef175ffdbaa73b6395585ff07b 100644
--- a/drivers/media/usb/uvc/uvc_driver.c
+++ b/drivers/media/usb/uvc/uvc_driver.c
@@ -1755,13 +1755,6 @@ static int uvc_scan_device(struct uvc_device *dev)
return -ENODEV;
}
- /* Add GPIO entity to the first chain. */
- if (dev->gpio_unit) {
- chain = list_first_entry(&dev->chains,
- struct uvc_video_chain, list);
- list_add_tail(&dev->gpio_unit->chain, &chain->entities);
- }
-
return 0;
}
diff --git a/drivers/media/usb/uvc/uvc_gpio.c b/drivers/media/usb/uvc/uvc_gpio.c
index f575b848058f48e3b73a6793e59d25a3eed1c61a..5da67c260f02dff7bbe2eb3849e8dfc939ad1d82 100644
--- a/drivers/media/usb/uvc/uvc_gpio.c
+++ b/drivers/media/usb/uvc/uvc_gpio.c
@@ -14,7 +14,7 @@
static irqreturn_t uvc_gpio_irq(int irq, void *data)
{
struct uvc_device *dev = data;
- struct uvc_gpio *uvc_gpio = &dev->gpio_unit->gpio;
+ struct uvc_gpio *uvc_gpio = &dev->gpio_unit;
int new_val;
if (!uvc_gpio->gpio_ready)
@@ -51,7 +51,6 @@ static const struct dmi_system_id privacy_valid_during_streamon[] = {
int uvc_gpio_parse(struct uvc_device *dev)
{
struct gpio_desc *gpio_privacy;
- struct uvc_entity *unit;
int irq;
gpio_privacy = devm_gpiod_get_optional(&dev->intf->dev, "privacy",
@@ -69,10 +68,6 @@ int uvc_gpio_parse(struct uvc_device *dev)
return dev_err_probe(&dev->intf->dev, irq,
"No IRQ for privacy GPIO\n");
- unit = uvc_alloc_entity(UVC_EXT_GPIO_UNIT, UVC_EXT_GPIO_UNIT_ID, 0, 1);
- if (!unit)
- return -ENOMEM;
-
/*
* Note: This quirk will not match external UVC cameras,
* as they will not have the corresponding ACPI GPIO entity.
@@ -80,38 +75,33 @@ int uvc_gpio_parse(struct uvc_device *dev)
if (dmi_check_system(privacy_valid_during_streamon))
dev->quirks |= UVC_QUIRK_PRIVACY_DURING_STREAM;
else
- unit->gpio.gpio_ready = true;
-
- unit->gpio.gpio_privacy = gpio_privacy;
- unit->gpio.irq = irq;
- strscpy(unit->name, "GPIO", sizeof(unit->name));
- list_add_tail(&unit->list, &dev->entities);
+ dev->gpio_unit.gpio_ready = true;
- dev->gpio_unit = unit;
+ dev->gpio_unit.gpio_privacy = gpio_privacy;
+ dev->gpio_unit.irq = irq;
return 0;
}
void uvc_gpio_quirk(struct uvc_device *dev, bool stream_on)
{
- if (!dev->gpio_unit || !(dev->quirks & UVC_QUIRK_PRIVACY_DURING_STREAM))
+ if (!(dev->quirks & UVC_QUIRK_PRIVACY_DURING_STREAM))
return;
- dev->gpio_unit->gpio.gpio_ready = stream_on;
+ dev->gpio_unit.gpio_ready = stream_on;
if (stream_on)
uvc_gpio_irq(0, dev);
}
int uvc_gpio_init(struct uvc_device *dev)
{
- struct uvc_entity *unit = dev->gpio_unit;
int init_val;
int ret;
- if (!unit || unit->gpio.irq < 0)
+ if (!dev->gpio_unit.gpio_privacy)
return 0;
- ret = request_threaded_irq(unit->gpio.irq, NULL, uvc_gpio_irq,
+ ret = request_threaded_irq(dev->gpio_unit.irq, NULL, uvc_gpio_irq,
IRQF_ONESHOT | IRQF_TRIGGER_FALLING |
IRQF_TRIGGER_RISING,
"uvc_privacy_gpio", dev);
@@ -122,11 +112,12 @@ int uvc_gpio_init(struct uvc_device *dev)
uvc_gpio_quirk(dev, false);
init_val = false;
} else {
- unit->gpio.gpio_ready = true;
+ dev->gpio_unit.gpio_ready = true;
- init_val = gpiod_get_value_cansleep(unit->gpio.gpio_privacy);
+ init_val =
+ gpiod_get_value_cansleep(dev->gpio_unit.gpio_privacy);
if (init_val < 0) {
- free_irq(unit->gpio.irq, dev);
+ free_irq(dev->gpio_unit.irq, dev);
return init_val;
}
}
@@ -134,15 +125,15 @@ int uvc_gpio_init(struct uvc_device *dev)
input_report_switch(dev->input, SW_CAMERA_LENS_COVER, init_val);
input_sync(dev->input);
- unit->gpio.initialized = true;
+ dev->gpio_unit.initialized = true;
return 0;
}
void uvc_gpio_deinit(struct uvc_device *dev)
{
- if (!dev->gpio_unit || !dev->gpio_unit->gpio.initialized)
+ if (!dev->gpio_unit.initialized)
return;
- free_irq(dev->gpio_unit->gpio.irq, dev);
+ free_irq(dev->gpio_unit.irq, dev);
}
diff --git a/drivers/media/usb/uvc/uvc_status.c b/drivers/media/usb/uvc/uvc_status.c
index 664ba59af8ecad5511c9dea924bf037b2aafc0d0..dbffed828761202c62c003b9200fd9916b16a969 100644
--- a/drivers/media/usb/uvc/uvc_status.c
+++ b/drivers/media/usb/uvc/uvc_status.c
@@ -44,7 +44,7 @@ static int uvc_input_init(struct uvc_device *dev)
struct input_dev *input;
int ret;
- if (!uvc_input_has_button(dev) && !dev->gpio_unit)
+ if (!uvc_input_has_button(dev) && !dev->gpio_unit.gpio_privacy)
return 0;
input = input_allocate_device();
@@ -64,7 +64,7 @@ static int uvc_input_init(struct uvc_device *dev)
__set_bit(KEY_CAMERA, input->keybit);
}
- if (dev->gpio_unit) {
+ if (dev->gpio_unit.gpio_privacy) {
__set_bit(EV_SW, input->evbit);
__set_bit(SW_CAMERA_LENS_COVER, input->swbit);
}
diff --git a/drivers/media/usb/uvc/uvcvideo.h b/drivers/media/usb/uvc/uvcvideo.h
index 827ea2eb676c81cabb8051485b6e6813e9c6dca8..c098f30b07797281576d7ff533cde25309be8b61 100644
--- a/drivers/media/usb/uvc/uvcvideo.h
+++ b/drivers/media/usb/uvc/uvcvideo.h
@@ -628,7 +628,7 @@ struct uvc_device {
const void *data;
} async_ctrl;
- struct uvc_entity *gpio_unit;
+ struct uvc_gpio gpio_unit;
};
struct uvc_fh {
--
2.50.0.727.gbf7dc18ff4-goog
next prev parent reply other threads:[~2025-07-18 15:29 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-07-18 15:29 [PATCH v5 0/5] media: uvcvideo: Implement the Privacy GPIO as a evdev Ricardo Ribalda
2025-07-18 15:29 ` [PATCH v5 1/5] media: uvcvideo: Factor out gpio functions to its own file Ricardo Ribalda
2025-07-18 15:29 ` [PATCH v5 2/5] media: uvcvideo: Re-implement privacy GPIO as an input device Ricardo Ribalda
2025-07-18 15:29 ` [PATCH v5 3/5] media: uvcvideo: Introduce UVC_QUIRK_PRIVACY_DURING_STREAM Ricardo Ribalda
2025-07-18 15:29 ` Ricardo Ribalda [this message]
2025-07-18 15:29 ` [PATCH v5 5/5] media: uvcvideo: Remove UVC_EXT_GPIO entity Ricardo Ribalda
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=20250718-uvc-subdev-v5-4-a5869b071b0d@chromium.org \
--to=ribalda@chromium.org \
--cc=brgl@bgdev.pl \
--cc=gregkh@linuxfoundation.org \
--cc=hansg@kernel.org \
--cc=hverkuil@kernel.org \
--cc=laurent.pinchart@ideasonboard.com \
--cc=linus.walleij@linaro.org \
--cc=linux-gpio@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-media@vger.kernel.org \
--cc=linux-usb@vger.kernel.org \
--cc=mchehab@kernel.org \
--cc=sakari.ailus@linux.intel.com \
--cc=yunkec@chromium.org \
/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).