From nobody Fri Oct 3 18:02:36 2025 Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2277A2D6E67 for ; Wed, 27 Aug 2025 06:24:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=213.167.242.64 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756275902; cv=none; b=KDwe7TK7l7GcNvMRSrEUTi/8KaGugXFZITuC4fs456/dvWhivqqRBc3nqhAGUtcWnkAEclB144Kwt38GXpaYTRE+P2MRlFfhmkJE1bINJDOI4pqzRUl402HONqD51fllhg7ZycWO4Ol/A652wOq5euKmzYg04ZQKGZXnO+vwbRg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756275902; c=relaxed/simple; bh=rsY3OZd55mCHoO8iNPlykEq+MF77VDdAzU7AmJEQOK4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=oeIpMT22/xu6APaqVBKwDQFkL6d/eh8mzzhLn7LbkTJJTrnBsNM2illiIazCWG015fU34yk1yIoNcz9cLRPIsVCYpWKSa8mojt5i5K/xeay8DnxqieI4h0e5JNQg7hwXPmNVwdHdvmB0Kb+kh+ZzeyudXmH3sargGWp8FKpT3Kc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=ideasonboard.com; spf=pass smtp.mailfrom=ideasonboard.com; dkim=pass (1024-bit key) header.d=ideasonboard.com header.i=@ideasonboard.com header.b=XCz0P9Xy; arc=none smtp.client-ip=213.167.242.64 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=ideasonboard.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=ideasonboard.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="XCz0P9Xy" Received: from mail.ideasonboard.com (unknown [223.190.80.94]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id D8594300E; Wed, 27 Aug 2025 08:23:53 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1756275834; bh=rsY3OZd55mCHoO8iNPlykEq+MF77VDdAzU7AmJEQOK4=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=XCz0P9XyF9rnqPiv5t18qp28vaMal4HFJnPMvrl5X76aqHQRKuk+p8LGCOYJ5ddkt 6pBVgsQhnSQrbl4eZzwRSWXSOYHushr6TKrUmVLVzooPHfagpZBVzc8NVWGr2GSMMk IZ9f/A4kSNSt7KvRVgA0lvU3NJlBCgwIxbYX7A34= From: Jai Luthra Date: Wed, 27 Aug 2025 11:54:08 +0530 Subject: [PATCH 1/5] include: linux: Destage VCHIQ interface headers 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: <20250827-vchiq-destage-v1-1-5052a0d81c42@ideasonboard.com> References: <20250827-vchiq-destage-v1-0-5052a0d81c42@ideasonboard.com> In-Reply-To: <20250827-vchiq-destage-v1-0-5052a0d81c42@ideasonboard.com> To: Florian Fainelli , Broadcom internal kernel review list , Greg Kroah-Hartman , Ray Jui , Scott Branden Cc: linux-rpi-kernel@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-staging@lists.linux.dev, linux-kernel@vger.kernel.org, kernel-list@raspberrypi.com, Stefan Wahren , Dave Stevenson , Laurent Pinchart , Jai Luthra , Umang Jain X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=11940; i=jai.luthra@ideasonboard.com; h=from:subject:message-id; bh=gzwzF9agRWStJirrJe87JvmVxXcBxN9SVu3rMY6P0u8=; b=owEBbQKS/ZANAwAKAUPekfkkmnFFAcsmYgBorqSZtu7ttezLfbsV/ONiPWL2o6Tm7cMgpTdIJ jIMTLZOn6eJAjMEAAEKAB0WIQRN4NgY5dV16NRar8VD3pH5JJpxRQUCaK6kmQAKCRBD3pH5JJpx RefiEACRFjTlqRQ3wZ7s8TEjC+scrNB49JK3afwNY5eykQoPUqZZul2ziGP3tqiU0rkR+7oFt0i HLEDW8zWMt3yzAQg3zqvEn/XQ5fApaBEZwdnSvqmpt1eoCskPULiiIgTYsr+jRqgrlgpujLgaP8 qMxwBZnR6SfFej3y8bp/FX8sQBkeV8habCp+Ky8jkaT/tYHkF16WiHjDd1osAfrFPeL1FG/42au xRY1OsPeyDDSiKfXXOUNCV36LqoneRhthhvihlQGK2Oen+a3sIr+eHeBKZ3TFigAuTFFSQr46j1 wb2Ebaq/AyCR5D/bC6C0sLuoBoHmdqFED/HAz7V3vfms5bjV2VrgNnp+Sc1YeE8iIXwZS6K8X2y ytLWSIo6XIGMnfp+9nzJGuRelDRzoTo2HT0NIukeFhhgPdER40Jcp5/oDIozbbN5XqYRw6GRubb 2p6LWgBWIE6pCAKJ8RgaWVToCw0PvPZv4wr0MGooZah+ZL4LXmGocwW3SxYPs5E3jIJcdwxMarX TtZgAkhlpNf4MBUkS/FRWKFWypyg5CrCRemvoX0y9IR9kVYkj8QsUj+jmD/IjIWQ0LXf+fGTegM Om8k/jvOUwwPKwq4kt3bbwaPPUe7YQmz4KsGdq7N4QXrY2V2vJrUmRUHjuAuQuz+1sXnsSYIozz vGq2VcokdtLRztw== X-Developer-Key: i=jai.luthra@ideasonboard.com; a=openpgp; fpr=4DE0D818E5D575E8D45AAFC543DE91F9249A7145 From: Umang Jain Move the VCHIQ headers from drivers/staging/vc04_services/include to include/linux/vchiq This is done so that they can be shared between the VCHIQ interface (which is going to be de-staged in a subsequent commit from staging) and the VCHIQ drivers left in the staging/vc04_services (namely bcm2835-audio, bcm2835-camera). The include/linux/vchiq/ provides a central location to serve both of these areas. Signed-off-by: Umang Jain Signed-off-by: Jai Luthra Reviewed-by: Laurent Pinchart --- MAINTAINERS | 1 + drivers/staging/vc04_services/bcm2835-audio/bcm2835-vchiq.c | 5 +++-- drivers/staging/vc04_services/bcm2835-audio/bcm2835.c | 3 ++- drivers/staging/vc04_services/bcm2835-audio/bcm2835.h | 3 +-- drivers/staging/vc04_services/bcm2835-camera/bcm2835-camera.c | 3 ++- drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c | 9 +++++= ---- drivers/staging/vc04_services/interface/vchiq_arm/vchiq_bus.c | 4 ++-- drivers/staging/vc04_services/interface/vchiq_arm/vchiq_core.c | 4 ++-- .../staging/vc04_services/interface/vchiq_arm/vchiq_debugfs.c | 6 +++--- drivers/staging/vc04_services/interface/vchiq_arm/vchiq_dev.c | 7 ++++-= -- drivers/staging/vc04_services/interface/vchiq_arm/vchiq_ioctl.h | 3 +-- drivers/staging/vc04_services/vchiq-mmal/mmal-vchiq.c | 5 +++-- .../include/linux/raspberrypi =3D> include/linux/vchiq}/vchiq.h | 0 .../interface/vchiq_arm =3D> include/linux/vchiq}/vchiq_arm.h | 0 .../interface/vchiq_arm =3D> include/linux/vchiq}/vchiq_bus.h | 0 .../interface/vchiq_arm =3D> include/linux/vchiq}/vchiq_cfg.h | 0 .../interface/vchiq_arm =3D> include/linux/vchiq}/vchiq_core.h | 2 +- .../interface/vchiq_arm =3D> include/linux/vchiq}/vchiq_debugfs.h | 0 18 files changed, 30 insertions(+), 25 deletions(-) diff --git a/MAINTAINERS b/MAINTAINERS index fe168477caa45799dfe07de2f54de6d6a1ce0615..f17ebb1fa51bd7e4dcb2ae1b0fc= ed6d41685dc84 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -4754,6 +4754,7 @@ T: git https://github.com/broadcom/stblinux.git F: Documentation/devicetree/bindings/pci/brcm,stb-pcie.yaml F: drivers/pci/controller/pcie-brcmstb.c F: drivers/staging/vc04_services +F: include/linux/vchiq N: bcm2711 N: bcm2712 N: bcm283* diff --git a/drivers/staging/vc04_services/bcm2835-audio/bcm2835-vchiq.c b/= drivers/staging/vc04_services/bcm2835-audio/bcm2835-vchiq.c index 0dbe76ee557032d7861acfc002cc203ff2e6971d..c49f2f7409b84ed6ebdd7178756= 6efb1bc230f55 100644 --- a/drivers/staging/vc04_services/bcm2835-audio/bcm2835-vchiq.c +++ b/drivers/staging/vc04_services/bcm2835-audio/bcm2835-vchiq.c @@ -4,11 +4,12 @@ #include #include #include + +#include + #include "bcm2835.h" #include "vc_vchi_audioserv_defs.h" =20 -#include "../interface/vchiq_arm/vchiq_arm.h" - struct bcm2835_audio_instance { struct device *dev; unsigned int service_handle; diff --git a/drivers/staging/vc04_services/bcm2835-audio/bcm2835.c b/driver= s/staging/vc04_services/bcm2835-audio/bcm2835.c index b74cb104e9de00e7688a320949111a419cca084a..5011720940715c12a2d2fe58b40= ed84dcb2e6824 100644 --- a/drivers/staging/vc04_services/bcm2835-audio/bcm2835.c +++ b/drivers/staging/vc04_services/bcm2835-audio/bcm2835.c @@ -6,7 +6,8 @@ #include #include =20 -#include "../interface/vchiq_arm/vchiq_bus.h" +#include + #include "bcm2835.h" =20 static bool enable_hdmi; diff --git a/drivers/staging/vc04_services/bcm2835-audio/bcm2835.h b/driver= s/staging/vc04_services/bcm2835-audio/bcm2835.h index 49ec5b496edb4ba8634171b1390c4e15181e4048..7e63ef251c37269032fc20ae123= 7855245e5e0a7 100644 --- a/drivers/staging/vc04_services/bcm2835-audio/bcm2835.h +++ b/drivers/staging/vc04_services/bcm2835-audio/bcm2835.h @@ -5,13 +5,12 @@ #define __SOUND_ARM_BCM2835_H =20 #include +#include #include #include #include #include =20 -#include "../include/linux/raspberrypi/vchiq.h" - #define MAX_SUBSTREAMS (8) #define AVAIL_SUBSTREAMS_MASK (0xff) =20 diff --git a/drivers/staging/vc04_services/bcm2835-camera/bcm2835-camera.c = b/drivers/staging/vc04_services/bcm2835-camera/bcm2835-camera.c index fa7ea4ca4c36f4ec7f76f6ffbea9f45205116bb8..fcbbe1aa60b768e5a7a08a131f5= 95a0457f4473a 100644 --- a/drivers/staging/vc04_services/bcm2835-camera/bcm2835-camera.c +++ b/drivers/staging/vc04_services/bcm2835-camera/bcm2835-camera.c @@ -26,7 +26,8 @@ #include #include =20 -#include "../interface/vchiq_arm/vchiq_bus.h" +#include + #include "../vchiq-mmal/mmal-common.h" #include "../vchiq-mmal/mmal-encodings.h" #include "../vchiq-mmal/mmal-vchiq.h" diff --git a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c = b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c index 721b15b7e13b9f25cee7619575bbfa1a4734cce8..10138c1454dd7fdcbab6b95ea41= f8e1ac2defc4b 100644 --- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c +++ b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c @@ -30,11 +30,12 @@ #include #include =20 -#include "vchiq_core.h" +#include +#include +#include +#include + #include "vchiq_ioctl.h" -#include "vchiq_arm.h" -#include "vchiq_bus.h" -#include "vchiq_debugfs.h" =20 #define DEVICE_NAME "vchiq" =20 diff --git a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_bus.c = b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_bus.c index 41ece91ab88aa647a348910a0b913d0b28a8c761..5d55dbff82150a84b15483e7171= 8c48f5cb8caea 100644 --- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_bus.c +++ b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_bus.c @@ -11,8 +11,8 @@ #include #include =20 -#include "vchiq_arm.h" -#include "vchiq_bus.h" +#include +#include =20 static int vchiq_bus_type_match(struct device *dev, const struct device_dr= iver *drv) { diff --git a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_core.c= b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_core.c index e2cac0898b8faa3c255de6b8562c7096a9683c49..ac0379f5f45dfa331dc2fec8d58= 0d176f931cf2b 100644 --- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_core.c +++ b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_core.c @@ -15,8 +15,8 @@ #include #include =20 -#include "vchiq_arm.h" -#include "vchiq_core.h" +#include +#include =20 #define VCHIQ_SLOT_HANDLER_STACK 8192 =20 diff --git a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_debugf= s.c b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_debugfs.c index d5f7f61c5626934b819e8ff322e22ae3d6158b31..b1a8f1abafc2fa83132b1a02ba3= 43d71315950de 100644 --- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_debugfs.c +++ b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_debugfs.c @@ -5,9 +5,9 @@ */ =20 #include -#include "vchiq_core.h" -#include "vchiq_arm.h" -#include "vchiq_debugfs.h" +#include +#include +#include =20 #ifdef CONFIG_DEBUG_FS =20 diff --git a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_dev.c = b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_dev.c index 3b20ba5c736221ce1cacfc9ce86eca623382a30b..781d6dd64ee33816b52b62f1f25= bcd33363d8e02 100644 --- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_dev.c +++ b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_dev.c @@ -11,10 +11,11 @@ #include #include =20 -#include "vchiq_core.h" +#include +#include +#include + #include "vchiq_ioctl.h" -#include "vchiq_arm.h" -#include "vchiq_debugfs.h" =20 static const char *const ioctl_names[] =3D { "CONNECT", diff --git a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_ioctl.= h b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_ioctl.h index afb71a83cfe7035e5dd61003fa99fd514ca18047..638469f18f859a0c7e738ef5bed= 7bf3c3ebebe59 100644 --- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_ioctl.h +++ b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_ioctl.h @@ -5,8 +5,7 @@ #define VCHIQ_IOCTLS_H =20 #include - -#include "../../include/linux/raspberrypi/vchiq.h" +#include =20 #define VCHIQ_IOC_MAGIC 0xc4 #define VCHIQ_INVALID_HANDLE (~0) diff --git a/drivers/staging/vc04_services/vchiq-mmal/mmal-vchiq.c b/driver= s/staging/vc04_services/vchiq-mmal/mmal-vchiq.c index 3fe482bd279390a7586c49bde00f38c61558ca8e..f5e141908b0f91ca4172d48aee3= 7f0329d239d7c 100644 --- a/drivers/staging/vc04_services/vchiq-mmal/mmal-vchiq.c +++ b/drivers/staging/vc04_services/vchiq-mmal/mmal-vchiq.c @@ -22,11 +22,12 @@ #include #include #include +#include #include #include =20 -#include "../include/linux/raspberrypi/vchiq.h" -#include "../interface/vchiq_arm/vchiq_arm.h" +#include + #include "mmal-common.h" #include "mmal-vchiq.h" #include "mmal-msg.h" diff --git a/drivers/staging/vc04_services/include/linux/raspberrypi/vchiq.= h b/include/linux/vchiq/vchiq.h similarity index 100% rename from drivers/staging/vc04_services/include/linux/raspberrypi/vchiq.h rename to include/linux/vchiq/vchiq.h diff --git a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.h = b/include/linux/vchiq/vchiq_arm.h similarity index 100% rename from drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.h rename to include/linux/vchiq/vchiq_arm.h diff --git a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_bus.h = b/include/linux/vchiq/vchiq_bus.h similarity index 100% rename from drivers/staging/vc04_services/interface/vchiq_arm/vchiq_bus.h rename to include/linux/vchiq/vchiq_bus.h diff --git a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_cfg.h = b/include/linux/vchiq/vchiq_cfg.h similarity index 100% rename from drivers/staging/vc04_services/interface/vchiq_arm/vchiq_cfg.h rename to include/linux/vchiq/vchiq_cfg.h diff --git a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_core.h= b/include/linux/vchiq/vchiq_core.h similarity index 99% rename from drivers/staging/vc04_services/interface/vchiq_arm/vchiq_core.h rename to include/linux/vchiq/vchiq_core.h index 9b4e766990a493d6e9d4e0604f2c84f4e7b77804..dbcb19e7a6d39b94967261c4ab2= 3d6325e999249 100644 --- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_core.h +++ b/include/linux/vchiq/vchiq_core.h @@ -15,7 +15,7 @@ #include #include =20 -#include "../../include/linux/raspberrypi/vchiq.h" +#include "vchiq.h" #include "vchiq_cfg.h" =20 /* Do this so that we can test-build the code on non-rpi systems */ diff --git a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_debugf= s.h b/include/linux/vchiq/vchiq_debugfs.h similarity index 100% rename from drivers/staging/vc04_services/interface/vchiq_arm/vchiq_debugfs= .h rename to include/linux/vchiq/vchiq_debugfs.h --=20 2.50.1 From nobody Fri Oct 3 18:02:36 2025 Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C6306283FF7 for ; Wed, 27 Aug 2025 06:25:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=213.167.242.64 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756275915; cv=none; b=duQnALP5fMvC7B3arZw4t6Hs55jfDcRRkdLsblowcn7GRfGwTi5pNm0LGmjZq6o5GCcMzQh2W5TbRz7PvxQ8yOYV7eNcpJZCekzbk+4SCmnjOU70oiudfnLy/E+ChjvgL23ThCNXaCO2IwjnqNxRoHplN4a82IXwAznJPInapE0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756275915; c=relaxed/simple; bh=oxgoNFOnO9Qd7ov9g61UmXAsIpwnrJppNkMBXs+e4Os=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=G44Xm5tgGsDj+FykabjE3+R+NG5WQrR1mLshssE8o5W53BmHV4+AIldhw8aX1oxl/lut3jDzW4fx6LHzSlroE/9cMec6of47H9GRy5NG8GEe3s+XFBOpfkON6M9PcpLkJv9HOPycarYxYAnSTiSTSNZjcDnOGnveOZ9uUarzkJQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=ideasonboard.com; spf=pass smtp.mailfrom=ideasonboard.com; dkim=pass (1024-bit key) header.d=ideasonboard.com header.i=@ideasonboard.com header.b=rbDgvQ0K; arc=none smtp.client-ip=213.167.242.64 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=ideasonboard.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=ideasonboard.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="rbDgvQ0K" Received: from mail.ideasonboard.com (unknown [223.190.80.94]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id E03F8300E; Wed, 27 Aug 2025 08:24:07 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1756275848; bh=oxgoNFOnO9Qd7ov9g61UmXAsIpwnrJppNkMBXs+e4Os=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=rbDgvQ0KaD8nEdfAISGE4R1o/OuWgVvPe0wSt0RfGq6QHAMzh7gbALvjPDm3C/yuB VCUg0IhGlW57zoBdwdzK3Z0ZCpPCDVSSwgHS+yChCxG+KiE7zMUzpCotOphMZ9gP6h xmQJVR1W344qCy7pUW78ZOB8W+qZLB3gQ5kmDXws= From: Jai Luthra Date: Wed, 27 Aug 2025 11:54:09 +0530 Subject: [PATCH 2/5] staging: vc04_services: Cleanup formatting TODO entry 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: <20250827-vchiq-destage-v1-2-5052a0d81c42@ideasonboard.com> References: <20250827-vchiq-destage-v1-0-5052a0d81c42@ideasonboard.com> In-Reply-To: <20250827-vchiq-destage-v1-0-5052a0d81c42@ideasonboard.com> To: Florian Fainelli , Broadcom internal kernel review list , Greg Kroah-Hartman , Ray Jui , Scott Branden Cc: linux-rpi-kernel@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-staging@lists.linux.dev, linux-kernel@vger.kernel.org, kernel-list@raspberrypi.com, Stefan Wahren , Dave Stevenson , Laurent Pinchart , Jai Luthra X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1163; i=jai.luthra@ideasonboard.com; h=from:subject:message-id; bh=oxgoNFOnO9Qd7ov9g61UmXAsIpwnrJppNkMBXs+e4Os=; b=owEBbQKS/ZANAwAKAUPekfkkmnFFAcsmYgBorqSaJ9hpyGNWfMMl3VFVfPZ/dAIfR6p5Dtzp/ 0tDnZ2tvkKJAjMEAAEKAB0WIQRN4NgY5dV16NRar8VD3pH5JJpxRQUCaK6kmgAKCRBD3pH5JJpx RVfvD/9FA4ZMcYtquE5NriSJyqWfJu9WPllIsiorvJLkTeSIrgEW++iIoBgcJ15R2a06jguwIbB a5zwHHKSZl+/FPd8B7Im5mUBJcIYyMlwkZaqOueF7DK/4DoaAWtAfqf3u21+1Z0Idk2/Ebh2Fc4 NH8hbNJIFQzOV9iDH6mMDlD4VYfES3KLqYE7UVuqNrbm0UdAPBA4rH6Uk1OeJNjL2DD+dD1TsoD 2geJVanK2rvOp/wmA/Xk8+Uv+XJqs5lXRQO0fRJzBqIEzlam9d9nQo4JT3Sa6CG+GXZ7P09etwL pZwfb9NEYLdt2rjKLMRDJ11aVO9rNCwEyvuQF7+5INmbPa9hgZw/BI0OiQ0aNIgq3FJB/xnTVKP 7n7TQcq48BV5SCA+jeEtTnqK3EpkmYmGZWkPRNdE1+sKtUUsFQyHzWXR/Jh7OPw8Uk4BvghEAfe Wc3ieThVt4PvuAPg2d8G9mt5+Kw5BWpp/y9A87m6XytBgHH8t1ChlbBeRMM2yWz00R5Z8yhjSK7 A+VCBgFjoFFYfX+RtpCPUtD2T1ms2H+dA1RyOdJc7l+UsHcM3kfNyhAbSedXFGAk3e1ZPRyFmtF DKR37cHkt5Ve01hC9DKz/3rk/Pl06RkLjjtHi4eYETqWF+Kfh8NdNrtl7FuR1sxgz20VoFGZvKP 8k8S25FTGZSgLhA== X-Developer-Key: i=jai.luthra@ideasonboard.com; a=openpgp; fpr=4DE0D818E5D575E8D45AAFC543DE91F9249A7145 The code indentation for the vchiq interface driver is not so bad anymore [1], so drop it from the TODO. Link: https://lore.kernel.org/all/20241013112128.397249-1-umang.jain@ideaso= nboard.com/ [1] Signed-off-by: Jai Luthra Acked-by: Laurent Pinchart --- drivers/staging/vc04_services/interface/TODO | 6 ------ 1 file changed, 6 deletions(-) diff --git a/drivers/staging/vc04_services/interface/TODO b/drivers/staging= /vc04_services/interface/TODO index f6f24600aa86240fba77169f62f3e657e42727c3..6e5f27db88ba8e533ee1fabc309= 1771d8efe66a2 100644 --- a/drivers/staging/vc04_services/interface/TODO +++ b/drivers/staging/vc04_services/interface/TODO @@ -20,9 +20,3 @@ some of the ones we want: =20 A short top-down description of this driver's architecture (function of kthreads, userspace, limitations) could be very helpful for reviewers. - -* Reformat core code with more sane indentations - -The code follows the 80 characters limitation yet tends to go 3 or 4 level= s of -indentation deep making it very unpleasant to read. This is specially rele= vant -in the character driver ioctl code and in the core thread functions. --=20 2.50.1 From nobody Fri Oct 3 18:02:36 2025 Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C23362D6E67 for ; Wed, 27 Aug 2025 06:25:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=213.167.242.64 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756275930; cv=none; b=fEDkbZvZjsZrIOowr+IdhSxmXMHFp5BSjsblExNIhzHK3OUqM3m4kCEDdPU1T1z3BpuIVj6726G1XSUgfmdDzq7iE4sHgGdSJlzszDx1h5RsafujJYNy7nzIrHUCfBSDAQ7iNXKxQ+jbwQ2y0NaHZcfFoncOrYj7rQ/f24Gt2l8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756275930; c=relaxed/simple; bh=IE14bylnXzKuuTZLY5cfC2OGFjfl9F8r5qeSFNYtPMs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=sDaMuhi797LBZxCORuUBQzWeRYx2cS9YckpxLC78xPXl6wGkCG4ZZu7bF7/oQ+gdiZZxITVxMLc+w4DtchP6/N7mMBIvu+dmRIKApI3mWB0anw17+ZvOgvlB5rln4VaYKROR8rGSQlJWItnvFx/Zlu94brjQXUPlpe3pfsuvwaY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=ideasonboard.com; spf=pass smtp.mailfrom=ideasonboard.com; dkim=pass (1024-bit key) header.d=ideasonboard.com header.i=@ideasonboard.com header.b=pSF4wJW0; arc=none smtp.client-ip=213.167.242.64 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=ideasonboard.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=ideasonboard.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="pSF4wJW0" Received: from mail.ideasonboard.com (unknown [223.190.80.94]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 9CDE4300E; Wed, 27 Aug 2025 08:24:23 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1756275864; bh=IE14bylnXzKuuTZLY5cfC2OGFjfl9F8r5qeSFNYtPMs=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=pSF4wJW02r03WD+U0XzXB0WgxRjxeuNmk53rX5N6E+n5wFBm/lQw2wE/LK/3bzd3d l7fGkv/8ppLUK3dgkj8eKSRyDhb2y2zZZyLQQSPCAw6HmwjlyguPDTYD4q/xFiG6Dv ifaXvqRmvjfitndW8JR2i2vRXYANSrObK/UXUmY8= From: Jai Luthra Date: Wed, 27 Aug 2025 11:54:10 +0530 Subject: [PATCH 3/5] platform/broadcom: Destage VCHIQ interface 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: <20250827-vchiq-destage-v1-3-5052a0d81c42@ideasonboard.com> References: <20250827-vchiq-destage-v1-0-5052a0d81c42@ideasonboard.com> In-Reply-To: <20250827-vchiq-destage-v1-0-5052a0d81c42@ideasonboard.com> To: Florian Fainelli , Broadcom internal kernel review list , Greg Kroah-Hartman , Ray Jui , Scott Branden Cc: linux-rpi-kernel@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-staging@lists.linux.dev, linux-kernel@vger.kernel.org, kernel-list@raspberrypi.com, Stefan Wahren , Dave Stevenson , Laurent Pinchart , Jai Luthra X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=9659; i=jai.luthra@ideasonboard.com; h=from:subject:message-id; bh=IE14bylnXzKuuTZLY5cfC2OGFjfl9F8r5qeSFNYtPMs=; b=owEBbQKS/ZANAwAKAUPekfkkmnFFAcsmYgBorqSb44bI+4ZR0Z4yqrBR4Yr8ObWwfpQdzXaw3 LPAlyXEQo2JAjMEAAEKAB0WIQRN4NgY5dV16NRar8VD3pH5JJpxRQUCaK6kmwAKCRBD3pH5JJpx RTzID/4omGkEfgUQ2Zbub4EbXqYd3wrapBLwoU5UeiZxTNzomITK+Agt7jHtcB1TJARGwynHbcm knKTnR+GuWA8tF8k0kLrwgIl5Xt6QhJhrHs2xD3xqydN+Ph322aaHhbw5Ew2ktRrOdJbz9MZIrN BCtZ3Dm46w0MGcYkeZGFuEhJBVhXaCNa9zabpL3JvbIaokkfbSJQlJ+jsMKQkrUo8xl2gz7QsQt Bjk3ef2tppozZ9GLUYP6t3r2nfI0JkgLunZWUXYiZoGziWbUb5/CpEGT1/Q/hRB6wAe3tuMiif/ zpcn68aDkTj+JqjNAh6HNMNzwY3QUOGjxGv2ezulMeGlwDINXuoaUu+iIdGSkoclUhxdFDRoJ00 /d5krM+t1PNevw3tPGPe3qt+T3lKe6++XVxU0bw8u8uZ0CyH6JgjQSAYf12a/yOfkUk0MsDslEq kERJZuMCo5yTiQhLHsBjDYI9b+mpb4VTvaB4YDbnBuWU+F7AH6q+XVoKfI7V4PgzPnmHPuS0UPN RJSi47366hMsWhMxNmqd/ee0ilxMX/gHVr21LwKeLTbCYi6EF2MyKvQLGuCDh/9l5qNnXubvmjD 6ySQ0uJ05TgM8mObrUMWzwQ9Nq3n1UTQ9OCPmH448imk0gQXMzs+BprcFTE0AnDiHbEt/W1QFK5 //9yM88Kqm55tGg== X-Developer-Key: i=jai.luthra@ideasonboard.com; a=openpgp; fpr=4DE0D818E5D575E8D45AAFC543DE91F9249A7145 Destage the VCHIQ interface driver to drivers/platform/broadcom. The remaining TODO items are as follows: 1. Upstream the vc_mem char driver 2. Upstream the vc-sm-cma driver 3. Improve documentation These can be handled separately, after destaging the main interface here. Signed-off-by: Jai Luthra --- MAINTAINERS | 1 + drivers/platform/Kconfig | 2 ++ drivers/platform/Makefile | 1 + drivers/platform/broadcom/Kconfig | 37 ++++++++++++++++++= ++++ drivers/platform/broadcom/Makefile | 14 ++++++++ .../broadcom/vchiq-interface}/TESTING | 0 .../broadcom/vchiq-interface}/TODO | 0 .../broadcom/vchiq-interface}/vchiq_arm.c | 0 .../broadcom/vchiq-interface}/vchiq_bus.c | 0 .../broadcom/vchiq-interface}/vchiq_core.c | 0 .../broadcom/vchiq-interface}/vchiq_debugfs.c | 0 .../broadcom/vchiq-interface}/vchiq_dev.c | 0 .../broadcom/vchiq-interface}/vchiq_ioctl.h | 0 drivers/staging/vc04_services/Kconfig | 35 ------------------= -- drivers/staging/vc04_services/Makefile | 12 ------- 15 files changed, 55 insertions(+), 47 deletions(-) diff --git a/MAINTAINERS b/MAINTAINERS index f17ebb1fa51bd7e4dcb2ae1b0fced6d41685dc84..f39f326a88d7332906ecdd1d9d9= 0cc6848ba3205 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -4753,6 +4753,7 @@ S: Maintained T: git https://github.com/broadcom/stblinux.git F: Documentation/devicetree/bindings/pci/brcm,stb-pcie.yaml F: drivers/pci/controller/pcie-brcmstb.c +F: drivers/platform/broadcom/vchiq-interface F: drivers/staging/vc04_services F: include/linux/vchiq N: bcm2711 diff --git a/drivers/platform/Kconfig b/drivers/platform/Kconfig index 960fd6a82450a4c7b97d51ea3bc29795ee74efd1..325ae46a723a2e6cb15373ea1f9= 4810e0d250e06 100644 --- a/drivers/platform/Kconfig +++ b/drivers/platform/Kconfig @@ -18,3 +18,5 @@ source "drivers/platform/surface/Kconfig" source "drivers/platform/x86/Kconfig" =20 source "drivers/platform/arm64/Kconfig" + +source "drivers/platform/broadcom/Kconfig" diff --git a/drivers/platform/Makefile b/drivers/platform/Makefile index 19ac54648586eb617af0f8a69e3205bd83e8c35b..2616a4585519acb45cd78adb1c2= b67ee16ffb6a6 100644 --- a/drivers/platform/Makefile +++ b/drivers/platform/Makefile @@ -13,3 +13,4 @@ obj-$(CONFIG_CHROME_PLATFORMS) +=3D chrome/ obj-$(CONFIG_CZNIC_PLATFORMS) +=3D cznic/ obj-$(CONFIG_SURFACE_PLATFORMS) +=3D surface/ obj-$(CONFIG_ARM64_PLATFORM_DEVICES) +=3D arm64/ +obj-$(CONFIG_BCM2835_VCHIQ) +=3D broadcom/ diff --git a/drivers/platform/broadcom/Kconfig b/drivers/platform/broadcom/= Kconfig new file mode 100644 index 0000000000000000000000000000000000000000..7dec1ca85d6c56bdb21a9cb170c= 1d0cdf7587e63 --- /dev/null +++ b/drivers/platform/broadcom/Kconfig @@ -0,0 +1,37 @@ +# SPDX-License-Identifier: GPL-2.0 + +config BCM2835_VCHIQ + tristate "BCM2835 VCHIQ" + depends on BCM_VIDEOCORE && HAS_DMA + imply VCHIQ_CDEV + help + Broadcom BCM2835 and similar SoCs have a VPU called VideoCore. + This config enables the VCHIQ driver, which implements a + messaging interface between the kernel and the firmware running + on VideoCore. Other drivers use this interface to communicate to + the VPU. More specifically, the VCHIQ driver is used by + audio/video and camera drivers as well as for implementing MMAL + API, which is in turn used by several multimedia services on the + BCM2835 family of SoCs. + + Defaults to Y when the Broadcom Videocore services are included + in the build, N otherwise. + +if BCM2835_VCHIQ + +config VCHIQ_CDEV + bool "VCHIQ Character Driver" + help + Enable the creation of VCHIQ character driver. The cdev exposes + ioctls used by userspace libraries and testing tools to interact + with VideoCore, via the VCHIQ core driver (Check BCM2835_VCHIQ + for more info). + + This can be set to 'N' if the VideoCore communication is not + needed by userspace but only by other kernel modules + (like bcm2835-audio). + + If not sure, set this to 'Y'. + +endif + diff --git a/drivers/platform/broadcom/Makefile b/drivers/platform/broadcom= /Makefile new file mode 100644 index 0000000000000000000000000000000000000000..a807571c59a47bb418cbb1dfcc3= 89219d0d0ff22 --- /dev/null +++ b/drivers/platform/broadcom/Makefile @@ -0,0 +1,14 @@ +# SPDX-License-Identifier: GPL-2.0 + +obj-$(CONFIG_BCM2835_VCHIQ) +=3D vchiq.o + +vchiq-objs :=3D \ + vchiq-interface/vchiq_core.o \ + vchiq-interface/vchiq_arm.o \ + vchiq-interface/vchiq_bus.o \ + vchiq-interface/vchiq_debugfs.o \ + +ifdef CONFIG_VCHIQ_CDEV +vchiq-objs +=3D vchiq-interface/vchiq_dev.o +endif + diff --git a/drivers/staging/vc04_services/interface/TESTING b/drivers/plat= form/broadcom/vchiq-interface/TESTING similarity index 100% rename from drivers/staging/vc04_services/interface/TESTING rename to drivers/platform/broadcom/vchiq-interface/TESTING diff --git a/drivers/staging/vc04_services/interface/TODO b/drivers/platfor= m/broadcom/vchiq-interface/TODO similarity index 100% rename from drivers/staging/vc04_services/interface/TODO rename to drivers/platform/broadcom/vchiq-interface/TODO diff --git a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c = b/drivers/platform/broadcom/vchiq-interface/vchiq_arm.c similarity index 100% rename from drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c rename to drivers/platform/broadcom/vchiq-interface/vchiq_arm.c diff --git a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_bus.c = b/drivers/platform/broadcom/vchiq-interface/vchiq_bus.c similarity index 100% rename from drivers/staging/vc04_services/interface/vchiq_arm/vchiq_bus.c rename to drivers/platform/broadcom/vchiq-interface/vchiq_bus.c diff --git a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_core.c= b/drivers/platform/broadcom/vchiq-interface/vchiq_core.c similarity index 100% rename from drivers/staging/vc04_services/interface/vchiq_arm/vchiq_core.c rename to drivers/platform/broadcom/vchiq-interface/vchiq_core.c diff --git a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_debugf= s.c b/drivers/platform/broadcom/vchiq-interface/vchiq_debugfs.c similarity index 100% rename from drivers/staging/vc04_services/interface/vchiq_arm/vchiq_debugfs= .c rename to drivers/platform/broadcom/vchiq-interface/vchiq_debugfs.c diff --git a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_dev.c = b/drivers/platform/broadcom/vchiq-interface/vchiq_dev.c similarity index 100% rename from drivers/staging/vc04_services/interface/vchiq_arm/vchiq_dev.c rename to drivers/platform/broadcom/vchiq-interface/vchiq_dev.c diff --git a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_ioctl.= h b/drivers/platform/broadcom/vchiq-interface/vchiq_ioctl.h similarity index 100% rename from drivers/staging/vc04_services/interface/vchiq_arm/vchiq_ioctl.h rename to drivers/platform/broadcom/vchiq-interface/vchiq_ioctl.h diff --git a/drivers/staging/vc04_services/Kconfig b/drivers/staging/vc04_s= ervices/Kconfig index ccc8e15886482e8caa4aeb12440036183fc9b80c..3c01a1a304f1e6e6a03062b1a5f= 6af59643adf66 100644 --- a/drivers/staging/vc04_services/Kconfig +++ b/drivers/staging/vc04_services/Kconfig @@ -11,41 +11,6 @@ menuconfig BCM_VIDEOCORE =20 if BCM_VIDEOCORE =20 -config BCM2835_VCHIQ - tristate "BCM2835 VCHIQ" - depends on HAS_DMA - imply VCHIQ_CDEV - help - Broadcom BCM2835 and similar SoCs have a VPU called VideoCore. - This config enables the VCHIQ driver, which implements a - messaging interface between the kernel and the firmware running - on VideoCore. Other drivers use this interface to communicate to - the VPU. More specifically, the VCHIQ driver is used by - audio/video and camera drivers as well as for implementing MMAL - API, which is in turn used by several multimedia services on the - BCM2835 family of SoCs. - - Defaults to Y when the Broadcom Videocore services are included - in the build, N otherwise. - -if BCM2835_VCHIQ - -config VCHIQ_CDEV - bool "VCHIQ Character Driver" - help - Enable the creation of VCHIQ character driver. The cdev exposes - ioctls used by userspace libraries and testing tools to interact - with VideoCore, via the VCHIQ core driver (Check BCM2835_VCHIQ - for more info). - - This can be set to 'N' if the VideoCore communication is not - needed by userspace but only by other kernel modules - (like bcm2835-audio). - - If not sure, set this to 'Y'. - -endif - source "drivers/staging/vc04_services/bcm2835-audio/Kconfig" =20 source "drivers/staging/vc04_services/bcm2835-camera/Kconfig" diff --git a/drivers/staging/vc04_services/Makefile b/drivers/staging/vc04_= services/Makefile index dad3789522b80420f1f72ca8f740c816fb3d9843..51c9466ec7a28141cf66508f602= f43cd89ad408b 100644 --- a/drivers/staging/vc04_services/Makefile +++ b/drivers/staging/vc04_services/Makefile @@ -1,16 +1,4 @@ # SPDX-License-Identifier: GPL-2.0 -obj-$(CONFIG_BCM2835_VCHIQ) +=3D vchiq.o - -vchiq-objs :=3D \ - interface/vchiq_arm/vchiq_core.o \ - interface/vchiq_arm/vchiq_arm.o \ - interface/vchiq_arm/vchiq_bus.o \ - interface/vchiq_arm/vchiq_debugfs.o \ - -ifdef CONFIG_VCHIQ_CDEV -vchiq-objs +=3D interface/vchiq_arm/vchiq_dev.o -endif - obj-$(CONFIG_SND_BCM2835) +=3D bcm2835-audio/ obj-$(CONFIG_VIDEO_BCM2835) +=3D bcm2835-camera/ obj-$(CONFIG_BCM2835_VCHIQ_MMAL) +=3D vchiq-mmal/ --=20 2.50.1 From nobody Fri Oct 3 18:02:36 2025 Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3C6F72D3237 for ; Wed, 27 Aug 2025 06:25:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=213.167.242.64 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756275948; cv=none; b=s9kOXYWiBNqZRZVFBoGAhVjD2sTShkC5NeFapsH8TieJJ/sFr5IG4+CePLu/WImZmr5i821WMoDkIYg+R+x2XZO6UKRZfWWAv5WJaCG4x5vUVUPLDnxQ0mlfGaq8haviA6pp9lGYYuRqH48q6ejjbfNAcI26ZNGfWCjnr+u+EtQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756275948; c=relaxed/simple; bh=qa2kYRm0x6v7vdHP2bhZRznmrUkkj+A7qeNxs/NqYSU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=WLSau4JKNIWrbPCs6lSM2MngVQk/hx8CFZYgL8tFkGb8bEkcKO7LojGi6Mg0s8jTQO2JT8mnv/d42yg0ee1jw5zg1nKprhf4KlQl4uM9e87p7PV596o4+GSy84Ueb3VuS44ad47R9izAS6xZmRXtfWBo6xNRbURcJDXAxiQUFi8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=ideasonboard.com; spf=pass smtp.mailfrom=ideasonboard.com; dkim=pass (1024-bit key) header.d=ideasonboard.com header.i=@ideasonboard.com header.b=iq9A8Lo3; arc=none smtp.client-ip=213.167.242.64 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=ideasonboard.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=ideasonboard.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="iq9A8Lo3" Received: from mail.ideasonboard.com (unknown [223.190.80.94]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 032EA300E; Wed, 27 Aug 2025 08:24:37 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1756275878; bh=qa2kYRm0x6v7vdHP2bhZRznmrUkkj+A7qeNxs/NqYSU=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=iq9A8Lo3RY5iQDlk+pTlHe8FRmkLLwwfbLoZEDqp7w8u2YZ2T4EjnViPvmVtp/q6v S4BEGbL+LxWk49llTHOqU0aKpIgEx+RMqAQdeUiP4efziJaYTKssjYL3TGlPVR0Oiw P9KMzv1QNLZHChnldZnnVI978BivmgmSFkrEHsaU= From: Jai Luthra Date: Wed, 27 Aug 2025 11:54:11 +0530 Subject: [PATCH 4/5] media: staging: Drop bcm2835-camera driver 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: <20250827-vchiq-destage-v1-4-5052a0d81c42@ideasonboard.com> References: <20250827-vchiq-destage-v1-0-5052a0d81c42@ideasonboard.com> In-Reply-To: <20250827-vchiq-destage-v1-0-5052a0d81c42@ideasonboard.com> To: Florian Fainelli , Broadcom internal kernel review list , Greg Kroah-Hartman , Ray Jui , Scott Branden Cc: linux-rpi-kernel@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-staging@lists.linux.dev, linux-kernel@vger.kernel.org, kernel-list@raspberrypi.com, Stefan Wahren , Dave Stevenson , Laurent Pinchart , Jai Luthra X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=110987; i=jai.luthra@ideasonboard.com; h=from:subject:message-id; bh=qa2kYRm0x6v7vdHP2bhZRznmrUkkj+A7qeNxs/NqYSU=; b=owEBbQKS/ZANAwAKAUPekfkkmnFFAcsmYgBorqScRDQPIuoAFFT3ROkXncn15JHXzUJJQQ5jP 0/FUAFPqPOJAjMEAAEKAB0WIQRN4NgY5dV16NRar8VD3pH5JJpxRQUCaK6knAAKCRBD3pH5JJpx RRUYD/9Y1XqU3jki35ks++GbLfrzKmVyisueioXuXAy/gQhnfJDCT6guKI6djjPAe3z/DriAEJs A26yR3oUkddmSnhmVwopSFN2jvAMaeu+b1CWyLAL/lri0xcvi4pOEBsCt3InxFb08JijpnU3dJF 2QzY57JlqfYaz0uOfvkwjiZYMOqp+VCENwXLBSFnsXXC54HOiDRpl/379QdabSTw5KXlIkBLg6c bNcng+9RFuVTvntWGOym68CF4f65dKhasJXfUI+PEUvbVFCDV6JAr/gNHlGv0vzrYJ7lyJ7ewsr aieoIb+JhFGn2pbZbPshMGEdda7DtEHwNODEETF0PwO2+xrXs+rpBexU5ufnF/AuXGQ7YZ36uAz rYouEveGfnJXU06+IwEtD6ZdbCcheGwfqlYFlRM/INVXCmeywUn/XHVMaHrrW6U5BK2VL7jz7NR IV9S0DXxdR+Yre+QMRW8Tlx5Nc8rhl4MNzMWQ6Q00OROyGEIZohb1PONqXSZeKXvR7NuLntw+WY 5HEdKM3PaE6ZUCVZTbhk6UBoKmLPXcMBxV+KgGUvOo70Oew0FpP5faZ2bRZYtGdAUuyaYT88bND KyxRAKEmQq/7o41de6LgDIW3w8waZOdB8FzemqQ6ddHpR3RXQOKfkXPgVCD8qyTl8qBYEZT+vi1 Qrr9NIeuqjq2bgg== X-Developer-Key: i=jai.luthra@ideasonboard.com; a=openpgp; fpr=4DE0D818E5D575E8D45AAFC543DE91F9249A7145 The bcm2835-camera driver is replaced by the V4L2 bcm2835-unicam driver that is already upstream. So drop it from staging. This also simplifies destaging of VCHIQ MMAL, by reducing the users of the MMAL API (this driver is one of them). Signed-off-by: Jai Luthra Acked-by: Laurent Pinchart --- drivers/staging/vc04_services/Kconfig | 2 - drivers/staging/vc04_services/Makefile | 1 - .../staging/vc04_services/bcm2835-camera/Kconfig | 13 - .../staging/vc04_services/bcm2835-camera/Makefile | 6 - drivers/staging/vc04_services/bcm2835-camera/TODO | 17 - .../vc04_services/bcm2835-camera/bcm2835-camera.c | 2012 ----------------= ---- .../vc04_services/bcm2835-camera/bcm2835-camera.h | 142 -- .../vc04_services/bcm2835-camera/controls.c | 1399 -------------- 8 files changed, 3592 deletions(-) diff --git a/drivers/staging/vc04_services/Kconfig b/drivers/staging/vc04_s= ervices/Kconfig index 3c01a1a304f1e6e6a03062b1a5f6af59643adf66..23b5e3dde11447064d084ea5a6d= 36b8041dceb08 100644 --- a/drivers/staging/vc04_services/Kconfig +++ b/drivers/staging/vc04_services/Kconfig @@ -13,8 +13,6 @@ if BCM_VIDEOCORE =20 source "drivers/staging/vc04_services/bcm2835-audio/Kconfig" =20 -source "drivers/staging/vc04_services/bcm2835-camera/Kconfig" - source "drivers/staging/vc04_services/vchiq-mmal/Kconfig" =20 endif diff --git a/drivers/staging/vc04_services/Makefile b/drivers/staging/vc04_= services/Makefile index 51c9466ec7a28141cf66508f602f43cd89ad408b..7a716a5c781530b673027b9f82e= c94ebfd615f8a 100644 --- a/drivers/staging/vc04_services/Makefile +++ b/drivers/staging/vc04_services/Makefile @@ -1,5 +1,4 @@ # SPDX-License-Identifier: GPL-2.0 obj-$(CONFIG_SND_BCM2835) +=3D bcm2835-audio/ -obj-$(CONFIG_VIDEO_BCM2835) +=3D bcm2835-camera/ obj-$(CONFIG_BCM2835_VCHIQ_MMAL) +=3D vchiq-mmal/ =20 diff --git a/drivers/staging/vc04_services/bcm2835-camera/Kconfig b/drivers= /staging/vc04_services/bcm2835-camera/Kconfig deleted file mode 100644 index 870c9afb223a220baf6238dc235a8b7634763831..000000000000000000000000000= 0000000000000 --- a/drivers/staging/vc04_services/bcm2835-camera/Kconfig +++ /dev/null @@ -1,13 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0 -config VIDEO_BCM2835 - tristate "BCM2835 Camera" - depends on MEDIA_SUPPORT - depends on VIDEO_DEV && (ARCH_BCM2835 || COMPILE_TEST) - select BCM2835_VCHIQ if HAS_DMA - select BCM2835_VCHIQ_MMAL if HAS_DMA - select VIDEOBUF2_VMALLOC - select BTREE - help - Say Y here to enable camera host interface devices for - Broadcom BCM2835 SoC. This operates over the VCHIQ interface - to a service running on VideoCore. diff --git a/drivers/staging/vc04_services/bcm2835-camera/Makefile b/driver= s/staging/vc04_services/bcm2835-camera/Makefile deleted file mode 100644 index 203b93899b2065bfe9c1326f31ab01b66b829db2..000000000000000000000000000= 0000000000000 --- a/drivers/staging/vc04_services/bcm2835-camera/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0 -bcm2835-v4l2-$(CONFIG_VIDEO_BCM2835) :=3D \ - bcm2835-camera.o \ - controls.o - -obj-$(CONFIG_VIDEO_BCM2835) +=3D bcm2835-v4l2.o diff --git a/drivers/staging/vc04_services/bcm2835-camera/TODO b/drivers/st= aging/vc04_services/bcm2835-camera/TODO deleted file mode 100644 index 6c2b4ffe49964096e135fc400ab070672c18458a..000000000000000000000000000= 0000000000000 --- a/drivers/staging/vc04_services/bcm2835-camera/TODO +++ /dev/null @@ -1,17 +0,0 @@ -1) Support dma-buf memory management. - -In order to zero-copy import camera images into the 3D or display -pipelines, we need to export our buffers through dma-buf so that the -vc4 driver can import them. This may involve bringing in the VCSM -driver (which allows long-term management of regions of memory in the -space that the VPU reserved and Linux otherwise doesn't have access -to), or building some new protocol that allows VCSM-style management -of Linux's CMA memory. - -2) Avoid extra copies for padding of images. - -We expose V4L2_PIX_FMT_* formats that have a specified stride/height -padding in the V4L2 spec, but that padding doesn't match what the -hardware can do. If we exposed the native padding requirements -through the V4L2 "multiplanar" formats, the firmware would have one -less copy it needed to do. diff --git a/drivers/staging/vc04_services/bcm2835-camera/bcm2835-camera.c = b/drivers/staging/vc04_services/bcm2835-camera/bcm2835-camera.c deleted file mode 100644 index fcbbe1aa60b768e5a7a08a131f595a0457f4473a..000000000000000000000000000= 0000000000000 --- a/drivers/staging/vc04_services/bcm2835-camera/bcm2835-camera.c +++ /dev/null @@ -1,2012 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -/* - * Broadcom BCM2835 V4L2 driver - * - * Copyright =C2=A9 2013 Raspberry Pi (Trading) Ltd. - * - * Authors: Vincent Sanders @ Collabora - * Dave Stevenson @ Broadcom - * (now dave.stevenson@raspberrypi.org) - * Simon Mellor @ Broadcom - * Luke Diamand @ Broadcom - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include "../vchiq-mmal/mmal-common.h" -#include "../vchiq-mmal/mmal-encodings.h" -#include "../vchiq-mmal/mmal-vchiq.h" -#include "../vchiq-mmal/mmal-msg.h" -#include "../vchiq-mmal/mmal-parameters.h" -#include "bcm2835-camera.h" - -#define MIN_WIDTH 32 -#define MIN_HEIGHT 32 -#define MIN_BUFFER_SIZE (80 * 1024) - -#define MAX_VIDEO_MODE_WIDTH 1280 -#define MAX_VIDEO_MODE_HEIGHT 720 - -#define MAX_BCM2835_CAMERAS 2 - -int bcm2835_v4l2_debug; -module_param_named(debug, bcm2835_v4l2_debug, int, 0644); -MODULE_PARM_DESC(bcm2835_v4l2_debug, "Debug level 0-2"); - -#define UNSET (-1) -static int video_nr[] =3D {[0 ... (MAX_BCM2835_CAMERAS - 1)] =3D UNSET }; -module_param_array(video_nr, int, NULL, 0644); -MODULE_PARM_DESC(video_nr, "videoX start numbers, -1 is autodetect"); - -static int max_video_width =3D MAX_VIDEO_MODE_WIDTH; -static int max_video_height =3D MAX_VIDEO_MODE_HEIGHT; -module_param(max_video_width, int, 0644); -MODULE_PARM_DESC(max_video_width, "Threshold for video mode"); -module_param(max_video_height, int, 0644); -MODULE_PARM_DESC(max_video_height, "Threshold for video mode"); - -/* camera instance counter */ -static atomic_t camera_instance =3D ATOMIC_INIT(0); - -/* global device data array */ -static struct bcm2835_mmal_dev *gdev[MAX_BCM2835_CAMERAS]; - -#define FPS_MIN 1 -#define FPS_MAX 90 - -/* timeperframe: min/max and default */ -static const struct v4l2_fract - tpf_min =3D {.numerator =3D 1, .denominator =3D FPS_MAX}, - tpf_max =3D {.numerator =3D 1, .denominator =3D FPS_MIN}, - tpf_default =3D {.numerator =3D 1000, .denominator =3D 30000}; - -/* Container for MMAL and VB2 buffers*/ -struct vb2_mmal_buffer { - struct vb2_v4l2_buffer vb; - struct mmal_buffer mmal; -}; - -/* video formats */ -static struct mmal_fmt formats[] =3D { - { - .fourcc =3D V4L2_PIX_FMT_YUV420, - .mmal =3D MMAL_ENCODING_I420, - .depth =3D 12, - .mmal_component =3D COMP_CAMERA, - .ybbp =3D 1, - .remove_padding =3D true, - }, { - .fourcc =3D V4L2_PIX_FMT_YUYV, - .mmal =3D MMAL_ENCODING_YUYV, - .depth =3D 16, - .mmal_component =3D COMP_CAMERA, - .ybbp =3D 2, - .remove_padding =3D false, - }, { - .fourcc =3D V4L2_PIX_FMT_RGB24, - .mmal =3D MMAL_ENCODING_RGB24, - .depth =3D 24, - .mmal_component =3D COMP_CAMERA, - .ybbp =3D 3, - .remove_padding =3D false, - }, { - .fourcc =3D V4L2_PIX_FMT_JPEG, - .flags =3D V4L2_FMT_FLAG_COMPRESSED, - .mmal =3D MMAL_ENCODING_JPEG, - .depth =3D 8, - .mmal_component =3D COMP_IMAGE_ENCODE, - .ybbp =3D 0, - .remove_padding =3D false, - }, { - .fourcc =3D V4L2_PIX_FMT_H264, - .flags =3D V4L2_FMT_FLAG_COMPRESSED, - .mmal =3D MMAL_ENCODING_H264, - .depth =3D 8, - .mmal_component =3D COMP_VIDEO_ENCODE, - .ybbp =3D 0, - .remove_padding =3D false, - }, { - .fourcc =3D V4L2_PIX_FMT_MJPEG, - .flags =3D V4L2_FMT_FLAG_COMPRESSED, - .mmal =3D MMAL_ENCODING_MJPEG, - .depth =3D 8, - .mmal_component =3D COMP_VIDEO_ENCODE, - .ybbp =3D 0, - .remove_padding =3D false, - }, { - .fourcc =3D V4L2_PIX_FMT_YVYU, - .mmal =3D MMAL_ENCODING_YVYU, - .depth =3D 16, - .mmal_component =3D COMP_CAMERA, - .ybbp =3D 2, - .remove_padding =3D false, - }, { - .fourcc =3D V4L2_PIX_FMT_VYUY, - .mmal =3D MMAL_ENCODING_VYUY, - .depth =3D 16, - .mmal_component =3D COMP_CAMERA, - .ybbp =3D 2, - .remove_padding =3D false, - }, { - .fourcc =3D V4L2_PIX_FMT_UYVY, - .mmal =3D MMAL_ENCODING_UYVY, - .depth =3D 16, - .mmal_component =3D COMP_CAMERA, - .ybbp =3D 2, - .remove_padding =3D false, - }, { - .fourcc =3D V4L2_PIX_FMT_NV12, - .mmal =3D MMAL_ENCODING_NV12, - .depth =3D 12, - .mmal_component =3D COMP_CAMERA, - .ybbp =3D 1, - .remove_padding =3D true, - }, { - .fourcc =3D V4L2_PIX_FMT_BGR24, - .mmal =3D MMAL_ENCODING_BGR24, - .depth =3D 24, - .mmal_component =3D COMP_CAMERA, - .ybbp =3D 3, - .remove_padding =3D false, - }, { - .fourcc =3D V4L2_PIX_FMT_YVU420, - .mmal =3D MMAL_ENCODING_YV12, - .depth =3D 12, - .mmal_component =3D COMP_CAMERA, - .ybbp =3D 1, - .remove_padding =3D true, - }, { - .fourcc =3D V4L2_PIX_FMT_NV21, - .mmal =3D MMAL_ENCODING_NV21, - .depth =3D 12, - .mmal_component =3D COMP_CAMERA, - .ybbp =3D 1, - .remove_padding =3D true, - }, { - .fourcc =3D V4L2_PIX_FMT_BGR32, - .mmal =3D MMAL_ENCODING_BGRA, - .depth =3D 32, - .mmal_component =3D COMP_CAMERA, - .ybbp =3D 4, - .remove_padding =3D false, - }, -}; - -static struct mmal_fmt *get_format(struct v4l2_format *f) -{ - struct mmal_fmt *fmt; - unsigned int k; - - for (k =3D 0; k < ARRAY_SIZE(formats); k++) { - fmt =3D &formats[k]; - if (fmt->fourcc =3D=3D f->fmt.pix.pixelformat) - return fmt; - } - - return NULL; -} - -/* ------------------------------------------------------------------ - * Videobuf queue operations - * ------------------------------------------------------------------ - */ - -static int queue_setup(struct vb2_queue *vq, - unsigned int *nbuffers, unsigned int *nplanes, - unsigned int sizes[], struct device *alloc_ctxs[]) -{ - struct bcm2835_mmal_dev *dev =3D vb2_get_drv_priv(vq); - unsigned long size; - - /* refuse queue setup if port is not configured */ - if (!dev->capture.port) { - v4l2_err(&dev->v4l2_dev, - "%s: capture port not configured\n", __func__); - return -EINVAL; - } - - /* Handle CREATE_BUFS situation - *nplanes !=3D 0 */ - if (*nplanes) { - if (*nplanes !=3D 1 || - sizes[0] < dev->capture.port->current_buffer.size) { - v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev, - "%s: dev:%p Invalid buffer request from CREATE_BUFS, size %u < %u, np= lanes %u !=3D 1\n", - __func__, dev, sizes[0], - dev->capture.port->current_buffer.size, - *nplanes); - return -EINVAL; - } else { - return 0; - } - } - - /* Handle REQBUFS situation */ - size =3D dev->capture.port->current_buffer.size; - if (size =3D=3D 0) { - v4l2_err(&dev->v4l2_dev, - "%s: capture port buffer size is zero\n", __func__); - return -EINVAL; - } - - if (*nbuffers < dev->capture.port->minimum_buffer.num) - *nbuffers =3D dev->capture.port->minimum_buffer.num; - - dev->capture.port->current_buffer.num =3D *nbuffers; - - *nplanes =3D 1; - - sizes[0] =3D size; - - /* - * videobuf2-vmalloc allocator is context-less so no need to set - * alloc_ctxs array. - */ - - v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev, "%s: dev:%p\n", - __func__, dev); - - return 0; -} - -static int buffer_init(struct vb2_buffer *vb) -{ - struct bcm2835_mmal_dev *dev =3D vb2_get_drv_priv(vb->vb2_queue); - struct vb2_v4l2_buffer *vb2 =3D to_vb2_v4l2_buffer(vb); - struct vb2_mmal_buffer *buf =3D - container_of(vb2, struct vb2_mmal_buffer, vb); - - v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev, "%s: dev:%p, vb %p\n", - __func__, dev, vb); - buf->mmal.buffer =3D vb2_plane_vaddr(&buf->vb.vb2_buf, 0); - buf->mmal.buffer_size =3D vb2_plane_size(&buf->vb.vb2_buf, 0); - - return mmal_vchi_buffer_init(dev->instance, &buf->mmal); -} - -static int buffer_prepare(struct vb2_buffer *vb) -{ - struct bcm2835_mmal_dev *dev =3D vb2_get_drv_priv(vb->vb2_queue); - unsigned long size; - - v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev, "%s: dev:%p, vb %p\n", - __func__, dev, vb); - - if (!dev->capture.port || !dev->capture.fmt) - return -ENODEV; - - size =3D dev->capture.stride * dev->capture.height; - if (vb2_plane_size(vb, 0) < size) { - v4l2_err(&dev->v4l2_dev, - "%s data will not fit into plane (%lu < %lu)\n", - __func__, vb2_plane_size(vb, 0), size); - return -EINVAL; - } - - return 0; -} - -static void buffer_cleanup(struct vb2_buffer *vb) -{ - struct bcm2835_mmal_dev *dev =3D vb2_get_drv_priv(vb->vb2_queue); - struct vb2_v4l2_buffer *vb2 =3D to_vb2_v4l2_buffer(vb); - struct vb2_mmal_buffer *buf =3D - container_of(vb2, struct vb2_mmal_buffer, vb); - - v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev, "%s: dev:%p, vb %p\n", - __func__, dev, vb); - - mmal_vchi_buffer_cleanup(&buf->mmal); -} - -static inline bool is_capturing(struct bcm2835_mmal_dev *dev) -{ - return dev->capture.camera_port =3D=3D - &dev->component[COMP_CAMERA]->output[CAM_PORT_CAPTURE]; -} - -static void buffer_cb(struct vchiq_mmal_instance *instance, - struct vchiq_mmal_port *port, - int status, - struct mmal_buffer *mmal_buf) -{ - struct bcm2835_mmal_dev *dev =3D port->cb_ctx; - struct vb2_mmal_buffer *buf =3D - container_of(mmal_buf, struct vb2_mmal_buffer, mmal); - - v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev, - "%s: status:%d, buf:%p, length:%lu, flags %u, pts %lld\n", - __func__, status, buf, mmal_buf->length, mmal_buf->mmal_flags, - mmal_buf->pts); - - if (status) { - /* error in transfer */ - if (buf) { - /* there was a buffer with the error so return it */ - vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR); - } - return; - } - - if (mmal_buf->length =3D=3D 0) { - /* stream ended */ - if (dev->capture.frame_count) { - /* empty buffer whilst capturing - expected to be an - * EOS, so grab another frame - */ - if (is_capturing(dev)) { - v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev, - "Grab another frame"); - vchiq_mmal_port_parameter_set(instance, - dev->capture.camera_port, - MMAL_PARAMETER_CAPTURE, - &dev->capture.frame_count, - sizeof(dev->capture.frame_count)); - } - if (vchiq_mmal_submit_buffer(instance, port, - &buf->mmal)) - v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev, - "Failed to return EOS buffer"); - } else { - /* stopping streaming. - * return buffer, and signal frame completion - */ - vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR); - complete(&dev->capture.frame_cmplt); - } - return; - } - - if (!dev->capture.frame_count) { - /* signal frame completion */ - vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR); - complete(&dev->capture.frame_cmplt); - return; - } - - if (dev->capture.vc_start_timestamp !=3D -1 && mmal_buf->pts) { - ktime_t timestamp; - s64 runtime_us =3D mmal_buf->pts - - dev->capture.vc_start_timestamp; - timestamp =3D ktime_add_us(dev->capture.kernel_start_ts, - runtime_us); - v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev, - "Convert start time %llu and %llu with offset %llu to %llu\n", - ktime_to_ns(dev->capture.kernel_start_ts), - dev->capture.vc_start_timestamp, mmal_buf->pts, - ktime_to_ns(timestamp)); - buf->vb.vb2_buf.timestamp =3D ktime_to_ns(timestamp); - } else { - buf->vb.vb2_buf.timestamp =3D ktime_get_ns(); - } - buf->vb.sequence =3D dev->capture.sequence++; - buf->vb.field =3D V4L2_FIELD_NONE; - - vb2_set_plane_payload(&buf->vb.vb2_buf, 0, mmal_buf->length); - if (mmal_buf->mmal_flags & MMAL_BUFFER_HEADER_FLAG_KEYFRAME) - buf->vb.flags |=3D V4L2_BUF_FLAG_KEYFRAME; - - vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_DONE); - - if (mmal_buf->mmal_flags & MMAL_BUFFER_HEADER_FLAG_EOS && - is_capturing(dev)) { - v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev, - "Grab another frame as buffer has EOS"); - vchiq_mmal_port_parameter_set(instance, - dev->capture.camera_port, - MMAL_PARAMETER_CAPTURE, - &dev->capture.frame_count, - sizeof(dev->capture.frame_count)); - } -} - -static int enable_camera(struct bcm2835_mmal_dev *dev) -{ - int ret; - - if (!dev->camera_use_count) { - ret =3D vchiq_mmal_port_parameter_set(dev->instance, - &dev->component[COMP_CAMERA]->control, - MMAL_PARAMETER_CAMERA_NUM, &dev->camera_num, - sizeof(dev->camera_num)); - if (ret < 0) { - v4l2_err(&dev->v4l2_dev, - "Failed setting camera num, ret %d\n", ret); - return -EINVAL; - } - - ret =3D vchiq_mmal_component_enable(dev->instance, - dev->component[COMP_CAMERA]); - if (ret < 0) { - v4l2_err(&dev->v4l2_dev, - "Failed enabling camera, ret %d\n", ret); - return -EINVAL; - } - } - dev->camera_use_count++; - v4l2_dbg(1, bcm2835_v4l2_debug, - &dev->v4l2_dev, "enabled camera (refcount %d)\n", - dev->camera_use_count); - return 0; -} - -static int disable_camera(struct bcm2835_mmal_dev *dev) -{ - int ret; - - if (!dev->camera_use_count) { - v4l2_err(&dev->v4l2_dev, - "Disabled the camera when already disabled\n"); - return -EINVAL; - } - dev->camera_use_count--; - if (!dev->camera_use_count) { - unsigned int i =3D 0xFFFFFFFF; - - v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev, - "Disabling camera\n"); - ret =3D vchiq_mmal_component_disable(dev->instance, - dev->component[COMP_CAMERA]); - if (ret < 0) { - v4l2_err(&dev->v4l2_dev, - "Failed disabling camera, ret %d\n", ret); - return -EINVAL; - } - vchiq_mmal_port_parameter_set(dev->instance, - &dev->component[COMP_CAMERA]->control, - MMAL_PARAMETER_CAMERA_NUM, - &i, - sizeof(i)); - } - v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev, - "Camera refcount now %d\n", dev->camera_use_count); - return 0; -} - -static void buffer_queue(struct vb2_buffer *vb) -{ - struct bcm2835_mmal_dev *dev =3D vb2_get_drv_priv(vb->vb2_queue); - struct vb2_v4l2_buffer *vb2 =3D to_vb2_v4l2_buffer(vb); - struct vb2_mmal_buffer *buf =3D - container_of(vb2, struct vb2_mmal_buffer, vb); - int ret; - - v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev, - "%s: dev:%p buf:%p, idx %u\n", - __func__, dev, buf, vb2->vb2_buf.index); - - ret =3D vchiq_mmal_submit_buffer(dev->instance, dev->capture.port, - &buf->mmal); - if (ret < 0) - v4l2_err(&dev->v4l2_dev, "%s: error submitting buffer\n", - __func__); -} - -static int start_streaming(struct vb2_queue *vq, unsigned int count) -{ - struct bcm2835_mmal_dev *dev =3D vb2_get_drv_priv(vq); - int ret; - u32 parameter_size; - - v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev, "%s: dev:%p\n", - __func__, dev); - - /* ensure a format has actually been set */ - if (!dev->capture.port) - return -EINVAL; - - if (enable_camera(dev) < 0) { - v4l2_err(&dev->v4l2_dev, "Failed to enable camera\n"); - return -EINVAL; - } - - /*init_completion(&dev->capture.frame_cmplt); */ - - /* enable frame capture */ - dev->capture.frame_count =3D 1; - - /* reset sequence number */ - dev->capture.sequence =3D 0; - - /* if the preview is not already running, wait for a few frames for AGC - * to settle down. - */ - if (!dev->component[COMP_PREVIEW]->enabled) - msleep(300); - - /* enable the connection from camera to encoder (if applicable) */ - if (dev->capture.camera_port !=3D dev->capture.port && - dev->capture.camera_port) { - ret =3D vchiq_mmal_port_enable(dev->instance, - dev->capture.camera_port, NULL); - if (ret) { - v4l2_err(&dev->v4l2_dev, - "Failed to enable encode tunnel - error %d\n", - ret); - return -1; - } - } - - /* Get VC timestamp at this point in time */ - parameter_size =3D sizeof(dev->capture.vc_start_timestamp); - if (vchiq_mmal_port_parameter_get(dev->instance, - dev->capture.camera_port, - MMAL_PARAMETER_SYSTEM_TIME, - &dev->capture.vc_start_timestamp, - ¶meter_size)) { - v4l2_err(&dev->v4l2_dev, - "Failed to get VC start time - update your VC f/w\n"); - - /* Flag to indicate just to rely on kernel timestamps */ - dev->capture.vc_start_timestamp =3D -1; - } else { - v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev, - "Start time %lld size %d\n", - dev->capture.vc_start_timestamp, parameter_size); - } - - dev->capture.kernel_start_ts =3D ktime_get(); - - /* enable the camera port */ - dev->capture.port->cb_ctx =3D dev; - ret =3D vchiq_mmal_port_enable(dev->instance, dev->capture.port, - buffer_cb); - if (ret) { - v4l2_err(&dev->v4l2_dev, - "Failed to enable capture port - error %d. Disabling camera port again= \n", - ret); - - vchiq_mmal_port_disable(dev->instance, - dev->capture.camera_port); - if (disable_camera(dev) < 0) { - v4l2_err(&dev->v4l2_dev, "Failed to disable camera\n"); - return -EINVAL; - } - return -1; - } - - /* capture the first frame */ - vchiq_mmal_port_parameter_set(dev->instance, - dev->capture.camera_port, - MMAL_PARAMETER_CAPTURE, - &dev->capture.frame_count, - sizeof(dev->capture.frame_count)); - return 0; -} - -/* abort streaming and wait for last buffer */ -static void stop_streaming(struct vb2_queue *vq) -{ - int ret; - unsigned long time_left; - struct bcm2835_mmal_dev *dev =3D vb2_get_drv_priv(vq); - struct vchiq_mmal_port *port =3D dev->capture.port; - - v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev, "%s: dev:%p\n", - __func__, dev); - - init_completion(&dev->capture.frame_cmplt); - dev->capture.frame_count =3D 0; - - /* ensure a format has actually been set */ - if (!port) { - v4l2_err(&dev->v4l2_dev, - "no capture port - stream not started?\n"); - return; - } - - v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev, "stopping capturing\n"); - - /* stop capturing frames */ - vchiq_mmal_port_parameter_set(dev->instance, - dev->capture.camera_port, - MMAL_PARAMETER_CAPTURE, - &dev->capture.frame_count, - sizeof(dev->capture.frame_count)); - - v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev, - "disabling connection\n"); - - /* disable the connection from camera to encoder */ - ret =3D vchiq_mmal_port_disable(dev->instance, dev->capture.camera_port); - if (!ret && dev->capture.camera_port !=3D port) { - v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev, - "disabling port\n"); - ret =3D vchiq_mmal_port_disable(dev->instance, port); - } else if (dev->capture.camera_port !=3D port) { - v4l2_err(&dev->v4l2_dev, "port_disable failed, error %d\n", - ret); - } - - /* wait for all buffers to be returned */ - while (atomic_read(&port->buffers_with_vpu)) { - v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev, - "%s: Waiting for buffers to be returned - %d outstanding\n", - __func__, atomic_read(&port->buffers_with_vpu)); - time_left =3D wait_for_completion_timeout(&dev->capture.frame_cmplt, - HZ); - if (time_left =3D=3D 0) { - v4l2_err(&dev->v4l2_dev, "%s: Timeout waiting for buffers to be returne= d - %d outstanding\n", - __func__, - atomic_read(&port->buffers_with_vpu)); - break; - } - } - - if (disable_camera(dev) < 0) - v4l2_err(&dev->v4l2_dev, "Failed to disable camera\n"); -} - -static const struct vb2_ops bcm2835_mmal_video_qops =3D { - .queue_setup =3D queue_setup, - .buf_init =3D buffer_init, - .buf_prepare =3D buffer_prepare, - .buf_cleanup =3D buffer_cleanup, - .buf_queue =3D buffer_queue, - .start_streaming =3D start_streaming, - .stop_streaming =3D stop_streaming, -}; - -/* ------------------------------------------------------------------ - * IOCTL operations - * ------------------------------------------------------------------ - */ - -static int set_overlay_params(struct bcm2835_mmal_dev *dev, - struct vchiq_mmal_port *port) -{ - struct mmal_parameter_displayregion prev_config =3D { - .set =3D MMAL_DISPLAY_SET_LAYER | - MMAL_DISPLAY_SET_ALPHA | - MMAL_DISPLAY_SET_DEST_RECT | - MMAL_DISPLAY_SET_FULLSCREEN, - .layer =3D 2, - .alpha =3D dev->overlay.global_alpha, - .fullscreen =3D 0, - .dest_rect =3D { - .x =3D dev->overlay.w.left, - .y =3D dev->overlay.w.top, - .width =3D dev->overlay.w.width, - .height =3D dev->overlay.w.height, - }, - }; - return vchiq_mmal_port_parameter_set(dev->instance, port, - MMAL_PARAMETER_DISPLAYREGION, - &prev_config, sizeof(prev_config)); -} - -/* overlay ioctl */ -static int vidioc_enum_fmt_vid_overlay(struct file *file, void *priv, - struct v4l2_fmtdesc *f) -{ - struct mmal_fmt *fmt; - - if (f->index >=3D ARRAY_SIZE(formats)) - return -EINVAL; - - fmt =3D &formats[f->index]; - - f->pixelformat =3D fmt->fourcc; - - return 0; -} - -static int vidioc_g_fmt_vid_overlay(struct file *file, void *priv, - struct v4l2_format *f) -{ - struct bcm2835_mmal_dev *dev =3D video_drvdata(file); - - f->fmt.win =3D dev->overlay; - - return 0; -} - -static int vidioc_try_fmt_vid_overlay(struct file *file, void *priv, - struct v4l2_format *f) -{ - struct bcm2835_mmal_dev *dev =3D video_drvdata(file); - - f->fmt.win.field =3D V4L2_FIELD_NONE; - f->fmt.win.chromakey =3D 0; - f->fmt.win.clips =3D NULL; - f->fmt.win.clipcount =3D 0; - f->fmt.win.bitmap =3D NULL; - - v4l_bound_align_image(&f->fmt.win.w.width, MIN_WIDTH, dev->max_width, 1, - &f->fmt.win.w.height, MIN_HEIGHT, dev->max_height, - 1, 0); - v4l_bound_align_image(&f->fmt.win.w.left, MIN_WIDTH, dev->max_width, 1, - &f->fmt.win.w.top, MIN_HEIGHT, dev->max_height, - 1, 0); - - v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev, - "Overlay: Now w/h %dx%d l/t %dx%d\n", - f->fmt.win.w.width, f->fmt.win.w.height, - f->fmt.win.w.left, f->fmt.win.w.top); - - v4l2_dump_win_format(1, - bcm2835_v4l2_debug, - &dev->v4l2_dev, - &f->fmt.win, - __func__); - return 0; -} - -static int vidioc_s_fmt_vid_overlay(struct file *file, void *priv, - struct v4l2_format *f) -{ - struct bcm2835_mmal_dev *dev =3D video_drvdata(file); - - vidioc_try_fmt_vid_overlay(file, priv, f); - - dev->overlay =3D f->fmt.win; - if (dev->component[COMP_PREVIEW]->enabled) { - set_overlay_params(dev, - &dev->component[COMP_PREVIEW]->input[0]); - } - - return 0; -} - -static int vidioc_overlay(struct file *file, void *f, unsigned int on) -{ - int ret; - struct bcm2835_mmal_dev *dev =3D video_drvdata(file); - struct vchiq_mmal_port *src; - struct vchiq_mmal_port *dst; - - if ((on && dev->component[COMP_PREVIEW]->enabled) || - (!on && !dev->component[COMP_PREVIEW]->enabled)) - return 0; /* already in requested state */ - - src =3D &dev->component[COMP_CAMERA]->output[CAM_PORT_PREVIEW]; - - if (!on) { - /* disconnect preview ports and disable component */ - ret =3D vchiq_mmal_port_disable(dev->instance, src); - if (!ret) - ret =3D vchiq_mmal_port_connect_tunnel(dev->instance, src, - NULL); - if (ret >=3D 0) - ret =3D vchiq_mmal_component_disable(dev->instance, - dev->component[COMP_PREVIEW]); - - disable_camera(dev); - return ret; - } - - /* set preview port format and connect it to output */ - dst =3D &dev->component[COMP_PREVIEW]->input[0]; - - ret =3D vchiq_mmal_port_set_format(dev->instance, src); - if (ret < 0) - return ret; - - ret =3D set_overlay_params(dev, dst); - if (ret < 0) - return ret; - - if (enable_camera(dev) < 0) - return -EINVAL; - - ret =3D vchiq_mmal_component_enable(dev->instance, - dev->component[COMP_PREVIEW]); - if (ret < 0) - return ret; - - v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev, "connecting %p to %p\n", - src, dst); - ret =3D vchiq_mmal_port_connect_tunnel(dev->instance, src, dst); - if (ret) - return ret; - - return vchiq_mmal_port_enable(dev->instance, src, NULL); -} - -static int vidioc_g_fbuf(struct file *file, void *fh, - struct v4l2_framebuffer *a) -{ - /* The video overlay must stay within the framebuffer and can't be - * positioned independently. - */ - struct bcm2835_mmal_dev *dev =3D video_drvdata(file); - struct vchiq_mmal_port *preview_port =3D - &dev->component[COMP_CAMERA]->output[CAM_PORT_PREVIEW]; - - a->capability =3D V4L2_FBUF_CAP_EXTERNOVERLAY | - V4L2_FBUF_CAP_GLOBAL_ALPHA; - a->flags =3D V4L2_FBUF_FLAG_OVERLAY; - a->fmt.width =3D preview_port->es.video.width; - a->fmt.height =3D preview_port->es.video.height; - a->fmt.pixelformat =3D V4L2_PIX_FMT_YUV420; - a->fmt.bytesperline =3D preview_port->es.video.width; - a->fmt.sizeimage =3D (preview_port->es.video.width * - preview_port->es.video.height * 3) >> 1; - a->fmt.colorspace =3D V4L2_COLORSPACE_SMPTE170M; - - return 0; -} - -/* input ioctls */ -static int vidioc_enum_input(struct file *file, void *priv, - struct v4l2_input *inp) -{ - /* only a single camera input */ - if (inp->index) - return -EINVAL; - - inp->type =3D V4L2_INPUT_TYPE_CAMERA; - snprintf((char *)inp->name, sizeof(inp->name), "Camera %u", inp->index); - return 0; -} - -static int vidioc_g_input(struct file *file, void *priv, unsigned int *i) -{ - *i =3D 0; - return 0; -} - -static int vidioc_s_input(struct file *file, void *priv, unsigned int i) -{ - if (i) - return -EINVAL; - - return 0; -} - -/* capture ioctls */ -static int vidioc_querycap(struct file *file, void *priv, - struct v4l2_capability *cap) -{ - struct bcm2835_mmal_dev *dev =3D video_drvdata(file); - u32 major; - u32 minor; - - vchiq_mmal_version(dev->instance, &major, &minor); - - strscpy(cap->driver, "bcm2835 mmal", sizeof(cap->driver)); - snprintf((char *)cap->card, sizeof(cap->card), "mmal service %d.%d", majo= r, minor); - - snprintf((char *)cap->bus_info, sizeof(cap->bus_info), "platform:%s", dev= ->v4l2_dev.name); - return 0; -} - -static int vidioc_enum_fmt_vid_cap(struct file *file, void *priv, - struct v4l2_fmtdesc *f) -{ - struct mmal_fmt *fmt; - - if (f->index >=3D ARRAY_SIZE(formats)) - return -EINVAL; - - fmt =3D &formats[f->index]; - - f->pixelformat =3D fmt->fourcc; - - return 0; -} - -static int vidioc_g_fmt_vid_cap(struct file *file, void *priv, - struct v4l2_format *f) -{ - struct bcm2835_mmal_dev *dev =3D video_drvdata(file); - - f->fmt.pix.width =3D dev->capture.width; - f->fmt.pix.height =3D dev->capture.height; - f->fmt.pix.field =3D V4L2_FIELD_NONE; - f->fmt.pix.pixelformat =3D dev->capture.fmt->fourcc; - f->fmt.pix.bytesperline =3D dev->capture.stride; - f->fmt.pix.sizeimage =3D dev->capture.buffersize; - - if (dev->capture.fmt->fourcc =3D=3D V4L2_PIX_FMT_RGB24) - f->fmt.pix.colorspace =3D V4L2_COLORSPACE_SRGB; - else if (dev->capture.fmt->fourcc =3D=3D V4L2_PIX_FMT_JPEG) - f->fmt.pix.colorspace =3D V4L2_COLORSPACE_JPEG; - else - f->fmt.pix.colorspace =3D V4L2_COLORSPACE_SMPTE170M; - f->fmt.pix.priv =3D 0; - - v4l2_dump_pix_format(1, bcm2835_v4l2_debug, &dev->v4l2_dev, &f->fmt.pix, - __func__); - return 0; -} - -static int vidioc_try_fmt_vid_cap(struct file *file, void *priv, - struct v4l2_format *f) -{ - struct bcm2835_mmal_dev *dev =3D video_drvdata(file); - struct mmal_fmt *mfmt; - - mfmt =3D get_format(f); - if (!mfmt) { - v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev, - "Fourcc format (0x%08x) unknown.\n", - f->fmt.pix.pixelformat); - f->fmt.pix.pixelformat =3D formats[0].fourcc; - mfmt =3D get_format(f); - } - - f->fmt.pix.field =3D V4L2_FIELD_NONE; - - v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev, - "Clipping/aligning %dx%d format %08X\n", - f->fmt.pix.width, f->fmt.pix.height, f->fmt.pix.pixelformat); - - v4l_bound_align_image(&f->fmt.pix.width, MIN_WIDTH, dev->max_width, 1, - &f->fmt.pix.height, MIN_HEIGHT, dev->max_height, - 1, 0); - f->fmt.pix.bytesperline =3D f->fmt.pix.width * mfmt->ybbp; - if (!mfmt->remove_padding) { - if (mfmt->depth =3D=3D 24) { - /* - * 24bpp is a pain as we can't use simple masking. - * Min stride is width aligned to 16, times 24bpp. - */ - f->fmt.pix.bytesperline =3D - ((f->fmt.pix.width + 15) & ~15) * 3; - } else { - /* - * GPU isn't removing padding, so stride is aligned to - * 32 - */ - int align_mask =3D ((32 * mfmt->depth) >> 3) - 1; - - f->fmt.pix.bytesperline =3D - (f->fmt.pix.bytesperline + align_mask) & - ~align_mask; - } - v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev, - "Not removing padding, so bytes/line =3D %d\n", - f->fmt.pix.bytesperline); - } - - /* Image buffer has to be padded to allow for alignment, even though - * we sometimes then remove that padding before delivering the buffer. - */ - f->fmt.pix.sizeimage =3D ((f->fmt.pix.height + 15) & ~15) * - (((f->fmt.pix.width + 31) & ~31) * mfmt->depth) >> 3; - - if ((mfmt->flags & V4L2_FMT_FLAG_COMPRESSED) && - f->fmt.pix.sizeimage < MIN_BUFFER_SIZE) - f->fmt.pix.sizeimage =3D MIN_BUFFER_SIZE; - - if (f->fmt.pix.pixelformat =3D=3D V4L2_PIX_FMT_RGB24) - f->fmt.pix.colorspace =3D V4L2_COLORSPACE_SRGB; - else if (f->fmt.pix.pixelformat =3D=3D V4L2_PIX_FMT_JPEG) - f->fmt.pix.colorspace =3D V4L2_COLORSPACE_JPEG; - else - f->fmt.pix.colorspace =3D V4L2_COLORSPACE_SMPTE170M; - f->fmt.pix.priv =3D 0; - - v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev, - "Now %dx%d format %08X\n", - f->fmt.pix.width, f->fmt.pix.height, f->fmt.pix.pixelformat); - - v4l2_dump_pix_format(1, bcm2835_v4l2_debug, &dev->v4l2_dev, &f->fmt.pix, - __func__); - return 0; -} - -static int mmal_setup_video_component(struct bcm2835_mmal_dev *dev, - struct v4l2_format *f) -{ - bool overlay_enabled =3D !!dev->component[COMP_PREVIEW]->enabled; - struct vchiq_mmal_port *preview_port; - int ret; - - preview_port =3D &dev->component[COMP_CAMERA]->output[CAM_PORT_PREVIEW]; - - /* Preview and encode ports need to match on resolution */ - if (overlay_enabled) { - /* Need to disable the overlay before we can update - * the resolution - */ - ret =3D vchiq_mmal_port_disable(dev->instance, preview_port); - if (!ret) { - ret =3D vchiq_mmal_port_connect_tunnel(dev->instance, - preview_port, - NULL); - } - } - preview_port->es.video.width =3D f->fmt.pix.width; - preview_port->es.video.height =3D f->fmt.pix.height; - preview_port->es.video.crop.x =3D 0; - preview_port->es.video.crop.y =3D 0; - preview_port->es.video.crop.width =3D f->fmt.pix.width; - preview_port->es.video.crop.height =3D f->fmt.pix.height; - preview_port->es.video.frame_rate.numerator =3D - dev->capture.timeperframe.denominator; - preview_port->es.video.frame_rate.denominator =3D - dev->capture.timeperframe.numerator; - ret =3D vchiq_mmal_port_set_format(dev->instance, preview_port); - - if (overlay_enabled) { - ret =3D vchiq_mmal_port_connect_tunnel(dev->instance, - preview_port, - &dev->component[COMP_PREVIEW]->input[0]); - if (ret) - return ret; - - ret =3D vchiq_mmal_port_enable(dev->instance, preview_port, NULL); - } - - return ret; -} - -static int mmal_setup_encode_component(struct bcm2835_mmal_dev *dev, - struct v4l2_format *f, - struct vchiq_mmal_port *port, - struct vchiq_mmal_port *camera_port, - struct vchiq_mmal_component *component) -{ - struct mmal_fmt *mfmt =3D get_format(f); - int ret; - - v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev, - "vid_cap - set up encode comp\n"); - - /* configure buffering */ - camera_port->current_buffer.size =3D camera_port->recommended_buffer.size; - camera_port->current_buffer.num =3D camera_port->recommended_buffer.num; - - ret =3D vchiq_mmal_port_connect_tunnel(dev->instance, camera_port, - &component->input[0]); - if (ret) { - v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev, - "%s failed to create connection\n", __func__); - /* ensure capture is not going to be tried */ - dev->capture.port =3D NULL; - return ret; - } - - port->es.video.width =3D f->fmt.pix.width; - port->es.video.height =3D f->fmt.pix.height; - port->es.video.crop.x =3D 0; - port->es.video.crop.y =3D 0; - port->es.video.crop.width =3D f->fmt.pix.width; - port->es.video.crop.height =3D f->fmt.pix.height; - port->es.video.frame_rate.numerator =3D - dev->capture.timeperframe.denominator; - port->es.video.frame_rate.denominator =3D - dev->capture.timeperframe.numerator; - - port->format.encoding =3D mfmt->mmal; - port->format.encoding_variant =3D 0; - /* Set any encoding specific parameters */ - switch (mfmt->mmal_component) { - case COMP_VIDEO_ENCODE: - port->format.bitrate =3D dev->capture.encode_bitrate; - break; - case COMP_IMAGE_ENCODE: - /* Could set EXIF parameters here */ - break; - default: - break; - } - - ret =3D vchiq_mmal_port_set_format(dev->instance, port); - if (ret) { - v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev, - "%s failed to set format %dx%d fmt %08X\n", - __func__, - f->fmt.pix.width, - f->fmt.pix.height, - f->fmt.pix.pixelformat); - return ret; - } - - ret =3D vchiq_mmal_component_enable(dev->instance, component); - if (ret) { - v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev, - "%s Failed to enable encode components\n", __func__); - return ret; - } - - /* configure buffering */ - port->current_buffer.num =3D 1; - port->current_buffer.size =3D f->fmt.pix.sizeimage; - if (port->format.encoding =3D=3D MMAL_ENCODING_JPEG) { - v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev, - "JPG - buf size now %d was %d\n", - f->fmt.pix.sizeimage, - port->current_buffer.size); - port->current_buffer.size =3D - (f->fmt.pix.sizeimage < (100 << 10)) ? - (100 << 10) : f->fmt.pix.sizeimage; - } - v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev, - "vid_cap - cur_buf.size set to %d\n", f->fmt.pix.sizeimage); - port->current_buffer.alignment =3D 0; - - return 0; -} - -static int mmal_setup_components(struct bcm2835_mmal_dev *dev, - struct v4l2_format *f) -{ - int ret; - struct vchiq_mmal_port *port =3D NULL, *camera_port =3D NULL; - struct vchiq_mmal_component *encode_component =3D NULL; - struct mmal_fmt *mfmt =3D get_format(f); - bool remove_padding; - - if (!mfmt) - return -EINVAL; - - if (dev->capture.encode_component) { - v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev, - "vid_cap - disconnect previous tunnel\n"); - - /* Disconnect any previous connection */ - vchiq_mmal_port_connect_tunnel(dev->instance, - dev->capture.camera_port, NULL); - dev->capture.camera_port =3D NULL; - ret =3D vchiq_mmal_component_disable(dev->instance, - dev->capture.encode_component); - if (ret) - v4l2_err(&dev->v4l2_dev, - "Failed to disable encode component %d\n", - ret); - - dev->capture.encode_component =3D NULL; - } - /* format dependent port setup */ - switch (mfmt->mmal_component) { - case COMP_CAMERA: - /* Make a further decision on port based on resolution */ - if (f->fmt.pix.width <=3D max_video_width && - f->fmt.pix.height <=3D max_video_height) - camera_port =3D - &dev->component[COMP_CAMERA]->output[CAM_PORT_VIDEO]; - else - camera_port =3D - &dev->component[COMP_CAMERA]->output[CAM_PORT_CAPTURE]; - port =3D camera_port; - break; - case COMP_IMAGE_ENCODE: - encode_component =3D dev->component[COMP_IMAGE_ENCODE]; - port =3D &dev->component[COMP_IMAGE_ENCODE]->output[0]; - camera_port =3D - &dev->component[COMP_CAMERA]->output[CAM_PORT_CAPTURE]; - break; - case COMP_VIDEO_ENCODE: - encode_component =3D dev->component[COMP_VIDEO_ENCODE]; - port =3D &dev->component[COMP_VIDEO_ENCODE]->output[0]; - camera_port =3D - &dev->component[COMP_CAMERA]->output[CAM_PORT_VIDEO]; - break; - default: - break; - } - - if (!port) - return -EINVAL; - - if (encode_component) - camera_port->format.encoding =3D MMAL_ENCODING_OPAQUE; - else - camera_port->format.encoding =3D mfmt->mmal; - - if (dev->rgb_bgr_swapped) { - if (camera_port->format.encoding =3D=3D MMAL_ENCODING_RGB24) - camera_port->format.encoding =3D MMAL_ENCODING_BGR24; - else if (camera_port->format.encoding =3D=3D MMAL_ENCODING_BGR24) - camera_port->format.encoding =3D MMAL_ENCODING_RGB24; - } - - remove_padding =3D mfmt->remove_padding; - vchiq_mmal_port_parameter_set(dev->instance, camera_port, - MMAL_PARAMETER_NO_IMAGE_PADDING, - &remove_padding, sizeof(remove_padding)); - - camera_port->format.encoding_variant =3D 0; - camera_port->es.video.width =3D f->fmt.pix.width; - camera_port->es.video.height =3D f->fmt.pix.height; - camera_port->es.video.crop.x =3D 0; - camera_port->es.video.crop.y =3D 0; - camera_port->es.video.crop.width =3D f->fmt.pix.width; - camera_port->es.video.crop.height =3D f->fmt.pix.height; - camera_port->es.video.frame_rate.numerator =3D 0; - camera_port->es.video.frame_rate.denominator =3D 1; - camera_port->es.video.color_space =3D MMAL_COLOR_SPACE_JPEG_JFIF; - - ret =3D vchiq_mmal_port_set_format(dev->instance, camera_port); - - if (!ret && - camera_port =3D=3D - &dev->component[COMP_CAMERA]->output[CAM_PORT_VIDEO]) { - ret =3D mmal_setup_video_component(dev, f); - } - - if (ret) { - v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev, - "%s failed to set format %dx%d %08X\n", __func__, - f->fmt.pix.width, f->fmt.pix.height, - f->fmt.pix.pixelformat); - /* ensure capture is not going to be tried */ - dev->capture.port =3D NULL; - return ret; - } - - if (encode_component) { - ret =3D mmal_setup_encode_component(dev, f, port, - camera_port, - encode_component); - - if (ret) - return ret; - } else { - /* configure buffering */ - camera_port->current_buffer.num =3D 1; - camera_port->current_buffer.size =3D f->fmt.pix.sizeimage; - camera_port->current_buffer.alignment =3D 0; - } - - dev->capture.fmt =3D mfmt; - dev->capture.stride =3D f->fmt.pix.bytesperline; - dev->capture.width =3D camera_port->es.video.crop.width; - dev->capture.height =3D camera_port->es.video.crop.height; - dev->capture.buffersize =3D port->current_buffer.size; - - /* select port for capture */ - dev->capture.port =3D port; - dev->capture.camera_port =3D camera_port; - dev->capture.encode_component =3D encode_component; - v4l2_dbg(1, bcm2835_v4l2_debug, - &dev->v4l2_dev, - "Set dev->capture.fmt %08X, %dx%d, stride %d, size %d", - port->format.encoding, - dev->capture.width, dev->capture.height, - dev->capture.stride, dev->capture.buffersize); - - /* todo: Need to convert the vchiq/mmal error into a v4l2 error. */ - return ret; -} - -static int vidioc_s_fmt_vid_cap(struct file *file, void *priv, - struct v4l2_format *f) -{ - int ret; - struct bcm2835_mmal_dev *dev =3D video_drvdata(file); - struct mmal_fmt *mfmt; - - /* try the format to set valid parameters */ - ret =3D vidioc_try_fmt_vid_cap(file, priv, f); - if (ret) { - v4l2_err(&dev->v4l2_dev, - "vid_cap - vidioc_try_fmt_vid_cap failed\n"); - return ret; - } - - /* if a capture is running refuse to set format */ - if (vb2_is_busy(&dev->capture.vb_vidq)) { - v4l2_info(&dev->v4l2_dev, "%s device busy\n", __func__); - return -EBUSY; - } - - /* If the format is unsupported v4l2 says we should switch to - * a supported one and not return an error. - */ - mfmt =3D get_format(f); - if (!mfmt) { - v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev, - "Fourcc format (0x%08x) unknown.\n", - f->fmt.pix.pixelformat); - f->fmt.pix.pixelformat =3D formats[0].fourcc; - mfmt =3D get_format(f); - } - - ret =3D mmal_setup_components(dev, f); - if (ret) { - v4l2_err(&dev->v4l2_dev, - "%s: failed to setup mmal components: %d\n", - __func__, ret); - ret =3D -EINVAL; - } - - return ret; -} - -static int vidioc_enum_framesizes(struct file *file, void *fh, - struct v4l2_frmsizeenum *fsize) -{ - struct bcm2835_mmal_dev *dev =3D video_drvdata(file); - static const struct v4l2_frmsize_stepwise sizes =3D { - MIN_WIDTH, 0, 2, - MIN_HEIGHT, 0, 2 - }; - int i; - - if (fsize->index) - return -EINVAL; - for (i =3D 0; i < ARRAY_SIZE(formats); i++) - if (formats[i].fourcc =3D=3D fsize->pixel_format) - break; - if (i =3D=3D ARRAY_SIZE(formats)) - return -EINVAL; - fsize->type =3D V4L2_FRMSIZE_TYPE_STEPWISE; - fsize->stepwise =3D sizes; - fsize->stepwise.max_width =3D dev->max_width; - fsize->stepwise.max_height =3D dev->max_height; - return 0; -} - -/* timeperframe is arbitrary and continuous */ -static int vidioc_enum_frameintervals(struct file *file, void *priv, - struct v4l2_frmivalenum *fival) -{ - struct bcm2835_mmal_dev *dev =3D video_drvdata(file); - int i; - - if (fival->index) - return -EINVAL; - - for (i =3D 0; i < ARRAY_SIZE(formats); i++) - if (formats[i].fourcc =3D=3D fival->pixel_format) - break; - if (i =3D=3D ARRAY_SIZE(formats)) - return -EINVAL; - - /* regarding width & height - we support any within range */ - if (fival->width < MIN_WIDTH || fival->width > dev->max_width || - fival->height < MIN_HEIGHT || fival->height > dev->max_height) - return -EINVAL; - - fival->type =3D V4L2_FRMIVAL_TYPE_CONTINUOUS; - - /* fill in stepwise (step=3D1.0 is required by V4L2 spec) */ - fival->stepwise.min =3D tpf_min; - fival->stepwise.max =3D tpf_max; - fival->stepwise.step =3D (struct v4l2_fract) {1, 1}; - - return 0; -} - -static int vidioc_g_parm(struct file *file, void *priv, - struct v4l2_streamparm *parm) -{ - struct bcm2835_mmal_dev *dev =3D video_drvdata(file); - - if (parm->type !=3D V4L2_BUF_TYPE_VIDEO_CAPTURE) - return -EINVAL; - - parm->parm.capture.capability =3D V4L2_CAP_TIMEPERFRAME; - parm->parm.capture.timeperframe =3D dev->capture.timeperframe; - parm->parm.capture.readbuffers =3D 1; - return 0; -} - -static int vidioc_s_parm(struct file *file, void *priv, - struct v4l2_streamparm *parm) -{ - struct bcm2835_mmal_dev *dev =3D video_drvdata(file); - struct v4l2_fract tpf; - - if (parm->type !=3D V4L2_BUF_TYPE_VIDEO_CAPTURE) - return -EINVAL; - - tpf =3D parm->parm.capture.timeperframe; - - /* tpf: {*, 0} resets timing; clip to [min, max]*/ - tpf =3D tpf.denominator ? tpf : tpf_default; - tpf =3D V4L2_FRACT_COMPARE(tpf, <, tpf_min) ? tpf_min : tpf; - tpf =3D V4L2_FRACT_COMPARE(tpf, >, tpf_max) ? tpf_max : tpf; - - dev->capture.timeperframe =3D tpf; - parm->parm.capture.timeperframe =3D tpf; - parm->parm.capture.readbuffers =3D 1; - parm->parm.capture.capability =3D V4L2_CAP_TIMEPERFRAME; - - set_framerate_params(dev); - - return 0; -} - -static const struct v4l2_ioctl_ops camera0_ioctl_ops =3D { - /* overlay */ - .vidioc_enum_fmt_vid_overlay =3D vidioc_enum_fmt_vid_overlay, - .vidioc_g_fmt_vid_overlay =3D vidioc_g_fmt_vid_overlay, - .vidioc_try_fmt_vid_overlay =3D vidioc_try_fmt_vid_overlay, - .vidioc_s_fmt_vid_overlay =3D vidioc_s_fmt_vid_overlay, - .vidioc_overlay =3D vidioc_overlay, - .vidioc_g_fbuf =3D vidioc_g_fbuf, - - /* inputs */ - .vidioc_enum_input =3D vidioc_enum_input, - .vidioc_g_input =3D vidioc_g_input, - .vidioc_s_input =3D vidioc_s_input, - - /* capture */ - .vidioc_querycap =3D vidioc_querycap, - .vidioc_enum_fmt_vid_cap =3D vidioc_enum_fmt_vid_cap, - .vidioc_g_fmt_vid_cap =3D vidioc_g_fmt_vid_cap, - .vidioc_try_fmt_vid_cap =3D vidioc_try_fmt_vid_cap, - .vidioc_s_fmt_vid_cap =3D vidioc_s_fmt_vid_cap, - - /* buffer management */ - .vidioc_reqbufs =3D vb2_ioctl_reqbufs, - .vidioc_create_bufs =3D vb2_ioctl_create_bufs, - .vidioc_prepare_buf =3D vb2_ioctl_prepare_buf, - .vidioc_querybuf =3D vb2_ioctl_querybuf, - .vidioc_qbuf =3D vb2_ioctl_qbuf, - .vidioc_dqbuf =3D vb2_ioctl_dqbuf, - .vidioc_enum_framesizes =3D vidioc_enum_framesizes, - .vidioc_enum_frameintervals =3D vidioc_enum_frameintervals, - .vidioc_g_parm =3D vidioc_g_parm, - .vidioc_s_parm =3D vidioc_s_parm, - .vidioc_streamon =3D vb2_ioctl_streamon, - .vidioc_streamoff =3D vb2_ioctl_streamoff, - - .vidioc_log_status =3D v4l2_ctrl_log_status, - .vidioc_subscribe_event =3D v4l2_ctrl_subscribe_event, - .vidioc_unsubscribe_event =3D v4l2_event_unsubscribe, -}; - -/* ------------------------------------------------------------------ - * Driver init/finalise - * ------------------------------------------------------------------ - */ - -static const struct v4l2_file_operations camera0_fops =3D { - .owner =3D THIS_MODULE, - .open =3D v4l2_fh_open, - .release =3D vb2_fop_release, - .read =3D vb2_fop_read, - .poll =3D vb2_fop_poll, - .unlocked_ioctl =3D video_ioctl2, /* V4L2 ioctl handler */ - .mmap =3D vb2_fop_mmap, -}; - -static const struct video_device vdev_template =3D { - .name =3D "camera0", - .fops =3D &camera0_fops, - .ioctl_ops =3D &camera0_ioctl_ops, - .release =3D video_device_release_empty, - .device_caps =3D V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_VIDEO_OVERLAY | - V4L2_CAP_STREAMING | V4L2_CAP_READWRITE, -}; - -/* Returns the number of cameras, and also the max resolution supported - * by those cameras. - */ -static int get_num_cameras(struct vchiq_mmal_instance *instance, - unsigned int resolutions[][2], int num_resolutions) -{ - int ret; - struct vchiq_mmal_component *cam_info_component; - struct mmal_parameter_camera_info cam_info =3D {0}; - u32 param_size =3D sizeof(cam_info); - int i; - - /* create a camera_info component */ - ret =3D vchiq_mmal_component_init(instance, "camera_info", - &cam_info_component); - if (ret < 0) - /* Unusual failure - let's guess one camera. */ - return 1; - - if (vchiq_mmal_port_parameter_get(instance, - &cam_info_component->control, - MMAL_PARAMETER_CAMERA_INFO, - &cam_info, - ¶m_size)) { - pr_info("Failed to get camera info\n"); - } - for (i =3D 0; - i < min_t(unsigned int, cam_info.num_cameras, num_resolutions); - i++) { - resolutions[i][0] =3D cam_info.cameras[i].max_width; - resolutions[i][1] =3D cam_info.cameras[i].max_height; - } - - vchiq_mmal_component_finalise(instance, - cam_info_component); - - return cam_info.num_cameras; -} - -static int set_camera_parameters(struct vchiq_mmal_instance *instance, - struct vchiq_mmal_component *camera, - struct bcm2835_mmal_dev *dev) -{ - struct mmal_parameter_camera_config cam_config =3D { - .max_stills_w =3D dev->max_width, - .max_stills_h =3D dev->max_height, - .stills_yuv422 =3D 1, - .one_shot_stills =3D 1, - .max_preview_video_w =3D (max_video_width > 1920) ? - max_video_width : 1920, - .max_preview_video_h =3D (max_video_height > 1088) ? - max_video_height : 1088, - .num_preview_video_frames =3D 3, - .stills_capture_circular_buffer_height =3D 0, - .fast_preview_resume =3D 0, - .use_stc_timestamp =3D MMAL_PARAM_TIMESTAMP_MODE_RAW_STC - }; - - return vchiq_mmal_port_parameter_set(instance, &camera->control, - MMAL_PARAMETER_CAMERA_CONFIG, - &cam_config, sizeof(cam_config)); -} - -#define MAX_SUPPORTED_ENCODINGS 20 - -/* MMAL instance and component init */ -static int mmal_init(struct bcm2835_mmal_dev *dev) -{ - int ret; - struct mmal_es_format_local *format; - u32 supported_encodings[MAX_SUPPORTED_ENCODINGS]; - u32 param_size; - struct vchiq_mmal_component *camera; - - ret =3D vchiq_mmal_init(dev->v4l2_dev.dev, &dev->instance); - if (ret < 0) { - v4l2_err(&dev->v4l2_dev, "%s: vchiq mmal init failed %d\n", - __func__, ret); - return ret; - } - - /* get the camera component ready */ - ret =3D vchiq_mmal_component_init(dev->instance, "ril.camera", - &dev->component[COMP_CAMERA]); - if (ret < 0) - goto unreg_mmal; - - camera =3D dev->component[COMP_CAMERA]; - if (camera->outputs < CAM_PORT_COUNT) { - v4l2_err(&dev->v4l2_dev, "%s: too few camera outputs %d needed %d\n", - __func__, camera->outputs, CAM_PORT_COUNT); - ret =3D -EINVAL; - goto unreg_camera; - } - - ret =3D set_camera_parameters(dev->instance, - camera, - dev); - if (ret < 0) { - v4l2_err(&dev->v4l2_dev, "%s: unable to set camera parameters: %d\n", - __func__, ret); - goto unreg_camera; - } - - /* There was an error in the firmware that meant the camera component - * produced BGR instead of RGB. - * This is now fixed, but in order to support the old firmwares, we - * have to check. - */ - dev->rgb_bgr_swapped =3D true; - param_size =3D sizeof(supported_encodings); - ret =3D vchiq_mmal_port_parameter_get(dev->instance, - &camera->output[CAM_PORT_CAPTURE], - MMAL_PARAMETER_SUPPORTED_ENCODINGS, - &supported_encodings, - ¶m_size); - if (ret =3D=3D 0) { - int i; - - for (i =3D 0; i < param_size / sizeof(u32); i++) { - if (supported_encodings[i] =3D=3D MMAL_ENCODING_BGR24) { - /* Found BGR24 first - old firmware. */ - break; - } - if (supported_encodings[i] =3D=3D MMAL_ENCODING_RGB24) { - /* Found RGB24 first - * new firmware, so use RGB24. - */ - dev->rgb_bgr_swapped =3D false; - break; - } - } - } - format =3D &camera->output[CAM_PORT_PREVIEW].format; - - format->encoding =3D MMAL_ENCODING_OPAQUE; - format->encoding_variant =3D MMAL_ENCODING_I420; - - format->es->video.width =3D 1024; - format->es->video.height =3D 768; - format->es->video.crop.x =3D 0; - format->es->video.crop.y =3D 0; - format->es->video.crop.width =3D 1024; - format->es->video.crop.height =3D 768; - format->es->video.frame_rate.numerator =3D 0; /* Rely on fps_range */ - format->es->video.frame_rate.denominator =3D 1; - - format =3D &camera->output[CAM_PORT_VIDEO].format; - - format->encoding =3D MMAL_ENCODING_OPAQUE; - format->encoding_variant =3D MMAL_ENCODING_I420; - - format->es->video.width =3D 1024; - format->es->video.height =3D 768; - format->es->video.crop.x =3D 0; - format->es->video.crop.y =3D 0; - format->es->video.crop.width =3D 1024; - format->es->video.crop.height =3D 768; - format->es->video.frame_rate.numerator =3D 0; /* Rely on fps_range */ - format->es->video.frame_rate.denominator =3D 1; - - format =3D &camera->output[CAM_PORT_CAPTURE].format; - - format->encoding =3D MMAL_ENCODING_OPAQUE; - - format->es->video.width =3D 2592; - format->es->video.height =3D 1944; - format->es->video.crop.x =3D 0; - format->es->video.crop.y =3D 0; - format->es->video.crop.width =3D 2592; - format->es->video.crop.height =3D 1944; - format->es->video.frame_rate.numerator =3D 0; /* Rely on fps_range */ - format->es->video.frame_rate.denominator =3D 1; - - dev->capture.width =3D format->es->video.width; - dev->capture.height =3D format->es->video.height; - dev->capture.fmt =3D &formats[0]; - dev->capture.encode_component =3D NULL; - dev->capture.timeperframe =3D tpf_default; - dev->capture.enc_profile =3D V4L2_MPEG_VIDEO_H264_PROFILE_HIGH; - dev->capture.enc_level =3D V4L2_MPEG_VIDEO_H264_LEVEL_4_0; - - /* get the preview component ready */ - ret =3D vchiq_mmal_component_init(dev->instance, "ril.video_render", - &dev->component[COMP_PREVIEW]); - if (ret < 0) - goto unreg_camera; - - if (dev->component[COMP_PREVIEW]->inputs < 1) { - ret =3D -EINVAL; - v4l2_err(&dev->v4l2_dev, "%s: too few input ports %d needed %d\n", - __func__, dev->component[COMP_PREVIEW]->inputs, 1); - goto unreg_preview; - } - - /* get the image encoder component ready */ - ret =3D vchiq_mmal_component_init(dev->instance, "ril.image_encode", - &dev->component[COMP_IMAGE_ENCODE]); - if (ret < 0) - goto unreg_preview; - - if (dev->component[COMP_IMAGE_ENCODE]->inputs < 1) { - ret =3D -EINVAL; - v4l2_err(&dev->v4l2_dev, "%s: too few input ports %d needed %d\n", - __func__, dev->component[COMP_IMAGE_ENCODE]->inputs, - 1); - goto unreg_image_encoder; - } - - /* get the video encoder component ready */ - ret =3D vchiq_mmal_component_init(dev->instance, "ril.video_encode", - &dev->component[COMP_VIDEO_ENCODE]); - if (ret < 0) - goto unreg_image_encoder; - - if (dev->component[COMP_VIDEO_ENCODE]->inputs < 1) { - ret =3D -EINVAL; - v4l2_err(&dev->v4l2_dev, "%s: too few input ports %d needed %d\n", - __func__, dev->component[COMP_VIDEO_ENCODE]->inputs, - 1); - goto unreg_vid_encoder; - } - - { - struct vchiq_mmal_port *encoder_port =3D - &dev->component[COMP_VIDEO_ENCODE]->output[0]; - encoder_port->format.encoding =3D MMAL_ENCODING_H264; - ret =3D vchiq_mmal_port_set_format(dev->instance, - encoder_port); - } - - { - unsigned int enable =3D 1; - - vchiq_mmal_port_parameter_set(dev->instance, - &dev->component[COMP_VIDEO_ENCODE]->control, - MMAL_PARAMETER_VIDEO_IMMUTABLE_INPUT, - &enable, - sizeof(enable)); - - vchiq_mmal_port_parameter_set(dev->instance, - &dev->component[COMP_VIDEO_ENCODE]->control, - MMAL_PARAMETER_MINIMISE_FRAGMENTATION, - &enable, - sizeof(enable)); - } - ret =3D bcm2835_mmal_set_all_camera_controls(dev); - if (ret < 0) { - v4l2_err(&dev->v4l2_dev, "%s: failed to set all camera controls: %d\n", - __func__, ret); - goto unreg_vid_encoder; - } - - return 0; - -unreg_vid_encoder: - pr_err("Cleanup: Destroy video encoder\n"); - vchiq_mmal_component_finalise(dev->instance, - dev->component[COMP_VIDEO_ENCODE]); - -unreg_image_encoder: - pr_err("Cleanup: Destroy image encoder\n"); - vchiq_mmal_component_finalise(dev->instance, - dev->component[COMP_IMAGE_ENCODE]); - -unreg_preview: - pr_err("Cleanup: Destroy video render\n"); - vchiq_mmal_component_finalise(dev->instance, - dev->component[COMP_PREVIEW]); - -unreg_camera: - pr_err("Cleanup: Destroy camera\n"); - vchiq_mmal_component_finalise(dev->instance, - dev->component[COMP_CAMERA]); - -unreg_mmal: - vchiq_mmal_finalise(dev->instance); - return ret; -} - -static int bcm2835_mmal_init_device(struct bcm2835_mmal_dev *dev, struct v= ideo_device *vfd) -{ - int ret; - - *vfd =3D vdev_template; - - vfd->v4l2_dev =3D &dev->v4l2_dev; - - vfd->lock =3D &dev->mutex; - - vfd->queue =3D &dev->capture.vb_vidq; - - /* video device needs to be able to access instance data */ - video_set_drvdata(vfd, dev); - - ret =3D video_register_device(vfd, VFL_TYPE_VIDEO, - video_nr[dev->camera_num]); - if (ret < 0) - return ret; - - v4l2_info(vfd->v4l2_dev, - "V4L2 device registered as %s - stills mode > %dx%d\n", - video_device_node_name(vfd), - max_video_width, max_video_height); - - return 0; -} - -static void bcm2835_cleanup_instance(struct bcm2835_mmal_dev *dev) -{ - if (!dev) - return; - - v4l2_info(&dev->v4l2_dev, "unregistering %s\n", - video_device_node_name(&dev->vdev)); - - video_unregister_device(&dev->vdev); - - if (dev->capture.encode_component) { - v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev, - "mmal_exit - disconnect tunnel\n"); - vchiq_mmal_port_connect_tunnel(dev->instance, - dev->capture.camera_port, NULL); - vchiq_mmal_component_disable(dev->instance, - dev->capture.encode_component); - } - vchiq_mmal_component_disable(dev->instance, - dev->component[COMP_CAMERA]); - - vchiq_mmal_component_finalise(dev->instance, - dev->component[COMP_VIDEO_ENCODE]); - - vchiq_mmal_component_finalise(dev->instance, - dev->component[COMP_IMAGE_ENCODE]); - - vchiq_mmal_component_finalise(dev->instance, - dev->component[COMP_PREVIEW]); - - vchiq_mmal_component_finalise(dev->instance, - dev->component[COMP_CAMERA]); - - v4l2_ctrl_handler_free(&dev->ctrl_handler); - - v4l2_device_unregister(&dev->v4l2_dev); - - kfree(dev); -} - -static struct v4l2_format default_v4l2_format =3D { - .fmt.pix.pixelformat =3D V4L2_PIX_FMT_JPEG, - .fmt.pix.width =3D 1024, - .fmt.pix.bytesperline =3D 0, - .fmt.pix.height =3D 768, - .fmt.pix.sizeimage =3D 1024 * 768, -}; - -static int bcm2835_mmal_probe(struct vchiq_device *device) -{ - int ret; - struct bcm2835_mmal_dev *dev; - struct vb2_queue *q; - int camera; - unsigned int num_cameras; - struct vchiq_mmal_instance *instance; - unsigned int resolutions[MAX_BCM2835_CAMERAS][2]; - int i; - - ret =3D dma_set_mask_and_coherent(&device->dev, DMA_BIT_MASK(32)); - if (ret) { - dev_err(&device->dev, "dma_set_mask_and_coherent failed: %d\n", ret); - return ret; - } - - ret =3D vchiq_mmal_init(&device->dev, &instance); - if (ret < 0) - return ret; - - num_cameras =3D get_num_cameras(instance, - resolutions, - MAX_BCM2835_CAMERAS); - - if (num_cameras < 1) { - ret =3D -ENODEV; - goto cleanup_mmal; - } - - if (num_cameras > MAX_BCM2835_CAMERAS) - num_cameras =3D MAX_BCM2835_CAMERAS; - - for (camera =3D 0; camera < num_cameras; camera++) { - dev =3D kzalloc(sizeof(*dev), GFP_KERNEL); - if (!dev) { - ret =3D -ENOMEM; - goto cleanup_gdev; - } - - /* v4l2 core mutex used to protect all fops and v4l2 ioctls. */ - mutex_init(&dev->mutex); - dev->max_width =3D resolutions[camera][0]; - dev->max_height =3D resolutions[camera][1]; - - /* setup device defaults */ - dev->overlay.w.left =3D 150; - dev->overlay.w.top =3D 50; - dev->overlay.w.width =3D 1024; - dev->overlay.w.height =3D 768; - dev->overlay.clipcount =3D 0; - dev->overlay.field =3D V4L2_FIELD_NONE; - dev->overlay.global_alpha =3D 255; - - dev->capture.fmt =3D &formats[3]; /* JPEG */ - - /* v4l device registration */ - dev->camera_num =3D v4l2_device_set_name(&dev->v4l2_dev, KBUILD_MODNAME, - &camera_instance); - ret =3D v4l2_device_register(NULL, &dev->v4l2_dev); - if (ret) { - dev_err(&device->dev, "%s: could not register V4L2 device: %d\n", - __func__, ret); - goto free_dev; - } - dev->v4l2_dev.dev =3D &device->dev; - - /* setup v4l controls */ - ret =3D bcm2835_mmal_init_controls(dev, &dev->ctrl_handler); - if (ret < 0) { - v4l2_err(&dev->v4l2_dev, "%s: could not init controls: %d\n", - __func__, ret); - goto unreg_dev; - } - dev->v4l2_dev.ctrl_handler =3D &dev->ctrl_handler; - - /* mmal init */ - dev->instance =3D instance; - ret =3D mmal_init(dev); - if (ret < 0) { - v4l2_err(&dev->v4l2_dev, "%s: mmal init failed: %d\n", - __func__, ret); - goto unreg_dev; - } - /* initialize queue */ - q =3D &dev->capture.vb_vidq; - memset(q, 0, sizeof(*q)); - q->type =3D V4L2_BUF_TYPE_VIDEO_CAPTURE; - q->io_modes =3D VB2_MMAP | VB2_USERPTR | VB2_READ; - q->drv_priv =3D dev; - q->buf_struct_size =3D sizeof(struct vb2_mmal_buffer); - q->ops =3D &bcm2835_mmal_video_qops; - q->mem_ops =3D &vb2_vmalloc_memops; - q->timestamp_flags =3D V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC; - q->lock =3D &dev->mutex; - ret =3D vb2_queue_init(q); - if (ret < 0) - goto unreg_dev; - - /* initialise video devices */ - ret =3D bcm2835_mmal_init_device(dev, &dev->vdev); - if (ret < 0) { - v4l2_err(&dev->v4l2_dev, "%s: could not init device: %d\n", - __func__, ret); - goto unreg_dev; - } - - /* Really want to call vidioc_s_fmt_vid_cap with the default - * format, but currently the APIs don't join up. - */ - ret =3D mmal_setup_components(dev, &default_v4l2_format); - if (ret < 0) { - v4l2_err(&dev->v4l2_dev, "%s: could not setup components: %d\n", - __func__, ret); - goto unreg_dev; - } - - v4l2_info(&dev->v4l2_dev, "Broadcom 2835 MMAL video capture loaded.\n"); - - gdev[camera] =3D dev; - } - return 0; - -unreg_dev: - v4l2_ctrl_handler_free(&dev->ctrl_handler); - v4l2_device_unregister(&dev->v4l2_dev); - -free_dev: - kfree(dev); - -cleanup_gdev: - for (i =3D 0; i < camera; i++) { - bcm2835_cleanup_instance(gdev[i]); - gdev[i] =3D NULL; - } - -cleanup_mmal: - vchiq_mmal_finalise(instance); - - return ret; -} - -static void bcm2835_mmal_remove(struct vchiq_device *device) -{ - int camera; - struct vchiq_mmal_instance *instance =3D gdev[0]->instance; - - for (camera =3D 0; camera < MAX_BCM2835_CAMERAS; camera++) { - bcm2835_cleanup_instance(gdev[camera]); - gdev[camera] =3D NULL; - } - vchiq_mmal_finalise(instance); -} - -static const struct vchiq_device_id device_id_table[] =3D { - { .name =3D "bcm2835-camera" }, - {} -}; -MODULE_DEVICE_TABLE(vchiq, device_id_table); - -static struct vchiq_driver bcm2835_camera_driver =3D { - .probe =3D bcm2835_mmal_probe, - .remove =3D bcm2835_mmal_remove, - .id_table =3D device_id_table, - .driver =3D { - .name =3D "bcm2835-camera", - }, -}; - -module_vchiq_driver(bcm2835_camera_driver) - -MODULE_DESCRIPTION("Broadcom 2835 MMAL video capture"); -MODULE_AUTHOR("Vincent Sanders"); -MODULE_LICENSE("GPL"); diff --git a/drivers/staging/vc04_services/bcm2835-camera/bcm2835-camera.h = b/drivers/staging/vc04_services/bcm2835-camera/bcm2835-camera.h deleted file mode 100644 index 0f0c6f7a376434ad5458910f29d485bab223adb5..000000000000000000000000000= 0000000000000 --- a/drivers/staging/vc04_services/bcm2835-camera/bcm2835-camera.h +++ /dev/null @@ -1,142 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -/* - * Broadcom BCM2835 V4L2 driver - * - * Copyright =C2=A9 2013 Raspberry Pi (Trading) Ltd. - * - * Authors: Vincent Sanders @ Collabora - * Dave Stevenson @ Broadcom - * (now dave.stevenson@raspberrypi.org) - * Simon Mellor @ Broadcom - * Luke Diamand @ Broadcom - * - * core driver device - */ - -#define V4L2_CTRL_COUNT 29 /* number of v4l controls */ - -enum { - COMP_CAMERA =3D 0, - COMP_PREVIEW, - COMP_IMAGE_ENCODE, - COMP_VIDEO_ENCODE, - COMP_COUNT -}; - -enum { - CAM_PORT_PREVIEW =3D 0, - CAM_PORT_VIDEO, - CAM_PORT_CAPTURE, - CAM_PORT_COUNT -}; - -extern int bcm2835_v4l2_debug; - -struct bcm2835_mmal_dev { - /* v4l2 devices */ - struct v4l2_device v4l2_dev; - struct video_device vdev; - struct mutex mutex; - - /* controls */ - struct v4l2_ctrl_handler ctrl_handler; - struct v4l2_ctrl *ctrls[V4L2_CTRL_COUNT]; - enum v4l2_scene_mode scene_mode; - struct mmal_colourfx colourfx; - int hflip; - int vflip; - int red_gain; - int blue_gain; - enum mmal_parameter_exposuremode exposure_mode_user; - enum v4l2_exposure_auto_type exposure_mode_v4l2_user; - /* active exposure mode may differ if selected via a scene mode */ - enum mmal_parameter_exposuremode exposure_mode_active; - enum mmal_parameter_exposuremeteringmode metering_mode; - unsigned int manual_shutter_speed; - bool exp_auto_priority; - bool manual_iso_enabled; - u32 iso; - - /* allocated mmal instance and components */ - struct vchiq_mmal_instance *instance; - struct vchiq_mmal_component *component[COMP_COUNT]; - int camera_use_count; - - struct v4l2_window overlay; - - struct { - unsigned int width; /* width */ - unsigned int height; /* height */ - unsigned int stride; /* stride */ - unsigned int buffersize; /* buffer size with padding */ - struct mmal_fmt *fmt; - struct v4l2_fract timeperframe; - - /* H264 encode bitrate */ - int encode_bitrate; - /* H264 bitrate mode. CBR/VBR */ - int encode_bitrate_mode; - /* H264 profile */ - enum v4l2_mpeg_video_h264_profile enc_profile; - /* H264 level */ - enum v4l2_mpeg_video_h264_level enc_level; - /* JPEG Q-factor */ - int q_factor; - - struct vb2_queue vb_vidq; - - /* VC start timestamp for streaming */ - s64 vc_start_timestamp; - /* Kernel start timestamp for streaming */ - ktime_t kernel_start_ts; - /* Sequence number of last buffer */ - u32 sequence; - - struct vchiq_mmal_port *port; /* port being used for capture */ - /* camera port being used for capture */ - struct vchiq_mmal_port *camera_port; - /* component being used for encode */ - struct vchiq_mmal_component *encode_component; - /* number of frames remaining which driver should capture */ - unsigned int frame_count; - /* last frame completion */ - struct completion frame_cmplt; - - } capture; - - unsigned int camera_num; - unsigned int max_width; - unsigned int max_height; - unsigned int rgb_bgr_swapped; -}; - -int bcm2835_mmal_init_controls(struct bcm2835_mmal_dev *dev, struct v4l2_c= trl_handler *hdl); - -int bcm2835_mmal_set_all_camera_controls(struct bcm2835_mmal_dev *dev); -int set_framerate_params(struct bcm2835_mmal_dev *dev); - -/* Debug helpers */ - -#define v4l2_dump_pix_format(level, debug, dev, pix_fmt, desc) \ -{ \ - v4l2_dbg(level, debug, dev, \ -"%s: w %u h %u field %u pfmt 0x%x bpl %u sz_img %u colorspace 0x%x priv %u= \n", \ - desc, \ - (pix_fmt)->width, (pix_fmt)->height, (pix_fmt)->field, \ - (pix_fmt)->pixelformat, (pix_fmt)->bytesperline, \ - (pix_fmt)->sizeimage, (pix_fmt)->colorspace, (pix_fmt)->priv); \ -} - -#define v4l2_dump_win_format(level, debug, dev, win_fmt, desc) \ -{ \ - v4l2_dbg(level, debug, dev, \ -"%s: w %u h %u l %u t %u field %u chromakey %06X clip %p " \ -"clipcount %u bitmap %p\n", \ - desc, \ - (win_fmt)->w.width, (win_fmt)->w.height, \ - (win_fmt)->w.left, (win_fmt)->w.top, \ - (win_fmt)->field, \ - (win_fmt)->chromakey, \ - (win_fmt)->clips, (win_fmt)->clipcount, \ - (win_fmt)->bitmap); \ -} diff --git a/drivers/staging/vc04_services/bcm2835-camera/controls.c b/driv= ers/staging/vc04_services/bcm2835-camera/controls.c deleted file mode 100644 index e670226f1edf77a13e303e13dae783922175311b..000000000000000000000000000= 0000000000000 --- a/drivers/staging/vc04_services/bcm2835-camera/controls.c +++ /dev/null @@ -1,1399 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -/* - * Broadcom BCM2835 V4L2 driver - * - * Copyright =C2=A9 2013 Raspberry Pi (Trading) Ltd. - * - * Authors: Vincent Sanders @ Collabora - * Dave Stevenson @ Broadcom - * (now dave.stevenson@raspberrypi.org) - * Simon Mellor @ Broadcom - * Luke Diamand @ Broadcom - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "../vchiq-mmal/mmal-common.h" -#include "../vchiq-mmal/mmal-vchiq.h" -#include "../vchiq-mmal/mmal-parameters.h" -#include "bcm2835-camera.h" - -/* The supported V4L2_CID_AUTO_EXPOSURE_BIAS values are from -4.0 to +4.0. - * MMAL values are in 1/6th increments so the MMAL range is -24 to +24. - * V4L2 docs say value "is expressed in terms of EV, drivers should interp= ret - * the values as 0.001 EV units, where the value 1000 stands for +1 EV." - * V4L2 is limited to a max of 32 values in a menu, so count in 1/3rds from - * -4 to +4 - */ -static const s64 ev_bias_qmenu[] =3D { - -4000, -3667, -3333, - -3000, -2667, -2333, - -2000, -1667, -1333, - -1000, -667, -333, - 0, 333, 667, - 1000, 1333, 1667, - 2000, 2333, 2667, - 3000, 3333, 3667, - 4000 -}; - -/* Supported ISO values (*1000) - * ISOO =3D auto ISO - */ -static const s64 iso_qmenu[] =3D { - 0, 100000, 200000, 400000, 800000, -}; - -static const u32 iso_values[] =3D { - 0, 100, 200, 400, 800, -}; - -enum bcm2835_mmal_ctrl_type { - MMAL_CONTROL_TYPE_STD, - MMAL_CONTROL_TYPE_STD_MENU, - MMAL_CONTROL_TYPE_INT_MENU, - MMAL_CONTROL_TYPE_CLUSTER, /* special cluster entry */ -}; - -struct bcm2835_mmal_v4l2_ctrl { - u32 id; /* v4l2 control identifier */ - enum bcm2835_mmal_ctrl_type type; - /* control minimum value or - * mask for MMAL_CONTROL_TYPE_STD_MENU - */ - s64 min; - s64 max; /* maximum value of control */ - s64 def; /* default value of control */ - u64 step; /* step size of the control */ - const s64 *imenu; /* integer menu array */ - u32 mmal_id; /* mmal parameter id */ - int (*setter)(struct bcm2835_mmal_dev *dev, struct v4l2_ctrl *ctrl, - const struct bcm2835_mmal_v4l2_ctrl *mmal_ctrl); -}; - -struct v4l2_to_mmal_effects_setting { - u32 v4l2_effect; - u32 mmal_effect; - s32 col_fx_enable; - s32 col_fx_fixed_cbcr; - u32 u; - u32 v; - u32 num_effect_params; - u32 effect_params[MMAL_MAX_IMAGEFX_PARAMETERS]; -}; - -static const struct v4l2_to_mmal_effects_setting - v4l2_to_mmal_effects_values[] =3D { - { V4L2_COLORFX_NONE, MMAL_PARAM_IMAGEFX_NONE, - 0, 0, 0, 0, 0, {0, 0, 0, 0, 0} }, - { V4L2_COLORFX_BW, MMAL_PARAM_IMAGEFX_NONE, - 1, 0, 128, 128, 0, {0, 0, 0, 0, 0} }, - { V4L2_COLORFX_SEPIA, MMAL_PARAM_IMAGEFX_NONE, - 1, 0, 87, 151, 0, {0, 0, 0, 0, 0} }, - { V4L2_COLORFX_NEGATIVE, MMAL_PARAM_IMAGEFX_NEGATIVE, - 0, 0, 0, 0, 0, {0, 0, 0, 0, 0} }, - { V4L2_COLORFX_EMBOSS, MMAL_PARAM_IMAGEFX_EMBOSS, - 0, 0, 0, 0, 0, {0, 0, 0, 0, 0} }, - { V4L2_COLORFX_SKETCH, MMAL_PARAM_IMAGEFX_SKETCH, - 0, 0, 0, 0, 0, {0, 0, 0, 0, 0} }, - { V4L2_COLORFX_SKY_BLUE, MMAL_PARAM_IMAGEFX_PASTEL, - 0, 0, 0, 0, 0, {0, 0, 0, 0, 0} }, - { V4L2_COLORFX_GRASS_GREEN, MMAL_PARAM_IMAGEFX_WATERCOLOUR, - 0, 0, 0, 0, 0, {0, 0, 0, 0, 0} }, - { V4L2_COLORFX_SKIN_WHITEN, MMAL_PARAM_IMAGEFX_WASHEDOUT, - 0, 0, 0, 0, 0, {0, 0, 0, 0, 0} }, - { V4L2_COLORFX_VIVID, MMAL_PARAM_IMAGEFX_SATURATION, - 0, 0, 0, 0, 0, {0, 0, 0, 0, 0} }, - { V4L2_COLORFX_AQUA, MMAL_PARAM_IMAGEFX_NONE, - 1, 0, 171, 121, 0, {0, 0, 0, 0, 0} }, - { V4L2_COLORFX_ART_FREEZE, MMAL_PARAM_IMAGEFX_HATCH, - 0, 0, 0, 0, 0, {0, 0, 0, 0, 0} }, - { V4L2_COLORFX_SILHOUETTE, MMAL_PARAM_IMAGEFX_FILM, - 0, 0, 0, 0, 0, {0, 0, 0, 0, 0} }, - { V4L2_COLORFX_SOLARIZATION, MMAL_PARAM_IMAGEFX_SOLARIZE, - 0, 0, 0, 0, 5, {1, 128, 160, 160, 48} }, - { V4L2_COLORFX_ANTIQUE, MMAL_PARAM_IMAGEFX_COLOURBALANCE, - 0, 0, 0, 0, 3, {108, 274, 238, 0, 0} }, - { V4L2_COLORFX_SET_CBCR, MMAL_PARAM_IMAGEFX_NONE, - 1, 1, 0, 0, 0, {0, 0, 0, 0, 0} } -}; - -struct v4l2_mmal_scene_config { - enum v4l2_scene_mode v4l2_scene; - enum mmal_parameter_exposuremode exposure_mode; - enum mmal_parameter_exposuremeteringmode metering_mode; -}; - -static const struct v4l2_mmal_scene_config scene_configs[] =3D { - /* V4L2_SCENE_MODE_NONE automatically added */ - { - V4L2_SCENE_MODE_NIGHT, - MMAL_PARAM_EXPOSUREMODE_NIGHT, - MMAL_PARAM_EXPOSUREMETERINGMODE_AVERAGE - }, - { - V4L2_SCENE_MODE_SPORTS, - MMAL_PARAM_EXPOSUREMODE_SPORTS, - MMAL_PARAM_EXPOSUREMETERINGMODE_AVERAGE - }, -}; - -/* control handlers*/ - -static int ctrl_set_rational(struct bcm2835_mmal_dev *dev, - struct v4l2_ctrl *ctrl, - const struct bcm2835_mmal_v4l2_ctrl *mmal_ctrl) -{ - struct s32_fract rational_value; - struct vchiq_mmal_port *control; - - control =3D &dev->component[COMP_CAMERA]->control; - - rational_value.numerator =3D ctrl->val; - rational_value.denominator =3D 100; - - return vchiq_mmal_port_parameter_set(dev->instance, control, - mmal_ctrl->mmal_id, - &rational_value, - sizeof(rational_value)); -} - -static int ctrl_set_value(struct bcm2835_mmal_dev *dev, - struct v4l2_ctrl *ctrl, - const struct bcm2835_mmal_v4l2_ctrl *mmal_ctrl) -{ - u32 u32_value; - struct vchiq_mmal_port *control; - - control =3D &dev->component[COMP_CAMERA]->control; - - u32_value =3D ctrl->val; - - return vchiq_mmal_port_parameter_set(dev->instance, control, - mmal_ctrl->mmal_id, - &u32_value, sizeof(u32_value)); -} - -static int ctrl_set_iso(struct bcm2835_mmal_dev *dev, - struct v4l2_ctrl *ctrl, - const struct bcm2835_mmal_v4l2_ctrl *mmal_ctrl) -{ - u32 u32_value; - struct vchiq_mmal_port *control; - - if (ctrl->val > mmal_ctrl->max || ctrl->val < mmal_ctrl->min) - return 1; - - if (ctrl->id =3D=3D V4L2_CID_ISO_SENSITIVITY) - dev->iso =3D iso_values[ctrl->val]; - else if (ctrl->id =3D=3D V4L2_CID_ISO_SENSITIVITY_AUTO) - dev->manual_iso_enabled =3D - (ctrl->val =3D=3D V4L2_ISO_SENSITIVITY_MANUAL); - - control =3D &dev->component[COMP_CAMERA]->control; - - if (dev->manual_iso_enabled) - u32_value =3D dev->iso; - else - u32_value =3D 0; - - return vchiq_mmal_port_parameter_set(dev->instance, control, - MMAL_PARAMETER_ISO, - &u32_value, sizeof(u32_value)); -} - -static int ctrl_set_value_ev(struct bcm2835_mmal_dev *dev, - struct v4l2_ctrl *ctrl, - const struct bcm2835_mmal_v4l2_ctrl *mmal_ctrl) -{ - s32 s32_value; - struct vchiq_mmal_port *control; - - control =3D &dev->component[COMP_CAMERA]->control; - - s32_value =3D (ctrl->val - 12) * 2; /* Convert from index to 1/6ths */ - - return vchiq_mmal_port_parameter_set(dev->instance, control, - mmal_ctrl->mmal_id, - &s32_value, sizeof(s32_value)); -} - -static int ctrl_set_rotate(struct bcm2835_mmal_dev *dev, - struct v4l2_ctrl *ctrl, - const struct bcm2835_mmal_v4l2_ctrl *mmal_ctrl) -{ - int ret; - u32 u32_value; - struct vchiq_mmal_component *camera; - - camera =3D dev->component[COMP_CAMERA]; - - u32_value =3D ((ctrl->val % 360) / 90) * 90; - - ret =3D vchiq_mmal_port_parameter_set(dev->instance, &camera->output[0], - mmal_ctrl->mmal_id, - &u32_value, sizeof(u32_value)); - if (ret < 0) - return ret; - - ret =3D vchiq_mmal_port_parameter_set(dev->instance, &camera->output[1], - mmal_ctrl->mmal_id, - &u32_value, sizeof(u32_value)); - if (ret < 0) - return ret; - - return vchiq_mmal_port_parameter_set(dev->instance, &camera->output[2], - mmal_ctrl->mmal_id, - &u32_value, sizeof(u32_value)); -} - -static int ctrl_set_flip(struct bcm2835_mmal_dev *dev, - struct v4l2_ctrl *ctrl, - const struct bcm2835_mmal_v4l2_ctrl *mmal_ctrl) -{ - int ret; - u32 u32_value; - struct vchiq_mmal_component *camera; - - if (ctrl->id =3D=3D V4L2_CID_HFLIP) - dev->hflip =3D ctrl->val; - else - dev->vflip =3D ctrl->val; - - camera =3D dev->component[COMP_CAMERA]; - - if (dev->hflip && dev->vflip) - u32_value =3D MMAL_PARAM_MIRROR_BOTH; - else if (dev->hflip) - u32_value =3D MMAL_PARAM_MIRROR_HORIZONTAL; - else if (dev->vflip) - u32_value =3D MMAL_PARAM_MIRROR_VERTICAL; - else - u32_value =3D MMAL_PARAM_MIRROR_NONE; - - ret =3D vchiq_mmal_port_parameter_set(dev->instance, &camera->output[0], - mmal_ctrl->mmal_id, - &u32_value, sizeof(u32_value)); - if (ret < 0) - return ret; - - ret =3D vchiq_mmal_port_parameter_set(dev->instance, &camera->output[1], - mmal_ctrl->mmal_id, - &u32_value, sizeof(u32_value)); - if (ret < 0) - return ret; - - return vchiq_mmal_port_parameter_set(dev->instance, &camera->output[2], - mmal_ctrl->mmal_id, - &u32_value, sizeof(u32_value)); -} - -static int ctrl_set_exposure(struct bcm2835_mmal_dev *dev, - struct v4l2_ctrl *ctrl, - const struct bcm2835_mmal_v4l2_ctrl *mmal_ctrl) -{ - enum mmal_parameter_exposuremode exp_mode =3D dev->exposure_mode_user; - u32 shutter_speed =3D 0; - struct vchiq_mmal_port *control; - int ret =3D 0; - - control =3D &dev->component[COMP_CAMERA]->control; - - if (mmal_ctrl->mmal_id =3D=3D MMAL_PARAMETER_SHUTTER_SPEED) { - /* V4L2 is in 100usec increments. - * MMAL is 1usec. - */ - dev->manual_shutter_speed =3D ctrl->val * 100; - } else if (mmal_ctrl->mmal_id =3D=3D MMAL_PARAMETER_EXPOSURE_MODE) { - switch (ctrl->val) { - case V4L2_EXPOSURE_AUTO: - exp_mode =3D MMAL_PARAM_EXPOSUREMODE_AUTO; - break; - - case V4L2_EXPOSURE_MANUAL: - exp_mode =3D MMAL_PARAM_EXPOSUREMODE_OFF; - break; - } - dev->exposure_mode_user =3D exp_mode; - dev->exposure_mode_v4l2_user =3D ctrl->val; - } else if (mmal_ctrl->id =3D=3D V4L2_CID_EXPOSURE_AUTO_PRIORITY) { - dev->exp_auto_priority =3D ctrl->val; - } - - if (dev->scene_mode =3D=3D V4L2_SCENE_MODE_NONE) { - if (exp_mode =3D=3D MMAL_PARAM_EXPOSUREMODE_OFF) - shutter_speed =3D dev->manual_shutter_speed; - - ret =3D vchiq_mmal_port_parameter_set(dev->instance, - control, - MMAL_PARAMETER_SHUTTER_SPEED, - &shutter_speed, - sizeof(shutter_speed)); - ret +=3D vchiq_mmal_port_parameter_set(dev->instance, - control, - MMAL_PARAMETER_EXPOSURE_MODE, - &exp_mode, - sizeof(u32)); - dev->exposure_mode_active =3D exp_mode; - } - /* exposure_dynamic_framerate (V4L2_CID_EXPOSURE_AUTO_PRIORITY) should - * always apply irrespective of scene mode. - */ - ret +=3D set_framerate_params(dev); - - return ret; -} - -static int ctrl_set_metering_mode(struct bcm2835_mmal_dev *dev, - struct v4l2_ctrl *ctrl, - const struct bcm2835_mmal_v4l2_ctrl *mmal_ctrl) -{ - switch (ctrl->val) { - case V4L2_EXPOSURE_METERING_AVERAGE: - dev->metering_mode =3D MMAL_PARAM_EXPOSUREMETERINGMODE_AVERAGE; - break; - - case V4L2_EXPOSURE_METERING_CENTER_WEIGHTED: - dev->metering_mode =3D MMAL_PARAM_EXPOSUREMETERINGMODE_BACKLIT; - break; - - case V4L2_EXPOSURE_METERING_SPOT: - dev->metering_mode =3D MMAL_PARAM_EXPOSUREMETERINGMODE_SPOT; - break; - - case V4L2_EXPOSURE_METERING_MATRIX: - dev->metering_mode =3D MMAL_PARAM_EXPOSUREMETERINGMODE_MATRIX; - break; - } - - if (dev->scene_mode =3D=3D V4L2_SCENE_MODE_NONE) { - struct vchiq_mmal_port *control; - u32 u32_value =3D dev->metering_mode; - - control =3D &dev->component[COMP_CAMERA]->control; - - return vchiq_mmal_port_parameter_set(dev->instance, control, - mmal_ctrl->mmal_id, - &u32_value, sizeof(u32_value)); - } else { - return 0; - } -} - -static int ctrl_set_flicker_avoidance(struct bcm2835_mmal_dev *dev, - struct v4l2_ctrl *ctrl, - const struct bcm2835_mmal_v4l2_ctrl *mmal_ctrl) -{ - u32 u32_value; - struct vchiq_mmal_port *control; - - control =3D &dev->component[COMP_CAMERA]->control; - - switch (ctrl->val) { - case V4L2_CID_POWER_LINE_FREQUENCY_DISABLED: - u32_value =3D MMAL_PARAM_FLICKERAVOID_OFF; - break; - case V4L2_CID_POWER_LINE_FREQUENCY_50HZ: - u32_value =3D MMAL_PARAM_FLICKERAVOID_50HZ; - break; - case V4L2_CID_POWER_LINE_FREQUENCY_60HZ: - u32_value =3D MMAL_PARAM_FLICKERAVOID_60HZ; - break; - case V4L2_CID_POWER_LINE_FREQUENCY_AUTO: - u32_value =3D MMAL_PARAM_FLICKERAVOID_AUTO; - break; - } - - return vchiq_mmal_port_parameter_set(dev->instance, control, - mmal_ctrl->mmal_id, - &u32_value, sizeof(u32_value)); -} - -static int ctrl_set_awb_mode(struct bcm2835_mmal_dev *dev, - struct v4l2_ctrl *ctrl, - const struct bcm2835_mmal_v4l2_ctrl *mmal_ctrl) -{ - u32 u32_value; - struct vchiq_mmal_port *control; - - control =3D &dev->component[COMP_CAMERA]->control; - - switch (ctrl->val) { - case V4L2_WHITE_BALANCE_MANUAL: - u32_value =3D MMAL_PARAM_AWBMODE_OFF; - break; - - case V4L2_WHITE_BALANCE_AUTO: - u32_value =3D MMAL_PARAM_AWBMODE_AUTO; - break; - - case V4L2_WHITE_BALANCE_INCANDESCENT: - u32_value =3D MMAL_PARAM_AWBMODE_INCANDESCENT; - break; - - case V4L2_WHITE_BALANCE_FLUORESCENT: - u32_value =3D MMAL_PARAM_AWBMODE_FLUORESCENT; - break; - - case V4L2_WHITE_BALANCE_FLUORESCENT_H: - u32_value =3D MMAL_PARAM_AWBMODE_TUNGSTEN; - break; - - case V4L2_WHITE_BALANCE_HORIZON: - u32_value =3D MMAL_PARAM_AWBMODE_HORIZON; - break; - - case V4L2_WHITE_BALANCE_DAYLIGHT: - u32_value =3D MMAL_PARAM_AWBMODE_SUNLIGHT; - break; - - case V4L2_WHITE_BALANCE_FLASH: - u32_value =3D MMAL_PARAM_AWBMODE_FLASH; - break; - - case V4L2_WHITE_BALANCE_CLOUDY: - u32_value =3D MMAL_PARAM_AWBMODE_CLOUDY; - break; - - case V4L2_WHITE_BALANCE_SHADE: - u32_value =3D MMAL_PARAM_AWBMODE_SHADE; - break; - } - - return vchiq_mmal_port_parameter_set(dev->instance, control, - mmal_ctrl->mmal_id, - &u32_value, sizeof(u32_value)); -} - -static int ctrl_set_awb_gains(struct bcm2835_mmal_dev *dev, - struct v4l2_ctrl *ctrl, - const struct bcm2835_mmal_v4l2_ctrl *mmal_ctrl) -{ - struct vchiq_mmal_port *control; - struct mmal_parameter_awbgains gains; - - control =3D &dev->component[COMP_CAMERA]->control; - - if (ctrl->id =3D=3D V4L2_CID_RED_BALANCE) - dev->red_gain =3D ctrl->val; - else if (ctrl->id =3D=3D V4L2_CID_BLUE_BALANCE) - dev->blue_gain =3D ctrl->val; - - gains.r_gain.numerator =3D dev->red_gain; - gains.r_gain.denominator =3D 1000; - gains.b_gain.numerator =3D dev->blue_gain; - gains.b_gain.denominator =3D 1000; - - return vchiq_mmal_port_parameter_set(dev->instance, control, - mmal_ctrl->mmal_id, - &gains, sizeof(gains)); -} - -static int ctrl_set_image_effect(struct bcm2835_mmal_dev *dev, - struct v4l2_ctrl *ctrl, - const struct bcm2835_mmal_v4l2_ctrl *mmal_ctrl) -{ - int ret =3D -EINVAL; - int i, j; - struct vchiq_mmal_port *control; - struct mmal_parameter_imagefx_parameters imagefx; - - for (i =3D 0; i < ARRAY_SIZE(v4l2_to_mmal_effects_values); i++) { - if (ctrl->val !=3D v4l2_to_mmal_effects_values[i].v4l2_effect) - continue; - - imagefx.effect =3D - v4l2_to_mmal_effects_values[i].mmal_effect; - imagefx.num_effect_params =3D - v4l2_to_mmal_effects_values[i].num_effect_params; - - if (imagefx.num_effect_params > MMAL_MAX_IMAGEFX_PARAMETERS) - imagefx.num_effect_params =3D MMAL_MAX_IMAGEFX_PARAMETERS; - - for (j =3D 0; j < imagefx.num_effect_params; j++) - imagefx.effect_parameter[j] =3D - v4l2_to_mmal_effects_values[i].effect_params[j]; - - dev->colourfx.enable =3D - v4l2_to_mmal_effects_values[i].col_fx_enable; - if (!v4l2_to_mmal_effects_values[i].col_fx_fixed_cbcr) { - dev->colourfx.u =3D v4l2_to_mmal_effects_values[i].u; - dev->colourfx.v =3D v4l2_to_mmal_effects_values[i].v; - } - - control =3D &dev->component[COMP_CAMERA]->control; - - ret =3D vchiq_mmal_port_parameter_set(dev->instance, control, - MMAL_PARAMETER_IMAGE_EFFECT_PARAMETERS, - &imagefx, sizeof(imagefx)); - if (ret) - goto exit; - - ret =3D vchiq_mmal_port_parameter_set(dev->instance, control, - MMAL_PARAMETER_COLOUR_EFFECT, - &dev->colourfx, sizeof(dev->colourfx)); - } - -exit: - v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev, - "mmal_ctrl:%p ctrl id:0x%x ctrl val:%d imagefx:0x%x color_effect:%s u:%= d v:%d ret %d(%d)\n", - mmal_ctrl, ctrl->id, ctrl->val, imagefx.effect, - dev->colourfx.enable ? "true" : "false", - dev->colourfx.u, dev->colourfx.v, - ret, (ret =3D=3D 0 ? 0 : -EINVAL)); - return (ret =3D=3D 0 ? 0 : -EINVAL); -} - -static int ctrl_set_colfx(struct bcm2835_mmal_dev *dev, - struct v4l2_ctrl *ctrl, - const struct bcm2835_mmal_v4l2_ctrl *mmal_ctrl) -{ - int ret; - struct vchiq_mmal_port *control; - - control =3D &dev->component[COMP_CAMERA]->control; - - dev->colourfx.u =3D (ctrl->val & 0xff00) >> 8; - dev->colourfx.v =3D ctrl->val & 0xff; - - ret =3D vchiq_mmal_port_parameter_set(dev->instance, control, - MMAL_PARAMETER_COLOUR_EFFECT, - &dev->colourfx, - sizeof(dev->colourfx)); - - v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev, - "%s: After: mmal_ctrl:%p ctrl id:0x%x ctrl val:%d ret %d(%d)\n", - __func__, mmal_ctrl, ctrl->id, ctrl->val, ret, - (ret =3D=3D 0 ? 0 : -EINVAL)); - return (ret =3D=3D 0 ? 0 : -EINVAL); -} - -static int ctrl_set_bitrate(struct bcm2835_mmal_dev *dev, - struct v4l2_ctrl *ctrl, - const struct bcm2835_mmal_v4l2_ctrl *mmal_ctrl) -{ - int ret; - struct vchiq_mmal_port *encoder_out; - - dev->capture.encode_bitrate =3D ctrl->val; - - encoder_out =3D &dev->component[COMP_VIDEO_ENCODE]->output[0]; - - ret =3D vchiq_mmal_port_parameter_set(dev->instance, encoder_out, - mmal_ctrl->mmal_id, &ctrl->val, - sizeof(ctrl->val)); - - v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev, - "%s: After: mmal_ctrl:%p ctrl id:0x%x ctrl val:%d ret %d(%d)\n", - __func__, mmal_ctrl, ctrl->id, ctrl->val, ret, - (ret =3D=3D 0 ? 0 : -EINVAL)); - - /* - * Older firmware versions (pre July 2019) have a bug in handling - * MMAL_PARAMETER_VIDEO_BIT_RATE that result in the call - * returning -MMAL_MSG_STATUS_EINVAL. So ignore errors from this call. - */ - return 0; -} - -static int ctrl_set_bitrate_mode(struct bcm2835_mmal_dev *dev, - struct v4l2_ctrl *ctrl, - const struct bcm2835_mmal_v4l2_ctrl *mmal_ctrl) -{ - u32 bitrate_mode; - struct vchiq_mmal_port *encoder_out; - - encoder_out =3D &dev->component[COMP_VIDEO_ENCODE]->output[0]; - - dev->capture.encode_bitrate_mode =3D ctrl->val; - switch (ctrl->val) { - default: - case V4L2_MPEG_VIDEO_BITRATE_MODE_VBR: - bitrate_mode =3D MMAL_VIDEO_RATECONTROL_VARIABLE; - break; - case V4L2_MPEG_VIDEO_BITRATE_MODE_CBR: - bitrate_mode =3D MMAL_VIDEO_RATECONTROL_CONSTANT; - break; - } - - vchiq_mmal_port_parameter_set(dev->instance, encoder_out, - mmal_ctrl->mmal_id, - &bitrate_mode, - sizeof(bitrate_mode)); - return 0; -} - -static int ctrl_set_image_encode_output(struct bcm2835_mmal_dev *dev, - struct v4l2_ctrl *ctrl, - const struct bcm2835_mmal_v4l2_ctrl *mmal_ctrl) -{ - u32 u32_value; - struct vchiq_mmal_port *jpeg_out; - - jpeg_out =3D &dev->component[COMP_IMAGE_ENCODE]->output[0]; - - u32_value =3D ctrl->val; - - return vchiq_mmal_port_parameter_set(dev->instance, jpeg_out, - mmal_ctrl->mmal_id, - &u32_value, sizeof(u32_value)); -} - -static int ctrl_set_video_encode_param_output(struct bcm2835_mmal_dev *dev, - struct v4l2_ctrl *ctrl, - const struct bcm2835_mmal_v4l2_ctrl *mmal_ctrl) -{ - u32 u32_value; - struct vchiq_mmal_port *vid_enc_ctl; - - vid_enc_ctl =3D &dev->component[COMP_VIDEO_ENCODE]->output[0]; - - u32_value =3D ctrl->val; - - return vchiq_mmal_port_parameter_set(dev->instance, vid_enc_ctl, - mmal_ctrl->mmal_id, - &u32_value, sizeof(u32_value)); -} - -static int ctrl_set_video_encode_profile_level(struct bcm2835_mmal_dev *de= v, - struct v4l2_ctrl *ctrl, - const struct bcm2835_mmal_v4l2_ctrl *mmal_ctrl) -{ - struct mmal_parameter_video_profile param; - int ret =3D 0; - - if (ctrl->id =3D=3D V4L2_CID_MPEG_VIDEO_H264_PROFILE) { - switch (ctrl->val) { - case V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE: - case V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE: - case V4L2_MPEG_VIDEO_H264_PROFILE_MAIN: - case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH: - dev->capture.enc_profile =3D ctrl->val; - break; - default: - ret =3D -EINVAL; - break; - } - } else if (ctrl->id =3D=3D V4L2_CID_MPEG_VIDEO_H264_LEVEL) { - switch (ctrl->val) { - case V4L2_MPEG_VIDEO_H264_LEVEL_1_0: - case V4L2_MPEG_VIDEO_H264_LEVEL_1B: - case V4L2_MPEG_VIDEO_H264_LEVEL_1_1: - case V4L2_MPEG_VIDEO_H264_LEVEL_1_2: - case V4L2_MPEG_VIDEO_H264_LEVEL_1_3: - case V4L2_MPEG_VIDEO_H264_LEVEL_2_0: - case V4L2_MPEG_VIDEO_H264_LEVEL_2_1: - case V4L2_MPEG_VIDEO_H264_LEVEL_2_2: - case V4L2_MPEG_VIDEO_H264_LEVEL_3_0: - case V4L2_MPEG_VIDEO_H264_LEVEL_3_1: - case V4L2_MPEG_VIDEO_H264_LEVEL_3_2: - case V4L2_MPEG_VIDEO_H264_LEVEL_4_0: - dev->capture.enc_level =3D ctrl->val; - break; - default: - ret =3D -EINVAL; - break; - } - } - - if (!ret) { - switch (dev->capture.enc_profile) { - case V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE: - param.profile =3D MMAL_VIDEO_PROFILE_H264_BASELINE; - break; - case V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE: - param.profile =3D - MMAL_VIDEO_PROFILE_H264_CONSTRAINED_BASELINE; - break; - case V4L2_MPEG_VIDEO_H264_PROFILE_MAIN: - param.profile =3D MMAL_VIDEO_PROFILE_H264_MAIN; - break; - case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH: - param.profile =3D MMAL_VIDEO_PROFILE_H264_HIGH; - break; - default: - /* Should never get here */ - break; - } - - switch (dev->capture.enc_level) { - case V4L2_MPEG_VIDEO_H264_LEVEL_1_0: - param.level =3D MMAL_VIDEO_LEVEL_H264_1; - break; - case V4L2_MPEG_VIDEO_H264_LEVEL_1B: - param.level =3D MMAL_VIDEO_LEVEL_H264_1b; - break; - case V4L2_MPEG_VIDEO_H264_LEVEL_1_1: - param.level =3D MMAL_VIDEO_LEVEL_H264_11; - break; - case V4L2_MPEG_VIDEO_H264_LEVEL_1_2: - param.level =3D MMAL_VIDEO_LEVEL_H264_12; - break; - case V4L2_MPEG_VIDEO_H264_LEVEL_1_3: - param.level =3D MMAL_VIDEO_LEVEL_H264_13; - break; - case V4L2_MPEG_VIDEO_H264_LEVEL_2_0: - param.level =3D MMAL_VIDEO_LEVEL_H264_2; - break; - case V4L2_MPEG_VIDEO_H264_LEVEL_2_1: - param.level =3D MMAL_VIDEO_LEVEL_H264_21; - break; - case V4L2_MPEG_VIDEO_H264_LEVEL_2_2: - param.level =3D MMAL_VIDEO_LEVEL_H264_22; - break; - case V4L2_MPEG_VIDEO_H264_LEVEL_3_0: - param.level =3D MMAL_VIDEO_LEVEL_H264_3; - break; - case V4L2_MPEG_VIDEO_H264_LEVEL_3_1: - param.level =3D MMAL_VIDEO_LEVEL_H264_31; - break; - case V4L2_MPEG_VIDEO_H264_LEVEL_3_2: - param.level =3D MMAL_VIDEO_LEVEL_H264_32; - break; - case V4L2_MPEG_VIDEO_H264_LEVEL_4_0: - param.level =3D MMAL_VIDEO_LEVEL_H264_4; - break; - default: - /* Should never get here */ - break; - } - - ret =3D vchiq_mmal_port_parameter_set(dev->instance, - &dev->component[COMP_VIDEO_ENCODE]->output[0], - mmal_ctrl->mmal_id, - ¶m, sizeof(param)); - } - return ret; -} - -static int ctrl_set_scene_mode(struct bcm2835_mmal_dev *dev, - struct v4l2_ctrl *ctrl, - const struct bcm2835_mmal_v4l2_ctrl *mmal_ctrl) -{ - int ret =3D 0; - int shutter_speed; - struct vchiq_mmal_port *control; - - v4l2_dbg(0, bcm2835_v4l2_debug, &dev->v4l2_dev, - "scene mode selected %d, was %d\n", ctrl->val, - dev->scene_mode); - control =3D &dev->component[COMP_CAMERA]->control; - - if (ctrl->val =3D=3D dev->scene_mode) - return 0; - - if (ctrl->val =3D=3D V4L2_SCENE_MODE_NONE) { - /* Restore all user selections */ - dev->scene_mode =3D V4L2_SCENE_MODE_NONE; - - if (dev->exposure_mode_user =3D=3D MMAL_PARAM_EXPOSUREMODE_OFF) - shutter_speed =3D dev->manual_shutter_speed; - else - shutter_speed =3D 0; - - v4l2_dbg(0, bcm2835_v4l2_debug, &dev->v4l2_dev, - "%s: scene mode none: shut_speed %d, exp_mode %d, metering %d\n", - __func__, shutter_speed, dev->exposure_mode_user, - dev->metering_mode); - ret =3D vchiq_mmal_port_parameter_set(dev->instance, - control, - MMAL_PARAMETER_SHUTTER_SPEED, - &shutter_speed, - sizeof(shutter_speed)); - ret +=3D vchiq_mmal_port_parameter_set(dev->instance, - control, - MMAL_PARAMETER_EXPOSURE_MODE, - &dev->exposure_mode_user, - sizeof(u32)); - dev->exposure_mode_active =3D dev->exposure_mode_user; - ret +=3D vchiq_mmal_port_parameter_set(dev->instance, - control, - MMAL_PARAMETER_EXP_METERING_MODE, - &dev->metering_mode, - sizeof(u32)); - ret +=3D set_framerate_params(dev); - } else { - /* Set up scene mode */ - int i; - const struct v4l2_mmal_scene_config *scene =3D NULL; - int shutter_speed; - enum mmal_parameter_exposuremode exposure_mode; - enum mmal_parameter_exposuremeteringmode metering_mode; - - for (i =3D 0; i < ARRAY_SIZE(scene_configs); i++) { - if (scene_configs[i].v4l2_scene =3D=3D ctrl->val) { - scene =3D &scene_configs[i]; - break; - } - } - if (!scene) - return -EINVAL; - if (i >=3D ARRAY_SIZE(scene_configs)) - return -EINVAL; - - /* Set all the values */ - dev->scene_mode =3D ctrl->val; - - if (scene->exposure_mode =3D=3D MMAL_PARAM_EXPOSUREMODE_OFF) - shutter_speed =3D dev->manual_shutter_speed; - else - shutter_speed =3D 0; - exposure_mode =3D scene->exposure_mode; - metering_mode =3D scene->metering_mode; - - v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev, - "%s: scene mode none: shut_speed %d, exp_mode %d, metering %d\n", - __func__, shutter_speed, exposure_mode, metering_mode); - - ret =3D vchiq_mmal_port_parameter_set(dev->instance, control, - MMAL_PARAMETER_SHUTTER_SPEED, - &shutter_speed, - sizeof(shutter_speed)); - ret +=3D vchiq_mmal_port_parameter_set(dev->instance, control, - MMAL_PARAMETER_EXPOSURE_MODE, - &exposure_mode, - sizeof(u32)); - dev->exposure_mode_active =3D exposure_mode; - ret +=3D vchiq_mmal_port_parameter_set(dev->instance, control, - MMAL_PARAMETER_EXPOSURE_MODE, - &exposure_mode, - sizeof(u32)); - ret +=3D vchiq_mmal_port_parameter_set(dev->instance, control, - MMAL_PARAMETER_EXP_METERING_MODE, - &metering_mode, - sizeof(u32)); - ret +=3D set_framerate_params(dev); - } - if (ret) { - v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev, - "%s: Setting scene to %d, ret=3D%d\n", - __func__, ctrl->val, ret); - ret =3D -EINVAL; - } - return 0; -} - -static int bcm2835_mmal_s_ctrl(struct v4l2_ctrl *ctrl) -{ - struct bcm2835_mmal_dev *dev =3D container_of(ctrl->handler, struct bcm28= 35_mmal_dev, - ctrl_handler); - const struct bcm2835_mmal_v4l2_ctrl *mmal_ctrl =3D ctrl->priv; - int ret; - - if (!mmal_ctrl || mmal_ctrl->id !=3D ctrl->id || !mmal_ctrl->setter) { - pr_warn("mmal_ctrl:%p ctrl id:%d\n", mmal_ctrl, ctrl->id); - return -EINVAL; - } - - ret =3D mmal_ctrl->setter(dev, ctrl, mmal_ctrl); - if (ret) - pr_warn("ctrl id:%d/MMAL param %08X- returned ret %d\n", - ctrl->id, mmal_ctrl->mmal_id, ret); - return ret; -} - -static const struct v4l2_ctrl_ops bcm2835_mmal_ctrl_ops =3D { - .s_ctrl =3D bcm2835_mmal_s_ctrl, -}; - -static const struct bcm2835_mmal_v4l2_ctrl v4l2_ctrls[V4L2_CTRL_COUNT] =3D= { - { - .id =3D V4L2_CID_SATURATION, - .type =3D MMAL_CONTROL_TYPE_STD, - .min =3D -100, - .max =3D 100, - .def =3D 0, - .step =3D 1, - .imenu =3D NULL, - .mmal_id =3D MMAL_PARAMETER_SATURATION, - .setter =3D ctrl_set_rational, - }, - { - .id =3D V4L2_CID_SHARPNESS, - .type =3D MMAL_CONTROL_TYPE_STD, - .min =3D -100, - .max =3D 100, - .def =3D 0, - .step =3D 1, - .imenu =3D NULL, - .mmal_id =3D MMAL_PARAMETER_SHARPNESS, - .setter =3D ctrl_set_rational, - }, - { - .id =3D V4L2_CID_CONTRAST, - .type =3D MMAL_CONTROL_TYPE_STD, - .min =3D -100, - .max =3D 100, - .def =3D 0, - .step =3D 1, - .imenu =3D NULL, - .mmal_id =3D MMAL_PARAMETER_CONTRAST, - .setter =3D ctrl_set_rational, - }, - { - .id =3D V4L2_CID_BRIGHTNESS, - .type =3D MMAL_CONTROL_TYPE_STD, - .min =3D 0, - .max =3D 100, - .def =3D 50, - .step =3D 1, - .imenu =3D NULL, - .mmal_id =3D MMAL_PARAMETER_BRIGHTNESS, - .setter =3D ctrl_set_rational, - }, - { - .id =3D V4L2_CID_ISO_SENSITIVITY, - .type =3D MMAL_CONTROL_TYPE_INT_MENU, - .min =3D 0, - .max =3D ARRAY_SIZE(iso_qmenu) - 1, - .def =3D 0, - .step =3D 1, - .imenu =3D iso_qmenu, - .mmal_id =3D MMAL_PARAMETER_ISO, - .setter =3D ctrl_set_iso, - }, - { - .id =3D V4L2_CID_ISO_SENSITIVITY_AUTO, - .type =3D MMAL_CONTROL_TYPE_STD_MENU, - .min =3D 0, - .max =3D V4L2_ISO_SENSITIVITY_AUTO, - .def =3D V4L2_ISO_SENSITIVITY_AUTO, - .step =3D 1, - .imenu =3D NULL, - .mmal_id =3D MMAL_PARAMETER_ISO, - .setter =3D ctrl_set_iso, - }, - { - .id =3D V4L2_CID_IMAGE_STABILIZATION, - .type =3D MMAL_CONTROL_TYPE_STD, - .min =3D 0, - .max =3D 1, - .def =3D 0, - .step =3D 1, - .imenu =3D NULL, - .mmal_id =3D MMAL_PARAMETER_VIDEO_STABILISATION, - .setter =3D ctrl_set_value, - }, - { - .id =3D V4L2_CID_EXPOSURE_AUTO, - .type =3D MMAL_CONTROL_TYPE_STD_MENU, - .min =3D ~0x03, - .max =3D V4L2_EXPOSURE_APERTURE_PRIORITY, - .def =3D V4L2_EXPOSURE_AUTO, - .step =3D 0, - .imenu =3D NULL, - .mmal_id =3D MMAL_PARAMETER_EXPOSURE_MODE, - .setter =3D ctrl_set_exposure, - }, - { - .id =3D V4L2_CID_EXPOSURE_ABSOLUTE, - .type =3D MMAL_CONTROL_TYPE_STD, - /* Units of 100usecs */ - .min =3D 1, - .max =3D 1 * 1000 * 10, - .def =3D 100 * 10, - .step =3D 1, - .imenu =3D NULL, - .mmal_id =3D MMAL_PARAMETER_SHUTTER_SPEED, - .setter =3D ctrl_set_exposure, - }, - { - .id =3D V4L2_CID_AUTO_EXPOSURE_BIAS, - .type =3D MMAL_CONTROL_TYPE_INT_MENU, - .min =3D 0, - .max =3D ARRAY_SIZE(ev_bias_qmenu) - 1, - .def =3D (ARRAY_SIZE(ev_bias_qmenu) + 1) / 2 - 1, - .step =3D 0, - .imenu =3D ev_bias_qmenu, - .mmal_id =3D MMAL_PARAMETER_EXPOSURE_COMP, - .setter =3D ctrl_set_value_ev, - }, - { - .id =3D V4L2_CID_EXPOSURE_AUTO_PRIORITY, - .type =3D MMAL_CONTROL_TYPE_STD, - .min =3D 0, - .max =3D 1, - .def =3D 0, - .step =3D 1, - .imenu =3D NULL, - /* Dummy MMAL ID as it gets mapped into FPS range */ - .mmal_id =3D 0, - .setter =3D ctrl_set_exposure, - }, - { - .id =3D V4L2_CID_EXPOSURE_METERING, - .type =3D MMAL_CONTROL_TYPE_STD_MENU, - .min =3D ~0xf, - .max =3D V4L2_EXPOSURE_METERING_MATRIX, - .def =3D V4L2_EXPOSURE_METERING_AVERAGE, - .step =3D 0, - .imenu =3D NULL, - .mmal_id =3D MMAL_PARAMETER_EXP_METERING_MODE, - .setter =3D ctrl_set_metering_mode, - }, - { - .id =3D V4L2_CID_AUTO_N_PRESET_WHITE_BALANCE, - .type =3D MMAL_CONTROL_TYPE_STD_MENU, - .min =3D ~0x3ff, - .max =3D V4L2_WHITE_BALANCE_SHADE, - .def =3D V4L2_WHITE_BALANCE_AUTO, - .step =3D 0, - .imenu =3D NULL, - .mmal_id =3D MMAL_PARAMETER_AWB_MODE, - .setter =3D ctrl_set_awb_mode, - }, - { - .id =3D V4L2_CID_RED_BALANCE, - .type =3D MMAL_CONTROL_TYPE_STD, - .min =3D 1, - .max =3D 7999, - .def =3D 1000, - .step =3D 1, - .imenu =3D NULL, - .mmal_id =3D MMAL_PARAMETER_CUSTOM_AWB_GAINS, - .setter =3D ctrl_set_awb_gains, - }, - { - .id =3D V4L2_CID_BLUE_BALANCE, - .type =3D MMAL_CONTROL_TYPE_STD, - .min =3D 1, - .max =3D 7999, - .def =3D 1000, - .step =3D 1, - .imenu =3D NULL, - .mmal_id =3D MMAL_PARAMETER_CUSTOM_AWB_GAINS, - .setter =3D ctrl_set_awb_gains, - }, - { - .id =3D V4L2_CID_COLORFX, - .type =3D MMAL_CONTROL_TYPE_STD_MENU, - .min =3D 0, - .max =3D V4L2_COLORFX_SET_CBCR, - .def =3D V4L2_COLORFX_NONE, - .step =3D 0, - .imenu =3D NULL, - .mmal_id =3D MMAL_PARAMETER_IMAGE_EFFECT, - .setter =3D ctrl_set_image_effect, - }, - { - .id =3D V4L2_CID_COLORFX_CBCR, - .type =3D MMAL_CONTROL_TYPE_STD, - .min =3D 0, - .max =3D 0xffff, - .def =3D 0x8080, - .step =3D 1, - .imenu =3D NULL, - .mmal_id =3D MMAL_PARAMETER_COLOUR_EFFECT, - .setter =3D ctrl_set_colfx, - }, - { - .id =3D V4L2_CID_ROTATE, - .type =3D MMAL_CONTROL_TYPE_STD, - .min =3D 0, - .max =3D 360, - .def =3D 0, - .step =3D 90, - .imenu =3D NULL, - .mmal_id =3D MMAL_PARAMETER_ROTATION, - .setter =3D ctrl_set_rotate, - }, - { - .id =3D V4L2_CID_HFLIP, - .type =3D MMAL_CONTROL_TYPE_STD, - .min =3D 0, - .max =3D 1, - .def =3D 0, - .step =3D 1, - .imenu =3D NULL, - .mmal_id =3D MMAL_PARAMETER_MIRROR, - .setter =3D ctrl_set_flip, - }, - { - .id =3D V4L2_CID_VFLIP, - .type =3D MMAL_CONTROL_TYPE_STD, - .min =3D 0, - .max =3D 1, - .def =3D 0, - .step =3D 1, - .imenu =3D NULL, - .mmal_id =3D MMAL_PARAMETER_MIRROR, - .setter =3D ctrl_set_flip, - }, - { - .id =3D V4L2_CID_MPEG_VIDEO_BITRATE_MODE, - .type =3D MMAL_CONTROL_TYPE_STD_MENU, - .min =3D 0, - .max =3D V4L2_MPEG_VIDEO_BITRATE_MODE_CBR, - .def =3D 0, - .step =3D 0, - .imenu =3D NULL, - .mmal_id =3D MMAL_PARAMETER_RATECONTROL, - .setter =3D ctrl_set_bitrate_mode, - }, - { - .id =3D V4L2_CID_MPEG_VIDEO_BITRATE, - .type =3D MMAL_CONTROL_TYPE_STD, - .min =3D 25 * 1000, - .max =3D 25 * 1000 * 1000, - .def =3D 10 * 1000 * 1000, - .step =3D 25 * 1000, - .imenu =3D NULL, - .mmal_id =3D MMAL_PARAMETER_VIDEO_BIT_RATE, - .setter =3D ctrl_set_bitrate, - }, - { - .id =3D V4L2_CID_JPEG_COMPRESSION_QUALITY, - .type =3D MMAL_CONTROL_TYPE_STD, - .min =3D 1, - .max =3D 100, - .def =3D 30, - .step =3D 1, - .imenu =3D NULL, - .mmal_id =3D MMAL_PARAMETER_JPEG_Q_FACTOR, - .setter =3D ctrl_set_image_encode_output, - }, - { - .id =3D V4L2_CID_POWER_LINE_FREQUENCY, - .type =3D MMAL_CONTROL_TYPE_STD_MENU, - .min =3D 0, - .max =3D V4L2_CID_POWER_LINE_FREQUENCY_AUTO, - .def =3D 1, - .step =3D 1, - .imenu =3D NULL, - .mmal_id =3D MMAL_PARAMETER_FLICKER_AVOID, - .setter =3D ctrl_set_flicker_avoidance, - }, - { - .id =3D V4L2_CID_MPEG_VIDEO_REPEAT_SEQ_HEADER, - .type =3D MMAL_CONTROL_TYPE_STD, - .min =3D 0, - .max =3D 1, - .def =3D 0, - .step =3D 1, - .imenu =3D NULL, - .mmal_id =3D MMAL_PARAMETER_VIDEO_ENCODE_INLINE_HEADER, - .setter =3D ctrl_set_video_encode_param_output, - }, - { - .id =3D V4L2_CID_MPEG_VIDEO_H264_PROFILE, - .type =3D MMAL_CONTROL_TYPE_STD_MENU, - .min =3D ~(BIT(V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE) | - BIT(V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE) | - BIT(V4L2_MPEG_VIDEO_H264_PROFILE_MAIN) | - BIT(V4L2_MPEG_VIDEO_H264_PROFILE_HIGH)), - .max =3D V4L2_MPEG_VIDEO_H264_PROFILE_HIGH, - .def =3D V4L2_MPEG_VIDEO_H264_PROFILE_HIGH, - .step =3D 1, - .imenu =3D NULL, - .mmal_id =3D MMAL_PARAMETER_PROFILE, - .setter =3D ctrl_set_video_encode_profile_level, - }, - { - .id =3D V4L2_CID_MPEG_VIDEO_H264_LEVEL, - .type =3D MMAL_CONTROL_TYPE_STD_MENU, - .min =3D ~(BIT(V4L2_MPEG_VIDEO_H264_LEVEL_1_0) | - BIT(V4L2_MPEG_VIDEO_H264_LEVEL_1B) | - BIT(V4L2_MPEG_VIDEO_H264_LEVEL_1_1) | - BIT(V4L2_MPEG_VIDEO_H264_LEVEL_1_2) | - BIT(V4L2_MPEG_VIDEO_H264_LEVEL_1_3) | - BIT(V4L2_MPEG_VIDEO_H264_LEVEL_2_0) | - BIT(V4L2_MPEG_VIDEO_H264_LEVEL_2_1) | - BIT(V4L2_MPEG_VIDEO_H264_LEVEL_2_2) | - BIT(V4L2_MPEG_VIDEO_H264_LEVEL_3_0) | - BIT(V4L2_MPEG_VIDEO_H264_LEVEL_3_1) | - BIT(V4L2_MPEG_VIDEO_H264_LEVEL_3_2) | - BIT(V4L2_MPEG_VIDEO_H264_LEVEL_4_0)), - .max =3D V4L2_MPEG_VIDEO_H264_LEVEL_4_0, - .def =3D V4L2_MPEG_VIDEO_H264_LEVEL_4_0, - .step =3D 1, - .imenu =3D NULL, - .mmal_id =3D MMAL_PARAMETER_PROFILE, - .setter =3D ctrl_set_video_encode_profile_level, - }, - { - .id =3D V4L2_CID_SCENE_MODE, - .type =3D MMAL_CONTROL_TYPE_STD_MENU, - /* mask is computed at runtime */ - .min =3D -1, - .max =3D V4L2_SCENE_MODE_TEXT, - .def =3D V4L2_SCENE_MODE_NONE, - .step =3D 1, - .imenu =3D NULL, - .mmal_id =3D MMAL_PARAMETER_PROFILE, - .setter =3D ctrl_set_scene_mode, - }, - { - .id =3D V4L2_CID_MPEG_VIDEO_H264_I_PERIOD, - .type =3D MMAL_CONTROL_TYPE_STD, - .min =3D 0, - .max =3D 0x7FFFFFFF, - .def =3D 60, - .step =3D 1, - .imenu =3D NULL, - .mmal_id =3D MMAL_PARAMETER_INTRAPERIOD, - .setter =3D ctrl_set_video_encode_param_output, - }, -}; - -int bcm2835_mmal_set_all_camera_controls(struct bcm2835_mmal_dev *dev) -{ - int c; - int ret =3D 0; - - for (c =3D 0; c < V4L2_CTRL_COUNT; c++) { - if ((dev->ctrls[c]) && (v4l2_ctrls[c].setter)) { - ret =3D v4l2_ctrls[c].setter(dev, dev->ctrls[c], - &v4l2_ctrls[c]); - if (ret) { - v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev, - "Failed when setting default values for ctrl %d\n", - c); - break; - } - } - } - return ret; -} - -int set_framerate_params(struct bcm2835_mmal_dev *dev) -{ - struct mmal_parameter_fps_range fps_range; - int ret; - - fps_range.fps_high.numerator =3D dev->capture.timeperframe.denominator; - fps_range.fps_high.denominator =3D dev->capture.timeperframe.numerator; - - if ((dev->exposure_mode_active !=3D MMAL_PARAM_EXPOSUREMODE_OFF) && - (dev->exp_auto_priority)) { - /* Variable FPS. Define min FPS as 1fps. */ - fps_range.fps_low.numerator =3D 1; - fps_range.fps_low.denominator =3D 1; - } else { - /* Fixed FPS - set min and max to be the same */ - fps_range.fps_low.numerator =3D fps_range.fps_high.numerator; - fps_range.fps_low.denominator =3D fps_range.fps_high.denominator; - } - - v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev, - "Set fps range to %d/%d to %d/%d\n", - fps_range.fps_low.numerator, - fps_range.fps_low.denominator, - fps_range.fps_high.numerator, - fps_range.fps_high.denominator); - - ret =3D vchiq_mmal_port_parameter_set(dev->instance, - &dev->component[COMP_CAMERA]->output[CAM_PORT_PREVIEW], - MMAL_PARAMETER_FPS_RANGE, - &fps_range, sizeof(fps_range)); - ret +=3D vchiq_mmal_port_parameter_set(dev->instance, - &dev->component[COMP_CAMERA]->output[CAM_PORT_VIDEO], - MMAL_PARAMETER_FPS_RANGE, - &fps_range, sizeof(fps_range)); - ret +=3D vchiq_mmal_port_parameter_set(dev->instance, - &dev->component[COMP_CAMERA]->output[CAM_PORT_CAPTURE], - MMAL_PARAMETER_FPS_RANGE, - &fps_range, sizeof(fps_range)); - if (ret) - v4l2_dbg(0, bcm2835_v4l2_debug, &dev->v4l2_dev, - "Failed to set fps ret %d\n", ret); - - return ret; -} - -int bcm2835_mmal_init_controls(struct bcm2835_mmal_dev *dev, struct v4l2_c= trl_handler *hdl) -{ - int c; - const struct bcm2835_mmal_v4l2_ctrl *ctrl; - - v4l2_ctrl_handler_init(hdl, V4L2_CTRL_COUNT); - - for (c =3D 0; c < V4L2_CTRL_COUNT; c++) { - ctrl =3D &v4l2_ctrls[c]; - - switch (ctrl->type) { - case MMAL_CONTROL_TYPE_STD: - dev->ctrls[c] =3D v4l2_ctrl_new_std(hdl, &bcm2835_mmal_ctrl_ops, - ctrl->id, ctrl->min, ctrl->max, - ctrl->step, ctrl->def); - break; - - case MMAL_CONTROL_TYPE_STD_MENU: - { - u64 mask =3D ctrl->min; - - if (ctrl->id =3D=3D V4L2_CID_SCENE_MODE) { - /* Special handling to work out the mask - * value based on the scene_configs array - * at runtime. Reduces the chance of - * mismatches. - */ - int i; - - mask =3D BIT(V4L2_SCENE_MODE_NONE); - for (i =3D 0; - i < ARRAY_SIZE(scene_configs); - i++) { - mask |=3D BIT(scene_configs[i].v4l2_scene); - } - mask =3D ~mask; - } - - dev->ctrls[c] =3D v4l2_ctrl_new_std_menu(hdl, &bcm2835_mmal_ctrl_ops, - ctrl->id, ctrl->max, mask, - ctrl->def); - break; - } - - case MMAL_CONTROL_TYPE_INT_MENU: - dev->ctrls[c] =3D v4l2_ctrl_new_int_menu(hdl, &bcm2835_mmal_ctrl_ops, - ctrl->id, ctrl->max, - ctrl->def, ctrl->imenu); - break; - - case MMAL_CONTROL_TYPE_CLUSTER: - /* skip this entry when constructing controls */ - continue; - } - - if (hdl->error) - break; - - dev->ctrls[c]->priv =3D (void *)ctrl; - } - - if (hdl->error) { - pr_err("error adding control %d/%d id 0x%x\n", c, - V4L2_CTRL_COUNT, ctrl->id); - return hdl->error; - } - - for (c =3D 0; c < V4L2_CTRL_COUNT; c++) { - ctrl =3D &v4l2_ctrls[c]; - - switch (ctrl->type) { - case MMAL_CONTROL_TYPE_CLUSTER: - v4l2_ctrl_auto_cluster(ctrl->min, - &dev->ctrls[c + 1], - ctrl->max, - ctrl->def); - break; - - case MMAL_CONTROL_TYPE_STD: - case MMAL_CONTROL_TYPE_STD_MENU: - case MMAL_CONTROL_TYPE_INT_MENU: - break; - } - } - - return 0; -} --=20 2.50.1 From nobody Fri Oct 3 18:02:36 2025 Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B69C32DE1FA for ; Wed, 27 Aug 2025 06:25:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=213.167.242.64 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756275958; cv=none; b=ZbxMPPITfK8J0fk9zB522m/eWO5Fy7wURHamfcXmZ136I0EMs+VjHp0jJ66KJmD2oBkRqDAbKEI/zCrh5TVeD8sla1e82PAFuPG6pz6DScXWUf1B6MJIpssFKTu8FVm8oKSfzhnjHztEjlE8K0A9x06Sg9MVRJPtA1xJsBT4O74= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756275958; c=relaxed/simple; bh=cbo7llanDE5LHGG6DHoyS/LY5b862RclitNiMZVMu2Q=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=h4GACQ73/gn35iLae7gR5FzTaCoJ+HNeSVxvm6UN7OzF4ijptZUs8sQvQLIZdH0Wqqwt+nClAWy9kicqmj5J3zCRb8IrTwMVOroSNlSxCecWzHsJzj84qwezecDxXsvtJlAMG6BFoSrHrYFiPazR4FTMMmnJPq1uUUu3fnQSXo4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=ideasonboard.com; spf=pass smtp.mailfrom=ideasonboard.com; dkim=pass (1024-bit key) header.d=ideasonboard.com header.i=@ideasonboard.com header.b=jhBOgG2Q; arc=none smtp.client-ip=213.167.242.64 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=ideasonboard.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=ideasonboard.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="jhBOgG2Q" Received: from mail.ideasonboard.com (unknown [223.190.80.94]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id C978F300E; Wed, 27 Aug 2025 08:24:51 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1756275892; bh=cbo7llanDE5LHGG6DHoyS/LY5b862RclitNiMZVMu2Q=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=jhBOgG2Qa8MPoMf3SqT6KR8ZmFV8+zJVEQ0mQFimqZ7W+4apR5QPabPyxt7MOqX4T KRCBu8N8qTBh+Cc5pHzdamGH/W8TJZxtaGvSK0GOcG/GLCBidUf27slZri84dVoYk9 O3vyKgLSL8LYiW3M/Y3e+WEKM9yTTecUjUkeqj48= From: Jai Luthra Date: Wed, 27 Aug 2025 11:54:12 +0530 Subject: [PATCH 5/5] platform/broadcom: Destage VCHIQ MMAL driver 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: <20250827-vchiq-destage-v1-5-5052a0d81c42@ideasonboard.com> References: <20250827-vchiq-destage-v1-0-5052a0d81c42@ideasonboard.com> In-Reply-To: <20250827-vchiq-destage-v1-0-5052a0d81c42@ideasonboard.com> To: Florian Fainelli , Broadcom internal kernel review list , Greg Kroah-Hartman , Ray Jui , Scott Branden Cc: linux-rpi-kernel@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-staging@lists.linux.dev, linux-kernel@vger.kernel.org, kernel-list@raspberrypi.com, Stefan Wahren , Dave Stevenson , Laurent Pinchart , Jai Luthra X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=6730; i=jai.luthra@ideasonboard.com; h=from:subject:message-id; bh=cbo7llanDE5LHGG6DHoyS/LY5b862RclitNiMZVMu2Q=; b=owEBbQKS/ZANAwAKAUPekfkkmnFFAcsmYgBorqSd/7nD8vgl1r3/5VYyYJFkndddKs9fbEgwy k8w+IQz1MGJAjMEAAEKAB0WIQRN4NgY5dV16NRar8VD3pH5JJpxRQUCaK6knQAKCRBD3pH5JJpx RWqMEACnM9Ho6g9QM4F5OYBVA2dV3VhyS1IL3RckZCw2K7xa9IEs9YDn8baG64HhI+Vdjv48bex fBtfivW82AeskhKNZLeGSAo2Q4V6CVNQ6IcaJRG+zjHl/9EkXgMgm+2t7S2R/PsvxMqx5D2RZbn WzuZY3j8HVfDr94eHH8eWNZYkipDtqgh1fj4i6zVpuPKjtyfm8xHY+x9bfRCpwmI/t/LnZ55Cj1 oBfuvRY+n00LAUQSRp/qgLttaS+qgKk1EMlfILSo+ydDSyxXHUOvQOpOI+gTHIeMw/8Yg2BYXsQ r2EFg3vsMX2AbliCBLW83cD1S9YqEdMgObSdeRUXhGQpsrtKlWXi22pwDcFBdLDjK9hobC+QM6U /vN/kKMrA2k9cDUS0WF3spemTpYzgehS7NL/d7yES8qu45u1b0zxGaH6+8m3e330PiYAH1G4py4 +Q1j6fZlIeEpLZYK8RWlf3ldaaKvCAoLHEtYE6ur8uDx9nXcKGrv/3OHYl/vTEbvpvSMKk/NT9F LqfaHcz7rqBTju9WQo3xEhzVmZ59HJHptiTtY5ljpH+fqk2w405NqW8mDsx8rhFPpb7sDhGbo0/ kEVVe+60XP3wodftE0XU8x7Mw2Hd2LCKfO+DkFgfHZg78HzKs1zX5kaoF2uJZvrSlvB8kOQnzFX iyj1ys/Z7kOwxTw== X-Developer-Key: i=jai.luthra@ideasonboard.com; a=openpgp; fpr=4DE0D818E5D575E8D45AAFC543DE91F9249A7145 Destage the VCHIQ MMAL driver to drivers/platform/broadcom. Signed-off-by: Jai Luthra --- MAINTAINERS | = 2 +- drivers/platform/broadcom/Kconfig | = 2 ++ drivers/platform/broadcom/Makefile | = 1 + drivers/{staging/vc04_services =3D> platform/broadcom}/vchiq-mmal/Kconfig = | 0 .../{staging/vc04_services =3D> platform/broadcom}/vchiq-mmal/Makefile = | 0 .../vc04_services =3D> platform/broadcom}/vchiq-mmal/mmal-common.h = | 0 .../vc04_services =3D> platform/broadcom}/vchiq-mmal/mmal-encodings.h = | 0 .../vc04_services =3D> platform/broadcom}/vchiq-mmal/mmal-msg-common.h = | 0 .../vc04_services =3D> platform/broadcom}/vchiq-mmal/mmal-msg-format.h = | 0 .../vc04_services =3D> platform/broadcom}/vchiq-mmal/mmal-msg-port.h = | 0 .../{staging/vc04_services =3D> platform/broadcom}/vchiq-mmal/mmal-msg.h = | 0 .../vc04_services =3D> platform/broadcom}/vchiq-mmal/mmal-parameters.h = | 0 .../vc04_services =3D> platform/broadcom}/vchiq-mmal/mmal-vchiq.c = | 0 .../vc04_services =3D> platform/broadcom}/vchiq-mmal/mmal-vchiq.h = | 0 drivers/staging/vc04_services/Kconfig | = 2 -- drivers/staging/vc04_services/Makefile | = 1 - 16 files changed, 4 insertions(+), 4 deletions(-) diff --git a/MAINTAINERS b/MAINTAINERS index f39f326a88d7332906ecdd1d9d90cc6848ba3205..5a554add28a65dd42c5d08e01ec= bf14c771e9925 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -4753,7 +4753,7 @@ S: Maintained T: git https://github.com/broadcom/stblinux.git F: Documentation/devicetree/bindings/pci/brcm,stb-pcie.yaml F: drivers/pci/controller/pcie-brcmstb.c -F: drivers/platform/broadcom/vchiq-interface +F: drivers/platform/broadcom/vchiq-* F: drivers/staging/vc04_services F: include/linux/vchiq N: bcm2711 diff --git a/drivers/platform/broadcom/Kconfig b/drivers/platform/broadcom/= Kconfig index 7dec1ca85d6c56bdb21a9cb170c1d0cdf7587e63..606f3f19774989cbb41d2a207a1= 0a32edd420622 100644 --- a/drivers/platform/broadcom/Kconfig +++ b/drivers/platform/broadcom/Kconfig @@ -33,5 +33,7 @@ config VCHIQ_CDEV =20 If not sure, set this to 'Y'. =20 +source "drivers/platform/broadcom/vchiq-mmal/Kconfig" + endif =20 diff --git a/drivers/platform/broadcom/Makefile b/drivers/platform/broadcom= /Makefile index a807571c59a47bb418cbb1dfcc389219d0d0ff22..2a7c9511e5d8bbe11c05680eea0= 16ef40796b648 100644 --- a/drivers/platform/broadcom/Makefile +++ b/drivers/platform/broadcom/Makefile @@ -12,3 +12,4 @@ ifdef CONFIG_VCHIQ_CDEV vchiq-objs +=3D vchiq-interface/vchiq_dev.o endif =20 +obj-$(CONFIG_BCM2835_VCHIQ_MMAL) +=3D vchiq-mmal/ diff --git a/drivers/staging/vc04_services/vchiq-mmal/Kconfig b/drivers/pla= tform/broadcom/vchiq-mmal/Kconfig similarity index 100% rename from drivers/staging/vc04_services/vchiq-mmal/Kconfig rename to drivers/platform/broadcom/vchiq-mmal/Kconfig diff --git a/drivers/staging/vc04_services/vchiq-mmal/Makefile b/drivers/pl= atform/broadcom/vchiq-mmal/Makefile similarity index 100% rename from drivers/staging/vc04_services/vchiq-mmal/Makefile rename to drivers/platform/broadcom/vchiq-mmal/Makefile diff --git a/drivers/staging/vc04_services/vchiq-mmal/mmal-common.h b/drive= rs/platform/broadcom/vchiq-mmal/mmal-common.h similarity index 100% rename from drivers/staging/vc04_services/vchiq-mmal/mmal-common.h rename to drivers/platform/broadcom/vchiq-mmal/mmal-common.h diff --git a/drivers/staging/vc04_services/vchiq-mmal/mmal-encodings.h b/dr= ivers/platform/broadcom/vchiq-mmal/mmal-encodings.h similarity index 100% rename from drivers/staging/vc04_services/vchiq-mmal/mmal-encodings.h rename to drivers/platform/broadcom/vchiq-mmal/mmal-encodings.h diff --git a/drivers/staging/vc04_services/vchiq-mmal/mmal-msg-common.h b/d= rivers/platform/broadcom/vchiq-mmal/mmal-msg-common.h similarity index 100% rename from drivers/staging/vc04_services/vchiq-mmal/mmal-msg-common.h rename to drivers/platform/broadcom/vchiq-mmal/mmal-msg-common.h diff --git a/drivers/staging/vc04_services/vchiq-mmal/mmal-msg-format.h b/d= rivers/platform/broadcom/vchiq-mmal/mmal-msg-format.h similarity index 100% rename from drivers/staging/vc04_services/vchiq-mmal/mmal-msg-format.h rename to drivers/platform/broadcom/vchiq-mmal/mmal-msg-format.h diff --git a/drivers/staging/vc04_services/vchiq-mmal/mmal-msg-port.h b/dri= vers/platform/broadcom/vchiq-mmal/mmal-msg-port.h similarity index 100% rename from drivers/staging/vc04_services/vchiq-mmal/mmal-msg-port.h rename to drivers/platform/broadcom/vchiq-mmal/mmal-msg-port.h diff --git a/drivers/staging/vc04_services/vchiq-mmal/mmal-msg.h b/drivers/= platform/broadcom/vchiq-mmal/mmal-msg.h similarity index 100% rename from drivers/staging/vc04_services/vchiq-mmal/mmal-msg.h rename to drivers/platform/broadcom/vchiq-mmal/mmal-msg.h diff --git a/drivers/staging/vc04_services/vchiq-mmal/mmal-parameters.h b/d= rivers/platform/broadcom/vchiq-mmal/mmal-parameters.h similarity index 100% rename from drivers/staging/vc04_services/vchiq-mmal/mmal-parameters.h rename to drivers/platform/broadcom/vchiq-mmal/mmal-parameters.h diff --git a/drivers/staging/vc04_services/vchiq-mmal/mmal-vchiq.c b/driver= s/platform/broadcom/vchiq-mmal/mmal-vchiq.c similarity index 100% rename from drivers/staging/vc04_services/vchiq-mmal/mmal-vchiq.c rename to drivers/platform/broadcom/vchiq-mmal/mmal-vchiq.c diff --git a/drivers/staging/vc04_services/vchiq-mmal/mmal-vchiq.h b/driver= s/platform/broadcom/vchiq-mmal/mmal-vchiq.h similarity index 100% rename from drivers/staging/vc04_services/vchiq-mmal/mmal-vchiq.h rename to drivers/platform/broadcom/vchiq-mmal/mmal-vchiq.h diff --git a/drivers/staging/vc04_services/Kconfig b/drivers/staging/vc04_s= ervices/Kconfig index 23b5e3dde11447064d084ea5a6d36b8041dceb08..65116b171e88bec7b7f453b17b3= 3478c967b66cf 100644 --- a/drivers/staging/vc04_services/Kconfig +++ b/drivers/staging/vc04_services/Kconfig @@ -13,7 +13,5 @@ if BCM_VIDEOCORE =20 source "drivers/staging/vc04_services/bcm2835-audio/Kconfig" =20 -source "drivers/staging/vc04_services/vchiq-mmal/Kconfig" - endif =20 diff --git a/drivers/staging/vc04_services/Makefile b/drivers/staging/vc04_= services/Makefile index 7a716a5c781530b673027b9f82ec94ebfd615f8a..ba15ec663af0fabaf0060456fc9= 97deb5e5e0533 100644 --- a/drivers/staging/vc04_services/Makefile +++ b/drivers/staging/vc04_services/Makefile @@ -1,4 +1,3 @@ # SPDX-License-Identifier: GPL-2.0 obj-$(CONFIG_SND_BCM2835) +=3D bcm2835-audio/ -obj-$(CONFIG_BCM2835_VCHIQ_MMAL) +=3D vchiq-mmal/ =20 --=20 2.50.1