|
@@ -558,6 +558,7 @@ static void hdmi_put_clocks(void)
|
|
|
int hdmi_compute_acr(u32 sample_freq, u32 *n, u32 *cts)
|
|
|
{
|
|
|
u32 deep_color;
|
|
|
+ bool deep_color_correct = false;
|
|
|
u32 pclk = hdmi.ip_data.cfg.timings.pixel_clock;
|
|
|
|
|
|
if (n == NULL || cts == NULL)
|
|
@@ -566,29 +567,88 @@ int hdmi_compute_acr(u32 sample_freq, u32 *n, u32 *cts)
|
|
|
/* TODO: When implemented, query deep color mode here. */
|
|
|
deep_color = 100;
|
|
|
|
|
|
+ /*
|
|
|
+ * When using deep color, the default N value (as in the HDMI
|
|
|
+ * specification) yields to an non-integer CTS. Hence, we
|
|
|
+ * modify it while keeping the restrictions described in
|
|
|
+ * section 7.2.1 of the HDMI 1.4a specification.
|
|
|
+ */
|
|
|
switch (sample_freq) {
|
|
|
case 32000:
|
|
|
- if ((deep_color == 125) && ((pclk == 54054) ||
|
|
|
- (pclk == 74250)))
|
|
|
- *n = 8192;
|
|
|
- else
|
|
|
- *n = 4096;
|
|
|
+ case 48000:
|
|
|
+ case 96000:
|
|
|
+ case 192000:
|
|
|
+ if (deep_color == 125)
|
|
|
+ if (pclk == 27027 || pclk == 74250)
|
|
|
+ deep_color_correct = true;
|
|
|
+ if (deep_color == 150)
|
|
|
+ if (pclk == 27027)
|
|
|
+ deep_color_correct = true;
|
|
|
break;
|
|
|
case 44100:
|
|
|
- *n = 6272;
|
|
|
- break;
|
|
|
- case 48000:
|
|
|
- if ((deep_color == 125) && ((pclk == 54054) ||
|
|
|
- (pclk == 74250)))
|
|
|
- *n = 8192;
|
|
|
- else
|
|
|
- *n = 6144;
|
|
|
+ case 88200:
|
|
|
+ case 176400:
|
|
|
+ if (deep_color == 125)
|
|
|
+ if (pclk == 27027)
|
|
|
+ deep_color_correct = true;
|
|
|
break;
|
|
|
default:
|
|
|
- *n = 0;
|
|
|
return -EINVAL;
|
|
|
}
|
|
|
|
|
|
+ if (deep_color_correct) {
|
|
|
+ switch (sample_freq) {
|
|
|
+ case 32000:
|
|
|
+ *n = 8192;
|
|
|
+ break;
|
|
|
+ case 44100:
|
|
|
+ *n = 12544;
|
|
|
+ break;
|
|
|
+ case 48000:
|
|
|
+ *n = 8192;
|
|
|
+ break;
|
|
|
+ case 88200:
|
|
|
+ *n = 25088;
|
|
|
+ break;
|
|
|
+ case 96000:
|
|
|
+ *n = 16384;
|
|
|
+ break;
|
|
|
+ case 176400:
|
|
|
+ *n = 50176;
|
|
|
+ break;
|
|
|
+ case 192000:
|
|
|
+ *n = 32768;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ switch (sample_freq) {
|
|
|
+ case 32000:
|
|
|
+ *n = 4096;
|
|
|
+ break;
|
|
|
+ case 44100:
|
|
|
+ *n = 6272;
|
|
|
+ break;
|
|
|
+ case 48000:
|
|
|
+ *n = 6144;
|
|
|
+ break;
|
|
|
+ case 88200:
|
|
|
+ *n = 12544;
|
|
|
+ break;
|
|
|
+ case 96000:
|
|
|
+ *n = 12288;
|
|
|
+ break;
|
|
|
+ case 176400:
|
|
|
+ *n = 25088;
|
|
|
+ break;
|
|
|
+ case 192000:
|
|
|
+ *n = 24576;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
+ }
|
|
|
/* Calculate CTS. See HDMI 1.3a or 1.4a specifications */
|
|
|
*cts = pclk * (*n / 128) * deep_color / (sample_freq / 10);
|
|
|
|