hc
2023-12-11 d2ccde1c8e90d38cee87a1b0309ad2827f3fd30d
kernel/drivers/pinctrl/samsung/pinctrl-exynos.c
....@@ -38,7 +38,7 @@
3838 u32 eint_con;
3939 u32 eint_mask;
4040 u32 eint_pend;
41
- u32 eint_wake_mask_value;
41
+ u32 *eint_wake_mask_value;
4242 u32 eint_wake_mask_reg;
4343 void (*set_eint_wakeup_mask)(struct samsung_pinctrl_drv_data *drvdata,
4444 struct exynos_irq_chip *irq_chip);
....@@ -207,7 +207,7 @@
207207 /*
208208 * irq_chip for gpio interrupts.
209209 */
210
-static struct exynos_irq_chip exynos_gpio_irq_chip = {
210
+static const struct exynos_irq_chip exynos_gpio_irq_chip __initconst = {
211211 .chip = {
212212 .name = "exynos_gpio_irq_chip",
213213 .irq_unmask = exynos_irq_unmask,
....@@ -274,7 +274,7 @@
274274 * exynos_eint_gpio_init() - setup handling of external gpio interrupts.
275275 * @d: driver data of samsung pinctrl driver.
276276 */
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)
278278 {
279279 struct samsung_pin_bank *bank;
280280 struct device *dev = d->dev;
....@@ -297,6 +297,15 @@
297297 for (i = 0; i < d->nr_banks; ++i, ++bank) {
298298 if (bank->eint_type != EINT_TYPE_GPIO)
299299 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
+
300309 bank->irq_domain = irq_domain_add_linear(bank->of_node,
301310 bank->nr_pins, &exynos_eint_irqd_ops, bank);
302311 if (!bank->irq_domain) {
....@@ -313,7 +322,6 @@
313322 goto err_domains;
314323 }
315324
316
- bank->irq_chip = &exynos_gpio_irq_chip;
317325 }
318326
319327 return 0;
....@@ -328,13 +336,6 @@
328336 return ret;
329337 }
330338
331
-static u32 exynos_eint_wake_mask = 0xffffffff;
332
-
333
-u32 exynos_get_eint_wake_mask(void)
334
-{
335
- return exynos_eint_wake_mask;
336
-}
337
-
338339 static int exynos_wkup_irq_set_wake(struct irq_data *irqd, unsigned int on)
339340 {
340341 struct irq_chip *chip = irq_data_get_irq_chip(irqd);
....@@ -345,10 +346,9 @@
345346 pr_info("wake %s for irq %d\n", on ? "enabled" : "disabled", irqd->irq);
346347
347348 if (!on)
348
- exynos_eint_wake_mask |= bit;
349
+ *our_chip->eint_wake_mask_value |= bit;
349350 else
350
- exynos_eint_wake_mask &= ~bit;
351
- our_chip->eint_wake_mask_value = exynos_eint_wake_mask;
351
+ *our_chip->eint_wake_mask_value &= ~bit;
352352
353353 return 0;
354354 }
....@@ -368,10 +368,10 @@
368368 pmu_regs = drvdata->retention_ctrl->priv;
369369 dev_info(drvdata->dev,
370370 "Setting external wakeup interrupt mask: 0x%x\n",
371
- irq_chip->eint_wake_mask_value);
371
+ *irq_chip->eint_wake_mask_value);
372372
373373 regmap_write(pmu_regs, irq_chip->eint_wake_mask_reg,
374
- irq_chip->eint_wake_mask_value);
374
+ *irq_chip->eint_wake_mask_value);
375375 }
376376
377377 static void
....@@ -390,10 +390,11 @@
390390
391391 clk_base = (void __iomem *) drvdata->retention_ctrl->priv;
392392
393
- __raw_writel(irq_chip->eint_wake_mask_value,
393
+ __raw_writel(*irq_chip->eint_wake_mask_value,
394394 clk_base + irq_chip->eint_wake_mask_reg);
395395 }
396396
397
+static u32 eint_wake_mask_value = EXYNOS_EINT_WAKEUP_MASK_DISABLED;
397398 /*
398399 * irq_chip for wakeup interrupts
399400 */
....@@ -411,7 +412,7 @@
411412 .eint_con = EXYNOS_WKUP_ECON_OFFSET,
412413 .eint_mask = EXYNOS_WKUP_EMASK_OFFSET,
413414 .eint_pend = EXYNOS_WKUP_EPEND_OFFSET,
414
- .eint_wake_mask_value = EXYNOS_EINT_WAKEUP_MASK_DISABLED,
415
+ .eint_wake_mask_value = &eint_wake_mask_value,
415416 /* Only differences with exynos4210_wkup_irq_chip: */
416417 .eint_wake_mask_reg = S5PV210_EINT_WAKEUP_MASK,
417418 .set_eint_wakeup_mask = s5pv210_pinctrl_set_eint_wakeup_mask,
....@@ -431,7 +432,7 @@
431432 .eint_con = EXYNOS_WKUP_ECON_OFFSET,
432433 .eint_mask = EXYNOS_WKUP_EMASK_OFFSET,
433434 .eint_pend = EXYNOS_WKUP_EPEND_OFFSET,
434
- .eint_wake_mask_value = EXYNOS_EINT_WAKEUP_MASK_DISABLED,
435
+ .eint_wake_mask_value = &eint_wake_mask_value,
435436 .eint_wake_mask_reg = EXYNOS_EINT_WAKEUP_MASK,
436437 .set_eint_wakeup_mask = exynos_pinctrl_set_eint_wakeup_mask,
437438 };
....@@ -450,7 +451,7 @@
450451 .eint_con = EXYNOS7_WKUP_ECON_OFFSET,
451452 .eint_mask = EXYNOS7_WKUP_EMASK_OFFSET,
452453 .eint_pend = EXYNOS7_WKUP_EPEND_OFFSET,
453
- .eint_wake_mask_value = EXYNOS_EINT_WAKEUP_MASK_DISABLED,
454
+ .eint_wake_mask_value = &eint_wake_mask_value,
454455 .eint_wake_mask_reg = EXYNOS5433_EINT_WAKEUP_MASK,
455456 .set_eint_wakeup_mask = exynos_pinctrl_set_eint_wakeup_mask,
456457 };
....@@ -521,7 +522,7 @@
521522 * exynos_eint_wkup_init() - setup handling of external wakeup interrupts.
522523 * @d: driver data of samsung pinctrl driver.
523524 */
524
-int exynos_eint_wkup_init(struct samsung_pinctrl_drv_data *d)
525
+__init int exynos_eint_wkup_init(struct samsung_pinctrl_drv_data *d)
525526 {
526527 struct device *dev = d->dev;
527528 struct device_node *wkup_np = NULL;
....@@ -529,7 +530,7 @@
529530 struct samsung_pin_bank *bank;
530531 struct exynos_weint_data *weint_data;
531532 struct exynos_muxed_weint_data *muxed_data;
532
- struct exynos_irq_chip *irq_chip;
533
+ const struct exynos_irq_chip *irq_chip;
533534 unsigned int muxed_banks = 0;
534535 unsigned int i;
535536 int idx, irq;
....@@ -539,12 +540,7 @@
539540
540541 match = of_match_node(exynos_wkup_irq_ids, np);
541542 if (match) {
542
- irq_chip = kmemdup(match->data,
543
- sizeof(*irq_chip), GFP_KERNEL);
544
- if (!irq_chip) {
545
- of_node_put(np);
546
- return -ENOMEM;
547
- }
543
+ irq_chip = match->data;
548544 wkup_np = np;
549545 break;
550546 }
....@@ -557,6 +553,14 @@
557553 if (bank->eint_type != EINT_TYPE_WKUP)
558554 continue;
559555
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
+
560564 bank->irq_domain = irq_domain_add_linear(bank->of_node,
561565 bank->nr_pins, &exynos_eint_irqd_ops, bank);
562566 if (!bank->irq_domain) {
....@@ -564,8 +568,6 @@
564568 of_node_put(wkup_np);
565569 return -ENXIO;
566570 }
567
-
568
- bank->irq_chip = irq_chip;
569571
570572 if (!of_find_property(bank->of_node, "interrupts", NULL)) {
571573 bank->eint_type = EINT_TYPE_WKUP_MUX;
....@@ -665,10 +667,6 @@
665667 irq_chip = bank->irq_chip;
666668 irq_chip->set_eint_wakeup_mask(drvdata,
667669 irq_chip);
668
- } else if (bank->irq_chip != irq_chip) {
669
- dev_warn(drvdata->dev,
670
- "More than one external wakeup interrupt chip configured (bank: %s). This is not supported by hardware nor by driver.\n",
671
- bank->name);
672670 }
673671 }
674672 }