Lines Matching +full:dai +full:- +full:tdm +full:- +full:slot +full:- +full:width +full:- +full:map

1 // SPDX-License-Identifier: GPL-2.0
3 // Analog Devices ADAU7118 8 channel PDM-to-I2S/TDM Converter driver
36 struct regmap *map; member
123 static int adau7118_set_channel_map(struct snd_soc_dai *dai, in adau7118_set_channel_map() argument
130 snd_soc_component_get_drvdata(dai->component); in adau7118_set_channel_map()
133 dev_dbg(st->dev, "Set channel map, %d", tx_num); in adau7118_set_channel_map()
136 ret = snd_soc_component_update_bits(dai->component, in adau7118_set_channel_map()
147 static int adau7118_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) in adau7118_set_fmt() argument
150 snd_soc_component_get_drvdata(dai->component); in adau7118_set_fmt()
154 dev_dbg(st->dev, "Set format, fmt:%d\n", fmt); in adau7118_set_fmt()
158 ret = snd_soc_component_update_bits(dai->component, in adau7118_set_fmt()
164 ret = snd_soc_component_update_bits(dai->component, in adau7118_set_fmt()
170 st->right_j = true; in adau7118_set_fmt()
173 ret = snd_soc_component_update_bits(dai->component, in adau7118_set_fmt()
179 dev_err(st->dev, "Invalid format %d", in adau7118_set_fmt()
181 return -EINVAL; in adau7118_set_fmt()
201 dev_err(st->dev, "Invalid Inv mask %d", in adau7118_set_fmt()
203 return -EINVAL; in adau7118_set_fmt()
206 ret = snd_soc_component_update_bits(dai->component, in adau7118_set_fmt()
216 static int adau7118_set_tristate(struct snd_soc_dai *dai, int tristate) in adau7118_set_tristate() argument
219 snd_soc_component_get_drvdata(dai->component); in adau7118_set_tristate()
222 dev_dbg(st->dev, "Set tristate, %d\n", tristate); in adau7118_set_tristate()
224 ret = snd_soc_component_update_bits(dai->component, in adau7118_set_tristate()
234 static int adau7118_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, in adau7118_set_tdm_slot() argument
239 snd_soc_component_get_drvdata(dai->component); in adau7118_set_tdm_slot()
243 dev_dbg(st->dev, "Set tdm, slots:%d width:%d\n", slots, slot_width); in adau7118_set_tdm_slot()
256 dev_err(st->dev, "Invalid slot width:%d\n", slot_width); in adau7118_set_tdm_slot()
257 return -EINVAL; in adau7118_set_tdm_slot()
260 ret = snd_soc_component_update_bits(dai->component, in adau7118_set_tdm_slot()
266 st->slot_width = slot_width; in adau7118_set_tdm_slot()
267 st->slots = slots; in adau7118_set_tdm_slot()
274 struct snd_soc_dai *dai) in adau7118_hw_params() argument
277 snd_soc_component_get_drvdata(dai->component); in adau7118_hw_params()
282 if (!st->slots) { in adau7118_hw_params()
284 ret = snd_soc_component_update_bits(dai->component, in adau7118_hw_params()
293 slots_width = st->slot_width; in adau7118_hw_params()
297 dev_err(st->dev, "Invalid data_width:%d, slots_width:%d", in adau7118_hw_params()
299 return -EINVAL; in adau7118_hw_params()
302 if (st->right_j) { in adau7118_hw_params()
303 switch (slots_width - data_width) { in adau7118_hw_params()
317 dev_err(st->dev, in adau7118_hw_params()
320 return -EINVAL; in adau7118_hw_params()
323 ret = snd_soc_component_update_bits(dai->component, in adau7118_hw_params()
340 dev_dbg(st->dev, "Set bias level %d\n", level); in adau7118_set_bias_level()
351 ret = regulator_enable(st->iovdd); in adau7118_set_bias_level()
356 ret = regulator_enable(st->dvdd); in adau7118_set_bias_level()
358 regulator_disable(st->iovdd); in adau7118_set_bias_level()
362 if (st->hw_mode) in adau7118_set_bias_level()
365 regcache_cache_only(st->map, false); in adau7118_set_bias_level()
372 ret = regulator_disable(st->dvdd); in adau7118_set_bias_level()
376 ret = regulator_disable(st->iovdd); in adau7118_set_bias_level()
380 if (st->hw_mode) in adau7118_set_bias_level()
384 regcache_mark_dirty(st->map); in adau7118_set_bias_level()
385 regcache_cache_only(st->map, true); in adau7118_set_bias_level()
400 if (st->hw_mode) { in adau7118_component_probe()
409 snd_soc_component_init_regmap(component, st->map); in adau7118_component_probe()
431 .name = "adau7118-hifi-capture",
457 st->iovdd = devm_regulator_get(st->dev, "iovdd"); in adau7118_regulator_setup()
458 if (IS_ERR(st->iovdd)) { in adau7118_regulator_setup()
459 dev_err(st->dev, "Could not get iovdd: %ld\n", in adau7118_regulator_setup()
460 PTR_ERR(st->iovdd)); in adau7118_regulator_setup()
461 return PTR_ERR(st->iovdd); in adau7118_regulator_setup()
464 st->dvdd = devm_regulator_get(st->dev, "dvdd"); in adau7118_regulator_setup()
465 if (IS_ERR(st->dvdd)) { in adau7118_regulator_setup()
466 dev_err(st->dev, "Could not get dvdd: %ld\n", in adau7118_regulator_setup()
467 PTR_ERR(st->dvdd)); in adau7118_regulator_setup()
468 return PTR_ERR(st->dvdd); in adau7118_regulator_setup()
471 if (!st->hw_mode) { in adau7118_regulator_setup()
472 regcache_mark_dirty(st->map); in adau7118_regulator_setup()
473 regcache_cache_only(st->map, true); in adau7118_regulator_setup()
486 if (st->hw_mode) in adau7118_parset_dt()
489 ret = device_property_read_u32(st->dev, "adi,decimation-ratio", in adau7118_parset_dt()
503 dev_err(st->dev, "Invalid dec ratio: %u", dec_ratio); in adau7118_parset_dt()
504 return -EINVAL; in adau7118_parset_dt()
507 ret = regmap_update_bits(st->map, in adau7118_parset_dt()
514 ret = device_property_read_u32_array(st->dev, "adi,pdm-clk-map", in adau7118_parset_dt()
523 ret = regmap_update_bits(st->map, in adau7118_parset_dt()
533 int adau7118_probe(struct device *dev, struct regmap *map, bool hw_mode) in adau7118_probe() argument
540 return -ENOMEM; in adau7118_probe()
542 st->dev = dev; in adau7118_probe()
543 st->hw_mode = hw_mode; in adau7118_probe()
547 st->map = map; in adau7118_probe()
553 ret = regmap_update_bits(map, ADAU7118_REG_RESET, in adau7118_probe()
575 MODULE_DESCRIPTION("ADAU7118 8 channel PDM-to-I2S/TDM Converter driver");