2 * Core MFD support for Cirrus Logic Madera codecs
4 * Copyright 2015-2017 Cirrus Logic
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
11 #include <linux/device.h>
12 #include <linux/delay.h>
13 #include <linux/err.h>
14 #include <linux/gpio.h>
15 #include <linux/mfd/core.h>
16 #include <linux/module.h>
17 #include <linux/notifier.h>
19 #include <linux/of_device.h>
20 #include <linux/of_gpio.h>
21 #include <linux/pinctrl/consumer.h>
22 #include <linux/platform_device.h>
23 #include <linux/pm_runtime.h>
24 #include <linux/regmap.h>
25 #include <linux/regulator/consumer.h>
26 #include <linux/regulator/driver.h>
27 #include <linux/regulator/machine.h>
28 #include <linux/regulator/of_regulator.h>
30 #include <linux/mfd/madera/core.h>
31 #include <linux/mfd/madera/registers.h>
35 #define CS47L15_SILICON_ID 0x6370
36 #define CS47L35_SILICON_ID 0x6360
37 #define CS47L85_SILICON_ID 0x6338
38 #define CS47L90_SILICON_ID 0x6364
39 #define CS47L92_SILICON_ID 0x6371
41 #define MADERA_32KZ_MCLK2 1
43 static const char * const madera_core_supplies
[] = {
48 static const struct mfd_cell madera_ldo1_devs
[] = {
49 { .name
= "madera-ldo1" },
52 static const struct mfd_cell madera_pinctrl_dev
[] = {
54 .name
= "madera-pinctrl",
55 .of_compatible
= "cirrus,madera-pinctrl",
59 static const char * const cs47l15_supplies
[] = {
65 static const struct mfd_cell cs47l15_devs
[] = {
66 { .name
= "madera-irq" },
67 { .name
= "madera-gpio" },
69 .name
= "madera-extcon",
70 .parent_supplies
= cs47l15_supplies
,
71 .num_parent_supplies
= 1, /* We only need MICVDD */
74 .name
= "cs47l15-codec",
75 .parent_supplies
= cs47l15_supplies
,
76 .num_parent_supplies
= ARRAY_SIZE(cs47l15_supplies
),
80 static const char * const cs47l35_supplies
[] = {
88 static const struct mfd_cell cs47l35_devs
[] = {
89 { .name
= "madera-irq", },
90 { .name
= "madera-micsupp" },
91 { .name
= "madera-gpio", },
93 .name
= "madera-extcon",
94 .parent_supplies
= cs47l35_supplies
,
95 .num_parent_supplies
= 1, /* We only need MICVDD */
98 .name
= "cs47l35-codec",
99 .parent_supplies
= cs47l35_supplies
,
100 .num_parent_supplies
= ARRAY_SIZE(cs47l35_supplies
),
104 static const char * const cs47l85_supplies
[] = {
115 static const struct mfd_cell cs47l85_devs
[] = {
116 { .name
= "madera-irq", },
117 { .name
= "madera-micsupp", },
118 { .name
= "madera-gpio", },
120 .name
= "madera-extcon",
121 .parent_supplies
= cs47l85_supplies
,
122 .num_parent_supplies
= 1, /* We only need MICVDD */
125 .name
= "cs47l85-codec",
126 .parent_supplies
= cs47l85_supplies
,
127 .num_parent_supplies
= ARRAY_SIZE(cs47l85_supplies
),
131 static const char * const cs47l90_supplies
[] = {
140 static const struct mfd_cell cs47l90_devs
[] = {
141 { .name
= "madera-irq", },
142 { .name
= "madera-micsupp", },
143 { .name
= "madera-gpio", },
145 .name
= "madera-extcon",
146 .parent_supplies
= cs47l90_supplies
,
147 .num_parent_supplies
= 1, /* We only need MICVDD */
150 .name
= "cs47l90-codec",
151 .parent_supplies
= cs47l90_supplies
,
152 .num_parent_supplies
= ARRAY_SIZE(cs47l90_supplies
),
156 static const char * const cs47l92_supplies
[] = {
162 static const struct mfd_cell cs47l92_devs
[] = {
163 { .name
= "madera-irq", },
164 { .name
= "madera-micsupp", },
165 { .name
= "madera-gpio" },
167 .name
= "madera-extcon",
168 .parent_supplies
= cs47l92_supplies
,
169 .num_parent_supplies
= 1, /* We only need MICVDD */
172 .name
= "cs47l92-codec",
173 .parent_supplies
= cs47l92_supplies
,
174 .num_parent_supplies
= ARRAY_SIZE(cs47l92_supplies
),
179 const char *madera_name_from_type(enum madera_type type
)
202 EXPORT_SYMBOL_GPL(madera_name_from_type
);
204 #define MADERA_BOOT_POLL_MAX_INTERVAL_US 5000
205 #define MADERA_BOOT_POLL_TIMEOUT_US 25000
207 static int madera_wait_for_boot(struct madera
*madera
)
213 * We can't use an interrupt as we need to runtime resume to do so,
214 * so we poll the status bit. This won't race with the interrupt
215 * handler because it will be blocked on runtime resume.
217 ret
= regmap_read_poll_timeout(madera
->regmap
,
218 MADERA_IRQ1_RAW_STATUS_1
,
220 (val
& MADERA_BOOT_DONE_STS1
),
221 MADERA_BOOT_POLL_MAX_INTERVAL_US
,
222 MADERA_BOOT_POLL_TIMEOUT_US
);
225 dev_err(madera
->dev
, "Polling BOOT_DONE_STS failed: %d\n", ret
);
228 * BOOT_DONE defaults to unmasked on boot so we must ack it.
229 * Do this unconditionally to avoid interrupt storms
231 regmap_write(madera
->regmap
, MADERA_IRQ1_STATUS_1
,
232 MADERA_BOOT_DONE_EINT1
);
235 dev_err(madera
->dev
, "Polling BOOT_DONE_STS failed: %d\n", ret
);
237 pm_runtime_mark_last_busy(madera
->dev
);
242 static int madera_soft_reset(struct madera
*madera
)
246 ret
= regmap_write(madera
->regmap
, MADERA_SOFTWARE_RESET
, 0);
248 dev_err(madera
->dev
, "Failed to soft reset device: %d\n", ret
);
252 /* Allow time for internal clocks to startup after reset */
253 usleep_range(1000, 2000);
258 static void madera_enable_hard_reset(struct madera
*madera
)
260 if (madera
->reset_gpio
)
261 gpiod_set_value_cansleep(madera
->reset_gpio
, 0);
264 static void madera_disable_hard_reset(struct madera
*madera
)
266 if (madera
->reset_gpio
) {
267 gpiod_set_value_cansleep(madera
->reset_gpio
, 1);
268 usleep_range(1000, 2000);
273 static int madera_runtime_resume(struct device
*dev
)
275 struct madera
*madera
= dev_get_drvdata(dev
);
278 dev_err(dev
, "Leaving sleep mode\n");
280 madera_enable_hard_reset(madera
);
282 ret
= regulator_enable(madera
->dcvdd
);
284 dev_err(dev
, "Failed to enable DCVDD: %d\n", ret
);
288 if (IS_ENABLED(CONFIG_REGULATOR_S2MPU09
))
291 regcache_cache_only(madera
->regmap
, false);
292 regcache_cache_only(madera
->regmap_32bit
, false);
294 madera_disable_hard_reset(madera
);
296 if (!madera
->reset_gpio
) {
297 ret
= madera_wait_for_boot(madera
);
301 ret
= madera_soft_reset(madera
);
303 dev_err(dev
, "Failed to reset: %d\n", ret
);
308 ret
= madera_wait_for_boot(madera
);
312 ret
= regcache_sync(madera
->regmap
);
314 dev_err(dev
, "Failed to restore 16-bit register cache\n");
318 ret
= regcache_sync(madera
->regmap_32bit
);
320 dev_err(dev
, "Failed to restore 32-bit register cache\n");
327 regcache_cache_only(madera
->regmap_32bit
, true);
328 regcache_cache_only(madera
->regmap
, true);
329 regulator_disable(madera
->dcvdd
);
334 static int madera_runtime_suspend(struct device
*dev
)
336 struct madera
*madera
= dev_get_drvdata(dev
);
338 dev_dbg(madera
->dev
, "Entering sleep mode\n");
340 regcache_cache_only(madera
->regmap
, true);
341 regcache_mark_dirty(madera
->regmap
);
342 regcache_cache_only(madera
->regmap_32bit
, true);
343 regcache_mark_dirty(madera
->regmap_32bit
);
345 regulator_disable(madera
->dcvdd
);
351 const struct dev_pm_ops madera_pm_ops
= {
352 SET_RUNTIME_PM_OPS(madera_runtime_suspend
,
353 madera_runtime_resume
,
356 EXPORT_SYMBOL_GPL(madera_pm_ops
);
358 unsigned int madera_get_num_micbias(struct madera
*madera
)
361 switch (madera
->type
) {
375 dev_warn(madera
->dev
, "No micbias known for codec %s\n",
376 madera_name_from_type(madera
->type
));
380 EXPORT_SYMBOL_GPL(madera_get_num_micbias
);
382 unsigned int madera_get_num_childbias(struct madera
*madera
,
383 unsigned int micbias
)
386 * micbias argument reserved for future codecs that don't
387 * have the same number of children on each micbias
390 switch (madera
->type
) {
409 dev_warn(madera
->dev
,
410 "No child micbias for codec %s, micbias %u\n",
411 madera_name_from_type(madera
->type
),
416 dev_warn(madera
->dev
, "No child micbias known for codec %s\n",
417 madera_name_from_type(madera
->type
));
421 EXPORT_SYMBOL_GPL(madera_get_num_childbias
);
424 const struct of_device_id madera_of_match
[] = {
425 { .compatible
= "cirrus,cs47l15", .data
= (void *)CS47L15
},
426 { .compatible
= "cirrus,cs47l35", .data
= (void *)CS47L35
},
427 { .compatible
= "cirrus,cs47l85", .data
= (void *)CS47L85
},
428 { .compatible
= "cirrus,cs47l90", .data
= (void *)CS47L90
},
429 { .compatible
= "cirrus,cs47l91", .data
= (void *)CS47L91
},
430 { .compatible
= "cirrus,cs47l92", .data
= (void *)CS47L92
},
431 { .compatible
= "cirrus,cs47l93", .data
= (void *)CS47L93
},
432 { .compatible
= "cirrus,wm1840", .data
= (void *)WM1840
},
435 EXPORT_SYMBOL_GPL(madera_of_match
);
437 unsigned long madera_get_type_from_of(struct device
*dev
)
439 const struct of_device_id
*id
= of_match_device(madera_of_match
, dev
);
442 return (unsigned long)id
->data
;
446 EXPORT_SYMBOL_GPL(madera_get_type_from_of
);
449 static int madera_get_reset_gpio(struct madera
*madera
)
453 /* We use 0 in pdata to indicate a GPIO has not been set */
454 if (dev_get_platdata(madera
->dev
) && (madera
->pdata
.reset
> 0)) {
455 /* Start out with /RESET asserted */
456 ret
= devm_gpio_request_one(madera
->dev
,
458 GPIOF_DIR_OUT
| GPIOF_INIT_LOW
,
461 madera
->reset_gpio
= gpio_to_desc(madera
->pdata
.reset
);
463 madera
->reset_gpio
= devm_gpiod_get_optional(madera
->dev
,
466 if (IS_ERR(madera
->reset_gpio
))
467 ret
= PTR_ERR(madera
->reset_gpio
);
472 /* Ensure period of reset asserted before we apply the supplies */
475 if (ret
== -EPROBE_DEFER
)
479 dev_err(madera
->dev
, "Failed to request /RESET: %d\n", ret
);
483 if (!madera
->reset_gpio
)
484 dev_warn(madera
->dev
,
485 "Running without reset GPIO is not recommended\n");
490 static void madera_prop_get_micbias_child(struct madera
*madera
,
492 struct madera_micbias_pin_pdata
*pdata
)
494 struct device_node
*np
;
495 struct regulator_desc desc
= { };
497 np
= of_get_child_by_name(madera
->dev
->of_node
, name
);
502 pdata
->init_data
= of_get_regulator_init_data(madera
->dev
, np
, &desc
);
503 of_property_read_u32(np
, "regulator-active-discharge",
504 &pdata
->active_discharge
);
507 static void madera_prop_get_micbias_gen(struct madera
*madera
,
509 struct madera_micbias_pdata
*pdata
)
511 struct device_node
*np
;
512 struct regulator_desc desc
= { };
514 np
= of_get_child_by_name(madera
->dev
->of_node
, name
);
519 pdata
->init_data
= of_get_regulator_init_data(madera
->dev
, np
, &desc
);
520 pdata
->ext_cap
= of_property_read_bool(np
, "cirrus,ext-cap");
521 of_property_read_u32(np
, "regulator-active-discharge",
522 &pdata
->active_discharge
);
525 static void madera_prop_get_micbias(struct madera
*madera
)
527 struct madera_micbias_pdata
*pdata
;
531 for (i
= madera_get_num_micbias(madera
) - 1; i
>= 0; --i
) {
532 pdata
= &madera
->pdata
.micbias
[i
];
534 snprintf(name
, sizeof(name
), "MICBIAS%d", i
+ 1);
535 madera_prop_get_micbias_gen(madera
, name
, pdata
);
537 child
= madera_get_num_childbias(madera
, i
+ 1) - 1;
538 for (; child
>= 0; --child
) {
539 snprintf(name
, sizeof(name
), "MICBIAS%d%c",
541 madera_prop_get_micbias_child(madera
, name
,
547 static void madera_configure_micbias(struct madera
*madera
)
549 unsigned int num_micbias
= madera_get_num_micbias(madera
);
550 struct madera_micbias_pdata
*pdata
;
551 struct regulator_init_data
*init_data
;
552 unsigned int num_child_micbias
;
553 unsigned int val
, mask
, reg
;
556 for (i
= 0; i
< num_micbias
; ++i
) {
557 pdata
= &madera
->pdata
.micbias
[i
];
559 /* Configure the child micbias pins */
562 num_child_micbias
= madera_get_num_childbias(madera
, i
+ 1);
563 for (child
= 0; child
< num_child_micbias
; ++child
) {
564 if (!pdata
->pin
[child
].init_data
)
567 mask
|= MADERA_MICB1A_DISCH
<< (child
* 4);
568 if (pdata
->pin
[child
].active_discharge
)
569 val
|= MADERA_MICB1A_DISCH
<< (child
* 4);
573 reg
= MADERA_MIC_BIAS_CTRL_5
+ (i
* 2);
574 ret
= regmap_update_bits(madera
->regmap
, reg
, mask
, val
);
576 dev_warn(madera
->dev
,
577 "Failed to write 0x%x (%d)\n",
581 "Set MICBIAS_CTRL%d mask=0x%x val=0x%x\n",
585 /* configure the parent */
586 init_data
= pdata
->init_data
;
590 mask
= MADERA_MICB1_LVL_MASK
| MADERA_MICB1_EXT_CAP
|
591 MADERA_MICB1_BYPASS
| MADERA_MICB1_RATE
;
593 if (!init_data
->constraints
.max_uV
)
594 init_data
->constraints
.max_uV
= 2800000;
596 val
= (init_data
->constraints
.max_uV
- 1500000) / 100000;
597 val
<<= MADERA_MICB1_LVL_SHIFT
;
600 val
|= MADERA_MICB1_EXT_CAP
;
602 /* if no child biases the discharge is set in the parent */
603 if (num_child_micbias
== 0) {
604 mask
|= MADERA_MICB1_DISCH
;
606 if (pdata
->active_discharge
)
607 val
|= MADERA_MICB1_DISCH
;
610 if (init_data
->constraints
.soft_start
)
611 val
|= MADERA_MICB1_RATE
;
613 if (init_data
->constraints
.valid_ops_mask
&
614 REGULATOR_CHANGE_BYPASS
)
615 val
|= MADERA_MICB1_BYPASS
;
617 reg
= MADERA_MIC_BIAS_CTRL_1
+ i
;
618 ret
= regmap_update_bits(madera
->regmap
, reg
, mask
, val
);
620 dev_warn(madera
->dev
, "Failed to write 0x%x (%d)\n",
623 dev_dbg(madera
->dev
, "Set MICBIAS_CTRL%d mask=0x%x val=0x%x\n",
628 static int madera_dev_select_pinctrl(struct madera
*madera
,
629 struct pinctrl
*pinctrl
,
632 struct pinctrl_state
*pinctrl_state
;
635 pinctrl_state
= pinctrl_lookup_state(pinctrl
, name
);
637 /* it's ok if it doesn't exist */
638 if (!IS_ERR(pinctrl_state
)) {
639 dev_dbg(madera
->dev
, "Applying pinctrl %s state\n", name
);
640 ret
= pinctrl_select_state(pinctrl
, pinctrl_state
);
643 "Failed to select pinctrl %s state: %d\n",
652 int madera_dev_init(struct madera
*madera
)
654 struct device
*dev
= madera
->dev
;
657 int (*patch_fn
)(struct madera
*) = NULL
;
658 const struct mfd_cell
*mfd_devs
;
659 struct pinctrl
*pinctrl
;
663 dev_set_drvdata(madera
->dev
, madera
);
666 * Pinctrl subsystem only configures pinctrls if all referenced pins
667 * are registered. Create our pinctrl child now so that its pins exist
668 * otherwise external pinctrl dependencies will fail
669 * Note: Can't devm_ because it is cleaned up after children are already
672 ret
= mfd_add_devices(madera
->dev
, PLATFORM_DEVID_NONE
,
673 madera_pinctrl_dev
, 1, NULL
, 0, NULL
);
675 dev_err(madera
->dev
, "Failed to add pinctrl child: %d\n", ret
);
679 pinctrl
= pinctrl_get(dev
);
680 if (IS_ERR(pinctrl
)) {
681 ret
= PTR_ERR(pinctrl
);
682 dev_err(madera
->dev
, "Failed to get pinctrl: %d\n", ret
);
686 /* Use (optional) minimal config with only external pin bindings */
687 ret
= madera_dev_select_pinctrl(madera
, pinctrl
, "probe");
691 mutex_init(&madera
->reg_setting_lock
);
693 BLOCKING_INIT_NOTIFIER_HEAD(&madera
->notifier
);
695 if (dev_get_platdata(madera
->dev
)) {
696 memcpy(&madera
->pdata
, dev_get_platdata(madera
->dev
),
697 sizeof(madera
->pdata
));
700 ret
= madera_get_reset_gpio(madera
);
704 madera_prop_get_micbias(madera
);
706 regcache_cache_only(madera
->regmap
, true);
707 regcache_cache_only(madera
->regmap_32bit
, true);
709 for (i
= 0; i
< ARRAY_SIZE(madera_core_supplies
); i
++)
710 madera
->core_supplies
[i
].supply
= madera_core_supplies
[i
];
712 madera
->num_core_supplies
= ARRAY_SIZE(madera_core_supplies
);
714 switch (madera
->type
) {
724 /* On these DCVDD could be supplied from the onboard LDO1 */
725 ret
= mfd_add_devices(madera
->dev
, PLATFORM_DEVID_NONE
,
727 ARRAY_SIZE(madera_ldo1_devs
),
730 dev_err(dev
, "Failed to add LDO1 child: %d\n", ret
);
735 dev_err(madera
->dev
, "Unknown device type %d\n", madera
->type
);
740 ret
= devm_regulator_bulk_get(dev
, madera
->num_core_supplies
,
741 madera
->core_supplies
);
743 dev_err(dev
, "Failed to request core supplies: %d\n", ret
);
748 * Don't use devres here because the only device we have to get
749 * against is the MFD device and DCVDD will likely be supplied by
750 * one of its children. Meaning that the regulator will be
751 * destroyed by the time devres calls regulator put.
753 madera
->dcvdd
= regulator_get(madera
->dev
, "DCVDD");
754 if (IS_ERR(madera
->dcvdd
)) {
755 ret
= PTR_ERR(madera
->dcvdd
);
756 dev_err(dev
, "Failed to request DCVDD: %d\n", ret
);
760 ret
= regulator_bulk_enable(madera
->num_core_supplies
,
761 madera
->core_supplies
);
763 dev_err(dev
, "Failed to enable core supplies: %d\n", ret
);
767 ret
= regulator_enable(madera
->dcvdd
);
769 dev_err(dev
, "Failed to enable DCVDD: %d\n", ret
);
773 if (IS_ENABLED(CONFIG_REGULATOR_S2MPU09
))
776 madera_disable_hard_reset(madera
);
778 regcache_cache_only(madera
->regmap
, false);
779 regcache_cache_only(madera
->regmap_32bit
, false);
782 * Verify that this is a chip we know about before we
783 * starting doing any writes to its registers
785 ret
= regmap_read(madera
->regmap
, MADERA_SOFTWARE_RESET
, &hwid
);
787 dev_err(dev
, "Failed to read ID register: %d\n", ret
);
792 case CS47L15_SILICON_ID
:
793 case CS47L35_SILICON_ID
:
794 case CS47L85_SILICON_ID
:
795 case CS47L90_SILICON_ID
:
796 case CS47L92_SILICON_ID
:
799 dev_err(madera
->dev
, "Unknown device ID: %x\n", hwid
);
804 /* If we don't have a reset GPIO use a soft reset */
805 if (!madera
->reset_gpio
) {
806 ret
= madera_soft_reset(madera
);
811 ret
= madera_wait_for_boot(madera
);
813 dev_err(madera
->dev
, "Device failed initial boot: %d\n", ret
);
817 ret
= regmap_read(madera
->regmap
, MADERA_HARDWARE_REVISION
,
820 dev_err(dev
, "Failed to read revision register: %d\n", ret
);
823 madera
->rev
&= MADERA_HW_REVISION_MASK
;
825 name
= madera_name_from_type(madera
->type
);
828 case CS47L15_SILICON_ID
:
829 if (IS_ENABLED(CONFIG_MFD_CS47L15
)) {
830 switch (madera
->type
) {
832 patch_fn
= cs47l15_patch
;
833 mfd_devs
= cs47l15_devs
;
834 n_devs
= ARRAY_SIZE(cs47l15_devs
);
841 case CS47L35_SILICON_ID
:
842 if (IS_ENABLED(CONFIG_MFD_CS47L35
)) {
843 switch (madera
->type
) {
845 patch_fn
= cs47l35_patch
;
846 mfd_devs
= cs47l35_devs
;
847 n_devs
= ARRAY_SIZE(cs47l35_devs
);
854 case CS47L85_SILICON_ID
:
855 if (IS_ENABLED(CONFIG_MFD_CS47L85
)) {
856 switch (madera
->type
) {
859 patch_fn
= cs47l85_patch
;
860 mfd_devs
= cs47l85_devs
;
861 n_devs
= ARRAY_SIZE(cs47l85_devs
);
868 case CS47L90_SILICON_ID
:
869 if (IS_ENABLED(CONFIG_MFD_CS47L90
)) {
870 switch (madera
->type
) {
873 patch_fn
= cs47l90_patch
;
874 mfd_devs
= cs47l90_devs
;
875 n_devs
= ARRAY_SIZE(cs47l90_devs
);
882 case CS47L92_SILICON_ID
:
883 if (IS_ENABLED(CONFIG_MFD_CS47L92
)) {
884 switch (madera
->type
) {
887 patch_fn
= cs47l92_patch
;
888 mfd_devs
= cs47l92_devs
;
889 n_devs
= ARRAY_SIZE(cs47l92_devs
);
901 dev_err(madera
->dev
, "Device ID 0x%x not a %s\n", hwid
, name
);
906 dev_info(dev
, "%s silicon revision %d\n", name
, madera
->rev
);
908 /* Apply hardware patch */
910 ret
= patch_fn(madera
);
912 dev_err(madera
->dev
, "Failed to apply patch %d\n", ret
);
917 /* Apply (optional) main pinctrl config, this will configure our pins */
918 ret
= madera_dev_select_pinctrl(madera
, pinctrl
, "active");
922 /* Init 32k clock sourced from MCLK2 */
923 ret
= regmap_update_bits(madera
->regmap
,
925 MADERA_CLK_32K_ENA_MASK
| MADERA_CLK_32K_SRC_MASK
,
926 MADERA_CLK_32K_ENA
| MADERA_32KZ_MCLK2
);
928 dev_err(madera
->dev
, "Failed to init 32k clock: %d\n", ret
);
932 madera_configure_micbias(madera
);
934 pm_runtime_set_active(madera
->dev
);
935 pm_runtime_enable(madera
->dev
);
936 pm_runtime_set_autosuspend_delay(madera
->dev
, 100);
937 pm_runtime_use_autosuspend(madera
->dev
);
939 ret
= mfd_add_devices(madera
->dev
, PLATFORM_DEVID_NONE
,
943 dev_err(madera
->dev
, "Failed to add subdevices: %d\n", ret
);
947 pinctrl_put(pinctrl
);
952 pm_runtime_disable(madera
->dev
);
954 madera_enable_hard_reset(madera
);
955 regulator_disable(madera
->dcvdd
);
957 regulator_bulk_disable(madera
->num_core_supplies
,
958 madera
->core_supplies
);
960 regulator_put(madera
->dcvdd
);
962 pinctrl_put(pinctrl
);
964 mfd_remove_devices(dev
);
968 EXPORT_SYMBOL_GPL(madera_dev_init
);
970 int madera_dev_exit(struct madera
*madera
)
972 /* Prevent any IRQs being serviced while we clean up */
973 disable_irq(madera
->irq
);
976 * DCVDD could be supplied by a child node, we must disable it before
977 * removing the children, and prevent PM runtime from turning it back on
979 pm_runtime_disable(madera
->dev
);
981 regulator_disable(madera
->dcvdd
);
982 regulator_put(madera
->dcvdd
);
984 mfd_remove_devices(madera
->dev
);
985 madera_enable_hard_reset(madera
);
987 regulator_bulk_disable(madera
->num_core_supplies
,
988 madera
->core_supplies
);
991 EXPORT_SYMBOL_GPL(madera_dev_exit
);