linux/drivers/video/fbdev/omap2/omapfb/dss/hdmi_common.c
<<
>>
Prefs
   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/omapfb_dss.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