Message ID | 20200424132002.3850-3-mateusz.gorski@linux.intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Add support for different DMIC configurations | expand |
> +static int skl_tplg_multi_config_set_get(struct snd_kcontrol *kcontrol, > + struct snd_ctl_elem_value *ucontrol, bool is_set) > +{ > + struct snd_soc_component *component = > + snd_soc_kcontrol_component(kcontrol); > + struct hdac_bus *bus = snd_soc_component_get_drvdata(component); > + struct skl_dev *skl = bus_to_skl(bus); > + struct skl_pipeline *ppl; > + struct skl_pipe *pipe = NULL; > + struct soc_enum *ec = (struct soc_enum *)kcontrol->private_value; > + u32 *pipe_id; > + > + if (!ec) > + return -EINVAL; > + > + if (is_set && (ucontrol->value.enumerated.item[0] > ec->items)) > + return -EINVAL; > + > + pipe_id = ec->dobj.private; > + > + list_for_each_entry(ppl, &skl->ppl_list, node) { > + if (ppl->pipe->ppl_id == *pipe_id) { > + pipe = ppl->pipe; > + break; > + } > + } is there an alignment issue here or just a diff illusion? > + if (!pipe) > + return -EIO; > + > + if (is_set) > + pipe->pipe_config_idx = ucontrol->value.enumerated.item[0]; > + else > + ucontrol->value.enumerated.item[0] = pipe->pipe_config_idx; > + > + return 0; > +} > + You also have a number of other alignment/style issues reported by checkpatch.pl --------------------------------------------------------------- 0001-ASoC-Intel-Skylake-Add-alternative-topology-binary-n.patch --------------------------------------------------------------- CHECK: Alignment should match open parenthesis #41: FILE: sound/soc/intel/skylake/skl-topology.c:3572: + snprintf(alt_tplg_name, sizeof(alt_tplg_name), "%s-tplg.bin", + skl->mach->drv_name); CHECK: Alignment should match open parenthesis #43: FILE: sound/soc/intel/skylake/skl-topology.c:3574: + dev_info(bus->dev, "tplg fw %s load failed with %d, trying alternative tplg name %s", + skl->tplg_name, ret, alt_tplg_name); CHECK: Alignment should match open parenthesis #50: FILE: sound/soc/intel/skylake/skl-topology.c:3581: + dev_info(bus->dev, "tplg %s failed with %d, falling back to dfw_sst.bin", + alt_tplg_name, ret); -------------------------------------------------------------- 0002-ASoC-Intel-Multiple-I-O-PCM-format-support-for-pipe.patch -------------------------------------------------------------- CHECK: spaces preferred around that '+' (ctx:VxV) #58: FILE: sound/soc/intel/skylake/skl-topology.c:597: + next_fmt = &pipe->configs[i+1].out_fmt; ^ CHECK: spaces preferred around that '+' (ctx:VxV) #61: FILE: sound/soc/intel/skylake/skl-topology.c:600: + next_fmt = &pipe->configs[i+1].in_fmt; ^ CHECK: Alignment should match open parenthesis #86: FILE: sound/soc/intel/skylake/skl-topology.c:640: + dev_dbg(skl->dev, "found pipe config idx:%d\n", + pipe->cur_config_idx); CHECK: Alignment should match open parenthesis #98: FILE: sound/soc/intel/skylake/skl-topology.c:1359: +static int skl_tplg_multi_config_set_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol, bool is_set) CHECK: Unnecessary parentheses around 'ucontrol->value.enumerated.item[0] > ec->items' #112: FILE: sound/soc/intel/skylake/skl-topology.c:1373: + if (is_set && (ucontrol->value.enumerated.item[0] > ec->items)) CHECK: Alignment should match open parenthesis #135: FILE: sound/soc/intel/skylake/skl-topology.c:1396: +static int skl_tplg_multi_config_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) CHECK: Alignment should match open parenthesis #141: FILE: sound/soc/intel/skylake/skl-topology.c:1402: +static int skl_tplg_multi_config_set(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) --------------------------------------------------------------- 0003-ASoC-Intel-Skylake-Automatic-DMIC-format-configurati.patch --------------------------------------------------------------- CHECK: Alignment should match open parenthesis #40: FILE: sound/soc/intel/skylake/skl-topology.c:1408: +static int skl_tplg_multi_config_get_dmic(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) CHECK: Alignment should match open parenthesis #46: FILE: sound/soc/intel/skylake/skl-topology.c:1414: +static int skl_tplg_multi_config_set_dmic(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) CHECK: Alignment should match open parenthesis #110: FILE: sound/soc/intel/skylake/skl-topology.c:3627: + if (dobj->type != SND_SOC_DOBJ_ENUM || + dobj->control.kcontrol->put !=
>> + list_for_each_entry(ppl, &skl->ppl_list, node) { >> + if (ppl->pipe->ppl_id == *pipe_id) { >> + pipe = ppl->pipe; >> + break; >> + } >> + } > > is there an alignment issue here or just a diff illusion? There was, changed in v5. > > You also have a number of other alignment/style issues reported by > checkpatch.pl > I have only validated with standard chechpatch.pl settings, scanned with *--strict *and addressed all warnings in patchset v5. Thanks, Mateusz
diff --git a/include/uapi/sound/skl-tplg-interface.h b/include/uapi/sound/skl-tplg-interface.h index 9eee32f5e407..f2711186c81f 100644 --- a/include/uapi/sound/skl-tplg-interface.h +++ b/include/uapi/sound/skl-tplg-interface.h @@ -18,6 +18,7 @@ */ #define SKL_CONTROL_TYPE_BYTE_TLV 0x100 #define SKL_CONTROL_TYPE_MIC_SELECT 0x102 +#define SKL_CONTROL_TYPE_MULTI_IO_SELECT 0x103 #define HDA_SST_CFG_MAX 900 /* size of copier cfg*/ #define MAX_IN_QUEUE 8 diff --git a/sound/soc/intel/skylake/skl-topology.c b/sound/soc/intel/skylake/skl-topology.c index 34ddbdc2b32a..f51eaf77aad3 100644 --- a/sound/soc/intel/skylake/skl-topology.c +++ b/sound/soc/intel/skylake/skl-topology.c @@ -579,6 +579,38 @@ static int skl_tplg_unload_pipe_modules(struct skl_dev *skl, return ret; } +static bool skl_tplg_is_multi_fmt(struct skl_dev *skl, struct skl_pipe *pipe) +{ + struct skl_pipe_fmt *cur_fmt; + struct skl_pipe_fmt *next_fmt; + int i; + + if (pipe->nr_cfgs <= 1) + return false; + + if (pipe->conn_type != SKL_PIPE_CONN_TYPE_FE) + return true; + + for (i = 0; i < pipe->nr_cfgs - 1; i++) { + if (pipe->direction == SNDRV_PCM_STREAM_PLAYBACK) { + cur_fmt = &pipe->configs[i].out_fmt; + next_fmt = &pipe->configs[i+1].out_fmt; + } else { + cur_fmt = &pipe->configs[i].in_fmt; + next_fmt = &pipe->configs[i+1].in_fmt; + } + + if (!CHECK_HW_PARAMS(cur_fmt->channels, cur_fmt->freq, + cur_fmt->bps, + next_fmt->channels, + next_fmt->freq, + next_fmt->bps)) + return true; + } + + return false; +} + /* * Here, we select pipe format based on the pipe type and pipe * direction to determine the current config index for the pipeline. @@ -601,6 +633,14 @@ skl_tplg_get_pipe_config(struct skl_dev *skl, struct skl_module_cfg *mconfig) return 0; } + if (skl_tplg_is_multi_fmt(skl, pipe)) { + pipe->cur_config_idx = pipe->pipe_config_idx; + pipe->memory_pages = pconfig->mem_pages; + dev_dbg(skl->dev, "found pipe config idx:%d\n", + pipe->cur_config_idx); + return 0; + } + if (pipe->conn_type == SKL_PIPE_CONN_TYPE_NONE) { dev_dbg(skl->dev, "No conn_type detected, take 0th config\n"); pipe->cur_config_idx = 0; @@ -1315,6 +1355,55 @@ static int skl_tplg_pga_event(struct snd_soc_dapm_widget *w, return 0; } +static int skl_tplg_multi_config_set_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol, bool is_set) +{ + struct snd_soc_component *component = + snd_soc_kcontrol_component(kcontrol); + struct hdac_bus *bus = snd_soc_component_get_drvdata(component); + struct skl_dev *skl = bus_to_skl(bus); + struct skl_pipeline *ppl; + struct skl_pipe *pipe = NULL; + struct soc_enum *ec = (struct soc_enum *)kcontrol->private_value; + u32 *pipe_id; + + if (!ec) + return -EINVAL; + + if (is_set && (ucontrol->value.enumerated.item[0] > ec->items)) + return -EINVAL; + + pipe_id = ec->dobj.private; + + list_for_each_entry(ppl, &skl->ppl_list, node) { + if (ppl->pipe->ppl_id == *pipe_id) { + pipe = ppl->pipe; + break; + } + } + if (!pipe) + return -EIO; + + if (is_set) + pipe->pipe_config_idx = ucontrol->value.enumerated.item[0]; + else + ucontrol->value.enumerated.item[0] = pipe->pipe_config_idx; + + return 0; +} + +static int skl_tplg_multi_config_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + return skl_tplg_multi_config_set_get(kcontrol, ucontrol, false); +} + +static int skl_tplg_multi_config_set(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + return skl_tplg_multi_config_set_get(kcontrol, ucontrol, true); +} + static int skl_tplg_tlv_control_get(struct snd_kcontrol *kcontrol, unsigned int __user *data, unsigned int size) { @@ -1854,6 +1943,11 @@ static const struct snd_soc_tplg_kcontrol_ops skl_tplg_kcontrol_ops[] = { .get = skl_tplg_mic_control_get, .put = skl_tplg_mic_control_set, }, + { + .id = SKL_CONTROL_TYPE_MULTI_IO_SELECT, + .get = skl_tplg_multi_config_get, + .put = skl_tplg_multi_config_set, + }, }; static int skl_tplg_fill_pipe_cfg(struct device *dev, diff --git a/sound/soc/intel/skylake/skl-topology.h b/sound/soc/intel/skylake/skl-topology.h index e967800dbb62..06576147cc29 100644 --- a/sound/soc/intel/skylake/skl-topology.h +++ b/sound/soc/intel/skylake/skl-topology.h @@ -306,6 +306,7 @@ struct skl_pipe { struct skl_path_config configs[SKL_MAX_PATH_CONFIGS]; struct list_head w_list; bool passthru; + u32 pipe_config_idx; }; enum skl_module_state {