~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/include/drm/drm_mipi_dsi.h

Version: ~ [ linux-6.11.5 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.58 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.114 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.169 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.228 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.284 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.322 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  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 #include <linux/delay.h>
 14 
 15 struct mipi_dsi_host;
 16 struct mipi_dsi_device;
 17 struct drm_dsc_picture_parameter_set;
 18 
 19 /* request ACK from peripheral */
 20 #define MIPI_DSI_MSG_REQ_ACK    BIT(0)
 21 /* use Low Power Mode to transmit message */
 22 #define MIPI_DSI_MSG_USE_LPM    BIT(1)
 23 
 24 /**
 25  * struct mipi_dsi_msg - read/write DSI buffer
 26  * @channel: virtual channel id
 27  * @type: payload data type
 28  * @flags: flags controlling this message transmission
 29  * @tx_len: length of @tx_buf
 30  * @tx_buf: data to be written
 31  * @rx_len: length of @rx_buf
 32  * @rx_buf: data to be read, or NULL
 33  */
 34 struct mipi_dsi_msg {
 35         u8 channel;
 36         u8 type;
 37         u16 flags;
 38 
 39         size_t tx_len;
 40         const void *tx_buf;
 41 
 42         size_t rx_len;
 43         void *rx_buf;
 44 };
 45 
 46 bool mipi_dsi_packet_format_is_short(u8 type);
 47 bool mipi_dsi_packet_format_is_long(u8 type);
 48 
 49 /**
 50  * struct mipi_dsi_packet - represents a MIPI DSI packet in protocol format
 51  * @size: size (in bytes) of the packet
 52  * @header: the four bytes that make up the header (Data ID, Word Count or
 53  *     Packet Data, and ECC)
 54  * @payload_length: number of bytes in the payload
 55  * @payload: a pointer to a buffer containing the payload, if any
 56  */
 57 struct mipi_dsi_packet {
 58         size_t size;
 59         u8 header[4];
 60         size_t payload_length;
 61         const u8 *payload;
 62 };
 63 
 64 int mipi_dsi_create_packet(struct mipi_dsi_packet *packet,
 65                            const struct mipi_dsi_msg *msg);
 66 
 67 /**
 68  * struct mipi_dsi_host_ops - DSI bus operations
 69  * @attach: attach DSI device to DSI host
 70  * @detach: detach DSI device from DSI host
 71  * @transfer: transmit a DSI packet
 72  *
 73  * DSI packets transmitted by .transfer() are passed in as mipi_dsi_msg
 74  * structures. This structure contains information about the type of packet
 75  * being transmitted as well as the transmit and receive buffers. When an
 76  * error is encountered during transmission, this function will return a
 77  * negative error code. On success it shall return the number of bytes
 78  * transmitted for write packets or the number of bytes received for read
 79  * packets.
 80  *
 81  * Note that typically DSI packet transmission is atomic, so the .transfer()
 82  * function will seldomly return anything other than the number of bytes
 83  * contained in the transmit buffer on success.
 84  *
 85  * Also note that those callbacks can be called no matter the state the
 86  * host is in. Drivers that need the underlying device to be powered to
 87  * perform these operations will first need to make sure it's been
 88  * properly enabled.
 89  */
 90 struct mipi_dsi_host_ops {
 91         int (*attach)(struct mipi_dsi_host *host,
 92                       struct mipi_dsi_device *dsi);
 93         int (*detach)(struct mipi_dsi_host *host,
 94                       struct mipi_dsi_device *dsi);
 95         ssize_t (*transfer)(struct mipi_dsi_host *host,
 96                             const struct mipi_dsi_msg *msg);
 97 };
 98 
 99 /**
100  * struct mipi_dsi_host - DSI host device
101  * @dev: driver model device node for this DSI host
102  * @ops: DSI host operations
103  * @list: list management
104  */
105 struct mipi_dsi_host {
106         struct device *dev;
107         const struct mipi_dsi_host_ops *ops;
108         struct list_head list;
109 };
110 
111 int mipi_dsi_host_register(struct mipi_dsi_host *host);
112 void mipi_dsi_host_unregister(struct mipi_dsi_host *host);
113 struct mipi_dsi_host *of_find_mipi_dsi_host_by_node(struct device_node *node);
114 
115 /* DSI mode flags */
116 
117 /* video mode */
118 #define MIPI_DSI_MODE_VIDEO             BIT(0)
119 /* video burst mode */
120 #define MIPI_DSI_MODE_VIDEO_BURST       BIT(1)
121 /* video pulse mode */
122 #define MIPI_DSI_MODE_VIDEO_SYNC_PULSE  BIT(2)
123 /* enable auto vertical count mode */
124 #define MIPI_DSI_MODE_VIDEO_AUTO_VERT   BIT(3)
125 /* enable hsync-end packets in vsync-pulse and v-porch area */
126 #define MIPI_DSI_MODE_VIDEO_HSE         BIT(4)
127 /* disable hfront-porch area */
128 #define MIPI_DSI_MODE_VIDEO_NO_HFP      BIT(5)
129 /* disable hback-porch area */
130 #define MIPI_DSI_MODE_VIDEO_NO_HBP      BIT(6)
131 /* disable hsync-active area */
132 #define MIPI_DSI_MODE_VIDEO_NO_HSA      BIT(7)
133 /* flush display FIFO on vsync pulse */
134 #define MIPI_DSI_MODE_VSYNC_FLUSH       BIT(8)
135 /* disable EoT packets in HS mode */
136 #define MIPI_DSI_MODE_NO_EOT_PACKET     BIT(9)
137 /* device supports non-continuous clock behavior (DSI spec 5.6.1) */
138 #define MIPI_DSI_CLOCK_NON_CONTINUOUS   BIT(10)
139 /* transmit data in low power */
140 #define MIPI_DSI_MODE_LPM               BIT(11)
141 /* transmit data ending at the same time for all lanes within one hsync */
142 #define MIPI_DSI_HS_PKT_END_ALIGNED     BIT(12)
143 
144 enum mipi_dsi_pixel_format {
145         MIPI_DSI_FMT_RGB888,
146         MIPI_DSI_FMT_RGB666,
147         MIPI_DSI_FMT_RGB666_PACKED,
148         MIPI_DSI_FMT_RGB565,
149 };
150 
151 #define DSI_DEV_NAME_SIZE               20
152 
153 /**
154  * struct mipi_dsi_device_info - template for creating a mipi_dsi_device
155  * @type: DSI peripheral chip type
156  * @channel: DSI virtual channel assigned to peripheral
157  * @node: pointer to OF device node or NULL
158  *
159  * This is populated and passed to mipi_dsi_device_new to create a new
160  * DSI device
161  */
162 struct mipi_dsi_device_info {
163         char type[DSI_DEV_NAME_SIZE];
164         u32 channel;
165         struct device_node *node;
166 };
167 
168 /**
169  * struct mipi_dsi_device - DSI peripheral device
170  * @host: DSI host for this peripheral
171  * @dev: driver model device node for this peripheral
172  * @attached: the DSI device has been successfully attached
173  * @name: DSI peripheral chip type
174  * @channel: virtual channel assigned to the peripheral
175  * @format: pixel format for video mode
176  * @lanes: number of active data lanes
177  * @mode_flags: DSI operation mode related flags
178  * @hs_rate: maximum lane frequency for high speed mode in hertz, this should
179  * be set to the real limits of the hardware, zero is only accepted for
180  * legacy drivers
181  * @lp_rate: maximum lane frequency for low power mode in hertz, this should
182  * be set to the real limits of the hardware, zero is only accepted for
183  * legacy drivers
184  * @dsc: panel/bridge DSC pps payload to be sent
185  */
186 struct mipi_dsi_device {
187         struct mipi_dsi_host *host;
188         struct device dev;
189         bool attached;
190 
191         char name[DSI_DEV_NAME_SIZE];
192         unsigned int channel;
193         unsigned int lanes;
194         enum mipi_dsi_pixel_format format;
195         unsigned long mode_flags;
196         unsigned long hs_rate;
197         unsigned long lp_rate;
198         struct drm_dsc_config *dsc;
199 };
200 
201 /**
202  * struct mipi_dsi_multi_context - Context to call multiple MIPI DSI funcs in a row
203  */
204 struct mipi_dsi_multi_context {
205         /**
206          * @dsi: Pointer to the MIPI DSI device
207          */
208         struct mipi_dsi_device *dsi;
209 
210         /**
211          * @accum_err: Storage for the accumulated error over the multiple calls
212          *
213          * Init to 0. If a function encounters an error then the error code
214          * will be stored here. If you call a function and this points to a
215          * non-zero value then the function will be a noop. This allows calling
216          * a function many times in a row and just checking the error at the
217          * end to see if any of them failed.
218          */
219         int accum_err;
220 };
221 
222 #define MIPI_DSI_MODULE_PREFIX "mipi-dsi:"
223 
224 #define to_mipi_dsi_device(__dev)       container_of_const(__dev, struct mipi_dsi_device, dev)
225 
226 /**
227  * mipi_dsi_pixel_format_to_bpp - obtain the number of bits per pixel for any
228  *                                given pixel format defined by the MIPI DSI
229  *                                specification
230  * @fmt: MIPI DSI pixel format
231  *
232  * Returns: The number of bits per pixel of the given pixel format.
233  */
234 static inline int mipi_dsi_pixel_format_to_bpp(enum mipi_dsi_pixel_format fmt)
235 {
236         switch (fmt) {
237         case MIPI_DSI_FMT_RGB888:
238         case MIPI_DSI_FMT_RGB666:
239                 return 24;
240 
241         case MIPI_DSI_FMT_RGB666_PACKED:
242                 return 18;
243 
244         case MIPI_DSI_FMT_RGB565:
245                 return 16;
246         }
247 
248         return -EINVAL;
249 }
250 
251 enum mipi_dsi_compression_algo {
252         MIPI_DSI_COMPRESSION_DSC = 0,
253         MIPI_DSI_COMPRESSION_VENDOR = 3,
254         /* other two values are reserved, DSI 1.3 */
255 };
256 
257 struct mipi_dsi_device *
258 mipi_dsi_device_register_full(struct mipi_dsi_host *host,
259                               const struct mipi_dsi_device_info *info);
260 void mipi_dsi_device_unregister(struct mipi_dsi_device *dsi);
261 struct mipi_dsi_device *
262 devm_mipi_dsi_device_register_full(struct device *dev, struct mipi_dsi_host *host,
263                                    const struct mipi_dsi_device_info *info);
264 struct mipi_dsi_device *of_find_mipi_dsi_device_by_node(struct device_node *np);
265 int mipi_dsi_attach(struct mipi_dsi_device *dsi);
266 int mipi_dsi_detach(struct mipi_dsi_device *dsi);
267 int devm_mipi_dsi_attach(struct device *dev, struct mipi_dsi_device *dsi);
268 int mipi_dsi_shutdown_peripheral(struct mipi_dsi_device *dsi);
269 int mipi_dsi_turn_on_peripheral(struct mipi_dsi_device *dsi);
270 int mipi_dsi_set_maximum_return_packet_size(struct mipi_dsi_device *dsi,
271                                             u16 value);
272 int mipi_dsi_compression_mode(struct mipi_dsi_device *dsi, bool enable);
273 int mipi_dsi_compression_mode_ext(struct mipi_dsi_device *dsi, bool enable,
274                                   enum mipi_dsi_compression_algo algo,
275                                   unsigned int pps_selector);
276 int mipi_dsi_picture_parameter_set(struct mipi_dsi_device *dsi,
277                                    const struct drm_dsc_picture_parameter_set *pps);
278 
279 void mipi_dsi_compression_mode_ext_multi(struct mipi_dsi_multi_context *ctx,
280                                          bool enable,
281                                          enum mipi_dsi_compression_algo algo,
282                                          unsigned int pps_selector);
283 void mipi_dsi_picture_parameter_set_multi(struct mipi_dsi_multi_context *ctx,
284                                           const struct drm_dsc_picture_parameter_set *pps);
285 
286 ssize_t mipi_dsi_generic_write(struct mipi_dsi_device *dsi, const void *payload,
287                                size_t size);
288 int mipi_dsi_generic_write_chatty(struct mipi_dsi_device *dsi,
289                                   const void *payload, size_t size);
290 void mipi_dsi_generic_write_multi(struct mipi_dsi_multi_context *ctx,
291                                   const void *payload, size_t size);
292 ssize_t mipi_dsi_generic_read(struct mipi_dsi_device *dsi, const void *params,
293                               size_t num_params, void *data, size_t size);
294 
295 #define mipi_dsi_msleep(ctx, delay)     \
296         do {                            \
297                 if (!(ctx)->accum_err)  \
298                         msleep(delay);  \
299         } while (0)
300 
301 #define mipi_dsi_usleep_range(ctx, min, max)    \
302         do {                                    \
303                 if (!(ctx)->accum_err)          \
304                         usleep_range(min, max); \
305         } while (0)
306 
307 /**
308  * enum mipi_dsi_dcs_tear_mode - Tearing Effect Output Line mode
309  * @MIPI_DSI_DCS_TEAR_MODE_VBLANK: the TE output line consists of V-Blanking
310  *    information only
311  * @MIPI_DSI_DCS_TEAR_MODE_VHBLANK : the TE output line consists of both
312  *    V-Blanking and H-Blanking information
313  */
314 enum mipi_dsi_dcs_tear_mode {
315         MIPI_DSI_DCS_TEAR_MODE_VBLANK,
316         MIPI_DSI_DCS_TEAR_MODE_VHBLANK,
317 };
318 
319 #define MIPI_DSI_DCS_POWER_MODE_DISPLAY (1 << 2)
320 #define MIPI_DSI_DCS_POWER_MODE_NORMAL  (1 << 3)
321 #define MIPI_DSI_DCS_POWER_MODE_SLEEP   (1 << 4)
322 #define MIPI_DSI_DCS_POWER_MODE_PARTIAL (1 << 5)
323 #define MIPI_DSI_DCS_POWER_MODE_IDLE    (1 << 6)
324 
325 ssize_t mipi_dsi_dcs_write_buffer(struct mipi_dsi_device *dsi,
326                                   const void *data, size_t len);
327 int mipi_dsi_dcs_write_buffer_chatty(struct mipi_dsi_device *dsi,
328                                      const void *data, size_t len);
329 void mipi_dsi_dcs_write_buffer_multi(struct mipi_dsi_multi_context *ctx,
330                                      const void *data, size_t len);
331 ssize_t mipi_dsi_dcs_write(struct mipi_dsi_device *dsi, u8 cmd,
332                            const void *data, size_t len);
333 ssize_t mipi_dsi_dcs_read(struct mipi_dsi_device *dsi, u8 cmd, void *data,
334                           size_t len);
335 int mipi_dsi_dcs_nop(struct mipi_dsi_device *dsi);
336 int mipi_dsi_dcs_soft_reset(struct mipi_dsi_device *dsi);
337 int mipi_dsi_dcs_get_power_mode(struct mipi_dsi_device *dsi, u8 *mode);
338 int mipi_dsi_dcs_get_pixel_format(struct mipi_dsi_device *dsi, u8 *format);
339 int mipi_dsi_dcs_enter_sleep_mode(struct mipi_dsi_device *dsi);
340 int mipi_dsi_dcs_exit_sleep_mode(struct mipi_dsi_device *dsi);
341 int mipi_dsi_dcs_set_display_off(struct mipi_dsi_device *dsi);
342 int mipi_dsi_dcs_set_display_on(struct mipi_dsi_device *dsi);
343 int mipi_dsi_dcs_set_column_address(struct mipi_dsi_device *dsi, u16 start,
344                                     u16 end);
345 int mipi_dsi_dcs_set_page_address(struct mipi_dsi_device *dsi, u16 start,
346                                   u16 end);
347 int mipi_dsi_dcs_set_tear_off(struct mipi_dsi_device *dsi);
348 int mipi_dsi_dcs_set_tear_on(struct mipi_dsi_device *dsi,
349                              enum mipi_dsi_dcs_tear_mode mode);
350 int mipi_dsi_dcs_set_pixel_format(struct mipi_dsi_device *dsi, u8 format);
351 int mipi_dsi_dcs_set_tear_scanline(struct mipi_dsi_device *dsi, u16 scanline);
352 int mipi_dsi_dcs_set_display_brightness(struct mipi_dsi_device *dsi,
353                                         u16 brightness);
354 int mipi_dsi_dcs_get_display_brightness(struct mipi_dsi_device *dsi,
355                                         u16 *brightness);
356 int mipi_dsi_dcs_set_display_brightness_large(struct mipi_dsi_device *dsi,
357                                              u16 brightness);
358 int mipi_dsi_dcs_get_display_brightness_large(struct mipi_dsi_device *dsi,
359                                              u16 *brightness);
360 
361 void mipi_dsi_dcs_nop_multi(struct mipi_dsi_multi_context *ctx);
362 void mipi_dsi_dcs_enter_sleep_mode_multi(struct mipi_dsi_multi_context *ctx);
363 void mipi_dsi_dcs_exit_sleep_mode_multi(struct mipi_dsi_multi_context *ctx);
364 void mipi_dsi_dcs_set_display_off_multi(struct mipi_dsi_multi_context *ctx);
365 void mipi_dsi_dcs_set_display_on_multi(struct mipi_dsi_multi_context *ctx);
366 void mipi_dsi_dcs_set_tear_on_multi(struct mipi_dsi_multi_context *ctx,
367                                     enum mipi_dsi_dcs_tear_mode mode);
368 
369 /**
370  * mipi_dsi_generic_write_seq - transmit data using a generic write packet
371  *
372  * This macro will print errors for you and will RETURN FROM THE CALLING
373  * FUNCTION (yes this is non-intuitive) upon error.
374  *
375  * Because of the non-intuitive return behavior, THIS MACRO IS DEPRECATED.
376  * Please replace calls of it with mipi_dsi_generic_write_seq_multi().
377  *
378  * @dsi: DSI peripheral device
379  * @seq: buffer containing the payload
380  */
381 #define mipi_dsi_generic_write_seq(dsi, seq...)                                \
382         do {                                                                   \
383                 static const u8 d[] = { seq };                                 \
384                 int ret;                                                       \
385                 ret = mipi_dsi_generic_write_chatty(dsi, d, ARRAY_SIZE(d));    \
386                 if (ret < 0)                                                   \
387                         return ret;                                            \
388         } while (0)
389 
390 /**
391  * mipi_dsi_generic_write_seq_multi - transmit data using a generic write packet
392  *
393  * This macro will print errors for you and error handling is optimized for
394  * callers that call this multiple times in a row.
395  *
396  * @ctx: Context for multiple DSI transactions
397  * @seq: buffer containing the payload
398  */
399 #define mipi_dsi_generic_write_seq_multi(ctx, seq...)                \
400         do {                                                         \
401                 static const u8 d[] = { seq };                       \
402                 mipi_dsi_generic_write_multi(ctx, d, ARRAY_SIZE(d)); \
403         } while (0)
404 
405 /**
406  * mipi_dsi_dcs_write_seq - transmit a DCS command with payload
407  *
408  * This macro will print errors for you and will RETURN FROM THE CALLING
409  * FUNCTION (yes this is non-intuitive) upon error.
410  *
411  * Because of the non-intuitive return behavior, THIS MACRO IS DEPRECATED.
412  * Please replace calls of it with mipi_dsi_dcs_write_seq_multi().
413  *
414  * @dsi: DSI peripheral device
415  * @cmd: Command
416  * @seq: buffer containing data to be transmitted
417  */
418 #define mipi_dsi_dcs_write_seq(dsi, cmd, seq...)                               \
419         do {                                                                   \
420                 static const u8 d[] = { cmd, seq };                            \
421                 int ret;                                                       \
422                 ret = mipi_dsi_dcs_write_buffer_chatty(dsi, d, ARRAY_SIZE(d)); \
423                 if (ret < 0)                                                   \
424                         return ret;                                            \
425         } while (0)
426 
427 /**
428  * mipi_dsi_dcs_write_seq_multi - transmit a DCS command with payload
429  *
430  * This macro will print errors for you and error handling is optimized for
431  * callers that call this multiple times in a row.
432  *
433  * @ctx: Context for multiple DSI transactions
434  * @cmd: Command
435  * @seq: buffer containing data to be transmitted
436  */
437 #define mipi_dsi_dcs_write_seq_multi(ctx, cmd, seq...)                  \
438         do {                                                            \
439                 static const u8 d[] = { cmd, seq };                     \
440                 mipi_dsi_dcs_write_buffer_multi(ctx, d, ARRAY_SIZE(d)); \
441         } while (0)
442 
443 /**
444  * struct mipi_dsi_driver - DSI driver
445  * @driver: device driver model driver
446  * @probe: callback for device binding
447  * @remove: callback for device unbinding
448  * @shutdown: called at shutdown time to quiesce the device
449  */
450 struct mipi_dsi_driver {
451         struct device_driver driver;
452         int(*probe)(struct mipi_dsi_device *dsi);
453         void (*remove)(struct mipi_dsi_device *dsi);
454         void (*shutdown)(struct mipi_dsi_device *dsi);
455 };
456 
457 static inline struct mipi_dsi_driver *
458 to_mipi_dsi_driver(struct device_driver *driver)
459 {
460         return container_of(driver, struct mipi_dsi_driver, driver);
461 }
462 
463 static inline void *mipi_dsi_get_drvdata(const struct mipi_dsi_device *dsi)
464 {
465         return dev_get_drvdata(&dsi->dev);
466 }
467 
468 static inline void mipi_dsi_set_drvdata(struct mipi_dsi_device *dsi, void *data)
469 {
470         dev_set_drvdata(&dsi->dev, data);
471 }
472 
473 int mipi_dsi_driver_register_full(struct mipi_dsi_driver *driver,
474                                   struct module *owner);
475 void mipi_dsi_driver_unregister(struct mipi_dsi_driver *driver);
476 
477 #define mipi_dsi_driver_register(driver) \
478         mipi_dsi_driver_register_full(driver, THIS_MODULE)
479 
480 #define module_mipi_dsi_driver(__mipi_dsi_driver) \
481         module_driver(__mipi_dsi_driver, mipi_dsi_driver_register, \
482                         mipi_dsi_driver_unregister)
483 
484 #endif /* __DRM_MIPI_DSI__ */
485 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php