aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpio/gpio-aspeed.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2018-08-16 00:35:38 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2018-08-16 00:35:38 -0400
commit6de4c691eab8f421e34c5250f63bf3f477d30eec (patch)
treedd3deaa163bb478b13778a712afdfccc8cf43f20 /drivers/gpio/gpio-aspeed.c
parentc1c2ad82c772966d3cdb9a4852329fa2cf71853a (diff)
parenta5ec96ddfd55c501d451cb310566a1170c267ecb (diff)
Merge tag 'gpio-v4.19-1' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-gpio
Pull GPIO updates from Linus Walleij: "This is the bulk of GPIO changes for the v4.19 kernel cycle. I don't know if anything in particular stands out. Maybe the Aspeed coprocessor thing from Benji: Aspeed is doing baseboard management chips (BMC's) for servers etc. These Aspeed's are ARM processors that exist inside (I guess) Intel servers, and they are moving forward to using mainline Linux in those. This is one of the pieces of the puzzle to achive that. They are doing OpenBMC, it's pretty cool: https://lwn.net/Articles/683320/ Summary: Core changes: - Add a new API for explicitly naming GPIO consumers, when needed. - Don't let userspace set values on input lines. While we do not think anyone would do this crazy thing we better plug the hole before someone uses it and think it's a nifty feature. - Avoid calling chip->request() for unused GPIOs. New drivers/subdrivers: - The Mediatek MT7621 is supported which is a big win for OpenWRT and similar router distributions using this chip, as it seems every major router manufacturer on the planet has made products using this chip: https://wikidevi.com/wiki/MediaTek_MT7621 - The Tegra 194 is now supported. - The IT87 driver now supports IT8786E and IT8718F super-IO chips. - Add support for Rockchip RK3328 in the syscon GPIO driver. Driver changes: - Handle the get/set_multiple() properly on MMIO chips with inverted direction registers. We didn't have this problem until a new chip appear that has get/set registers AND inverted direction bits, OK now we handle it. - A patch series making more error codes percolate upward properly for different errors on gpiochip_lock_as_irq(). - Get/set multiple for the OMAP driver, accelerating these multiple line operations if possible. - A coprocessor interface for the Aspeed driver. Sometimes a few GPIO lines need to be grabbed by a co-processor for doing automated tasks, sometimes they are available as GPIO lines. By adding an explicit API in this driver we make it possible for the two line consumers to coexist. (This work was made available on the ib-aspeed branch, which may be appearing in other pull requests.) - Implemented .get_direction() and open drain in the SCH311x driver. - Continuing cleanup of included headers in GPIO drivers" * tag 'gpio-v4.19-1' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-gpio: (80 commits) gpio: it87: Add support for IT8613 gpio: it87: add support for IT8718F Super I/O. gpiolib: Avoid calling chip->request() for unused gpios gpio: tegra: Include the right header gpio: mmio: Fix up inverted direction registers gpio: xilinx: Use the right include gpio: timberdale: Include the right header gpio: tb10x: Use the right include gpiolib: Fix of_node inconsistency gpio: vr41xx: Bail out on gpiochip_lock_as_irq() error gpio: uniphier: Bail out on gpiochip_lock_as_irq() error gpio: xgene-sb: Don't shadow error code of gpiochip_lock_as_irq() gpio: em: Don't shadow error code of gpiochip_lock_as_irq() gpio: dwapb: Don't shadow error code of gpiochip_lock_as_irq() gpio: bcm-kona: Don't shadow error code of gpiochip_lock_as_irq() gpiolib: Don't shadow error code of gpiochip_lock_as_irq() gpio: syscon: rockchip: add GRF GPIO support for rk3328 gpio: omap: Add get/set_multiple() callbacks gpio: pxa: remove set but not used variable 'gpio_offset' gpio-it87: add support for IT8786E Super I/O ...
Diffstat (limited to 'drivers/gpio/gpio-aspeed.c')
-rw-r--r--drivers/gpio/gpio-aspeed.c426
1 files changed, 368 insertions, 58 deletions
diff --git a/drivers/gpio/gpio-aspeed.c b/drivers/gpio/gpio-aspeed.c
index b31ae16170e7..2342e154029b 100644
--- a/drivers/gpio/gpio-aspeed.c
+++ b/drivers/gpio/gpio-aspeed.c
@@ -12,6 +12,7 @@
12#include <asm/div64.h> 12#include <asm/div64.h>
13#include <linux/clk.h> 13#include <linux/clk.h>
14#include <linux/gpio/driver.h> 14#include <linux/gpio/driver.h>
15#include <linux/gpio/aspeed.h>
15#include <linux/hashtable.h> 16#include <linux/hashtable.h>
16#include <linux/init.h> 17#include <linux/init.h>
17#include <linux/io.h> 18#include <linux/io.h>
@@ -22,6 +23,15 @@
22#include <linux/spinlock.h> 23#include <linux/spinlock.h>
23#include <linux/string.h> 24#include <linux/string.h>
24 25
26/*
27 * These two headers aren't meant to be used by GPIO drivers. We need
28 * them in order to access gpio_chip_hwgpio() which we need to implement
29 * the aspeed specific API which allows the coprocessor to request
30 * access to some GPIOs and to arbitrate between coprocessor and ARM.
31 */
32#include <linux/gpio/consumer.h>
33#include "gpiolib.h"
34
25struct aspeed_bank_props { 35struct aspeed_bank_props {
26 unsigned int bank; 36 unsigned int bank;
27 u32 input; 37 u32 input;
@@ -56,83 +66,130 @@ struct aspeed_gpio {
56 struct clk *clk; 66 struct clk *clk;
57 67
58 u32 *dcache; 68 u32 *dcache;
69 u8 *cf_copro_bankmap;
59}; 70};
60 71
61struct aspeed_gpio_bank { 72struct aspeed_gpio_bank {
62 uint16_t val_regs; 73 uint16_t val_regs; /* +0: Rd: read input value, Wr: set write latch
74 * +4: Rd/Wr: Direction (0=in, 1=out)
75 */
76 uint16_t rdata_reg; /* Rd: read write latch, Wr: <none> */
63 uint16_t irq_regs; 77 uint16_t irq_regs;
64 uint16_t debounce_regs; 78 uint16_t debounce_regs;
65 uint16_t tolerance_regs; 79 uint16_t tolerance_regs;
80 uint16_t cmdsrc_regs;
66 const char names[4][3]; 81 const char names[4][3];
67}; 82};
68 83
84/*
85 * Note: The "value" register returns the input value sampled on the
86 * line even when the GPIO is configured as an output. Since
87 * that input goes through synchronizers, writing, then reading
88 * back may not return the written value right away.
89 *
90 * The "rdata" register returns the content of the write latch
91 * and thus can be used to read back what was last written
92 * reliably.
93 */
94
69static const int debounce_timers[4] = { 0x00, 0x50, 0x54, 0x58 }; 95static const int debounce_timers[4] = { 0x00, 0x50, 0x54, 0x58 };
70 96
97static const struct aspeed_gpio_copro_ops *copro_ops;
98static void *copro_data;
99
71static const struct aspeed_gpio_bank aspeed_gpio_banks[] = { 100static const struct aspeed_gpio_bank aspeed_gpio_banks[] = {
72 { 101 {
73 .val_regs = 0x0000, 102 .val_regs = 0x0000,
103 .rdata_reg = 0x00c0,
74 .irq_regs = 0x0008, 104 .irq_regs = 0x0008,
75 .debounce_regs = 0x0040, 105 .debounce_regs = 0x0040,
76 .tolerance_regs = 0x001c, 106 .tolerance_regs = 0x001c,
107 .cmdsrc_regs = 0x0060,
77 .names = { "A", "B", "C", "D" }, 108 .names = { "A", "B", "C", "D" },
78 }, 109 },
79 { 110 {
80 .val_regs = 0x0020, 111 .val_regs = 0x0020,
112 .rdata_reg = 0x00c4,
81 .irq_regs = 0x0028, 113 .irq_regs = 0x0028,
82 .debounce_regs = 0x0048, 114 .debounce_regs = 0x0048,
83 .tolerance_regs = 0x003c, 115 .tolerance_regs = 0x003c,
116 .cmdsrc_regs = 0x0068,
84 .names = { "E", "F", "G", "H" }, 117 .names = { "E", "F", "G", "H" },
85 }, 118 },
86 { 119 {
87 .val_regs = 0x0070, 120 .val_regs = 0x0070,
121 .rdata_reg = 0x00c8,
88 .irq_regs = 0x0098, 122 .irq_regs = 0x0098,
89 .debounce_regs = 0x00b0, 123 .debounce_regs = 0x00b0,
90 .tolerance_regs = 0x00ac, 124 .tolerance_regs = 0x00ac,
125 .cmdsrc_regs = 0x0090,
91 .names = { "I", "J", "K", "L" }, 126 .names = { "I", "J", "K", "L" },
92 }, 127 },
93 { 128 {
94 .val_regs = 0x0078, 129 .val_regs = 0x0078,
130 .rdata_reg = 0x00cc,
95 .irq_regs = 0x00e8, 131 .irq_regs = 0x00e8,
96 .debounce_regs = 0x0100, 132 .debounce_regs = 0x0100,
97 .tolerance_regs = 0x00fc, 133 .tolerance_regs = 0x00fc,
134 .cmdsrc_regs = 0x00e0,
98 .names = { "M", "N", "O", "P" }, 135 .names = { "M", "N", "O", "P" },
99 }, 136 },
100 { 137 {
101 .val_regs = 0x0080, 138 .val_regs = 0x0080,
139 .rdata_reg = 0x00d0,
102 .irq_regs = 0x0118, 140 .irq_regs = 0x0118,
103 .debounce_regs = 0x0130, 141 .debounce_regs = 0x0130,
104 .tolerance_regs = 0x012c, 142 .tolerance_regs = 0x012c,
143 .cmdsrc_regs = 0x0110,
105 .names = { "Q", "R", "S", "T" }, 144 .names = { "Q", "R", "S", "T" },
106 }, 145 },
107 { 146 {
108 .val_regs = 0x0088, 147 .val_regs = 0x0088,
148 .rdata_reg = 0x00d4,
109 .irq_regs = 0x0148, 149 .irq_regs = 0x0148,
110 .debounce_regs = 0x0160, 150 .debounce_regs = 0x0160,
111 .tolerance_regs = 0x015c, 151 .tolerance_regs = 0x015c,
152 .cmdsrc_regs = 0x0140,
112 .names = { "U", "V", "W", "X" }, 153 .names = { "U", "V", "W", "X" },
113 }, 154 },
114 { 155 {
115 .val_regs = 0x01E0, 156 .val_regs = 0x01E0,
157 .rdata_reg = 0x00d8,
116 .irq_regs = 0x0178, 158 .irq_regs = 0x0178,
117 .debounce_regs = 0x0190, 159 .debounce_regs = 0x0190,
118 .tolerance_regs = 0x018c, 160 .tolerance_regs = 0x018c,
161 .cmdsrc_regs = 0x0170,
119 .names = { "Y", "Z", "AA", "AB" }, 162 .names = { "Y", "Z", "AA", "AB" },
120 }, 163 },
121 { 164 {
122 .val_regs = 0x01e8, 165 .val_regs = 0x01e8,
166 .rdata_reg = 0x00dc,
123 .irq_regs = 0x01a8, 167 .irq_regs = 0x01a8,
124 .debounce_regs = 0x01c0, 168 .debounce_regs = 0x01c0,
125 .tolerance_regs = 0x01bc, 169 .tolerance_regs = 0x01bc,
170 .cmdsrc_regs = 0x01a0,
126 .names = { "AC", "", "", "" }, 171 .names = { "AC", "", "", "" },
127 }, 172 },
128}; 173};
129 174
130#define GPIO_BANK(x) ((x) >> 5) 175enum aspeed_gpio_reg {
131#define GPIO_OFFSET(x) ((x) & 0x1f) 176 reg_val,
132#define GPIO_BIT(x) BIT(GPIO_OFFSET(x)) 177 reg_rdata,
178 reg_dir,
179 reg_irq_enable,
180 reg_irq_type0,
181 reg_irq_type1,
182 reg_irq_type2,
183 reg_irq_status,
184 reg_debounce_sel1,
185 reg_debounce_sel2,
186 reg_tolerance,
187 reg_cmdsrc0,
188 reg_cmdsrc1,
189};
133 190
134#define GPIO_DATA 0x00 191#define GPIO_VAL_VALUE 0x00
135#define GPIO_DIR 0x04 192#define GPIO_VAL_DIR 0x04
136 193
137#define GPIO_IRQ_ENABLE 0x00 194#define GPIO_IRQ_ENABLE 0x00
138#define GPIO_IRQ_TYPE0 0x04 195#define GPIO_IRQ_TYPE0 0x04
@@ -143,6 +200,53 @@ static const struct aspeed_gpio_bank aspeed_gpio_banks[] = {
143#define GPIO_DEBOUNCE_SEL1 0x00 200#define GPIO_DEBOUNCE_SEL1 0x00
144#define GPIO_DEBOUNCE_SEL2 0x04 201#define GPIO_DEBOUNCE_SEL2 0x04
145 202
203#define GPIO_CMDSRC_0 0x00
204#define GPIO_CMDSRC_1 0x04
205#define GPIO_CMDSRC_ARM 0
206#define GPIO_CMDSRC_LPC 1
207#define GPIO_CMDSRC_COLDFIRE 2
208#define GPIO_CMDSRC_RESERVED 3
209
210/* This will be resolved at compile time */
211static inline void __iomem *bank_reg(struct aspeed_gpio *gpio,
212 const struct aspeed_gpio_bank *bank,
213 const enum aspeed_gpio_reg reg)
214{
215 switch (reg) {
216 case reg_val:
217 return gpio->base + bank->val_regs + GPIO_VAL_VALUE;
218 case reg_rdata:
219 return gpio->base + bank->rdata_reg;
220 case reg_dir:
221 return gpio->base + bank->val_regs + GPIO_VAL_DIR;
222 case reg_irq_enable:
223 return gpio->base + bank->irq_regs + GPIO_IRQ_ENABLE;
224 case reg_irq_type0:
225 return gpio->base + bank->irq_regs + GPIO_IRQ_TYPE0;
226 case reg_irq_type1:
227 return gpio->base + bank->irq_regs + GPIO_IRQ_TYPE1;
228 case reg_irq_type2:
229 return gpio->base + bank->irq_regs + GPIO_IRQ_TYPE2;
230 case reg_irq_status:
231 return gpio->base + bank->irq_regs + GPIO_IRQ_STATUS;
232 case reg_debounce_sel1:
233 return gpio->base + bank->debounce_regs + GPIO_DEBOUNCE_SEL1;
234 case reg_debounce_sel2:
235 return gpio->base + bank->debounce_regs + GPIO_DEBOUNCE_SEL2;
236 case reg_tolerance:
237 return gpio->base + bank->tolerance_regs;
238 case reg_cmdsrc0:
239 return gpio->base + bank->cmdsrc_regs + GPIO_CMDSRC_0;
240 case reg_cmdsrc1:
241 return gpio->base + bank->cmdsrc_regs + GPIO_CMDSRC_1;
242 }
243 BUG();
244}
245
246#define GPIO_BANK(x) ((x) >> 5)
247#define GPIO_OFFSET(x) ((x) & 0x1f)
248#define GPIO_BIT(x) BIT(GPIO_OFFSET(x))
249
146#define _GPIO_SET_DEBOUNCE(t, o, i) ((!!((t) & BIT(i))) << GPIO_OFFSET(o)) 250#define _GPIO_SET_DEBOUNCE(t, o, i) ((!!((t) & BIT(i))) << GPIO_OFFSET(o))
147#define GPIO_SET_DEBOUNCE1(t, o) _GPIO_SET_DEBOUNCE(t, o, 1) 251#define GPIO_SET_DEBOUNCE1(t, o) _GPIO_SET_DEBOUNCE(t, o, 1)
148#define GPIO_SET_DEBOUNCE2(t, o) _GPIO_SET_DEBOUNCE(t, o, 0) 252#define GPIO_SET_DEBOUNCE2(t, o) _GPIO_SET_DEBOUNCE(t, o, 0)
@@ -201,18 +305,80 @@ static inline bool have_output(struct aspeed_gpio *gpio, unsigned int offset)
201 return !props || (props->output & GPIO_BIT(offset)); 305 return !props || (props->output & GPIO_BIT(offset));
202} 306}
203 307
204static void __iomem *bank_val_reg(struct aspeed_gpio *gpio, 308static void aspeed_gpio_change_cmd_source(struct aspeed_gpio *gpio,
205 const struct aspeed_gpio_bank *bank, 309 const struct aspeed_gpio_bank *bank,
206 unsigned int reg) 310 int bindex, int cmdsrc)
207{ 311{
208 return gpio->base + bank->val_regs + reg; 312 void __iomem *c0 = bank_reg(gpio, bank, reg_cmdsrc0);
313 void __iomem *c1 = bank_reg(gpio, bank, reg_cmdsrc1);
314 u32 bit, reg;
315
316 /*
317 * Each register controls 4 banks, so take the bottom 2
318 * bits of the bank index, and use them to select the
319 * right control bit (0, 8, 16 or 24).
320 */
321 bit = BIT((bindex & 3) << 3);
322
323 /* Source 1 first to avoid illegal 11 combination */
324 reg = ioread32(c1);
325 if (cmdsrc & 2)
326 reg |= bit;
327 else
328 reg &= ~bit;
329 iowrite32(reg, c1);
330
331 /* Then Source 0 */
332 reg = ioread32(c0);
333 if (cmdsrc & 1)
334 reg |= bit;
335 else
336 reg &= ~bit;
337 iowrite32(reg, c0);
209} 338}
210 339
211static void __iomem *bank_irq_reg(struct aspeed_gpio *gpio, 340static bool aspeed_gpio_copro_request(struct aspeed_gpio *gpio,
212 const struct aspeed_gpio_bank *bank, 341 unsigned int offset)
213 unsigned int reg)
214{ 342{
215 return gpio->base + bank->irq_regs + reg; 343 const struct aspeed_gpio_bank *bank = to_bank(offset);
344
345 if (!copro_ops || !gpio->cf_copro_bankmap)
346 return false;
347 if (!gpio->cf_copro_bankmap[offset >> 3])
348 return false;
349 if (!copro_ops->request_access)
350 return false;
351
352 /* Pause the coprocessor */
353 copro_ops->request_access(copro_data);
354
355 /* Change command source back to ARM */
356 aspeed_gpio_change_cmd_source(gpio, bank, offset >> 3, GPIO_CMDSRC_ARM);
357
358 /* Update cache */
359 gpio->dcache[GPIO_BANK(offset)] = ioread32(bank_reg(gpio, bank, reg_rdata));
360
361 return true;
362}
363
364static void aspeed_gpio_copro_release(struct aspeed_gpio *gpio,
365 unsigned int offset)
366{
367 const struct aspeed_gpio_bank *bank = to_bank(offset);
368
369 if (!copro_ops || !gpio->cf_copro_bankmap)
370 return;
371 if (!gpio->cf_copro_bankmap[offset >> 3])
372 return;
373 if (!copro_ops->release_access)
374 return;
375
376 /* Change command source back to ColdFire */
377 aspeed_gpio_change_cmd_source(gpio, bank, offset >> 3,
378 GPIO_CMDSRC_COLDFIRE);
379
380 /* Restart the coprocessor */
381 copro_ops->release_access(copro_data);
216} 382}
217 383
218static int aspeed_gpio_get(struct gpio_chip *gc, unsigned int offset) 384static int aspeed_gpio_get(struct gpio_chip *gc, unsigned int offset)
@@ -220,8 +386,7 @@ static int aspeed_gpio_get(struct gpio_chip *gc, unsigned int offset)
220 struct aspeed_gpio *gpio = gpiochip_get_data(gc); 386 struct aspeed_gpio *gpio = gpiochip_get_data(gc);
221 const struct aspeed_gpio_bank *bank = to_bank(offset); 387 const struct aspeed_gpio_bank *bank = to_bank(offset);
222 388
223 return !!(ioread32(bank_val_reg(gpio, bank, GPIO_DATA)) 389 return !!(ioread32(bank_reg(gpio, bank, reg_val)) & GPIO_BIT(offset));
224 & GPIO_BIT(offset));
225} 390}
226 391
227static void __aspeed_gpio_set(struct gpio_chip *gc, unsigned int offset, 392static void __aspeed_gpio_set(struct gpio_chip *gc, unsigned int offset,
@@ -232,7 +397,7 @@ static void __aspeed_gpio_set(struct gpio_chip *gc, unsigned int offset,
232 void __iomem *addr; 397 void __iomem *addr;
233 u32 reg; 398 u32 reg;
234 399
235 addr = bank_val_reg(gpio, bank, GPIO_DATA); 400 addr = bank_reg(gpio, bank, reg_val);
236 reg = gpio->dcache[GPIO_BANK(offset)]; 401 reg = gpio->dcache[GPIO_BANK(offset)];
237 402
238 if (val) 403 if (val)
@@ -249,11 +414,15 @@ static void aspeed_gpio_set(struct gpio_chip *gc, unsigned int offset,
249{ 414{
250 struct aspeed_gpio *gpio = gpiochip_get_data(gc); 415 struct aspeed_gpio *gpio = gpiochip_get_data(gc);
251 unsigned long flags; 416 unsigned long flags;
417 bool copro;
252 418
253 spin_lock_irqsave(&gpio->lock, flags); 419 spin_lock_irqsave(&gpio->lock, flags);
420 copro = aspeed_gpio_copro_request(gpio, offset);
254 421
255 __aspeed_gpio_set(gc, offset, val); 422 __aspeed_gpio_set(gc, offset, val);
256 423
424 if (copro)
425 aspeed_gpio_copro_release(gpio, offset);
257 spin_unlock_irqrestore(&gpio->lock, flags); 426 spin_unlock_irqrestore(&gpio->lock, flags);
258} 427}
259 428
@@ -261,7 +430,9 @@ static int aspeed_gpio_dir_in(struct gpio_chip *gc, unsigned int offset)
261{ 430{
262 struct aspeed_gpio *gpio = gpiochip_get_data(gc); 431 struct aspeed_gpio *gpio = gpiochip_get_data(gc);
263 const struct aspeed_gpio_bank *bank = to_bank(offset); 432 const struct aspeed_gpio_bank *bank = to_bank(offset);
433 void __iomem *addr = bank_reg(gpio, bank, reg_dir);
264 unsigned long flags; 434 unsigned long flags;
435 bool copro;
265 u32 reg; 436 u32 reg;
266 437
267 if (!have_input(gpio, offset)) 438 if (!have_input(gpio, offset))
@@ -269,8 +440,13 @@ static int aspeed_gpio_dir_in(struct gpio_chip *gc, unsigned int offset)
269 440
270 spin_lock_irqsave(&gpio->lock, flags); 441 spin_lock_irqsave(&gpio->lock, flags);
271 442
272 reg = ioread32(bank_val_reg(gpio, bank, GPIO_DIR)); 443 reg = ioread32(addr);
273 iowrite32(reg & ~GPIO_BIT(offset), bank_val_reg(gpio, bank, GPIO_DIR)); 444 reg &= ~GPIO_BIT(offset);
445
446 copro = aspeed_gpio_copro_request(gpio, offset);
447 iowrite32(reg, addr);
448 if (copro)
449 aspeed_gpio_copro_release(gpio, offset);
274 450
275 spin_unlock_irqrestore(&gpio->lock, flags); 451 spin_unlock_irqrestore(&gpio->lock, flags);
276 452
@@ -282,7 +458,9 @@ static int aspeed_gpio_dir_out(struct gpio_chip *gc,
282{ 458{
283 struct aspeed_gpio *gpio = gpiochip_get_data(gc); 459 struct aspeed_gpio *gpio = gpiochip_get_data(gc);
284 const struct aspeed_gpio_bank *bank = to_bank(offset); 460 const struct aspeed_gpio_bank *bank = to_bank(offset);
461 void __iomem *addr = bank_reg(gpio, bank, reg_dir);
285 unsigned long flags; 462 unsigned long flags;
463 bool copro;
286 u32 reg; 464 u32 reg;
287 465
288 if (!have_output(gpio, offset)) 466 if (!have_output(gpio, offset))
@@ -290,10 +468,15 @@ static int aspeed_gpio_dir_out(struct gpio_chip *gc,
290 468
291 spin_lock_irqsave(&gpio->lock, flags); 469 spin_lock_irqsave(&gpio->lock, flags);
292 470
471 reg = ioread32(addr);
472 reg |= GPIO_BIT(offset);
473
474 copro = aspeed_gpio_copro_request(gpio, offset);
293 __aspeed_gpio_set(gc, offset, val); 475 __aspeed_gpio_set(gc, offset, val);
294 reg = ioread32(bank_val_reg(gpio, bank, GPIO_DIR)); 476 iowrite32(reg, addr);
295 iowrite32(reg | GPIO_BIT(offset), bank_val_reg(gpio, bank, GPIO_DIR));
296 477
478 if (copro)
479 aspeed_gpio_copro_release(gpio, offset);
297 spin_unlock_irqrestore(&gpio->lock, flags); 480 spin_unlock_irqrestore(&gpio->lock, flags);
298 481
299 return 0; 482 return 0;
@@ -314,7 +497,7 @@ static int aspeed_gpio_get_direction(struct gpio_chip *gc, unsigned int offset)
314 497
315 spin_lock_irqsave(&gpio->lock, flags); 498 spin_lock_irqsave(&gpio->lock, flags);
316 499
317 val = ioread32(bank_val_reg(gpio, bank, GPIO_DIR)) & GPIO_BIT(offset); 500 val = ioread32(bank_reg(gpio, bank, reg_dir)) & GPIO_BIT(offset);
318 501
319 spin_unlock_irqrestore(&gpio->lock, flags); 502 spin_unlock_irqrestore(&gpio->lock, flags);
320 503
@@ -323,24 +506,23 @@ static int aspeed_gpio_get_direction(struct gpio_chip *gc, unsigned int offset)
323} 506}
324 507
325static inline int irqd_to_aspeed_gpio_data(struct irq_data *d, 508static inline int irqd_to_aspeed_gpio_data(struct irq_data *d,
326 struct aspeed_gpio **gpio, 509 struct aspeed_gpio **gpio,
327 const struct aspeed_gpio_bank **bank, 510 const struct aspeed_gpio_bank **bank,
328 u32 *bit) 511 u32 *bit, int *offset)
329{ 512{
330 int offset;
331 struct aspeed_gpio *internal; 513 struct aspeed_gpio *internal;
332 514
333 offset = irqd_to_hwirq(d); 515 *offset = irqd_to_hwirq(d);
334 516
335 internal = irq_data_get_irq_chip_data(d); 517 internal = irq_data_get_irq_chip_data(d);
336 518
337 /* This might be a bit of a questionable place to check */ 519 /* This might be a bit of a questionable place to check */
338 if (!have_irq(internal, offset)) 520 if (!have_irq(internal, *offset))
339 return -ENOTSUPP; 521 return -ENOTSUPP;
340 522
341 *gpio = internal; 523 *gpio = internal;
342 *bank = to_bank(offset); 524 *bank = to_bank(*offset);
343 *bit = GPIO_BIT(offset); 525 *bit = GPIO_BIT(*offset);
344 526
345 return 0; 527 return 0;
346} 528}
@@ -351,17 +533,23 @@ static void aspeed_gpio_irq_ack(struct irq_data *d)
351 struct aspeed_gpio *gpio; 533 struct aspeed_gpio *gpio;
352 unsigned long flags; 534 unsigned long flags;
353 void __iomem *status_addr; 535 void __iomem *status_addr;
536 int rc, offset;
537 bool copro;
354 u32 bit; 538 u32 bit;
355 int rc;
356 539
357 rc = irqd_to_aspeed_gpio_data(d, &gpio, &bank, &bit); 540 rc = irqd_to_aspeed_gpio_data(d, &gpio, &bank, &bit, &offset);
358 if (rc) 541 if (rc)
359 return; 542 return;
360 543
361 status_addr = bank_irq_reg(gpio, bank, GPIO_IRQ_STATUS); 544 status_addr = bank_reg(gpio, bank, reg_irq_status);
362 545
363 spin_lock_irqsave(&gpio->lock, flags); 546 spin_lock_irqsave(&gpio->lock, flags);
547 copro = aspeed_gpio_copro_request(gpio, offset);
548
364 iowrite32(bit, status_addr); 549 iowrite32(bit, status_addr);
550
551 if (copro)
552 aspeed_gpio_copro_release(gpio, offset);
365 spin_unlock_irqrestore(&gpio->lock, flags); 553 spin_unlock_irqrestore(&gpio->lock, flags);
366} 554}
367 555
@@ -372,15 +560,17 @@ static void aspeed_gpio_irq_set_mask(struct irq_data *d, bool set)
372 unsigned long flags; 560 unsigned long flags;
373 u32 reg, bit; 561 u32 reg, bit;
374 void __iomem *addr; 562 void __iomem *addr;
375 int rc; 563 int rc, offset;
564 bool copro;
376 565
377 rc = irqd_to_aspeed_gpio_data(d, &gpio, &bank, &bit); 566 rc = irqd_to_aspeed_gpio_data(d, &gpio, &bank, &bit, &offset);
378 if (rc) 567 if (rc)
379 return; 568 return;
380 569
381 addr = bank_irq_reg(gpio, bank, GPIO_IRQ_ENABLE); 570 addr = bank_reg(gpio, bank, reg_irq_enable);
382 571
383 spin_lock_irqsave(&gpio->lock, flags); 572 spin_lock_irqsave(&gpio->lock, flags);
573 copro = aspeed_gpio_copro_request(gpio, offset);
384 574
385 reg = ioread32(addr); 575 reg = ioread32(addr);
386 if (set) 576 if (set)
@@ -389,6 +579,8 @@ static void aspeed_gpio_irq_set_mask(struct irq_data *d, bool set)
389 reg &= ~bit; 579 reg &= ~bit;
390 iowrite32(reg, addr); 580 iowrite32(reg, addr);
391 581
582 if (copro)
583 aspeed_gpio_copro_release(gpio, offset);
392 spin_unlock_irqrestore(&gpio->lock, flags); 584 spin_unlock_irqrestore(&gpio->lock, flags);
393} 585}
394 586
@@ -413,9 +605,10 @@ static int aspeed_gpio_set_type(struct irq_data *d, unsigned int type)
413 struct aspeed_gpio *gpio; 605 struct aspeed_gpio *gpio;
414 unsigned long flags; 606 unsigned long flags;
415 void __iomem *addr; 607 void __iomem *addr;
416 int rc; 608 int rc, offset;
609 bool copro;
417 610
418 rc = irqd_to_aspeed_gpio_data(d, &gpio, &bank, &bit); 611 rc = irqd_to_aspeed_gpio_data(d, &gpio, &bank, &bit, &offset);
419 if (rc) 612 if (rc)
420 return -EINVAL; 613 return -EINVAL;
421 614
@@ -441,22 +634,25 @@ static int aspeed_gpio_set_type(struct irq_data *d, unsigned int type)
441 } 634 }
442 635
443 spin_lock_irqsave(&gpio->lock, flags); 636 spin_lock_irqsave(&gpio->lock, flags);
637 copro = aspeed_gpio_copro_request(gpio, offset);
444 638
445 addr = bank_irq_reg(gpio, bank, GPIO_IRQ_TYPE0); 639 addr = bank_reg(gpio, bank, reg_irq_type0);
446 reg = ioread32(addr); 640 reg = ioread32(addr);
447 reg = (reg & ~bit) | type0; 641 reg = (reg & ~bit) | type0;
448 iowrite32(reg, addr); 642 iowrite32(reg, addr);
449 643
450 addr = bank_irq_reg(gpio, bank, GPIO_IRQ_TYPE1); 644 addr = bank_reg(gpio, bank, reg_irq_type1);
451 reg = ioread32(addr); 645 reg = ioread32(addr);
452 reg = (reg & ~bit) | type1; 646 reg = (reg & ~bit) | type1;
453 iowrite32(reg, addr); 647 iowrite32(reg, addr);
454 648
455 addr = bank_irq_reg(gpio, bank, GPIO_IRQ_TYPE2); 649 addr = bank_reg(gpio, bank, reg_irq_type2);
456 reg = ioread32(addr); 650 reg = ioread32(addr);
457 reg = (reg & ~bit) | type2; 651 reg = (reg & ~bit) | type2;
458 iowrite32(reg, addr); 652 iowrite32(reg, addr);
459 653
654 if (copro)
655 aspeed_gpio_copro_release(gpio, offset);
460 spin_unlock_irqrestore(&gpio->lock, flags); 656 spin_unlock_irqrestore(&gpio->lock, flags);
461 657
462 irq_set_handler_locked(d, handler); 658 irq_set_handler_locked(d, handler);
@@ -477,7 +673,7 @@ static void aspeed_gpio_irq_handler(struct irq_desc *desc)
477 for (i = 0; i < ARRAY_SIZE(aspeed_gpio_banks); i++) { 673 for (i = 0; i < ARRAY_SIZE(aspeed_gpio_banks); i++) {
478 const struct aspeed_gpio_bank *bank = &aspeed_gpio_banks[i]; 674 const struct aspeed_gpio_bank *bank = &aspeed_gpio_banks[i];
479 675
480 reg = ioread32(bank_irq_reg(data, bank, GPIO_IRQ_STATUS)); 676 reg = ioread32(bank_reg(data, bank, reg_irq_status));
481 677
482 for_each_set_bit(p, &reg, 32) { 678 for_each_set_bit(p, &reg, 32) {
483 girq = irq_find_mapping(gc->irq.domain, i * 32 + p); 679 girq = irq_find_mapping(gc->irq.domain, i * 32 + p);
@@ -549,21 +745,27 @@ static int aspeed_gpio_reset_tolerance(struct gpio_chip *chip,
549 unsigned int offset, bool enable) 745 unsigned int offset, bool enable)
550{ 746{
551 struct aspeed_gpio *gpio = gpiochip_get_data(chip); 747 struct aspeed_gpio *gpio = gpiochip_get_data(chip);
552 const struct aspeed_gpio_bank *bank;
553 unsigned long flags; 748 unsigned long flags;
749 void __iomem *treg;
750 bool copro;
554 u32 val; 751 u32 val;
555 752
556 bank = to_bank(offset); 753 treg = bank_reg(gpio, to_bank(offset), reg_tolerance);
557 754
558 spin_lock_irqsave(&gpio->lock, flags); 755 spin_lock_irqsave(&gpio->lock, flags);
559 val = readl(gpio->base + bank->tolerance_regs); 756 copro = aspeed_gpio_copro_request(gpio, offset);
757
758 val = readl(treg);
560 759
561 if (enable) 760 if (enable)
562 val |= GPIO_BIT(offset); 761 val |= GPIO_BIT(offset);
563 else 762 else
564 val &= ~GPIO_BIT(offset); 763 val &= ~GPIO_BIT(offset);
565 764
566 writel(val, gpio->base + bank->tolerance_regs); 765 writel(val, treg);
766
767 if (copro)
768 aspeed_gpio_copro_release(gpio, offset);
567 spin_unlock_irqrestore(&gpio->lock, flags); 769 spin_unlock_irqrestore(&gpio->lock, flags);
568 770
569 return 0; 771 return 0;
@@ -582,13 +784,6 @@ static void aspeed_gpio_free(struct gpio_chip *chip, unsigned int offset)
582 pinctrl_gpio_free(chip->base + offset); 784 pinctrl_gpio_free(chip->base + offset);
583} 785}
584 786
585static inline void __iomem *bank_debounce_reg(struct aspeed_gpio *gpio,
586 const struct aspeed_gpio_bank *bank,
587 unsigned int reg)
588{
589 return gpio->base + bank->debounce_regs + reg;
590}
591
592static int usecs_to_cycles(struct aspeed_gpio *gpio, unsigned long usecs, 787static int usecs_to_cycles(struct aspeed_gpio *gpio, unsigned long usecs,
593 u32 *cycles) 788 u32 *cycles)
594{ 789{
@@ -666,11 +861,14 @@ static void configure_timer(struct aspeed_gpio *gpio, unsigned int offset,
666 void __iomem *addr; 861 void __iomem *addr;
667 u32 val; 862 u32 val;
668 863
669 addr = bank_debounce_reg(gpio, bank, GPIO_DEBOUNCE_SEL1); 864 /* Note: Debounce timer isn't under control of the command
865 * source registers, so no need to sync with the coprocessor
866 */
867 addr = bank_reg(gpio, bank, reg_debounce_sel1);
670 val = ioread32(addr); 868 val = ioread32(addr);
671 iowrite32((val & ~mask) | GPIO_SET_DEBOUNCE1(timer, offset), addr); 869 iowrite32((val & ~mask) | GPIO_SET_DEBOUNCE1(timer, offset), addr);
672 870
673 addr = bank_debounce_reg(gpio, bank, GPIO_DEBOUNCE_SEL2); 871 addr = bank_reg(gpio, bank, reg_debounce_sel2);
674 val = ioread32(addr); 872 val = ioread32(addr);
675 iowrite32((val & ~mask) | GPIO_SET_DEBOUNCE2(timer, offset), addr); 873 iowrite32((val & ~mask) | GPIO_SET_DEBOUNCE2(timer, offset), addr);
676} 874}
@@ -812,6 +1010,111 @@ static int aspeed_gpio_set_config(struct gpio_chip *chip, unsigned int offset,
812 return -ENOTSUPP; 1010 return -ENOTSUPP;
813} 1011}
814 1012
1013/**
1014 * aspeed_gpio_copro_set_ops - Sets the callbacks used for handhsaking with
1015 * the coprocessor for shared GPIO banks
1016 * @ops: The callbacks
1017 * @data: Pointer passed back to the callbacks
1018 */
1019int aspeed_gpio_copro_set_ops(const struct aspeed_gpio_copro_ops *ops, void *data)
1020{
1021 copro_data = data;
1022 copro_ops = ops;
1023
1024 return 0;
1025}
1026EXPORT_SYMBOL_GPL(aspeed_gpio_copro_set_ops);
1027
1028/**
1029 * aspeed_gpio_copro_grab_gpio - Mark a GPIO used by the coprocessor. The entire
1030 * bank gets marked and any access from the ARM will
1031 * result in handshaking via callbacks.
1032 * @desc: The GPIO to be marked
1033 * @vreg_offset: If non-NULL, returns the value register offset in the GPIO space
1034 * @dreg_offset: If non-NULL, returns the data latch register offset in the GPIO space
1035 * @bit: If non-NULL, returns the bit number of the GPIO in the registers
1036 */
1037int aspeed_gpio_copro_grab_gpio(struct gpio_desc *desc,
1038 u16 *vreg_offset, u16 *dreg_offset, u8 *bit)
1039{
1040 struct gpio_chip *chip = gpiod_to_chip(desc);
1041 struct aspeed_gpio *gpio = gpiochip_get_data(chip);
1042 int rc = 0, bindex, offset = gpio_chip_hwgpio(desc);
1043 const struct aspeed_gpio_bank *bank = to_bank(offset);
1044 unsigned long flags;
1045
1046 if (!gpio->cf_copro_bankmap)
1047 gpio->cf_copro_bankmap = kzalloc(gpio->config->nr_gpios >> 3, GFP_KERNEL);
1048 if (!gpio->cf_copro_bankmap)
1049 return -ENOMEM;
1050 if (offset < 0 || offset > gpio->config->nr_gpios)
1051 return -EINVAL;
1052 bindex = offset >> 3;
1053
1054 spin_lock_irqsave(&gpio->lock, flags);
1055
1056 /* Sanity check, this shouldn't happen */
1057 if (gpio->cf_copro_bankmap[bindex] == 0xff) {
1058 rc = -EIO;
1059 goto bail;
1060 }
1061 gpio->cf_copro_bankmap[bindex]++;
1062
1063 /* Switch command source */
1064 if (gpio->cf_copro_bankmap[bindex] == 1)
1065 aspeed_gpio_change_cmd_source(gpio, bank, bindex,
1066 GPIO_CMDSRC_COLDFIRE);
1067
1068 if (vreg_offset)
1069 *vreg_offset = bank->val_regs;
1070 if (dreg_offset)
1071 *dreg_offset = bank->rdata_reg;
1072 if (bit)
1073 *bit = GPIO_OFFSET(offset);
1074 bail:
1075 spin_unlock_irqrestore(&gpio->lock, flags);
1076 return rc;
1077}
1078EXPORT_SYMBOL_GPL(aspeed_gpio_copro_grab_gpio);
1079
1080/**
1081 * aspeed_gpio_copro_release_gpio - Unmark a GPIO used by the coprocessor.
1082 * @desc: The GPIO to be marked
1083 */
1084int aspeed_gpio_copro_release_gpio(struct gpio_desc *desc)
1085{
1086 struct gpio_chip *chip = gpiod_to_chip(desc);
1087 struct aspeed_gpio *gpio = gpiochip_get_data(chip);
1088 int rc = 0, bindex, offset = gpio_chip_hwgpio(desc);
1089 const struct aspeed_gpio_bank *bank = to_bank(offset);
1090 unsigned long flags;
1091
1092 if (!gpio->cf_copro_bankmap)
1093 return -ENXIO;
1094
1095 if (offset < 0 || offset > gpio->config->nr_gpios)
1096 return -EINVAL;
1097 bindex = offset >> 3;
1098
1099 spin_lock_irqsave(&gpio->lock, flags);
1100
1101 /* Sanity check, this shouldn't happen */
1102 if (gpio->cf_copro_bankmap[bindex] == 0) {
1103 rc = -EIO;
1104 goto bail;
1105 }
1106 gpio->cf_copro_bankmap[bindex]--;
1107
1108 /* Switch command source */
1109 if (gpio->cf_copro_bankmap[bindex] == 0)
1110 aspeed_gpio_change_cmd_source(gpio, bank, bindex,
1111 GPIO_CMDSRC_ARM);
1112 bail:
1113 spin_unlock_irqrestore(&gpio->lock, flags);
1114 return rc;
1115}
1116EXPORT_SYMBOL_GPL(aspeed_gpio_copro_release_gpio);
1117
815/* 1118/*
816 * Any banks not specified in a struct aspeed_bank_props array are assumed to 1119 * Any banks not specified in a struct aspeed_bank_props array are assumed to
817 * have the properties: 1120 * have the properties:
@@ -902,11 +1205,18 @@ static int __init aspeed_gpio_probe(struct platform_device *pdev)
902 if (!gpio->dcache) 1205 if (!gpio->dcache)
903 return -ENOMEM; 1206 return -ENOMEM;
904 1207
905 /* Populate it with initial values read from the HW */ 1208 /*
1209 * Populate it with initial values read from the HW and switch
1210 * all command sources to the ARM by default
1211 */
906 for (i = 0; i < banks; i++) { 1212 for (i = 0; i < banks; i++) {
907 const struct aspeed_gpio_bank *bank = &aspeed_gpio_banks[i]; 1213 const struct aspeed_gpio_bank *bank = &aspeed_gpio_banks[i];
908 gpio->dcache[i] = ioread32(gpio->base + bank->val_regs + 1214 void __iomem *addr = bank_reg(gpio, bank, reg_rdata);
909 GPIO_DATA); 1215 gpio->dcache[i] = ioread32(addr);
1216 aspeed_gpio_change_cmd_source(gpio, bank, 0, GPIO_CMDSRC_ARM);
1217 aspeed_gpio_change_cmd_source(gpio, bank, 1, GPIO_CMDSRC_ARM);
1218 aspeed_gpio_change_cmd_source(gpio, bank, 2, GPIO_CMDSRC_ARM);
1219 aspeed_gpio_change_cmd_source(gpio, bank, 3, GPIO_CMDSRC_ARM);
910 } 1220 }
911 1221
912 rc = devm_gpiochip_add_data(&pdev->dev, &gpio->chip, gpio); 1222 rc = devm_gpiochip_add_data(&pdev->dev, &gpio->chip, gpio);