[alsa-devel] [PATCH v6 05/10] ASoC: Intel: mrfld: add DSP core controls
Vinod Koul
vinod.koul at intel.com
Fri Sep 19 10:21:53 CEST 2014
On Fri, Sep 19, 2014 at 01:40:47PM +0530, Vinod Koul wrote:
> On Thu, Sep 18, 2014 at 10:28:52AM -0700, Mark Brown wrote:
> > On Thu, Sep 18, 2014 at 11:42:37AM +0530, Vinod Koul wrote:
> > > On Wed, Sep 17, 2014 at 12:37:06PM -0700, Mark Brown wrote:
> >
> > > > This doesn't really answer my concern - what happens if we're already
> > > > active and making a change?
> >
> > > Since this is specfic to BE (SSP) port, the DSP FW doesnt allow us to reconfigure
> > > the slots when it is active. These will take effect next time the BE
> > > restarts.
> >
> > > Yes not ideal but thats something we have to live with!
> >
> > That's fine but in that case I would expect to see an error returned to
> > userspace rather than just silently ignoring what it's doing until the
> > next time we start a stream, or at the very least some sort of warning
> > generated. Silently ignoring things isn't great especially with no
> > comments in the code, it ends up looking like a bug.
> Error to usermode wont be apt as we accept the value and due to constraint
> the value is applied at next BE start.
>
> Yes definately makes sense to put a comment about this. Will update that
And turns out that limitation is gone so I was wrong here, thanks to Shubransu for pointing this out.
This function does indeed send the updated slot values to DSP
see this bit:
static int sst_slot_put(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
struct snd_soc_component *cmpnt =snd_soc_kcontrol_component(kcontrol);
struct sst_data *drv = snd_soc_component_get_drvdata(cmpnt);
struct sst_enum *e = (void *)kcontrol->private_value;
int i, ret = 0;
unsigned int ctl_no = e->reg;
unsigned int is_tx = e->tx;
unsigned int slot_channel_no;
unsigned int val, mux;
u8 *map;
map = is_tx ? sst_ssp_channel_map : sst_ssp_slot_map;
val = 1 << ctl_no;
mux = ucontrol->value.enumerated.item[0];
if (mux > e->max - 1) {
return -EINVAL;
}
mutex_lock(&drv->lock);
/* first clear all registers of this bit */
for (i = 0; i < e->max; i++)
map[i] &= ~val;
if (mux == 0) {/* kctl set to 'none' */
mutex_unlock(&drv->lock);
return 0;
}
/* offset by one to take "None" into account */
slot_channel_no = mux - 1;
map[slot_channel_no] |= val;
dev_dbg(cmpnt->dev, "%s %s map = %#x\n",
is_tx ? "tx channel" : "rx slot",
e->texts[mux], map[slot_channel_no]);
if (e->w && e->w->power)
ret = sst_send_slot_map(drv);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Here is the widget is powered up then we send the updated slot map to DSP.
So it will be updated real time now :)
--
~Vinod
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 836 bytes
Desc: Digital signature
URL: <http://mailman.alsa-project.org/pipermail/alsa-devel/attachments/20140919/afba3667/attachment.sig>
More information about the Alsa-devel
mailing list