Lines Matching refs:formatter
13 #include "axg-tdm-formatter.h"
80 static int axg_tdm_formatter_enable(struct axg_tdm_formatter *formatter)
82 struct axg_tdm_stream *ts = formatter->stream;
86 /* Do nothing if the formatter is already enabled */
87 if (formatter->enabled)
97 * and the formatter simply starts on the lane it stopped
104 ret = reset_control_reset(formatter->reset);
111 * invert it before the formatter.
114 ret = clk_set_phase(formatter->sclk, invert ? 0 : 180);
118 /* Setup the stream parameter in the formatter */
119 ret = formatter->drv->ops->prepare(formatter->map,
120 formatter->drv->quirks,
121 formatter->stream);
125 /* Enable the signal clocks feeding the formatter */
126 ret = clk_prepare_enable(formatter->sclk);
130 ret = clk_prepare_enable(formatter->lrclk);
132 clk_disable_unprepare(formatter->sclk);
136 /* Finally, actually enable the formatter */
137 formatter->drv->ops->enable(formatter->map);
138 formatter->enabled = true;
143 static void axg_tdm_formatter_disable(struct axg_tdm_formatter *formatter)
145 /* Do nothing if the formatter is already disabled */
146 if (!formatter->enabled)
149 formatter->drv->ops->disable(formatter->map);
150 clk_disable_unprepare(formatter->lrclk);
151 clk_disable_unprepare(formatter->sclk);
152 formatter->enabled = false;
155 static int axg_tdm_formatter_attach(struct axg_tdm_formatter *formatter)
157 struct axg_tdm_stream *ts = formatter->stream;
164 ret = axg_tdm_formatter_enable(formatter);
166 pr_err("failed to enable formatter\n");
171 list_add_tail(&formatter->list, &ts->formatter_list);
177 static void axg_tdm_formatter_dettach(struct axg_tdm_formatter *formatter)
179 struct axg_tdm_stream *ts = formatter->stream;
182 list_del(&formatter->list);
185 axg_tdm_formatter_disable(formatter);
188 static int axg_tdm_formatter_power_up(struct axg_tdm_formatter *formatter,
191 struct axg_tdm_stream *ts = formatter->drv->ops->get_stream(w);
203 ret = clk_prepare_enable(formatter->pclk);
208 ret = clk_set_parent(formatter->sclk_sel, ts->iface->sclk);
213 ret = clk_set_parent(formatter->lrclk_sel, ts->iface->lrclk);
217 formatter->stream = ts;
218 ret = axg_tdm_formatter_attach(formatter);
225 clk_disable_unprepare(formatter->pclk);
229 static void axg_tdm_formatter_power_down(struct axg_tdm_formatter *formatter)
231 axg_tdm_formatter_dettach(formatter);
232 clk_disable_unprepare(formatter->pclk);
233 formatter->stream = NULL;
241 struct axg_tdm_formatter *formatter = snd_soc_component_get_drvdata(c);
246 ret = axg_tdm_formatter_power_up(formatter, w);
250 axg_tdm_formatter_power_down(formatter);
266 struct axg_tdm_formatter *formatter;
275 formatter = devm_kzalloc(dev, sizeof(*formatter), GFP_KERNEL);
276 if (!formatter)
278 platform_set_drvdata(pdev, formatter);
279 formatter->drv = drv;
285 formatter->map = devm_regmap_init_mmio(dev, regs, drv->regmap_cfg);
286 if (IS_ERR(formatter->map)) {
288 PTR_ERR(formatter->map));
289 return PTR_ERR(formatter->map);
293 formatter->pclk = devm_clk_get(dev, "pclk");
294 if (IS_ERR(formatter->pclk))
295 return dev_err_probe(dev, PTR_ERR(formatter->pclk), "failed to get pclk\n");
298 formatter->sclk = devm_clk_get(dev, "sclk");
299 if (IS_ERR(formatter->sclk))
300 return dev_err_probe(dev, PTR_ERR(formatter->sclk), "failed to get sclk\n");
303 formatter->lrclk = devm_clk_get(dev, "lrclk");
304 if (IS_ERR(formatter->lrclk))
305 return dev_err_probe(dev, PTR_ERR(formatter->lrclk), "failed to get lrclk\n");
308 formatter->sclk_sel = devm_clk_get(dev, "sclk_sel");
309 if (IS_ERR(formatter->sclk_sel))
310 return dev_err_probe(dev, PTR_ERR(formatter->sclk_sel), "failed to get sclk_sel\n");
313 formatter->lrclk_sel = devm_clk_get(dev, "lrclk_sel");
314 if (IS_ERR(formatter->lrclk_sel))
315 return dev_err_probe(dev, PTR_ERR(formatter->lrclk_sel),
319 formatter->reset = devm_reset_control_get_optional_exclusive(dev, NULL);
320 if (IS_ERR(formatter->reset))
321 return dev_err_probe(dev, PTR_ERR(formatter->reset), "failed to get reset\n");
330 struct axg_tdm_formatter *formatter;
337 list_for_each_entry(formatter, &ts->formatter_list, list) {
338 ret = axg_tdm_formatter_enable(formatter);
353 struct axg_tdm_formatter *formatter;
359 list_for_each_entry(formatter, &ts->formatter_list, list) {
360 axg_tdm_formatter_disable(formatter);
385 * If the list is not empty, it would mean that one of the formatter
395 MODULE_DESCRIPTION("Amlogic AXG TDM formatter driver");