summaryrefslogtreecommitdiff
path: root/drivers/irqchip
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2026-02-10 20:45:30 -0800
committerLinus Torvalds <torvalds@linux-foundation.org>2026-02-10 20:45:30 -0800
commitbdbddf72a2ab1cfea699959795d70df3931eefe7 (patch)
treee3f8018c6e8d0354bf2a2fbd99569790ef521805 /drivers/irqchip
parentf7fae9b4d38f0c52489640c9688e529c4a58e1b6 (diff)
parentcfd00b7e26c8331e3bb0f03ca770888866c15ff4 (diff)
Merge tag 'soc-drivers-7.0' of git://git.kernel.org/pub/scm/linux/kernel/git/soc/soc
Pull SoC driver updates from Arnd Bergmann: "There are are a number of to firmware drivers, in particular the TEE subsystem: - a bus callback for TEE firmware that device drivers can register to - sysfs support for tee firmware information - minor updates to platform specific TEE drivers for AMD, NXP, Qualcomm and the generic optee driver - ARM SCMI firmware refactoring to improve the protocol discover among other fixes and cleanups - ARM FF-A firmware interoperability improvements The reset controller and memory controller subsystems gain support for additional hardware platforms from Mediatek, Renesas, NXP, Canaan and SpacemiT. Most of the other changes are for random drivers/soc code. Among a number of cleanups and newly added hardware support, including: - Mediatek MT8196 DVFS power management and mailbox support - Qualcomm SCM firmware and MDT loader refactoring, as part of the new Glymur platform support. - NXP i.MX9 System Manager firmware support for accessing the syslog - Minor updates for TI, Renesas, Samsung, Apple, Marvell and AMD SoCs" * tag 'soc-drivers-7.0' of git://git.kernel.org/pub/scm/linux/kernel/git/soc/soc: (171 commits) bus: fsl-mc: fix an error handling in fsl_mc_device_add() reset: spacemit: Add SpacemiT K3 reset driver reset: spacemit: Extract common K1 reset code reset: Create subdirectory for SpacemiT drivers dt-bindings: soc: spacemit: Add K3 reset support and IDs reset: canaan: k230: drop OF dependency and enable by default reset: rzg2l-usbphy-ctrl: Add suspend/resume support reset: rzg2l-usbphy-ctrl: Propagate the return value of regmap_field_update_bits() reset: gpio: check the return value of gpiod_set_value_cansleep() reset: imx8mp-audiomix: Support i.MX8ULP SIM LPAV reset: imx8mp-audiomix: Extend the driver usage reset: imx8mp-audiomix: Switch to using regmap API reset: imx8mp-audiomix: Drop unneeded macros soc: fsl: qe: qe_ports_ic: Consolidate chained IRQ handler install/remove soc: mediatek: mtk-cmdq: Add mminfra_offset adjustment for DRAM addresses soc: mediatek: mtk-cmdq: Extend cmdq_pkt_write API for SoCs without subsys ID soc: mediatek: mtk-cmdq: Add pa_base parsing for hardware without subsys ID support soc: mediatek: mtk-cmdq: Add cmdq_get_mbox_priv() in cmdq_pkt_create() mailbox: mtk-cmdq: Add driver data to support for MT8196 mailbox: mtk-cmdq: Add mminfra_offset configuration for DRAM transaction ...
Diffstat (limited to 'drivers/irqchip')
-rw-r--r--drivers/irqchip/irq-ls-extirq.c47
-rw-r--r--drivers/irqchip/irq-renesas-rza1.c43
2 files changed, 33 insertions, 57 deletions
diff --git a/drivers/irqchip/irq-ls-extirq.c b/drivers/irqchip/irq-ls-extirq.c
index 96f9c20621cf..a7e9c3885b09 100644
--- a/drivers/irqchip/irq-ls-extirq.c
+++ b/drivers/irqchip/irq-ls-extirq.c
@@ -125,45 +125,32 @@ static const struct irq_domain_ops extirq_domain_ops = {
static int
ls_extirq_parse_map(struct ls_extirq_data *priv, struct device_node *node)
{
- const __be32 *map;
- u32 mapsize;
+ struct of_imap_parser imap_parser;
+ struct of_imap_item imap_item;
int ret;
- map = of_get_property(node, "interrupt-map", &mapsize);
- if (!map)
- return -ENOENT;
- if (mapsize % sizeof(*map))
- return -EINVAL;
- mapsize /= sizeof(*map);
+ ret = of_imap_parser_init(&imap_parser, node, &imap_item);
+ if (ret)
+ return ret;
- while (mapsize) {
+ for_each_of_imap_item(&imap_parser, &imap_item) {
struct device_node *ipar;
- u32 hwirq, intsize, j;
+ u32 hwirq;
+ int i;
- if (mapsize < 3)
- return -EINVAL;
- hwirq = be32_to_cpup(map);
- if (hwirq >= MAXIRQ)
+ hwirq = imap_item.child_imap[0];
+ if (hwirq >= MAXIRQ) {
+ of_node_put(imap_item.parent_args.np);
return -EINVAL;
+ }
priv->nirq = max(priv->nirq, hwirq + 1);
- ipar = of_find_node_by_phandle(be32_to_cpup(map + 2));
- map += 3;
- mapsize -= 3;
- if (!ipar)
- return -EINVAL;
- priv->map[hwirq].fwnode = &ipar->fwnode;
- ret = of_property_read_u32(ipar, "#interrupt-cells", &intsize);
- if (ret)
- return ret;
-
- if (intsize > mapsize)
- return -EINVAL;
+ ipar = of_node_get(imap_item.parent_args.np);
+ priv->map[hwirq].fwnode = of_fwnode_handle(ipar);
- priv->map[hwirq].param_count = intsize;
- for (j = 0; j < intsize; ++j)
- priv->map[hwirq].param[j] = be32_to_cpup(map++);
- mapsize -= intsize;
+ priv->map[hwirq].param_count = imap_item.parent_args.args_count;
+ for (i = 0; i < priv->map[hwirq].param_count; i++)
+ priv->map[hwirq].param[i] = imap_item.parent_args.args[i];
}
return 0;
}
diff --git a/drivers/irqchip/irq-renesas-rza1.c b/drivers/irqchip/irq-renesas-rza1.c
index 6047a524ac77..370d968b2398 100644
--- a/drivers/irqchip/irq-renesas-rza1.c
+++ b/drivers/irqchip/irq-renesas-rza1.c
@@ -142,47 +142,36 @@ static const struct irq_domain_ops rza1_irqc_domain_ops = {
static int rza1_irqc_parse_map(struct rza1_irqc_priv *priv,
struct device_node *gic_node)
{
+ struct of_imap_parser imap_parser;
struct device *dev = priv->dev;
- unsigned int imaplen, i, j;
+ struct of_imap_item imap_item;
struct device_node *ipar;
- const __be32 *imap;
- u32 intsize;
+ unsigned int j;
+ u32 i = 0;
int ret;
- imap = of_get_property(dev->of_node, "interrupt-map", &imaplen);
- if (!imap)
- return -EINVAL;
-
- for (i = 0; i < IRQC_NUM_IRQ; i++) {
- if (imaplen < 3)
- return -EINVAL;
+ ret = of_imap_parser_init(&imap_parser, dev->of_node, &imap_item);
+ if (ret)
+ return ret;
+ for_each_of_imap_item(&imap_parser, &imap_item) {
/* Check interrupt number, ignore sense */
- if (be32_to_cpup(imap) != i)
+ if (imap_item.child_imap[0] != i) {
+ of_node_put(imap_item.parent_args.np);
return -EINVAL;
+ }
- ipar = of_find_node_by_phandle(be32_to_cpup(imap + 2));
+ ipar = imap_item.parent_args.np;
if (ipar != gic_node) {
of_node_put(ipar);
return -EINVAL;
}
- imap += 3;
- imaplen -= 3;
-
- ret = of_property_read_u32(ipar, "#interrupt-cells", &intsize);
- of_node_put(ipar);
- if (ret)
- return ret;
-
- if (imaplen < intsize)
- return -EINVAL;
-
- priv->map[i].args_count = intsize;
- for (j = 0; j < intsize; j++)
- priv->map[i].args[j] = be32_to_cpup(imap++);
+ priv->map[i].args_count = imap_item.parent_args.args_count;
+ for (j = 0; j < priv->map[i].args_count; j++)
+ priv->map[i].args[j] = imap_item.parent_args.args[j];
- imaplen -= intsize;
+ i++;
}
return 0;