Lines Matching refs:madera

25 #include <linux/mfd/madera/core.h>
26 #include <linux/mfd/madera/registers.h>
28 #include "madera.h"
48 .name = "madera-ldo1",
60 { .name = "madera-pinctrl", },
61 { .name = "madera-irq", },
62 { .name = "madera-gpio", },
64 .name = "madera-extcon",
84 { .name = "madera-pinctrl", },
85 { .name = "madera-irq", },
86 { .name = "madera-micsupp", },
87 { .name = "madera-gpio", },
89 .name = "madera-extcon",
112 { .name = "madera-pinctrl", },
113 { .name = "madera-irq", },
114 { .name = "madera-micsupp", },
115 { .name = "madera-gpio", },
117 .name = "madera-extcon",
138 { .name = "madera-pinctrl", },
139 { .name = "madera-irq", },
140 { .name = "madera-micsupp", },
141 { .name = "madera-gpio", },
143 .name = "madera-extcon",
161 { .name = "madera-pinctrl", },
162 { .name = "madera-irq", },
163 { .name = "madera-micsupp", },
164 { .name = "madera-gpio", },
166 .name = "madera-extcon",
177 /* Used by madera-i2c and madera-spi drivers */
208 static int madera_wait_for_boot_noack(struct madera *madera)
222 regmap_read(madera->regmap, MADERA_IRQ1_RAW_STATUS_1, &val);
227 regmap_read(madera->regmap, MADERA_IRQ1_RAW_STATUS_1, &val);
231 dev_err(madera->dev, "Polling BOOT_DONE_STS timed out\n");
238 static int madera_wait_for_boot(struct madera *madera)
240 int ret = madera_wait_for_boot_noack(madera);
246 regmap_write(madera->regmap, MADERA_IRQ1_STATUS_1,
249 pm_runtime_mark_last_busy(madera->dev);
254 static int madera_soft_reset(struct madera *madera)
258 ret = regmap_write(madera->regmap, MADERA_SOFTWARE_RESET, 0);
260 dev_err(madera->dev, "Failed to soft reset device: %d\n", ret);
270 static void madera_enable_hard_reset(struct madera *madera)
277 gpiod_set_raw_value_cansleep(madera->pdata.reset, 0);
280 static void madera_disable_hard_reset(struct madera *madera)
282 gpiod_set_raw_value_cansleep(madera->pdata.reset, 1);
289 struct madera *madera = dev_get_drvdata(dev);
294 ret = regulator_enable(madera->dcvdd);
300 regcache_cache_only(madera->regmap, false);
301 regcache_cache_only(madera->regmap_32bit, false);
305 ret = madera_wait_for_boot(madera);
309 ret = regcache_sync(madera->regmap);
315 ret = regcache_sync(madera->regmap_32bit);
324 regcache_cache_only(madera->regmap_32bit, true);
325 regcache_cache_only(madera->regmap, true);
326 regulator_disable(madera->dcvdd);
333 struct madera *madera = dev_get_drvdata(dev);
335 dev_dbg(madera->dev, "Entering sleep mode\n");
337 regcache_cache_only(madera->regmap, true);
338 regcache_mark_dirty(madera->regmap);
339 regcache_cache_only(madera->regmap_32bit, true);
340 regcache_mark_dirty(madera->regmap_32bit);
342 regulator_disable(madera->dcvdd);
369 static int madera_get_reset_gpio(struct madera *madera)
373 if (madera->pdata.reset)
376 reset = devm_gpiod_get_optional(madera->dev, "reset", GPIOD_OUT_LOW);
378 return dev_err_probe(madera->dev, PTR_ERR(reset),
387 dev_warn(madera->dev,
390 madera->pdata.reset = reset;
395 static void madera_set_micbias_info(struct madera *madera)
401 switch (madera->type) {
403 madera->num_micbias = 1;
404 madera->num_childbias[0] = 3;
407 madera->num_micbias = 2;
408 madera->num_childbias[0] = 2;
409 madera->num_childbias[1] = 2;
413 madera->num_micbias = 4;
418 madera->num_micbias = 2;
419 madera->num_childbias[0] = 4;
420 madera->num_childbias[1] = 4;
425 madera->num_micbias = 2;
426 madera->num_childbias[0] = 4;
427 madera->num_childbias[1] = 2;
434 int madera_dev_init(struct madera *madera)
436 struct device *dev = madera->dev;
438 int (*patch_fn)(struct madera *) = NULL;
443 dev_set_drvdata(madera->dev, madera);
444 BLOCKING_INIT_NOTIFIER_HEAD(&madera->notifier);
445 mutex_init(&madera->dapm_ptr_lock);
447 madera_set_micbias_info(madera);
453 if (dev_get_platdata(madera->dev)) {
454 memcpy(&madera->pdata, dev_get_platdata(madera->dev),
455 sizeof(madera->pdata));
458 madera->mclk[MADERA_MCLK1].id = "mclk1";
459 madera->mclk[MADERA_MCLK2].id = "mclk2";
460 madera->mclk[MADERA_MCLK3].id = "mclk3";
462 ret = devm_clk_bulk_get_optional(madera->dev, ARRAY_SIZE(madera->mclk),
463 madera->mclk);
465 dev_err(madera->dev, "Failed to get clocks: %d\n", ret);
470 if (!madera->mclk[MADERA_MCLK2].clk)
471 dev_warn(madera->dev, "Missing MCLK2, requires 32kHz clock\n");
473 ret = madera_get_reset_gpio(madera);
477 regcache_cache_only(madera->regmap, true);
478 regcache_cache_only(madera->regmap_32bit, true);
481 madera->core_supplies[i].supply = madera_core_supplies[i];
483 madera->num_core_supplies = ARRAY_SIZE(madera_core_supplies);
490 switch (madera->type) {
501 ret = mfd_add_devices(madera->dev, PLATFORM_DEVID_NONE,
512 dev_err(madera->dev, "Unknown device type %d\n", madera->type);
516 ret = devm_regulator_bulk_get(dev, madera->num_core_supplies,
517 madera->core_supplies);
528 madera->dcvdd = regulator_get(madera->dev, "DCVDD");
529 if (IS_ERR(madera->dcvdd)) {
530 ret = PTR_ERR(madera->dcvdd);
535 ret = regulator_bulk_enable(madera->num_core_supplies,
536 madera->core_supplies);
542 ret = regulator_enable(madera->dcvdd);
548 madera_disable_hard_reset(madera);
550 regcache_cache_only(madera->regmap, false);
551 regcache_cache_only(madera->regmap_32bit, false);
553 ret = madera_wait_for_boot_noack(madera);
555 dev_err(madera->dev, "Device failed initial boot: %d\n", ret);
563 ret = regmap_read(madera->regmap, MADERA_SOFTWARE_RESET, &hwid);
572 switch (madera->type) {
585 switch (madera->type) {
598 switch (madera->type) {
612 switch (madera->type) {
626 switch (madera->type) {
640 dev_err(madera->dev, "Unknown device ID: %x\n", hwid);
646 dev_err(madera->dev, "Device ID 0x%x not a %s\n", hwid,
647 madera->type_name);
656 if (!madera->pdata.reset) {
657 ret = madera_soft_reset(madera);
662 ret = madera_wait_for_boot(madera);
664 dev_err(madera->dev, "Failed to clear boot done: %d\n", ret);
668 ret = regmap_read(madera->regmap, MADERA_HARDWARE_REVISION,
669 &madera->rev);
674 madera->rev &= MADERA_HW_REVISION_MASK;
676 dev_info(dev, "%s silicon revision %d\n", madera->type_name,
677 madera->rev);
681 ret = patch_fn(madera);
683 dev_err(madera->dev, "Failed to apply patch %d\n", ret);
689 ret = clk_prepare_enable(madera->mclk[MADERA_MCLK2].clk);
691 dev_err(madera->dev, "Failed to enable 32k clock: %d\n", ret);
695 ret = regmap_update_bits(madera->regmap,
700 dev_err(madera->dev, "Failed to init 32k clock: %d\n", ret);
704 pm_runtime_set_active(madera->dev);
705 pm_runtime_enable(madera->dev);
706 pm_runtime_set_autosuspend_delay(madera->dev, 100);
707 pm_runtime_use_autosuspend(madera->dev);
710 ret = mfd_add_devices(madera->dev, PLATFORM_DEVID_NONE,
714 dev_err(madera->dev, "Failed to add subdevices: %d\n", ret);
721 pm_runtime_disable(madera->dev);
723 clk_disable_unprepare(madera->mclk[MADERA_MCLK2].clk);
725 madera_enable_hard_reset(madera);
726 regulator_disable(madera->dcvdd);
728 regulator_bulk_disable(madera->num_core_supplies,
729 madera->core_supplies);
731 regulator_put(madera->dcvdd);
739 int madera_dev_exit(struct madera *madera)
742 disable_irq(madera->irq);
744 pm_runtime_get_sync(madera->dev);
746 mfd_remove_devices(madera->dev);
748 pm_runtime_disable(madera->dev);
750 regulator_disable(madera->dcvdd);
751 regulator_put(madera->dcvdd);
753 mfd_remove_devices_late(madera->dev);
755 pm_runtime_set_suspended(madera->dev);
756 pm_runtime_put_noidle(madera->dev);
758 clk_disable_unprepare(madera->mclk[MADERA_MCLK2].clk);
760 madera_enable_hard_reset(madera);
762 regulator_bulk_disable(madera->num_core_supplies,
763 madera->core_supplies);