mirror of
https://gitee.com/bianbu-linux/linux-6.6
synced 2025-04-24 14:07:52 -04:00
Boring updates for the interrupt subsystem:
Core: - Prevent a deadlock of nested interrupt threads vs. synchronize_hard() - Removal of a stale extern declaration Drivers: - The first new driver since v6.2 for Amlogic-C3 SoCs - The usual small fixes, cleanups and improvements all over the place -----BEGIN PGP SIGNATURE----- iQJHBAABCgAxFiEEQp8+kY+LLUocC4bMphj1TA10mKEFAmTsjR0THHRnbHhAbGlu dXRyb25peC5kZQAKCRCmGPVMDXSYofmLEAC5anouyAUbGjl/cL//+2GkvWB2YgO2 +D7q8tx3Tt5US/vpiYaDvFs+at+2lAyB6M/KUkvYSCne9bm80+YqaL+73iM6YQKH yNDrAnLR1FA4+fHIvvhmk23U1uUjWgSTL7iKufgNWf8I0aYsWLTIX3N6m0606ZLE eUNIf7w+aZRr/axHdadRQpib6l1fvfA3C72urPRBnZDA56ZDAgE9tS0kfk9D+3sW BgXRp4knvHBf6I4RdA10hHDTa1RuX9xkDeAC1a/ljWpbCEgEDPJ+5JI+TD+fU/d5 TCVGa7GwqJc2srRFwy76/t0jQrG7DnwW56SsMomjS+vjIu4exNFwXJ6LqZSJacwa Z3HB0Py3awQWPfHdFqdF9LHyum+a58RHX96RenlL8Q/42qe5K6RmAIfcAaiy2OpL xAGy9+nplMWh+qde9q1o30WPr08GhhDEXrdHZdAAODjBeoUDGmFooH5NHAFjw2+Q ba15/f7Nl8KIl854OUJv4cftNEv5klpueLR/YUviivoO55vydRae/k/CSPhvt7TN VIQ+vgiaiOCEwAAx2kP7Au0ADeEMCYiEqH9KWBp33dvjNZMt2DbAGLDWagcy8N9y R8ms4c5e7Z2MvN9Z6YDihQ1XvkQsdX/dWwJq3weH3c/tP1MBFFHZYdeQhIVKTIKR 4zFKi4jrlmn0vQ== =jiUK -----END PGP SIGNATURE----- Merge tag 'irq-core-2023-08-28' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip Pull irq updates from Thomas Gleixner: "Boring updates for the interrupt subsystem: Core: - Prevent a deadlock of nested interrupt threads vs. synchronize_hard() - Removal of a stale extern declaration Drivers: - The first new driver since v6.2 for Amlogic-C3 SoCs - The usual small fixes, cleanups and improvements all over the place" * tag 'irq-core-2023-08-28' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: irqchip: Add support for Amlogic-C3 SoCs dt-bindings: interrupt-controller: Add support for Amlogic-C3 SoCs irqchip/irq-mvebu-sei: Use devm_platform_get_and_ioremap_resource() irqchip/ls-scfg-msi: Use devm_platform_get_and_ioremap_resource() irqchip: Explicitly include correct DT includes irqchip/orion: Use of_address_count() helper irqchip/irq-pruss-intc: Do not check for 0 return after calling platform_get_irq() irqchip/imx-mu-msi: Do not check for 0 return after calling platform_get_irq() irqchipr/i8259: Mark i8259_of_init() static irqchip/mips-gic: Mark gic_irq_domain_free() static irqchip/xtensa-pic: Include header for xtensa_pic_init_legacy() irqchip/loongson-eiointc: Fix return value checking of eiointc_index genirq: Remove unused extern declaration genirq: Prevent nested thread vs synchronize_hardirq() deadlock
This commit is contained in:
commit
dd3f0fe501
36 changed files with 55 additions and 62 deletions
|
@ -35,6 +35,7 @@ properties:
|
||||||
- amlogic,meson-sm1-gpio-intc
|
- amlogic,meson-sm1-gpio-intc
|
||||||
- amlogic,meson-a1-gpio-intc
|
- amlogic,meson-a1-gpio-intc
|
||||||
- amlogic,meson-s4-gpio-intc
|
- amlogic,meson-s4-gpio-intc
|
||||||
|
- amlogic,c3-gpio-intc
|
||||||
- const: amlogic,meson-gpio-intc
|
- const: amlogic,meson-gpio-intc
|
||||||
|
|
||||||
reg:
|
reg:
|
||||||
|
|
|
@ -60,7 +60,6 @@
|
||||||
#include <linux/of.h>
|
#include <linux/of.h>
|
||||||
#include <linux/of_irq.h>
|
#include <linux/of_irq.h>
|
||||||
#include <linux/of_address.h>
|
#include <linux/of_address.h>
|
||||||
#include <linux/of_platform.h>
|
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/smp.h>
|
#include <linux/smp.h>
|
||||||
|
|
|
@ -20,7 +20,6 @@
|
||||||
#include <linux/of.h>
|
#include <linux/of.h>
|
||||||
#include <linux/of_irq.h>
|
#include <linux/of_irq.h>
|
||||||
#include <linux/of_address.h>
|
#include <linux/of_address.h>
|
||||||
#include <linux/of_platform.h>
|
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/smp.h>
|
#include <linux/smp.h>
|
||||||
|
|
|
@ -15,7 +15,6 @@
|
||||||
#include <linux/of.h>
|
#include <linux/of.h>
|
||||||
#include <linux/of_irq.h>
|
#include <linux/of_irq.h>
|
||||||
#include <linux/of_address.h>
|
#include <linux/of_address.h>
|
||||||
#include <linux/of_platform.h>
|
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
#include <linux/irq.h>
|
#include <linux/irq.h>
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
*/
|
*/
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/clk.h>
|
#include <linux/clk.h>
|
||||||
#include <linux/of_device.h>
|
#include <linux/of.h>
|
||||||
#include <linux/of_irq.h>
|
#include <linux/of_irq.h>
|
||||||
#include <linux/irqchip/arm-gic.h>
|
#include <linux/irqchip/arm-gic.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
|
|
|
@ -9,8 +9,6 @@
|
||||||
|
|
||||||
#include <linux/acpi.h>
|
#include <linux/acpi.h>
|
||||||
#include <linux/acpi_iort.h>
|
#include <linux/acpi_iort.h>
|
||||||
#include <linux/of_device.h>
|
|
||||||
#include <linux/of_address.h>
|
|
||||||
#include <linux/irq.h>
|
#include <linux/irq.h>
|
||||||
#include <linux/msi.h>
|
#include <linux/msi.h>
|
||||||
#include <linux/of.h>
|
#include <linux/of.h>
|
||||||
|
|
|
@ -340,7 +340,7 @@ static void i8259_irq_dispatch(struct irq_desc *desc)
|
||||||
generic_handle_domain_irq(domain, hwirq);
|
generic_handle_domain_irq(domain, hwirq);
|
||||||
}
|
}
|
||||||
|
|
||||||
int __init i8259_of_init(struct device_node *node, struct device_node *parent)
|
static int __init i8259_of_init(struct device_node *node, struct device_node *parent)
|
||||||
{
|
{
|
||||||
struct irq_domain *domain;
|
struct irq_domain *domain;
|
||||||
unsigned int parent_irq;
|
unsigned int parent_irq;
|
||||||
|
|
|
@ -50,8 +50,9 @@
|
||||||
#include <linux/irqchip/chained_irq.h>
|
#include <linux/irqchip/chained_irq.h>
|
||||||
#include <linux/irqdomain.h>
|
#include <linux/irqdomain.h>
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
|
#include <linux/mod_devicetable.h>
|
||||||
#include <linux/of_irq.h>
|
#include <linux/of_irq.h>
|
||||||
#include <linux/of_platform.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/spinlock.h>
|
#include <linux/spinlock.h>
|
||||||
#include <linux/pm_runtime.h>
|
#include <linux/pm_runtime.h>
|
||||||
|
|
||||||
|
|
|
@ -10,8 +10,9 @@
|
||||||
#include <linux/irqchip/chained_irq.h>
|
#include <linux/irqchip/chained_irq.h>
|
||||||
#include <linux/irqdomain.h>
|
#include <linux/irqdomain.h>
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
|
#include <linux/of.h>
|
||||||
#include <linux/of_irq.h>
|
#include <linux/of_irq.h>
|
||||||
#include <linux/of_platform.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/pm_runtime.h>
|
#include <linux/pm_runtime.h>
|
||||||
#include <linux/spinlock.h>
|
#include <linux/spinlock.h>
|
||||||
|
|
||||||
|
|
|
@ -339,8 +339,8 @@ static int __init imx_mu_of_init(struct device_node *dn,
|
||||||
msi_data->msiir_addr = res->start + msi_data->cfg->xTR;
|
msi_data->msiir_addr = res->start + msi_data->cfg->xTR;
|
||||||
|
|
||||||
irq = platform_get_irq(pdev, 0);
|
irq = platform_get_irq(pdev, 0);
|
||||||
if (irq <= 0)
|
if (irq < 0)
|
||||||
return -ENODEV;
|
return irq;
|
||||||
|
|
||||||
platform_set_drvdata(pdev, msi_data);
|
platform_set_drvdata(pdev, msi_data);
|
||||||
|
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
#include <linux/irqdomain.h>
|
#include <linux/irqdomain.h>
|
||||||
#include <linux/irqchip.h>
|
#include <linux/irqchip.h>
|
||||||
#include <linux/of.h>
|
#include <linux/of.h>
|
||||||
#include <linux/of_platform.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/mfd/syscon.h>
|
#include <linux/mfd/syscon.h>
|
||||||
#include <linux/regmap.h>
|
#include <linux/regmap.h>
|
||||||
|
|
||||||
|
|
|
@ -144,7 +144,7 @@ static int eiointc_router_init(unsigned int cpu)
|
||||||
int i, bit;
|
int i, bit;
|
||||||
uint32_t data;
|
uint32_t data;
|
||||||
uint32_t node = cpu_to_eio_node(cpu);
|
uint32_t node = cpu_to_eio_node(cpu);
|
||||||
uint32_t index = eiointc_index(node);
|
int index = eiointc_index(node);
|
||||||
|
|
||||||
if (index < 0) {
|
if (index < 0) {
|
||||||
pr_err("Error: invalid nodemap!\n");
|
pr_err("Error: invalid nodemap!\n");
|
||||||
|
|
|
@ -15,7 +15,6 @@
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/of_address.h>
|
#include <linux/of_address.h>
|
||||||
#include <linux/of_irq.h>
|
#include <linux/of_irq.h>
|
||||||
#include <linux/of_platform.h>
|
|
||||||
#include <linux/syscore_ops.h>
|
#include <linux/syscore_ops.h>
|
||||||
|
|
||||||
/* Registers */
|
/* Registers */
|
||||||
|
|
|
@ -12,9 +12,9 @@
|
||||||
#include <linux/irqdomain.h>
|
#include <linux/irqdomain.h>
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
|
#include <linux/of.h>
|
||||||
#include <linux/of_address.h>
|
#include <linux/of_address.h>
|
||||||
#include <linux/of_irq.h>
|
#include <linux/of_irq.h>
|
||||||
#include <linux/of_platform.h>
|
|
||||||
#include <linux/syscore_ops.h>
|
#include <linux/syscore_ops.h>
|
||||||
|
|
||||||
/* Registers */
|
/* Registers */
|
||||||
|
|
|
@ -349,8 +349,7 @@ static int ls_scfg_msi_probe(struct platform_device *pdev)
|
||||||
|
|
||||||
msi_data->cfg = (struct ls_scfg_msi_cfg *) match->data;
|
msi_data->cfg = (struct ls_scfg_msi_cfg *) match->data;
|
||||||
|
|
||||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
msi_data->regs = devm_platform_get_and_ioremap_resource(pdev, 0, &res);
|
||||||
msi_data->regs = devm_ioremap_resource(&pdev->dev, res);
|
|
||||||
if (IS_ERR(msi_data->regs)) {
|
if (IS_ERR(msi_data->regs)) {
|
||||||
dev_err(&pdev->dev, "failed to initialize 'regs'\n");
|
dev_err(&pdev->dev, "failed to initialize 'regs'\n");
|
||||||
return PTR_ERR(msi_data->regs);
|
return PTR_ERR(msi_data->regs);
|
||||||
|
|
|
@ -10,12 +10,10 @@
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
#include <linux/irq.h>
|
#include <linux/irq.h>
|
||||||
#include <linux/irqdomain.h>
|
#include <linux/irqdomain.h>
|
||||||
|
#include <linux/platform_device.h>
|
||||||
#include <linux/pm_runtime.h>
|
#include <linux/pm_runtime.h>
|
||||||
#include <linux/regmap.h>
|
#include <linux/regmap.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/of.h>
|
|
||||||
#include <linux/of_device.h>
|
|
||||||
#include <linux/of_irq.h>
|
|
||||||
#include <linux/irqchip/irq-madera.h>
|
#include <linux/irqchip/irq-madera.h>
|
||||||
#include <linux/mfd/madera/core.h>
|
#include <linux/mfd/madera/core.h>
|
||||||
#include <linux/mfd/madera/pdata.h>
|
#include <linux/mfd/madera/pdata.h>
|
||||||
|
|
|
@ -150,6 +150,10 @@ static const struct meson_gpio_irq_params s4_params = {
|
||||||
INIT_MESON_S4_COMMON_DATA(82)
|
INIT_MESON_S4_COMMON_DATA(82)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const struct meson_gpio_irq_params c3_params = {
|
||||||
|
INIT_MESON_S4_COMMON_DATA(55)
|
||||||
|
};
|
||||||
|
|
||||||
static const struct of_device_id meson_irq_gpio_matches[] __maybe_unused = {
|
static const struct of_device_id meson_irq_gpio_matches[] __maybe_unused = {
|
||||||
{ .compatible = "amlogic,meson8-gpio-intc", .data = &meson8_params },
|
{ .compatible = "amlogic,meson8-gpio-intc", .data = &meson8_params },
|
||||||
{ .compatible = "amlogic,meson8b-gpio-intc", .data = &meson8b_params },
|
{ .compatible = "amlogic,meson8b-gpio-intc", .data = &meson8b_params },
|
||||||
|
@ -160,6 +164,7 @@ static const struct of_device_id meson_irq_gpio_matches[] __maybe_unused = {
|
||||||
{ .compatible = "amlogic,meson-sm1-gpio-intc", .data = &sm1_params },
|
{ .compatible = "amlogic,meson-sm1-gpio-intc", .data = &sm1_params },
|
||||||
{ .compatible = "amlogic,meson-a1-gpio-intc", .data = &a1_params },
|
{ .compatible = "amlogic,meson-a1-gpio-intc", .data = &a1_params },
|
||||||
{ .compatible = "amlogic,meson-s4-gpio-intc", .data = &s4_params },
|
{ .compatible = "amlogic,meson-s4-gpio-intc", .data = &s4_params },
|
||||||
|
{ .compatible = "amlogic,c3-gpio-intc", .data = &c3_params },
|
||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -557,7 +557,7 @@ static int gic_irq_domain_alloc(struct irq_domain *d, unsigned int virq,
|
||||||
return gic_irq_domain_map(d, virq, hwirq);
|
return gic_irq_domain_map(d, virq, hwirq);
|
||||||
}
|
}
|
||||||
|
|
||||||
void gic_irq_domain_free(struct irq_domain *d, unsigned int virq,
|
static void gic_irq_domain_free(struct irq_domain *d, unsigned int virq,
|
||||||
unsigned int nr_irqs)
|
unsigned int nr_irqs)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
|
@ -377,8 +377,7 @@ static int mvebu_sei_probe(struct platform_device *pdev)
|
||||||
mutex_init(&sei->cp_msi_lock);
|
mutex_init(&sei->cp_msi_lock);
|
||||||
raw_spin_lock_init(&sei->mask_lock);
|
raw_spin_lock_init(&sei->mask_lock);
|
||||||
|
|
||||||
sei->res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
sei->base = devm_platform_get_and_ioremap_resource(pdev, 0, &sei->res);
|
||||||
sei->base = devm_ioremap_resource(sei->dev, sei->res);
|
|
||||||
if (IS_ERR(sei->base))
|
if (IS_ERR(sei->base))
|
||||||
return PTR_ERR(sei->base);
|
return PTR_ERR(sei->base);
|
||||||
|
|
||||||
|
|
|
@ -57,8 +57,7 @@ static int __init orion_irq_init(struct device_node *np,
|
||||||
struct resource r;
|
struct resource r;
|
||||||
|
|
||||||
/* count number of irq chips by valid reg addresses */
|
/* count number of irq chips by valid reg addresses */
|
||||||
while (of_address_to_resource(np, num_chips, &r) == 0)
|
num_chips = of_address_count(np);
|
||||||
num_chips++;
|
|
||||||
|
|
||||||
orion_irq_domain = irq_domain_add_linear(np,
|
orion_irq_domain = irq_domain_add_linear(np,
|
||||||
num_chips * ORION_IRQS_PER_CHIP,
|
num_chips * ORION_IRQS_PER_CHIP,
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
#include <linux/irqchip/chained_irq.h>
|
#include <linux/irqchip/chained_irq.h>
|
||||||
#include <linux/irqdomain.h>
|
#include <linux/irqdomain.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/of_device.h>
|
#include <linux/of.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -565,8 +565,8 @@ static int pruss_intc_probe(struct platform_device *pdev)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
irq = platform_get_irq_byname(pdev, irq_names[i]);
|
irq = platform_get_irq_byname(pdev, irq_names[i]);
|
||||||
if (irq <= 0) {
|
if (irq < 0) {
|
||||||
ret = (irq == 0) ? -EINVAL : irq;
|
ret = irq;
|
||||||
goto fail_irq;
|
goto fail_irq;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,7 @@
|
||||||
#include <linux/mailbox_client.h>
|
#include <linux/mailbox_client.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/of.h>
|
#include <linux/of.h>
|
||||||
#include <linux/of_device.h>
|
#include <linux/of_platform.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/pm_domain.h>
|
#include <linux/pm_domain.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
|
|
|
@ -17,7 +17,6 @@
|
||||||
#include <linux/err.h>
|
#include <linux/err.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/of_device.h>
|
|
||||||
#include <linux/pm_runtime.h>
|
#include <linux/pm_runtime.h>
|
||||||
|
|
||||||
#define INTC_IRQPIN_MAX 8 /* maximum 8 interrupts per driver instance */
|
#define INTC_IRQPIN_MAX 8 /* maximum 8 interrupts per driver instance */
|
||||||
|
|
|
@ -10,7 +10,7 @@
|
||||||
#include <dt-bindings/interrupt-controller/irq-st.h>
|
#include <dt-bindings/interrupt-controller/irq-st.h>
|
||||||
#include <linux/err.h>
|
#include <linux/err.h>
|
||||||
#include <linux/mfd/syscon.h>
|
#include <linux/mfd/syscon.h>
|
||||||
#include <linux/of_device.h>
|
#include <linux/of.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/regmap.h>
|
#include <linux/regmap.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
|
|
|
@ -14,10 +14,11 @@
|
||||||
#include <linux/irqchip.h>
|
#include <linux/irqchip.h>
|
||||||
#include <linux/irqchip/chained_irq.h>
|
#include <linux/irqchip/chained_irq.h>
|
||||||
#include <linux/irqdomain.h>
|
#include <linux/irqdomain.h>
|
||||||
|
#include <linux/mod_devicetable.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/of_address.h>
|
#include <linux/of_address.h>
|
||||||
#include <linux/of_irq.h>
|
#include <linux/of_irq.h>
|
||||||
#include <linux/of_platform.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/syscore_ops.h>
|
#include <linux/syscore_ops.h>
|
||||||
|
|
||||||
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||||
|
|
|
@ -19,7 +19,6 @@
|
||||||
#include <linux/irqdomain.h>
|
#include <linux/irqdomain.h>
|
||||||
#include <linux/of_irq.h>
|
#include <linux/of_irq.h>
|
||||||
#include <linux/of_address.h>
|
#include <linux/of_address.h>
|
||||||
#include <linux/of_platform.h>
|
|
||||||
#include <linux/irqchip.h>
|
#include <linux/irqchip.h>
|
||||||
#include <linux/irqchip/chained_irq.h>
|
#include <linux/irqchip/chained_irq.h>
|
||||||
|
|
||||||
|
|
|
@ -13,7 +13,6 @@
|
||||||
#include <linux/irqchip.h>
|
#include <linux/irqchip.h>
|
||||||
#include <linux/of_irq.h>
|
#include <linux/of_irq.h>
|
||||||
#include <linux/of_address.h>
|
#include <linux/of_address.h>
|
||||||
#include <linux/of_platform.h>
|
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/bitops.h>
|
#include <linux/bitops.h>
|
||||||
|
|
|
@ -15,9 +15,9 @@
|
||||||
#include <linux/msi.h>
|
#include <linux/msi.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/moduleparam.h>
|
#include <linux/moduleparam.h>
|
||||||
#include <linux/of_address.h>
|
#include <linux/of.h>
|
||||||
#include <linux/of_irq.h>
|
#include <linux/of_irq.h>
|
||||||
#include <linux/of_platform.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/irqchip/chained_irq.h>
|
#include <linux/irqchip/chained_irq.h>
|
||||||
#include <linux/soc/ti/ti_sci_inta_msi.h>
|
#include <linux/soc/ti/ti_sci_inta_msi.h>
|
||||||
#include <linux/soc/ti/ti_sci_protocol.h>
|
#include <linux/soc/ti/ti_sci_protocol.h>
|
||||||
|
|
|
@ -12,9 +12,9 @@
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
#include <linux/irqchip.h>
|
#include <linux/irqchip.h>
|
||||||
#include <linux/irqdomain.h>
|
#include <linux/irqdomain.h>
|
||||||
#include <linux/of_platform.h>
|
#include <linux/of.h>
|
||||||
#include <linux/of_address.h>
|
|
||||||
#include <linux/of_irq.h>
|
#include <linux/of_irq.h>
|
||||||
|
#include <linux/platform_device.h>
|
||||||
#include <linux/soc/ti/ti_sci_protocol.h>
|
#include <linux/soc/ti/ti_sci_protocol.h>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -12,7 +12,6 @@
|
||||||
#include <linux/irqdomain.h>
|
#include <linux/irqdomain.h>
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/of.h>
|
#include <linux/of.h>
|
||||||
#include <linux/of_device.h>
|
|
||||||
#include <linux/of_irq.h>
|
#include <linux/of_irq.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/spinlock.h>
|
#include <linux/spinlock.h>
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
#include <linux/irqdomain.h>
|
#include <linux/irqdomain.h>
|
||||||
#include <linux/irq.h>
|
#include <linux/irq.h>
|
||||||
#include <linux/irqchip.h>
|
#include <linux/irqchip.h>
|
||||||
|
#include <linux/irqchip/xtensa-pic.h>
|
||||||
#include <linux/of.h>
|
#include <linux/of.h>
|
||||||
|
|
||||||
unsigned int cached_irq_mask;
|
unsigned int cached_irq_mask;
|
||||||
|
|
|
@ -10,7 +10,7 @@
|
||||||
|
|
||||||
#include <linux/acpi.h>
|
#include <linux/acpi.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/of_device.h>
|
#include <linux/of.h>
|
||||||
#include <linux/of_irq.h>
|
#include <linux/of_irq.h>
|
||||||
#include <linux/irqchip.h>
|
#include <linux/irqchip.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
|
|
|
@ -14,7 +14,6 @@
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/of.h>
|
#include <linux/of.h>
|
||||||
#include <linux/of_address.h>
|
#include <linux/of_address.h>
|
||||||
#include <linux/of_device.h>
|
|
||||||
#include <linux/of_irq.h>
|
#include <linux/of_irq.h>
|
||||||
#include <linux/soc/qcom/irq.h>
|
#include <linux/soc/qcom/irq.h>
|
||||||
#include <linux/spinlock.h>
|
#include <linux/spinlock.h>
|
||||||
|
|
|
@ -473,11 +473,12 @@ void handle_nested_irq(unsigned int irq)
|
||||||
action = desc->action;
|
action = desc->action;
|
||||||
if (unlikely(!action || irqd_irq_disabled(&desc->irq_data))) {
|
if (unlikely(!action || irqd_irq_disabled(&desc->irq_data))) {
|
||||||
desc->istate |= IRQS_PENDING;
|
desc->istate |= IRQS_PENDING;
|
||||||
goto out_unlock;
|
raw_spin_unlock_irq(&desc->lock);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
kstat_incr_irqs_this_cpu(desc);
|
kstat_incr_irqs_this_cpu(desc);
|
||||||
irqd_set(&desc->irq_data, IRQD_IRQ_INPROGRESS);
|
atomic_inc(&desc->threads_active);
|
||||||
raw_spin_unlock_irq(&desc->lock);
|
raw_spin_unlock_irq(&desc->lock);
|
||||||
|
|
||||||
action_ret = IRQ_NONE;
|
action_ret = IRQ_NONE;
|
||||||
|
@ -487,11 +488,7 @@ void handle_nested_irq(unsigned int irq)
|
||||||
if (!irq_settings_no_debug(desc))
|
if (!irq_settings_no_debug(desc))
|
||||||
note_interrupt(desc, action_ret);
|
note_interrupt(desc, action_ret);
|
||||||
|
|
||||||
raw_spin_lock_irq(&desc->lock);
|
wake_threads_waitq(desc);
|
||||||
irqd_clear(&desc->irq_data, IRQD_IRQ_INPROGRESS);
|
|
||||||
|
|
||||||
out_unlock:
|
|
||||||
raw_spin_unlock_irq(&desc->lock);
|
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(handle_nested_irq);
|
EXPORT_SYMBOL_GPL(handle_nested_irq);
|
||||||
|
|
||||||
|
|
|
@ -108,8 +108,6 @@ extern int __irq_get_irqchip_state(struct irq_data *data,
|
||||||
enum irqchip_irq_state which,
|
enum irqchip_irq_state which,
|
||||||
bool *state);
|
bool *state);
|
||||||
|
|
||||||
extern void init_kstat_irqs(struct irq_desc *desc, int node, int nr);
|
|
||||||
|
|
||||||
irqreturn_t __handle_irq_event_percpu(struct irq_desc *desc);
|
irqreturn_t __handle_irq_event_percpu(struct irq_desc *desc);
|
||||||
irqreturn_t handle_irq_event_percpu(struct irq_desc *desc);
|
irqreturn_t handle_irq_event_percpu(struct irq_desc *desc);
|
||||||
irqreturn_t handle_irq_event(struct irq_desc *desc);
|
irqreturn_t handle_irq_event(struct irq_desc *desc);
|
||||||
|
@ -121,6 +119,8 @@ void irq_resend_init(struct irq_desc *desc);
|
||||||
bool irq_wait_for_poll(struct irq_desc *desc);
|
bool irq_wait_for_poll(struct irq_desc *desc);
|
||||||
void __irq_wake_thread(struct irq_desc *desc, struct irqaction *action);
|
void __irq_wake_thread(struct irq_desc *desc, struct irqaction *action);
|
||||||
|
|
||||||
|
void wake_threads_waitq(struct irq_desc *desc);
|
||||||
|
|
||||||
#ifdef CONFIG_PROC_FS
|
#ifdef CONFIG_PROC_FS
|
||||||
extern void register_irq_proc(unsigned int irq, struct irq_desc *desc);
|
extern void register_irq_proc(unsigned int irq, struct irq_desc *desc);
|
||||||
extern void unregister_irq_proc(unsigned int irq, struct irq_desc *desc);
|
extern void unregister_irq_proc(unsigned int irq, struct irq_desc *desc);
|
||||||
|
|
|
@ -108,6 +108,16 @@ bool synchronize_hardirq(unsigned int irq)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(synchronize_hardirq);
|
EXPORT_SYMBOL(synchronize_hardirq);
|
||||||
|
|
||||||
|
static void __synchronize_irq(struct irq_desc *desc)
|
||||||
|
{
|
||||||
|
__synchronize_hardirq(desc, true);
|
||||||
|
/*
|
||||||
|
* We made sure that no hardirq handler is running. Now verify that no
|
||||||
|
* threaded handlers are active.
|
||||||
|
*/
|
||||||
|
wait_event(desc->wait_for_threads, !atomic_read(&desc->threads_active));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* synchronize_irq - wait for pending IRQ handlers (on other CPUs)
|
* synchronize_irq - wait for pending IRQ handlers (on other CPUs)
|
||||||
* @irq: interrupt number to wait for
|
* @irq: interrupt number to wait for
|
||||||
|
@ -127,16 +137,8 @@ void synchronize_irq(unsigned int irq)
|
||||||
{
|
{
|
||||||
struct irq_desc *desc = irq_to_desc(irq);
|
struct irq_desc *desc = irq_to_desc(irq);
|
||||||
|
|
||||||
if (desc) {
|
if (desc)
|
||||||
__synchronize_hardirq(desc, true);
|
__synchronize_irq(desc);
|
||||||
/*
|
|
||||||
* We made sure that no hardirq handler is
|
|
||||||
* running. Now verify that no threaded handlers are
|
|
||||||
* active.
|
|
||||||
*/
|
|
||||||
wait_event(desc->wait_for_threads,
|
|
||||||
!atomic_read(&desc->threads_active));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(synchronize_irq);
|
EXPORT_SYMBOL(synchronize_irq);
|
||||||
|
|
||||||
|
@ -1216,7 +1218,7 @@ static irqreturn_t irq_thread_fn(struct irq_desc *desc,
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void wake_threads_waitq(struct irq_desc *desc)
|
void wake_threads_waitq(struct irq_desc *desc)
|
||||||
{
|
{
|
||||||
if (atomic_dec_and_test(&desc->threads_active))
|
if (atomic_dec_and_test(&desc->threads_active))
|
||||||
wake_up(&desc->wait_for_threads);
|
wake_up(&desc->wait_for_threads);
|
||||||
|
@ -1944,7 +1946,7 @@ static struct irqaction *__free_irq(struct irq_desc *desc, void *dev_id)
|
||||||
* supports it also make sure that there is no (not yet serviced)
|
* supports it also make sure that there is no (not yet serviced)
|
||||||
* interrupt in flight at the hardware level.
|
* interrupt in flight at the hardware level.
|
||||||
*/
|
*/
|
||||||
__synchronize_hardirq(desc, true);
|
__synchronize_irq(desc);
|
||||||
|
|
||||||
#ifdef CONFIG_DEBUG_SHIRQ
|
#ifdef CONFIG_DEBUG_SHIRQ
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue