]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
PCI: apple: Move away from INTMSK{SET,CLR} for INTx and private interrupts
authorMarc Zyngier <maz@kernel.org>
Tue, 1 Apr 2025 09:17:07 +0000 (10:17 +0100)
committerManivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
Wed, 23 Apr 2025 07:22:48 +0000 (12:52 +0530)
T602x seems to have dropped the rather useful SET/CLR accessors
to the masking register.

Instead, let's use the mask register directly, and wrap it with
a brand new spinlock. No, this isn't moving in the right direction.

Signed-off-by: Marc Zyngier <maz@kernel.org>
Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
Tested-by: Janne Grunau <j@jannau.net>
Reviewed-by: Rob Herring (Arm) <robh@kernel.org>
Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
Acked-by: Alyssa Rosenzweig <alyssa@rosenzweig.io>
Link: https://patch.msgid.link/20250401091713.2765724-8-maz@kernel.org
drivers/pci/controller/pcie-apple.c

index 8ac21d46c031dccbd3debd7f5742392f4e625621..152a65db3ff0eda7a180e68d81bc846cd77b5b73 100644 (file)
@@ -142,6 +142,7 @@ struct apple_pcie {
 };
 
 struct apple_pcie_port {
+       raw_spinlock_t          lock;
        struct apple_pcie       *pcie;
        struct device_node      *np;
        void __iomem            *base;
@@ -261,14 +262,16 @@ static void apple_port_irq_mask(struct irq_data *data)
 {
        struct apple_pcie_port *port = irq_data_get_irq_chip_data(data);
 
-       writel_relaxed(BIT(data->hwirq), port->base + PORT_INTMSKSET);
+       guard(raw_spinlock_irqsave)(&port->lock);
+       rmw_set(BIT(data->hwirq), port->base + PORT_INTMSK);
 }
 
 static void apple_port_irq_unmask(struct irq_data *data)
 {
        struct apple_pcie_port *port = irq_data_get_irq_chip_data(data);
 
-       writel_relaxed(BIT(data->hwirq), port->base + PORT_INTMSKCLR);
+       guard(raw_spinlock_irqsave)(&port->lock);
+       rmw_clear(BIT(data->hwirq), port->base + PORT_INTMSK);
 }
 
 static bool hwirq_is_intx(unsigned int hwirq)
@@ -387,7 +390,7 @@ static int apple_pcie_port_setup_irq(struct apple_pcie_port *port)
                return -ENOMEM;
 
        /* Disable all interrupts */
-       writel_relaxed(~0, port->base + PORT_INTMSKSET);
+       writel_relaxed(~0, port->base + PORT_INTMSK);
        writel_relaxed(~0, port->base + PORT_INTSTAT);
 
        irq_set_chained_handler_and_data(irq, apple_port_irq_handler, port);
@@ -537,6 +540,8 @@ static int apple_pcie_setup_port(struct apple_pcie *pcie,
        port->pcie = pcie;
        port->np = np;
 
+       raw_spin_lock_init(&port->lock);
+
        port->base = devm_platform_ioremap_resource(platform, port->idx + 2);
        if (IS_ERR(port->base))
                return PTR_ERR(port->base);