Lines Matching +full:autosuspend +full:- +full:delay
1 // SPDX-License-Identifier: GPL-2.0-only
5 #include <linux/delay.h>
21 #include "max98373-sdw.h"
255 for (i = 0; i < max98373->cache_num; i++) in max98373_suspend()
256 regmap_read(max98373->regmap, max98373->cache[i].reg, &max98373->cache[i].val); in max98373_suspend()
258 regcache_cache_only(max98373->regmap, true); in max98373_suspend()
271 if (!max98373->first_hw_init) in max98373_resume()
274 if (!slave->unattach_request) in max98373_resume()
277 time = wait_for_completion_timeout(&slave->initialization_complete, in max98373_resume()
281 sdw_show_ping_status(slave->bus, true); in max98373_resume()
283 return -ETIMEDOUT; in max98373_resume()
287 slave->unattach_request = 0; in max98373_resume()
288 regcache_cache_only(max98373->regmap, false); in max98373_resume()
289 regcache_sync(max98373->regmap); in max98373_resume()
301 struct sdw_slave_prop *prop = &slave->prop; in max98373_read_prop()
307 prop->scp_int1_mask = SDW_SCP_INT1_BUS_CLASH | SDW_SCP_INT1_PARITY; in max98373_read_prop()
310 prop->source_ports = BIT(3); in max98373_read_prop()
312 prop->sink_ports = BIT(1); in max98373_read_prop()
313 prop->paging_support = true; in max98373_read_prop()
314 prop->clk_stop_timeout = 20; in max98373_read_prop()
316 nval = hweight32(prop->source_ports); in max98373_read_prop()
317 prop->src_dpn_prop = devm_kcalloc(&slave->dev, nval, in max98373_read_prop()
318 sizeof(*prop->src_dpn_prop), in max98373_read_prop()
320 if (!prop->src_dpn_prop) in max98373_read_prop()
321 return -ENOMEM; in max98373_read_prop()
324 dpn = prop->src_dpn_prop; in max98373_read_prop()
325 addr = prop->source_ports; in max98373_read_prop()
335 nval = hweight32(prop->sink_ports); in max98373_read_prop()
336 prop->sink_dpn_prop = devm_kcalloc(&slave->dev, nval, in max98373_read_prop()
337 sizeof(*prop->sink_dpn_prop), in max98373_read_prop()
339 if (!prop->sink_dpn_prop) in max98373_read_prop()
340 return -ENOMEM; in max98373_read_prop()
343 dpn = prop->sink_dpn_prop; in max98373_read_prop()
344 addr = prop->sink_ports; in max98373_read_prop()
354 prop->clk_stop_timeout = 20; in max98373_read_prop()
361 struct device *dev = &slave->dev; in max98373_io_init()
364 regcache_cache_only(max98373->regmap, false); in max98373_io_init()
365 if (max98373->first_hw_init) in max98373_io_init()
366 regcache_cache_bypass(max98373->regmap, true); in max98373_io_init()
371 if (!max98373->first_hw_init) in max98373_io_init()
381 regmap_write(max98373->regmap, MAX98373_R2025_AUDIO_IF_MODE, 3); in max98373_io_init()
383 regmap_write(max98373->regmap, MAX98373_R2047_IV_SENSE_ADC_EN, 3); in max98373_io_init()
385 regmap_write(max98373->regmap, MAX98373_R2036_SOUNDWIRE_CTRL, 5); in max98373_io_init()
387 regmap_write(max98373->regmap, MAX98373_R2028_PCM_SR_SETUP_2, 0x88); in max98373_io_init()
389 regmap_write(max98373->regmap, in max98373_io_init()
392 regmap_write(max98373->regmap, in max98373_io_init()
396 regmap_write(max98373->regmap, in max98373_io_init()
399 regmap_write(max98373->regmap, in max98373_io_init()
403 regmap_write(max98373->regmap, in max98373_io_init()
407 regmap_write(max98373->regmap, in max98373_io_init()
411 regmap_write(max98373->regmap, in max98373_io_init()
413 (max98373->i_slot << MAX98373_PCM_TX_CH_SRC_A_I_SHIFT | in max98373_io_init()
414 max98373->v_slot) & 0xFF); in max98373_io_init()
415 if (max98373->v_slot < 8) in max98373_io_init()
416 regmap_update_bits(max98373->regmap, in max98373_io_init()
418 1 << max98373->v_slot, 0); in max98373_io_init()
420 regmap_update_bits(max98373->regmap, in max98373_io_init()
422 1 << (max98373->v_slot - 8), 0); in max98373_io_init()
424 if (max98373->i_slot < 8) in max98373_io_init()
425 regmap_update_bits(max98373->regmap, in max98373_io_init()
427 1 << max98373->i_slot, 0); in max98373_io_init()
429 regmap_update_bits(max98373->regmap, in max98373_io_init()
431 1 << (max98373->i_slot - 8), 0); in max98373_io_init()
434 regmap_write(max98373->regmap, in max98373_io_init()
436 max98373->spkfb_slot & 0xFF); in max98373_io_init()
439 if (max98373->interleave_mode) in max98373_io_init()
440 regmap_update_bits(max98373->regmap, in max98373_io_init()
446 regmap_update_bits(max98373->regmap, in max98373_io_init()
450 regmap_write(max98373->regmap, MAX98373_R20B5_BDE_EN, 1); in max98373_io_init()
451 regmap_write(max98373->regmap, MAX98373_R20E2_LIMITER_EN, 1); in max98373_io_init()
453 if (max98373->first_hw_init) { in max98373_io_init()
454 regcache_cache_bypass(max98373->regmap, false); in max98373_io_init()
455 regcache_mark_dirty(max98373->regmap); in max98373_io_init()
458 max98373->first_hw_init = true; in max98373_io_init()
459 max98373->hw_init = true; in max98373_io_init()
481 dev_err(&slave->dev, "Requested clock not found. (clk_freq = %d)\n", in max98373_clock_calculate()
489 struct device *dev = &slave->dev; in max98373_clock_config()
493 clk_freq = (params->curr_dr_freq >> 1); in max98373_clock_config()
498 * use reasonable default - 12.288 Mhz in max98373_clock_config()
503 regmap_write(max98373->regmap, MAX98373_R2036_SOUNDWIRE_CTRL, value); in max98373_clock_config()
506 regmap_write(max98373->regmap, MAX98373_R2028_PCM_SR_SETUP_2, 0x88); in max98373_clock_config()
518 struct snd_soc_component *component = dai->component; in max98373_sdw_dai_hw_params()
529 return -EINVAL; in max98373_sdw_dai_hw_params()
531 if (!max98373->slave) in max98373_sdw_dai_hw_params()
532 return -EINVAL; in max98373_sdw_dai_hw_params()
536 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { in max98373_sdw_dai_hw_params()
539 if (max98373->slot) { in max98373_sdw_dai_hw_params()
540 stream_config.ch_count = max98373->slot; in max98373_sdw_dai_hw_params()
541 port_config.ch_mask = max98373->rx_mask; in max98373_sdw_dai_hw_params()
548 port_config.ch_mask = GENMASK((int)stream_config.ch_count - 1, 0); in max98373_sdw_dai_hw_params()
551 ret = sdw_stream_add_slave(max98373->slave, &stream_config, in max98373_sdw_dai_hw_params()
554 dev_err(dai->dev, "Unable to configure port\n"); in max98373_sdw_dai_hw_params()
559 dev_err(component->dev, "Unsupported channels %d\n", in max98373_sdw_dai_hw_params()
561 return -EINVAL; in max98373_sdw_dai_hw_params()
576 dev_err(component->dev, "Channel size unsupported %d\n", in max98373_sdw_dai_hw_params()
578 return -EINVAL; in max98373_sdw_dai_hw_params()
581 max98373->ch_size = snd_pcm_format_width(params_format(params)); in max98373_sdw_dai_hw_params()
583 regmap_update_bits(max98373->regmap, in max98373_sdw_dai_hw_params()
587 dev_dbg(component->dev, "Format supported %d", params_format(params)); in max98373_sdw_dai_hw_params()
625 dev_err(component->dev, "Rate %d is not supported\n", in max98373_sdw_dai_hw_params()
627 return -EINVAL; in max98373_sdw_dai_hw_params()
631 regmap_update_bits(max98373->regmap, in max98373_sdw_dai_hw_params()
637 regmap_update_bits(max98373->regmap, in max98373_sdw_dai_hw_params()
648 struct snd_soc_component *component = dai->component; in max98373_pcm_hw_free()
654 if (!max98373->slave) in max98373_pcm_hw_free()
655 return -EINVAL; in max98373_pcm_hw_free()
657 sdw_stream_remove_slave(max98373->slave, sdw_stream); in max98373_pcm_hw_free()
680 struct snd_soc_component *component = dai->component; in max98373_sdw_set_tdm_slot()
686 return -EINVAL; in max98373_sdw_set_tdm_slot()
689 max98373->tdm_mode = false; in max98373_sdw_set_tdm_slot()
691 max98373->tdm_mode = true; in max98373_sdw_set_tdm_slot()
693 max98373->rx_mask = rx_mask; in max98373_sdw_set_tdm_slot()
694 max98373->slot = slots; in max98373_sdw_set_tdm_slot()
709 .name = "max98373-aif1",
733 struct device *dev = &slave->dev; in max98373_init()
738 return -ENOMEM; in max98373_init()
741 max98373->regmap = regmap; in max98373_init()
742 max98373->slave = slave; in max98373_init()
744 regcache_cache_only(max98373->regmap, true); in max98373_init()
746 max98373->cache_num = ARRAY_SIZE(max98373_sdw_cache_reg); in max98373_init()
747 max98373->cache = devm_kcalloc(dev, max98373->cache_num, in max98373_init()
748 sizeof(*max98373->cache), in max98373_init()
750 if (!max98373->cache) in max98373_init()
751 return -ENOMEM; in max98373_init()
753 for (i = 0; i < max98373->cache_num; i++) in max98373_init()
754 max98373->cache[i].reg = max98373_sdw_cache_reg[i]; in max98373_init()
759 max98373->hw_init = false; in max98373_init()
760 max98373->first_hw_init = false; in max98373_init()
771 /* set autosuspend parameters */ in max98373_init()
783 * fail with -EACCESS because of race conditions between card creation and enumeration in max98373_init()
792 struct max98373_priv *max98373 = dev_get_drvdata(&slave->dev); in max98373_update_status()
795 max98373->hw_init = false; in max98373_update_status()
800 if (max98373->hw_init || status != SDW_SLAVE_ATTACHED) in max98373_update_status()
814 dev_err(&slave->dev, "Invalid clk config"); in max98373_bus_config()
844 pm_runtime_disable(&slave->dev); in max98373_sdw_remove()