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

Merge branch 'upstream/analogix-dp-20160705' of git://github.com/yakir-Yang/linux into drm-next

Please consider merging this tag, which contains the v4 misc fixes and add RK3399 eDP support patches[0] I sent on 2016-06-29, rebased onto v4.7-rc5.

* 'upstream/analogix-dp-20160705' of git://github.com/yakir-Yang/linux:
dt-bindings: analogix_dp: rockchip: correct the wrong compatible name
drm/rockchip: analogix_dp: introduce the pclk for grf
drm/bridge: analogix_dp: fix no drm hpd event when panel plug in
drm/rockchip: analogix_dp: update the comments about why need to hardcode VOP output mode
drm/rockchip: analogix_dp: correct the connector display color format and bpc
drm/bridge: analogix_dp: passing the connector as an argument in .get_modes()
drm/rockchip: analogix_dp: make panel detect to an optional action
drm/rockchip: analogix_dp: add rk3399 eDP support
drm/bridge: analogix_dp: some rockchip chips need to flip REF_CLK bit setting
drm/bridge: analogix_dp: correct the register bit define error in ANALOGIX_DP_PLL_REG_1
drm/rockchip: analogix_dp: split the lcdc select setting into device data

+159 -62
+1
Documentation/devicetree/bindings/display/bridge/analogix_dp.txt
··· 5 5 platform specific such as: 6 6 * "samsung,exynos5-dp" 7 7 * "rockchip,rk3288-dp" 8 + * "rockchip,rk3399-edp" 8 9 -reg: 9 10 physical base address of the controller and length 10 11 of memory mapped region.
+8 -1
Documentation/devicetree/bindings/display/rockchip/analogix_dp-rockchip.txt
··· 2 2 ================================ 3 3 4 4 Required properties: 5 - - compatible: "rockchip,rk3288-edp"; 5 + - compatible: "rockchip,rk3288-dp", 6 + "rockchip,rk3399-edp"; 6 7 7 8 - reg: physical base address of the controller and length 8 9 ··· 27 26 Documentation/devicetree/bindings/media/video-interfaces.txt. 28 27 Port 0: contained 2 endpoints, connecting to the output of vop. 29 28 Port 1: contained 1 endpoint, connecting to the input of panel. 29 + 30 + Optional property for different chips: 31 + - clocks: from common clock binding: handle to grf_vio clock. 32 + 33 + - clock-names: from common clock binding: 34 + Required elements: "grf" 30 35 31 36 For the below properties, please refer to Analogix DP binding document: 32 37 * Documentation/devicetree/bindings/drm/bridge/analogix_dp.txt
+2 -1
drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
··· 938 938 num_modes += drm_panel_get_modes(dp->plat_data->panel); 939 939 940 940 if (dp->plat_data->get_modes) 941 - num_modes += dp->plat_data->get_modes(dp->plat_data); 941 + num_modes += dp->plat_data->get_modes(dp->plat_data, connector); 942 942 943 943 return num_modes; 944 944 } ··· 1208 1208 1209 1209 switch (dp->plat_data->dev_type) { 1210 1210 case RK3288_DP: 1211 + case RK3399_EDP: 1211 1212 /* 1212 1213 * Like Rk3288 DisplayPort TRM indicate that "Main link 1213 1214 * containing 4 physical lanes of 2.7/1.62 Gbps/lane".
+4 -4
drivers/gpu/drm/bridge/analogix/analogix_dp_core.h
··· 127 127 }; 128 128 129 129 enum dp_irq_type { 130 - DP_IRQ_TYPE_HP_CABLE_IN, 131 - DP_IRQ_TYPE_HP_CABLE_OUT, 132 - DP_IRQ_TYPE_HP_CHANGE, 133 - DP_IRQ_TYPE_UNKNOWN, 130 + DP_IRQ_TYPE_HP_CABLE_IN = BIT(0), 131 + DP_IRQ_TYPE_HP_CABLE_OUT = BIT(1), 132 + DP_IRQ_TYPE_HP_CHANGE = BIT(2), 133 + DP_IRQ_TYPE_UNKNOWN = BIT(3), 134 134 }; 135 135 136 136 struct video_info {
+8 -4
drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c
··· 74 74 reg = SEL_24M | TX_DVDD_BIT_1_0625V; 75 75 writel(reg, dp->reg_base + ANALOGIX_DP_ANALOG_CTL_2); 76 76 77 - if (dp->plat_data && (dp->plat_data->dev_type == RK3288_DP)) { 78 - writel(REF_CLK_24M, dp->reg_base + ANALOGIX_DP_PLL_REG_1); 77 + if (dp->plat_data && is_rockchip(dp->plat_data->dev_type)) { 78 + reg = REF_CLK_24M; 79 + if (dp->plat_data->dev_type == RK3288_DP) 80 + reg ^= REF_CLK_MASK; 81 + 82 + writel(reg, dp->reg_base + ANALOGIX_DP_PLL_REG_1); 79 83 writel(0x95, dp->reg_base + ANALOGIX_DP_PLL_REG_2); 80 84 writel(0x40, dp->reg_base + ANALOGIX_DP_PLL_REG_3); 81 85 writel(0x58, dp->reg_base + ANALOGIX_DP_PLL_REG_4); ··· 248 244 u32 reg; 249 245 u32 phy_pd_addr = ANALOGIX_DP_PHY_PD; 250 246 251 - if (dp->plat_data && (dp->plat_data->dev_type == RK3288_DP)) 247 + if (dp->plat_data && is_rockchip(dp->plat_data->dev_type)) 252 248 phy_pd_addr = ANALOGIX_DP_PD; 253 249 254 250 switch (block) { ··· 452 448 analogix_dp_reset_aux(dp); 453 449 454 450 /* Disable AUX transaction H/W retry */ 455 - if (dp->plat_data && (dp->plat_data->dev_type == RK3288_DP)) 451 + if (dp->plat_data && is_rockchip(dp->plat_data->dev_type)) 456 452 reg = AUX_BIT_PERIOD_EXPECTED_DELAY(0) | 457 453 AUX_HW_RETRY_COUNT_SEL(3) | 458 454 AUX_HW_RETRY_INTERVAL_600_MICROSECONDS;
+3 -2
drivers/gpu/drm/bridge/analogix/analogix_dp_reg.h
··· 163 163 #define HSYNC_POLARITY_CFG (0x1 << 0) 164 164 165 165 /* ANALOGIX_DP_PLL_REG_1 */ 166 - #define REF_CLK_24M (0x1 << 1) 167 - #define REF_CLK_27M (0x0 << 1) 166 + #define REF_CLK_24M (0x1 << 0) 167 + #define REF_CLK_27M (0x0 << 0) 168 + #define REF_CLK_MASK (0x1 << 0) 168 169 169 170 /* ANALOGIX_DP_LANE_MAP */ 170 171 #define LANE3_MAP_LOGIC_LANE_0 (0x0 << 6)
+2 -2
drivers/gpu/drm/exynos/exynos_dp.c
··· 67 67 return exynos_dp_crtc_clock_enable(plat_data, false); 68 68 } 69 69 70 - static int exynos_dp_get_modes(struct analogix_dp_plat_data *plat_data) 70 + static int exynos_dp_get_modes(struct analogix_dp_plat_data *plat_data, 71 + struct drm_connector *connector) 71 72 { 72 73 struct exynos_dp_device *dp = to_dp(plat_data); 73 - struct drm_connector *connector = dp->connector; 74 74 struct drm_display_mode *mode; 75 75 int num_modes = 0; 76 76
+123 -47
drivers/gpu/drm/rockchip/analogix_dp-rockchip.c
··· 14 14 15 15 #include <linux/component.h> 16 16 #include <linux/mfd/syscon.h> 17 + #include <linux/of_device.h> 17 18 #include <linux/of_graph.h> 18 19 #include <linux/regmap.h> 19 20 #include <linux/reset.h> ··· 34 33 #include "rockchip_drm_drv.h" 35 34 #include "rockchip_drm_vop.h" 36 35 36 + #define RK3288_GRF_SOC_CON6 0x25c 37 + #define RK3288_EDP_LCDC_SEL BIT(5) 38 + #define RK3399_GRF_SOC_CON20 0x6250 39 + #define RK3399_EDP_LCDC_SEL BIT(5) 40 + 41 + #define HIWORD_UPDATE(val, mask) (val | (mask) << 16) 42 + 37 43 #define to_dp(nm) container_of(nm, struct rockchip_dp_device, nm) 38 44 39 - /* dp grf register offset */ 40 - #define GRF_SOC_CON6 0x025c 41 - #define GRF_EDP_LCD_SEL_MASK BIT(5) 42 - #define GRF_EDP_SEL_VOP_LIT BIT(5) 43 - #define GRF_EDP_SEL_VOP_BIG 0 45 + /** 46 + * struct rockchip_dp_chip_data - splite the grf setting of kind of chips 47 + * @lcdsel_grf_reg: grf register offset of lcdc select 48 + * @lcdsel_big: reg value of selecting vop big for eDP 49 + * @lcdsel_lit: reg value of selecting vop little for eDP 50 + * @chip_type: specific chip type 51 + */ 52 + struct rockchip_dp_chip_data { 53 + u32 lcdsel_grf_reg; 54 + u32 lcdsel_big; 55 + u32 lcdsel_lit; 56 + u32 chip_type; 57 + }; 44 58 45 59 struct rockchip_dp_device { 46 60 struct drm_device *drm_dev; ··· 64 48 struct drm_display_mode mode; 65 49 66 50 struct clk *pclk; 51 + struct clk *grfclk; 67 52 struct regmap *grf; 68 53 struct reset_control *rst; 54 + 55 + const struct rockchip_dp_chip_data *data; 69 56 70 57 struct analogix_dp_plat_data plat_data; 71 58 }; ··· 111 92 return 0; 112 93 } 113 94 95 + static int rockchip_dp_get_modes(struct analogix_dp_plat_data *plat_data, 96 + struct drm_connector *connector) 97 + { 98 + struct drm_display_info *di = &connector->display_info; 99 + /* VOP couldn't output YUV video format for eDP rightly */ 100 + u32 mask = DRM_COLOR_FORMAT_YCRCB444 | DRM_COLOR_FORMAT_YCRCB422; 101 + 102 + if ((di->color_formats & mask)) { 103 + DRM_DEBUG_KMS("Swapping display color format from YUV to RGB\n"); 104 + di->color_formats &= ~mask; 105 + di->color_formats |= DRM_COLOR_FORMAT_RGB444; 106 + di->bpc = 8; 107 + } 108 + 109 + return 0; 110 + } 111 + 114 112 static bool 115 113 rockchip_dp_drm_encoder_mode_fixup(struct drm_encoder *encoder, 116 114 const struct drm_display_mode *mode, ··· 155 119 return; 156 120 157 121 if (ret) 158 - val = GRF_EDP_SEL_VOP_LIT | (GRF_EDP_LCD_SEL_MASK << 16); 122 + val = dp->data->lcdsel_lit; 159 123 else 160 - val = GRF_EDP_SEL_VOP_BIG | (GRF_EDP_LCD_SEL_MASK << 16); 124 + val = dp->data->lcdsel_big; 161 125 162 126 dev_dbg(dp->dev, "vop %s output to dp\n", (ret) ? "LIT" : "BIG"); 163 127 164 - ret = regmap_write(dp->grf, GRF_SOC_CON6, val); 165 - if (ret != 0) { 166 - dev_err(dp->dev, "Could not write to GRF: %d\n", ret); 128 + ret = clk_prepare_enable(dp->grfclk); 129 + if (ret < 0) { 130 + dev_err(dp->dev, "failed to enable grfclk %d\n", ret); 167 131 return; 168 132 } 133 + 134 + ret = regmap_write(dp->grf, dp->data->lcdsel_grf_reg, val); 135 + if (ret != 0) 136 + dev_err(dp->dev, "Could not write to GRF: %d\n", ret); 137 + 138 + clk_disable_unprepare(dp->grfclk); 169 139 } 170 140 171 141 static void rockchip_dp_drm_encoder_nop(struct drm_encoder *encoder) ··· 185 143 struct drm_connector_state *conn_state) 186 144 { 187 145 struct rockchip_crtc_state *s = to_rockchip_crtc_state(crtc_state); 146 + struct rockchip_dp_device *dp = to_dp(encoder); 147 + int ret; 188 148 189 149 /* 190 - * FIXME(Yakir): driver should configure the CRTC output video 191 - * mode with the display information which indicated the monitor 192 - * support colorimetry. 193 - * 194 - * But don't know why the CRTC driver seems could only output the 195 - * RGBaaa rightly. For example, if connect the "innolux,n116bge" 196 - * eDP screen, EDID would indicated that screen only accepted the 197 - * 6bpc mode. But if I configure CRTC to RGB666 output, then eDP 198 - * screen would show a blue picture (RGB888 show a green picture). 199 - * But if I configure CTRC to RGBaaa, and eDP driver still keep 200 - * RGB666 input video mode, then screen would works prefect. 150 + * The hardware IC designed that VOP must output the RGB10 video 151 + * format to eDP controller, and if eDP panel only support RGB8, 152 + * then eDP controller should cut down the video data, not via VOP 153 + * controller, that's why we need to hardcode the VOP output mode 154 + * to RGA10 here. 201 155 */ 156 + 202 157 s->output_mode = ROCKCHIP_OUT_MODE_AAAA; 203 158 s->output_type = DRM_MODE_CONNECTOR_eDP; 159 + if (dp->data->chip_type == RK3399_EDP) { 160 + /* 161 + * For RK3399, VOP Lit must code the out mode to RGB888, 162 + * VOP Big must code the out mode to RGB10. 163 + */ 164 + ret = drm_of_encoder_active_endpoint_id(dp->dev->of_node, 165 + encoder); 166 + if (ret > 0) 167 + s->output_mode = ROCKCHIP_OUT_MODE_P888; 168 + } 204 169 205 170 return 0; 206 171 } ··· 239 190 if (IS_ERR(dp->grf)) { 240 191 dev_err(dev, "failed to get rockchip,grf property\n"); 241 192 return PTR_ERR(dp->grf); 193 + } 194 + 195 + dp->grfclk = devm_clk_get(dev, "grf"); 196 + if (PTR_ERR(dp->grfclk) == -ENOENT) { 197 + dp->grfclk = NULL; 198 + } else if (PTR_ERR(dp->grfclk) == -EPROBE_DEFER) { 199 + return -EPROBE_DEFER; 200 + } else if (IS_ERR(dp->grfclk)) { 201 + dev_err(dev, "failed to get grf clock\n"); 202 + return PTR_ERR(dp->grfclk); 242 203 } 243 204 244 205 dp->pclk = devm_clk_get(dev, "pclk"); ··· 305 246 void *data) 306 247 { 307 248 struct rockchip_dp_device *dp = dev_get_drvdata(dev); 249 + const struct rockchip_dp_chip_data *dp_data; 308 250 struct drm_device *drm_dev = data; 309 251 int ret; 310 252 ··· 316 256 */ 317 257 dev_set_drvdata(dev, NULL); 318 258 259 + dp_data = of_device_get_match_data(dev); 260 + if (!dp_data) 261 + return -ENODEV; 262 + 319 263 ret = rockchip_dp_init(dp); 320 264 if (ret < 0) 321 265 return ret; 322 266 267 + dp->data = dp_data; 323 268 dp->drm_dev = drm_dev; 324 269 325 270 ret = rockchip_dp_drm_create_encoder(dp); ··· 335 270 336 271 dp->plat_data.encoder = &dp->encoder; 337 272 338 - dp->plat_data.dev_type = RK3288_DP; 273 + dp->plat_data.dev_type = dp->data->chip_type; 339 274 dp->plat_data.power_on = rockchip_dp_poweron; 340 275 dp->plat_data.power_off = rockchip_dp_powerdown; 276 + dp->plat_data.get_modes = rockchip_dp_get_modes; 341 277 342 278 return analogix_dp_bind(dev, dp->drm_dev, &dp->plat_data); 343 279 } ··· 358 292 { 359 293 struct device *dev = &pdev->dev; 360 294 struct device_node *panel_node, *port, *endpoint; 295 + struct drm_panel *panel = NULL; 361 296 struct rockchip_dp_device *dp; 362 - struct drm_panel *panel; 363 297 364 298 port = of_graph_get_port_by_id(dev->of_node, 1); 365 - if (!port) { 366 - dev_err(dev, "can't find output port\n"); 367 - return -EINVAL; 368 - } 299 + if (port) { 300 + endpoint = of_get_child_by_name(port, "endpoint"); 301 + of_node_put(port); 302 + if (!endpoint) { 303 + dev_err(dev, "no output endpoint found\n"); 304 + return -EINVAL; 305 + } 369 306 370 - endpoint = of_get_child_by_name(port, "endpoint"); 371 - of_node_put(port); 372 - if (!endpoint) { 373 - dev_err(dev, "no output endpoint found\n"); 374 - return -EINVAL; 375 - } 307 + panel_node = of_graph_get_remote_port_parent(endpoint); 308 + of_node_put(endpoint); 309 + if (!panel_node) { 310 + dev_err(dev, "no output node found\n"); 311 + return -EINVAL; 312 + } 376 313 377 - panel_node = of_graph_get_remote_port_parent(endpoint); 378 - of_node_put(endpoint); 379 - if (!panel_node) { 380 - dev_err(dev, "no output node found\n"); 381 - return -EINVAL; 382 - } 383 - 384 - panel = of_drm_find_panel(panel_node); 385 - if (!panel) { 386 - DRM_ERROR("failed to find panel\n"); 314 + panel = of_drm_find_panel(panel_node); 387 315 of_node_put(panel_node); 388 - return -EPROBE_DEFER; 316 + if (!panel) { 317 + DRM_ERROR("failed to find panel\n"); 318 + return -EPROBE_DEFER; 319 + } 389 320 } 390 - 391 - of_node_put(panel_node); 392 321 393 322 dp = devm_kzalloc(dev, sizeof(*dp), GFP_KERNEL); 394 323 if (!dp) ··· 417 356 #endif 418 357 }; 419 358 359 + static const struct rockchip_dp_chip_data rk3399_edp = { 360 + .lcdsel_grf_reg = RK3399_GRF_SOC_CON20, 361 + .lcdsel_big = HIWORD_UPDATE(0, RK3399_EDP_LCDC_SEL), 362 + .lcdsel_lit = HIWORD_UPDATE(RK3399_EDP_LCDC_SEL, RK3399_EDP_LCDC_SEL), 363 + .chip_type = RK3399_EDP, 364 + }; 365 + 366 + static const struct rockchip_dp_chip_data rk3288_dp = { 367 + .lcdsel_grf_reg = RK3288_GRF_SOC_CON6, 368 + .lcdsel_big = HIWORD_UPDATE(0, RK3288_EDP_LCDC_SEL), 369 + .lcdsel_lit = HIWORD_UPDATE(RK3288_EDP_LCDC_SEL, RK3288_EDP_LCDC_SEL), 370 + .chip_type = RK3288_DP, 371 + }; 372 + 420 373 static const struct of_device_id rockchip_dp_dt_ids[] = { 421 - {.compatible = "rockchip,rk3288-dp",}, 374 + {.compatible = "rockchip,rk3288-dp", .data = &rk3288_dp }, 375 + {.compatible = "rockchip,rk3399-edp", .data = &rk3399_edp }, 422 376 {} 423 377 }; 424 378 MODULE_DEVICE_TABLE(of, rockchip_dp_dt_ids);
+8 -1
include/drm/bridge/analogix_dp.h
··· 16 16 enum analogix_dp_devtype { 17 17 EXYNOS_DP, 18 18 RK3288_DP, 19 + RK3399_EDP, 19 20 }; 21 + 22 + static inline bool is_rockchip(enum analogix_dp_devtype type) 23 + { 24 + return type == RK3288_DP || type == RK3399_EDP; 25 + } 20 26 21 27 struct analogix_dp_plat_data { 22 28 enum analogix_dp_devtype dev_type; ··· 34 28 int (*power_off)(struct analogix_dp_plat_data *); 35 29 int (*attach)(struct analogix_dp_plat_data *, struct drm_bridge *, 36 30 struct drm_connector *); 37 - int (*get_modes)(struct analogix_dp_plat_data *); 31 + int (*get_modes)(struct analogix_dp_plat_data *, 32 + struct drm_connector *); 38 33 }; 39 34 40 35 int analogix_dp_resume(struct device *dev);