Devicetree
 help / color / mirror / Atom feed
* Re: [PATCH v3 3/3] dt-bindings: i3c: Add AST2600 I3C global registers
From: Krzysztof Kozlowski @ 2026-04-09  7:30 UTC (permalink / raw)
  To: Dawid Glazik
  Cc: Alexandre Belloni, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
	Joel Stanley, Andrew Jeffery, linux-aspeed, linux-i3c, devicetree,
	linux-arm-kernel, Frank Li, Maciej Lawniczak
In-Reply-To: <20260409-beneficial-sociable-tamarin-dbcaeb@quoll>

On 09/04/2026 09:28, Krzysztof Kozlowski wrote:
> On Wed, Apr 08, 2026 at 10:34:35PM +0200, Dawid Glazik wrote:
>> Introduce the device-tree bindings for I3C global registers found on
>> AST2600 SoCs.
>>
>> Signed-off-by: Dawid Glazik <dawid.glazik@linux.intel.com>
>> ---
>> I wasn't sure if I should add newline at the end of the
>> file or not so I took
>> https://github.com/torvalds/linux/tree/master/Documentation/devicetree/bindings/i3c
>> as an example.
> 
> Answer is: you cannot have patch warnings.
> 
> Documentation/devicetree/bindings/i3c does not have patch warning, does
> it?

And if you tested this code with standard tools, you would see that...

Best regards,
Krzysztof

^ permalink raw reply

* Re: [PATCH v3 2/3] ARM: dts: aspeed-g6: Add nodes for i3c controllers
From: Krzysztof Kozlowski @ 2026-04-09  7:30 UTC (permalink / raw)
  To: Dawid Glazik
  Cc: Alexandre Belloni, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
	Joel Stanley, Andrew Jeffery, linux-aspeed, linux-i3c, devicetree,
	linux-arm-kernel, Frank Li, Maciej Lawniczak, Jeremy Kerr
In-Reply-To: <51c4bdc02b45f67a0e32610a228091e137c135a6.1775679285.git.dawid.glazik@linux.intel.com>

On Wed, Apr 08, 2026 at 10:34:34PM +0200, Dawid Glazik wrote:
> Add the i3c controller devices to the ast2600 g6 common dts. We add all
> 6 busses to the common g6 definition, but leave disabled through the
> status property, to be enabled per-platform.
> 
> Originally-by: Jeremy Kerr <jk@codeconstruct.com.au>

Don't invent tags. This is not used outside of TIP.

> Signed-off-by: Dawid Glazik <dawid.glazik@linux.intel.com>
> ---
> v3:
>  - add i3c aliases
>  - rebase on top of latest tree and solve conflicts
>  - as agreed with Jeremy off-list, he said I can take authorship of this going forward
> v2:
>  - use inline bus representation, without the i3c: label
> ---
>  arch/arm/boot/dts/aspeed/aspeed-g6.dtsi | 97 +++++++++++++++++++++++++
>  1 file changed, 97 insertions(+)
> 
> diff --git a/arch/arm/boot/dts/aspeed/aspeed-g6.dtsi b/arch/arm/boot/dts/aspeed/aspeed-g6.dtsi
> index f5641128614f..f986fcbed604 100644
> --- a/arch/arm/boot/dts/aspeed/aspeed-g6.dtsi
> +++ b/arch/arm/boot/dts/aspeed/aspeed-g6.dtsi
> @@ -29,6 +29,12 @@ aliases {
>  		i2c13 = &i2c13;
>  		i2c14 = &i2c14;
>  		i2c15 = &i2c15;
> +		i3c0 = &i3c0;
> +		i3c1 = &i3c1;
> +		i3c2 = &i3c2;
> +		i3c3 = &i3c3;
> +		i3c4 = &i3c4;
> +		i3c5 = &i3c5;

Bus aliases are not properties of SoC DTSI.

>  		serial0 = &uart1;
>  		serial1 = &uart2;
>  		serial2 = &uart3;
> @@ -1066,6 +1072,97 @@ i2c15: i2c@800 {
>  				};
>  			};
>  
> +			bus@1e7a0000 {
> +				compatible = "simple-bus";
> +				#address-cells = <1>;
> +				#size-cells = <1>;
> +				ranges = <0 0x1e7a0000 0x8000>;
> +
> +				i3c_global: i3c-global@0 {

Node names should be generic. See also an explanation and list of
examples (not exhaustive) in DT specification:
https://devicetree-specification.readthedocs.io/en/latest/chapter2-devicetree-basics.html#generic-names-recommendation
If you cannot find a name matching your device, please check in kernel
sources for similar cases or you can grow the spec (via pull request to
DT spec repo).

Best regards,
Krzysztof


^ permalink raw reply

* Re: [PATCH v3 3/3] dt-bindings: i3c: Add AST2600 I3C global registers
From: Krzysztof Kozlowski @ 2026-04-09  7:28 UTC (permalink / raw)
  To: Dawid Glazik
  Cc: Alexandre Belloni, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
	Joel Stanley, Andrew Jeffery, linux-aspeed, linux-i3c, devicetree,
	linux-arm-kernel, Frank Li, Maciej Lawniczak
In-Reply-To: <7f55458097ef651b4fc46650254afd3fa7b87348.1775679285.git.dawid.glazik@linux.intel.com>

On Wed, Apr 08, 2026 at 10:34:35PM +0200, Dawid Glazik wrote:
> Introduce the device-tree bindings for I3C global registers found on
> AST2600 SoCs.
> 
> Signed-off-by: Dawid Glazik <dawid.glazik@linux.intel.com>
> ---
> I wasn't sure if I should add newline at the end of the
> file or not so I took
> https://github.com/torvalds/linux/tree/master/Documentation/devicetree/bindings/i3c
> as an example.

Answer is: you cannot have patch warnings.

Documentation/devicetree/bindings/i3c does not have patch warning, does
it?

> ---
>  .../i3c/aspeed,ast2600-i3c-global.yaml        | 55 +++++++++++++++++++
>  1 file changed, 55 insertions(+)
>  create mode 100644 Documentation/devicetree/bindings/i3c/aspeed,ast2600-i3c-global.yaml
> 
> diff --git a/Documentation/devicetree/bindings/i3c/aspeed,ast2600-i3c-global.yaml b/Documentation/devicetree/bindings/i3c/aspeed,ast2600-i3c-global.yaml
> new file mode 100644
> index 000000000000..edecc18796a9
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/i3c/aspeed,ast2600-i3c-global.yaml
> @@ -0,0 +1,55 @@
> +# SPDX-License-Identifier: GPL-2.0 OR BSD-2-Clause
> +%YAML 1.2
> +---
> +$id: http://devicetree.org/schemas/i3c/aspeed,ast2600-i3c-global.yaml#
> +$schema: http://devicetree.org/meta-schemas/core.yaml#
> +
> +title: ASPEED AST2600 I3C Global Registers
> +
> +description: |
> +  The AST2600 SoC provides a shared I3C global register block used by all
> +  I3C controller instances. This block contains per-instance global

Why are you adding syscon to I3C controllers? Only I3C controllers go
to i3c directory.

syscons go soc.



> +  configuration fields, including controller instance ID and SDA pull-up
> +  configuration.
> +  Each I3C controller references this syscon node through the
> +  aspeed,global-regs property.
> +
> +maintainers:
> +  - Dawid Glazik <dawid.glazik@linux.intel.com>
> +
> +allOf:
> +  - $ref: /schemas/mfd/syscon-common.yaml#
> +
> +properties:
> +  compatible:
> +    items:
> +      - const: aspeed,ast2600-i3c-global
> +      - const: syscon
> +
> +  reg:
> +    maxItems: 1
> +
> +  resets:
> +    maxItems: 1
> +

I do not see any differences against syscon.yaml binding. Why do you
need separate file? Look first how other platforms do it.

> +required:
> +  - compatible
> +  - reg
> +
> +unevaluatedProperties: false
> +
> +examples:
> +  - |
> +    bus@1e7a0000 {
> +        compatible = "simple-bus";
> +        #address-cells = <1>;
> +        #size-cells = <1>;
> +        ranges = <0 0x1e7a0000 0x8000>;

Drop entire node, not needed.

> +
> +        i3c-global@0 {
> +            compatible = "aspeed,ast2600-i3c-global", "syscon";
> +            reg = <0x0 0x1000>;
> +            resets = <&syscon ASPEED_RESET_I3C_DMA>;
> +        };
> +    };
> +...
> \ No newline at end of file

Patch warning.

Best regards,
Krzysztof


^ permalink raw reply

* Re: [PATCH 1/2] dt-bindings: rtc: nct3018y: add nuvoton,ctrl-reg-val property
From: Krzysztof Kozlowski @ 2026-04-09  7:23 UTC (permalink / raw)
  To: David Wang, a.zummo, alexandre.belloni, robh, krzk+dt, conor+dt
  Cc: andrew, avi.fishman, tmaimon77, tali.perry1, venture, yuenn,
	benjaminfair, ctcchien, mimi05633, openbmc, linux-rtc, devicetree,
	linux-kernel, davidwang
In-Reply-To: <ba0845c590eda42a28b3799a6f40294ba74a726e.1775717959.git.tomato1220@gmail.com>

On 09/04/2026 09:21, David Wang wrote:
> Add "nuvoton,ctrl-reg-val" vendor property to allow optional
> initialization of the RTC control register (0x0A).
> 
> This allows platform-specific configurations like 24h mode and
> write ownership to be defined via Device Tree.
> 
> Signed-off-by: David Wang <tomato1220@gmail.com>
> ---
>  Documentation/devicetree/bindings/rtc/nuvoton,nct3018y.yaml | 5 +++++
>  1 file changed, 5 insertions(+)
> 
> diff --git a/Documentation/devicetree/bindings/rtc/nuvoton,nct3018y.yaml b/Documentation/devicetree/bindings/rtc/nuvoton,nct3018y.yaml
> index 4f9b5604acd9..0984dfb77170 100644
> --- a/Documentation/devicetree/bindings/rtc/nuvoton,nct3018y.yaml
> +++ b/Documentation/devicetree/bindings/rtc/nuvoton,nct3018y.yaml
> @@ -24,6 +24,10 @@ properties:
>  
>    reset-source: true
>  
> +  nuvoton,ctrl-reg-val:
> +    $ref: /schemas/types.yaml#/definitions/uint32
> +    description: Initial value for the control register (0x0A).

24h mode is not a property of a board. I don't know what "write
ownership" is.

Best regards,
Krzysztof

^ permalink raw reply

* Re: [PATCH v3] dt-bindings: gpio: cavium,thunder-8890: Remove DT binding
From: Krzysztof Kozlowski @ 2026-04-09  7:21 UTC (permalink / raw)
  To: Shi Hao
  Cc: robh, brgl, krzk+dt, conor+dt, rric, linux-gpio, devicetree,
	linux-kernel
In-Reply-To: <20260408093313.17025-1-i.shihao.999@gmail.com>

On Wed, Apr 08, 2026 at 03:03:13PM +0530, Shi Hao wrote:
> Remove the cavium,thunder-8890 GPIO binding as there are no active
> use cases. A previous attempt was made to convert the binding to DT
> schema, but since the binding is unused, remove it instead.

Last sentence is not relevant to Git log/history. Instead useful would
be to tell what made you think that binding is not used, because it is
not obvious - the in kernel driver does not bind via compatible, but PCI.

Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@oss.qualcomm.com>

Best regards,
Krzysztof


^ permalink raw reply

* [PATCH 2/2] rtc: nct3018y: add optional control register initialization
From: David Wang @ 2026-04-09  7:21 UTC (permalink / raw)
  To: a.zummo, alexandre.belloni, robh, krzk+dt, conor+dt
  Cc: andrew, avi.fishman, tmaimon77, tali.perry1, venture, yuenn,
	benjaminfair, ctcchien, mimi05633, openbmc, linux-rtc, devicetree,
	linux-kernel, davidwang, David Wang
In-Reply-To: <cover.1775717959.git.tomato1220@gmail.com>

Support the "nuvoton,ctrl-reg-val" Device Tree property to initialize
the RTC control register (0x0A) during the probe phase.

This provides flexibility for different platforms to override default
hardware settings.

Signed-off-by: David Wang <tomato1220@gmail.com>
---
 drivers/rtc/rtc-nct3018y.c | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/drivers/rtc/rtc-nct3018y.c b/drivers/rtc/rtc-nct3018y.c
index cd4b1db902e9..4bc47b4ac935 100644
--- a/drivers/rtc/rtc-nct3018y.c
+++ b/drivers/rtc/rtc-nct3018y.c
@@ -534,6 +534,15 @@ static int nct3018y_probe(struct i2c_client *client)
 		}
 	}
 
+	if (!of_property_read_u32(client->dev.of_node, "nuvoton,ctrl-reg-val", &flags)) {
+
+		err = i2c_smbus_write_byte_data(client, NCT3018Y_REG_CTRL, (u8)flags);
+		if (err < 0) {
+			dev_dbg(&client->dev, "Unable to write NCT3018Y_REG_CTRL.\n");
+			return err;
+		}
+	}
+
 	flags = 0;
 	err = i2c_smbus_write_byte_data(client, NCT3018Y_REG_ST, flags);
 	if (err < 0) {
-- 
2.34.1


^ permalink raw reply related

* [PATCH 1/2] dt-bindings: rtc: nct3018y: add nuvoton,ctrl-reg-val property
From: David Wang @ 2026-04-09  7:21 UTC (permalink / raw)
  To: a.zummo, alexandre.belloni, robh, krzk+dt, conor+dt
  Cc: andrew, avi.fishman, tmaimon77, tali.perry1, venture, yuenn,
	benjaminfair, ctcchien, mimi05633, openbmc, linux-rtc, devicetree,
	linux-kernel, davidwang, David Wang
In-Reply-To: <cover.1775717959.git.tomato1220@gmail.com>

Add "nuvoton,ctrl-reg-val" vendor property to allow optional
initialization of the RTC control register (0x0A).

This allows platform-specific configurations like 24h mode and
write ownership to be defined via Device Tree.

Signed-off-by: David Wang <tomato1220@gmail.com>
---
 Documentation/devicetree/bindings/rtc/nuvoton,nct3018y.yaml | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/Documentation/devicetree/bindings/rtc/nuvoton,nct3018y.yaml b/Documentation/devicetree/bindings/rtc/nuvoton,nct3018y.yaml
index 4f9b5604acd9..0984dfb77170 100644
--- a/Documentation/devicetree/bindings/rtc/nuvoton,nct3018y.yaml
+++ b/Documentation/devicetree/bindings/rtc/nuvoton,nct3018y.yaml
@@ -24,6 +24,10 @@ properties:
 
   reset-source: true
 
+  nuvoton,ctrl-reg-val:
+    $ref: /schemas/types.yaml#/definitions/uint32
+    description: Initial value for the control register (0x0A).
+
 required:
   - compatible
   - reg
@@ -39,6 +43,7 @@ examples:
         rtc@6f {
             compatible = "nuvoton,nct3018y";
             reg = <0x6f>;
+            nuvoton,ctrl-reg-val = <0x21>;
         };
     };
 
-- 
2.34.1


^ permalink raw reply related

* [PATCH 0/2] rtc: nct3018y: add support for control register initialization
From: David Wang @ 2026-04-09  7:21 UTC (permalink / raw)
  To: a.zummo, alexandre.belloni, robh, krzk+dt, conor+dt
  Cc: andrew, avi.fishman, tmaimon77, tali.perry1, venture, yuenn,
	benjaminfair, ctcchien, mimi05633, openbmc, linux-rtc, devicetree,
	linux-kernel, davidwang, David Wang

This series adds support for an optional Device Tree property
"nuvoton,ctrl-reg-val" to initialize the RTC control register (0x0A).

This provides flexibility for different platforms (especially in
server environments) to configure behaviors such as 24h mode and
write ownership without driver source modifications.

David Wang (2):
  dt-bindings: rtc: nct3018y: add nuvoton,ctrl-reg-val property
  rtc: nct3018y: add optional control register initialization

 .../devicetree/bindings/rtc/nuvoton,nct3018y.yaml        | 5 +++++
 drivers/rtc/rtc-nct3018y.c                               | 9 +++++++++
 2 files changed, 14 insertions(+)

-- 
2.34.1


^ permalink raw reply

* Re: [PATCH v6 5/9] riscv: dts: spacemit: k1: add SD card controller and pinctrl support
From: Troy Mitchell @ 2026-04-09  7:17 UTC (permalink / raw)
  To: Iker Pedrosa, Ulf Hansson, Rob Herring, Krzysztof Kozlowski,
	Conor Dooley, Adrian Hunter, Paul Walmsley, Palmer Dabbelt,
	Albert Ou, Alexandre Ghiti, Yixun Lan
  Cc: Troy Mitchell, Michael Opdenacker, Javier Martinez Canillas,
	linux-mmc, devicetree, linux-riscv, spacemit, linux-kernel,
	Anand Moon, Trevor Gamblin
In-Reply-To: <20260407-orangepi-sd-card-uhs-v6-5-b5b8a1b2bfc8@gmail.com>

On Tue Apr 7, 2026 at 4:25 PM CST, Iker Pedrosa wrote:
> Add SD card controller infrastructure for SpacemiT K1 SoC with complete
> pinctrl support for both standard and UHS modes.
>
> - Add sdhci0 controller definition with clocks, resets and interrupts
> - Add mmc1_cfg pinctrl for 3.3V standard SD operation
> - Add mmc1_uhs_cfg pinctrl for 1.8V UHS high-speed operation
> - Configure appropriate drive strength and power-source properties
>
> This provides complete SD card infrastructure that K1-based boards can
> enable.
>
> Tested-by: Anand Moon <linux.amoon@gmail.com>
> Tested-by: Trevor Gamblin <tgamblin@baylibre.com>
> Signed-off-by: Iker Pedrosa <ikerpedrosam@gmail.com>
Reviewed-by: Troy Mitchell <troy.mitchell@linux.dev>

^ permalink raw reply

* Re: [PATCH v1 1/3] dt-bindings: arm: fsl: add Variscite VAR-SOM-MX91 Boards
From: Krzysztof Kozlowski @ 2026-04-09  7:16 UTC (permalink / raw)
  To: Stefano Radaelli, linux-kernel, devicetree, imx, linux-arm-kernel
  Cc: pierluigi.p, Stefano Radaelli, Rob Herring, Krzysztof Kozlowski,
	Conor Dooley, Frank Li, Sascha Hauer, Pengutronix Kernel Team,
	Fabio Estevam, Shawn Guo, Dario Binacchi, Markus Niebel,
	Maud Spierings, Alexander Stein, Ernest Van Hoecke, Josua Mayer,
	Francesco Dolcini, Primoz Fiser
In-Reply-To: <86635091cd5db0ecb7f07c5ad9d6f735ec349485.1775669847.git.stefano.r@variscite.com>

On 08/04/2026 19:39, Stefano Radaelli wrote:
> From: Stefano Radaelli <stefano.r@variscite.com>
> 
> Add DT compatible strings for Variscite VAR-SOM-MX91 SoM and Symphony
> development carrier Board.
> 
> Signed-off-by: Stefano Radaelli <stefano.r@variscite.com>
> ---
>  Documentation/devicetree/bindings/arm/fsl.yaml | 6 ++++++

Acked-by: Krzysztof Kozlowski <krzysztof.kozlowski@oss.qualcomm.com>

Best regards,
Krzysztof

^ permalink raw reply

* Re: [PATCH v1 2/3] arm64: dts: freescale: Add support for Variscite VAR-SOM-MX91
From: Peng Fan @ 2026-04-09  6:33 UTC (permalink / raw)
  To: Stefano Radaelli
  Cc: linux-kernel, devicetree, imx, linux-arm-kernel, pierluigi.p,
	Stefano Radaelli, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
	Frank Li, Sascha Hauer, Pengutronix Kernel Team, Fabio Estevam,
	Shawn Guo, Dario Binacchi, Markus Niebel, Maud Spierings,
	Alexander Stein, Ernest Van Hoecke, Josua Mayer,
	Francesco Dolcini, Primoz Fiser
In-Reply-To: <1ed7e2100e3feb74c9f0006d5b88e1bba1ad4339.1775669847.git.stefano.r@variscite.com>

On Wed, Apr 08, 2026 at 07:39:45PM +0200, Stefano Radaelli wrote:
>From: Stefano Radaelli <stefano.r@variscite.com>
>
>Add device tree support for the Variscite VAR-SOM-MX91 system on module.
>This SOM is designed to be used with various carrier boards.
>
>The module includes:
>- NXP i.MX91 MPU processor
>- Up to 2GB of LPDDR4 memory
>- Up to 128GB of eMMC storage memory
>- Integrated 10/100/1000 Mbps Ethernet Transceiver
>- Codec audio WM8904
>- WIFI6 dual-band 802.11ax/ac/a/b/g/n with optional 802.15.4 and Bluetooth
>
>Only SOM-specific peripherals are enabled by default. Carrier board
>specific interfaces are left disabled to be enabled in the respective
>carrier board device trees.
>
>Link: https://variscite.com/system-on-module-som/i-mx-9/i-mx-91/var-som-mx91/
>Signed-off-by: Stefano Radaelli <stefano.r@variscite.com>

Reviewed-by: Peng Fan <peng.fan@nxp.com>


^ permalink raw reply

* Re: [PATCH v5 23/27] clk: mediatek: Add MT8196 disp-ao clock support
From: Jason-JH Lin (林睿祥) @ 2026-04-09  6:30 UTC (permalink / raw)
  To: aford173@gmail.com
  Cc: Guangjie Song (宋光杰), robh@kernel.org,
	kernel@collabora.com, Sirius Wang (王皓昱),
	Nancy Lin (林欣螢), AngeloGioacchino Del Regno,
	linux-mediatek@lists.infradead.org, conor+dt@kernel.org,
	mturquette@baylibre.com, richardcochran@gmail.com,
	Project_Global_Chrome_Upstream_Group, devicetree@vger.kernel.org,
	linux-kernel@vger.kernel.org, krzk+dt@kernel.org, Laura Nao,
	Nicolas Prado, p.zabel@pengutronix.de,
	Singo Chang (張興國),
	Paul-pl Chen (陳柏霖), wenst@chromium.org,
	linux-arm-kernel@lists.infradead.org, netdev@vger.kernel.org,
	linux-clk@vger.kernel.org, matthias.bgg@gmail.com,
	sboyd@kernel.org
In-Reply-To: <CAHCN7x+K25H-QWLDA6SoGSzxv9koO0wFOrjfWNePc+0AfjCVZg@mail.gmail.com>

> 
[snip]

> > > > > +static const struct of_device_id
> > > > > of_match_clk_mt8196_vdisp_ao[]
> > > > > = {
> > > > > + { .compatible = "mediatek,mt8196-vdisp-ao", .data =
> > > > > &mm_v_mcd },
> > > > 
> > > > Hi Laura,
> > > > 
> > > > We are going to send mtk-mmsys driver for MT8196 recently, but
> > > > we
> > > > found
> > > > the compatible name is used here.
> > > > 
> > > > As your commit message, vdisp-ao is integrated with the mtk-
> > > > mmsys
> > > > driver, which registers the vdisp-ao clock driver via 
> > > > platform_device_register_data().
> > > > 
> > > > Shouldn't this compatible name belong to mmsys driver for
> > > > MT8196?
> > > > 
> > > 
> > > That's right, my fault for missing that! Thanks for the heads up.
> > > 
> > > I'm aware Angelo is currently restructuring mediatek-drm
> > > (including 
> > > mmsys and mutex), and that might affect the way vdisp-ao is
> > > loaded
> > > too. 
> > > So I'm not sure whether it makes sense to send a patch to fix
> > > this 
> > > right away.
> > 
> > OK, we'll try to contact Angelo from other places.
> > Thanks for your confirmation!
> > 
> 
> 
> If anyone wants me to test anything, I have a Chromebook with the
> mt8196 that I can test code, so feel free to CC me on anything that
> you want tested.  I'd love to see this stuff pushed upstream.
> 
> thanks
> 
> adam 

Hi Adam,
However, we still need some more time to discuss and refactor this.
We'll send the new patch if necessary.
Thank you for your help!

Regards,
Jason-JH Lin

> > 
> > Regards,
> > Jason-JH.Lin
> > 
> > > 
> > > Best,
> > > 
> > > Laura
> > > 
> > 


^ permalink raw reply

* Re: [PATCH v6 09/21] dt-bindings: display: renesas,rzg2l-du: Refuse port@1 for RZ/G2UL
From: Krzysztof Kozlowski @ 2026-04-09  6:21 UTC (permalink / raw)
  To: Tommaso Merciai
  Cc: tomm.merciai, geert, laurent.pinchart, linux-renesas-soc,
	biju.das.jz, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann,
	David Airlie, Simona Vetter, Rob Herring, Krzysztof Kozlowski,
	Conor Dooley, Geert Uytterhoeven, Michael Turquette, Stephen Boyd,
	Magnus Damm, Laurent Pinchart, Tomi Valkeinen, dri-devel,
	devicetree, linux-kernel, linux-clk, stable
In-Reply-To: <8a3dd4df30a6d950e5f38d46f4d9f396da67aa71.1775636898.git.tommaso.merciai.xr@bp.renesas.com>

On Wed, Apr 08, 2026 at 12:36:54PM +0200, Tommaso Merciai wrote:
> The RZ/G2UL DU supports only a single port@0 DPI. Explicitly refuse
> port@1 in the ports node.
> 
> Fixes: 2ef7cb1cea7d ("dt-bindings: display: renesas,rzg2l-du: Document RZ/G2UL DU bindings")
> Cc: stable@vger.kernel.org

Please describe bug being fixed here in such case.

Commit msg so far explains none.

Best regards,
Krzysztof


^ permalink raw reply

* Re: [PATCH V10 4/4] thermal: qcom: add support for PMIC5 Gen3 ADC thermal monitoring
From: Daniel Lezcano @ 2026-04-09  6:12 UTC (permalink / raw)
  To: Jishnu Prakash
  Cc: jic23, robh, krzk+dt, conor+dt, agross, andersson, lumag,
	dmitry.baryshkov, konradybcio, daniel.lezcano, sboyd, amitk,
	thara.gopinath, lee, rafael, subbaraman.narayanamurthy,
	david.collins, anjelique.melendez, kamal.wadhwa, rui.zhang,
	lukasz.luba, devicetree, linux-arm-msm, linux-iio, linux-kernel,
	linux-pm, cros-qcom-dts-watchers, quic_kotarake, neil.armstrong,
	stephan.gerhold
In-Reply-To: <20260130115421.2197892-5-jishnu.prakash@oss.qualcomm.com>

On Fri, Jan 30, 2026 at 05:24:21PM +0530, Jishnu Prakash wrote:
> Add support for ADC_TM part of PMIC5 Gen3.
> 
> This is an auxiliary driver under the Gen3 ADC driver, which implements the
> threshold setting and interrupt generating functionalities of QCOM ADC_TM
> drivers, used to support thermal trip points.
> 
> Signed-off-by: Jishnu Prakash <jishnu.prakash@oss.qualcomm.com>
> ---
> Changes since v9:
> - Replaced the break statement within scoped_guard() in tm_handler_work() with
>   return statement to fix the error reported by kernel test robot.
> 
> Changes since v8:
> - Made following changes to address Dmitry's comment to use module_auxiliary_driver():
>   - Dropped the wrapper struct containing the auxiliary driver (struct adc_tm5_auxiliary_drv)
>     which was originally meant to expose the TM interrupt callback to be called by
>     main driver and replaced it with standalone definition of the auxiliary_driver struct.
>   - Added call to adc5_gen3_register_tm_event_notifier() in probe to initialize the
>     TM callback for main driver.
>   - Replaced the module_init() and module_exit() calls with module_auxiliary_driver().
> - Made following changes to address Jonathan's comments:
>   - Updated header files included in drivers/thermal/qcom/qcom-spmi-adc-tm5-gen3.c
>     to follow IWYU (include-what-you-use) principles.
>   - Added a DEFINE_GUARD() definition for mutex lock/unlock functions and replaced
>     their existing calls with guard() and scoped_guard() statements using this definition.
>   - Moved some variable declarations in tm_handler_work() to inside the for() loop.
>   - Fixed if() check condition for low_temp in adc_tm5_gen3_set_trip_temp().
> - Dropped the wrapper function adc_tm5_gen3_disable_channel() around
>   _adc_tm5_gen3_disable_channel() as it only calls the inner function with no other actions.
> - Replaced a pr_debug() call with dev_dbg() in tm_handler_work().
> 
> Changes since v7:
> - Addressed following comments from Jonathan:
>   - Replaced {0} with { } in tm_handler_work()
>   - Simplified logic for setting upper_set and lower_set into
>     a single line each, in tm_handler_work()
>   - Cleaned up local variable declarations and high/low threshold
>     check in adc_tm5_gen3_configure()
>   - Moved cleanup action to disable all ADC_TM channels to probe
>     end and added comment to describe it.
>   - Fixed { } formatting in adctm5_auxiliary_id_table[].
> 
> Changes since v6:
> - Addressed following comments from Jonathan:
>   - Added error check for devm_thermal_add_hwmon_sysfs() call.
>   - Used local variable `dev` in multiple places in adc_tm5_probe().
>     in place of `&aux_dev->dev` and `adc_tm5->dev`.
>   - Added a comment to explain cleanup action calling adc5_gen3_clear_work()
>     near probe end.
>   - Fixed return statement at probe end to return last called API's
>     return value directly.
> 
> Changes since v5:
> - Addressed following comments from Jonathan:
>   - Corrected all files to follow kernel-doc formatting fully.
>   - Cleaned up formatting in struct definitions.
>   - Used sizeof() to specify length in register read/write calls
>     instead of using integers directly.
>   - Added comments in adc_tm5_probe() for skipping first SDAM for
>     IRQ request and for usage of auxiliary_set_drvdata().
>   - Corrected line wrap length driver file.
>   - Moved INIT_WORK() and auxiliary_set_drvdata() to earlier
>     locations to ensure they are ready when needed.
> 
> Changes since v4:
> - Fixed a compilation error and updated dependencies in config as suggested
>   by Krzysztof.
> 
>  drivers/thermal/qcom/Kconfig                  |   9 +
>  drivers/thermal/qcom/Makefile                 |   1 +
>  drivers/thermal/qcom/qcom-spmi-adc-tm5-gen3.c | 512 ++++++++++++++++++
>  3 files changed, 522 insertions(+)
>  create mode 100644 drivers/thermal/qcom/qcom-spmi-adc-tm5-gen3.c
> 
> diff --git a/drivers/thermal/qcom/Kconfig b/drivers/thermal/qcom/Kconfig
> index a6bb01082ec6..1acb11e4ac80 100644
> --- a/drivers/thermal/qcom/Kconfig
> +++ b/drivers/thermal/qcom/Kconfig
> @@ -21,6 +21,15 @@ config QCOM_SPMI_ADC_TM5
>  	  Thermal client sets threshold temperature for both warm and cool and
>  	  gets updated when a threshold is reached.
>  
> +config QCOM_SPMI_ADC_TM5_GEN3
> +	tristate "Qualcomm SPMI PMIC Thermal Monitor ADC5 Gen3"
> +	depends on QCOM_SPMI_ADC5_GEN3
> +	help
> +	  This enables the auxiliary thermal driver for the ADC5 Gen3 thermal
> +	  monitoring device. It shows up as a thermal zone with multiple trip points.
> +	  Thermal client sets threshold temperature for both warm and cool and
> +	  gets updated when a threshold is reached.
> +
>  config QCOM_SPMI_TEMP_ALARM
>  	tristate "Qualcomm SPMI PMIC Temperature Alarm"
>  	depends on OF && SPMI && IIO
> diff --git a/drivers/thermal/qcom/Makefile b/drivers/thermal/qcom/Makefile
> index 0fa2512042e7..828d9e7bc797 100644
> --- a/drivers/thermal/qcom/Makefile
> +++ b/drivers/thermal/qcom/Makefile
> @@ -4,5 +4,6 @@ obj-$(CONFIG_QCOM_TSENS)	+= qcom_tsens.o
>  qcom_tsens-y			+= tsens.o tsens-v2.o tsens-v1.o tsens-v0_1.o \
>  				   tsens-8960.o
>  obj-$(CONFIG_QCOM_SPMI_ADC_TM5)	+= qcom-spmi-adc-tm5.o
> +obj-$(CONFIG_QCOM_SPMI_ADC_TM5_GEN3)	+= qcom-spmi-adc-tm5-gen3.o
>  obj-$(CONFIG_QCOM_SPMI_TEMP_ALARM)	+= qcom-spmi-temp-alarm.o
>  obj-$(CONFIG_QCOM_LMH)		+= lmh.o
> diff --git a/drivers/thermal/qcom/qcom-spmi-adc-tm5-gen3.c b/drivers/thermal/qcom/qcom-spmi-adc-tm5-gen3.c
> new file mode 100644
> index 000000000000..882355d6606d
> --- /dev/null
> +++ b/drivers/thermal/qcom/qcom-spmi-adc-tm5-gen3.c
> @@ -0,0 +1,512 @@
> +// SPDX-License-Identifier: GPL-2.0-only
> +/*
> + * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
> + */
> +
> +#include <linux/auxiliary_bus.h>
> +#include <linux/bitfield.h>
> +#include <linux/bits.h>
> +#include <linux/cleanup.h>
> +#include <linux/container_of.h>
> +#include <linux/device.h>
> +#include <linux/device/devres.h>
> +#include <linux/dev_printk.h>
> +#include <linux/err.h>
> +#include <linux/iio/adc/qcom-adc5-gen3-common.h>
> +#include <linux/interrupt.h>
> +#include <linux/kernel.h>
> +#include <linux/module.h>
> +#include <linux/thermal.h>
> +#include <linux/types.h>
> +#include <linux/workqueue.h>
> +#include <linux/unaligned.h>
> +
> +#include "../thermal_hwmon.h"
> +
> +struct adc_tm5_gen3_chip;
> +
> +/**
> + * struct adc_tm5_gen3_channel_props - ADC_TM channel structure
> + * @timer: time period of recurring TM measurement.
> + * @tm_chan_index: TM channel number used (ranging from 1-7).
> + * @sdam_index: SDAM on which this TM channel lies.
> + * @common_props: structure with common  ADC channel properties.
> + * @high_thr_en: TM high threshold crossing detection enabled.
> + * @low_thr_en: TM low threshold crossing detection enabled.
> + * @chip: ADC TM device.
> + * @tzd: pointer to thermal device corresponding to TM channel.
> + * @last_temp: last temperature that caused threshold violation,
> + *	or a thermal TM channel.
> + * @last_temp_set: indicates if last_temp is stored.
> + */
> +struct adc_tm5_gen3_channel_props {
> +	unsigned int timer;
> +	unsigned int tm_chan_index;
> +	unsigned int sdam_index;
> +	struct adc5_channel_common_prop common_props;
> +	bool high_thr_en;
> +	bool low_thr_en;
> +	struct adc_tm5_gen3_chip *chip;
> +	struct thermal_zone_device *tzd;
> +	int last_temp;
> +	bool last_temp_set;
> +};
> +
> +/**
> + * struct adc_tm5_gen3_chip - ADC Thermal Monitoring device structure
> + * @dev_data: Top-level ADC device data.
> + * @chan_props: Array of ADC_TM channel structures.
> + * @nchannels: number of TM channels allocated
> + * @dev: SPMI ADC5 Gen3 device.
> + * @tm_handler_work: handler for TM interrupt for threshold violation.
> + */
> +struct adc_tm5_gen3_chip {
> +	struct adc5_device_data *dev_data;
> +	struct adc_tm5_gen3_channel_props *chan_props;
> +	unsigned int nchannels;
> +	struct device *dev;
> +	struct work_struct tm_handler_work;
> +};
> +
> +DEFINE_GUARD(adc5_gen3, struct adc_tm5_gen3_chip *, adc5_gen3_mutex_lock(_T->dev),
> +	     adc5_gen3_mutex_unlock(_T->dev))
> +
> +static int get_sdam_from_irq(struct adc_tm5_gen3_chip *adc_tm5, int irq)
> +{
> +	int i;
> +
> +	for (i = 0; i < adc_tm5->dev_data->num_sdams; i++) {
> +		if (adc_tm5->dev_data->base[i].irq == irq)
> +			return i;
> +	}
> +	return -ENOENT;
> +}
> +
> +static irqreturn_t adctm5_gen3_isr(int irq, void *dev_id)
> +{
> +	struct adc_tm5_gen3_chip *adc_tm5 = dev_id;
> +	int ret, sdam_num;
> +	u8 tm_status[2];
> +	u8 status, val;
> +
> +	sdam_num = get_sdam_from_irq(adc_tm5, irq);
> +	if (sdam_num < 0) {
> +		dev_err(adc_tm5->dev, "adc irq %d not associated with an sdam\n",
> +			irq);
> +		return IRQ_HANDLED;
> +	}
> +
> +	ret = adc5_gen3_read(adc_tm5->dev_data, sdam_num, ADC5_GEN3_STATUS1,
> +			     &status, sizeof(status));
> +	if (ret) {
> +		dev_err(adc_tm5->dev, "adc read status1 failed with %d\n", ret);
> +		return IRQ_HANDLED;
> +	}
> +
> +	if (status & ADC5_GEN3_STATUS1_CONV_FAULT) {
> +		dev_err_ratelimited(adc_tm5->dev,
> +				    "Unexpected conversion fault, status:%#x\n",
> +				    status);
> +		val = ADC5_GEN3_CONV_ERR_CLR_REQ;
> +		adc5_gen3_status_clear(adc_tm5->dev_data, sdam_num,
> +				       ADC5_GEN3_CONV_ERR_CLR, &val, 1);
> +		return IRQ_HANDLED;
> +	}
> +
> +	ret = adc5_gen3_read(adc_tm5->dev_data, sdam_num, ADC5_GEN3_TM_HIGH_STS,
> +			     tm_status, sizeof(tm_status));
> +	if (ret) {
> +		dev_err(adc_tm5->dev, "adc read TM status failed with %d\n", ret);
> +		return IRQ_HANDLED;
> +	}
> +
> +	if (tm_status[0] || tm_status[1])
> +		schedule_work(&adc_tm5->tm_handler_work);
> +
> +	dev_dbg(adc_tm5->dev, "Interrupt status:%#x, high:%#x, low:%#x\n",
> +		status, tm_status[0], tm_status[1]);
> +
> +	return IRQ_HANDLED;

This ISR routine should be revisited:

 - no error message inside

 - use a shared interrupt to split what is handled by the ADC and the
    TM drivers

 - do not return IRQ_HANDLED in case of error (cf. irqreturn.h doc)

 - do not use a dedicated workqueue but the threaded mechanism of the irq

> +}
> +
> +static int adc5_gen3_tm_status_check(struct adc_tm5_gen3_chip *adc_tm5,
> +				     int sdam_index, u8 *tm_status, u8 *buf)
> +{
> +	int ret;
> +
> +	ret = adc5_gen3_read(adc_tm5->dev_data, sdam_index, ADC5_GEN3_TM_HIGH_STS,
> +			     tm_status, 2);
> +	if (ret) {
> +		dev_err(adc_tm5->dev, "adc read TM status failed with %d\n", ret);
> +		return ret;
> +	}
> +
> +	ret = adc5_gen3_status_clear(adc_tm5->dev_data, sdam_index, ADC5_GEN3_TM_HIGH_STS_CLR,
> +				     tm_status, 2);
> +	if (ret) {
> +		dev_err(adc_tm5->dev, "adc status clear conv_req failed with %d\n",
> +			ret);
> +		return ret;
> +	}
> +
> +	ret = adc5_gen3_read(adc_tm5->dev_data, sdam_index, ADC5_GEN3_CH_DATA0(0),
> +			     buf, 16);
> +	if (ret)
> +		dev_err(adc_tm5->dev, "adc read data failed with %d\n", ret);
> +
> +	return ret;
> +}
> +
> +static void tm_handler_work(struct work_struct *work)
> +{
> +	struct adc_tm5_gen3_chip *adc_tm5 = container_of(work, struct adc_tm5_gen3_chip,
> +							 tm_handler_work);
> +	int sdam_index = -1;
> +	u8 tm_status[2] = { };
> +	u8 buf[16] = { };
> +
> +	for (int i = 0; i < adc_tm5->nchannels; i++) {
> +		struct adc_tm5_gen3_channel_props *chan_prop = &adc_tm5->chan_props[i];
> +		int offset = chan_prop->tm_chan_index;
> +		bool upper_set, lower_set;
> +		int ret, temp;
> +		u16 code;
> +
> +		scoped_guard(adc5_gen3, adc_tm5) {
> +			if (chan_prop->sdam_index != sdam_index) {
> +				sdam_index = chan_prop->sdam_index;
> +				ret = adc5_gen3_tm_status_check(adc_tm5, sdam_index,
> +								tm_status, buf);
> +				if (ret)
> +					return;
> +			}
> +
> +			upper_set = ((tm_status[0] & BIT(offset)) && chan_prop->high_thr_en);
> +			lower_set = ((tm_status[1] & BIT(offset)) && chan_prop->low_thr_en);
> +		}
> +
> +		if (!(upper_set || lower_set))
> +			continue;
> +
> +		code = get_unaligned_le16(&buf[2 * offset]);
> +		dev_dbg(adc_tm5->dev, "ADC_TM threshold code:%#x\n", code);

Please avoid debug traces when possible

> +		ret = adc5_gen3_therm_code_to_temp(adc_tm5->dev,
> +						   &chan_prop->common_props,
> +						   code, &temp);
> +		if (ret) {
> +			dev_err(adc_tm5->dev,
> +				"Invalid temperature reading, ret = %d, code=%#x\n",
> +				ret, code);

And avoid error traces in the runtime path

> +			continue;
> +		}
> +
> +		chan_prop->last_temp = temp;
> +		chan_prop->last_temp_set = true;
> +		thermal_zone_device_update(chan_prop->tzd, THERMAL_TRIP_VIOLATED);
> +	}
> +}
> +
> +static int adc_tm5_gen3_get_temp(struct thermal_zone_device *tz, int *temp)
> +{
> +	struct adc_tm5_gen3_channel_props *prop = thermal_zone_device_priv(tz);
> +	struct adc_tm5_gen3_chip *adc_tm5;
> +
> +	if (!prop || !prop->chip)
> +		return -EINVAL;
> +
> +	adc_tm5 = prop->chip;
> +
> +	if (prop->last_temp_set) {
> +		pr_debug("last_temp: %d\n", prop->last_temp);
> +		prop->last_temp_set = false;
> +		*temp = prop->last_temp;
> +		return 0;
> +	}

Why do you need to do that?

The temperature should reflect the current situation even if the
reading was triggered by a thermal trip violation.

> +
> +	return adc5_gen3_get_scaled_reading(adc_tm5->dev, &prop->common_props,
> +					    temp);
> +}
> +
> +static int adc_tm5_gen3_disable_channel(struct adc_tm5_gen3_channel_props *prop)
> +{
> +	struct adc_tm5_gen3_chip *adc_tm5 = prop->chip;
> +	int ret;
> +	u8 val;
> +
> +	prop->high_thr_en = false;
> +	prop->low_thr_en = false;
> +
> +	ret = adc5_gen3_poll_wait_hs(adc_tm5->dev_data, prop->sdam_index);
> +	if (ret)
> +		return ret;
> +
> +	val = BIT(prop->tm_chan_index);
> +	ret = adc5_gen3_write(adc_tm5->dev_data, prop->sdam_index,
> +			      ADC5_GEN3_TM_HIGH_STS_CLR, &val, sizeof(val));
> +	if (ret)
> +		return ret;
> +
> +	val = MEAS_INT_DISABLE;
> +	ret = adc5_gen3_write(adc_tm5->dev_data, prop->sdam_index,
> +			      ADC5_GEN3_TIMER_SEL, &val, sizeof(val));
> +	if (ret)
> +		return ret;
> +
> +	/* To indicate there is an actual conversion request */
> +	val = ADC5_GEN3_CHAN_CONV_REQ | prop->tm_chan_index;
> +	ret = adc5_gen3_write(adc_tm5->dev_data, prop->sdam_index,
> +			      ADC5_GEN3_PERPH_CH, &val, sizeof(val));
> +	if (ret)
> +		return ret;
> +
> +	val = ADC5_GEN3_CONV_REQ_REQ;
> +	return adc5_gen3_write(adc_tm5->dev_data, prop->sdam_index,
> +			       ADC5_GEN3_CONV_REQ, &val, sizeof(val));
> +}
> +
> +#define ADC_TM5_GEN3_CONFIG_REGS 12

Please define at the top of the file

> +static int adc_tm5_gen3_configure(struct adc_tm5_gen3_channel_props *prop,
> +				  int low_temp, int high_temp)
> +{
> +	struct adc_tm5_gen3_chip *adc_tm5 = prop->chip;
> +	u8 buf[ADC_TM5_GEN3_CONFIG_REGS];
> +	u8 conv_req;
> +	u16 adc_code;
> +	int ret;
> +
> +	ret = adc5_gen3_poll_wait_hs(adc_tm5->dev_data, prop->sdam_index);
> +	if (ret < 0)
> +		return ret;
> +
> +	ret = adc5_gen3_read(adc_tm5->dev_data, prop->sdam_index,
> +			     ADC5_GEN3_SID, buf, sizeof(buf));
> +	if (ret < 0)
> +		return ret;
> +
> +	/* Write SID */
> +	buf[0] = FIELD_PREP(ADC5_GEN3_SID_MASK, prop->common_props.sid);
> +
> +	/* Select TM channel and indicate there is an actual conversion request */
> +	buf[1] = ADC5_GEN3_CHAN_CONV_REQ | prop->tm_chan_index;
> +
> +	buf[2] = prop->timer;
> +
> +	/* Digital param selection */
> +	adc5_gen3_update_dig_param(&prop->common_props, &buf[3]);
> +
> +	/* Update fast average sample value */
> +	buf[4] &= ~ADC5_GEN3_FAST_AVG_CTL_SAMPLES_MASK;
> +	buf[4] |= prop->common_props.avg_samples | ADC5_GEN3_FAST_AVG_CTL_EN;
> +
> +	/* Select ADC channel */
> +	buf[5] = prop->common_props.channel;
> +
> +	/* Select HW settle delay for channel */
> +	buf[6] = FIELD_PREP(ADC5_GEN3_HW_SETTLE_DELAY_MASK,
> +			    prop->common_props.hw_settle_time_us);
> +
> +	/* High temperature corresponds to low voltage threshold */
> +	prop->low_thr_en = (high_temp != INT_MAX);
> +	if (prop->low_thr_en) {
> +		adc_code = qcom_adc_tm5_gen2_temp_res_scale(high_temp);
> +		put_unaligned_le16(adc_code, &buf[8]);
> +	}
> +
> +	/* Low temperature corresponds to high voltage threshold */
> +	prop->high_thr_en = (low_temp != -INT_MAX);
> +	if (prop->high_thr_en) {
> +		adc_code = qcom_adc_tm5_gen2_temp_res_scale(low_temp);
> +		put_unaligned_le16(adc_code, &buf[10]);
> +	}
> +
> +	buf[7] = 0;
> +	if (prop->high_thr_en)
> +		buf[7] |= ADC5_GEN3_HIGH_THR_INT_EN;
> +	if (prop->low_thr_en)
> +		buf[7] |= ADC5_GEN3_LOW_THR_INT_EN;
> +
> +	ret = adc5_gen3_write(adc_tm5->dev_data, prop->sdam_index, ADC5_GEN3_SID,
> +			      buf, sizeof(buf));
> +	if (ret < 0)
> +		return ret;
> +
> +	conv_req = ADC5_GEN3_CONV_REQ_REQ;
> +	return adc5_gen3_write(adc_tm5->dev_data, prop->sdam_index,
> +			       ADC5_GEN3_CONV_REQ, &conv_req, sizeof(conv_req));
> +}
> +
> +static int adc_tm5_gen3_set_trip_temp(struct thermal_zone_device *tz,
> +				      int low_temp, int high_temp)
> +{
> +	struct adc_tm5_gen3_channel_props *prop = thermal_zone_device_priv(tz);
> +	struct adc_tm5_gen3_chip *adc_tm5;
> +
> +	if (!prop || !prop->chip)
> +		return -EINVAL;
> +
> +	adc_tm5 = prop->chip;
> +
> +	dev_dbg(adc_tm5->dev, "channel:%s, low_temp(mdegC):%d, high_temp(mdegC):%d\n",
> +		prop->common_props.label, low_temp, high_temp);
> +
> +	guard(adc5_gen3)(adc_tm5);
> +	if (high_temp == INT_MAX && low_temp == -INT_MAX)
> +		return adc_tm5_gen3_disable_channel(prop);

Why disable the channel instead of returning an errno ?

> +	return adc_tm5_gen3_configure(prop, low_temp, high_temp);
> +}
> +
> +static const struct thermal_zone_device_ops adc_tm_ops = {
> +	.get_temp = adc_tm5_gen3_get_temp,
> +	.set_trips = adc_tm5_gen3_set_trip_temp,
> +};
> +
> +static int adc_tm5_register_tzd(struct adc_tm5_gen3_chip *adc_tm5)
> +{
> +	unsigned int i, channel;
> +	struct thermal_zone_device *tzd;
> +	int ret;
> +
> +	for (i = 0; i < adc_tm5->nchannels; i++) {
> +		channel = ADC5_GEN3_V_CHAN(adc_tm5->chan_props[i].common_props);
> +		tzd = devm_thermal_of_zone_register(adc_tm5->dev, channel,
> +						    &adc_tm5->chan_props[i],
> +						    &adc_tm_ops);
> +
> +		if (IS_ERR(tzd)) {
> +			if (PTR_ERR(tzd) == -ENODEV) {
> +				dev_warn(adc_tm5->dev,
> +					 "thermal sensor on channel %d is not used\n",
> +					 channel);
> +				continue;
> +			}
> +			return dev_err_probe(adc_tm5->dev, PTR_ERR(tzd),
> +					     "Error registering TZ zone:%ld for channel:%d\n",
> +					     PTR_ERR(tzd), channel);
> +		}
> +		adc_tm5->chan_props[i].tzd = tzd;
> +		ret = devm_thermal_add_hwmon_sysfs(adc_tm5->dev, tzd);
> +		if (ret)
> +			return ret;
> +	}
> +	return 0;
> +}
> +
> +static void adc5_gen3_clear_work(void *data)
> +{
> +	struct adc_tm5_gen3_chip *adc_tm5 = data;
> +
> +	cancel_work_sync(&adc_tm5->tm_handler_work);
> +}
> +
> +static void adc5_gen3_disable(void *data)
> +{
> +	struct adc_tm5_gen3_chip *adc_tm5 = data;
> +	int i;
> +
> +	guard(adc5_gen3)(adc_tm5);
> +	/* Disable all available TM channels */
> +	for (i = 0; i < adc_tm5->nchannels; i++)
> +		adc_tm5_gen3_disable_channel(&adc_tm5->chan_props[i]);
> +}
> +
> +static void adctm_event_handler(struct auxiliary_device *adev)
> +{
> +	struct adc_tm5_gen3_chip *adc_tm5 = auxiliary_get_drvdata(adev);
> +
> +	schedule_work(&adc_tm5->tm_handler_work);
> +}
> +
> +static int adc_tm5_probe(struct auxiliary_device *aux_dev,
> +			 const struct auxiliary_device_id *id)
> +{
> +	struct adc_tm5_gen3_chip *adc_tm5;
> +	struct tm5_aux_dev_wrapper *aux_dev_wrapper;
> +	struct device *dev = &aux_dev->dev;
> +	int i, ret;
> +
> +	adc_tm5 = devm_kzalloc(dev, sizeof(*adc_tm5), GFP_KERNEL);
> +	if (!adc_tm5)
> +		return -ENOMEM;
> +
> +	aux_dev_wrapper = container_of(aux_dev, struct tm5_aux_dev_wrapper,
> +				       aux_dev);
> +
> +	adc_tm5->dev = dev;
> +	adc_tm5->dev_data = aux_dev_wrapper->dev_data;
> +	adc_tm5->nchannels = aux_dev_wrapper->n_tm_channels;
> +	adc_tm5->chan_props = devm_kcalloc(dev, aux_dev_wrapper->n_tm_channels,
> +					   sizeof(*adc_tm5->chan_props), GFP_KERNEL);
> +	if (!adc_tm5->chan_props)
> +		return -ENOMEM;
> +
> +	for (i = 0; i < adc_tm5->nchannels; i++) {
> +		adc_tm5->chan_props[i].common_props = aux_dev_wrapper->tm_props[i];
> +		adc_tm5->chan_props[i].timer = MEAS_INT_1S;
> +		adc_tm5->chan_props[i].sdam_index = (i + 1) / 8;
> +		adc_tm5->chan_props[i].tm_chan_index = (i + 1) % 8;
> +		adc_tm5->chan_props[i].chip = adc_tm5;
> +	}
> +
> +	INIT_WORK(&adc_tm5->tm_handler_work, tm_handler_work);

Why is it needed

> +	/*
> +	 * Skipping first SDAM IRQ as it is requested in parent driver.
> +	 * If there is a TM violation on that IRQ, the parent driver calls
> +	 * the notifier (adctm_event_handler) exposed from this driver to handle it.
> +	 */
> +	for (i = 1; i < adc_tm5->dev_data->num_sdams; i++) {
> +		ret = devm_request_threaded_irq(dev,
> +						adc_tm5->dev_data->base[i].irq,
> +						NULL, adctm5_gen3_isr, IRQF_ONESHOT,
> +						adc_tm5->dev_data->base[i].irq_name,
> +						adc_tm5);

The threaded interrupts set the isr in a thread and from the thread
handling the event, there is a work queue scheduled. Why not use the
top and bottom halves of the threaded interrupt ? Hopefully you should
be able to remove the lock.

> +		if (ret < 0)
> +			return ret;
> +	}
> +
> +	/*
> +	 * This drvdata is only used in the function (adctm_event_handler)
> +	 * called by parent ADC driver in case of TM violation on the first SDAM.
> +	 */
> +	auxiliary_set_drvdata(aux_dev, adc_tm5);
> +
> +	adc5_gen3_register_tm_event_notifier(dev, adctm_event_handler);
> +
> +	/*
> +	 * This is to cancel any instances of tm_handler_work scheduled by
> +	 * TM interrupt, at the time of module removal.
> +	 */
> +

Remove the extra line

> +	ret = devm_add_action(dev, adc5_gen3_clear_work, adc_tm5);
> +	if (ret)
> +		return ret;
> +
> +	ret = adc_tm5_register_tzd(adc_tm5);
> +	if (ret)
> +		return ret;
> +
> +	/* This is to disable all ADC_TM channels in case of probe failure. */
> +

Remove the extra line

> +	return devm_add_action(dev, adc5_gen3_disable, adc_tm5);
> +}
> +
> +static const struct auxiliary_device_id adctm5_auxiliary_id_table[] = {
> +	{ .name = "qcom_spmi_adc5_gen3.adc5_tm_gen3", },
> +	{ }
> +};
> +
> +MODULE_DEVICE_TABLE(auxiliary, adctm5_auxiliary_id_table);
> +
> +static struct auxiliary_driver adctm5gen3_auxiliary_driver = {
> +	.id_table = adctm5_auxiliary_id_table,
> +	.probe = adc_tm5_probe,
> +};
> +
> +module_auxiliary_driver(adctm5gen3_auxiliary_driver);
> +
> +MODULE_DESCRIPTION("SPMI PMIC Thermal Monitor ADC driver");
> +MODULE_LICENSE("GPL");
> +MODULE_IMPORT_NS("QCOM_SPMI_ADC5_GEN3");
> -- 
> 2.25.1
> 

-- 

^ permalink raw reply

* Re: [PATCH 04/13] clk: amlogic: Add basic clock driver
From: Krzysztof Kozlowski @ 2026-04-09  6:12 UTC (permalink / raw)
  To: Chuan Liu, Neil Armstrong, Michael Turquette, Stephen Boyd,
	Rob Herring, Krzysztof Kozlowski, Conor Dooley
  Cc: linux-amlogic, linux-clk, devicetree, linux-kernel,
	Martin Blumenstingl
In-Reply-To: <76ef272c-e09a-400e-b381-82d7f29760ca@amlogic.com>

On 08/04/2026 16:32, Chuan Liu wrote:
> Hi Krzysztof (& ALL),
> Thanks for review.
> 
> On 2/9/2026 9:17 PM, Krzysztof Kozlowski wrote:
>> [ EXTERNAL EMAIL ]
>>
>> On 09/02/2026 06:48, Chuan Liu via B4 Relay wrote:
>>> From: Chuan Liu <chuan.liu@amlogic.com>
>>>
>>> Implement core clock driver for Amlogic SoC platforms, supporting
>>
>> So how did all existing Amlogic SoC platforms work so far without basic
>> clock driver? Really, how?
>>
>> You are suppose to grow existing code, not add your completely new
>> "basic" driver just because you have it that way in downstream.
>>
> 
> Firstly, apologies for the delayed response. I had intended to 
> consolidate the V1 review feedback and come back with a clearer plan for 
> V2 changes. In the meantime, Martin has provided many detailed and 
> valuable suggestions - much appreciated.
> 
> The original goal of optimizing the HW based on A9 and introducing a new 
> clock driver is to reduce unnecessary complexity in the driver. On A9, 

Nah, you just don't care about upstream and it is easier for you to
duplicate new code.

> we optimized the Clock/PLL controller HW to simplify driver performance, 
> complexity, memory footprint, and reusability. Improvements on the HW 
> side can also help drive corresponding enhancements in the driver:
>     - Performance: Encapsulates sub-clock functions, reducing call paths
>     - Complexity: Standardized register bits eliminate a large number of
> bit definitions (~1/3 of original code is defined register bit [1])
>     - Memory: Object-oriented design avoids copy/paste for repeated clocks

Object oriented design? Sorry, what?

>     - Reusability: Same controller works across SoCs without driver
> changes (or with minimal changes)
> 
> The old meson driver required compromises to unify legacy controller
> characteristics and driver styles. On A9, we want a fresh start.

And maintainers don't want that. We expressed this many times already.
Not only in this thread - that's one of the most known feedbacks.

Best regards,
Krzysztof

^ permalink raw reply

* Re: [PATCH 3/3] arm64: dts: qcom: milos: Add Iris VPU v2.0
From: Dikshita Agarwal @ 2026-04-09  5:59 UTC (permalink / raw)
  To: Alexander Koskovich, Vikash Garodia, Abhinav Kumar,
	Bryan O'Donoghue, Mauro Carvalho Chehab, Rob Herring,
	Krzysztof Kozlowski, Conor Dooley, Bjorn Andersson, Konrad Dybcio
  Cc: Luca Weiss, linux-media, linux-arm-msm, devicetree, linux-kernel
In-Reply-To: <20260406-milos-iris-v1-3-17ed0167ba6f@pm.me>



On 4/6/2026 3:49 PM, Alexander Koskovich wrote:
> Add devicetree nodes for the Iris codec (VPU 2.0) found on the Milos
> platform.
> 
> Signed-off-by: Alexander Koskovich <akoskovich@pm.me>
> ---
>  arch/arm64/boot/dts/qcom/milos.dtsi | 85 +++++++++++++++++++++++++++++++++++++
>  1 file changed, 85 insertions(+)
> 
> diff --git a/arch/arm64/boot/dts/qcom/milos.dtsi b/arch/arm64/boot/dts/qcom/milos.dtsi
> index e1a51d43943f..07aa398c9695 100644
> --- a/arch/arm64/boot/dts/qcom/milos.dtsi
> +++ b/arch/arm64/boot/dts/qcom/milos.dtsi
> @@ -7,6 +7,7 @@
>  #include <dt-bindings/clock/qcom,milos-dispcc.h>
>  #include <dt-bindings/clock/qcom,milos-gcc.h>
>  #include <dt-bindings/clock/qcom,milos-gpucc.h>
> +#include <dt-bindings/clock/qcom,milos-videocc.h>
>  #include <dt-bindings/clock/qcom,rpmh.h>
>  #include <dt-bindings/clock/qcom,sm8650-tcsr.h>
>  #include <dt-bindings/dma/qcom-gpi.h>
> @@ -1517,6 +1518,90 @@ usb_1_dwc3_hs: endpoint {
>  			};
>  		};
>  
> +		iris: video-codec@aa00000 {
> +			compatible = "qcom,milos-iris";
> +			reg = <0 0x0aa00000 0 0xf0000>;
> +
> +			interrupts = <GIC_SPI 174 IRQ_TYPE_LEVEL_HIGH 0>;
> +
> +			power-domains = <&videocc VIDEO_CC_MVS0C_GDSC>,
> +					<&videocc VIDEO_CC_MVS0_GDSC>,
> +					<&rpmhpd RPMHPD_CX>,
> +					<&rpmhpd RPMHPD_MX>;
> +			power-domain-names = "venus",
> +					     "vcodec0",
> +					     "cx",
> +					     "mx";
> +
> +			operating-points-v2 = <&iris_opp_table>;
> +
> +			clocks = <&gcc GCC_VIDEO_AXI0_CLK>,
> +				 <&videocc VIDEO_CC_MVS0C_CLK>,
> +				 <&videocc VIDEO_CC_MVS0_CLK>;
> +			clock-names = "iface",
> +				      "core",
> +				      "vcodec0_core";
> +
> +			interconnects = <&gem_noc MASTER_APPSS_PROC QCOM_ICC_TAG_ACTIVE_ONLY
> +					 &cnoc_cfg SLAVE_VENUS_CFG QCOM_ICC_TAG_ACTIVE_ONLY>,
> +					<&mmss_noc MASTER_VIDEO QCOM_ICC_TAG_ALWAYS
> +					 &mc_virt SLAVE_EBI1 QCOM_ICC_TAG_ALWAYS>;
> +			interconnect-names = "cpu-cfg",
> +					     "video-mem";
> +
> +			memory-region = <&video_mem>;
> +
> +			resets = <&gcc GCC_VIDEO_AXI0_CLK_ARES>,
> +				 <&videocc VIDEO_CC_MVS0C_CLK_ARES>;
> +			reset-names = "bus",
> +				      "core";
> +
> +			iommus = <&apps_smmu 0x1960 0>,
> +				 <&apps_smmu 0x1967 0>;
> +
> +			dma-coherent;
> +
> +			/*
> +			 * IRIS firmware is signed by vendors, only enable on
> +			 * boards where the proper signed firmware is available.
> +			 */
> +			status = "disabled";
> +
> +			iris_opp_table: opp-table {
> +				compatible = "operating-points-v2";
> +
> +				opp-240000000 {
> +					opp-hz = /bits/ 64 <240000000>;
> +					required-opps = <&rpmhpd_opp_low_svs>,
> +							<&rpmhpd_opp_low_svs>;

s/rpmhpd_opp_low_svs/rpmhpd_opp_svs

> +				};
> +
> +				opp-338000000 {
> +					opp-hz = /bits/ 64 <338000000>;
> +					required-opps = <&rpmhpd_opp_svs>,
> +							<&rpmhpd_opp_svs>;
> +				};
> +
> +				opp-366000000 {
> +					opp-hz = /bits/ 64 <366000000>;
> +					required-opps = <&rpmhpd_opp_svs_l1>,
> +							<&rpmhpd_opp_svs_l1>;

s/rpmhpd_opp_svs_l1/rpmhpd_opp_svs

> +				};
> +
> +				opp-444000000 {
> +					opp-hz = /bits/ 64 <444000000>;
> +					required-opps = <&rpmhpd_opp_nom>,
> +		

					<&rpmhpd_opp_nom>;
s/rpmhpd_opp_nom/rpmhpd_opp_svs_l1

> +				};
> +
> +				opp-552000000 {
> +					opp-hz = /bits/ 64 <552000000>;
> +					required-opps = <&rpmhpd_opp_turbo>,
> +							<&rpmhpd_opp_turbo>;

s/rpmhpd_opp_turbo/rpmhpd_opp_nom

Thanks,
Dikshita
> +				};

> +			};
> +		};
> +
>  		videocc: clock-controller@aaf0000 {
>  			compatible = "qcom,milos-videocc";
>  			reg = <0x0 0x0aaf0000 0x0 0x10000>;
> 

^ permalink raw reply

* Re: [PATCH] arm64: dts: qcom: sm8750-mtp: Set sufficient voltage for panel nt37801
From: Ayushi Makhija @ 2026-04-09  5:44 UTC (permalink / raw)
  To: Bjorn Andersson
  Cc: konrad.dybcio, robh+dt, krzysztof.kozlowski+dt, conor+dt,
	dmitry.baryshkov, linux-arm-msm, devicetree, linux-kernel,
	linux-arm-kernel, quic_rajeevny, quic_vproddut
In-Reply-To: <acVWseivbxLQ_uDM@baldur>

On 3/26/2026 9:28 PM, Bjorn Andersson wrote:
> On Thu, Mar 26, 2026 at 03:06:52PM +0530, Ayushi Makhija wrote:
>> On 3/24/2026 7:34 AM, Bjorn Andersson wrote:
>>> On Mon, Mar 23, 2026 at 03:52:29PM +0530, Ayushi Makhija wrote:
>>>> The NT37801 Sepc V1.0 chapter "5.7.1 Power On Sequence" states
>>>> VDDI=1.65V~1.95V, so set sufficient voltage for panel nt37801.
>>>>
>>>
>>> Please add Fixes: tag.
>>>
>>
>> Hi Bjorn,
>>
>> Sure, will add in new patchset.
>>
>>>> Signed-off-by: Ayushi Makhija <quic_amakhija@quicinc.com>
>>>
>>> Please start using your oss.qualcomm.com address.
>>>
>>>> ---
>>>>  arch/arm64/boot/dts/qcom/sm8750-mtp.dts | 2 +-
>>>>  1 file changed, 1 insertion(+), 1 deletion(-)
>>>>
>>>> diff --git a/arch/arm64/boot/dts/qcom/sm8750-mtp.dts b/arch/arm64/boot/dts/qcom/sm8750-mtp.dts
>>>> index 3837f6785320..6ba4e69bf377 100644
>>>> --- a/arch/arm64/boot/dts/qcom/sm8750-mtp.dts
>>>> +++ b/arch/arm64/boot/dts/qcom/sm8750-mtp.dts
>>>> @@ -462,7 +462,7 @@ vreg_l11b_1p0: ldo11 {
>>>>  
>>>>  		vreg_l12b_1p8: ldo12 {
>>>>  			regulator-name = "vreg_l12b_1p8";
>>>> -			regulator-min-microvolt = <1200000>;
>>>> +			regulator-min-microvolt = <1650000>;
>>>
>>> Are you sure it's not supposed to be 1.8V, given the name of the rail?
>>>
>>> Regards,
>>> Bjorn
>>
>> There was already discussion regarding the minimum voltage for this regulator on sm8550 target
>> on other upstream patch. 
>>
>> Link: https://lore.kernel.org/all/aQQdQoCLeKhYtY7W@yuanjiey.ap.qualcomm.com/
>>
>> This values is according to the NT37801 panel sec
>> "The NT37801 Sepc V1.0 chapter "5.7.1 Power On Sequence" states 
>> VDDI=1.65V~1.95V."
>>
> 
> Yes, so the panel requires 1.65V, so regulator-min-microvolt needs to be
> at least that. But regulator-min-microvolt should account for all the
> consumers of the rail, are there any others?
> 
> Which leads me to my question, the people designing the board named the
> rail VREG_L12B_1P8 in the schematics, why didn't they name it
> VREG_L12B_1P65?
> 
> Please check all the consumers and make the regulator-min-microvolt work
> for all of them - if that's 1.65V, then your change is good.
> 
> Regards,
> Bjorn

Hi Bjorn,

There is only one consumer of VREG_L12B_1P8 rail, i.e. NT37801 panel.
So regulator-min-microvolt as 1.65V should be fine for VREG_L12B_1P8 rail.

Thanks,
Ayushi


^ permalink raw reply

* Re: [PATCH v3] dt-bindings: timer: Add SiFive CLINT2
From: Nick Hu @ 2026-04-09  5:37 UTC (permalink / raw)
  To: Charles Perry
  Cc: Daniel Lezcano, Thomas Gleixner, Rob Herring, Krzysztof Kozlowski,
	Conor Dooley, Paul Walmsley, Samuel Holland, Palmer Dabbelt,
	Anup Patel, linux-kernel, devicetree, linux-riscv
In-Reply-To: <adZo84i4jfoWZnb2@bby-cbu-swbuild03.eng.microchip.com>

On Wed, Apr 8, 2026 at 10:41 PM Charles Perry
<charles.perry@microchip.com> wrote:
>
> On Wed, Apr 08, 2026 at 02:15:19PM +0800, Nick Hu wrote:
> > On Fri, Mar 27, 2026 at 4:56 AM Charles Perry
> > <charles.perry@microchip.com> wrote:
> > >
> > > On Fri, Mar 21, 2025 at 04:35:06PM +0800, Nick Hu wrote:
> > > > Add compatible string and property for the SiFive CLINT v2. The SiFive
> > > > CLINT v2 is incompatible with the SiFive CLINT v0 due to differences
> > > > in their control methods.
> > >
> > > Hello Nick,
> > >
> > > Can you help me understand what is this different control method? I've
> > > found that both OpenSBI [1] and U-Boot [2] use the same match data in their
> > > clint driver which would indicate that they are compatible.
> > >
> > Sorry for the late reply.
>
> Hello Nick, no worries.
>
> > Unlike v0, v2 requires a write to the mtime register to kick the timer.
>
> A kick once at the beginning or every time a machine timer interrupt fires?
>
A kick once at the beginning

> >
> > > Also, do you know if there's an easy way to tell if a sifive clint is a v0
> > > or v2?
> > >
> > sifive,clint2 introduces additional MMIO registers
>
> Is that the high resolution timers (HRT) mentionned in the description?
>
> And last question, would you happen to know if sifive made a clint v1 that
> does NOT require the mtime kick but does have the HRT?
>
Yes, that's correct.

> I'm trying to figure out what should be the compatible for PIC64-HPSC.
> Some code from a repository called "FSFM" used "sifive,clint1" for the
> compatible. I'm wondering if I should add the clint v1 to this file.
>
> Thanks,
> Charles
>

^ permalink raw reply

* Re: [PATCH v3] dt-bindings: timer: Add SiFive CLINT2
From: Nick Hu @ 2026-04-09  5:33 UTC (permalink / raw)
  To: Conor Dooley
  Cc: Charles Perry, Daniel Lezcano, Thomas Gleixner, Rob Herring,
	Krzysztof Kozlowski, Conor Dooley, Paul Walmsley, Samuel Holland,
	Palmer Dabbelt, Anup Patel, linux-kernel, devicetree, linux-riscv
In-Reply-To: <20260330-relative-hardened-5ce35fe1ef57@spud>

On Tue, Mar 31, 2026 at 12:16 AM Conor Dooley <conor@kernel.org> wrote:
>
> On Thu, Mar 26, 2026 at 01:55:38PM -0700, Charles Perry wrote:
> > On Fri, Mar 21, 2025 at 04:35:06PM +0800, Nick Hu wrote:
> > > Add compatible string and property for the SiFive CLINT v2. The SiFive
> > > CLINT v2 is incompatible with the SiFive CLINT v0 due to differences
> > > in their control methods.
> >
> > Hello Nick,
> >
> > Can you help me understand what is this different control method? I've
> > found that both OpenSBI [1] and U-Boot [2] use the same match data in their
> > clint driver which would indicate that they are compatible.
>
> Hmm, good point. I didn't see that the drivers were not doing anything
> different. I guess really the clintv2 should fall back to the clintv0,
> and the difference in hardware should be elaborated on.
>
> I think I also dropped the ball on sifive,fine-ctr-bits, and that should
> be removed and the counter width determined from the compatible.
> There's no users for that yet I think, and there's no valid users of the
> clintv2 compatible /at all/ so maybe it can just get culled.
>
Thanks for pointing that out, I'll send a patch to remove the
sifive,fine-ctr-bits property.


> >
> > Also, do you know if there's an easy way to tell if a sifive clint is a v0
> > or v2?
> >
> > Thanks,
> > Charles
> >
> > [1]: https://elixir.bootlin.com/opensbi/v1.8.1/source/lib/utils/timer/fdt_timer_mtimer.c#L163
> > [2]: https://elixir.bootlin.com/u-boot/v2026.01/source/drivers/timer/riscv_aclint_timer.c#L86
> >
> > >
> > > Signed-off-by: Nick Hu <nick.hu@sifive.com>
> > > Reviewed-by: Samuel Holland <samuel.holland@sifive.com>
> > > ---
> > > - v3 changes:
> > >   - Add the reason for the incompatibility between sifive,clint2 and
> > >     sifive,clint0.
> > > - v2 changes:
> > >   - Don't allow sifive,clint2 by itself. Add '-{}' to the first entry
> > >   - Mark the sifive,fine-ctr-bits as the required property when
> > >     the compatible includes the sifive,clint2
> > >
> > >  .../bindings/timer/sifive,clint.yaml          | 22 +++++++++++++++++++
> > >  1 file changed, 22 insertions(+)
> > >
> > > diff --git a/Documentation/devicetree/bindings/timer/sifive,clint.yaml b/Documentation/devicetree/bindings/timer/sifive,clint.yaml
> > > index 76d83aea4e2b..34684cda8b15 100644
> > > --- a/Documentation/devicetree/bindings/timer/sifive,clint.yaml
> > > +++ b/Documentation/devicetree/bindings/timer/sifive,clint.yaml
> > > @@ -36,6 +36,12 @@ properties:
> > >                - starfive,jh7110-clint   # StarFive JH7110
> > >                - starfive,jh8100-clint   # StarFive JH8100
> > >            - const: sifive,clint0        # SiFive CLINT v0 IP block
> > > +      - items:
> > > +          - {}
> > > +          - const: sifive,clint2        # SiFive CLINT v2 IP block
> > > +        description:
> > > +          SiFive CLINT v2 is the HRT that supports the Zicntr. The control of sifive,clint2
> > > +          differs from that of sifive,clint0, making them incompatible.
> > >        - items:
> > >            - enum:
> > >                - allwinner,sun20i-d1-clint
> > > @@ -62,6 +68,22 @@ properties:
> > >      minItems: 1
> > >      maxItems: 4095
> > >
> > > +  sifive,fine-ctr-bits:
> > > +    maximum: 15
> > > +    description: The width in bits of the fine counter.
> > > +
> > > +if:
> > > +  properties:
> > > +    compatible:
> > > +      contains:
> > > +        const: sifive,clint2
> > > +then:
> > > +  required:
> > > +    - sifive,fine-ctr-bits
> > > +else:
> > > +  properties:
> > > +    sifive,fine-ctr-bits: false
> > > +
> > >  additionalProperties: false
> > >
> > >  required:
> > > --
> > > 2.17.1
> > >
> > >

^ permalink raw reply

* Re: [PATCH 2/3] media: iris: Add support for Milos (VPU v2.0)
From: Vishnu Reddy @ 2026-04-09  4:34 UTC (permalink / raw)
  To: Alexander Koskovich, Vikash Garodia, Dikshita Agarwal,
	Abhinav Kumar, Bryan O'Donoghue, Mauro Carvalho Chehab,
	Rob Herring, Krzysztof Kozlowski, Conor Dooley, Bjorn Andersson,
	Konrad Dybcio
  Cc: Luca Weiss, linux-media, linux-arm-msm, devicetree, linux-kernel
In-Reply-To: <20260406-milos-iris-v1-2-17ed0167ba6f@pm.me>


On 4/6/2026 3:49 PM, Alexander Koskovich wrote:
> Add support for the Milos Iris codec. This only supports the variant
> found on the SM7635-AB that has half of it's pipes disabled via efuse.
>
> Signed-off-by: Alexander Koskovich<akoskovich@pm.me>
> ---
>   .../platform/qcom/iris/iris_platform_common.h      |   1 +
>   .../media/platform/qcom/iris/iris_platform_gen2.c  | 106 ++++
>   .../media/platform/qcom/iris/iris_platform_milos.h | 655 +++++++++++++++++++++
>   drivers/media/platform/qcom/iris/iris_probe.c      |   4 +
>   4 files changed, 766 insertions(+)
>
> diff --git a/drivers/media/platform/qcom/iris/iris_platform_common.h b/drivers/media/platform/qcom/iris/iris_platform_common.h
> index 5a489917580e..c8a9f122952e 100644
> --- a/drivers/media/platform/qcom/iris/iris_platform_common.h
> +++ b/drivers/media/platform/qcom/iris/iris_platform_common.h
> @@ -41,6 +41,7 @@ enum pipe_type {
>   	PIPE_4 = 4,
>   };
>   
> +extern const struct iris_platform_data milos_data;
>   extern const struct iris_platform_data qcs8300_data;
>   extern const struct iris_platform_data sc7280_data;
>   extern const struct iris_platform_data sm8250_data;
> diff --git a/drivers/media/platform/qcom/iris/iris_platform_gen2.c b/drivers/media/platform/qcom/iris/iris_platform_gen2.c
> index 5da90d47f9c6..78cd4656b981 100644
> --- a/drivers/media/platform/qcom/iris/iris_platform_gen2.c
> +++ b/drivers/media/platform/qcom/iris/iris_platform_gen2.c
> @@ -12,6 +12,7 @@
>   #include "iris_vpu_buffer.h"
>   #include "iris_vpu_common.h"
>   
> +#include "iris_platform_milos.h"
>   #include "iris_platform_qcs8300.h"
>   #include "iris_platform_sm8650.h"
>   #include "iris_platform_sm8750.h"
> @@ -1317,3 +1318,108 @@ const struct iris_platform_data qcs8300_data = {
>   	.enc_op_int_buf_tbl = sm8550_enc_op_int_buf_tbl,
>   	.enc_op_int_buf_tbl_size = ARRAY_SIZE(sm8550_enc_op_int_buf_tbl),
>   };
> +
> +/*
> + * Shares most of SM8550 data except:
> + * - vpu_ops to iris_vpu2_ops
> + * - icc_tbl to milos_icc_table
> + * - clk_rst_tbl to sm8650_clk_reset_table
> + * - opp_pd_tbl to milos_opp_pd_table
> + * - fwname to "qcom/vpu/vpu20_2v.mbn"
> + * - inst_iris_fmts to platform_fmts_milos_dec
> + * - inst_caps to platform_inst_cap_milos
> + * - inst_fw_caps_dec to inst_fw_cap_milos_dec
> + * - inst_fw_caps_enc to inst_fw_cap_milos_enc
> + * - ubwc_config to ubwc_config_milos
> + * - num_vpp_pipe to 2
> + * - max_core_mbpf scaled for 4k@30fps dec/enc
> + * - max_core_mbps scaled for 4k@30fps dec & 1080p@30 enc
> + */
> +const struct iris_platform_data milos_data = {
> +	.get_instance = iris_hfi_gen2_get_instance,
> +	.init_hfi_command_ops = iris_hfi_gen2_command_ops_init,
> +	.init_hfi_response_ops = iris_hfi_gen2_response_ops_init,
> +	.get_vpu_buffer_size = iris_vpu_buf_size,
> +	.vpu_ops = &iris_vpu2_ops,
> +	.set_preset_registers = iris_set_sm8550_preset_registers,
> +	.icc_tbl = milos_icc_table,
> +	.icc_tbl_size = ARRAY_SIZE(milos_icc_table),
> +	.clk_rst_tbl = sm8650_clk_reset_table,
> +	.clk_rst_tbl_size = ARRAY_SIZE(sm8650_clk_reset_table),
> +	.bw_tbl_dec = sm8550_bw_table_dec,
> +	.bw_tbl_dec_size = ARRAY_SIZE(sm8550_bw_table_dec),
> +	.pmdomain_tbl = sm8550_pmdomain_table,
> +	.pmdomain_tbl_size = ARRAY_SIZE(sm8550_pmdomain_table),
> +	.opp_pd_tbl = milos_opp_pd_table,
> +	.opp_pd_tbl_size = ARRAY_SIZE(milos_opp_pd_table),
> +	.clk_tbl = sm8550_clk_table,
> +	.clk_tbl_size = ARRAY_SIZE(sm8550_clk_table),
> +	.opp_clk_tbl = sm8550_opp_clk_table,
> +	/* Upper bound of DMA address range */
> +	.dma_mask = 0xe0000000 - 1,
> +	.fwname = "qcom/vpu/vpu20_2v.mbn",

can you check how firmware names are added for earlier platforms.
It should be like this vpu20_p2.mbn

> +	.pas_id = IRIS_PAS_ID,
> +	.inst_iris_fmts = platform_fmts_milos_dec,
> +	.inst_iris_fmts_size = ARRAY_SIZE(platform_fmts_milos_dec),
> +	.inst_caps = &platform_inst_cap_milos,
> +	.inst_fw_caps_dec = inst_fw_cap_milos_dec,
> +	.inst_fw_caps_dec_size = ARRAY_SIZE(inst_fw_cap_milos_dec),
> +	.inst_fw_caps_enc = inst_fw_cap_milos_enc,
> +	.inst_fw_caps_enc_size = ARRAY_SIZE(inst_fw_cap_milos_enc),
> +	.tz_cp_config_data = tz_cp_config_sm8550,
> +	.tz_cp_config_data_size = ARRAY_SIZE(tz_cp_config_sm8550),
> +	.core_arch = VIDEO_ARCH_LX,
> +	.hw_response_timeout = HW_RESPONSE_TIMEOUT_VALUE,
> +	.ubwc_config = &ubwc_config_milos,
> +	.num_vpp_pipe = 2,
> +	.max_session_count = 16,
> +	.max_core_mbpf = ((4096 * 2176) / 256) * 2,
> +	.max_core_mbps = ((3840 * 2176) / 256) * 30 + ((1920 * 1088) / 256) * 30,
> +	.dec_input_config_params_default =
> +		sm8550_vdec_input_config_params_default,
> +	.dec_input_config_params_default_size =
> +		ARRAY_SIZE(sm8550_vdec_input_config_params_default),
> +	.dec_input_config_params_hevc =
> +		sm8550_vdec_input_config_param_hevc,
> +	.dec_input_config_params_hevc_size =
> +		ARRAY_SIZE(sm8550_vdec_input_config_param_hevc),
> +	.dec_input_config_params_vp9 =
> +		sm8550_vdec_input_config_param_vp9,
> +	.dec_input_config_params_vp9_size =
> +		ARRAY_SIZE(sm8550_vdec_input_config_param_vp9),
> +	.dec_output_config_params =
> +		sm8550_vdec_output_config_params,
> +	.dec_output_config_params_size =
> +		ARRAY_SIZE(sm8550_vdec_output_config_params),
> +
> +	.enc_input_config_params =
> +		sm8550_venc_input_config_params,
> +	.enc_input_config_params_size =
> +		ARRAY_SIZE(sm8550_venc_input_config_params),
> +	.enc_output_config_params =
> +		sm8550_venc_output_config_params,
> +	.enc_output_config_params_size =
> +		ARRAY_SIZE(sm8550_venc_output_config_params),
> +
> +	.dec_input_prop = sm8550_vdec_subscribe_input_properties,
> +	.dec_input_prop_size = ARRAY_SIZE(sm8550_vdec_subscribe_input_properties),
> +	.dec_output_prop_avc = sm8550_vdec_subscribe_output_properties_avc,
> +	.dec_output_prop_avc_size =
> +		ARRAY_SIZE(sm8550_vdec_subscribe_output_properties_avc),
> +	.dec_output_prop_hevc = sm8550_vdec_subscribe_output_properties_hevc,
> +	.dec_output_prop_hevc_size =
> +		ARRAY_SIZE(sm8550_vdec_subscribe_output_properties_hevc),
> +	.dec_output_prop_vp9 = sm8550_vdec_subscribe_output_properties_vp9,
> +	.dec_output_prop_vp9_size =
> +		ARRAY_SIZE(sm8550_vdec_subscribe_output_properties_vp9),
> +
> +	.dec_ip_int_buf_tbl = sm8550_dec_ip_int_buf_tbl,
> +	.dec_ip_int_buf_tbl_size = ARRAY_SIZE(sm8550_dec_ip_int_buf_tbl),
> +	.dec_op_int_buf_tbl = sm8550_dec_op_int_buf_tbl,
> +	.dec_op_int_buf_tbl_size = ARRAY_SIZE(sm8550_dec_op_int_buf_tbl),
> +
> +	.enc_ip_int_buf_tbl = sm8550_enc_ip_int_buf_tbl,
> +	.enc_ip_int_buf_tbl_size = ARRAY_SIZE(sm8550_enc_ip_int_buf_tbl),
> +	.enc_op_int_buf_tbl = sm8550_enc_op_int_buf_tbl,
> +	.enc_op_int_buf_tbl_size = ARRAY_SIZE(sm8550_enc_op_int_buf_tbl),
> +};
> diff --git a/drivers/media/platform/qcom/iris/iris_platform_milos.h b/drivers/media/platform/qcom/iris/iris_platform_milos.h
> new file mode 100644
> index 000000000000..dacd3ad5aa7e
> --- /dev/null
> +++ b/drivers/media/platform/qcom/iris/iris_platform_milos.h
> @@ -0,0 +1,655 @@
> +/* SPDX-License-Identifier: GPL-2.0-only */
> +
> +#ifndef __IRIS_PLATFORM_MILOS_H__
> +#define __IRIS_PLATFORM_MILOS_H__
> +
> +#define MILOS_V1_MAX_BITRATE	100000000
> +#define MILOS_V1_MAX_FPS	240
> +
> +static struct iris_fmt platform_fmts_milos_dec[] = {
> +	[IRIS_FMT_H264] = {
> +		.pixfmt = V4L2_PIX_FMT_H264,
> +		.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE,
> +	},
> +	[IRIS_FMT_HEVC] = {
> +		.pixfmt = V4L2_PIX_FMT_HEVC,
> +		.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE,
> +	},
> +	[IRIS_FMT_VP9] = {
> +		.pixfmt = V4L2_PIX_FMT_VP9,
> +		.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE,
> +	},
> +};
> +
> +static const struct platform_inst_fw_cap inst_fw_cap_milos_dec[] = {
> +	{
> +		.cap_id = PROFILE_H264,
> +		.min = V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE,
> +		.max = V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_HIGH,
> +		.step_or_mask = 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) |
> +				BIT(V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_HIGH),
> +		.value = V4L2_MPEG_VIDEO_H264_PROFILE_HIGH,
> +		.hfi_id = HFI_PROP_PROFILE,
> +		.flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
> +		.set = iris_set_u32_enum,
> +	},
> +	{
> +		.cap_id = PROFILE_HEVC,
> +		.min = V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN,
> +		.max = V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN_STILL_PICTURE,
> +		.step_or_mask = BIT(V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN) |
> +				BIT(V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN_STILL_PICTURE),
> +		.value = V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN,
> +		.hfi_id = HFI_PROP_PROFILE,
> +		.flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
> +		.set = iris_set_u32_enum,
> +	},
> +	{
> +		.cap_id = PROFILE_VP9,
> +		.min = V4L2_MPEG_VIDEO_VP9_PROFILE_0,
> +		.max = V4L2_MPEG_VIDEO_VP9_PROFILE_2,
> +		.step_or_mask = BIT(V4L2_MPEG_VIDEO_VP9_PROFILE_0) |
> +				BIT(V4L2_MPEG_VIDEO_VP9_PROFILE_2),
> +		.value = V4L2_MPEG_VIDEO_VP9_PROFILE_0,
> +		.hfi_id = HFI_PROP_PROFILE,
> +		.flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
> +		.set = iris_set_u32_enum,
> +	},
> +	{
> +		.cap_id = LEVEL_H264,
> +		.min = V4L2_MPEG_VIDEO_H264_LEVEL_1_0,
> +		.max = V4L2_MPEG_VIDEO_H264_LEVEL_5_1,
> +		.step_or_mask = 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) |
> +				BIT(V4L2_MPEG_VIDEO_H264_LEVEL_4_1) |
> +				BIT(V4L2_MPEG_VIDEO_H264_LEVEL_4_2) |
> +				BIT(V4L2_MPEG_VIDEO_H264_LEVEL_5_0) |
> +				BIT(V4L2_MPEG_VIDEO_H264_LEVEL_5_1),
> +		.value = V4L2_MPEG_VIDEO_H264_LEVEL_5_1,
> +		.hfi_id = HFI_PROP_LEVEL,
> +		.flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
> +		.set = iris_set_u32_enum,
> +	},
> +	{
> +		.cap_id = LEVEL_HEVC,
> +		.min = V4L2_MPEG_VIDEO_HEVC_LEVEL_1,
> +		.max = V4L2_MPEG_VIDEO_HEVC_LEVEL_5,
> +		.step_or_mask = BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_1) |
> +				BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_2) |
> +				BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_2_1) |
> +				BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_3) |
> +				BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_3_1) |
> +				BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_4) |
> +				BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_4_1) |
> +				BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_5),
> +		.value = V4L2_MPEG_VIDEO_HEVC_LEVEL_5,
> +		.hfi_id = HFI_PROP_LEVEL,
> +		.flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
> +		.set = iris_set_u32_enum,
> +	},
> +	{
> +		.cap_id = LEVEL_VP9,
> +		.min = V4L2_MPEG_VIDEO_VP9_LEVEL_1_0,
> +		.max = V4L2_MPEG_VIDEO_VP9_LEVEL_5_0,
> +		.step_or_mask = BIT(V4L2_MPEG_VIDEO_VP9_LEVEL_1_0) |
> +				BIT(V4L2_MPEG_VIDEO_VP9_LEVEL_1_1) |
> +				BIT(V4L2_MPEG_VIDEO_VP9_LEVEL_2_0) |
> +				BIT(V4L2_MPEG_VIDEO_VP9_LEVEL_2_1) |
> +				BIT(V4L2_MPEG_VIDEO_VP9_LEVEL_3_0) |
> +				BIT(V4L2_MPEG_VIDEO_VP9_LEVEL_3_1) |
> +				BIT(V4L2_MPEG_VIDEO_VP9_LEVEL_4_0) |
> +				BIT(V4L2_MPEG_VIDEO_VP9_LEVEL_4_1) |
> +				BIT(V4L2_MPEG_VIDEO_VP9_LEVEL_5_0),
> +		.value = V4L2_MPEG_VIDEO_VP9_LEVEL_5_0,
> +		.hfi_id = HFI_PROP_LEVEL,
> +		.flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
> +		.set = iris_set_u32_enum,
> +	},
> +	{
> +		.cap_id = TIER,
> +		.min = V4L2_MPEG_VIDEO_HEVC_TIER_MAIN,
> +		.max = V4L2_MPEG_VIDEO_HEVC_TIER_HIGH,
> +		.step_or_mask = BIT(V4L2_MPEG_VIDEO_HEVC_TIER_MAIN) |
> +				BIT(V4L2_MPEG_VIDEO_HEVC_TIER_HIGH),
> +		.value = V4L2_MPEG_VIDEO_HEVC_TIER_HIGH,
> +		.hfi_id = HFI_PROP_TIER,
> +		.flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
> +		.set = iris_set_u32_enum,
> +	},
> +	{
> +		.cap_id = INPUT_BUF_HOST_MAX_COUNT,
> +		.min = DEFAULT_MAX_HOST_BUF_COUNT,
> +		.max = DEFAULT_MAX_HOST_BURST_BUF_COUNT,
> +		.step_or_mask = 1,
> +		.value = DEFAULT_MAX_HOST_BUF_COUNT,
> +		.hfi_id = HFI_PROP_BUFFER_HOST_MAX_COUNT,
> +		.flags = CAP_FLAG_INPUT_PORT,
> +		.set = iris_set_u32,
> +	},
> +	{
> +		.cap_id = STAGE,
> +		.min = STAGE_1,
> +		.max = STAGE_2,
> +		.step_or_mask = 1,
> +		.value = STAGE_2,
> +		.hfi_id = HFI_PROP_STAGE,
> +		.set = iris_set_stage,
> +	},
> +	{
> +		.cap_id = PIPE,
> +		/* .max, .min and .value are set via platform data */
> +		.step_or_mask = 1,
> +		.hfi_id = HFI_PROP_PIPE,
> +		.set = iris_set_pipe,
> +	},
> +	{
> +		.cap_id = POC,
> +		.min = 0,
> +		.max = 2,
> +		.step_or_mask = 1,
> +		.value = 1,
> +		.hfi_id = HFI_PROP_PIC_ORDER_CNT_TYPE,
> +	},
> +	{
> +		.cap_id = CODED_FRAMES,
> +		.min = CODED_FRAMES_PROGRESSIVE,
> +		.max = CODED_FRAMES_PROGRESSIVE,
> +		.step_or_mask = 0,
> +		.value = CODED_FRAMES_PROGRESSIVE,
> +		.hfi_id = HFI_PROP_CODED_FRAMES,
> +	},
> +	{
> +		.cap_id = BIT_DEPTH,
> +		.min = BIT_DEPTH_8,
> +		.max = BIT_DEPTH_8,
> +		.step_or_mask = 1,
> +		.value = BIT_DEPTH_8,
> +		.hfi_id = HFI_PROP_LUMA_CHROMA_BIT_DEPTH,
> +	},
> +	{
> +		.cap_id = RAP_FRAME,
> +		.min = 0,
> +		.max = 1,
> +		.step_or_mask = 1,
> +		.value = 1,
> +		.hfi_id = HFI_PROP_DEC_START_FROM_RAP_FRAME,
> +		.flags = CAP_FLAG_INPUT_PORT,
> +		.set = iris_set_u32,
> +	},
> +};
> +
> +static const struct platform_inst_fw_cap inst_fw_cap_milos_enc[] = {
> +	{
> +		.cap_id = PROFILE_H264,
> +		.min = V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE,
> +		.max = V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_HIGH,
> +		.step_or_mask = BIT(V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE) |
> +				BIT(V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_HIGH) |
> +				BIT(V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE) |
> +				BIT(V4L2_MPEG_VIDEO_H264_PROFILE_MAIN) |
> +				BIT(V4L2_MPEG_VIDEO_H264_PROFILE_HIGH),
> +		.value = V4L2_MPEG_VIDEO_H264_PROFILE_HIGH,
> +		.hfi_id = HFI_PROP_PROFILE,
> +		.flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
> +		.set = iris_set_profile,
> +	},
> +	{
> +		.cap_id = PROFILE_HEVC,
> +		.min = V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN,
> +		.max = V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN_10,
> +		.step_or_mask = BIT(V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN) |
> +				BIT(V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN_STILL_PICTURE) |
> +				BIT(V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN_10),
> +		.value = V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN,
> +		.hfi_id = HFI_PROP_PROFILE,
> +		.flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
> +		.set = iris_set_profile,
> +	},
> +	{
> +		.cap_id = LEVEL_H264,
> +		.min = V4L2_MPEG_VIDEO_H264_LEVEL_1_0,
> +		.max = V4L2_MPEG_VIDEO_H264_LEVEL_5_1,
> +		.step_or_mask = 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) |
> +				BIT(V4L2_MPEG_VIDEO_H264_LEVEL_4_1) |
> +				BIT(V4L2_MPEG_VIDEO_H264_LEVEL_4_2) |
> +				BIT(V4L2_MPEG_VIDEO_H264_LEVEL_5_0) |
> +				BIT(V4L2_MPEG_VIDEO_H264_LEVEL_5_1),
> +		.value = V4L2_MPEG_VIDEO_H264_LEVEL_5_0,
> +		.hfi_id = HFI_PROP_LEVEL,
> +		.flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
> +		.set = iris_set_level,
> +	},
> +	{
> +		.cap_id = LEVEL_HEVC,
> +		.min = V4L2_MPEG_VIDEO_HEVC_LEVEL_1,
> +		.max = V4L2_MPEG_VIDEO_HEVC_LEVEL_5,
> +		.step_or_mask = BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_1) |
> +				BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_2) |
> +				BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_2_1) |
> +				BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_3) |
> +				BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_3_1) |
> +				BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_4) |
> +				BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_4_1) |
> +				BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_5),
> +		.value = V4L2_MPEG_VIDEO_HEVC_LEVEL_5,
> +		.hfi_id = HFI_PROP_LEVEL,
> +		.flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
> +		.set = iris_set_level,
> +	},
> +	{
> +		.cap_id = STAGE,
> +		.min = STAGE_1,
> +		.max = STAGE_2,
> +		.step_or_mask = 1,
> +		.value = STAGE_2,
> +		.hfi_id = HFI_PROP_STAGE,
> +		.set = iris_set_stage,
> +	},
> +	{
> +		.cap_id = HEADER_MODE,
> +		.min = V4L2_MPEG_VIDEO_HEADER_MODE_SEPARATE,
> +		.max = V4L2_MPEG_VIDEO_HEADER_MODE_JOINED_WITH_1ST_FRAME,
> +		.step_or_mask = BIT(V4L2_MPEG_VIDEO_HEADER_MODE_SEPARATE) |
> +				BIT(V4L2_MPEG_VIDEO_HEADER_MODE_JOINED_WITH_1ST_FRAME),
> +		.value = V4L2_MPEG_VIDEO_HEADER_MODE_JOINED_WITH_1ST_FRAME,
> +		.hfi_id = HFI_PROP_SEQ_HEADER_MODE,
> +		.flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
> +		.set = iris_set_header_mode_gen2,
> +	},
> +	{
> +		.cap_id = PREPEND_SPSPPS_TO_IDR,
> +		.min = 0,
> +		.max = 1,
> +		.step_or_mask = 1,
> +		.value = 0,
> +	},
> +	{
> +		.cap_id = BITRATE,
> +		.min = 1,
> +		.max = MILOS_V1_MAX_BITRATE,
> +		.step_or_mask = 1,
> +		.value = BITRATE_DEFAULT,
> +		.hfi_id = HFI_PROP_TOTAL_BITRATE,
> +		.flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_INPUT_PORT |
> +			CAP_FLAG_DYNAMIC_ALLOWED,
> +		.set = iris_set_bitrate,
> +	},
> +	{
> +		.cap_id = BITRATE_PEAK,
> +		.min = 1,
> +		.max = MILOS_V1_MAX_BITRATE,
> +		.step_or_mask = 1,
> +		.value = BITRATE_DEFAULT,
> +		.hfi_id = HFI_PROP_TOTAL_PEAK_BITRATE,
> +		.flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_INPUT_PORT |
> +			CAP_FLAG_DYNAMIC_ALLOWED,
> +		.set = iris_set_peak_bitrate,
> +	},
> +	{
> +		.cap_id = BITRATE_MODE,
> +		.min = V4L2_MPEG_VIDEO_BITRATE_MODE_VBR,
> +		.max = V4L2_MPEG_VIDEO_BITRATE_MODE_CBR,
> +		.step_or_mask = BIT(V4L2_MPEG_VIDEO_BITRATE_MODE_VBR) |
> +				BIT(V4L2_MPEG_VIDEO_BITRATE_MODE_CBR),
> +		.value = V4L2_MPEG_VIDEO_BITRATE_MODE_VBR,
> +		.hfi_id = HFI_PROP_RATE_CONTROL,
> +		.flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
> +		.set = iris_set_bitrate_mode_gen2,
> +	},
> +	{
> +		.cap_id = FRAME_SKIP_MODE,
> +		.min = V4L2_MPEG_VIDEO_FRAME_SKIP_MODE_DISABLED,
> +		.max = V4L2_MPEG_VIDEO_FRAME_SKIP_MODE_BUF_LIMIT,
> +		.step_or_mask = BIT(V4L2_MPEG_VIDEO_FRAME_SKIP_MODE_DISABLED) |
> +				BIT(V4L2_MPEG_VIDEO_FRAME_SKIP_MODE_LEVEL_LIMIT) |
> +				BIT(V4L2_MPEG_VIDEO_FRAME_SKIP_MODE_BUF_LIMIT),
> +		.value = V4L2_MPEG_VIDEO_FRAME_SKIP_MODE_DISABLED,
> +		.flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
> +	},
> +	{
> +		.cap_id = FRAME_RC_ENABLE,
> +		.min = 0,
> +		.max = 1,
> +		.step_or_mask = 1,
> +		.value = 1,
> +	},
> +	{
> +		.cap_id = GOP_SIZE,
> +		.min = 0,
> +		.max = INT_MAX,
> +		.step_or_mask = 1,
> +		.value = 2 * DEFAULT_FPS - 1,
> +		.hfi_id = HFI_PROP_MAX_GOP_FRAMES,
> +		.flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_INPUT_PORT |
> +			CAP_FLAG_DYNAMIC_ALLOWED,
> +		.set = iris_set_u32,
> +	},
> +	{
> +		.cap_id = ENTROPY_MODE,
> +		.min = V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CAVLC,
> +		.max = V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CABAC,
> +		.step_or_mask = BIT(V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CAVLC) |
> +				BIT(V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CABAC),
> +		.value = V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CABAC,
> +		.hfi_id = HFI_PROP_CABAC_SESSION,
> +		.flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
> +		.set = iris_set_entropy_mode_gen2,
> +	},
> +	{
> +		.cap_id = MIN_FRAME_QP_H264,
> +		.min = MIN_QP_8BIT,
> +		.max = MAX_QP,
> +		.step_or_mask = 1,
> +		.value = MIN_QP_8BIT,
> +		.hfi_id = HFI_PROP_MIN_QP_PACKED,
> +		.flags = CAP_FLAG_OUTPUT_PORT,
> +		.set = iris_set_min_qp,
> +	},
> +	{
> +		.cap_id = MIN_FRAME_QP_HEVC,
> +		.min = MIN_QP_8BIT,
> +		.max = MAX_QP,
> +		.step_or_mask = 1,
> +		.value = MIN_QP_8BIT,
> +		.hfi_id = HFI_PROP_MIN_QP_PACKED,
> +		.flags = CAP_FLAG_OUTPUT_PORT,
> +		.set = iris_set_min_qp,
> +	},
> +	{
> +		.cap_id = MAX_FRAME_QP_H264,
> +		.min = MIN_QP_8BIT,
> +		.max = MAX_QP,
> +		.step_or_mask = 1,
> +		.value = MAX_QP,
> +		.hfi_id = HFI_PROP_MAX_QP_PACKED,
> +		.flags = CAP_FLAG_OUTPUT_PORT,
> +		.set = iris_set_max_qp,
> +	},
> +	{
> +		.cap_id = MAX_FRAME_QP_HEVC,
> +		.min = MIN_QP_8BIT,
> +		.max = MAX_QP,
> +		.step_or_mask = 1,
> +		.value = MAX_QP,
> +		.hfi_id = HFI_PROP_MAX_QP_PACKED,
> +		.flags = CAP_FLAG_OUTPUT_PORT,
> +		.set = iris_set_max_qp,
> +	},
> +	{
> +		.cap_id = I_FRAME_MIN_QP_H264,
> +		.min = MIN_QP_8BIT,
> +		.max = MAX_QP,
> +		.step_or_mask = 1,
> +		.value = MIN_QP_8BIT,
> +	},
> +	{
> +		.cap_id = I_FRAME_MIN_QP_HEVC,
> +		.min = MIN_QP_8BIT,
> +		.max = MAX_QP,
> +		.step_or_mask = 1,
> +		.value = MIN_QP_8BIT,
> +	},
> +	{
> +		.cap_id = P_FRAME_MIN_QP_H264,
> +		.min = MIN_QP_8BIT,
> +		.max = MAX_QP,
> +		.step_or_mask = 1,
> +		.value = MIN_QP_8BIT,
> +	},
> +	{
> +		.cap_id = P_FRAME_MIN_QP_HEVC,
> +		.min = MIN_QP_8BIT,
> +		.max = MAX_QP,
> +		.step_or_mask = 1,
> +		.value = MIN_QP_8BIT,
> +	},
> +	{
> +		.cap_id = B_FRAME_MIN_QP_H264,
> +		.min = MIN_QP_8BIT,
> +		.max = MAX_QP,
> +		.step_or_mask = 1,
> +		.value = MIN_QP_8BIT,
> +	},
> +	{
> +		.cap_id = B_FRAME_MIN_QP_HEVC,
> +		.min = MIN_QP_8BIT,
> +		.max = MAX_QP,
> +		.step_or_mask = 1,
> +		.value = MIN_QP_8BIT,
> +	},
> +	{
> +		.cap_id = I_FRAME_MAX_QP_H264,
> +		.min = MIN_QP_8BIT,
> +		.max = MAX_QP,
> +		.step_or_mask = 1,
> +		.value = MAX_QP,
> +	},
> +	{
> +		.cap_id = I_FRAME_MAX_QP_HEVC,
> +		.min = MIN_QP_8BIT,
> +		.max = MAX_QP,
> +		.step_or_mask = 1,
> +		.value = MAX_QP,
> +	},
> +	{
> +		.cap_id = P_FRAME_MAX_QP_H264,
> +		.min = MIN_QP_8BIT,
> +		.max = MAX_QP,
> +		.step_or_mask = 1,
> +		.value = MAX_QP,
> +	},
> +	{
> +		.cap_id = P_FRAME_MAX_QP_HEVC,
> +		.min = MIN_QP_8BIT,
> +		.max = MAX_QP,
> +		.step_or_mask = 1,
> +		.value = MAX_QP,
> +	},
> +	{
> +		.cap_id = B_FRAME_MAX_QP_H264,
> +		.min = MIN_QP_8BIT,
> +		.max = MAX_QP,
> +		.step_or_mask = 1,
> +		.value = MAX_QP,
> +	},
> +	{
> +		.cap_id = B_FRAME_MAX_QP_HEVC,
> +		.min = MIN_QP_8BIT,
> +		.max = MAX_QP,
> +		.step_or_mask = 1,
> +		.value = MAX_QP,
> +	},
> +	{
> +		.cap_id = I_FRAME_QP_H264,
> +		.min = MIN_QP_8BIT,
> +		.max = MAX_QP,
> +		.step_or_mask = 1,
> +		.value = DEFAULT_QP,
> +		.hfi_id = HFI_PROP_QP_PACKED,
> +		.flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_INPUT_PORT |
> +			CAP_FLAG_DYNAMIC_ALLOWED,
> +		.set = iris_set_frame_qp,
> +	},
> +	{
> +		.cap_id = I_FRAME_QP_HEVC,
> +		.min = MIN_QP_8BIT,
> +		.max = MAX_QP,
> +		.step_or_mask = 1,
> +		.value = DEFAULT_QP,
> +		.hfi_id = HFI_PROP_QP_PACKED,
> +		.flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_INPUT_PORT |
> +			CAP_FLAG_DYNAMIC_ALLOWED,
> +		.set = iris_set_frame_qp,
> +	},
> +	{
> +		.cap_id = P_FRAME_QP_H264,
> +		.min = MIN_QP_8BIT,
> +		.max = MAX_QP,
> +		.step_or_mask = 1,
> +		.value = DEFAULT_QP,
> +		.hfi_id = HFI_PROP_QP_PACKED,
> +		.flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_INPUT_PORT |
> +			CAP_FLAG_DYNAMIC_ALLOWED,
> +		.set = iris_set_frame_qp,
> +	},
> +	{
> +		.cap_id = P_FRAME_QP_HEVC,
> +		.min = MIN_QP_8BIT,
> +		.max = MAX_QP,
> +		.step_or_mask = 1,
> +		.value = DEFAULT_QP,
> +		.hfi_id = HFI_PROP_QP_PACKED,
> +		.flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_INPUT_PORT |
> +			CAP_FLAG_DYNAMIC_ALLOWED,
> +		.set = iris_set_frame_qp,
> +	},
> +	{
> +		.cap_id = B_FRAME_QP_H264,
> +		.min = MIN_QP_8BIT,
> +		.max = MAX_QP,
> +		.step_or_mask = 1,
> +		.value = DEFAULT_QP,
> +		.hfi_id = HFI_PROP_QP_PACKED,
> +		.flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_INPUT_PORT |
> +			CAP_FLAG_DYNAMIC_ALLOWED,
> +		.set = iris_set_frame_qp,
> +	},
> +	{
> +		.cap_id = B_FRAME_QP_HEVC,
> +		.min = MIN_QP_8BIT,
> +		.max = MAX_QP,
> +		.step_or_mask = 1,
> +		.value = DEFAULT_QP,
> +		.hfi_id = HFI_PROP_QP_PACKED,
> +		.flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_INPUT_PORT |
> +			CAP_FLAG_DYNAMIC_ALLOWED,
> +		.set = iris_set_frame_qp,
> +	},
> +	{
> +		.cap_id = INPUT_BUF_HOST_MAX_COUNT,
> +		.min = DEFAULT_MAX_HOST_BUF_COUNT,
> +		.max = DEFAULT_MAX_HOST_BURST_BUF_COUNT,
> +		.step_or_mask = 1,
> +		.value = DEFAULT_MAX_HOST_BUF_COUNT,
> +		.hfi_id = HFI_PROP_BUFFER_HOST_MAX_COUNT,
> +		.flags = CAP_FLAG_INPUT_PORT,
> +		.set = iris_set_u32,
> +	},
> +	{
> +		.cap_id = OUTPUT_BUF_HOST_MAX_COUNT,
> +		.min = DEFAULT_MAX_HOST_BUF_COUNT,
> +		.max = DEFAULT_MAX_HOST_BURST_BUF_COUNT,
> +		.step_or_mask = 1,
> +		.value = DEFAULT_MAX_HOST_BUF_COUNT,
> +		.hfi_id = HFI_PROP_BUFFER_HOST_MAX_COUNT,
> +		.flags = CAP_FLAG_OUTPUT_PORT,
> +		.set = iris_set_u32,
> +	},
> +	{
> +		.cap_id = ROTATION,
> +		.min = 0,
> +		.max = 270,
> +		.step_or_mask = 90,
> +		.value = 0,
> +		.hfi_id = HFI_PROP_ROTATION,
> +		.flags = CAP_FLAG_OUTPUT_PORT,
> +		.set = iris_set_rotation,
> +	},
> +	{
> +		.cap_id = HFLIP,
> +		.min = 0,
> +		.max = 1,
> +		.step_or_mask = 1,
> +		.value = 0,
> +		.hfi_id = HFI_PROP_FLIP,
> +		.flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_INPUT_PORT |
> +			CAP_FLAG_DYNAMIC_ALLOWED,
> +		.set = iris_set_flip,
> +	},
> +	{
> +		.cap_id = VFLIP,
> +		.min = 0,
> +		.max = 1,
> +		.step_or_mask = 1,
> +		.value = 0,
> +		.hfi_id = HFI_PROP_FLIP,
> +		.flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_INPUT_PORT |
> +			CAP_FLAG_DYNAMIC_ALLOWED,
> +		.set = iris_set_flip,
> +	},
> +	{
> +		.cap_id = IR_TYPE,
> +		.min = V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD_TYPE_RANDOM,
> +		.max = V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD_TYPE_RANDOM,
> +		.step_or_mask = BIT(V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD_TYPE_RANDOM),
> +		.value = V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD_TYPE_RANDOM,
> +		.flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
> +	},
> +	{
> +		.cap_id = IR_PERIOD,
> +		.min = 0,
> +		.max = INT_MAX,
> +		.step_or_mask = 1,
> +		.value = 0,
> +		.flags = CAP_FLAG_OUTPUT_PORT |
> +			CAP_FLAG_DYNAMIC_ALLOWED,
> +		.set = iris_set_ir_period,
> +	},
> +};
> +
> +static struct platform_inst_caps platform_inst_cap_milos = {
> +	.min_frame_width = 96,
> +	.max_frame_width = 4096,
> +	.min_frame_height = 96,
> +	.max_frame_height = 4096,
> +	.max_mbpf = (4096 * 2176) / 256,
> +	.mb_cycles_vpp = 200,
> +	.mb_cycles_fw = 326389,
> +	.mb_cycles_fw_vpp = 44156,
> +	.num_comv = 0,
> +	.max_frame_rate = MILOS_V1_MAX_FPS,
> +	.max_operating_rate = MILOS_V1_MAX_FPS,
> +};
> +
> +static const struct icc_info milos_icc_table[] = {
> +	{ "cpu-cfg",    1000, 1000     },
> +	{ "video-mem",  1000, 10000000 },
> +};
> +
> +static const char * const milos_opp_pd_table[] = { "cx", "mx" };
> +
> +static struct ubwc_config_data ubwc_config_milos = {
> +	.max_channels = 8,
> +	.mal_length = 32,
> +	.highest_bank_bit = 15,
> +	.bank_swzl_level = 0,
> +	.bank_swz2_level = 1,
> +	.bank_swz3_level = 1,
> +	.bank_spreading = 1,
> +};
> +
> +#endif
> diff --git a/drivers/media/platform/qcom/iris/iris_probe.c b/drivers/media/platform/qcom/iris/iris_probe.c
> index ddaacda523ec..ff3f4f1dc2ff 100644
> --- a/drivers/media/platform/qcom/iris/iris_probe.c
> +++ b/drivers/media/platform/qcom/iris/iris_probe.c
> @@ -348,6 +348,10 @@ static const struct dev_pm_ops iris_pm_ops = {
>   };
>   
>   static const struct of_device_id iris_dt_match[] = {
> +	{
> +		.compatible = "qcom,milos-iris",
> +		.data = &milos_data,
> +	},
>   	{
>   		.compatible = "qcom,qcs8300-iris",
>   		.data = &qcs8300_data,
>

^ permalink raw reply

* Re: [PATCH 0/3] Add support for the Iris codec on Milos
From: Vishnu Reddy @ 2026-04-09  4:34 UTC (permalink / raw)
  To: Alexander Koskovich, Vikash Garodia, Dikshita Agarwal,
	Abhinav Kumar, Bryan O'Donoghue, Mauro Carvalho Chehab,
	Rob Herring, Krzysztof Kozlowski, Conor Dooley, Bjorn Andersson,
	Konrad Dybcio
  Cc: Luca Weiss, linux-media, linux-arm-msm, devicetree, linux-kernel
In-Reply-To: <20260406-milos-iris-v1-0-17ed0167ba6f@pm.me>


On 4/6/2026 3:49 PM, Alexander Koskovich wrote:
> This series adds the bindings, nodes and platform data for the Milos platform
> for the Iris video codec, allowing Milos to use hardware‑accelerated video
> encoding and decoding.
>
> Ran v4l2-compliance and some fluster tests, though a concerning amount of them
> failed. Attaching v4l2-compliance output and the full fluster results below.
>
> ~ # v4l2-compliance -d /dev/video0
> v4l2-compliance 1.32.0, 64 bits, 64-bit time_t
>
> Compliance test for iris_driver device /dev/video0:
>
> Driver Info:
> 	Driver name      : iris_driver
> 	Card type        : Iris Decoder
> 	Bus info         : platform:aa00000.video-codec
> 	Driver version   : 7.0.0
> 	Capabilities     : 0x84204000
> 		Video Memory-to-Memory Multiplanar
> 		Streaming
> 		Extended Pix Format
> 		Device Capabilities
> 	Device Caps      : 0x04204000
> 		Video Memory-to-Memory Multiplanar
> 		Streaming
> 		Extended Pix Format
> 	Detected Stateful Decoder
>
> Required ioctls:
> 	test VIDIOC_QUERYCAP: OK
> 	test invalid ioctls: OK
>
> Allow for multiple opens:
> 	test second /dev/video0 open: OK
> 	test VIDIOC_QUERYCAP: OK
> 	test VIDIOC_G/S_PRIORITY: OK
> 	test for unlimited opens: OK
>
> Debug ioctls:
> 	test VIDIOC_DBG_G/S_REGISTER: OK (Not Supported)
> 	test VIDIOC_LOG_STATUS: OK (Not Supported)
>
> Input ioctls:
> 	test VIDIOC_G/S_TUNER/ENUM_FREQ_BANDS: OK (Not Supported)
> 	test VIDIOC_G/S_FREQUENCY: OK (Not Supported)
> 	test VIDIOC_S_HW_FREQ_SEEK: OK (Not Supported)
> 	test VIDIOC_ENUMAUDIO: OK (Not Supported)
> 	test VIDIOC_G/S/ENUMINPUT: OK (Not Supported)
> 	test VIDIOC_G/S_AUDIO: OK (Not Supported)
> 	Inputs: 0 Audio Inputs: 0 Tuners: 0
>
> Output ioctls:
> 	test VIDIOC_G/S_MODULATOR: OK (Not Supported)
> 	test VIDIOC_G/S_FREQUENCY: OK (Not Supported)
> 	test VIDIOC_ENUMAUDOUT: OK (Not Supported)
> 	test VIDIOC_G/S/ENUMOUTPUT: OK (Not Supported)
> 	test VIDIOC_G/S_AUDOUT: OK (Not Supported)
> 	Outputs: 0 Audio Outputs: 0 Modulators: 0
>
> Input/Output configuration ioctls:
> 	test VIDIOC_ENUM/G/S/QUERY_STD: OK (Not Supported)
> 	test VIDIOC_ENUM/G/S/QUERY_DV_TIMINGS: OK (Not Supported)
> 	test VIDIOC_DV_TIMINGS_CAP: OK (Not Supported)
> 	test VIDIOC_G/S_EDID: OK (Not Supported)
>
> Control ioctls:
> 	test VIDIOC_QUERY_EXT_CTRL/QUERYMENU: OK
> 	test VIDIOC_QUERYCTRL: OK
> 	test VIDIOC_G/S_CTRL: OK
> 	test VIDIOC_G/S/TRY_EXT_CTRLS: OK
> 	test VIDIOC_(UN)SUBSCRIBE_EVENT/DQEVENT: OK
> 	test VIDIOC_G/S_JPEGCOMP: OK (Not Supported)
> 	Standard Controls: 10 Private Controls: 0
>
> Format ioctls:
> 	test VIDIOC_ENUM_FMT/FRAMESIZES/FRAMEINTERVALS: OK
> 	test VIDIOC_G/S_PARM: OK (Not Supported)
> 	test VIDIOC_G_FBUF: OK (Not Supported)
> 	test VIDIOC_G_FMT: OK
> 	test VIDIOC_TRY_FMT: OK
> 	test VIDIOC_S_FMT: OK
> 	test VIDIOC_G_SLICED_VBI_CAP: OK (Not Supported)
> 	test Cropping: OK
> 	test Composing: OK
> 	test Scaling: OK (Not Supported)
>
> Codec ioctls:
> 	test VIDIOC_(TRY_)ENCODER_CMD: OK (Not Supported)
> 	test VIDIOC_G_ENC_INDEX: OK (Not Supported)
> 	test VIDIOC_(TRY_)DECODER_CMD: OK
>
> Buffer ioctls:
> 	test VIDIOC_REQBUFS/CREATE_BUFS/QUERYBUF: OK
> 	test CREATE_BUFS maximum buffers: OK
> 	test VIDIOC_REMOVE_BUFS: OK
> 	test VIDIOC_EXPBUF: OK
> 	test Requests: OK (Not Supported)
> 	test blocking wait: OK
>
> Total for iris_driver device /dev/video0: 48, Succeeded: 48, Failed: 0, Warnings: 0
>
> ~ # v4l2-compliance -d /dev/video1
> v4l2-compliance 1.32.0, 64 bits, 64-bit time_t
>
> Compliance test for iris_driver device /dev/video1:
>
> Driver Info:
> 	Driver name      : iris_driver
> 	Card type        : Iris Encoder
> 	Bus info         : platform:aa00000.video-codec
> 	Driver version   : 7.0.0
> 	Capabilities     : 0x84204000
> 		Video Memory-to-Memory Multiplanar
> 		Streaming
> 		Extended Pix Format
> 		Device Capabilities
> 	Device Caps      : 0x04204000
> 		Video Memory-to-Memory Multiplanar
> 		Streaming
> 		Extended Pix Format
> 	Detected Stateful Encoder
>
> Required ioctls:
> 	test VIDIOC_QUERYCAP: OK
> 	test invalid ioctls: OK
>
> Allow for multiple opens:
> 	test second /dev/video1 open: OK
> 	test VIDIOC_QUERYCAP: OK
> 	test VIDIOC_G/S_PRIORITY: OK
> 	test for unlimited opens: OK
>
> Debug ioctls:
> 	test VIDIOC_DBG_G/S_REGISTER: OK (Not Supported)
> 	test VIDIOC_LOG_STATUS: OK (Not Supported)
>
> Input ioctls:
> 	test VIDIOC_G/S_TUNER/ENUM_FREQ_BANDS: OK (Not Supported)
> 	test VIDIOC_G/S_FREQUENCY: OK (Not Supported)
> 	test VIDIOC_S_HW_FREQ_SEEK: OK (Not Supported)
> 	test VIDIOC_ENUMAUDIO: OK (Not Supported)
> 	test VIDIOC_G/S/ENUMINPUT: OK (Not Supported)
> 	test VIDIOC_G/S_AUDIO: OK (Not Supported)
> 	Inputs: 0 Audio Inputs: 0 Tuners: 0
>
> Output ioctls:
> 	test VIDIOC_G/S_MODULATOR: OK (Not Supported)
> 	test VIDIOC_G/S_FREQUENCY: OK (Not Supported)
> 	test VIDIOC_ENUMAUDOUT: OK (Not Supported)
> 	test VIDIOC_G/S/ENUMOUTPUT: OK (Not Supported)
> 	test VIDIOC_G/S_AUDOUT: OK (Not Supported)
> 	Outputs: 0 Audio Outputs: 0 Modulators: 0
>
> Input/Output configuration ioctls:
> 	test VIDIOC_ENUM/G/S/QUERY_STD: OK (Not Supported)
> 	test VIDIOC_ENUM/G/S/QUERY_DV_TIMINGS: OK (Not Supported)
> 	test VIDIOC_DV_TIMINGS_CAP: OK (Not Supported)
> 	test VIDIOC_G/S_EDID: OK (Not Supported)
>
> Control ioctls:
> 	test VIDIOC_QUERY_EXT_CTRL/QUERYMENU: OK
> 	test VIDIOC_QUERYCTRL: OK
> 	test VIDIOC_G/S_CTRL: OK
> 	test VIDIOC_G/S/TRY_EXT_CTRLS: OK
> 	test VIDIOC_(UN)SUBSCRIBE_EVENT/DQEVENT: OK
> 	test VIDIOC_G/S_JPEGCOMP: OK (Not Supported)
> 	Standard Controls: 43 Private Controls: 0
>
> Format ioctls:
> 	test VIDIOC_ENUM_FMT/FRAMESIZES/FRAMEINTERVALS: OK
> 	test VIDIOC_G/S_PARM: OK
> 	test VIDIOC_G_FBUF: OK (Not Supported)
> 	test VIDIOC_G_FMT: OK
> 	test VIDIOC_TRY_FMT: OK
> 	test VIDIOC_S_FMT: OK
> 	test VIDIOC_G_SLICED_VBI_CAP: OK (Not Supported)
> 	test Cropping: OK
> 	test Composing: OK (Not Supported)
> 	test Scaling: OK (Not Supported)
>
> Codec ioctls:
> 	test VIDIOC_(TRY_)ENCODER_CMD: OK
> 	test VIDIOC_G_ENC_INDEX: OK (Not Supported)
> 	test VIDIOC_(TRY_)DECODER_CMD: OK (Not Supported)
>
> Buffer ioctls:
> 	test VIDIOC_REQBUFS/CREATE_BUFS/QUERYBUF: OK
> 	test CREATE_BUFS maximum buffers: OK
> 	test VIDIOC_REMOVE_BUFS: OK
> 	test VIDIOC_EXPBUF: OK
> 	test Requests: OK (Not Supported)
> 	test blocking wait: OK
>
> Total for iris_driver device /dev/video1: 48, Succeeded: 48, Failed: 0, Warnings: 0
You can run the streaming tests also using -s option.
v4l2-compliance -d /dev/video0 -s <clip>
v4l2-compliance -d /dev/video1 -s
> -------------------------------
>
> H264:
> |Test|FFmpeg-H.264-v4l2m2m|
> |-|-|
> |TOTAL|36/135|
> |TOTAL TIME|23.574s|
> |-|-|
> |AUD_MW_E|Pass|
> |BA1_FT_C|Fail|
> |BA1_Sony_D|Pass|
> |BA2_Sony_F|Pass|
> |BA3_SVA_C|Error|
> |BA_MW_D|Fail|
> |BAMQ1_JVC_C|Fail|
> |BAMQ2_JVC_C|Fail|
> |BANM_MW_D|Fail|
> |BASQP1_Sony_C|Fail|
> |CABA1_Sony_D|Fail|
> |CABA1_SVA_B|Pass|
> |CABA2_Sony_E|Pass|
> |CABA2_SVA_B|Pass|
> |CABA3_Sony_C|Fail|
> |CABA3_SVA_B|Pass|
> |CABA3_TOSHIBA_E|Fail|
> |cabac_mot_fld0_full|Fail|
> |cabac_mot_frm0_full|Pass|
> |cabac_mot_mbaff0_full|Fail|
> |cabac_mot_picaff0_full|Fail|
> |CABACI3_Sony_B|Pass|
> |CABAST3_Sony_E|Pass|
> |CABASTBR3_Sony_B|Pass|
> |CABREF3_Sand_D|Fail|
> |CACQP3_Sony_D|Pass|
> |CAFI1_SVA_C|Fail|
> |CAMA1_Sony_C|Fail|
> |CAMA1_TOSHIBA_B|Fail|
> |cama1_vtc_c|Fail|
> |cama2_vtc_b|Fail|
> |CAMA3_Sand_E|Fail|
> |cama3_vtc_b|Fail|
> |CAMACI3_Sony_C|Fail|
> |CAMANL1_TOSHIBA_B|Fail|
> |CAMANL2_TOSHIBA_B|Fail|
> |CAMANL3_Sand_E|Fail|
> |CAMASL3_Sony_B|Fail|
> |CAMP_MOT_MBAFF_L30|Fail|
> |CAMP_MOT_MBAFF_L31|Fail|
> |CANL1_Sony_E|Pass|
> |CANL1_SVA_B|Pass|
> |CANL1_TOSHIBA_G|Fail|
> |CANL2_Sony_E|Fail|
> |CANL2_SVA_B|Fail|
> |CANL3_Sony_C|Fail|
> |CANL3_SVA_B|Fail|
> |CANL4_SVA_B|Fail|
> |CANLMA2_Sony_C|Fail|
> |CANLMA3_Sony_C|Fail|
> |CAPA1_TOSHIBA_B|Fail|
> |CAPAMA3_Sand_F|Fail|
> |CAPCM1_Sand_E|Pass|
> |CAPCMNL1_Sand_E|Fail|
> |CAPM3_Sony_D|Fail|
> |CAQP1_Sony_B|Pass|
> |cavlc_mot_fld0_full_B|Fail|
> |cavlc_mot_frm0_full_B|Pass|
> |cavlc_mot_mbaff0_full_B|Fail|
> |cavlc_mot_picaff0_full_B|Fail|
> |CAWP1_TOSHIBA_E|Pass|
> |CAWP5_TOSHIBA_E|Pass|
> |CI1_FT_B|Pass|
> |CI_MW_D|Pass|
> |CVBS3_Sony_C|Pass|
> |CVCANLMA2_Sony_C|Fail|
> |CVFC1_Sony_C|Fail|
> |CVFI1_Sony_D|Fail|
> |CVFI1_SVA_C|Fail|
> |CVFI2_Sony_H|Fail|
> |CVFI2_SVA_C|Fail|
> |CVMA1_Sony_D|Fail|
> |CVMA1_TOSHIBA_B|Fail|
> |CVMANL1_TOSHIBA_B|Fail|
> |CVMANL2_TOSHIBA_B|Fail|
> |CVMAPAQP3_Sony_E|Fail|
> |CVMAQP2_Sony_G|Fail|
> |CVMAQP3_Sony_D|Fail|
> |CVMP_MOT_FLD_L30_B|Fail|
> |CVMP_MOT_FRM_L31_B|Fail|
> |CVNLFI1_Sony_C|Fail|
> |CVNLFI2_Sony_H|Fail|
> |CVPA1_TOSHIBA_B|Fail|
> |CVPCMNL1_SVA_C|Fail|
> |CVPCMNL2_SVA_C|Pass|
> |CVSE2_Sony_B|Fail|
> |CVSE3_Sony_H|Pass|
> |CVSEFDFT3_Sony_E|Fail|
> |CVWP1_TOSHIBA_E|Fail|
> |CVWP2_TOSHIBA_E|Pass|
> |CVWP3_TOSHIBA_E|Pass|
> |CVWP5_TOSHIBA_E|Fail|
> |FI1_Sony_E|Fail|
> |FM1_BT_B|Error|
> |FM1_FT_E|Error|
> |FM2_SVA_C|Error|
> |HCBP1_HHI_A|Pass|
> |HCBP2_HHI_A|Fail|
> |HCMP1_HHI_A|Fail|
> |LS_SVA_D|Fail|
> |MIDR_MW_D|Fail|
> |MPS_MW_A|Pass|
> |MR1_BT_A|Pass|
> |MR1_MW_A|Fail|
> |MR2_MW_A|Fail|
> |MR2_TANDBERG_E|Pass|
> |MR3_TANDBERG_B|Fail|
> |MR4_TANDBERG_C|Fail|
> |MR5_TANDBERG_C|Fail|
> |MR6_BT_B|Error|
> |MR7_BT_B|Error|
> |MR8_BT_B|Error|
> |MR9_BT_B|Fail|
> |MV1_BRCM_D|Pass|
> |NL1_Sony_D|Fail|
> |NL2_Sony_H|Pass|
> |NL3_SVA_E|Fail|
> |NLMQ1_JVC_C|Fail|
> |NLMQ2_JVC_C|Pass|
> |NRF_MW_E|Fail|
> |Sharp_MP_Field_1_B|Fail|
> |Sharp_MP_Field_2_B|Fail|
> |Sharp_MP_Field_3_B|Fail|
> |Sharp_MP_PAFF_1r2|Fail|
> |Sharp_MP_PAFF_2r|Fail|
> |SL1_SVA_B|Pass|
> |SP1_BT_A|Error|
> |sp2_bt_b|Error|
> |SVA_BA1_B|Pass|
> |SVA_BA2_D|Pass|
> |SVA_Base_B|Fail|
> |SVA_CL1_E|Fail|
> |SVA_FM1_E|Fail|
> |SVA_NL1_B|Fail|
> |SVA_NL2_E|Fail|
> |-|-|
> |Test|FFmpeg-H.264-v4l2m2m|
> |TOTAL|36/135|
> |TOTAL TIME|23.574s|
>
> |-|-|
> |Profile|FFmpeg-H.264-v4l2m2m|
> |CONSTRAINED_BASELINE|12/33|
> |BASELINE|1/7|
> |EXTENDED|0/6|
> |MAIN|23/89|
>
> |TOTALS|FFmpeg-H.264-v4l2m2m|
> |-|-|
> |TOTAL|36/135|
> |TOTAL TIME|23.574s|
> |-|-|
> |Profile|FFmpeg-H.264-v4l2m2m|
> |BASELINE|1/7|
> |CONSTRAINED_BASELINE|12/33|
> |EXTENDED|0/6|
> |MAIN|23/89|
> |-|-|
>
> -------------------------------
>
> |Test|FFmpeg-H.265-v4l2m2m|
> |-|-|
> |TOTAL|109/147|
> |TOTAL TIME|38.547s|
> |-|-|
> |AMP_A_Samsung_7|Pass|
> |AMP_B_Samsung_7|Pass|
> |AMP_D_Hisilicon_3|Pass|
> |AMP_E_Hisilicon_3|Pass|
> |AMP_F_Hisilicon_3|Pass|
> |AMVP_A_MTK_4|Pass|
> |AMVP_B_MTK_4|Fail|
> |AMVP_C_Samsung_7|Pass|
> |BUMPING_A_ericsson_1|Fail|
> |CAINIT_A_SHARP_4|Pass|
> |CAINIT_B_SHARP_4|Pass|
> |CAINIT_C_SHARP_3|Pass|
> |CAINIT_D_SHARP_3|Pass|
> |CAINIT_E_SHARP_3|Pass|
> |CAINIT_F_SHARP_3|Pass|
> |CAINIT_G_SHARP_3|Pass|
> |CAINIT_H_SHARP_3|Pass|
> |CIP_A_Panasonic_3|Pass|
> |cip_B_NEC_3|Pass|
> |CIP_C_Panasonic_2|Pass|
> |CONFWIN_A_Sony_1|Fail|
> |DBLK_A_MAIN10_VIXS_4|Fail|
> |DBLK_A_SONY_3|Pass|
> |DBLK_B_SONY_3|Pass|
> |DBLK_C_SONY_3|Pass|
> |DBLK_D_VIXS_2|Pass|
> |DBLK_E_VIXS_2|Pass|
> |DBLK_F_VIXS_2|Pass|
> |DBLK_G_VIXS_2|Pass|
> |DELTAQP_A_BRCM_4|Pass|
> |DELTAQP_B_SONY_3|Pass|
> |DELTAQP_C_SONY_3|Pass|
> |DSLICE_A_HHI_5|Pass|
> |DSLICE_B_HHI_5|Pass|
> |DSLICE_C_HHI_5|Pass|
> |ENTP_A_QUALCOMM_1|Pass|
> |ENTP_B_Qualcomm_1|Pass|
> |ENTP_C_Qualcomm_1|Pass|
> |EXT_A_ericsson_4|Pass|
> |FILLER_A_Sony_1|Pass|
> |HRD_A_Fujitsu_3|Pass|
> |INITQP_A_Sony_1|Pass|
> |INITQP_B_Main10_Sony_1|Fail|
> |ipcm_A_NEC_3|Fail|
> |ipcm_B_NEC_3|Pass|
> |ipcm_C_NEC_3|Pass|
> |ipcm_D_NEC_3|Pass|
> |ipcm_E_NEC_2|Pass|
> |IPRED_A_docomo_2|Pass|
> |IPRED_B_Nokia_3|Pass|
> |IPRED_C_Mitsubishi_3|Pass|
> |LS_A_Orange_2|Pass|
> |LS_B_Orange_4|Pass|
> |LTRPSPS_A_Qualcomm_1|Fail|
> |MAXBINS_A_TI_5|Pass|
> |MAXBINS_B_TI_5|Pass|
> |MAXBINS_C_TI_5|Pass|
> |MERGE_A_TI_3|Pass|
> |MERGE_B_TI_3|Pass|
> |MERGE_C_TI_3|Fail|
> |MERGE_D_TI_3|Fail|
> |MERGE_E_TI_3|Pass|
> |MERGE_F_MTK_4|Pass|
> |MERGE_G_HHI_4|Pass|
> |MVCLIP_A_qualcomm_3|Fail|
> |MVDL1ZERO_A_docomo_4|Pass|
> |MVEDGE_A_qualcomm_3|Fail|
> |NoOutPrior_A_Qualcomm_1|Fail|
> |NoOutPrior_B_Qualcomm_1|Fail|
> |NUT_A_ericsson_5|Fail|
> |OPFLAG_A_Qualcomm_1|Pass|
> |OPFLAG_B_Qualcomm_1|Fail|
> |OPFLAG_C_Qualcomm_1|Fail|
> |PICSIZE_A_Bossen_1|Error|
> |PICSIZE_B_Bossen_1|Error|
> |PICSIZE_C_Bossen_1|Error|
> |PICSIZE_D_Bossen_1|Error|
> |PMERGE_A_TI_3|Pass|
> |PMERGE_B_TI_3|Pass|
> |PMERGE_C_TI_3|Pass|
> |PMERGE_D_TI_3|Pass|
> |PMERGE_E_TI_3|Pass|
> |POC_A_Bossen_3|Pass|
> |PPS_A_qualcomm_7|Pass|
> |PS_B_VIDYO_3|Pass|
> |RAP_A_docomo_6|Fail|
> |RAP_B_Bossen_2|Fail|
> |RPLM_A_qualcomm_4|Pass|
> |RPLM_B_qualcomm_4|Pass|
> |RPS_A_docomo_5|Pass|
> |RPS_B_qualcomm_5|Pass|
> |RPS_C_ericsson_5|Pass|
> |RPS_D_ericsson_6|Pass|
> |RPS_E_qualcomm_5|Pass|
> |RPS_F_docomo_2|Pass|
> |RQT_A_HHI_4|Pass|
> |RQT_B_HHI_4|Pass|
> |RQT_C_HHI_4|Pass|
> |RQT_D_HHI_4|Pass|
> |RQT_E_HHI_4|Pass|
> |RQT_F_HHI_4|Pass|
> |RQT_G_HHI_4|Pass|
> |SAO_A_MediaTek_4|Fail|
> |SAO_B_MediaTek_5|Pass|
> |SAO_C_Samsung_5|Pass|
> |SAO_D_Samsung_5|Pass|
> |SAO_E_Canon_4|Pass|
> |SAO_F_Canon_3|Pass|
> |SAO_G_Canon_3|Pass|
> |SAO_H_Parabola_1|Pass|
> |SAODBLK_A_MainConcept_4|Pass|
> |SAODBLK_B_MainConcept_4|Pass|
> |SDH_A_Orange_4|Pass|
> |SLICES_A_Rovi_3|Pass|
> |SLIST_A_Sony_5|Pass|
> |SLIST_B_Sony_9|Pass|
> |SLIST_C_Sony_4|Pass|
> |SLIST_D_Sony_9|Pass|
> |SLPPLP_A_VIDYO_2|Pass|
> |STRUCT_A_Samsung_7|Pass|
> |STRUCT_B_Samsung_7|Pass|
> |TILES_A_Cisco_2|Pass|
> |TILES_B_Cisco_1|Pass|
> |TMVP_A_MS_3|Pass|
> |TSCL_A_VIDYO_5|Fail|
> |TSCL_B_VIDYO_4|Pass|
> |TSKIP_A_MS_3|Pass|
> |TSUNEQBD_A_MAIN10_Technicolor_2|Error|
> |TUSIZE_A_Samsung_1|Pass|
> |VPSID_A_VIDYO_2|Pass|
> |VPSSPSPPS_A_MainConcept_1|Fail|
> |WP_A_MAIN10_Toshiba_3|Fail|
> |WP_A_Toshiba_3|Pass|
> |WP_B_Toshiba_3|Pass|
> |WP_MAIN10_B_Toshiba_3|Fail|
> |WPP_A_ericsson_MAIN10_2|Fail|
> |WPP_A_ericsson_MAIN_2|Pass|
> |WPP_B_ericsson_MAIN10_2|Fail|
> |WPP_B_ericsson_MAIN_2|Fail|
> |WPP_C_ericsson_MAIN10_2|Fail|
> |WPP_C_ericsson_MAIN_2|Fail|
> |WPP_D_ericsson_MAIN10_2|Error|
> |WPP_D_ericsson_MAIN_2|Error|
> |WPP_E_ericsson_MAIN10_2|Fail|
> |WPP_E_ericsson_MAIN_2|Fail|
> |WPP_F_ericsson_MAIN10_2|Fail|
> |WPP_F_ericsson_MAIN_2|Pass|
> |-|-|
> |Test|FFmpeg-H.265-v4l2m2m|
> |TOTAL|109/147|
> |TOTAL TIME|38.547s|
>
> |-|-|
> |Profile|FFmpeg-H.265-v4l2m2m|
> |MAIN|108/135|
> |MAIN_10|0/11|
> |MAIN_STILL_PICTURE|1/1|
>
> |TOTALS|FFmpeg-H.265-v4l2m2m|
> |-|-|
> |TOTAL|109/147|
> |TOTAL TIME|38.547s|
> |-|-|
> |Profile|FFmpeg-H.265-v4l2m2m|
> |MAIN|108/135|
> |MAIN_10|0/11|
> |MAIN_STILL_PICTURE|1/1|
> |-|-|
>
> -------------------------------
>
> |Test|FFmpeg-VP9-v4l2m2m|
> |-|-|
> |TOTAL|111/305|
> |TOTAL TIME|77.260s|
> |-|-|
> |vp90-2-00-quantizer-00.webm|Pass|
> |vp90-2-00-quantizer-01.webm|Pass|
> |vp90-2-00-quantizer-02.webm|Pass|
> |vp90-2-00-quantizer-03.webm|Fail|
> |vp90-2-00-quantizer-04.webm|Fail|
> |vp90-2-00-quantizer-05.webm|Pass|
> |vp90-2-00-quantizer-06.webm|Pass|
> |vp90-2-00-quantizer-07.webm|Pass|
> |vp90-2-00-quantizer-08.webm|Fail|
> |vp90-2-00-quantizer-09.webm|Pass|
> |vp90-2-00-quantizer-10.webm|Pass|
> |vp90-2-00-quantizer-11.webm|Pass|
> |vp90-2-00-quantizer-12.webm|Pass|
> |vp90-2-00-quantizer-13.webm|Pass|
> |vp90-2-00-quantizer-14.webm|Pass|
> |vp90-2-00-quantizer-15.webm|Pass|
> |vp90-2-00-quantizer-16.webm|Fail|
> |vp90-2-00-quantizer-17.webm|Pass|
> |vp90-2-00-quantizer-18.webm|Pass|
> |vp90-2-00-quantizer-19.webm|Pass|
> |vp90-2-00-quantizer-20.webm|Pass|
> |vp90-2-00-quantizer-21.webm|Pass|
> |vp90-2-00-quantizer-22.webm|Pass|
> |vp90-2-00-quantizer-23.webm|Pass|
> |vp90-2-00-quantizer-24.webm|Pass|
> |vp90-2-00-quantizer-25.webm|Fail|
> |vp90-2-00-quantizer-26.webm|Fail|
> |vp90-2-00-quantizer-27.webm|Pass|
> |vp90-2-00-quantizer-28.webm|Pass|
> |vp90-2-00-quantizer-29.webm|Fail|
> |vp90-2-00-quantizer-30.webm|Pass|
> |vp90-2-00-quantizer-31.webm|Pass|
> |vp90-2-00-quantizer-32.webm|Fail|
> |vp90-2-00-quantizer-33.webm|Pass|
> |vp90-2-00-quantizer-34.webm|Pass|
> |vp90-2-00-quantizer-35.webm|Pass|
> |vp90-2-00-quantizer-36.webm|Pass|
> |vp90-2-00-quantizer-37.webm|Pass|
> |vp90-2-00-quantizer-38.webm|Pass|
> |vp90-2-00-quantizer-39.webm|Pass|
> |vp90-2-00-quantizer-40.webm|Pass|
> |vp90-2-00-quantizer-41.webm|Pass|
> |vp90-2-00-quantizer-42.webm|Pass|
> |vp90-2-00-quantizer-43.webm|Pass|
> |vp90-2-00-quantizer-44.webm|Fail|
> |vp90-2-00-quantizer-45.webm|Pass|
> |vp90-2-00-quantizer-46.webm|Pass|
> |vp90-2-00-quantizer-47.webm|Pass|
> |vp90-2-00-quantizer-48.webm|Pass|
> |vp90-2-00-quantizer-49.webm|Pass|
> |vp90-2-00-quantizer-50.webm|Fail|
> |vp90-2-00-quantizer-51.webm|Pass|
> |vp90-2-00-quantizer-52.webm|Pass|
> |vp90-2-00-quantizer-53.webm|Pass|
> |vp90-2-00-quantizer-54.webm|Pass|
> |vp90-2-00-quantizer-55.webm|Pass|
> |vp90-2-00-quantizer-56.webm|Pass|
> |vp90-2-00-quantizer-57.webm|Pass|
> |vp90-2-00-quantizer-58.webm|Pass|
> |vp90-2-00-quantizer-59.webm|Fail|
> |vp90-2-00-quantizer-60.webm|Pass|
> |vp90-2-00-quantizer-61.webm|Pass|
> |vp90-2-00-quantizer-62.webm|Pass|
> |vp90-2-00-quantizer-63.webm|Fail|
> |vp90-2-01-sharpness-1.webm|Pass|
> |vp90-2-01-sharpness-2.webm|Pass|
> |vp90-2-01-sharpness-3.webm|Pass|
> |vp90-2-01-sharpness-4.webm|Pass|
> |vp90-2-01-sharpness-5.webm|Pass|
> |vp90-2-01-sharpness-6.webm|Pass|
> |vp90-2-01-sharpness-7.webm|Pass|
> |vp90-2-02-size-08x08.webm|Error|
> |vp90-2-02-size-08x10.webm|Error|
> |vp90-2-02-size-08x16.webm|Error|
> |vp90-2-02-size-08x18.webm|Error|
> |vp90-2-02-size-08x32.webm|Error|
> |vp90-2-02-size-08x34.webm|Error|
> |vp90-2-02-size-08x64.webm|Error|
> |vp90-2-02-size-08x66.webm|Error|
> |vp90-2-02-size-10x08.webm|Error|
> |vp90-2-02-size-10x10.webm|Error|
> |vp90-2-02-size-10x16.webm|Error|
> |vp90-2-02-size-10x18.webm|Error|
> |vp90-2-02-size-10x32.webm|Error|
> |vp90-2-02-size-10x34.webm|Error|
> |vp90-2-02-size-10x64.webm|Error|
> |vp90-2-02-size-10x66.webm|Error|
> |vp90-2-02-size-130x132.webm|Fail|
> |vp90-2-02-size-132x130.webm|Pass|
> |vp90-2-02-size-132x132.webm|Pass|
> |vp90-2-02-size-16x08.webm|Error|
> |vp90-2-02-size-16x10.webm|Error|
> |vp90-2-02-size-16x16.webm|Error|
> |vp90-2-02-size-16x18.webm|Error|
> |vp90-2-02-size-16x32.webm|Error|
> |vp90-2-02-size-16x34.webm|Error|
> |vp90-2-02-size-16x64.webm|Error|
> |vp90-2-02-size-16x66.webm|Error|
> |vp90-2-02-size-178x180.webm|Fail|
> |vp90-2-02-size-180x178.webm|Pass|
> |vp90-2-02-size-180x180.webm|Fail|
> |vp90-2-02-size-18x08.webm|Error|
> |vp90-2-02-size-18x10.webm|Error|
> |vp90-2-02-size-18x16.webm|Error|
> |vp90-2-02-size-18x18.webm|Error|
> |vp90-2-02-size-18x32.webm|Error|
> |vp90-2-02-size-18x34.webm|Error|
> |vp90-2-02-size-18x64.webm|Error|
> |vp90-2-02-size-18x66.webm|Error|
> |vp90-2-02-size-32x08.webm|Error|
> |vp90-2-02-size-32x10.webm|Error|
> |vp90-2-02-size-32x16.webm|Error|
> |vp90-2-02-size-32x18.webm|Error|
> |vp90-2-02-size-32x32.webm|Error|
> |vp90-2-02-size-32x34.webm|Error|
> |vp90-2-02-size-32x64.webm|Error|
> |vp90-2-02-size-32x66.webm|Error|
> |vp90-2-02-size-34x08.webm|Error|
> |vp90-2-02-size-34x10.webm|Error|
> |vp90-2-02-size-34x16.webm|Error|
> |vp90-2-02-size-34x18.webm|Error|
> |vp90-2-02-size-34x32.webm|Error|
> |vp90-2-02-size-34x34.webm|Error|
> |vp90-2-02-size-34x64.webm|Error|
> |vp90-2-02-size-34x66.webm|Error|
> |vp90-2-02-size-64x08.webm|Error|
> |vp90-2-02-size-64x10.webm|Error|
> |vp90-2-02-size-64x16.webm|Error|
> |vp90-2-02-size-64x18.webm|Error|
> |vp90-2-02-size-64x32.webm|Error|
> |vp90-2-02-size-64x34.webm|Error|
> |vp90-2-02-size-64x64.webm|Error|
> |vp90-2-02-size-64x66.webm|Error|
> |vp90-2-02-size-66x08.webm|Error|
> |vp90-2-02-size-66x10.webm|Error|
> |vp90-2-02-size-66x16.webm|Error|
> |vp90-2-02-size-66x18.webm|Error|
> |vp90-2-02-size-66x32.webm|Error|
> |vp90-2-02-size-66x34.webm|Error|
> |vp90-2-02-size-66x64.webm|Error|
> |vp90-2-02-size-66x66.webm|Error|
> |vp90-2-02-size-lf-1920x1080.webm|Fail|
> |vp90-2-03-deltaq.webm|Fail|
> |vp90-2-03-size-196x196.webm|Pass|
> |vp90-2-03-size-196x198.webm|Pass|
> |vp90-2-03-size-196x200.webm|Pass|
> |vp90-2-03-size-196x202.webm|Pass|
> |vp90-2-03-size-196x208.webm|Fail|
> |vp90-2-03-size-196x210.webm|Fail|
> |vp90-2-03-size-196x224.webm|Pass|
> |vp90-2-03-size-196x226.webm|Fail|
> |vp90-2-03-size-198x196.webm|Fail|
> |vp90-2-03-size-198x198.webm|Pass|
> |vp90-2-03-size-198x200.webm|Pass|
> |vp90-2-03-size-198x202.webm|Pass|
> |vp90-2-03-size-198x208.webm|Pass|
> |vp90-2-03-size-198x210.webm|Fail|
> |vp90-2-03-size-198x224.webm|Pass|
> |vp90-2-03-size-198x226.webm|Fail|
> |vp90-2-03-size-200x196.webm|Fail|
> |vp90-2-03-size-200x198.webm|Fail|
> |vp90-2-03-size-200x200.webm|Fail|
> |vp90-2-03-size-200x202.webm|Pass|
> |vp90-2-03-size-200x208.webm|Fail|
> |vp90-2-03-size-200x210.webm|Fail|
> |vp90-2-03-size-200x224.webm|Pass|
> |vp90-2-03-size-200x226.webm|Fail|
> |vp90-2-03-size-202x196.webm|Fail|
> |vp90-2-03-size-202x198.webm|Fail|
> |vp90-2-03-size-202x200.webm|Fail|
> |vp90-2-03-size-202x202.webm|Fail|
> |vp90-2-03-size-202x208.webm|Pass|
> |vp90-2-03-size-202x210.webm|Fail|
> |vp90-2-03-size-202x224.webm|Fail|
> |vp90-2-03-size-202x226.webm|Pass|
> |vp90-2-03-size-208x196.webm|Pass|
> |vp90-2-03-size-208x198.webm|Pass|
> |vp90-2-03-size-208x200.webm|Pass|
> |vp90-2-03-size-208x202.webm|Pass|
> |vp90-2-03-size-208x208.webm|Pass|
> |vp90-2-03-size-208x210.webm|Pass|
> |vp90-2-03-size-208x224.webm|Pass|
> |vp90-2-03-size-208x226.webm|Pass|
> |vp90-2-03-size-210x196.webm|Pass|
> |vp90-2-03-size-210x198.webm|Pass|
> |vp90-2-03-size-210x200.webm|Fail|
> |vp90-2-03-size-210x202.webm|Pass|
> |vp90-2-03-size-210x208.webm|Pass|
> |vp90-2-03-size-210x210.webm|Fail|
> |vp90-2-03-size-210x224.webm|Pass|
> |vp90-2-03-size-210x226.webm|Fail|
> |vp90-2-03-size-224x196.webm|Fail|
> |vp90-2-03-size-224x198.webm|Pass|
> |vp90-2-03-size-224x200.webm|Pass|
> |vp90-2-03-size-224x202.webm|Fail|
> |vp90-2-03-size-224x208.webm|Pass|
> |vp90-2-03-size-224x210.webm|Fail|
> |vp90-2-03-size-224x224.webm|Pass|
> |vp90-2-03-size-224x226.webm|Pass|
> |vp90-2-03-size-226x196.webm|Pass|
> |vp90-2-03-size-226x198.webm|Fail|
> |vp90-2-03-size-226x200.webm|Fail|
> |vp90-2-03-size-226x202.webm|Fail|
> |vp90-2-03-size-226x208.webm|Pass|
> |vp90-2-03-size-226x210.webm|Pass|
> |vp90-2-03-size-226x224.webm|Fail|
> |vp90-2-03-size-226x226.webm|Fail|
> |vp90-2-03-size-352x288.webm|Pass|
> |vp90-2-05-resize.ivf|Fail|
> |vp90-2-06-bilinear.webm|Pass|
> |vp90-2-07-frame_parallel-1.webm|Pass|
> |vp90-2-07-frame_parallel.webm|Fail|
> |vp90-2-08-tile_1x2_frame_parallel.webm|Fail|
> |vp90-2-08-tile_1x2.webm|Fail|
> |vp90-2-08-tile_1x4_frame_parallel.webm|Fail|
> |vp90-2-08-tile_1x4.webm|Fail|
> |vp90-2-08-tile_1x8_frame_parallel.webm|Pass|
> |vp90-2-08-tile_1x8.webm|Pass|
> |vp90-2-08-tile-4x1.webm|Pass|
> |vp90-2-08-tile-4x4.webm|Pass|
> |vp90-2-09-aq2.webm|Fail|
> |vp90-2-09-lf_deltas.webm|Fail|
> |vp90-2-09-subpixel-00.ivf|Fail|
> |vp90-2-10-show-existing-frame2.webm|Fail|
> |vp90-2-10-show-existing-frame.webm|Fail|
> |vp90-2-11-size-351x287.webm|Fail|
> |vp90-2-11-size-351x288.webm|Fail|
> |vp90-2-11-size-352x287.webm|Fail|
> |vp90-2-12-droppable_1.ivf|Pass|
> |vp90-2-12-droppable_2.ivf|Pass|
> |vp90-2-12-droppable_3.ivf|Pass|
> |vp90-2-14-resize-10frames-fp-tiles-1-2-4-8.webm|Timeout|
> |vp90-2-14-resize-10frames-fp-tiles-1-2.webm|Timeout|
> |vp90-2-14-resize-10frames-fp-tiles-1-4.webm|Fail|
> |vp90-2-14-resize-10frames-fp-tiles-1-8.webm|Fail|
> |vp90-2-14-resize-10frames-fp-tiles-2-1.webm|Timeout|
> |vp90-2-14-resize-10frames-fp-tiles-2-4.webm|Timeout|
> |vp90-2-14-resize-10frames-fp-tiles-2-8.webm|Timeout|
> |vp90-2-14-resize-10frames-fp-tiles-4-1.webm|Timeout|
> |vp90-2-14-resize-10frames-fp-tiles-4-2.webm|Timeout|
> |vp90-2-14-resize-10frames-fp-tiles-4-8.webm|Timeout|
> |vp90-2-14-resize-10frames-fp-tiles-8-1.webm|Timeout|
> |vp90-2-14-resize-10frames-fp-tiles-8-2.webm|Timeout|
> |vp90-2-14-resize-10frames-fp-tiles-8-4-2-1.webm|Timeout|
> |vp90-2-14-resize-10frames-fp-tiles-8-4.webm|Timeout|
> |vp90-2-14-resize-fp-tiles-1-16.webm|Fail|
> |vp90-2-14-resize-fp-tiles-1-2-4-8-16.webm|Timeout|
> |vp90-2-14-resize-fp-tiles-1-2.webm|Fail|
> |vp90-2-14-resize-fp-tiles-1-4.webm|Timeout|
> |vp90-2-14-resize-fp-tiles-16-1.webm|Error|
> |vp90-2-14-resize-fp-tiles-16-2.webm|Error|
> |vp90-2-14-resize-fp-tiles-16-4.webm|Error|
> |vp90-2-14-resize-fp-tiles-16-8-4-2-1.webm|Error|
> |vp90-2-14-resize-fp-tiles-16-8.webm|Error|
> |vp90-2-14-resize-fp-tiles-1-8.webm|Fail|
> |vp90-2-14-resize-fp-tiles-2-16.webm|Error|
> |vp90-2-14-resize-fp-tiles-2-1.webm|Fail|
> |vp90-2-14-resize-fp-tiles-2-4.webm|Fail|
> |vp90-2-14-resize-fp-tiles-2-8.webm|Timeout|
> |vp90-2-14-resize-fp-tiles-4-16.webm|Error|
> |vp90-2-14-resize-fp-tiles-4-1.webm|Timeout|
> |vp90-2-14-resize-fp-tiles-4-2.webm|Timeout|
> |vp90-2-14-resize-fp-tiles-4-8.webm|Fail|
> |vp90-2-14-resize-fp-tiles-8-16.webm|Error|
> |vp90-2-14-resize-fp-tiles-8-1.webm|Timeout|
> |vp90-2-14-resize-fp-tiles-8-2.webm|Timeout|
> |vp90-2-14-resize-fp-tiles-8-4.webm|Timeout|
> |vp90-2-15-segkey_adpq.webm|Fail|
> |vp90-2-15-segkey.webm|Pass|
> |vp90-2-16-intra-only.webm|Fail|
> |vp90-2-17-show-existing-frame.webm|Pass|
> |vp90-2-18-resize.ivf|Fail|
> |vp90-2-19-skip-01.webm|Fail|
> |vp90-2-19-skip-02.webm|Fail|
> |vp90-2-19-skip.webm|Pass|
> |vp90-2-20-big_superframe-01.webm|Fail|
> |vp90-2-20-big_superframe-02.webm|Fail|
> |vp90-2-21-resize_inter_1280x720_5_1-2.webm|Timeout|
> |vp90-2-21-resize_inter_1280x720_5_3-4.webm|Timeout|
> |vp90-2-21-resize_inter_1280x720_7_1-2.webm|Fail|
> |vp90-2-21-resize_inter_1280x720_7_3-4.webm|Timeout|
> |vp90-2-21-resize_inter_1920x1080_5_1-2.webm|Timeout|
> |vp90-2-21-resize_inter_1920x1080_5_3-4.webm|Timeout|
> |vp90-2-21-resize_inter_1920x1080_7_1-2.webm|Timeout|
> |vp90-2-21-resize_inter_1920x1080_7_3-4.webm|Timeout|
> |vp90-2-21-resize_inter_320x180_5_1-2.webm|Fail|
> |vp90-2-21-resize_inter_320x180_5_3-4.webm|Fail|
> |vp90-2-21-resize_inter_320x180_7_1-2.webm|Fail|
> |vp90-2-21-resize_inter_320x180_7_3-4.webm|Fail|
> |vp90-2-21-resize_inter_320x240_5_1-2.webm|Timeout|
> |vp90-2-21-resize_inter_320x240_5_3-4.webm|Fail|
> |vp90-2-21-resize_inter_320x240_7_1-2.webm|Fail|
> |vp90-2-21-resize_inter_320x240_7_3-4.webm|Timeout|
> |vp90-2-21-resize_inter_640x360_5_1-2.webm|Fail|
> |vp90-2-21-resize_inter_640x360_5_3-4.webm|Timeout|
> |vp90-2-21-resize_inter_640x360_7_1-2.webm|Fail|
> |vp90-2-21-resize_inter_640x360_7_3-4.webm|Fail|
> |vp90-2-21-resize_inter_640x480_5_1-2.webm|Timeout|
> |vp90-2-21-resize_inter_640x480_5_3-4.webm|Fail|
> |vp90-2-21-resize_inter_640x480_7_1-2.webm|Timeout|
> |vp90-2-21-resize_inter_640x480_7_3-4.webm|Timeout|
> |vp90-2-22-svc_1280x720_1.webm|Pass|
> |vp90-2-22-svc_1280x720_3.ivf|Timeout|
> |vp91-2-04-yuv422.webm|Error|
> |vp91-2-04-yuv444.webm|Error|
> |-|-|
> |Test|FFmpeg-VP9-v4l2m2m|
> |TOTAL|111/305|
> |TOTAL TIME|77.260s|
>
> |TOTALS|FFmpeg-VP9-v4l2m2m|
> |-|-|
> |TOTAL|111/305|
> |TOTAL TIME|77.260s|
> |-|-|
>
> Signed-off-by: Alexander Koskovich<akoskovich@pm.me>
> ---
> Alexander Koskovich (3):
>        dt-bindings: media: qcom,milos-iris: Add Milos video codec
>        media: iris: Add support for Milos (VPU v2.0)
>        arm64: dts: qcom: milos: Add Iris VPU v2.0
>
>   .../devicetree/bindings/media/qcom,milos-iris.yaml | 166 ++++++
>   arch/arm64/boot/dts/qcom/milos.dtsi                |  85 +++
>   .../platform/qcom/iris/iris_platform_common.h      |   1 +
>   .../media/platform/qcom/iris/iris_platform_gen2.c  | 106 ++++
>   .../media/platform/qcom/iris/iris_platform_milos.h | 655 +++++++++++++++++++++
>   drivers/media/platform/qcom/iris/iris_probe.c      |   4 +
>   6 files changed, 1017 insertions(+)
> ---
> base-commit: 591cd656a1bf5ea94a222af5ef2ee76df029c1d2
> change-id: 20260406-milos-iris-d1a854e4cb75
>
> Best regards,

^ permalink raw reply

* Re: [PATCH 2/2] arm64: dts: qcom: milos: Add QCrypto nodes
From: Kuldeep Singh @ 2026-04-09  4:15 UTC (permalink / raw)
  To: Alexander Koskovich, Thara Gopinath, Herbert Xu, David S. Miller,
	Rob Herring, Krzysztof Kozlowski, Conor Dooley, Bjorn Andersson,
	Konrad Dybcio
  Cc: linux-crypto, linux-arm-msm, devicetree, linux-kernel
In-Reply-To: <20260405-milos-qce-v1-2-6996fb0b8a9c@pm.me>



On 4/6/2026 7:40 AM, Alexander Koskovich wrote:
> Add the QCE and Crypto BAM DMA nodes.
> 
> Signed-off-by: Alexander Koskovich <akoskovich@pm.me>

Reviewed-by: Kuldeep Singh <kuldeep.singh@oss.qualcomm.com>

-- 
Regards
Kuldeep


^ permalink raw reply

* Re: [PATCH 2/2] arm64: dts: qcom: eliza: Add QCE crypto
From: Kuldeep Singh @ 2026-04-09  4:08 UTC (permalink / raw)
  To: Krzysztof Kozlowski, Thara Gopinath, Herbert Xu, David S. Miller,
	Rob Herring, Krzysztof Kozlowski, Conor Dooley, Bjorn Andersson,
	Konrad Dybcio
  Cc: linux-arm-msm, linux-crypto, devicetree, linux-kernel
In-Reply-To: <20260407-crypto-qcom-eliza-v1-2-40f61a1454a2@oss.qualcomm.com>

On 4/7/2026 7:21 PM, Krzysztof Kozlowski wrote:
> Add nodes for the BAM DAM and QCE crypto engine.
> 
> Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@oss.qualcomm.com>

Reviewed-by: Kuldeep Singh <kuldeep.singh@oss.qualcomm.com>

-- 
Regards
Kuldeep


^ permalink raw reply

* [PATCH] of: unittest: fix use-after-free in testdrv_probe()
From: Wentao Liang @ 2026-04-09  3:48 UTC (permalink / raw)
  To: robh, saravanak; +Cc: devicetree, linux-kernel, Wentao Liang, stable

The function testdrv_probe() retrieves the device_node from the PCI
device, applies an overlay, and then immediately calls of_node_put(dn).
This releases the reference held by the PCI core, potentially freeing
the node if the reference count drops to zero. Later, the same freed
pointer 'dn' is passed to of_platform_default_populate(), leading to a
use-after-free.

The reference to pdev->dev.of_node is owned by the device model and
should not be released by the driver. Remove the erroneous of_node_put()
to prevent premature freeing.

Fixes: 26409dd04589 ("of: unittest: Add pci_dt_testdrv pci driver")
Cc: stable@vger.kernel.org
Signed-off-by: Wentao Liang <vulab@iscas.ac.cn>
---
 drivers/of/unittest.c | 1 -
 1 file changed, 1 deletion(-)

diff --git a/drivers/of/unittest.c b/drivers/of/unittest.c
index eae7ebdf5130..4078569a0f96 100644
--- a/drivers/of/unittest.c
+++ b/drivers/of/unittest.c
@@ -4317,7 +4317,6 @@ static int testdrv_probe(struct pci_dev *pdev, const struct pci_device_id *id)
 
 	size = info->dtbo_end - info->dtbo_begin;
 	ret = of_overlay_fdt_apply(info->dtbo_begin, size, &ovcs_id, dn);
-	of_node_put(dn);
 	if (ret)
 		return ret;
 
-- 
2.34.1


^ permalink raw reply related

* Re: [PATCH v10 0/3] riscv: dts: spacemit: Add PMIC regulators usb pcie
From: Yixun Lan @ 2026-04-09  3:39 UTC (permalink / raw)
  To: Han Gao
  Cc: Rob Herring, Krzysztof Kozlowski, Conor Dooley, Paul Walmsley,
	Palmer Dabbelt, Albert Ou, Alexandre Ghiti, Chukun Pan,
	devicetree, linux-riscv, spacemit, linux-kernel, Han Gao
In-Reply-To: <cover.1775575436.git.gaohan@iscas.ac.cn>

Hi Han,

On 23:28 Tue 07 Apr     , Han Gao wrote:
> Changes in v10:
>  - patch 3:
>    add vin-supply in pcie_vcc3v3
>    reorder vcc5v0_usb30
>    remove vpcie3v3-supply form pcie1
>  - Link to v9: https://lore.kernel.org/linux-riscv/cover.1775417019.git.gaohan@iscas.ac.cn
You should keep all ChangeLog versions, which easy for people to review
backwards, but this isn't a big problem..

> 
> Han Gao (3):
>   riscv: dts: spacemit: Enable i2c8 adapter for OrangePi RV2
>   riscv: dts: spacemit: Define the P1 PMIC regulators for OrangePi RV2
>   riscv: dts: spacemit: Enable USB3.0/PCIe on OrangePi RV2
> 
>  .../boot/dts/spacemit/k1-orangepi-rv2.dts     | 217 ++++++++++++++++++
>  1 file changed, 217 insertions(+)
> 
> 
> base-commit: 6de23f81a5e08be8fbf5e8d7e9febc72a5b5f27f
> prerequisite-patch-id: ef6e9c7b5854d0c08066b72f9a7868db8c2140eb
> prerequisite-patch-id: cfe3800f8c791ec4c63e070af9628e88e0fc31b9
> prerequisite-patch-id: b76493e625ae257c8adcd67874178458420e4d47
> prerequisite-patch-id: 88e01dc92c83bd88ddeb78891d3088209fed8d6b
> prerequisite-patch-id: 60336d10ab8322c70596d0f046b6b5c54bb24b54
> prerequisite-patch-id: 68c4d869548687dc115dd91e2ffb8f4c11482d86
> prerequisite-patch-id: fdadcf964c2cb3406160edb579d99a8d5695f8e6
> prerequisite-patch-id: 73b9e745338b0499b849fa4f7f9508987ab39a59
> prerequisite-patch-id: cd26770c2160c3c31a406bd8a6b01ab666180ae0
> prerequisite-patch-id: e5dfddc32cefae195692da8b80e19adf086e4ad7
> prerequisite-patch-id: 7fd53cbe4977598f26148a4bb1cf692bbdb79a09
> prerequisite-patch-id: 96ebac57bb29619b97fe95422206a685825618e9
> prerequisite-patch-id: 00fac16b52f60383db3140e2885f3f7f8d14dd1a
> prerequisite-patch-id: 3b7a60047b922c48e93599f621cb738856f42354
> prerequisite-patch-id: 275c030b963be05dd1041451f539a130ce614277
> prerequisite-patch-id: 93963424b0871e64276af0e0b2199b52e29b4603
> prerequisite-patch-id: 8383188b1c01ed6280629faaa29c37d699ade241
> prerequisite-patch-id: 5f8126b912b924d63d4a1e0c5eb42d212eb0d369
> prerequisite-patch-id: e80af628a2e0b5f2eeb3cb1b5e7133d08bdd2c4e
> prerequisite-patch-id: 0234a6dca15eb91f98a45a46604ce5b4935048a5
I beliew all dependencies are queued already, and those "prerequisite-patch-id"
are rather hard for people to review (I know it's b4 do this conversion),
I would prefer listing them directly in the cover letter

Anyway, I'm ok with this version, so here

Reviewed-by: Yixun Lan <dlan@kernel.org>

-- 
Yixun Lan (dlan)

^ permalink raw reply


This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox