root/include/drm/drm_mipi_dsi.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. to_mipi_dsi_device
  2. mipi_dsi_pixel_format_to_bpp
  3. to_mipi_dsi_driver
  4. mipi_dsi_get_drvdata
  5. mipi_dsi_set_drvdata

   1 /* SPDX-License-Identifier: GPL-2.0-only */
   2 /*
   3  * MIPI DSI Bus
   4  *
   5  * Copyright (C) 2012-2013, Samsung Electronics, Co., Ltd.
   6  * Andrzej Hajda <a.hajda@samsung.com>
   7  */
   8 
   9 #ifndef __DRM_MIPI_DSI_H__
  10 #define __DRM_MIPI_DSI_H__
  11 
  12 #include <linux/device.h>
  13 
  14 struct mipi_dsi_host;
  15 struct mipi_dsi_device;
  16 
  17 /* request ACK from peripheral */
  18 #define MIPI_DSI_MSG_REQ_ACK    BIT(0)
  19 /* use Low Power Mode to transmit message */
  20 #define MIPI_DSI_MSG_USE_LPM    BIT(1)
  21 
  22 /**
  23  * struct mipi_dsi_msg - read/write DSI buffer
  24  * @channel: virtual channel id
  25  * @type: payload data type
  26  * @flags: flags controlling this message transmission
  27  * @tx_len: length of @tx_buf
  28  * @tx_buf: data to be written
  29  * @rx_len: length of @rx_buf
  30  * @rx_buf: data to be read, or NULL
  31  */
  32 struct mipi_dsi_msg {
  33         u8 channel;
  34         u8 type;
  35         u16 flags;
  36 
  37         size_t tx_len;
  38         const void *tx_buf;
  39 
  40         size_t rx_len;
  41         void *rx_buf;
  42 };
  43 
  44 bool mipi_dsi_packet_format_is_short(u8 type);
  45 bool mipi_dsi_packet_format_is_long(u8 type);
  46 
  47 /**
  48  * struct mipi_dsi_packet - represents a MIPI DSI packet in protocol format
  49  * @size: size (in bytes) of the packet
  50  * @header: the four bytes that make up the header (Data ID, Word Count or
  51  *     Packet Data, and ECC)
  52  * @payload_length: number of bytes in the payload
  53  * @payload: a pointer to a buffer containing the payload, if any
  54  */
  55 struct mipi_dsi_packet {
  56         size_t size;
  57         u8 header[4];
  58         size_t payload_length;
  59         const u8 *payload;
  60 };
  61 
  62 int mipi_dsi_create_packet(struct mipi_dsi_packet *packet,
  63                            const struct mipi_dsi_msg *msg);
  64 
  65 /**
  66  * struct mipi_dsi_host_ops - DSI bus operations
  67  * @attach: attach DSI device to DSI host
  68  * @detach: detach DSI device from DSI host
  69  * @transfer: transmit a DSI packet
  70  *
  71  * DSI packets transmitted by .transfer() are passed in as mipi_dsi_msg
  72  * structures. This structure contains information about the type of packet
  73  * being transmitted as well as the transmit and receive buffers. When an
  74  * error is encountered during transmission, this function will return a
  75  * negative error code. On success it shall return the number of bytes
  76  * transmitted for write packets or the number of bytes received for read
  77  * packets.
  78  *
  79  * Note that typically DSI packet transmission is atomic, so the .transfer()
  80  * function will seldomly return anything other than the number of bytes
  81  * contained in the transmit buffer on success.
  82  */
  83 struct mipi_dsi_host_ops {
  84         int (*attach)(struct mipi_dsi_host *host,
  85                       struct mipi_dsi_device *dsi);
  86         int (*detach)(struct mipi_dsi_host *host,
  87                       struct mipi_dsi_device *dsi);
  88         ssize_t (*transfer)(struct mipi_dsi_host *host,
  89                             const struct mipi_dsi_msg *msg);
  90 };
  91 
  92 /**
  93  * struct mipi_dsi_host - DSI host device
  94  * @dev: driver model device node for this DSI host
  95  * @ops: DSI host operations
  96  * @list: list management
  97  */
  98 struct mipi_dsi_host {
  99         struct device *dev;
 100         const struct mipi_dsi_host_ops *ops;
 101         struct list_head list;
 102 };
 103 
 104 int mipi_dsi_host_register(struct mipi_dsi_host *host);
 105 void mipi_dsi_host_unregister(struct mipi_dsi_host *host);
 106 struct mipi_dsi_host *of_find_mipi_dsi_host_by_node(struct device_node *node);
 107 
 108 /* DSI mode flags */
 109 
 110 /* video mode */
 111 #define MIPI_DSI_MODE_VIDEO             BIT(0)
 112 /* video burst mode */
 113 #define MIPI_DSI_MODE_VIDEO_BURST       BIT(1)
 114 /* video pulse mode */
 115 #define MIPI_DSI_MODE_VIDEO_SYNC_PULSE  BIT(2)
 116 /* enable auto vertical count mode */
 117 #define MIPI_DSI_MODE_VIDEO_AUTO_VERT   BIT(3)
 118 /* enable hsync-end packets in vsync-pulse and v-porch area */
 119 #define MIPI_DSI_MODE_VIDEO_HSE         BIT(4)
 120 /* disable hfront-porch area */
 121 #define MIPI_DSI_MODE_VIDEO_HFP         BIT(5)
 122 /* disable hback-porch area */
 123 #define MIPI_DSI_MODE_VIDEO_HBP         BIT(6)
 124 /* disable hsync-active area */
 125 #define MIPI_DSI_MODE_VIDEO_HSA         BIT(7)
 126 /* flush display FIFO on vsync pulse */
 127 #define MIPI_DSI_MODE_VSYNC_FLUSH       BIT(8)
 128 /* disable EoT packets in HS mode */
 129 #define MIPI_DSI_MODE_EOT_PACKET        BIT(9)
 130 /* device supports non-continuous clock behavior (DSI spec 5.6.1) */
 131 #define MIPI_DSI_CLOCK_NON_CONTINUOUS   BIT(10)
 132 /* transmit data in low power */
 133 #define MIPI_DSI_MODE_LPM               BIT(11)
 134 
 135 enum mipi_dsi_pixel_format {
 136         MIPI_DSI_FMT_RGB888,
 137         MIPI_DSI_FMT_RGB666,
 138         MIPI_DSI_FMT_RGB666_PACKED,
 139         MIPI_DSI_FMT_RGB565,
 140 };
 141 
 142 #define DSI_DEV_NAME_SIZE               20
 143 
 144 /**
 145  * struct mipi_dsi_device_info - template for creating a mipi_dsi_device
 146  * @type: DSI peripheral chip type
 147  * @channel: DSI virtual channel assigned to peripheral
 148  * @node: pointer to OF device node or NULL
 149  *
 150  * This is populated and passed to mipi_dsi_device_new to create a new
 151  * DSI device
 152  */
 153 struct mipi_dsi_device_info {
 154         char type[DSI_DEV_NAME_SIZE];
 155         u32 channel;
 156         struct device_node *node;
 157 };
 158 
 159 /**
 160  * struct mipi_dsi_device - DSI peripheral device
 161  * @host: DSI host for this peripheral
 162  * @dev: driver model device node for this peripheral
 163  * @name: DSI peripheral chip type
 164  * @channel: virtual channel assigned to the peripheral
 165  * @format: pixel format for video mode
 166  * @lanes: number of active data lanes
 167  * @mode_flags: DSI operation mode related flags
 168  * @hs_rate: maximum lane frequency for high speed mode in hertz, this should
 169  * be set to the real limits of the hardware, zero is only accepted for
 170  * legacy drivers
 171  * @lp_rate: maximum lane frequency for low power mode in hertz, this should
 172  * be set to the real limits of the hardware, zero is only accepted for
 173  * legacy drivers
 174  */
 175 struct mipi_dsi_device {
 176         struct mipi_dsi_host *host;
 177         struct device dev;
 178 
 179         char name[DSI_DEV_NAME_SIZE];
 180         unsigned int channel;
 181         unsigned int lanes;
 182         enum mipi_dsi_pixel_format format;
 183         unsigned long mode_flags;
 184         unsigned long hs_rate;
 185         unsigned long lp_rate;
 186 };
 187 
 188 #define MIPI_DSI_MODULE_PREFIX "mipi-dsi:"
 189 
 190 static inline struct mipi_dsi_device *to_mipi_dsi_device(struct device *dev)
 191 {
 192         return container_of(dev, struct mipi_dsi_device, dev);
 193 }
 194 
 195 /**
 196  * mipi_dsi_pixel_format_to_bpp - obtain the number of bits per pixel for any
 197  *                                given pixel format defined by the MIPI DSI
 198  *                                specification
 199  * @fmt: MIPI DSI pixel format
 200  *
 201  * Returns: The number of bits per pixel of the given pixel format.
 202  */
 203 static inline int mipi_dsi_pixel_format_to_bpp(enum mipi_dsi_pixel_format fmt)
 204 {
 205         switch (fmt) {
 206         case MIPI_DSI_FMT_RGB888:
 207         case MIPI_DSI_FMT_RGB666:
 208                 return 24;
 209 
 210         case MIPI_DSI_FMT_RGB666_PACKED:
 211                 return 18;
 212 
 213         case MIPI_DSI_FMT_RGB565:
 214                 return 16;
 215         }
 216 
 217         return -EINVAL;
 218 }
 219 
 220 struct mipi_dsi_device *
 221 mipi_dsi_device_register_full(struct mipi_dsi_host *host,
 222                               const struct mipi_dsi_device_info *info);
 223 void mipi_dsi_device_unregister(struct mipi_dsi_device *dsi);
 224 struct mipi_dsi_device *of_find_mipi_dsi_device_by_node(struct device_node *np);
 225 int mipi_dsi_attach(struct mipi_dsi_device *dsi);
 226 int mipi_dsi_detach(struct mipi_dsi_device *dsi);
 227 int mipi_dsi_shutdown_peripheral(struct mipi_dsi_device *dsi);
 228 int mipi_dsi_turn_on_peripheral(struct mipi_dsi_device *dsi);
 229 int mipi_dsi_set_maximum_return_packet_size(struct mipi_dsi_device *dsi,
 230                                             u16 value);
 231 
 232 ssize_t mipi_dsi_generic_write(struct mipi_dsi_device *dsi, const void *payload,
 233                                size_t size);
 234 ssize_t mipi_dsi_generic_read(struct mipi_dsi_device *dsi, const void *params,
 235                               size_t num_params, void *data, size_t size);
 236 
 237 /**
 238  * enum mipi_dsi_dcs_tear_mode - Tearing Effect Output Line mode
 239  * @MIPI_DSI_DCS_TEAR_MODE_VBLANK: the TE output line consists of V-Blanking
 240  *    information only
 241  * @MIPI_DSI_DCS_TEAR_MODE_VHBLANK : the TE output line consists of both
 242  *    V-Blanking and H-Blanking information
 243  */
 244 enum mipi_dsi_dcs_tear_mode {
 245         MIPI_DSI_DCS_TEAR_MODE_VBLANK,
 246         MIPI_DSI_DCS_TEAR_MODE_VHBLANK,
 247 };
 248 
 249 #define MIPI_DSI_DCS_POWER_MODE_DISPLAY (1 << 2)
 250 #define MIPI_DSI_DCS_POWER_MODE_NORMAL  (1 << 3)
 251 #define MIPI_DSI_DCS_POWER_MODE_SLEEP   (1 << 4)
 252 #define MIPI_DSI_DCS_POWER_MODE_PARTIAL (1 << 5)
 253 #define MIPI_DSI_DCS_POWER_MODE_IDLE    (1 << 6)
 254 
 255 ssize_t mipi_dsi_dcs_write_buffer(struct mipi_dsi_device *dsi,
 256                                   const void *data, size_t len);
 257 ssize_t mipi_dsi_dcs_write(struct mipi_dsi_device *dsi, u8 cmd,
 258                            const void *data, size_t len);
 259 ssize_t mipi_dsi_dcs_read(struct mipi_dsi_device *dsi, u8 cmd, void *data,
 260                           size_t len);
 261 int mipi_dsi_dcs_nop(struct mipi_dsi_device *dsi);
 262 int mipi_dsi_dcs_soft_reset(struct mipi_dsi_device *dsi);
 263 int mipi_dsi_dcs_get_power_mode(struct mipi_dsi_device *dsi, u8 *mode);
 264 int mipi_dsi_dcs_get_pixel_format(struct mipi_dsi_device *dsi, u8 *format);
 265 int mipi_dsi_dcs_enter_sleep_mode(struct mipi_dsi_device *dsi);
 266 int mipi_dsi_dcs_exit_sleep_mode(struct mipi_dsi_device *dsi);
 267 int mipi_dsi_dcs_set_display_off(struct mipi_dsi_device *dsi);
 268 int mipi_dsi_dcs_set_display_on(struct mipi_dsi_device *dsi);
 269 int mipi_dsi_dcs_set_column_address(struct mipi_dsi_device *dsi, u16 start,
 270                                     u16 end);
 271 int mipi_dsi_dcs_set_page_address(struct mipi_dsi_device *dsi, u16 start,
 272                                   u16 end);
 273 int mipi_dsi_dcs_set_tear_off(struct mipi_dsi_device *dsi);
 274 int mipi_dsi_dcs_set_tear_on(struct mipi_dsi_device *dsi,
 275                              enum mipi_dsi_dcs_tear_mode mode);
 276 int mipi_dsi_dcs_set_pixel_format(struct mipi_dsi_device *dsi, u8 format);
 277 int mipi_dsi_dcs_set_tear_scanline(struct mipi_dsi_device *dsi, u16 scanline);
 278 int mipi_dsi_dcs_set_display_brightness(struct mipi_dsi_device *dsi,
 279                                         u16 brightness);
 280 int mipi_dsi_dcs_get_display_brightness(struct mipi_dsi_device *dsi,
 281                                         u16 *brightness);
 282 
 283 /**
 284  * struct mipi_dsi_driver - DSI driver
 285  * @driver: device driver model driver
 286  * @probe: callback for device binding
 287  * @remove: callback for device unbinding
 288  * @shutdown: called at shutdown time to quiesce the device
 289  */
 290 struct mipi_dsi_driver {
 291         struct device_driver driver;
 292         int(*probe)(struct mipi_dsi_device *dsi);
 293         int(*remove)(struct mipi_dsi_device *dsi);
 294         void (*shutdown)(struct mipi_dsi_device *dsi);
 295 };
 296 
 297 static inline struct mipi_dsi_driver *
 298 to_mipi_dsi_driver(struct device_driver *driver)
 299 {
 300         return container_of(driver, struct mipi_dsi_driver, driver);
 301 }
 302 
 303 static inline void *mipi_dsi_get_drvdata(const struct mipi_dsi_device *dsi)
 304 {
 305         return dev_get_drvdata(&dsi->dev);
 306 }
 307 
 308 static inline void mipi_dsi_set_drvdata(struct mipi_dsi_device *dsi, void *data)
 309 {
 310         dev_set_drvdata(&dsi->dev, data);
 311 }
 312 
 313 int mipi_dsi_driver_register_full(struct mipi_dsi_driver *driver,
 314                                   struct module *owner);
 315 void mipi_dsi_driver_unregister(struct mipi_dsi_driver *driver);
 316 
 317 #define mipi_dsi_driver_register(driver) \
 318         mipi_dsi_driver_register_full(driver, THIS_MODULE)
 319 
 320 #define module_mipi_dsi_driver(__mipi_dsi_driver) \
 321         module_driver(__mipi_dsi_driver, mipi_dsi_driver_register, \
 322                         mipi_dsi_driver_unregister)
 323 
 324 #endif /* __DRM_MIPI_DSI__ */

/* [<][>][^][v][top][bottom][index][help] */