Merge tag 'dmaengine-5.13-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/vkoul...
[linux-2.6-microblaze.git] / drivers / mfd / madera-core.c
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Core MFD support for Cirrus Logic Madera codecs
4  *
5  * Copyright (C) 2015-2018 Cirrus Logic
6  */
7
8 #include <linux/device.h>
9 #include <linux/delay.h>
10 #include <linux/err.h>
11 #include <linux/gpio.h>
12 #include <linux/mfd/core.h>
13 #include <linux/module.h>
14 #include <linux/mutex.h>
15 #include <linux/notifier.h>
16 #include <linux/of.h>
17 #include <linux/of_gpio.h>
18 #include <linux/platform_device.h>
19 #include <linux/pm_runtime.h>
20 #include <linux/regmap.h>
21 #include <linux/regulator/consumer.h>
22 #include <linux/regulator/machine.h>
23 #include <linux/regulator/of_regulator.h>
24
25 #include <linux/mfd/madera/core.h>
26 #include <linux/mfd/madera/registers.h>
27
28 #include "madera.h"
29
30 #define CS47L15_SILICON_ID      0x6370
31 #define CS47L35_SILICON_ID      0x6360
32 #define CS47L85_SILICON_ID      0x6338
33 #define CS47L90_SILICON_ID      0x6364
34 #define CS47L92_SILICON_ID      0x6371
35
36 #define MADERA_32KZ_MCLK2       1
37
38 #define MADERA_RESET_MIN_US     2000
39 #define MADERA_RESET_MAX_US     3000
40
41 #define ERRATA_DCVDD_MIN_US     10000
42 #define ERRATA_DCVDD_MAX_US     15000
43
44 static const char * const madera_core_supplies[] = {
45         "AVDD",
46         "DBVDD1",
47 };
48
49 static const struct mfd_cell madera_ldo1_devs[] = {
50         {
51                 .name = "madera-ldo1",
52                 .level = MFD_DEP_LEVEL_HIGH,
53         },
54 };
55
56 static const char * const cs47l15_supplies[] = {
57         "MICVDD",
58         "CPVDD1",
59         "SPKVDD",
60 };
61
62 static const struct mfd_cell cs47l15_devs[] = {
63         { .name = "madera-pinctrl", },
64         { .name = "madera-irq", },
65         { .name = "madera-gpio", },
66         {
67                 .name = "madera-extcon",
68                 .parent_supplies = cs47l15_supplies,
69                 .num_parent_supplies = 1, /* We only need MICVDD */
70         },
71         {
72                 .name = "cs47l15-codec",
73                 .parent_supplies = cs47l15_supplies,
74                 .num_parent_supplies = ARRAY_SIZE(cs47l15_supplies),
75         },
76 };
77
78 static const char * const cs47l35_supplies[] = {
79         "MICVDD",
80         "DBVDD2",
81         "CPVDD1",
82         "CPVDD2",
83         "SPKVDD",
84 };
85
86 static const struct mfd_cell cs47l35_devs[] = {
87         { .name = "madera-pinctrl", },
88         { .name = "madera-irq", },
89         { .name = "madera-micsupp", },
90         { .name = "madera-gpio", },
91         {
92                 .name = "madera-extcon",
93                 .parent_supplies = cs47l35_supplies,
94                 .num_parent_supplies = 1, /* We only need MICVDD */
95         },
96         {
97                 .name = "cs47l35-codec",
98                 .parent_supplies = cs47l35_supplies,
99                 .num_parent_supplies = ARRAY_SIZE(cs47l35_supplies),
100         },
101 };
102
103 static const char * const cs47l85_supplies[] = {
104         "MICVDD",
105         "DBVDD2",
106         "DBVDD3",
107         "DBVDD4",
108         "CPVDD1",
109         "CPVDD2",
110         "SPKVDDL",
111         "SPKVDDR",
112 };
113
114 static const struct mfd_cell cs47l85_devs[] = {
115         { .name = "madera-pinctrl", },
116         { .name = "madera-irq", },
117         { .name = "madera-micsupp", },
118         { .name = "madera-gpio", },
119         {
120                 .name = "madera-extcon",
121                 .parent_supplies = cs47l85_supplies,
122                 .num_parent_supplies = 1, /* We only need MICVDD */
123         },
124         {
125                 .name = "cs47l85-codec",
126                 .parent_supplies = cs47l85_supplies,
127                 .num_parent_supplies = ARRAY_SIZE(cs47l85_supplies),
128         },
129 };
130
131 static const char * const cs47l90_supplies[] = {
132         "MICVDD",
133         "DBVDD2",
134         "DBVDD3",
135         "DBVDD4",
136         "CPVDD1",
137         "CPVDD2",
138 };
139
140 static const struct mfd_cell cs47l90_devs[] = {
141         { .name = "madera-pinctrl", },
142         { .name = "madera-irq", },
143         { .name = "madera-micsupp", },
144         { .name = "madera-gpio", },
145         {
146                 .name = "madera-extcon",
147                 .parent_supplies = cs47l90_supplies,
148                 .num_parent_supplies = 1, /* We only need MICVDD */
149         },
150         {
151                 .name = "cs47l90-codec",
152                 .parent_supplies = cs47l90_supplies,
153                 .num_parent_supplies = ARRAY_SIZE(cs47l90_supplies),
154         },
155 };
156
157 static const char * const cs47l92_supplies[] = {
158         "MICVDD",
159         "CPVDD1",
160         "CPVDD2",
161 };
162
163 static const struct mfd_cell cs47l92_devs[] = {
164         { .name = "madera-pinctrl", },
165         { .name = "madera-irq", },
166         { .name = "madera-micsupp", },
167         { .name = "madera-gpio", },
168         {
169                 .name = "madera-extcon",
170                 .parent_supplies = cs47l92_supplies,
171                 .num_parent_supplies = 1, /* We only need MICVDD */
172         },
173         {
174                 .name = "cs47l92-codec",
175                 .parent_supplies = cs47l92_supplies,
176                 .num_parent_supplies = ARRAY_SIZE(cs47l92_supplies),
177         },
178 };
179
180 /* Used by madera-i2c and madera-spi drivers */
181 const char *madera_name_from_type(enum madera_type type)
182 {
183         switch (type) {
184         case CS47L15:
185                 return "CS47L15";
186         case CS47L35:
187                 return "CS47L35";
188         case CS47L85:
189                 return "CS47L85";
190         case CS47L90:
191                 return "CS47L90";
192         case CS47L91:
193                 return "CS47L91";
194         case CS42L92:
195                 return "CS42L92";
196         case CS47L92:
197                 return "CS47L92";
198         case CS47L93:
199                 return "CS47L93";
200         case WM1840:
201                 return "WM1840";
202         default:
203                 return "Unknown";
204         }
205 }
206 EXPORT_SYMBOL_GPL(madera_name_from_type);
207
208 #define MADERA_BOOT_POLL_INTERVAL_USEC          5000
209 #define MADERA_BOOT_POLL_TIMEOUT_USEC           25000
210
211 static int madera_wait_for_boot_noack(struct madera *madera)
212 {
213         ktime_t timeout;
214         unsigned int val = 0;
215         int ret = 0;
216
217         /*
218          * We can't use an interrupt as we need to runtime resume to do so,
219          * so we poll the status bit. This won't race with the interrupt
220          * handler because it will be blocked on runtime resume.
221          * The chip could NAK a read request while it is booting so ignore
222          * errors from regmap_read.
223          */
224         timeout = ktime_add_us(ktime_get(), MADERA_BOOT_POLL_TIMEOUT_USEC);
225         regmap_read(madera->regmap, MADERA_IRQ1_RAW_STATUS_1, &val);
226         while (!(val & MADERA_BOOT_DONE_STS1) &&
227                !ktime_after(ktime_get(), timeout)) {
228                 usleep_range(MADERA_BOOT_POLL_INTERVAL_USEC / 2,
229                              MADERA_BOOT_POLL_INTERVAL_USEC);
230                 regmap_read(madera->regmap, MADERA_IRQ1_RAW_STATUS_1, &val);
231         }
232
233         if (!(val & MADERA_BOOT_DONE_STS1)) {
234                 dev_err(madera->dev, "Polling BOOT_DONE_STS timed out\n");
235                 ret = -ETIMEDOUT;
236         }
237
238         return ret;
239 }
240
241 static int madera_wait_for_boot(struct madera *madera)
242 {
243         int ret = madera_wait_for_boot_noack(madera);
244
245         /*
246          * BOOT_DONE defaults to unmasked on boot so we must ack it.
247          * Do this even after a timeout to avoid interrupt storms.
248          */
249         regmap_write(madera->regmap, MADERA_IRQ1_STATUS_1,
250                      MADERA_BOOT_DONE_EINT1);
251
252         pm_runtime_mark_last_busy(madera->dev);
253
254         return ret;
255 }
256
257 static int madera_soft_reset(struct madera *madera)
258 {
259         int ret;
260
261         ret = regmap_write(madera->regmap, MADERA_SOFTWARE_RESET, 0);
262         if (ret != 0) {
263                 dev_err(madera->dev, "Failed to soft reset device: %d\n", ret);
264                 return ret;
265         }
266
267         /* Allow time for internal clocks to startup after reset */
268         usleep_range(MADERA_RESET_MIN_US, MADERA_RESET_MAX_US);
269
270         return 0;
271 }
272
273 static void madera_enable_hard_reset(struct madera *madera)
274 {
275         /*
276          * There are many existing out-of-tree users of these codecs that we
277          * can't break so preserve the expected behaviour of setting the line
278          * low to assert reset.
279          */
280         gpiod_set_raw_value_cansleep(madera->pdata.reset, 0);
281 }
282
283 static void madera_disable_hard_reset(struct madera *madera)
284 {
285         gpiod_set_raw_value_cansleep(madera->pdata.reset, 1);
286
287         usleep_range(MADERA_RESET_MIN_US, MADERA_RESET_MAX_US);
288 }
289
290 static int __maybe_unused madera_runtime_resume(struct device *dev)
291 {
292         struct madera *madera = dev_get_drvdata(dev);
293         int ret;
294
295         dev_dbg(dev, "Leaving sleep mode\n");
296
297         if (!madera->reset_errata)
298                 madera_enable_hard_reset(madera);
299
300         ret = regulator_enable(madera->dcvdd);
301         if (ret) {
302                 dev_err(dev, "Failed to enable DCVDD: %d\n", ret);
303                 return ret;
304         }
305
306         regcache_cache_only(madera->regmap, false);
307         regcache_cache_only(madera->regmap_32bit, false);
308
309         if (madera->reset_errata)
310                 usleep_range(ERRATA_DCVDD_MIN_US, ERRATA_DCVDD_MAX_US);
311         else
312                 madera_disable_hard_reset(madera);
313
314         if (!madera->pdata.reset || madera->reset_errata) {
315                 ret = madera_wait_for_boot(madera);
316                 if (ret)
317                         goto err;
318
319                 ret = madera_soft_reset(madera);
320                 if (ret) {
321                         dev_err(dev, "Failed to reset: %d\n", ret);
322                         goto err;
323                 }
324         }
325
326         ret = madera_wait_for_boot(madera);
327         if (ret)
328                 goto err;
329
330         ret = regcache_sync(madera->regmap);
331         if (ret) {
332                 dev_err(dev, "Failed to restore 16-bit register cache\n");
333                 goto err;
334         }
335
336         ret = regcache_sync(madera->regmap_32bit);
337         if (ret) {
338                 dev_err(dev, "Failed to restore 32-bit register cache\n");
339                 goto err;
340         }
341
342         return 0;
343
344 err:
345         regcache_cache_only(madera->regmap_32bit, true);
346         regcache_cache_only(madera->regmap, true);
347         regulator_disable(madera->dcvdd);
348
349         return ret;
350 }
351
352 static int __maybe_unused madera_runtime_suspend(struct device *dev)
353 {
354         struct madera *madera = dev_get_drvdata(dev);
355
356         dev_dbg(madera->dev, "Entering sleep mode\n");
357
358         regcache_cache_only(madera->regmap, true);
359         regcache_mark_dirty(madera->regmap);
360         regcache_cache_only(madera->regmap_32bit, true);
361         regcache_mark_dirty(madera->regmap_32bit);
362
363         regulator_disable(madera->dcvdd);
364
365         return 0;
366 }
367
368 const struct dev_pm_ops madera_pm_ops = {
369         SET_RUNTIME_PM_OPS(madera_runtime_suspend,
370                            madera_runtime_resume,
371                            NULL)
372 };
373 EXPORT_SYMBOL_GPL(madera_pm_ops);
374
375 const struct of_device_id madera_of_match[] = {
376         { .compatible = "cirrus,cs47l15", .data = (void *)CS47L15 },
377         { .compatible = "cirrus,cs47l35", .data = (void *)CS47L35 },
378         { .compatible = "cirrus,cs47l85", .data = (void *)CS47L85 },
379         { .compatible = "cirrus,cs47l90", .data = (void *)CS47L90 },
380         { .compatible = "cirrus,cs47l91", .data = (void *)CS47L91 },
381         { .compatible = "cirrus,cs42l92", .data = (void *)CS42L92 },
382         { .compatible = "cirrus,cs47l92", .data = (void *)CS47L92 },
383         { .compatible = "cirrus,cs47l93", .data = (void *)CS47L93 },
384         { .compatible = "cirrus,wm1840", .data = (void *)WM1840 },
385         {}
386 };
387 MODULE_DEVICE_TABLE(of, madera_of_match);
388 EXPORT_SYMBOL_GPL(madera_of_match);
389
390 static int madera_get_reset_gpio(struct madera *madera)
391 {
392         struct gpio_desc *reset;
393
394         if (madera->pdata.reset)
395                 return 0;
396
397         reset = devm_gpiod_get_optional(madera->dev, "reset", GPIOD_OUT_LOW);
398         if (IS_ERR(reset))
399                 return dev_err_probe(madera->dev, PTR_ERR(reset),
400                                 "Failed to request /RESET");
401
402         /*
403          * A hard reset is needed for full reset of the chip. We allow running
404          * without hard reset only because it can be useful for early
405          * prototyping and some debugging, but we need to warn it's not ideal.
406          */
407         if (!reset)
408                 dev_warn(madera->dev,
409                          "Running without reset GPIO is not recommended\n");
410
411         madera->pdata.reset = reset;
412
413         return 0;
414 }
415
416 static void madera_set_micbias_info(struct madera *madera)
417 {
418         /*
419          * num_childbias is an array because future codecs can have different
420          * childbiases for each micbias. Unspecified values default to 0.
421          */
422         switch (madera->type) {
423         case CS47L15:
424                 madera->num_micbias = 1;
425                 madera->num_childbias[0] = 3;
426                 return;
427         case CS47L35:
428                 madera->num_micbias = 2;
429                 madera->num_childbias[0] = 2;
430                 madera->num_childbias[1] = 2;
431                 return;
432         case CS47L85:
433         case WM1840:
434                 madera->num_micbias = 4;
435                 /* no child biases */
436                 return;
437         case CS47L90:
438         case CS47L91:
439                 madera->num_micbias = 2;
440                 madera->num_childbias[0] = 4;
441                 madera->num_childbias[1] = 4;
442                 return;
443         case CS42L92:
444         case CS47L92:
445         case CS47L93:
446                 madera->num_micbias = 2;
447                 madera->num_childbias[0] = 4;
448                 madera->num_childbias[1] = 2;
449                 return;
450         default:
451                 return;
452         }
453 }
454
455 int madera_dev_init(struct madera *madera)
456 {
457         struct device *dev = madera->dev;
458         unsigned int hwid;
459         int (*patch_fn)(struct madera *) = NULL;
460         const struct mfd_cell *mfd_devs;
461         int n_devs = 0;
462         int i, ret;
463
464         dev_set_drvdata(madera->dev, madera);
465         BLOCKING_INIT_NOTIFIER_HEAD(&madera->notifier);
466         mutex_init(&madera->dapm_ptr_lock);
467
468         madera_set_micbias_info(madera);
469
470         /*
471          * We need writable hw config info that all children can share.
472          * Simplest to take one shared copy of pdata struct.
473          */
474         if (dev_get_platdata(madera->dev)) {
475                 memcpy(&madera->pdata, dev_get_platdata(madera->dev),
476                        sizeof(madera->pdata));
477         }
478
479         madera->mclk[MADERA_MCLK1].id = "mclk1";
480         madera->mclk[MADERA_MCLK2].id = "mclk2";
481         madera->mclk[MADERA_MCLK3].id = "mclk3";
482
483         ret = devm_clk_bulk_get_optional(madera->dev, ARRAY_SIZE(madera->mclk),
484                                          madera->mclk);
485         if (ret) {
486                 dev_err(madera->dev, "Failed to get clocks: %d\n", ret);
487                 return ret;
488         }
489
490         /* Not using devm_clk_get to prevent breakage of existing DTs */
491         if (!madera->mclk[MADERA_MCLK2].clk)
492                 dev_warn(madera->dev, "Missing MCLK2, requires 32kHz clock\n");
493
494         ret = madera_get_reset_gpio(madera);
495         if (ret)
496                 return ret;
497
498         regcache_cache_only(madera->regmap, true);
499         regcache_cache_only(madera->regmap_32bit, true);
500
501         for (i = 0; i < ARRAY_SIZE(madera_core_supplies); i++)
502                 madera->core_supplies[i].supply = madera_core_supplies[i];
503
504         madera->num_core_supplies = ARRAY_SIZE(madera_core_supplies);
505
506         /*
507          * On some codecs DCVDD could be supplied by the internal LDO1.
508          * For those we must add the LDO1 driver before requesting DCVDD
509          * No devm_ because we need to control shutdown order of children.
510          */
511         switch (madera->type) {
512         case CS47L15:
513                 madera->reset_errata = true;
514                 break;
515         case CS47L35:
516         case CS47L90:
517         case CS47L91:
518         case CS42L92:
519         case CS47L92:
520         case CS47L93:
521                 break;
522         case CS47L85:
523         case WM1840:
524                 ret = mfd_add_devices(madera->dev, PLATFORM_DEVID_NONE,
525                                       madera_ldo1_devs,
526                                       ARRAY_SIZE(madera_ldo1_devs),
527                                       NULL, 0, NULL);
528                 if (ret) {
529                         dev_err(dev, "Failed to add LDO1 child: %d\n", ret);
530                         return ret;
531                 }
532                 break;
533         default:
534                 /* No point continuing if the type is unknown */
535                 dev_err(madera->dev, "Unknown device type %d\n", madera->type);
536                 return -ENODEV;
537         }
538
539         ret = devm_regulator_bulk_get(dev, madera->num_core_supplies,
540                                       madera->core_supplies);
541         if (ret) {
542                 dev_err(dev, "Failed to request core supplies: %d\n", ret);
543                 goto err_devs;
544         }
545
546         /*
547          * Don't use devres here. If the regulator is one of our children it
548          * will already have been removed before devres cleanup on this mfd
549          * driver tries to call put() on it. We need control of shutdown order.
550          */
551         madera->dcvdd = regulator_get(madera->dev, "DCVDD");
552         if (IS_ERR(madera->dcvdd)) {
553                 ret = PTR_ERR(madera->dcvdd);
554                 dev_err(dev, "Failed to request DCVDD: %d\n", ret);
555                 goto err_devs;
556         }
557
558         ret = regulator_bulk_enable(madera->num_core_supplies,
559                                     madera->core_supplies);
560         if (ret) {
561                 dev_err(dev, "Failed to enable core supplies: %d\n", ret);
562                 goto err_dcvdd;
563         }
564
565         if (madera->reset_errata)
566                 madera_disable_hard_reset(madera);
567
568         ret = regulator_enable(madera->dcvdd);
569         if (ret) {
570                 dev_err(dev, "Failed to enable DCVDD: %d\n", ret);
571                 goto err_enable;
572         }
573
574         if (madera->reset_errata)
575                 usleep_range(ERRATA_DCVDD_MIN_US, ERRATA_DCVDD_MAX_US);
576         else
577                 madera_disable_hard_reset(madera);
578
579         regcache_cache_only(madera->regmap, false);
580         regcache_cache_only(madera->regmap_32bit, false);
581
582         ret = madera_wait_for_boot_noack(madera);
583         if (ret) {
584                 dev_err(madera->dev, "Device failed initial boot: %d\n", ret);
585                 goto err_reset;
586         }
587
588         /*
589          * Now we can power up and verify that this is a chip we know about
590          * before we start doing any writes to its registers.
591          */
592         ret = regmap_read(madera->regmap, MADERA_SOFTWARE_RESET, &hwid);
593         if (ret) {
594                 dev_err(dev, "Failed to read ID register: %d\n", ret);
595                 goto err_reset;
596         }
597
598         switch (hwid) {
599         case CS47L15_SILICON_ID:
600                 if (IS_ENABLED(CONFIG_MFD_CS47L15)) {
601                         switch (madera->type) {
602                         case CS47L15:
603                                 patch_fn = &cs47l15_patch;
604                                 mfd_devs = cs47l15_devs;
605                                 n_devs = ARRAY_SIZE(cs47l15_devs);
606                                 break;
607                         default:
608                                 break;
609                         }
610                 }
611                 break;
612         case CS47L35_SILICON_ID:
613                 if (IS_ENABLED(CONFIG_MFD_CS47L35)) {
614                         switch (madera->type) {
615                         case CS47L35:
616                                 patch_fn = cs47l35_patch;
617                                 mfd_devs = cs47l35_devs;
618                                 n_devs = ARRAY_SIZE(cs47l35_devs);
619                                 break;
620                         default:
621                                 break;
622                         }
623                 }
624                 break;
625         case CS47L85_SILICON_ID:
626                 if (IS_ENABLED(CONFIG_MFD_CS47L85)) {
627                         switch (madera->type) {
628                         case CS47L85:
629                         case WM1840:
630                                 patch_fn = cs47l85_patch;
631                                 mfd_devs = cs47l85_devs;
632                                 n_devs = ARRAY_SIZE(cs47l85_devs);
633                                 break;
634                         default:
635                                 break;
636                         }
637                 }
638                 break;
639         case CS47L90_SILICON_ID:
640                 if (IS_ENABLED(CONFIG_MFD_CS47L90)) {
641                         switch (madera->type) {
642                         case CS47L90:
643                         case CS47L91:
644                                 patch_fn = cs47l90_patch;
645                                 mfd_devs = cs47l90_devs;
646                                 n_devs = ARRAY_SIZE(cs47l90_devs);
647                                 break;
648                         default:
649                                 break;
650                         }
651                 }
652                 break;
653         case CS47L92_SILICON_ID:
654                 if (IS_ENABLED(CONFIG_MFD_CS47L92)) {
655                         switch (madera->type) {
656                         case CS42L92:
657                         case CS47L92:
658                         case CS47L93:
659                                 patch_fn = cs47l92_patch;
660                                 mfd_devs = cs47l92_devs;
661                                 n_devs = ARRAY_SIZE(cs47l92_devs);
662                                 break;
663                         default:
664                                 break;
665                         }
666                 }
667                 break;
668         default:
669                 dev_err(madera->dev, "Unknown device ID: %x\n", hwid);
670                 ret = -EINVAL;
671                 goto err_reset;
672         }
673
674         if (!n_devs) {
675                 dev_err(madera->dev, "Device ID 0x%x not a %s\n", hwid,
676                         madera->type_name);
677                 ret = -ENODEV;
678                 goto err_reset;
679         }
680
681         /*
682          * It looks like a device we support. If we don't have a hard reset
683          * we can now attempt a soft reset.
684          */
685         if (!madera->pdata.reset || madera->reset_errata) {
686                 ret = madera_soft_reset(madera);
687                 if (ret)
688                         goto err_reset;
689         }
690
691         ret = madera_wait_for_boot(madera);
692         if (ret) {
693                 dev_err(madera->dev, "Failed to clear boot done: %d\n", ret);
694                 goto err_reset;
695         }
696
697         ret = regmap_read(madera->regmap, MADERA_HARDWARE_REVISION,
698                           &madera->rev);
699         if (ret) {
700                 dev_err(dev, "Failed to read revision register: %d\n", ret);
701                 goto err_reset;
702         }
703         madera->rev &= MADERA_HW_REVISION_MASK;
704
705         dev_info(dev, "%s silicon revision %d\n", madera->type_name,
706                  madera->rev);
707
708         /* Apply hardware patch */
709         if (patch_fn) {
710                 ret = patch_fn(madera);
711                 if (ret) {
712                         dev_err(madera->dev, "Failed to apply patch %d\n", ret);
713                         goto err_reset;
714                 }
715         }
716
717         /* Init 32k clock sourced from MCLK2 */
718         ret = clk_prepare_enable(madera->mclk[MADERA_MCLK2].clk);
719         if (ret) {
720                 dev_err(madera->dev, "Failed to enable 32k clock: %d\n", ret);
721                 goto err_reset;
722         }
723
724         ret = regmap_update_bits(madera->regmap,
725                         MADERA_CLOCK_32K_1,
726                         MADERA_CLK_32K_ENA_MASK | MADERA_CLK_32K_SRC_MASK,
727                         MADERA_CLK_32K_ENA | MADERA_32KZ_MCLK2);
728         if (ret) {
729                 dev_err(madera->dev, "Failed to init 32k clock: %d\n", ret);
730                 goto err_clock;
731         }
732
733         pm_runtime_set_active(madera->dev);
734         pm_runtime_enable(madera->dev);
735         pm_runtime_set_autosuspend_delay(madera->dev, 100);
736         pm_runtime_use_autosuspend(madera->dev);
737
738         /* No devm_ because we need to control shutdown order of children */
739         ret = mfd_add_devices(madera->dev, PLATFORM_DEVID_NONE,
740                               mfd_devs, n_devs,
741                               NULL, 0, NULL);
742         if (ret) {
743                 dev_err(madera->dev, "Failed to add subdevices: %d\n", ret);
744                 goto err_pm_runtime;
745         }
746
747         return 0;
748
749 err_pm_runtime:
750         pm_runtime_disable(madera->dev);
751 err_clock:
752         clk_disable_unprepare(madera->mclk[MADERA_MCLK2].clk);
753 err_reset:
754         madera_enable_hard_reset(madera);
755         regulator_disable(madera->dcvdd);
756 err_enable:
757         regulator_bulk_disable(madera->num_core_supplies,
758                                madera->core_supplies);
759 err_dcvdd:
760         regulator_put(madera->dcvdd);
761 err_devs:
762         mfd_remove_devices(dev);
763
764         return ret;
765 }
766 EXPORT_SYMBOL_GPL(madera_dev_init);
767
768 int madera_dev_exit(struct madera *madera)
769 {
770         /* Prevent any IRQs being serviced while we clean up */
771         disable_irq(madera->irq);
772
773         pm_runtime_get_sync(madera->dev);
774
775         mfd_remove_devices(madera->dev);
776
777         pm_runtime_disable(madera->dev);
778
779         regulator_disable(madera->dcvdd);
780         regulator_put(madera->dcvdd);
781
782         mfd_remove_devices_late(madera->dev);
783
784         pm_runtime_set_suspended(madera->dev);
785         pm_runtime_put_noidle(madera->dev);
786
787         clk_disable_unprepare(madera->mclk[MADERA_MCLK2].clk);
788
789         madera_enable_hard_reset(madera);
790
791         regulator_bulk_disable(madera->num_core_supplies,
792                                madera->core_supplies);
793         return 0;
794 }
795 EXPORT_SYMBOL_GPL(madera_dev_exit);
796
797 MODULE_DESCRIPTION("Madera core MFD driver");
798 MODULE_AUTHOR("Richard Fitzgerald <rf@opensource.cirrus.com>");
799 MODULE_LICENSE("GPL v2");