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
11int 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
51int 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