Lines Matching +full:reg +full:- +full:names

1 // SPDX-License-Identifier: GPL-2.0-only
3 // tegra210_admaif.c - Tegra ADMAIF driver
20 #define CH_REG(offset, reg, id) \ argument
21 ((offset) + (reg) + (TEGRA_ADMAIF_CHANNEL_REG_STRIDE * (id)))
23 #define CH_TX_REG(reg, id) CH_REG(admaif->soc_data->tx_base, reg, id) argument
25 #define CH_RX_REG(reg, id) CH_REG(admaif->soc_data->rx_base, reg, id) argument
36 REG_DEFAULTS((id) - 1, \
80 static bool tegra_admaif_wr_reg(struct device *dev, unsigned int reg) in tegra_admaif_wr_reg() argument
84 unsigned int num_ch = admaif->soc_data->num_ch; in tegra_admaif_wr_reg()
85 unsigned int rx_base = admaif->soc_data->rx_base; in tegra_admaif_wr_reg()
86 unsigned int tx_base = admaif->soc_data->tx_base; in tegra_admaif_wr_reg()
87 unsigned int global_base = admaif->soc_data->global_base; in tegra_admaif_wr_reg()
88 unsigned int reg_max = admaif->soc_data->regmap_conf->max_register; in tegra_admaif_wr_reg()
92 if ((reg >= rx_base) && (reg < rx_max)) { in tegra_admaif_wr_reg()
93 reg = (reg - rx_base) % ch_stride; in tegra_admaif_wr_reg()
94 if ((reg == TEGRA_ADMAIF_RX_ENABLE) || in tegra_admaif_wr_reg()
95 (reg == TEGRA_ADMAIF_RX_FIFO_CTRL) || in tegra_admaif_wr_reg()
96 (reg == TEGRA_ADMAIF_RX_SOFT_RESET) || in tegra_admaif_wr_reg()
97 (reg == TEGRA_ADMAIF_CH_ACIF_RX_CTRL)) in tegra_admaif_wr_reg()
99 } else if ((reg >= tx_base) && (reg < tx_max)) { in tegra_admaif_wr_reg()
100 reg = (reg - tx_base) % ch_stride; in tegra_admaif_wr_reg()
101 if ((reg == TEGRA_ADMAIF_TX_ENABLE) || in tegra_admaif_wr_reg()
102 (reg == TEGRA_ADMAIF_TX_FIFO_CTRL) || in tegra_admaif_wr_reg()
103 (reg == TEGRA_ADMAIF_TX_SOFT_RESET) || in tegra_admaif_wr_reg()
104 (reg == TEGRA_ADMAIF_CH_ACIF_TX_CTRL)) in tegra_admaif_wr_reg()
106 } else if ((reg >= global_base) && (reg < reg_max)) { in tegra_admaif_wr_reg()
107 if (reg == (global_base + TEGRA_ADMAIF_GLOBAL_ENABLE)) in tegra_admaif_wr_reg()
114 static bool tegra_admaif_rd_reg(struct device *dev, unsigned int reg) in tegra_admaif_rd_reg() argument
118 unsigned int num_ch = admaif->soc_data->num_ch; in tegra_admaif_rd_reg()
119 unsigned int rx_base = admaif->soc_data->rx_base; in tegra_admaif_rd_reg()
120 unsigned int tx_base = admaif->soc_data->tx_base; in tegra_admaif_rd_reg()
121 unsigned int global_base = admaif->soc_data->global_base; in tegra_admaif_rd_reg()
122 unsigned int reg_max = admaif->soc_data->regmap_conf->max_register; in tegra_admaif_rd_reg()
126 if ((reg >= rx_base) && (reg < rx_max)) { in tegra_admaif_rd_reg()
127 reg = (reg - rx_base) % ch_stride; in tegra_admaif_rd_reg()
128 if ((reg == TEGRA_ADMAIF_RX_ENABLE) || in tegra_admaif_rd_reg()
129 (reg == TEGRA_ADMAIF_RX_STATUS) || in tegra_admaif_rd_reg()
130 (reg == TEGRA_ADMAIF_RX_INT_STATUS) || in tegra_admaif_rd_reg()
131 (reg == TEGRA_ADMAIF_RX_FIFO_CTRL) || in tegra_admaif_rd_reg()
132 (reg == TEGRA_ADMAIF_RX_SOFT_RESET) || in tegra_admaif_rd_reg()
133 (reg == TEGRA_ADMAIF_CH_ACIF_RX_CTRL)) in tegra_admaif_rd_reg()
135 } else if ((reg >= tx_base) && (reg < tx_max)) { in tegra_admaif_rd_reg()
136 reg = (reg - tx_base) % ch_stride; in tegra_admaif_rd_reg()
137 if ((reg == TEGRA_ADMAIF_TX_ENABLE) || in tegra_admaif_rd_reg()
138 (reg == TEGRA_ADMAIF_TX_STATUS) || in tegra_admaif_rd_reg()
139 (reg == TEGRA_ADMAIF_TX_INT_STATUS) || in tegra_admaif_rd_reg()
140 (reg == TEGRA_ADMAIF_TX_FIFO_CTRL) || in tegra_admaif_rd_reg()
141 (reg == TEGRA_ADMAIF_TX_SOFT_RESET) || in tegra_admaif_rd_reg()
142 (reg == TEGRA_ADMAIF_CH_ACIF_TX_CTRL)) in tegra_admaif_rd_reg()
144 } else if ((reg >= global_base) && (reg < reg_max)) { in tegra_admaif_rd_reg()
145 if ((reg == (global_base + TEGRA_ADMAIF_GLOBAL_ENABLE)) || in tegra_admaif_rd_reg()
146 (reg == (global_base + TEGRA_ADMAIF_GLOBAL_CG_0)) || in tegra_admaif_rd_reg()
147 (reg == (global_base + TEGRA_ADMAIF_GLOBAL_STATUS)) || in tegra_admaif_rd_reg()
148 (reg == (global_base + in tegra_admaif_rd_reg()
150 (reg == (global_base + in tegra_admaif_rd_reg()
158 static bool tegra_admaif_volatile_reg(struct device *dev, unsigned int reg) in tegra_admaif_volatile_reg() argument
162 unsigned int num_ch = admaif->soc_data->num_ch; in tegra_admaif_volatile_reg()
163 unsigned int rx_base = admaif->soc_data->rx_base; in tegra_admaif_volatile_reg()
164 unsigned int tx_base = admaif->soc_data->tx_base; in tegra_admaif_volatile_reg()
165 unsigned int global_base = admaif->soc_data->global_base; in tegra_admaif_volatile_reg()
166 unsigned int reg_max = admaif->soc_data->regmap_conf->max_register; in tegra_admaif_volatile_reg()
170 if ((reg >= rx_base) && (reg < rx_max)) { in tegra_admaif_volatile_reg()
171 reg = (reg - rx_base) % ch_stride; in tegra_admaif_volatile_reg()
172 if ((reg == TEGRA_ADMAIF_RX_ENABLE) || in tegra_admaif_volatile_reg()
173 (reg == TEGRA_ADMAIF_RX_STATUS) || in tegra_admaif_volatile_reg()
174 (reg == TEGRA_ADMAIF_RX_INT_STATUS) || in tegra_admaif_volatile_reg()
175 (reg == TEGRA_ADMAIF_RX_SOFT_RESET)) in tegra_admaif_volatile_reg()
177 } else if ((reg >= tx_base) && (reg < tx_max)) { in tegra_admaif_volatile_reg()
178 reg = (reg - tx_base) % ch_stride; in tegra_admaif_volatile_reg()
179 if ((reg == TEGRA_ADMAIF_TX_ENABLE) || in tegra_admaif_volatile_reg()
180 (reg == TEGRA_ADMAIF_TX_STATUS) || in tegra_admaif_volatile_reg()
181 (reg == TEGRA_ADMAIF_TX_INT_STATUS) || in tegra_admaif_volatile_reg()
182 (reg == TEGRA_ADMAIF_TX_SOFT_RESET)) in tegra_admaif_volatile_reg()
184 } else if ((reg >= global_base) && (reg < reg_max)) { in tegra_admaif_volatile_reg()
185 if ((reg == (global_base + TEGRA_ADMAIF_GLOBAL_STATUS)) || in tegra_admaif_volatile_reg()
186 (reg == (global_base + in tegra_admaif_volatile_reg()
188 (reg == (global_base + in tegra_admaif_volatile_reg()
226 regcache_cache_only(admaif->regmap, true); in tegra_admaif_runtime_suspend()
227 regcache_mark_dirty(admaif->regmap); in tegra_admaif_runtime_suspend()
236 regcache_cache_only(admaif->regmap, false); in tegra_admaif_runtime_resume()
237 regcache_sync(admaif->regmap); in tegra_admaif_runtime_resume()
242 static int tegra_admaif_set_pack_mode(struct regmap *map, unsigned int reg, in tegra_admaif_set_pack_mode() argument
247 regmap_update_bits(map, reg, PACK8_EN_MASK, PACK8_EN); in tegra_admaif_set_pack_mode()
248 regmap_update_bits(map, reg, PACK16_EN_MASK, 0); in tegra_admaif_set_pack_mode()
251 regmap_update_bits(map, reg, PACK16_EN_MASK, PACK16_EN); in tegra_admaif_set_pack_mode()
252 regmap_update_bits(map, reg, PACK8_EN_MASK, 0); in tegra_admaif_set_pack_mode()
255 regmap_update_bits(map, reg, PACK16_EN_MASK, 0); in tegra_admaif_set_pack_mode()
256 regmap_update_bits(map, reg, PACK8_EN_MASK, 0); in tegra_admaif_set_pack_mode()
259 return -EINVAL; in tegra_admaif_set_pack_mode()
269 struct device *dev = dai->dev; in tegra_admaif_hw_params()
272 unsigned int reg, path; in tegra_admaif_hw_params() local
295 return -EOPNOTSUPP; in tegra_admaif_hw_params()
302 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { in tegra_admaif_hw_params()
304 reg = CH_TX_REG(TEGRA_ADMAIF_CH_ACIF_TX_CTRL, dai->id); in tegra_admaif_hw_params()
307 reg = CH_RX_REG(TEGRA_ADMAIF_CH_ACIF_RX_CTRL, dai->id); in tegra_admaif_hw_params()
310 cif_conf.mono_conv = admaif->mono_to_stereo[path][dai->id]; in tegra_admaif_hw_params()
311 cif_conf.stereo_conv = admaif->stereo_to_mono[path][dai->id]; in tegra_admaif_hw_params()
313 tegra_admaif_set_pack_mode(admaif->regmap, reg, valid_bit); in tegra_admaif_hw_params()
315 tegra_set_cif(admaif->regmap, reg, &cif_conf); in tegra_admaif_hw_params()
323 unsigned int reg, mask, val; in tegra_admaif_start() local
329 reg = CH_TX_REG(TEGRA_ADMAIF_TX_ENABLE, dai->id); in tegra_admaif_start()
334 reg = CH_RX_REG(TEGRA_ADMAIF_RX_ENABLE, dai->id); in tegra_admaif_start()
337 return -EINVAL; in tegra_admaif_start()
340 regmap_update_bits(admaif->regmap, reg, mask, val); in tegra_admaif_start()
357 enable_reg = CH_TX_REG(TEGRA_ADMAIF_TX_ENABLE, dai->id); in tegra_admaif_stop()
358 status_reg = CH_TX_REG(TEGRA_ADMAIF_TX_STATUS, dai->id); in tegra_admaif_stop()
359 reset_reg = CH_TX_REG(TEGRA_ADMAIF_TX_SOFT_RESET, dai->id); in tegra_admaif_stop()
365 enable_reg = CH_RX_REG(TEGRA_ADMAIF_RX_ENABLE, dai->id); in tegra_admaif_stop()
366 status_reg = CH_RX_REG(TEGRA_ADMAIF_RX_STATUS, dai->id); in tegra_admaif_stop()
367 reset_reg = CH_RX_REG(TEGRA_ADMAIF_RX_SOFT_RESET, dai->id); in tegra_admaif_stop()
370 return -EINVAL; in tegra_admaif_stop()
374 regmap_update_bits(admaif->regmap, enable_reg, mask, ~enable); in tegra_admaif_stop()
377 err = regmap_read_poll_timeout_atomic(admaif->regmap, status_reg, val, in tegra_admaif_stop()
380 dev_warn(dai->dev, "timeout: failed to disable ADMAIF%d_%s\n", in tegra_admaif_stop()
381 dai->id + 1, dir_name); in tegra_admaif_stop()
384 regmap_update_bits(admaif->regmap, reset_reg, SW_RESET_MASK, SW_RESET); in tegra_admaif_stop()
387 err = regmap_read_poll_timeout_atomic(admaif->regmap, reset_reg, val, in tegra_admaif_stop()
391 dev_err(dai->dev, "timeout: SW reset failed for ADMAIF%d_%s\n", in tegra_admaif_stop()
392 dai->id + 1, dir_name); in tegra_admaif_stop()
412 return tegra_admaif_start(dai, substream->stream); in tegra_admaif_trigger()
416 return tegra_admaif_stop(dai, substream->stream); in tegra_admaif_trigger()
418 return -EINVAL; in tegra_admaif_trigger()
431 struct soc_enum *ec = (struct soc_enum *)kcontrol->private_value; in tegra_admaif_get_control()
433 long *uctl_val = &ucontrol->value.integer.value[0]; in tegra_admaif_get_control()
435 if (strstr(kcontrol->id.name, "Playback Mono To Stereo")) in tegra_admaif_get_control()
436 *uctl_val = admaif->mono_to_stereo[ADMAIF_TX_PATH][ec->reg]; in tegra_admaif_get_control()
437 else if (strstr(kcontrol->id.name, "Capture Mono To Stereo")) in tegra_admaif_get_control()
438 *uctl_val = admaif->mono_to_stereo[ADMAIF_RX_PATH][ec->reg]; in tegra_admaif_get_control()
439 else if (strstr(kcontrol->id.name, "Playback Stereo To Mono")) in tegra_admaif_get_control()
440 *uctl_val = admaif->stereo_to_mono[ADMAIF_TX_PATH][ec->reg]; in tegra_admaif_get_control()
441 else if (strstr(kcontrol->id.name, "Capture Stereo To Mono")) in tegra_admaif_get_control()
442 *uctl_val = admaif->stereo_to_mono[ADMAIF_RX_PATH][ec->reg]; in tegra_admaif_get_control()
451 struct soc_enum *ec = (struct soc_enum *)kcontrol->private_value; in tegra_admaif_put_control()
453 int value = ucontrol->value.integer.value[0]; in tegra_admaif_put_control()
455 if (strstr(kcontrol->id.name, "Playback Mono To Stereo")) in tegra_admaif_put_control()
456 admaif->mono_to_stereo[ADMAIF_TX_PATH][ec->reg] = value; in tegra_admaif_put_control()
457 else if (strstr(kcontrol->id.name, "Capture Mono To Stereo")) in tegra_admaif_put_control()
458 admaif->mono_to_stereo[ADMAIF_RX_PATH][ec->reg] = value; in tegra_admaif_put_control()
459 else if (strstr(kcontrol->id.name, "Playback Stereo To Mono")) in tegra_admaif_put_control()
460 admaif->stereo_to_mono[ADMAIF_TX_PATH][ec->reg] = value; in tegra_admaif_put_control()
461 else if (strstr(kcontrol->id.name, "Capture Stereo To Mono")) in tegra_admaif_put_control()
462 admaif->stereo_to_mono[ADMAIF_RX_PATH][ec->reg] = value; in tegra_admaif_put_control()
471 dai->capture_dma_data = &admaif->capture_dma_data[dai->id]; in tegra_admaif_dai_probe()
472 dai->playback_dma_data = &admaif->playback_dma_data[dai->id]; in tegra_admaif_dai_probe()
561 #define TEGRA_ADMAIF_CIF_CTRL(reg) \ argument
562 NV_SOC_ENUM_EXT("ADMAIF" #reg " Playback Mono To Stereo", reg - 1,\
565 NV_SOC_ENUM_EXT("ADMAIF" #reg " Playback Stereo To Mono", reg - 1,\
568 NV_SOC_ENUM_EXT("ADMAIF" #reg " Capture Mono To Stereo", reg - 1, \
571 NV_SOC_ENUM_EXT("ADMAIF" #reg " Capture Stereo To Mono", reg - 1, \
658 { .compatible = "nvidia,tegra210-admaif", .data = &soc_data_tegra210 },
659 { .compatible = "nvidia,tegra186-admaif", .data = &soc_data_tegra186 },
671 admaif = devm_kzalloc(&pdev->dev, sizeof(*admaif), GFP_KERNEL); in tegra_admaif_probe()
673 return -ENOMEM; in tegra_admaif_probe()
675 admaif->soc_data = of_device_get_match_data(&pdev->dev); in tegra_admaif_probe()
677 dev_set_drvdata(&pdev->dev, admaif); in tegra_admaif_probe()
679 admaif->capture_dma_data = in tegra_admaif_probe()
680 devm_kcalloc(&pdev->dev, in tegra_admaif_probe()
681 admaif->soc_data->num_ch, in tegra_admaif_probe()
684 if (!admaif->capture_dma_data) in tegra_admaif_probe()
685 return -ENOMEM; in tegra_admaif_probe()
687 admaif->playback_dma_data = in tegra_admaif_probe()
688 devm_kcalloc(&pdev->dev, in tegra_admaif_probe()
689 admaif->soc_data->num_ch, in tegra_admaif_probe()
692 if (!admaif->playback_dma_data) in tegra_admaif_probe()
693 return -ENOMEM; in tegra_admaif_probe()
696 admaif->mono_to_stereo[i] = in tegra_admaif_probe()
697 devm_kcalloc(&pdev->dev, admaif->soc_data->num_ch, in tegra_admaif_probe()
699 if (!admaif->mono_to_stereo[i]) in tegra_admaif_probe()
700 return -ENOMEM; in tegra_admaif_probe()
702 admaif->stereo_to_mono[i] = in tegra_admaif_probe()
703 devm_kcalloc(&pdev->dev, admaif->soc_data->num_ch, in tegra_admaif_probe()
705 if (!admaif->stereo_to_mono[i]) in tegra_admaif_probe()
706 return -ENOMEM; in tegra_admaif_probe()
711 regs = devm_ioremap_resource(&pdev->dev, res); in tegra_admaif_probe()
715 admaif->regmap = devm_regmap_init_mmio(&pdev->dev, regs, in tegra_admaif_probe()
716 admaif->soc_data->regmap_conf); in tegra_admaif_probe()
717 if (IS_ERR(admaif->regmap)) { in tegra_admaif_probe()
718 dev_err(&pdev->dev, "regmap init failed\n"); in tegra_admaif_probe()
719 return PTR_ERR(admaif->regmap); in tegra_admaif_probe()
722 regcache_cache_only(admaif->regmap, true); in tegra_admaif_probe()
724 regmap_update_bits(admaif->regmap, admaif->soc_data->global_base + in tegra_admaif_probe()
727 for (i = 0; i < admaif->soc_data->num_ch; i++) { in tegra_admaif_probe()
728 admaif->playback_dma_data[i].addr = res->start + in tegra_admaif_probe()
731 admaif->capture_dma_data[i].addr = res->start + in tegra_admaif_probe()
734 admaif->playback_dma_data[i].addr_width = 32; in tegra_admaif_probe()
736 if (of_property_read_string_index(pdev->dev.of_node, in tegra_admaif_probe()
737 "dma-names", (i * 2) + 1, in tegra_admaif_probe()
738 &admaif->playback_dma_data[i].chan_name) < 0) { in tegra_admaif_probe()
739 dev_err(&pdev->dev, in tegra_admaif_probe()
740 "missing property nvidia,dma-names\n"); in tegra_admaif_probe()
742 return -ENODEV; in tegra_admaif_probe()
745 admaif->capture_dma_data[i].addr_width = 32; in tegra_admaif_probe()
747 if (of_property_read_string_index(pdev->dev.of_node, in tegra_admaif_probe()
748 "dma-names", in tegra_admaif_probe()
750 &admaif->capture_dma_data[i].chan_name) < 0) { in tegra_admaif_probe()
751 dev_err(&pdev->dev, in tegra_admaif_probe()
752 "missing property nvidia,dma-names\n"); in tegra_admaif_probe()
754 return -ENODEV; in tegra_admaif_probe()
758 err = devm_snd_soc_register_component(&pdev->dev, in tegra_admaif_probe()
759 admaif->soc_data->cmpnt, in tegra_admaif_probe()
760 admaif->soc_data->dais, in tegra_admaif_probe()
761 admaif->soc_data->num_ch); in tegra_admaif_probe()
763 dev_err(&pdev->dev, in tegra_admaif_probe()
768 pm_runtime_enable(&pdev->dev); in tegra_admaif_probe()
775 pm_runtime_disable(&pdev->dev); in tegra_admaif_remove()
791 .name = "tegra210-admaif",