From nobody Wed Feb 11 08:13:46 2026 Received: from mail-lf1-f45.google.com (mail-lf1-f45.google.com [209.85.167.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 AB1B6218587 for ; Mon, 2 Jun 2025 13:06:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.45 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748869583; cv=none; b=kYlXlJYMg1cAdxyT8ehypuISskhZiksaWSuOfMeLuhMMTCqQftiWv/hd2Ixn2SFHxJ1ZBnpUNtV+n5zTQe1+Mb5hO6lmK1EgqKqJiAspInh/YT9JoieTnNA8Eb+/9PAqsMvSAfUzW8lCrA9xxrQcbFWMP04lEhBWlQ4jcsdWzAk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748869583; c=relaxed/simple; bh=GiBxw+zm//U/C+YTQyovbdu6MSyJ+bZDAcgLx/2Kbzg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=aNx8XL823E18qcRwvWVicR1JmMPae4yNMuWgA5AsWcBkFzMnKid/dfVCuQraVhKg3TTSdpS93e7A6st740EMUUsFTl0r8EP1SP3p7Tzo9ol66PADoIv13WEP5kBFeGoMt55o+t47mAdNuBcvdq6BRbtQT23E9V0nGAIxV8qo2aw= 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=SqF2Bqem; arc=none smtp.client-ip=209.85.167.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="SqF2Bqem" Received: by mail-lf1-f45.google.com with SMTP id 2adb3069b0e04-55342bca34eso2030102e87.2 for ; Mon, 02 Jun 2025 06:06:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1748869580; x=1749474380; 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=B3ix9DwpCMClF3M2JTkGqryLw82zMUUM9JySNSXWuyo=; b=SqF2BqemjlN3PyEv+6ysEqgBcANAIwdMs0x3RpDqVYrDPAv+yzO4nu5+xkZ664Q30h bDkGpGj0AnUENr/kC8EYkqk8Cy4iYOFkD9WgKafKH7HPKwzJKXZdS4kLzI0hyeXZEj+M 1xaXJZg7ar+y0PgitAHvnZLLFSJBWm6UjNaNU= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1748869580; x=1749474380; 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=B3ix9DwpCMClF3M2JTkGqryLw82zMUUM9JySNSXWuyo=; b=tJ70qlbV2s606gMSF+X5BYcHzBm30Ef6Po+t4pNds6ROLYGltk+9pGGGYmNwN5pW+T 2F8bkYIaBWrqGsVb6rHtvXKCTrCwMTkufmjsL+4iKdUHnIbLKLkCYHDFsDh+dmAiVosK nIecz9vKsIEizaB9mBs7ENuYYqPd78O0XZXSKcOLNXNJcs2Jf2W/uQCBgXesHxPmqUoz SHZgHN+j64iiwZ/jpHmvNVt2/YBybd7Rjj5Gq+Lr45ICCG9tuMFZTYHFT1lAg2TTKM7T YHCBttjIHwcnt3no0g1wJg8rQtsuIXC3w+Ha4D5R0GzH22YJ9srjRBOcRBiCnDCvbVK2 WzRQ== X-Forwarded-Encrypted: i=1; AJvYcCVwR1TMDmu9qTLTw3iiTbWWGt7EbKKphtInp7Z3BfBaCmWp6tWhqOje0kTjVLL7QjK+KJiLoPi8idCIn08=@vger.kernel.org X-Gm-Message-State: AOJu0Yzgd7HqbBsAAdZd/3mE4J8pbs+7iSJ7Whbce1CC4iLJbcwU6zAW DFrwlOxDw1aFqpqdUA5HYD2NrOvBZG1YEnlM9lVFfIY7WthW0WNGfl/ZkSbBm8fY47FwiUcTl6y rOJI= X-Gm-Gg: ASbGnct5HseL7pbSKQ9lVhDt8t2ICVfIkE1zv8JKjIF4Dyjvn1N4A7eD9BQaTo/hdVG VMmU+GfJ5lHubx/4jhqCKBp2LDpxkkZWZIAxIRt8qOUD4F5HJ/gntt1m5+5rKgQ1bTTRpGMgGWk /6+7tFS7YYShJ+ege6Enx/5mdtLfAm5YCuuTMebV+OEvaUjLWG+HJmgPSz84hL/mAK8k+XHVAHQ KwctDoGm+r6NC80NjS8P1LOJGhcQxMp+mvZj5SYwDxcWb3uALmKfLOxNxeqMg6VcWOOc5K7cA9Y mYdiuxVY9QmwOyOdUURWcai9QsnDZnBWbc97H6Kf2b2XphcTmf3VSwhcd+C7TFZ+ynjLrD1n0X2 tX9dvqG41+PhXig67IydLcoDamg== X-Google-Smtp-Source: AGHT+IHaaeE2s/cM26BtGjZ20Lo2h4M+xB/fRejUpWThG9ibDbgdLRLCR7Fm2kvuEswuI/eNsNuKXw== X-Received: by 2002:a05:6512:1103:b0:553:2cc1:2bb3 with SMTP id 2adb3069b0e04-55342f9276bmr2219289e87.36.1748869579468; Mon, 02 Jun 2025 06:06:19 -0700 (PDT) Received: from ribalda.c.googlers.com (90.52.88.34.bc.googleusercontent.com. [34.88.52.90]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-5533787d26esm1590160e87.41.2025.06.02.06.06.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Jun 2025 06:06:17 -0700 (PDT) From: Ricardo Ribalda Date: Mon, 02 Jun 2025 13:06:13 +0000 Subject: [PATCH v2 1/9] media: uvcvideo: Refactor uvc_queue_streamon 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: <20250602-uvc-grannular-invert-v2-1-c871934ad880@chromium.org> References: <20250602-uvc-grannular-invert-v2-0-c871934ad880@chromium.org> In-Reply-To: <20250602-uvc-grannular-invert-v2-0-c871934ad880@chromium.org> To: Laurent Pinchart , Hans de Goede , Mauro Carvalho Chehab , Hans Verkuil Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Ricardo Ribalda X-Mailer: b4 0.14.2 Do uvc_pm_get before we call uvc_queue_streamon. Although the current code is correct, uvc_ioctl_streamon is allways called after uvc_pm_get, this change makes the code more resiliant to future changes. Suggested-by: Laurent Pinchart Signed-off-by: Ricardo Ribalda Reviewed-by: Laurent Pinchart Link: https://lore.kernel.org/r/20250509-uvc-followup-v1-2-73bcde30d2b5@chr= omium.org Signed-off-by: Laurent Pinchart --- drivers/media/usb/uvc/uvc_v4l2.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/drivers/media/usb/uvc/uvc_v4l2.c b/drivers/media/usb/uvc/uvc_v= 4l2.c index 668a4e9d772c6d91f045ca75e2744b3a6c69da6b..862b4e34e5b629cf324479a9bb5= 9ebe8784ccd5d 100644 --- a/drivers/media/usb/uvc/uvc_v4l2.c +++ b/drivers/media/usb/uvc/uvc_v4l2.c @@ -853,15 +853,16 @@ static int uvc_ioctl_streamon(struct file *file, void= *fh, if (handle->is_streaming) return 0; =20 - ret =3D uvc_queue_streamon(&stream->queue, type); + ret =3D uvc_pm_get(stream->dev); if (ret) return ret; =20 - ret =3D uvc_pm_get(stream->dev); + ret =3D uvc_queue_streamon(&stream->queue, type); if (ret) { - uvc_queue_streamoff(&stream->queue, type); + uvc_pm_put(stream->dev); return ret; } + handle->is_streaming =3D true; =20 return 0; --=20 2.49.0.1266.g31b7d2e469-goog From nobody Wed Feb 11 08:13:46 2026 Received: from mail-lf1-f42.google.com (mail-lf1-f42.google.com [209.85.167.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 753A721C9F8 for ; Mon, 2 Jun 2025 13:06:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.42 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748869586; cv=none; b=hamxkD4AB6vetmZvM+RRGN8KvQia7TA4BV7/DTXYJvAPC6WPMatNkaGLIvWlAW/gOqJYsQgIVGGZ0hbuK5DVRCfuAQU36gwle4sYmIbx7jkX6MIKYhcfOspoXShVvsTvkz0VxzLEElN4n1Rbv9uPZYnxkPbNgioxjmYaDysO5Hw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748869586; c=relaxed/simple; bh=B0jNGSufNvPJuCam1LbtuPADRfe/FotYKW4NrWm/oXQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=C/wID6o3F2SH0cWnWkPPF3UkyDGgXKaR69DC1d1EJfJtSC2UTWqOrGxDVlqd+LYaHoLyGS3WUWe++ky73T9xaSKlUbeUfsRfKZu5suTaCf6HXg4AWAbwY3ovbo/o5ZqHmrNB9vkpKAW37EAWGd95lIKTNbwNK9oU3Xe334S8IXY= 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=NFMry7eB; arc=none smtp.client-ip=209.85.167.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="NFMry7eB" Received: by mail-lf1-f42.google.com with SMTP id 2adb3069b0e04-552206ac67aso4945660e87.2 for ; Mon, 02 Jun 2025 06:06:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1748869582; x=1749474382; 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=ZuqigEavLUIFRcdMGWtAXF6BHoROJfpc2OWkY3rCm9o=; b=NFMry7eB4quU+U/sDxCTUOFwUd9gMeCrCsLaSwOt3jDQxkfe1qna/ZEeruxb95TK92 Q/n57AfXYRka3bOOkGlYEsW5PNHQLLIf+ECF9DRTP+TC9cPDliFT5sF//9MeOFAxsNUm E7AHgabTfrlrrUjcyyzoE8xBGT6EBg0WYgX9I= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1748869582; x=1749474382; 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=ZuqigEavLUIFRcdMGWtAXF6BHoROJfpc2OWkY3rCm9o=; b=FtgHAN6hZ28CCg2GhQNB+ODDcWiC7N609ADJG8glZF2dbtwKcMJ70ucCT4n71DyQxI FPVEkzpjYq1PfFek7mChA9qEtrF1gyjJXzocQvXVmmgtFduKqIq2dxKAnoEhZBFnGCjH nbh+mq8QEv/y1aBGXE6swcRpyT7A8UKl3y/cHHPvSKDLwVNWvzD/coWLUKtf3OqreH6d Wt+ekVdP7eNeEaOQSOG/skTBHmyiab9uNs/A3bXrBYshivZnkpYKVloPAL5/ad4EgP8m 5abPbXB2k5MrIFSnv2BfU9AQy8bXoRdZIdx7eEB3UZuaUaDRU5tquDzH+tGo0DcsrQ3K TKcQ== X-Forwarded-Encrypted: i=1; AJvYcCVN3bWUHPAvub8+vI9jicRRhzQDYoTlKvGcegEVdVeqrd9Eu/QTpKF07hoSERokCcQ0237XcxbAXmG8sYg=@vger.kernel.org X-Gm-Message-State: AOJu0YzWiPOvVYTI3VSEaZLw7NIhlEb/5eNH65De140qsdxOiBwxLHU+ kygUZEXi5WiOgy2x2LPgWYMiZ5nOGfq2PXm4bROX0FGnO/ipvG2e9KH881ZxYXPk/Q== X-Gm-Gg: ASbGncvwyPi4skzwOhcymdoUEYG+BQHyKABELCeUtFSTOGjN9HvflOwYhWm+FNIXgh+ m7PBK4xwskYW9L+/YCju2fJOwmhgruIjB9EEvtOX+uYFjUDHwx+k5Vuo3Yo5iLoNQPi0VcamE0S k1mqYT64Dd711s5/y9b7+sJGFypXL56g7mIHVMHj3b0jvghsGKVr+zD/0HHMunm8XL1F4ZB8yQD WjP2u72GixOsxqGdXHMeMj4jouyMnB7huDbC4bV6+2aYHG0dcaLyzNDHC5yAS4Ive9cr+sVMPu0 JHD8l1XlcYoAk5tgzVtSLqPo6rsXlw3cY/5rAx1jr+A+UMrRh0UwXrFlVWvbIObqp4hfYnw4ei2 2M7ii+zxXIgsdiIzUPpRhSN3Clw== X-Google-Smtp-Source: AGHT+IHMoONe8Ln9wE6PiwlQI0iQHuL4cC9FaE/WPx3vc4gsLClIVg9hP9Y5j+IWRY92Ncews+799A== X-Received: by 2002:ac2:4c46:0:b0:553:3432:33ac with SMTP id 2adb3069b0e04-5533d1b7683mr4006496e87.43.1748869582193; Mon, 02 Jun 2025 06:06:22 -0700 (PDT) Received: from ribalda.c.googlers.com (90.52.88.34.bc.googleusercontent.com. [34.88.52.90]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-5533787d26esm1590160e87.41.2025.06.02.06.06.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Jun 2025 06:06:20 -0700 (PDT) From: Ricardo Ribalda Date: Mon, 02 Jun 2025 13:06:14 +0000 Subject: [PATCH v2 2/9] media: uvcvideo: Refactor uvc_v4l2_compat_ioctl32 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: <20250602-uvc-grannular-invert-v2-2-c871934ad880@chromium.org> References: <20250602-uvc-grannular-invert-v2-0-c871934ad880@chromium.org> In-Reply-To: <20250602-uvc-grannular-invert-v2-0-c871934ad880@chromium.org> To: Laurent Pinchart , Hans de Goede , Mauro Carvalho Chehab , Hans Verkuil Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Ricardo Ribalda X-Mailer: b4 0.14.2 Declaring a variable for doing automatic cleanup is not a very common pattern. Replace the cleanup macro with manual cleanup to make the code simpler. Suggested-by: Laurent Pinchart Signed-off-by: Ricardo Ribalda Reviewed-by: Laurent Pinchart Link: https://lore.kernel.org/r/20250509-uvc-followup-v1-3-73bcde30d2b5@chr= omium.org Signed-off-by: Laurent Pinchart --- drivers/media/usb/uvc/uvc_v4l2.c | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/drivers/media/usb/uvc/uvc_v4l2.c b/drivers/media/usb/uvc/uvc_v= 4l2.c index 862b4e34e5b629cf324479a9bb59ebe8784ccd5d..1abdf1ea39956bbbadd3f166f37= bdac518068648 100644 --- a/drivers/media/usb/uvc/uvc_v4l2.c +++ b/drivers/media/usb/uvc/uvc_v4l2.c @@ -1382,11 +1382,9 @@ static int uvc_v4l2_put_xu_query(const struct uvc_xu= _control_query *kp, #define UVCIOC_CTRL_MAP32 _IOWR('u', 0x20, struct uvc_xu_control_mapping32) #define UVCIOC_CTRL_QUERY32 _IOWR('u', 0x21, struct uvc_xu_control_query32) =20 -DEFINE_FREE(uvc_pm_put, struct uvc_device *, if (_T) uvc_pm_put(_T)) static long uvc_v4l2_compat_ioctl32(struct file *file, unsigned int cmd, unsigned long arg) { - struct uvc_device *uvc_device __free(uvc_pm_put) =3D NULL; struct uvc_fh *handle =3D file->private_data; union { struct uvc_xu_control_mapping xmap; @@ -1399,38 +1397,38 @@ static long uvc_v4l2_compat_ioctl32(struct file *fi= le, if (ret) return ret; =20 - uvc_device =3D handle->stream->dev; - switch (cmd) { case UVCIOC_CTRL_MAP32: ret =3D uvc_v4l2_get_xu_mapping(&karg.xmap, up); if (ret) - return ret; + break; ret =3D uvc_ioctl_xu_ctrl_map(handle->chain, &karg.xmap); if (ret) - return ret; + break; ret =3D uvc_v4l2_put_xu_mapping(&karg.xmap, up); if (ret) - return ret; - + break; break; =20 case UVCIOC_CTRL_QUERY32: ret =3D uvc_v4l2_get_xu_query(&karg.xqry, up); if (ret) - return ret; + break; ret =3D uvc_xu_ctrl_query(handle->chain, &karg.xqry); if (ret) - return ret; + break; ret =3D uvc_v4l2_put_xu_query(&karg.xqry, up); if (ret) - return ret; + break; break; =20 default: - return -ENOIOCTLCMD; + ret =3D -ENOIOCTLCMD; + break; } =20 + uvc_pm_put(handle->stream->dev); + return ret; } #endif --=20 2.49.0.1266.g31b7d2e469-goog From nobody Wed Feb 11 08:13:46 2026 Received: from mail-lf1-f44.google.com (mail-lf1-f44.google.com [209.85.167.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 40C0E220F53 for ; Mon, 2 Jun 2025 13:06:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748869588; cv=none; b=CrosQpoY6y8CUdoetwcX93iLZz8pfVecupNTBzzz0i534pMKSNXyU36zzZcvNgURE3wfSIwkkq/a8XwbIEHwMJIty5uCRusljRrocE+9uc6IvP632Wb7hrq9se0Rg/dCCn6LFCm9Gi0kHOY3yOXWugJzXDcA41+Z0aEwEEpjfVE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748869588; c=relaxed/simple; bh=iE/ZOtCi0EQPjydh3vcLaipFeOpiQBQnCCEnbj8R9us=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=gz+D8DAZRBQKHVwPW9a7FuaJ9CLITPsk29Dewkrl+zvJnYE5V2e+ric4gwnBDT7tqQUqXv2Pdgn/9KsaeBF1EqbF9VZvvX/W4Mc1Vaez5dKHe0rzX2/KbButiBxlFbVjYngnWkwAo7T/3KzWZRlbl0QNL4sgPk4NryKTgWe2s+g= 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=UhDVjegE; arc=none smtp.client-ip=209.85.167.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="UhDVjegE" Received: by mail-lf1-f44.google.com with SMTP id 2adb3069b0e04-55324587a53so6122411e87.0 for ; Mon, 02 Jun 2025 06:06:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1748869584; x=1749474384; 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=GacbHcuHcLI+RlJzi4YfkPrO1I2/x0fi+cd2ZwcF0dE=; b=UhDVjegEbisrpi1nSPEbKvTqlOdjf4ZhVUJI4JUgGYJNGuc1lmbVNBsH+Qqy02SIGy 2ThpiOuVF9mBWySzoU+/23484syLl2OUWXEF5ywQIIqe/7+KxpOmk9nAADSs4T5edKHz o1G82COQUERNPYBcscKUWUJ7ZvBKvVTAadk6E= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1748869584; x=1749474384; 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=GacbHcuHcLI+RlJzi4YfkPrO1I2/x0fi+cd2ZwcF0dE=; b=Wl9jLvQjruYxtoy/02xCBrVNB1c9jeM3O7+nghsI2XEf2Tl4SlM4to5KAto7mYRZrd 3cLL5Hp/AFhQDp/FohNBy/8gA6XXOq2lyNhLTgUP/yLDEWDBnL7hdEh4Lhw/KskQQE8W sedk51fUd55ggA9MHjvCsnWLvGk5DdItBXuHSRpyKLTZBNRZiQhppi7+7BFG8/7bbssr lvg22+KcLLxrQr8SjCZWYrLSQeJ7YswTbbEHO8FkWdQsbpHXsFdVGBjZUfxqvn0l9dbI gf9Vw9rqaxMwprKDjJmHW2ku9liPpFszK7L35hKfjpLNsxhFlYC5HMaW83J3t1vwJgqY ZnMg== X-Forwarded-Encrypted: i=1; AJvYcCXN0g3bYQM+cgokQLckoqWniACDEhARVhQIrgRxzfHFfPZJd5olNQCYH+cxMyTJTtqwe06i3MXGMExLGC4=@vger.kernel.org X-Gm-Message-State: AOJu0Yzzw54/zfnFdMMvvRqrPbUZVyaI6XQm5EwFID0KRYagpU2BufXC FlOc73MnwXQwjPv3xhhnG/xguCEoWFvtz+ck5/ru144qzjNPO1eDucP7vN7JAjmStg== X-Gm-Gg: ASbGncv66FjP7zb4+rye1yS/xCRweRLczO0BMHtLI03YcU+cGvFWOPpLXrbMtuJZpOm z5zCHCh8CEO4uQzSZK9q8FYN3IjJiDPaQe37MAE8A50sc6Si1WIpUA3dEtAIjUFRekQpA9M3CVY E6drjwv1TZPn/dJ5nf/KTemtFLsvb55omCJvoEnC8QFazm1OizhyWbjNHUlM1QqSRqnJiNS8RZW aVYjr9ymaY9+8EeXRC4BPp9IqXdKd8228DYyZzLEK1yNHsMzkAQHXgqd3QtFcM1iBc9ozfQVLwZ 7Jo1HAi45CsMKNDFUQRKkHfSxgG8SmFq+hzErajB7gGbV5BEPF7e7tUd2p5NXT542Lj7E1EIyue qzHzQmcBALcyTA0BV5m3RIpsDwA== X-Google-Smtp-Source: AGHT+IGsfjRHT1dHPeRqHvxVei2+qylw3P6AbJOdAtEzAX314r2vCuAjUq5G2XZU3gcrnVKVdO+oTQ== X-Received: by 2002:a05:6512:b1c:b0:553:3201:8d23 with SMTP id 2adb3069b0e04-55335b11511mr5337155e87.9.1748869584014; Mon, 02 Jun 2025 06:06:24 -0700 (PDT) Received: from ribalda.c.googlers.com (90.52.88.34.bc.googleusercontent.com. [34.88.52.90]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-5533787d26esm1590160e87.41.2025.06.02.06.06.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Jun 2025 06:06:22 -0700 (PDT) From: Ricardo Ribalda Date: Mon, 02 Jun 2025 13:06:15 +0000 Subject: [PATCH v2 3/9] media: uvcvideo: Use vb2 ioctl and fop helpers 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: <20250602-uvc-grannular-invert-v2-3-c871934ad880@chromium.org> References: <20250602-uvc-grannular-invert-v2-0-c871934ad880@chromium.org> In-Reply-To: <20250602-uvc-grannular-invert-v2-0-c871934ad880@chromium.org> To: Laurent Pinchart , Hans de Goede , Mauro Carvalho Chehab , Hans Verkuil Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Ricardo Ribalda , Hans Verkuil , Hans de Goede X-Mailer: b4 0.14.2 From: Hans Verkuil When uvc was written the vb2 ioctl and file operation helpers didn't exist. This patch switches uvc over to those helpers, which removes a lot of boilerplate code and simplifies VIDIOC_G/S_PRIORITY handling and allows us to drop the 'privileges' scheme, since that's now handled inside the vb2 helpers. This makes it possible for uvc to fix the v4l2-compliance streaming tests: warn: v4l2-test-formats.cpp(1075): Could not set fmt2 This patch introduces a change on behavior on the uvcdriver to be aligned with the rest of the subsystem. Now S_INPUT, S_PARM and S_FORMAT do no grant exclusive ownership of the device. Reviewed-by: Hans de Goede Reviewed-by: Hans Verkuil Signed-off-by: Hans Verkuil Co-developed-by: Ricardo Ribalda Signed-off-by: Ricardo Ribalda --- drivers/media/usb/uvc/uvc_driver.c | 34 +---- drivers/media/usb/uvc/uvc_metadata.c | 8 +- drivers/media/usb/uvc/uvc_queue.c | 143 -------------------- drivers/media/usb/uvc/uvc_v4l2.c | 251 +++----------------------------= ---- drivers/media/usb/uvc/uvcvideo.h | 37 +----- 5 files changed, 30 insertions(+), 443 deletions(-) diff --git a/drivers/media/usb/uvc/uvc_driver.c b/drivers/media/usb/uvc/uvc= _driver.c index da24a655ab68cc0957762f2b67387677c22224d1..4eeedab93b90939fc4c925012a1= 8b7d018ade39f 100644 --- a/drivers/media/usb/uvc/uvc_driver.c +++ b/drivers/media/usb/uvc/uvc_driver.c @@ -1725,7 +1725,6 @@ static struct uvc_video_chain *uvc_alloc_chain(struct= uvc_device *dev) INIT_LIST_HEAD(&chain->entities); mutex_init(&chain->ctrl_mutex); chain->dev =3D dev; - v4l2_prio_init(&chain->prio); =20 return chain; } @@ -1958,31 +1957,7 @@ static void uvc_unregister_video(struct uvc_device *= dev) if (!video_is_registered(&stream->vdev)) continue; =20 - /* - * For stream->vdev we follow the same logic as: - * vb2_video_unregister_device(). - */ - - /* 1. Take a reference to vdev */ - get_device(&stream->vdev.dev); - - /* 2. Ensure that no new ioctls can be called. */ - video_unregister_device(&stream->vdev); - - /* 3. Wait for old ioctls to finish. */ - mutex_lock(&stream->mutex); - - /* 4. Stop streaming. */ - uvc_queue_release(&stream->queue); - - mutex_unlock(&stream->mutex); - - put_device(&stream->vdev.dev); - - /* - * For stream->meta.vdev we can directly call: - * vb2_video_unregister_device(). - */ + vb2_video_unregister_device(&stream->vdev); vb2_video_unregister_device(&stream->meta.vdev); =20 /* @@ -2029,7 +2004,8 @@ int uvc_register_video_device(struct uvc_device *dev, vdev->fops =3D fops; vdev->ioctl_ops =3D ioctl_ops; vdev->release =3D uvc_release; - vdev->prio =3D &stream->chain->prio; + vdev->queue =3D &queue->queue; + vdev->lock =3D &queue->mutex; if (type =3D=3D V4L2_BUF_TYPE_VIDEO_OUTPUT) vdev->vfl_dir =3D VFL_DIR_TX; else @@ -2399,8 +2375,8 @@ static int __uvc_resume(struct usb_interface *intf, i= nt reset) if (stream->intf =3D=3D intf) { ret =3D uvc_video_resume(stream, reset); if (ret < 0) - uvc_queue_streamoff(&stream->queue, - stream->queue.queue.type); + vb2_streamoff(&stream->queue.queue, + stream->queue.queue.type); return ret; } } diff --git a/drivers/media/usb/uvc/uvc_metadata.c b/drivers/media/usb/uvc/u= vc_metadata.c index 82de7781f5b6b70c5ba16bcba9e0741231231904..d3aab22f91cea21aefc56409924= dfa1451aec914 100644 --- a/drivers/media/usb/uvc/uvc_metadata.c +++ b/drivers/media/usb/uvc/uvc_metadata.c @@ -96,7 +96,7 @@ static int uvc_meta_v4l2_set_format(struct file *file, vo= id *fh, */ mutex_lock(&stream->mutex); =20 - if (uvc_queue_allocated(&stream->queue)) + if (vb2_is_busy(&stream->meta.queue.queue)) ret =3D -EBUSY; else stream->meta.format =3D fmt->dataformat; @@ -164,12 +164,6 @@ int uvc_meta_register(struct uvc_streaming *stream) =20 stream->meta.format =3D V4L2_META_FMT_UVC; =20 - /* - * The video interface queue uses manual locking and thus does not set - * the queue pointer. Set it manually here. - */ - vdev->queue =3D &queue->queue; - return uvc_register_video_device(dev, stream, vdev, queue, V4L2_BUF_TYPE_META_CAPTURE, &uvc_meta_fops, &uvc_meta_ioctl_ops); diff --git a/drivers/media/usb/uvc/uvc_queue.c b/drivers/media/usb/uvc/uvc_= queue.c index 2ee142621042167c2587b6a6fdd51c1a46d31c11..72c5494dee9f46ff61072e7d293= bfaddda40e615 100644 --- a/drivers/media/usb/uvc/uvc_queue.c +++ b/drivers/media/usb/uvc/uvc_queue.c @@ -242,153 +242,10 @@ int uvc_queue_init(struct uvc_video_queue *queue, en= um v4l2_buf_type type) return 0; } =20 -void uvc_queue_release(struct uvc_video_queue *queue) -{ - mutex_lock(&queue->mutex); - vb2_queue_release(&queue->queue); - mutex_unlock(&queue->mutex); -} - -/* -----------------------------------------------------------------------= ------ - * V4L2 queue operations - */ - -int uvc_request_buffers(struct uvc_video_queue *queue, - struct v4l2_requestbuffers *rb) -{ - int ret; - - mutex_lock(&queue->mutex); - ret =3D vb2_reqbufs(&queue->queue, rb); - mutex_unlock(&queue->mutex); - - return ret ? ret : rb->count; -} - -int uvc_query_buffer(struct uvc_video_queue *queue, struct v4l2_buffer *bu= f) -{ - int ret; - - mutex_lock(&queue->mutex); - ret =3D vb2_querybuf(&queue->queue, buf); - mutex_unlock(&queue->mutex); - - return ret; -} - -int uvc_create_buffers(struct uvc_video_queue *queue, - struct v4l2_create_buffers *cb) -{ - int ret; - - mutex_lock(&queue->mutex); - ret =3D vb2_create_bufs(&queue->queue, cb); - mutex_unlock(&queue->mutex); - - return ret; -} - -int uvc_queue_buffer(struct uvc_video_queue *queue, - struct media_device *mdev, struct v4l2_buffer *buf) -{ - int ret; - - mutex_lock(&queue->mutex); - ret =3D vb2_qbuf(&queue->queue, mdev, buf); - mutex_unlock(&queue->mutex); - - return ret; -} - -int uvc_export_buffer(struct uvc_video_queue *queue, - struct v4l2_exportbuffer *exp) -{ - int ret; - - mutex_lock(&queue->mutex); - ret =3D vb2_expbuf(&queue->queue, exp); - mutex_unlock(&queue->mutex); - - return ret; -} - -int uvc_dequeue_buffer(struct uvc_video_queue *queue, struct v4l2_buffer *= buf, - int nonblocking) -{ - int ret; - - mutex_lock(&queue->mutex); - ret =3D vb2_dqbuf(&queue->queue, buf, nonblocking); - mutex_unlock(&queue->mutex); - - return ret; -} - -int uvc_queue_streamon(struct uvc_video_queue *queue, enum v4l2_buf_type t= ype) -{ - int ret; - - mutex_lock(&queue->mutex); - ret =3D vb2_streamon(&queue->queue, type); - mutex_unlock(&queue->mutex); - - return ret; -} - -int uvc_queue_streamoff(struct uvc_video_queue *queue, enum v4l2_buf_type = type) -{ - int ret; - - mutex_lock(&queue->mutex); - ret =3D vb2_streamoff(&queue->queue, type); - mutex_unlock(&queue->mutex); - - return ret; -} - -int uvc_queue_mmap(struct uvc_video_queue *queue, struct vm_area_struct *v= ma) -{ - return vb2_mmap(&queue->queue, vma); -} - -#ifndef CONFIG_MMU -unsigned long uvc_queue_get_unmapped_area(struct uvc_video_queue *queue, - unsigned long pgoff) -{ - return vb2_get_unmapped_area(&queue->queue, 0, 0, pgoff, 0); -} -#endif - -__poll_t uvc_queue_poll(struct uvc_video_queue *queue, struct file *file, - poll_table *wait) -{ - __poll_t ret; - - mutex_lock(&queue->mutex); - ret =3D vb2_poll(&queue->queue, file, wait); - mutex_unlock(&queue->mutex); - - return ret; -} - /* -----------------------------------------------------------------------= ------ * */ =20 -/* - * Check if buffers have been allocated. - */ -int uvc_queue_allocated(struct uvc_video_queue *queue) -{ - int allocated; - - mutex_lock(&queue->mutex); - allocated =3D vb2_is_busy(&queue->queue); - mutex_unlock(&queue->mutex); - - return allocated; -} - /* * Cancel the video buffers queue. * diff --git a/drivers/media/usb/uvc/uvc_v4l2.c b/drivers/media/usb/uvc/uvc_v= 4l2.c index 1abdf1ea39956bbbadd3f166f37bdac518068648..49cc64dd7e2e737f431b9df9df6= 8921d9c543751 100644 --- a/drivers/media/usb/uvc/uvc_v4l2.c +++ b/drivers/media/usb/uvc/uvc_v4l2.c @@ -47,8 +47,6 @@ void uvc_pm_put(struct uvc_device *dev) usb_autopm_put_interface(dev->intf); } =20 -static int uvc_acquire_privileges(struct uvc_fh *handle); - static int uvc_control_add_xu_mapping(struct uvc_video_chain *chain, struct uvc_control_mapping *map, const struct uvc_xu_control_mapping *xmap) @@ -436,10 +434,6 @@ static int uvc_ioctl_s_fmt(struct file *file, void *fh, const struct uvc_frame *frame; int ret; =20 - ret =3D uvc_acquire_privileges(handle); - if (ret < 0) - return ret; - if (fmt->type !=3D stream->type) return -EINVAL; =20 @@ -448,8 +442,7 @@ static int uvc_ioctl_s_fmt(struct file *file, void *fh, return ret; =20 mutex_lock(&stream->mutex); - - if (uvc_queue_allocated(&stream->queue)) { + if (vb2_is_busy(&stream->queue.queue)) { ret =3D -EBUSY; goto done; } @@ -513,10 +506,6 @@ static int uvc_ioctl_s_parm(struct file *file, void *f= h, unsigned int i; int ret; =20 - ret =3D uvc_acquire_privileges(handle); - if (ret < 0) - return ret; - if (parm->type !=3D stream->type) return -EINVAL; =20 @@ -593,63 +582,6 @@ static int uvc_ioctl_s_parm(struct file *file, void *f= h, return 0; } =20 -/* ------------------------------------------------------------------------ - * Privilege management - */ - -/* - * Privilege management is the multiple-open implementation basis. The cur= rent - * implementation is completely transparent for the end-user and doesn't - * require explicit use of the VIDIOC_G_PRIORITY and VIDIOC_S_PRIORITY ioc= tls. - * Those ioctls enable finer control on the device (by making possible for= a - * user to request exclusive access to a device), but are not mature yet. - * Switching to the V4L2 priority mechanism might be considered in the fut= ure - * if this situation changes. - * - * Each open instance of a UVC device can either be in a privileged or - * unprivileged state. Only a single instance can be in a privileged state= at - * a given time. Trying to perform an operation that requires privileges w= ill - * automatically acquire the required privileges if possible, or return -E= BUSY - * otherwise. Privileges are dismissed when closing the instance or when - * freeing the video buffers using VIDIOC_REQBUFS. - * - * Operations that require privileges are: - * - * - VIDIOC_S_INPUT - * - VIDIOC_S_PARM - * - VIDIOC_S_FMT - * - VIDIOC_CREATE_BUFS - * - VIDIOC_REQBUFS - */ -static int uvc_acquire_privileges(struct uvc_fh *handle) -{ - /* Always succeed if the handle is already privileged. */ - if (handle->state =3D=3D UVC_HANDLE_ACTIVE) - return 0; - - /* Check if the device already has a privileged handle. */ - if (atomic_inc_return(&handle->stream->active) !=3D 1) { - atomic_dec(&handle->stream->active); - return -EBUSY; - } - - handle->state =3D UVC_HANDLE_ACTIVE; - return 0; -} - -static void uvc_dismiss_privileges(struct uvc_fh *handle) -{ - if (handle->state =3D=3D UVC_HANDLE_ACTIVE) - atomic_dec(&handle->stream->active); - - handle->state =3D UVC_HANDLE_PASSIVE; -} - -static int uvc_has_privileges(struct uvc_fh *handle) -{ - return handle->state =3D=3D UVC_HANDLE_ACTIVE; -} - /* ------------------------------------------------------------------------ * V4L2 file operations */ @@ -671,7 +603,6 @@ static int uvc_v4l2_open(struct file *file) v4l2_fh_add(&handle->vfh); handle->chain =3D stream->chain; handle->stream =3D stream; - handle->state =3D UVC_HANDLE_PASSIVE; file->private_data =3D handle; =20 return 0; @@ -686,18 +617,11 @@ static int uvc_v4l2_release(struct file *file) =20 uvc_ctrl_cleanup_fh(handle); =20 - /* Only free resources if this is a privileged handle. */ - if (uvc_has_privileges(handle)) - uvc_queue_release(&stream->queue); - if (handle->is_streaming) uvc_pm_put(stream->dev); =20 /* Release the file handle. */ - uvc_dismiss_privileges(handle); - v4l2_fh_del(&handle->vfh); - v4l2_fh_exit(&handle->vfh); - kfree(handle); + vb2_fop_release(file); file->private_data =3D NULL; =20 return 0; @@ -753,91 +677,6 @@ static int uvc_ioctl_try_fmt(struct file *file, void *= fh, return uvc_v4l2_try_format(stream, fmt, &probe, NULL, NULL); } =20 -static int uvc_ioctl_reqbufs(struct file *file, void *fh, - struct v4l2_requestbuffers *rb) -{ - struct uvc_fh *handle =3D fh; - struct uvc_streaming *stream =3D handle->stream; - int ret; - - ret =3D uvc_acquire_privileges(handle); - if (ret < 0) - return ret; - - mutex_lock(&stream->mutex); - ret =3D uvc_request_buffers(&stream->queue, rb); - mutex_unlock(&stream->mutex); - if (ret < 0) - return ret; - - if (ret =3D=3D 0) - uvc_dismiss_privileges(handle); - - return 0; -} - -static int uvc_ioctl_querybuf(struct file *file, void *fh, - struct v4l2_buffer *buf) -{ - struct uvc_fh *handle =3D fh; - struct uvc_streaming *stream =3D handle->stream; - - if (!uvc_has_privileges(handle)) - return -EBUSY; - - return uvc_query_buffer(&stream->queue, buf); -} - -static int uvc_ioctl_qbuf(struct file *file, void *fh, struct v4l2_buffer = *buf) -{ - struct uvc_fh *handle =3D fh; - struct uvc_streaming *stream =3D handle->stream; - - if (!uvc_has_privileges(handle)) - return -EBUSY; - - return uvc_queue_buffer(&stream->queue, - stream->vdev.v4l2_dev->mdev, buf); -} - -static int uvc_ioctl_expbuf(struct file *file, void *fh, - struct v4l2_exportbuffer *exp) -{ - struct uvc_fh *handle =3D fh; - struct uvc_streaming *stream =3D handle->stream; - - if (!uvc_has_privileges(handle)) - return -EBUSY; - - return uvc_export_buffer(&stream->queue, exp); -} - -static int uvc_ioctl_dqbuf(struct file *file, void *fh, struct v4l2_buffer= *buf) -{ - struct uvc_fh *handle =3D fh; - struct uvc_streaming *stream =3D handle->stream; - - if (!uvc_has_privileges(handle)) - return -EBUSY; - - return uvc_dequeue_buffer(&stream->queue, buf, - file->f_flags & O_NONBLOCK); -} - -static int uvc_ioctl_create_bufs(struct file *file, void *fh, - struct v4l2_create_buffers *cb) -{ - struct uvc_fh *handle =3D fh; - struct uvc_streaming *stream =3D handle->stream; - int ret; - - ret =3D uvc_acquire_privileges(handle); - if (ret < 0) - return ret; - - return uvc_create_buffers(&stream->queue, cb); -} - static int uvc_ioctl_streamon(struct file *file, void *fh, enum v4l2_buf_type type) { @@ -845,11 +684,6 @@ static int uvc_ioctl_streamon(struct file *file, void = *fh, struct uvc_streaming *stream =3D handle->stream; int ret; =20 - if (!uvc_has_privileges(handle)) - return -EBUSY; - - guard(mutex)(&stream->mutex); - if (handle->is_streaming) return 0; =20 @@ -857,7 +691,7 @@ static int uvc_ioctl_streamon(struct file *file, void *= fh, if (ret) return ret; =20 - ret =3D uvc_queue_streamon(&stream->queue, type); + ret =3D vb2_ioctl_streamon(file, fh, type); if (ret) { uvc_pm_put(stream->dev); return ret; @@ -873,13 +707,12 @@ static int uvc_ioctl_streamoff(struct file *file, voi= d *fh, { struct uvc_fh *handle =3D fh; struct uvc_streaming *stream =3D handle->stream; + int ret; =20 - if (!uvc_has_privileges(handle)) - return -EBUSY; - - guard(mutex)(&stream->mutex); + ret =3D vb2_ioctl_streamoff(file, fh, type); + if (ret) + return ret; =20 - uvc_queue_streamoff(&stream->queue, type); if (handle->is_streaming) { handle->is_streaming =3D false; uvc_pm_put(stream->dev); @@ -962,13 +795,13 @@ static int uvc_ioctl_g_input(struct file *file, void = *fh, unsigned int *input) static int uvc_ioctl_s_input(struct file *file, void *fh, unsigned int inp= ut) { struct uvc_fh *handle =3D fh; + struct uvc_streaming *stream =3D handle->stream; struct uvc_video_chain *chain =3D handle->chain; u8 *buf; int ret; =20 - ret =3D uvc_acquire_privileges(handle); - if (ret < 0) - return ret; + if (vb2_is_busy(&stream->queue.queue)) + return -EBUSY; =20 if (chain->selector =3D=3D NULL || (chain->dev->quirks & UVC_QUIRK_IGNORE_SELECTOR_UNIT)) { @@ -1469,50 +1302,6 @@ static long uvc_v4l2_unlocked_ioctl(struct file *fil= e, return ret; } =20 -static ssize_t uvc_v4l2_read(struct file *file, char __user *data, - size_t count, loff_t *ppos) -{ - struct uvc_fh *handle =3D file->private_data; - struct uvc_streaming *stream =3D handle->stream; - - uvc_dbg(stream->dev, CALLS, "%s: not implemented\n", __func__); - return -EINVAL; -} - -static int uvc_v4l2_mmap(struct file *file, struct vm_area_struct *vma) -{ - struct uvc_fh *handle =3D file->private_data; - struct uvc_streaming *stream =3D handle->stream; - - uvc_dbg(stream->dev, CALLS, "%s\n", __func__); - - return uvc_queue_mmap(&stream->queue, vma); -} - -static __poll_t uvc_v4l2_poll(struct file *file, poll_table *wait) -{ - struct uvc_fh *handle =3D file->private_data; - struct uvc_streaming *stream =3D handle->stream; - - uvc_dbg(stream->dev, CALLS, "%s\n", __func__); - - return uvc_queue_poll(&stream->queue, file, wait); -} - -#ifndef CONFIG_MMU -static unsigned long uvc_v4l2_get_unmapped_area(struct file *file, - unsigned long addr, unsigned long len, unsigned long pgoff, - unsigned long flags) -{ - struct uvc_fh *handle =3D file->private_data; - struct uvc_streaming *stream =3D handle->stream; - - uvc_dbg(stream->dev, CALLS, "%s\n", __func__); - - return uvc_queue_get_unmapped_area(&stream->queue, pgoff); -} -#endif - const struct v4l2_ioctl_ops uvc_ioctl_ops =3D { .vidioc_g_fmt_vid_cap =3D uvc_ioctl_g_fmt, .vidioc_g_fmt_vid_out =3D uvc_ioctl_g_fmt, @@ -1525,12 +1314,13 @@ const struct v4l2_ioctl_ops uvc_ioctl_ops =3D { .vidioc_enum_fmt_vid_out =3D uvc_ioctl_enum_fmt, .vidioc_try_fmt_vid_cap =3D uvc_ioctl_try_fmt, .vidioc_try_fmt_vid_out =3D uvc_ioctl_try_fmt, - .vidioc_reqbufs =3D uvc_ioctl_reqbufs, - .vidioc_querybuf =3D uvc_ioctl_querybuf, - .vidioc_qbuf =3D uvc_ioctl_qbuf, - .vidioc_expbuf =3D uvc_ioctl_expbuf, - .vidioc_dqbuf =3D uvc_ioctl_dqbuf, - .vidioc_create_bufs =3D uvc_ioctl_create_bufs, + .vidioc_reqbufs =3D vb2_ioctl_reqbufs, + .vidioc_querybuf =3D vb2_ioctl_querybuf, + .vidioc_prepare_buf =3D vb2_ioctl_prepare_buf, + .vidioc_qbuf =3D vb2_ioctl_qbuf, + .vidioc_expbuf =3D vb2_ioctl_expbuf, + .vidioc_dqbuf =3D vb2_ioctl_dqbuf, + .vidioc_create_bufs =3D vb2_ioctl_create_bufs, .vidioc_streamon =3D uvc_ioctl_streamon, .vidioc_streamoff =3D uvc_ioctl_streamoff, .vidioc_enum_input =3D uvc_ioctl_enum_input, @@ -1557,11 +1347,10 @@ const struct v4l2_file_operations uvc_fops =3D { #ifdef CONFIG_COMPAT .compat_ioctl32 =3D uvc_v4l2_compat_ioctl32, #endif - .read =3D uvc_v4l2_read, - .mmap =3D uvc_v4l2_mmap, - .poll =3D uvc_v4l2_poll, + .mmap =3D vb2_fop_mmap, + .poll =3D vb2_fop_poll, #ifndef CONFIG_MMU - .get_unmapped_area =3D uvc_v4l2_get_unmapped_area, + .get_unmapped_area =3D vb2_fop_get_unmapped_area, #endif }; =20 diff --git a/drivers/media/usb/uvc/uvcvideo.h b/drivers/media/usb/uvc/uvcvi= deo.h index b9f8eb62ba1d82ea7788cf6c10cc838a429dbc9e..3ddbf065a2cbae40ee48cb06f84= ca8f0052990c4 100644 --- a/drivers/media/usb/uvc/uvcvideo.h +++ b/drivers/media/usb/uvc/uvcvideo.h @@ -326,7 +326,10 @@ struct uvc_buffer { =20 struct uvc_video_queue { struct vb2_queue queue; - struct mutex mutex; /* Protects queue */ + struct mutex mutex; /* + * Serializes vb2_queue and + * fops + */ =20 unsigned int flags; unsigned int buf_used; @@ -349,7 +352,6 @@ struct uvc_video_chain { * uvc_fh.pending_async_ctrls */ =20 - struct v4l2_prio_state prio; /* V4L2 priority state */ u32 caps; /* V4L2 chain-wide caps */ u8 ctrl_class_bitmap; /* Bitmap of valid classes */ }; @@ -619,16 +621,10 @@ struct uvc_device { struct uvc_entity *gpio_unit; }; =20 -enum uvc_handle_state { - UVC_HANDLE_PASSIVE =3D 0, - UVC_HANDLE_ACTIVE =3D 1, -}; - struct uvc_fh { struct v4l2_fh vfh; struct uvc_video_chain *chain; struct uvc_streaming *stream; - enum uvc_handle_state state; unsigned int pending_async_ctrls; bool is_streaming; }; @@ -687,36 +683,11 @@ struct uvc_entity *uvc_entity_by_id(struct uvc_device= *dev, int id); =20 /* Video buffers queue management. */ int uvc_queue_init(struct uvc_video_queue *queue, enum v4l2_buf_type type); -void uvc_queue_release(struct uvc_video_queue *queue); -int uvc_request_buffers(struct uvc_video_queue *queue, - struct v4l2_requestbuffers *rb); -int uvc_query_buffer(struct uvc_video_queue *queue, - struct v4l2_buffer *v4l2_buf); -int uvc_create_buffers(struct uvc_video_queue *queue, - struct v4l2_create_buffers *v4l2_cb); -int uvc_queue_buffer(struct uvc_video_queue *queue, - struct media_device *mdev, - struct v4l2_buffer *v4l2_buf); -int uvc_export_buffer(struct uvc_video_queue *queue, - struct v4l2_exportbuffer *exp); -int uvc_dequeue_buffer(struct uvc_video_queue *queue, - struct v4l2_buffer *v4l2_buf, int nonblocking); -int uvc_queue_streamon(struct uvc_video_queue *queue, enum v4l2_buf_type t= ype); -int uvc_queue_streamoff(struct uvc_video_queue *queue, enum v4l2_buf_type = type); void uvc_queue_cancel(struct uvc_video_queue *queue, int disconnect); struct uvc_buffer *uvc_queue_next_buffer(struct uvc_video_queue *queue, struct uvc_buffer *buf); struct uvc_buffer *uvc_queue_get_current_buffer(struct uvc_video_queue *qu= eue); void uvc_queue_buffer_release(struct uvc_buffer *buf); -int uvc_queue_mmap(struct uvc_video_queue *queue, - struct vm_area_struct *vma); -__poll_t uvc_queue_poll(struct uvc_video_queue *queue, struct file *file, - poll_table *wait); -#ifndef CONFIG_MMU -unsigned long uvc_queue_get_unmapped_area(struct uvc_video_queue *queue, - unsigned long pgoff); -#endif -int uvc_queue_allocated(struct uvc_video_queue *queue); static inline int uvc_queue_streaming(struct uvc_video_queue *queue) { return vb2_is_streaming(&queue->queue); --=20 2.49.0.1266.g31b7d2e469-goog From nobody Wed Feb 11 08:13:46 2026 Received: from mail-lf1-f48.google.com (mail-lf1-f48.google.com [209.85.167.48]) (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 9FF0222155D for ; Mon, 2 Jun 2025 13:06:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748869590; cv=none; b=IxWu+BW2bDlUkJMgfu5rkHgLUlhYP5ZorpJabJDS81q1c18hosJZf7ALW454aYSkCpWtk0XoTZ06GnOFU/8zoafvXmQbJBH30Xn4UDyIOwfdM0Y5RpcUpu33hFis5ixGQjtpusP03fZkrDoK12tG6zzG6+RgAR6ru+9fywLjbu4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748869590; c=relaxed/simple; bh=WyZB+LaC6SBQm0YqnCnNUB4EQV0vgX/c2EeK3V1jKcE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=LvHXVrJCLRiMvD5dYcL9MMAEcS6ETJ+IIRczEO+fVMrz554xzFuvYpumVGrHCEWqYuI9xP3OGsyMQZ4xWbgjPBHoawnPPWn+vt9vLniXd5z0ck88r1Awdj/x2YqJpDW/lk6ciXMXmbP7Z4SBM3oIeyneMgqReTq6kWVO6F/OaNE= 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=mYYbbbNj; arc=none smtp.client-ip=209.85.167.48 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="mYYbbbNj" Received: by mail-lf1-f48.google.com with SMTP id 2adb3069b0e04-551efd86048so5169478e87.3 for ; Mon, 02 Jun 2025 06:06:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1748869587; x=1749474387; 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=SY8e7u8bpTQHL+5kLl+cCW4+6IGB1TDp/jXS+nQKriw=; b=mYYbbbNjnKh9iczJ5A4kGABVF1t7ayghYNIp6HRLl/rmVSeLnIBCwlkgk1HBo7cMCh 5jyAxC1wS2D/X5GSFBOJzkHJMsEBr5gxkppIuCKkn/tkQgjk+kRtboMrn24C0BfBv3Gy OD5v6OJmiE3hFZAfR9/ShVL0rOkH+alk0F1yU= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1748869587; x=1749474387; 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=SY8e7u8bpTQHL+5kLl+cCW4+6IGB1TDp/jXS+nQKriw=; b=E8ukqlCYaNUbup+3kazT04sdyOQ7u7KA1OPeABXE/y4H/T+itaBurEYLSvknZDCJ6x 4IM1ZloFgnxzfvFLXM9OGEqfiAMki6ORFkydgp1oiBnSWcbHTneniC/a4TNSgU4KyUtY fUEuJEpQDoJV60xSwpdDVlTdUVC2BKxcJY81pgxJ8RZhpc+8zfFW1JnZXFtx1HP3lVhp nAAEfZVgSuQl+TU3aI8jbY2Gs6tZhq14ttPzmz3rHN1tEWlX93xY0CdHz0NuFCM+5GhN 2KVSaYJ4hYKNrh4U5VLgH96s3WQcvOaXK8KI7ckQTJ1f2xgVzmoqIKWVcD7qPKlpuH6+ KjfA== X-Forwarded-Encrypted: i=1; AJvYcCX1tWqDIFpL/ikjeByqlvH4+tfl0IDKJmoFQ2e/DvANOV5DhevTJNhM2VjIZ95qCdEaX4Eh3UgQsNHGOZA=@vger.kernel.org X-Gm-Message-State: AOJu0Yzl/ltadCGDgGSxQkRoKGRsjsWcEmELPgdd916EonxkyQLfX0ec z6a4EmJ+33qYbEF3cOe/uPopU8pegMZ4MdEvEC9Pdl8pXYefE3RnWxWpMG9HoExKQg== X-Gm-Gg: ASbGncv+/1Xdem6mQ1HBXaMdacyjCbChTITidvBkp0xpdYnz37bZOAWEq+/0VV+Dhup +H8QZJzJLo92Q7fhH+5+Vc7XqPjfs9QOcpyvRwRUmnwszGvLG5WAGl0vNy8SybCaPLpVURgVJ85 O177/YmJzbCp8zqF1Ke9g+D9f+W+8CSo+WeBK9dQk8uitYbq6P3E+5oI2JeB09ot7JCwEOE98yq wap24DfNK/mLwnZaBP/ErgIGovXhV1yVChz9tOo9BS0MlV8Q4T9o0XpZj5rlQwf8Esfgg7eDglE rWBaqZEWdzGngzm6sOkCdm18vBjVDD/t8cm0gqeWFeuQDCRvB6Et4xwyxecSC2d9hBaY5uw0kXH OZmZPG602nFtM96qrBzG0bRBjmsFuYfPy2/E8 X-Google-Smtp-Source: AGHT+IETrZAakF9qfxZnmj0tcsM8DSjhCMOB3EfS1qAjcEZh33ISM8jTG+USPdJ6WLT1BS+E/CAXBw== X-Received: by 2002:a05:6512:3d25:b0:553:3945:82a7 with SMTP id 2adb3069b0e04-5533d160fe8mr3856420e87.12.1748869586379; Mon, 02 Jun 2025 06:06:26 -0700 (PDT) Received: from ribalda.c.googlers.com (90.52.88.34.bc.googleusercontent.com. [34.88.52.90]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-5533787d26esm1590160e87.41.2025.06.02.06.06.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Jun 2025 06:06:24 -0700 (PDT) From: Ricardo Ribalda Date: Mon, 02 Jun 2025 13:06:16 +0000 Subject: [PATCH v2 4/9] media: uvcvideo: Remove stream->is_streaming field 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: <20250602-uvc-grannular-invert-v2-4-c871934ad880@chromium.org> References: <20250602-uvc-grannular-invert-v2-0-c871934ad880@chromium.org> In-Reply-To: <20250602-uvc-grannular-invert-v2-0-c871934ad880@chromium.org> To: Laurent Pinchart , Hans de Goede , Mauro Carvalho Chehab , Hans Verkuil Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Ricardo Ribalda X-Mailer: b4 0.14.2 The is_streaming field is used by modular PM to know if the device is currently streaming or not. With the transition to vb2 and fop helpers, we can use vb2 functions for the same functionality. The great benefit is that vb2 already takes track of the streaming state for us. Signed-off-by: Ricardo Ribalda --- drivers/media/usb/uvc/uvc_queue.c | 11 ++++++++- drivers/media/usb/uvc/uvc_v4l2.c | 51 ++---------------------------------= ---- drivers/media/usb/uvc/uvcvideo.h | 1 - 3 files changed, 12 insertions(+), 51 deletions(-) diff --git a/drivers/media/usb/uvc/uvc_queue.c b/drivers/media/usb/uvc/uvc_= queue.c index 72c5494dee9f46ff61072e7d293bfaddda40e615..dff93bec204428b8aebc09332e0= 322fa68823fa4 100644 --- a/drivers/media/usb/uvc/uvc_queue.c +++ b/drivers/media/usb/uvc/uvc_queue.c @@ -165,12 +165,18 @@ static int uvc_start_streaming(struct vb2_queue *vq, = unsigned int count) =20 lockdep_assert_irqs_enabled(); =20 + ret =3D uvc_pm_get(stream->dev); + if (ret) + return ret; + queue->buf_used =3D 0; =20 ret =3D uvc_video_start_streaming(stream); if (ret =3D=3D 0) return 0; =20 + uvc_pm_put(stream->dev); + spin_lock_irq(&queue->irqlock); uvc_queue_return_buffers(queue, UVC_BUF_STATE_QUEUED); spin_unlock_irq(&queue->irqlock); @@ -181,11 +187,14 @@ static int uvc_start_streaming(struct vb2_queue *vq, = unsigned int count) static void uvc_stop_streaming(struct vb2_queue *vq) { struct uvc_video_queue *queue =3D vb2_get_drv_priv(vq); + struct uvc_streaming *stream =3D uvc_queue_to_stream(queue); =20 lockdep_assert_irqs_enabled(); =20 - if (vq->type !=3D V4L2_BUF_TYPE_META_CAPTURE) + if (vq->type !=3D V4L2_BUF_TYPE_META_CAPTURE) { + uvc_pm_put(stream->dev); uvc_video_stop_streaming(uvc_queue_to_stream(queue)); + } =20 spin_lock_irq(&queue->irqlock); uvc_queue_return_buffers(queue, UVC_BUF_STATE_ERROR); diff --git a/drivers/media/usb/uvc/uvc_v4l2.c b/drivers/media/usb/uvc/uvc_v= 4l2.c index 49cc64dd7e2e737f431b9df9df68921d9c543751..100cff47ecc5ffd9941e22fec24= 756abda1f015e 100644 --- a/drivers/media/usb/uvc/uvc_v4l2.c +++ b/drivers/media/usb/uvc/uvc_v4l2.c @@ -617,9 +617,6 @@ static int uvc_v4l2_release(struct file *file) =20 uvc_ctrl_cleanup_fh(handle); =20 - if (handle->is_streaming) - uvc_pm_put(stream->dev); - /* Release the file handle. */ vb2_fop_release(file); file->private_data =3D NULL; @@ -677,50 +674,6 @@ static int uvc_ioctl_try_fmt(struct file *file, void *= fh, return uvc_v4l2_try_format(stream, fmt, &probe, NULL, NULL); } =20 -static int uvc_ioctl_streamon(struct file *file, void *fh, - enum v4l2_buf_type type) -{ - struct uvc_fh *handle =3D fh; - struct uvc_streaming *stream =3D handle->stream; - int ret; - - if (handle->is_streaming) - return 0; - - ret =3D uvc_pm_get(stream->dev); - if (ret) - return ret; - - ret =3D vb2_ioctl_streamon(file, fh, type); - if (ret) { - uvc_pm_put(stream->dev); - return ret; - } - - handle->is_streaming =3D true; - - return 0; -} - -static int uvc_ioctl_streamoff(struct file *file, void *fh, - enum v4l2_buf_type type) -{ - struct uvc_fh *handle =3D fh; - struct uvc_streaming *stream =3D handle->stream; - int ret; - - ret =3D vb2_ioctl_streamoff(file, fh, type); - if (ret) - return ret; - - if (handle->is_streaming) { - handle->is_streaming =3D false; - uvc_pm_put(stream->dev); - } - - return 0; -} - static int uvc_ioctl_enum_input(struct file *file, void *fh, struct v4l2_input *input) { @@ -1321,8 +1274,8 @@ const struct v4l2_ioctl_ops uvc_ioctl_ops =3D { .vidioc_expbuf =3D vb2_ioctl_expbuf, .vidioc_dqbuf =3D vb2_ioctl_dqbuf, .vidioc_create_bufs =3D vb2_ioctl_create_bufs, - .vidioc_streamon =3D uvc_ioctl_streamon, - .vidioc_streamoff =3D uvc_ioctl_streamoff, + .vidioc_streamon =3D vb2_ioctl_streamon, + .vidioc_streamoff =3D vb2_ioctl_streamoff, .vidioc_enum_input =3D uvc_ioctl_enum_input, .vidioc_g_input =3D uvc_ioctl_g_input, .vidioc_s_input =3D uvc_ioctl_s_input, diff --git a/drivers/media/usb/uvc/uvcvideo.h b/drivers/media/usb/uvc/uvcvi= deo.h index 3ddbf065a2cbae40ee48cb06f84ca8f0052990c4..f895f690f7cdc1af942d5f3a5f1= 0e9dd1c956a35 100644 --- a/drivers/media/usb/uvc/uvcvideo.h +++ b/drivers/media/usb/uvc/uvcvideo.h @@ -626,7 +626,6 @@ struct uvc_fh { struct uvc_video_chain *chain; struct uvc_streaming *stream; unsigned int pending_async_ctrls; - bool is_streaming; }; =20 /* ------------------------------------------------------------------------ --=20 2.49.0.1266.g31b7d2e469-goog From nobody Wed Feb 11 08:13:46 2026 Received: from mail-lf1-f49.google.com (mail-lf1-f49.google.com [209.85.167.49]) (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 051FE21C9F8 for ; Mon, 2 Jun 2025 13:06:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.49 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748869591; cv=none; b=QUCjdzt5j5BO85Hiwm8CSwu4xordzrcUzUQao5WlQM1J4avPJtCNxgbv+6ytV3ZcpRAnQiuPXygVugxcTpvBX5E14l/ebtQzILF8ggUuKtzV9K8TUi7fQYv05urM0fb2EFxKcAH+erRNKip/GqAfbqeRHH2lUz0SxP63PLVwJms= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748869591; c=relaxed/simple; bh=sSgoKwSCkGSrgSxUaAApWkbAYdHmTLvI5MN0jsMZPOU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=sel0sjfmOD48+tsbRNIX50w7KGj791PCAvvJ38LopxnSzUrwDXj3utBpNYi4bEdIBS+RTg7NWZDnJzTN5t2HPZFEBNLTZLGEdtfVRMdi1iIk3f8Qu2/IAO/XGf0aX4Guq2rIs1psGUKYvrNZFJspVTVVT2q+maGBjjV7ZUjAVc4= 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=ZleF+aVH; arc=none smtp.client-ip=209.85.167.49 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="ZleF+aVH" Received: by mail-lf1-f49.google.com with SMTP id 2adb3069b0e04-5533a86a134so3842417e87.3 for ; Mon, 02 Jun 2025 06:06:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1748869588; x=1749474388; 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=j+dcDh3ncyETsHrh6KLOXKd8aIlzxGuGTMucdNvN9Go=; b=ZleF+aVHknn+GmYDW6FYAIAOEnJcELmNWmBFp4Ej0XmOWuHHKRHsI4o2MiGir23kMp 1WBIXERmqWoQKqVBECH6A9oXGN+Qsh1+KC+lzBW2hwefcq2xhfUhJZBCZN9WukuLLHnS tbZ5+cAc7rCHUBPqiku9a2cr4exHAyeMsxozg= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1748869588; x=1749474388; 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=j+dcDh3ncyETsHrh6KLOXKd8aIlzxGuGTMucdNvN9Go=; b=DERmaGlxxI25Q+C6dpVzk/YvTCASKMbleGXon6SlErnO0WkY4ozyxVkg0KMBmBtn4L 0YyS/aNnKqQJtNj9cuF9CeLBz0eUeLX1mvv3OAKXrKRwRsvxOGWzGxpuDPP7VQ7PnP7v IyUy0hQvKi+09GExp6PTTHxDD05/OnwaftnAIbrOjsCHpUV1e7e6jdTsX47C0l+e/9x0 odjRFuxX+YxGuGZlwPzrlKbN5dOH/OfZ54RDl2fE7p6RyHKAYqFUQhxs5wlDWenMm/pO WMdpRWdEDDdM8UNbmESJ8HTiJuRwDIkAwPo1N+VlpOa+e0E3/ku4HJTlYUgThnchDlWG M0mw== X-Forwarded-Encrypted: i=1; AJvYcCXXDx9r+YqW+hv2EvtAwF4JQmTKNsAyRWJxjPrnivH3UVcJuu4hbUt6HvKU8tDQfQ7tXBEG9c4se0MnRpo=@vger.kernel.org X-Gm-Message-State: AOJu0YwdI2VfwMraclBnNr+hBmcY/qjd+xXSprWZxLpvWyqIhH8S3rXX KGYSbeV+tjVeRsZcjofyq5gARITq0U6n3PGhLUWrD3EdVKquHXWDLJzt44u02XbOVg== X-Gm-Gg: ASbGncshFE5+7vWM146aONIo+7WtzNkRolKC5Y23OCceRKVq4D+Ucuek7AJByIxAEtT Iyjoms6X/qbX7iRO4WVaz69rba+SXJNcSWMChrRFvbNqK9qFQznu5SxTLyJbdHvAEGAA/us8ajX 3JMmpwgMIWC3KfCS5ptHww7bcYNM1WOmOcROYJvQ3WiO14Waj7RMGFy/+9DxIkD6JNjIsHCnJYw z8j7ugXctplrcsXYJk4pZ/mnvqrejI3b4dF+irEBlU30qh8tvJmIevVmTw0gzTWgi7WlxbjGiJs BGMLJvZmuhirSGPPHGRs2o4Blwy7pURfSg7qqDEX1RpOKCVYtRBBE+0Eqeho+9NZqupLLQXSVo0 LMr8Kc8XrqiPTiSl5ZlTfgkYpzQdCdY2xglTE X-Google-Smtp-Source: AGHT+IH2K9PXLBHDUDhCn5sZ3snhKvXMgEsIcjV1/WkDTdHxSDkoR7XVPHxr+I11p3iKRmT+T/XhIQ== X-Received: by 2002:a05:6512:3d9e:b0:553:341f:12a3 with SMTP id 2adb3069b0e04-5533d1ab162mr3177110e87.39.1748869587880; Mon, 02 Jun 2025 06:06:27 -0700 (PDT) Received: from ribalda.c.googlers.com (90.52.88.34.bc.googleusercontent.com. [34.88.52.90]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-5533787d26esm1590160e87.41.2025.06.02.06.06.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Jun 2025 06:06:26 -0700 (PDT) From: Ricardo Ribalda Date: Mon, 02 Jun 2025 13:06:17 +0000 Subject: [PATCH v2 5/9] media: uvcvideo: Turn on the camera if V4L2_EVENT_SUB_FL_SEND_INITIAL 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: <20250602-uvc-grannular-invert-v2-5-c871934ad880@chromium.org> References: <20250602-uvc-grannular-invert-v2-0-c871934ad880@chromium.org> In-Reply-To: <20250602-uvc-grannular-invert-v2-0-c871934ad880@chromium.org> To: Laurent Pinchart , Hans de Goede , Mauro Carvalho Chehab , Hans Verkuil Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Ricardo Ribalda , Hans de Goede X-Mailer: b4 0.14.2 If we subscribe to an event with V4L2_EVENT_SUB_FL_SEND_INITIAL, the driver needs to report back some values that require the camera to be powered on. But VIDIOC_SUBSCRIBE_EVENT is not part of the ioctls that turn on the camera. We could unconditionally turn on the camera during VIDIOC_SUBSCRIBE_EVENT, but it is more efficient to turn it on only during V4L2_EVENT_SUB_FL_SEND_INITIAL, which we believe is not a common usecase. To avoid a list_del if uvc_pm_get() fails, we move list_add_tail to the end of the function. Reviewed-by: Hans de Goede Fixes: d1b618e79548 ("media: uvcvideo: Do not turn on the camera for some i= octls") Signed-off-by: Ricardo Ribalda --- drivers/media/usb/uvc/uvc_ctrl.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/drivers/media/usb/uvc/uvc_ctrl.c b/drivers/media/usb/uvc/uvc_c= trl.c index 44b6513c526421943bb9841fb53dc5f8e9f93f02..ceff17d65c60761703f473f13d8= 7c8f2b5f25129 100644 --- a/drivers/media/usb/uvc/uvc_ctrl.c +++ b/drivers/media/usb/uvc/uvc_ctrl.c @@ -2033,18 +2033,23 @@ static int uvc_ctrl_add_event(struct v4l2_subscribe= d_event *sev, unsigned elems) goto done; } =20 - list_add_tail(&sev->node, &mapping->ev_subs); if (sev->flags & V4L2_EVENT_SUB_FL_SEND_INITIAL) { struct v4l2_event ev; u32 changes =3D V4L2_EVENT_CTRL_CH_FLAGS; s32 val =3D 0; =20 + ret =3D uvc_pm_get(handle->chain->dev); + if (ret) + goto done; + if (uvc_ctrl_mapping_is_compound(mapping) || __uvc_ctrl_get(handle->chain, ctrl, mapping, &val) =3D=3D 0) changes |=3D V4L2_EVENT_CTRL_CH_VALUE; =20 uvc_ctrl_fill_event(handle->chain, &ev, ctrl, mapping, val, changes); + + uvc_pm_put(handle->chain->dev); /* * Mark the queue as active, allowing this initial event to be * accepted. @@ -2053,6 +2058,7 @@ static int uvc_ctrl_add_event(struct v4l2_subscribed_= event *sev, unsigned elems) v4l2_event_queue_fh(sev->fh, &ev); } =20 + list_add_tail(&sev->node, &mapping->ev_subs); done: mutex_unlock(&handle->chain->ctrl_mutex); return ret; --=20 2.49.0.1266.g31b7d2e469-goog From nobody Wed Feb 11 08:13:46 2026 Received: from mail-lf1-f49.google.com (mail-lf1-f49.google.com [209.85.167.49]) (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 52621221D94 for ; Mon, 2 Jun 2025 13:06:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.49 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748869593; cv=none; b=d1eYRYF10+KgrQ/rw+zNEm2ZyIkOVBgC9uZe70m6EL39wb78QDUr3vzw4ZN8WdLHm0nPImNPp3Z0lE1I66PASnhMn6ui/de49EptzfcQwq9n6t/BZmD7AMNoITUwMtp0FcNUNqIFuEehtdGbYsAnCNw3SfKo8ulkopJsFejh6E4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748869593; c=relaxed/simple; bh=FjNRXZX0ch6DPRErORNEU7CPhqxiHvHorfrQXODtlgY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=WS3/SuC4A+vJR7KMHEWjH1fLSxCF7FwIw4NqBdbDzMXb8b4o1jDiTYJuWy9YA5Q4/qgJ6stzZzJJu53dkqjm31R74mZYOXvINXnU0ZN3Ke5+7NlKGiOOBjogTtlCaHYTdwLTSEAu46SD8tC35xBUh7e9fpZJP/LzU4dF3ibRE20= 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=aBnLktsR; arc=none smtp.client-ip=209.85.167.49 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="aBnLktsR" Received: by mail-lf1-f49.google.com with SMTP id 2adb3069b0e04-54e7967cf67so5195353e87.0 for ; Mon, 02 Jun 2025 06:06:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1748869590; x=1749474390; 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=AArFLpvrTviSLo6TTlnlRwmgDV8UtwktXMRNEndWCQw=; b=aBnLktsR/8DwioPPDAksrGeFzmkC6WnG+zJd7pmWe8tdi76ayan5jtW7sA8D2bsc2V pA8rc+By0Thce8+HGpwuPlDCm1alfY9pupaWxoCRoOnmqx9tBYWfROFbyVTmqtWdhstx /jCduwXKa0hd9X6au89HHHWURn8T41taDRigI= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1748869590; x=1749474390; 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=AArFLpvrTviSLo6TTlnlRwmgDV8UtwktXMRNEndWCQw=; b=gk3iHO/IJUOYInmkciCogXzeuYPJBzEX0KaegFncIaIp1MDyQvMgvkx6mXj6imLbXB yg/raLKg36nxniHWFyl8te3gP/zlY7aPoquOYwy3/G5pZCp2lk0Ks68bMJUu4zomKyWe u96ard8PfzXsBsBxCmiIuucSEmnppNj7pbbzfgY8i7Wk/9TT0P+B3nd96rQBiilSsE9J j7ZjgJKYDebYYKxSiRL9fVuwyFXNchFlpAPBYFtT36VnSKCnO7UiIKainqO2QGFlKMLY oZ0gvb0z5Ip4fBk4i3pas4wTsC+I6Tcw//vu+IJ5NxOvC5c3EeHq5kVsYGoPyufHrg5j 4Fyg== X-Forwarded-Encrypted: i=1; AJvYcCXL8BMHdJS9W3HnCHkfUTYIdWG/oPmnZVYOGX1p6AaaH5qoh6x0o4Kb8/SQjPbIxjx9ghwvgnaHdB/ZcnU=@vger.kernel.org X-Gm-Message-State: AOJu0YxzvDG6tMB2p1TVCPHypfpgLRb3XTGu93ALiTbJsiowVppO/pft /wRvTMh63buoHTCvZyNt8Pkbjfhm8nY37g73K8kh6x1Z3BHs2cu2utR9YP52cLP99w== X-Gm-Gg: ASbGncsJQxAQQuHoh2hL/6ndUo5Hpl3wsv30mX/FjSIketsRU399VTXaBI/GK33F8D3 jnVeovtkJyD0S0p8ktKW3Za3ma5n5L3iPBvH57dvdQez+hciIKW0i0Vnf5OaD8J5zz5mmyGY/qZ GopwoWDz2RWlvnzXKnngQjvrMgCS9QH5krRRHFiZ7CsEzU8Tb/13efB0hu694UP5w2qU/+wxWxQ vgMrACtPJOAAb8xH0PUsedlsUFtv2uy5aXL9Yz28+qTLWGcliX5uFvnGgw7v+x4WuYmcLAx/QjO 4lMOVtY8o0EfbdxY1f3LnQSihuHnMt6RV/FKx/8hJTzCsp7n/N64SmrqwEXMbTrJxPncH4YTHej W5gCV1DKWeewKE75t+a18FNj5oQ== X-Google-Smtp-Source: AGHT+IFMjaqEZeZt24KEPp77Itzt3bDSNiwjg8uVRVbtSDFC8vVrvZ0qTxTGge30XlC9CZeXykZGdg== X-Received: by 2002:a05:6512:1387:b0:553:2927:985f with SMTP id 2adb3069b0e04-55342f5464cmr2297117e87.5.1748869590293; Mon, 02 Jun 2025 06:06:30 -0700 (PDT) Received: from ribalda.c.googlers.com (90.52.88.34.bc.googleusercontent.com. [34.88.52.90]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-5533787d26esm1590160e87.41.2025.06.02.06.06.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Jun 2025 06:06:28 -0700 (PDT) From: Ricardo Ribalda Date: Mon, 02 Jun 2025 13:06:18 +0000 Subject: [PATCH v2 6/9] media: uvcvideo: Do not enable camera during UVCIOC_CTRL_MAP* 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: <20250602-uvc-grannular-invert-v2-6-c871934ad880@chromium.org> References: <20250602-uvc-grannular-invert-v2-0-c871934ad880@chromium.org> In-Reply-To: <20250602-uvc-grannular-invert-v2-0-c871934ad880@chromium.org> To: Laurent Pinchart , Hans de Goede , Mauro Carvalho Chehab , Hans Verkuil Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Ricardo Ribalda , Hans de Goede X-Mailer: b4 0.14.2 The device does not need to be enabled to do this, it is merely an internal data operation. Reviewed-by: Hans de Goede Signed-off-by: Ricardo Ribalda --- drivers/media/usb/uvc/uvc_v4l2.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/drivers/media/usb/uvc/uvc_v4l2.c b/drivers/media/usb/uvc/uvc_v= 4l2.c index 100cff47ecc5ffd9941e22fec24756abda1f015e..020def11b60e00ca2875dd96f23= ef9591fed11d9 100644 --- a/drivers/media/usb/uvc/uvc_v4l2.c +++ b/drivers/media/usb/uvc/uvc_v4l2.c @@ -1179,10 +1179,6 @@ static long uvc_v4l2_compat_ioctl32(struct file *fil= e, void __user *up =3D compat_ptr(arg); long ret; =20 - ret =3D uvc_pm_get(handle->stream->dev); - if (ret) - return ret; - switch (cmd) { case UVCIOC_CTRL_MAP32: ret =3D uvc_v4l2_get_xu_mapping(&karg.xmap, up); @@ -1198,9 +1194,15 @@ static long uvc_v4l2_compat_ioctl32(struct file *fil= e, =20 case UVCIOC_CTRL_QUERY32: ret =3D uvc_v4l2_get_xu_query(&karg.xqry, up); + if (ret) + break; + + ret =3D uvc_pm_get(handle->stream->dev); if (ret) break; ret =3D uvc_xu_ctrl_query(handle->chain, &karg.xqry); + uvc_pm_put(handle->stream->dev); + if (ret) break; ret =3D uvc_v4l2_put_xu_query(&karg.xqry, up); @@ -1213,8 +1215,6 @@ static long uvc_v4l2_compat_ioctl32(struct file *file, break; } =20 - uvc_pm_put(handle->stream->dev); - return ret; } #endif @@ -1227,6 +1227,7 @@ static long uvc_v4l2_unlocked_ioctl(struct file *file, =20 /* The following IOCTLs do not need to turn on the camera. */ switch (cmd) { + case UVCIOC_CTRL_MAP: case VIDIOC_CREATE_BUFS: case VIDIOC_DQBUF: case VIDIOC_ENUM_FMT: --=20 2.49.0.1266.g31b7d2e469-goog From nobody Wed Feb 11 08:13:46 2026 Received: from mail-lf1-f52.google.com (mail-lf1-f52.google.com [209.85.167.52]) (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 6DD1521CC59 for ; Mon, 2 Jun 2025 13:06:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.52 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748869597; cv=none; b=YZ4/jlbKRpFjdfV9gPQQ2blEfL3za/mxop5DA5c9wJ7kPLlEZhiUi8SfBD3jzRE4M11TX9lrXMaFRbCKsONhoaz4j0zye3Bm603r5l5zw1aqG2dZ4wMh2LIH7g5Vo61I2cPdFWjPMlxK+sHOiSbLdjRMWsjhXvm7auET0ouCBYc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748869597; c=relaxed/simple; bh=fc23CTNTD/5dwFWW51Oa6nQRUyLg8YME2F5fGjT2y/o=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=sR4o10s102k4lF21XN0ksC7FKakW9KpI1Y7NDMVGZt/SfUmCs//iqUGHxjUQz8feESVBVidlwDuUNERpao8TDyBr/daQ4pG3uXzM9bFta2YPz2ylSf6voLdkgDsL2jyDPWaRp8Wz3q5Nwrm6iv03DnYziYCx6HqgD5bLamJyHdk= 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=bIBX7PlQ; arc=none smtp.client-ip=209.85.167.52 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="bIBX7PlQ" Received: by mail-lf1-f52.google.com with SMTP id 2adb3069b0e04-553245cad29so4524953e87.1 for ; Mon, 02 Jun 2025 06:06:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1748869593; x=1749474393; 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=WTh0byM1hk1JW8FszCVsWx6/0+6cP5UpipLznYZuSMk=; b=bIBX7PlQvGdfuLHZvs8esiWiquIP24ZG8EhGW7SSkD4OqAwURyPh/EqMKqxHf08apn YDqRvpVBhFcpYot0HleCreXWyap1SUMAseUFBK6N/PSpjuT3hI9nfT8MwvhXDWmTiJTg g3MYvVF/8EX1zp4XJiRuD17CT4M+wUWmMig94= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1748869593; x=1749474393; 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=WTh0byM1hk1JW8FszCVsWx6/0+6cP5UpipLznYZuSMk=; b=luQuQJO4lhxMN1pjYSfDp/neWxY+RFh68GLSD7hjqN+iueWYZvtq5Kw/oUAIWuZtkl qlOh+q0y+e6rNq52rU0cwL2KfJIVGwv3z9HAAh4eStzhnEcCmQTlrGT18BFKjqVtQR2I TjNgJ+XlVFUdjmzWj15IengqP+ZnzyI2cNiRpwxbhpiWji0KlsxvKNyv8lbdBwRr3QsL mNvT3mIvTtw4S7Mcc9+whd41GN6Zs7ssCRHoIBKx+l6Bg6cm+8IXhKq3PjJbZwjqRuJ9 xjRaxRzaOI9p0Ske6QzXnruYgmYHUszY6ZGTa2xqyjDSU8rStYGeGWKHCT9SXIs9zqgL jqog== X-Forwarded-Encrypted: i=1; AJvYcCX94X1ZknlnHA+NfUVdm6BcVKI5mCtWjgej+ckfZ4kpOG/7CBu7sAgCuHxqNv88Ws6vD9MoYWloIN29jV0=@vger.kernel.org X-Gm-Message-State: AOJu0YzyW8Jyu289gVlH/r3Y6HjRElZc0UBP4v7yyknIdH0JMppH+zry lowzNRdaxMyMfuANHRcuhI7p4hhTL5WdQt8klMKf+Kn2CGKq9UYvYN1gREJsDBii2A== X-Gm-Gg: ASbGncuwKcof0zcguO8Sy+fXeYW1aPFAlf5x8DCQ8965L4W1c1tWsAWTToMt/Xh8lNk aRPM2u4UCIqXhnqotXar6yZKtYRUiehha6CpjcMmc8OEPEdS7TMv9HBJymnswU3T+49Knx0/CVm rQvkaG+v+e4UrcdwgfUzyozn5N0gSs2/NP8IcUwuWx1RAgQuavKJMW6v5HpEleNxZciy4Y2zTSF YyQJaxba9ab3RD+IEQwRYL/DRoW+Y8X5glkq2LDIQpRSKKbb+YvbGo8ojX4PVl/3v7xrLHRbWXH y97RoV1tE4yJQOWprfutPqZbxTgnLm52ePly13vOU8dMWylZjY/ZtqSNZDd1mGfqikKGAZ1o3J5 to0o9BHvVhLJx1R16w/sHXDQfww== X-Google-Smtp-Source: AGHT+IGLsHBEoVmtd5NKV7jtspYoybyPtSFNaIEksBmBsZO+upEkAy6ZGHoutD0TgtPmWaeUDGX0Dg== X-Received: by 2002:a05:6512:3da6:b0:553:2e92:2c98 with SMTP id 2adb3069b0e04-5533d1bb8d6mr3488304e87.42.1748869593135; Mon, 02 Jun 2025 06:06:33 -0700 (PDT) Received: from ribalda.c.googlers.com (90.52.88.34.bc.googleusercontent.com. [34.88.52.90]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-5533787d26esm1590160e87.41.2025.06.02.06.06.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Jun 2025 06:06:31 -0700 (PDT) From: Ricardo Ribalda Date: Mon, 02 Jun 2025 13:06:19 +0000 Subject: [PATCH v2 7/9] media: uvcvideo: uvc_v4l2_unlocked_ioctl: Invert PM logic 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: <20250602-uvc-grannular-invert-v2-7-c871934ad880@chromium.org> References: <20250602-uvc-grannular-invert-v2-0-c871934ad880@chromium.org> In-Reply-To: <20250602-uvc-grannular-invert-v2-0-c871934ad880@chromium.org> To: Laurent Pinchart , Hans de Goede , Mauro Carvalho Chehab , Hans Verkuil Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Ricardo Ribalda , Hans Verkuil X-Mailer: b4 0.14.2 Instead of listing the IOCTLs that do not need to turn on the camera, list the IOCTLs that need to turn it on. This makes the code more maintainable. This patch changes the behaviour for unsupported IOCTLs. Those IOCTLs will not turn on the camera. Suggested-by: Hans Verkuil Signed-off-by: Ricardo Ribalda Reviewed-by: Hans de Goede --- drivers/media/usb/uvc/uvc_v4l2.c | 61 ++++++++++++++++++++++++------------= ---- 1 file changed, 36 insertions(+), 25 deletions(-) diff --git a/drivers/media/usb/uvc/uvc_v4l2.c b/drivers/media/usb/uvc/uvc_v= 4l2.c index 020def11b60e00ca2875dd96f23ef9591fed11d9..13388879091c46ff74582226146= 521b5b5eb3d10 100644 --- a/drivers/media/usb/uvc/uvc_v4l2.c +++ b/drivers/media/usb/uvc/uvc_v4l2.c @@ -1219,43 +1219,54 @@ static long uvc_v4l2_compat_ioctl32(struct file *fi= le, } #endif =20 -static long uvc_v4l2_unlocked_ioctl(struct file *file, - unsigned int cmd, unsigned long arg) +static long uvc_v4l2_pm_ioctl(struct file *file, + unsigned int cmd, unsigned long arg) { struct uvc_fh *handle =3D file->private_data; int ret; =20 - /* The following IOCTLs do not need to turn on the camera. */ - switch (cmd) { - case UVCIOC_CTRL_MAP: - case VIDIOC_CREATE_BUFS: - case VIDIOC_DQBUF: - case VIDIOC_ENUM_FMT: - case VIDIOC_ENUM_FRAMEINTERVALS: - case VIDIOC_ENUM_FRAMESIZES: - case VIDIOC_ENUMINPUT: - case VIDIOC_EXPBUF: - case VIDIOC_G_FMT: - case VIDIOC_G_PARM: - case VIDIOC_G_SELECTION: - case VIDIOC_QBUF: - case VIDIOC_QUERYCAP: - case VIDIOC_REQBUFS: - case VIDIOC_SUBSCRIBE_EVENT: - case VIDIOC_UNSUBSCRIBE_EVENT: - return video_ioctl2(file, cmd, arg); - } - ret =3D uvc_pm_get(handle->stream->dev); if (ret) return ret; - ret =3D video_ioctl2(file, cmd, arg); - uvc_pm_put(handle->stream->dev); + return ret; } =20 +static long uvc_v4l2_unlocked_ioctl(struct file *file, + unsigned int cmd, unsigned long arg) +{ + /* + * For now, we do not support granular power saving for compat + * syscalls. + */ + if (in_compat_syscall()) + return uvc_v4l2_pm_ioctl(file, cmd, arg); + + /* The following IOCTLs do need to turn on the camera. */ + switch (cmd) { + case UVCIOC_CTRL_QUERY: + case VIDIOC_G_CTRL: + case VIDIOC_G_EXT_CTRLS: + case VIDIOC_G_INPUT: + case VIDIOC_QUERYCTRL: + case VIDIOC_QUERYMENU: + case VIDIOC_QUERY_EXT_CTRL: + case VIDIOC_S_CTRL: + case VIDIOC_S_EXT_CTRLS: + case VIDIOC_S_FMT: + case VIDIOC_S_INPUT: + case VIDIOC_S_PARM: + case VIDIOC_TRY_EXT_CTRLS: + case VIDIOC_TRY_FMT: + return uvc_v4l2_pm_ioctl(file, cmd, arg); + } + + /* The other IOCTLs can run with the camera off. */ + return video_ioctl2(file, cmd, arg); +} + const struct v4l2_ioctl_ops uvc_ioctl_ops =3D { .vidioc_g_fmt_vid_cap =3D uvc_ioctl_g_fmt, .vidioc_g_fmt_vid_out =3D uvc_ioctl_g_fmt, --=20 2.49.0.1266.g31b7d2e469-goog From nobody Wed Feb 11 08:13:46 2026 Received: from mail-lf1-f43.google.com (mail-lf1-f43.google.com [209.85.167.43]) (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 6BAF6221D94 for ; Mon, 2 Jun 2025 13:06:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748869599; cv=none; b=JO4xDWC92af1wHGJVaIYP22DodHZzDoW0hfEh4iiehWBG5p2+Ume58eJ8Fss2FZN5PhPWJlq7SM65xhBZuYoZp8ZjhCcedWEO/otR1plOp2gp33N1+fosemEC99Kp2W7cmN34nJFDyLhxVs4AolmtCvUod/pAKrOzVm+o2dGRqo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748869599; c=relaxed/simple; bh=f8DLJRlfWk3JbMbPVn9HOqED6ZsFtjWYBvOs/iqXSX8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=XiRTXx2NrWorIGG81vYaFngRL88TU3RaDKvaVrf3kJK+tvpCrQRV1K8VyNEgJI4a4e5g9ejadU1kRSUR3/dp/kCQIR56iq9cPkGLV65L44P/B6GKYKifbnYzjBFgxMzTweSThv2p8aXc4ajIJ1LvGvJgEAElmW1tXrYoPOPpdDM= 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=i1FTJ476; arc=none smtp.client-ip=209.85.167.43 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="i1FTJ476" Received: by mail-lf1-f43.google.com with SMTP id 2adb3069b0e04-5533a86a134so3842589e87.3 for ; Mon, 02 Jun 2025 06:06:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1748869595; x=1749474395; 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=qCzJrisjpk+CFUwffyPuVe/ToQ4yyR1pmcjuE70Cqq8=; b=i1FTJ476yX5TTQAHlbB/36hu+yKAl/An+K2kVCKDuMle4k2YCMAkLQAqYrEm9fQFYz c28qsbQyhIR+UQBKKiPtAk059gXF3fgSZldL2v05b0DGL5uKZ6xV8DkAfo0Dk2+bwqEg JjjLUJi3CSOcty1Kduuv0gMkjpB97NiXBK4/I= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1748869595; x=1749474395; 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=qCzJrisjpk+CFUwffyPuVe/ToQ4yyR1pmcjuE70Cqq8=; b=GgZf2ZtEIp9uGUmlcAAoDjB8Rz8h+P06+Regr7UKQ2zOlhsJdk+cGdvXb1J26aQzfE 3dMNRVAXzLhJdwR6+0H2eKTwyZ3gHjRUlq3eGs4DEY6u2vZGjyJ6dF7tQsEe3jQ2H7RC H7+XZn0lR376LyuIoFsRsFMd1QVDHjA9vm6z8rezBLmZHJV/htxE+mPem714tpHPKbuP WkZbEcSjBCGOzCAyJT0hURtb4dLg4IVLncynfgSL70/u8RKRZ6ar1HcqkV5Y7oH2IRGn YZkLunROU9jF0a3/94rT2kEZAfsIWgcZhsVzqG57mYeOKm1/+G/Nwdn3RLJubjop/+X0 SF4Q== X-Forwarded-Encrypted: i=1; AJvYcCX+LcIfl+1clkQCDXHKJFenhIttyIWFgmoLJfyz/DDv2PAxPwhkei6AteJVKT1TxPVYRr/o6B8sLNg9rGs=@vger.kernel.org X-Gm-Message-State: AOJu0Yy/IoZvTSLvHq8laiuueeEXiuwsh4cFrnD6VbuAolNSW2E8Enz+ BJgObenkGq8+LpmgFgUkRoaWMxzkXCq5iTpjq7Vo1n8LQEHrCnGRyF2VDOK57o0yyg== X-Gm-Gg: ASbGncvFUnE41sxs0OozlFyFbKsCwUaTSPqssgL19KLCzaeck9M8SmBv0BW0rV/Ky6b P0I6fOfXU+uWG+hzZJ1UR4q7pmEiXsBGHbLa5kVaRn5e2iUrHPhNxNsbUU43Ld5SU6E+M+5PfMt x/sawPbBLMMMbkDtIld4Vi3rOjbzQXbLdSF0JVe78gAyxmOzGHyKEfYqs3mBNJhtuZhPIYvh1Bn ZCcXAD1IoCWnvWP016YqDNHqyLKegHiuojl8c+vJPp5MmBlzGVq/fTJE9xTjOh6iZSk6erUueae 9e34HzEvnZzie1sLQKm7Hx/o0jlceZsMcDFRrstlow8k/8vhiFDVeKKqLb1B2PzWXxjnZ8a3Ej8 4CLE2UnJjRUnR9AhO5fcWXT3XZrv6FVmaMdNI X-Google-Smtp-Source: AGHT+IH0NosGo5ALPzrWCPZ3VJBx3Lh/ZXu9d1HFFdcNMNRnaVj/eitBGu6FAAYNgPu1yP6pmJLffA== X-Received: by 2002:a05:6512:68f:b0:553:2882:d78a with SMTP id 2adb3069b0e04-5533d13e791mr3173981e87.1.1748869595433; Mon, 02 Jun 2025 06:06:35 -0700 (PDT) Received: from ribalda.c.googlers.com (90.52.88.34.bc.googleusercontent.com. [34.88.52.90]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-5533787d26esm1590160e87.41.2025.06.02.06.06.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Jun 2025 06:06:33 -0700 (PDT) From: Ricardo Ribalda Date: Mon, 02 Jun 2025 13:06:20 +0000 Subject: [PATCH v2 8/9] media: core: export v4l2_compat_translate_cmd() 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: <20250602-uvc-grannular-invert-v2-8-c871934ad880@chromium.org> References: <20250602-uvc-grannular-invert-v2-0-c871934ad880@chromium.org> In-Reply-To: <20250602-uvc-grannular-invert-v2-0-c871934ad880@chromium.org> To: Laurent Pinchart , Hans de Goede , Mauro Carvalho Chehab , Hans Verkuil Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Ricardo Ribalda X-Mailer: b4 0.14.2 v4l2_compat_translate_cmd() can be useful for drivers to convert between the VIDIOC_*32 and VIDIOC_ defines. The VIDIOC_*32 defines are not accessible by the drivers, they live in v4l2-compat-ioctl32.c. Signed-off-by: Ricardo Ribalda Reviewed-by: Hans de Goede --- drivers/media/v4l2-core/v4l2-compat-ioctl32.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/media/v4l2-core/v4l2-compat-ioctl32.c b/drivers/media/= v4l2-core/v4l2-compat-ioctl32.c index 8c07400bd280dea5d2e66e2759658c423bcd3866..ced4892b42597d605887b7c6a14= 373e3922f7bc6 100644 --- a/drivers/media/v4l2-core/v4l2-compat-ioctl32.c +++ b/drivers/media/v4l2-core/v4l2-compat-ioctl32.c @@ -929,6 +929,7 @@ unsigned int v4l2_compat_translate_cmd(unsigned int cmd) } return cmd; } +EXPORT_SYMBOL_GPL(v4l2_compat_translate_cmd); =20 int v4l2_compat_get_user(void __user *arg, void *parg, unsigned int cmd) { --=20 2.49.0.1266.g31b7d2e469-goog From nobody Wed Feb 11 08:13:46 2026 Received: from mail-lf1-f44.google.com (mail-lf1-f44.google.com [209.85.167.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 9F1F3222595 for ; Mon, 2 Jun 2025 13:06:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748869601; cv=none; b=VKioGgu7fTM/qH6/YjR1MEK3muSimy4lUk+LrRH+5/zf/EoDlzXXUeRaVW043fiej2bUfHolsEJpN5fT1XxFr+V/WDZ/cxhDzI+wCeGepaT6uHDe+1CZ9ZexpienNQYqnICj/NGoBTrPJClZ13IV4sIZ0wYwrVhUohonbvvDFLY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748869601; c=relaxed/simple; bh=s2fTm5oyVsyETmrw7htvXbIfGrXW6uLj/89qBBxdQx0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=enuCEAL2GIA7PQjc9bM8bH6ZyjbdhRps70rWU6ybab7lLI9wTcNMFqPRp5SaAy29/M0dFxdTQD0axkgHCJxlV7TpaOW8r2lO1GmCEBNXzkipWRFINtqINng4ZmrFIWxL7+FKKfU/F4GrU84xsmtrXCMEtzC50Vr/lrEhoSy/hAc= 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=RDDOb4HY; arc=none smtp.client-ip=209.85.167.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="RDDOb4HY" Received: by mail-lf1-f44.google.com with SMTP id 2adb3069b0e04-54e816aeca6so5667405e87.2 for ; Mon, 02 Jun 2025 06:06:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1748869598; x=1749474398; 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=mbA76Sy+7dv3Hy+WD50S5fx7NglU/kONFwY4cFw22AQ=; b=RDDOb4HYsy7vJPgTgtVtYRzpHe0KjW5vl7sIPtj/llKWJdEH4kBJuQ0siKcCNCtbxD XyDBjMoMRkQ2uM0NRnTtLjMflT7vhxB0x/n1vl56Djm2OmvcV2v4JE6S+AdymDNwmbtC V6UHNKoJmnnRiwaWWJSXsilcp/2dWLGeaxDp0= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1748869598; x=1749474398; 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=mbA76Sy+7dv3Hy+WD50S5fx7NglU/kONFwY4cFw22AQ=; b=SqyeNK81Aa9/4wr1mF23ZoDqy9C1OsN3g8LG24CZhVvPhc4Il6rs+FUIrKrdA14+yJ x8x3JvDmn79aw66VGRSHn5ncD6yCsUL27kr7cPwJbM3tbom7SJwNPUCALezkN/qV+Vbj OkwZT+FCTky977rqEEMEwkfgkAmrEVd18c6bb523pkHK+7HQgC3+uFuYfJAL2ia++owL yzBO3CyX35KAVo2/5s9Zewd+hVVkAoFeyFg9/LYaSucEmwU03ifCURAspjIHCzZsd5kR RK/+Kkp373VtVysSxEaccpYs6DUpUvmkkElCuirvZXRMdZSBw5N5k2AMeA0HNngoPcIJ onvw== X-Forwarded-Encrypted: i=1; AJvYcCUtp4IYGGmeKwhIkFzcqMKK0lg1b4u1tinq/hqEMkxS00MdfXF1aRbZw02amazwSZ0ApAEUTzBjV2gHQnY=@vger.kernel.org X-Gm-Message-State: AOJu0Yz9mqB/icZjS7D03WIm0yCeDddqSxoboTVKfY6pViuxz+kNlC/X TQjJeDxgeCtI1opMK9cwFEet83hOmMM9K1okDUBSvYvYtcSz2MfbyMwGXOdpSbhHCg== X-Gm-Gg: ASbGncsb4rYQZOxzMwg0BSzGbamKai7yhp6KZlD0qqsKILUmdBmtl8ZetsAlLd/qyyE f9qhadVrJgVs7wO1vAEFhIYNM7Ry/WtLIjcYnN2oGZ6En7EbEUvmVO2nkz+JGsuu/Ht6hhIU6R4 X1wp+XIAxvComVuJH3BugyjcEZqdT5+UbZQZIWvpncLElwOnfyS8bhF6p0RWcMHJlCy+vFSiCGO WRrzdBXALhskduhk67VB4T1qyvFY1KdEW8P4sK7BgwBUZ2Hn6yzIBu45oT3Y5JYiOGJgWvelk35 wQfrt/zoowaagg5P8T4UyeaN2Kv9wMDLd+ygAbe5/Eqa8JCrsTmo0tpTje5IAnpHYz+RlLDIkQj zvSik9V3PUWd2+kSnKenb4ifHcQ== X-Google-Smtp-Source: AGHT+IHe1vf7/F+KCeNYZJxpJFI7hvw+HxaaxkgDjKbbve9meQSh2ZyQ+hIz8qoG/mtgFJgJ8UxrEw== X-Received: by 2002:a05:6512:3dac:b0:553:23fb:595 with SMTP id 2adb3069b0e04-5533b8f3be4mr4267094e87.14.1748869597674; Mon, 02 Jun 2025 06:06:37 -0700 (PDT) Received: from ribalda.c.googlers.com (90.52.88.34.bc.googleusercontent.com. [34.88.52.90]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-5533787d26esm1590160e87.41.2025.06.02.06.06.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Jun 2025 06:06:35 -0700 (PDT) From: Ricardo Ribalda Date: Mon, 02 Jun 2025 13:06:21 +0000 Subject: [PATCH v2 9/9] media: uvcvideo: Support granular power saving for compat syscalls 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: <20250602-uvc-grannular-invert-v2-9-c871934ad880@chromium.org> References: <20250602-uvc-grannular-invert-v2-0-c871934ad880@chromium.org> In-Reply-To: <20250602-uvc-grannular-invert-v2-0-c871934ad880@chromium.org> To: Laurent Pinchart , Hans de Goede , Mauro Carvalho Chehab , Hans Verkuil Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Ricardo Ribalda X-Mailer: b4 0.14.2 Right now we cannot support granular power saving on compat syscalls because the VIDIOC_*32 NRs defines are not accessible to drivers. Use the v4l2_compat_translate_cmd helper to convert the compat syscall NRs into syscall NRs. Signed-off-by: Ricardo Ribalda Reviewed-by: Hans de Goede --- drivers/media/usb/uvc/uvc_v4l2.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/drivers/media/usb/uvc/uvc_v4l2.c b/drivers/media/usb/uvc/uvc_v= 4l2.c index 13388879091c46ff74582226146521b5b5eb3d10..8358ca54b248dd1cf7c984b206b= 8e550cd883e54 100644 --- a/drivers/media/usb/uvc/uvc_v4l2.c +++ b/drivers/media/usb/uvc/uvc_v4l2.c @@ -1237,15 +1237,13 @@ static long uvc_v4l2_pm_ioctl(struct file *file, static long uvc_v4l2_unlocked_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { - /* - * For now, we do not support granular power saving for compat - * syscalls. - */ + unsigned int converted_cmd =3D cmd; + if (in_compat_syscall()) - return uvc_v4l2_pm_ioctl(file, cmd, arg); + converted_cmd =3D v4l2_compat_translate_cmd(cmd); =20 /* The following IOCTLs do need to turn on the camera. */ - switch (cmd) { + switch (converted_cmd) { case UVCIOC_CTRL_QUERY: case VIDIOC_G_CTRL: case VIDIOC_G_EXT_CTRLS: --=20 2.49.0.1266.g31b7d2e469-goog