Archit Taneja | 08d83e4e | 2013-09-17 11:43:15 +0530 | [diff] [blame] | 1 | |
Tomi Valkeinen | ac9f242 | 2013-11-14 13:46:32 +0200 | [diff] [blame] | 2 | #define DSS_SUBSYS_NAME "HDMI" |
| 3 | |
Archit Taneja | 08d83e4e | 2013-09-17 11:43:15 +0530 | [diff] [blame] | 4 | #include <linux/kernel.h> |
| 5 | #include <linux/err.h> |
Tomi Valkeinen | 2f5dc67 | 2014-04-17 12:54:02 +0300 | [diff] [blame] | 6 | #include <linux/of.h> |
Archit Taneja | 08d83e4e | 2013-09-17 11:43:15 +0530 | [diff] [blame] | 7 | #include <video/omapdss.h> |
| 8 | |
| 9 | #include "hdmi.h" |
| 10 | |
Tomi Valkeinen | 2f5dc67 | 2014-04-17 12:54:02 +0300 | [diff] [blame] | 11 | int 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 | |
Archit Taneja | 08d83e4e | 2013-09-17 11:43:15 +0530 | [diff] [blame] | 51 | int 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) |
Jyri Sarha | a57a22c | 2014-04-11 16:25:07 +0300 | [diff] [blame] | 74 | if (pclk == 27027000 || pclk == 74250000) |
Archit Taneja | 08d83e4e | 2013-09-17 11:43:15 +0530 | [diff] [blame] | 75 | deep_color_correct = true; |
| 76 | if (deep_color == 150) |
Jyri Sarha | a57a22c | 2014-04-11 16:25:07 +0300 | [diff] [blame] | 77 | if (pclk == 27027000) |
Archit Taneja | 08d83e4e | 2013-09-17 11:43:15 +0530 | [diff] [blame] | 78 | deep_color_correct = true; |
| 79 | break; |
| 80 | case 44100: |
| 81 | case 88200: |
| 82 | case 176400: |
| 83 | if (deep_color == 125) |
Jyri Sarha | a57a22c | 2014-04-11 16:25:07 +0300 | [diff] [blame] | 84 | if (pclk == 27027000) |
Archit Taneja | 08d83e4e | 2013-09-17 11:43:15 +0530 | [diff] [blame] | 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 */ |
Jyri Sarha | a57a22c | 2014-04-11 16:25:07 +0300 | [diff] [blame] | 145 | *cts = (pclk/1000) * (*n / 128) * deep_color / (sample_freq / 10); |
Archit Taneja | 08d83e4e | 2013-09-17 11:43:15 +0530 | [diff] [blame] | 146 | |
| 147 | return 0; |
| 148 | } |