Lines Matching defs:mcbsp
24 #include "omap-mcbsp.h"
25 #include "omap-mcbsp-priv.h"
65 static void omap_mcbsp_st_write(struct omap_mcbsp *mcbsp, u16 reg, u32 val)
67 writel_relaxed(val, mcbsp->st_data->io_base_st + reg);
70 static int omap_mcbsp_st_read(struct omap_mcbsp *mcbsp, u16 reg)
72 return readl_relaxed(mcbsp->st_data->io_base_st + reg);
75 #define MCBSP_ST_READ(mcbsp, reg) omap_mcbsp_st_read(mcbsp, OMAP_ST_REG_##reg)
76 #define MCBSP_ST_WRITE(mcbsp, reg, val) \
77 omap_mcbsp_st_write(mcbsp, OMAP_ST_REG_##reg, val)
79 static void omap_mcbsp_st_on(struct omap_mcbsp *mcbsp)
83 if (mcbsp->pdata->force_ick_on)
84 mcbsp->pdata->force_ick_on(mcbsp->st_data->mcbsp_iclk, true);
87 w = MCBSP_ST_READ(mcbsp, SYSCONFIG);
88 MCBSP_ST_WRITE(mcbsp, SYSCONFIG, w & ~(ST_AUTOIDLE));
91 w = MCBSP_READ(mcbsp, SSELCR);
92 MCBSP_WRITE(mcbsp, SSELCR, w | SIDETONEEN);
95 w = MCBSP_ST_READ(mcbsp, SSELCR);
96 MCBSP_ST_WRITE(mcbsp, SSELCR, w | ST_SIDETONEEN);
99 static void omap_mcbsp_st_off(struct omap_mcbsp *mcbsp)
103 w = MCBSP_ST_READ(mcbsp, SSELCR);
104 MCBSP_ST_WRITE(mcbsp, SSELCR, w & ~(ST_SIDETONEEN));
106 w = MCBSP_READ(mcbsp, SSELCR);
107 MCBSP_WRITE(mcbsp, SSELCR, w & ~(SIDETONEEN));
110 w = MCBSP_ST_READ(mcbsp, SYSCONFIG);
111 MCBSP_ST_WRITE(mcbsp, SYSCONFIG, w | ST_AUTOIDLE);
113 if (mcbsp->pdata->force_ick_on)
114 mcbsp->pdata->force_ick_on(mcbsp->st_data->mcbsp_iclk, false);
117 static void omap_mcbsp_st_fir_write(struct omap_mcbsp *mcbsp, s16 *fir)
121 val = MCBSP_ST_READ(mcbsp, SSELCR);
124 MCBSP_ST_WRITE(mcbsp, SSELCR, val & ~(ST_COEFFWREN));
126 MCBSP_ST_WRITE(mcbsp, SSELCR, val | ST_COEFFWREN);
129 MCBSP_ST_WRITE(mcbsp, SFIRCR, fir[i]);
133 val = MCBSP_ST_READ(mcbsp, SSELCR);
135 val = MCBSP_ST_READ(mcbsp, SSELCR);
137 MCBSP_ST_WRITE(mcbsp, SSELCR, val & ~(ST_COEFFWREN));
140 dev_err(mcbsp->dev, "McBSP FIR load error!\n");
143 static void omap_mcbsp_st_chgain(struct omap_mcbsp *mcbsp)
145 struct omap_mcbsp_st_data *st_data = mcbsp->st_data;
147 MCBSP_ST_WRITE(mcbsp, SGAINCR, ST_CH0GAIN(st_data->ch0gain) |
151 static int omap_mcbsp_st_set_chgain(struct omap_mcbsp *mcbsp, int channel,
154 struct omap_mcbsp_st_data *st_data = mcbsp->st_data;
160 spin_lock_irq(&mcbsp->lock);
169 omap_mcbsp_st_chgain(mcbsp);
170 spin_unlock_irq(&mcbsp->lock);
175 static int omap_mcbsp_st_get_chgain(struct omap_mcbsp *mcbsp, int channel,
178 struct omap_mcbsp_st_data *st_data = mcbsp->st_data;
184 spin_lock_irq(&mcbsp->lock);
191 spin_unlock_irq(&mcbsp->lock);
196 static int omap_mcbsp_st_enable(struct omap_mcbsp *mcbsp)
198 struct omap_mcbsp_st_data *st_data = mcbsp->st_data;
203 spin_lock_irq(&mcbsp->lock);
205 omap_mcbsp_st_start(mcbsp);
206 spin_unlock_irq(&mcbsp->lock);
211 static int omap_mcbsp_st_disable(struct omap_mcbsp *mcbsp)
213 struct omap_mcbsp_st_data *st_data = mcbsp->st_data;
219 spin_lock_irq(&mcbsp->lock);
220 omap_mcbsp_st_stop(mcbsp);
222 spin_unlock_irq(&mcbsp->lock);
227 static int omap_mcbsp_st_is_enabled(struct omap_mcbsp *mcbsp)
229 struct omap_mcbsp_st_data *st_data = mcbsp->st_data;
240 struct omap_mcbsp *mcbsp = dev_get_drvdata(dev);
241 struct omap_mcbsp_st_data *st_data = mcbsp->st_data;
245 spin_lock_irq(&mcbsp->lock);
251 spin_unlock_irq(&mcbsp->lock);
260 struct omap_mcbsp *mcbsp = dev_get_drvdata(dev);
261 struct omap_mcbsp_st_data *st_data = mcbsp->st_data;
264 spin_lock_irq(&mcbsp->lock);
288 spin_unlock_irq(&mcbsp->lock);
304 int omap_mcbsp_st_start(struct omap_mcbsp *mcbsp)
306 struct omap_mcbsp_st_data *st_data = mcbsp->st_data;
309 omap_mcbsp_st_fir_write(mcbsp, st_data->taps);
310 omap_mcbsp_st_chgain(mcbsp);
312 if (!mcbsp->free) {
313 omap_mcbsp_st_on(mcbsp);
321 int omap_mcbsp_st_stop(struct omap_mcbsp *mcbsp)
323 struct omap_mcbsp_st_data *st_data = mcbsp->st_data;
326 if (!mcbsp->free) {
327 omap_mcbsp_st_off(mcbsp);
337 struct omap_mcbsp *mcbsp = platform_get_drvdata(pdev);
346 st_data = devm_kzalloc(mcbsp->dev, sizeof(*mcbsp->st_data), GFP_KERNEL);
350 st_data->mcbsp_iclk = clk_get(mcbsp->dev, "ick");
352 dev_warn(mcbsp->dev,
357 st_data->io_base_st = devm_ioremap(mcbsp->dev, res->start,
362 ret = sysfs_create_group(&mcbsp->dev->kobj, &sidetone_attr_group);
366 mcbsp->st_data = st_data;
373 struct omap_mcbsp *mcbsp = platform_get_drvdata(pdev);
375 if (mcbsp->st_data) {
376 sysfs_remove_group(&mcbsp->dev->kobj, &sidetone_attr_group);
377 clk_put(mcbsp->st_data->mcbsp_iclk);
402 struct omap_mcbsp *mcbsp = snd_soc_dai_get_drvdata(cpu_dai); \
413 return omap_mcbsp_st_set_chgain(mcbsp, channel, val); \
421 struct omap_mcbsp *mcbsp = snd_soc_dai_get_drvdata(cpu_dai); \
424 if (omap_mcbsp_st_get_chgain(mcbsp, channel, &chgain)) \
438 struct omap_mcbsp *mcbsp = snd_soc_dai_get_drvdata(cpu_dai);
441 if (value == omap_mcbsp_st_is_enabled(mcbsp))
445 omap_mcbsp_st_enable(mcbsp);
447 omap_mcbsp_st_disable(mcbsp);
456 struct omap_mcbsp *mcbsp = snd_soc_dai_get_drvdata(cpu_dai);
458 ucontrol->value.integer.value[0] = omap_mcbsp_st_is_enabled(mcbsp);
490 struct omap_mcbsp *mcbsp = snd_soc_dai_get_drvdata(cpu_dai);
492 if (!mcbsp->st_data) {
493 dev_warn(mcbsp->dev, "No sidetone data for port\n");
507 dev_err(mcbsp->dev, "Port %d not supported\n", port_id);