root/drivers/video/fbdev/omap2/omapfb/dss/hdmi_common.c
// SPDX-License-Identifier: GPL-2.0

#define DSS_SUBSYS_NAME "HDMI"

#include <linux/kernel.h>
#include <linux/err.h>
#include <linux/of.h>
#include <video/omapfb_dss.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;
}