]> rtime.felk.cvut.cz Git - sojka/nv-tegra/linux-3.10.git/commitdiff
video: tegra: hdmi: add fallback audio config
authorPrafull Suryawanshi <prafulls@nvidia.com>
Tue, 12 Jan 2016 07:02:25 +0000 (12:32 +0530)
committermobile promotions <svcmobile_promotions@nvidia.com>
Sun, 24 Jan 2016 04:21:58 +0000 (20:21 -0800)
bug 1703528

For some freq, there pclk is not present in
audio tables. This change adds fallback logic and
calculates cts value for audio related information.
This further used for programming audio regs.

Change-Id: Ia0c6e50ade854f93be958554c7906ef2a3df8a72
Signed-off-by: Prafull Suryawanshi <prafulls@nvidia.com>
Reviewed-on: http://git-master/r/931526
(cherry picked from commit 50822f31e997d45f6b703d1c88a7733df259880a)
Reviewed-on: http://git-master/r/936167
Reviewed-by: Automatic_Commit_Validation_User
GVS: Gerrit_Virtual_Submit
Reviewed-by: Mitch Luban <mluban@nvidia.com>
drivers/video/tegra/dc/hdmi.c

index 3b6e1bafd95e6f971a79976d69bcd6667185d841..947811b01ecb9481e6afad7624644509fbd39604 100644 (file)
@@ -430,6 +430,72 @@ static const struct tegra_hdmi_audio_config
        return NULL;
 }
 
+struct tegra_hdmi_audio_config tegra_hdmi_audio_config_default[] = {
+       {148500000,     24576,  148500, 24000},
+       {0,             0,      0,      0},
+};
+
+static const struct tegra_hdmi_audio_config
+*tegra_hdmi_get_audio_config_default(unsigned audio_freq, unsigned pix_clock)
+{
+       struct tegra_hdmi_audio_config *table;
+       unsigned cts, N, fs, aval;
+
+       table = tegra_hdmi_audio_config_default;
+
+       /* N values are copied from spec for corresponding freq band */
+       switch (audio_freq) {
+       case AUDIO_FREQ_32K:
+               N = 4096;
+               fs = 32000;
+               aval = 24000;
+               break;
+       case AUDIO_FREQ_44_1K:
+               N = 6272;
+               fs = 44100;
+               aval = 20000;
+               break;
+       case AUDIO_FREQ_48K:
+               N = 6144;
+               fs = 48000;
+               aval = 24000;
+               break;
+       case AUDIO_FREQ_88_2K:
+               N = 12544;
+               fs = 88200;
+               aval = 20000;
+               break;
+       case AUDIO_FREQ_96K:
+               N = 12288;
+               fs = 96000;
+               aval = 24000;
+               break;
+       case AUDIO_FREQ_176_4K:
+               N = 25088;
+               fs = 176400;
+               aval = 20000;
+               break;
+       case AUDIO_FREQ_192K:
+               N = 24576;
+               fs = 192000;
+               aval = 24000;
+               break;
+       default:
+               /* we have non-matching freq band. Try to return default
+                  value instead of null table */
+               return table;
+       }
+
+       /* (Average CTS value) = (fTMDS_clock * N ) / (128 * fS) */
+       cts = ((pix_clock) / (128 * fs)) * N;
+
+       table->pix_clock = pix_clock;
+       table->cts = cts;
+       table->n = N;
+       table->aval = aval;
+
+       return table;
+}
 
 unsigned long tegra_hdmi_readl(struct tegra_dc_hdmi_data *hdmi,
                                             unsigned long reg)
@@ -1571,7 +1637,10 @@ static int tegra_dc_hdmi_setup_audio(struct tegra_dc *dc, unsigned audio_freq,
                dev_err(&dc->ndev->dev,
                        "hdmi: can't set audio to %d at %d pix_clock",
                        audio_freq, dc->mode.pclk);
-               return -EINVAL;
+               dev_err(&dc->ndev->dev,
+                       "hdmi: falling back default configuration");
+               config = tegra_hdmi_get_audio_config_default(audio_freq,
+                       dc->mode.pclk);
        }
 
        tegra_hdmi_writel(hdmi, 0, HDMI_NV_PDISP_HDMI_ACR_CTRL);