* Re: [PATCH v2 0/2] PCI: dwc: Add multi-port controller support
From: Manivannan Sadhasivam @ 2026-03-26 16:56 UTC (permalink / raw)
To: Sumit Kumar
Cc: Bjorn Helgaas, Jingoo Han, Lorenzo Pieralisi,
Krzysztof Wilczyński, Rob Herring, Krzysztof Kozlowski,
Alim Akhtar, Richard Zhu, Lucas Stach, Shawn Guo, Sascha Hauer,
Pengutronix Kernel Team, Fabio Estevam, Yue Wang, Neil Armstrong,
Kevin Hilman, Jerome Brunet, Martin Blumenstingl, Paul Walmsley,
Greentime Hu, Samuel Holland, Chuanhua Lei, Marek Vasut,
Yoshihiro Shimoda, Geert Uytterhoeven, Magnus Damm,
Pratyush Anand, Thierry Reding, Jonathan Hunter, linux-pci,
linux-kernel, linux-arm-kernel, linux-samsung-soc, imx,
linux-amlogic, linux-arm-msm, linux-renesas-soc, linux-tegra,
linux-riscv
In-Reply-To: <20260305-dt-parser-v2-0-85836db8dc06@oss.qualcomm.com>
On Thu, Mar 05, 2026 at 11:50:35AM +0530, Sumit Kumar wrote:
> This series adds support for multi-port PCIe controllers in the DesignWare
> driver. Currently, the driver only supports a single Root Port with
> controller-level properties, which doesn't work for multi-port controllers
> where each port may have different configurations.
>
> This series introduces a per-port structure and parsing API that allows
> each Root Port to be configured independently via pcie@N child nodes in
> device tree, while maintaining backward compatibility with existing
> single-port bindings.
>
This patch touches multiple host controller drivers. I'd appreciate if the
platform maintainers could test this series and give their tested-by tag to make
sure we don't regress.
- Mani
> Signed-off-by: Sumit Kumar <sumit.kumar@oss.qualcomm.com>
> ---
> Changes in v2:
> - Fix error code preservation in dw_pcie_resume_noirq() to return actual
> error from dw_pcie_wait_for_link() instead of hardcoded -ETIMEDOUT (Mani).
> - Initialize ret variable to -ENOENT in dw_pcie_parse_root_ports() (Mani).
> - dw_pcie_host_init(): Remove -ENOENT error skipping to make parsing
> failures fatal for now, add TODO comment about making properties
> optional later (Mani).
> - Link to v1: https://lore.kernel.org/r/20260105-dt-parser-v1-0-b11c63cb5e2c@oss.qualcomm.com
>
> ---
> Sumit Kumar (2):
> PCI: API changes for multi-port controller support
> PCI: dwc: Add multi-port controller support
>
> drivers/pci/controller/dwc/pci-exynos.c | 4 +-
> drivers/pci/controller/dwc/pci-imx6.c | 15 +-
> drivers/pci/controller/dwc/pci-meson.c | 1 -
> drivers/pci/controller/dwc/pcie-designware-host.c | 175 ++++++++++++++++++----
> drivers/pci/controller/dwc/pcie-designware.c | 32 ++--
> drivers/pci/controller/dwc/pcie-designware.h | 17 ++-
> drivers/pci/controller/dwc/pcie-fu740.c | 6 +-
> drivers/pci/controller/dwc/pcie-intel-gw.c | 13 +-
> drivers/pci/controller/dwc/pcie-qcom-common.c | 5 +-
> drivers/pci/controller/dwc/pcie-qcom-ep.c | 4 +-
> drivers/pci/controller/dwc/pcie-qcom.c | 4 +-
> drivers/pci/controller/dwc/pcie-rcar-gen4.c | 13 +-
> drivers/pci/controller/dwc/pcie-spear13xx.c | 5 +-
> drivers/pci/controller/dwc/pcie-tegra194.c | 4 +-
> drivers/pci/of.c | 6 +-
> drivers/pci/pci.h | 2 +
> 16 files changed, 232 insertions(+), 74 deletions(-)
> ---
> base-commit: 097a6c336d0080725c626fda118ecfec448acd0f
> change-id: 20251010-dt-parser-98b50ce18fc1
>
> Best regards,
> --
> Sumit Kumar <sumit.kumar@oss.qualcomm.com>
>
--
மணிவண்ணன் சதாசிவம்
^ permalink raw reply
* Re: [PATCH v9 1/5] PCI: Add pcie_get_link_speed() helper for safe array access
From: Manivannan Sadhasivam @ 2026-03-26 17:40 UTC (permalink / raw)
To: Hans Zhang, bhelgaas, helgaas
Cc: lpieralisi, jingoohan1, kwilczynski, florian.fainelli, jim2101024,
robh, ilpo.jarvinen, linux-arm-msm, linux-arm-kernel,
linux-renesas-soc, claudiu.beznea.uj, linux-mediatek, linux-tegra,
linux-omap, bcm-kernel-feedback-list, linux-pci, linux-kernel,
shawn.lin
In-Reply-To: <20260313165522.123518-2-18255117159@163.com>
On Sat, Mar 14, 2026 at 12:55:18AM +0800, Hans Zhang wrote:
> The pcie_link_speed[] array is indexed by PCIe generation numbers
> (1 = 2.5 GT/s, 2 = 5 GT/s, ...). Several drivers use it directly,
> which can lead to out-of-bounds accesses if an invalid generation
> number is used.
>
> Introduce a helper function pcie_get_link_speed() that returns the
> corresponding enum pci_bus_speed value for a given generation number,
> or PCI_SPEED_UNKNOWN if the generation is out of range. This will
> allow us to safely handle invalid values after the range check is
> removed from of_pci_get_max_link_speed().
>
Bjorn: Could you please take a look at this patch and ack if looks good? Rest of
the patches look good to me (I might squash patch 5 with 4 while applying).
- Mani
> Signed-off-by: Hans Zhang <18255117159@163.com>
> ---
> drivers/pci/pci.h | 2 ++
> drivers/pci/probe.c | 16 ++++++++++++++++
> 2 files changed, 18 insertions(+)
>
> diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h
> index 13d998fbacce..409aca7d737a 100644
> --- a/drivers/pci/pci.h
> +++ b/drivers/pci/pci.h
> @@ -108,6 +108,8 @@ struct pcie_tlp_log;
> PCI_EXP_DEVCTL_FERE | PCI_EXP_DEVCTL_URRE)
>
> extern const unsigned char pcie_link_speed[];
> +unsigned char pcie_get_link_speed(unsigned int speed);
> +
> extern bool pci_early_dump;
>
> extern struct mutex pci_rescan_remove_lock;
> diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
> index bccc7a4bdd79..d6592898330c 100644
> --- a/drivers/pci/probe.c
> +++ b/drivers/pci/probe.c
> @@ -783,6 +783,22 @@ const unsigned char pcie_link_speed[] = {
> };
> EXPORT_SYMBOL_GPL(pcie_link_speed);
>
> +/**
> + * pcie_link_speed_value - Get speed value from PCIe generation number
> + * @speed: PCIe speed (1-based: 1 = 2.5GT, 2 = 5GT, ...)
> + *
> + * Returns the speed value (e.g., PCIE_SPEED_2_5GT) if @speed is valid,
> + * otherwise returns PCI_SPEED_UNKNOWN.
> + */
> +unsigned char pcie_get_link_speed(unsigned int speed)
> +{
> + if (speed >= ARRAY_SIZE(pcie_link_speed))
> + return PCI_SPEED_UNKNOWN;
> +
> + return pcie_link_speed[speed];
> +}
> +EXPORT_SYMBOL_GPL(pcie_get_link_speed);
> +
> const char *pci_speed_string(enum pci_bus_speed speed)
> {
> /* Indexed by the pci_bus_speed enum */
> --
> 2.34.1
>
--
மணிவண்ணன் சதாசிவம்
^ permalink raw reply
* Re: [PATCH v9 1/5] PCI: Add pcie_get_link_speed() helper for safe array access
From: Bjorn Helgaas @ 2026-03-26 18:09 UTC (permalink / raw)
To: Hans Zhang
Cc: lpieralisi, jingoohan1, mani, kwilczynski, bhelgaas,
florian.fainelli, jim2101024, robh, ilpo.jarvinen, linux-arm-msm,
linux-arm-kernel, linux-renesas-soc, claudiu.beznea.uj,
linux-mediatek, linux-tegra, linux-omap, bcm-kernel-feedback-list,
linux-pci, linux-kernel, shawn.lin
In-Reply-To: <20260313165522.123518-2-18255117159@163.com>
On Sat, Mar 14, 2026 at 12:55:18AM +0800, Hans Zhang wrote:
> The pcie_link_speed[] array is indexed by PCIe generation numbers
> (1 = 2.5 GT/s, 2 = 5 GT/s, ...). Several drivers use it directly,
> which can lead to out-of-bounds accesses if an invalid generation
> number is used.
>
> Introduce a helper function pcie_get_link_speed() that returns the
> corresponding enum pci_bus_speed value for a given generation number,
> or PCI_SPEED_UNKNOWN if the generation is out of range. This will
> allow us to safely handle invalid values after the range check is
> removed from of_pci_get_max_link_speed().
>
> Signed-off-by: Hans Zhang <18255117159@163.com>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
> ---
> drivers/pci/pci.h | 2 ++
> drivers/pci/probe.c | 16 ++++++++++++++++
> 2 files changed, 18 insertions(+)
>
> diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h
> index 13d998fbacce..409aca7d737a 100644
> --- a/drivers/pci/pci.h
> +++ b/drivers/pci/pci.h
> @@ -108,6 +108,8 @@ struct pcie_tlp_log;
> PCI_EXP_DEVCTL_FERE | PCI_EXP_DEVCTL_URRE)
>
> extern const unsigned char pcie_link_speed[];
> +unsigned char pcie_get_link_speed(unsigned int speed);
> +
> extern bool pci_early_dump;
>
> extern struct mutex pci_rescan_remove_lock;
> diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
> index bccc7a4bdd79..d6592898330c 100644
> --- a/drivers/pci/probe.c
> +++ b/drivers/pci/probe.c
> @@ -783,6 +783,22 @@ const unsigned char pcie_link_speed[] = {
> };
> EXPORT_SYMBOL_GPL(pcie_link_speed);
>
> +/**
> + * pcie_link_speed_value - Get speed value from PCIe generation number
> + * @speed: PCIe speed (1-based: 1 = 2.5GT, 2 = 5GT, ...)
> + *
> + * Returns the speed value (e.g., PCIE_SPEED_2_5GT) if @speed is valid,
> + * otherwise returns PCI_SPEED_UNKNOWN.
> + */
> +unsigned char pcie_get_link_speed(unsigned int speed)
> +{
> + if (speed >= ARRAY_SIZE(pcie_link_speed))
> + return PCI_SPEED_UNKNOWN;
> +
> + return pcie_link_speed[speed];
> +}
> +EXPORT_SYMBOL_GPL(pcie_get_link_speed);
> +
> const char *pci_speed_string(enum pci_bus_speed speed)
> {
> /* Indexed by the pci_bus_speed enum */
> --
> 2.34.1
>
^ permalink raw reply
* Re: [PATCH v9 1/5] PCI: Add pcie_get_link_speed() helper for safe array access
From: Bjorn Helgaas @ 2026-03-26 18:16 UTC (permalink / raw)
To: Hans Zhang
Cc: lpieralisi, jingoohan1, mani, kwilczynski, bhelgaas,
florian.fainelli, jim2101024, robh, ilpo.jarvinen, linux-arm-msm,
linux-arm-kernel, linux-renesas-soc, claudiu.beznea.uj,
linux-mediatek, linux-tegra, linux-omap, bcm-kernel-feedback-list,
linux-pci, linux-kernel, shawn.lin
In-Reply-To: <20260313165522.123518-2-18255117159@163.com>
On Sat, Mar 14, 2026 at 12:55:18AM +0800, Hans Zhang wrote:
> The pcie_link_speed[] array is indexed by PCIe generation numbers
> (1 = 2.5 GT/s, 2 = 5 GT/s, ...). Several drivers use it directly,
> which can lead to out-of-bounds accesses if an invalid generation
> number is used.
>
> Introduce a helper function pcie_get_link_speed() that returns the
> corresponding enum pci_bus_speed value for a given generation number,
> or PCI_SPEED_UNKNOWN if the generation is out of range. This will
> allow us to safely handle invalid values after the range check is
> removed from of_pci_get_max_link_speed().
>
> Signed-off-by: Hans Zhang <18255117159@163.com>
> ---
> drivers/pci/pci.h | 2 ++
> drivers/pci/probe.c | 16 ++++++++++++++++
> 2 files changed, 18 insertions(+)
>
> diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h
> index 13d998fbacce..409aca7d737a 100644
> --- a/drivers/pci/pci.h
> +++ b/drivers/pci/pci.h
> @@ -108,6 +108,8 @@ struct pcie_tlp_log;
> PCI_EXP_DEVCTL_FERE | PCI_EXP_DEVCTL_URRE)
>
> extern const unsigned char pcie_link_speed[];
> +unsigned char pcie_get_link_speed(unsigned int speed);
> +
> extern bool pci_early_dump;
>
> extern struct mutex pci_rescan_remove_lock;
> diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
> index bccc7a4bdd79..d6592898330c 100644
> --- a/drivers/pci/probe.c
> +++ b/drivers/pci/probe.c
> @@ -783,6 +783,22 @@ const unsigned char pcie_link_speed[] = {
> };
> EXPORT_SYMBOL_GPL(pcie_link_speed);
>
> +/**
> + * pcie_link_speed_value - Get speed value from PCIe generation number
Wrong name here (pcie_link_speed_value vs pcie_get_link_speed)
(pointed out by Sashiko).
> + * @speed: PCIe speed (1-based: 1 = 2.5GT, 2 = 5GT, ...)
> + *
> + * Returns the speed value (e.g., PCIE_SPEED_2_5GT) if @speed is valid,
> + * otherwise returns PCI_SPEED_UNKNOWN.
> + */
> +unsigned char pcie_get_link_speed(unsigned int speed)
Sashiko also pointed out that the commit log says this returns "enum
pci_bus_speed", while here we return unsigned char (which is also the
type of pcie_link_speed[x]).
https://sashiko.dev/#/patchset/20260313165522.123518-1-18255117159%40163.com
> +{
> + if (speed >= ARRAY_SIZE(pcie_link_speed))
> + return PCI_SPEED_UNKNOWN;
> +
> + return pcie_link_speed[speed];
> +}
> +EXPORT_SYMBOL_GPL(pcie_get_link_speed);
> +
> const char *pci_speed_string(enum pci_bus_speed speed)
> {
> /* Indexed by the pci_bus_speed enum */
> --
> 2.34.1
>
^ permalink raw reply
* Re: [PATCH v9 0/5] PCI: of: Remove max-link-speed generation validation
From: Manivannan Sadhasivam @ 2026-03-26 18:29 UTC (permalink / raw)
To: lpieralisi, jingoohan1, kwilczynski, bhelgaas, helgaas,
florian.fainelli, jim2101024, Hans Zhang
Cc: robh, ilpo.jarvinen, linux-arm-msm, linux-arm-kernel,
linux-renesas-soc, claudiu.beznea.uj, linux-mediatek, linux-tegra,
linux-omap, bcm-kernel-feedback-list, linux-pci, linux-kernel,
shawn.lin
In-Reply-To: <20260313165522.123518-1-18255117159@163.com>
On Sat, 14 Mar 2026 00:55:17 +0800, Hans Zhang wrote:
> This series moves the validation from the common OF function to the
> individual PCIe controller drivers. To protect against out-of-bounds
> accesses to the pcie_link_speed[] array, we first introduce a helper
> function pcie_get_link_speed() that safely returns the speed value
> (or PCI_SPEED_UNKNOWN) for a given generation number.
>
> Then all direct uses of pcie_link_speed[] as an array are converted to
> use the new helper, ensuring that even if an invalid generation number
> reaches those code paths, no out-of-bounds access occurs.
>
> [...]
Applied, thanks!
[1/5] PCI: Add pcie_get_link_speed() helper for safe array access
commit: df61f4732adf9de5ad1f5e71b7670710c1597d18
[2/5] PCI: dwc: Use pcie_get_link_speed() helper for safe array access
commit: d884b0e51459175f17ddc52759ea4533bb752130
[3/5] PCI: j721e: Validate max-link-speed from DT
commit: 1542ac6d83d0b5706f45e2937de7b4f7b8c4831d
[4/5] PCI: controller: Validate max-link-speed
commit: d0cc5918a1d539344190cbb19fa3ae0e7b0dca1e
[5/5] PCI: of: Remove max-link-speed generation validation
commit: 15217c7015c0e1804925693c55d721aad8987e32
Best regards,
--
Manivannan Sadhasivam <mani@kernel.org>
^ permalink raw reply
* Re: [PATCH v9 1/5] PCI: Add pcie_get_link_speed() helper for safe array access
From: Manivannan Sadhasivam @ 2026-03-26 18:32 UTC (permalink / raw)
To: Bjorn Helgaas
Cc: Hans Zhang, lpieralisi, jingoohan1, kwilczynski, bhelgaas,
florian.fainelli, jim2101024, robh, ilpo.jarvinen, linux-arm-msm,
linux-arm-kernel, linux-renesas-soc, claudiu.beznea.uj,
linux-mediatek, linux-tegra, linux-omap, bcm-kernel-feedback-list,
linux-pci, linux-kernel, shawn.lin
In-Reply-To: <20260326181624.GA1331242@bhelgaas>
On Thu, Mar 26, 2026 at 01:16:24PM -0500, Bjorn Helgaas wrote:
> On Sat, Mar 14, 2026 at 12:55:18AM +0800, Hans Zhang wrote:
> > The pcie_link_speed[] array is indexed by PCIe generation numbers
> > (1 = 2.5 GT/s, 2 = 5 GT/s, ...). Several drivers use it directly,
> > which can lead to out-of-bounds accesses if an invalid generation
> > number is used.
> >
> > Introduce a helper function pcie_get_link_speed() that returns the
> > corresponding enum pci_bus_speed value for a given generation number,
> > or PCI_SPEED_UNKNOWN if the generation is out of range. This will
> > allow us to safely handle invalid values after the range check is
> > removed from of_pci_get_max_link_speed().
> >
> > Signed-off-by: Hans Zhang <18255117159@163.com>
> > ---
> > drivers/pci/pci.h | 2 ++
> > drivers/pci/probe.c | 16 ++++++++++++++++
> > 2 files changed, 18 insertions(+)
> >
> > diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h
> > index 13d998fbacce..409aca7d737a 100644
> > --- a/drivers/pci/pci.h
> > +++ b/drivers/pci/pci.h
> > @@ -108,6 +108,8 @@ struct pcie_tlp_log;
> > PCI_EXP_DEVCTL_FERE | PCI_EXP_DEVCTL_URRE)
> >
> > extern const unsigned char pcie_link_speed[];
> > +unsigned char pcie_get_link_speed(unsigned int speed);
> > +
> > extern bool pci_early_dump;
> >
> > extern struct mutex pci_rescan_remove_lock;
> > diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
> > index bccc7a4bdd79..d6592898330c 100644
> > --- a/drivers/pci/probe.c
> > +++ b/drivers/pci/probe.c
> > @@ -783,6 +783,22 @@ const unsigned char pcie_link_speed[] = {
> > };
> > EXPORT_SYMBOL_GPL(pcie_link_speed);
> >
> > +/**
> > + * pcie_link_speed_value - Get speed value from PCIe generation number
>
> Wrong name here (pcie_link_speed_value vs pcie_get_link_speed)
> (pointed out by Sashiko).
>
Noticed this one while applying.
> > + * @speed: PCIe speed (1-based: 1 = 2.5GT, 2 = 5GT, ...)
> > + *
> > + * Returns the speed value (e.g., PCIE_SPEED_2_5GT) if @speed is valid,
> > + * otherwise returns PCI_SPEED_UNKNOWN.
> > + */
> > +unsigned char pcie_get_link_speed(unsigned int speed)
>
> Sashiko also pointed out that the commit log says this returns "enum
> pci_bus_speed", while here we return unsigned char (which is also the
> type of pcie_link_speed[x]).
>
> https://sashiko.dev/#/patchset/20260313165522.123518-1-18255117159%40163.com
>
This one I didn't, but fixed now, thanks!
- Mani
--
மணிவண்ணன் சதாசிவம்
^ permalink raw reply
* Re: [PATCHv2] firmware/tegra: add COMPILE_TEST
From: kernel test robot @ 2026-03-26 19:35 UTC (permalink / raw)
To: Rosen Penev, linux-tegra
Cc: oe-kbuild-all, Michael Turquette, Stephen Boyd, Thierry Reding,
Jonathan Hunter, linux-clk, linux-kernel
In-Reply-To: <20260324015722.12507-1-rosenp@gmail.com>
Hi Rosen,
kernel test robot noticed the following build errors:
[auto build test ERROR on next-20260325]
[cannot apply to tegra/for-next clk/clk-next drm-tegra/drm/tegra/for-next v7.0-rc5 v7.0-rc4 v7.0-rc3 linus/master v7.0-rc5]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Rosen-Penev/firmware-tegra-add-COMPILE_TEST/20260326-124230
base: next-20260325
patch link: https://lore.kernel.org/r/20260324015722.12507-1-rosenp%40gmail.com
patch subject: [PATCHv2] firmware/tegra: add COMPILE_TEST
config: parisc-allnoconfig (https://download.01.org/0day-ci/archive/20260327/202603270355.rxjFONcV-lkp@intel.com/config)
compiler: hppa-linux-gcc (GCC) 15.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260327/202603270355.rxjFONcV-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202603270355.rxjFONcV-lkp@intel.com/
All errors (new ones prefixed by >>):
hppa-linux-ld: drivers/clk/tegra/clk.o: in function `tegra_register_devclks':
>> (.text+0x348): undefined reference to `clk_register_clkdev'
>> hppa-linux-ld: (.text+0x398): undefined reference to `__clk_get_name'
>> hppa-linux-ld: (.text+0x3a8): undefined reference to `clk_register_clkdev'
hppa-linux-ld: drivers/clk/tegra/clk.o: in function `tegra_clk_dev_register':
>> (.text+0x438): undefined reference to `clk_register'
hppa-linux-ld: drivers/clk/tegra/clk.o: in function `tegra_init_dup_clks':
>> (.init.text+0x114): undefined reference to `clkdev_add'
hppa-linux-ld: drivers/clk/tegra/clk-tegra-audio.o: in function `tegra_audio_sync_clk_init.constprop.0':
>> (.init.text+0x90): undefined reference to `clk_register_mux_table'
>> hppa-linux-ld: (.init.text+0xd0): undefined reference to `clk_register_gate'
hppa-linux-ld: drivers/clk/tegra/clk-tegra-audio.o: in function `tegra_audio_clk_init':
>> (.init.text+0x348): undefined reference to `clk_register_fixed_factor'
>> hppa-linux-ld: drivers/clk/tegra/clk-tegra-periph.o:(.data+0x10c): undefined reference to `clk_mux_ops'
hppa-linux-ld: drivers/clk/tegra/clk-tegra-periph.o:(.data+0x1a4): undefined reference to `clk_mux_ops'
hppa-linux-ld: drivers/clk/tegra/clk-tegra-periph.o:(.data+0x23c): undefined reference to `clk_mux_ops'
hppa-linux-ld: drivers/clk/tegra/clk-tegra-periph.o:(.data+0x2d4): undefined reference to `clk_mux_ops'
hppa-linux-ld: drivers/clk/tegra/clk-tegra-periph.o:(.data+0x36c): undefined reference to `clk_mux_ops'
hppa-linux-ld: drivers/clk/tegra/clk-tegra-periph.o:(.data+0x404): more undefined references to `clk_mux_ops' follow
hppa-linux-ld: drivers/clk/tegra/clk-tegra-periph.o: in function `init_pllp':
>> (.init.text+0x7c): undefined reference to `clk_register_clkdev'
hppa-linux-ld: (.init.text+0x204): undefined reference to `clk_register_gate'
hppa-linux-ld: (.init.text+0x24c): undefined reference to `clk_register_gate'
>> hppa-linux-ld: (.init.text+0x260): undefined reference to `clk_register_clkdev'
hppa-linux-ld: drivers/clk/tegra/clk-tegra-fixed.o: in function `tegra_osc_clk_init':
>> (.init.text+0x9c): undefined reference to `clk_register_fixed_rate'
>> hppa-linux-ld: (.init.text+0xd8): undefined reference to `clk_register_fixed_factor'
hppa-linux-ld: (.init.text+0x114): undefined reference to `clk_register_fixed_factor'
hppa-linux-ld: (.init.text+0x150): undefined reference to `clk_register_fixed_factor'
hppa-linux-ld: (.init.text+0x194): undefined reference to `clk_register_fixed_factor'
hppa-linux-ld: drivers/clk/tegra/clk-tegra-fixed.o: in function `tegra_fixed_clk_init':
(.init.text+0x20c): undefined reference to `clk_register_fixed_rate'
hppa-linux-ld: drivers/clk/tegra/clk-tegra-super-gen4.o: in function `tegra_sclk_init':
>> (.init.text+0xb8): undefined reference to `clk_register_divider_table'
>> hppa-linux-ld: (.init.text+0x164): undefined reference to `clk_register_divider_table'
hppa-linux-ld: (.init.text+0x194): undefined reference to `clk_register_gate'
hppa-linux-ld: (.init.text+0x1ec): undefined reference to `clk_register_divider_table'
hppa-linux-ld: (.init.text+0x21c): undefined reference to `clk_register_gate'
hppa-linux-ld: drivers/clk/tegra/clk-audio-sync.o: in function `tegra_clk_register_sync_source':
(.text+0x13c): undefined reference to `clk_register'
hppa-linux-ld: drivers/clk/tegra/clk-dfll.o: in function `tegra_dfll_unregister':
>> (.text+0x1d8): undefined reference to `clk_unregister'
hppa-linux-ld: drivers/clk/tegra/clk-divider.o: in function `clk_divider_restore_context':
>> (.text+0x2c8): undefined reference to `clk_hw_get_parent'
>> hppa-linux-ld: (.text+0x2d0): undefined reference to `clk_hw_get_rate'
hppa-linux-ld: (.text+0x2dc): undefined reference to `clk_hw_get_rate'
hppa-linux-ld: drivers/clk/tegra/clk-divider.o: in function `tegra_clk_register_divider':
(.text+0x3d0): undefined reference to `clk_register'
hppa-linux-ld: drivers/clk/tegra/clk-divider.o: in function `tegra_clk_register_mc':
>> (.text+0x4c4): undefined reference to `clk_register_divider_table'
hppa-linux-ld: drivers/clk/tegra/clk-periph.o: in function `clk_periph_restore_context':
>> (.text+0x254): undefined reference to `clk_hw_get_parent_index'
hppa-linux-ld: drivers/clk/tegra/clk-periph.o: in function `tegra_clk_register_periph':
(.text+0x3bc): undefined reference to `clk_register'
hppa-linux-ld: (.text+0x420): undefined reference to `clk_register'
hppa-linux-ld: drivers/clk/tegra/clk-periph.o: in function `tegra_clk_register_periph_nodiv':
(.text+0x528): undefined reference to `clk_register'
hppa-linux-ld: drivers/clk/tegra/clk-periph.o: in function `tegra_clk_register_periph_data':
(.text+0x648): undefined reference to `clk_register'
hppa-linux-ld: (.text+0x6b0): undefined reference to `clk_register'
hppa-linux-ld: drivers/clk/tegra/clk-periph.o:(.rodata+0x94): undefined reference to `clk_hw_determine_rate_no_reparent'
hppa-linux-ld: drivers/clk/tegra/clk-periph-fixed.o: in function `tegra_clk_register_periph_fixed':
(.text+0x250): undefined reference to `clk_register'
hppa-linux-ld: drivers/clk/tegra/clk-periph-gate.o: in function `tegra_clk_register_periph_gate':
(.text+0x35c): undefined reference to `clk_register'
hppa-linux-ld: drivers/clk/tegra/clk-pll.o: in function `clk_pll_determine_rate':
(.text+0x6c4): undefined reference to `clk_hw_get_rate'
hppa-linux-ld: drivers/clk/tegra/clk-pll.o: in function `clk_pll_wait_for_lock':
(.text+0x7c0): undefined reference to `clk_hw_get_name'
hppa-linux-ld: drivers/clk/tegra/clk-pll.o: in function `clk_pllu_enable':
(.text+0xed0): undefined reference to `clk_hw_get_parent'
hppa-linux-ld: (.text+0xed8): undefined reference to `clk_hw_get_parent'
hppa-linux-ld: (.text+0xee8): undefined reference to `clk_hw_get_rate'
hppa-linux-ld: drivers/clk/tegra/clk-pll.o: in function `clk_pll_recalc_rate':
(.text+0x17c4): undefined reference to `clk_hw_get_name'
hppa-linux-ld: (.text+0x1818): undefined reference to `clk_hw_get_name'
hppa-linux-ld: drivers/clk/tegra/clk-pll.o: in function `clk_pll_set_rate':
(.text+0x1d54): undefined reference to `clk_hw_get_name'
hppa-linux-ld: (.text+0x1d84): undefined reference to `clk_hw_get_name'
hppa-linux-ld: drivers/clk/tegra/clk-pll.o: in function `tegra_clk_pll_restore_context':
(.text+0x1dcc): undefined reference to `clk_hw_get_parent'
hppa-linux-ld: (.text+0x1dd4): undefined reference to `clk_hw_get_rate'
hppa-linux-ld: (.text+0x1de0): undefined reference to `clk_hw_get_rate'
hppa-linux-ld: (.text+0x1e20): undefined reference to `__clk_get_enable_count'
hppa-linux-ld: drivers/clk/tegra/clk-pll.o: in function `clk_plle_enable':
(.text+0x1ed0): undefined reference to `clk_hw_get_parent'
hppa-linux-ld: (.text+0x1ed8): undefined reference to `clk_hw_get_rate'
hppa-linux-ld: drivers/clk/tegra/clk-pll-out.o: in function `tegra_clk_pll_out_restore_context':
(.text+0x1cc): undefined reference to `__clk_get_enable_count'
hppa-linux-ld: drivers/clk/tegra/clk-pll-out.o: in function `tegra_clk_register_pll_out':
(.text+0x2cc): undefined reference to `clk_register'
hppa-linux-ld: drivers/clk/tegra/clk-sdmmc-mux.o: in function `clk_sdmmc_mux_get_parent':
(.text+0x248): undefined reference to `clk_hw_get_num_parents'
hppa-linux-ld: drivers/clk/tegra/clk-sdmmc-mux.o: in function `clk_sdmmc_mux_restore_context':
(.text+0x48c): undefined reference to `clk_hw_get_parent'
hppa-linux-ld: (.text+0x494): undefined reference to `clk_hw_get_rate'
hppa-linux-ld: (.text+0x4a0): undefined reference to `clk_hw_get_rate'
hppa-linux-ld: (.text+0x4ac): undefined reference to `clk_hw_get_parent_index'
hppa-linux-ld: drivers/clk/tegra/clk-sdmmc-mux.o: in function `tegra_clk_register_sdmmc_mux_div':
(.text+0x5f4): undefined reference to `clk_register'
hppa-linux-ld: drivers/clk/tegra/clk-super.o: in function `clk_super_restore_context':
(.text+0x38c): undefined reference to `clk_hw_get_parent_index'
hppa-linux-ld: drivers/clk/tegra/clk-super.o: in function `clk_super_mux_restore_context':
(.text+0x408): undefined reference to `clk_hw_get_parent_index'
hppa-linux-ld: drivers/clk/tegra/clk-super.o: in function `tegra_clk_register_super_clk':
(.text+0x658): undefined reference to `clk_register'
hppa-linux-ld: drivers/clk/tegra/clk-super.o:(.rodata+0x94): undefined reference to `clk_hw_determine_rate_no_reparent'
hppa-linux-ld: drivers/clk/tegra/clk-tegra-super-cclk.o: in function `cclk_super_determine_rate':
(.text+0xe0): undefined reference to `clk_hw_get_parent_by_index'
hppa-linux-ld: (.text+0xf0): undefined reference to `clk_hw_get_parent_by_index'
hppa-linux-ld: (.text+0x10c): undefined reference to `clk_hw_get_rate'
hppa-linux-ld: (.text+0x184): undefined reference to `clk_hw_get_rate_range'
hppa-linux-ld: (.text+0x1b0): undefined reference to `clk_hw_round_rate'
hppa-linux-ld: drivers/clk/tegra/clk-tegra-super-cclk.o: in function `tegra_clk_register_super_cclk':
(.text+0x3c8): undefined reference to `clk_register'
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply
* Re: [PATCHv2] firmware/tegra: add COMPILE_TEST
From: kernel test robot @ 2026-03-26 19:35 UTC (permalink / raw)
To: Rosen Penev, linux-tegra
Cc: oe-kbuild-all, Michael Turquette, Stephen Boyd, Thierry Reding,
Jonathan Hunter, linux-clk, linux-kernel
In-Reply-To: <20260324015722.12507-1-rosenp@gmail.com>
Hi Rosen,
kernel test robot noticed the following build errors:
[auto build test ERROR on next-20260325]
[cannot apply to tegra/for-next clk/clk-next drm-tegra/drm/tegra/for-next v7.0-rc5 v7.0-rc4 v7.0-rc3 linus/master v7.0-rc5]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Rosen-Penev/firmware-tegra-add-COMPILE_TEST/20260326-124230
base: next-20260325
patch link: https://lore.kernel.org/r/20260324015722.12507-1-rosenp%40gmail.com
patch subject: [PATCHv2] firmware/tegra: add COMPILE_TEST
config: sparc-allnoconfig (https://download.01.org/0day-ci/archive/20260327/202603270305.aMVfb5Bs-lkp@intel.com/config)
compiler: sparc-linux-gcc (GCC) 15.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260327/202603270305.aMVfb5Bs-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202603270305.aMVfb5Bs-lkp@intel.com/
All errors (new ones prefixed by >>):
sparc-linux-ld: drivers/clk/tegra/clk.o: in function `tegra_register_devclks':
clk.c:(.text+0x4b0): undefined reference to `clk_register_clkdev'
>> sparc-linux-ld: clk.c:(.text+0x520): undefined reference to `__clk_get_name'
>> sparc-linux-ld: clk.c:(.text+0x530): undefined reference to `clk_register_clkdev'
sparc-linux-ld: drivers/clk/tegra/clk.o: in function `tegra_clk_dev_register':
clk.c:(.text+0x5fc): undefined reference to `clk_register'
>> sparc-linux-ld: clk.c:(.text+0x664): undefined reference to `clk_register'
sparc-linux-ld: drivers/clk/tegra/clk.o: in function `tegra_init_dup_clks':
clk.c:(.init.text+0x10c): undefined reference to `clkdev_add'
sparc-linux-ld: drivers/clk/tegra/clk.o: in function `tegra_add_of_provider':
clk.c:(.init.text+0x1a0): undefined reference to `of_clk_add_provider'
sparc-linux-ld: drivers/clk/tegra/clk-audio-sync.o: in function `tegra_clk_register_sync_source':
clk-audio-sync.c:(.text+0x128): undefined reference to `clk_register'
sparc-linux-ld: drivers/clk/tegra/clk-dfll.o: in function `tegra_dfll_unregister':
clk-dfll.c:(.text+0x19c): undefined reference to `of_clk_del_provider'
>> sparc-linux-ld: clk-dfll.c:(.text+0x1a4): undefined reference to `clk_unregister'
sparc-linux-ld: drivers/clk/tegra/clk-divider.o: in function `clk_divider_restore_context':
clk-divider.c:(.text+0x2c4): undefined reference to `clk_hw_get_parent'
>> sparc-linux-ld: clk-divider.c:(.text+0x2cc): undefined reference to `clk_hw_get_rate'
sparc-linux-ld: clk-divider.c:(.text+0x2d8): undefined reference to `clk_hw_get_rate'
sparc-linux-ld: drivers/clk/tegra/clk-divider.o: in function `tegra_clk_register_divider':
clk-divider.c:(.text+0x3b4): undefined reference to `clk_register'
sparc-linux-ld: drivers/clk/tegra/clk-divider.o: in function `tegra_clk_register_mc':
clk-divider.c:(.text+0x438): undefined reference to `clk_register_divider_table'
sparc-linux-ld: drivers/clk/tegra/clk-periph.o: in function `clk_periph_restore_context':
clk-periph.c:(.text+0x248): undefined reference to `clk_hw_get_parent_index'
sparc-linux-ld: drivers/clk/tegra/clk-periph.o: in function `tegra_clk_register_periph':
clk-periph.c:(.text+0x350): undefined reference to `clk_register'
>> sparc-linux-ld: clk-periph.c:(.text+0x3d4): undefined reference to `clk_register'
sparc-linux-ld: drivers/clk/tegra/clk-periph.o: in function `tegra_clk_register_periph_nodiv':
clk-periph.c:(.text+0x484): undefined reference to `clk_register'
sparc-linux-ld: drivers/clk/tegra/clk-periph.o: in function `tegra_clk_register_periph_data':
clk-periph.c:(.text+0x560): undefined reference to `clk_register'
sparc-linux-ld: clk-periph.c:(.text+0x5e4): undefined reference to `clk_register'
>> sparc-linux-ld: drivers/clk/tegra/clk-periph.o:(.rodata+0x94): undefined reference to `clk_hw_determine_rate_no_reparent'
sparc-linux-ld: drivers/clk/tegra/clk-periph-fixed.o: in function `tegra_clk_register_periph_fixed':
clk-periph-fixed.c:(.text+0x2fc): undefined reference to `clk_register'
sparc-linux-ld: drivers/clk/tegra/clk-periph-gate.o: in function `tegra_clk_register_periph_gate':
clk-periph-gate.c:(.text+0x448): undefined reference to `clk_register'
sparc-linux-ld: drivers/clk/tegra/clk-pll.o: in function `clk_pll_determine_rate':
clk-pll.c:(.text+0x764): undefined reference to `clk_hw_get_rate'
sparc-linux-ld: drivers/clk/tegra/clk-pll.o: in function `clk_pll_wait_for_lock':
clk-pll.c:(.text+0x860): undefined reference to `clk_hw_get_name'
sparc-linux-ld: drivers/clk/tegra/clk-pll.o: in function `clk_pllu_enable':
clk-pll.c:(.text+0x1244): undefined reference to `clk_hw_get_parent'
>> sparc-linux-ld: clk-pll.c:(.text+0x124c): undefined reference to `clk_hw_get_parent'
>> sparc-linux-ld: clk-pll.c:(.text+0x1260): undefined reference to `clk_hw_get_rate'
sparc-linux-ld: drivers/clk/tegra/clk-pll.o: in function `clk_pll_set_rate':
clk-pll.c:(.text+0x20d8): undefined reference to `clk_hw_get_name'
>> sparc-linux-ld: clk-pll.c:(.text+0x2110): undefined reference to `clk_hw_get_name'
sparc-linux-ld: drivers/clk/tegra/clk-pll.o: in function `tegra_clk_pll_restore_context':
clk-pll.c:(.text+0x2184): undefined reference to `clk_hw_get_parent'
sparc-linux-ld: clk-pll.c:(.text+0x218c): undefined reference to `clk_hw_get_rate'
sparc-linux-ld: clk-pll.c:(.text+0x2198): undefined reference to `clk_hw_get_rate'
>> sparc-linux-ld: clk-pll.c:(.text+0x21e4): undefined reference to `__clk_get_enable_count'
sparc-linux-ld: drivers/clk/tegra/clk-pll.o: in function `clk_pll_recalc_rate':
clk-pll.c:(.text+0x243c): undefined reference to `clk_hw_get_name'
sparc-linux-ld: clk-pll.c:(.text+0x248c): undefined reference to `clk_hw_get_name'
sparc-linux-ld: drivers/clk/tegra/clk-pll.o: in function `clk_plle_enable':
clk-pll.c:(.text+0x24f4): undefined reference to `clk_hw_get_parent'
sparc-linux-ld: clk-pll.c:(.text+0x24fc): undefined reference to `clk_hw_get_rate'
sparc-linux-ld: drivers/clk/tegra/clk-pll-out.o: in function `tegra_clk_pll_out_restore_context':
clk-pll-out.c:(.text+0x284): undefined reference to `__clk_get_enable_count'
sparc-linux-ld: drivers/clk/tegra/clk-pll-out.o: in function `tegra_clk_register_pll_out':
clk-pll-out.c:(.text+0x364): undefined reference to `clk_register'
sparc-linux-ld: drivers/clk/tegra/clk-sdmmc-mux.o: in function `clk_sdmmc_mux_get_parent':
clk-sdmmc-mux.c:(.text+0x244): undefined reference to `clk_hw_get_num_parents'
sparc-linux-ld: drivers/clk/tegra/clk-sdmmc-mux.o: in function `clk_sdmmc_mux_restore_context':
clk-sdmmc-mux.c:(.text+0x4c4): undefined reference to `clk_hw_get_parent'
>> sparc-linux-ld: clk-sdmmc-mux.c:(.text+0x4cc): undefined reference to `clk_hw_get_rate'
sparc-linux-ld: clk-sdmmc-mux.c:(.text+0x4d8): undefined reference to `clk_hw_get_rate'
>> sparc-linux-ld: clk-sdmmc-mux.c:(.text+0x4e4): undefined reference to `clk_hw_get_parent_index'
sparc-linux-ld: drivers/clk/tegra/clk-sdmmc-mux.o: in function `tegra_clk_register_sdmmc_mux_div':
clk-sdmmc-mux.c:(.text+0x5f8): undefined reference to `clk_register'
sparc-linux-ld: drivers/clk/tegra/clk-super.o: in function `clk_super_restore_context':
clk-super.c:(.text+0x404): undefined reference to `clk_hw_get_parent_index'
sparc-linux-ld: drivers/clk/tegra/clk-super.o: in function `clk_super_mux_restore_context':
clk-super.c:(.text+0x484): undefined reference to `clk_hw_get_parent_index'
sparc-linux-ld: drivers/clk/tegra/clk-super.o: in function `tegra_clk_register_super_clk':
clk-super.c:(.text+0x620): undefined reference to `clk_register'
>> sparc-linux-ld: drivers/clk/tegra/clk-super.o:(.rodata+0x94): undefined reference to `clk_hw_determine_rate_no_reparent'
sparc-linux-ld: drivers/clk/tegra/clk-tegra-audio.o: in function `tegra_audio_sync_clk_init.constprop.0':
clk-tegra-audio.c:(.init.text+0x54): undefined reference to `clk_register_mux_table'
>> sparc-linux-ld: clk-tegra-audio.c:(.init.text+0x94): undefined reference to `clk_register_gate'
sparc-linux-ld: drivers/clk/tegra/clk-tegra-audio.o: in function `tegra_audio_clk_init':
clk-tegra-audio.c:(.init.text+0x29c): undefined reference to `clk_register_fixed_factor'
>> sparc-linux-ld: drivers/clk/tegra/clk-tegra-periph.o:(.data+0x10c): undefined reference to `clk_mux_ops'
sparc-linux-ld: drivers/clk/tegra/clk-tegra-periph.o:(.data+0x1a4): undefined reference to `clk_mux_ops'
sparc-linux-ld: drivers/clk/tegra/clk-tegra-periph.o:(.data+0x23c): undefined reference to `clk_mux_ops'
sparc-linux-ld: drivers/clk/tegra/clk-tegra-periph.o:(.data+0x2d4): undefined reference to `clk_mux_ops'
sparc-linux-ld: drivers/clk/tegra/clk-tegra-periph.o:(.data+0x36c): undefined reference to `clk_mux_ops'
sparc-linux-ld: drivers/clk/tegra/clk-tegra-periph.o:(.data+0x404): more undefined references to `clk_mux_ops' follow
sparc-linux-ld: drivers/clk/tegra/clk-tegra-periph.o: in function `init_pllp':
clk-tegra-periph.c:(.init.text+0x48): undefined reference to `clk_register_clkdev'
>> sparc-linux-ld: clk-tegra-periph.c:(.init.text+0x1c8): undefined reference to `clk_register_gate'
sparc-linux-ld: clk-tegra-periph.c:(.init.text+0x20c): undefined reference to `clk_register_gate'
>> sparc-linux-ld: clk-tegra-periph.c:(.init.text+0x21c): undefined reference to `clk_register_clkdev'
sparc-linux-ld: drivers/clk/tegra/clk-tegra-fixed.o: in function `tegra_osc_clk_init':
clk-tegra-fixed.c:(.init.text+0x98): undefined reference to `clk_register_fixed_rate'
>> sparc-linux-ld: clk-tegra-fixed.c:(.init.text+0xd0): undefined reference to `clk_register_fixed_factor'
sparc-linux-ld: clk-tegra-fixed.c:(.init.text+0x108): undefined reference to `clk_register_fixed_factor'
sparc-linux-ld: clk-tegra-fixed.c:(.init.text+0x140): undefined reference to `clk_register_fixed_factor'
sparc-linux-ld: clk-tegra-fixed.c:(.init.text+0x184): undefined reference to `clk_register_fixed_factor'
sparc-linux-ld: drivers/clk/tegra/clk-tegra-fixed.o: in function `tegra_fixed_clk_init':
clk-tegra-fixed.c:(.init.text+0x1d8): undefined reference to `clk_register_fixed_rate'
sparc-linux-ld: drivers/clk/tegra/clk-tegra-super-cclk.o: in function `cclk_super_determine_rate':
clk-tegra-super-cclk.c:(.text+0xc8): undefined reference to `clk_hw_get_parent_by_index'
>> sparc-linux-ld: clk-tegra-super-cclk.c:(.text+0xd8): undefined reference to `clk_hw_get_parent_by_index'
sparc-linux-ld: clk-tegra-super-cclk.c:(.text+0xfc): undefined reference to `clk_hw_get_rate'
sparc-linux-ld: clk-tegra-super-cclk.c:(.text+0x144): undefined reference to `clk_hw_round_rate'
sparc-linux-ld: clk-tegra-super-cclk.c:(.text+0x194): undefined reference to `clk_hw_get_rate_range'
sparc-linux-ld: drivers/clk/tegra/clk-tegra-super-cclk.o: in function `tegra_clk_register_super_cclk':
clk-tegra-super-cclk.c:(.text+0x420): undefined reference to `clk_register'
sparc-linux-ld: drivers/clk/tegra/clk-tegra-super-gen4.o: in function `tegra_sclk_init':
clk-tegra-super-gen4.c:(.init.text+0x98): undefined reference to `clk_register_divider_table'
sparc-linux-ld: clk-tegra-super-gen4.c:(.init.text+0x140): undefined reference to `clk_register_divider_table'
sparc-linux-ld: clk-tegra-super-gen4.c:(.init.text+0x16c): undefined reference to `clk_register_gate'
sparc-linux-ld: clk-tegra-super-gen4.c:(.init.text+0x1c4): undefined reference to `clk_register_divider_table'
sparc-linux-ld: clk-tegra-super-gen4.c:(.init.text+0x1f0): undefined reference to `clk_register_gate'
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply
* Re: [PATCH v4 08/10] dmaengine: tegra: Use iommu-map for stream ID
From: Frank Li @ 2026-03-26 20:26 UTC (permalink / raw)
To: Akhil R
Cc: Vinod Koul, Frank Li, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Thierry Reding, Jonathan Hunter, Laxman Dewangan,
Philipp Zabel, dmaengine, devicetree, linux-tegra, linux-kernel
In-Reply-To: <20260326110948.68908-9-akhilrajeev@nvidia.com>
On Thu, Mar 26, 2026 at 04:39:45PM +0530, Akhil R wrote:
> Use 'iommu-map', when provided, to get the stream ID to be programmed
> for each channel. Iterate over the channels registered and configure
> each channel device separately using of_dma_configure_id() to allow
> it to use a separate IOMMU domain for the transfer. But do this
> in a second loop since the first loop populates the DMA device channels
> list and async_device_register() registers the channels. Both are
> prerequisites for using the channel device in the next loop.
>
> Channels will continue to use the same global stream ID if the
> 'iommu-map' property is not present in the device tree.
>
> Signed-off-by: Akhil R <akhilrajeev@nvidia.com>
> ---
...
> @@ -1490,6 +1496,41 @@ static int tegra_dma_probe(struct platform_device *pdev)
> return ret;
> }
>
> + /*
> + * Configure stream ID for each channel from the channels registered
> + * above. This is done in a separate iteration to ensure that only
> + * the channels available and registered for the DMA device are used.
> + */
> + list_for_each_entry(chan, &tdma->dma_dev.channels, device_node) {
> + chdev = &chan->dev->device;
> + tdc = to_tegra_dma_chan(chan);
> +
> + if (use_iommu_map) {
> + chdev->bus = pdev->dev.bus;
> + dma_coerce_mask_and_coherent(chdev, DMA_BIT_MASK(cdata->addr_bits));
> +
> + ret = of_dma_configure_id(chdev, pdev->dev.of_node,
> + true, &tdc->id);
> + if (ret) {
> + dev_err(chdev, "Failed to configure IOMMU for channel %d: %d\n",
> + tdc->id, ret);
> + return ret;
This is in probe funciton
return dev_err_probe();
Frank
^ permalink raw reply
* Re: [PATCHv2] firmware/tegra: add COMPILE_TEST
From: kernel test robot @ 2026-03-26 21:51 UTC (permalink / raw)
To: Rosen Penev, linux-tegra
Cc: oe-kbuild-all, Michael Turquette, Stephen Boyd, Thierry Reding,
Jonathan Hunter, linux-clk, linux-kernel
In-Reply-To: <20260324015722.12507-1-rosenp@gmail.com>
Hi Rosen,
kernel test robot noticed the following build errors:
[auto build test ERROR on next-20260325]
[cannot apply to tegra/for-next clk/clk-next drm-tegra/drm/tegra/for-next v7.0-rc5 v7.0-rc4 v7.0-rc3 linus/master v7.0-rc5]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Rosen-Penev/firmware-tegra-add-COMPILE_TEST/20260326-124230
base: next-20260325
patch link: https://lore.kernel.org/r/20260324015722.12507-1-rosenp%40gmail.com
patch subject: [PATCHv2] firmware/tegra: add COMPILE_TEST
config: s390-allnoconfig-bpf (https://download.01.org/0day-ci/archive/20260326/202603262233.dvRyEA8v-lkp@intel.com/config)
compiler: s390x-linux-gnu-gcc (Debian 14.2.0-19) 14.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260326/202603262233.dvRyEA8v-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202603262233.dvRyEA8v-lkp@intel.com/
All errors (new ones prefixed by >>):
s390x-linux-gnu-ld: drivers/clk/tegra/clk.o: in function `tegra_register_devclks':
>> drivers/clk/tegra/clk.c:361:(.text+0x718): undefined reference to `clk_register_clkdev'
>> s390x-linux-gnu-ld: drivers/clk/tegra/clk.c:366:(.text+0x770): undefined reference to `__clk_get_name'
>> s390x-linux-gnu-ld: drivers/clk/tegra/clk.c:366:(.text+0x784): undefined reference to `clk_register_clkdev'
s390x-linux-gnu-ld: drivers/clk/tegra/clk.o: in function `tegra_clk_dev_register':
>> drivers/clk/tegra/clk.c:437:(.text+0x830): undefined reference to `clk_register'
s390x-linux-gnu-ld: drivers/clk/tegra/clk.o: in function `tegra_init_dup_clks':
>> drivers/clk/tegra/clk.c:263:(.init.text+0x17c): undefined reference to `clkdev_add'
s390x-linux-gnu-ld: drivers/clk/tegra/clk-audio-sync.o: in function `tegra_clk_register_sync_source':
>> drivers/clk/tegra/clk-audio-sync.c:70:(.text+0x1f8): undefined reference to `clk_register'
s390x-linux-gnu-ld: drivers/clk/tegra/clk-dfll.o: in function `dfll_unregister_clk':
>> drivers/clk/tegra/clk-dfll.c:1215:(.text+0x236): undefined reference to `clk_unregister'
s390x-linux-gnu-ld: drivers/clk/tegra/clk-divider.o: in function `clk_divider_restore_context':
>> drivers/clk/tegra/clk-divider.c:127:(.text+0x262): undefined reference to `clk_hw_get_parent'
>> s390x-linux-gnu-ld: drivers/clk/tegra/clk-divider.c:128:(.text+0x268): undefined reference to `clk_hw_get_rate'
s390x-linux-gnu-ld: drivers/clk/tegra/clk-divider.c:129:(.text+0x276): undefined reference to `clk_hw_get_rate'
s390x-linux-gnu-ld: drivers/clk/tegra/clk-divider.o: in function `tegra_clk_register_divider':
>> drivers/clk/tegra/clk-divider.c:174:(.text+0x6e0): undefined reference to `clk_register'
s390x-linux-gnu-ld: drivers/clk/tegra/clk-divider.o: in function `tegra_clk_register_mc':
>> drivers/clk/tegra/clk-divider.c:190:(.text+0x7da): undefined reference to `clk_register_divider_table'
s390x-linux-gnu-ld: drivers/clk/tegra/clk-periph.o: in function `clk_periph_restore_context':
>> drivers/clk/tegra/clk-periph.c:119:(.text+0x676): undefined reference to `clk_hw_get_parent_index'
s390x-linux-gnu-ld: drivers/clk/tegra/clk-periph.o: in function `_tegra_clk_register_periph':
>> drivers/clk/tegra/clk-periph.c:199:(.text+0x8ec): undefined reference to `clk_register'
>> s390x-linux-gnu-ld: drivers/clk/tegra/clk-periph.c:199:(.text+0x9b6): undefined reference to `clk_register'
s390x-linux-gnu-ld: drivers/clk/tegra/clk-periph.c:199:(.text+0xb72): undefined reference to `clk_register'
s390x-linux-gnu-ld: drivers/clk/tegra/clk-periph.c:199:(.text+0xdf2): undefined reference to `clk_register'
s390x-linux-gnu-ld: drivers/clk/tegra/clk-periph.c:199:(.text+0xeb8): undefined reference to `clk_register'
>> s390x-linux-gnu-ld: drivers/clk/tegra/clk-periph.o:(.data.rel.ro+0x60): undefined reference to `clk_hw_determine_rate_no_reparent'
s390x-linux-gnu-ld: drivers/clk/tegra/clk-periph-fixed.o: in function `tegra_clk_register_periph_fixed':
>> drivers/clk/tegra/clk-periph-fixed.c:105:(.text+0x558): undefined reference to `clk_register'
s390x-linux-gnu-ld: drivers/clk/tegra/clk-periph-gate.o: in function `tegra_clk_register_periph_gate':
>> drivers/clk/tegra/clk-periph-gate.c:171:(.text+0x79e): undefined reference to `clk_register'
s390x-linux-gnu-ld: drivers/clk/tegra/clk-pll.o: in function `clk_pll_determine_rate':
>> drivers/clk/tegra/clk-pll.c:852:(.text+0xbc4): undefined reference to `clk_hw_get_rate'
s390x-linux-gnu-ld: drivers/clk/tegra/clk-pll.o: in function `clk_pll_wait_for_lock':
>> drivers/clk/tegra/clk-pll.c:319:(.text+0xdae): undefined reference to `clk_hw_get_name'
s390x-linux-gnu-ld: drivers/clk/tegra/clk-pll.o: in function `clk_pllu_enable':
>> drivers/clk/tegra/clk-pll.c:1124:(.text+0x1eec): undefined reference to `clk_hw_get_parent'
s390x-linux-gnu-ld: drivers/clk/tegra/clk-pll.c:1125:(.text+0x1ef2): undefined reference to `clk_hw_get_parent'
s390x-linux-gnu-ld: drivers/clk/tegra/clk-pll.c:1137:(.text+0x1f08): undefined reference to `clk_hw_get_rate'
s390x-linux-gnu-ld: drivers/clk/tegra/clk-pll.o: in function `clk_pll_recalc_rate':
drivers/clk/tegra/clk-pll.c:888:(.text+0x2b58): undefined reference to `clk_hw_get_name'
s390x-linux-gnu-ld: drivers/clk/tegra/clk-pll.c:902:(.text+0x2c10): undefined reference to `clk_hw_get_name'
s390x-linux-gnu-ld: drivers/clk/tegra/clk-pll.o: in function `clk_pll_set_rate':
drivers/clk/tegra/clk-pll.c:821:(.text+0x3a1a): undefined reference to `clk_hw_get_name'
s390x-linux-gnu-ld: drivers/clk/tegra/clk-pll.c:811:(.text+0x3a4e): undefined reference to `clk_hw_get_name'
s390x-linux-gnu-ld: drivers/clk/tegra/clk-pll.o: in function `tegra_clk_pll_restore_context':
drivers/clk/tegra/clk-pll.c:1042:(.text+0x3ae2): undefined reference to `clk_hw_get_parent'
s390x-linux-gnu-ld: drivers/clk/tegra/clk-pll.c:1043:(.text+0x3ae8): undefined reference to `clk_hw_get_rate'
s390x-linux-gnu-ld: drivers/clk/tegra/clk-pll.c:1044:(.text+0x3af6): undefined reference to `clk_hw_get_rate'
s390x-linux-gnu-ld: drivers/clk/tegra/clk-pll.c:1054:(.text+0x3b5c): undefined reference to `__clk_get_enable_count'
s390x-linux-gnu-ld: drivers/clk/tegra/clk-pll.o: in function `clk_plle_enable':
drivers/clk/tegra/clk-pll.c:971:(.text+0x3cc0): undefined reference to `clk_hw_get_parent'
s390x-linux-gnu-ld: drivers/clk/tegra/clk-pll.c:971:(.text+0x3cc6): undefined reference to `clk_hw_get_rate'
s390x-linux-gnu-ld: drivers/clk/tegra/clk-pll-out.o: in function `tegra_clk_pll_out_restore_context':
drivers/clk/tegra/clk-pll-out.c:74:(.text+0x432): undefined reference to `__clk_get_enable_count'
s390x-linux-gnu-ld: drivers/clk/tegra/clk-pll-out.o: in function `tegra_clk_register_pll_out':
drivers/clk/tegra/clk-pll-out.c:115:(.text+0x5f8): undefined reference to `clk_register'
s390x-linux-gnu-ld: drivers/clk/tegra/clk-sdmmc-mux.o: in function `clk_sdmmc_mux_get_parent':
drivers/clk/tegra/clk-sdmmc-mux.c:48:(.text+0x66c): undefined reference to `clk_hw_get_num_parents'
s390x-linux-gnu-ld: drivers/clk/tegra/clk-sdmmc-mux.o: in function `clk_sdmmc_mux_restore_context':
drivers/clk/tegra/clk-sdmmc-mux.c:208:(.text+0x9e2): undefined reference to `clk_hw_get_parent'
s390x-linux-gnu-ld: drivers/clk/tegra/clk-sdmmc-mux.c:209:(.text+0x9e8): undefined reference to `clk_hw_get_rate'
s390x-linux-gnu-ld: drivers/clk/tegra/clk-sdmmc-mux.c:210:(.text+0x9f6): undefined reference to `clk_hw_get_rate'
s390x-linux-gnu-ld: drivers/clk/tegra/clk-sdmmc-mux.c:213:(.text+0xa04): undefined reference to `clk_hw_get_parent_index'
s390x-linux-gnu-ld: drivers/clk/tegra/clk-sdmmc-mux.o: in function `tegra_clk_register_sdmmc_mux_div':
drivers/clk/tegra/clk-sdmmc-mux.c:269:(.text+0xc06): undefined reference to `clk_register'
s390x-linux-gnu-ld: drivers/clk/tegra/clk-super.o: in function `clk_super_restore_context':
drivers/clk/tegra/clk-super.c:184:(.text+0x726): undefined reference to `clk_hw_get_parent_index'
s390x-linux-gnu-ld: drivers/clk/tegra/clk-super.o: in function `clk_super_mux_restore_context':
drivers/clk/tegra/clk-super.c:131:(.text+0x7a2): undefined reference to `clk_hw_get_parent_index'
s390x-linux-gnu-ld: drivers/clk/tegra/clk-super.o: in function `tegra_clk_register_super_clk':
drivers/clk/tegra/clk-super.c:270:(.text+0xbba): undefined reference to `clk_register'
s390x-linux-gnu-ld: drivers/clk/tegra/clk-super.o:(.data.rel.ro+0x60): undefined reference to `clk_hw_determine_rate_no_reparent'
s390x-linux-gnu-ld: drivers/clk/tegra/clk-tegra-audio.o: in function `tegra_audio_sync_clk_init':
drivers/clk/tegra/clk-tegra-audio.c:145:(.init.text+0xda): undefined reference to `clk_register_mux_table'
s390x-linux-gnu-ld: drivers/clk/tegra/clk-tegra-audio.c:156:(.init.text+0x172): undefined reference to `clk_register_gate'
s390x-linux-gnu-ld: drivers/clk/tegra/clk-tegra-audio.o: in function `tegra_audio_clk_init':
drivers/clk/tegra/clk-tegra-audio.c:235:(.init.text+0x4a0): undefined reference to `clk_register_fixed_factor'
s390x-linux-gnu-ld: drivers/clk/tegra/clk-tegra-periph.o: in function `init_pllp':
drivers/clk/tegra/clk-tegra-periph.c:952:(.init.text+0x7c): undefined reference to `clk_register_clkdev'
s390x-linux-gnu-ld: drivers/clk/tegra/clk-tegra-periph.c:1004:(.init.text+0x326): undefined reference to `clk_register_gate'
s390x-linux-gnu-ld: drivers/clk/tegra/clk-tegra-periph.c:1013:(.init.text+0x380): undefined reference to `clk_register_gate'
s390x-linux-gnu-ld: drivers/clk/tegra/clk-tegra-periph.c:1017:(.init.text+0x394): undefined reference to `clk_register_clkdev'
s390x-linux-gnu-ld: drivers/clk/tegra/clk-tegra-periph.o:(.data.rel+0xe8): undefined reference to `clk_mux_ops'
s390x-linux-gnu-ld: drivers/clk/tegra/clk-tegra-periph.o:(.data.rel+0x208): undefined reference to `clk_mux_ops'
s390x-linux-gnu-ld: drivers/clk/tegra/clk-tegra-periph.o:(.data.rel+0x328): undefined reference to `clk_mux_ops'
s390x-linux-gnu-ld: drivers/clk/tegra/clk-tegra-periph.o:(.data.rel+0x448): undefined reference to `clk_mux_ops'
s390x-linux-gnu-ld: drivers/clk/tegra/clk-tegra-periph.o:(.data.rel+0x568): undefined reference to `clk_mux_ops'
s390x-linux-gnu-ld: drivers/clk/tegra/clk-tegra-periph.o:(.data.rel+0x688): more undefined references to `clk_mux_ops' follow
s390x-linux-gnu-ld: drivers/clk/tegra/clk-tegra-fixed.o: in function `tegra_osc_clk_init':
drivers/clk/tegra/clk-tegra-fixed.c:53:(.init.text+0xe0): undefined reference to `clk_register_fixed_rate'
s390x-linux-gnu-ld: drivers/clk/tegra/clk-tegra-fixed.c:59:(.init.text+0x12e): undefined reference to `clk_register_fixed_factor'
s390x-linux-gnu-ld: drivers/clk/tegra/clk-tegra-fixed.c:67:(.init.text+0x17c): undefined reference to `clk_register_fixed_factor'
s390x-linux-gnu-ld: drivers/clk/tegra/clk-tegra-fixed.c:76:(.init.text+0x1ca): undefined reference to `clk_register_fixed_factor'
s390x-linux-gnu-ld: drivers/clk/tegra/clk-tegra-fixed.c:87:(.init.text+0x226): undefined reference to `clk_register_fixed_factor'
s390x-linux-gnu-ld: drivers/clk/tegra/clk-tegra-fixed.o: in function `tegra_fixed_clk_init':
drivers/clk/tegra/clk-tegra-fixed.c:105:(.init.text+0x2da): undefined reference to `clk_register_fixed_rate'
s390x-linux-gnu-ld: drivers/clk/tegra/clk-tegra-super-cclk.o: in function `cclk_super_determine_rate':
drivers/clk/tegra/clk-tegra-super-cclk.c:71:(.text+0x200): undefined reference to `clk_hw_get_parent_by_index'
s390x-linux-gnu-ld: drivers/clk/tegra/clk-tegra-super-cclk.c:72:(.text+0x212): undefined reference to `clk_hw_get_parent_by_index'
s390x-linux-gnu-ld: drivers/clk/tegra/clk-tegra-super-cclk.c:84:(.text+0x246): undefined reference to `clk_hw_get_rate'
s390x-linux-gnu-ld: drivers/clk/tegra/clk-tegra-super-cclk.c:95:(.text+0x304): undefined reference to `clk_hw_get_rate_range'
s390x-linux-gnu-ld: drivers/clk/tegra/clk-tegra-super-cclk.c:106:(.text+0x34c): undefined reference to `clk_hw_round_rate'
s390x-linux-gnu-ld: drivers/clk/tegra/clk-tegra-super-cclk.o: in function `tegra_clk_register_super_cclk':
drivers/clk/tegra/clk-tegra-super-cclk.c:200:(.text+0x6e2): undefined reference to `clk_register'
s390x-linux-gnu-ld: drivers/clk/tegra/clk-tegra-super-gen4.o: in function `tegra_sclk_init':
drivers/clk/tegra/clk-tegra-super-gen4.c:117:(.init.text+0xf8): undefined reference to `clk_register_divider_table'
s390x-linux-gnu-ld: drivers/clk/tegra/clk-tegra-super-gen4.c:141:(.init.text+0x1e8): undefined reference to `clk_register_divider_table'
s390x-linux-gnu-ld: drivers/clk/tegra/clk-tegra-super-gen4.c:144:(.init.text+0x21a): undefined reference to `clk_register_gate'
s390x-linux-gnu-ld: drivers/clk/tegra/clk-tegra-super-gen4.c:156:(.init.text+0x286): undefined reference to `clk_register_divider_table'
s390x-linux-gnu-ld: drivers/clk/tegra/clk-tegra-super-gen4.c:159:(.init.text+0x2b8): undefined reference to `clk_register_gate'
vim +361 drivers/clk/tegra/clk.c
d5ff89a82a6d27 Peter De Schrijver 2013-08-22 254
8f8f484bf355e5 Prashant Gaikwad 2013-01-11 255 void __init tegra_init_dup_clks(struct tegra_clk_duplicate *dup_list,
8f8f484bf355e5 Prashant Gaikwad 2013-01-11 256 struct clk *clks[], int clk_max)
8f8f484bf355e5 Prashant Gaikwad 2013-01-11 257 {
8f8f484bf355e5 Prashant Gaikwad 2013-01-11 258 struct clk *clk;
8f8f484bf355e5 Prashant Gaikwad 2013-01-11 259
8f8f484bf355e5 Prashant Gaikwad 2013-01-11 260 for (; dup_list->clk_id < clk_max; dup_list++) {
8f8f484bf355e5 Prashant Gaikwad 2013-01-11 261 clk = clks[dup_list->clk_id];
8f8f484bf355e5 Prashant Gaikwad 2013-01-11 262 dup_list->lookup.clk = clk;
8f8f484bf355e5 Prashant Gaikwad 2013-01-11 @263 clkdev_add(&dup_list->lookup);
8f8f484bf355e5 Prashant Gaikwad 2013-01-11 264 }
8f8f484bf355e5 Prashant Gaikwad 2013-01-11 265 }
8f8f484bf355e5 Prashant Gaikwad 2013-01-11 266
b1bc04a2ac5b15 Dmitry Osipenko 2021-12-01 267 void tegra_init_from_table(struct tegra_clk_init_table *tbl,
8f8f484bf355e5 Prashant Gaikwad 2013-01-11 268 struct clk *clks[], int clk_max)
8f8f484bf355e5 Prashant Gaikwad 2013-01-11 269 {
8f8f484bf355e5 Prashant Gaikwad 2013-01-11 270 struct clk *clk;
8f8f484bf355e5 Prashant Gaikwad 2013-01-11 271
8f8f484bf355e5 Prashant Gaikwad 2013-01-11 272 for (; tbl->clk_id < clk_max; tbl++) {
8f8f484bf355e5 Prashant Gaikwad 2013-01-11 273 clk = clks[tbl->clk_id];
b9e742c3164344 Tomeu Vizoso 2014-09-17 274 if (IS_ERR_OR_NULL(clk)) {
b9e742c3164344 Tomeu Vizoso 2014-09-17 275 pr_err("%s: invalid entry %ld in clks array for id %d\n",
b9e742c3164344 Tomeu Vizoso 2014-09-17 276 __func__, PTR_ERR(clk), tbl->clk_id);
b9e742c3164344 Tomeu Vizoso 2014-09-17 277 WARN_ON(1);
b9e742c3164344 Tomeu Vizoso 2014-09-17 278
b9e742c3164344 Tomeu Vizoso 2014-09-17 279 continue;
b9e742c3164344 Tomeu Vizoso 2014-09-17 280 }
8f8f484bf355e5 Prashant Gaikwad 2013-01-11 281
8f8f484bf355e5 Prashant Gaikwad 2013-01-11 282 if (tbl->parent_id < clk_max) {
8f8f484bf355e5 Prashant Gaikwad 2013-01-11 283 struct clk *parent = clks[tbl->parent_id];
8f8f484bf355e5 Prashant Gaikwad 2013-01-11 284 if (clk_set_parent(clk, parent)) {
8f8f484bf355e5 Prashant Gaikwad 2013-01-11 285 pr_err("%s: Failed to set parent %s of %s\n",
8f8f484bf355e5 Prashant Gaikwad 2013-01-11 286 __func__, __clk_get_name(parent),
8f8f484bf355e5 Prashant Gaikwad 2013-01-11 287 __clk_get_name(clk));
8f8f484bf355e5 Prashant Gaikwad 2013-01-11 288 WARN_ON(1);
8f8f484bf355e5 Prashant Gaikwad 2013-01-11 289 }
8f8f484bf355e5 Prashant Gaikwad 2013-01-11 290 }
8f8f484bf355e5 Prashant Gaikwad 2013-01-11 291
8f8f484bf355e5 Prashant Gaikwad 2013-01-11 292 if (tbl->rate)
8f8f484bf355e5 Prashant Gaikwad 2013-01-11 293 if (clk_set_rate(clk, tbl->rate)) {
8f8f484bf355e5 Prashant Gaikwad 2013-01-11 294 pr_err("%s: Failed to set rate %lu of %s\n",
8f8f484bf355e5 Prashant Gaikwad 2013-01-11 295 __func__, tbl->rate,
8f8f484bf355e5 Prashant Gaikwad 2013-01-11 296 __clk_get_name(clk));
8f8f484bf355e5 Prashant Gaikwad 2013-01-11 297 WARN_ON(1);
8f8f484bf355e5 Prashant Gaikwad 2013-01-11 298 }
8f8f484bf355e5 Prashant Gaikwad 2013-01-11 299
8f8f484bf355e5 Prashant Gaikwad 2013-01-11 300 if (tbl->state)
8f8f484bf355e5 Prashant Gaikwad 2013-01-11 301 if (clk_prepare_enable(clk)) {
8f8f484bf355e5 Prashant Gaikwad 2013-01-11 302 pr_err("%s: Failed to enable %s\n", __func__,
8f8f484bf355e5 Prashant Gaikwad 2013-01-11 303 __clk_get_name(clk));
8f8f484bf355e5 Prashant Gaikwad 2013-01-11 304 WARN_ON(1);
8f8f484bf355e5 Prashant Gaikwad 2013-01-11 305 }
8f8f484bf355e5 Prashant Gaikwad 2013-01-11 306 }
8f8f484bf355e5 Prashant Gaikwad 2013-01-11 307 }
61fd290d213e25 Prashant Gaikwad 2013-01-11 308
7ba256d2aa2a18 Philipp Zabel 2016-02-25 309 static const struct reset_control_ops rst_ops = {
6d5b988e7dc56b Stephen Warren 2013-11-05 310 .assert = tegra_clk_rst_assert,
6d5b988e7dc56b Stephen Warren 2013-11-05 311 .deassert = tegra_clk_rst_deassert,
4236e752f19d4d Mikko Perttunen 2017-03-02 312 .reset = tegra_clk_rst_reset,
6d5b988e7dc56b Stephen Warren 2013-11-05 313 };
6d5b988e7dc56b Stephen Warren 2013-11-05 314
6d5b988e7dc56b Stephen Warren 2013-11-05 315 static struct reset_controller_dev rst_ctlr = {
6d5b988e7dc56b Stephen Warren 2013-11-05 316 .ops = &rst_ops,
6d5b988e7dc56b Stephen Warren 2013-11-05 317 .owner = THIS_MODULE,
6d5b988e7dc56b Stephen Warren 2013-11-05 318 .of_reset_n_cells = 1,
6d5b988e7dc56b Stephen Warren 2013-11-05 319 };
6d5b988e7dc56b Stephen Warren 2013-11-05 320
5d797111afe12e Dmitry Osipenko 2018-05-08 321 void __init tegra_add_of_provider(struct device_node *np,
5d797111afe12e Dmitry Osipenko 2018-05-08 322 void *clk_src_onecell_get)
343a607cb79259 Peter De Schrijver 2013-09-02 323 {
343a607cb79259 Peter De Schrijver 2013-09-02 324 int i;
343a607cb79259 Peter De Schrijver 2013-09-02 325
b1bc04a2ac5b15 Dmitry Osipenko 2021-12-01 326 tegra_car_np = np;
b1bc04a2ac5b15 Dmitry Osipenko 2021-12-01 327
343a607cb79259 Peter De Schrijver 2013-09-02 328 for (i = 0; i < clk_num; i++) {
343a607cb79259 Peter De Schrijver 2013-09-02 329 if (IS_ERR(clks[i])) {
343a607cb79259 Peter De Schrijver 2013-09-02 330 pr_err
343a607cb79259 Peter De Schrijver 2013-09-02 331 ("Tegra clk %d: register failed with %ld\n",
343a607cb79259 Peter De Schrijver 2013-09-02 332 i, PTR_ERR(clks[i]));
343a607cb79259 Peter De Schrijver 2013-09-02 333 }
343a607cb79259 Peter De Schrijver 2013-09-02 334 if (!clks[i])
343a607cb79259 Peter De Schrijver 2013-09-02 335 clks[i] = ERR_PTR(-EINVAL);
343a607cb79259 Peter De Schrijver 2013-09-02 336 }
343a607cb79259 Peter De Schrijver 2013-09-02 337
343a607cb79259 Peter De Schrijver 2013-09-02 338 clk_data.clks = clks;
343a607cb79259 Peter De Schrijver 2013-09-02 339 clk_data.clk_num = clk_num;
5d797111afe12e Dmitry Osipenko 2018-05-08 340 of_clk_add_provider(np, clk_src_onecell_get, &clk_data);
6d5b988e7dc56b Stephen Warren 2013-11-05 341
6d5b988e7dc56b Stephen Warren 2013-11-05 342 rst_ctlr.of_node = np;
66b6f3d07454a6 Mikko Perttunen 2015-05-20 343 rst_ctlr.nr_resets = periph_banks * 32 + num_special_reset;
6d5b988e7dc56b Stephen Warren 2013-11-05 344 reset_controller_register(&rst_ctlr);
343a607cb79259 Peter De Schrijver 2013-09-02 345 }
343a607cb79259 Peter De Schrijver 2013-09-02 346
66b6f3d07454a6 Mikko Perttunen 2015-05-20 347 void __init tegra_init_special_resets(unsigned int num,
66b6f3d07454a6 Mikko Perttunen 2015-05-20 348 int (*assert)(unsigned long),
66b6f3d07454a6 Mikko Perttunen 2015-05-20 349 int (*deassert)(unsigned long))
66b6f3d07454a6 Mikko Perttunen 2015-05-20 350 {
66b6f3d07454a6 Mikko Perttunen 2015-05-20 351 num_special_reset = num;
66b6f3d07454a6 Mikko Perttunen 2015-05-20 352 special_reset_assert = assert;
66b6f3d07454a6 Mikko Perttunen 2015-05-20 353 special_reset_deassert = deassert;
66b6f3d07454a6 Mikko Perttunen 2015-05-20 354 }
66b6f3d07454a6 Mikko Perttunen 2015-05-20 355
b1bc04a2ac5b15 Dmitry Osipenko 2021-12-01 356 void tegra_register_devclks(struct tegra_devclk *dev_clks, int num)
73d37e4c7c4b9d Peter De Schrijver 2013-10-09 357 {
73d37e4c7c4b9d Peter De Schrijver 2013-10-09 358 int i;
73d37e4c7c4b9d Peter De Schrijver 2013-10-09 359
73d37e4c7c4b9d Peter De Schrijver 2013-10-09 360 for (i = 0; i < num; i++, dev_clks++)
73d37e4c7c4b9d Peter De Schrijver 2013-10-09 @361 clk_register_clkdev(clks[dev_clks->dt_id], dev_clks->con_id,
73d37e4c7c4b9d Peter De Schrijver 2013-10-09 362 dev_clks->dev_id);
9f0030c8ad0ce3 Peter De Schrijver 2014-06-26 363
9f0030c8ad0ce3 Peter De Schrijver 2014-06-26 364 for (i = 0; i < clk_num; i++) {
9f0030c8ad0ce3 Peter De Schrijver 2014-06-26 365 if (!IS_ERR_OR_NULL(clks[i]))
9f0030c8ad0ce3 Peter De Schrijver 2014-06-26 @366 clk_register_clkdev(clks[i], __clk_get_name(clks[i]),
9f0030c8ad0ce3 Peter De Schrijver 2014-06-26 367 "tegra-clk-debug");
9f0030c8ad0ce3 Peter De Schrijver 2014-06-26 368 }
73d37e4c7c4b9d Peter De Schrijver 2013-10-09 369 }
73d37e4c7c4b9d Peter De Schrijver 2013-10-09 370
b8700d506ac405 Peter De Schrijver 2013-10-14 371 struct clk ** __init tegra_lookup_dt_id(int clk_id,
b8700d506ac405 Peter De Schrijver 2013-10-14 372 struct tegra_clk *tegra_clk)
b8700d506ac405 Peter De Schrijver 2013-10-14 373 {
b8700d506ac405 Peter De Schrijver 2013-10-14 374 if (tegra_clk[clk_id].present)
b8700d506ac405 Peter De Schrijver 2013-10-14 375 return &clks[tegra_clk[clk_id].dt_id];
b8700d506ac405 Peter De Schrijver 2013-10-14 376 else
b8700d506ac405 Peter De Schrijver 2013-10-14 377 return NULL;
b8700d506ac405 Peter De Schrijver 2013-10-14 378 }
b8700d506ac405 Peter De Schrijver 2013-10-14 379
b1bc04a2ac5b15 Dmitry Osipenko 2021-12-01 380 static struct device_node *tegra_clk_get_of_node(struct clk_hw *hw)
b1bc04a2ac5b15 Dmitry Osipenko 2021-12-01 381 {
b1bc04a2ac5b15 Dmitry Osipenko 2021-12-01 382 struct device_node *np;
b1bc04a2ac5b15 Dmitry Osipenko 2021-12-01 383 char *node_name;
b1bc04a2ac5b15 Dmitry Osipenko 2021-12-01 384
28df1500f53874 Andy Shevchenko 2023-08-04 385 node_name = kstrdup_and_replace(hw->init->name, '_', '-', GFP_KERNEL);
b1bc04a2ac5b15 Dmitry Osipenko 2021-12-01 386 if (!node_name)
b1bc04a2ac5b15 Dmitry Osipenko 2021-12-01 387 return NULL;
b1bc04a2ac5b15 Dmitry Osipenko 2021-12-01 388
b1bc04a2ac5b15 Dmitry Osipenko 2021-12-01 389 for_each_child_of_node(tegra_car_np, np) {
b1bc04a2ac5b15 Dmitry Osipenko 2021-12-01 390 if (!strcmp(np->name, node_name))
b1bc04a2ac5b15 Dmitry Osipenko 2021-12-01 391 break;
b1bc04a2ac5b15 Dmitry Osipenko 2021-12-01 392 }
b1bc04a2ac5b15 Dmitry Osipenko 2021-12-01 393
b1bc04a2ac5b15 Dmitry Osipenko 2021-12-01 394 kfree(node_name);
b1bc04a2ac5b15 Dmitry Osipenko 2021-12-01 395
b1bc04a2ac5b15 Dmitry Osipenko 2021-12-01 396 return np;
b1bc04a2ac5b15 Dmitry Osipenko 2021-12-01 397 }
b1bc04a2ac5b15 Dmitry Osipenko 2021-12-01 398
b1bc04a2ac5b15 Dmitry Osipenko 2021-12-01 399 struct clk *tegra_clk_dev_register(struct clk_hw *hw)
b1bc04a2ac5b15 Dmitry Osipenko 2021-12-01 400 {
b1bc04a2ac5b15 Dmitry Osipenko 2021-12-01 401 struct platform_device *pdev, *parent;
b1bc04a2ac5b15 Dmitry Osipenko 2021-12-01 402 const char *dev_name = NULL;
b1bc04a2ac5b15 Dmitry Osipenko 2021-12-01 403 struct device *dev = NULL;
b1bc04a2ac5b15 Dmitry Osipenko 2021-12-01 404 struct device_node *np;
b1bc04a2ac5b15 Dmitry Osipenko 2021-12-01 405
b1bc04a2ac5b15 Dmitry Osipenko 2021-12-01 406 np = tegra_clk_get_of_node(hw);
b1bc04a2ac5b15 Dmitry Osipenko 2021-12-01 407
b1bc04a2ac5b15 Dmitry Osipenko 2021-12-01 408 if (!of_device_is_available(np))
b1bc04a2ac5b15 Dmitry Osipenko 2021-12-01 409 goto put_node;
b1bc04a2ac5b15 Dmitry Osipenko 2021-12-01 410
b1bc04a2ac5b15 Dmitry Osipenko 2021-12-01 411 dev_name = kasprintf(GFP_KERNEL, "tegra_clk_%s", hw->init->name);
b1bc04a2ac5b15 Dmitry Osipenko 2021-12-01 412 if (!dev_name)
b1bc04a2ac5b15 Dmitry Osipenko 2021-12-01 413 goto put_node;
b1bc04a2ac5b15 Dmitry Osipenko 2021-12-01 414
b1bc04a2ac5b15 Dmitry Osipenko 2021-12-01 415 parent = of_find_device_by_node(tegra_car_np);
b1bc04a2ac5b15 Dmitry Osipenko 2021-12-01 416 if (parent) {
b1bc04a2ac5b15 Dmitry Osipenko 2021-12-01 417 pdev = of_platform_device_create(np, dev_name, &parent->dev);
b1bc04a2ac5b15 Dmitry Osipenko 2021-12-01 418 put_device(&parent->dev);
b1bc04a2ac5b15 Dmitry Osipenko 2021-12-01 419
b1bc04a2ac5b15 Dmitry Osipenko 2021-12-01 420 if (!pdev) {
b1bc04a2ac5b15 Dmitry Osipenko 2021-12-01 421 pr_err("%s: failed to create device for %pOF\n",
b1bc04a2ac5b15 Dmitry Osipenko 2021-12-01 422 __func__, np);
b1bc04a2ac5b15 Dmitry Osipenko 2021-12-01 423 goto free_name;
b1bc04a2ac5b15 Dmitry Osipenko 2021-12-01 424 }
b1bc04a2ac5b15 Dmitry Osipenko 2021-12-01 425
b1bc04a2ac5b15 Dmitry Osipenko 2021-12-01 426 dev = &pdev->dev;
b1bc04a2ac5b15 Dmitry Osipenko 2021-12-01 427 pm_runtime_enable(dev);
b1bc04a2ac5b15 Dmitry Osipenko 2021-12-01 428 } else {
b1bc04a2ac5b15 Dmitry Osipenko 2021-12-01 429 WARN(1, "failed to find device for %pOF\n", tegra_car_np);
b1bc04a2ac5b15 Dmitry Osipenko 2021-12-01 430 }
b1bc04a2ac5b15 Dmitry Osipenko 2021-12-01 431
b1bc04a2ac5b15 Dmitry Osipenko 2021-12-01 432 free_name:
b1bc04a2ac5b15 Dmitry Osipenko 2021-12-01 433 kfree(dev_name);
b1bc04a2ac5b15 Dmitry Osipenko 2021-12-01 434 put_node:
b1bc04a2ac5b15 Dmitry Osipenko 2021-12-01 435 of_node_put(np);
b1bc04a2ac5b15 Dmitry Osipenko 2021-12-01 436
b1bc04a2ac5b15 Dmitry Osipenko 2021-12-01 @437 return clk_register(dev, hw);
b1bc04a2ac5b15 Dmitry Osipenko 2021-12-01 438 }
b1bc04a2ac5b15 Dmitry Osipenko 2021-12-01 439
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply
* Re: [PATCH v10 RESEND 0/3] Add I2C support for Tegra410
From: Andi Shyti @ 2026-03-26 22:46 UTC (permalink / raw)
To: Kartik Rajput
Cc: ldewangan, digetx, thierry.reding, jonathanh, akhilrajeev,
smangipudi, linux-i2c, linux-tegra, linux-kernel
In-Reply-To: <20260324055843.549808-1-kkartik@nvidia.com>
Hi Kartik,
> Kartik Rajput (3):
> i2c: tegra: Introduce tegra_i2c_variant to identify DVC and VI
> i2c: tegra: Add logic to support different register offsets
> i2c: tegra: Add support for Tegra410
merged to i2c/i2c-host.
Thanks,
Andi
^ permalink raw reply
* Re: [PATCH v5 phy-next 10/27] scsi: ufs: qcom: keep parallel track of PHY power state
From: Manivannan Sadhasivam @ 2026-03-27 6:52 UTC (permalink / raw)
To: Vladimir Oltean
Cc: linux-phy, Vinod Koul, Neil Armstrong, dri-devel, freedreno,
linux-arm-kernel, linux-arm-msm, linux-can, linux-gpio, linux-ide,
linux-kernel, linux-media, linux-pci, linux-renesas-soc,
linux-riscv, linux-rockchip, linux-samsung-soc, linux-scsi,
linux-sunxi, linux-tegra, linux-usb, netdev, spacemit,
UNGLinuxDriver, James E.J. Bottomley, Martin K. Petersen,
Nitin Rawat
In-Reply-To: <20260326080444.gbesciaa5zwvcgoy@skbuf>
On Thu, Mar 26, 2026 at 10:04:44AM +0200, Vladimir Oltean wrote:
> On Wed, Mar 25, 2026 at 01:57:31PM +0200, Vladimir Oltean wrote:
> > On Wed, Mar 25, 2026 at 05:21:14PM +0530, Manivannan Sadhasivam wrote:
> > > I believe I added the power_count check for phy_exit(). But since that got
> > > moved, the check becomes no longer necessary.
> >
> > FYI, the power_count keeps track of the balance of phy_power_on() and
> > phy_power_off() calls, whereas it is the init_count keeps track of
> > phy_init() and phy_exit() calls. They are only related to the extent
> > that you must respect the phy_init() -> phy_power_on() -> phy_power_off()
> > -> phy_exit() sequence. But in any case, both should be considered
> > PHY-internal fields. The "Order of API calls" section from
> > Documentation/driver-api/phy/phy.rst mentions the order that I just
> > described above, and consumers should just ensure they follow that.
>
> Ok, so we can close this topic of "checking the power_count not needed"
> by linking to the conversation which spun off here:
> https://lore.kernel.org/lkml/20260325120122.265973-1-manivannan.sadhasivam@oss.qualcomm.com/
>
Sure.
> Mani, I spent some more time to figure out what's really going on with
> this unexpected phy_power_off() call. Do you think you could
> regression-test the patch attached?
>
I tested the patch. But it fails ufs_qcom_power_up_sequence() if PHY was already
powered on:
[ 31.513321] qcom-qmp-ufs-phy 1d87000.phy: phy initialization timed-out
[ 31.513335] ufshcd-qcom 1d84000.ufshc: Failed to calibrate PHY: -110
[ 31.565273] ufshcd-qcom 1d84000.ufshc: Enabling the controller failed
Funny thing is, it didn't affect the functionality since the UFS core retries
ufshcd_hba_enable() and in the error path of ufs_qcom_power_up_sequence(),
phy_power_off() gets called and that causes the next try to succeed. So it is
evident that, if PHY was already powered ON, it should be powered off before
ufs_qcom_phy_power_on(). And due to the UFS driver design,
ufs_qcom_power_up_sequence() can get called multiple times. So we cannot just
remove phy_power_off().
Below diff on top of your patch fixes the issue:
```
diff --git a/drivers/ufs/host/ufs-qcom.c b/drivers/ufs/host/ufs-qcom.c
index ed067247d72a..2c9fe03f349e 100644
--- a/drivers/ufs/host/ufs-qcom.c
+++ b/drivers/ufs/host/ufs-qcom.c
@@ -567,6 +567,8 @@ static int ufs_qcom_power_up_sequence(struct ufs_hba *hba)
if (ret)
return ret;
+ ufs_qcom_phy_power_off(host);
+
ret = ufs_qcom_phy_set_gear(host, mode);
if (ret) {
dev_err(hba->dev, "%s: phy_set_mode_ext() failed, ret = %d\n",
```
- Mani
--
மணிவண்ணன் சதாசிவம்
^ permalink raw reply related
* Re: [PATCH v2 1/2] dt-bindings: arm: tegra: Add Tegra238 CBB compatible strings
From: Krzysztof Kozlowski @ 2026-03-27 7:26 UTC (permalink / raw)
To: Sumit Gupta
Cc: treding, jonathanh, robh, krzk+dt, conor+dt, devicetree,
linux-tegra, linux-kernel, bbasu
In-Reply-To: <20260325125726.2694144-2-sumitg@nvidia.com>
On Wed, Mar 25, 2026 at 06:27:25PM +0530, Sumit Gupta wrote:
> Add compatible strings for CBB v2.0 based fabrics in Tegra238:
> - nvidia,tegra238-ape-fabric
> - nvidia,tegra238-aon-fabric
> - nvidia,tegra238-bpmp-fabric
> - nvidia,tegra238-cbb-fabric
So you just pasted diff contents here. What's the point?
Comit msg is not a copy of the diff. We can read the diff.
Drop.
Acked-by: Krzysztof Kozlowski <krzysztof.kozlowski@oss.qualcomm.com>
Best regards,
Krzysztof
^ permalink raw reply
* Re: [PATCH 01/12] dt-bindings: i3c: Add mipi-i3c-static-method to support SETAASA
From: Akhil R @ 2026-03-27 8:18 UTC (permalink / raw)
To: alexandre.belloni
Cc: Frank.Li, acpica-devel, akhilrajeev, conor+dt, conor, devicetree,
ebiggers, fredrik.markstrom, jonathanh, krzk+dt, lenb, linux-acpi,
linux-hwmon, linux-i3c, linux-kernel, linux-tegra, linux,
miquel.raynal, p.zabel, rafael, robert.moore, robh, smangipudi,
thierry.reding
In-Reply-To: <202603261544313f63018c@mail.local>
On Thu, 26 Mar 2026 16:44:31 +0100, Alexandre Belloni wrote:
> On 26/03/2026 10:05:03-0500, Rob Herring wrote:
>> On Wed, Mar 18, 2026 at 05:31:50PM +0000, Conor Dooley wrote:
>> > On Wed, Mar 18, 2026 at 10:57:14PM +0530, Akhil R wrote:
>> > > Add the 'mipi-i3c-static-method' property mentioned in the MIPI I3C
>> > > Discovery and Configuration Specification [1] to specify which discovery
>> > > method an I3C device supports during bus initialization. The property is
>> > > a bitmap, where a bit value of 1 indicates support for that method, and 0
>> > > indicates lack of support.
>> > > Bit 0: SETDASA CCC (Direct)
>> > > Bit 1: SETAASA CCC (Broadcast)
>> > > Bit 2: Other CCC (vendor / standards extension)
>> > > All other bits are reserved.
>> > >
>> > > It is specifically needed when an I3C device requires SETAASA for the
>> > > address assignment. SETDASA will be supported by default if this property
>> > > is absent - which means for now the property just serves as a flag to
>> > > enable SETAASA, but keep the property as a bitmap to align with the
>> > > specifications.
>> > >
>> > > [1] https://www.mipi.org/specifications/disco
>> > >
>> > > Signed-off-by: Akhil R <akhilrajeev@nvidia.com>
>> > > ---
>> > > .../devicetree/bindings/i3c/i3c.yaml | 30 ++++++++++++++++---
>> > > 1 file changed, 26 insertions(+), 4 deletions(-)
>> > >
>> > > diff --git a/Documentation/devicetree/bindings/i3c/i3c.yaml b/Documentation/devicetree/bindings/i3c/i3c.yaml
>> > > index e25fa72fd785..1705d90d4d79 100644
>> > > --- a/Documentation/devicetree/bindings/i3c/i3c.yaml
>> > > +++ b/Documentation/devicetree/bindings/i3c/i3c.yaml
>> > > @@ -31,10 +31,12 @@ properties:
>> > > described in the device tree, which in turn means we have to describe
>> > > I3C devices.
>> > >
>> > > - Another use case for describing an I3C device in the device tree is when
>> > > - this I3C device has a static I2C address and we want to assign it a
>> > > - specific I3C dynamic address before the DAA takes place (so that other
>> > > - devices on the bus can't take this dynamic address).
>> > > + Other use-cases for describing an I3C device in the device tree are:
>> > > + - When the I3C device has a static I2C address and we want to assign
>> > > + it a specific I3C dynamic address before the DAA takes place (so
>> > > + that other devices on the bus can't take this dynamic address).
>> > > + - When the I3C device requires SETAASA for its discovery and uses a
>> > > + pre-defined static address.
>> > >
>> > > "#size-cells":
>> > > const: 0
>> > > @@ -147,6 +149,26 @@ patternProperties:
>> > > through SETDASA. If static address is not present, this address is assigned
>> > > through SETNEWDA after assigning a temporary address via ENTDAA.
>> > >
>> > > + mipi-i3c-static-method:
>> > > + $ref: /schemas/types.yaml#/definitions/uint32
>> > > + minimum: 0x1
>> > > + maximum: 0xff
>> > > + default: 1
>> > > + description: |
>> > > + Bitmap describing which methods of Dynamic Address Assignment from a
>> > > + static address are supported by this I3C Target. A bit value of 1
>> > > + indicates support for that method, and 0 indicates lack of support.
>> >
>> > I really am not keen on properties that are bitmaps, why can't we just
>> > use the strings "setdasa", "setaasa" etc?
>>
>> If this comes from a specification, then I'd tend to just copy it rather
>> than invent our own thing. Obviously if is something structured
>> fundamentally different from how DT is designed, then we wouldn't. But
>> this is just a simple property.
>>
>
> The issue being that the specification is not public so it is difficult
> to take any decision.
There is a public version available in the same link, but you would still
have to provide them a name and an email ID. The document will be sent to
the mail ID.
Regards,
Akhil
^ permalink raw reply
* Re: [PATCH 01/12] dt-bindings: i3c: Add mipi-i3c-static-method to support SETAASA
From: Alexandre Belloni @ 2026-03-27 8:27 UTC (permalink / raw)
To: Akhil R
Cc: Frank.Li, acpica-devel, conor+dt, conor, devicetree, ebiggers,
fredrik.markstrom, jonathanh, krzk+dt, lenb, linux-acpi,
linux-hwmon, linux-i3c, linux-kernel, linux-tegra, linux,
miquel.raynal, p.zabel, rafael, robert.moore, robh, smangipudi,
thierry.reding
In-Reply-To: <20260327081858.32354-1-akhilrajeev@nvidia.com>
On 27/03/2026 13:48:58+0530, Akhil R wrote:
> On Thu, 26 Mar 2026 16:44:31 +0100, Alexandre Belloni wrote:
> > On 26/03/2026 10:05:03-0500, Rob Herring wrote:
> >> On Wed, Mar 18, 2026 at 05:31:50PM +0000, Conor Dooley wrote:
> >> > On Wed, Mar 18, 2026 at 10:57:14PM +0530, Akhil R wrote:
> >> > > Add the 'mipi-i3c-static-method' property mentioned in the MIPI I3C
> >> > > Discovery and Configuration Specification [1] to specify which discovery
> >> > > method an I3C device supports during bus initialization. The property is
> >> > > a bitmap, where a bit value of 1 indicates support for that method, and 0
> >> > > indicates lack of support.
> >> > > Bit 0: SETDASA CCC (Direct)
> >> > > Bit 1: SETAASA CCC (Broadcast)
> >> > > Bit 2: Other CCC (vendor / standards extension)
> >> > > All other bits are reserved.
> >> > >
> >> > > It is specifically needed when an I3C device requires SETAASA for the
> >> > > address assignment. SETDASA will be supported by default if this property
> >> > > is absent - which means for now the property just serves as a flag to
> >> > > enable SETAASA, but keep the property as a bitmap to align with the
> >> > > specifications.
> >> > >
> >> > > [1] https://www.mipi.org/specifications/disco
> >> > >
> >> > > Signed-off-by: Akhil R <akhilrajeev@nvidia.com>
> >> > > ---
> >> > > .../devicetree/bindings/i3c/i3c.yaml | 30 ++++++++++++++++---
> >> > > 1 file changed, 26 insertions(+), 4 deletions(-)
> >> > >
> >> > > diff --git a/Documentation/devicetree/bindings/i3c/i3c.yaml b/Documentation/devicetree/bindings/i3c/i3c.yaml
> >> > > index e25fa72fd785..1705d90d4d79 100644
> >> > > --- a/Documentation/devicetree/bindings/i3c/i3c.yaml
> >> > > +++ b/Documentation/devicetree/bindings/i3c/i3c.yaml
> >> > > @@ -31,10 +31,12 @@ properties:
> >> > > described in the device tree, which in turn means we have to describe
> >> > > I3C devices.
> >> > >
> >> > > - Another use case for describing an I3C device in the device tree is when
> >> > > - this I3C device has a static I2C address and we want to assign it a
> >> > > - specific I3C dynamic address before the DAA takes place (so that other
> >> > > - devices on the bus can't take this dynamic address).
> >> > > + Other use-cases for describing an I3C device in the device tree are:
> >> > > + - When the I3C device has a static I2C address and we want to assign
> >> > > + it a specific I3C dynamic address before the DAA takes place (so
> >> > > + that other devices on the bus can't take this dynamic address).
> >> > > + - When the I3C device requires SETAASA for its discovery and uses a
> >> > > + pre-defined static address.
> >> > >
> >> > > "#size-cells":
> >> > > const: 0
> >> > > @@ -147,6 +149,26 @@ patternProperties:
> >> > > through SETDASA. If static address is not present, this address is assigned
> >> > > through SETNEWDA after assigning a temporary address via ENTDAA.
> >> > >
> >> > > + mipi-i3c-static-method:
> >> > > + $ref: /schemas/types.yaml#/definitions/uint32
> >> > > + minimum: 0x1
> >> > > + maximum: 0xff
> >> > > + default: 1
> >> > > + description: |
> >> > > + Bitmap describing which methods of Dynamic Address Assignment from a
> >> > > + static address are supported by this I3C Target. A bit value of 1
> >> > > + indicates support for that method, and 0 indicates lack of support.
> >> >
> >> > I really am not keen on properties that are bitmaps, why can't we just
> >> > use the strings "setdasa", "setaasa" etc?
> >>
> >> If this comes from a specification, then I'd tend to just copy it rather
> >> than invent our own thing. Obviously if is something structured
> >> fundamentally different from how DT is designed, then we wouldn't. But
> >> this is just a simple property.
> >>
> >
> > The issue being that the specification is not public so it is difficult
> > to take any decision.
>
> There is a public version available in the same link, but you would still
> have to provide them a name and an email ID. The document will be sent to
> the mail ID.
>
The public version only contains one property:
mipi-disco-interface-revision
--
Alexandre Belloni, co-owner and COO, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com
^ permalink raw reply
* Re: [PATCH v5 phy-next 10/27] scsi: ufs: qcom: keep parallel track of PHY power state
From: Vladimir Oltean @ 2026-03-27 11:28 UTC (permalink / raw)
To: Manivannan Sadhasivam
Cc: linux-phy, Vinod Koul, Neil Armstrong, dri-devel, freedreno,
linux-arm-kernel, linux-arm-msm, linux-can, linux-gpio, linux-ide,
linux-kernel, linux-media, linux-pci, linux-renesas-soc,
linux-riscv, linux-rockchip, linux-samsung-soc, linux-scsi,
linux-sunxi, linux-tegra, linux-usb, netdev, spacemit,
UNGLinuxDriver, James E.J. Bottomley, Martin K. Petersen,
Nitin Rawat
In-Reply-To: <gq4sswslkjaoe5hhxe2mz6z57uiumotqknkryadvfsstj4srx4@qgenqekgrqv4>
[-- Attachment #1: Type: text/plain, Size: 1960 bytes --]
On Fri, Mar 27, 2026 at 12:22:46PM +0530, Manivannan Sadhasivam wrote:
> I tested the patch. But it fails ufs_qcom_power_up_sequence() if PHY was already
> powered on:
>
> [ 31.513321] qcom-qmp-ufs-phy 1d87000.phy: phy initialization timed-out
> [ 31.513335] ufshcd-qcom 1d84000.ufshc: Failed to calibrate PHY: -110
> [ 31.565273] ufshcd-qcom 1d84000.ufshc: Enabling the controller failed
>
> Funny thing is, it didn't affect the functionality since the UFS core retries
> ufshcd_hba_enable() and in the error path of ufs_qcom_power_up_sequence(),
> phy_power_off() gets called and that causes the next try to succeed. So it is
> evident that, if PHY was already powered ON, it should be powered off before
> ufs_qcom_phy_power_on(). And due to the UFS driver design,
> ufs_qcom_power_up_sequence() can get called multiple times. So we cannot just
> remove phy_power_off().
>
> Below diff on top of your patch fixes the issue:
>
> ```
> diff --git a/drivers/ufs/host/ufs-qcom.c b/drivers/ufs/host/ufs-qcom.c
> index ed067247d72a..2c9fe03f349e 100644
> --- a/drivers/ufs/host/ufs-qcom.c
> +++ b/drivers/ufs/host/ufs-qcom.c
> @@ -567,6 +567,8 @@ static int ufs_qcom_power_up_sequence(struct ufs_hba *hba)
> if (ret)
> return ret;
>
> + ufs_qcom_phy_power_off(host);
> +
> ret = ufs_qcom_phy_set_gear(host, mode);
> if (ret) {
> dev_err(hba->dev, "%s: phy_set_mode_ext() failed, ret = %d\n",
> ```
>
> - Mani
Understood. Thanks for testing.
I'm still not satisfied with this level of complexity. If I get you
right, ufs_qcom_phy_power_off() is still needed because phy_calibrate()
expects a "fresh after power on" state, otherwise it fails? That would
be the second reason, apart from the first one I already identified
(undo a phy_power_on() done prior to phy_init()).
If so, could you please test the 3 patches attached (no relationship
with anything else we've exchanged thus far)?
[-- Attachment #2: 0001-phy-qcom-qmp-ufs-support-dynamic-gear-changing.patch --]
[-- Type: text/x-diff, Size: 2013 bytes --]
From 2d42c2d40e6ddfd0c73fc39601f93f7b81a42401 Mon Sep 17 00:00:00 2001
From: Vladimir Oltean <vladimir.oltean@nxp.com>
Date: Fri, 27 Mar 2026 12:41:00 +0200
Subject: [PATCH 1/3] phy: qcom-qmp-ufs: support dynamic gear changing
Currently, phy_set_mode_ext() on the QMP UFS PHY expects the PHY to be
powered down, and it makes no change to the hardware state, instead
phy_power_on() followed by phy_calibrate() must be run afterwards.
"Order of API calls" from Documentation/driver-api/phy/phy.rst has a
roundabout and not really clear way of saying that both calling
sequences should be supported. This was further discussed here,
documentation is pending an update:
https://lore.kernel.org/linux-phy/E1vo0mF-00000007kbg-1OeA@rmk-PC.armlinux.org.uk/
By absorbing the phy_power_off() -> ... -> phy_power_on() ->
phy_configure() surrounding sequence into phy_set_mode_ext(), consumer
drivers can be greatly simplified, and we also have a proper
self-standing phy_set_mode_ext() implementation which does not rely on
other calls to do its job.
Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
---
drivers/phy/qualcomm/phy-qcom-qmp-ufs.c | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/drivers/phy/qualcomm/phy-qcom-qmp-ufs.c b/drivers/phy/qualcomm/phy-qcom-qmp-ufs.c
index df138a5442eb..e75b059bf246 100644
--- a/drivers/phy/qualcomm/phy-qcom-qmp-ufs.c
+++ b/drivers/phy/qualcomm/phy-qcom-qmp-ufs.c
@@ -2004,15 +2004,24 @@ static int qmp_ufs_set_mode(struct phy *phy, enum phy_mode mode, int submode)
{
struct qmp_ufs *qmp = phy_get_drvdata(phy);
const struct qmp_phy_cfg *cfg = qmp->cfg;
+ bool powered_on = phy->power_count;
if (submode > cfg->max_supported_gear || submode == 0) {
dev_err(qmp->dev, "Invalid PHY submode %d\n", submode);
return -EINVAL;
}
+ if (powered_on)
+ qmp_ufs_power_off(phy);
+
qmp->mode = mode;
qmp->submode = submode;
+ if (powered_on) {
+ qmp_ufs_power_on(phy);
+ return qmp_ufs_phy_calibrate(phy);
+ }
+
return 0;
}
--
2.34.1
[-- Attachment #3: 0002-scsi-ufs-qcom-call-phy_init-before-phy_power_on.patch --]
[-- Type: text/x-diff, Size: 3707 bytes --]
From 8d156781d38597865da37a86417f553143d74eaa Mon Sep 17 00:00:00 2001
From: Vladimir Oltean <vladimir.oltean@nxp.com>
Date: Fri, 27 Mar 2026 13:14:39 +0200
Subject: [PATCH 2/3] scsi: ufs: qcom: call phy_init() before phy_power_on()
The Qualcomm UFS host controller driver violates the Generic PHY API
expectation, documented in section "Order of API calls" from
Documentation/driver-api/phy/phy.rst, and then tries to hide it.
The expectation is that calls must be made in the phy_init() ->
phy_power_on() -> phy_power_off() -> phy_exit() sequence.
What we actually have is:
ufshcd_init()
-> ufshcd_hba_init()
-> ufshcd_setup_clocks(hba, true)
-> ufshcd_vops_setup_clocks(hba, true, POST_CHANGE)
-> ufs_qcom_setup_clocks(hba, true, POST_CHANGE)
-> phy_power_on(phy)
-> ufshcd_variant_hba_init()
-> ufs_qcom_init()
-> ufs_qcom_setup_clocks(hba, true, POST_CHANGE)
-> phy_power_on(phy)
-> ufshcd_hba_enable()
-> ufshcd_vops_hce_enable_notify()
-> ufs_qcom_hce_enable_notify()
-> ufs_qcom_power_up_sequence()
-> if (phy->power_count) phy_power_off(phy)
-> phy_init(phy)
This "works" because the way that the "phy_power_on was called before
phy_init\n" condition is detected in phy-core.c is if the power_count is
positive at the phy_init() call time.
By having that "if (phy->power_count) phy_power_off(phy)" logic, the
ufs-qcom.c technically sidesteps the test, but actually violates the
Generic PHY API even more (calls phy_power_on() *and* phy_power_off()
before phy_init()).
The reason why I stumbled upon this was that I was trying to remove
dereferences of phy->power_count from drivers. This is a PHY-internal
field, and using it from drivers is highly likely to be incorrect, as
this case showcases rather well.
As commit 77d2fa54a945 ("scsi: ufs: qcom : Refactor phy_power_on/off
calls") shows, this driver tries to couple the PHY power state with the
HBA clocks, for power saving reasons. I won't try to change that, I will
just move the phy_init() call earlier, to ufs_qcom_init().
After the phy_init() movement, ufs_qcom_power_up_sequence() should no
longer need to do either phy_init() nor the conditional phy_power_off().
However, phy_power_off() is still needed, for a separate reason which
will be dealt with separately.
Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
---
Cc: "James E.J. Bottomley" <James.Bottomley@HansenPartnership.com>
Cc: Manivannan Sadhasivam <mani@kernel.org>
Cc: "Martin K. Petersen" <martin.petersen@oracle.com>
Cc: Nitin Rawat <quic_nitirawa@quicinc.com>
v5->v6: rewrite after actually understanding the core issue
v4->v5: patch is new
---
drivers/ufs/host/ufs-qcom.c | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/drivers/ufs/host/ufs-qcom.c b/drivers/ufs/host/ufs-qcom.c
index 375fd24ba458..ffa70c6c7143 100644
--- a/drivers/ufs/host/ufs-qcom.c
+++ b/drivers/ufs/host/ufs-qcom.c
@@ -513,13 +513,6 @@ static int ufs_qcom_power_up_sequence(struct ufs_hba *hba)
/* phy initialization - calibrate the phy */
- ret = phy_init(phy);
- if (ret) {
- dev_err(hba->dev, "%s: phy init failed, ret = %d\n",
- __func__, ret);
- return ret;
- }
-
ret = phy_set_mode_ext(phy, mode, host->phy_gear);
if (ret)
goto out_disable_phy;
@@ -1441,6 +1434,13 @@ static int ufs_qcom_init(struct ufs_hba *hba)
if (err)
goto out_variant_clear;
+ err = phy_init(host->generic_phy);
+ if (err) {
+ dev_err(hba->dev, "%s: phy_init failed, ret = %d\n",
+ __func__, err);
+ goto out_variant_clear;
+ }
+
ufs_qcom_setup_clocks(hba, true, POST_CHANGE);
ufs_qcom_get_default_testbus_cfg(host);
--
2.34.1
[-- Attachment #4: 0003-scsi-ufs-qcom-make-use-of-QMP-PHY-dynamic-gear-switc.patch --]
[-- Type: text/x-diff, Size: 1696 bytes --]
From 88f4bdfee770cd433a940a14e318d8c8b5dfa516 Mon Sep 17 00:00:00 2001
From: Vladimir Oltean <vladimir.oltean@nxp.com>
Date: Fri, 27 Mar 2026 13:18:05 +0200
Subject: [PATCH 3/3] scsi: ufs: qcom: make use of QMP PHY dynamic gear
switching ability
The QMP UFS PHY can now tolerate having phy_set_mode_ext() being called
while the PHY is powered up. We no longer need to power it down, back up
and calibrate it.
Simplify ufs_qcom_power_up_sequence() by relying on just phy_set_mode_ext()
and let PHY power management be handled just by ufs_qcom_setup_clocks().
Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
---
drivers/ufs/host/ufs-qcom.c | 25 +------------------------
1 file changed, 1 insertion(+), 24 deletions(-)
diff --git a/drivers/ufs/host/ufs-qcom.c b/drivers/ufs/host/ufs-qcom.c
index ffa70c6c7143..cf7b67f2021e 100644
--- a/drivers/ufs/host/ufs-qcom.c
+++ b/drivers/ufs/host/ufs-qcom.c
@@ -508,37 +508,14 @@ static int ufs_qcom_power_up_sequence(struct ufs_hba *hba)
if (ret)
return ret;
- if (phy->power_count)
- phy_power_off(phy);
-
-
/* phy initialization - calibrate the phy */
ret = phy_set_mode_ext(phy, mode, host->phy_gear);
if (ret)
- goto out_disable_phy;
-
- /* power on phy - start serdes and phy's power and clocks */
- ret = phy_power_on(phy);
- if (ret) {
- dev_err(hba->dev, "%s: phy power on failed, ret = %d\n",
- __func__, ret);
- goto out_disable_phy;
- }
-
- ret = phy_calibrate(phy);
- if (ret) {
- dev_err(hba->dev, "Failed to calibrate PHY: %d\n", ret);
- goto out_disable_phy;
- }
+ return ret;
ufs_qcom_select_unipro_mode(host);
return 0;
-
-out_disable_phy:
- phy_exit(phy);
-
- return ret;
}
/*
--
2.34.1
^ permalink raw reply related
* Re: [PATCH 01/12] dt-bindings: i3c: Add mipi-i3c-static-method to support SETAASA
From: Akhil R @ 2026-03-27 11:42 UTC (permalink / raw)
To: alexandre.belloni
Cc: Frank.Li, acpica-devel, akhilrajeev, conor+dt, conor, devicetree,
ebiggers, fredrik.markstrom, jonathanh, krzk+dt, lenb, linux-acpi,
linux-hwmon, linux-i3c, linux-kernel, linux-tegra, linux,
miquel.raynal, p.zabel, rafael, robert.moore, robh, smangipudi,
thierry.reding
In-Reply-To: <20260327082721f7e69e6a@mail.local>
On Fri, 27 Mar 2026 09:27:21 +0100, Alexandre Belloni wrote:
> On 27/03/2026 13:48:58+0530, Akhil R wrote:
>> On Thu, 26 Mar 2026 16:44:31 +0100, Alexandre Belloni wrote:
>> > On 26/03/2026 10:05:03-0500, Rob Herring wrote:
>> >> On Wed, Mar 18, 2026 at 05:31:50PM +0000, Conor Dooley wrote:
>> >> > On Wed, Mar 18, 2026 at 10:57:14PM +0530, Akhil R wrote:
>> >> > > Add the 'mipi-i3c-static-method' property mentioned in the MIPI I3C
>> >> > > Discovery and Configuration Specification [1] to specify which discovery
>> >> > > method an I3C device supports during bus initialization. The property is
>> >> > > a bitmap, where a bit value of 1 indicates support for that method, and 0
>> >> > > indicates lack of support.
>> >> > > Bit 0: SETDASA CCC (Direct)
>> >> > > Bit 1: SETAASA CCC (Broadcast)
>> >> > > Bit 2: Other CCC (vendor / standards extension)
>> >> > > All other bits are reserved.
>> >> > >
>> >> > > It is specifically needed when an I3C device requires SETAASA for the
>> >> > > address assignment. SETDASA will be supported by default if this property
>> >> > > is absent - which means for now the property just serves as a flag to
>> >> > > enable SETAASA, but keep the property as a bitmap to align with the
>> >> > > specifications.
>> >> > >
>> >> > > [1] https://www.mipi.org/specifications/disco
>> >> > >
>> >> > > Signed-off-by: Akhil R <akhilrajeev@nvidia.com>
>> >> > > ---
>> >> > > .../devicetree/bindings/i3c/i3c.yaml | 30 ++++++++++++++++---
>> >> > > 1 file changed, 26 insertions(+), 4 deletions(-)
>> >> > >
>> >> > > diff --git a/Documentation/devicetree/bindings/i3c/i3c.yaml b/Documentation/devicetree/bindings/i3c/i3c.yaml
>> >> > > index e25fa72fd785..1705d90d4d79 100644
>> >> > > --- a/Documentation/devicetree/bindings/i3c/i3c.yaml
>> >> > > +++ b/Documentation/devicetree/bindings/i3c/i3c.yaml
>> >> > > @@ -31,10 +31,12 @@ properties:
>> >> > > described in the device tree, which in turn means we have to describe
>> >> > > I3C devices.
>> >> > >
>> >> > > - Another use case for describing an I3C device in the device tree is when
>> >> > > - this I3C device has a static I2C address and we want to assign it a
>> >> > > - specific I3C dynamic address before the DAA takes place (so that other
>> >> > > - devices on the bus can't take this dynamic address).
>> >> > > + Other use-cases for describing an I3C device in the device tree are:
>> >> > > + - When the I3C device has a static I2C address and we want to assign
>> >> > > + it a specific I3C dynamic address before the DAA takes place (so
>> >> > > + that other devices on the bus can't take this dynamic address).
>> >> > > + - When the I3C device requires SETAASA for its discovery and uses a
>> >> > > + pre-defined static address.
>> >> > >
>> >> > > "#size-cells":
>> >> > > const: 0
>> >> > > @@ -147,6 +149,26 @@ patternProperties:
>> >> > > through SETDASA. If static address is not present, this address is assigned
>> >> > > through SETNEWDA after assigning a temporary address via ENTDAA.
>> >> > >
>> >> > > + mipi-i3c-static-method:
>> >> > > + $ref: /schemas/types.yaml#/definitions/uint32
>> >> > > + minimum: 0x1
>> >> > > + maximum: 0xff
>> >> > > + default: 1
>> >> > > + description: |
>> >> > > + Bitmap describing which methods of Dynamic Address Assignment from a
>> >> > > + static address are supported by this I3C Target. A bit value of 1
>> >> > > + indicates support for that method, and 0 indicates lack of support.
>> >> >
>> >> > I really am not keen on properties that are bitmaps, why can't we just
>> >> > use the strings "setdasa", "setaasa" etc?
>> >>
>> >> If this comes from a specification, then I'd tend to just copy it rather
>> >> than invent our own thing. Obviously if is something structured
>> >> fundamentally different from how DT is designed, then we wouldn't. But
>> >> this is just a simple property.
>> >>
>> >
>> > The issue being that the specification is not public so it is difficult
>> > to take any decision.
>>
>> There is a public version available in the same link, but you would still
>> have to provide them a name and an email ID. The document will be sent to
>> the mail ID.
>>
>
> The public version only contains one property:
> mipi-disco-interface-revision
Could you check once if the below link works?
https://www.mipi.org/mipi-disco-for-i3c-download
Best Regards,
Akhil
^ permalink raw reply
* Re: [PATCH] gpio: shared: call gpio_chip::of_xlate() if set
From: Konrad Dybcio @ 2026-03-27 13:05 UTC (permalink / raw)
To: Jon Hunter, Bartosz Golaszewski, Linus Walleij,
Bartosz Golaszewski, Abel Vesa, Sibi Sankar
Cc: linux-gpio, linux-kernel, linux-tegra@vger.kernel.org
In-Reply-To: <dff3c797-a619-42c0-9696-3e617e13356e@nvidia.com>
On 3/17/26 11:12 AM, Jon Hunter wrote:
> Hi Bartosz,
>
> On 16/03/2026 13:52, Bartosz Golaszewski wrote:
>> OF-based GPIO controller drivers may provide a translation function that
>> calculates the real chip offset from whatever devicetree sources
>> provide. We need to take this into account in the shared GPIO management
>> and call of_xlate() if it's provided and adjust the entry->offset we
>> initially set when scanning the tree.
>>
>> To that end: modify the shared GPIO API to take the GPIO chip as
>> argument on setup (to avoid having to rcu_dereference() it from the GPIO
>> device) and protect the access to entry->offset with the existing lock.
>>
>> Fixes: a060b8c511ab ("gpiolib: implement low-level, shared GPIO support")
>> Reported-by: Jon Hunter <jonathanh@nvidia.com>
>> Closes: https://lore.kernel.org/all/921ba8ce-b18e-4a99-966d-c763d22081e2@nvidia.com/
>> Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
>> ---
[...]
> Thanks for sending this. However, I am seeing a different issue now ...
>
> ------------[ cut here ]------------
> WARNING: drivers/gpio/gpiolib-shared.c:499 at gpio_shared_add_proxy_lookup+0x118/0x1d8, CPU#8: swapper/0/1
Not only this, this breaks suspend on the Qualcomm X1E CRD (probably all
/most QC devices by extension)
+CC Abel, Sibi in case this is what you've been chasing
with the patch:
[rootfs ]# echo mem > /sys/power/state
[ 226.043580] PM: suspend entry (deep)
[ 226.047470] Filesystems sync: 0.000 seconds
[ 226.058513] Freezing user space processes
[ 226.066296] Freezing user space processes completed (elapsed 0.003 seconds)
[ 226.073489] OOM killer disabled.
[ 226.076843] Freezing remaining freezable tasks
[ 226.082353] Freezing remaining freezable tasks completed (elapsed 0.000 seconds)
(give it some time, it dies)
without the patch:
[rootfs ]# echo mem > /sys/power/state [ 38.047570] PM: suspend entry (deep)
[ 38.053506] Filesystems sync: 0.001 seconds
[ 38.082615] Freezing user space processes
[ 38.092528] Freezing user space processes completed (elapsed 0.005 seconds)
[ 38.099860] OOM killer disabled.
[ 38.103222] Freezing remaining freezable tasks
[ 38.110329] Freezing remaining freezable tasks completed (elapsed 0.002 seconds)
[ 38.469231] dwc3-qcom-legacy a0f8800.usb: port-1 HS-PHY not in L2
[ 38.652848] Disabling non-boot CPUs ...
[ 38.668957] IRQ205: set affinity failed(-22).
[ 38.669018] IRQ206: set affinity failed(-22).
[ 38.669029] IRQ207: set affinity failed(-22).
[ 38.670351] IRQ274: set affinity failed(-22).
[ 38.671257] psci: CPU11 killed (polled 0 ms)
[ 38.712308] IRQ205: set affinity failed(-22).
[ 38.712323] IRQ206: set affinity failed(-22).
[ 38.712333] IRQ207: set affinity failed(-22).
[ 38.713634] IRQ274: set affinity failed(-22).
[ 38.713821] psci: CPU10 killed (polled 0 ms)
[ 38.754187] IRQ205: set affinity failed(-22).
[ 38.754202] IRQ206: set affinity failed(-22).
[ 38.756479] psci: CPU9 killed (polled 0 ms)
[ 38.789962] psci: CPU8 killed (polled 0 ms)
[ 38.803178] psci: CPU7 killed (polled 0 ms)
[ 38.816286] psci: CPU6 killed (polled 0 ms)
[ 38.828479] psci: CPU5 killed (polled 0 ms)
[ 38.847479] psci: CPU4 killed (polled 0 ms)
[ 38.873528] psci: CPU3 killed (polled 0 ms)
[ 38.894399] psci: CPU2 killed (polled 0 ms)
[ 38.905818] psci: CPU1 killed (polled 0 ms)
[ 38.912658] Enabling non-boot CPUs ...
(resumes just fine)
Konrad
^ permalink raw reply
* Re: [PATCH v2 0/2] PCI: dwc: Add multi-port controller support
From: Neil Armstrong @ 2026-03-27 14:04 UTC (permalink / raw)
To: Sumit Kumar, Bjorn Helgaas, Jingoo Han, Lorenzo Pieralisi,
Krzysztof Wilczyński, Manivannan Sadhasivam, Rob Herring,
Krzysztof Kozlowski, Alim Akhtar, Richard Zhu, Lucas Stach,
Shawn Guo, Sascha Hauer, Pengutronix Kernel Team, Fabio Estevam,
Yue Wang, Kevin Hilman, Jerome Brunet, Martin Blumenstingl,
Paul Walmsley, Greentime Hu, Samuel Holland, Chuanhua Lei,
Marek Vasut, Yoshihiro Shimoda, Geert Uytterhoeven, Magnus Damm,
Pratyush Anand, Thierry Reding, Jonathan Hunter
Cc: linux-pci, linux-kernel, linux-arm-kernel, linux-samsung-soc, imx,
linux-amlogic, linux-arm-msm, linux-renesas-soc, linux-tegra,
linux-riscv
In-Reply-To: <20260305-dt-parser-v2-0-85836db8dc06@oss.qualcomm.com>
Le 05/03/2026 à 07:20, Sumit Kumar a écrit :
> This series adds support for multi-port PCIe controllers in the DesignWare
> driver. Currently, the driver only supports a single Root Port with
> controller-level properties, which doesn't work for multi-port controllers
> where each port may have different configurations.
>
> This series introduces a per-port structure and parsing API that allows
> each Root Port to be configured independently via pcie@N child nodes in
> device tree, while maintaining backward compatibility with existing
> single-port bindings.
>
> Signed-off-by: Sumit Kumar <sumit.kumar@oss.qualcomm.com>
> ---
> Changes in v2:
> - Fix error code preservation in dw_pcie_resume_noirq() to return actual
> error from dw_pcie_wait_for_link() instead of hardcoded -ETIMEDOUT (Mani).
> - Initialize ret variable to -ENOENT in dw_pcie_parse_root_ports() (Mani).
> - dw_pcie_host_init(): Remove -ENOENT error skipping to make parsing
> failures fatal for now, add TODO comment about making properties
> optional later (Mani).
> - Link to v1: https://lore.kernel.org/r/20260105-dt-parser-v1-0-b11c63cb5e2c@oss.qualcomm.com
>
> ---
> Sumit Kumar (2):
> PCI: API changes for multi-port controller support
> PCI: dwc: Add multi-port controller support
>
> drivers/pci/controller/dwc/pci-exynos.c | 4 +-
> drivers/pci/controller/dwc/pci-imx6.c | 15 +-
> drivers/pci/controller/dwc/pci-meson.c | 1 -
> drivers/pci/controller/dwc/pcie-designware-host.c | 175 ++++++++++++++++++----
> drivers/pci/controller/dwc/pcie-designware.c | 32 ++--
> drivers/pci/controller/dwc/pcie-designware.h | 17 ++-
> drivers/pci/controller/dwc/pcie-fu740.c | 6 +-
> drivers/pci/controller/dwc/pcie-intel-gw.c | 13 +-
> drivers/pci/controller/dwc/pcie-qcom-common.c | 5 +-
> drivers/pci/controller/dwc/pcie-qcom-ep.c | 4 +-
> drivers/pci/controller/dwc/pcie-qcom.c | 4 +-
> drivers/pci/controller/dwc/pcie-rcar-gen4.c | 13 +-
> drivers/pci/controller/dwc/pcie-spear13xx.c | 5 +-
> drivers/pci/controller/dwc/pcie-tegra194.c | 4 +-
> drivers/pci/of.c | 6 +-
> drivers/pci/pci.h | 2 +
> 16 files changed, 232 insertions(+), 74 deletions(-)
> ---
> base-commit: 097a6c336d0080725c626fda118ecfec448acd0f
> change-id: 20251010-dt-parser-98b50ce18fc1
>
> Best regards,
Tested on meson-pci (boot log https://gitlab.com/amlogic-foss/abcd-linux-test/-/jobs/13677061036)
Tested-by: Neil Armstrong <neil.armstrong@linaro.org> # On Bananapi M2S
Thanks,
Neil
^ permalink raw reply
* Re: [PATCH v2 2/6] usb: xhci: tegra: Remove redundant mutex when setting phy mode
From: Thierry Reding @ 2026-03-27 14:06 UTC (permalink / raw)
To: Diogo Ivo
Cc: Thierry Reding, Mathias Nyman, Greg Kroah-Hartman,
Jonathan Hunter, JC Kuo, Vinod Koul, Kishon Vijay Abraham I,
Rob Herring, Krzysztof Kozlowski, Conor Dooley, Neil Armstrong,
linux-usb, linux-tegra, linux-kernel, linux-phy, devicetree
In-Reply-To: <00aeda7a-e5e5-4779-b212-6e56c2c5ec31@tecnico.ulisboa.pt>
[-- Attachment #1: Type: text/plain, Size: 2325 bytes --]
On Thu, Mar 26, 2026 at 02:17:33PM +0000, Diogo Ivo wrote:
> Hello,
>
> On 3/24/26 11:48, Thierry Reding wrote:
> > On Tue, Jan 27, 2026 at 03:11:48PM +0000, Diogo Ivo wrote:
> > > As the PHY subsystem already synchronizes concurrent accesses to a PHY
> > > instance with a core-internal mutex remove the driver specific mutex
> > > synchronization.
> > >
> > > Signed-off-by: Diogo Ivo <diogo.ivo@tecnico.ulisboa.pt>
> > > ---
> > > v1->v2:
> > > - New patch
> > > ---
> > > drivers/usb/host/xhci-tegra.c | 4 ----
> > > 1 file changed, 4 deletions(-)
> > >
> > > diff --git a/drivers/usb/host/xhci-tegra.c b/drivers/usb/host/xhci-tegra.c
> > > index 8b492871d21d..927861ca14f2 100644
> > > --- a/drivers/usb/host/xhci-tegra.c
> > > +++ b/drivers/usb/host/xhci-tegra.c
> > > @@ -1357,15 +1357,11 @@ static void tegra_xhci_id_work(struct work_struct *work)
> > > dev_dbg(tegra->dev, "host mode %s\n", str_on_off(tegra->host_mode));
> > > - mutex_lock(&tegra->lock);
> > > -
> > > if (tegra->host_mode)
> > > phy_set_mode_ext(phy, PHY_MODE_USB_OTG, USB_ROLE_HOST);
> > > else
> > > phy_set_mode_ext(phy, PHY_MODE_USB_OTG, USB_ROLE_NONE);
> > > - mutex_unlock(&tegra->lock);
> > > -
> >
> > It looks to me like the mutex here is trying to protect against
> > tegra->host_mode changing while we're setting a different mode. That
> > doesn't seem to be taken care of by the PHY internal mutex.
>
> After taking another look at it I think I understand your point for the
> mutex, but in that case wouldn't it also need to be held in the writer
> of host_mode, tegra_xhci_id_notify()?
Yes, I think it probably would need to. I don't know how likely it is,
but I think the purpose of this is to protect against the ID notifier
firing quickly in succession. Although, given that this runs on a work
queue and work queue instances are non-reentrant to my knowledge, I
don't think we need the mutex here after all.
> This patch has been picked up as-is into usb-next so it would be nice to
> figure this out before it gets merged in the next merge window.
Given the above, I think it's fine. Maybe the commit message doesn't
give a correct reason for why we don't need the mutex, but the resulting
code looks like it should be fine regardless.
Thierry
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply
* Re: [PATCH v10 RESEND 1/3] i2c: tegra: Introduce tegra_i2c_variant to identify DVC and VI
From: Thierry Reding @ 2026-03-27 14:15 UTC (permalink / raw)
To: Kartik Rajput
Cc: ldewangan, digetx, andi.shyti, jonathanh, akhilrajeev, smangipudi,
linux-i2c, linux-tegra, linux-kernel
In-Reply-To: <20260324055843.549808-2-kkartik@nvidia.com>
[-- Attachment #1: Type: text/plain, Size: 924 bytes --]
On Tue, Mar 24, 2026 at 11:28:41AM +0530, Kartik Rajput wrote:
> Replace the per-instance DVC/VI boolean flags with a tegra_i2c_variant
> enum and move the variant field into tegra_i2c_hw_feature so it is
> populated via SoC match data.
>
> Add dedicated SoC data entries for the "nvidia,tegra20-i2c-dvc" and
> "nvidia,tegra210-i2c-vi" compatibles and drop compatible-string checks
> from tegra_i2c_parse_dt.
>
> Suggested-by: Jon Hunter <jonathanh@nvidia.com>
> Signed-off-by: Kartik Rajput <kkartik@nvidia.com>
> Reviewed-by: Jon Hunter <jonathanh@nvidia.com>
> Tested-by: Jon Hunter <jonathanh@nvidia.com>
> ---
> Changes in v10:
> * Suqashed "i2c: tegra: Move variant to tegra_i2c_hw_feature"
> with this patch.
> ---
> drivers/i2c/busses/i2c-tegra.c | 112 ++++++++++++++++++++++++++++-----
> 1 file changed, 95 insertions(+), 17 deletions(-)
Acked-by: Thierry Reding <treding@nvidia.com>
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply
* Re: [PATCH v10 RESEND 2/3] i2c: tegra: Add logic to support different register offsets
From: Thierry Reding @ 2026-03-27 14:15 UTC (permalink / raw)
To: Kartik Rajput
Cc: ldewangan, digetx, andi.shyti, jonathanh, akhilrajeev, smangipudi,
linux-i2c, linux-tegra, linux-kernel
In-Reply-To: <20260324055843.549808-3-kkartik@nvidia.com>
[-- Attachment #1: Type: text/plain, Size: 1584 bytes --]
On Tue, Mar 24, 2026 at 11:28:42AM +0530, Kartik Rajput wrote:
> Tegra410 use different offsets for existing I2C registers, update
> the logic to use appropriate offsets per SoC.
>
> As the register offsets are now defined in the SoC-specific
> tegra_i2c_regs structures, the tegra_i2c_reg_addr() function is no
> longer needed to translate register offsets and has been removed.
>
> Signed-off-by: Kartik Rajput <kkartik@nvidia.com>
> Reviewed-by: Jon Hunter <jonathanh@nvidia.com>
> Tested-by: Jon Hunter <jonathanh@nvidia.com>
> ---
> Changes in v9:
> * Do not remove dvc_writel() and dvc_readl() calls.
> Changes in v8:
> * Replace usage of dvc_writel() with writel_relaxed().
> * Remove dvc_writel().
> Changes in v7:
> * Fix Tegra256 reg offsets, change it to tegra264_i2c_regs as it
> supports SW mutex.
> Changes in v6:
> * Do not remove dvc_writel().
> * Keep DVC registers defined as a macro.
> * Correct Tegra20 DVC register offsets.
> * Remove sl_cnfg, sl_addr1 and sl_addr2 registers for DVC and VI
> as they are not used.
> Changes in v2:
> * Replace individual is_dvc and is_vi flags with an I2C variant.
> * Add tegra20_dvc_i2c_hw and tegra210_vi_i2c_hw in a separate
> patch.
> * Use calculated offsets for tegra20_dvc_i2c_regs and
> tegra210_vi_i2c_regs.
> * Initialize registers only if they are used on the given SoC.
> ---
> drivers/i2c/busses/i2c-tegra.c | 359 ++++++++++++++++++++++-----------
> 1 file changed, 237 insertions(+), 122 deletions(-)
Acked-by: Thierry Reding <treding@nvidia.com>
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply
* Re: [PATCH v10 RESEND 3/3] i2c: tegra: Add support for Tegra410
From: Thierry Reding @ 2026-03-27 14:16 UTC (permalink / raw)
To: Kartik Rajput
Cc: ldewangan, digetx, andi.shyti, jonathanh, akhilrajeev, smangipudi,
linux-i2c, linux-tegra, linux-kernel
In-Reply-To: <20260324055843.549808-4-kkartik@nvidia.com>
[-- Attachment #1: Type: text/plain, Size: 616 bytes --]
On Tue, Mar 24, 2026 at 11:28:43AM +0530, Kartik Rajput wrote:
> Add support for the Tegra410 SoC, which has 4 I2C controllers. The
> controllers are feature-equivalent to Tegra264; only the register
> offsets differ.
>
> Signed-off-by: Kartik Rajput <kkartik@nvidia.com>
> Reviewed-by: Jon Hunter <jonathanh@nvidia.com>
> Tested-by: Jon Hunter <jonathanh@nvidia.com>
> ---
> Changes in v3:
> * Updated timing parameters for Tegra410.
> ---
> drivers/i2c/busses/i2c-tegra.c | 63 ++++++++++++++++++++++++++++++++++
> 1 file changed, 63 insertions(+)
Acked-by: Thierry Reding <treding@nvidia.com>
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply
* Re: [PATCH v2 0/2] soc/tegra: cbb: Add Tegra238 support
From: Thierry Reding @ 2026-03-27 14:27 UTC (permalink / raw)
To: Sumit Gupta
Cc: treding, jonathanh, robh, krzk+dt, conor+dt, devicetree,
linux-tegra, linux-kernel, bbasu
In-Reply-To: <20260325125726.2694144-1-sumitg@nvidia.com>
[-- Attachment #1: Type: text/plain, Size: 875 bytes --]
On Wed, Mar 25, 2026 at 06:27:24PM +0530, Sumit Gupta wrote:
> Add support for Control Backbone (CBB) 2.0 based fabrics in Tegra238 SoC.
>
> The series includes:
> - DT binding updates for Tegra238 CBB compatible strings
> - Driver support for Tegra238 AON, APE, BPMP, and CBB fabrics
>
> v1[1] -> v2:
> - Add DT maintainers for review. Forgot to add earlier.
>
> Sumit Gupta (2):
> dt-bindings: arm: tegra: Add Tegra238 CBB compatible strings
> soc/tegra: cbb: Add support for CBB fabrics in Tegra238
>
> .../arm/tegra/nvidia,tegra234-cbb.yaml | 4 +
> drivers/soc/tegra/cbb/tegra234-cbb.c | 134 ++++++++++++++++++
> 2 files changed, 138 insertions(+)
>
> [1] https://lore.kernel.org/lkml/20260303155927.1885297-1-sumitg@nvidia.com/
Applied after adjusting the commit message as suggested by Krzysztof.
Thanks,
Thierry
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply
* Re: [PATCH 0/3] soc/tegra: cbb: Bug fixes for CBB 2.0 driver
From: Thierry Reding @ 2026-03-27 14:31 UTC (permalink / raw)
To: Sumit Gupta; +Cc: treding, jonathanh, linux-tegra, linux-kernel, bbasu
In-Reply-To: <20260121101205.3186310-1-sumitg@nvidia.com>
[-- Attachment #1: Type: text/plain, Size: 566 bytes --]
On Wed, Jan 21, 2026 at 03:42:02PM +0530, Sumit Gupta wrote:
> Bug fixes for Tegra CBB 2.0 driver addressing resume handling,
> fabric lookup table sizing, and cross-fabric timeout lookup.
>
> Sumit Gupta (3):
> soc/tegra: cbb: set ERD on resume for err interrupt
> soc/tegra: cbb: fix incorrect ARRAY_SIZE in fabric lookup tables
> soc/tegra: cbb: fix cross-fabric target timeout lookup
>
> drivers/soc/tegra/cbb/tegra234-cbb.c | 35 +++++++++++++++++++++++++---
> 1 file changed, 32 insertions(+), 3 deletions(-)
Applied, thanks.
Thierry
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox