1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (C) 2018 Spreadtrum Communications Inc.
4 * Copyright (C) 2018 Linaro Ltd.
7 #include <linux/bitops.h>
8 #include <linux/gpio/driver.h>
9 #include <linux/kernel.h>
10 #include <linux/module.h>
11 #include <linux/of_device.h>
12 #include <linux/platform_device.h>
13 #include <linux/spinlock.h>
15 /* GPIO registers definition */
16 #define SPRD_GPIO_DATA 0x0
17 #define SPRD_GPIO_DMSK 0x4
18 #define SPRD_GPIO_DIR 0x8
19 #define SPRD_GPIO_IS 0xc
20 #define SPRD_GPIO_IBE 0x10
21 #define SPRD_GPIO_IEV 0x14
22 #define SPRD_GPIO_IE 0x18
23 #define SPRD_GPIO_RIS 0x1c
24 #define SPRD_GPIO_MIS 0x20
25 #define SPRD_GPIO_IC 0x24
26 #define SPRD_GPIO_INEN 0x28
28 /* We have 16 banks GPIOs and each bank contain 16 GPIOs */
29 #define SPRD_GPIO_BANK_NR 16
30 #define SPRD_GPIO_NR 256
31 #define SPRD_GPIO_BANK_SIZE 0x80
32 #define SPRD_GPIO_BANK_MASK GENMASK(15, 0)
33 #define SPRD_GPIO_BIT(x) ((x) & (SPRD_GPIO_BANK_NR - 1))
36 struct gpio_chip chip
;
42 static inline void __iomem
*sprd_gpio_bank_base(struct sprd_gpio
*sprd_gpio
,
45 return sprd_gpio
->base
+ SPRD_GPIO_BANK_SIZE
* bank
;
48 static void sprd_gpio_update(struct gpio_chip
*chip
, unsigned int offset
,
51 struct sprd_gpio
*sprd_gpio
= gpiochip_get_data(chip
);
52 void __iomem
*base
= sprd_gpio_bank_base(sprd_gpio
,
53 offset
/ SPRD_GPIO_BANK_NR
);
57 spin_lock_irqsave(&sprd_gpio
->lock
, flags
);
58 tmp
= readl_relaxed(base
+ reg
);
61 tmp
|= BIT(SPRD_GPIO_BIT(offset
));
63 tmp
&= ~BIT(SPRD_GPIO_BIT(offset
));
65 writel_relaxed(tmp
, base
+ reg
);
66 spin_unlock_irqrestore(&sprd_gpio
->lock
, flags
);
69 static int sprd_gpio_read(struct gpio_chip
*chip
, unsigned int offset
, u16 reg
)
71 struct sprd_gpio
*sprd_gpio
= gpiochip_get_data(chip
);
72 void __iomem
*base
= sprd_gpio_bank_base(sprd_gpio
,
73 offset
/ SPRD_GPIO_BANK_NR
);
75 return !!(readl_relaxed(base
+ reg
) & BIT(SPRD_GPIO_BIT(offset
)));
78 static int sprd_gpio_request(struct gpio_chip
*chip
, unsigned int offset
)
80 sprd_gpio_update(chip
, offset
, SPRD_GPIO_DMSK
, 1);
84 static void sprd_gpio_free(struct gpio_chip
*chip
, unsigned int offset
)
86 sprd_gpio_update(chip
, offset
, SPRD_GPIO_DMSK
, 0);
89 static int sprd_gpio_direction_input(struct gpio_chip
*chip
,
92 sprd_gpio_update(chip
, offset
, SPRD_GPIO_DIR
, 0);
93 sprd_gpio_update(chip
, offset
, SPRD_GPIO_INEN
, 1);
97 static int sprd_gpio_direction_output(struct gpio_chip
*chip
,
98 unsigned int offset
, int value
)
100 sprd_gpio_update(chip
, offset
, SPRD_GPIO_DIR
, 1);
101 sprd_gpio_update(chip
, offset
, SPRD_GPIO_INEN
, 0);
102 sprd_gpio_update(chip
, offset
, SPRD_GPIO_DATA
, value
);
106 static int sprd_gpio_get(struct gpio_chip
*chip
, unsigned int offset
)
108 return sprd_gpio_read(chip
, offset
, SPRD_GPIO_DATA
);
111 static void sprd_gpio_set(struct gpio_chip
*chip
, unsigned int offset
,
114 sprd_gpio_update(chip
, offset
, SPRD_GPIO_DATA
, value
);
117 static void sprd_gpio_irq_mask(struct irq_data
*data
)
119 struct gpio_chip
*chip
= irq_data_get_irq_chip_data(data
);
120 u32 offset
= irqd_to_hwirq(data
);
122 sprd_gpio_update(chip
, offset
, SPRD_GPIO_IE
, 0);
125 static void sprd_gpio_irq_ack(struct irq_data
*data
)
127 struct gpio_chip
*chip
= irq_data_get_irq_chip_data(data
);
128 u32 offset
= irqd_to_hwirq(data
);
130 sprd_gpio_update(chip
, offset
, SPRD_GPIO_IC
, 1);
133 static void sprd_gpio_irq_unmask(struct irq_data
*data
)
135 struct gpio_chip
*chip
= irq_data_get_irq_chip_data(data
);
136 u32 offset
= irqd_to_hwirq(data
);
138 sprd_gpio_update(chip
, offset
, SPRD_GPIO_IE
, 1);
141 static int sprd_gpio_irq_set_type(struct irq_data
*data
,
142 unsigned int flow_type
)
144 struct gpio_chip
*chip
= irq_data_get_irq_chip_data(data
);
145 u32 offset
= irqd_to_hwirq(data
);
148 case IRQ_TYPE_EDGE_RISING
:
149 sprd_gpio_update(chip
, offset
, SPRD_GPIO_IS
, 0);
150 sprd_gpio_update(chip
, offset
, SPRD_GPIO_IBE
, 0);
151 sprd_gpio_update(chip
, offset
, SPRD_GPIO_IEV
, 1);
152 irq_set_handler_locked(data
, handle_edge_irq
);
154 case IRQ_TYPE_EDGE_FALLING
:
155 sprd_gpio_update(chip
, offset
, SPRD_GPIO_IS
, 0);
156 sprd_gpio_update(chip
, offset
, SPRD_GPIO_IBE
, 0);
157 sprd_gpio_update(chip
, offset
, SPRD_GPIO_IEV
, 0);
158 irq_set_handler_locked(data
, handle_edge_irq
);
160 case IRQ_TYPE_EDGE_BOTH
:
161 sprd_gpio_update(chip
, offset
, SPRD_GPIO_IS
, 0);
162 sprd_gpio_update(chip
, offset
, SPRD_GPIO_IBE
, 1);
163 irq_set_handler_locked(data
, handle_edge_irq
);
165 case IRQ_TYPE_LEVEL_HIGH
:
166 sprd_gpio_update(chip
, offset
, SPRD_GPIO_IS
, 1);
167 sprd_gpio_update(chip
, offset
, SPRD_GPIO_IBE
, 0);
168 sprd_gpio_update(chip
, offset
, SPRD_GPIO_IEV
, 1);
169 irq_set_handler_locked(data
, handle_level_irq
);
171 case IRQ_TYPE_LEVEL_LOW
:
172 sprd_gpio_update(chip
, offset
, SPRD_GPIO_IS
, 1);
173 sprd_gpio_update(chip
, offset
, SPRD_GPIO_IBE
, 0);
174 sprd_gpio_update(chip
, offset
, SPRD_GPIO_IEV
, 0);
175 irq_set_handler_locked(data
, handle_level_irq
);
184 static void sprd_gpio_irq_handler(struct irq_desc
*desc
)
186 struct gpio_chip
*chip
= irq_desc_get_handler_data(desc
);
187 struct irq_chip
*ic
= irq_desc_get_chip(desc
);
188 struct sprd_gpio
*sprd_gpio
= gpiochip_get_data(chip
);
191 chained_irq_enter(ic
, desc
);
193 for (bank
= 0; bank
* SPRD_GPIO_BANK_NR
< chip
->ngpio
; bank
++) {
194 void __iomem
*base
= sprd_gpio_bank_base(sprd_gpio
, bank
);
195 unsigned long reg
= readl_relaxed(base
+ SPRD_GPIO_MIS
) &
198 for_each_set_bit(n
, ®
, SPRD_GPIO_BANK_NR
) {
199 girq
= irq_find_mapping(chip
->irq
.domain
,
200 bank
* SPRD_GPIO_BANK_NR
+ n
);
202 generic_handle_irq(girq
);
206 chained_irq_exit(ic
, desc
);
209 static struct irq_chip sprd_gpio_irqchip
= {
211 .irq_ack
= sprd_gpio_irq_ack
,
212 .irq_mask
= sprd_gpio_irq_mask
,
213 .irq_unmask
= sprd_gpio_irq_unmask
,
214 .irq_set_type
= sprd_gpio_irq_set_type
,
215 .flags
= IRQCHIP_SKIP_SET_WAKE
,
218 static int sprd_gpio_probe(struct platform_device
*pdev
)
220 struct gpio_irq_chip
*irq
;
221 struct sprd_gpio
*sprd_gpio
;
224 sprd_gpio
= devm_kzalloc(&pdev
->dev
, sizeof(*sprd_gpio
), GFP_KERNEL
);
228 sprd_gpio
->irq
= platform_get_irq(pdev
, 0);
229 if (sprd_gpio
->irq
< 0)
230 return sprd_gpio
->irq
;
232 sprd_gpio
->base
= devm_platform_ioremap_resource(pdev
, 0);
233 if (IS_ERR(sprd_gpio
->base
))
234 return PTR_ERR(sprd_gpio
->base
);
236 spin_lock_init(&sprd_gpio
->lock
);
238 sprd_gpio
->chip
.label
= dev_name(&pdev
->dev
);
239 sprd_gpio
->chip
.ngpio
= SPRD_GPIO_NR
;
240 sprd_gpio
->chip
.base
= -1;
241 sprd_gpio
->chip
.parent
= &pdev
->dev
;
242 sprd_gpio
->chip
.of_node
= pdev
->dev
.of_node
;
243 sprd_gpio
->chip
.request
= sprd_gpio_request
;
244 sprd_gpio
->chip
.free
= sprd_gpio_free
;
245 sprd_gpio
->chip
.get
= sprd_gpio_get
;
246 sprd_gpio
->chip
.set
= sprd_gpio_set
;
247 sprd_gpio
->chip
.direction_input
= sprd_gpio_direction_input
;
248 sprd_gpio
->chip
.direction_output
= sprd_gpio_direction_output
;
250 irq
= &sprd_gpio
->chip
.irq
;
251 irq
->chip
= &sprd_gpio_irqchip
;
252 irq
->handler
= handle_bad_irq
;
253 irq
->default_type
= IRQ_TYPE_NONE
;
254 irq
->parent_handler
= sprd_gpio_irq_handler
;
255 irq
->parent_handler_data
= sprd_gpio
;
256 irq
->num_parents
= 1;
257 irq
->parents
= &sprd_gpio
->irq
;
259 ret
= devm_gpiochip_add_data(&pdev
->dev
, &sprd_gpio
->chip
, sprd_gpio
);
261 dev_err(&pdev
->dev
, "Could not register gpiochip %d\n", ret
);
265 platform_set_drvdata(pdev
, sprd_gpio
);
269 static const struct of_device_id sprd_gpio_of_match
[] = {
270 { .compatible
= "sprd,sc9860-gpio", },
271 { /* end of list */ }
273 MODULE_DEVICE_TABLE(of
, sprd_gpio_of_match
);
275 static struct platform_driver sprd_gpio_driver
= {
276 .probe
= sprd_gpio_probe
,
279 .of_match_table
= sprd_gpio_of_match
,
283 module_platform_driver_probe(sprd_gpio_driver
, sprd_gpio_probe
);
285 MODULE_DESCRIPTION("Spreadtrum GPIO driver");
286 MODULE_LICENSE("GPL v2");