// SPDX-License-Identifier: GPL-2.0 #define DSS_SUBSYS_NAME "HDMI" #include <linux/kernel.h> #include <linux/err.h> #include <linux/of.h> #include "omapdss.h" #include "hdmi.h" int hdmi_parse_lanes_of(struct platform_device *pdev, struct device_node *ep, struct hdmi_phy_data *phy) { struct property *prop; int r, len; prop = of_find_property(ep, "lanes", &len); if (prop) { u32 lanes[8]; if (len / sizeof(u32) != ARRAY_SIZE(lanes)) { dev_err(&pdev->dev, "bad number of lanes\n"); return -EINVAL; } r = of_property_read_u32_array(ep, "lanes", lanes, ARRAY_SIZE(lanes)); if (r) { dev_err(&pdev->dev, "failed to read lane data\n"); return r; } r = hdmi_phy_parse_lanes(phy, lanes); if (r) { dev_err(&pdev->dev, "failed to parse lane data\n"); return r; } } else { static const u32 default_lanes[] = { 0, 1, 2, 3, 4, 5, 6, 7 }; r = hdmi_phy_parse_lanes(phy, default_lanes); if (WARN_ON(r)) { dev_err(&pdev->dev, "failed to parse lane data\n"); return r; } } return 0; } int hdmi_compute_acr(u32 pclk, u32 sample_freq, u32 *n, u32 *cts) { u32 deep_color; bool deep_color_correct = false; if (n == NULL || cts == NULL) return -EINVAL; /* 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: case 48000: case 96000: case 192000: if (deep_color == 125) if (pclk == 27027000 || pclk == 74250000) deep_color_correct = true; if (deep_color == 150) if (pclk == 27027000) deep_color_correct = true; break; case 44100: case 88200: case 176400: if (deep_color == 125) if (pclk == 27027000) deep_color_correct = true; break; default: 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/1000) * (*n / 128) * deep_color / (sample_freq / 10); return 0; }