Lines Matching refs:madera

202 static int madera_wait_for_boot(struct madera *madera)  in madera_wait_for_boot()  argument
216 regmap_read(madera->regmap, MADERA_IRQ1_RAW_STATUS_1, &val); in madera_wait_for_boot()
221 regmap_read(madera->regmap, MADERA_IRQ1_RAW_STATUS_1, &val); in madera_wait_for_boot()
225 dev_err(madera->dev, "Polling BOOT_DONE_STS timed out\n"); in madera_wait_for_boot()
233 regmap_write(madera->regmap, MADERA_IRQ1_STATUS_1, in madera_wait_for_boot()
236 pm_runtime_mark_last_busy(madera->dev); in madera_wait_for_boot()
241 static int madera_soft_reset(struct madera *madera) in madera_soft_reset() argument
245 ret = regmap_write(madera->regmap, MADERA_SOFTWARE_RESET, 0); in madera_soft_reset()
247 dev_err(madera->dev, "Failed to soft reset device: %d\n", ret); in madera_soft_reset()
257 static void madera_enable_hard_reset(struct madera *madera) in madera_enable_hard_reset() argument
259 if (!madera->pdata.reset) in madera_enable_hard_reset()
267 gpiod_set_raw_value_cansleep(madera->pdata.reset, 0); in madera_enable_hard_reset()
270 static void madera_disable_hard_reset(struct madera *madera) in madera_disable_hard_reset() argument
272 if (!madera->pdata.reset) in madera_disable_hard_reset()
275 gpiod_set_raw_value_cansleep(madera->pdata.reset, 1); in madera_disable_hard_reset()
281 struct madera *madera = dev_get_drvdata(dev); in madera_runtime_resume() local
286 ret = regulator_enable(madera->dcvdd); in madera_runtime_resume()
292 regcache_cache_only(madera->regmap, false); in madera_runtime_resume()
293 regcache_cache_only(madera->regmap_32bit, false); in madera_runtime_resume()
295 ret = madera_wait_for_boot(madera); in madera_runtime_resume()
299 ret = regcache_sync(madera->regmap); in madera_runtime_resume()
305 ret = regcache_sync(madera->regmap_32bit); in madera_runtime_resume()
314 regcache_cache_only(madera->regmap_32bit, true); in madera_runtime_resume()
315 regcache_cache_only(madera->regmap, true); in madera_runtime_resume()
316 regulator_disable(madera->dcvdd); in madera_runtime_resume()
323 struct madera *madera = dev_get_drvdata(dev); in madera_runtime_suspend() local
325 dev_dbg(madera->dev, "Entering sleep mode\n"); in madera_runtime_suspend()
327 regcache_cache_only(madera->regmap, true); in madera_runtime_suspend()
328 regcache_mark_dirty(madera->regmap); in madera_runtime_suspend()
329 regcache_cache_only(madera->regmap_32bit, true); in madera_runtime_suspend()
330 regcache_mark_dirty(madera->regmap_32bit); in madera_runtime_suspend()
332 regulator_disable(madera->dcvdd); in madera_runtime_suspend()
359 static int madera_get_reset_gpio(struct madera *madera) in madera_get_reset_gpio() argument
364 if (madera->pdata.reset) in madera_get_reset_gpio()
367 reset = devm_gpiod_get_optional(madera->dev, "reset", GPIOD_OUT_LOW); in madera_get_reset_gpio()
371 dev_err(madera->dev, "Failed to request /RESET: %d\n", in madera_get_reset_gpio()
382 dev_warn(madera->dev, in madera_get_reset_gpio()
385 madera->pdata.reset = reset; in madera_get_reset_gpio()
390 static void madera_set_micbias_info(struct madera *madera) in madera_set_micbias_info() argument
396 switch (madera->type) { in madera_set_micbias_info()
398 madera->num_micbias = 1; in madera_set_micbias_info()
399 madera->num_childbias[0] = 3; in madera_set_micbias_info()
402 madera->num_micbias = 2; in madera_set_micbias_info()
403 madera->num_childbias[0] = 2; in madera_set_micbias_info()
404 madera->num_childbias[1] = 2; in madera_set_micbias_info()
408 madera->num_micbias = 4; in madera_set_micbias_info()
413 madera->num_micbias = 2; in madera_set_micbias_info()
414 madera->num_childbias[0] = 4; in madera_set_micbias_info()
415 madera->num_childbias[1] = 4; in madera_set_micbias_info()
420 madera->num_micbias = 2; in madera_set_micbias_info()
421 madera->num_childbias[0] = 4; in madera_set_micbias_info()
422 madera->num_childbias[1] = 2; in madera_set_micbias_info()
429 int madera_dev_init(struct madera *madera) in madera_dev_init() argument
431 struct device *dev = madera->dev; in madera_dev_init()
433 int (*patch_fn)(struct madera *) = NULL; in madera_dev_init()
438 dev_set_drvdata(madera->dev, madera); in madera_dev_init()
439 BLOCKING_INIT_NOTIFIER_HEAD(&madera->notifier); in madera_dev_init()
440 mutex_init(&madera->dapm_ptr_lock); in madera_dev_init()
442 madera_set_micbias_info(madera); in madera_dev_init()
448 if (dev_get_platdata(madera->dev)) { in madera_dev_init()
449 memcpy(&madera->pdata, dev_get_platdata(madera->dev), in madera_dev_init()
450 sizeof(madera->pdata)); in madera_dev_init()
453 ret = madera_get_reset_gpio(madera); in madera_dev_init()
457 regcache_cache_only(madera->regmap, true); in madera_dev_init()
458 regcache_cache_only(madera->regmap_32bit, true); in madera_dev_init()
461 madera->core_supplies[i].supply = madera_core_supplies[i]; in madera_dev_init()
463 madera->num_core_supplies = ARRAY_SIZE(madera_core_supplies); in madera_dev_init()
470 switch (madera->type) { in madera_dev_init()
481 ret = mfd_add_devices(madera->dev, PLATFORM_DEVID_NONE, in madera_dev_init()
492 dev_err(madera->dev, "Unknown device type %d\n", madera->type); in madera_dev_init()
496 ret = devm_regulator_bulk_get(dev, madera->num_core_supplies, in madera_dev_init()
497 madera->core_supplies); in madera_dev_init()
508 madera->dcvdd = regulator_get(madera->dev, "DCVDD"); in madera_dev_init()
509 if (IS_ERR(madera->dcvdd)) { in madera_dev_init()
510 ret = PTR_ERR(madera->dcvdd); in madera_dev_init()
515 ret = regulator_bulk_enable(madera->num_core_supplies, in madera_dev_init()
516 madera->core_supplies); in madera_dev_init()
522 ret = regulator_enable(madera->dcvdd); in madera_dev_init()
528 madera_disable_hard_reset(madera); in madera_dev_init()
530 regcache_cache_only(madera->regmap, false); in madera_dev_init()
531 regcache_cache_only(madera->regmap_32bit, false); in madera_dev_init()
537 ret = regmap_read(madera->regmap, MADERA_SOFTWARE_RESET, &hwid); in madera_dev_init()
546 switch (madera->type) { in madera_dev_init()
559 switch (madera->type) { in madera_dev_init()
572 switch (madera->type) { in madera_dev_init()
586 switch (madera->type) { in madera_dev_init()
600 switch (madera->type) { in madera_dev_init()
614 dev_err(madera->dev, "Unknown device ID: %x\n", hwid); in madera_dev_init()
620 dev_err(madera->dev, "Device ID 0x%x not a %s\n", hwid, in madera_dev_init()
621 madera->type_name); in madera_dev_init()
630 if (!madera->pdata.reset) { in madera_dev_init()
631 ret = madera_soft_reset(madera); in madera_dev_init()
636 ret = madera_wait_for_boot(madera); in madera_dev_init()
638 dev_err(madera->dev, "Device failed initial boot: %d\n", ret); in madera_dev_init()
642 ret = regmap_read(madera->regmap, MADERA_HARDWARE_REVISION, in madera_dev_init()
643 &madera->rev); in madera_dev_init()
648 madera->rev &= MADERA_HW_REVISION_MASK; in madera_dev_init()
650 dev_info(dev, "%s silicon revision %d\n", madera->type_name, in madera_dev_init()
651 madera->rev); in madera_dev_init()
655 ret = patch_fn(madera); in madera_dev_init()
657 dev_err(madera->dev, "Failed to apply patch %d\n", ret); in madera_dev_init()
663 ret = regmap_update_bits(madera->regmap, in madera_dev_init()
668 dev_err(madera->dev, "Failed to init 32k clock: %d\n", ret); in madera_dev_init()
672 pm_runtime_set_active(madera->dev); in madera_dev_init()
673 pm_runtime_enable(madera->dev); in madera_dev_init()
674 pm_runtime_set_autosuspend_delay(madera->dev, 100); in madera_dev_init()
675 pm_runtime_use_autosuspend(madera->dev); in madera_dev_init()
678 ret = mfd_add_devices(madera->dev, PLATFORM_DEVID_NONE, in madera_dev_init()
682 dev_err(madera->dev, "Failed to add subdevices: %d\n", ret); in madera_dev_init()
689 pm_runtime_disable(madera->dev); in madera_dev_init()
691 madera_enable_hard_reset(madera); in madera_dev_init()
692 regulator_disable(madera->dcvdd); in madera_dev_init()
694 regulator_bulk_disable(madera->num_core_supplies, in madera_dev_init()
695 madera->core_supplies); in madera_dev_init()
697 regulator_put(madera->dcvdd); in madera_dev_init()
705 int madera_dev_exit(struct madera *madera) in madera_dev_exit() argument
708 disable_irq(madera->irq); in madera_dev_exit()
714 pm_runtime_disable(madera->dev); in madera_dev_exit()
716 regulator_disable(madera->dcvdd); in madera_dev_exit()
717 regulator_put(madera->dcvdd); in madera_dev_exit()
719 mfd_remove_devices(madera->dev); in madera_dev_exit()
720 madera_enable_hard_reset(madera); in madera_dev_exit()
722 regulator_bulk_disable(madera->num_core_supplies, in madera_dev_exit()
723 madera->core_supplies); in madera_dev_exit()