@@ -38,7 +38,7 @@ struct exynos_irq_chip {
38
38
u32 eint_con ;
39
39
u32 eint_mask ;
40
40
u32 eint_pend ;
41
- u32 eint_wake_mask_value ;
41
+ u32 * eint_wake_mask_value ;
42
42
u32 eint_wake_mask_reg ;
43
43
void (* set_eint_wakeup_mask )(struct samsung_pinctrl_drv_data * drvdata ,
44
44
struct exynos_irq_chip * irq_chip );
@@ -207,7 +207,7 @@ static void exynos_irq_release_resources(struct irq_data *irqd)
207
207
/*
208
208
* irq_chip for gpio interrupts.
209
209
*/
210
- static struct exynos_irq_chip exynos_gpio_irq_chip = {
210
+ static const struct exynos_irq_chip exynos_gpio_irq_chip __initconst = {
211
211
.chip = {
212
212
.name = "exynos_gpio_irq_chip" ,
213
213
.irq_unmask = exynos_irq_unmask ,
@@ -274,7 +274,7 @@ struct exynos_eint_gpio_save {
274
274
* exynos_eint_gpio_init() - setup handling of external gpio interrupts.
275
275
* @d: driver data of samsung pinctrl driver.
276
276
*/
277
- int exynos_eint_gpio_init (struct samsung_pinctrl_drv_data * d )
277
+ __init int exynos_eint_gpio_init (struct samsung_pinctrl_drv_data * d )
278
278
{
279
279
struct samsung_pin_bank * bank ;
280
280
struct device * dev = d -> dev ;
@@ -297,6 +297,15 @@ int exynos_eint_gpio_init(struct samsung_pinctrl_drv_data *d)
297
297
for (i = 0 ; i < d -> nr_banks ; ++ i , ++ bank ) {
298
298
if (bank -> eint_type != EINT_TYPE_GPIO )
299
299
continue ;
300
+
301
+ bank -> irq_chip = devm_kmemdup (dev , & exynos_gpio_irq_chip ,
302
+ sizeof (* bank -> irq_chip ), GFP_KERNEL );
303
+ if (!bank -> irq_chip ) {
304
+ ret = - ENOMEM ;
305
+ goto err_domains ;
306
+ }
307
+ bank -> irq_chip -> chip .name = bank -> name ;
308
+
300
309
bank -> irq_domain = irq_domain_add_linear (bank -> of_node ,
301
310
bank -> nr_pins , & exynos_eint_irqd_ops , bank );
302
311
if (!bank -> irq_domain ) {
@@ -313,7 +322,6 @@ int exynos_eint_gpio_init(struct samsung_pinctrl_drv_data *d)
313
322
goto err_domains ;
314
323
}
315
324
316
- bank -> irq_chip = & exynos_gpio_irq_chip ;
317
325
}
318
326
319
327
return 0 ;
@@ -338,9 +346,9 @@ static int exynos_wkup_irq_set_wake(struct irq_data *irqd, unsigned int on)
338
346
pr_info ("wake %s for irq %d\n" , on ? "enabled" : "disabled" , irqd -> irq );
339
347
340
348
if (!on )
341
- our_chip -> eint_wake_mask_value |= bit ;
349
+ * our_chip -> eint_wake_mask_value |= bit ;
342
350
else
343
- our_chip -> eint_wake_mask_value &= ~bit ;
351
+ * our_chip -> eint_wake_mask_value &= ~bit ;
344
352
345
353
return 0 ;
346
354
}
@@ -360,10 +368,10 @@ exynos_pinctrl_set_eint_wakeup_mask(struct samsung_pinctrl_drv_data *drvdata,
360
368
pmu_regs = drvdata -> retention_ctrl -> priv ;
361
369
dev_info (drvdata -> dev ,
362
370
"Setting external wakeup interrupt mask: 0x%x\n" ,
363
- irq_chip -> eint_wake_mask_value );
371
+ * irq_chip -> eint_wake_mask_value );
364
372
365
373
regmap_write (pmu_regs , irq_chip -> eint_wake_mask_reg ,
366
- irq_chip -> eint_wake_mask_value );
374
+ * irq_chip -> eint_wake_mask_value );
367
375
}
368
376
369
377
static void
@@ -382,10 +390,11 @@ s5pv210_pinctrl_set_eint_wakeup_mask(struct samsung_pinctrl_drv_data *drvdata,
382
390
383
391
clk_base = (void __iomem * ) drvdata -> retention_ctrl -> priv ;
384
392
385
- __raw_writel (irq_chip -> eint_wake_mask_value ,
393
+ __raw_writel (* irq_chip -> eint_wake_mask_value ,
386
394
clk_base + irq_chip -> eint_wake_mask_reg );
387
395
}
388
396
397
+ static u32 eint_wake_mask_value = EXYNOS_EINT_WAKEUP_MASK_DISABLED ;
389
398
/*
390
399
* irq_chip for wakeup interrupts
391
400
*/
@@ -403,7 +412,7 @@ static const struct exynos_irq_chip s5pv210_wkup_irq_chip __initconst = {
403
412
.eint_con = EXYNOS_WKUP_ECON_OFFSET ,
404
413
.eint_mask = EXYNOS_WKUP_EMASK_OFFSET ,
405
414
.eint_pend = EXYNOS_WKUP_EPEND_OFFSET ,
406
- .eint_wake_mask_value = EXYNOS_EINT_WAKEUP_MASK_DISABLED ,
415
+ .eint_wake_mask_value = & eint_wake_mask_value ,
407
416
/* Only differences with exynos4210_wkup_irq_chip: */
408
417
.eint_wake_mask_reg = S5PV210_EINT_WAKEUP_MASK ,
409
418
.set_eint_wakeup_mask = s5pv210_pinctrl_set_eint_wakeup_mask ,
@@ -423,7 +432,7 @@ static const struct exynos_irq_chip exynos4210_wkup_irq_chip __initconst = {
423
432
.eint_con = EXYNOS_WKUP_ECON_OFFSET ,
424
433
.eint_mask = EXYNOS_WKUP_EMASK_OFFSET ,
425
434
.eint_pend = EXYNOS_WKUP_EPEND_OFFSET ,
426
- .eint_wake_mask_value = EXYNOS_EINT_WAKEUP_MASK_DISABLED ,
435
+ .eint_wake_mask_value = & eint_wake_mask_value ,
427
436
.eint_wake_mask_reg = EXYNOS_EINT_WAKEUP_MASK ,
428
437
.set_eint_wakeup_mask = exynos_pinctrl_set_eint_wakeup_mask ,
429
438
};
@@ -442,7 +451,7 @@ static const struct exynos_irq_chip exynos7_wkup_irq_chip __initconst = {
442
451
.eint_con = EXYNOS7_WKUP_ECON_OFFSET ,
443
452
.eint_mask = EXYNOS7_WKUP_EMASK_OFFSET ,
444
453
.eint_pend = EXYNOS7_WKUP_EPEND_OFFSET ,
445
- .eint_wake_mask_value = EXYNOS_EINT_WAKEUP_MASK_DISABLED ,
454
+ .eint_wake_mask_value = & eint_wake_mask_value ,
446
455
.eint_wake_mask_reg = EXYNOS5433_EINT_WAKEUP_MASK ,
447
456
.set_eint_wakeup_mask = exynos_pinctrl_set_eint_wakeup_mask ,
448
457
};
@@ -513,15 +522,15 @@ static void exynos_irq_demux_eint16_31(struct irq_desc *desc)
513
522
* exynos_eint_wkup_init() - setup handling of external wakeup interrupts.
514
523
* @d: driver data of samsung pinctrl driver.
515
524
*/
516
- int exynos_eint_wkup_init (struct samsung_pinctrl_drv_data * d )
525
+ __init int exynos_eint_wkup_init (struct samsung_pinctrl_drv_data * d )
517
526
{
518
527
struct device * dev = d -> dev ;
519
528
struct device_node * wkup_np = NULL ;
520
529
struct device_node * np ;
521
530
struct samsung_pin_bank * bank ;
522
531
struct exynos_weint_data * weint_data ;
523
532
struct exynos_muxed_weint_data * muxed_data ;
524
- struct exynos_irq_chip * irq_chip ;
533
+ const struct exynos_irq_chip * irq_chip ;
525
534
unsigned int muxed_banks = 0 ;
526
535
unsigned int i ;
527
536
int idx , irq ;
@@ -531,12 +540,7 @@ int exynos_eint_wkup_init(struct samsung_pinctrl_drv_data *d)
531
540
532
541
match = of_match_node (exynos_wkup_irq_ids , np );
533
542
if (match ) {
534
- irq_chip = kmemdup (match -> data ,
535
- sizeof (* irq_chip ), GFP_KERNEL );
536
- if (!irq_chip ) {
537
- of_node_put (np );
538
- return - ENOMEM ;
539
- }
543
+ irq_chip = match -> data ;
540
544
wkup_np = np ;
541
545
break ;
542
546
}
@@ -549,6 +553,14 @@ int exynos_eint_wkup_init(struct samsung_pinctrl_drv_data *d)
549
553
if (bank -> eint_type != EINT_TYPE_WKUP )
550
554
continue ;
551
555
556
+ bank -> irq_chip = devm_kmemdup (dev , irq_chip , sizeof (* irq_chip ),
557
+ GFP_KERNEL );
558
+ if (!bank -> irq_chip ) {
559
+ of_node_put (wkup_np );
560
+ return - ENOMEM ;
561
+ }
562
+ bank -> irq_chip -> chip .name = bank -> name ;
563
+
552
564
bank -> irq_domain = irq_domain_add_linear (bank -> of_node ,
553
565
bank -> nr_pins , & exynos_eint_irqd_ops , bank );
554
566
if (!bank -> irq_domain ) {
@@ -557,8 +569,6 @@ int exynos_eint_wkup_init(struct samsung_pinctrl_drv_data *d)
557
569
return - ENXIO ;
558
570
}
559
571
560
- bank -> irq_chip = irq_chip ;
561
-
562
572
if (!of_find_property (bank -> of_node , "interrupts" , NULL )) {
563
573
bank -> eint_type = EINT_TYPE_WKUP_MUX ;
564
574
++ muxed_banks ;
@@ -657,10 +667,6 @@ void exynos_pinctrl_suspend(struct samsung_pinctrl_drv_data *drvdata)
657
667
irq_chip = bank -> irq_chip ;
658
668
irq_chip -> set_eint_wakeup_mask (drvdata ,
659
669
irq_chip );
660
- } else if (bank -> irq_chip != irq_chip ) {
661
- dev_warn (drvdata -> dev ,
662
- "More than one external wakeup interrupt chip configured (bank: %s). This is not supported by hardware nor by driver.\n" ,
663
- bank -> name );
664
670
}
665
671
}
666
672
}
0 commit comments