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 :)