|
@@ -579,7 +579,7 @@ static void sunxi_pinctrl_irq_release_resources(struct irq_data *d)
|
|
|
static int sunxi_pinctrl_irq_set_type(struct irq_data *d, unsigned int type)
|
|
|
{
|
|
|
struct sunxi_pinctrl *pctl = irq_data_get_irq_chip_data(d);
|
|
|
- u32 reg = sunxi_irq_cfg_reg(d->hwirq);
|
|
|
+ u32 reg = sunxi_irq_cfg_reg(d->hwirq, pctl->desc->irq_bank_base);
|
|
|
u8 index = sunxi_irq_cfg_offset(d->hwirq);
|
|
|
unsigned long flags;
|
|
|
u32 regval;
|
|
@@ -626,7 +626,8 @@ static int sunxi_pinctrl_irq_set_type(struct irq_data *d, unsigned int type)
|
|
|
static void sunxi_pinctrl_irq_ack(struct irq_data *d)
|
|
|
{
|
|
|
struct sunxi_pinctrl *pctl = irq_data_get_irq_chip_data(d);
|
|
|
- u32 status_reg = sunxi_irq_status_reg(d->hwirq);
|
|
|
+ u32 status_reg = sunxi_irq_status_reg(d->hwirq,
|
|
|
+ pctl->desc->irq_bank_base);
|
|
|
u8 status_idx = sunxi_irq_status_offset(d->hwirq);
|
|
|
|
|
|
/* Clear the IRQ */
|
|
@@ -636,7 +637,7 @@ static void sunxi_pinctrl_irq_ack(struct irq_data *d)
|
|
|
static void sunxi_pinctrl_irq_mask(struct irq_data *d)
|
|
|
{
|
|
|
struct sunxi_pinctrl *pctl = irq_data_get_irq_chip_data(d);
|
|
|
- u32 reg = sunxi_irq_ctrl_reg(d->hwirq);
|
|
|
+ u32 reg = sunxi_irq_ctrl_reg(d->hwirq, pctl->desc->irq_bank_base);
|
|
|
u8 idx = sunxi_irq_ctrl_offset(d->hwirq);
|
|
|
unsigned long flags;
|
|
|
u32 val;
|
|
@@ -653,7 +654,7 @@ static void sunxi_pinctrl_irq_mask(struct irq_data *d)
|
|
|
static void sunxi_pinctrl_irq_unmask(struct irq_data *d)
|
|
|
{
|
|
|
struct sunxi_pinctrl *pctl = irq_data_get_irq_chip_data(d);
|
|
|
- u32 reg = sunxi_irq_ctrl_reg(d->hwirq);
|
|
|
+ u32 reg = sunxi_irq_ctrl_reg(d->hwirq, pctl->desc->irq_bank_base);
|
|
|
u8 idx = sunxi_irq_ctrl_offset(d->hwirq);
|
|
|
unsigned long flags;
|
|
|
u32 val;
|
|
@@ -745,7 +746,7 @@ static void sunxi_pinctrl_irq_handler(struct irq_desc *desc)
|
|
|
if (bank == pctl->desc->irq_banks)
|
|
|
return;
|
|
|
|
|
|
- reg = sunxi_irq_status_reg_from_bank(bank);
|
|
|
+ reg = sunxi_irq_status_reg_from_bank(bank, pctl->desc->irq_bank_base);
|
|
|
val = readl(pctl->membase + reg);
|
|
|
|
|
|
if (val) {
|
|
@@ -1024,9 +1025,11 @@ int sunxi_pinctrl_init(struct platform_device *pdev,
|
|
|
|
|
|
for (i = 0; i < pctl->desc->irq_banks; i++) {
|
|
|
/* Mask and clear all IRQs before registering a handler */
|
|
|
- writel(0, pctl->membase + sunxi_irq_ctrl_reg_from_bank(i));
|
|
|
+ writel(0, pctl->membase + sunxi_irq_ctrl_reg_from_bank(i,
|
|
|
+ pctl->desc->irq_bank_base));
|
|
|
writel(0xffffffff,
|
|
|
- pctl->membase + sunxi_irq_status_reg_from_bank(i));
|
|
|
+ pctl->membase + sunxi_irq_status_reg_from_bank(i,
|
|
|
+ pctl->desc->irq_bank_base));
|
|
|
|
|
|
irq_set_chained_handler_and_data(pctl->irq[i],
|
|
|
sunxi_pinctrl_irq_handler,
|