0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026 #include <linux/hdmi.h>
0027 #include <linux/gcd.h>
0028
0029 #include <drm/amdgpu_drm.h>
0030 #include "amdgpu.h"
0031
0032 static const struct amdgpu_afmt_acr amdgpu_afmt_predefined_acr[] = {
0033
0034
0035 { 25175, 4096, 25175, 28224, 125875, 6144, 25175 },
0036 { 25200, 4096, 25200, 6272, 28000, 6144, 25200 },
0037 { 27000, 4096, 27000, 6272, 30000, 6144, 27000 },
0038 { 27027, 4096, 27027, 6272, 30030, 6144, 27027 },
0039 { 54000, 4096, 54000, 6272, 60000, 6144, 54000 },
0040 { 54054, 4096, 54054, 6272, 60060, 6144, 54054 },
0041 { 74176, 4096, 74176, 5733, 75335, 6144, 74176 },
0042 { 74250, 4096, 74250, 6272, 82500, 6144, 74250 },
0043 { 148352, 4096, 148352, 5733, 150670, 6144, 148352 },
0044 { 148500, 4096, 148500, 6272, 165000, 6144, 148500 },
0045 };
0046
0047
0048
0049
0050
0051 static void amdgpu_afmt_calc_cts(uint32_t clock, int *CTS, int *N, int freq)
0052 {
0053 int n, cts;
0054 unsigned long div, mul;
0055
0056
0057 n = 128 * freq;
0058 cts = clock * 1000;
0059
0060
0061 div = gcd(n, cts);
0062
0063 n /= div;
0064 cts /= div;
0065
0066
0067
0068
0069
0070 mul = ((128*freq/1000) + (n-1))/n;
0071
0072 n *= mul;
0073 cts *= mul;
0074
0075
0076 if (n < (128*freq/1500))
0077 pr_warn("Calculated ACR N value is too small. You may experience audio problems.\n");
0078 if (n > (128*freq/300))
0079 pr_warn("Calculated ACR N value is too large. You may experience audio problems.\n");
0080
0081 *N = n;
0082 *CTS = cts;
0083
0084 DRM_DEBUG("Calculated ACR timing N=%d CTS=%d for frequency %d\n",
0085 *N, *CTS, freq);
0086 }
0087
0088 struct amdgpu_afmt_acr amdgpu_afmt_acr(uint32_t clock)
0089 {
0090 struct amdgpu_afmt_acr res;
0091 u8 i;
0092
0093
0094 for (i = 0; i < ARRAY_SIZE(amdgpu_afmt_predefined_acr); i++) {
0095 if (amdgpu_afmt_predefined_acr[i].clock == clock)
0096 return amdgpu_afmt_predefined_acr[i];
0097 }
0098
0099
0100 amdgpu_afmt_calc_cts(clock, &res.cts_32khz, &res.n_32khz, 32000);
0101 amdgpu_afmt_calc_cts(clock, &res.cts_44_1khz, &res.n_44_1khz, 44100);
0102 amdgpu_afmt_calc_cts(clock, &res.cts_48khz, &res.n_48khz, 48000);
0103
0104 return res;
0105 }