Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'drm_bridge_for_4.8' of https://github.com/boddob/linux into drm-next

This is an update to the previous drm bridge pull request. The ADV7511
driver's conversion from slave encoder to bridge meant that its users
(the rcar-du kms driver) should use the bridge interface too. This pull
request now also contains a commit that updates the rcar-du's hdmi encoder
interface from slave encoder to bridge.

The other updates are as before:

- Converts the ADV7511 i2c slave encoder driver to a bridge driver.
Adds support for the ADV7533 bridge chip.
- Add bridge driver for TC358767 (DSI/DPI to eDP) encoder chips.

* 'drm_bridge_for_4.8' of https://github.com/boddob/linux:
drm: rcar-du: Remove i2c slave encoder interface for hdmi encoder
drm/bridge: tc358767: Add DPI to eDP bridge driver
dt-bindings: tc358767: add DT documentation
dt-bindings: drm/bridge: Update bindings for ADV7533
drm/bridge: adv7533: Change number of DSI lanes dynamically
drm/bridge: adv7533: Use internal timing generator
drm/bridge: adv7533: Create a MIPI DSI device
drm/bridge: adv7533: Initial support for ADV7533
drm/bridge: adv7511: Fix mutex deadlock when interrupts are disabled
drm/i2c: adv7511: Move to bridge folder
drm/i2c: adv7511: Convert to drm_bridge

+2120 -332
+21 -5
Documentation/devicetree/bindings/display/bridge/adi,adv7511.txt
··· 1 - Analog Device ADV7511(W)/13 HDMI Encoders 1 + Analog Device ADV7511(W)/13/33 HDMI Encoders 2 2 ----------------------------------------- 3 3 4 - The ADV7511, ADV7511W and ADV7513 are HDMI audio and video transmitters 4 + The ADV7511, ADV7511W, ADV7513 and ADV7533 are HDMI audio and video transmitters 5 5 compatible with HDMI 1.4 and DVI 1.0. They support color space conversion, 6 - S/PDIF, CEC and HDCP. 6 + S/PDIF, CEC and HDCP. ADV7533 supports the DSI interface for input pixels, while 7 + the others support RGB interface. 7 8 8 9 Required properties: 9 10 10 - - compatible: Should be one of "adi,adv7511", "adi,adv7511w" or "adi,adv7513" 11 + - compatible: Should be one of: 12 + "adi,adv7511" 13 + "adi,adv7511w" 14 + "adi,adv7513" 15 + "adi,adv7533" 16 + 11 17 - reg: I2C slave address 12 18 13 19 The ADV7511 supports a large number of input data formats that differ by their ··· 38 32 - adi,input-justification: The input bit justification ("left", "evenly", 39 33 "right"). 40 34 35 + The following properties are required for ADV7533: 36 + 37 + - adi,dsi-lanes: Number of DSI data lanes connected to the DSI host. It should 38 + be one of 1, 2, 3 or 4. 39 + 41 40 Optional properties: 42 41 43 42 - interrupts: Specifier for the ADV7511 interrupt ··· 53 42 - adi,embedded-sync: The input uses synchronization signals embedded in the 54 43 data stream (similar to BT.656). Defaults to separate H/V synchronization 55 44 signals. 45 + - adi,disable-timing-generator: Only for ADV7533. Disables the internal timing 46 + generator. The chip will rely on the sync signals in the DSI data lanes, 47 + rather than generate its own timings for HDMI output. 56 48 57 49 Required nodes: 58 50 59 51 The ADV7511 has two video ports. Their connections are modelled using the OF 60 52 graph bindings specified in Documentation/devicetree/bindings/graph.txt. 61 53 62 - - Video port 0 for the RGB or YUV input 54 + - Video port 0 for the RGB, YUV or DSI input. In the case of ADV7533, the 55 + remote endpoint phandle should be a reference to a valid mipi_dsi_host device 56 + node. 63 57 - Video port 1 for the HDMI output 64 58 65 59
+53
Documentation/devicetree/bindings/display/bridge/toshiba,tc358767.txt
··· 1 + Toshiba TC358767 eDP bridge bindings 2 + 3 + Required properties: 4 + - compatible: "toshiba,tc358767" 5 + - reg: i2c address of the bridge, 0x68 or 0x0f, depending on bootstrap pins 6 + - clock-names: should be "ref" 7 + - clocks: OF device-tree clock specification for refclk input. The reference 8 + clock rate must be 13 MHz, 19.2 MHz, 26 MHz, or 38.4 MHz. 9 + 10 + Optional properties: 11 + - shutdown-gpios: OF device-tree gpio specification for SD pin 12 + (active high shutdown input) 13 + - reset-gpios: OF device-tree gpio specification for RSTX pin 14 + (active low system reset) 15 + - ports: the ports node can contain video interface port nodes to connect 16 + to a DPI/DSI source and to an eDP/DP sink according to [1][2]: 17 + - port@0: DSI input port 18 + - port@1: DPI input port 19 + - port@2: eDP/DP output port 20 + 21 + [1]: Documentation/devicetree/bindings/graph.txt 22 + [2]: Documentation/devicetree/bindings/media/video-interfaces.txt 23 + 24 + Example: 25 + edp-bridge@68 { 26 + compatible = "toshiba,tc358767"; 27 + reg = <0x68>; 28 + shutdown-gpios = <&gpio3 23 GPIO_ACTIVE_HIGH>; 29 + reset-gpios = <&gpio3 24 GPIO_ACTIVE_LOW>; 30 + clock-names = "ref"; 31 + clocks = <&edp_refclk>; 32 + 33 + ports { 34 + #address-cells = <1>; 35 + #size-cells = <0>; 36 + 37 + port@1 { 38 + reg = <1>; 39 + 40 + bridge_in: endpoint { 41 + remote-endpoint = <&dpi_out>; 42 + }; 43 + }; 44 + 45 + port@2 { 46 + reg = <2>; 47 + 48 + bridge_out: endpoint { 49 + remote-endpoint = <&panel_in>; 50 + }; 51 + }; 52 + }; 53 + };
+11
drivers/gpu/drm/bridge/Kconfig
··· 58 58 ---help--- 59 59 Silicon Image sii902x bridge chip driver. 60 60 61 + config DRM_TOSHIBA_TC358767 62 + tristate "Toshiba TC358767 eDP bridge" 63 + depends on OF 64 + select DRM_KMS_HELPER 65 + select REGMAP_I2C 66 + select DRM_PANEL 67 + ---help--- 68 + Toshiba TC358767 eDP bridge chip driver. 69 + 61 70 source "drivers/gpu/drm/bridge/analogix/Kconfig" 71 + 72 + source "drivers/gpu/drm/bridge/adv7511/Kconfig" 62 73 63 74 endmenu
+2
drivers/gpu/drm/bridge/Makefile
··· 6 6 obj-$(CONFIG_DRM_NXP_PTN3460) += nxp-ptn3460.o 7 7 obj-$(CONFIG_DRM_PARADE_PS8622) += parade-ps8622.o 8 8 obj-$(CONFIG_DRM_SII902X) += sii902x.o 9 + obj-$(CONFIG_DRM_TOSHIBA_TC358767) += tc358767.o 9 10 obj-$(CONFIG_DRM_ANALOGIX_DP) += analogix/ 11 + obj-$(CONFIG_DRM_I2C_ADV7511) += adv7511/
+15
drivers/gpu/drm/bridge/adv7511/Kconfig
··· 1 + config DRM_I2C_ADV7511 2 + tristate "AV7511 encoder" 3 + depends on OF 4 + select DRM_KMS_HELPER 5 + select REGMAP_I2C 6 + help 7 + Support for the Analog Device ADV7511(W) and ADV7513 HDMI encoders. 8 + 9 + config DRM_I2C_ADV7533 10 + bool "ADV7533 encoder" 11 + depends on DRM_I2C_ADV7511 12 + select DRM_MIPI_DSI 13 + default y 14 + help 15 + Support for the Analog Devices ADV7533 DSI to HDMI encoder.
+3
drivers/gpu/drm/bridge/adv7511/Makefile
··· 1 + adv7511-y := adv7511_drv.o 2 + adv7511-$(CONFIG_DRM_I2C_ADV7533) += adv7533.o 3 + obj-$(CONFIG_DRM_I2C_ADV7511) += adv7511.o
+265
drivers/gpu/drm/bridge/adv7511/adv7533.c
··· 1 + /* 2 + * Copyright (c) 2016, The Linux Foundation. All rights reserved. 3 + * 4 + * This program is free software; you can redistribute it and/or modify 5 + * it under the terms of the GNU General Public License version 2 and 6 + * only version 2 as published by the Free Software Foundation. 7 + * 8 + * This program is distributed in the hope that it will be useful, 9 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 + * GNU General Public License for more details. 12 + */ 13 + 14 + #include <linux/of_graph.h> 15 + 16 + #include "adv7511.h" 17 + 18 + static const struct reg_sequence adv7533_fixed_registers[] = { 19 + { 0x16, 0x20 }, 20 + { 0x9a, 0xe0 }, 21 + { 0xba, 0x70 }, 22 + { 0xde, 0x82 }, 23 + { 0xe4, 0x40 }, 24 + { 0xe5, 0x80 }, 25 + }; 26 + 27 + static const struct reg_sequence adv7533_cec_fixed_registers[] = { 28 + { 0x15, 0xd0 }, 29 + { 0x17, 0xd0 }, 30 + { 0x24, 0x20 }, 31 + { 0x57, 0x11 }, 32 + }; 33 + 34 + static const struct regmap_config adv7533_cec_regmap_config = { 35 + .reg_bits = 8, 36 + .val_bits = 8, 37 + 38 + .max_register = 0xff, 39 + .cache_type = REGCACHE_RBTREE, 40 + }; 41 + 42 + static void adv7511_dsi_config_timing_gen(struct adv7511 *adv) 43 + { 44 + struct mipi_dsi_device *dsi = adv->dsi; 45 + struct drm_display_mode *mode = &adv->curr_mode; 46 + unsigned int hsw, hfp, hbp, vsw, vfp, vbp; 47 + u8 clock_div_by_lanes[] = { 6, 4, 3 }; /* 2, 3, 4 lanes */ 48 + 49 + hsw = mode->hsync_end - mode->hsync_start; 50 + hfp = mode->hsync_start - mode->hdisplay; 51 + hbp = mode->htotal - mode->hsync_end; 52 + vsw = mode->vsync_end - mode->vsync_start; 53 + vfp = mode->vsync_start - mode->vdisplay; 54 + vbp = mode->vtotal - mode->vsync_end; 55 + 56 + /* set pixel clock divider mode */ 57 + regmap_write(adv->regmap_cec, 0x16, 58 + clock_div_by_lanes[dsi->lanes - 2] << 3); 59 + 60 + /* horizontal porch params */ 61 + regmap_write(adv->regmap_cec, 0x28, mode->htotal >> 4); 62 + regmap_write(adv->regmap_cec, 0x29, (mode->htotal << 4) & 0xff); 63 + regmap_write(adv->regmap_cec, 0x2a, hsw >> 4); 64 + regmap_write(adv->regmap_cec, 0x2b, (hsw << 4) & 0xff); 65 + regmap_write(adv->regmap_cec, 0x2c, hfp >> 4); 66 + regmap_write(adv->regmap_cec, 0x2d, (hfp << 4) & 0xff); 67 + regmap_write(adv->regmap_cec, 0x2e, hbp >> 4); 68 + regmap_write(adv->regmap_cec, 0x2f, (hbp << 4) & 0xff); 69 + 70 + /* vertical porch params */ 71 + regmap_write(adv->regmap_cec, 0x30, mode->vtotal >> 4); 72 + regmap_write(adv->regmap_cec, 0x31, (mode->vtotal << 4) & 0xff); 73 + regmap_write(adv->regmap_cec, 0x32, vsw >> 4); 74 + regmap_write(adv->regmap_cec, 0x33, (vsw << 4) & 0xff); 75 + regmap_write(adv->regmap_cec, 0x34, vfp >> 4); 76 + regmap_write(adv->regmap_cec, 0x35, (vfp << 4) & 0xff); 77 + regmap_write(adv->regmap_cec, 0x36, vbp >> 4); 78 + regmap_write(adv->regmap_cec, 0x37, (vbp << 4) & 0xff); 79 + } 80 + 81 + void adv7533_dsi_power_on(struct adv7511 *adv) 82 + { 83 + struct mipi_dsi_device *dsi = adv->dsi; 84 + 85 + if (adv->use_timing_gen) 86 + adv7511_dsi_config_timing_gen(adv); 87 + 88 + /* set number of dsi lanes */ 89 + regmap_write(adv->regmap_cec, 0x1c, dsi->lanes << 4); 90 + 91 + if (adv->use_timing_gen) { 92 + /* reset internal timing generator */ 93 + regmap_write(adv->regmap_cec, 0x27, 0xcb); 94 + regmap_write(adv->regmap_cec, 0x27, 0x8b); 95 + regmap_write(adv->regmap_cec, 0x27, 0xcb); 96 + } else { 97 + /* disable internal timing generator */ 98 + regmap_write(adv->regmap_cec, 0x27, 0x0b); 99 + } 100 + 101 + /* enable hdmi */ 102 + regmap_write(adv->regmap_cec, 0x03, 0x89); 103 + /* disable test mode */ 104 + regmap_write(adv->regmap_cec, 0x55, 0x00); 105 + 106 + regmap_register_patch(adv->regmap_cec, adv7533_cec_fixed_registers, 107 + ARRAY_SIZE(adv7533_cec_fixed_registers)); 108 + } 109 + 110 + void adv7533_dsi_power_off(struct adv7511 *adv) 111 + { 112 + /* disable hdmi */ 113 + regmap_write(adv->regmap_cec, 0x03, 0x0b); 114 + /* disable internal timing generator */ 115 + regmap_write(adv->regmap_cec, 0x27, 0x0b); 116 + } 117 + 118 + void adv7533_mode_set(struct adv7511 *adv, struct drm_display_mode *mode) 119 + { 120 + struct mipi_dsi_device *dsi = adv->dsi; 121 + int lanes, ret; 122 + 123 + if (adv->num_dsi_lanes != 4) 124 + return; 125 + 126 + if (mode->clock > 80000) 127 + lanes = 4; 128 + else 129 + lanes = 3; 130 + 131 + if (lanes != dsi->lanes) { 132 + mipi_dsi_detach(dsi); 133 + dsi->lanes = lanes; 134 + ret = mipi_dsi_attach(dsi); 135 + if (ret) 136 + dev_err(&dsi->dev, "failed to change host lanes\n"); 137 + } 138 + } 139 + 140 + int adv7533_patch_registers(struct adv7511 *adv) 141 + { 142 + return regmap_register_patch(adv->regmap, 143 + adv7533_fixed_registers, 144 + ARRAY_SIZE(adv7533_fixed_registers)); 145 + } 146 + 147 + void adv7533_uninit_cec(struct adv7511 *adv) 148 + { 149 + i2c_unregister_device(adv->i2c_cec); 150 + } 151 + 152 + static const int cec_i2c_addr = 0x78; 153 + 154 + int adv7533_init_cec(struct adv7511 *adv) 155 + { 156 + int ret; 157 + 158 + adv->i2c_cec = i2c_new_dummy(adv->i2c_main->adapter, cec_i2c_addr >> 1); 159 + if (!adv->i2c_cec) 160 + return -ENOMEM; 161 + 162 + adv->regmap_cec = devm_regmap_init_i2c(adv->i2c_cec, 163 + &adv7533_cec_regmap_config); 164 + if (IS_ERR(adv->regmap_cec)) { 165 + ret = PTR_ERR(adv->regmap_cec); 166 + goto err; 167 + } 168 + 169 + ret = regmap_register_patch(adv->regmap_cec, 170 + adv7533_cec_fixed_registers, 171 + ARRAY_SIZE(adv7533_cec_fixed_registers)); 172 + if (ret) 173 + goto err; 174 + 175 + return 0; 176 + err: 177 + adv7533_uninit_cec(adv); 178 + return ret; 179 + } 180 + 181 + int adv7533_attach_dsi(struct adv7511 *adv) 182 + { 183 + struct device *dev = &adv->i2c_main->dev; 184 + struct mipi_dsi_host *host; 185 + struct mipi_dsi_device *dsi; 186 + int ret = 0; 187 + const struct mipi_dsi_device_info info = { .type = "adv7533", 188 + .channel = 0, 189 + .node = NULL, 190 + }; 191 + 192 + host = of_find_mipi_dsi_host_by_node(adv->host_node); 193 + if (!host) { 194 + dev_err(dev, "failed to find dsi host\n"); 195 + return -EPROBE_DEFER; 196 + } 197 + 198 + dsi = mipi_dsi_device_register_full(host, &info); 199 + if (IS_ERR(dsi)) { 200 + dev_err(dev, "failed to create dsi device\n"); 201 + ret = PTR_ERR(dsi); 202 + goto err_dsi_device; 203 + } 204 + 205 + adv->dsi = dsi; 206 + 207 + dsi->lanes = adv->num_dsi_lanes; 208 + dsi->format = MIPI_DSI_FMT_RGB888; 209 + dsi->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_SYNC_PULSE | 210 + MIPI_DSI_MODE_EOT_PACKET | MIPI_DSI_MODE_VIDEO_HSE; 211 + 212 + ret = mipi_dsi_attach(dsi); 213 + if (ret < 0) { 214 + dev_err(dev, "failed to attach dsi to host\n"); 215 + goto err_dsi_attach; 216 + } 217 + 218 + return 0; 219 + 220 + err_dsi_attach: 221 + mipi_dsi_device_unregister(dsi); 222 + err_dsi_device: 223 + return ret; 224 + } 225 + 226 + void adv7533_detach_dsi(struct adv7511 *adv) 227 + { 228 + mipi_dsi_detach(adv->dsi); 229 + mipi_dsi_device_unregister(adv->dsi); 230 + } 231 + 232 + int adv7533_parse_dt(struct device_node *np, struct adv7511 *adv) 233 + { 234 + u32 num_lanes; 235 + struct device_node *endpoint; 236 + 237 + of_property_read_u32(np, "adi,dsi-lanes", &num_lanes); 238 + 239 + if (num_lanes < 1 || num_lanes > 4) 240 + return -EINVAL; 241 + 242 + adv->num_dsi_lanes = num_lanes; 243 + 244 + endpoint = of_graph_get_next_endpoint(np, NULL); 245 + if (!endpoint) 246 + return -ENODEV; 247 + 248 + adv->host_node = of_graph_get_remote_port_parent(endpoint); 249 + if (!adv->host_node) { 250 + of_node_put(endpoint); 251 + return -ENODEV; 252 + } 253 + 254 + of_node_put(endpoint); 255 + of_node_put(adv->host_node); 256 + 257 + adv->use_timing_gen = !of_property_read_bool(np, 258 + "adi,disable-timing-generator"); 259 + 260 + /* TODO: Check if these need to be parsed by DT or not */ 261 + adv->rgb = true; 262 + adv->embedded_sync = false; 263 + 264 + return 0; 265 + }
+1413
drivers/gpu/drm/bridge/tc358767.c
··· 1 + /* 2 + * tc358767 eDP bridge driver 3 + * 4 + * Copyright (C) 2016 CogentEmbedded Inc 5 + * Author: Andrey Gusakov <andrey.gusakov@cogentembedded.com> 6 + * 7 + * Copyright (C) 2016 Pengutronix, Philipp Zabel <p.zabel@pengutronix.de> 8 + * 9 + * Initially based on: drivers/gpu/drm/i2c/tda998x_drv.c 10 + * 11 + * Copyright (C) 2012 Texas Instruments 12 + * Author: Rob Clark <robdclark@gmail.com> 13 + * 14 + * This program is free software; you can redistribute it and/or modify 15 + * it under the terms of the GNU General Public License as published by 16 + * the Free Software Foundation; either version 2 of the License, or 17 + * (at your option) any later version. 18 + * 19 + * This program is distributed in the hope that it will be useful, 20 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 21 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 22 + * GNU General Public License for more details. 23 + */ 24 + 25 + #include <linux/clk.h> 26 + #include <linux/device.h> 27 + #include <linux/gpio/consumer.h> 28 + #include <linux/i2c.h> 29 + #include <linux/kernel.h> 30 + #include <linux/module.h> 31 + #include <linux/regmap.h> 32 + #include <linux/slab.h> 33 + 34 + #include <drm/drm_atomic_helper.h> 35 + #include <drm/drm_crtc_helper.h> 36 + #include <drm/drm_dp_helper.h> 37 + #include <drm/drm_edid.h> 38 + #include <drm/drm_of.h> 39 + #include <drm/drm_panel.h> 40 + 41 + /* Registers */ 42 + 43 + /* Display Parallel Interface */ 44 + #define DPIPXLFMT 0x0440 45 + #define VS_POL_ACTIVE_LOW (1 << 10) 46 + #define HS_POL_ACTIVE_LOW (1 << 9) 47 + #define DE_POL_ACTIVE_HIGH (0 << 8) 48 + #define SUB_CFG_TYPE_CONFIG1 (0 << 2) /* LSB aligned */ 49 + #define SUB_CFG_TYPE_CONFIG2 (1 << 2) /* Loosely Packed */ 50 + #define SUB_CFG_TYPE_CONFIG3 (2 << 2) /* LSB aligned 8-bit */ 51 + #define DPI_BPP_RGB888 (0 << 0) 52 + #define DPI_BPP_RGB666 (1 << 0) 53 + #define DPI_BPP_RGB565 (2 << 0) 54 + 55 + /* Video Path */ 56 + #define VPCTRL0 0x0450 57 + #define OPXLFMT_RGB666 (0 << 8) 58 + #define OPXLFMT_RGB888 (1 << 8) 59 + #define FRMSYNC_DISABLED (0 << 4) /* Video Timing Gen Disabled */ 60 + #define FRMSYNC_ENABLED (1 << 4) /* Video Timing Gen Enabled */ 61 + #define MSF_DISABLED (0 << 0) /* Magic Square FRC disabled */ 62 + #define MSF_ENABLED (1 << 0) /* Magic Square FRC enabled */ 63 + #define HTIM01 0x0454 64 + #define HTIM02 0x0458 65 + #define VTIM01 0x045c 66 + #define VTIM02 0x0460 67 + #define VFUEN0 0x0464 68 + #define VFUEN BIT(0) /* Video Frame Timing Upload */ 69 + 70 + /* System */ 71 + #define TC_IDREG 0x0500 72 + #define SYSCTRL 0x0510 73 + #define DP0_AUDSRC_NO_INPUT (0 << 3) 74 + #define DP0_AUDSRC_I2S_RX (1 << 3) 75 + #define DP0_VIDSRC_NO_INPUT (0 << 0) 76 + #define DP0_VIDSRC_DSI_RX (1 << 0) 77 + #define DP0_VIDSRC_DPI_RX (2 << 0) 78 + #define DP0_VIDSRC_COLOR_BAR (3 << 0) 79 + 80 + /* Control */ 81 + #define DP0CTL 0x0600 82 + #define VID_MN_GEN BIT(6) /* Auto-generate M/N values */ 83 + #define EF_EN BIT(5) /* Enable Enhanced Framing */ 84 + #define VID_EN BIT(1) /* Video transmission enable */ 85 + #define DP_EN BIT(0) /* Enable DPTX function */ 86 + 87 + /* Clocks */ 88 + #define DP0_VIDMNGEN0 0x0610 89 + #define DP0_VIDMNGEN1 0x0614 90 + #define DP0_VMNGENSTATUS 0x0618 91 + 92 + /* Main Channel */ 93 + #define DP0_SECSAMPLE 0x0640 94 + #define DP0_VIDSYNCDELAY 0x0644 95 + #define DP0_TOTALVAL 0x0648 96 + #define DP0_STARTVAL 0x064c 97 + #define DP0_ACTIVEVAL 0x0650 98 + #define DP0_SYNCVAL 0x0654 99 + #define DP0_MISC 0x0658 100 + #define TU_SIZE_RECOMMENDED (0x3f << 16) /* LSCLK cycles per TU */ 101 + #define BPC_6 (0 << 5) 102 + #define BPC_8 (1 << 5) 103 + 104 + /* AUX channel */ 105 + #define DP0_AUXCFG0 0x0660 106 + #define DP0_AUXCFG1 0x0664 107 + #define AUX_RX_FILTER_EN BIT(16) 108 + 109 + #define DP0_AUXADDR 0x0668 110 + #define DP0_AUXWDATA(i) (0x066c + (i) * 4) 111 + #define DP0_AUXRDATA(i) (0x067c + (i) * 4) 112 + #define DP0_AUXSTATUS 0x068c 113 + #define AUX_STATUS_MASK 0xf0 114 + #define AUX_STATUS_SHIFT 4 115 + #define AUX_TIMEOUT BIT(1) 116 + #define AUX_BUSY BIT(0) 117 + #define DP0_AUXI2CADR 0x0698 118 + 119 + /* Link Training */ 120 + #define DP0_SRCCTRL 0x06a0 121 + #define DP0_SRCCTRL_SCRMBLDIS BIT(13) 122 + #define DP0_SRCCTRL_EN810B BIT(12) 123 + #define DP0_SRCCTRL_NOTP (0 << 8) 124 + #define DP0_SRCCTRL_TP1 (1 << 8) 125 + #define DP0_SRCCTRL_TP2 (2 << 8) 126 + #define DP0_SRCCTRL_LANESKEW BIT(7) 127 + #define DP0_SRCCTRL_SSCG BIT(3) 128 + #define DP0_SRCCTRL_LANES_1 (0 << 2) 129 + #define DP0_SRCCTRL_LANES_2 (1 << 2) 130 + #define DP0_SRCCTRL_BW27 (1 << 1) 131 + #define DP0_SRCCTRL_BW162 (0 << 1) 132 + #define DP0_SRCCTRL_AUTOCORRECT BIT(0) 133 + #define DP0_LTSTAT 0x06d0 134 + #define LT_LOOPDONE BIT(13) 135 + #define LT_STATUS_MASK (0x1f << 8) 136 + #define LT_CHANNEL1_EQ_BITS (DP_CHANNEL_EQ_BITS << 4) 137 + #define LT_INTERLANE_ALIGN_DONE BIT(3) 138 + #define LT_CHANNEL0_EQ_BITS (DP_CHANNEL_EQ_BITS) 139 + #define DP0_SNKLTCHGREQ 0x06d4 140 + #define DP0_LTLOOPCTRL 0x06d8 141 + #define DP0_SNKLTCTRL 0x06e4 142 + 143 + /* PHY */ 144 + #define DP_PHY_CTRL 0x0800 145 + #define DP_PHY_RST BIT(28) /* DP PHY Global Soft Reset */ 146 + #define BGREN BIT(25) /* AUX PHY BGR Enable */ 147 + #define PWR_SW_EN BIT(24) /* PHY Power Switch Enable */ 148 + #define PHY_M1_RST BIT(12) /* Reset PHY1 Main Channel */ 149 + #define PHY_RDY BIT(16) /* PHY Main Channels Ready */ 150 + #define PHY_M0_RST BIT(8) /* Reset PHY0 Main Channel */ 151 + #define PHY_A0_EN BIT(1) /* PHY Aux Channel0 Enable */ 152 + #define PHY_M0_EN BIT(0) /* PHY Main Channel0 Enable */ 153 + 154 + /* PLL */ 155 + #define DP0_PLLCTRL 0x0900 156 + #define DP1_PLLCTRL 0x0904 /* not defined in DS */ 157 + #define PXL_PLLCTRL 0x0908 158 + #define PLLUPDATE BIT(2) 159 + #define PLLBYP BIT(1) 160 + #define PLLEN BIT(0) 161 + #define PXL_PLLPARAM 0x0914 162 + #define IN_SEL_REFCLK (0 << 14) 163 + #define SYS_PLLPARAM 0x0918 164 + #define REF_FREQ_38M4 (0 << 8) /* 38.4 MHz */ 165 + #define REF_FREQ_19M2 (1 << 8) /* 19.2 MHz */ 166 + #define REF_FREQ_26M (2 << 8) /* 26 MHz */ 167 + #define REF_FREQ_13M (3 << 8) /* 13 MHz */ 168 + #define SYSCLK_SEL_LSCLK (0 << 4) 169 + #define LSCLK_DIV_1 (0 << 0) 170 + #define LSCLK_DIV_2 (1 << 0) 171 + 172 + /* Test & Debug */ 173 + #define TSTCTL 0x0a00 174 + #define PLL_DBG 0x0a04 175 + 176 + static bool tc_test_pattern; 177 + module_param_named(test, tc_test_pattern, bool, 0644); 178 + 179 + struct tc_edp_link { 180 + struct drm_dp_link base; 181 + u8 assr; 182 + int scrambler_dis; 183 + int spread; 184 + int coding8b10b; 185 + u8 swing; 186 + u8 preemp; 187 + }; 188 + 189 + struct tc_data { 190 + struct device *dev; 191 + struct regmap *regmap; 192 + struct drm_dp_aux aux; 193 + 194 + struct drm_bridge bridge; 195 + struct drm_connector connector; 196 + struct drm_panel *panel; 197 + 198 + /* link settings */ 199 + struct tc_edp_link link; 200 + 201 + /* display edid */ 202 + struct edid *edid; 203 + /* current mode */ 204 + struct drm_display_mode *mode; 205 + 206 + u32 rev; 207 + u8 assr; 208 + 209 + struct gpio_desc *sd_gpio; 210 + struct gpio_desc *reset_gpio; 211 + struct clk *refclk; 212 + }; 213 + 214 + static inline struct tc_data *aux_to_tc(struct drm_dp_aux *a) 215 + { 216 + return container_of(a, struct tc_data, aux); 217 + } 218 + 219 + static inline struct tc_data *bridge_to_tc(struct drm_bridge *b) 220 + { 221 + return container_of(b, struct tc_data, bridge); 222 + } 223 + 224 + static inline struct tc_data *connector_to_tc(struct drm_connector *c) 225 + { 226 + return container_of(c, struct tc_data, connector); 227 + } 228 + 229 + /* Simple macros to avoid repeated error checks */ 230 + #define tc_write(reg, var) \ 231 + do { \ 232 + ret = regmap_write(tc->regmap, reg, var); \ 233 + if (ret) \ 234 + goto err; \ 235 + } while (0) 236 + #define tc_read(reg, var) \ 237 + do { \ 238 + ret = regmap_read(tc->regmap, reg, var); \ 239 + if (ret) \ 240 + goto err; \ 241 + } while (0) 242 + 243 + static inline int tc_poll_timeout(struct regmap *map, unsigned int addr, 244 + unsigned int cond_mask, 245 + unsigned int cond_value, 246 + unsigned long sleep_us, u64 timeout_us) 247 + { 248 + ktime_t timeout = ktime_add_us(ktime_get(), timeout_us); 249 + unsigned int val; 250 + int ret; 251 + 252 + for (;;) { 253 + ret = regmap_read(map, addr, &val); 254 + if (ret) 255 + break; 256 + if ((val & cond_mask) == cond_value) 257 + break; 258 + if (timeout_us && ktime_compare(ktime_get(), timeout) > 0) { 259 + ret = regmap_read(map, addr, &val); 260 + break; 261 + } 262 + if (sleep_us) 263 + usleep_range((sleep_us >> 2) + 1, sleep_us); 264 + } 265 + return ret ?: (((val & cond_mask) == cond_value) ? 0 : -ETIMEDOUT); 266 + } 267 + 268 + static int tc_aux_wait_busy(struct tc_data *tc, unsigned int timeout_ms) 269 + { 270 + return tc_poll_timeout(tc->regmap, DP0_AUXSTATUS, AUX_BUSY, 0, 271 + 1000, 1000 * timeout_ms); 272 + } 273 + 274 + static int tc_aux_get_status(struct tc_data *tc, u8 *reply) 275 + { 276 + int ret; 277 + u32 value; 278 + 279 + ret = regmap_read(tc->regmap, DP0_AUXSTATUS, &value); 280 + if (ret < 0) 281 + return ret; 282 + if (value & AUX_BUSY) { 283 + if (value & AUX_TIMEOUT) { 284 + dev_err(tc->dev, "i2c access timeout!\n"); 285 + return -ETIMEDOUT; 286 + } 287 + return -EBUSY; 288 + } 289 + 290 + *reply = (value & AUX_STATUS_MASK) >> AUX_STATUS_SHIFT; 291 + return 0; 292 + } 293 + 294 + static ssize_t tc_aux_transfer(struct drm_dp_aux *aux, 295 + struct drm_dp_aux_msg *msg) 296 + { 297 + struct tc_data *tc = aux_to_tc(aux); 298 + size_t size = min_t(size_t, 8, msg->size); 299 + u8 request = msg->request & ~DP_AUX_I2C_MOT; 300 + u8 *buf = msg->buffer; 301 + u32 tmp = 0; 302 + int i = 0; 303 + int ret; 304 + 305 + if (size == 0) 306 + return 0; 307 + 308 + ret = tc_aux_wait_busy(tc, 100); 309 + if (ret) 310 + goto err; 311 + 312 + if (request == DP_AUX_I2C_WRITE || request == DP_AUX_NATIVE_WRITE) { 313 + /* Store data */ 314 + while (i < size) { 315 + if (request == DP_AUX_NATIVE_WRITE) 316 + tmp = tmp | (buf[i] << (8 * (i & 0x3))); 317 + else 318 + tmp = (tmp << 8) | buf[i]; 319 + i++; 320 + if (((i % 4) == 0) || (i == size)) { 321 + tc_write(DP0_AUXWDATA(i >> 2), tmp); 322 + tmp = 0; 323 + } 324 + } 325 + } else if (request != DP_AUX_I2C_READ && 326 + request != DP_AUX_NATIVE_READ) { 327 + return -EINVAL; 328 + } 329 + 330 + /* Store address */ 331 + tc_write(DP0_AUXADDR, msg->address); 332 + /* Start transfer */ 333 + tc_write(DP0_AUXCFG0, ((size - 1) << 8) | request); 334 + 335 + ret = tc_aux_wait_busy(tc, 100); 336 + if (ret) 337 + goto err; 338 + 339 + ret = tc_aux_get_status(tc, &msg->reply); 340 + if (ret) 341 + goto err; 342 + 343 + if (request == DP_AUX_I2C_READ || request == DP_AUX_NATIVE_READ) { 344 + /* Read data */ 345 + while (i < size) { 346 + if ((i % 4) == 0) 347 + tc_read(DP0_AUXRDATA(i >> 2), &tmp); 348 + buf[i] = tmp & 0xff; 349 + tmp = tmp >> 8; 350 + i++; 351 + } 352 + } 353 + 354 + return size; 355 + err: 356 + return ret; 357 + } 358 + 359 + static const char * const training_pattern1_errors[] = { 360 + "No errors", 361 + "Aux write error", 362 + "Aux read error", 363 + "Max voltage reached error", 364 + "Loop counter expired error", 365 + "res", "res", "res" 366 + }; 367 + 368 + static const char * const training_pattern2_errors[] = { 369 + "No errors", 370 + "Aux write error", 371 + "Aux read error", 372 + "Clock recovery failed error", 373 + "Loop counter expired error", 374 + "res", "res", "res" 375 + }; 376 + 377 + static u32 tc_srcctrl(struct tc_data *tc) 378 + { 379 + /* 380 + * No training pattern, skew lane 1 data by two LSCLK cycles with 381 + * respect to lane 0 data, AutoCorrect Mode = 0 382 + */ 383 + u32 reg = DP0_SRCCTRL_NOTP | DP0_SRCCTRL_LANESKEW; 384 + 385 + if (tc->link.scrambler_dis) 386 + reg |= DP0_SRCCTRL_SCRMBLDIS; /* Scrambler Disabled */ 387 + if (tc->link.coding8b10b) 388 + /* Enable 8/10B Encoder (TxData[19:16] not used) */ 389 + reg |= DP0_SRCCTRL_EN810B; 390 + if (tc->link.spread) 391 + reg |= DP0_SRCCTRL_SSCG; /* Spread Spectrum Enable */ 392 + if (tc->link.base.num_lanes == 2) 393 + reg |= DP0_SRCCTRL_LANES_2; /* Two Main Channel Lanes */ 394 + if (tc->link.base.rate != 162000) 395 + reg |= DP0_SRCCTRL_BW27; /* 2.7 Gbps link */ 396 + return reg; 397 + } 398 + 399 + static void tc_wait_pll_lock(struct tc_data *tc) 400 + { 401 + /* Wait for PLL to lock: up to 2.09 ms, depending on refclk */ 402 + usleep_range(3000, 6000); 403 + } 404 + 405 + static int tc_pxl_pll_en(struct tc_data *tc, u32 refclk, u32 pixelclock) 406 + { 407 + int ret; 408 + int i_pre, best_pre = 1; 409 + int i_post, best_post = 1; 410 + int div, best_div = 1; 411 + int mul, best_mul = 1; 412 + int delta, best_delta; 413 + int ext_div[] = {1, 2, 3, 5, 7}; 414 + int best_pixelclock = 0; 415 + int vco_hi = 0; 416 + 417 + dev_dbg(tc->dev, "PLL: requested %d pixelclock, ref %d\n", pixelclock, 418 + refclk); 419 + best_delta = pixelclock; 420 + /* Loop over all possible ext_divs, skipping invalid configurations */ 421 + for (i_pre = 0; i_pre < ARRAY_SIZE(ext_div); i_pre++) { 422 + /* 423 + * refclk / ext_pre_div should be in the 1 to 200 MHz range. 424 + * We don't allow any refclk > 200 MHz, only check lower bounds. 425 + */ 426 + if (refclk / ext_div[i_pre] < 1000000) 427 + continue; 428 + for (i_post = 0; i_post < ARRAY_SIZE(ext_div); i_post++) { 429 + for (div = 1; div <= 16; div++) { 430 + u32 clk; 431 + u64 tmp; 432 + 433 + tmp = pixelclock * ext_div[i_pre] * 434 + ext_div[i_post] * div; 435 + do_div(tmp, refclk); 436 + mul = tmp; 437 + 438 + /* Check limits */ 439 + if ((mul < 1) || (mul > 128)) 440 + continue; 441 + 442 + clk = (refclk / ext_div[i_pre] / div) * mul; 443 + /* 444 + * refclk * mul / (ext_pre_div * pre_div) 445 + * should be in the 150 to 650 MHz range 446 + */ 447 + if ((clk > 650000000) || (clk < 150000000)) 448 + continue; 449 + 450 + clk = clk / ext_div[i_post]; 451 + delta = clk - pixelclock; 452 + 453 + if (abs(delta) < abs(best_delta)) { 454 + best_pre = i_pre; 455 + best_post = i_post; 456 + best_div = div; 457 + best_mul = mul; 458 + best_delta = delta; 459 + best_pixelclock = clk; 460 + } 461 + } 462 + } 463 + } 464 + if (best_pixelclock == 0) { 465 + dev_err(tc->dev, "Failed to calc clock for %d pixelclock\n", 466 + pixelclock); 467 + return -EINVAL; 468 + } 469 + 470 + dev_dbg(tc->dev, "PLL: got %d, delta %d\n", best_pixelclock, 471 + best_delta); 472 + dev_dbg(tc->dev, "PLL: %d / %d / %d * %d / %d\n", refclk, 473 + ext_div[best_pre], best_div, best_mul, ext_div[best_post]); 474 + 475 + /* if VCO >= 300 MHz */ 476 + if (refclk / ext_div[best_pre] / best_div * best_mul >= 300000000) 477 + vco_hi = 1; 478 + /* see DS */ 479 + if (best_div == 16) 480 + best_div = 0; 481 + if (best_mul == 128) 482 + best_mul = 0; 483 + 484 + /* Power up PLL and switch to bypass */ 485 + tc_write(PXL_PLLCTRL, PLLBYP | PLLEN); 486 + 487 + tc_write(PXL_PLLPARAM, 488 + (vco_hi << 24) | /* For PLL VCO >= 300 MHz = 1 */ 489 + (ext_div[best_pre] << 20) | /* External Pre-divider */ 490 + (ext_div[best_post] << 16) | /* External Post-divider */ 491 + IN_SEL_REFCLK | /* Use RefClk as PLL input */ 492 + (best_div << 8) | /* Divider for PLL RefClk */ 493 + (best_mul << 0)); /* Multiplier for PLL */ 494 + 495 + /* Force PLL parameter update and disable bypass */ 496 + tc_write(PXL_PLLCTRL, PLLUPDATE | PLLEN); 497 + 498 + tc_wait_pll_lock(tc); 499 + 500 + return 0; 501 + err: 502 + return ret; 503 + } 504 + 505 + static int tc_pxl_pll_dis(struct tc_data *tc) 506 + { 507 + /* Enable PLL bypass, power down PLL */ 508 + return regmap_write(tc->regmap, PXL_PLLCTRL, PLLBYP); 509 + } 510 + 511 + static int tc_stream_clock_calc(struct tc_data *tc) 512 + { 513 + int ret; 514 + /* 515 + * If the Stream clock and Link Symbol clock are 516 + * asynchronous with each other, the value of M changes over 517 + * time. This way of generating link clock and stream 518 + * clock is called Asynchronous Clock mode. The value M 519 + * must change while the value N stays constant. The 520 + * value of N in this Asynchronous Clock mode must be set 521 + * to 2^15 or 32,768. 522 + * 523 + * LSCLK = 1/10 of high speed link clock 524 + * 525 + * f_STRMCLK = M/N * f_LSCLK 526 + * M/N = f_STRMCLK / f_LSCLK 527 + * 528 + */ 529 + tc_write(DP0_VIDMNGEN1, 32768); 530 + 531 + return 0; 532 + err: 533 + return ret; 534 + } 535 + 536 + static int tc_aux_link_setup(struct tc_data *tc) 537 + { 538 + unsigned long rate; 539 + u32 value; 540 + int ret; 541 + 542 + rate = clk_get_rate(tc->refclk); 543 + switch (rate) { 544 + case 38400000: 545 + value = REF_FREQ_38M4; 546 + break; 547 + case 26000000: 548 + value = REF_FREQ_26M; 549 + break; 550 + case 19200000: 551 + value = REF_FREQ_19M2; 552 + break; 553 + case 13000000: 554 + value = REF_FREQ_13M; 555 + break; 556 + default: 557 + dev_err(tc->dev, "Invalid refclk rate: %lu Hz\n", rate); 558 + return -EINVAL; 559 + } 560 + 561 + /* Setup DP-PHY / PLL */ 562 + value |= SYSCLK_SEL_LSCLK | LSCLK_DIV_2; 563 + tc_write(SYS_PLLPARAM, value); 564 + 565 + tc_write(DP_PHY_CTRL, BGREN | PWR_SW_EN | BIT(2) | PHY_A0_EN); 566 + 567 + /* 568 + * Initially PLLs are in bypass. Force PLL parameter update, 569 + * disable PLL bypass, enable PLL 570 + */ 571 + tc_write(DP0_PLLCTRL, PLLUPDATE | PLLEN); 572 + tc_wait_pll_lock(tc); 573 + 574 + tc_write(DP1_PLLCTRL, PLLUPDATE | PLLEN); 575 + tc_wait_pll_lock(tc); 576 + 577 + ret = tc_poll_timeout(tc->regmap, DP_PHY_CTRL, PHY_RDY, PHY_RDY, 1, 578 + 1000); 579 + if (ret == -ETIMEDOUT) { 580 + dev_err(tc->dev, "Timeout waiting for PHY to become ready"); 581 + return ret; 582 + } else if (ret) 583 + goto err; 584 + 585 + /* Setup AUX link */ 586 + tc_write(DP0_AUXCFG1, AUX_RX_FILTER_EN | 587 + (0x06 << 8) | /* Aux Bit Period Calculator Threshold */ 588 + (0x3f << 0)); /* Aux Response Timeout Timer */ 589 + 590 + return 0; 591 + err: 592 + dev_err(tc->dev, "tc_aux_link_setup failed: %d\n", ret); 593 + return ret; 594 + } 595 + 596 + static int tc_get_display_props(struct tc_data *tc) 597 + { 598 + int ret; 599 + /* temp buffer */ 600 + u8 tmp[8]; 601 + 602 + /* Read DP Rx Link Capability */ 603 + ret = drm_dp_link_probe(&tc->aux, &tc->link.base); 604 + if (ret < 0) 605 + goto err_dpcd_read; 606 + if ((tc->link.base.rate != 162000) && (tc->link.base.rate != 270000)) 607 + goto err_dpcd_inval; 608 + 609 + ret = drm_dp_dpcd_readb(&tc->aux, DP_MAX_DOWNSPREAD, tmp); 610 + if (ret < 0) 611 + goto err_dpcd_read; 612 + tc->link.spread = tmp[0] & BIT(0); /* 0.5% down spread */ 613 + 614 + ret = drm_dp_dpcd_readb(&tc->aux, DP_MAIN_LINK_CHANNEL_CODING, tmp); 615 + if (ret < 0) 616 + goto err_dpcd_read; 617 + tc->link.coding8b10b = tmp[0] & BIT(0); 618 + tc->link.scrambler_dis = 0; 619 + /* read assr */ 620 + ret = drm_dp_dpcd_readb(&tc->aux, DP_EDP_CONFIGURATION_SET, tmp); 621 + if (ret < 0) 622 + goto err_dpcd_read; 623 + tc->link.assr = tmp[0] & DP_ALTERNATE_SCRAMBLER_RESET_ENABLE; 624 + 625 + dev_dbg(tc->dev, "DPCD rev: %d.%d, rate: %s, lanes: %d, framing: %s\n", 626 + tc->link.base.revision >> 4, tc->link.base.revision & 0x0f, 627 + (tc->link.base.rate == 162000) ? "1.62Gbps" : "2.7Gbps", 628 + tc->link.base.num_lanes, 629 + (tc->link.base.capabilities & DP_LINK_CAP_ENHANCED_FRAMING) ? 630 + "enhanced" : "non-enhanced"); 631 + dev_dbg(tc->dev, "ANSI 8B/10B: %d\n", tc->link.coding8b10b); 632 + dev_dbg(tc->dev, "Display ASSR: %d, TC358767 ASSR: %d\n", 633 + tc->link.assr, tc->assr); 634 + 635 + return 0; 636 + 637 + err_dpcd_read: 638 + dev_err(tc->dev, "failed to read DPCD: %d\n", ret); 639 + return ret; 640 + err_dpcd_inval: 641 + dev_err(tc->dev, "invalid DPCD\n"); 642 + return -EINVAL; 643 + } 644 + 645 + static int tc_set_video_mode(struct tc_data *tc, struct drm_display_mode *mode) 646 + { 647 + int ret; 648 + int vid_sync_dly; 649 + int max_tu_symbol; 650 + 651 + int left_margin = mode->htotal - mode->hsync_end; 652 + int right_margin = mode->hsync_start - mode->hdisplay; 653 + int hsync_len = mode->hsync_end - mode->hsync_start; 654 + int upper_margin = mode->vtotal - mode->vsync_end; 655 + int lower_margin = mode->vsync_start - mode->vdisplay; 656 + int vsync_len = mode->vsync_end - mode->vsync_start; 657 + 658 + dev_dbg(tc->dev, "set mode %dx%d\n", 659 + mode->hdisplay, mode->vdisplay); 660 + dev_dbg(tc->dev, "H margin %d,%d sync %d\n", 661 + left_margin, right_margin, hsync_len); 662 + dev_dbg(tc->dev, "V margin %d,%d sync %d\n", 663 + upper_margin, lower_margin, vsync_len); 664 + dev_dbg(tc->dev, "total: %dx%d\n", mode->htotal, mode->vtotal); 665 + 666 + 667 + /* LCD Ctl Frame Size */ 668 + tc_write(VPCTRL0, (0x40 << 20) /* VSDELAY */ | 669 + OPXLFMT_RGB888 | FRMSYNC_DISABLED | MSF_DISABLED); 670 + tc_write(HTIM01, (left_margin << 16) | /* H back porch */ 671 + (hsync_len << 0)); /* Hsync */ 672 + tc_write(HTIM02, (right_margin << 16) | /* H front porch */ 673 + (mode->hdisplay << 0)); /* width */ 674 + tc_write(VTIM01, (upper_margin << 16) | /* V back porch */ 675 + (vsync_len << 0)); /* Vsync */ 676 + tc_write(VTIM02, (lower_margin << 16) | /* V front porch */ 677 + (mode->vdisplay << 0)); /* height */ 678 + tc_write(VFUEN0, VFUEN); /* update settings */ 679 + 680 + /* Test pattern settings */ 681 + tc_write(TSTCTL, 682 + (120 << 24) | /* Red Color component value */ 683 + (20 << 16) | /* Green Color component value */ 684 + (99 << 8) | /* Blue Color component value */ 685 + (1 << 4) | /* Enable I2C Filter */ 686 + (2 << 0) | /* Color bar Mode */ 687 + 0); 688 + 689 + /* DP Main Stream Attributes */ 690 + vid_sync_dly = hsync_len + left_margin + mode->hdisplay; 691 + tc_write(DP0_VIDSYNCDELAY, 692 + (0x003e << 16) | /* thresh_dly */ 693 + (vid_sync_dly << 0)); 694 + 695 + tc_write(DP0_TOTALVAL, (mode->vtotal << 16) | (mode->htotal)); 696 + 697 + tc_write(DP0_STARTVAL, 698 + ((upper_margin + vsync_len) << 16) | 699 + ((left_margin + hsync_len) << 0)); 700 + 701 + tc_write(DP0_ACTIVEVAL, (mode->vdisplay << 16) | (mode->hdisplay)); 702 + 703 + tc_write(DP0_SYNCVAL, (vsync_len << 16) | (hsync_len << 0)); 704 + 705 + tc_write(DPIPXLFMT, VS_POL_ACTIVE_LOW | HS_POL_ACTIVE_LOW | 706 + DE_POL_ACTIVE_HIGH | SUB_CFG_TYPE_CONFIG1 | DPI_BPP_RGB888); 707 + 708 + /* 709 + * Recommended maximum number of symbols transferred in a transfer unit: 710 + * DIV_ROUND_UP((input active video bandwidth in bytes) * tu_size, 711 + * (output active video bandwidth in bytes)) 712 + * Must be less than tu_size. 713 + */ 714 + max_tu_symbol = TU_SIZE_RECOMMENDED - 1; 715 + tc_write(DP0_MISC, (max_tu_symbol << 23) | TU_SIZE_RECOMMENDED | BPC_8); 716 + 717 + return 0; 718 + err: 719 + return ret; 720 + } 721 + 722 + static int tc_link_training(struct tc_data *tc, int pattern) 723 + { 724 + const char * const *errors; 725 + u32 srcctrl = tc_srcctrl(tc) | DP0_SRCCTRL_SCRMBLDIS | 726 + DP0_SRCCTRL_AUTOCORRECT; 727 + int timeout; 728 + int retry; 729 + u32 value; 730 + int ret; 731 + 732 + if (pattern == DP_TRAINING_PATTERN_1) { 733 + srcctrl |= DP0_SRCCTRL_TP1; 734 + errors = training_pattern1_errors; 735 + } else { 736 + srcctrl |= DP0_SRCCTRL_TP2; 737 + errors = training_pattern2_errors; 738 + } 739 + 740 + /* Set DPCD 0x102 for Training Part 1 or 2 */ 741 + tc_write(DP0_SNKLTCTRL, DP_LINK_SCRAMBLING_DISABLE | pattern); 742 + 743 + tc_write(DP0_LTLOOPCTRL, 744 + (0x0f << 28) | /* Defer Iteration Count */ 745 + (0x0f << 24) | /* Loop Iteration Count */ 746 + (0x0d << 0)); /* Loop Timer Delay */ 747 + 748 + retry = 5; 749 + do { 750 + /* Set DP0 Training Pattern */ 751 + tc_write(DP0_SRCCTRL, srcctrl); 752 + 753 + /* Enable DP0 to start Link Training */ 754 + tc_write(DP0CTL, DP_EN); 755 + 756 + /* wait */ 757 + timeout = 1000; 758 + do { 759 + tc_read(DP0_LTSTAT, &value); 760 + udelay(1); 761 + } while ((!(value & LT_LOOPDONE)) && (--timeout)); 762 + if (timeout == 0) { 763 + dev_err(tc->dev, "Link training timeout!\n"); 764 + } else { 765 + int pattern = (value >> 11) & 0x3; 766 + int error = (value >> 8) & 0x7; 767 + 768 + dev_dbg(tc->dev, 769 + "Link training phase %d done after %d uS: %s\n", 770 + pattern, 1000 - timeout, errors[error]); 771 + if (pattern == DP_TRAINING_PATTERN_1 && error == 0) 772 + break; 773 + if (pattern == DP_TRAINING_PATTERN_2) { 774 + value &= LT_CHANNEL1_EQ_BITS | 775 + LT_INTERLANE_ALIGN_DONE | 776 + LT_CHANNEL0_EQ_BITS; 777 + /* in case of two lanes */ 778 + if ((tc->link.base.num_lanes == 2) && 779 + (value == (LT_CHANNEL1_EQ_BITS | 780 + LT_INTERLANE_ALIGN_DONE | 781 + LT_CHANNEL0_EQ_BITS))) 782 + break; 783 + /* in case of one line */ 784 + if ((tc->link.base.num_lanes == 1) && 785 + (value == (LT_INTERLANE_ALIGN_DONE | 786 + LT_CHANNEL0_EQ_BITS))) 787 + break; 788 + } 789 + } 790 + /* restart */ 791 + tc_write(DP0CTL, 0); 792 + usleep_range(10, 20); 793 + } while (--retry); 794 + if (retry == 0) { 795 + dev_err(tc->dev, "Failed to finish training phase %d\n", 796 + pattern); 797 + } 798 + 799 + return 0; 800 + err: 801 + return ret; 802 + } 803 + 804 + static int tc_main_link_setup(struct tc_data *tc) 805 + { 806 + struct drm_dp_aux *aux = &tc->aux; 807 + struct device *dev = tc->dev; 808 + unsigned int rate; 809 + u32 dp_phy_ctrl; 810 + int timeout; 811 + bool aligned; 812 + bool ready; 813 + u32 value; 814 + int ret; 815 + u8 tmp[8]; 816 + 817 + /* display mode should be set at this point */ 818 + if (!tc->mode) 819 + return -EINVAL; 820 + 821 + /* from excel file - DP0_SrcCtrl */ 822 + tc_write(DP0_SRCCTRL, DP0_SRCCTRL_SCRMBLDIS | DP0_SRCCTRL_EN810B | 823 + DP0_SRCCTRL_LANESKEW | DP0_SRCCTRL_LANES_2 | 824 + DP0_SRCCTRL_BW27 | DP0_SRCCTRL_AUTOCORRECT); 825 + /* from excel file - DP1_SrcCtrl */ 826 + tc_write(0x07a0, 0x00003083); 827 + 828 + rate = clk_get_rate(tc->refclk); 829 + switch (rate) { 830 + case 38400000: 831 + value = REF_FREQ_38M4; 832 + break; 833 + case 26000000: 834 + value = REF_FREQ_26M; 835 + break; 836 + case 19200000: 837 + value = REF_FREQ_19M2; 838 + break; 839 + case 13000000: 840 + value = REF_FREQ_13M; 841 + break; 842 + default: 843 + return -EINVAL; 844 + } 845 + value |= SYSCLK_SEL_LSCLK | LSCLK_DIV_2; 846 + tc_write(SYS_PLLPARAM, value); 847 + /* Setup Main Link */ 848 + dp_phy_ctrl = BGREN | PWR_SW_EN | BIT(2) | PHY_A0_EN | PHY_M0_EN; 849 + tc_write(DP_PHY_CTRL, dp_phy_ctrl); 850 + msleep(100); 851 + 852 + /* PLL setup */ 853 + tc_write(DP0_PLLCTRL, PLLUPDATE | PLLEN); 854 + tc_wait_pll_lock(tc); 855 + 856 + tc_write(DP1_PLLCTRL, PLLUPDATE | PLLEN); 857 + tc_wait_pll_lock(tc); 858 + 859 + /* PXL PLL setup */ 860 + if (tc_test_pattern) { 861 + ret = tc_pxl_pll_en(tc, clk_get_rate(tc->refclk), 862 + 1000 * tc->mode->clock); 863 + if (ret) 864 + goto err; 865 + } 866 + 867 + /* Reset/Enable Main Links */ 868 + dp_phy_ctrl |= DP_PHY_RST | PHY_M1_RST | PHY_M0_RST; 869 + tc_write(DP_PHY_CTRL, dp_phy_ctrl); 870 + usleep_range(100, 200); 871 + dp_phy_ctrl &= ~(DP_PHY_RST | PHY_M1_RST | PHY_M0_RST); 872 + tc_write(DP_PHY_CTRL, dp_phy_ctrl); 873 + 874 + timeout = 1000; 875 + do { 876 + tc_read(DP_PHY_CTRL, &value); 877 + udelay(1); 878 + } while ((!(value & PHY_RDY)) && (--timeout)); 879 + 880 + if (timeout == 0) { 881 + dev_err(dev, "timeout waiting for phy become ready"); 882 + return -ETIMEDOUT; 883 + } 884 + 885 + /* Set misc: 8 bits per color */ 886 + ret = regmap_update_bits(tc->regmap, DP0_MISC, BPC_8, BPC_8); 887 + if (ret) 888 + goto err; 889 + 890 + /* 891 + * ASSR mode 892 + * on TC358767 side ASSR configured through strap pin 893 + * seems there is no way to change this setting from SW 894 + * 895 + * check is tc configured for same mode 896 + */ 897 + if (tc->assr != tc->link.assr) { 898 + dev_dbg(dev, "Trying to set display to ASSR: %d\n", 899 + tc->assr); 900 + /* try to set ASSR on display side */ 901 + tmp[0] = tc->assr; 902 + ret = drm_dp_dpcd_writeb(aux, DP_EDP_CONFIGURATION_SET, tmp[0]); 903 + if (ret < 0) 904 + goto err_dpcd_read; 905 + /* read back */ 906 + ret = drm_dp_dpcd_readb(aux, DP_EDP_CONFIGURATION_SET, tmp); 907 + if (ret < 0) 908 + goto err_dpcd_read; 909 + 910 + if (tmp[0] != tc->assr) { 911 + dev_warn(dev, "Failed to switch display ASSR to %d, falling back to unscrambled mode\n", 912 + tc->assr); 913 + /* trying with disabled scrambler */ 914 + tc->link.scrambler_dis = 1; 915 + } 916 + } 917 + 918 + /* Setup Link & DPRx Config for Training */ 919 + ret = drm_dp_link_configure(aux, &tc->link.base); 920 + if (ret < 0) 921 + goto err_dpcd_write; 922 + 923 + /* DOWNSPREAD_CTRL */ 924 + tmp[0] = tc->link.spread ? DP_SPREAD_AMP_0_5 : 0x00; 925 + /* MAIN_LINK_CHANNEL_CODING_SET */ 926 + tmp[1] = tc->link.coding8b10b ? DP_SET_ANSI_8B10B : 0x00; 927 + ret = drm_dp_dpcd_write(aux, DP_DOWNSPREAD_CTRL, tmp, 2); 928 + if (ret < 0) 929 + goto err_dpcd_write; 930 + 931 + ret = tc_link_training(tc, DP_TRAINING_PATTERN_1); 932 + if (ret) 933 + goto err; 934 + 935 + ret = tc_link_training(tc, DP_TRAINING_PATTERN_2); 936 + if (ret) 937 + goto err; 938 + 939 + /* Clear DPCD 0x102 */ 940 + /* Note: Can Not use DP0_SNKLTCTRL (0x06E4) short cut */ 941 + tmp[0] = tc->link.scrambler_dis ? DP_LINK_SCRAMBLING_DISABLE : 0x00; 942 + ret = drm_dp_dpcd_writeb(aux, DP_TRAINING_PATTERN_SET, tmp[0]); 943 + if (ret < 0) 944 + goto err_dpcd_write; 945 + 946 + /* Clear Training Pattern, set AutoCorrect Mode = 1 */ 947 + tc_write(DP0_SRCCTRL, tc_srcctrl(tc) | DP0_SRCCTRL_AUTOCORRECT); 948 + 949 + /* Wait */ 950 + timeout = 100; 951 + do { 952 + udelay(1); 953 + /* Read DPCD 0x202-0x207 */ 954 + ret = drm_dp_dpcd_read_link_status(aux, tmp + 2); 955 + if (ret < 0) 956 + goto err_dpcd_read; 957 + ready = (tmp[2] == ((DP_CHANNEL_EQ_BITS << 4) | /* Lane1 */ 958 + DP_CHANNEL_EQ_BITS)); /* Lane0 */ 959 + aligned = tmp[4] & DP_INTERLANE_ALIGN_DONE; 960 + } while ((--timeout) && !(ready && aligned)); 961 + 962 + if (timeout == 0) { 963 + /* Read DPCD 0x200-0x201 */ 964 + ret = drm_dp_dpcd_read(aux, DP_SINK_COUNT, tmp, 2); 965 + if (ret < 0) 966 + goto err_dpcd_read; 967 + dev_info(dev, "0x0200 SINK_COUNT: 0x%02x\n", tmp[0]); 968 + dev_info(dev, "0x0201 DEVICE_SERVICE_IRQ_VECTOR: 0x%02x\n", 969 + tmp[1]); 970 + dev_info(dev, "0x0202 LANE0_1_STATUS: 0x%02x\n", tmp[2]); 971 + dev_info(dev, "0x0204 LANE_ALIGN_STATUS_UPDATED: 0x%02x\n", 972 + tmp[4]); 973 + dev_info(dev, "0x0205 SINK_STATUS: 0x%02x\n", tmp[5]); 974 + dev_info(dev, "0x0206 ADJUST_REQUEST_LANE0_1: 0x%02x\n", 975 + tmp[6]); 976 + 977 + if (!ready) 978 + dev_err(dev, "Lane0/1 not ready\n"); 979 + if (!aligned) 980 + dev_err(dev, "Lane0/1 not aligned\n"); 981 + return -EAGAIN; 982 + } 983 + 984 + ret = tc_set_video_mode(tc, tc->mode); 985 + if (ret) 986 + goto err; 987 + 988 + /* Set M/N */ 989 + ret = tc_stream_clock_calc(tc); 990 + if (ret) 991 + goto err; 992 + 993 + return 0; 994 + err_dpcd_read: 995 + dev_err(tc->dev, "Failed to read DPCD: %d\n", ret); 996 + return ret; 997 + err_dpcd_write: 998 + dev_err(tc->dev, "Failed to write DPCD: %d\n", ret); 999 + err: 1000 + return ret; 1001 + } 1002 + 1003 + static int tc_main_link_stream(struct tc_data *tc, int state) 1004 + { 1005 + int ret; 1006 + u32 value; 1007 + 1008 + dev_dbg(tc->dev, "stream: %d\n", state); 1009 + 1010 + if (state) { 1011 + value = VID_MN_GEN | DP_EN; 1012 + if (tc->link.base.capabilities & DP_LINK_CAP_ENHANCED_FRAMING) 1013 + value |= EF_EN; 1014 + tc_write(DP0CTL, value); 1015 + /* 1016 + * VID_EN assertion should be delayed by at least N * LSCLK 1017 + * cycles from the time VID_MN_GEN is enabled in order to 1018 + * generate stable values for VID_M. LSCLK is 270 MHz or 1019 + * 162 MHz, VID_N is set to 32768 in tc_stream_clock_calc(), 1020 + * so a delay of at least 203 us should suffice. 1021 + */ 1022 + usleep_range(500, 1000); 1023 + value |= VID_EN; 1024 + tc_write(DP0CTL, value); 1025 + /* Set input interface */ 1026 + value = DP0_AUDSRC_NO_INPUT; 1027 + if (tc_test_pattern) 1028 + value |= DP0_VIDSRC_COLOR_BAR; 1029 + else 1030 + value |= DP0_VIDSRC_DPI_RX; 1031 + tc_write(SYSCTRL, value); 1032 + } else { 1033 + tc_write(DP0CTL, 0); 1034 + } 1035 + 1036 + return 0; 1037 + err: 1038 + return ret; 1039 + } 1040 + 1041 + static enum drm_connector_status 1042 + tc_connector_detect(struct drm_connector *connector, bool force) 1043 + { 1044 + return connector_status_connected; 1045 + } 1046 + 1047 + static void tc_bridge_pre_enable(struct drm_bridge *bridge) 1048 + { 1049 + struct tc_data *tc = bridge_to_tc(bridge); 1050 + 1051 + drm_panel_prepare(tc->panel); 1052 + } 1053 + 1054 + static void tc_bridge_enable(struct drm_bridge *bridge) 1055 + { 1056 + struct tc_data *tc = bridge_to_tc(bridge); 1057 + int ret; 1058 + 1059 + ret = tc_main_link_setup(tc); 1060 + if (ret < 0) { 1061 + dev_err(tc->dev, "main link setup error: %d\n", ret); 1062 + return; 1063 + } 1064 + 1065 + ret = tc_main_link_stream(tc, 1); 1066 + if (ret < 0) { 1067 + dev_err(tc->dev, "main link stream start error: %d\n", ret); 1068 + return; 1069 + } 1070 + 1071 + drm_panel_enable(tc->panel); 1072 + } 1073 + 1074 + static void tc_bridge_disable(struct drm_bridge *bridge) 1075 + { 1076 + struct tc_data *tc = bridge_to_tc(bridge); 1077 + int ret; 1078 + 1079 + drm_panel_disable(tc->panel); 1080 + 1081 + ret = tc_main_link_stream(tc, 0); 1082 + if (ret < 0) 1083 + dev_err(tc->dev, "main link stream stop error: %d\n", ret); 1084 + } 1085 + 1086 + static void tc_bridge_post_disable(struct drm_bridge *bridge) 1087 + { 1088 + struct tc_data *tc = bridge_to_tc(bridge); 1089 + 1090 + drm_panel_unprepare(tc->panel); 1091 + } 1092 + 1093 + static bool tc_bridge_mode_fixup(struct drm_bridge *bridge, 1094 + const struct drm_display_mode *mode, 1095 + struct drm_display_mode *adj) 1096 + { 1097 + /* Fixup sync polarities, both hsync and vsync are active low */ 1098 + adj->flags = mode->flags; 1099 + adj->flags |= (DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC); 1100 + adj->flags &= ~(DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC); 1101 + 1102 + return true; 1103 + } 1104 + 1105 + static int tc_connector_mode_valid(struct drm_connector *connector, 1106 + struct drm_display_mode *mode) 1107 + { 1108 + /* Accept any mode */ 1109 + return MODE_OK; 1110 + } 1111 + 1112 + static void tc_bridge_mode_set(struct drm_bridge *bridge, 1113 + struct drm_display_mode *mode, 1114 + struct drm_display_mode *adj) 1115 + { 1116 + struct tc_data *tc = bridge_to_tc(bridge); 1117 + 1118 + tc->mode = mode; 1119 + } 1120 + 1121 + static int tc_connector_get_modes(struct drm_connector *connector) 1122 + { 1123 + struct tc_data *tc = connector_to_tc(connector); 1124 + struct edid *edid; 1125 + unsigned int count; 1126 + 1127 + if (tc->panel && tc->panel->funcs && tc->panel->funcs->get_modes) { 1128 + count = tc->panel->funcs->get_modes(tc->panel); 1129 + if (count > 0) 1130 + return count; 1131 + } 1132 + 1133 + edid = drm_get_edid(connector, &tc->aux.ddc); 1134 + 1135 + kfree(tc->edid); 1136 + tc->edid = edid; 1137 + if (!edid) 1138 + return 0; 1139 + 1140 + drm_mode_connector_update_edid_property(connector, edid); 1141 + count = drm_add_edid_modes(connector, edid); 1142 + 1143 + return count; 1144 + } 1145 + 1146 + static void tc_connector_set_polling(struct tc_data *tc, 1147 + struct drm_connector *connector) 1148 + { 1149 + /* TODO: add support for HPD */ 1150 + connector->polled = DRM_CONNECTOR_POLL_CONNECT | 1151 + DRM_CONNECTOR_POLL_DISCONNECT; 1152 + } 1153 + 1154 + static struct drm_encoder * 1155 + tc_connector_best_encoder(struct drm_connector *connector) 1156 + { 1157 + struct tc_data *tc = connector_to_tc(connector); 1158 + 1159 + return tc->bridge.encoder; 1160 + } 1161 + 1162 + static const struct drm_connector_helper_funcs tc_connector_helper_funcs = { 1163 + .get_modes = tc_connector_get_modes, 1164 + .mode_valid = tc_connector_mode_valid, 1165 + .best_encoder = tc_connector_best_encoder, 1166 + }; 1167 + 1168 + static void tc_connector_destroy(struct drm_connector *connector) 1169 + { 1170 + drm_connector_unregister(connector); 1171 + drm_connector_cleanup(connector); 1172 + } 1173 + 1174 + static const struct drm_connector_funcs tc_connector_funcs = { 1175 + .dpms = drm_atomic_helper_connector_dpms, 1176 + .fill_modes = drm_helper_probe_single_connector_modes, 1177 + .detect = tc_connector_detect, 1178 + .destroy = tc_connector_destroy, 1179 + .reset = drm_atomic_helper_connector_reset, 1180 + .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state, 1181 + .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, 1182 + }; 1183 + 1184 + static int tc_bridge_attach(struct drm_bridge *bridge) 1185 + { 1186 + u32 bus_format = MEDIA_BUS_FMT_RGB888_1X24; 1187 + struct tc_data *tc = bridge_to_tc(bridge); 1188 + struct drm_device *drm = bridge->dev; 1189 + int ret; 1190 + 1191 + /* Create eDP connector */ 1192 + drm_connector_helper_add(&tc->connector, &tc_connector_helper_funcs); 1193 + ret = drm_connector_init(drm, &tc->connector, &tc_connector_funcs, 1194 + DRM_MODE_CONNECTOR_eDP); 1195 + if (ret) 1196 + return ret; 1197 + 1198 + if (tc->panel) 1199 + drm_panel_attach(tc->panel, &tc->connector); 1200 + 1201 + drm_display_info_set_bus_formats(&tc->connector.display_info, 1202 + &bus_format, 1); 1203 + drm_mode_connector_attach_encoder(&tc->connector, tc->bridge.encoder); 1204 + 1205 + return 0; 1206 + } 1207 + 1208 + static const struct drm_bridge_funcs tc_bridge_funcs = { 1209 + .attach = tc_bridge_attach, 1210 + .mode_set = tc_bridge_mode_set, 1211 + .pre_enable = tc_bridge_pre_enable, 1212 + .enable = tc_bridge_enable, 1213 + .disable = tc_bridge_disable, 1214 + .post_disable = tc_bridge_post_disable, 1215 + .mode_fixup = tc_bridge_mode_fixup, 1216 + }; 1217 + 1218 + static bool tc_readable_reg(struct device *dev, unsigned int reg) 1219 + { 1220 + return reg != SYSCTRL; 1221 + } 1222 + 1223 + static const struct regmap_range tc_volatile_ranges[] = { 1224 + regmap_reg_range(DP0_AUXWDATA(0), DP0_AUXSTATUS), 1225 + regmap_reg_range(DP0_LTSTAT, DP0_SNKLTCHGREQ), 1226 + regmap_reg_range(DP_PHY_CTRL, DP_PHY_CTRL), 1227 + regmap_reg_range(DP0_PLLCTRL, PXL_PLLCTRL), 1228 + regmap_reg_range(VFUEN0, VFUEN0), 1229 + }; 1230 + 1231 + static const struct regmap_access_table tc_volatile_table = { 1232 + .yes_ranges = tc_volatile_ranges, 1233 + .n_yes_ranges = ARRAY_SIZE(tc_volatile_ranges), 1234 + }; 1235 + 1236 + static bool tc_writeable_reg(struct device *dev, unsigned int reg) 1237 + { 1238 + return (reg != TC_IDREG) && 1239 + (reg != DP0_LTSTAT) && 1240 + (reg != DP0_SNKLTCHGREQ); 1241 + } 1242 + 1243 + static const struct regmap_config tc_regmap_config = { 1244 + .name = "tc358767", 1245 + .reg_bits = 16, 1246 + .val_bits = 32, 1247 + .reg_stride = 4, 1248 + .max_register = PLL_DBG, 1249 + .cache_type = REGCACHE_RBTREE, 1250 + .readable_reg = tc_readable_reg, 1251 + .volatile_table = &tc_volatile_table, 1252 + .writeable_reg = tc_writeable_reg, 1253 + .reg_format_endian = REGMAP_ENDIAN_BIG, 1254 + .val_format_endian = REGMAP_ENDIAN_LITTLE, 1255 + }; 1256 + 1257 + static int tc_probe(struct i2c_client *client, const struct i2c_device_id *id) 1258 + { 1259 + struct device *dev = &client->dev; 1260 + struct device_node *ep; 1261 + struct tc_data *tc; 1262 + int ret; 1263 + 1264 + tc = devm_kzalloc(dev, sizeof(*tc), GFP_KERNEL); 1265 + if (!tc) 1266 + return -ENOMEM; 1267 + 1268 + tc->dev = dev; 1269 + 1270 + /* port@2 is the output port */ 1271 + ep = of_graph_get_endpoint_by_regs(dev->of_node, 2, -1); 1272 + if (ep) { 1273 + struct device_node *remote; 1274 + 1275 + remote = of_graph_get_remote_port_parent(ep); 1276 + if (!remote) { 1277 + dev_warn(dev, "endpoint %s not connected\n", 1278 + ep->full_name); 1279 + of_node_put(ep); 1280 + return -ENODEV; 1281 + } 1282 + of_node_put(ep); 1283 + tc->panel = of_drm_find_panel(remote); 1284 + if (tc->panel) { 1285 + dev_dbg(dev, "found panel %s\n", remote->full_name); 1286 + } else { 1287 + dev_dbg(dev, "waiting for panel %s\n", 1288 + remote->full_name); 1289 + of_node_put(remote); 1290 + return -EPROBE_DEFER; 1291 + } 1292 + of_node_put(remote); 1293 + } 1294 + 1295 + /* Shut down GPIO is optional */ 1296 + tc->sd_gpio = devm_gpiod_get_optional(dev, "shutdown", GPIOD_OUT_HIGH); 1297 + if (IS_ERR(tc->sd_gpio)) 1298 + return PTR_ERR(tc->sd_gpio); 1299 + 1300 + if (tc->sd_gpio) { 1301 + gpiod_set_value_cansleep(tc->sd_gpio, 0); 1302 + usleep_range(5000, 10000); 1303 + } 1304 + 1305 + /* Reset GPIO is optional */ 1306 + tc->reset_gpio = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_LOW); 1307 + if (IS_ERR(tc->reset_gpio)) 1308 + return PTR_ERR(tc->reset_gpio); 1309 + 1310 + if (tc->reset_gpio) { 1311 + gpiod_set_value_cansleep(tc->reset_gpio, 1); 1312 + usleep_range(5000, 10000); 1313 + } 1314 + 1315 + tc->refclk = devm_clk_get(dev, "ref"); 1316 + if (IS_ERR(tc->refclk)) { 1317 + ret = PTR_ERR(tc->refclk); 1318 + dev_err(dev, "Failed to get refclk: %d\n", ret); 1319 + return ret; 1320 + } 1321 + 1322 + tc->regmap = devm_regmap_init_i2c(client, &tc_regmap_config); 1323 + if (IS_ERR(tc->regmap)) { 1324 + ret = PTR_ERR(tc->regmap); 1325 + dev_err(dev, "Failed to initialize regmap: %d\n", ret); 1326 + return ret; 1327 + } 1328 + 1329 + ret = regmap_read(tc->regmap, TC_IDREG, &tc->rev); 1330 + if (ret) { 1331 + dev_err(tc->dev, "can not read device ID: %d\n", ret); 1332 + return ret; 1333 + } 1334 + 1335 + if ((tc->rev != 0x6601) && (tc->rev != 0x6603)) { 1336 + dev_err(tc->dev, "invalid device ID: 0x%08x\n", tc->rev); 1337 + return -EINVAL; 1338 + } 1339 + 1340 + tc->assr = (tc->rev == 0x6601); /* Enable ASSR for eDP panels */ 1341 + 1342 + ret = tc_aux_link_setup(tc); 1343 + if (ret) 1344 + return ret; 1345 + 1346 + /* Register DP AUX channel */ 1347 + tc->aux.name = "TC358767 AUX i2c adapter"; 1348 + tc->aux.dev = tc->dev; 1349 + tc->aux.transfer = tc_aux_transfer; 1350 + ret = drm_dp_aux_register(&tc->aux); 1351 + if (ret) 1352 + return ret; 1353 + 1354 + ret = tc_get_display_props(tc); 1355 + if (ret) 1356 + goto err_unregister_aux; 1357 + 1358 + tc_connector_set_polling(tc, &tc->connector); 1359 + 1360 + tc->bridge.funcs = &tc_bridge_funcs; 1361 + tc->bridge.of_node = dev->of_node; 1362 + ret = drm_bridge_add(&tc->bridge); 1363 + if (ret) { 1364 + dev_err(dev, "Failed to add drm_bridge: %d\n", ret); 1365 + goto err_unregister_aux; 1366 + } 1367 + 1368 + i2c_set_clientdata(client, tc); 1369 + 1370 + return 0; 1371 + err_unregister_aux: 1372 + drm_dp_aux_unregister(&tc->aux); 1373 + return ret; 1374 + } 1375 + 1376 + static int tc_remove(struct i2c_client *client) 1377 + { 1378 + struct tc_data *tc = i2c_get_clientdata(client); 1379 + 1380 + drm_bridge_remove(&tc->bridge); 1381 + drm_dp_aux_unregister(&tc->aux); 1382 + 1383 + tc_pxl_pll_dis(tc); 1384 + 1385 + return 0; 1386 + } 1387 + 1388 + static const struct i2c_device_id tc358767_i2c_ids[] = { 1389 + { "tc358767", 0 }, 1390 + { } 1391 + }; 1392 + MODULE_DEVICE_TABLE(i2c, tc358767_i2c_ids); 1393 + 1394 + static const struct of_device_id tc358767_of_ids[] = { 1395 + { .compatible = "toshiba,tc358767", }, 1396 + { } 1397 + }; 1398 + MODULE_DEVICE_TABLE(of, tc358767_of_ids); 1399 + 1400 + static struct i2c_driver tc358767_driver = { 1401 + .driver = { 1402 + .name = "tc358767", 1403 + .of_match_table = tc358767_of_ids, 1404 + }, 1405 + .id_table = tc358767_i2c_ids, 1406 + .probe = tc_probe, 1407 + .remove = tc_remove, 1408 + }; 1409 + module_i2c_driver(tc358767_driver); 1410 + 1411 + MODULE_AUTHOR("Andrey Gusakov <andrey.gusakov@cogentembedded.com>"); 1412 + MODULE_DESCRIPTION("tc358767 eDP encoder driver"); 1413 + MODULE_LICENSE("GPL");
-6
drivers/gpu/drm/i2c/Kconfig
··· 1 1 menu "I2C encoder or helper chips" 2 2 depends on DRM && DRM_KMS_HELPER && I2C 3 3 4 - config DRM_I2C_ADV7511 5 - tristate "AV7511 encoder" 6 - select REGMAP_I2C 7 - help 8 - Support for the Analog Device ADV7511(W) and ADV7513 HDMI encoders. 9 - 10 4 config DRM_I2C_CH7006 11 5 tristate "Chrontel ch7006 TV encoder" 12 6 default m if DRM_NOUVEAU
-2
drivers/gpu/drm/i2c/Makefile
··· 1 1 ccflags-y := -Iinclude/drm 2 2 3 - obj-$(CONFIG_DRM_I2C_ADV7511) += adv7511.o 4 - 5 3 ch7006-y := ch7006_drv.o ch7006_mode.o 6 4 obj-$(CONFIG_DRM_I2C_CH7006) += ch7006.o 7 5
+212 -112
drivers/gpu/drm/i2c/adv7511.c drivers/gpu/drm/bridge/adv7511/adv7511_drv.c
··· 8 8 9 9 #include <linux/device.h> 10 10 #include <linux/gpio/consumer.h> 11 - #include <linux/i2c.h> 12 11 #include <linux/module.h> 13 - #include <linux/regmap.h> 12 + #include <linux/of_device.h> 14 13 #include <linux/slab.h> 15 14 16 15 #include <drm/drmP.h> 17 - #include <drm/drm_crtc_helper.h> 16 + #include <drm/drm_atomic.h> 17 + #include <drm/drm_atomic_helper.h> 18 18 #include <drm/drm_edid.h> 19 - #include <drm/drm_encoder_slave.h> 20 19 21 20 #include "adv7511.h" 22 - 23 - struct adv7511 { 24 - struct i2c_client *i2c_main; 25 - struct i2c_client *i2c_edid; 26 - 27 - struct regmap *regmap; 28 - struct regmap *packet_memory_regmap; 29 - enum drm_connector_status status; 30 - bool powered; 31 - 32 - unsigned int f_tmds; 33 - 34 - unsigned int current_edid_segment; 35 - uint8_t edid_buf[256]; 36 - bool edid_read; 37 - 38 - wait_queue_head_t wq; 39 - struct drm_encoder *encoder; 40 - 41 - bool embedded_sync; 42 - enum adv7511_sync_polarity vsync_polarity; 43 - enum adv7511_sync_polarity hsync_polarity; 44 - bool rgb; 45 - 46 - struct edid *edid; 47 - 48 - struct gpio_desc *gpio_pd; 49 - }; 50 - 51 - static struct adv7511 *encoder_to_adv7511(struct drm_encoder *encoder) 52 - { 53 - return to_encoder_slave(encoder)->slave_priv; 54 - } 55 21 56 22 /* ADI recommended values for proper operation. */ 57 23 static const struct reg_sequence adv7511_fixed_registers[] = { ··· 360 394 */ 361 395 regcache_sync(adv7511->regmap); 362 396 397 + if (adv7511->type == ADV7533) 398 + adv7533_dsi_power_on(adv7511); 399 + 363 400 adv7511->powered = true; 364 401 } 365 402 ··· 373 404 ADV7511_POWER_POWER_DOWN, 374 405 ADV7511_POWER_POWER_DOWN); 375 406 regcache_mark_dirty(adv7511->regmap); 407 + 408 + if (adv7511->type == ADV7533) 409 + adv7533_dsi_power_off(adv7511); 376 410 377 411 adv7511->powered = false; 378 412 } ··· 402 430 return false; 403 431 } 404 432 405 - static int adv7511_irq_process(struct adv7511 *adv7511) 433 + static int adv7511_irq_process(struct adv7511 *adv7511, bool process_hpd) 406 434 { 407 435 unsigned int irq0, irq1; 408 436 int ret; ··· 418 446 regmap_write(adv7511->regmap, ADV7511_REG_INT(0), irq0); 419 447 regmap_write(adv7511->regmap, ADV7511_REG_INT(1), irq1); 420 448 421 - if (irq0 & ADV7511_INT0_HPD && adv7511->encoder) 422 - drm_helper_hpd_irq_event(adv7511->encoder->dev); 449 + if (process_hpd && irq0 & ADV7511_INT0_HPD && adv7511->bridge.encoder) 450 + drm_helper_hpd_irq_event(adv7511->connector.dev); 423 451 424 452 if (irq0 & ADV7511_INT0_EDID_READY || irq1 & ADV7511_INT1_DDC_ERROR) { 425 453 adv7511->edid_read = true; ··· 436 464 struct adv7511 *adv7511 = devid; 437 465 int ret; 438 466 439 - ret = adv7511_irq_process(adv7511); 467 + ret = adv7511_irq_process(adv7511, true); 440 468 return ret < 0 ? IRQ_NONE : IRQ_HANDLED; 441 469 } 442 470 ··· 453 481 adv7511->edid_read, msecs_to_jiffies(timeout)); 454 482 } else { 455 483 for (; timeout > 0; timeout -= 25) { 456 - ret = adv7511_irq_process(adv7511); 484 + ret = adv7511_irq_process(adv7511, false); 457 485 if (ret < 0) 458 486 break; 459 487 ··· 535 563 } 536 564 537 565 /* ----------------------------------------------------------------------------- 538 - * Encoder operations 566 + * ADV75xx helpers 539 567 */ 540 568 541 - static int adv7511_get_modes(struct drm_encoder *encoder, 569 + static int adv7511_get_modes(struct adv7511 *adv7511, 542 570 struct drm_connector *connector) 543 571 { 544 - struct adv7511 *adv7511 = encoder_to_adv7511(encoder); 545 572 struct edid *edid; 546 573 unsigned int count; 547 574 ··· 577 606 return count; 578 607 } 579 608 580 - static void adv7511_encoder_dpms(struct drm_encoder *encoder, int mode) 581 - { 582 - struct adv7511 *adv7511 = encoder_to_adv7511(encoder); 583 - 584 - if (mode == DRM_MODE_DPMS_ON) 585 - adv7511_power_on(adv7511); 586 - else 587 - adv7511_power_off(adv7511); 588 - } 589 - 590 609 static enum drm_connector_status 591 - adv7511_encoder_detect(struct drm_encoder *encoder, 592 - struct drm_connector *connector) 610 + adv7511_detect(struct adv7511 *adv7511, struct drm_connector *connector) 593 611 { 594 - struct adv7511 *adv7511 = encoder_to_adv7511(encoder); 595 612 enum drm_connector_status status; 596 613 unsigned int val; 597 614 bool hpd; ··· 603 644 if (status == connector_status_connected && hpd && adv7511->powered) { 604 645 regcache_mark_dirty(adv7511->regmap); 605 646 adv7511_power_on(adv7511); 606 - adv7511_get_modes(encoder, connector); 647 + adv7511_get_modes(adv7511, connector); 607 648 if (adv7511->status == connector_status_connected) 608 649 status = connector_status_disconnected; 609 650 } else { ··· 617 658 return status; 618 659 } 619 660 620 - static int adv7511_encoder_mode_valid(struct drm_encoder *encoder, 621 - struct drm_display_mode *mode) 661 + static int adv7511_mode_valid(struct adv7511 *adv7511, 662 + struct drm_display_mode *mode) 622 663 { 623 664 if (mode->clock > 165000) 624 665 return MODE_CLOCK_HIGH; ··· 626 667 return MODE_OK; 627 668 } 628 669 629 - static void adv7511_encoder_mode_set(struct drm_encoder *encoder, 630 - struct drm_display_mode *mode, 631 - struct drm_display_mode *adj_mode) 670 + static void adv7511_mode_set(struct adv7511 *adv7511, 671 + struct drm_display_mode *mode, 672 + struct drm_display_mode *adj_mode) 632 673 { 633 - struct adv7511 *adv7511 = encoder_to_adv7511(encoder); 634 674 unsigned int low_refresh_rate; 635 675 unsigned int hsync_polarity = 0; 636 676 unsigned int vsync_polarity = 0; ··· 712 754 regmap_update_bits(adv7511->regmap, 0x17, 713 755 0x60, (vsync_polarity << 6) | (hsync_polarity << 5)); 714 756 757 + if (adv7511->type == ADV7533) 758 + adv7533_mode_set(adv7511, adj_mode); 759 + 760 + drm_mode_copy(&adv7511->curr_mode, adj_mode); 761 + 715 762 /* 716 763 * TODO Test first order 4:2:2 to 4:4:4 up conversion method, which is 717 764 * supposed to give better results. ··· 725 762 adv7511->f_tmds = mode->clock; 726 763 } 727 764 728 - static const struct drm_encoder_slave_funcs adv7511_encoder_funcs = { 729 - .dpms = adv7511_encoder_dpms, 730 - .mode_valid = adv7511_encoder_mode_valid, 731 - .mode_set = adv7511_encoder_mode_set, 732 - .detect = adv7511_encoder_detect, 733 - .get_modes = adv7511_get_modes, 765 + /* Connector funcs */ 766 + static struct adv7511 *connector_to_adv7511(struct drm_connector *connector) 767 + { 768 + return container_of(connector, struct adv7511, connector); 769 + } 770 + 771 + static int adv7511_connector_get_modes(struct drm_connector *connector) 772 + { 773 + struct adv7511 *adv = connector_to_adv7511(connector); 774 + 775 + return adv7511_get_modes(adv, connector); 776 + } 777 + 778 + static enum drm_mode_status 779 + adv7511_connector_mode_valid(struct drm_connector *connector, 780 + struct drm_display_mode *mode) 781 + { 782 + struct adv7511 *adv = connector_to_adv7511(connector); 783 + 784 + return adv7511_mode_valid(adv, mode); 785 + } 786 + 787 + static struct drm_connector_helper_funcs adv7511_connector_helper_funcs = { 788 + .get_modes = adv7511_connector_get_modes, 789 + .mode_valid = adv7511_connector_mode_valid, 790 + }; 791 + 792 + static enum drm_connector_status 793 + adv7511_connector_detect(struct drm_connector *connector, bool force) 794 + { 795 + struct adv7511 *adv = connector_to_adv7511(connector); 796 + 797 + return adv7511_detect(adv, connector); 798 + } 799 + 800 + static struct drm_connector_funcs adv7511_connector_funcs = { 801 + .dpms = drm_atomic_helper_connector_dpms, 802 + .fill_modes = drm_helper_probe_single_connector_modes, 803 + .detect = adv7511_connector_detect, 804 + .destroy = drm_connector_cleanup, 805 + .reset = drm_atomic_helper_connector_reset, 806 + .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state, 807 + .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, 808 + }; 809 + 810 + /* Bridge funcs */ 811 + static struct adv7511 *bridge_to_adv7511(struct drm_bridge *bridge) 812 + { 813 + return container_of(bridge, struct adv7511, bridge); 814 + } 815 + 816 + static void adv7511_bridge_enable(struct drm_bridge *bridge) 817 + { 818 + struct adv7511 *adv = bridge_to_adv7511(bridge); 819 + 820 + adv7511_power_on(adv); 821 + } 822 + 823 + static void adv7511_bridge_disable(struct drm_bridge *bridge) 824 + { 825 + struct adv7511 *adv = bridge_to_adv7511(bridge); 826 + 827 + adv7511_power_off(adv); 828 + } 829 + 830 + static void adv7511_bridge_mode_set(struct drm_bridge *bridge, 831 + struct drm_display_mode *mode, 832 + struct drm_display_mode *adj_mode) 833 + { 834 + struct adv7511 *adv = bridge_to_adv7511(bridge); 835 + 836 + adv7511_mode_set(adv, mode, adj_mode); 837 + } 838 + 839 + static int adv7511_bridge_attach(struct drm_bridge *bridge) 840 + { 841 + struct adv7511 *adv = bridge_to_adv7511(bridge); 842 + int ret; 843 + 844 + if (!bridge->encoder) { 845 + DRM_ERROR("Parent encoder object not found"); 846 + return -ENODEV; 847 + } 848 + 849 + adv->connector.polled = DRM_CONNECTOR_POLL_HPD; 850 + 851 + ret = drm_connector_init(bridge->dev, &adv->connector, 852 + &adv7511_connector_funcs, 853 + DRM_MODE_CONNECTOR_HDMIA); 854 + if (ret) { 855 + DRM_ERROR("Failed to initialize connector with drm\n"); 856 + return ret; 857 + } 858 + drm_connector_helper_add(&adv->connector, 859 + &adv7511_connector_helper_funcs); 860 + drm_mode_connector_attach_encoder(&adv->connector, bridge->encoder); 861 + 862 + if (adv->type == ADV7533) 863 + ret = adv7533_attach_dsi(adv); 864 + 865 + return ret; 866 + } 867 + 868 + static struct drm_bridge_funcs adv7511_bridge_funcs = { 869 + .enable = adv7511_bridge_enable, 870 + .disable = adv7511_bridge_disable, 871 + .mode_set = adv7511_bridge_mode_set, 872 + .attach = adv7511_bridge_attach, 734 873 }; 735 874 736 875 /* ----------------------------------------------------------------------------- ··· 844 779 { 845 780 const char *str; 846 781 int ret; 847 - 848 - memset(config, 0, sizeof(*config)); 849 782 850 783 of_property_read_u32(np, "adi,input-depth", &config->input_color_depth); 851 784 if (config->input_color_depth != 8 && config->input_color_depth != 10 && ··· 944 881 adv7511->powered = false; 945 882 adv7511->status = connector_status_disconnected; 946 883 947 - ret = adv7511_parse_dt(dev->of_node, &link_config); 884 + if (dev->of_node) 885 + adv7511->type = (enum adv7511_type)of_device_get_match_data(dev); 886 + else 887 + adv7511->type = id->driver_data; 888 + 889 + memset(&link_config, 0, sizeof(link_config)); 890 + 891 + if (adv7511->type == ADV7511) 892 + ret = adv7511_parse_dt(dev->of_node, &link_config); 893 + else 894 + ret = adv7533_parse_dt(dev->of_node, adv7511); 948 895 if (ret) 949 896 return ret; 950 897 ··· 980 907 return ret; 981 908 dev_dbg(dev, "Rev. %d\n", val); 982 909 983 - ret = regmap_register_patch(adv7511->regmap, adv7511_fixed_registers, 984 - ARRAY_SIZE(adv7511_fixed_registers)); 910 + if (adv7511->type == ADV7511) 911 + ret = regmap_register_patch(adv7511->regmap, 912 + adv7511_fixed_registers, 913 + ARRAY_SIZE(adv7511_fixed_registers)); 914 + else 915 + ret = adv7533_patch_registers(adv7511); 985 916 if (ret) 986 917 return ret; 987 918 ··· 1000 923 if (!adv7511->i2c_edid) 1001 924 return -ENOMEM; 1002 925 926 + if (adv7511->type == ADV7533) { 927 + ret = adv7533_init_cec(adv7511); 928 + if (ret) 929 + goto err_i2c_unregister_edid; 930 + } 931 + 1003 932 if (i2c->irq) { 1004 933 init_waitqueue_head(&adv7511->wq); 1005 934 ··· 1014 931 IRQF_ONESHOT, dev_name(dev), 1015 932 adv7511); 1016 933 if (ret) 1017 - goto err_i2c_unregister_device; 934 + goto err_unregister_cec; 1018 935 } 1019 936 1020 937 /* CEC is unused for now */ ··· 1025 942 1026 943 i2c_set_clientdata(i2c, adv7511); 1027 944 1028 - adv7511_set_link_config(adv7511, &link_config); 945 + if (adv7511->type == ADV7511) 946 + adv7511_set_link_config(adv7511, &link_config); 947 + 948 + adv7511->bridge.funcs = &adv7511_bridge_funcs; 949 + adv7511->bridge.of_node = dev->of_node; 950 + 951 + ret = drm_bridge_add(&adv7511->bridge); 952 + if (ret) { 953 + dev_err(dev, "failed to add adv7511 bridge\n"); 954 + goto err_unregister_cec; 955 + } 1029 956 1030 957 return 0; 1031 958 1032 - err_i2c_unregister_device: 959 + err_unregister_cec: 960 + adv7533_uninit_cec(adv7511); 961 + err_i2c_unregister_edid: 1033 962 i2c_unregister_device(adv7511->i2c_edid); 1034 963 1035 964 return ret; ··· 1051 956 { 1052 957 struct adv7511 *adv7511 = i2c_get_clientdata(i2c); 1053 958 959 + if (adv7511->type == ADV7533) { 960 + adv7533_detach_dsi(adv7511); 961 + adv7533_uninit_cec(adv7511); 962 + } 963 + 964 + drm_bridge_remove(&adv7511->bridge); 965 + 1054 966 i2c_unregister_device(adv7511->i2c_edid); 1055 967 1056 968 kfree(adv7511->edid); ··· 1065 963 return 0; 1066 964 } 1067 965 1068 - static int adv7511_encoder_init(struct i2c_client *i2c, struct drm_device *dev, 1069 - struct drm_encoder_slave *encoder) 1070 - { 1071 - 1072 - struct adv7511 *adv7511 = i2c_get_clientdata(i2c); 1073 - 1074 - encoder->slave_priv = adv7511; 1075 - encoder->slave_funcs = &adv7511_encoder_funcs; 1076 - 1077 - adv7511->encoder = &encoder->base; 1078 - 1079 - return 0; 1080 - } 1081 - 1082 966 static const struct i2c_device_id adv7511_i2c_ids[] = { 1083 - { "adv7511", 0 }, 1084 - { "adv7511w", 0 }, 1085 - { "adv7513", 0 }, 967 + { "adv7511", ADV7511 }, 968 + { "adv7511w", ADV7511 }, 969 + { "adv7513", ADV7511 }, 970 + #ifdef CONFIG_DRM_I2C_ADV7533 971 + { "adv7533", ADV7533 }, 972 + #endif 1086 973 { } 1087 974 }; 1088 975 MODULE_DEVICE_TABLE(i2c, adv7511_i2c_ids); 1089 976 1090 977 static const struct of_device_id adv7511_of_ids[] = { 1091 - { .compatible = "adi,adv7511", }, 1092 - { .compatible = "adi,adv7511w", }, 1093 - { .compatible = "adi,adv7513", }, 978 + { .compatible = "adi,adv7511", .data = (void *)ADV7511 }, 979 + { .compatible = "adi,adv7511w", .data = (void *)ADV7511 }, 980 + { .compatible = "adi,adv7513", .data = (void *)ADV7511 }, 981 + #ifdef CONFIG_DRM_I2C_ADV7533 982 + { .compatible = "adi,adv7533", .data = (void *)ADV7533 }, 983 + #endif 1094 984 { } 1095 985 }; 1096 986 MODULE_DEVICE_TABLE(of, adv7511_of_ids); 1097 987 1098 - static struct drm_i2c_encoder_driver adv7511_driver = { 1099 - .i2c_driver = { 1100 - .driver = { 1101 - .name = "adv7511", 1102 - .of_match_table = adv7511_of_ids, 1103 - }, 1104 - .id_table = adv7511_i2c_ids, 1105 - .probe = adv7511_probe, 1106 - .remove = adv7511_remove, 1107 - }, 988 + static struct mipi_dsi_driver adv7533_dsi_driver = { 989 + .driver.name = "adv7533", 990 + }; 1108 991 1109 - .encoder_init = adv7511_encoder_init, 992 + static struct i2c_driver adv7511_driver = { 993 + .driver = { 994 + .name = "adv7511", 995 + .of_match_table = adv7511_of_ids, 996 + }, 997 + .id_table = adv7511_i2c_ids, 998 + .probe = adv7511_probe, 999 + .remove = adv7511_remove, 1110 1000 }; 1111 1001 1112 1002 static int __init adv7511_init(void) 1113 1003 { 1114 - return drm_i2c_encoder_register(THIS_MODULE, &adv7511_driver); 1004 + if (IS_ENABLED(CONFIG_DRM_MIPI_DSI)) 1005 + mipi_dsi_driver_register(&adv7533_dsi_driver); 1006 + 1007 + return i2c_add_driver(&adv7511_driver); 1115 1008 } 1116 1009 module_init(adv7511_init); 1117 1010 1118 1011 static void __exit adv7511_exit(void) 1119 1012 { 1120 - drm_i2c_encoder_unregister(&adv7511_driver); 1013 + i2c_del_driver(&adv7511_driver); 1014 + 1015 + if (IS_ENABLED(CONFIG_DRM_MIPI_DSI)) 1016 + mipi_dsi_driver_unregister(&adv7533_dsi_driver); 1121 1017 } 1122 1018 module_exit(adv7511_exit); 1123 1019
+103
drivers/gpu/drm/i2c/adv7511.h drivers/gpu/drm/bridge/adv7511/adv7511.h
··· 10 10 #define __DRM_I2C_ADV7511_H__ 11 11 12 12 #include <linux/hdmi.h> 13 + #include <linux/i2c.h> 14 + #include <linux/regmap.h> 15 + 16 + #include <drm/drm_crtc_helper.h> 17 + #include <drm/drm_mipi_dsi.h> 13 18 14 19 #define ADV7511_REG_CHIP_REVISION 0x00 15 20 #define ADV7511_REG_N0 0x01 ··· 290 285 bool hdmi_mode; 291 286 struct hdmi_avi_infoframe avi_infoframe; 292 287 }; 288 + 289 + enum adv7511_type { 290 + ADV7511, 291 + ADV7533, 292 + }; 293 + 294 + struct adv7511 { 295 + struct i2c_client *i2c_main; 296 + struct i2c_client *i2c_edid; 297 + struct i2c_client *i2c_cec; 298 + 299 + struct regmap *regmap; 300 + struct regmap *regmap_cec; 301 + enum drm_connector_status status; 302 + bool powered; 303 + 304 + struct drm_display_mode curr_mode; 305 + 306 + unsigned int f_tmds; 307 + 308 + unsigned int current_edid_segment; 309 + uint8_t edid_buf[256]; 310 + bool edid_read; 311 + 312 + wait_queue_head_t wq; 313 + struct drm_bridge bridge; 314 + struct drm_connector connector; 315 + 316 + bool embedded_sync; 317 + enum adv7511_sync_polarity vsync_polarity; 318 + enum adv7511_sync_polarity hsync_polarity; 319 + bool rgb; 320 + 321 + struct edid *edid; 322 + 323 + struct gpio_desc *gpio_pd; 324 + 325 + /* ADV7533 DSI RX related params */ 326 + struct device_node *host_node; 327 + struct mipi_dsi_device *dsi; 328 + u8 num_dsi_lanes; 329 + bool use_timing_gen; 330 + 331 + enum adv7511_type type; 332 + }; 333 + 334 + #ifdef CONFIG_DRM_I2C_ADV7533 335 + void adv7533_dsi_power_on(struct adv7511 *adv); 336 + void adv7533_dsi_power_off(struct adv7511 *adv); 337 + void adv7533_mode_set(struct adv7511 *adv, struct drm_display_mode *mode); 338 + int adv7533_patch_registers(struct adv7511 *adv); 339 + void adv7533_uninit_cec(struct adv7511 *adv); 340 + int adv7533_init_cec(struct adv7511 *adv); 341 + int adv7533_attach_dsi(struct adv7511 *adv); 342 + void adv7533_detach_dsi(struct adv7511 *adv); 343 + int adv7533_parse_dt(struct device_node *np, struct adv7511 *adv); 344 + #else 345 + static inline void adv7533_dsi_power_on(struct adv7511 *adv) 346 + { 347 + } 348 + 349 + static inline void adv7533_dsi_power_off(struct adv7511 *adv) 350 + { 351 + } 352 + 353 + static inline void adv7533_mode_set(struct adv7511 *adv, 354 + struct drm_display_mode *mode) 355 + { 356 + } 357 + 358 + static inline int adv7533_patch_registers(struct adv7511 *adv) 359 + { 360 + return -ENODEV; 361 + } 362 + 363 + static inline void adv7533_uninit_cec(struct adv7511 *adv) 364 + { 365 + } 366 + 367 + static inline int adv7533_init_cec(struct adv7511 *adv) 368 + { 369 + return -ENODEV; 370 + } 371 + 372 + static inline int adv7533_attach_dsi(struct adv7511 *adv) 373 + { 374 + return -ENODEV; 375 + } 376 + 377 + static inline void adv7533_detach_dsi(struct adv7511 *adv) 378 + { 379 + } 380 + 381 + static inline int adv7533_parse_dt(struct device_node *np, struct adv7511 *adv) 382 + { 383 + return -ENODEV; 384 + } 385 + #endif 293 386 294 387 #endif /* __DRM_I2C_ADV7511_H__ */
+2 -2
drivers/gpu/drm/rcar-du/Makefile
··· 7 7 rcar_du_plane.o \ 8 8 rcar_du_vgacon.o 9 9 10 - rcar-du-drm-$(CONFIG_DRM_RCAR_HDMI) += rcar_du_hdmicon.o \ 11 - rcar_du_hdmienc.o 10 + rcar-du-drm-$(CONFIG_DRM_RCAR_HDMI) += rcar_du_hdmienc.o 11 + 12 12 rcar-du-drm-$(CONFIG_DRM_RCAR_LVDS) += rcar_du_lvdsenc.o 13 13 14 14 rcar-du-drm-$(CONFIG_DRM_RCAR_VSP) += rcar_du_vsp.o
+1 -2
drivers/gpu/drm/rcar-du/rcar_du_encoder.c
··· 19 19 20 20 #include "rcar_du_drv.h" 21 21 #include "rcar_du_encoder.h" 22 - #include "rcar_du_hdmicon.h" 23 22 #include "rcar_du_hdmienc.h" 24 23 #include "rcar_du_kms.h" 25 24 #include "rcar_du_lvdscon.h" ··· 173 174 break; 174 175 175 176 case DRM_MODE_ENCODER_TMDS: 176 - ret = rcar_du_hdmi_connector_init(rcdu, renc); 177 + /* connector managed by the bridge driver */ 177 178 break; 178 179 179 180 default:
+3 -4
drivers/gpu/drm/rcar-du/rcar_du_encoder.h
··· 15 15 #define __RCAR_DU_ENCODER_H__ 16 16 17 17 #include <drm/drm_crtc.h> 18 - #include <drm/drm_encoder_slave.h> 19 18 20 19 struct rcar_du_device; 21 20 struct rcar_du_hdmienc; ··· 29 30 }; 30 31 31 32 struct rcar_du_encoder { 32 - struct drm_encoder_slave slave; 33 + struct drm_encoder base; 33 34 enum rcar_du_output output; 34 35 struct rcar_du_hdmienc *hdmi; 35 36 struct rcar_du_lvdsenc *lvds; 36 37 }; 37 38 38 39 #define to_rcar_encoder(e) \ 39 - container_of(e, struct rcar_du_encoder, slave.base) 40 + container_of(e, struct rcar_du_encoder, base) 40 41 41 - #define rcar_encoder_to_drm_encoder(e) (&(e)->slave.base) 42 + #define rcar_encoder_to_drm_encoder(e) (&(e)->base) 42 43 43 44 struct rcar_du_connector { 44 45 struct drm_connector connector;
-116
drivers/gpu/drm/rcar-du/rcar_du_hdmicon.c
··· 1 - /* 2 - * R-Car Display Unit HDMI Connector 3 - * 4 - * Copyright (C) 2014 Renesas Electronics Corporation 5 - * 6 - * Contact: Laurent Pinchart (laurent.pinchart@ideasonboard.com) 7 - * 8 - * This program is free software; you can redistribute it and/or modify 9 - * it under the terms of the GNU General Public License as published by 10 - * the Free Software Foundation; either version 2 of the License, or 11 - * (at your option) any later version. 12 - */ 13 - 14 - #include <drm/drmP.h> 15 - #include <drm/drm_atomic_helper.h> 16 - #include <drm/drm_crtc.h> 17 - #include <drm/drm_crtc_helper.h> 18 - #include <drm/drm_encoder_slave.h> 19 - 20 - #include "rcar_du_drv.h" 21 - #include "rcar_du_encoder.h" 22 - #include "rcar_du_hdmicon.h" 23 - #include "rcar_du_kms.h" 24 - 25 - #define to_slave_funcs(e) (to_rcar_encoder(e)->slave.slave_funcs) 26 - 27 - static int rcar_du_hdmi_connector_get_modes(struct drm_connector *connector) 28 - { 29 - struct rcar_du_connector *con = to_rcar_connector(connector); 30 - struct drm_encoder *encoder = rcar_encoder_to_drm_encoder(con->encoder); 31 - const struct drm_encoder_slave_funcs *sfuncs = to_slave_funcs(encoder); 32 - 33 - if (sfuncs->get_modes == NULL) 34 - return 0; 35 - 36 - return sfuncs->get_modes(encoder, connector); 37 - } 38 - 39 - static int rcar_du_hdmi_connector_mode_valid(struct drm_connector *connector, 40 - struct drm_display_mode *mode) 41 - { 42 - struct rcar_du_connector *con = to_rcar_connector(connector); 43 - struct drm_encoder *encoder = rcar_encoder_to_drm_encoder(con->encoder); 44 - const struct drm_encoder_slave_funcs *sfuncs = to_slave_funcs(encoder); 45 - 46 - if (sfuncs->mode_valid == NULL) 47 - return MODE_OK; 48 - 49 - return sfuncs->mode_valid(encoder, mode); 50 - } 51 - 52 - static const struct drm_connector_helper_funcs connector_helper_funcs = { 53 - .get_modes = rcar_du_hdmi_connector_get_modes, 54 - .mode_valid = rcar_du_hdmi_connector_mode_valid, 55 - }; 56 - 57 - static enum drm_connector_status 58 - rcar_du_hdmi_connector_detect(struct drm_connector *connector, bool force) 59 - { 60 - struct rcar_du_connector *con = to_rcar_connector(connector); 61 - struct drm_encoder *encoder = rcar_encoder_to_drm_encoder(con->encoder); 62 - const struct drm_encoder_slave_funcs *sfuncs = to_slave_funcs(encoder); 63 - 64 - if (sfuncs->detect == NULL) 65 - return connector_status_unknown; 66 - 67 - return sfuncs->detect(encoder, connector); 68 - } 69 - 70 - static const struct drm_connector_funcs connector_funcs = { 71 - .dpms = drm_atomic_helper_connector_dpms, 72 - .reset = drm_atomic_helper_connector_reset, 73 - .detect = rcar_du_hdmi_connector_detect, 74 - .fill_modes = drm_helper_probe_single_connector_modes, 75 - .destroy = drm_connector_cleanup, 76 - .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state, 77 - .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, 78 - }; 79 - 80 - int rcar_du_hdmi_connector_init(struct rcar_du_device *rcdu, 81 - struct rcar_du_encoder *renc) 82 - { 83 - struct drm_encoder *encoder = rcar_encoder_to_drm_encoder(renc); 84 - struct rcar_du_connector *rcon; 85 - struct drm_connector *connector; 86 - int ret; 87 - 88 - rcon = devm_kzalloc(rcdu->dev, sizeof(*rcon), GFP_KERNEL); 89 - if (rcon == NULL) 90 - return -ENOMEM; 91 - 92 - connector = &rcon->connector; 93 - connector->display_info.width_mm = 0; 94 - connector->display_info.height_mm = 0; 95 - connector->interlace_allowed = true; 96 - connector->polled = DRM_CONNECTOR_POLL_HPD; 97 - 98 - ret = drm_connector_init(rcdu->ddev, connector, &connector_funcs, 99 - DRM_MODE_CONNECTOR_HDMIA); 100 - if (ret < 0) 101 - return ret; 102 - 103 - drm_connector_helper_add(connector, &connector_helper_funcs); 104 - 105 - connector->dpms = DRM_MODE_DPMS_OFF; 106 - drm_object_property_set_value(&connector->base, 107 - rcdu->ddev->mode_config.dpms_property, DRM_MODE_DPMS_OFF); 108 - 109 - ret = drm_mode_connector_attach_encoder(connector, encoder); 110 - if (ret < 0) 111 - return ret; 112 - 113 - rcon->encoder = renc; 114 - 115 - return 0; 116 - }
-31
drivers/gpu/drm/rcar-du/rcar_du_hdmicon.h
··· 1 - /* 2 - * R-Car Display Unit HDMI Connector 3 - * 4 - * Copyright (C) 2014 Renesas Electronics Corporation 5 - * 6 - * Contact: Laurent Pinchart (laurent.pinchart@ideasonboard.com) 7 - * 8 - * This program is free software; you can redistribute it and/or modify 9 - * it under the terms of the GNU General Public License as published by 10 - * the Free Software Foundation; either version 2 of the License, or 11 - * (at your option) any later version. 12 - */ 13 - 14 - #ifndef __RCAR_DU_HDMICON_H__ 15 - #define __RCAR_DU_HDMICON_H__ 16 - 17 - struct rcar_du_device; 18 - struct rcar_du_encoder; 19 - 20 - #if IS_ENABLED(CONFIG_DRM_RCAR_HDMI) 21 - int rcar_du_hdmi_connector_init(struct rcar_du_device *rcdu, 22 - struct rcar_du_encoder *renc); 23 - #else 24 - static inline int rcar_du_hdmi_connector_init(struct rcar_du_device *rcdu, 25 - struct rcar_du_encoder *renc) 26 - { 27 - return -ENOSYS; 28 - } 29 - #endif 30 - 31 - #endif /* __RCAR_DU_HDMICON_H__ */
+16 -52
drivers/gpu/drm/rcar-du/rcar_du_hdmienc.c
··· 16 16 #include <drm/drmP.h> 17 17 #include <drm/drm_crtc.h> 18 18 #include <drm/drm_crtc_helper.h> 19 - #include <drm/drm_encoder_slave.h> 20 19 21 20 #include "rcar_du_drv.h" 22 21 #include "rcar_du_encoder.h" ··· 24 25 25 26 struct rcar_du_hdmienc { 26 27 struct rcar_du_encoder *renc; 27 - struct device *dev; 28 28 bool enabled; 29 29 }; 30 30 31 31 #define to_rcar_hdmienc(e) (to_rcar_encoder(e)->hdmi) 32 - #define to_slave_funcs(e) (to_rcar_encoder(e)->slave.slave_funcs) 33 32 34 33 static void rcar_du_hdmienc_disable(struct drm_encoder *encoder) 35 34 { 36 35 struct rcar_du_hdmienc *hdmienc = to_rcar_hdmienc(encoder); 37 - const struct drm_encoder_slave_funcs *sfuncs = to_slave_funcs(encoder); 38 - 39 - if (sfuncs->dpms) 40 - sfuncs->dpms(encoder, DRM_MODE_DPMS_OFF); 41 36 42 37 if (hdmienc->renc->lvds) 43 38 rcar_du_lvdsenc_enable(hdmienc->renc->lvds, encoder->crtc, ··· 43 50 static void rcar_du_hdmienc_enable(struct drm_encoder *encoder) 44 51 { 45 52 struct rcar_du_hdmienc *hdmienc = to_rcar_hdmienc(encoder); 46 - const struct drm_encoder_slave_funcs *sfuncs = to_slave_funcs(encoder); 47 53 48 54 if (hdmienc->renc->lvds) 49 55 rcar_du_lvdsenc_enable(hdmienc->renc->lvds, encoder->crtc, 50 56 true); 51 - 52 - if (sfuncs->dpms) 53 - sfuncs->dpms(encoder, DRM_MODE_DPMS_ON); 54 57 55 58 hdmienc->enabled = true; 56 59 } ··· 56 67 struct drm_connector_state *conn_state) 57 68 { 58 69 struct rcar_du_hdmienc *hdmienc = to_rcar_hdmienc(encoder); 59 - const struct drm_encoder_slave_funcs *sfuncs = to_slave_funcs(encoder); 60 70 struct drm_display_mode *adjusted_mode = &crtc_state->adjusted_mode; 61 - const struct drm_display_mode *mode = &crtc_state->mode; 62 71 63 72 if (hdmienc->renc->lvds) 64 73 rcar_du_lvdsenc_atomic_check(hdmienc->renc->lvds, 65 74 adjusted_mode); 66 75 67 - if (sfuncs->mode_fixup == NULL) 68 - return 0; 69 - 70 - return sfuncs->mode_fixup(encoder, mode, adjusted_mode) ? 0 : -EINVAL; 76 + return 0; 71 77 } 78 + 72 79 73 80 static void rcar_du_hdmienc_mode_set(struct drm_encoder *encoder, 74 81 struct drm_display_mode *mode, 75 82 struct drm_display_mode *adjusted_mode) 76 83 { 77 84 struct rcar_du_hdmienc *hdmienc = to_rcar_hdmienc(encoder); 78 - const struct drm_encoder_slave_funcs *sfuncs = to_slave_funcs(encoder); 79 - 80 - if (sfuncs->mode_set) 81 - sfuncs->mode_set(encoder, mode, adjusted_mode); 82 85 83 86 rcar_du_crtc_route_output(encoder->crtc, hdmienc->renc->output); 84 87 } ··· 90 109 rcar_du_hdmienc_disable(encoder); 91 110 92 111 drm_encoder_cleanup(encoder); 93 - put_device(hdmienc->dev); 94 112 } 95 113 96 114 static const struct drm_encoder_funcs encoder_funcs = { ··· 100 120 struct rcar_du_encoder *renc, struct device_node *np) 101 121 { 102 122 struct drm_encoder *encoder = rcar_encoder_to_drm_encoder(renc); 103 - struct drm_i2c_encoder_driver *driver; 104 - struct i2c_client *i2c_slave; 123 + struct drm_bridge *bridge; 105 124 struct rcar_du_hdmienc *hdmienc; 106 125 int ret; 107 126 ··· 108 129 if (hdmienc == NULL) 109 130 return -ENOMEM; 110 131 111 - /* Locate the slave I2C device and driver. */ 112 - i2c_slave = of_find_i2c_device_by_node(np); 113 - if (!i2c_slave || !i2c_get_clientdata(i2c_slave)) { 114 - dev_dbg(rcdu->dev, 115 - "can't get I2C slave for %s, deferring probe\n", 116 - of_node_full_name(np)); 132 + /* Locate drm bridge from the hdmi encoder DT node */ 133 + bridge = of_drm_find_bridge(np); 134 + if (!bridge) 117 135 return -EPROBE_DEFER; 118 - } 119 - 120 - hdmienc->dev = &i2c_slave->dev; 121 - 122 - if (hdmienc->dev->driver == NULL) { 123 - dev_dbg(rcdu->dev, 124 - "I2C slave %s not probed yet, deferring probe\n", 125 - dev_name(hdmienc->dev)); 126 - ret = -EPROBE_DEFER; 127 - goto error; 128 - } 129 - 130 - /* Initialize the slave encoder. */ 131 - driver = to_drm_i2c_encoder_driver(to_i2c_driver(hdmienc->dev->driver)); 132 - ret = driver->encoder_init(i2c_slave, rcdu->ddev, &renc->slave); 133 - if (ret < 0) 134 - goto error; 135 136 136 137 ret = drm_encoder_init(rcdu->ddev, encoder, &encoder_funcs, 137 138 DRM_MODE_ENCODER_TMDS, NULL); 138 139 if (ret < 0) 139 - goto error; 140 + return ret; 140 141 141 142 drm_encoder_helper_add(encoder, &encoder_helper_funcs); 142 143 143 144 renc->hdmi = hdmienc; 144 145 hdmienc->renc = renc; 145 146 146 - return 0; 147 + /* Link drm_bridge to encoder */ 148 + bridge->encoder = encoder; 147 149 148 - error: 149 - put_device(hdmienc->dev); 150 - return ret; 150 + ret = drm_bridge_attach(rcdu->ddev, bridge); 151 + if (ret) { 152 + drm_encoder_cleanup(encoder); 153 + return ret; 154 + } 155 + 156 + return 0; 151 157 }