Lines Matching +full:slave +full:- +full:dev
1 // SPDX-License-Identifier: GPL-2.0-only
21 #include "max98373-sdw.h"
178 static bool max98373_readable_register(struct device *dev, unsigned int reg) in max98373_readable_register() argument
214 static bool max98373_volatile_reg(struct device *dev, unsigned int reg) in max98373_volatile_reg() argument
249 static int max98373_suspend(struct device *dev) in max98373_suspend() argument
251 struct max98373_priv *max98373 = dev_get_drvdata(dev); in max98373_suspend()
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()
265 static int max98373_resume(struct device *dev) in max98373_resume() argument
267 struct sdw_slave *slave = dev_to_sdw_dev(dev); in max98373_resume() local
268 struct max98373_priv *max98373 = dev_get_drvdata(dev); in max98373_resume()
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()
280 dev_err(dev, "Initialization not complete, timed out\n"); 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()
299 static int max98373_read_prop(struct sdw_slave *slave) in max98373_read_prop() argument
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()
359 static int max98373_io_init(struct sdw_slave *slave) in max98373_io_init() argument
361 struct device *dev = &slave->dev; in max98373_io_init() local
362 struct max98373_priv *max98373 = dev_get_drvdata(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()
369 * PM runtime status is marked as 'active' only when a Slave reports as Attached in max98373_io_init()
371 if (!max98373->first_hw_init) in max98373_io_init()
373 pm_runtime_set_active(dev); in max98373_io_init()
375 pm_runtime_get_noresume(dev); in max98373_io_init()
378 max98373_reset(max98373, dev); 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()
461 pm_runtime_put_autosuspend(dev); in max98373_io_init()
466 static int max98373_clock_calculate(struct sdw_slave *slave, in max98373_clock_calculate() argument
481 dev_err(&slave->dev, "Requested clock not found. (clk_freq = %d)\n", in max98373_clock_calculate()
486 static int max98373_clock_config(struct sdw_slave *slave, in max98373_clock_config() argument
489 struct device *dev = &slave->dev; in max98373_clock_config() local
490 struct max98373_priv *max98373 = dev_get_drvdata(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()
500 value = max98373_clock_calculate(slave, clk_freq); 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",
728 static int max98373_init(struct sdw_slave *slave, struct regmap *regmap) in max98373_init() argument
733 struct device *dev = &slave->dev; in max98373_init() local
736 max98373 = devm_kzalloc(dev, sizeof(*max98373), GFP_KERNEL); in max98373_init()
738 return -ENOMEM; in max98373_init()
740 dev_set_drvdata(dev, max98373); 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()
757 max98373_slot_config(dev, max98373); in max98373_init()
759 max98373->hw_init = false; in max98373_init()
760 max98373->first_hw_init = false; in max98373_init()
763 ret = devm_snd_soc_register_component(dev, &soc_codec_dev_max98373_sdw, in max98373_init()
767 dev_err(dev, "Failed to register codec: %d\n", ret); in max98373_init()
772 pm_runtime_set_autosuspend_delay(dev, 3000); in max98373_init()
773 pm_runtime_use_autosuspend(dev); in max98373_init()
776 pm_runtime_mark_last_busy(dev); in max98373_init()
778 pm_runtime_enable(dev); in max98373_init()
783 * fail with -EACCESS because of race conditions between card creation and enumeration in max98373_init()
789 static int max98373_update_status(struct sdw_slave *slave, in max98373_update_status() argument
792 struct max98373_priv *max98373 = dev_get_drvdata(&slave->dev); in max98373_update_status()
795 max98373->hw_init = false; in max98373_update_status()
798 * Perform initialization only if slave status is SDW_SLAVE_ATTACHED in max98373_update_status()
800 if (max98373->hw_init || status != SDW_SLAVE_ATTACHED) in max98373_update_status()
803 /* perform I/O transfers required for Slave initialization */ in max98373_update_status()
804 return max98373_io_init(slave); in max98373_update_status()
807 static int max98373_bus_config(struct sdw_slave *slave, in max98373_bus_config() argument
812 ret = max98373_clock_config(slave, params); in max98373_bus_config()
814 dev_err(&slave->dev, "Invalid clk config"); in max98373_bus_config()
829 static int max98373_sdw_probe(struct sdw_slave *slave, in max98373_sdw_probe() argument
835 regmap = devm_regmap_init_sdw(slave, &max98373_sdw_regmap); in max98373_sdw_probe()
839 return max98373_init(slave, regmap); in max98373_sdw_probe()
842 static int max98373_sdw_remove(struct sdw_slave *slave) in max98373_sdw_remove() argument
844 pm_runtime_disable(&slave->dev); in max98373_sdw_remove()