Lines Matching +full:tcsr +full:- +full:reg

1 // SPDX-License-Identifier: GPL-2.0-only
2 /* Copyright (c) 2015-2018, The Linux Foundation. All rights reserved.
6 * Driver for interrupt combiners in the Top-level Control and Status
7 * Registers (TCSR) hardware block in Qualcomm Technologies chips.
10 * signal routed to a parent interrupt controller, and provides read-
11 * only, 32-bit registers to query the status of individual interrupts.
39 static inline int irq_nr(u32 reg, u32 bit) in irq_nr() argument
41 return reg * REG_SIZE + bit; in irq_nr()
51 u32 reg; in combiner_handle_irq() local
55 for (reg = 0; reg < combiner->nregs; reg++) { in combiner_handle_irq()
60 bit = readl_relaxed(combiner->regs[reg].addr); in combiner_handle_irq()
61 status = bit & combiner->regs[reg].enabled; in combiner_handle_irq()
65 combiner->regs[reg].enabled, in combiner_handle_irq()
66 combiner->regs[reg].addr); in combiner_handle_irq()
71 hwirq = irq_nr(reg, bit); in combiner_handle_irq()
72 generic_handle_domain_irq(combiner->domain, hwirq); in combiner_handle_irq()
82 struct combiner_reg *reg = combiner->regs + data->hwirq / REG_SIZE; in combiner_irq_chip_mask_irq() local
84 clear_bit(data->hwirq % REG_SIZE, &reg->enabled); in combiner_irq_chip_mask_irq()
90 struct combiner_reg *reg = combiner->regs + data->hwirq / REG_SIZE; in combiner_irq_chip_unmask_irq() local
92 set_bit(data->hwirq % REG_SIZE, &reg->enabled); in combiner_irq_chip_unmask_irq()
98 .name = "qcom-irq-combiner"
105 irq_set_chip_data(irq, domain->host_data); in combiner_irq_map()
118 struct combiner *combiner = d->host_data; in combiner_irq_translate()
120 if (is_acpi_node(fws->fwnode)) { in combiner_irq_translate()
121 if (WARN_ON((fws->param_count != 2) || in combiner_irq_translate()
122 (fws->param[0] >= combiner->nirqs) || in combiner_irq_translate()
123 (fws->param[1] & IORESOURCE_IRQ_LOWEDGE) || in combiner_irq_translate()
124 (fws->param[1] & IORESOURCE_IRQ_HIGHEDGE))) in combiner_irq_translate()
125 return -EINVAL; in combiner_irq_translate()
127 *hwirq = fws->param[0]; in combiner_irq_translate()
128 *type = fws->param[1]; in combiner_irq_translate()
132 return -EINVAL; in combiner_irq_translate()
145 if (ares->type == ACPI_RESOURCE_TYPE_GENERIC_REGISTER) in count_registers_cb()
152 acpi_handle ahandle = ACPI_HANDLE(&pdev->dev); in count_registers()
157 return -EINVAL; in count_registers()
162 return -EINVAL; in count_registers()
175 struct acpi_resource_generic_register *reg; in get_registers_cb() local
179 if (ares->type != ACPI_RESOURCE_TYPE_GENERIC_REGISTER) in get_registers_cb()
182 reg = &ares->data.generic_reg; in get_registers_cb()
183 paddr = reg->address; in get_registers_cb()
184 if ((reg->space_id != ACPI_SPACE_MEM) || in get_registers_cb()
185 (reg->bit_offset != 0) || in get_registers_cb()
186 (reg->bit_width > REG_SIZE)) { in get_registers_cb()
187 dev_err(ctx->dev, "Bad register resource @%pa\n", &paddr); in get_registers_cb()
188 ctx->err = -EINVAL; in get_registers_cb()
192 vaddr = devm_ioremap(ctx->dev, reg->address, REG_SIZE); in get_registers_cb()
194 dev_err(ctx->dev, "Can't map register @%pa\n", &paddr); in get_registers_cb()
195 ctx->err = -ENOMEM; in get_registers_cb()
199 ctx->combiner->regs[ctx->combiner->nregs].addr = vaddr; in get_registers_cb()
200 ctx->combiner->nirqs += reg->bit_width; in get_registers_cb()
201 ctx->combiner->nregs++; in get_registers_cb()
207 acpi_handle ahandle = ACPI_HANDLE(&pdev->dev); in get_registers()
212 return -EINVAL; in get_registers()
214 ctx.dev = &pdev->dev; in get_registers()
233 dev_err(&pdev->dev, "Error reading register resources\n"); in combiner_probe()
234 return -EINVAL; in combiner_probe()
237 combiner = devm_kzalloc(&pdev->dev, struct_size(combiner, regs, nregs), in combiner_probe()
240 return -ENOMEM; in combiner_probe()
246 combiner->parent_irq = platform_get_irq(pdev, 0); in combiner_probe()
247 if (combiner->parent_irq <= 0) in combiner_probe()
248 return -EPROBE_DEFER; in combiner_probe()
250 combiner->domain = irq_domain_create_linear(pdev->dev.fwnode, combiner->nirqs, in combiner_probe()
252 if (!combiner->domain) in combiner_probe()
254 return -ENODEV; in combiner_probe()
256 irq_set_chained_handler_and_data(combiner->parent_irq, in combiner_probe()
259 dev_info(&pdev->dev, "Initialized with [p=%d,n=%d,r=%p]\n", in combiner_probe()
260 combiner->parent_irq, combiner->nirqs, combiner->regs[0].addr); in combiner_probe()
271 .name = "qcom-irq-combiner",