diff options
author | Kevin Cernekee <cernekee@gmail.com> | 2014-11-07 01:44:29 -0500 |
---|---|---|
committer | Jason Cooper <jason@lakedaemon.net> | 2014-11-08 23:03:35 -0500 |
commit | 1abbdbac362af44f337fdbae5dcbe8d9ced8d063 (patch) | |
tree | 687095c1455ac91cad72d0a301e141b51f3e6b83 | |
parent | c17261fac3874767bf5478ffb27b843ac66d1f5d (diff) |
irqchip: brcmstb-l2: Convert driver to use irq_reg_{readl,writel}
This effectively converts the __raw_ accessors to the non-__raw_
equivalents. To handle BE, we pass IRQ_GC_BE_IO, similar to what was
done in irq-bcm7120-l2.c.
Since irq_reg_writel now takes an irq_chip_generic argument, writel must
be used for the initial hardware reset in the probe function. But that
operation never needs endian swapping, so it's probably not a big deal.
Signed-off-by: Kevin Cernekee <cernekee@gmail.com>
Acked-by: Arnd Bergmann <arnd@arndb.de>
Link: https://lkml.kernel.org/r/1415342669-30640-15-git-send-email-cernekee@gmail.com
Signed-off-by: Jason Cooper <jason@lakedaemon.net>
-rw-r--r-- | drivers/irqchip/irq-brcmstb-l2.c | 34 |
1 files changed, 22 insertions, 12 deletions
diff --git a/drivers/irqchip/irq-brcmstb-l2.c b/drivers/irqchip/irq-brcmstb-l2.c index c9bdf2087c2a..4aa653a0ac72 100644 --- a/drivers/irqchip/irq-brcmstb-l2.c +++ b/drivers/irqchip/irq-brcmstb-l2.c | |||
@@ -18,6 +18,7 @@ | |||
18 | #include <linux/init.h> | 18 | #include <linux/init.h> |
19 | #include <linux/slab.h> | 19 | #include <linux/slab.h> |
20 | #include <linux/module.h> | 20 | #include <linux/module.h> |
21 | #include <linux/kconfig.h> | ||
21 | #include <linux/platform_device.h> | 22 | #include <linux/platform_device.h> |
22 | #include <linux/spinlock.h> | 23 | #include <linux/spinlock.h> |
23 | #include <linux/of.h> | 24 | #include <linux/of.h> |
@@ -53,13 +54,14 @@ struct brcmstb_l2_intc_data { | |||
53 | static void brcmstb_l2_intc_irq_handle(unsigned int irq, struct irq_desc *desc) | 54 | static void brcmstb_l2_intc_irq_handle(unsigned int irq, struct irq_desc *desc) |
54 | { | 55 | { |
55 | struct brcmstb_l2_intc_data *b = irq_desc_get_handler_data(desc); | 56 | struct brcmstb_l2_intc_data *b = irq_desc_get_handler_data(desc); |
57 | struct irq_chip_generic *gc = irq_get_domain_generic_chip(b->domain, 0); | ||
56 | struct irq_chip *chip = irq_desc_get_chip(desc); | 58 | struct irq_chip *chip = irq_desc_get_chip(desc); |
57 | u32 status; | 59 | u32 status; |
58 | 60 | ||
59 | chained_irq_enter(chip, desc); | 61 | chained_irq_enter(chip, desc); |
60 | 62 | ||
61 | status = __raw_readl(b->base + CPU_STATUS) & | 63 | status = irq_reg_readl(gc, CPU_STATUS) & |
62 | ~(__raw_readl(b->base + CPU_MASK_STATUS)); | 64 | ~(irq_reg_readl(gc, CPU_MASK_STATUS)); |
63 | 65 | ||
64 | if (status == 0) { | 66 | if (status == 0) { |
65 | raw_spin_lock(&desc->lock); | 67 | raw_spin_lock(&desc->lock); |
@@ -71,7 +73,7 @@ static void brcmstb_l2_intc_irq_handle(unsigned int irq, struct irq_desc *desc) | |||
71 | do { | 73 | do { |
72 | irq = ffs(status) - 1; | 74 | irq = ffs(status) - 1; |
73 | /* ack at our level */ | 75 | /* ack at our level */ |
74 | __raw_writel(1 << irq, b->base + CPU_CLEAR); | 76 | irq_reg_writel(gc, 1 << irq, CPU_CLEAR); |
75 | status &= ~(1 << irq); | 77 | status &= ~(1 << irq); |
76 | generic_handle_irq(irq_find_mapping(b->domain, irq)); | 78 | generic_handle_irq(irq_find_mapping(b->domain, irq)); |
77 | } while (status); | 79 | } while (status); |
@@ -86,12 +88,12 @@ static void brcmstb_l2_intc_suspend(struct irq_data *d) | |||
86 | 88 | ||
87 | irq_gc_lock(gc); | 89 | irq_gc_lock(gc); |
88 | /* Save the current mask */ | 90 | /* Save the current mask */ |
89 | b->saved_mask = __raw_readl(b->base + CPU_MASK_STATUS); | 91 | b->saved_mask = irq_reg_readl(gc, CPU_MASK_STATUS); |
90 | 92 | ||
91 | if (b->can_wake) { | 93 | if (b->can_wake) { |
92 | /* Program the wakeup mask */ | 94 | /* Program the wakeup mask */ |
93 | __raw_writel(~gc->wake_active, b->base + CPU_MASK_SET); | 95 | irq_reg_writel(gc, ~gc->wake_active, CPU_MASK_SET); |
94 | __raw_writel(gc->wake_active, b->base + CPU_MASK_CLEAR); | 96 | irq_reg_writel(gc, gc->wake_active, CPU_MASK_CLEAR); |
95 | } | 97 | } |
96 | irq_gc_unlock(gc); | 98 | irq_gc_unlock(gc); |
97 | } | 99 | } |
@@ -103,11 +105,11 @@ static void brcmstb_l2_intc_resume(struct irq_data *d) | |||
103 | 105 | ||
104 | irq_gc_lock(gc); | 106 | irq_gc_lock(gc); |
105 | /* Clear unmasked non-wakeup interrupts */ | 107 | /* Clear unmasked non-wakeup interrupts */ |
106 | __raw_writel(~b->saved_mask & ~gc->wake_active, b->base + CPU_CLEAR); | 108 | irq_reg_writel(gc, ~b->saved_mask & ~gc->wake_active, CPU_CLEAR); |
107 | 109 | ||
108 | /* Restore the saved mask */ | 110 | /* Restore the saved mask */ |
109 | __raw_writel(b->saved_mask, b->base + CPU_MASK_SET); | 111 | irq_reg_writel(gc, b->saved_mask, CPU_MASK_SET); |
110 | __raw_writel(~b->saved_mask, b->base + CPU_MASK_CLEAR); | 112 | irq_reg_writel(gc, ~b->saved_mask, CPU_MASK_CLEAR); |
111 | irq_gc_unlock(gc); | 113 | irq_gc_unlock(gc); |
112 | } | 114 | } |
113 | 115 | ||
@@ -119,6 +121,7 @@ int __init brcmstb_l2_intc_of_init(struct device_node *np, | |||
119 | struct irq_chip_generic *gc; | 121 | struct irq_chip_generic *gc; |
120 | struct irq_chip_type *ct; | 122 | struct irq_chip_type *ct; |
121 | int ret; | 123 | int ret; |
124 | unsigned int flags; | ||
122 | 125 | ||
123 | data = kzalloc(sizeof(*data), GFP_KERNEL); | 126 | data = kzalloc(sizeof(*data), GFP_KERNEL); |
124 | if (!data) | 127 | if (!data) |
@@ -132,8 +135,8 @@ int __init brcmstb_l2_intc_of_init(struct device_node *np, | |||
132 | } | 135 | } |
133 | 136 | ||
134 | /* Disable all interrupts by default */ | 137 | /* Disable all interrupts by default */ |
135 | __raw_writel(0xffffffff, data->base + CPU_MASK_SET); | 138 | writel(0xffffffff, data->base + CPU_MASK_SET); |
136 | __raw_writel(0xffffffff, data->base + CPU_CLEAR); | 139 | writel(0xffffffff, data->base + CPU_CLEAR); |
137 | 140 | ||
138 | data->parent_irq = irq_of_parse_and_map(np, 0); | 141 | data->parent_irq = irq_of_parse_and_map(np, 0); |
139 | if (data->parent_irq < 0) { | 142 | if (data->parent_irq < 0) { |
@@ -149,9 +152,16 @@ int __init brcmstb_l2_intc_of_init(struct device_node *np, | |||
149 | goto out_unmap; | 152 | goto out_unmap; |
150 | } | 153 | } |
151 | 154 | ||
155 | /* MIPS chips strapped for BE will automagically configure the | ||
156 | * peripheral registers for CPU-native byte order. | ||
157 | */ | ||
158 | flags = 0; | ||
159 | if (IS_ENABLED(CONFIG_MIPS) && IS_ENABLED(CONFIG_CPU_BIG_ENDIAN)) | ||
160 | flags |= IRQ_GC_BE_IO; | ||
161 | |||
152 | /* Allocate a single Generic IRQ chip for this node */ | 162 | /* Allocate a single Generic IRQ chip for this node */ |
153 | ret = irq_alloc_domain_generic_chips(data->domain, 32, 1, | 163 | ret = irq_alloc_domain_generic_chips(data->domain, 32, 1, |
154 | np->full_name, handle_edge_irq, clr, 0, 0); | 164 | np->full_name, handle_edge_irq, clr, 0, flags); |
155 | if (ret) { | 165 | if (ret) { |
156 | pr_err("failed to allocate generic irq chip\n"); | 166 | pr_err("failed to allocate generic irq chip\n"); |
157 | goto out_free_domain; | 167 | goto out_free_domain; |