diff options
Diffstat (limited to 'drivers/pci/controller/dwc/pcie-uniphier.c')
| -rw-r--r-- | drivers/pci/controller/dwc/pcie-uniphier.c | 26 | 
1 files changed, 10 insertions, 16 deletions
| diff --git a/drivers/pci/controller/dwc/pcie-uniphier.c b/drivers/pci/controller/dwc/pcie-uniphier.c index d842fd018129..d05be942956e 100644 --- a/drivers/pci/controller/dwc/pcie-uniphier.c +++ b/drivers/pci/controller/dwc/pcie-uniphier.c @@ -168,30 +168,21 @@ static void uniphier_pcie_irq_enable(struct uniphier_pcie_priv *priv)  	writel(PCL_RCV_INTX_ALL_ENABLE, priv->base + PCL_RCV_INTX);  } -static void uniphier_pcie_irq_ack(struct irq_data *d) -{ -	struct pcie_port *pp = irq_data_get_irq_chip_data(d); -	struct dw_pcie *pci = to_dw_pcie_from_pp(pp); -	struct uniphier_pcie_priv *priv = to_uniphier_pcie(pci); -	u32 val; - -	val = readl(priv->base + PCL_RCV_INTX); -	val &= ~PCL_RCV_INTX_ALL_STATUS; -	val |= BIT(irqd_to_hwirq(d) + PCL_RCV_INTX_STATUS_SHIFT); -	writel(val, priv->base + PCL_RCV_INTX); -} -  static void uniphier_pcie_irq_mask(struct irq_data *d)  {  	struct pcie_port *pp = irq_data_get_irq_chip_data(d);  	struct dw_pcie *pci = to_dw_pcie_from_pp(pp);  	struct uniphier_pcie_priv *priv = to_uniphier_pcie(pci); +	unsigned long flags;  	u32 val; +	raw_spin_lock_irqsave(&pp->lock, flags); +  	val = readl(priv->base + PCL_RCV_INTX); -	val &= ~PCL_RCV_INTX_ALL_MASK;  	val |= BIT(irqd_to_hwirq(d) + PCL_RCV_INTX_MASK_SHIFT);  	writel(val, priv->base + PCL_RCV_INTX); + +	raw_spin_unlock_irqrestore(&pp->lock, flags);  }  static void uniphier_pcie_irq_unmask(struct irq_data *d) @@ -199,17 +190,20 @@ static void uniphier_pcie_irq_unmask(struct irq_data *d)  	struct pcie_port *pp = irq_data_get_irq_chip_data(d);  	struct dw_pcie *pci = to_dw_pcie_from_pp(pp);  	struct uniphier_pcie_priv *priv = to_uniphier_pcie(pci); +	unsigned long flags;  	u32 val; +	raw_spin_lock_irqsave(&pp->lock, flags); +  	val = readl(priv->base + PCL_RCV_INTX); -	val &= ~PCL_RCV_INTX_ALL_MASK;  	val &= ~BIT(irqd_to_hwirq(d) + PCL_RCV_INTX_MASK_SHIFT);  	writel(val, priv->base + PCL_RCV_INTX); + +	raw_spin_unlock_irqrestore(&pp->lock, flags);  }  static struct irq_chip uniphier_pcie_irq_chip = {  	.name = "PCI", -	.irq_ack = uniphier_pcie_irq_ack,  	.irq_mask = uniphier_pcie_irq_mask,  	.irq_unmask = uniphier_pcie_irq_unmask,  }; |