Lines Matching +full:slave +full:- +full:addr
1 // SPDX-License-Identifier: GPL-2.0-only
3 // rt712-sdca-dmic.c -- rt712 SDCA DMIC ALSA SoC audio driver
18 #include "rt712-sdca.h"
19 #include "rt712-sdca-dmic.h"
119 .name = "sdw-mbq",
136 struct regmap *regmap = rt712->mbq_regmap; in rt712_sdca_dmic_index_write()
137 unsigned int addr = (nid << 20) | reg; in rt712_sdca_dmic_index_write() local
139 ret = regmap_write(regmap, addr, value); in rt712_sdca_dmic_index_write()
141 dev_err(&rt712->slave->dev, in rt712_sdca_dmic_index_write()
143 __func__, addr, value, ret); in rt712_sdca_dmic_index_write()
152 struct regmap *regmap = rt712->mbq_regmap; in rt712_sdca_dmic_index_read()
153 unsigned int addr = (nid << 20) | reg; in rt712_sdca_dmic_index_read() local
155 ret = regmap_read(regmap, addr, value); in rt712_sdca_dmic_index_read()
157 dev_err(&rt712->slave->dev, in rt712_sdca_dmic_index_read()
159 __func__, addr, *value, ret); in rt712_sdca_dmic_index_read()
178 static int rt712_sdca_dmic_io_init(struct device *dev, struct sdw_slave *slave) in rt712_sdca_dmic_io_init() argument
182 if (rt712->hw_init) in rt712_sdca_dmic_io_init()
185 regcache_cache_only(rt712->regmap, false); in rt712_sdca_dmic_io_init()
186 regcache_cache_only(rt712->mbq_regmap, false); in rt712_sdca_dmic_io_init()
187 if (rt712->first_hw_init) { in rt712_sdca_dmic_io_init()
188 regcache_cache_bypass(rt712->regmap, true); in rt712_sdca_dmic_io_init()
189 regcache_cache_bypass(rt712->mbq_regmap, true); in rt712_sdca_dmic_io_init()
192 * PM runtime status is marked as 'active' only when a Slave reports as Attached in rt712_sdca_dmic_io_init()
196 pm_runtime_set_active(&slave->dev); in rt712_sdca_dmic_io_init()
199 pm_runtime_get_noresume(&slave->dev); in rt712_sdca_dmic_io_init()
221 regmap_write(rt712->regmap, in rt712_sdca_dmic_io_init()
225 regmap_write(rt712->regmap, RT712_RC_CAL, 0x23); in rt712_sdca_dmic_io_init()
226 regmap_write(rt712->regmap, 0x2f52, 0x00); in rt712_sdca_dmic_io_init()
228 if (rt712->first_hw_init) { in rt712_sdca_dmic_io_init()
229 regcache_cache_bypass(rt712->regmap, false); in rt712_sdca_dmic_io_init()
230 regcache_mark_dirty(rt712->regmap); in rt712_sdca_dmic_io_init()
231 regcache_cache_bypass(rt712->mbq_regmap, false); in rt712_sdca_dmic_io_init()
232 regcache_mark_dirty(rt712->mbq_regmap); in rt712_sdca_dmic_io_init()
234 rt712->first_hw_init = true; in rt712_sdca_dmic_io_init()
236 /* Mark Slave initialization complete */ in rt712_sdca_dmic_io_init()
237 rt712->hw_init = true; in rt712_sdca_dmic_io_init()
239 pm_runtime_put_autosuspend(&slave->dev); in rt712_sdca_dmic_io_init()
241 dev_dbg(&slave->dev, "%s hw_init complete\n", __func__); in rt712_sdca_dmic_io_init()
251 (struct rt712_sdca_dmic_kctrl_priv *)kcontrol->private_value; in rt712_sdca_dmic_set_gain_get()
256 if (strstr(ucontrol->id.name, "FU1E Capture Volume")) in rt712_sdca_dmic_set_gain_get()
260 for (i = 0; i < p->count; i++) { in rt712_sdca_dmic_set_gain_get()
261 regmap_read(rt712->mbq_regmap, p->reg_base + i, ®value); in rt712_sdca_dmic_set_gain_get()
266 ctl = p->max - (((0x1e00 - regvalue) & 0xffff) / interval_offset); in rt712_sdca_dmic_set_gain_get()
268 ucontrol->value.integer.value[i] = ctl; in rt712_sdca_dmic_set_gain_get()
279 (struct rt712_sdca_dmic_kctrl_priv *)kcontrol->private_value; in rt712_sdca_dmic_set_gain_put()
287 if (strstr(ucontrol->id.name, "FU1E Capture Volume")) in rt712_sdca_dmic_set_gain_put()
291 for (i = 0; i < p->count; i++) { in rt712_sdca_dmic_set_gain_put()
292 regmap_read(rt712->mbq_regmap, p->reg_base + i, ®value[i]); in rt712_sdca_dmic_set_gain_put()
294 gain_val[i] = ucontrol->value.integer.value[i]; in rt712_sdca_dmic_set_gain_put()
295 if (gain_val[i] > p->max) in rt712_sdca_dmic_set_gain_put()
296 gain_val[i] = p->max; in rt712_sdca_dmic_set_gain_put()
301 gain_val[i] = 0x1e00 - ((p->max - gain_val[i]) * interval_offset); in rt712_sdca_dmic_set_gain_put()
312 for (i = 0; i < p->count; i++) { in rt712_sdca_dmic_set_gain_put()
313 err = regmap_write(rt712->mbq_regmap, p->reg_base + i, gain_val[i]); in rt712_sdca_dmic_set_gain_put()
315 dev_err(&rt712->slave->dev, "%s: 0x%08x can't be set\n", in rt712_sdca_dmic_set_gain_put()
316 __func__, p->reg_base + i); in rt712_sdca_dmic_set_gain_put()
327 for (i = 0; i < ARRAY_SIZE(rt712->fu1e_mixer_mute); i++) { in rt712_sdca_set_fu1e_capture_ctl()
328 ch_mute = (rt712->fu1e_dapm_mute || rt712->fu1e_mixer_mute[i]) ? 0x01 : 0x00; in rt712_sdca_set_fu1e_capture_ctl()
329 err = regmap_write(rt712->regmap, in rt712_sdca_set_fu1e_capture_ctl()
345 (struct rt712_sdca_dmic_kctrl_priv *)kcontrol->private_value; in rt712_sdca_dmic_fu1e_capture_get()
348 for (i = 0; i < p->count; i++) in rt712_sdca_dmic_fu1e_capture_get()
349 ucontrol->value.integer.value[i] = !rt712->fu1e_mixer_mute[i]; in rt712_sdca_dmic_fu1e_capture_get()
360 (struct rt712_sdca_dmic_kctrl_priv *)kcontrol->private_value; in rt712_sdca_dmic_fu1e_capture_put()
363 for (i = 0; i < p->count; i++) { in rt712_sdca_dmic_fu1e_capture_put()
364 if (rt712->fu1e_mixer_mute[i] != !ucontrol->value.integer.value[i]) in rt712_sdca_dmic_fu1e_capture_put()
366 rt712->fu1e_mixer_mute[i] = !ucontrol->value.integer.value[i]; in rt712_sdca_dmic_fu1e_capture_put()
380 (struct rt712_sdca_dmic_kctrl_priv *)kcontrol->private_value; in rt712_sdca_fu_info()
382 if (p->max == 1) in rt712_sdca_fu_info()
383 uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN; in rt712_sdca_fu_info()
385 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; in rt712_sdca_fu_info()
386 uinfo->count = p->count; in rt712_sdca_fu_info()
387 uinfo->value.integer.min = 0; in rt712_sdca_fu_info()
388 uinfo->value.integer.max = p->max; in rt712_sdca_fu_info()
414 static const DECLARE_TLV_DB_SCALE(in_vol_tlv, -1725, 75, 0);
437 if (strstr(ucontrol->id.name, "ADC 25 Mux")) in rt712_sdca_dmic_mux_get()
439 else if (strstr(ucontrol->id.name, "ADC 26 Mux")) in rt712_sdca_dmic_mux_get()
442 return -EINVAL; in rt712_sdca_dmic_mux_get()
447 ucontrol->value.enumerated.item[0] = (val >> mask_sft) & 0x7; in rt712_sdca_dmic_mux_get()
460 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; in rt712_sdca_dmic_mux_put()
461 unsigned int *item = ucontrol->value.enumerated.item; in rt712_sdca_dmic_mux_put()
464 if (item[0] >= e->items) in rt712_sdca_dmic_mux_put()
465 return -EINVAL; in rt712_sdca_dmic_mux_put()
467 if (strstr(ucontrol->id.name, "ADC 25 Mux")) in rt712_sdca_dmic_mux_put()
469 else if (strstr(ucontrol->id.name, "ADC 26 Mux")) in rt712_sdca_dmic_mux_put()
472 return -EINVAL; in rt712_sdca_dmic_mux_put()
474 val = snd_soc_enum_item_to_val(e, item[0]) << e->shift_l; in rt712_sdca_dmic_mux_put()
519 snd_soc_dapm_to_component(w->dapm); in rt712_sdca_dmic_fu1e_event()
524 rt712->fu1e_dapm_mute = false; in rt712_sdca_dmic_fu1e_event()
528 rt712->fu1e_dapm_mute = true; in rt712_sdca_dmic_fu1e_event()
539 snd_soc_dapm_to_component(w->dapm); in rt712_sdca_dmic_pde11_event()
545 regmap_write(rt712->regmap, in rt712_sdca_dmic_pde11_event()
551 regmap_write(rt712->regmap, in rt712_sdca_dmic_pde11_event()
596 rt712->component = component; in rt712_sdca_dmic_probe()
598 if (!rt712->first_hw_init) in rt712_sdca_dmic_probe()
601 ret = pm_runtime_resume(component->dev); in rt712_sdca_dmic_probe()
602 if (ret < 0 && ret != -EACCES) in rt712_sdca_dmic_probe()
637 struct snd_soc_component *component = dai->component; in rt712_sdca_dmic_hw_params()
645 dev_dbg(dai->dev, "%s %s", __func__, dai->name); in rt712_sdca_dmic_hw_params()
649 return -EINVAL; in rt712_sdca_dmic_hw_params()
651 if (!rt712->slave) in rt712_sdca_dmic_hw_params()
652 return -EINVAL; in rt712_sdca_dmic_hw_params()
660 port_config.ch_mask = GENMASK(num_channels - 1, 0); in rt712_sdca_dmic_hw_params()
663 retval = sdw_stream_add_slave(rt712->slave, &stream_config, in rt712_sdca_dmic_hw_params()
666 dev_err(dai->dev, "%s: Unable to configure port\n", __func__); in rt712_sdca_dmic_hw_params()
671 dev_err(component->dev, "%s: Unsupported channels %d\n", in rt712_sdca_dmic_hw_params()
673 return -EINVAL; in rt712_sdca_dmic_hw_params()
697 dev_err(component->dev, "%s: Rate %d is not supported\n", in rt712_sdca_dmic_hw_params()
699 return -EINVAL; in rt712_sdca_dmic_hw_params()
703 regmap_write(rt712->regmap, in rt712_sdca_dmic_hw_params()
706 regmap_write(rt712->regmap, in rt712_sdca_dmic_hw_params()
716 struct snd_soc_component *component = dai->component; in rt712_sdca_dmic_hw_free()
721 if (!rt712->slave) in rt712_sdca_dmic_hw_free()
722 return -EINVAL; in rt712_sdca_dmic_hw_free()
724 sdw_stream_remove_slave(rt712->slave, sdw_stream); in rt712_sdca_dmic_hw_free()
742 .name = "rt712-sdca-dmic-aif1",
756 struct regmap *mbq_regmap, struct sdw_slave *slave) in rt712_sdca_dmic_init() argument
763 return -ENOMEM; in rt712_sdca_dmic_init()
766 rt712->slave = slave; in rt712_sdca_dmic_init()
767 rt712->regmap = regmap; in rt712_sdca_dmic_init()
768 rt712->mbq_regmap = mbq_regmap; in rt712_sdca_dmic_init()
770 regcache_cache_only(rt712->regmap, true); in rt712_sdca_dmic_init()
771 regcache_cache_only(rt712->mbq_regmap, true); in rt712_sdca_dmic_init()
777 rt712->hw_init = false; in rt712_sdca_dmic_init()
778 rt712->first_hw_init = false; in rt712_sdca_dmic_init()
779 rt712->fu1e_dapm_mute = true; in rt712_sdca_dmic_init()
780 rt712->fu1e_mixer_mute[0] = rt712->fu1e_mixer_mute[1] = in rt712_sdca_dmic_init()
781 rt712->fu1e_mixer_mute[2] = rt712->fu1e_mixer_mute[3] = true; in rt712_sdca_dmic_init()
802 * fail with -EACCESS because of race conditions between card creation and enumeration in rt712_sdca_dmic_init()
811 static int rt712_sdca_dmic_update_status(struct sdw_slave *slave, in rt712_sdca_dmic_update_status() argument
814 struct rt712_sdca_dmic_priv *rt712 = dev_get_drvdata(&slave->dev); in rt712_sdca_dmic_update_status()
817 rt712->hw_init = false; in rt712_sdca_dmic_update_status()
820 * Perform initialization only if slave status is present and in rt712_sdca_dmic_update_status()
823 if (rt712->hw_init || status != SDW_SLAVE_ATTACHED) in rt712_sdca_dmic_update_status()
826 /* perform I/O transfers required for Slave initialization */ in rt712_sdca_dmic_update_status()
827 return rt712_sdca_dmic_io_init(&slave->dev, slave); in rt712_sdca_dmic_update_status()
830 static int rt712_sdca_dmic_read_prop(struct sdw_slave *slave) in rt712_sdca_dmic_read_prop() argument
832 struct sdw_slave_prop *prop = &slave->prop; in rt712_sdca_dmic_read_prop()
835 unsigned long addr; in rt712_sdca_dmic_read_prop() local
838 prop->scp_int1_mask = SDW_SCP_INT1_BUS_CLASH | SDW_SCP_INT1_PARITY; in rt712_sdca_dmic_read_prop()
839 prop->quirks = SDW_SLAVE_QUIRKS_INVALID_INITIAL_PARITY; in rt712_sdca_dmic_read_prop()
841 prop->paging_support = true; in rt712_sdca_dmic_read_prop()
844 prop->source_ports = BIT(2); /* BITMAP: 00000100 */ in rt712_sdca_dmic_read_prop()
845 prop->sink_ports = 0; in rt712_sdca_dmic_read_prop()
847 nval = hweight32(prop->source_ports); in rt712_sdca_dmic_read_prop()
848 prop->src_dpn_prop = devm_kcalloc(&slave->dev, nval, in rt712_sdca_dmic_read_prop()
849 sizeof(*prop->src_dpn_prop), GFP_KERNEL); in rt712_sdca_dmic_read_prop()
850 if (!prop->src_dpn_prop) in rt712_sdca_dmic_read_prop()
851 return -ENOMEM; in rt712_sdca_dmic_read_prop()
854 dpn = prop->src_dpn_prop; in rt712_sdca_dmic_read_prop()
855 addr = prop->source_ports; in rt712_sdca_dmic_read_prop()
856 for_each_set_bit(bit, &addr, 32) { in rt712_sdca_dmic_read_prop()
865 prop->clk_stop_timeout = 200; in rt712_sdca_dmic_read_prop()
867 /* wake-up event */ in rt712_sdca_dmic_read_prop()
868 prop->wake_capable = 1; in rt712_sdca_dmic_read_prop()
886 if (!rt712->hw_init) in rt712_sdca_dmic_dev_suspend()
889 regcache_cache_only(rt712->regmap, true); in rt712_sdca_dmic_dev_suspend()
890 regcache_cache_only(rt712->mbq_regmap, true); in rt712_sdca_dmic_dev_suspend()
899 if (!rt712_sdca->hw_init) in rt712_sdca_dmic_dev_system_suspend()
909 struct sdw_slave *slave = dev_to_sdw_dev(dev); in rt712_sdca_dmic_dev_resume() local
913 if (!rt712->first_hw_init) in rt712_sdca_dmic_dev_resume()
916 if (!slave->unattach_request) in rt712_sdca_dmic_dev_resume()
919 time = wait_for_completion_timeout(&slave->initialization_complete, in rt712_sdca_dmic_dev_resume()
922 dev_err(&slave->dev, "%s: Initialization not complete, timed out\n", in rt712_sdca_dmic_dev_resume()
924 sdw_show_ping_status(slave->bus, true); in rt712_sdca_dmic_dev_resume()
926 return -ETIMEDOUT; in rt712_sdca_dmic_dev_resume()
930 slave->unattach_request = 0; in rt712_sdca_dmic_dev_resume()
931 regcache_cache_only(rt712->regmap, false); in rt712_sdca_dmic_dev_resume()
932 regcache_sync(rt712->regmap); in rt712_sdca_dmic_dev_resume()
933 regcache_cache_only(rt712->mbq_regmap, false); in rt712_sdca_dmic_dev_resume()
934 regcache_sync(rt712->mbq_regmap); in rt712_sdca_dmic_dev_resume()
949 static int rt712_sdca_dmic_sdw_probe(struct sdw_slave *slave, in rt712_sdca_dmic_sdw_probe() argument
955 mbq_regmap = devm_regmap_init_sdw_mbq(slave, &rt712_sdca_dmic_mbq_regmap); in rt712_sdca_dmic_sdw_probe()
959 regmap = devm_regmap_init_sdw(slave, &rt712_sdca_dmic_regmap); in rt712_sdca_dmic_sdw_probe()
963 return rt712_sdca_dmic_init(&slave->dev, regmap, mbq_regmap, slave); in rt712_sdca_dmic_sdw_probe()
966 static int rt712_sdca_dmic_sdw_remove(struct sdw_slave *slave) in rt712_sdca_dmic_sdw_remove() argument
968 pm_runtime_disable(&slave->dev); in rt712_sdca_dmic_sdw_remove()
975 .name = "rt712-sdca-dmic",