hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/drivers/mfd/da9062-core.c
....@@ -1,16 +1,7 @@
1
+// SPDX-License-Identifier: GPL-2.0-or-later
12 /*
23 * Core, IRQ and I2C device driver for DA9061 and DA9062 PMICs
34 * Copyright (C) 2015-2017 Dialog Semiconductor
4
- *
5
- * This program is free software; you can redistribute it and/or
6
- * modify it under the terms of the GNU General Public License
7
- * as published by the Free Software Foundation; either version 2
8
- * of the License, or (at your option) any later version.
9
- *
10
- * This program is distributed in the hope that it will be useful,
11
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
- * GNU General Public License for more details.
145 */
156
167 #include <linux/kernel.h>
....@@ -29,6 +20,9 @@
2920 #define DA9062_REG_EVENT_A_OFFSET 0
3021 #define DA9062_REG_EVENT_B_OFFSET 1
3122 #define DA9062_REG_EVENT_C_OFFSET 2
23
+
24
+#define DA9062_IRQ_LOW 0
25
+#define DA9062_IRQ_HIGH 1
3226
3327 static struct regmap_irq da9061_irqs[] = {
3428 /* EVENT A */
....@@ -242,6 +236,14 @@
242236 DEFINE_RES_NAMED(DA9062_IRQ_ONKEY, 1, "ONKEY", IORESOURCE_IRQ),
243237 };
244238
239
+static struct resource da9062_gpio_resources[] = {
240
+ DEFINE_RES_NAMED(DA9062_IRQ_GPI0, 1, "GPI0", IORESOURCE_IRQ),
241
+ DEFINE_RES_NAMED(DA9062_IRQ_GPI1, 1, "GPI1", IORESOURCE_IRQ),
242
+ DEFINE_RES_NAMED(DA9062_IRQ_GPI2, 1, "GPI2", IORESOURCE_IRQ),
243
+ DEFINE_RES_NAMED(DA9062_IRQ_GPI3, 1, "GPI3", IORESOURCE_IRQ),
244
+ DEFINE_RES_NAMED(DA9062_IRQ_GPI4, 1, "GPI4", IORESOURCE_IRQ),
245
+};
246
+
245247 static const struct mfd_cell da9062_devs[] = {
246248 {
247249 .name = "da9062-core",
....@@ -275,7 +277,13 @@
275277 .name = "da9062-onkey",
276278 .num_resources = ARRAY_SIZE(da9062_onkey_resources),
277279 .resources = da9062_onkey_resources,
278
- .of_compatible = "dlg,da9062-onkey",
280
+ .of_compatible = "dlg,da9062-onkey",
281
+ },
282
+ {
283
+ .name = "da9062-gpio",
284
+ .num_resources = ARRAY_SIZE(da9062_gpio_resources),
285
+ .resources = da9062_gpio_resources,
286
+ .of_compatible = "dlg,da9062-gpio",
279287 },
280288 };
281289
....@@ -364,6 +372,33 @@
364372 return ret;
365373 }
366374
375
+static u32 da9062_configure_irq_type(struct da9062 *chip, int irq, u32 *trigger)
376
+{
377
+ u32 irq_type = 0;
378
+ struct irq_data *irq_data = irq_get_irq_data(irq);
379
+
380
+ if (!irq_data) {
381
+ dev_err(chip->dev, "Invalid IRQ: %d\n", irq);
382
+ return -EINVAL;
383
+ }
384
+ *trigger = irqd_get_trigger_type(irq_data);
385
+
386
+ switch (*trigger) {
387
+ case IRQ_TYPE_LEVEL_HIGH:
388
+ irq_type = DA9062_IRQ_HIGH;
389
+ break;
390
+ case IRQ_TYPE_LEVEL_LOW:
391
+ irq_type = DA9062_IRQ_LOW;
392
+ break;
393
+ default:
394
+ dev_warn(chip->dev, "Unsupported IRQ type: %d\n", *trigger);
395
+ return -EINVAL;
396
+ }
397
+ return regmap_update_bits(chip->regmap, DA9062AA_CONFIG_A,
398
+ DA9062AA_IRQ_TYPE_MASK,
399
+ irq_type << DA9062AA_IRQ_TYPE_SHIFT);
400
+}
401
+
367402 static const struct regmap_range da9061_aa_readable_ranges[] = {
368403 regmap_reg_range(DA9062AA_PAGE_CON, DA9062AA_STATUS_B),
369404 regmap_reg_range(DA9062AA_STATUS_D, DA9062AA_EVENT_C),
....@@ -383,6 +418,7 @@
383418 regmap_reg_range(DA9062AA_VBUCK1_A, DA9062AA_VBUCK4_A),
384419 regmap_reg_range(DA9062AA_VBUCK3_A, DA9062AA_VBUCK3_A),
385420 regmap_reg_range(DA9062AA_VLDO1_A, DA9062AA_VLDO4_A),
421
+ regmap_reg_range(DA9062AA_CONFIG_A, DA9062AA_CONFIG_A),
386422 regmap_reg_range(DA9062AA_VBUCK1_B, DA9062AA_VBUCK4_B),
387423 regmap_reg_range(DA9062AA_VBUCK3_B, DA9062AA_VBUCK3_B),
388424 regmap_reg_range(DA9062AA_VLDO1_B, DA9062AA_VLDO4_B),
....@@ -412,6 +448,7 @@
412448 regmap_reg_range(DA9062AA_VBUCK1_A, DA9062AA_VBUCK4_A),
413449 regmap_reg_range(DA9062AA_VBUCK3_A, DA9062AA_VBUCK3_A),
414450 regmap_reg_range(DA9062AA_VLDO1_A, DA9062AA_VLDO4_A),
451
+ regmap_reg_range(DA9062AA_CONFIG_A, DA9062AA_CONFIG_A),
415452 regmap_reg_range(DA9062AA_VBUCK1_B, DA9062AA_VBUCK4_B),
416453 regmap_reg_range(DA9062AA_VBUCK3_B, DA9062AA_VBUCK3_B),
417454 regmap_reg_range(DA9062AA_VLDO1_B, DA9062AA_VLDO4_B),
....@@ -591,6 +628,7 @@
591628 const struct regmap_irq_chip *irq_chip;
592629 const struct regmap_config *config;
593630 int cell_num;
631
+ u32 trigger_type = 0;
594632 int ret;
595633
596634 chip = devm_kzalloc(&i2c->dev, sizeof(*chip), GFP_KERNEL);
....@@ -649,10 +687,15 @@
649687 if (ret)
650688 return ret;
651689
690
+ ret = da9062_configure_irq_type(chip, i2c->irq, &trigger_type);
691
+ if (ret < 0) {
692
+ dev_err(chip->dev, "Failed to configure IRQ type\n");
693
+ return ret;
694
+ }
695
+
652696 ret = regmap_add_irq_chip(chip->regmap, i2c->irq,
653
- IRQF_TRIGGER_LOW | IRQF_ONESHOT | IRQF_SHARED,
654
- -1, irq_chip,
655
- &chip->regmap_irq);
697
+ trigger_type | IRQF_SHARED | IRQF_ONESHOT,
698
+ -1, irq_chip, &chip->regmap_irq);
656699 if (ret) {
657700 dev_err(chip->dev, "Failed to request IRQ %d: %d\n",
658701 i2c->irq, ret);