Lines Matching +full:semi +full:- +full:static

1 // SPDX-License-Identifier: GPL-2.0+
3 * Actions Semi Owl SoCs SIRQ interrupt controller driver
5 * Copyright (C) 2014 Actions Semi Inc.
6 * David Liu <liuwei@actions-semi.com>
19 #include <dt-bindings/interrupt-controller/arm-gic.h>
57 static const struct owl_sirq_params owl_sirq_s500_params = {
63 static const struct owl_sirq_params owl_sirq_s900_params = {
68 static u32 owl_field_get(u32 val, u32 index) in owl_field_get()
81 static u32 owl_field_prep(u32 val, u32 index) in owl_field_prep()
94 static u32 owl_sirq_read_extctl(struct owl_sirq_chip_data *data, u32 index) in owl_sirq_read_extctl()
98 val = readl_relaxed(data->base + data->params->reg_offset[index]); in owl_sirq_read_extctl()
99 if (data->params->reg_shared) in owl_sirq_read_extctl()
105 static void owl_sirq_write_extctl(struct owl_sirq_chip_data *data, in owl_sirq_write_extctl()
110 if (data->params->reg_shared) { in owl_sirq_write_extctl()
111 val = readl_relaxed(data->base + data->params->reg_offset[index]); in owl_sirq_write_extctl()
116 writel_relaxed(extctl, data->base + data->params->reg_offset[index]); in owl_sirq_write_extctl()
119 static void owl_sirq_clear_set_extctl(struct owl_sirq_chip_data *d, in owl_sirq_clear_set_extctl()
125 raw_spin_lock_irqsave(&d->lock, flags); in owl_sirq_clear_set_extctl()
130 raw_spin_unlock_irqrestore(&d->lock, flags); in owl_sirq_clear_set_extctl()
133 static void owl_sirq_eoi(struct irq_data *data) in owl_sirq_eoi()
143 data->hwirq); in owl_sirq_eoi()
148 static void owl_sirq_mask(struct irq_data *data) in owl_sirq_mask()
152 owl_sirq_clear_set_extctl(chip_data, INTC_EXTCTL_EN, 0, data->hwirq); in owl_sirq_mask()
156 static void owl_sirq_unmask(struct irq_data *data) in owl_sirq_unmask()
160 owl_sirq_clear_set_extctl(chip_data, 0, INTC_EXTCTL_EN, data->hwirq); in owl_sirq_unmask()
169 static int owl_sirq_set_type(struct irq_data *data, unsigned int type) in owl_sirq_set_type()
190 return -EINVAL; in owl_sirq_set_type()
194 data->hwirq); in owl_sirq_set_type()
199 static struct irq_chip owl_sirq_chip = {
200 .name = "owl-sirq",
211 static int owl_sirq_domain_translate(struct irq_domain *d, in owl_sirq_domain_translate()
216 if (!is_of_node(fwspec->fwnode)) in owl_sirq_domain_translate()
217 return -EINVAL; in owl_sirq_domain_translate()
219 if (fwspec->param_count != 2 || fwspec->param[0] >= NUM_SIRQ) in owl_sirq_domain_translate()
220 return -EINVAL; in owl_sirq_domain_translate()
222 *hwirq = fwspec->param[0]; in owl_sirq_domain_translate()
223 *type = fwspec->param[1]; in owl_sirq_domain_translate()
228 static int owl_sirq_domain_alloc(struct irq_domain *domain, unsigned int virq, in owl_sirq_domain_alloc()
231 struct owl_sirq_chip_data *chip_data = domain->host_data; in owl_sirq_domain_alloc()
239 return -EINVAL; in owl_sirq_domain_alloc()
256 return -EINVAL; in owl_sirq_domain_alloc()
262 parent_fwspec.fwnode = domain->parent->fwnode; in owl_sirq_domain_alloc()
265 parent_fwspec.param[1] = chip_data->ext_irqs[hwirq]; in owl_sirq_domain_alloc()
271 static const struct irq_domain_ops owl_sirq_domain_ops = {
277 static int __init owl_sirq_init(const struct owl_sirq_params *params, in owl_sirq_init()
288 return -ENXIO; in owl_sirq_init()
293 return -ENOMEM; in owl_sirq_init()
295 raw_spin_lock_init(&chip_data->lock); in owl_sirq_init()
297 chip_data->params = params; in owl_sirq_init()
299 chip_data->base = of_iomap(node, 0); in owl_sirq_init()
300 if (!chip_data->base) { in owl_sirq_init()
302 ret = -ENXIO; in owl_sirq_init()
316 ret = -EINVAL; in owl_sirq_init()
320 chip_data->ext_irqs[i] = irq.args[1]; in owl_sirq_init()
330 ret = -ENOMEM; in owl_sirq_init()
337 iounmap(chip_data->base); in owl_sirq_init()
344 static int __init owl_sirq_s500_of_init(struct device_node *node, in owl_sirq_s500_of_init()
350 IRQCHIP_DECLARE(owl_sirq_s500, "actions,s500-sirq", owl_sirq_s500_of_init);
351 IRQCHIP_DECLARE(owl_sirq_s700, "actions,s700-sirq", owl_sirq_s500_of_init);
353 static int __init owl_sirq_s900_of_init(struct device_node *node, in owl_sirq_s900_of_init()
359 IRQCHIP_DECLARE(owl_sirq_s900, "actions,s900-sirq", owl_sirq_s900_of_init);