if (mcbsp->pdata->force_ick_on)
mcbsp->pdata->force_ick_on(mcbsp->st_data->mcbsp_iclk, true);
/* Disable Sidetone clock auto-gating for normal operation */
w = MCBSP_ST_READ(mcbsp, SYSCONFIG);
MCBSP_ST_WRITE(mcbsp, SYSCONFIG, w & ~(ST_AUTOIDLE));
/* Enable McBSP Sidetone */
w = MCBSP_READ(mcbsp, SSELCR);
MCBSP_WRITE(mcbsp, SSELCR, w | SIDETONEEN);
/* Enable Sidetone from Sidetone Core */
w = MCBSP_ST_READ(mcbsp, SSELCR);
MCBSP_ST_WRITE(mcbsp, SSELCR, w | ST_SIDETONEEN);
}
w = MCBSP_ST_READ(mcbsp, SSELCR);
MCBSP_ST_WRITE(mcbsp, SSELCR, w & ~(ST_SIDETONEEN));
w = MCBSP_READ(mcbsp, SSELCR);
MCBSP_WRITE(mcbsp, SSELCR, w & ~(SIDETONEEN));
/* Enable Sidetone clock auto-gating to reduce power consumption */
w = MCBSP_ST_READ(mcbsp, SYSCONFIG);
MCBSP_ST_WRITE(mcbsp, SYSCONFIG, w | ST_AUTOIDLE);
if (mcbsp->pdata->force_ick_on)
mcbsp->pdata->force_ick_on(mcbsp->st_data->mcbsp_iclk, false);
}
spin_lock_irq(&mcbsp->lock); for (i = 0; i < st_data->nr_taps; i++)
status += sysfs_emit_at(buf, status, (i ? ", %d" : "%d"),
st_data->taps[i]); if (i)
status += sysfs_emit_at(buf, status, "\n");
spin_unlock_irq(&mcbsp->lock);
int omap_mcbsp_st_start(struct omap_mcbsp *mcbsp)
{ struct omap_mcbsp_st_data *st_data = mcbsp->st_data;
if (st_data->enabled && !st_data->running) {
omap_mcbsp_st_fir_write(mcbsp, st_data->taps);
omap_mcbsp_st_chgain(mcbsp);
if (!mcbsp->free) {
omap_mcbsp_st_on(mcbsp);
st_data->running = 1;
}
}
return0;
}
int omap_mcbsp_st_stop(struct omap_mcbsp *mcbsp)
{ struct omap_mcbsp_st_data *st_data = mcbsp->st_data;
if (st_data->running) { if (!mcbsp->free) {
omap_mcbsp_st_off(mcbsp);
st_data->running = 0;
}
}
return0;
}
int omap_mcbsp_st_init(struct platform_device *pdev)
{ struct omap_mcbsp *mcbsp = platform_get_drvdata(pdev); struct omap_mcbsp_st_data *st_data; struct resource *res; int ret;
res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "sidetone"); if (!res) return0;
st_data = devm_kzalloc(mcbsp->dev, sizeof(*mcbsp->st_data), GFP_KERNEL); if (!st_data) return -ENOMEM;
st_data->mcbsp_iclk = devm_clk_get(mcbsp->dev, "ick"); if (IS_ERR(st_data->mcbsp_iclk)) {
dev_warn(mcbsp->dev, "Failed to get ick, sidetone might be broken\n");
st_data->mcbsp_iclk = NULL;
}
st_data->io_base_st = devm_ioremap(mcbsp->dev, res->start,
resource_size(res)); if (!st_data->io_base_st) return -ENOMEM;
ret = devm_device_add_group(mcbsp->dev, &sidetone_attr_group); if (ret) return ret;
mcbsp->st_data = st_data;
return0;
}
staticint omap_mcbsp_st_info_volsw(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
{ struct soc_mixer_control *mc =
(struct soc_mixer_control *)kcontrol->private_value; int max = mc->max; int min = mc->min;
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.12Bemerkung:
(vorverarbeitet am 2026-06-07)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.