|
|
@@ -655,18 +655,39 @@ static int davinci_mcasp_set_sysclk(struct snd_soc_dai *dai, int clk_id,
|
|
|
struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(dai);
|
|
|
|
|
|
pm_runtime_get_sync(mcasp->dev);
|
|
|
- if (dir == SND_SOC_CLOCK_OUT) {
|
|
|
+
|
|
|
+ if (dir == SND_SOC_CLOCK_IN) {
|
|
|
+ switch (clk_id) {
|
|
|
+ case MCASP_CLK_HCLK_AHCLK:
|
|
|
+ mcasp_clr_bits(mcasp, DAVINCI_MCASP_AHCLKXCTL_REG,
|
|
|
+ AHCLKXE);
|
|
|
+ mcasp_clr_bits(mcasp, DAVINCI_MCASP_AHCLKRCTL_REG,
|
|
|
+ AHCLKRE);
|
|
|
+ clear_bit(PIN_BIT_AHCLKX, &mcasp->pdir);
|
|
|
+ break;
|
|
|
+ case MCASP_CLK_HCLK_AUXCLK:
|
|
|
+ mcasp_set_bits(mcasp, DAVINCI_MCASP_AHCLKXCTL_REG,
|
|
|
+ AHCLKXE);
|
|
|
+ mcasp_set_bits(mcasp, DAVINCI_MCASP_AHCLKRCTL_REG,
|
|
|
+ AHCLKRE);
|
|
|
+ set_bit(PIN_BIT_AHCLKX, &mcasp->pdir);
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ dev_err(mcasp->dev, "Invalid clk id: %d\n", clk_id);
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ /* Select AUXCLK as HCLK */
|
|
|
mcasp_set_bits(mcasp, DAVINCI_MCASP_AHCLKXCTL_REG, AHCLKXE);
|
|
|
mcasp_set_bits(mcasp, DAVINCI_MCASP_AHCLKRCTL_REG, AHCLKRE);
|
|
|
set_bit(PIN_BIT_AHCLKX, &mcasp->pdir);
|
|
|
- } else {
|
|
|
- mcasp_clr_bits(mcasp, DAVINCI_MCASP_AHCLKXCTL_REG, AHCLKXE);
|
|
|
- mcasp_clr_bits(mcasp, DAVINCI_MCASP_AHCLKRCTL_REG, AHCLKRE);
|
|
|
- clear_bit(PIN_BIT_AHCLKX, &mcasp->pdir);
|
|
|
}
|
|
|
-
|
|
|
+ /*
|
|
|
+ * When AHCLK X/R is selected to be output it means that the HCLK is
|
|
|
+ * the same clock - coming via AUXCLK.
|
|
|
+ */
|
|
|
mcasp->sysclk_freq = freq;
|
|
|
-
|
|
|
+out:
|
|
|
pm_runtime_put(mcasp->dev);
|
|
|
return 0;
|
|
|
}
|