brintos

brintos / linux-shallow public Read only

0
0
Text · 2.7 KiB · 3ecde23 Raw
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