Lines Matching refs:madera
24 #include <linux/mfd/madera/core.h>
25 #include <linux/mfd/madera/registers.h>
27 #include "madera.h"
50 .name = "madera-ldo1",
62 { .name = "madera-pinctrl", },
63 { .name = "madera-irq", },
64 { .name = "madera-gpio", },
66 .name = "madera-extcon",
86 { .name = "madera-pinctrl", },
87 { .name = "madera-irq", },
88 { .name = "madera-micsupp", },
89 { .name = "madera-gpio", },
91 .name = "madera-extcon",
114 { .name = "madera-pinctrl", },
115 { .name = "madera-irq", },
116 { .name = "madera-micsupp", },
117 { .name = "madera-gpio", },
119 .name = "madera-extcon",
140 { .name = "madera-pinctrl", },
141 { .name = "madera-irq", },
142 { .name = "madera-micsupp", },
143 { .name = "madera-gpio", },
145 .name = "madera-extcon",
163 { .name = "madera-pinctrl", },
164 { .name = "madera-irq", },
165 { .name = "madera-micsupp", },
166 { .name = "madera-gpio", },
168 .name = "madera-extcon",
179 /* Used by madera-i2c and madera-spi drivers */
210 static int madera_wait_for_boot_noack(struct madera *madera)
224 regmap_read(madera->regmap, MADERA_IRQ1_RAW_STATUS_1, &val);
229 regmap_read(madera->regmap, MADERA_IRQ1_RAW_STATUS_1, &val);
233 dev_err(madera->dev, "Polling BOOT_DONE_STS timed out\n");
240 static int madera_wait_for_boot(struct madera *madera)
242 int ret = madera_wait_for_boot_noack(madera);
248 regmap_write(madera->regmap, MADERA_IRQ1_STATUS_1,
251 pm_runtime_mark_last_busy(madera->dev);
256 static int madera_soft_reset(struct madera *madera)
260 ret = regmap_write(madera->regmap, MADERA_SOFTWARE_RESET, 0);
262 dev_err(madera->dev, "Failed to soft reset device: %d\n", ret);
272 static void madera_enable_hard_reset(struct madera *madera)
279 gpiod_set_raw_value_cansleep(madera->pdata.reset, 0);
282 static void madera_disable_hard_reset(struct madera *madera)
284 gpiod_set_raw_value_cansleep(madera->pdata.reset, 1);
291 struct madera *madera = dev_get_drvdata(dev);
296 if (!madera->reset_errata)
297 madera_enable_hard_reset(madera);
299 ret = regulator_enable(madera->dcvdd);
305 regcache_cache_only(madera->regmap, false);
306 regcache_cache_only(madera->regmap_32bit, false);
308 if (madera->reset_errata)
311 madera_disable_hard_reset(madera);
313 if (!madera->pdata.reset || madera->reset_errata) {
314 ret = madera_wait_for_boot(madera);
318 ret = madera_soft_reset(madera);
325 ret = madera_wait_for_boot(madera);
329 ret = regcache_sync(madera->regmap);
335 ret = regcache_sync(madera->regmap_32bit);
344 regcache_cache_only(madera->regmap_32bit, true);
345 regcache_cache_only(madera->regmap, true);
346 regulator_disable(madera->dcvdd);
353 struct madera *madera = dev_get_drvdata(dev);
355 dev_dbg(madera->dev, "Entering sleep mode\n");
357 regcache_cache_only(madera->regmap, true);
358 regcache_mark_dirty(madera->regmap);
359 regcache_cache_only(madera->regmap_32bit, true);
360 regcache_mark_dirty(madera->regmap_32bit);
362 regulator_disable(madera->dcvdd);
389 static int madera_get_reset_gpio(struct madera *madera)
393 if (madera->pdata.reset)
396 reset = devm_gpiod_get_optional(madera->dev, "reset", GPIOD_OUT_LOW);
398 return dev_err_probe(madera->dev, PTR_ERR(reset),
407 dev_warn(madera->dev,
410 madera->pdata.reset = reset;
415 static void madera_set_micbias_info(struct madera *madera)
421 switch (madera->type) {
423 madera->num_micbias = 1;
424 madera->num_childbias[0] = 3;
427 madera->num_micbias = 2;
428 madera->num_childbias[0] = 2;
429 madera->num_childbias[1] = 2;
433 madera->num_micbias = 4;
438 madera->num_micbias = 2;
439 madera->num_childbias[0] = 4;
440 madera->num_childbias[1] = 4;
445 madera->num_micbias = 2;
446 madera->num_childbias[0] = 4;
447 madera->num_childbias[1] = 2;
454 int madera_dev_init(struct madera *madera)
456 struct device *dev = madera->dev;
458 int (*patch_fn)(struct madera *) = NULL;
463 dev_set_drvdata(madera->dev, madera);
464 BLOCKING_INIT_NOTIFIER_HEAD(&madera->notifier);
465 mutex_init(&madera->dapm_ptr_lock);
467 madera_set_micbias_info(madera);
473 if (dev_get_platdata(madera->dev)) {
474 memcpy(&madera->pdata, dev_get_platdata(madera->dev),
475 sizeof(madera->pdata));
478 madera->mclk[MADERA_MCLK1].id = "mclk1";
479 madera->mclk[MADERA_MCLK2].id = "mclk2";
480 madera->mclk[MADERA_MCLK3].id = "mclk3";
482 ret = devm_clk_bulk_get_optional(madera->dev, ARRAY_SIZE(madera->mclk),
483 madera->mclk);
485 dev_err(madera->dev, "Failed to get clocks: %d\n", ret);
490 if (!madera->mclk[MADERA_MCLK2].clk)
491 dev_warn(madera->dev, "Missing MCLK2, requires 32kHz clock\n");
493 ret = madera_get_reset_gpio(madera);
497 regcache_cache_only(madera->regmap, true);
498 regcache_cache_only(madera->regmap_32bit, true);
501 madera->core_supplies[i].supply = madera_core_supplies[i];
503 madera->num_core_supplies = ARRAY_SIZE(madera_core_supplies);
510 switch (madera->type) {
512 madera->reset_errata = true;
523 ret = mfd_add_devices(madera->dev, PLATFORM_DEVID_NONE,
534 dev_err(madera->dev, "Unknown device type %d\n", madera->type);
538 ret = devm_regulator_bulk_get(dev, madera->num_core_supplies,
539 madera->core_supplies);
550 madera->dcvdd = regulator_get(madera->dev, "DCVDD");
551 if (IS_ERR(madera->dcvdd)) {
552 ret = PTR_ERR(madera->dcvdd);
557 ret = regulator_bulk_enable(madera->num_core_supplies,
558 madera->core_supplies);
564 if (madera->reset_errata)
565 madera_disable_hard_reset(madera);
567 ret = regulator_enable(madera->dcvdd);
573 if (madera->reset_errata)
576 madera_disable_hard_reset(madera);
578 regcache_cache_only(madera->regmap, false);
579 regcache_cache_only(madera->regmap_32bit, false);
581 ret = madera_wait_for_boot_noack(madera);
583 dev_err(madera->dev, "Device failed initial boot: %d\n", ret);
591 ret = regmap_read(madera->regmap, MADERA_SOFTWARE_RESET, &hwid);
600 switch (madera->type) {
613 switch (madera->type) {
626 switch (madera->type) {
640 switch (madera->type) {
654 switch (madera->type) {
668 dev_err(madera->dev, "Unknown device ID: %x\n", hwid);
674 dev_err(madera->dev, "Device ID 0x%x not a %s\n", hwid,
675 madera->type_name);
684 if (!madera->pdata.reset || madera->reset_errata) {
685 ret = madera_soft_reset(madera);
690 ret = madera_wait_for_boot(madera);
692 dev_err(madera->dev, "Failed to clear boot done: %d\n", ret);
696 ret = regmap_read(madera->regmap, MADERA_HARDWARE_REVISION,
697 &madera->rev);
702 madera->rev &= MADERA_HW_REVISION_MASK;
704 dev_info(dev, "%s silicon revision %d\n", madera->type_name,
705 madera->rev);
709 ret = patch_fn(madera);
711 dev_err(madera->dev, "Failed to apply patch %d\n", ret);
717 ret = clk_prepare_enable(madera->mclk[MADERA_MCLK2].clk);
719 dev_err(madera->dev, "Failed to enable 32k clock: %d\n", ret);
723 ret = regmap_update_bits(madera->regmap,
728 dev_err(madera->dev, "Failed to init 32k clock: %d\n", ret);
732 pm_runtime_set_active(madera->dev);
733 pm_runtime_enable(madera->dev);
734 pm_runtime_set_autosuspend_delay(madera->dev, 100);
735 pm_runtime_use_autosuspend(madera->dev);
738 ret = mfd_add_devices(madera->dev, PLATFORM_DEVID_NONE,
742 dev_err(madera->dev, "Failed to add subdevices: %d\n", ret);
749 pm_runtime_disable(madera->dev);
751 clk_disable_unprepare(madera->mclk[MADERA_MCLK2].clk);
753 madera_enable_hard_reset(madera);
754 regulator_disable(madera->dcvdd);
756 regulator_bulk_disable(madera->num_core_supplies,
757 madera->core_supplies);
759 regulator_put(madera->dcvdd);
767 int madera_dev_exit(struct madera *madera)
770 disable_irq(madera->irq);
772 pm_runtime_get_sync(madera->dev);
774 mfd_remove_devices(madera->dev);
776 pm_runtime_disable(madera->dev);
778 regulator_disable(madera->dcvdd);
779 regulator_put(madera->dcvdd);
781 mfd_remove_devices_late(madera->dev);
783 pm_runtime_set_suspended(madera->dev);
784 pm_runtime_put_noidle(madera->dev);
786 clk_disable_unprepare(madera->mclk[MADERA_MCLK2].clk);
788 madera_enable_hard_reset(madera);
790 regulator_bulk_disable(madera->num_core_supplies,
791 madera->core_supplies);