aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIcenowy Zheng <icenowy@aosc.io>2018-03-16 10:02:07 -0400
committerLinus Walleij <linus.walleij@linaro.org>2018-03-27 09:04:10 -0400
commit4b0d6c5a0014beef5423a380f12b9411ebf0c907 (patch)
tree04ae4567224d63c78e9e885329198c983c574c00
parent27a3ba538b831ef61e3fda3951ff30158d4ce934 (diff)
pinctrl: sunxi: refactor irq related register function to have desc
As the new H6 SoC has holes in the IRQ registers, refactor the IRQ related register function for getting the full pinctrl desc structure. Signed-off-by: Icenowy Zheng <icenowy@aosc.io> Acked-by: Maxime Ripard <maxime.ripard@bootlin.com> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
-rw-r--r--drivers/pinctrl/sunxi/pinctrl-sunxi.c22
-rw-r--r--drivers/pinctrl/sunxi/pinctrl-sunxi.h26
2 files changed, 28 insertions, 20 deletions
diff --git a/drivers/pinctrl/sunxi/pinctrl-sunxi.c b/drivers/pinctrl/sunxi/pinctrl-sunxi.c
index bc3d59f2173f..020d6d84639c 100644
--- a/drivers/pinctrl/sunxi/pinctrl-sunxi.c
+++ b/drivers/pinctrl/sunxi/pinctrl-sunxi.c
@@ -835,7 +835,7 @@ static void sunxi_pinctrl_irq_release_resources(struct irq_data *d)
835static int sunxi_pinctrl_irq_set_type(struct irq_data *d, unsigned int type) 835static int sunxi_pinctrl_irq_set_type(struct irq_data *d, unsigned int type)
836{ 836{
837 struct sunxi_pinctrl *pctl = irq_data_get_irq_chip_data(d); 837 struct sunxi_pinctrl *pctl = irq_data_get_irq_chip_data(d);
838 u32 reg = sunxi_irq_cfg_reg(d->hwirq, pctl->desc->irq_bank_base); 838 u32 reg = sunxi_irq_cfg_reg(pctl->desc, d->hwirq);
839 u8 index = sunxi_irq_cfg_offset(d->hwirq); 839 u8 index = sunxi_irq_cfg_offset(d->hwirq);
840 unsigned long flags; 840 unsigned long flags;
841 u32 regval; 841 u32 regval;
@@ -882,8 +882,7 @@ static int sunxi_pinctrl_irq_set_type(struct irq_data *d, unsigned int type)
882static void sunxi_pinctrl_irq_ack(struct irq_data *d) 882static void sunxi_pinctrl_irq_ack(struct irq_data *d)
883{ 883{
884 struct sunxi_pinctrl *pctl = irq_data_get_irq_chip_data(d); 884 struct sunxi_pinctrl *pctl = irq_data_get_irq_chip_data(d);
885 u32 status_reg = sunxi_irq_status_reg(d->hwirq, 885 u32 status_reg = sunxi_irq_status_reg(pctl->desc, d->hwirq);
886 pctl->desc->irq_bank_base);
887 u8 status_idx = sunxi_irq_status_offset(d->hwirq); 886 u8 status_idx = sunxi_irq_status_offset(d->hwirq);
888 887
889 /* Clear the IRQ */ 888 /* Clear the IRQ */
@@ -893,7 +892,7 @@ static void sunxi_pinctrl_irq_ack(struct irq_data *d)
893static void sunxi_pinctrl_irq_mask(struct irq_data *d) 892static void sunxi_pinctrl_irq_mask(struct irq_data *d)
894{ 893{
895 struct sunxi_pinctrl *pctl = irq_data_get_irq_chip_data(d); 894 struct sunxi_pinctrl *pctl = irq_data_get_irq_chip_data(d);
896 u32 reg = sunxi_irq_ctrl_reg(d->hwirq, pctl->desc->irq_bank_base); 895 u32 reg = sunxi_irq_ctrl_reg(pctl->desc, d->hwirq);
897 u8 idx = sunxi_irq_ctrl_offset(d->hwirq); 896 u8 idx = sunxi_irq_ctrl_offset(d->hwirq);
898 unsigned long flags; 897 unsigned long flags;
899 u32 val; 898 u32 val;
@@ -910,7 +909,7 @@ static void sunxi_pinctrl_irq_mask(struct irq_data *d)
910static void sunxi_pinctrl_irq_unmask(struct irq_data *d) 909static void sunxi_pinctrl_irq_unmask(struct irq_data *d)
911{ 910{
912 struct sunxi_pinctrl *pctl = irq_data_get_irq_chip_data(d); 911 struct sunxi_pinctrl *pctl = irq_data_get_irq_chip_data(d);
913 u32 reg = sunxi_irq_ctrl_reg(d->hwirq, pctl->desc->irq_bank_base); 912 u32 reg = sunxi_irq_ctrl_reg(pctl->desc, d->hwirq);
914 u8 idx = sunxi_irq_ctrl_offset(d->hwirq); 913 u8 idx = sunxi_irq_ctrl_offset(d->hwirq);
915 unsigned long flags; 914 unsigned long flags;
916 u32 val; 915 u32 val;
@@ -1002,7 +1001,7 @@ static void sunxi_pinctrl_irq_handler(struct irq_desc *desc)
1002 if (bank == pctl->desc->irq_banks) 1001 if (bank == pctl->desc->irq_banks)
1003 return; 1002 return;
1004 1003
1005 reg = sunxi_irq_status_reg_from_bank(bank, pctl->desc->irq_bank_base); 1004 reg = sunxi_irq_status_reg_from_bank(pctl->desc, bank);
1006 val = readl(pctl->membase + reg); 1005 val = readl(pctl->membase + reg);
1007 1006
1008 if (val) { 1007 if (val) {
@@ -1234,8 +1233,7 @@ static int sunxi_pinctrl_setup_debounce(struct sunxi_pinctrl *pctl,
1234 1233
1235 writel(src | div << 4, 1234 writel(src | div << 4,
1236 pctl->membase + 1235 pctl->membase +
1237 sunxi_irq_debounce_reg_from_bank(i, 1236 sunxi_irq_debounce_reg_from_bank(pctl->desc, i));
1238 pctl->desc->irq_bank_base));
1239 } 1237 }
1240 1238
1241 return 0; 1239 return 0;
@@ -1411,11 +1409,11 @@ int sunxi_pinctrl_init_with_variant(struct platform_device *pdev,
1411 1409
1412 for (i = 0; i < pctl->desc->irq_banks; i++) { 1410 for (i = 0; i < pctl->desc->irq_banks; i++) {
1413 /* Mask and clear all IRQs before registering a handler */ 1411 /* Mask and clear all IRQs before registering a handler */
1414 writel(0, pctl->membase + sunxi_irq_ctrl_reg_from_bank(i, 1412 writel(0, pctl->membase +
1415 pctl->desc->irq_bank_base)); 1413 sunxi_irq_ctrl_reg_from_bank(pctl->desc, i));
1416 writel(0xffffffff, 1414 writel(0xffffffff,
1417 pctl->membase + sunxi_irq_status_reg_from_bank(i, 1415 pctl->membase +
1418 pctl->desc->irq_bank_base)); 1416 sunxi_irq_status_reg_from_bank(pctl->desc, i));
1419 1417
1420 irq_set_chained_handler_and_data(pctl->irq[i], 1418 irq_set_chained_handler_and_data(pctl->irq[i],
1421 sunxi_pinctrl_irq_handler, 1419 sunxi_pinctrl_irq_handler,
diff --git a/drivers/pinctrl/sunxi/pinctrl-sunxi.h b/drivers/pinctrl/sunxi/pinctrl-sunxi.h
index 11b128f54ed2..a13bd57d880d 100644
--- a/drivers/pinctrl/sunxi/pinctrl-sunxi.h
+++ b/drivers/pinctrl/sunxi/pinctrl-sunxi.h
@@ -263,8 +263,10 @@ static inline u32 sunxi_pull_offset(u16 pin)
263 return pin_num * PULL_PINS_BITS; 263 return pin_num * PULL_PINS_BITS;
264} 264}
265 265
266static inline u32 sunxi_irq_cfg_reg(u16 irq, unsigned bank_base) 266static inline u32 sunxi_irq_cfg_reg(const struct sunxi_pinctrl_desc *desc,
267 u16 irq)
267{ 268{
269 unsigned bank_base = desc->irq_bank_base;
268 u8 bank = irq / IRQ_PER_BANK; 270 u8 bank = irq / IRQ_PER_BANK;
269 u8 reg = (irq % IRQ_PER_BANK) / IRQ_CFG_IRQ_PER_REG * 0x04; 271 u8 reg = (irq % IRQ_PER_BANK) / IRQ_CFG_IRQ_PER_REG * 0x04;
270 272
@@ -277,16 +279,19 @@ static inline u32 sunxi_irq_cfg_offset(u16 irq)
277 return irq_num * IRQ_CFG_IRQ_BITS; 279 return irq_num * IRQ_CFG_IRQ_BITS;
278} 280}
279 281
280static inline u32 sunxi_irq_ctrl_reg_from_bank(u8 bank, unsigned bank_base) 282static inline u32 sunxi_irq_ctrl_reg_from_bank(const struct sunxi_pinctrl_desc *desc, u8 bank)
281{ 283{
284 unsigned bank_base = desc->irq_bank_base;
285
282 return IRQ_CTRL_REG + (bank_base + bank) * IRQ_MEM_SIZE; 286 return IRQ_CTRL_REG + (bank_base + bank) * IRQ_MEM_SIZE;
283} 287}
284 288
285static inline u32 sunxi_irq_ctrl_reg(u16 irq, unsigned bank_base) 289static inline u32 sunxi_irq_ctrl_reg(const struct sunxi_pinctrl_desc *desc,
290 u16 irq)
286{ 291{
287 u8 bank = irq / IRQ_PER_BANK; 292 u8 bank = irq / IRQ_PER_BANK;
288 293
289 return sunxi_irq_ctrl_reg_from_bank(bank, bank_base); 294 return sunxi_irq_ctrl_reg_from_bank(desc, bank);
290} 295}
291 296
292static inline u32 sunxi_irq_ctrl_offset(u16 irq) 297static inline u32 sunxi_irq_ctrl_offset(u16 irq)
@@ -295,21 +300,26 @@ static inline u32 sunxi_irq_ctrl_offset(u16 irq)
295 return irq_num * IRQ_CTRL_IRQ_BITS; 300 return irq_num * IRQ_CTRL_IRQ_BITS;
296} 301}
297 302
298static inline u32 sunxi_irq_debounce_reg_from_bank(u8 bank, unsigned bank_base) 303static inline u32 sunxi_irq_debounce_reg_from_bank(const struct sunxi_pinctrl_desc *desc, u8 bank)
299{ 304{
305 unsigned bank_base = desc->irq_bank_base;
306
300 return IRQ_DEBOUNCE_REG + (bank_base + bank) * IRQ_MEM_SIZE; 307 return IRQ_DEBOUNCE_REG + (bank_base + bank) * IRQ_MEM_SIZE;
301} 308}
302 309
303static inline u32 sunxi_irq_status_reg_from_bank(u8 bank, unsigned bank_base) 310static inline u32 sunxi_irq_status_reg_from_bank(const struct sunxi_pinctrl_desc *desc, u8 bank)
304{ 311{
312 unsigned bank_base = desc->irq_bank_base;
313
305 return IRQ_STATUS_REG + (bank_base + bank) * IRQ_MEM_SIZE; 314 return IRQ_STATUS_REG + (bank_base + bank) * IRQ_MEM_SIZE;
306} 315}
307 316
308static inline u32 sunxi_irq_status_reg(u16 irq, unsigned bank_base) 317static inline u32 sunxi_irq_status_reg(const struct sunxi_pinctrl_desc *desc,
318 u16 irq)
309{ 319{
310 u8 bank = irq / IRQ_PER_BANK; 320 u8 bank = irq / IRQ_PER_BANK;
311 321
312 return sunxi_irq_status_reg_from_bank(bank, bank_base); 322 return sunxi_irq_status_reg_from_bank(desc, bank);
313} 323}
314 324
315static inline u32 sunxi_irq_status_offset(u16 irq) 325static inline u32 sunxi_irq_status_offset(u16 irq)