From nobody Sun Feb 8 08:19:34 2026 Received: from mail-vs1-f45.google.com (mail-vs1-f45.google.com [209.85.217.45]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 05B5C1B85D7 for ; Mon, 25 Nov 2024 19:49:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.217.45 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1732564154; cv=none; b=I6mIjAwOUTwuNRdG6b+ZyVtEvcdtwhcZ0bZ7b9o8BV9Ujrn/kLxd1J23O1cyBWobLDxVlNiTe9lGmBOVy6Dkc5WI2pdd+v6hZnwtWBw48QHnUTzNFdbX84AIttIxElTdVokiordSMB+P8tbgLzPypgSZwjjJ0yWZ5mmgLS7MLJY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1732564154; c=relaxed/simple; bh=lLyFcTzGusxxZ21/v0MWLEmZZoMBS5DH1ioIK8mdVvc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=UXv277BFaQ2QWGzlAklPU4w1O4jOOTEekGx09Mhp01FdidvSJ2vhbi30e+EZshNfaS0mLKSWP84QylriI+OTrG0yD+vRWzqZ8/AAf62vg+xfsed/Nke5PGozJolepPuFRgtQbAdNSd9+f92j98EwXTMYa7xHBtC4AC63bhaVemk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=pass smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=JHBY6daE; arc=none smtp.client-ip=209.85.217.45 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="JHBY6daE" Received: by mail-vs1-f45.google.com with SMTP id ada2fe7eead31-4af3719294eso27765137.0 for ; Mon, 25 Nov 2024 11:49:12 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1732564152; x=1733168952; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=py4Kjpl4jbTKIyOvWht4p3oY/tRKB4Qm/pLkP0cvLL0=; b=JHBY6daETy8Q7UiGJRsUAQTh8Tl99slpPu8pN95/j+DeXW8sDR83aB1LSnW1l0a6b+ 1NoZ8PAP0zY0gJIiNLWZDHg3nBnnoL3OsPQeXnip77/sHNDjPMsDOzQBIX/Y7Ne90Q5l zblRRpRKzihiNSiz9hxIP0SHJIkCDd9VMMtNk= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1732564152; x=1733168952; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=py4Kjpl4jbTKIyOvWht4p3oY/tRKB4Qm/pLkP0cvLL0=; b=XvOUx4R5jBu5v8JvQb41b5h6aQiou2TX+n63jgWN7UR+MDvEagPMg9j9EO9QOFwb+o M8TH3VgfFshKbaJyHVhidebLOAq6afWjrifFvi4814IVLFvYmm7NxNGo0rcRgaW8Ltmn FTNtLK9aCjj8ahSc6bUHCFUSdCTatBGTvhulGyskfmWXvs8kUx7GJUyF+Rvqe6tnOHvQ e6uWlsK6RTlzja/Z7GYVBWXyypCRwZiQI2qh6HGDOzT7MAqT4vVFSiYhvJqXuW+UGM8D 3EZnMzdoylAE3ZNi6WP/eRB2rsg0pbAgtD8QaeASkdrVW+EnhMuUJD3tvCM6VlMewG9A st1Q== X-Gm-Message-State: AOJu0YwbdiZsaxZS7JKP6ATgCrDzSl3xPdAM8YwG4WhYtxz2gq03eLZy bbomo2i06SEUy7XD9Qu4XnJyVTW3KwBitB4l52Al74+boZWlmVJkIIoMwoQYtw== X-Gm-Gg: ASbGncuVRCS66FpnLWGI16dL/ckgJ20kXXeTKiHrR1enK19wmJgZJJdBjewjMniqv1v kwY2N6KJHU4mi9TttljXKwWIw1Mz0txcGX8a8w6bZ2Pe8cfvscy/LLIxJeXqcbEAmfo2aYI7Tvz FlLrh3Zl7f9jzMRZ1+m3hcMHWng7rxz6ezY4DxD4yjT5n7JmvPTBDrBE1b0AIm+tjFu2nM3Plab hIlzSTjs/PjTgkmOTikOVCI/JfVDPDUwO7w8naMdlLGApYm3KMQ7DUfNna77CZE13twDR4tNQt0 u4VS2hPtosAccP0gyyUONJaZ X-Google-Smtp-Source: AGHT+IHfh1sCJDgpwH9FQG7v6MoIzU1s9FsJav5t2RwVsg04Z8JYUaPat8uKJz8SaNOSIJeURGbBwA== X-Received: by 2002:a05:6102:5093:b0:4af:15db:6cf2 with SMTP id ada2fe7eead31-4af15db6f6bmr6232541137.22.1732564151982; Mon, 25 Nov 2024 11:49:11 -0800 (PST) Received: from denia.c.googlers.com (5.236.236.35.bc.googleusercontent.com. [35.236.236.5]) by smtp.gmail.com with ESMTPSA id ada2fe7eead31-4af358d2f9asm75324137.23.2024.11.25.11.49.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 25 Nov 2024 11:49:11 -0800 (PST) From: Ricardo Ribalda Date: Mon, 25 Nov 2024 19:49:06 +0000 Subject: [PATCH v4 1/7] media: uvcvideo: Fix crash during unbind if gpio unit is in use Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20241125-uvc-subdev-v4-1-51e040599f1a@chromium.org> References: <20241125-uvc-subdev-v4-0-51e040599f1a@chromium.org> In-Reply-To: <20241125-uvc-subdev-v4-0-51e040599f1a@chromium.org> To: Laurent Pinchart , Mauro Carvalho Chehab , Sakari Ailus Cc: linux-kernel@vger.kernel.org, linux-media@vger.kernel.org, Yunke Cao , Hans Verkuil , Hans de Goede , Ricardo Ribalda , stable@vger.kernel.org X-Mailer: b4 0.13.0 We used the wrong device for the device managed functions. We used the usb device, when we should be using the interface device. If we unbind the driver from the usb interface, the cleanup functions are never called. In our case, the IRQ is never disabled. If an IRQ is triggered, it will try to access memory sections that are already free, causing an OOPS. We cannot use the function devm_request_threaded_irq here. The devm_* clean functions may be called after the main structure is released by uvc_delete. Luckily this bug has small impact, as it is only affected by devices with gpio units and the user has to unbind the device, a disconnect will not trigger this error. Cc: stable@vger.kernel.org Fixes: 2886477ff987 ("media: uvcvideo: Implement UVC_EXT_GPIO_UNIT") Reviewed-by: Laurent Pinchart Signed-off-by: Ricardo Ribalda --- drivers/media/usb/uvc/uvc_driver.c | 28 +++++++++++++++++++++------- drivers/media/usb/uvc/uvcvideo.h | 1 + 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/drivers/media/usb/uvc/uvc_driver.c b/drivers/media/usb/uvc/uvc= _driver.c index faf5386cb061..6d34c910a659 100644 --- a/drivers/media/usb/uvc/uvc_driver.c +++ b/drivers/media/usb/uvc/uvc_driver.c @@ -1295,14 +1295,14 @@ static int uvc_gpio_parse(struct uvc_device *dev) struct gpio_desc *gpio_privacy; int irq; =20 - gpio_privacy =3D devm_gpiod_get_optional(&dev->udev->dev, "privacy", + gpio_privacy =3D devm_gpiod_get_optional(&dev->intf->dev, "privacy", GPIOD_IN); if (IS_ERR_OR_NULL(gpio_privacy)) return PTR_ERR_OR_ZERO(gpio_privacy); =20 irq =3D gpiod_to_irq(gpio_privacy); if (irq < 0) - return dev_err_probe(&dev->udev->dev, irq, + return dev_err_probe(&dev->intf->dev, irq, "No IRQ for privacy GPIO\n"); =20 unit =3D uvc_alloc_new_entity(dev, UVC_EXT_GPIO_UNIT, @@ -1329,15 +1329,27 @@ static int uvc_gpio_parse(struct uvc_device *dev) static int uvc_gpio_init_irq(struct uvc_device *dev) { struct uvc_entity *unit =3D dev->gpio_unit; + int ret; =20 if (!unit || unit->gpio.irq < 0) return 0; =20 - return devm_request_threaded_irq(&dev->udev->dev, unit->gpio.irq, NULL, - uvc_gpio_irq, - IRQF_ONESHOT | IRQF_TRIGGER_FALLING | - IRQF_TRIGGER_RISING, - "uvc_privacy_gpio", dev); + ret =3D request_threaded_irq(unit->gpio.irq, NULL, uvc_gpio_irq, + IRQF_ONESHOT | IRQF_TRIGGER_FALLING | + IRQF_TRIGGER_RISING, + "uvc_privacy_gpio", dev); + + unit->gpio.initialized =3D !ret; + + return ret; +} + +static void uvc_gpio_deinit(struct uvc_device *dev) +{ + if (!dev->gpio_unit || !dev->gpio_unit->gpio.initialized) + return; + + free_irq(dev->gpio_unit->gpio.irq, dev); } =20 /* ------------------------------------------------------------------------ @@ -1934,6 +1946,8 @@ static void uvc_unregister_video(struct uvc_device *d= ev) { struct uvc_streaming *stream; =20 + uvc_gpio_deinit(dev); + list_for_each_entry(stream, &dev->streams, list) { /* Nothing to do here, continue. */ if (!video_is_registered(&stream->vdev)) diff --git a/drivers/media/usb/uvc/uvcvideo.h b/drivers/media/usb/uvc/uvcvi= deo.h index 07f9921d83f2..965a789ed03e 100644 --- a/drivers/media/usb/uvc/uvcvideo.h +++ b/drivers/media/usb/uvc/uvcvideo.h @@ -234,6 +234,7 @@ struct uvc_entity { u8 *bmControls; struct gpio_desc *gpio_privacy; int irq; + bool initialized; } gpio; }; =20 --=20 2.47.0.338.g60cca15819-goog From nobody Sun Feb 8 08:19:34 2026 Received: from mail-ua1-f47.google.com (mail-ua1-f47.google.com [209.85.222.47]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6C766161328 for ; Mon, 25 Nov 2024 19:49:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.222.47 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1732564157; cv=none; b=SeoMWKn1l/KtxdnVg/EXVTcXaKrGTHPgTbA6FxjkdHp6Uil8uBtYEy36UfDvWOMo9822S/YPxyVQxfCm5vzsp94Zzvh35Gr/DCu1p/f7PkytuBtwE/BIsWd18xPf9Pl/Wd0mWie1KAabO0m/wzWo5IwAWmm8JqInOcSWpwmsHZw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1732564157; c=relaxed/simple; bh=rkxPaYdXHGqxfJOHO5r158lYWCRJX4SpWGFNVeI33Tg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=eDw/7xFLsYrt7zhDVMKE/OjUXmMRDLEDHqXcQ2Qclpl8yuuKbIlbYhsnfA/t/kb1f/L2GRAVgFj+dFVldjy/cO1QLeJrQDgY37GCavvoZXBfro4qclSIkaVU5XhJfCmm1bFwQpGzvQPb3lrgEu4L6s/VF78jvQN/ZNr8KfZaWww= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=pass smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=LqM8uqFB; arc=none smtp.client-ip=209.85.222.47 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="LqM8uqFB" Received: by mail-ua1-f47.google.com with SMTP id a1e0cc1a2514c-85706e5ecabso2365223241.0 for ; Mon, 25 Nov 2024 11:49:15 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1732564154; x=1733168954; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=MNkRUI2D4ZTXw4CmB2STFErzqoquptPhm1N/NMRAw7I=; b=LqM8uqFB5XxRxfN4FGq2woeAp6o3k69GMA6DPW+KmgfeneHwcyoq15CsGlgQhazMx6 vwlSGCfsgpMXa2DTACkbMpnyPj6cY/HKQub/X9oKF88Gk/dyEPAX01iDAFe3N/Z0M3RU u6p45nNya7q/pxQv4jfNaqoQ2pySMGAzxU3Rs= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1732564154; x=1733168954; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=MNkRUI2D4ZTXw4CmB2STFErzqoquptPhm1N/NMRAw7I=; b=jNy3ust/2MZ3WZc9is0Aiqu9L5XZAmTWALJcekn8Y+3zAu+S2Qwj05HFuc69ZtvOVF WXfcts71wpHikU5bzdx2RkkaoV0socJPGvqeSbF876C9CcFZvniEMPrwduC3zw6/AOvf +MNuhUFn6ZUhK+3zJIv4788yJtr92poWetEI8JpKJPzpMTDH+/HOFcIDno2OPAemLMNc wLOT/OEJ2+1HnXc2ltLby/2GlS9I1tE3AWJE38SNnJzieRAVHQu6egCv2dAuRyXPUu1V Xxt3zDj6YrL2kmEHN8/Zsl7YiT+h/WpMOCkceYuB8enoZp4MmFPYoNwPvSVlEXF9lCMp mO4A== X-Gm-Message-State: AOJu0YwnT1z04t9DpePG4FR/3oI3I7VvZMT6FftpZKqG66Po7N+NpY2K 4QRYqddtGZxwPh07JjMaf0gPVqwKw8fBAI6aUfH+VBQL++OFuR2rvHh5yt3mLg== X-Gm-Gg: ASbGncs427M5L1jX2RF5izodTcbnaPNc0TZ3mXoh5bMKAIFp5pqKdaHVt+jdMGwrpta zQDvlDAscep0pUXmX4Y9ZwiQsrB2obH15gD8dwA1cFjo2wsU9I5nP/lYg+hnXPR050A/CKMlGqb OURlSKq13loG3gzeMhpBu6CgYjCcfn+z/6e9ANrVLUCvV4QKEC8DNa9Sal0OAVvo5su1r7pGx3Z 9hLCc4ZnmbKyWTDRayFoQlcpHwJNvKm3FxSqD0HfGKmiCaXVoenRLi9nJt/UL8v/Ypo6wSzLB09 wWwPWM3tX0UVuCjCjsLH+u9C X-Google-Smtp-Source: AGHT+IFw4r0pJxPsi4HR2ZjtMg6jgNCS9ulAehVcqVJSXpmzBFsZUst3LdIDlS4ju0WKRKwzvh/1kg== X-Received: by 2002:a67:f596:0:b0:4af:2d38:2232 with SMTP id ada2fe7eead31-4af35eb0df9mr847909137.6.1732564154195; Mon, 25 Nov 2024 11:49:14 -0800 (PST) Received: from denia.c.googlers.com (5.236.236.35.bc.googleusercontent.com. [35.236.236.5]) by smtp.gmail.com with ESMTPSA id ada2fe7eead31-4af358d2f9asm75324137.23.2024.11.25.11.49.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 25 Nov 2024 11:49:13 -0800 (PST) From: Ricardo Ribalda Date: Mon, 25 Nov 2024 19:49:07 +0000 Subject: [PATCH v4 2/7] media: uvcvideo: Factor out gpio functions to its own file Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20241125-uvc-subdev-v4-2-51e040599f1a@chromium.org> References: <20241125-uvc-subdev-v4-0-51e040599f1a@chromium.org> In-Reply-To: <20241125-uvc-subdev-v4-0-51e040599f1a@chromium.org> To: Laurent Pinchart , Mauro Carvalho Chehab , Sakari Ailus Cc: linux-kernel@vger.kernel.org, linux-media@vger.kernel.org, Yunke Cao , Hans Verkuil , Hans de Goede , Ricardo Ribalda X-Mailer: b4 0.13.0 This is just a refactor patch, no new functionality is added. Signed-off-by: Ricardo Ribalda --- drivers/media/usb/uvc/Makefile | 3 +- drivers/media/usb/uvc/uvc_driver.c | 119 +--------------------------------= ---- drivers/media/usb/uvc/uvc_gpio.c | 118 +++++++++++++++++++++++++++++++++= +++ drivers/media/usb/uvc/uvcvideo.h | 8 +++ 4 files changed, 131 insertions(+), 117 deletions(-) diff --git a/drivers/media/usb/uvc/Makefile b/drivers/media/usb/uvc/Makefile index 4f9eee4f81ab..85514b6e538f 100644 --- a/drivers/media/usb/uvc/Makefile +++ b/drivers/media/usb/uvc/Makefile @@ -1,6 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 uvcvideo-objs :=3D uvc_driver.o uvc_queue.o uvc_v4l2.o uvc_video.o uvc_ct= rl.o \ - uvc_status.o uvc_isight.o uvc_debugfs.o uvc_metadata.o + uvc_status.o uvc_isight.o uvc_debugfs.o uvc_metadata.o \ + uvc_gpio.o ifeq ($(CONFIG_MEDIA_CONTROLLER),y) uvcvideo-objs +=3D uvc_entity.o endif diff --git a/drivers/media/usb/uvc/uvc_driver.c b/drivers/media/usb/uvc/uvc= _driver.c index 6d34c910a659..914f342f4aa3 100644 --- a/drivers/media/usb/uvc/uvc_driver.c +++ b/drivers/media/usb/uvc/uvc_driver.c @@ -8,7 +8,6 @@ =20 #include #include -#include #include #include #include @@ -775,9 +774,9 @@ static const u8 uvc_media_transport_input_guid[16] =3D UVC_GUID_UVC_MEDIA_TRANSPORT_INPUT; static const u8 uvc_processing_guid[16] =3D UVC_GUID_UVC_PROCESSING; =20 -static struct uvc_entity *uvc_alloc_new_entity(struct uvc_device *dev, u16= type, - u16 id, unsigned int num_pads, - unsigned int extra_size) +struct uvc_entity *uvc_alloc_new_entity(struct uvc_device *dev, u16 type, + u16 id, unsigned int num_pads, + unsigned int extra_size) { struct uvc_entity *entity; unsigned int num_inputs; @@ -1240,118 +1239,6 @@ static int uvc_parse_control(struct uvc_device *dev) return 0; } =20 -/* -----------------------------------------------------------------------= ------ - * Privacy GPIO - */ - -static void uvc_gpio_event(struct uvc_device *dev) -{ - struct uvc_entity *unit =3D dev->gpio_unit; - struct uvc_video_chain *chain; - u8 new_val; - - if (!unit) - return; - - new_val =3D gpiod_get_value_cansleep(unit->gpio.gpio_privacy); - - /* GPIO entities are always on the first chain. */ - chain =3D list_first_entry(&dev->chains, struct uvc_video_chain, list); - uvc_ctrl_status_event(chain, unit->controls, &new_val); -} - -static int uvc_gpio_get_cur(struct uvc_device *dev, struct uvc_entity *ent= ity, - u8 cs, void *data, u16 size) -{ - if (cs !=3D UVC_CT_PRIVACY_CONTROL || size < 1) - return -EINVAL; - - *(u8 *)data =3D gpiod_get_value_cansleep(entity->gpio.gpio_privacy); - - return 0; -} - -static int uvc_gpio_get_info(struct uvc_device *dev, struct uvc_entity *en= tity, - u8 cs, u8 *caps) -{ - if (cs !=3D UVC_CT_PRIVACY_CONTROL) - return -EINVAL; - - *caps =3D UVC_CONTROL_CAP_GET | UVC_CONTROL_CAP_AUTOUPDATE; - return 0; -} - -static irqreturn_t uvc_gpio_irq(int irq, void *data) -{ - struct uvc_device *dev =3D data; - - uvc_gpio_event(dev); - return IRQ_HANDLED; -} - -static int uvc_gpio_parse(struct uvc_device *dev) -{ - struct uvc_entity *unit; - struct gpio_desc *gpio_privacy; - int irq; - - gpio_privacy =3D devm_gpiod_get_optional(&dev->intf->dev, "privacy", - GPIOD_IN); - if (IS_ERR_OR_NULL(gpio_privacy)) - return PTR_ERR_OR_ZERO(gpio_privacy); - - irq =3D gpiod_to_irq(gpio_privacy); - if (irq < 0) - return dev_err_probe(&dev->intf->dev, irq, - "No IRQ for privacy GPIO\n"); - - unit =3D uvc_alloc_new_entity(dev, UVC_EXT_GPIO_UNIT, - UVC_EXT_GPIO_UNIT_ID, 0, 1); - if (IS_ERR(unit)) - return PTR_ERR(unit); - - unit->gpio.gpio_privacy =3D gpio_privacy; - unit->gpio.irq =3D irq; - unit->gpio.bControlSize =3D 1; - unit->gpio.bmControls =3D (u8 *)unit + sizeof(*unit); - unit->gpio.bmControls[0] =3D 1; - unit->get_cur =3D uvc_gpio_get_cur; - unit->get_info =3D uvc_gpio_get_info; - strscpy(unit->name, "GPIO", sizeof(unit->name)); - - list_add_tail(&unit->list, &dev->entities); - - dev->gpio_unit =3D unit; - - return 0; -} - -static int uvc_gpio_init_irq(struct uvc_device *dev) -{ - struct uvc_entity *unit =3D dev->gpio_unit; - int ret; - - if (!unit || unit->gpio.irq < 0) - return 0; - - ret =3D request_threaded_irq(unit->gpio.irq, NULL, uvc_gpio_irq, - IRQF_ONESHOT | IRQF_TRIGGER_FALLING | - IRQF_TRIGGER_RISING, - "uvc_privacy_gpio", dev); - - unit->gpio.initialized =3D !ret; - - return ret; -} - -static void uvc_gpio_deinit(struct uvc_device *dev) -{ - if (!dev->gpio_unit || !dev->gpio_unit->gpio.initialized) - return; - - free_irq(dev->gpio_unit->gpio.irq, dev); -} - /* ------------------------------------------------------------------------ * UVC device scan */ diff --git a/drivers/media/usb/uvc/uvc_gpio.c b/drivers/media/usb/uvc/uvc_g= pio.c new file mode 100644 index 000000000000..453739acbe8f --- /dev/null +++ b/drivers/media/usb/uvc/uvc_gpio.c @@ -0,0 +1,118 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * uvc_gpio.c -- USB Video Class driver + * + * Copyright 2024 Google LLC + */ + +#include +#include +#include "uvcvideo.h" + +static void uvc_gpio_event(struct uvc_device *dev) +{ + struct uvc_entity *unit =3D dev->gpio_unit; + struct uvc_video_chain *chain; + u8 new_val; + + if (!unit) + return; + + new_val =3D gpiod_get_value_cansleep(unit->gpio.gpio_privacy); + + /* GPIO entities are always on the first chain. */ + chain =3D list_first_entry(&dev->chains, struct uvc_video_chain, list); + uvc_ctrl_status_event(chain, unit->controls, &new_val); +} + +static int uvc_gpio_get_cur(struct uvc_device *dev, struct uvc_entity *ent= ity, + u8 cs, void *data, u16 size) +{ + if (cs !=3D UVC_CT_PRIVACY_CONTROL || size < 1) + return -EINVAL; + + *(u8 *)data =3D gpiod_get_value_cansleep(entity->gpio.gpio_privacy); + + return 0; +} + +static int uvc_gpio_get_info(struct uvc_device *dev, struct uvc_entity *en= tity, + u8 cs, u8 *caps) +{ + if (cs !=3D UVC_CT_PRIVACY_CONTROL) + return -EINVAL; + + *caps =3D UVC_CONTROL_CAP_GET | UVC_CONTROL_CAP_AUTOUPDATE; + return 0; +} + +static irqreturn_t uvc_gpio_irq(int irq, void *data) +{ + struct uvc_device *dev =3D data; + + uvc_gpio_event(dev); + return IRQ_HANDLED; +} + +int uvc_gpio_parse(struct uvc_device *dev) +{ + struct uvc_entity *unit; + struct gpio_desc *gpio_privacy; + int irq; + + gpio_privacy =3D devm_gpiod_get_optional(&dev->intf->dev, "privacy", + GPIOD_IN); + if (IS_ERR_OR_NULL(gpio_privacy)) + return PTR_ERR_OR_ZERO(gpio_privacy); + + irq =3D gpiod_to_irq(gpio_privacy); + if (irq < 0) + return dev_err_probe(&dev->udev->dev, irq, + "No IRQ for privacy GPIO\n"); + + unit =3D uvc_alloc_new_entity(dev, UVC_EXT_GPIO_UNIT, + UVC_EXT_GPIO_UNIT_ID, 0, 1); + if (IS_ERR(unit)) + return PTR_ERR(unit); + + unit->gpio.gpio_privacy =3D gpio_privacy; + unit->gpio.irq =3D irq; + unit->gpio.bControlSize =3D 1; + unit->gpio.bmControls =3D (u8 *)unit + sizeof(*unit); + unit->gpio.bmControls[0] =3D 1; + unit->get_cur =3D uvc_gpio_get_cur; + unit->get_info =3D uvc_gpio_get_info; + strscpy(unit->name, "GPIO", sizeof(unit->name)); + + list_add_tail(&unit->list, &dev->entities); + + dev->gpio_unit =3D unit; + + return 0; +} + +int uvc_gpio_init_irq(struct uvc_device *dev) +{ + struct uvc_entity *unit =3D dev->gpio_unit; + int ret; + + if (!unit || unit->gpio.irq < 0) + return 0; + + ret =3D request_threaded_irq(unit->gpio.irq, NULL, uvc_gpio_irq, + IRQF_ONESHOT | IRQF_TRIGGER_FALLING | + IRQF_TRIGGER_RISING, + "uvc_privacy_gpio", dev); + + unit->gpio.initialized =3D !ret; + + return ret; +} + +void uvc_gpio_deinit(struct uvc_device *dev) +{ + if (!dev->gpio_unit || !dev->gpio_unit->gpio.initialized) + return; + + free_irq(dev->gpio_unit->gpio.irq, dev); +} diff --git a/drivers/media/usb/uvc/uvcvideo.h b/drivers/media/usb/uvc/uvcvi= deo.h index 965a789ed03e..91ed59b54d9a 100644 --- a/drivers/media/usb/uvc/uvcvideo.h +++ b/drivers/media/usb/uvc/uvcvideo.h @@ -673,6 +673,9 @@ do { \ extern struct uvc_driver uvc_driver; =20 struct uvc_entity *uvc_entity_by_id(struct uvc_device *dev, int id); +struct uvc_entity *uvc_alloc_new_entity(struct uvc_device *dev, u16 type, + u16 id, unsigned int num_pads, + unsigned int extra_size); =20 /* Video buffers queue management. */ int uvc_queue_init(struct uvc_video_queue *queue, enum v4l2_buf_type type, @@ -817,4 +820,9 @@ void uvc_debugfs_cleanup_stream(struct uvc_streaming *s= tream); size_t uvc_video_stats_dump(struct uvc_streaming *stream, char *buf, size_t size); =20 +/* gpio */ +int uvc_gpio_parse(struct uvc_device *dev); +int uvc_gpio_init_irq(struct uvc_device *dev); +void uvc_gpio_deinit(struct uvc_device *dev); + #endif --=20 2.47.0.338.g60cca15819-goog From nobody Sun Feb 8 08:19:34 2026 Received: from mail-vs1-f45.google.com (mail-vs1-f45.google.com [209.85.217.45]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 694501C8FD6 for ; Mon, 25 Nov 2024 19:49:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.217.45 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1732564159; cv=none; b=Cg6yo0WofZVvBTzS76UtxkM1Y8HnC0RSbjNAIEM7+x1pBhMB0x0uD58T0btIBR3wro3O2ljaL3BwhJ5glhai7e4FTBlOD/5Jw/GZjS3NQD3evlVXo/gtwuM9ARZoBADy1Bl4FT+mt26JmLokGaxSwTSc83zDNZKitajl0RdD7Ck= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1732564159; c=relaxed/simple; bh=GX9trsdzPioO395Gg+CXhWOOnI33tO2p41ZGbit2xt4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=irZdvQLiLV9TIvYWnE6W2WrD79a7TQ7W5yhXEx+riI9sSQzbozZmRqS+v25CgKu1X3S53ABL3yaJrGGMWbfJfQnV+0pKX/pz3toPOkEq6hSI5W4zAj2PJ/yGgdyeJ2fjG+9CQ9uLs5oTEVFY9XEqFMyPXStbcOo3g08E9bh7GNg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=pass smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=DwD382zJ; arc=none smtp.client-ip=209.85.217.45 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="DwD382zJ" Received: by mail-vs1-f45.google.com with SMTP id ada2fe7eead31-4aef7d0cc2dso754432137.1 for ; Mon, 25 Nov 2024 11:49:17 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1732564156; x=1733168956; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=A3hhHdUasNa76JNkJUeccOV8K9BEb0pXt/VGiDGL3kg=; b=DwD382zJU0ztTnt+H0Gho1vNr9utlaL1tGjagOyKy42MBJWTkyrgTUhSU7GecRxvNi pmQJs6xzmMOTpv7PFJW/QnATv/okOW3uYt+99TIwbEQyehAN+X+YbCJ87dO+pxnxVTJY fazo/GE48WnwGpQONA9lGJ/xJL8e41qx5zX6E= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1732564156; x=1733168956; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=A3hhHdUasNa76JNkJUeccOV8K9BEb0pXt/VGiDGL3kg=; b=bSrHiXON02mq0DAIwVpFNGAl9W+jKKBHrSYPKnStVtVNhbky6EZcQW13BmzlVljbic OMBqLTqbw/x8bWbpR9gxDbWeGFjNXapFAOINcP79D5MEu7NDWgD9cmHaEbYt64B9tlWT T8Ht0b+zM1dx421dJSCt+rh9worV9xSk8GrA7uCMDWbmdZfK21xOGyj057iL8wiixgEG eUXRaSwuDnNon5nMDuNhKwKgbAVgu8+Wm2XmiMmI/iZR/4H+zBLl9swX/bwnhK++ymgq AODSIkm0Av6wdHX7FXX8VVjn4OSoyTQbrwmcvtQU1ERoc5WD5XsW0ZamBHLUKMBg+LrM B2qg== X-Gm-Message-State: AOJu0YygDRN6Czr1XrpsIZ2DsYHJEh/CQ94oDl+GPfhkAJy10qNoY8/u BgQrX2bSsvcl3OSzvhDshRvvqV4Yks7QIROoNBYkib8I2ASECvINI1xQByxceQ== X-Gm-Gg: ASbGncthKr/mK9TIJO3tcG8mcZMuAGoCmEW3N+VKj10+dM79aJbu1XOcihvTuSBzeDC SYjpkFzo/mV7saMh7SAOyF/KrARFXolVA4m9yx7A42o662VL3u7nvxfinhRP3ilH6646I2+wwOK jg2K9a8xuM59/phX0oZR509x3n7jrljdHpB8NPxnCAgJPbtHyBe2MABJuBFN9cR0ntIqAFEW5ll H+mohTAow8m+jbwpjyAi7VJQ4VuMg5o/gtH3m6LkDDCynnjZob4VM5pKsGVEaTq4s6tqFezh+Lp F2BONgTsx+nPa74CWp6jFQeg X-Google-Smtp-Source: AGHT+IH1ey2KteIhbabJrhphlQOy3xtxbpop+5KZHeknT32aOGcrv2p46SrPAjO5se9aH+KHzxNlsA== X-Received: by 2002:a05:6102:390c:b0:4af:2f95:4ae5 with SMTP id ada2fe7eead31-4af2f954e31mr3188034137.9.1732564156361; Mon, 25 Nov 2024 11:49:16 -0800 (PST) Received: from denia.c.googlers.com (5.236.236.35.bc.googleusercontent.com. [35.236.236.5]) by smtp.gmail.com with ESMTPSA id ada2fe7eead31-4af358d2f9asm75324137.23.2024.11.25.11.49.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 25 Nov 2024 11:49:15 -0800 (PST) From: Ricardo Ribalda Date: Mon, 25 Nov 2024 19:49:08 +0000 Subject: [PATCH v4 3/7] media: uvcvideo: Re-implement privacy GPIO as an input device Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20241125-uvc-subdev-v4-3-51e040599f1a@chromium.org> References: <20241125-uvc-subdev-v4-0-51e040599f1a@chromium.org> In-Reply-To: <20241125-uvc-subdev-v4-0-51e040599f1a@chromium.org> To: Laurent Pinchart , Mauro Carvalho Chehab , Sakari Ailus Cc: linux-kernel@vger.kernel.org, linux-media@vger.kernel.org, Yunke Cao , Hans Verkuil , Hans de Goede , Ricardo Ribalda X-Mailer: b4 0.13.0 Reimplement privacy GPIO as an input device. This is an attempt to unify how we notify userspace about a camera that is covered. Replace the previous V4L2_CID_PRIVACY control with evdev SW_CAMERA_LENS_COVER. This has some main benefits: - It unifies behaviour with other drivers. - It allows reading the privacy events without powering up the camera. - It allows reading the privacy gpio and the internal gpio control (if present). Although this introduces an ABI change, we have only seen ChromeOS using this feature. Signed-off-by: Ricardo Ribalda --- drivers/media/usb/uvc/Kconfig | 2 +- drivers/media/usb/uvc/Makefile | 6 ++- drivers/media/usb/uvc/uvc_ctrl.c | 20 ---------- drivers/media/usb/uvc/uvc_driver.c | 3 +- drivers/media/usb/uvc/uvc_entity.c | 6 +++ drivers/media/usb/uvc/uvc_gpio.c | 76 +++++++++++++---------------------= ---- drivers/media/usb/uvc/uvc_status.c | 13 +++++-- drivers/media/usb/uvc/uvcvideo.h | 15 +++++--- 8 files changed, 59 insertions(+), 82 deletions(-) diff --git a/drivers/media/usb/uvc/Kconfig b/drivers/media/usb/uvc/Kconfig index 579532272fd6..cdbba7fd5bee 100644 --- a/drivers/media/usb/uvc/Kconfig +++ b/drivers/media/usb/uvc/Kconfig @@ -17,6 +17,6 @@ config USB_VIDEO_CLASS_INPUT_EVDEV depends on USB_VIDEO_CLASS=3DINPUT || INPUT=3Dy help This option makes USB Video Class devices register an input device - to report button events. + to report button events and privacy GPIO. =20 If you are in doubt, say Y. diff --git a/drivers/media/usb/uvc/Makefile b/drivers/media/usb/uvc/Makefile index 85514b6e538f..b36b124da7a8 100644 --- a/drivers/media/usb/uvc/Makefile +++ b/drivers/media/usb/uvc/Makefile @@ -1,8 +1,10 @@ # SPDX-License-Identifier: GPL-2.0 uvcvideo-objs :=3D uvc_driver.o uvc_queue.o uvc_v4l2.o uvc_video.o uvc_ct= rl.o \ - uvc_status.o uvc_isight.o uvc_debugfs.o uvc_metadata.o \ - uvc_gpio.o + uvc_status.o uvc_isight.o uvc_debugfs.o uvc_metadata.o ifeq ($(CONFIG_MEDIA_CONTROLLER),y) uvcvideo-objs +=3D uvc_entity.o endif +ifeq ($(CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV),y) +uvcvideo-objs +=3D uvc_gpio.o +endif obj-$(CONFIG_USB_VIDEO_CLASS) +=3D uvcvideo.o diff --git a/drivers/media/usb/uvc/uvc_ctrl.c b/drivers/media/usb/uvc/uvc_c= trl.c index 4fe26e82e3d1..b98f4778d8aa 100644 --- a/drivers/media/usb/uvc/uvc_ctrl.c +++ b/drivers/media/usb/uvc/uvc_ctrl.c @@ -350,14 +350,6 @@ static const struct uvc_control_info uvc_ctrls[] =3D { | UVC_CTRL_FLAG_RESTORE | UVC_CTRL_FLAG_AUTO_UPDATE, }, - { - .entity =3D UVC_GUID_EXT_GPIO_CONTROLLER, - .selector =3D UVC_CT_PRIVACY_CONTROL, - .index =3D 0, - .size =3D 1, - .flags =3D UVC_CTRL_FLAG_GET_CUR - | UVC_CTRL_FLAG_AUTO_UPDATE, - }, }; =20 static const u32 uvc_control_classes[] =3D { @@ -827,15 +819,6 @@ static const struct uvc_control_mapping uvc_ctrl_mappi= ngs[] =3D { .v4l2_type =3D V4L2_CTRL_TYPE_BOOLEAN, .data_type =3D UVC_CTRL_DATA_TYPE_BOOLEAN, }, - { - .id =3D V4L2_CID_PRIVACY, - .entity =3D UVC_GUID_EXT_GPIO_CONTROLLER, - .selector =3D UVC_CT_PRIVACY_CONTROL, - .size =3D 1, - .offset =3D 0, - .v4l2_type =3D V4L2_CTRL_TYPE_BOOLEAN, - .data_type =3D UVC_CTRL_DATA_TYPE_BOOLEAN, - }, { .entity =3D UVC_GUID_UVC_PROCESSING, .selector =3D UVC_PU_POWER_LINE_FREQUENCY_CONTROL, @@ -2718,9 +2701,6 @@ static int uvc_ctrl_init_chain(struct uvc_video_chain= *chain) } else if (UVC_ENTITY_TYPE(entity) =3D=3D UVC_ITT_CAMERA) { bmControls =3D entity->camera.bmControls; bControlSize =3D entity->camera.bControlSize; - } else if (UVC_ENTITY_TYPE(entity) =3D=3D UVC_EXT_GPIO_UNIT) { - bmControls =3D entity->gpio.bmControls; - bControlSize =3D entity->gpio.bControlSize; } =20 /* Remove bogus/blacklisted controls */ diff --git a/drivers/media/usb/uvc/uvc_driver.c b/drivers/media/usb/uvc/uvc= _driver.c index 914f342f4aa3..c34bfadce60c 100644 --- a/drivers/media/usb/uvc/uvc_driver.c +++ b/drivers/media/usb/uvc/uvc_driver.c @@ -2171,6 +2171,7 @@ static int uvc_probe(struct usb_interface *intf, if (media_device_register(&dev->mdev) < 0) goto error; #endif + /* Save our data pointer in the interface data. */ usb_set_intfdata(intf, dev); =20 @@ -2182,7 +2183,7 @@ static int uvc_probe(struct usb_interface *intf, ret); } =20 - ret =3D uvc_gpio_init_irq(dev); + ret =3D uvc_gpio_init(dev); if (ret < 0) { dev_err(&dev->udev->dev, "Unable to request privacy GPIO IRQ (%d)\n", ret); diff --git a/drivers/media/usb/uvc/uvc_entity.c b/drivers/media/usb/uvc/uvc= _entity.c index cc68dd24eb42..c1b69f9eaa56 100644 --- a/drivers/media/usb/uvc/uvc_entity.c +++ b/drivers/media/usb/uvc/uvc_entity.c @@ -56,7 +56,13 @@ static int uvc_mc_create_links(struct uvc_video_chain *c= hain, return 0; } =20 +static const struct v4l2_subdev_core_ops uvc_subdev_core_ops =3D { + .subscribe_event =3D v4l2_ctrl_subdev_subscribe_event, + .unsubscribe_event =3D v4l2_event_subdev_unsubscribe, +}; + static const struct v4l2_subdev_ops uvc_subdev_ops =3D { + .core =3D &uvc_subdev_core_ops, }; =20 void uvc_mc_cleanup_entity(struct uvc_entity *entity) diff --git a/drivers/media/usb/uvc/uvc_gpio.c b/drivers/media/usb/uvc/uvc_g= pio.c index 453739acbe8f..80096022ad08 100644 --- a/drivers/media/usb/uvc/uvc_gpio.c +++ b/drivers/media/usb/uvc/uvc_gpio.c @@ -7,57 +7,29 @@ =20 #include #include +#include #include "uvcvideo.h" =20 -static void uvc_gpio_event(struct uvc_device *dev) -{ - struct uvc_entity *unit =3D dev->gpio_unit; - struct uvc_video_chain *chain; - u8 new_val; - - if (!unit) - return; - - new_val =3D gpiod_get_value_cansleep(unit->gpio.gpio_privacy); - - /* GPIO entities are always on the first chain. */ - chain =3D list_first_entry(&dev->chains, struct uvc_video_chain, list); - uvc_ctrl_status_event(chain, unit->controls, &new_val); -} - -static int uvc_gpio_get_cur(struct uvc_device *dev, struct uvc_entity *ent= ity, - u8 cs, void *data, u16 size) -{ - if (cs !=3D UVC_CT_PRIVACY_CONTROL || size < 1) - return -EINVAL; - - *(u8 *)data =3D gpiod_get_value_cansleep(entity->gpio.gpio_privacy); - - return 0; -} - -static int uvc_gpio_get_info(struct uvc_device *dev, struct uvc_entity *en= tity, - u8 cs, u8 *caps) -{ - if (cs !=3D UVC_CT_PRIVACY_CONTROL) - return -EINVAL; - - *caps =3D UVC_CONTROL_CAP_GET | UVC_CONTROL_CAP_AUTOUPDATE; - return 0; -} - static irqreturn_t uvc_gpio_irq(int irq, void *data) { struct uvc_device *dev =3D data; + struct uvc_gpio *uvc_gpio =3D &dev->gpio_unit->gpio; + int new_val; + + new_val =3D gpiod_get_value_cansleep(uvc_gpio->gpio_privacy); + if (new_val < 0) + return IRQ_HANDLED; + + input_report_switch(dev->input, SW_CAMERA_LENS_COVER, new_val); + input_sync(dev->input); =20 - uvc_gpio_event(dev); return IRQ_HANDLED; } =20 int uvc_gpio_parse(struct uvc_device *dev) { - struct uvc_entity *unit; struct gpio_desc *gpio_privacy; + struct uvc_entity *unit; int irq; =20 gpio_privacy =3D devm_gpiod_get_optional(&dev->intf->dev, "privacy", @@ -67,23 +39,17 @@ int uvc_gpio_parse(struct uvc_device *dev) =20 irq =3D gpiod_to_irq(gpio_privacy); if (irq < 0) - return dev_err_probe(&dev->udev->dev, irq, + return dev_err_probe(&dev->intf->dev, irq, "No IRQ for privacy GPIO\n"); =20 unit =3D uvc_alloc_new_entity(dev, UVC_EXT_GPIO_UNIT, - UVC_EXT_GPIO_UNIT_ID, 0, 1); + UVC_EXT_GPIO_UNIT_ID, 0, 0); if (IS_ERR(unit)) return PTR_ERR(unit); =20 unit->gpio.gpio_privacy =3D gpio_privacy; unit->gpio.irq =3D irq; - unit->gpio.bControlSize =3D 1; - unit->gpio.bmControls =3D (u8 *)unit + sizeof(*unit); - unit->gpio.bmControls[0] =3D 1; - unit->get_cur =3D uvc_gpio_get_cur; - unit->get_info =3D uvc_gpio_get_info; strscpy(unit->name, "GPIO", sizeof(unit->name)); - list_add_tail(&unit->list, &dev->entities); =20 dev->gpio_unit =3D unit; @@ -91,22 +57,32 @@ int uvc_gpio_parse(struct uvc_device *dev) return 0; } =20 -int uvc_gpio_init_irq(struct uvc_device *dev) +int uvc_gpio_init(struct uvc_device *dev) { struct uvc_entity *unit =3D dev->gpio_unit; + int init_val; int ret; =20 if (!unit || unit->gpio.irq < 0) return 0; =20 + init_val =3D gpiod_get_value_cansleep(unit->gpio.gpio_privacy); + if (init_val < 0) + return init_val; + ret =3D request_threaded_irq(unit->gpio.irq, NULL, uvc_gpio_irq, IRQF_ONESHOT | IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING, "uvc_privacy_gpio", dev); + if (ret) + return ret; + + input_report_switch(dev->input, SW_CAMERA_LENS_COVER, init_val); + input_sync(dev->input); =20 - unit->gpio.initialized =3D !ret; + unit->gpio.initialized =3D true; =20 - return ret; + return 0; } =20 void uvc_gpio_deinit(struct uvc_device *dev) diff --git a/drivers/media/usb/uvc/uvc_status.c b/drivers/media/usb/uvc/uvc= _status.c index 06c867510c8f..319f472213f6 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; =20 - if (!uvc_input_has_button(dev)) + if (!uvc_input_has_button(dev) && !dev->gpio_unit) return 0; =20 input =3D input_allocate_device(); @@ -59,8 +59,15 @@ static int uvc_input_init(struct uvc_device *dev) usb_to_input_id(dev->udev, &input->id); input->dev.parent =3D &dev->intf->dev; =20 - __set_bit(EV_KEY, input->evbit); - __set_bit(KEY_CAMERA, input->keybit); + if (uvc_input_has_button(dev)) { + __set_bit(EV_KEY, input->evbit); + __set_bit(KEY_CAMERA, input->keybit); + } + + if (dev->gpio_unit) { + __set_bit(EV_SW, input->evbit); + __set_bit(SW_CAMERA_LENS_COVER, input->swbit); + } =20 if ((ret =3D input_register_device(input)) < 0) goto error; diff --git a/drivers/media/usb/uvc/uvcvideo.h b/drivers/media/usb/uvc/uvcvi= deo.h index 91ed59b54d9a..06c4d514d02c 100644 --- a/drivers/media/usb/uvc/uvcvideo.h +++ b/drivers/media/usb/uvc/uvcvideo.h @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include @@ -229,12 +230,10 @@ struct uvc_entity { u8 *bmControlsType; } extension; =20 - struct { - u8 bControlSize; - u8 *bmControls; - struct gpio_desc *gpio_privacy; + struct uvc_gpio { int irq; bool initialized; + struct gpio_desc *gpio_privacy; } gpio; }; =20 @@ -821,8 +820,14 @@ size_t uvc_video_stats_dump(struct uvc_streaming *stre= am, char *buf, size_t size); =20 /* gpio */ +#ifdef CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV int uvc_gpio_parse(struct uvc_device *dev); -int uvc_gpio_init_irq(struct uvc_device *dev); +int uvc_gpio_init(struct uvc_device *dev); void uvc_gpio_deinit(struct uvc_device *dev); +#else +static inline int uvc_gpio_parse(struct uvc_device *dev) {return 0; } +static inline int uvc_gpio_init(struct uvc_device *dev) {return 0; } +static inline void uvc_gpio_deinit(struct uvc_device *dev) {}; +#endif =20 #endif --=20 2.47.0.338.g60cca15819-goog From nobody Sun Feb 8 08:19:34 2026 Received: from mail-vs1-f42.google.com (mail-vs1-f42.google.com [209.85.217.42]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6F2E81CCEF6 for ; Mon, 25 Nov 2024 19:49:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.217.42 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1732564162; cv=none; b=u4HGyN4LmEnMoFomJYBbuPCFqbQ4510lL9V5BxFJ+ztEBWjjTuCrkqzTT+r1k2x3BUVfXTuEWDpIlOWEBB85SNTQ+QAlERBlypuNyUjOVqD/CwFVNeImrtX7evhZqxTn51BnDItBcjKYADNYbSBjpHo8B6wuK0WK2IjO793Od/Q= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1732564162; c=relaxed/simple; bh=vAAOYhnDuCS6QSDtHNvCZ/7V8wyms193hC/CkNF19gg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=VGSsGLKy55Fc7hu0pEID8oJzNSF9FZEpCgFw1xnsVObX/l3jmN+aBd/6zXP/D8TXKxwNVjb8BH0Rbh8t2sYd0LUBYEBkRToSoqTEmF8VxOB8FqBX6bp0Iq5wV+FIcYQedKk8IAKvftRh9wKY9gkRF2KEjhFKUPIzJs34Vw5OVxI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=pass smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=I7tFM6IJ; arc=none smtp.client-ip=209.85.217.42 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="I7tFM6IJ" Received: by mail-vs1-f42.google.com with SMTP id ada2fe7eead31-4af0e3bc307so556581137.3 for ; Mon, 25 Nov 2024 11:49:19 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1732564158; x=1733168958; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=Qew2lSt6MOHSZhwSkHfFr6COKD1ZhgAt7ezEOaoydpo=; b=I7tFM6IJ4z1ud9N0cp5ha0k3yRHi0XUjo7ipQ+LJEkd3nMkgkh83zlQHsJf5vRE1wZ W0oJA9i+AeZXj4JoqBcQFpUnvVdx5Ks7w1E+B29rhe2naPsasUVv4DyreQnrfhm9NS55 d6P1xJxlK64LwCDEwQxB+Cya9JVKshX/zeW9Y= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1732564158; x=1733168958; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Qew2lSt6MOHSZhwSkHfFr6COKD1ZhgAt7ezEOaoydpo=; b=K1NRo94No/9IBIDAZ19rtch5hNEkaj2JUMYH+IVEjP6Ya3+q2PW0qfmU6Rb19oXLg/ LisdnOC0lGAmRxV/HxCZrWxN/vBuBnOAWqglMZ37DckJAW6xwM0LorOnVq1zf3Nhx1NX Vl2Q4LQRP013QRK/baMjY1tZcDUwmpXD1uKQB6bTlCrZqs+k8OKyAP7H8jwgo8R8VVWR K6e2p2rTDo8B7a+U7LDgHRLtv2Lwbld71d5i9Sbu80ndY0HMh8Qq0uf6w643RAMXejsB J5JNvLwo23CEIfyVo13VxKyX80Yhf3A42vDCUiAnHwRo9lTGzt7sjLYBZSaDHyQnHyQc esvA== X-Gm-Message-State: AOJu0YwSmq/z7C0fdo/bh0i8oyafPkWMwA+5g9+UphWKCJ/k+QjF2c6A XIscjn2GkI/+x6IY/4R7SYuhw02PHNwyxcsqOeCnb9uY+ZLJbvfKPEdZKCDkBg== X-Gm-Gg: ASbGncsVnochWs4wcnJbCMokrvuKLwFCG2bOzUWbPNFDgWr0lYH/0BLS+7YYeaB3wx4 N7KEoTwMI0wviQtAH11YgYhvwy3/YMV7iDInLhrifhrBJcjTk+sNPYEVgg8u5cZLhjA3VqZBdik yN4Ighq7QESyiw/BdyurUhU/VAWBWEpnIIgA8hRJUJWJGdMQZHFxYo1KcFS/wNWRWz265DR2gLc 3EO/KkZTlaXmgzA7MCC52Hy1ShodE5YfVpC6NMRkSmduaU2gO1hrtXVmPL77gY4U0fq+zcj6eb6 R8SWNXWaDKSunoMx225spZgj X-Google-Smtp-Source: AGHT+IEzOfjRUDJXkBH/ci9g+7icIZ8rpZbJ+DF/b16ADeDrCfZI2M6YFtGhhnhW1P+JjUvKqQBQpg== X-Received: by 2002:a05:6102:3f44:b0:493:de37:b3ef with SMTP id ada2fe7eead31-4addcbe4e47mr15581878137.13.1732564158359; Mon, 25 Nov 2024 11:49:18 -0800 (PST) Received: from denia.c.googlers.com (5.236.236.35.bc.googleusercontent.com. [35.236.236.5]) by smtp.gmail.com with ESMTPSA id ada2fe7eead31-4af358d2f9asm75324137.23.2024.11.25.11.49.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 25 Nov 2024 11:49:17 -0800 (PST) From: Ricardo Ribalda Date: Mon, 25 Nov 2024 19:49:09 +0000 Subject: [PATCH v4 4/7] Revert "media: uvcvideo: Allow entity-defined get_info and get_cur" Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20241125-uvc-subdev-v4-4-51e040599f1a@chromium.org> References: <20241125-uvc-subdev-v4-0-51e040599f1a@chromium.org> In-Reply-To: <20241125-uvc-subdev-v4-0-51e040599f1a@chromium.org> To: Laurent Pinchart , Mauro Carvalho Chehab , Sakari Ailus Cc: linux-kernel@vger.kernel.org, linux-media@vger.kernel.org, Yunke Cao , Hans Verkuil , Hans de Goede , Ricardo Ribalda X-Mailer: b4 0.13.0 With the privacy gpio now handled as a evdev, there is no more need for this. This reverts commit 65900c581d014499f0f8ceabfc02c652e9a88771. Signed-off-by: Ricardo Ribalda --- drivers/media/usb/uvc/uvc_ctrl.c | 20 +++++--------------- drivers/media/usb/uvc/uvcvideo.h | 5 ----- 2 files changed, 5 insertions(+), 20 deletions(-) diff --git a/drivers/media/usb/uvc/uvc_ctrl.c b/drivers/media/usb/uvc/uvc_c= trl.c index b98f4778d8aa..90bc2132d8d5 100644 --- a/drivers/media/usb/uvc/uvc_ctrl.c +++ b/drivers/media/usb/uvc/uvc_ctrl.c @@ -1087,15 +1087,9 @@ static int __uvc_ctrl_load_cur(struct uvc_video_chai= n *chain, return 0; } =20 - if (ctrl->entity->get_cur) - ret =3D ctrl->entity->get_cur(chain->dev, ctrl->entity, - ctrl->info.selector, data, - ctrl->info.size); - else - ret =3D uvc_query_ctrl(chain->dev, UVC_GET_CUR, - ctrl->entity->id, chain->dev->intfnum, - ctrl->info.selector, data, - ctrl->info.size); + ret =3D uvc_query_ctrl(chain->dev, UVC_GET_CUR, ctrl->entity->id, + chain->dev->intfnum, ctrl->info.selector, data, + ctrl->info.size); =20 if (ret < 0) return ret; @@ -2055,12 +2049,8 @@ static int uvc_ctrl_get_flags(struct uvc_device *dev, if (data =3D=3D NULL) return -ENOMEM; =20 - if (ctrl->entity->get_info) - ret =3D ctrl->entity->get_info(dev, ctrl->entity, - ctrl->info.selector, data); - else - ret =3D uvc_query_ctrl(dev, UVC_GET_INFO, ctrl->entity->id, - dev->intfnum, info->selector, data, 1); + ret =3D uvc_query_ctrl(dev, UVC_GET_INFO, ctrl->entity->id, dev->intfnum, + info->selector, data, 1); =20 if (!ret) { info->flags &=3D ~(UVC_CTRL_FLAG_GET_CUR | diff --git a/drivers/media/usb/uvc/uvcvideo.h b/drivers/media/usb/uvc/uvcvi= deo.h index 06c4d514d02c..6002f1c43b69 100644 --- a/drivers/media/usb/uvc/uvcvideo.h +++ b/drivers/media/usb/uvc/uvcvideo.h @@ -240,11 +240,6 @@ struct uvc_entity { u8 bNrInPins; u8 *baSourceID; =20 - int (*get_info)(struct uvc_device *dev, struct uvc_entity *entity, - u8 cs, u8 *caps); - int (*get_cur)(struct uvc_device *dev, struct uvc_entity *entity, - u8 cs, void *data, u16 size); - unsigned int ncontrols; struct uvc_control *controls; }; --=20 2.47.0.338.g60cca15819-goog From nobody Sun Feb 8 08:19:34 2026 Received: from mail-ua1-f46.google.com (mail-ua1-f46.google.com [209.85.222.46]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 36E7D1CDA13 for ; Mon, 25 Nov 2024 19:49:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.222.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1732564163; cv=none; b=Zw8AHSkovciPip4PgOX9byUY+Oiw4YlR80eL74edcpq6uqU+Le1T1D5XDYXh3pFadGMzt91E/XptgoLkrpTEB9+60UCggoMiANkvLMh9CCADl2eeTiRSMIr/ox/JcCmzJJktDAsURDCOyR0tBB4ySVmUH7Kyt8La29XhyUEPG6U= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1732564163; c=relaxed/simple; bh=fVuGaw1F+PMy4lVEqejt4Vp5RlNBADE5AOJUiE6ElSE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=SdG5CJIf09KRXVg+tD4XvN0r/in9iY1PJI97MIS4OhVRxR6uDcXayLZg+lPQcqgwUaQucXwZFpapDniHeEjDIR3FUXIkYgtBzSRJNHMTG/buSi4ybt8XCEqgBrF1wON+YqgQO/44gOve/kCLu/XRoEeX1bxb7QbPIEfOJ/YEweg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=pass smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=Qt9hhx9O; arc=none smtp.client-ip=209.85.222.46 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="Qt9hhx9O" Received: by mail-ua1-f46.google.com with SMTP id a1e0cc1a2514c-85714347e80so974210241.3 for ; Mon, 25 Nov 2024 11:49:22 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1732564161; x=1733168961; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=I0D5Q+hYOq1ZPHGsr7NgS7GX1OqcPua9PPDDXDLVIPA=; b=Qt9hhx9OSwqE34yiwZ0qZZRjdWFlUCJx2C2jPjVbceI/lTHXfA8sZpnFs/fWDzCApD tD99sJL0N8t31zSNLg1UEpsfXmVUp7Du13xiZKcfsr9Riiwy5nB7rw9wIKFV6VhjvJiu OrsidDt+T7H+3SzyL8insVQdkFba97gk1DEMo= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1732564161; x=1733168961; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=I0D5Q+hYOq1ZPHGsr7NgS7GX1OqcPua9PPDDXDLVIPA=; b=wUxlMQCqmnMA3R2eEYlYi4u5xO6zfLTjaPdKyFUAeUILA5UZjLIw511PcxGwd64xBj P42zED9MD2FkbxoBbb2FGoCv7v0otJJQAuia0nrTgu/Xtf+yOU1SSWWhtiMUoIC5rX2m 9Pu5aVXvGjW2LwdZ7OuTBgZnksYSKQuglhVvLibyEkx/uZaPiYLtQIehmoERDWoX4pVs uI4TB09bQnPmUI5Fqv1c+pSi7f6IycPWzyt7geSyYaG/LqWd35LNF/3S9dg3X6iCSP4S Xrc9xQIeg2BYVm6JMbI/8LJT67DF/CwFhoxvzz5/OhQk7nG0Bbzqanbem0hjbXIyxwk2 Dbyw== X-Gm-Message-State: AOJu0YxlYszEZWe2q3e8mbQki8JhDibm0smfxNC9flJMIXuCMQ6E5zmM QIq0WhGBDjdSugdRXHp/NyafATkMYMnsAsz0D/35/+CLInbRXcjgjdS63r+EZ3ArTExzQJprHpg = X-Gm-Gg: ASbGncusUQlg0SpbeB4yKknmzg2FLSGRAFE8jm9nNkvhMwUfNYoHImsIF3siFji2yBP KZZiDL6rxZMzemtL1PongTZ0BSx5wiQrFokoT0wYDpSivj6oSWpIxnSy3mWRVlXyT+hI8pzpmlJ A0PQbU+vYQ789YWCjJL1E4hs4PPMGeTL2edde0js73qvixoD1MAJVKD92C0PRxuStZz4qiaMpqi YZWrEzsQwQPT+pNsp90qG/6t4VZ8gYSuhfCr6tJpKyC0fv83p4On0KnN4AXCFCaJjIrW2L7LIci ALNA42IaC2P+EPrGpj3giS/f X-Google-Smtp-Source: AGHT+IFORfKuNSMeS8hZDVAV1JGG165wthWbApvkGS4fYQL7dck4HfDnA98H1BoQ7EjhoTfR6/qswA== X-Received: by 2002:a05:6102:e12:b0:4a5:b003:41bd with SMTP id ada2fe7eead31-4addcd1947amr13528500137.22.1732564160660; Mon, 25 Nov 2024 11:49:20 -0800 (PST) Received: from denia.c.googlers.com (5.236.236.35.bc.googleusercontent.com. [35.236.236.5]) by smtp.gmail.com with ESMTPSA id ada2fe7eead31-4af358d2f9asm75324137.23.2024.11.25.11.49.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 25 Nov 2024 11:49:19 -0800 (PST) From: Ricardo Ribalda Date: Mon, 25 Nov 2024 19:49:10 +0000 Subject: [PATCH v4 5/7] media: uvcvideo: Introduce UVC_QUIRK_PRIVACY_DURING_STREAM Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20241125-uvc-subdev-v4-5-51e040599f1a@chromium.org> References: <20241125-uvc-subdev-v4-0-51e040599f1a@chromium.org> In-Reply-To: <20241125-uvc-subdev-v4-0-51e040599f1a@chromium.org> To: Laurent Pinchart , Mauro Carvalho Chehab , Sakari Ailus Cc: linux-kernel@vger.kernel.org, linux-media@vger.kernel.org, Yunke Cao , Hans Verkuil , Hans de Goede , Ricardo Ribalda X-Mailer: b4 0.13.0 Some devices power the GPIO pull-up with the same power-supply as the camera. Avoid reading the GPIO if the device is not streaming. Signed-off-by: Ricardo Ribalda --- drivers/media/usb/uvc/uvc_gpio.c | 58 +++++++++++++++++++++++++++++++++++= +--- drivers/media/usb/uvc/uvc_video.c | 4 +++ drivers/media/usb/uvc/uvcvideo.h | 4 +++ 3 files changed, 62 insertions(+), 4 deletions(-) diff --git a/drivers/media/usb/uvc/uvc_gpio.c b/drivers/media/usb/uvc/uvc_g= pio.c index 80096022ad08..e6fe1845bd01 100644 --- a/drivers/media/usb/uvc/uvc_gpio.c +++ b/drivers/media/usb/uvc/uvc_gpio.c @@ -5,6 +5,7 @@ * Copyright 2024 Google LLC */ =20 +#include #include #include #include @@ -16,6 +17,9 @@ static irqreturn_t uvc_gpio_irq(int irq, void *data) struct uvc_gpio *uvc_gpio =3D &dev->gpio_unit->gpio; int new_val; =20 + if (!uvc_gpio->gpio_ready) + return IRQ_HANDLED; + new_val =3D gpiod_get_value_cansleep(uvc_gpio->gpio_privacy); if (new_val < 0) return IRQ_HANDLED; @@ -26,6 +30,24 @@ static irqreturn_t uvc_gpio_irq(int irq, void *data) return IRQ_HANDLED; } =20 +static const struct dmi_system_id privacy_valid_during_streamon[] =3D { + { + .ident =3D "HP Elite c1030 Chromebook", + .matches =3D { + DMI_MATCH(DMI_SYS_VENDOR, "HP"), + DMI_MATCH(DMI_PRODUCT_NAME, "Jinlon"), + }, + }, + { + .ident =3D "HP Pro c640 Chromebook", + .matches =3D { + DMI_MATCH(DMI_SYS_VENDOR, "HP"), + DMI_MATCH(DMI_PRODUCT_NAME, "Dratini"), + }, + }, + { } /* terminate list */ +}; + int uvc_gpio_parse(struct uvc_device *dev) { struct gpio_desc *gpio_privacy; @@ -47,6 +69,15 @@ int uvc_gpio_parse(struct uvc_device *dev) if (IS_ERR(unit)) return PTR_ERR(unit); =20 + /* + * Note: This quirk will not match external UVC cameras, + * as they will not have the corresponding ACPI GPIO entity. + */ + if (dmi_check_system(privacy_valid_during_streamon)) + dev->quirks |=3D UVC_QUIRK_PRIVACY_DURING_STREAM; + else + unit->gpio.gpio_ready =3D true; + unit->gpio.gpio_privacy =3D gpio_privacy; unit->gpio.irq =3D irq; strscpy(unit->name, "GPIO", sizeof(unit->name)); @@ -57,6 +88,16 @@ int uvc_gpio_parse(struct uvc_device *dev) return 0; } =20 +void uvc_gpio_quirk(struct uvc_device *dev, bool stream_on) +{ + if (!dev->gpio_unit || !(dev->quirks & UVC_QUIRK_PRIVACY_DURING_STREAM)) + return; + + dev->gpio_unit->gpio.gpio_ready =3D stream_on; + if (stream_on) + uvc_gpio_irq(0, dev); +} + int uvc_gpio_init(struct uvc_device *dev) { struct uvc_entity *unit =3D dev->gpio_unit; @@ -66,10 +107,6 @@ int uvc_gpio_init(struct uvc_device *dev) if (!unit || unit->gpio.irq < 0) return 0; =20 - init_val =3D gpiod_get_value_cansleep(unit->gpio.gpio_privacy); - if (init_val < 0) - return init_val; - ret =3D request_threaded_irq(unit->gpio.irq, NULL, uvc_gpio_irq, IRQF_ONESHOT | IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING, @@ -77,6 +114,19 @@ int uvc_gpio_init(struct uvc_device *dev) if (ret) return ret; =20 + if ((dev->quirks & UVC_QUIRK_PRIVACY_DURING_STREAM)) { + uvc_gpio_quirk(dev, false); + init_val =3D false; + } else { + unit->gpio.gpio_ready =3D true; + + init_val =3D gpiod_get_value_cansleep(unit->gpio.gpio_privacy); + if (init_val < 0) { + free_irq(unit->gpio.irq, dev); + return init_val; + } + } + input_report_switch(dev->input, SW_CAMERA_LENS_COVER, init_val); input_sync(dev->input); =20 diff --git a/drivers/media/usb/uvc/uvc_video.c b/drivers/media/usb/uvc/uvc_= video.c index e00f38dd07d9..6efff8a7aca5 100644 --- a/drivers/media/usb/uvc/uvc_video.c +++ b/drivers/media/usb/uvc/uvc_video.c @@ -2296,6 +2296,8 @@ int uvc_video_start_streaming(struct uvc_streaming *s= tream) if (ret < 0) goto error_video; =20 + uvc_gpio_quirk(stream->dev, true); + return 0; =20 error_video: @@ -2308,6 +2310,8 @@ int uvc_video_start_streaming(struct uvc_streaming *s= tream) =20 void uvc_video_stop_streaming(struct uvc_streaming *stream) { + uvc_gpio_quirk(stream->dev, false); + uvc_video_stop_transfer(stream, 1); =20 if (stream->intf->num_altsetting > 1) { diff --git a/drivers/media/usb/uvc/uvcvideo.h b/drivers/media/usb/uvc/uvcvi= deo.h index 6002f1c43b69..1a784fb76ed7 100644 --- a/drivers/media/usb/uvc/uvcvideo.h +++ b/drivers/media/usb/uvc/uvcvideo.h @@ -77,6 +77,7 @@ #define UVC_QUIRK_NO_RESET_RESUME 0x00004000 #define UVC_QUIRK_DISABLE_AUTOSUSPEND 0x00008000 #define UVC_QUIRK_INVALID_DEVICE_SOF 0x00010000 +#define UVC_QUIRK_PRIVACY_DURING_STREAM 0x00020000 =20 /* Format flags */ #define UVC_FMT_FLAG_COMPRESSED 0x00000001 @@ -233,6 +234,7 @@ struct uvc_entity { struct uvc_gpio { int irq; bool initialized; + bool gpio_ready; struct gpio_desc *gpio_privacy; } gpio; }; @@ -819,10 +821,12 @@ size_t uvc_video_stats_dump(struct uvc_streaming *str= eam, char *buf, int uvc_gpio_parse(struct uvc_device *dev); int uvc_gpio_init(struct uvc_device *dev); void uvc_gpio_deinit(struct uvc_device *dev); +void uvc_gpio_quirk(struct uvc_device *dev, bool stream_on); #else static inline int uvc_gpio_parse(struct uvc_device *dev) {return 0; } static inline int uvc_gpio_init(struct uvc_device *dev) {return 0; } static inline void uvc_gpio_deinit(struct uvc_device *dev) {}; +static inline void uvc_gpio_quirk(struct uvc_device *dev, bool stream_on) = {}; #endif =20 #endif --=20 2.47.0.338.g60cca15819-goog From nobody Sun Feb 8 08:19:34 2026 Received: from mail-ua1-f44.google.com (mail-ua1-f44.google.com [209.85.222.44]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CD3401CEAB4 for ; Mon, 25 Nov 2024 19:49:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.222.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1732564166; cv=none; b=d6nYWNxAz+P8i4Z6CmNpFvQPsVqPd5t33/GWsypcKhmpdpVVReV+9nSMPBl/9wmv8ULoE3wdIkdFEg5I5a+LJC4GFs6BId61htnhouXesy/rSVLkPdFfKdbwMc4hfz8mDfTfrPFuFB4drk1v8NVTtPFs///BG4XHMbyh1RJKz1g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1732564166; c=relaxed/simple; bh=LJwMS6MJ8Ltz6IYWDIRFRnplCJ9F2eVGdbiFdyt/WMc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=SYtiWHK0gxLFg2AXgOyZN7odYOB0joG9j9+JBjUsZbwi5xjutEAL0ZyBoc6tArHbze3Uvad9ixP8vfXkcLuuF/lb2fBEXRmhx8DChCrv6N9LUbTsBu1n8hxxm0gi9uLWq0jgDcQX342iW4gh4aTI0g5vzEj/88kCVq+KFEHifCQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=pass smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=VsyEFGDK; arc=none smtp.client-ip=209.85.222.44 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="VsyEFGDK" Received: by mail-ua1-f44.google.com with SMTP id a1e0cc1a2514c-85b07b8a1c3so531878241.1 for ; Mon, 25 Nov 2024 11:49:23 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1732564163; x=1733168963; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=ImPJuXy1q7OulXoOIZvimBy9/1LlGfl5z3fyGupJqII=; b=VsyEFGDKspaTWTQcfOwoAlPhZOoIt4lQUKhLuG23My9RK56hKRXoM4LETAJ40oRDiO DG+gHabGKWsvaxtNXNp3nugIzLC3f4/9Mq51DDwAvFqkK0NwYpRYVModibUJUj1jij+b qEYTKD0/zMLAPr5UoVCNTt2Qj381DQYJgG70g= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1732564163; x=1733168963; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=ImPJuXy1q7OulXoOIZvimBy9/1LlGfl5z3fyGupJqII=; b=Sld9qZ32k/M9AiVdhRa9LJjZq1MZBDBayA7vzOsfQRCPVW74XvhuYL35jfNb4OvXgW QSaApWjSlFAEqN1B2hCIUUkLjDI2djljUwC7mu4Wdt0kWRMtOMC/zPdAGmigUI/reILk GUeUhJKE7Lq5R4eDktj1XEsY0H/vI8JlhDnRABQHjo/rtW+mVDsPUBkSQxAzqNmlDsFX oODwbE2F3UowLuagq6ddx8TtYQRhDV3ikOe9qgWdwNaEOvHq/f6ixvqCK18zhElOFwgz Nbx5hTOCtddO8NOvWosRnTk9VDns0fy+IjBdMkyimg2ANRGGOunXZcW71n9VE13zSjTg HPiw== X-Gm-Message-State: AOJu0YyHCwgccOeXbolKFCqreu578H4tCDr5g/Mra0NwF3TDC8Mqrva4 /pQA4U3BXM1pl7ZvHaRPtiwDHXdQlkPb56L3MGWZK8xeOPRukl0qi2ES4KdSMA== X-Gm-Gg: ASbGncujCCFFlGtvCAce2iO3SM0mQ14UJNaL9bgkCTUCgSQq2YIg8PLcRl+jMPrdR9B 4t++GA2toT1gVPzqPkF+hIWyVQLZVFXu9wfCDlVqacsYbLvOdgE4iADGmOv1OmmfkEh/k0I3jaB RmHhDz1yWNqawEr3MxC5c+J4OM9+4vshDwp2wTySNqKqUJT9sJW9dOQBo9JqBU+Iz0EQrDQ917w GcYBiS5r0+/8Nym/D3kT6tPuY8j/tGKZTKfAM+DygWnKS51/UEwpI/HIBiYvHrqRL+cxVmsWsG+ 7dAGzbLqEJcfmFniwMU26EvH X-Google-Smtp-Source: AGHT+IGmPA/X88hhCinX2JdfqBivCFQ7s6RNh6d830PSDJ9V+HQ4CIYEu7z7dwlCqNiOvRpEMNaIpQ== X-Received: by 2002:a05:6102:3749:b0:4af:958:97d5 with SMTP id ada2fe7eead31-4af0958989bmr7687165137.25.1732564162778; Mon, 25 Nov 2024 11:49:22 -0800 (PST) Received: from denia.c.googlers.com (5.236.236.35.bc.googleusercontent.com. [35.236.236.5]) by smtp.gmail.com with ESMTPSA id ada2fe7eead31-4af358d2f9asm75324137.23.2024.11.25.11.49.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 25 Nov 2024 11:49:21 -0800 (PST) From: Ricardo Ribalda Date: Mon, 25 Nov 2024 19:49:11 +0000 Subject: [PATCH v4 6/7] media: uvcvideo: Make gpio_unit entity-less Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20241125-uvc-subdev-v4-6-51e040599f1a@chromium.org> References: <20241125-uvc-subdev-v4-0-51e040599f1a@chromium.org> In-Reply-To: <20241125-uvc-subdev-v4-0-51e040599f1a@chromium.org> To: Laurent Pinchart , Mauro Carvalho Chehab , Sakari Ailus Cc: linux-kernel@vger.kernel.org, linux-media@vger.kernel.org, Yunke Cao , Hans Verkuil , Hans de Goede , Ricardo Ribalda X-Mailer: b4 0.13.0 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 --- drivers/media/usb/uvc/uvc_driver.c | 7 ------- drivers/media/usb/uvc/uvc_gpio.c | 40 ++++++++++++++--------------------= ---- drivers/media/usb/uvc/uvc_status.c | 4 ++-- drivers/media/usb/uvc/uvcvideo.h | 2 +- 4 files changed, 18 insertions(+), 35 deletions(-) diff --git a/drivers/media/usb/uvc/uvc_driver.c b/drivers/media/usb/uvc/uvc= _driver.c index c34bfadce60c..ec07c74a5d26 100644 --- a/drivers/media/usb/uvc/uvc_driver.c +++ b/drivers/media/usb/uvc/uvc_driver.c @@ -1750,13 +1750,6 @@ static int uvc_scan_device(struct uvc_device *dev) return -1; } =20 - /* Add GPIO entity to the first chain. */ - if (dev->gpio_unit) { - chain =3D list_first_entry(&dev->chains, - struct uvc_video_chain, list); - list_add_tail(&dev->gpio_unit->chain, &chain->entities); - } - return 0; } =20 diff --git a/drivers/media/usb/uvc/uvc_gpio.c b/drivers/media/usb/uvc/uvc_g= pio.c index e6fe1845bd01..ad3716d0cf56 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 =3D data; - struct uvc_gpio *uvc_gpio =3D &dev->gpio_unit->gpio; + struct uvc_gpio *uvc_gpio =3D &dev->gpio_unit; int new_val; =20 if (!uvc_gpio->gpio_ready) @@ -51,7 +51,6 @@ static const struct dmi_system_id privacy_valid_during_st= reamon[] =3D { int uvc_gpio_parse(struct uvc_device *dev) { struct gpio_desc *gpio_privacy; - struct uvc_entity *unit; int irq; =20 gpio_privacy =3D devm_gpiod_get_optional(&dev->intf->dev, "privacy", @@ -64,11 +63,6 @@ int uvc_gpio_parse(struct uvc_device *dev) return dev_err_probe(&dev->intf->dev, irq, "No IRQ for privacy GPIO\n"); =20 - unit =3D uvc_alloc_new_entity(dev, UVC_EXT_GPIO_UNIT, - UVC_EXT_GPIO_UNIT_ID, 0, 0); - if (IS_ERR(unit)) - return PTR_ERR(unit); - /* * Note: This quirk will not match external UVC cameras, * as they will not have the corresponding ACPI GPIO entity. @@ -76,38 +70,33 @@ int uvc_gpio_parse(struct uvc_device *dev) if (dmi_check_system(privacy_valid_during_streamon)) dev->quirks |=3D UVC_QUIRK_PRIVACY_DURING_STREAM; else - unit->gpio.gpio_ready =3D true; - - unit->gpio.gpio_privacy =3D gpio_privacy; - unit->gpio.irq =3D irq; - strscpy(unit->name, "GPIO", sizeof(unit->name)); - list_add_tail(&unit->list, &dev->entities); + dev->gpio_unit.gpio_ready =3D true; =20 - dev->gpio_unit =3D unit; + dev->gpio_unit.gpio_privacy =3D gpio_privacy; + dev->gpio_unit.irq =3D irq; =20 return 0; } =20 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; =20 - dev->gpio_unit->gpio.gpio_ready =3D stream_on; + dev->gpio_unit.gpio_ready =3D stream_on; if (stream_on) uvc_gpio_irq(0, dev); } =20 int uvc_gpio_init(struct uvc_device *dev) { - struct uvc_entity *unit =3D dev->gpio_unit; int init_val; int ret; =20 - if (!unit || unit->gpio.irq < 0) + if (!dev->gpio_unit.gpio_privacy) return 0; =20 - ret =3D request_threaded_irq(unit->gpio.irq, NULL, uvc_gpio_irq, + ret =3D request_threaded_irq(dev->gpio_unit.irq, NULL, uvc_gpio_irq, IRQF_ONESHOT | IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING, "uvc_privacy_gpio", dev); @@ -118,11 +107,12 @@ int uvc_gpio_init(struct uvc_device *dev) uvc_gpio_quirk(dev, false); init_val =3D false; } else { - unit->gpio.gpio_ready =3D true; + dev->gpio_unit.gpio_ready =3D true; =20 - init_val =3D gpiod_get_value_cansleep(unit->gpio.gpio_privacy); + init_val =3D + 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; } } @@ -130,15 +120,15 @@ int uvc_gpio_init(struct uvc_device *dev) input_report_switch(dev->input, SW_CAMERA_LENS_COVER, init_val); input_sync(dev->input); =20 - unit->gpio.initialized =3D true; + dev->gpio_unit.initialized =3D true; =20 return 0; } =20 void uvc_gpio_deinit(struct uvc_device *dev) { - if (!dev->gpio_unit || !dev->gpio_unit->gpio.initialized) + if (!dev->gpio_unit.initialized) return; =20 - 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 319f472213f6..e5ebac1e7093 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; =20 - if (!uvc_input_has_button(dev) && !dev->gpio_unit) + if (!uvc_input_has_button(dev) && !dev->gpio_unit.gpio_privacy) return 0; =20 input =3D input_allocate_device(); @@ -64,7 +64,7 @@ static int uvc_input_init(struct uvc_device *dev) __set_bit(KEY_CAMERA, input->keybit); } =20 - 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/uvcvi= deo.h index 1a784fb76ed7..642449acce1c 100644 --- a/drivers/media/usb/uvc/uvcvideo.h +++ b/drivers/media/usb/uvc/uvcvideo.h @@ -596,7 +596,7 @@ struct uvc_device { const void *data; } async_ctrl; =20 - struct uvc_entity *gpio_unit; + struct uvc_gpio gpio_unit; }; =20 enum uvc_handle_state { --=20 2.47.0.338.g60cca15819-goog From nobody Sun Feb 8 08:19:34 2026 Received: from mail-vk1-f172.google.com (mail-vk1-f172.google.com [209.85.221.172]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id EFDEE1C1F13 for ; Mon, 25 Nov 2024 19:49:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1732564168; cv=none; b=GNeOlG5UFwL+YclGJSlR5XJ5jUzf0aWINUqUadbVY9S3f99Ktb9LPdU0cbWYjx98UvHjkyAiAukfHZgUE7MqL4s1E5FSlsxIL+gY23thcNkbZ+Qgn9P1hcxaEnorc8KErFpcP9TUY+xqvNRsJ/q9EVAj9M998nevrlzAMfURULA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1732564168; c=relaxed/simple; bh=cEG8q7JwIhfvSJZ4SLtfR3SIICXk8+dsAPReT7UVOHs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=F1QvwDXtwi8rWo+91wTWWg4Qkm7BFUvHDUBxaBISlvSix1LHpaKOtWWpec5Mce9XETw1WoiIb1w6/J6EkHbVbN8loLtEig9slyaWvmDmWxcEybaMcPj0xoQDFWN4QAF8J+x2AuHiRcjAFZoLUnVkwuTEkTgQ8YEvQWvZxCv2C0A= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=pass smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=LonaoS9m; arc=none smtp.client-ip=209.85.221.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="LonaoS9m" Received: by mail-vk1-f172.google.com with SMTP id 71dfb90a1353d-5150f63db70so1001186e0c.3 for ; Mon, 25 Nov 2024 11:49:25 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1732564165; x=1733168965; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=8yziQfukfCQ8tCuWUmt6FHkDaKYe54QyufD5J4OTJbE=; b=LonaoS9mJNf9HZmb5t/xbnLohI8N62UTwKaPUyhrpk/dIkASY/3bFpS0E8ryTwv//k ctDppn/CXRQHs5OE2CABJrREwfS6h8KeDiqINB+0Z0QCRiFSSKniJInAUzGuZwvFTxfy YHO6Tv0wlUbT5Pdt7dIbJgQbQtWR4y3h1wBc8= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1732564165; x=1733168965; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=8yziQfukfCQ8tCuWUmt6FHkDaKYe54QyufD5J4OTJbE=; b=wPBXcC1Q3tfYKdgNo84n/LlzTfjTcubRcNvGQBaoINKUP0O6lZnFwfPFu1VLIJXoWs 24/i9ibZZPriHNxFV4xJOPnvCKzFe/H78+cM9mA3YLgG1dnCH/5HxJo3Jwwo9TQIcjQA 9FfNl9fR2u1eCmReidOBlCQaxBcVLE+WhdrGhMPyJMHnGAk1sCWkgmYRWfYUPEJWXBIE n8Af7PFfR7HCXtyZRwW3jlgzVYqLLSueUNIuLxwTRwgPm6fcDSzifZ7y9tVvRUYEZAoh T3koSH7EzewBpcxI7q4mgPNdvpqY3OY0BE3YOP3hUjHU+E2N5kkB/tvwq9PiMuO53kzZ FeGQ== X-Gm-Message-State: AOJu0Yw9aSTP1yTfmc4qR8+rRcEMNlLghaN1CGP3tOzKOG4sta5VHxI+ LJo3J6CM5xSEgdkkbxCuaHcvG2A2cBfPrZNXj+hyDzY6U4hXi5xuXrhTsiMEgA== X-Gm-Gg: ASbGncsur3s1BAC4X8sU8+6/gkyUc6gILs044VNM5AjtfyZk+Bc/pdXdIRai3fBJfwu 58Yh9sVNSkDuCsWAUwEvkUG2ENAh1G/ASZYqqvp9wGuBcC8BYS5iQXkKAxLvyl5Hks33OYKFPJQ yNiwL6Hv1AGshSqxUfpAEg93/zCZAyi0a0dvuIv+jfRRESvwubrkfOamncTiMlQ25Mosg6MZDr7 ZenOXjXxlsnO/47Xm6qlcB8g/Wj+E74jj+9XawXVn1Kp33XHVxSbQ5Tv3kLXFyVpoYFo1Muz4m5 To8W6pBGOYXVnbSD2VlF+yJD X-Google-Smtp-Source: AGHT+IEgALvAdijAkIcRetk4zuNBzVe1drnMtsw5mI5v64sMgDPBNw61u2gMURnGyFwCjHjpcK36EQ== X-Received: by 2002:a05:6102:522:b0:4a4:97d1:aea0 with SMTP id ada2fe7eead31-4addcbefa12mr12046094137.11.1732564164881; Mon, 25 Nov 2024 11:49:24 -0800 (PST) Received: from denia.c.googlers.com (5.236.236.35.bc.googleusercontent.com. [35.236.236.5]) by smtp.gmail.com with ESMTPSA id ada2fe7eead31-4af358d2f9asm75324137.23.2024.11.25.11.49.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 25 Nov 2024 11:49:23 -0800 (PST) From: Ricardo Ribalda Date: Mon, 25 Nov 2024 19:49:12 +0000 Subject: [PATCH v4 7/7] media: uvcvideo: Remove UVC_EXT_GPIO entity Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20241125-uvc-subdev-v4-7-51e040599f1a@chromium.org> References: <20241125-uvc-subdev-v4-0-51e040599f1a@chromium.org> In-Reply-To: <20241125-uvc-subdev-v4-0-51e040599f1a@chromium.org> To: Laurent Pinchart , Mauro Carvalho Chehab , Sakari Ailus Cc: linux-kernel@vger.kernel.org, linux-media@vger.kernel.org, Yunke Cao , Hans Verkuil , Hans de Goede , Ricardo Ribalda X-Mailer: b4 0.13.0 The only implementation of this entity was the external privacy gpio, which now does not require to emulate an entity. Remove all the dead code. Signed-off-by: Ricardo Ribalda --- drivers/media/usb/uvc/uvc_driver.c | 4 ---- drivers/media/usb/uvc/uvc_entity.c | 1 - drivers/media/usb/uvc/uvcvideo.h | 20 +++++++------------- 3 files changed, 7 insertions(+), 18 deletions(-) diff --git a/drivers/media/usb/uvc/uvc_driver.c b/drivers/media/usb/uvc/uvc= _driver.c index ec07c74a5d26..936225c89182 100644 --- a/drivers/media/usb/uvc/uvc_driver.c +++ b/drivers/media/usb/uvc/uvc_driver.c @@ -769,7 +769,6 @@ static int uvc_parse_streaming(struct uvc_device *dev, } =20 static const u8 uvc_camera_guid[16] =3D UVC_GUID_UVC_CAMERA; -static const u8 uvc_gpio_guid[16] =3D UVC_GUID_EXT_GPIO_CONTROLLER; static const u8 uvc_media_transport_input_guid[16] =3D UVC_GUID_UVC_MEDIA_TRANSPORT_INPUT; static const u8 uvc_processing_guid[16] =3D UVC_GUID_UVC_PROCESSING; @@ -814,9 +813,6 @@ struct uvc_entity *uvc_alloc_new_entity(struct uvc_devi= ce *dev, u16 type, * is initialized by the caller. */ switch (type) { - case UVC_EXT_GPIO_UNIT: - memcpy(entity->guid, uvc_gpio_guid, 16); - break; case UVC_ITT_CAMERA: memcpy(entity->guid, uvc_camera_guid, 16); break; diff --git a/drivers/media/usb/uvc/uvc_entity.c b/drivers/media/usb/uvc/uvc= _entity.c index c1b69f9eaa56..36121b111ed5 100644 --- a/drivers/media/usb/uvc/uvc_entity.c +++ b/drivers/media/usb/uvc/uvc_entity.c @@ -111,7 +111,6 @@ static int uvc_mc_init_entity(struct uvc_video_chain *c= hain, case UVC_OTT_DISPLAY: case UVC_OTT_MEDIA_TRANSPORT_OUTPUT: case UVC_EXTERNAL_VENDOR_SPECIFIC: - case UVC_EXT_GPIO_UNIT: default: function =3D MEDIA_ENT_F_V4L2_SUBDEV_UNKNOWN; break; diff --git a/drivers/media/usb/uvc/uvcvideo.h b/drivers/media/usb/uvc/uvcvi= deo.h index 642449acce1c..5dd9ec1668e6 100644 --- a/drivers/media/usb/uvc/uvcvideo.h +++ b/drivers/media/usb/uvc/uvcvideo.h @@ -39,9 +39,6 @@ (UVC_ENTITY_IS_TERM(entity) && \ ((entity)->type & 0x8000) =3D=3D UVC_TERM_OUTPUT) =20 -#define UVC_EXT_GPIO_UNIT 0x7ffe -#define UVC_EXT_GPIO_UNIT_ID 0x100 - /* ------------------------------------------------------------------------ * Driver specific constants. */ @@ -180,8 +177,7 @@ struct uvc_entity { =20 /* * Entities exposed by the UVC device use IDs 0-255, extra entities - * implemented by the driver (such as the GPIO entity) use IDs 256 and - * up. + * implemented by the driver use IDs 256 and up. */ u16 id; u16 type; @@ -230,13 +226,6 @@ struct uvc_entity { u8 *bmControls; u8 *bmControlsType; } extension; - - struct uvc_gpio { - int irq; - bool initialized; - bool gpio_ready; - struct gpio_desc *gpio_privacy; - } gpio; }; =20 u8 bNrInPins; @@ -596,7 +585,12 @@ struct uvc_device { const void *data; } async_ctrl; =20 - struct uvc_gpio gpio_unit; + struct uvc_gpio { + int irq; + bool initialized; + bool gpio_ready; + struct gpio_desc *gpio_privacy; + } gpio_unit; }; =20 enum uvc_handle_state { --=20 2.47.0.338.g60cca15819-goog