Lines Matching +full:slave +full:- +full:dev
1 // SPDX-License-Identifier: GPL-2.0-only
3 // rt5682-sdw.c -- RT5682 ALSA SoC audio component driver
27 #include <sound/soc-dapm.h>
41 struct device *dev = context; in rt5682_sdw_read() local
42 struct rt5682_priv *rt5682 = dev_get_drvdata(dev); in rt5682_sdw_read()
45 regmap_write(rt5682->sdw_regmap, RT5682_SDW_CMD, 0); in rt5682_sdw_read()
46 regmap_write(rt5682->sdw_regmap, RT5682_SDW_ADDR_H, (reg >> 8) & 0xff); in rt5682_sdw_read()
47 regmap_write(rt5682->sdw_regmap, RT5682_SDW_ADDR_L, (reg & 0xff)); in rt5682_sdw_read()
48 regmap_read(rt5682->sdw_regmap, RT5682_SDW_DATA_H, &data_h); in rt5682_sdw_read()
49 regmap_read(rt5682->sdw_regmap, RT5682_SDW_DATA_L, &data_l); in rt5682_sdw_read()
53 dev_vdbg(dev, "[%s] %04x => %04x\n", __func__, reg, *val); in rt5682_sdw_read()
60 struct device *dev = context; in rt5682_sdw_write() local
61 struct rt5682_priv *rt5682 = dev_get_drvdata(dev); in rt5682_sdw_write()
63 regmap_write(rt5682->sdw_regmap, RT5682_SDW_CMD, 1); in rt5682_sdw_write()
64 regmap_write(rt5682->sdw_regmap, RT5682_SDW_ADDR_H, (reg >> 8) & 0xff); in rt5682_sdw_write()
65 regmap_write(rt5682->sdw_regmap, RT5682_SDW_ADDR_L, (reg & 0xff)); in rt5682_sdw_write()
66 regmap_write(rt5682->sdw_regmap, RT5682_SDW_DATA_H, (val >> 8) & 0xff); in rt5682_sdw_write()
67 regmap_write(rt5682->sdw_regmap, RT5682_SDW_DATA_L, (val & 0xff)); in rt5682_sdw_write()
69 dev_vdbg(dev, "[%s] %04x <= %04x\n", __func__, reg, val); in rt5682_sdw_write()
107 struct snd_soc_component *component = dai->component; in rt5682_sdw_hw_params()
115 dev_dbg(dai->dev, "%s %s", __func__, dai->name); in rt5682_sdw_hw_params()
119 return -ENOMEM; in rt5682_sdw_hw_params()
121 if (!rt5682->slave) in rt5682_sdw_hw_params()
122 return -EINVAL; in rt5682_sdw_hw_params()
127 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) in rt5682_sdw_hw_params()
132 retval = sdw_stream_add_slave(rt5682->slave, &stream_config, in rt5682_sdw_hw_params()
135 dev_err(dai->dev, "Unable to configure port\n"); in rt5682_sdw_hw_params()
193 return -EINVAL; in rt5682_sdw_hw_params()
207 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { in rt5682_sdw_hw_params()
208 regmap_update_bits(rt5682->regmap, RT5682_SDW_REF_CLK, in rt5682_sdw_hw_params()
210 regmap_update_bits(rt5682->regmap, RT5682_ADDA_CLK_1, in rt5682_sdw_hw_params()
213 regmap_update_bits(rt5682->regmap, RT5682_SDW_REF_CLK, in rt5682_sdw_hw_params()
215 regmap_update_bits(rt5682->regmap, RT5682_ADDA_CLK_1, in rt5682_sdw_hw_params()
225 struct snd_soc_component *component = dai->component; in rt5682_sdw_hw_free()
230 if (!rt5682->slave) in rt5682_sdw_hw_free()
231 return -EINVAL; in rt5682_sdw_hw_free()
233 sdw_stream_remove_slave(rt5682->slave, sdw_stream); in rt5682_sdw_hw_free()
246 .name = "rt5682-aif1",
265 .name = "rt5682-aif2",
277 .name = "rt5682-sdw",
297 static int rt5682_sdw_init(struct device *dev, struct regmap *regmap, in rt5682_sdw_init() argument
298 struct sdw_slave *slave) in rt5682_sdw_init() argument
303 rt5682 = devm_kzalloc(dev, sizeof(*rt5682), GFP_KERNEL); in rt5682_sdw_init()
305 return -ENOMEM; in rt5682_sdw_init()
307 dev_set_drvdata(dev, rt5682); in rt5682_sdw_init()
308 rt5682->slave = slave; in rt5682_sdw_init()
309 rt5682->sdw_regmap = regmap; in rt5682_sdw_init()
310 rt5682->is_sdw = true; in rt5682_sdw_init()
312 mutex_init(&rt5682->disable_irq_lock); in rt5682_sdw_init()
314 rt5682->regmap = devm_regmap_init(dev, NULL, dev, in rt5682_sdw_init()
316 if (IS_ERR(rt5682->regmap)) { in rt5682_sdw_init()
317 ret = PTR_ERR(rt5682->regmap); in rt5682_sdw_init()
318 dev_err(dev, "Failed to allocate register map: %d\n", in rt5682_sdw_init()
324 ret = rt5682_get_ldo1(rt5682, dev); in rt5682_sdw_init()
328 regcache_cache_only(rt5682->sdw_regmap, true); in rt5682_sdw_init()
329 regcache_cache_only(rt5682->regmap, true); in rt5682_sdw_init()
335 rt5682->hw_init = false; in rt5682_sdw_init()
336 rt5682->first_hw_init = false; in rt5682_sdw_init()
338 mutex_init(&rt5682->calibrate_mutex); in rt5682_sdw_init()
339 INIT_DELAYED_WORK(&rt5682->jack_detect_work, in rt5682_sdw_init()
342 ret = devm_snd_soc_register_component(dev, in rt5682_sdw_init()
349 pm_runtime_set_autosuspend_delay(dev, 3000); in rt5682_sdw_init()
350 pm_runtime_use_autosuspend(dev); in rt5682_sdw_init()
353 pm_runtime_mark_last_busy(dev); in rt5682_sdw_init()
355 pm_runtime_enable(dev); in rt5682_sdw_init()
360 * fail with -EACCESS because of race conditions between card creation and enumeration in rt5682_sdw_init()
363 dev_dbg(dev, "%s\n", __func__); in rt5682_sdw_init()
368 static int rt5682_io_init(struct device *dev, struct sdw_slave *slave) in rt5682_io_init() argument
370 struct rt5682_priv *rt5682 = dev_get_drvdata(dev); in rt5682_io_init()
374 rt5682->disable_irq = false; in rt5682_io_init()
376 if (rt5682->hw_init) in rt5682_io_init()
379 regcache_cache_only(rt5682->sdw_regmap, false); in rt5682_io_init()
380 regcache_cache_only(rt5682->regmap, false); in rt5682_io_init()
381 if (rt5682->first_hw_init) in rt5682_io_init()
382 regcache_cache_bypass(rt5682->regmap, true); in rt5682_io_init()
385 * PM runtime status is marked as 'active' only when a Slave reports as Attached in rt5682_io_init()
387 if (!rt5682->first_hw_init) in rt5682_io_init()
389 pm_runtime_set_active(&slave->dev); in rt5682_io_init()
391 pm_runtime_get_noresume(&slave->dev); in rt5682_io_init()
394 regmap_read(rt5682->regmap, RT5682_DEVICE_ID, &val); in rt5682_io_init()
397 dev_warn(dev, "Device with ID register %x is not rt5682\n", val); in rt5682_io_init()
399 loop--; in rt5682_io_init()
403 dev_err(dev, "Device with ID register %x is not rt5682\n", val); in rt5682_io_init()
404 ret = -ENODEV; in rt5682_io_init()
410 if (rt5682->first_hw_init) { in rt5682_io_init()
411 regcache_cache_bypass(rt5682->regmap, false); in rt5682_io_init()
412 regcache_mark_dirty(rt5682->regmap); in rt5682_io_init()
413 regcache_sync(rt5682->regmap); in rt5682_io_init()
416 regmap_update_bits(rt5682->regmap, RT5682_CBJ_CTRL_2, in rt5682_io_init()
422 rt5682_apply_patch_list(rt5682, dev); in rt5682_io_init()
424 regmap_write(rt5682->regmap, RT5682_DEPOP_1, 0x0000); in rt5682_io_init()
426 regmap_update_bits(rt5682->regmap, RT5682_PWR_ANLG_1, in rt5682_io_init()
429 regmap_write(rt5682->regmap, RT5682_MICBIAS_2, 0x0080); in rt5682_io_init()
430 regmap_write(rt5682->regmap, RT5682_TEST_MODE_CTRL_1, 0x0000); in rt5682_io_init()
431 regmap_update_bits(rt5682->regmap, RT5682_BIAS_CUR_CTRL_8, in rt5682_io_init()
433 regmap_update_bits(rt5682->regmap, RT5682_CHARGE_PUMP_1, in rt5682_io_init()
435 regmap_update_bits(rt5682->regmap, RT5682_HP_CHARGE_PUMP_1, in rt5682_io_init()
439 regmap_write(rt5682->regmap, RT5682_PLL2_INTERNAL, 0xa266); in rt5682_io_init()
440 regmap_write(rt5682->regmap, RT5682_PLL2_CTRL_1, 0x1700); in rt5682_io_init()
441 regmap_write(rt5682->regmap, RT5682_PLL2_CTRL_2, 0x0006); in rt5682_io_init()
442 regmap_write(rt5682->regmap, RT5682_PLL2_CTRL_3, 0x2600); in rt5682_io_init()
443 regmap_write(rt5682->regmap, RT5682_PLL2_CTRL_4, 0x0c8f); in rt5682_io_init()
444 regmap_write(rt5682->regmap, RT5682_PLL_TRACK_2, 0x3000); in rt5682_io_init()
445 regmap_write(rt5682->regmap, RT5682_PLL_TRACK_3, 0x4000); in rt5682_io_init()
446 regmap_update_bits(rt5682->regmap, RT5682_GLB_CLK, in rt5682_io_init()
450 regmap_update_bits(rt5682->regmap, RT5682_CBJ_CTRL_2, in rt5682_io_init()
452 regmap_write(rt5682->regmap, RT5682_CBJ_CTRL_1, 0xd142); in rt5682_io_init()
453 regmap_update_bits(rt5682->regmap, RT5682_CBJ_CTRL_5, 0x0700, 0x0600); in rt5682_io_init()
454 regmap_update_bits(rt5682->regmap, RT5682_CBJ_CTRL_3, in rt5682_io_init()
456 regmap_update_bits(rt5682->regmap, RT5682_SAR_IL_CMD_1, in rt5682_io_init()
458 regmap_update_bits(rt5682->regmap, RT5682_RC_CLK_CTRL, in rt5682_io_init()
462 regmap_update_bits(rt5682->regmap, RT5682_PWR_ANLG_2, in rt5682_io_init()
464 regmap_update_bits(rt5682->regmap, RT5682_IRQ_CTRL_2, in rt5682_io_init()
470 &rt5682->jack_detect_work, msecs_to_jiffies(250)); in rt5682_io_init()
472 /* Mark Slave initialization complete */ in rt5682_io_init()
473 rt5682->hw_init = true; in rt5682_io_init()
474 rt5682->first_hw_init = true; in rt5682_io_init()
477 pm_runtime_mark_last_busy(&slave->dev); in rt5682_io_init()
478 pm_runtime_put_autosuspend(&slave->dev); in rt5682_io_init()
480 dev_dbg(&slave->dev, "%s hw_init complete: %d\n", __func__, ret); in rt5682_io_init()
485 static bool rt5682_sdw_readable_register(struct device *dev, unsigned int reg) in rt5682_sdw_readable_register() argument
512 static int rt5682_update_status(struct sdw_slave *slave, in rt5682_update_status() argument
515 struct rt5682_priv *rt5682 = dev_get_drvdata(&slave->dev); in rt5682_update_status()
518 rt5682->hw_init = false; in rt5682_update_status()
521 * Perform initialization only if slave status is present and in rt5682_update_status()
524 if (rt5682->hw_init || status != SDW_SLAVE_ATTACHED) in rt5682_update_status()
527 /* perform I/O transfers required for Slave initialization */ in rt5682_update_status()
528 return rt5682_io_init(&slave->dev, slave); in rt5682_update_status()
531 static int rt5682_read_prop(struct sdw_slave *slave) in rt5682_read_prop() argument
533 struct sdw_slave_prop *prop = &slave->prop; in rt5682_read_prop()
539 prop->scp_int1_mask = SDW_SCP_INT1_IMPL_DEF | SDW_SCP_INT1_BUS_CLASH | in rt5682_read_prop()
541 prop->quirks = SDW_SLAVE_QUIRKS_INVALID_INITIAL_PARITY; in rt5682_read_prop()
543 prop->paging_support = false; in rt5682_read_prop()
546 prop->source_ports = 0x4; /* BITMAP: 00000100 */ in rt5682_read_prop()
547 prop->sink_ports = 0x2; /* BITMAP: 00000010 */ in rt5682_read_prop()
549 nval = hweight32(prop->source_ports); in rt5682_read_prop()
550 prop->src_dpn_prop = devm_kcalloc(&slave->dev, nval, in rt5682_read_prop()
551 sizeof(*prop->src_dpn_prop), in rt5682_read_prop()
553 if (!prop->src_dpn_prop) in rt5682_read_prop()
554 return -ENOMEM; in rt5682_read_prop()
557 dpn = prop->src_dpn_prop; in rt5682_read_prop()
558 addr = prop->source_ports; in rt5682_read_prop()
568 nval = hweight32(prop->sink_ports); in rt5682_read_prop()
569 prop->sink_dpn_prop = devm_kcalloc(&slave->dev, nval, in rt5682_read_prop()
570 sizeof(*prop->sink_dpn_prop), in rt5682_read_prop()
572 if (!prop->sink_dpn_prop) in rt5682_read_prop()
573 return -ENOMEM; in rt5682_read_prop()
576 dpn = prop->sink_dpn_prop; in rt5682_read_prop()
577 addr = prop->sink_ports; in rt5682_read_prop()
587 prop->clk_stop_timeout = 20; in rt5682_read_prop()
589 /* wake-up event */ in rt5682_read_prop()
590 prop->wake_capable = 1; in rt5682_read_prop()
603 static int rt5682_clock_config(struct device *dev) in rt5682_clock_config() argument
605 struct rt5682_priv *rt5682 = dev_get_drvdata(dev); in rt5682_clock_config()
608 clk_freq = (rt5682->params.curr_dr_freq >> 1); in rt5682_clock_config()
630 return -EINVAL; in rt5682_clock_config()
633 regmap_write(rt5682->sdw_regmap, 0xe0, value); in rt5682_clock_config()
634 regmap_write(rt5682->sdw_regmap, 0xf0, value); in rt5682_clock_config()
636 dev_dbg(dev, "%s complete, clk_freq=%d\n", __func__, clk_freq); in rt5682_clock_config()
641 static int rt5682_bus_config(struct sdw_slave *slave, in rt5682_bus_config() argument
644 struct rt5682_priv *rt5682 = dev_get_drvdata(&slave->dev); in rt5682_bus_config()
647 memcpy(&rt5682->params, params, sizeof(*params)); in rt5682_bus_config()
649 ret = rt5682_clock_config(&slave->dev); in rt5682_bus_config()
651 dev_err(&slave->dev, "Invalid clk config"); in rt5682_bus_config()
656 static int rt5682_interrupt_callback(struct sdw_slave *slave, in rt5682_interrupt_callback() argument
659 struct rt5682_priv *rt5682 = dev_get_drvdata(&slave->dev); in rt5682_interrupt_callback()
661 dev_dbg(&slave->dev, in rt5682_interrupt_callback()
662 "%s control_port_stat=%x", __func__, status->control_port); in rt5682_interrupt_callback()
664 mutex_lock(&rt5682->disable_irq_lock); in rt5682_interrupt_callback()
665 if (status->control_port & 0x4 && !rt5682->disable_irq) { in rt5682_interrupt_callback()
667 &rt5682->jack_detect_work, msecs_to_jiffies(rt5682->irq_work_delay_time)); in rt5682_interrupt_callback()
669 mutex_unlock(&rt5682->disable_irq_lock); in rt5682_interrupt_callback()
681 static int rt5682_sdw_probe(struct sdw_slave *slave, in rt5682_sdw_probe() argument
687 regmap = devm_regmap_init_sdw(slave, &rt5682_sdw_regmap); in rt5682_sdw_probe()
689 return -EINVAL; in rt5682_sdw_probe()
691 return rt5682_sdw_init(&slave->dev, regmap, slave); in rt5682_sdw_probe()
694 static int rt5682_sdw_remove(struct sdw_slave *slave) in rt5682_sdw_remove() argument
696 struct rt5682_priv *rt5682 = dev_get_drvdata(&slave->dev); in rt5682_sdw_remove()
698 if (rt5682->hw_init) in rt5682_sdw_remove()
699 cancel_delayed_work_sync(&rt5682->jack_detect_work); in rt5682_sdw_remove()
701 pm_runtime_disable(&slave->dev); in rt5682_sdw_remove()
712 static int __maybe_unused rt5682_dev_suspend(struct device *dev) in rt5682_dev_suspend() argument
714 struct rt5682_priv *rt5682 = dev_get_drvdata(dev); in rt5682_dev_suspend()
716 if (!rt5682->hw_init) in rt5682_dev_suspend()
719 cancel_delayed_work_sync(&rt5682->jack_detect_work); in rt5682_dev_suspend()
721 regcache_cache_only(rt5682->sdw_regmap, true); in rt5682_dev_suspend()
722 regcache_cache_only(rt5682->regmap, true); in rt5682_dev_suspend()
723 regcache_mark_dirty(rt5682->regmap); in rt5682_dev_suspend()
728 static int __maybe_unused rt5682_dev_system_suspend(struct device *dev) in rt5682_dev_system_suspend() argument
730 struct rt5682_priv *rt5682 = dev_get_drvdata(dev); in rt5682_dev_system_suspend()
731 struct sdw_slave *slave = dev_to_sdw_dev(dev); in rt5682_dev_system_suspend() local
734 if (!rt5682->hw_init) in rt5682_dev_system_suspend()
742 mutex_lock(&rt5682->disable_irq_lock); in rt5682_dev_system_suspend()
743 rt5682->disable_irq = true; in rt5682_dev_system_suspend()
744 ret = sdw_update_no_pm(slave, SDW_SCP_INTMASK1, in rt5682_dev_system_suspend()
746 mutex_unlock(&rt5682->disable_irq_lock); in rt5682_dev_system_suspend()
750 dev_dbg(&slave->dev, "%s: could not disable imp-def interrupts\n:", __func__); in rt5682_dev_system_suspend()
753 return rt5682_dev_suspend(dev); in rt5682_dev_system_suspend()
756 static int __maybe_unused rt5682_dev_resume(struct device *dev) in rt5682_dev_resume() argument
758 struct sdw_slave *slave = dev_to_sdw_dev(dev); in rt5682_dev_resume() local
759 struct rt5682_priv *rt5682 = dev_get_drvdata(dev); in rt5682_dev_resume()
762 if (!rt5682->first_hw_init) in rt5682_dev_resume()
765 if (!slave->unattach_request) { in rt5682_dev_resume()
766 mutex_lock(&rt5682->disable_irq_lock); in rt5682_dev_resume()
767 if (rt5682->disable_irq == true) { in rt5682_dev_resume()
768 sdw_write_no_pm(slave, SDW_SCP_INTMASK1, SDW_SCP_INT1_IMPL_DEF); in rt5682_dev_resume()
769 rt5682->disable_irq = false; in rt5682_dev_resume()
771 mutex_unlock(&rt5682->disable_irq_lock); in rt5682_dev_resume()
775 time = wait_for_completion_timeout(&slave->initialization_complete, in rt5682_dev_resume()
778 dev_err(&slave->dev, "Initialization not complete, timed out\n"); in rt5682_dev_resume()
779 sdw_show_ping_status(slave->bus, true); in rt5682_dev_resume()
781 return -ETIMEDOUT; in rt5682_dev_resume()
785 slave->unattach_request = 0; in rt5682_dev_resume()
786 regcache_cache_only(rt5682->sdw_regmap, false); in rt5682_dev_resume()
787 regcache_cache_only(rt5682->regmap, false); in rt5682_dev_resume()
788 regcache_sync(rt5682->regmap); in rt5682_dev_resume()