Source
23
23
#define GPIO_REG_DSET 0x30
24
24
#define GPIO_REG_DCLR 0x40
25
25
#define GPIO_REG_REDGE 0x50
26
26
#define GPIO_REG_FEDGE 0x60
27
27
#define GPIO_REG_HLVL 0x70
28
28
#define GPIO_REG_LLVL 0x80
29
29
#define GPIO_REG_STAT 0x90
30
30
#define GPIO_REG_EDGE 0xA0
31
31
32
32
struct mtk_gc {
33
+
struct irq_chip irq_chip;
33
34
struct gpio_chip chip;
34
35
spinlock_t lock;
35
36
int bank;
36
37
u32 rising;
37
38
u32 falling;
38
39
u32 hlevel;
39
40
u32 llevel;
40
41
};
41
42
42
43
/**
182
183
rg->hlevel |= mask;
183
184
break;
184
185
case IRQ_TYPE_LEVEL_LOW:
185
186
rg->llevel |= mask;
186
187
break;
187
188
}
188
189
189
190
return 0;
190
191
}
191
192
192
-
static struct irq_chip mediatek_gpio_irq_chip = {
193
-
.irq_unmask = mediatek_gpio_irq_unmask,
194
-
.irq_mask = mediatek_gpio_irq_mask,
195
-
.irq_mask_ack = mediatek_gpio_irq_mask,
196
-
.irq_set_type = mediatek_gpio_irq_type,
197
-
};
198
-
199
193
static int
200
194
mediatek_gpio_xlate(struct gpio_chip *chip,
201
195
const struct of_phandle_args *spec, u32 *flags)
202
196
{
203
197
int gpio = spec->args[0];
204
198
struct mtk_gc *rg = to_mediatek_gpio(chip);
205
199
206
200
if (rg->bank != gpio / MTK_BANK_WIDTH)
207
201
return -EINVAL;
208
202
247
241
if (!rg->chip.label)
248
242
return -ENOMEM;
249
243
250
244
ret = devm_gpiochip_add_data(dev, &rg->chip, mtk);
251
245
if (ret < 0) {
252
246
dev_err(dev, "Could not register gpio %d, ret=%d\n",
253
247
rg->chip.ngpio, ret);
254
248
return ret;
255
249
}
256
250
251
+
rg->irq_chip.name = dev_name(dev);
252
+
rg->irq_chip.parent_device = dev;
253
+
rg->irq_chip.irq_unmask = mediatek_gpio_irq_unmask;
254
+
rg->irq_chip.irq_mask = mediatek_gpio_irq_mask;
255
+
rg->irq_chip.irq_mask_ack = mediatek_gpio_irq_mask;
256
+
rg->irq_chip.irq_set_type = mediatek_gpio_irq_type;
257
+
257
258
if (mtk->gpio_irq) {
258
259
/*
259
260
* Manually request the irq here instead of passing
260
261
* a flow-handler to gpiochip_set_chained_irqchip,
261
262
* because the irq is shared.
262
263
*/
263
264
ret = devm_request_irq(dev, mtk->gpio_irq,
264
265
mediatek_gpio_irq_handler, IRQF_SHARED,
265
266
rg->chip.label, &rg->chip);
266
267
267
268
if (ret) {
268
269
dev_err(dev, "Error requesting IRQ %d: %d\n",
269
270
mtk->gpio_irq, ret);
270
271
return ret;
271
272
}
272
273
273
-
ret = gpiochip_irqchip_add(&rg->chip, &mediatek_gpio_irq_chip,
274
+
ret = gpiochip_irqchip_add(&rg->chip, &rg->irq_chip,
274
275
0, handle_simple_irq, IRQ_TYPE_NONE);
275
276
if (ret) {
276
277
dev_err(dev, "failed to add gpiochip_irqchip\n");
277
278
return ret;
278
279
}
279
280
280
-
gpiochip_set_chained_irqchip(&rg->chip, &mediatek_gpio_irq_chip,
281
+
gpiochip_set_chained_irqchip(&rg->chip, &rg->irq_chip,
281
282
mtk->gpio_irq, NULL);
282
283
}
283
284
284
285
/* set polarity to low for all gpios */
285
286
mtk_gpio_w32(rg, GPIO_REG_POL, 0);
286
287
287
288
dev_info(dev, "registering %d gpios\n", rg->chip.ngpio);
288
289
289
290
return 0;
290
291
}
303
304
if (!mtk)
304
305
return -ENOMEM;
305
306
306
307
mtk->base = devm_ioremap_resource(dev, res);
307
308
if (IS_ERR(mtk->base))
308
309
return PTR_ERR(mtk->base);
309
310
310
311
mtk->gpio_irq = irq_of_parse_and_map(np, 0);
311
312
mtk->dev = dev;
312
313
platform_set_drvdata(pdev, mtk);
313
-
mediatek_gpio_irq_chip.name = dev_name(dev);
314
314
315
315
for (i = 0; i < MTK_BANK_CNT; i++) {
316
316
ret = mediatek_gpio_bank_probe(dev, np, i);
317
317
if (ret)
318
318
return ret;
319
319
}
320
320
321
321
return 0;
322
322
}
323
323