xref: /rk3399_rockchip-uboot/drivers/video/drm/rockchip_connector.h (revision 1e77886eb476e6459a561e695374345ef09a0140)
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