1
2 #define DSS_SUBSYS_NAME "HDMI"
3
4 #include <linux/kernel.h>
5 #include <linux/err.h>
6 #include <linux/of.h>
7 #include <video/omapdss.h>
8
9 #include "hdmi.h"
10
hdmi_parse_lanes_of(struct platform_device * pdev,struct device_node * ep,struct hdmi_phy_data * phy)11 int hdmi_parse_lanes_of(struct platform_device *pdev, struct device_node *ep,
12 struct hdmi_phy_data *phy)
13 {
14 struct property *prop;
15 int r, len;
16
17 prop = of_find_property(ep, "lanes", &len);
18 if (prop) {
19 u32 lanes[8];
20
21 if (len / sizeof(u32) != ARRAY_SIZE(lanes)) {
22 dev_err(&pdev->dev, "bad number of lanes\n");
23 return -EINVAL;
24 }
25
26 r = of_property_read_u32_array(ep, "lanes", lanes,
27 ARRAY_SIZE(lanes));
28 if (r) {
29 dev_err(&pdev->dev, "failed to read lane data\n");
30 return r;
31 }
32
33 r = hdmi_phy_parse_lanes(phy, lanes);
34 if (r) {
35 dev_err(&pdev->dev, "failed to parse lane data\n");
36 return r;
37 }
38 } else {
39 static const u32 default_lanes[] = { 0, 1, 2, 3, 4, 5, 6, 7 };
40
41 r = hdmi_phy_parse_lanes(phy, default_lanes);
42 if (WARN_ON(r)) {
43 dev_err(&pdev->dev, "failed to parse lane data\n");
44 return r;
45 }
46 }
47
48 return 0;
49 }
50
hdmi_compute_acr(u32 pclk,u32 sample_freq,u32 * n,u32 * cts)51 int hdmi_compute_acr(u32 pclk, u32 sample_freq, u32 *n, u32 *cts)
52 {
53 u32 deep_color;
54 bool deep_color_correct = false;
55
56 if (n == NULL || cts == NULL)
57 return -EINVAL;
58
59 /* TODO: When implemented, query deep color mode here. */
60 deep_color = 100;
61
62 /*
63 * When using deep color, the default N value (as in the HDMI
64 * specification) yields to an non-integer CTS. Hence, we
65 * modify it while keeping the restrictions described in
66 * section 7.2.1 of the HDMI 1.4a specification.
67 */
68 switch (sample_freq) {
69 case 32000:
70 case 48000:
71 case 96000:
72 case 192000:
73 if (deep_color == 125)
74 if (pclk == 27027000 || pclk == 74250000)
75 deep_color_correct = true;
76 if (deep_color == 150)
77 if (pclk == 27027000)
78 deep_color_correct = true;
79 break;
80 case 44100:
81 case 88200:
82 case 176400:
83 if (deep_color == 125)
84 if (pclk == 27027000)
85 deep_color_correct = true;
86 break;
87 default:
88 return -EINVAL;
89 }
90
91 if (deep_color_correct) {
92 switch (sample_freq) {
93 case 32000:
94 *n = 8192;
95 break;
96 case 44100:
97 *n = 12544;
98 break;
99 case 48000:
100 *n = 8192;
101 break;
102 case 88200:
103 *n = 25088;
104 break;
105 case 96000:
106 *n = 16384;
107 break;
108 case 176400:
109 *n = 50176;
110 break;
111 case 192000:
112 *n = 32768;
113 break;
114 default:
115 return -EINVAL;
116 }
117 } else {
118 switch (sample_freq) {
119 case 32000:
120 *n = 4096;
121 break;
122 case 44100:
123 *n = 6272;
124 break;
125 case 48000:
126 *n = 6144;
127 break;
128 case 88200:
129 *n = 12544;
130 break;
131 case 96000:
132 *n = 12288;
133 break;
134 case 176400:
135 *n = 25088;
136 break;
137 case 192000:
138 *n = 24576;
139 break;
140 default:
141 return -EINVAL;
142 }
143 }
144 /* Calculate CTS. See HDMI 1.3a or 1.4a specifications */
145 *cts = (pclk/1000) * (*n / 128) * deep_color / (sample_freq / 10);
146
147 return 0;
148 }
149