Lines Matching refs:madera

138 static int madera_wait_for_boot(struct madera *madera)  in madera_wait_for_boot()  argument
148 ret = regmap_read_poll_timeout(madera->regmap, in madera_wait_for_boot()
156 dev_err(madera->dev, "Polling BOOT_DONE_STS failed: %d\n", ret); in madera_wait_for_boot()
162 regmap_write(madera->regmap, MADERA_IRQ1_STATUS_1, in madera_wait_for_boot()
165 pm_runtime_mark_last_busy(madera->dev); in madera_wait_for_boot()
170 static int madera_soft_reset(struct madera *madera) in madera_soft_reset() argument
174 ret = regmap_write(madera->regmap, MADERA_SOFTWARE_RESET, 0); in madera_soft_reset()
176 dev_err(madera->dev, "Failed to soft reset device: %d\n", ret); in madera_soft_reset()
186 static void madera_enable_hard_reset(struct madera *madera) in madera_enable_hard_reset() argument
188 if (!madera->pdata.reset) in madera_enable_hard_reset()
196 gpiod_set_raw_value_cansleep(madera->pdata.reset, 0); in madera_enable_hard_reset()
199 static void madera_disable_hard_reset(struct madera *madera) in madera_disable_hard_reset() argument
201 if (!madera->pdata.reset) in madera_disable_hard_reset()
204 gpiod_set_raw_value_cansleep(madera->pdata.reset, 1); in madera_disable_hard_reset()
210 struct madera *madera = dev_get_drvdata(dev); in madera_runtime_resume() local
215 ret = regulator_enable(madera->dcvdd); in madera_runtime_resume()
221 regcache_cache_only(madera->regmap, false); in madera_runtime_resume()
222 regcache_cache_only(madera->regmap_32bit, false); in madera_runtime_resume()
224 ret = madera_wait_for_boot(madera); in madera_runtime_resume()
228 ret = regcache_sync(madera->regmap); in madera_runtime_resume()
234 ret = regcache_sync(madera->regmap_32bit); in madera_runtime_resume()
243 regcache_cache_only(madera->regmap_32bit, true); in madera_runtime_resume()
244 regcache_cache_only(madera->regmap, true); in madera_runtime_resume()
245 regulator_disable(madera->dcvdd); in madera_runtime_resume()
252 struct madera *madera = dev_get_drvdata(dev); in madera_runtime_suspend() local
254 dev_dbg(madera->dev, "Entering sleep mode\n"); in madera_runtime_suspend()
256 regcache_cache_only(madera->regmap, true); in madera_runtime_suspend()
257 regcache_mark_dirty(madera->regmap); in madera_runtime_suspend()
258 regcache_cache_only(madera->regmap_32bit, true); in madera_runtime_suspend()
259 regcache_mark_dirty(madera->regmap_32bit); in madera_runtime_suspend()
261 regulator_disable(madera->dcvdd); in madera_runtime_suspend()
283 static int madera_get_reset_gpio(struct madera *madera) in madera_get_reset_gpio() argument
288 if (madera->pdata.reset) in madera_get_reset_gpio()
291 reset = devm_gpiod_get_optional(madera->dev, "reset", GPIOD_OUT_LOW); in madera_get_reset_gpio()
295 dev_err(madera->dev, "Failed to request /RESET: %d\n", in madera_get_reset_gpio()
306 dev_warn(madera->dev, in madera_get_reset_gpio()
309 madera->pdata.reset = reset; in madera_get_reset_gpio()
314 static void madera_set_micbias_info(struct madera *madera) in madera_set_micbias_info() argument
320 switch (madera->type) { in madera_set_micbias_info()
322 madera->num_micbias = 2; in madera_set_micbias_info()
323 madera->num_childbias[0] = 2; in madera_set_micbias_info()
324 madera->num_childbias[1] = 2; in madera_set_micbias_info()
328 madera->num_micbias = 4; in madera_set_micbias_info()
333 madera->num_micbias = 2; in madera_set_micbias_info()
334 madera->num_childbias[0] = 4; in madera_set_micbias_info()
335 madera->num_childbias[1] = 4; in madera_set_micbias_info()
342 int madera_dev_init(struct madera *madera) in madera_dev_init() argument
344 struct device *dev = madera->dev; in madera_dev_init()
346 int (*patch_fn)(struct madera *) = NULL; in madera_dev_init()
351 dev_set_drvdata(madera->dev, madera); in madera_dev_init()
352 BLOCKING_INIT_NOTIFIER_HEAD(&madera->notifier); in madera_dev_init()
353 madera_set_micbias_info(madera); in madera_dev_init()
359 if (dev_get_platdata(madera->dev)) { in madera_dev_init()
360 memcpy(&madera->pdata, dev_get_platdata(madera->dev), in madera_dev_init()
361 sizeof(madera->pdata)); in madera_dev_init()
364 ret = madera_get_reset_gpio(madera); in madera_dev_init()
368 regcache_cache_only(madera->regmap, true); in madera_dev_init()
369 regcache_cache_only(madera->regmap_32bit, true); in madera_dev_init()
372 madera->core_supplies[i].supply = madera_core_supplies[i]; in madera_dev_init()
374 madera->num_core_supplies = ARRAY_SIZE(madera_core_supplies); in madera_dev_init()
381 switch (madera->type) { in madera_dev_init()
388 ret = mfd_add_devices(madera->dev, PLATFORM_DEVID_NONE, in madera_dev_init()
399 dev_err(madera->dev, "Unknown device type %d\n", madera->type); in madera_dev_init()
403 ret = devm_regulator_bulk_get(dev, madera->num_core_supplies, in madera_dev_init()
404 madera->core_supplies); in madera_dev_init()
415 madera->dcvdd = regulator_get(madera->dev, "DCVDD"); in madera_dev_init()
416 if (IS_ERR(madera->dcvdd)) { in madera_dev_init()
417 ret = PTR_ERR(madera->dcvdd); in madera_dev_init()
422 ret = regulator_bulk_enable(madera->num_core_supplies, in madera_dev_init()
423 madera->core_supplies); in madera_dev_init()
429 ret = regulator_enable(madera->dcvdd); in madera_dev_init()
435 madera_disable_hard_reset(madera); in madera_dev_init()
437 regcache_cache_only(madera->regmap, false); in madera_dev_init()
438 regcache_cache_only(madera->regmap_32bit, false); in madera_dev_init()
444 ret = regmap_read(madera->regmap, MADERA_SOFTWARE_RESET, &hwid); in madera_dev_init()
453 switch (madera->type) { in madera_dev_init()
466 switch (madera->type) { in madera_dev_init()
480 switch (madera->type) { in madera_dev_init()
493 dev_err(madera->dev, "Unknown device ID: %x\n", hwid); in madera_dev_init()
499 dev_err(madera->dev, "Device ID 0x%x not a %s\n", hwid, in madera_dev_init()
500 madera->type_name); in madera_dev_init()
509 if (!madera->pdata.reset) { in madera_dev_init()
510 ret = madera_soft_reset(madera); in madera_dev_init()
515 ret = madera_wait_for_boot(madera); in madera_dev_init()
517 dev_err(madera->dev, "Device failed initial boot: %d\n", ret); in madera_dev_init()
521 ret = regmap_read(madera->regmap, MADERA_HARDWARE_REVISION, in madera_dev_init()
522 &madera->rev); in madera_dev_init()
527 madera->rev &= MADERA_HW_REVISION_MASK; in madera_dev_init()
529 dev_info(dev, "%s silicon revision %d\n", madera->type_name, in madera_dev_init()
530 madera->rev); in madera_dev_init()
534 ret = patch_fn(madera); in madera_dev_init()
536 dev_err(madera->dev, "Failed to apply patch %d\n", ret); in madera_dev_init()
542 ret = regmap_update_bits(madera->regmap, in madera_dev_init()
547 dev_err(madera->dev, "Failed to init 32k clock: %d\n", ret); in madera_dev_init()
551 pm_runtime_set_active(madera->dev); in madera_dev_init()
552 pm_runtime_enable(madera->dev); in madera_dev_init()
553 pm_runtime_set_autosuspend_delay(madera->dev, 100); in madera_dev_init()
554 pm_runtime_use_autosuspend(madera->dev); in madera_dev_init()
557 ret = mfd_add_devices(madera->dev, PLATFORM_DEVID_NONE, in madera_dev_init()
561 dev_err(madera->dev, "Failed to add subdevices: %d\n", ret); in madera_dev_init()
568 pm_runtime_disable(madera->dev); in madera_dev_init()
570 madera_enable_hard_reset(madera); in madera_dev_init()
571 regulator_disable(madera->dcvdd); in madera_dev_init()
573 regulator_bulk_disable(madera->num_core_supplies, in madera_dev_init()
574 madera->core_supplies); in madera_dev_init()
576 regulator_put(madera->dcvdd); in madera_dev_init()
584 int madera_dev_exit(struct madera *madera) in madera_dev_exit() argument
587 disable_irq(madera->irq); in madera_dev_exit()
593 pm_runtime_disable(madera->dev); in madera_dev_exit()
595 regulator_disable(madera->dcvdd); in madera_dev_exit()
596 regulator_put(madera->dcvdd); in madera_dev_exit()
598 mfd_remove_devices(madera->dev); in madera_dev_exit()
599 madera_enable_hard_reset(madera); in madera_dev_exit()
601 regulator_bulk_disable(madera->num_core_supplies, in madera_dev_exit()
602 madera->core_supplies); in madera_dev_exit()