1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-or-later
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * Copyright 2019 American Megatrends International LLC.
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * Author: Karthikeyan Mani <karthikeyanm@amiindia.co.in>
6*4882a593Smuzhiyun */
7*4882a593Smuzhiyun
8*4882a593Smuzhiyun #include <linux/bitfield.h>
9*4882a593Smuzhiyun #include <linux/clk.h>
10*4882a593Smuzhiyun #include <linux/gpio/driver.h>
11*4882a593Smuzhiyun #include <linux/hashtable.h>
12*4882a593Smuzhiyun #include <linux/init.h>
13*4882a593Smuzhiyun #include <linux/io.h>
14*4882a593Smuzhiyun #include <linux/kernel.h>
15*4882a593Smuzhiyun #include <linux/module.h>
16*4882a593Smuzhiyun #include <linux/platform_device.h>
17*4882a593Smuzhiyun #include <linux/spinlock.h>
18*4882a593Smuzhiyun #include <linux/string.h>
19*4882a593Smuzhiyun
20*4882a593Smuzhiyun /*
21*4882a593Smuzhiyun * MAX_NR_HW_GPIO represents the number of actual hardware-supported GPIOs (ie,
22*4882a593Smuzhiyun * slots within the clocked serial GPIO data). Since each HW GPIO is both an
23*4882a593Smuzhiyun * input and an output, we provide MAX_NR_HW_GPIO * 2 lines on our gpiochip
24*4882a593Smuzhiyun * device.
25*4882a593Smuzhiyun *
26*4882a593Smuzhiyun * We use SGPIO_OUTPUT_OFFSET to define the split between the inputs and
27*4882a593Smuzhiyun * outputs; the inputs start at line 0, the outputs start at OUTPUT_OFFSET.
28*4882a593Smuzhiyun */
29*4882a593Smuzhiyun #define MAX_NR_HW_SGPIO 80
30*4882a593Smuzhiyun #define SGPIO_OUTPUT_OFFSET MAX_NR_HW_SGPIO
31*4882a593Smuzhiyun
32*4882a593Smuzhiyun #define ASPEED_SGPIO_CTRL 0x54
33*4882a593Smuzhiyun
34*4882a593Smuzhiyun #define ASPEED_SGPIO_PINS_MASK GENMASK(9, 6)
35*4882a593Smuzhiyun #define ASPEED_SGPIO_CLK_DIV_MASK GENMASK(31, 16)
36*4882a593Smuzhiyun #define ASPEED_SGPIO_ENABLE BIT(0)
37*4882a593Smuzhiyun
38*4882a593Smuzhiyun struct aspeed_sgpio {
39*4882a593Smuzhiyun struct gpio_chip chip;
40*4882a593Smuzhiyun struct clk *pclk;
41*4882a593Smuzhiyun spinlock_t lock;
42*4882a593Smuzhiyun void __iomem *base;
43*4882a593Smuzhiyun int irq;
44*4882a593Smuzhiyun int n_sgpio;
45*4882a593Smuzhiyun };
46*4882a593Smuzhiyun
47*4882a593Smuzhiyun struct aspeed_sgpio_bank {
48*4882a593Smuzhiyun uint16_t val_regs;
49*4882a593Smuzhiyun uint16_t rdata_reg;
50*4882a593Smuzhiyun uint16_t irq_regs;
51*4882a593Smuzhiyun const char names[4][3];
52*4882a593Smuzhiyun };
53*4882a593Smuzhiyun
54*4882a593Smuzhiyun /*
55*4882a593Smuzhiyun * Note: The "value" register returns the input value when the GPIO is
56*4882a593Smuzhiyun * configured as an input.
57*4882a593Smuzhiyun *
58*4882a593Smuzhiyun * The "rdata" register returns the output value when the GPIO is
59*4882a593Smuzhiyun * configured as an output.
60*4882a593Smuzhiyun */
61*4882a593Smuzhiyun static const struct aspeed_sgpio_bank aspeed_sgpio_banks[] = {
62*4882a593Smuzhiyun {
63*4882a593Smuzhiyun .val_regs = 0x0000,
64*4882a593Smuzhiyun .rdata_reg = 0x0070,
65*4882a593Smuzhiyun .irq_regs = 0x0004,
66*4882a593Smuzhiyun .names = { "A", "B", "C", "D" },
67*4882a593Smuzhiyun },
68*4882a593Smuzhiyun {
69*4882a593Smuzhiyun .val_regs = 0x001C,
70*4882a593Smuzhiyun .rdata_reg = 0x0074,
71*4882a593Smuzhiyun .irq_regs = 0x0020,
72*4882a593Smuzhiyun .names = { "E", "F", "G", "H" },
73*4882a593Smuzhiyun },
74*4882a593Smuzhiyun {
75*4882a593Smuzhiyun .val_regs = 0x0038,
76*4882a593Smuzhiyun .rdata_reg = 0x0078,
77*4882a593Smuzhiyun .irq_regs = 0x003C,
78*4882a593Smuzhiyun .names = { "I", "J" },
79*4882a593Smuzhiyun },
80*4882a593Smuzhiyun };
81*4882a593Smuzhiyun
82*4882a593Smuzhiyun enum aspeed_sgpio_reg {
83*4882a593Smuzhiyun reg_val,
84*4882a593Smuzhiyun reg_rdata,
85*4882a593Smuzhiyun reg_irq_enable,
86*4882a593Smuzhiyun reg_irq_type0,
87*4882a593Smuzhiyun reg_irq_type1,
88*4882a593Smuzhiyun reg_irq_type2,
89*4882a593Smuzhiyun reg_irq_status,
90*4882a593Smuzhiyun };
91*4882a593Smuzhiyun
92*4882a593Smuzhiyun #define GPIO_VAL_VALUE 0x00
93*4882a593Smuzhiyun #define GPIO_IRQ_ENABLE 0x00
94*4882a593Smuzhiyun #define GPIO_IRQ_TYPE0 0x04
95*4882a593Smuzhiyun #define GPIO_IRQ_TYPE1 0x08
96*4882a593Smuzhiyun #define GPIO_IRQ_TYPE2 0x0C
97*4882a593Smuzhiyun #define GPIO_IRQ_STATUS 0x10
98*4882a593Smuzhiyun
bank_reg(struct aspeed_sgpio * gpio,const struct aspeed_sgpio_bank * bank,const enum aspeed_sgpio_reg reg)99*4882a593Smuzhiyun static void __iomem *bank_reg(struct aspeed_sgpio *gpio,
100*4882a593Smuzhiyun const struct aspeed_sgpio_bank *bank,
101*4882a593Smuzhiyun const enum aspeed_sgpio_reg reg)
102*4882a593Smuzhiyun {
103*4882a593Smuzhiyun switch (reg) {
104*4882a593Smuzhiyun case reg_val:
105*4882a593Smuzhiyun return gpio->base + bank->val_regs + GPIO_VAL_VALUE;
106*4882a593Smuzhiyun case reg_rdata:
107*4882a593Smuzhiyun return gpio->base + bank->rdata_reg;
108*4882a593Smuzhiyun case reg_irq_enable:
109*4882a593Smuzhiyun return gpio->base + bank->irq_regs + GPIO_IRQ_ENABLE;
110*4882a593Smuzhiyun case reg_irq_type0:
111*4882a593Smuzhiyun return gpio->base + bank->irq_regs + GPIO_IRQ_TYPE0;
112*4882a593Smuzhiyun case reg_irq_type1:
113*4882a593Smuzhiyun return gpio->base + bank->irq_regs + GPIO_IRQ_TYPE1;
114*4882a593Smuzhiyun case reg_irq_type2:
115*4882a593Smuzhiyun return gpio->base + bank->irq_regs + GPIO_IRQ_TYPE2;
116*4882a593Smuzhiyun case reg_irq_status:
117*4882a593Smuzhiyun return gpio->base + bank->irq_regs + GPIO_IRQ_STATUS;
118*4882a593Smuzhiyun default:
119*4882a593Smuzhiyun /* acturally if code runs to here, it's an error case */
120*4882a593Smuzhiyun BUG();
121*4882a593Smuzhiyun }
122*4882a593Smuzhiyun }
123*4882a593Smuzhiyun
124*4882a593Smuzhiyun #define GPIO_BANK(x) ((x % SGPIO_OUTPUT_OFFSET) >> 5)
125*4882a593Smuzhiyun #define GPIO_OFFSET(x) ((x % SGPIO_OUTPUT_OFFSET) & 0x1f)
126*4882a593Smuzhiyun #define GPIO_BIT(x) BIT(GPIO_OFFSET(x))
127*4882a593Smuzhiyun
to_bank(unsigned int offset)128*4882a593Smuzhiyun static const struct aspeed_sgpio_bank *to_bank(unsigned int offset)
129*4882a593Smuzhiyun {
130*4882a593Smuzhiyun unsigned int bank;
131*4882a593Smuzhiyun
132*4882a593Smuzhiyun bank = GPIO_BANK(offset);
133*4882a593Smuzhiyun
134*4882a593Smuzhiyun WARN_ON(bank >= ARRAY_SIZE(aspeed_sgpio_banks));
135*4882a593Smuzhiyun return &aspeed_sgpio_banks[bank];
136*4882a593Smuzhiyun }
137*4882a593Smuzhiyun
aspeed_sgpio_init_valid_mask(struct gpio_chip * gc,unsigned long * valid_mask,unsigned int ngpios)138*4882a593Smuzhiyun static int aspeed_sgpio_init_valid_mask(struct gpio_chip *gc,
139*4882a593Smuzhiyun unsigned long *valid_mask, unsigned int ngpios)
140*4882a593Smuzhiyun {
141*4882a593Smuzhiyun struct aspeed_sgpio *sgpio = gpiochip_get_data(gc);
142*4882a593Smuzhiyun int n = sgpio->n_sgpio;
143*4882a593Smuzhiyun int c = SGPIO_OUTPUT_OFFSET - n;
144*4882a593Smuzhiyun
145*4882a593Smuzhiyun WARN_ON(ngpios < MAX_NR_HW_SGPIO * 2);
146*4882a593Smuzhiyun
147*4882a593Smuzhiyun /* input GPIOs in the lower range */
148*4882a593Smuzhiyun bitmap_set(valid_mask, 0, n);
149*4882a593Smuzhiyun bitmap_clear(valid_mask, n, c);
150*4882a593Smuzhiyun
151*4882a593Smuzhiyun /* output GPIOS above SGPIO_OUTPUT_OFFSET */
152*4882a593Smuzhiyun bitmap_set(valid_mask, SGPIO_OUTPUT_OFFSET, n);
153*4882a593Smuzhiyun bitmap_clear(valid_mask, SGPIO_OUTPUT_OFFSET + n, c);
154*4882a593Smuzhiyun
155*4882a593Smuzhiyun return 0;
156*4882a593Smuzhiyun }
157*4882a593Smuzhiyun
aspeed_sgpio_irq_init_valid_mask(struct gpio_chip * gc,unsigned long * valid_mask,unsigned int ngpios)158*4882a593Smuzhiyun static void aspeed_sgpio_irq_init_valid_mask(struct gpio_chip *gc,
159*4882a593Smuzhiyun unsigned long *valid_mask, unsigned int ngpios)
160*4882a593Smuzhiyun {
161*4882a593Smuzhiyun struct aspeed_sgpio *sgpio = gpiochip_get_data(gc);
162*4882a593Smuzhiyun int n = sgpio->n_sgpio;
163*4882a593Smuzhiyun
164*4882a593Smuzhiyun WARN_ON(ngpios < MAX_NR_HW_SGPIO * 2);
165*4882a593Smuzhiyun
166*4882a593Smuzhiyun /* input GPIOs in the lower range */
167*4882a593Smuzhiyun bitmap_set(valid_mask, 0, n);
168*4882a593Smuzhiyun bitmap_clear(valid_mask, n, ngpios - n);
169*4882a593Smuzhiyun }
170*4882a593Smuzhiyun
aspeed_sgpio_is_input(unsigned int offset)171*4882a593Smuzhiyun static bool aspeed_sgpio_is_input(unsigned int offset)
172*4882a593Smuzhiyun {
173*4882a593Smuzhiyun return offset < SGPIO_OUTPUT_OFFSET;
174*4882a593Smuzhiyun }
175*4882a593Smuzhiyun
aspeed_sgpio_get(struct gpio_chip * gc,unsigned int offset)176*4882a593Smuzhiyun static int aspeed_sgpio_get(struct gpio_chip *gc, unsigned int offset)
177*4882a593Smuzhiyun {
178*4882a593Smuzhiyun struct aspeed_sgpio *gpio = gpiochip_get_data(gc);
179*4882a593Smuzhiyun const struct aspeed_sgpio_bank *bank = to_bank(offset);
180*4882a593Smuzhiyun unsigned long flags;
181*4882a593Smuzhiyun enum aspeed_sgpio_reg reg;
182*4882a593Smuzhiyun int rc = 0;
183*4882a593Smuzhiyun
184*4882a593Smuzhiyun spin_lock_irqsave(&gpio->lock, flags);
185*4882a593Smuzhiyun
186*4882a593Smuzhiyun reg = aspeed_sgpio_is_input(offset) ? reg_val : reg_rdata;
187*4882a593Smuzhiyun rc = !!(ioread32(bank_reg(gpio, bank, reg)) & GPIO_BIT(offset));
188*4882a593Smuzhiyun
189*4882a593Smuzhiyun spin_unlock_irqrestore(&gpio->lock, flags);
190*4882a593Smuzhiyun
191*4882a593Smuzhiyun return rc;
192*4882a593Smuzhiyun }
193*4882a593Smuzhiyun
sgpio_set_value(struct gpio_chip * gc,unsigned int offset,int val)194*4882a593Smuzhiyun static int sgpio_set_value(struct gpio_chip *gc, unsigned int offset, int val)
195*4882a593Smuzhiyun {
196*4882a593Smuzhiyun struct aspeed_sgpio *gpio = gpiochip_get_data(gc);
197*4882a593Smuzhiyun const struct aspeed_sgpio_bank *bank = to_bank(offset);
198*4882a593Smuzhiyun void __iomem *addr_r, *addr_w;
199*4882a593Smuzhiyun u32 reg = 0;
200*4882a593Smuzhiyun
201*4882a593Smuzhiyun if (aspeed_sgpio_is_input(offset))
202*4882a593Smuzhiyun return -EINVAL;
203*4882a593Smuzhiyun
204*4882a593Smuzhiyun /* Since this is an output, read the cached value from rdata, then
205*4882a593Smuzhiyun * update val. */
206*4882a593Smuzhiyun addr_r = bank_reg(gpio, bank, reg_rdata);
207*4882a593Smuzhiyun addr_w = bank_reg(gpio, bank, reg_val);
208*4882a593Smuzhiyun
209*4882a593Smuzhiyun reg = ioread32(addr_r);
210*4882a593Smuzhiyun
211*4882a593Smuzhiyun if (val)
212*4882a593Smuzhiyun reg |= GPIO_BIT(offset);
213*4882a593Smuzhiyun else
214*4882a593Smuzhiyun reg &= ~GPIO_BIT(offset);
215*4882a593Smuzhiyun
216*4882a593Smuzhiyun iowrite32(reg, addr_w);
217*4882a593Smuzhiyun
218*4882a593Smuzhiyun return 0;
219*4882a593Smuzhiyun }
220*4882a593Smuzhiyun
aspeed_sgpio_set(struct gpio_chip * gc,unsigned int offset,int val)221*4882a593Smuzhiyun static void aspeed_sgpio_set(struct gpio_chip *gc, unsigned int offset, int val)
222*4882a593Smuzhiyun {
223*4882a593Smuzhiyun struct aspeed_sgpio *gpio = gpiochip_get_data(gc);
224*4882a593Smuzhiyun unsigned long flags;
225*4882a593Smuzhiyun
226*4882a593Smuzhiyun spin_lock_irqsave(&gpio->lock, flags);
227*4882a593Smuzhiyun
228*4882a593Smuzhiyun sgpio_set_value(gc, offset, val);
229*4882a593Smuzhiyun
230*4882a593Smuzhiyun spin_unlock_irqrestore(&gpio->lock, flags);
231*4882a593Smuzhiyun }
232*4882a593Smuzhiyun
aspeed_sgpio_dir_in(struct gpio_chip * gc,unsigned int offset)233*4882a593Smuzhiyun static int aspeed_sgpio_dir_in(struct gpio_chip *gc, unsigned int offset)
234*4882a593Smuzhiyun {
235*4882a593Smuzhiyun return aspeed_sgpio_is_input(offset) ? 0 : -EINVAL;
236*4882a593Smuzhiyun }
237*4882a593Smuzhiyun
aspeed_sgpio_dir_out(struct gpio_chip * gc,unsigned int offset,int val)238*4882a593Smuzhiyun static int aspeed_sgpio_dir_out(struct gpio_chip *gc, unsigned int offset, int val)
239*4882a593Smuzhiyun {
240*4882a593Smuzhiyun struct aspeed_sgpio *gpio = gpiochip_get_data(gc);
241*4882a593Smuzhiyun unsigned long flags;
242*4882a593Smuzhiyun int rc;
243*4882a593Smuzhiyun
244*4882a593Smuzhiyun /* No special action is required for setting the direction; we'll
245*4882a593Smuzhiyun * error-out in sgpio_set_value if this isn't an output GPIO */
246*4882a593Smuzhiyun
247*4882a593Smuzhiyun spin_lock_irqsave(&gpio->lock, flags);
248*4882a593Smuzhiyun rc = sgpio_set_value(gc, offset, val);
249*4882a593Smuzhiyun spin_unlock_irqrestore(&gpio->lock, flags);
250*4882a593Smuzhiyun
251*4882a593Smuzhiyun return rc;
252*4882a593Smuzhiyun }
253*4882a593Smuzhiyun
aspeed_sgpio_get_direction(struct gpio_chip * gc,unsigned int offset)254*4882a593Smuzhiyun static int aspeed_sgpio_get_direction(struct gpio_chip *gc, unsigned int offset)
255*4882a593Smuzhiyun {
256*4882a593Smuzhiyun return !!aspeed_sgpio_is_input(offset);
257*4882a593Smuzhiyun }
258*4882a593Smuzhiyun
irqd_to_aspeed_sgpio_data(struct irq_data * d,struct aspeed_sgpio ** gpio,const struct aspeed_sgpio_bank ** bank,u32 * bit,int * offset)259*4882a593Smuzhiyun static void irqd_to_aspeed_sgpio_data(struct irq_data *d,
260*4882a593Smuzhiyun struct aspeed_sgpio **gpio,
261*4882a593Smuzhiyun const struct aspeed_sgpio_bank **bank,
262*4882a593Smuzhiyun u32 *bit, int *offset)
263*4882a593Smuzhiyun {
264*4882a593Smuzhiyun struct aspeed_sgpio *internal;
265*4882a593Smuzhiyun
266*4882a593Smuzhiyun *offset = irqd_to_hwirq(d);
267*4882a593Smuzhiyun internal = irq_data_get_irq_chip_data(d);
268*4882a593Smuzhiyun WARN_ON(!internal);
269*4882a593Smuzhiyun
270*4882a593Smuzhiyun *gpio = internal;
271*4882a593Smuzhiyun *bank = to_bank(*offset);
272*4882a593Smuzhiyun *bit = GPIO_BIT(*offset);
273*4882a593Smuzhiyun }
274*4882a593Smuzhiyun
aspeed_sgpio_irq_ack(struct irq_data * d)275*4882a593Smuzhiyun static void aspeed_sgpio_irq_ack(struct irq_data *d)
276*4882a593Smuzhiyun {
277*4882a593Smuzhiyun const struct aspeed_sgpio_bank *bank;
278*4882a593Smuzhiyun struct aspeed_sgpio *gpio;
279*4882a593Smuzhiyun unsigned long flags;
280*4882a593Smuzhiyun void __iomem *status_addr;
281*4882a593Smuzhiyun int offset;
282*4882a593Smuzhiyun u32 bit;
283*4882a593Smuzhiyun
284*4882a593Smuzhiyun irqd_to_aspeed_sgpio_data(d, &gpio, &bank, &bit, &offset);
285*4882a593Smuzhiyun
286*4882a593Smuzhiyun status_addr = bank_reg(gpio, bank, reg_irq_status);
287*4882a593Smuzhiyun
288*4882a593Smuzhiyun spin_lock_irqsave(&gpio->lock, flags);
289*4882a593Smuzhiyun
290*4882a593Smuzhiyun iowrite32(bit, status_addr);
291*4882a593Smuzhiyun
292*4882a593Smuzhiyun spin_unlock_irqrestore(&gpio->lock, flags);
293*4882a593Smuzhiyun }
294*4882a593Smuzhiyun
aspeed_sgpio_irq_set_mask(struct irq_data * d,bool set)295*4882a593Smuzhiyun static void aspeed_sgpio_irq_set_mask(struct irq_data *d, bool set)
296*4882a593Smuzhiyun {
297*4882a593Smuzhiyun const struct aspeed_sgpio_bank *bank;
298*4882a593Smuzhiyun struct aspeed_sgpio *gpio;
299*4882a593Smuzhiyun unsigned long flags;
300*4882a593Smuzhiyun u32 reg, bit;
301*4882a593Smuzhiyun void __iomem *addr;
302*4882a593Smuzhiyun int offset;
303*4882a593Smuzhiyun
304*4882a593Smuzhiyun irqd_to_aspeed_sgpio_data(d, &gpio, &bank, &bit, &offset);
305*4882a593Smuzhiyun addr = bank_reg(gpio, bank, reg_irq_enable);
306*4882a593Smuzhiyun
307*4882a593Smuzhiyun spin_lock_irqsave(&gpio->lock, flags);
308*4882a593Smuzhiyun
309*4882a593Smuzhiyun reg = ioread32(addr);
310*4882a593Smuzhiyun if (set)
311*4882a593Smuzhiyun reg |= bit;
312*4882a593Smuzhiyun else
313*4882a593Smuzhiyun reg &= ~bit;
314*4882a593Smuzhiyun
315*4882a593Smuzhiyun iowrite32(reg, addr);
316*4882a593Smuzhiyun
317*4882a593Smuzhiyun spin_unlock_irqrestore(&gpio->lock, flags);
318*4882a593Smuzhiyun }
319*4882a593Smuzhiyun
aspeed_sgpio_irq_mask(struct irq_data * d)320*4882a593Smuzhiyun static void aspeed_sgpio_irq_mask(struct irq_data *d)
321*4882a593Smuzhiyun {
322*4882a593Smuzhiyun aspeed_sgpio_irq_set_mask(d, false);
323*4882a593Smuzhiyun }
324*4882a593Smuzhiyun
aspeed_sgpio_irq_unmask(struct irq_data * d)325*4882a593Smuzhiyun static void aspeed_sgpio_irq_unmask(struct irq_data *d)
326*4882a593Smuzhiyun {
327*4882a593Smuzhiyun aspeed_sgpio_irq_set_mask(d, true);
328*4882a593Smuzhiyun }
329*4882a593Smuzhiyun
aspeed_sgpio_set_type(struct irq_data * d,unsigned int type)330*4882a593Smuzhiyun static int aspeed_sgpio_set_type(struct irq_data *d, unsigned int type)
331*4882a593Smuzhiyun {
332*4882a593Smuzhiyun u32 type0 = 0;
333*4882a593Smuzhiyun u32 type1 = 0;
334*4882a593Smuzhiyun u32 type2 = 0;
335*4882a593Smuzhiyun u32 bit, reg;
336*4882a593Smuzhiyun const struct aspeed_sgpio_bank *bank;
337*4882a593Smuzhiyun irq_flow_handler_t handler;
338*4882a593Smuzhiyun struct aspeed_sgpio *gpio;
339*4882a593Smuzhiyun unsigned long flags;
340*4882a593Smuzhiyun void __iomem *addr;
341*4882a593Smuzhiyun int offset;
342*4882a593Smuzhiyun
343*4882a593Smuzhiyun irqd_to_aspeed_sgpio_data(d, &gpio, &bank, &bit, &offset);
344*4882a593Smuzhiyun
345*4882a593Smuzhiyun switch (type & IRQ_TYPE_SENSE_MASK) {
346*4882a593Smuzhiyun case IRQ_TYPE_EDGE_BOTH:
347*4882a593Smuzhiyun type2 |= bit;
348*4882a593Smuzhiyun fallthrough;
349*4882a593Smuzhiyun case IRQ_TYPE_EDGE_RISING:
350*4882a593Smuzhiyun type0 |= bit;
351*4882a593Smuzhiyun fallthrough;
352*4882a593Smuzhiyun case IRQ_TYPE_EDGE_FALLING:
353*4882a593Smuzhiyun handler = handle_edge_irq;
354*4882a593Smuzhiyun break;
355*4882a593Smuzhiyun case IRQ_TYPE_LEVEL_HIGH:
356*4882a593Smuzhiyun type0 |= bit;
357*4882a593Smuzhiyun fallthrough;
358*4882a593Smuzhiyun case IRQ_TYPE_LEVEL_LOW:
359*4882a593Smuzhiyun type1 |= bit;
360*4882a593Smuzhiyun handler = handle_level_irq;
361*4882a593Smuzhiyun break;
362*4882a593Smuzhiyun default:
363*4882a593Smuzhiyun return -EINVAL;
364*4882a593Smuzhiyun }
365*4882a593Smuzhiyun
366*4882a593Smuzhiyun spin_lock_irqsave(&gpio->lock, flags);
367*4882a593Smuzhiyun
368*4882a593Smuzhiyun addr = bank_reg(gpio, bank, reg_irq_type0);
369*4882a593Smuzhiyun reg = ioread32(addr);
370*4882a593Smuzhiyun reg = (reg & ~bit) | type0;
371*4882a593Smuzhiyun iowrite32(reg, addr);
372*4882a593Smuzhiyun
373*4882a593Smuzhiyun addr = bank_reg(gpio, bank, reg_irq_type1);
374*4882a593Smuzhiyun reg = ioread32(addr);
375*4882a593Smuzhiyun reg = (reg & ~bit) | type1;
376*4882a593Smuzhiyun iowrite32(reg, addr);
377*4882a593Smuzhiyun
378*4882a593Smuzhiyun addr = bank_reg(gpio, bank, reg_irq_type2);
379*4882a593Smuzhiyun reg = ioread32(addr);
380*4882a593Smuzhiyun reg = (reg & ~bit) | type2;
381*4882a593Smuzhiyun iowrite32(reg, addr);
382*4882a593Smuzhiyun
383*4882a593Smuzhiyun spin_unlock_irqrestore(&gpio->lock, flags);
384*4882a593Smuzhiyun
385*4882a593Smuzhiyun irq_set_handler_locked(d, handler);
386*4882a593Smuzhiyun
387*4882a593Smuzhiyun return 0;
388*4882a593Smuzhiyun }
389*4882a593Smuzhiyun
aspeed_sgpio_irq_handler(struct irq_desc * desc)390*4882a593Smuzhiyun static void aspeed_sgpio_irq_handler(struct irq_desc *desc)
391*4882a593Smuzhiyun {
392*4882a593Smuzhiyun struct gpio_chip *gc = irq_desc_get_handler_data(desc);
393*4882a593Smuzhiyun struct irq_chip *ic = irq_desc_get_chip(desc);
394*4882a593Smuzhiyun struct aspeed_sgpio *data = gpiochip_get_data(gc);
395*4882a593Smuzhiyun unsigned int i, p, girq;
396*4882a593Smuzhiyun unsigned long reg;
397*4882a593Smuzhiyun
398*4882a593Smuzhiyun chained_irq_enter(ic, desc);
399*4882a593Smuzhiyun
400*4882a593Smuzhiyun for (i = 0; i < ARRAY_SIZE(aspeed_sgpio_banks); i++) {
401*4882a593Smuzhiyun const struct aspeed_sgpio_bank *bank = &aspeed_sgpio_banks[i];
402*4882a593Smuzhiyun
403*4882a593Smuzhiyun reg = ioread32(bank_reg(data, bank, reg_irq_status));
404*4882a593Smuzhiyun
405*4882a593Smuzhiyun for_each_set_bit(p, ®, 32) {
406*4882a593Smuzhiyun girq = irq_find_mapping(gc->irq.domain, i * 32 + p);
407*4882a593Smuzhiyun generic_handle_irq(girq);
408*4882a593Smuzhiyun }
409*4882a593Smuzhiyun
410*4882a593Smuzhiyun }
411*4882a593Smuzhiyun
412*4882a593Smuzhiyun chained_irq_exit(ic, desc);
413*4882a593Smuzhiyun }
414*4882a593Smuzhiyun
415*4882a593Smuzhiyun static struct irq_chip aspeed_sgpio_irqchip = {
416*4882a593Smuzhiyun .name = "aspeed-sgpio",
417*4882a593Smuzhiyun .irq_ack = aspeed_sgpio_irq_ack,
418*4882a593Smuzhiyun .irq_mask = aspeed_sgpio_irq_mask,
419*4882a593Smuzhiyun .irq_unmask = aspeed_sgpio_irq_unmask,
420*4882a593Smuzhiyun .irq_set_type = aspeed_sgpio_set_type,
421*4882a593Smuzhiyun };
422*4882a593Smuzhiyun
aspeed_sgpio_setup_irqs(struct aspeed_sgpio * gpio,struct platform_device * pdev)423*4882a593Smuzhiyun static int aspeed_sgpio_setup_irqs(struct aspeed_sgpio *gpio,
424*4882a593Smuzhiyun struct platform_device *pdev)
425*4882a593Smuzhiyun {
426*4882a593Smuzhiyun int rc, i;
427*4882a593Smuzhiyun const struct aspeed_sgpio_bank *bank;
428*4882a593Smuzhiyun struct gpio_irq_chip *irq;
429*4882a593Smuzhiyun
430*4882a593Smuzhiyun rc = platform_get_irq(pdev, 0);
431*4882a593Smuzhiyun if (rc < 0)
432*4882a593Smuzhiyun return rc;
433*4882a593Smuzhiyun
434*4882a593Smuzhiyun gpio->irq = rc;
435*4882a593Smuzhiyun
436*4882a593Smuzhiyun /* Disable IRQ and clear Interrupt status registers for all SGPIO Pins. */
437*4882a593Smuzhiyun for (i = 0; i < ARRAY_SIZE(aspeed_sgpio_banks); i++) {
438*4882a593Smuzhiyun bank = &aspeed_sgpio_banks[i];
439*4882a593Smuzhiyun /* disable irq enable bits */
440*4882a593Smuzhiyun iowrite32(0x00000000, bank_reg(gpio, bank, reg_irq_enable));
441*4882a593Smuzhiyun /* clear status bits */
442*4882a593Smuzhiyun iowrite32(0xffffffff, bank_reg(gpio, bank, reg_irq_status));
443*4882a593Smuzhiyun }
444*4882a593Smuzhiyun
445*4882a593Smuzhiyun irq = &gpio->chip.irq;
446*4882a593Smuzhiyun irq->chip = &aspeed_sgpio_irqchip;
447*4882a593Smuzhiyun irq->init_valid_mask = aspeed_sgpio_irq_init_valid_mask;
448*4882a593Smuzhiyun irq->handler = handle_bad_irq;
449*4882a593Smuzhiyun irq->default_type = IRQ_TYPE_NONE;
450*4882a593Smuzhiyun irq->parent_handler = aspeed_sgpio_irq_handler;
451*4882a593Smuzhiyun irq->parent_handler_data = gpio;
452*4882a593Smuzhiyun irq->parents = &gpio->irq;
453*4882a593Smuzhiyun irq->num_parents = 1;
454*4882a593Smuzhiyun
455*4882a593Smuzhiyun /* Apply default IRQ settings */
456*4882a593Smuzhiyun for (i = 0; i < ARRAY_SIZE(aspeed_sgpio_banks); i++) {
457*4882a593Smuzhiyun bank = &aspeed_sgpio_banks[i];
458*4882a593Smuzhiyun /* set falling or level-low irq */
459*4882a593Smuzhiyun iowrite32(0x00000000, bank_reg(gpio, bank, reg_irq_type0));
460*4882a593Smuzhiyun /* trigger type is edge */
461*4882a593Smuzhiyun iowrite32(0x00000000, bank_reg(gpio, bank, reg_irq_type1));
462*4882a593Smuzhiyun /* single edge trigger */
463*4882a593Smuzhiyun iowrite32(0x00000000, bank_reg(gpio, bank, reg_irq_type2));
464*4882a593Smuzhiyun }
465*4882a593Smuzhiyun
466*4882a593Smuzhiyun return 0;
467*4882a593Smuzhiyun }
468*4882a593Smuzhiyun
469*4882a593Smuzhiyun static const struct of_device_id aspeed_sgpio_of_table[] = {
470*4882a593Smuzhiyun { .compatible = "aspeed,ast2400-sgpio" },
471*4882a593Smuzhiyun { .compatible = "aspeed,ast2500-sgpio" },
472*4882a593Smuzhiyun {}
473*4882a593Smuzhiyun };
474*4882a593Smuzhiyun
475*4882a593Smuzhiyun MODULE_DEVICE_TABLE(of, aspeed_sgpio_of_table);
476*4882a593Smuzhiyun
aspeed_sgpio_probe(struct platform_device * pdev)477*4882a593Smuzhiyun static int __init aspeed_sgpio_probe(struct platform_device *pdev)
478*4882a593Smuzhiyun {
479*4882a593Smuzhiyun struct aspeed_sgpio *gpio;
480*4882a593Smuzhiyun u32 nr_gpios, sgpio_freq, sgpio_clk_div;
481*4882a593Smuzhiyun int rc;
482*4882a593Smuzhiyun unsigned long apb_freq;
483*4882a593Smuzhiyun
484*4882a593Smuzhiyun gpio = devm_kzalloc(&pdev->dev, sizeof(*gpio), GFP_KERNEL);
485*4882a593Smuzhiyun if (!gpio)
486*4882a593Smuzhiyun return -ENOMEM;
487*4882a593Smuzhiyun
488*4882a593Smuzhiyun gpio->base = devm_platform_ioremap_resource(pdev, 0);
489*4882a593Smuzhiyun if (IS_ERR(gpio->base))
490*4882a593Smuzhiyun return PTR_ERR(gpio->base);
491*4882a593Smuzhiyun
492*4882a593Smuzhiyun rc = of_property_read_u32(pdev->dev.of_node, "ngpios", &nr_gpios);
493*4882a593Smuzhiyun if (rc < 0) {
494*4882a593Smuzhiyun dev_err(&pdev->dev, "Could not read ngpios property\n");
495*4882a593Smuzhiyun return -EINVAL;
496*4882a593Smuzhiyun } else if (nr_gpios > MAX_NR_HW_SGPIO) {
497*4882a593Smuzhiyun dev_err(&pdev->dev, "Number of GPIOs exceeds the maximum of %d: %d\n",
498*4882a593Smuzhiyun MAX_NR_HW_SGPIO, nr_gpios);
499*4882a593Smuzhiyun return -EINVAL;
500*4882a593Smuzhiyun }
501*4882a593Smuzhiyun gpio->n_sgpio = nr_gpios;
502*4882a593Smuzhiyun
503*4882a593Smuzhiyun rc = of_property_read_u32(pdev->dev.of_node, "bus-frequency", &sgpio_freq);
504*4882a593Smuzhiyun if (rc < 0) {
505*4882a593Smuzhiyun dev_err(&pdev->dev, "Could not read bus-frequency property\n");
506*4882a593Smuzhiyun return -EINVAL;
507*4882a593Smuzhiyun }
508*4882a593Smuzhiyun
509*4882a593Smuzhiyun gpio->pclk = devm_clk_get(&pdev->dev, NULL);
510*4882a593Smuzhiyun if (IS_ERR(gpio->pclk)) {
511*4882a593Smuzhiyun dev_err(&pdev->dev, "devm_clk_get failed\n");
512*4882a593Smuzhiyun return PTR_ERR(gpio->pclk);
513*4882a593Smuzhiyun }
514*4882a593Smuzhiyun
515*4882a593Smuzhiyun apb_freq = clk_get_rate(gpio->pclk);
516*4882a593Smuzhiyun
517*4882a593Smuzhiyun /*
518*4882a593Smuzhiyun * From the datasheet,
519*4882a593Smuzhiyun * SGPIO period = 1/PCLK * 2 * (GPIO254[31:16] + 1)
520*4882a593Smuzhiyun * period = 2 * (GPIO254[31:16] + 1) / PCLK
521*4882a593Smuzhiyun * frequency = 1 / (2 * (GPIO254[31:16] + 1) / PCLK)
522*4882a593Smuzhiyun * frequency = PCLK / (2 * (GPIO254[31:16] + 1))
523*4882a593Smuzhiyun * frequency * 2 * (GPIO254[31:16] + 1) = PCLK
524*4882a593Smuzhiyun * GPIO254[31:16] = PCLK / (frequency * 2) - 1
525*4882a593Smuzhiyun */
526*4882a593Smuzhiyun if (sgpio_freq == 0)
527*4882a593Smuzhiyun return -EINVAL;
528*4882a593Smuzhiyun
529*4882a593Smuzhiyun sgpio_clk_div = (apb_freq / (sgpio_freq * 2)) - 1;
530*4882a593Smuzhiyun
531*4882a593Smuzhiyun if (sgpio_clk_div > (1 << 16) - 1)
532*4882a593Smuzhiyun return -EINVAL;
533*4882a593Smuzhiyun
534*4882a593Smuzhiyun iowrite32(FIELD_PREP(ASPEED_SGPIO_CLK_DIV_MASK, sgpio_clk_div) |
535*4882a593Smuzhiyun FIELD_PREP(ASPEED_SGPIO_PINS_MASK, (nr_gpios / 8)) |
536*4882a593Smuzhiyun ASPEED_SGPIO_ENABLE,
537*4882a593Smuzhiyun gpio->base + ASPEED_SGPIO_CTRL);
538*4882a593Smuzhiyun
539*4882a593Smuzhiyun spin_lock_init(&gpio->lock);
540*4882a593Smuzhiyun
541*4882a593Smuzhiyun gpio->chip.parent = &pdev->dev;
542*4882a593Smuzhiyun gpio->chip.ngpio = MAX_NR_HW_SGPIO * 2;
543*4882a593Smuzhiyun gpio->chip.init_valid_mask = aspeed_sgpio_init_valid_mask;
544*4882a593Smuzhiyun gpio->chip.direction_input = aspeed_sgpio_dir_in;
545*4882a593Smuzhiyun gpio->chip.direction_output = aspeed_sgpio_dir_out;
546*4882a593Smuzhiyun gpio->chip.get_direction = aspeed_sgpio_get_direction;
547*4882a593Smuzhiyun gpio->chip.request = NULL;
548*4882a593Smuzhiyun gpio->chip.free = NULL;
549*4882a593Smuzhiyun gpio->chip.get = aspeed_sgpio_get;
550*4882a593Smuzhiyun gpio->chip.set = aspeed_sgpio_set;
551*4882a593Smuzhiyun gpio->chip.set_config = NULL;
552*4882a593Smuzhiyun gpio->chip.label = dev_name(&pdev->dev);
553*4882a593Smuzhiyun gpio->chip.base = -1;
554*4882a593Smuzhiyun
555*4882a593Smuzhiyun aspeed_sgpio_setup_irqs(gpio, pdev);
556*4882a593Smuzhiyun
557*4882a593Smuzhiyun rc = devm_gpiochip_add_data(&pdev->dev, &gpio->chip, gpio);
558*4882a593Smuzhiyun if (rc < 0)
559*4882a593Smuzhiyun return rc;
560*4882a593Smuzhiyun
561*4882a593Smuzhiyun return 0;
562*4882a593Smuzhiyun }
563*4882a593Smuzhiyun
564*4882a593Smuzhiyun static struct platform_driver aspeed_sgpio_driver = {
565*4882a593Smuzhiyun .driver = {
566*4882a593Smuzhiyun .name = KBUILD_MODNAME,
567*4882a593Smuzhiyun .of_match_table = aspeed_sgpio_of_table,
568*4882a593Smuzhiyun },
569*4882a593Smuzhiyun };
570*4882a593Smuzhiyun
571*4882a593Smuzhiyun module_platform_driver_probe(aspeed_sgpio_driver, aspeed_sgpio_probe);
572*4882a593Smuzhiyun MODULE_DESCRIPTION("Aspeed Serial GPIO Driver");
573*4882a593Smuzhiyun MODULE_LICENSE("GPL");
574