[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