diff options
Diffstat (limited to 'drivers/pinctrl/pinctrl-amd.c')
| -rw-r--r-- | drivers/pinctrl/pinctrl-amd.c | 31 | 
1 files changed, 31 insertions, 0 deletions
| diff --git a/drivers/pinctrl/pinctrl-amd.c b/drivers/pinctrl/pinctrl-amd.c index 8d0f88e9ca88..bae9d429b813 100644 --- a/drivers/pinctrl/pinctrl-amd.c +++ b/drivers/pinctrl/pinctrl-amd.c @@ -840,6 +840,34 @@ static const struct pinconf_ops amd_pinconf_ops = {  	.pin_config_group_set = amd_pinconf_group_set,  }; +static void amd_gpio_irq_init(struct amd_gpio *gpio_dev) +{ +	struct pinctrl_desc *desc = gpio_dev->pctrl->desc; +	unsigned long flags; +	u32 pin_reg, mask; +	int i; + +	mask = BIT(WAKE_CNTRL_OFF_S0I3) | BIT(WAKE_CNTRL_OFF_S3) | +		BIT(INTERRUPT_MASK_OFF) | BIT(INTERRUPT_ENABLE_OFF) | +		BIT(WAKE_CNTRL_OFF_S4); + +	for (i = 0; i < desc->npins; i++) { +		int pin = desc->pins[i].number; +		const struct pin_desc *pd = pin_desc_get(gpio_dev->pctrl, pin); + +		if (!pd) +			continue; + +		raw_spin_lock_irqsave(&gpio_dev->lock, flags); + +		pin_reg = readl(gpio_dev->base + i * 4); +		pin_reg &= ~mask; +		writel(pin_reg, gpio_dev->base + i * 4); + +		raw_spin_unlock_irqrestore(&gpio_dev->lock, flags); +	} +} +  #ifdef CONFIG_PM_SLEEP  static bool amd_gpio_should_save(struct amd_gpio *gpio_dev, unsigned int pin)  { @@ -976,6 +1004,9 @@ static int amd_gpio_probe(struct platform_device *pdev)  		return PTR_ERR(gpio_dev->pctrl);  	} +	/* Disable and mask interrupts */ +	amd_gpio_irq_init(gpio_dev); +  	girq = &gpio_dev->gc.irq;  	girq->chip = &amd_gpio_irqchip;  	/* This will let us handle the parent IRQ in the driver */ |