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