Lines Matching defs:mcbsp

23 #include "omap-mcbsp.h"
24 #include "omap-mcbsp-priv.h"
64 static void omap_mcbsp_st_write(struct omap_mcbsp *mcbsp, u16 reg, u32 val)
66 writel_relaxed(val, mcbsp->st_data->io_base_st + reg);
69 static int omap_mcbsp_st_read(struct omap_mcbsp *mcbsp, u16 reg)
71 return readl_relaxed(mcbsp->st_data->io_base_st + reg);
74 #define MCBSP_ST_READ(mcbsp, reg) omap_mcbsp_st_read(mcbsp, OMAP_ST_REG_##reg)
75 #define MCBSP_ST_WRITE(mcbsp, reg, val) \
76 omap_mcbsp_st_write(mcbsp, OMAP_ST_REG_##reg, val)
78 static void omap_mcbsp_st_on(struct omap_mcbsp *mcbsp)
82 if (mcbsp->pdata->force_ick_on)
83 mcbsp->pdata->force_ick_on(mcbsp->st_data->mcbsp_iclk, true);
86 w = MCBSP_ST_READ(mcbsp, SYSCONFIG);
87 MCBSP_ST_WRITE(mcbsp, SYSCONFIG, w & ~(ST_AUTOIDLE));
90 w = MCBSP_READ(mcbsp, SSELCR);
91 MCBSP_WRITE(mcbsp, SSELCR, w | SIDETONEEN);
94 w = MCBSP_ST_READ(mcbsp, SSELCR);
95 MCBSP_ST_WRITE(mcbsp, SSELCR, w | ST_SIDETONEEN);
98 static void omap_mcbsp_st_off(struct omap_mcbsp *mcbsp)
102 w = MCBSP_ST_READ(mcbsp, SSELCR);
103 MCBSP_ST_WRITE(mcbsp, SSELCR, w & ~(ST_SIDETONEEN));
105 w = MCBSP_READ(mcbsp, SSELCR);
106 MCBSP_WRITE(mcbsp, SSELCR, w & ~(SIDETONEEN));
109 w = MCBSP_ST_READ(mcbsp, SYSCONFIG);
110 MCBSP_ST_WRITE(mcbsp, SYSCONFIG, w | ST_AUTOIDLE);
112 if (mcbsp->pdata->force_ick_on)
113 mcbsp->pdata->force_ick_on(mcbsp->st_data->mcbsp_iclk, false);
116 static void omap_mcbsp_st_fir_write(struct omap_mcbsp *mcbsp, s16 *fir)
120 val = MCBSP_ST_READ(mcbsp, SSELCR);
123 MCBSP_ST_WRITE(mcbsp, SSELCR, val & ~(ST_COEFFWREN));
125 MCBSP_ST_WRITE(mcbsp, SSELCR, val | ST_COEFFWREN);
128 MCBSP_ST_WRITE(mcbsp, SFIRCR, fir[i]);
132 val = MCBSP_ST_READ(mcbsp, SSELCR);
134 val = MCBSP_ST_READ(mcbsp, SSELCR);
136 MCBSP_ST_WRITE(mcbsp, SSELCR, val & ~(ST_COEFFWREN));
139 dev_err(mcbsp->dev, "McBSP FIR load error!\n");
142 static void omap_mcbsp_st_chgain(struct omap_mcbsp *mcbsp)
144 struct omap_mcbsp_st_data *st_data = mcbsp->st_data;
146 MCBSP_ST_WRITE(mcbsp, SGAINCR, ST_CH0GAIN(st_data->ch0gain) |
150 static int omap_mcbsp_st_set_chgain(struct omap_mcbsp *mcbsp, int channel,
153 struct omap_mcbsp_st_data *st_data = mcbsp->st_data;
159 spin_lock_irq(&mcbsp->lock);
168 omap_mcbsp_st_chgain(mcbsp);
169 spin_unlock_irq(&mcbsp->lock);
174 static int omap_mcbsp_st_get_chgain(struct omap_mcbsp *mcbsp, int channel,
177 struct omap_mcbsp_st_data *st_data = mcbsp->st_data;
183 spin_lock_irq(&mcbsp->lock);
190 spin_unlock_irq(&mcbsp->lock);
195 static int omap_mcbsp_st_enable(struct omap_mcbsp *mcbsp)
197 struct omap_mcbsp_st_data *st_data = mcbsp->st_data;
202 spin_lock_irq(&mcbsp->lock);
204 omap_mcbsp_st_start(mcbsp);
205 spin_unlock_irq(&mcbsp->lock);
210 static int omap_mcbsp_st_disable(struct omap_mcbsp *mcbsp)
212 struct omap_mcbsp_st_data *st_data = mcbsp->st_data;
218 spin_lock_irq(&mcbsp->lock);
219 omap_mcbsp_st_stop(mcbsp);
221 spin_unlock_irq(&mcbsp->lock);
226 static int omap_mcbsp_st_is_enabled(struct omap_mcbsp *mcbsp)
228 struct omap_mcbsp_st_data *st_data = mcbsp->st_data;
239 struct omap_mcbsp *mcbsp = dev_get_drvdata(dev);
240 struct omap_mcbsp_st_data *st_data = mcbsp->st_data;
244 spin_lock_irq(&mcbsp->lock);
250 spin_unlock_irq(&mcbsp->lock);
259 struct omap_mcbsp *mcbsp = dev_get_drvdata(dev);
260 struct omap_mcbsp_st_data *st_data = mcbsp->st_data;
263 spin_lock_irq(&mcbsp->lock);
287 spin_unlock_irq(&mcbsp->lock);
303 int omap_mcbsp_st_start(struct omap_mcbsp *mcbsp)
305 struct omap_mcbsp_st_data *st_data = mcbsp->st_data;
308 omap_mcbsp_st_fir_write(mcbsp, st_data->taps);
309 omap_mcbsp_st_chgain(mcbsp);
311 if (!mcbsp->free) {
312 omap_mcbsp_st_on(mcbsp);
320 int omap_mcbsp_st_stop(struct omap_mcbsp *mcbsp)
322 struct omap_mcbsp_st_data *st_data = mcbsp->st_data;
325 if (!mcbsp->free) {
326 omap_mcbsp_st_off(mcbsp);
336 struct omap_mcbsp *mcbsp = platform_get_drvdata(pdev);
345 st_data = devm_kzalloc(mcbsp->dev, sizeof(*mcbsp->st_data), GFP_KERNEL);
349 st_data->mcbsp_iclk = devm_clk_get(mcbsp->dev, "ick");
351 dev_warn(mcbsp->dev,
356 st_data->io_base_st = devm_ioremap(mcbsp->dev, res->start,
361 ret = devm_device_add_group(mcbsp->dev, &sidetone_attr_group);
365 mcbsp->st_data = st_data;
391 struct omap_mcbsp *mcbsp = snd_soc_dai_get_drvdata(cpu_dai); \
402 return omap_mcbsp_st_set_chgain(mcbsp, channel, val); \
410 struct omap_mcbsp *mcbsp = snd_soc_dai_get_drvdata(cpu_dai); \
413 if (omap_mcbsp_st_get_chgain(mcbsp, channel, &chgain)) \
427 struct omap_mcbsp *mcbsp = snd_soc_dai_get_drvdata(cpu_dai);
430 if (value == omap_mcbsp_st_is_enabled(mcbsp))
434 omap_mcbsp_st_enable(mcbsp);
436 omap_mcbsp_st_disable(mcbsp);
445 struct omap_mcbsp *mcbsp = snd_soc_dai_get_drvdata(cpu_dai);
447 ucontrol->value.integer.value[0] = omap_mcbsp_st_is_enabled(mcbsp);
479 struct omap_mcbsp *mcbsp = snd_soc_dai_get_drvdata(cpu_dai);
481 if (!mcbsp->st_data) {
482 dev_warn(mcbsp->dev, "No sidetone data for port\n");
496 dev_err(mcbsp->dev, "Port %d not supported\n", port_id);