xref: /openbmc/linux/drivers/irqchip/irq-imgpdc.c (revision 8b235f2f)
1 /*
2  * IMG PowerDown Controller (PDC)
3  *
4  * Copyright 2010-2013 Imagination Technologies Ltd.
5  *
6  * Exposes the syswake and PDC peripheral wake interrupts to the system.
7  *
8  */
9 
10 #include <linux/bitops.h>
11 #include <linux/interrupt.h>
12 #include <linux/irqdomain.h>
13 #include <linux/io.h>
14 #include <linux/kernel.h>
15 #include <linux/of.h>
16 #include <linux/platform_device.h>
17 #include <linux/spinlock.h>
18 
19 /* PDC interrupt register numbers */
20 
21 #define PDC_IRQ_STATUS			0x310
22 #define PDC_IRQ_ENABLE			0x314
23 #define PDC_IRQ_CLEAR			0x318
24 #define PDC_IRQ_ROUTE			0x31c
25 #define PDC_SYS_WAKE_BASE		0x330
26 #define PDC_SYS_WAKE_STRIDE		0x8
27 #define PDC_SYS_WAKE_CONFIG_BASE	0x334
28 #define PDC_SYS_WAKE_CONFIG_STRIDE	0x8
29 
30 /* PDC interrupt register field masks */
31 
32 #define PDC_IRQ_SYS3			0x08
33 #define PDC_IRQ_SYS2			0x04
34 #define PDC_IRQ_SYS1			0x02
35 #define PDC_IRQ_SYS0			0x01
36 #define PDC_IRQ_ROUTE_WU_EN_SYS3	0x08000000
37 #define PDC_IRQ_ROUTE_WU_EN_SYS2	0x04000000
38 #define PDC_IRQ_ROUTE_WU_EN_SYS1	0x02000000
39 #define PDC_IRQ_ROUTE_WU_EN_SYS0	0x01000000
40 #define PDC_IRQ_ROUTE_WU_EN_WD		0x00040000
41 #define PDC_IRQ_ROUTE_WU_EN_IR		0x00020000
42 #define PDC_IRQ_ROUTE_WU_EN_RTC		0x00010000
43 #define PDC_IRQ_ROUTE_EXT_EN_SYS3	0x00000800
44 #define PDC_IRQ_ROUTE_EXT_EN_SYS2	0x00000400
45 #define PDC_IRQ_ROUTE_EXT_EN_SYS1	0x00000200
46 #define PDC_IRQ_ROUTE_EXT_EN_SYS0	0x00000100
47 #define PDC_IRQ_ROUTE_EXT_EN_WD		0x00000004
48 #define PDC_IRQ_ROUTE_EXT_EN_IR		0x00000002
49 #define PDC_IRQ_ROUTE_EXT_EN_RTC	0x00000001
50 #define PDC_SYS_WAKE_RESET		0x00000010
51 #define PDC_SYS_WAKE_INT_MODE		0x0000000e
52 #define PDC_SYS_WAKE_INT_MODE_SHIFT	1
53 #define PDC_SYS_WAKE_PIN_VAL		0x00000001
54 
55 /* PDC interrupt constants */
56 
57 #define PDC_SYS_WAKE_INT_LOW		0x0
58 #define PDC_SYS_WAKE_INT_HIGH		0x1
59 #define PDC_SYS_WAKE_INT_DOWN		0x2
60 #define PDC_SYS_WAKE_INT_UP		0x3
61 #define PDC_SYS_WAKE_INT_CHANGE		0x6
62 #define PDC_SYS_WAKE_INT_NONE		0x4
63 
64 /**
65  * struct pdc_intc_priv - private pdc interrupt data.
66  * @nr_perips:		Number of peripheral interrupt signals.
67  * @nr_syswakes:	Number of syswake signals.
68  * @perip_irqs:		List of peripheral IRQ numbers handled.
69  * @syswake_irq:	Shared PDC syswake IRQ number.
70  * @domain:		IRQ domain for PDC peripheral and syswake IRQs.
71  * @pdc_base:		Base of PDC registers.
72  * @irq_route:		Cached version of PDC_IRQ_ROUTE register.
73  * @lock:		Lock to protect the PDC syswake registers and the cached
74  *			values of those registers in this struct.
75  */
76 struct pdc_intc_priv {
77 	unsigned int		nr_perips;
78 	unsigned int		nr_syswakes;
79 	unsigned int		*perip_irqs;
80 	unsigned int		syswake_irq;
81 	struct irq_domain	*domain;
82 	void __iomem		*pdc_base;
83 
84 	u32			irq_route;
85 	raw_spinlock_t		lock;
86 };
87 
88 static void pdc_write(struct pdc_intc_priv *priv, unsigned int reg_offs,
89 		      unsigned int data)
90 {
91 	iowrite32(data, priv->pdc_base + reg_offs);
92 }
93 
94 static unsigned int pdc_read(struct pdc_intc_priv *priv,
95 			     unsigned int reg_offs)
96 {
97 	return ioread32(priv->pdc_base + reg_offs);
98 }
99 
100 /* Generic IRQ callbacks */
101 
102 #define SYS0_HWIRQ	8
103 
104 static unsigned int hwirq_is_syswake(irq_hw_number_t hw)
105 {
106 	return hw >= SYS0_HWIRQ;
107 }
108 
109 static unsigned int hwirq_to_syswake(irq_hw_number_t hw)
110 {
111 	return hw - SYS0_HWIRQ;
112 }
113 
114 static irq_hw_number_t syswake_to_hwirq(unsigned int syswake)
115 {
116 	return SYS0_HWIRQ + syswake;
117 }
118 
119 static struct pdc_intc_priv *irqd_to_priv(struct irq_data *data)
120 {
121 	return (struct pdc_intc_priv *)data->domain->host_data;
122 }
123 
124 /*
125  * perip_irq_mask() and perip_irq_unmask() use IRQ_ROUTE which also contains
126  * wake bits, therefore we cannot use the generic irqchip mask callbacks as they
127  * cache the mask.
128  */
129 
130 static void perip_irq_mask(struct irq_data *data)
131 {
132 	struct pdc_intc_priv *priv = irqd_to_priv(data);
133 
134 	raw_spin_lock(&priv->lock);
135 	priv->irq_route &= ~data->mask;
136 	pdc_write(priv, PDC_IRQ_ROUTE, priv->irq_route);
137 	raw_spin_unlock(&priv->lock);
138 }
139 
140 static void perip_irq_unmask(struct irq_data *data)
141 {
142 	struct pdc_intc_priv *priv = irqd_to_priv(data);
143 
144 	raw_spin_lock(&priv->lock);
145 	priv->irq_route |= data->mask;
146 	pdc_write(priv, PDC_IRQ_ROUTE, priv->irq_route);
147 	raw_spin_unlock(&priv->lock);
148 }
149 
150 static int syswake_irq_set_type(struct irq_data *data, unsigned int flow_type)
151 {
152 	struct pdc_intc_priv *priv = irqd_to_priv(data);
153 	unsigned int syswake = hwirq_to_syswake(data->hwirq);
154 	unsigned int irq_mode;
155 	unsigned int soc_sys_wake_regoff, soc_sys_wake;
156 
157 	/* translate to syswake IRQ mode */
158 	switch (flow_type) {
159 	case IRQ_TYPE_EDGE_BOTH:
160 		irq_mode = PDC_SYS_WAKE_INT_CHANGE;
161 		break;
162 	case IRQ_TYPE_EDGE_RISING:
163 		irq_mode = PDC_SYS_WAKE_INT_UP;
164 		break;
165 	case IRQ_TYPE_EDGE_FALLING:
166 		irq_mode = PDC_SYS_WAKE_INT_DOWN;
167 		break;
168 	case IRQ_TYPE_LEVEL_HIGH:
169 		irq_mode = PDC_SYS_WAKE_INT_HIGH;
170 		break;
171 	case IRQ_TYPE_LEVEL_LOW:
172 		irq_mode = PDC_SYS_WAKE_INT_LOW;
173 		break;
174 	default:
175 		return -EINVAL;
176 	}
177 
178 	raw_spin_lock(&priv->lock);
179 
180 	/* set the IRQ mode */
181 	soc_sys_wake_regoff = PDC_SYS_WAKE_BASE + syswake*PDC_SYS_WAKE_STRIDE;
182 	soc_sys_wake = pdc_read(priv, soc_sys_wake_regoff);
183 	soc_sys_wake &= ~PDC_SYS_WAKE_INT_MODE;
184 	soc_sys_wake |= irq_mode << PDC_SYS_WAKE_INT_MODE_SHIFT;
185 	pdc_write(priv, soc_sys_wake_regoff, soc_sys_wake);
186 
187 	/* and update the handler */
188 	irq_setup_alt_chip(data, flow_type);
189 
190 	raw_spin_unlock(&priv->lock);
191 
192 	return 0;
193 }
194 
195 /* applies to both peripheral and syswake interrupts */
196 static int pdc_irq_set_wake(struct irq_data *data, unsigned int on)
197 {
198 	struct pdc_intc_priv *priv = irqd_to_priv(data);
199 	irq_hw_number_t hw = data->hwirq;
200 	unsigned int mask = (1 << 16) << hw;
201 	unsigned int dst_irq;
202 
203 	raw_spin_lock(&priv->lock);
204 	if (on)
205 		priv->irq_route |= mask;
206 	else
207 		priv->irq_route &= ~mask;
208 	pdc_write(priv, PDC_IRQ_ROUTE, priv->irq_route);
209 	raw_spin_unlock(&priv->lock);
210 
211 	/* control the destination IRQ wakeup too for standby mode */
212 	if (hwirq_is_syswake(hw))
213 		dst_irq = priv->syswake_irq;
214 	else
215 		dst_irq = priv->perip_irqs[hw];
216 	irq_set_irq_wake(dst_irq, on);
217 
218 	return 0;
219 }
220 
221 static void pdc_intc_perip_isr(unsigned int __irq, struct irq_desc *desc)
222 {
223 	unsigned int irq = irq_desc_get_irq(desc);
224 	struct pdc_intc_priv *priv;
225 	unsigned int i, irq_no;
226 
227 	priv = (struct pdc_intc_priv *)irq_desc_get_handler_data(desc);
228 
229 	/* find the peripheral number */
230 	for (i = 0; i < priv->nr_perips; ++i)
231 		if (irq == priv->perip_irqs[i])
232 			goto found;
233 
234 	/* should never get here */
235 	return;
236 found:
237 
238 	/* pass on the interrupt */
239 	irq_no = irq_linear_revmap(priv->domain, i);
240 	generic_handle_irq(irq_no);
241 }
242 
243 static void pdc_intc_syswake_isr(unsigned int irq, struct irq_desc *desc)
244 {
245 	struct pdc_intc_priv *priv;
246 	unsigned int syswake, irq_no;
247 	unsigned int status;
248 
249 	priv = (struct pdc_intc_priv *)irq_desc_get_handler_data(desc);
250 
251 	status = pdc_read(priv, PDC_IRQ_STATUS) &
252 		 pdc_read(priv, PDC_IRQ_ENABLE);
253 	status &= (1 << priv->nr_syswakes) - 1;
254 
255 	for (syswake = 0; status; status >>= 1, ++syswake) {
256 		/* Has this sys_wake triggered? */
257 		if (!(status & 1))
258 			continue;
259 
260 		irq_no = irq_linear_revmap(priv->domain,
261 					   syswake_to_hwirq(syswake));
262 		generic_handle_irq(irq_no);
263 	}
264 }
265 
266 static void pdc_intc_setup(struct pdc_intc_priv *priv)
267 {
268 	int i;
269 	unsigned int soc_sys_wake_regoff;
270 	unsigned int soc_sys_wake;
271 
272 	/*
273 	 * Mask all syswake interrupts before routing, or we could receive an
274 	 * interrupt before we're ready to handle it.
275 	 */
276 	pdc_write(priv, PDC_IRQ_ENABLE, 0);
277 
278 	/*
279 	 * Enable routing of all syswakes
280 	 * Disable all wake sources
281 	 */
282 	priv->irq_route = ((PDC_IRQ_ROUTE_EXT_EN_SYS0 << priv->nr_syswakes) -
283 				PDC_IRQ_ROUTE_EXT_EN_SYS0);
284 	pdc_write(priv, PDC_IRQ_ROUTE, priv->irq_route);
285 
286 	/* Initialise syswake IRQ */
287 	for (i = 0; i < priv->nr_syswakes; ++i) {
288 		/* set the IRQ mode to none */
289 		soc_sys_wake_regoff = PDC_SYS_WAKE_BASE + i*PDC_SYS_WAKE_STRIDE;
290 		soc_sys_wake = PDC_SYS_WAKE_INT_NONE
291 				<< PDC_SYS_WAKE_INT_MODE_SHIFT;
292 		pdc_write(priv, soc_sys_wake_regoff, soc_sys_wake);
293 	}
294 }
295 
296 static int pdc_intc_probe(struct platform_device *pdev)
297 {
298 	struct pdc_intc_priv *priv;
299 	struct device_node *node = pdev->dev.of_node;
300 	struct resource *res_regs;
301 	struct irq_chip_generic *gc;
302 	unsigned int i;
303 	int irq, ret;
304 	u32 val;
305 
306 	if (!node)
307 		return -ENOENT;
308 
309 	/* Get registers */
310 	res_regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
311 	if (res_regs == NULL) {
312 		dev_err(&pdev->dev, "cannot find registers resource\n");
313 		return -ENOENT;
314 	}
315 
316 	/* Allocate driver data */
317 	priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
318 	if (!priv) {
319 		dev_err(&pdev->dev, "cannot allocate device data\n");
320 		return -ENOMEM;
321 	}
322 	raw_spin_lock_init(&priv->lock);
323 	platform_set_drvdata(pdev, priv);
324 
325 	/* Ioremap the registers */
326 	priv->pdc_base = devm_ioremap(&pdev->dev, res_regs->start,
327 				      res_regs->end - res_regs->start);
328 	if (!priv->pdc_base)
329 		return -EIO;
330 
331 	/* Get number of peripherals */
332 	ret = of_property_read_u32(node, "num-perips", &val);
333 	if (ret) {
334 		dev_err(&pdev->dev, "No num-perips node property found\n");
335 		return -EINVAL;
336 	}
337 	if (val > SYS0_HWIRQ) {
338 		dev_err(&pdev->dev, "num-perips (%u) out of range\n", val);
339 		return -EINVAL;
340 	}
341 	priv->nr_perips = val;
342 
343 	/* Get number of syswakes */
344 	ret = of_property_read_u32(node, "num-syswakes", &val);
345 	if (ret) {
346 		dev_err(&pdev->dev, "No num-syswakes node property found\n");
347 		return -EINVAL;
348 	}
349 	if (val > SYS0_HWIRQ) {
350 		dev_err(&pdev->dev, "num-syswakes (%u) out of range\n", val);
351 		return -EINVAL;
352 	}
353 	priv->nr_syswakes = val;
354 
355 	/* Get peripheral IRQ numbers */
356 	priv->perip_irqs = devm_kzalloc(&pdev->dev, 4 * priv->nr_perips,
357 					GFP_KERNEL);
358 	if (!priv->perip_irqs) {
359 		dev_err(&pdev->dev, "cannot allocate perip IRQ list\n");
360 		return -ENOMEM;
361 	}
362 	for (i = 0; i < priv->nr_perips; ++i) {
363 		irq = platform_get_irq(pdev, 1 + i);
364 		if (irq < 0) {
365 			dev_err(&pdev->dev, "cannot find perip IRQ #%u\n", i);
366 			return irq;
367 		}
368 		priv->perip_irqs[i] = irq;
369 	}
370 	/* check if too many were provided */
371 	if (platform_get_irq(pdev, 1 + i) >= 0) {
372 		dev_err(&pdev->dev, "surplus perip IRQs detected\n");
373 		return -EINVAL;
374 	}
375 
376 	/* Get syswake IRQ number */
377 	irq = platform_get_irq(pdev, 0);
378 	if (irq < 0) {
379 		dev_err(&pdev->dev, "cannot find syswake IRQ\n");
380 		return irq;
381 	}
382 	priv->syswake_irq = irq;
383 
384 	/* Set up an IRQ domain */
385 	priv->domain = irq_domain_add_linear(node, 16, &irq_generic_chip_ops,
386 					     priv);
387 	if (unlikely(!priv->domain)) {
388 		dev_err(&pdev->dev, "cannot add IRQ domain\n");
389 		return -ENOMEM;
390 	}
391 
392 	/*
393 	 * Set up 2 generic irq chips with 2 chip types.
394 	 * The first one for peripheral irqs (only 1 chip type used)
395 	 * The second one for syswake irqs (edge and level chip types)
396 	 */
397 	ret = irq_alloc_domain_generic_chips(priv->domain, 8, 2, "pdc",
398 					     handle_level_irq, 0, 0,
399 					     IRQ_GC_INIT_NESTED_LOCK);
400 	if (ret)
401 		goto err_generic;
402 
403 	/* peripheral interrupt chip */
404 
405 	gc = irq_get_domain_generic_chip(priv->domain, 0);
406 	gc->unused	= ~(BIT(priv->nr_perips) - 1);
407 	gc->reg_base	= priv->pdc_base;
408 	/*
409 	 * IRQ_ROUTE contains wake bits, so we can't use the generic versions as
410 	 * they cache the mask
411 	 */
412 	gc->chip_types[0].regs.mask		= PDC_IRQ_ROUTE;
413 	gc->chip_types[0].chip.irq_mask		= perip_irq_mask;
414 	gc->chip_types[0].chip.irq_unmask	= perip_irq_unmask;
415 	gc->chip_types[0].chip.irq_set_wake	= pdc_irq_set_wake;
416 
417 	/* syswake interrupt chip */
418 
419 	gc = irq_get_domain_generic_chip(priv->domain, 8);
420 	gc->unused	= ~(BIT(priv->nr_syswakes) - 1);
421 	gc->reg_base	= priv->pdc_base;
422 
423 	/* edge interrupts */
424 	gc->chip_types[0].type			= IRQ_TYPE_EDGE_BOTH;
425 	gc->chip_types[0].handler		= handle_edge_irq;
426 	gc->chip_types[0].regs.ack		= PDC_IRQ_CLEAR;
427 	gc->chip_types[0].regs.mask		= PDC_IRQ_ENABLE;
428 	gc->chip_types[0].chip.irq_ack		= irq_gc_ack_set_bit;
429 	gc->chip_types[0].chip.irq_mask		= irq_gc_mask_clr_bit;
430 	gc->chip_types[0].chip.irq_unmask	= irq_gc_mask_set_bit;
431 	gc->chip_types[0].chip.irq_set_type	= syswake_irq_set_type;
432 	gc->chip_types[0].chip.irq_set_wake	= pdc_irq_set_wake;
433 	/* for standby we pass on to the shared syswake IRQ */
434 	gc->chip_types[0].chip.flags		= IRQCHIP_MASK_ON_SUSPEND;
435 
436 	/* level interrupts */
437 	gc->chip_types[1].type			= IRQ_TYPE_LEVEL_MASK;
438 	gc->chip_types[1].handler		= handle_level_irq;
439 	gc->chip_types[1].regs.ack		= PDC_IRQ_CLEAR;
440 	gc->chip_types[1].regs.mask		= PDC_IRQ_ENABLE;
441 	gc->chip_types[1].chip.irq_ack		= irq_gc_ack_set_bit;
442 	gc->chip_types[1].chip.irq_mask		= irq_gc_mask_clr_bit;
443 	gc->chip_types[1].chip.irq_unmask	= irq_gc_mask_set_bit;
444 	gc->chip_types[1].chip.irq_set_type	= syswake_irq_set_type;
445 	gc->chip_types[1].chip.irq_set_wake	= pdc_irq_set_wake;
446 	/* for standby we pass on to the shared syswake IRQ */
447 	gc->chip_types[1].chip.flags		= IRQCHIP_MASK_ON_SUSPEND;
448 
449 	/* Set up the hardware to enable interrupt routing */
450 	pdc_intc_setup(priv);
451 
452 	/* Setup chained handlers for the peripheral IRQs */
453 	for (i = 0; i < priv->nr_perips; ++i) {
454 		irq = priv->perip_irqs[i];
455 		irq_set_chained_handler_and_data(irq, pdc_intc_perip_isr,
456 						 priv);
457 	}
458 
459 	/* Setup chained handler for the syswake IRQ */
460 	irq_set_chained_handler_and_data(priv->syswake_irq,
461 					 pdc_intc_syswake_isr, priv);
462 
463 	dev_info(&pdev->dev,
464 		 "PDC IRQ controller initialised (%u perip IRQs, %u syswake IRQs)\n",
465 		 priv->nr_perips,
466 		 priv->nr_syswakes);
467 
468 	return 0;
469 err_generic:
470 	irq_domain_remove(priv->domain);
471 	return ret;
472 }
473 
474 static int pdc_intc_remove(struct platform_device *pdev)
475 {
476 	struct pdc_intc_priv *priv = platform_get_drvdata(pdev);
477 
478 	irq_domain_remove(priv->domain);
479 	return 0;
480 }
481 
482 static const struct of_device_id pdc_intc_match[] = {
483 	{ .compatible = "img,pdc-intc" },
484 	{}
485 };
486 
487 static struct platform_driver pdc_intc_driver = {
488 	.driver = {
489 		.name		= "pdc-intc",
490 		.of_match_table	= pdc_intc_match,
491 	},
492 	.probe = pdc_intc_probe,
493 	.remove = pdc_intc_remove,
494 };
495 
496 static int __init pdc_intc_init(void)
497 {
498 	return platform_driver_register(&pdc_intc_driver);
499 }
500 core_initcall(pdc_intc_init);
501