Lines Matching +full:interrupt +full:- +full:map +full:- +full:mask

1 // SPDX-License-Identifier: GPL-2.0
3 #define pr_fmt(fmt) "irq-ls-extirq: " fmt
13 #include <dt-bindings/interrupt-controller/arm-gic.h>
23 struct irq_fwspec map[MAXIRQ]; member
29 struct ls_extirq_data *priv = data->chip_data; in ls_extirq_set_type()
30 irq_hw_number_t hwirq = data->hwirq; in ls_extirq_set_type()
31 u32 value, mask; in ls_extirq_set_type() local
33 if (priv->bit_reverse) in ls_extirq_set_type()
34 mask = 1U << (31 - hwirq); in ls_extirq_set_type()
36 mask = 1U << hwirq; in ls_extirq_set_type()
41 value = mask; in ls_extirq_set_type()
45 value = mask; in ls_extirq_set_type()
52 return -EINVAL; in ls_extirq_set_type()
54 regmap_update_bits(priv->syscon, priv->intpcr, mask, value); in ls_extirq_set_type()
60 .name = "ls-extirq",
74 struct ls_extirq_data *priv = domain->host_data; in ls_extirq_domain_alloc()
78 if (fwspec->param_count != 2) in ls_extirq_domain_alloc()
79 return -EINVAL; in ls_extirq_domain_alloc()
81 hwirq = fwspec->param[0]; in ls_extirq_domain_alloc()
82 if (hwirq >= priv->nirq) in ls_extirq_domain_alloc()
83 return -EINVAL; in ls_extirq_domain_alloc()
88 return irq_domain_alloc_irqs_parent(domain, virq, 1, &priv->map[hwirq]); in ls_extirq_domain_alloc()
100 const __be32 *map; in ls_extirq_parse_map() local
104 map = of_get_property(node, "interrupt-map", &mapsize); in ls_extirq_parse_map()
105 if (!map) in ls_extirq_parse_map()
106 return -ENOENT; in ls_extirq_parse_map()
107 if (mapsize % sizeof(*map)) in ls_extirq_parse_map()
108 return -EINVAL; in ls_extirq_parse_map()
109 mapsize /= sizeof(*map); in ls_extirq_parse_map()
116 return -EINVAL; in ls_extirq_parse_map()
117 hwirq = be32_to_cpup(map); in ls_extirq_parse_map()
119 return -EINVAL; in ls_extirq_parse_map()
120 priv->nirq = max(priv->nirq, hwirq + 1); in ls_extirq_parse_map()
122 ipar = of_find_node_by_phandle(be32_to_cpup(map + 2)); in ls_extirq_parse_map()
123 map += 3; in ls_extirq_parse_map()
124 mapsize -= 3; in ls_extirq_parse_map()
126 return -EINVAL; in ls_extirq_parse_map()
127 priv->map[hwirq].fwnode = &ipar->fwnode; in ls_extirq_parse_map()
128 ret = of_property_read_u32(ipar, "#interrupt-cells", &intsize); in ls_extirq_parse_map()
133 return -EINVAL; in ls_extirq_parse_map()
135 priv->map[hwirq].param_count = intsize; in ls_extirq_parse_map()
137 priv->map[hwirq].param[j] = be32_to_cpup(map++); in ls_extirq_parse_map()
138 mapsize -= intsize; in ls_extirq_parse_map()
154 return -ENODEV; in ls_extirq_of_init()
159 return -ENOMEM; in ls_extirq_of_init()
161 priv->syscon = syscon_node_to_regmap(node->parent); in ls_extirq_of_init()
162 if (IS_ERR(priv->syscon)) { in ls_extirq_of_init()
163 ret = PTR_ERR(priv->syscon); in ls_extirq_of_init()
167 ret = of_property_read_u32(node, "reg", &priv->intpcr); in ls_extirq_of_init()
177 if (of_device_is_compatible(node, "fsl,ls1021a-extirq")) { in ls_extirq_of_init()
180 ret = regmap_read(priv->syscon, LS1021A_SCFGREVCR, &revcr); in ls_extirq_of_init()
183 priv->bit_reverse = (revcr != 0); in ls_extirq_of_init()
186 domain = irq_domain_add_hierarchy(parent_domain, 0, priv->nirq, node, in ls_extirq_of_init()
189 ret = -ENOMEM; in ls_extirq_of_init()
197 IRQCHIP_DECLARE(ls1021a_extirq, "fsl,ls1021a-extirq", ls_extirq_of_init);