1186f8572SMark Yao /* 2186f8572SMark Yao * (C) Copyright 2008-2017 Fuzhou Rockchip Electronics Co., Ltd 3186f8572SMark Yao * 4186f8572SMark Yao * SPDX-License-Identifier: GPL-2.0+ 5186f8572SMark Yao */ 6186f8572SMark Yao 7186f8572SMark Yao #ifndef _ROCKCHIP_CONNECTOR_H_ 8186f8572SMark Yao #define _ROCKCHIP_CONNECTOR_H_ 9186f8572SMark Yao 10690e9ed1SSandy Huang #ifdef CONFIG_SPL_BUILD 11690e9ed1SSandy Huang struct rockchip_connector { 12690e9ed1SSandy Huang struct rockchip_phy *phy; 13690e9ed1SSandy Huang int id; 14690e9ed1SSandy Huang int type; 15690e9ed1SSandy Huang bool hpd; 16690e9ed1SSandy Huang 17690e9ed1SSandy Huang const struct rockchip_connector_funcs *funcs; 18690e9ed1SSandy Huang void *data; 19690e9ed1SSandy Huang }; 20690e9ed1SSandy Huang #else 210594ce39SZhang Yubing #include "rockchip_bridge.h" 220594ce39SZhang Yubing #include "rockchip_panel.h" 23186f8572SMark Yao 240594ce39SZhang Yubing struct rockchip_connector { 250594ce39SZhang Yubing struct udevice *dev; 260594ce39SZhang Yubing struct rockchip_bridge *bridge; 270594ce39SZhang Yubing struct rockchip_panel *panel; 280594ce39SZhang Yubing struct rockchip_phy *phy; 290594ce39SZhang Yubing struct list_head head; 300594ce39SZhang Yubing int id; 310594ce39SZhang Yubing int type; 32690e9ed1SSandy Huang bool hpd; 33*1e77886eSDamon Ding bool split_mode; 34*1e77886eSDamon Ding bool dual_channel_mode; 350594ce39SZhang Yubing 360594ce39SZhang Yubing const struct rockchip_connector_funcs *funcs; 370594ce39SZhang Yubing void *data; 38186f8572SMark Yao }; 39690e9ed1SSandy Huang #endif 40186f8572SMark Yao 4113f658dcSDamon Ding /** 4213f658dcSDamon Ding * enum drm_bus_flags - bus_flags info for &drm_display_info 4313f658dcSDamon Ding * 4413f658dcSDamon Ding * This enum defines signal polarities and clock edge information for signals on 4513f658dcSDamon Ding * a bus as bitmask flags. 4613f658dcSDamon Ding * 4713f658dcSDamon Ding * The clock edge information is conveyed by two sets of symbols, 4813f658dcSDamon Ding * DRM_BUS_FLAGS_*_DRIVE_\* and DRM_BUS_FLAGS_*_SAMPLE_\*. When this enum is 4913f658dcSDamon Ding * used to describe a bus from the point of view of the transmitter, the 5013f658dcSDamon Ding * \*_DRIVE_\* flags should be used. When used from the point of view of the 5113f658dcSDamon Ding * receiver, the \*_SAMPLE_\* flags should be used. The \*_DRIVE_\* and 5213f658dcSDamon Ding * \*_SAMPLE_\* flags alias each other, with the \*_SAMPLE_POSEDGE and 5313f658dcSDamon Ding * \*_SAMPLE_NEGEDGE flags being equal to \*_DRIVE_NEGEDGE and \*_DRIVE_POSEDGE 5413f658dcSDamon Ding * respectively. This simplifies code as signals are usually sampled on the 5513f658dcSDamon Ding * opposite edge of the driving edge. Transmitters and receivers may however 5613f658dcSDamon Ding * need to take other signal timings into account to convert between driving 5713f658dcSDamon Ding * and sample edges. 5813f658dcSDamon Ding */ 5913f658dcSDamon Ding enum drm_bus_flags { 6013f658dcSDamon Ding /** 6113f658dcSDamon Ding * @DRM_BUS_FLAG_DE_LOW: 6213f658dcSDamon Ding * 6313f658dcSDamon Ding * The Data Enable signal is active low 6413f658dcSDamon Ding */ 6513f658dcSDamon Ding DRM_BUS_FLAG_DE_LOW = BIT(0), 6613f658dcSDamon Ding 6713f658dcSDamon Ding /** 6813f658dcSDamon Ding * @DRM_BUS_FLAG_DE_HIGH: 6913f658dcSDamon Ding * 7013f658dcSDamon Ding * The Data Enable signal is active high 7113f658dcSDamon Ding */ 7213f658dcSDamon Ding DRM_BUS_FLAG_DE_HIGH = BIT(1), 7313f658dcSDamon Ding 7413f658dcSDamon Ding /** 7513f658dcSDamon Ding * @DRM_BUS_FLAG_PIXDATA_DRIVE_POSEDGE: 7613f658dcSDamon Ding * 7713f658dcSDamon Ding * Data is driven on the rising edge of the pixel clock 7813f658dcSDamon Ding */ 7913f658dcSDamon Ding DRM_BUS_FLAG_PIXDATA_DRIVE_POSEDGE = BIT(2), 8013f658dcSDamon Ding 8113f658dcSDamon Ding /** 8213f658dcSDamon Ding * @DRM_BUS_FLAG_PIXDATA_DRIVE_NEGEDGE: 8313f658dcSDamon Ding * 8413f658dcSDamon Ding * Data is driven on the falling edge of the pixel clock 8513f658dcSDamon Ding */ 8613f658dcSDamon Ding DRM_BUS_FLAG_PIXDATA_DRIVE_NEGEDGE = BIT(3), 8713f658dcSDamon Ding 8813f658dcSDamon Ding /** 8913f658dcSDamon Ding * @DRM_BUS_FLAG_PIXDATA_SAMPLE_POSEDGE: 9013f658dcSDamon Ding * 9113f658dcSDamon Ding * Data is sampled on the rising edge of the pixel clock 9213f658dcSDamon Ding */ 9313f658dcSDamon Ding DRM_BUS_FLAG_PIXDATA_SAMPLE_POSEDGE = DRM_BUS_FLAG_PIXDATA_DRIVE_NEGEDGE, 9413f658dcSDamon Ding 9513f658dcSDamon Ding /** 9613f658dcSDamon Ding * @DRM_BUS_FLAG_PIXDATA_SAMPLE_NEGEDGE: 9713f658dcSDamon Ding * 9813f658dcSDamon Ding * Data is sampled on the falling edge of the pixel clock 9913f658dcSDamon Ding */ 10013f658dcSDamon Ding DRM_BUS_FLAG_PIXDATA_SAMPLE_NEGEDGE = DRM_BUS_FLAG_PIXDATA_DRIVE_POSEDGE, 10113f658dcSDamon Ding 10213f658dcSDamon Ding /** 10313f658dcSDamon Ding * @DRM_BUS_FLAG_DATA_MSB_TO_LSB: 10413f658dcSDamon Ding * 10513f658dcSDamon Ding * Data is transmitted MSB to LSB on the bus 10613f658dcSDamon Ding */ 10713f658dcSDamon Ding DRM_BUS_FLAG_DATA_MSB_TO_LSB = BIT(4), 10813f658dcSDamon Ding 10913f658dcSDamon Ding /** 11013f658dcSDamon Ding * @DRM_BUS_FLAG_DATA_LSB_TO_MSB: 11113f658dcSDamon Ding * 11213f658dcSDamon Ding * Data is transmitted LSB to MSB on the bus 11313f658dcSDamon Ding */ 11413f658dcSDamon Ding DRM_BUS_FLAG_DATA_LSB_TO_MSB = BIT(5), 11513f658dcSDamon Ding 11613f658dcSDamon Ding /** 11713f658dcSDamon Ding * @DRM_BUS_FLAG_SYNC_DRIVE_POSEDGE: 11813f658dcSDamon Ding * 11913f658dcSDamon Ding * Sync signals are driven on the rising edge of the pixel clock 12013f658dcSDamon Ding */ 12113f658dcSDamon Ding DRM_BUS_FLAG_SYNC_DRIVE_POSEDGE = BIT(6), 12213f658dcSDamon Ding 12313f658dcSDamon Ding /** 12413f658dcSDamon Ding * @DRM_BUS_FLAG_SYNC_DRIVE_NEGEDGE: 12513f658dcSDamon Ding * 12613f658dcSDamon Ding * Sync signals are driven on the falling edge of the pixel clock 12713f658dcSDamon Ding */ 12813f658dcSDamon Ding DRM_BUS_FLAG_SYNC_DRIVE_NEGEDGE = BIT(7), 12913f658dcSDamon Ding 13013f658dcSDamon Ding /** 13113f658dcSDamon Ding * @DRM_BUS_FLAG_SYNC_SAMPLE_POSEDGE: 13213f658dcSDamon Ding * 13313f658dcSDamon Ding * Sync signals are sampled on the rising edge of the pixel clock 13413f658dcSDamon Ding */ 13513f658dcSDamon Ding DRM_BUS_FLAG_SYNC_SAMPLE_POSEDGE = DRM_BUS_FLAG_SYNC_DRIVE_NEGEDGE, 13613f658dcSDamon Ding 13713f658dcSDamon Ding /** 13813f658dcSDamon Ding * @DRM_BUS_FLAG_SYNC_SAMPLE_NEGEDGE: 13913f658dcSDamon Ding * 14013f658dcSDamon Ding * Sync signals are sampled on the falling edge of the pixel clock 14113f658dcSDamon Ding */ 14213f658dcSDamon Ding DRM_BUS_FLAG_SYNC_SAMPLE_NEGEDGE = DRM_BUS_FLAG_SYNC_DRIVE_POSEDGE, 14313f658dcSDamon Ding 14413f658dcSDamon Ding /** 14513f658dcSDamon Ding * @DRM_BUS_FLAG_SHARP_SIGNALS: 14613f658dcSDamon Ding * 14713f658dcSDamon Ding * Set if the Sharp-specific signals (SPL, CLS, PS, REV) must be used 14813f658dcSDamon Ding */ 14913f658dcSDamon Ding DRM_BUS_FLAG_SHARP_SIGNALS = BIT(8), 15013f658dcSDamon Ding }; 15113f658dcSDamon Ding 152186f8572SMark Yao struct rockchip_connector_funcs { 153186f8572SMark Yao /* 15458c17f51SSandy Huang * pre init connector, prepare some parameter out_if, this will be 15558c17f51SSandy Huang * used by rockchip_display.c and vop 15658c17f51SSandy Huang */ 1570594ce39SZhang Yubing int (*pre_init)(struct rockchip_connector *connector, struct display_state *state); 15858c17f51SSandy Huang 15958c17f51SSandy Huang /* 160186f8572SMark Yao * init connector, prepare resource to ensure 161186f8572SMark Yao * detect and get_timing can works 162186f8572SMark Yao */ 1630594ce39SZhang Yubing int (*init)(struct rockchip_connector *connector, struct display_state *state); 164186f8572SMark Yao 1650594ce39SZhang Yubing void (*deinit)(struct rockchip_connector *connector, struct display_state *state); 166186f8572SMark Yao /* 167186f8572SMark Yao * Optional, if connector not support hotplug, 168186f8572SMark Yao * Returns: 169186f8572SMark Yao * 0 means disconnected, else means connected 170186f8572SMark Yao */ 1710594ce39SZhang Yubing int (*detect)(struct rockchip_connector *connector, struct display_state *state); 172186f8572SMark Yao /* 173186f8572SMark Yao * Optional, if implement it, need fill the timing data: 174186f8572SMark Yao * state->conn_state->mode 175186f8572SMark Yao * you can refer to the rockchip_display: display_get_timing(), 176186f8572SMark Yao * Returns: 177186f8572SMark Yao * 0 means success, else means failed 178186f8572SMark Yao */ 1790594ce39SZhang Yubing int (*get_timing)(struct rockchip_connector *connector, struct display_state *state); 180186f8572SMark Yao /* 181186f8572SMark Yao * Optional, if implement it, need fill the edid data: 182186f8572SMark Yao * state->conn_state->edid 183186f8572SMark Yao * Returns: 184186f8572SMark Yao * 0 means success, else means failed 185186f8572SMark Yao */ 1860594ce39SZhang Yubing int (*get_edid)(struct rockchip_connector *connector, struct display_state *state); 187186f8572SMark Yao /* 188186f8572SMark Yao * call before crtc enable. 189186f8572SMark Yao */ 1900594ce39SZhang Yubing int (*prepare)(struct rockchip_connector *connector, struct display_state *state); 191186f8572SMark Yao /* 192186f8572SMark Yao * call after crtc enable 193186f8572SMark Yao */ 1940594ce39SZhang Yubing int (*enable)(struct rockchip_connector *connector, struct display_state *state); 1950594ce39SZhang Yubing int (*disable)(struct rockchip_connector *connector, struct display_state *state); 1960594ce39SZhang Yubing void (*unprepare)(struct rockchip_connector *connector, struct display_state *state); 197820a5c17SDamon Ding 198820a5c17SDamon Ding int (*check)(struct rockchip_connector *connector, struct display_state *state); 19922007755SDamon Ding int (*mode_valid)(struct rockchip_connector *connector, struct display_state *state); 200186f8572SMark Yao }; 201186f8572SMark Yao 202186f8572SMark Yao const struct rockchip_connector * 203186f8572SMark Yao rockchip_get_connector(const void *blob, int connector_node); 2040594ce39SZhang Yubing int rockchip_connector_bind(struct rockchip_connector *connector, struct udevice *dev, int id, 2050594ce39SZhang Yubing const struct rockchip_connector_funcs *funcs, void *data, int type); 2060594ce39SZhang Yubing struct rockchip_connector *get_rockchip_connector_by_device(struct udevice *dev); 2070594ce39SZhang Yubing int rockchip_connector_pre_init(struct display_state *state); 2080594ce39SZhang Yubing int rockchip_connector_init(struct display_state *state); 2090594ce39SZhang Yubing int rockchip_connector_deinit(struct display_state *state); 2100594ce39SZhang Yubing bool rockchip_connector_detect(struct display_state *state); 2110594ce39SZhang Yubing int rockchip_connector_get_timing(struct display_state *state); 2120594ce39SZhang Yubing int rockchip_connector_get_edid(struct display_state *state); 2130594ce39SZhang Yubing int rockchip_connector_pre_enable(struct display_state *state); 2140594ce39SZhang Yubing int rockchip_connector_enable(struct display_state *state); 2150594ce39SZhang Yubing int rockchip_connector_disable(struct display_state *state); 2160594ce39SZhang Yubing int rockchip_connector_post_disable(struct display_state *state); 217186f8572SMark Yao 218186f8572SMark Yao #ifdef CONFIG_DRM_ROCKCHIP_ANALOGIX_DP 219186f8572SMark Yao struct rockchip_dp_chip_data; 220186f8572SMark Yao extern const struct rockchip_connector_funcs rockchip_analogix_dp_funcs; 221186f8572SMark Yao extern const struct rockchip_dp_chip_data rk3399_analogix_edp_drv_data; 222186f8572SMark Yao extern const struct rockchip_dp_chip_data rk3368_analogix_edp_drv_data; 223186f8572SMark Yao extern const struct rockchip_dp_chip_data rk3288_analogix_dp_drv_data; 224186f8572SMark Yao #endif 225186f8572SMark Yao #endif 226