Merge "ASoC: msm: Changes in machine driver to enable mclk"
This commit is contained in:
commit
8d0f36c59c
3 changed files with 98 additions and 6 deletions
|
@ -1772,6 +1772,10 @@ Optional Properties:
|
||||||
- qcom,msm-mi2s-master: This property is used to inform machine driver
|
- qcom,msm-mi2s-master: This property is used to inform machine driver
|
||||||
if MSM is the clock master of mi2s. 1 means master and 0 means slave. The
|
if MSM is the clock master of mi2s. 1 means master and 0 means slave. The
|
||||||
first entry is primary mi2s; the second entry is secondary mi2s, and so on.
|
first entry is primary mi2s; the second entry is secondary mi2s, and so on.
|
||||||
|
- qcom,msm-mi2s-ext-mclk: This property is used to inform machine driver
|
||||||
|
if MCLK from MSM is used for any external audio connections. 1 means used
|
||||||
|
as external mclk source and 0 indicate not used. The first entry is
|
||||||
|
primary mclk; the second entry is secondary mclk, and so on.
|
||||||
- reg: This property provides the AUX PCM/MI2S mux select register addresses
|
- reg: This property provides the AUX PCM/MI2S mux select register addresses
|
||||||
and size.
|
and size.
|
||||||
- reg_names: This property provides the name of the AUX PCM/MI2S mux select
|
- reg_names: This property provides the name of the AUX PCM/MI2S mux select
|
||||||
|
@ -1812,6 +1816,7 @@ Example:
|
||||||
qcom,mi2s-audio-intf;
|
qcom,mi2s-audio-intf;
|
||||||
qcom,auxpcm-audio-intf;
|
qcom,auxpcm-audio-intf;
|
||||||
qcom,msm-mi2s-master = <1>, <0>, <1>, <1>;
|
qcom,msm-mi2s-master = <1>, <0>, <1>, <1>;
|
||||||
|
qcom,msm-mi2s-ext-mclk = <1>, <1>, <0>, <1>;
|
||||||
reg = <0x1711a000 0x4>,
|
reg = <0x1711a000 0x4>,
|
||||||
<0x1711b000 0x4>,
|
<0x1711b000 0x4>,
|
||||||
<0x1711c000 0x4>,
|
<0x1711c000 0x4>,
|
||||||
|
|
|
@ -169,6 +169,7 @@ struct mi2s_conf {
|
||||||
struct mutex lock;
|
struct mutex lock;
|
||||||
u32 ref_cnt;
|
u32 ref_cnt;
|
||||||
u32 msm_is_mi2s_master;
|
u32 msm_is_mi2s_master;
|
||||||
|
u32 msm_is_ext_mclk;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct auxpcm_conf {
|
struct auxpcm_conf {
|
||||||
|
@ -176,6 +177,13 @@ struct auxpcm_conf {
|
||||||
u32 ref_cnt;
|
u32 ref_cnt;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static u32 mi2s_ebit_clk[MI2S_MAX] = {
|
||||||
|
Q6AFE_LPASS_CLK_ID_PRI_MI2S_EBIT,
|
||||||
|
Q6AFE_LPASS_CLK_ID_SEC_MI2S_EBIT,
|
||||||
|
Q6AFE_LPASS_CLK_ID_TER_MI2S_EBIT,
|
||||||
|
Q6AFE_LPASS_CLK_ID_QUAD_MI2S_EBIT
|
||||||
|
};
|
||||||
|
|
||||||
struct msm_wsa881x_dev_info {
|
struct msm_wsa881x_dev_info {
|
||||||
struct device_node *of_node;
|
struct device_node *of_node;
|
||||||
u32 index;
|
u32 index;
|
||||||
|
@ -340,6 +348,43 @@ static struct afe_clk_set mi2s_clk[MI2S_MAX] = {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct afe_clk_set mi2s_mclk[MI2S_MAX] = {
|
||||||
|
{
|
||||||
|
AFE_API_VERSION_I2S_CONFIG,
|
||||||
|
Q6AFE_LPASS_CLK_ID_MCLK_1,
|
||||||
|
Q6AFE_LPASS_OSR_CLK_9_P600_MHZ,
|
||||||
|
Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO,
|
||||||
|
Q6AFE_LPASS_CLK_ROOT_DEFAULT,
|
||||||
|
0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
AFE_API_VERSION_I2S_CONFIG,
|
||||||
|
Q6AFE_LPASS_CLK_ID_MCLK_2,
|
||||||
|
Q6AFE_LPASS_OSR_CLK_9_P600_MHZ,
|
||||||
|
Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO,
|
||||||
|
Q6AFE_LPASS_CLK_ROOT_DEFAULT,
|
||||||
|
0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
AFE_API_VERSION_I2S_CONFIG,
|
||||||
|
Q6AFE_LPASS_CLK_ID_MCLK_3,
|
||||||
|
Q6AFE_LPASS_OSR_CLK_9_P600_MHZ,
|
||||||
|
Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO,
|
||||||
|
Q6AFE_LPASS_CLK_ROOT_DEFAULT,
|
||||||
|
0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
AFE_API_VERSION_I2S_CONFIG,
|
||||||
|
Q6AFE_LPASS_CLK_ID_MCLK_4,
|
||||||
|
Q6AFE_LPASS_OSR_CLK_9_P600_MHZ,
|
||||||
|
Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO,
|
||||||
|
Q6AFE_LPASS_CLK_ROOT_DEFAULT,
|
||||||
|
0,
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static struct mi2s_aux_pcm_common_conf mi2s_auxpcm_conf[PCM_I2S_SEL_MAX];
|
static struct mi2s_aux_pcm_common_conf mi2s_auxpcm_conf[PCM_I2S_SEL_MAX];
|
||||||
static struct mi2s_conf mi2s_intf_conf[MI2S_MAX];
|
static struct mi2s_conf mi2s_intf_conf[MI2S_MAX];
|
||||||
static struct auxpcm_conf auxpcm_intf_conf[AUX_PCM_MAX];
|
static struct auxpcm_conf auxpcm_intf_conf[AUX_PCM_MAX];
|
||||||
|
@ -2095,6 +2140,7 @@ int msm_mi2s_snd_startup(struct snd_pcm_substream *substream)
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
||||||
struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
|
struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
|
||||||
|
int port_id = msm_get_port_id(rtd->dai_link->be_id);
|
||||||
int index = cpu_dai->id;
|
int index = cpu_dai->id;
|
||||||
unsigned int fmt = SND_SOC_DAIFMT_CBS_CFS;
|
unsigned int fmt = SND_SOC_DAIFMT_CBS_CFS;
|
||||||
|
|
||||||
|
@ -2117,6 +2163,11 @@ int msm_mi2s_snd_startup(struct snd_pcm_substream *substream)
|
||||||
*/
|
*/
|
||||||
mutex_lock(&mi2s_intf_conf[index].lock);
|
mutex_lock(&mi2s_intf_conf[index].lock);
|
||||||
if (++mi2s_intf_conf[index].ref_cnt == 1) {
|
if (++mi2s_intf_conf[index].ref_cnt == 1) {
|
||||||
|
/* Check if msm needs to provide the clock to the interface */
|
||||||
|
if (!mi2s_intf_conf[index].msm_is_mi2s_master) {
|
||||||
|
mi2s_clk[index].clk_id = mi2s_ebit_clk[index];
|
||||||
|
fmt = SND_SOC_DAIFMT_CBM_CFM;
|
||||||
|
}
|
||||||
ret = msm_mi2s_set_sclk(substream, true);
|
ret = msm_mi2s_set_sclk(substream, true);
|
||||||
if (IS_ERR_VALUE(ret)) {
|
if (IS_ERR_VALUE(ret)) {
|
||||||
dev_err(rtd->card->dev,
|
dev_err(rtd->card->dev,
|
||||||
|
@ -2136,9 +2187,6 @@ int msm_mi2s_snd_startup(struct snd_pcm_substream *substream)
|
||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
goto clk_off;
|
goto clk_off;
|
||||||
}
|
}
|
||||||
/* Check if msm needs to provide the clock to the interface */
|
|
||||||
if (!mi2s_intf_conf[index].msm_is_mi2s_master)
|
|
||||||
fmt = SND_SOC_DAIFMT_CBM_CFM;
|
|
||||||
ret = snd_soc_dai_set_fmt(cpu_dai, fmt);
|
ret = snd_soc_dai_set_fmt(cpu_dai, fmt);
|
||||||
if (IS_ERR_VALUE(ret)) {
|
if (IS_ERR_VALUE(ret)) {
|
||||||
dev_err(rtd->card->dev,
|
dev_err(rtd->card->dev,
|
||||||
|
@ -2146,7 +2194,21 @@ int msm_mi2s_snd_startup(struct snd_pcm_substream *substream)
|
||||||
__func__, index, ret);
|
__func__, index, ret);
|
||||||
goto clk_off;
|
goto clk_off;
|
||||||
}
|
}
|
||||||
|
if (mi2s_intf_conf[index].msm_is_ext_mclk) {
|
||||||
|
mi2s_mclk[index].enable = 1;
|
||||||
|
pr_debug("%s: Enabling mclk, clk_freq_in_hz = %u\n",
|
||||||
|
__func__, mi2s_mclk[index].clk_freq_in_hz);
|
||||||
|
ret = afe_set_lpass_clock_v2(port_id,
|
||||||
|
&mi2s_mclk[index]);
|
||||||
|
if (ret < 0) {
|
||||||
|
pr_err("%s: afe lpass mclk failed, err:%d\n",
|
||||||
|
__func__, ret);
|
||||||
|
goto clk_off;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mutex_unlock(&mi2s_intf_conf[index].lock);
|
||||||
|
return 0;
|
||||||
clk_off:
|
clk_off:
|
||||||
if (IS_ERR_VALUE(ret))
|
if (IS_ERR_VALUE(ret))
|
||||||
msm_mi2s_set_sclk(substream, false);
|
msm_mi2s_set_sclk(substream, false);
|
||||||
|
@ -2168,6 +2230,7 @@ void msm_mi2s_snd_shutdown(struct snd_pcm_substream *substream)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
||||||
|
int port_id = msm_get_port_id(rtd->dai_link->be_id);
|
||||||
int index = rtd->cpu_dai->id;
|
int index = rtd->cpu_dai->id;
|
||||||
|
|
||||||
pr_debug("%s(): substream = %s stream = %d\n", __func__,
|
pr_debug("%s(): substream = %s stream = %d\n", __func__,
|
||||||
|
@ -2185,6 +2248,17 @@ void msm_mi2s_snd_shutdown(struct snd_pcm_substream *substream)
|
||||||
__func__, index, ret);
|
__func__, index, ret);
|
||||||
mi2s_intf_conf[index].ref_cnt++;
|
mi2s_intf_conf[index].ref_cnt++;
|
||||||
}
|
}
|
||||||
|
if (mi2s_intf_conf[index].msm_is_ext_mclk) {
|
||||||
|
mi2s_mclk[index].enable = 0;
|
||||||
|
pr_debug("%s: Disabling mclk, clk_freq_in_hz = %u\n",
|
||||||
|
__func__, mi2s_mclk[index].clk_freq_in_hz);
|
||||||
|
ret = afe_set_lpass_clock_v2(port_id,
|
||||||
|
&mi2s_mclk[index]);
|
||||||
|
if (ret < 0) {
|
||||||
|
pr_err("%s: mclk disable failed for MCLK (%d); ret=%d\n",
|
||||||
|
__func__, index, ret);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
mutex_unlock(&mi2s_intf_conf[index].lock);
|
mutex_unlock(&mi2s_intf_conf[index].lock);
|
||||||
}
|
}
|
||||||
|
@ -2601,6 +2675,7 @@ static void i2s_auxpcm_init(struct platform_device *pdev)
|
||||||
struct resource *muxsel;
|
struct resource *muxsel;
|
||||||
int count;
|
int count;
|
||||||
u32 mi2s_master_slave[MI2S_MAX];
|
u32 mi2s_master_slave[MI2S_MAX];
|
||||||
|
u32 mi2s_ext_mclk[MI2S_MAX];
|
||||||
int ret;
|
int ret;
|
||||||
char *str[PCM_I2S_SEL_MAX] = {
|
char *str[PCM_I2S_SEL_MAX] = {
|
||||||
"lpaif_pri_mode_muxsel",
|
"lpaif_pri_mode_muxsel",
|
||||||
|
@ -2645,6 +2720,18 @@ static void i2s_auxpcm_init(struct platform_device *pdev)
|
||||||
mi2s_master_slave[count];
|
mi2s_master_slave[count];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ret = of_property_read_u32_array(pdev->dev.of_node,
|
||||||
|
"qcom,msm-mi2s-ext-mclk",
|
||||||
|
mi2s_ext_mclk, MI2S_MAX);
|
||||||
|
if (ret) {
|
||||||
|
dev_dbg(&pdev->dev, "%s: no qcom,msm-mi2s-ext-mclk in DT node\n",
|
||||||
|
__func__);
|
||||||
|
} else {
|
||||||
|
for (count = 0; count < MI2S_MAX; count++)
|
||||||
|
mi2s_intf_conf[count].msm_is_ext_mclk =
|
||||||
|
mi2s_ext_mclk[count];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void i2s_auxpcm_deinit(void)
|
static void i2s_auxpcm_deinit(void)
|
||||||
|
|
|
@ -3033,7 +3033,7 @@ static int msm_internal_init(struct platform_device *pdev,
|
||||||
AFE_API_VERSION_I2S_CONFIG;
|
AFE_API_VERSION_I2S_CONFIG;
|
||||||
pdata->digital_cdc_core_clk.clk_id =
|
pdata->digital_cdc_core_clk.clk_id =
|
||||||
Q6AFE_LPASS_CLK_ID_INT_MCLK_0;
|
Q6AFE_LPASS_CLK_ID_INT_MCLK_0;
|
||||||
pdata->digital_cdc_core_clk.clk_freq_in_hz = 0;
|
pdata->digital_cdc_core_clk.clk_freq_in_hz = pdata->mclk_freq;
|
||||||
pdata->digital_cdc_core_clk.clk_attri =
|
pdata->digital_cdc_core_clk.clk_attri =
|
||||||
Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO;
|
Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO;
|
||||||
pdata->digital_cdc_core_clk.clk_root =
|
pdata->digital_cdc_core_clk.clk_root =
|
||||||
|
|
Loading…
Add table
Reference in a new issue