xref: /rk3399_rockchip-uboot/include/drm/drm_mipi_dsi.h (revision edbf2db2657c2d32af85569cab702995505b2d66)
11953e619SWyon Bi /* SPDX-License-Identifier: GPL-2.0+ */
21953e619SWyon Bi /*
31953e619SWyon Bi  * MIPI DSI Bus
41953e619SWyon Bi  *
51953e619SWyon Bi  * Copyright (C) 2012-2013, Samsung Electronics, Co., Ltd.
61953e619SWyon Bi  * Andrzej Hajda <a.hajda@samsung.com>
71953e619SWyon Bi  */
81953e619SWyon Bi 
91953e619SWyon Bi #ifndef __DRM_MIPI_DSI_H__
101953e619SWyon Bi #define __DRM_MIPI_DSI_H__
111953e619SWyon Bi 
121953e619SWyon Bi #include <mipi_display.h>
13a92bdaccSGuochun Huang #include <drm/drm_dsc.h>
141953e619SWyon Bi #include <dm/device.h>
151953e619SWyon Bi 
161953e619SWyon Bi struct mipi_dsi_host;
171953e619SWyon Bi struct mipi_dsi_device;
181953e619SWyon Bi 
191953e619SWyon Bi /* request ACK from peripheral */
201953e619SWyon Bi #define MIPI_DSI_MSG_REQ_ACK	BIT(0)
211953e619SWyon Bi /* use Low Power Mode to transmit message */
221953e619SWyon Bi #define MIPI_DSI_MSG_USE_LPM	BIT(1)
231953e619SWyon Bi 
241953e619SWyon Bi /**
251953e619SWyon Bi  * struct mipi_dsi_msg - read/write DSI buffer
261953e619SWyon Bi  * @channel: virtual channel id
271953e619SWyon Bi  * @type: payload data type
281953e619SWyon Bi  * @flags: flags controlling this message transmission
291953e619SWyon Bi  * @tx_len: length of @tx_buf
301953e619SWyon Bi  * @tx_buf: data to be written
311953e619SWyon Bi  * @rx_len: length of @rx_buf
321953e619SWyon Bi  * @rx_buf: data to be read, or NULL
331953e619SWyon Bi  */
341953e619SWyon Bi struct mipi_dsi_msg {
351953e619SWyon Bi 	u8 channel;
361953e619SWyon Bi 	u8 type;
371953e619SWyon Bi 	u16 flags;
381953e619SWyon Bi 
391953e619SWyon Bi 	size_t tx_len;
401953e619SWyon Bi 	const void *tx_buf;
411953e619SWyon Bi 
421953e619SWyon Bi 	size_t rx_len;
431953e619SWyon Bi 	void *rx_buf;
441953e619SWyon Bi };
451953e619SWyon Bi 
461953e619SWyon Bi bool mipi_dsi_packet_format_is_short(u8 type);
471953e619SWyon Bi bool mipi_dsi_packet_format_is_long(u8 type);
481953e619SWyon Bi 
491953e619SWyon Bi /**
501953e619SWyon Bi  * struct mipi_dsi_packet - represents a MIPI DSI packet in protocol format
511953e619SWyon Bi  * @size: size (in bytes) of the packet
521953e619SWyon Bi  * @header: the four bytes that make up the header (Data ID, Word Count or
531953e619SWyon Bi  *     Packet Data, and ECC)
541953e619SWyon Bi  * @payload_length: number of bytes in the payload
551953e619SWyon Bi  * @payload: a pointer to a buffer containing the payload, if any
561953e619SWyon Bi  */
571953e619SWyon Bi struct mipi_dsi_packet {
581953e619SWyon Bi 	size_t size;
591953e619SWyon Bi 	u8 header[4];
601953e619SWyon Bi 	size_t payload_length;
611953e619SWyon Bi 	const u8 *payload;
621953e619SWyon Bi };
631953e619SWyon Bi 
641953e619SWyon Bi int mipi_dsi_create_packet(struct mipi_dsi_packet *packet,
651953e619SWyon Bi 			   const struct mipi_dsi_msg *msg);
661953e619SWyon Bi 
671953e619SWyon Bi /**
681953e619SWyon Bi  * struct mipi_dsi_host_ops - DSI bus operations
691953e619SWyon Bi  * @attach: attach DSI device to DSI host
701953e619SWyon Bi  * @detach: detach DSI device from DSI host
711953e619SWyon Bi  * @transfer: transmit a DSI packet
721953e619SWyon Bi  *
731953e619SWyon Bi  * DSI packets transmitted by .transfer() are passed in as mipi_dsi_msg
741953e619SWyon Bi  * structures. This structure contains information about the type of packet
751953e619SWyon Bi  * being transmitted as well as the transmit and receive buffers. When an
761953e619SWyon Bi  * error is encountered during transmission, this function will return a
771953e619SWyon Bi  * negative error code. On success it shall return the number of bytes
781953e619SWyon Bi  * transmitted for write packets or the number of bytes received for read
791953e619SWyon Bi  * packets.
801953e619SWyon Bi  *
811953e619SWyon Bi  * Note that typically DSI packet transmission is atomic, so the .transfer()
821953e619SWyon Bi  * function will seldomly return anything other than the number of bytes
831953e619SWyon Bi  * contained in the transmit buffer on success.
841953e619SWyon Bi  */
851953e619SWyon Bi struct mipi_dsi_host_ops {
861953e619SWyon Bi 	int (*attach)(struct mipi_dsi_host *host,
871953e619SWyon Bi 		      struct mipi_dsi_device *dsi);
881953e619SWyon Bi 	int (*detach)(struct mipi_dsi_host *host,
891953e619SWyon Bi 		      struct mipi_dsi_device *dsi);
901953e619SWyon Bi 	ssize_t (*transfer)(struct mipi_dsi_host *host,
911953e619SWyon Bi 			    const struct mipi_dsi_msg *msg);
921953e619SWyon Bi };
931953e619SWyon Bi 
941953e619SWyon Bi /**
951953e619SWyon Bi  * struct mipi_dsi_host - DSI host device
961953e619SWyon Bi  * @dev: driver model device node for this DSI host
971953e619SWyon Bi  * @ops: DSI host operations
981953e619SWyon Bi  * @list: list management
991953e619SWyon Bi  */
1001953e619SWyon Bi struct mipi_dsi_host {
1011953e619SWyon Bi 	struct udevice *dev;
1021953e619SWyon Bi 	const struct mipi_dsi_host_ops *ops;
1031953e619SWyon Bi };
1041953e619SWyon Bi 
1051953e619SWyon Bi /* DSI mode flags */
1061953e619SWyon Bi 
1071953e619SWyon Bi /* video mode */
1081953e619SWyon Bi #define MIPI_DSI_MODE_VIDEO		BIT(0)
1091953e619SWyon Bi /* video burst mode */
1101953e619SWyon Bi #define MIPI_DSI_MODE_VIDEO_BURST	BIT(1)
1111953e619SWyon Bi /* video pulse mode */
1121953e619SWyon Bi #define MIPI_DSI_MODE_VIDEO_SYNC_PULSE	BIT(2)
1131953e619SWyon Bi /* enable auto vertical count mode */
1141953e619SWyon Bi #define MIPI_DSI_MODE_VIDEO_AUTO_VERT	BIT(3)
1151953e619SWyon Bi /* enable hsync-end packets in vsync-pulse and v-porch area */
1161953e619SWyon Bi #define MIPI_DSI_MODE_VIDEO_HSE		BIT(4)
1171953e619SWyon Bi /* disable hfront-porch area */
118*edbf2db2SGuochun Huang #define MIPI_DSI_MODE_VIDEO_NO_HFP		BIT(5)
1191953e619SWyon Bi /* disable hback-porch area */
120*edbf2db2SGuochun Huang #define MIPI_DSI_MODE_VIDEO_NO_HBP		BIT(6)
1211953e619SWyon Bi /* disable hsync-active area */
122*edbf2db2SGuochun Huang #define MIPI_DSI_MODE_VIDEO_NO_HSA		BIT(7)
1231953e619SWyon Bi /* flush display FIFO on vsync pulse */
1241953e619SWyon Bi #define MIPI_DSI_MODE_VSYNC_FLUSH	BIT(8)
1251953e619SWyon Bi /* disable EoT packets in HS mode */
126*edbf2db2SGuochun Huang #define MIPI_DSI_MODE_NO_EOT_PACKET	BIT(9)
1271953e619SWyon Bi /* device supports non-continuous clock behavior (DSI spec 5.6.1) */
1281953e619SWyon Bi #define MIPI_DSI_CLOCK_NON_CONTINUOUS	BIT(10)
1291953e619SWyon Bi /* transmit data in low power */
1301953e619SWyon Bi #define MIPI_DSI_MODE_LPM		BIT(11)
1311953e619SWyon Bi 
1321953e619SWyon Bi enum mipi_dsi_pixel_format {
1331953e619SWyon Bi 	MIPI_DSI_FMT_RGB888,
1341953e619SWyon Bi 	MIPI_DSI_FMT_RGB666,
1351953e619SWyon Bi 	MIPI_DSI_FMT_RGB666_PACKED,
1361953e619SWyon Bi 	MIPI_DSI_FMT_RGB565,
1371953e619SWyon Bi };
1381953e619SWyon Bi 
1391953e619SWyon Bi #define DSI_DEV_NAME_SIZE		20
1401953e619SWyon Bi 
1411953e619SWyon Bi /**
1421953e619SWyon Bi  * struct mipi_dsi_device - DSI peripheral device
1431953e619SWyon Bi  * @host: DSI host for this peripheral
1441953e619SWyon Bi  * @dev: driver model device node for this peripheral
1451953e619SWyon Bi  * @name: DSI peripheral chip type
1461953e619SWyon Bi  * @channel: virtual channel assigned to the peripheral
1471953e619SWyon Bi  * @format: pixel format for video mode
1481953e619SWyon Bi  * @lanes: number of active data lanes
1491953e619SWyon Bi  * @mode_flags: DSI operation mode related flags
1501953e619SWyon Bi  * @hs_rate: maximum lane frequency for high speed mode in hertz, this should
1511953e619SWyon Bi  * be set to the real limits of the hardware, zero is only accepted for
1521953e619SWyon Bi  * legacy drivers
1531953e619SWyon Bi  * @lp_rate: maximum lane frequency for low power mode in hertz, this should
1541953e619SWyon Bi  * be set to the real limits of the hardware, zero is only accepted for
1551953e619SWyon Bi  * legacy drivers
1561953e619SWyon Bi  */
1571953e619SWyon Bi struct mipi_dsi_device {
1581953e619SWyon Bi 	struct mipi_dsi_host *host;
1591953e619SWyon Bi 	struct udevice *dev;
1601953e619SWyon Bi 
1611953e619SWyon Bi 	char name[DSI_DEV_NAME_SIZE];
1621953e619SWyon Bi 	unsigned int channel;
1631953e619SWyon Bi 	unsigned int lanes;
1641953e619SWyon Bi 	enum mipi_dsi_pixel_format format;
1651953e619SWyon Bi 	unsigned long mode_flags;
1661953e619SWyon Bi 	unsigned long hs_rate;
1671953e619SWyon Bi 	unsigned long lp_rate;
1681953e619SWyon Bi };
1691953e619SWyon Bi 
1701953e619SWyon Bi /**
1711953e619SWyon Bi  * mipi_dsi_pixel_format_to_bpp - obtain the number of bits per pixel for any
1721953e619SWyon Bi  *                                given pixel format defined by the MIPI DSI
1731953e619SWyon Bi  *                                specification
1741953e619SWyon Bi  * @fmt: MIPI DSI pixel format
1751953e619SWyon Bi  *
1761953e619SWyon Bi  * Returns: The number of bits per pixel of the given pixel format.
1771953e619SWyon Bi  */
mipi_dsi_pixel_format_to_bpp(enum mipi_dsi_pixel_format fmt)1781953e619SWyon Bi static inline int mipi_dsi_pixel_format_to_bpp(enum mipi_dsi_pixel_format fmt)
1791953e619SWyon Bi {
1801953e619SWyon Bi 	switch (fmt) {
1811953e619SWyon Bi 	case MIPI_DSI_FMT_RGB888:
1821953e619SWyon Bi 	case MIPI_DSI_FMT_RGB666:
1831953e619SWyon Bi 		return 24;
1841953e619SWyon Bi 
1851953e619SWyon Bi 	case MIPI_DSI_FMT_RGB666_PACKED:
1861953e619SWyon Bi 		return 18;
1871953e619SWyon Bi 
1881953e619SWyon Bi 	case MIPI_DSI_FMT_RGB565:
1891953e619SWyon Bi 		return 16;
1901953e619SWyon Bi 	}
1911953e619SWyon Bi 
1921953e619SWyon Bi 	return -EINVAL;
1931953e619SWyon Bi }
1941953e619SWyon Bi 
1951953e619SWyon Bi int mipi_dsi_attach(struct mipi_dsi_device *dsi);
1961953e619SWyon Bi int mipi_dsi_detach(struct mipi_dsi_device *dsi);
1971953e619SWyon Bi int mipi_dsi_shutdown_peripheral(struct mipi_dsi_device *dsi);
1981953e619SWyon Bi int mipi_dsi_turn_on_peripheral(struct mipi_dsi_device *dsi);
1991953e619SWyon Bi int mipi_dsi_set_maximum_return_packet_size(struct mipi_dsi_device *dsi,
2001953e619SWyon Bi 					    u16 value);
2011953e619SWyon Bi 
202a92bdaccSGuochun Huang ssize_t mipi_dsi_compression_mode(struct mipi_dsi_device *dsi, bool enable);
203a92bdaccSGuochun Huang ssize_t mipi_dsi_picture_parameter_set(struct mipi_dsi_device *dsi,
204a92bdaccSGuochun Huang 				       const struct drm_dsc_picture_parameter_set *pps);
205a92bdaccSGuochun Huang 
2061953e619SWyon Bi ssize_t mipi_dsi_generic_write(struct mipi_dsi_device *dsi, const void *payload,
2071953e619SWyon Bi 			       size_t size);
2081953e619SWyon Bi ssize_t mipi_dsi_generic_read(struct mipi_dsi_device *dsi, const void *params,
2091953e619SWyon Bi 			      size_t num_params, void *data, size_t size);
2101953e619SWyon Bi 
2111953e619SWyon Bi /**
2121953e619SWyon Bi  * enum mipi_dsi_dcs_tear_mode - Tearing Effect Output Line mode
2131953e619SWyon Bi  * @MIPI_DSI_DCS_TEAR_MODE_VBLANK: the TE output line consists of V-Blanking
2141953e619SWyon Bi  *    information only
2151953e619SWyon Bi  * @MIPI_DSI_DCS_TEAR_MODE_VHBLANK : the TE output line consists of both
2161953e619SWyon Bi  *    V-Blanking and H-Blanking information
2171953e619SWyon Bi  */
2181953e619SWyon Bi enum mipi_dsi_dcs_tear_mode {
2191953e619SWyon Bi 	MIPI_DSI_DCS_TEAR_MODE_VBLANK,
2201953e619SWyon Bi 	MIPI_DSI_DCS_TEAR_MODE_VHBLANK,
2211953e619SWyon Bi };
2221953e619SWyon Bi 
2231953e619SWyon Bi #define MIPI_DSI_DCS_POWER_MODE_DISPLAY BIT(2)
2241953e619SWyon Bi #define MIPI_DSI_DCS_POWER_MODE_NORMAL  BIT(3)
2251953e619SWyon Bi #define MIPI_DSI_DCS_POWER_MODE_SLEEP   BIT(4)
2261953e619SWyon Bi #define MIPI_DSI_DCS_POWER_MODE_PARTIAL BIT(5)
2271953e619SWyon Bi #define MIPI_DSI_DCS_POWER_MODE_IDLE    BIT(6)
2281953e619SWyon Bi 
2291953e619SWyon Bi ssize_t mipi_dsi_dcs_write_buffer(struct mipi_dsi_device *dsi,
2301953e619SWyon Bi 				  const void *data, size_t len);
2311953e619SWyon Bi ssize_t mipi_dsi_dcs_write(struct mipi_dsi_device *dsi, u8 cmd,
2321953e619SWyon Bi 			   const void *data, size_t len);
2331953e619SWyon Bi ssize_t mipi_dsi_dcs_read(struct mipi_dsi_device *dsi, u8 cmd, void *data,
2341953e619SWyon Bi 			  size_t len);
2351953e619SWyon Bi int mipi_dsi_dcs_nop(struct mipi_dsi_device *dsi);
2361953e619SWyon Bi int mipi_dsi_dcs_soft_reset(struct mipi_dsi_device *dsi);
2371953e619SWyon Bi int mipi_dsi_dcs_get_power_mode(struct mipi_dsi_device *dsi, u8 *mode);
2381953e619SWyon Bi int mipi_dsi_dcs_get_pixel_format(struct mipi_dsi_device *dsi, u8 *format);
2391953e619SWyon Bi int mipi_dsi_dcs_enter_sleep_mode(struct mipi_dsi_device *dsi);
2401953e619SWyon Bi int mipi_dsi_dcs_exit_sleep_mode(struct mipi_dsi_device *dsi);
2411953e619SWyon Bi int mipi_dsi_dcs_set_display_off(struct mipi_dsi_device *dsi);
2421953e619SWyon Bi int mipi_dsi_dcs_set_display_on(struct mipi_dsi_device *dsi);
2431953e619SWyon Bi int mipi_dsi_dcs_set_column_address(struct mipi_dsi_device *dsi, u16 start,
2441953e619SWyon Bi 				    u16 end);
2451953e619SWyon Bi int mipi_dsi_dcs_set_page_address(struct mipi_dsi_device *dsi, u16 start,
2461953e619SWyon Bi 				  u16 end);
2471953e619SWyon Bi int mipi_dsi_dcs_set_tear_off(struct mipi_dsi_device *dsi);
2481953e619SWyon Bi int mipi_dsi_dcs_set_tear_on(struct mipi_dsi_device *dsi,
2491953e619SWyon Bi 			     enum mipi_dsi_dcs_tear_mode mode);
2501953e619SWyon Bi int mipi_dsi_dcs_set_pixel_format(struct mipi_dsi_device *dsi, u8 format);
2511953e619SWyon Bi int mipi_dsi_dcs_set_tear_scanline(struct mipi_dsi_device *dsi, u16 scanline);
2521953e619SWyon Bi int mipi_dsi_dcs_set_display_brightness(struct mipi_dsi_device *dsi,
2531953e619SWyon Bi 					u16 brightness);
2541953e619SWyon Bi int mipi_dsi_dcs_get_display_brightness(struct mipi_dsi_device *dsi,
2551953e619SWyon Bi 					u16 *brightness);
2561953e619SWyon Bi 
2571953e619SWyon Bi #endif /* __DRM_MIPI_DSI__ */
258