1 // SPDX-License-Identifier: (GPL-2.0 OR MIT)
3 // Copyright (c) 2018 BayLibre, SAS.
4 // Author: Jerome Brunet <jbrunet@baylibre.com>
7 #include <linux/module.h>
8 #include <linux/of_platform.h>
9 #include <linux/regmap.h>
10 #include <linux/reset.h>
11 #include <sound/soc.h>
13 #include "axg-tdm-formatter.h"
15 struct axg_tdm_formatter
{
16 struct list_head list
;
17 struct axg_tdm_stream
*stream
;
18 const struct axg_tdm_formatter_driver
*drv
;
23 struct clk
*lrclk_sel
;
24 struct reset_control
*reset
;
29 int axg_tdm_formatter_set_channel_masks(struct regmap
*map
,
30 struct axg_tdm_stream
*ts
,
33 unsigned int val
, ch
= ts
->channels
;
38 * Distribute the channels of the stream over the available slots
41 for (i
= 0; i
< AXG_TDM_NUM_LANES
; i
++) {
45 for (j
= find_first_bit(&mask
, 32);
47 j
= find_next_bit(&mask
, 32, j
+ 1)) {
52 regmap_write(map
, offset
, val
);
53 offset
+= regmap_get_reg_stride(map
);
57 * If we still have channel left at the end of the process, it means
58 * the stream has more channels than we can accommodate and we should
59 * have caught this earlier.
61 if (WARN_ON(ch
!= 0)) {
62 pr_err("channel mask error\n");
68 EXPORT_SYMBOL_GPL(axg_tdm_formatter_set_channel_masks
);
70 static int axg_tdm_formatter_enable(struct axg_tdm_formatter
*formatter
)
72 struct axg_tdm_stream
*ts
= formatter
->stream
;
73 bool invert
= formatter
->drv
->quirks
->invert_sclk
;
76 /* Do nothing if the formatter is already enabled */
77 if (formatter
->enabled
)
81 * On the g12a (and possibly other SoCs), when a stream using
82 * multiple lanes is restarted, it will sometimes not start
83 * from the first lane, but randomly from another used one.
84 * The result is an unexpected and random channel shift.
86 * The hypothesis is that an HW counter is not properly reset
87 * and the formatter simply starts on the lane it stopped
88 * before. Unfortunately, there does not seems to be a way to
89 * reset this through the registers of the block.
91 * However, the g12a has indenpendent reset lines for each audio
92 * devices. Using this reset before each start solves the issue.
94 ret
= reset_control_reset(formatter
->reset
);
99 * If sclk is inverted, invert it back and provide the inversion
100 * required by the formatter
102 invert
^= axg_tdm_sclk_invert(ts
->iface
->fmt
);
103 ret
= clk_set_phase(formatter
->sclk
, invert
? 180 : 0);
107 /* Setup the stream parameter in the formatter */
108 ret
= formatter
->drv
->ops
->prepare(formatter
->map
,
109 formatter
->drv
->quirks
,
114 /* Enable the signal clocks feeding the formatter */
115 ret
= clk_prepare_enable(formatter
->sclk
);
119 ret
= clk_prepare_enable(formatter
->lrclk
);
121 clk_disable_unprepare(formatter
->sclk
);
125 /* Finally, actually enable the formatter */
126 formatter
->drv
->ops
->enable(formatter
->map
);
127 formatter
->enabled
= true;
132 static void axg_tdm_formatter_disable(struct axg_tdm_formatter
*formatter
)
134 /* Do nothing if the formatter is already disabled */
135 if (!formatter
->enabled
)
138 formatter
->drv
->ops
->disable(formatter
->map
);
139 clk_disable_unprepare(formatter
->lrclk
);
140 clk_disable_unprepare(formatter
->sclk
);
141 formatter
->enabled
= false;
144 static int axg_tdm_formatter_attach(struct axg_tdm_formatter
*formatter
)
146 struct axg_tdm_stream
*ts
= formatter
->stream
;
149 mutex_lock(&ts
->lock
);
151 /* Catch up if the stream is already running when we attach */
153 ret
= axg_tdm_formatter_enable(formatter
);
155 pr_err("failed to enable formatter\n");
160 list_add_tail(&formatter
->list
, &ts
->formatter_list
);
162 mutex_unlock(&ts
->lock
);
166 static void axg_tdm_formatter_dettach(struct axg_tdm_formatter
*formatter
)
168 struct axg_tdm_stream
*ts
= formatter
->stream
;
170 mutex_lock(&ts
->lock
);
171 list_del(&formatter
->list
);
172 mutex_unlock(&ts
->lock
);
174 axg_tdm_formatter_disable(formatter
);
177 static int axg_tdm_formatter_power_up(struct axg_tdm_formatter
*formatter
,
178 struct snd_soc_dapm_widget
*w
)
180 struct axg_tdm_stream
*ts
= formatter
->drv
->ops
->get_stream(w
);
184 * If we don't get a stream at this stage, it would mean that the
185 * widget is powering up but is not attached to any backend DAI.
186 * It should not happen, ever !
191 /* Clock our device */
192 ret
= clk_prepare_enable(formatter
->pclk
);
196 /* Reparent the bit clock to the TDM interface */
197 ret
= clk_set_parent(formatter
->sclk_sel
, ts
->iface
->sclk
);
201 /* Reparent the sample clock to the TDM interface */
202 ret
= clk_set_parent(formatter
->lrclk_sel
, ts
->iface
->lrclk
);
206 formatter
->stream
= ts
;
207 ret
= axg_tdm_formatter_attach(formatter
);
214 clk_disable_unprepare(formatter
->pclk
);
218 static void axg_tdm_formatter_power_down(struct axg_tdm_formatter
*formatter
)
220 axg_tdm_formatter_dettach(formatter
);
221 clk_disable_unprepare(formatter
->pclk
);
222 formatter
->stream
= NULL
;
225 int axg_tdm_formatter_event(struct snd_soc_dapm_widget
*w
,
226 struct snd_kcontrol
*control
,
229 struct snd_soc_component
*c
= snd_soc_dapm_to_component(w
->dapm
);
230 struct axg_tdm_formatter
*formatter
= snd_soc_component_get_drvdata(c
);
234 case SND_SOC_DAPM_PRE_PMU
:
235 ret
= axg_tdm_formatter_power_up(formatter
, w
);
238 case SND_SOC_DAPM_PRE_PMD
:
239 axg_tdm_formatter_power_down(formatter
);
243 dev_err(c
->dev
, "Unexpected event %d\n", event
);
249 EXPORT_SYMBOL_GPL(axg_tdm_formatter_event
);
251 int axg_tdm_formatter_probe(struct platform_device
*pdev
)
253 struct device
*dev
= &pdev
->dev
;
254 const struct axg_tdm_formatter_driver
*drv
;
255 struct axg_tdm_formatter
*formatter
;
259 drv
= of_device_get_match_data(dev
);
261 dev_err(dev
, "failed to match device\n");
265 formatter
= devm_kzalloc(dev
, sizeof(*formatter
), GFP_KERNEL
);
268 platform_set_drvdata(pdev
, formatter
);
269 formatter
->drv
= drv
;
271 regs
= devm_platform_ioremap_resource(pdev
, 0);
273 return PTR_ERR(regs
);
275 formatter
->map
= devm_regmap_init_mmio(dev
, regs
, drv
->regmap_cfg
);
276 if (IS_ERR(formatter
->map
)) {
277 dev_err(dev
, "failed to init regmap: %ld\n",
278 PTR_ERR(formatter
->map
));
279 return PTR_ERR(formatter
->map
);
282 /* Peripharal clock */
283 formatter
->pclk
= devm_clk_get(dev
, "pclk");
284 if (IS_ERR(formatter
->pclk
)) {
285 ret
= PTR_ERR(formatter
->pclk
);
286 if (ret
!= -EPROBE_DEFER
)
287 dev_err(dev
, "failed to get pclk: %d\n", ret
);
291 /* Formatter bit clock */
292 formatter
->sclk
= devm_clk_get(dev
, "sclk");
293 if (IS_ERR(formatter
->sclk
)) {
294 ret
= PTR_ERR(formatter
->sclk
);
295 if (ret
!= -EPROBE_DEFER
)
296 dev_err(dev
, "failed to get sclk: %d\n", ret
);
300 /* Formatter sample clock */
301 formatter
->lrclk
= devm_clk_get(dev
, "lrclk");
302 if (IS_ERR(formatter
->lrclk
)) {
303 ret
= PTR_ERR(formatter
->lrclk
);
304 if (ret
!= -EPROBE_DEFER
)
305 dev_err(dev
, "failed to get lrclk: %d\n", ret
);
309 /* Formatter bit clock input multiplexer */
310 formatter
->sclk_sel
= devm_clk_get(dev
, "sclk_sel");
311 if (IS_ERR(formatter
->sclk_sel
)) {
312 ret
= PTR_ERR(formatter
->sclk_sel
);
313 if (ret
!= -EPROBE_DEFER
)
314 dev_err(dev
, "failed to get sclk_sel: %d\n", ret
);
318 /* Formatter sample clock input multiplexer */
319 formatter
->lrclk_sel
= devm_clk_get(dev
, "lrclk_sel");
320 if (IS_ERR(formatter
->lrclk_sel
)) {
321 ret
= PTR_ERR(formatter
->lrclk_sel
);
322 if (ret
!= -EPROBE_DEFER
)
323 dev_err(dev
, "failed to get lrclk_sel: %d\n", ret
);
327 /* Formatter dedicated reset line */
328 formatter
->reset
= devm_reset_control_get_optional_exclusive(dev
, NULL
);
329 if (IS_ERR(formatter
->reset
)) {
330 ret
= PTR_ERR(formatter
->reset
);
331 if (ret
!= -EPROBE_DEFER
)
332 dev_err(dev
, "failed to get reset: %d\n", ret
);
336 return devm_snd_soc_register_component(dev
, drv
->component_drv
,
339 EXPORT_SYMBOL_GPL(axg_tdm_formatter_probe
);
341 int axg_tdm_stream_start(struct axg_tdm_stream
*ts
)
343 struct axg_tdm_formatter
*formatter
;
346 mutex_lock(&ts
->lock
);
349 /* Start all the formatters attached to the stream */
350 list_for_each_entry(formatter
, &ts
->formatter_list
, list
) {
351 ret
= axg_tdm_formatter_enable(formatter
);
353 pr_err("failed to start tdm stream\n");
359 mutex_unlock(&ts
->lock
);
362 EXPORT_SYMBOL_GPL(axg_tdm_stream_start
);
364 void axg_tdm_stream_stop(struct axg_tdm_stream
*ts
)
366 struct axg_tdm_formatter
*formatter
;
368 mutex_lock(&ts
->lock
);
371 /* Stop all the formatters attached to the stream */
372 list_for_each_entry(formatter
, &ts
->formatter_list
, list
) {
373 axg_tdm_formatter_disable(formatter
);
376 mutex_unlock(&ts
->lock
);
378 EXPORT_SYMBOL_GPL(axg_tdm_stream_stop
);
380 struct axg_tdm_stream
*axg_tdm_stream_alloc(struct axg_tdm_iface
*iface
)
382 struct axg_tdm_stream
*ts
;
384 ts
= kzalloc(sizeof(*ts
), GFP_KERNEL
);
386 INIT_LIST_HEAD(&ts
->formatter_list
);
387 mutex_init(&ts
->lock
);
393 EXPORT_SYMBOL_GPL(axg_tdm_stream_alloc
);
395 void axg_tdm_stream_free(struct axg_tdm_stream
*ts
)
398 * If the list is not empty, it would mean that one of the formatter
399 * widget is still powered and attached to the interface while we
400 * we are removing the TDM DAI. It should not be possible
402 WARN_ON(!list_empty(&ts
->formatter_list
));
403 mutex_destroy(&ts
->lock
);
406 EXPORT_SYMBOL_GPL(axg_tdm_stream_free
);
408 MODULE_DESCRIPTION("Amlogic AXG TDM formatter driver");
409 MODULE_AUTHOR("Jerome Brunet <jbrunet@baylibre.com>");
410 MODULE_LICENSE("GPL v2");