1
2
3
4
5
6
7
8
9#ifndef __DRM_MIPI_DSI_H__
10#define __DRM_MIPI_DSI_H__
11
12#include <linux/device.h>
13
14struct mipi_dsi_host;
15struct mipi_dsi_device;
16struct drm_dsc_picture_parameter_set;
17
18
19#define MIPI_DSI_MSG_REQ_ACK BIT(0)
20
21#define MIPI_DSI_MSG_USE_LPM BIT(1)
22
23
24
25
26
27
28
29
30
31
32
33struct mipi_dsi_msg {
34 u8 channel;
35 u8 type;
36 u16 flags;
37
38 size_t tx_len;
39 const void *tx_buf;
40
41 size_t rx_len;
42 void *rx_buf;
43};
44
45bool mipi_dsi_packet_format_is_short(u8 type);
46bool mipi_dsi_packet_format_is_long(u8 type);
47
48
49
50
51
52
53
54
55
56struct mipi_dsi_packet {
57 size_t size;
58 u8 header[4];
59 size_t payload_length;
60 const u8 *payload;
61};
62
63int mipi_dsi_create_packet(struct mipi_dsi_packet *packet,
64 const struct mipi_dsi_msg *msg);
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89struct mipi_dsi_host_ops {
90 int (*attach)(struct mipi_dsi_host *host,
91 struct mipi_dsi_device *dsi);
92 int (*detach)(struct mipi_dsi_host *host,
93 struct mipi_dsi_device *dsi);
94 ssize_t (*transfer)(struct mipi_dsi_host *host,
95 const struct mipi_dsi_msg *msg);
96};
97
98
99
100
101
102
103
104struct mipi_dsi_host {
105 struct device *dev;
106 const struct mipi_dsi_host_ops *ops;
107 struct list_head list;
108};
109
110int mipi_dsi_host_register(struct mipi_dsi_host *host);
111void mipi_dsi_host_unregister(struct mipi_dsi_host *host);
112struct mipi_dsi_host *of_find_mipi_dsi_host_by_node(struct device_node *node);
113
114
115
116
117#define MIPI_DSI_MODE_VIDEO BIT(0)
118
119#define MIPI_DSI_MODE_VIDEO_BURST BIT(1)
120
121#define MIPI_DSI_MODE_VIDEO_SYNC_PULSE BIT(2)
122
123#define MIPI_DSI_MODE_VIDEO_AUTO_VERT BIT(3)
124
125#define MIPI_DSI_MODE_VIDEO_HSE BIT(4)
126
127#define MIPI_DSI_MODE_VIDEO_NO_HFP BIT(5)
128
129#define MIPI_DSI_MODE_VIDEO_NO_HBP BIT(6)
130
131#define MIPI_DSI_MODE_VIDEO_NO_HSA BIT(7)
132
133#define MIPI_DSI_MODE_VSYNC_FLUSH BIT(8)
134
135#define MIPI_DSI_MODE_NO_EOT_PACKET BIT(9)
136
137#define MIPI_DSI_CLOCK_NON_CONTINUOUS BIT(10)
138
139#define MIPI_DSI_MODE_LPM BIT(11)
140
141enum mipi_dsi_pixel_format {
142 MIPI_DSI_FMT_RGB888,
143 MIPI_DSI_FMT_RGB666,
144 MIPI_DSI_FMT_RGB666_PACKED,
145 MIPI_DSI_FMT_RGB565,
146};
147
148#define DSI_DEV_NAME_SIZE 20
149
150
151
152
153
154
155
156
157
158
159struct mipi_dsi_device_info {
160 char type[DSI_DEV_NAME_SIZE];
161 u32 channel;
162 struct device_node *node;
163};
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181struct mipi_dsi_device {
182 struct mipi_dsi_host *host;
183 struct device dev;
184
185 char name[DSI_DEV_NAME_SIZE];
186 unsigned int channel;
187 unsigned int lanes;
188 enum mipi_dsi_pixel_format format;
189 unsigned long mode_flags;
190 unsigned long hs_rate;
191 unsigned long lp_rate;
192};
193
194#define MIPI_DSI_MODULE_PREFIX "mipi-dsi:"
195
196static inline struct mipi_dsi_device *to_mipi_dsi_device(struct device *dev)
197{
198 return container_of(dev, struct mipi_dsi_device, dev);
199}
200
201
202
203
204
205
206
207
208
209static inline int mipi_dsi_pixel_format_to_bpp(enum mipi_dsi_pixel_format fmt)
210{
211 switch (fmt) {
212 case MIPI_DSI_FMT_RGB888:
213 case MIPI_DSI_FMT_RGB666:
214 return 24;
215
216 case MIPI_DSI_FMT_RGB666_PACKED:
217 return 18;
218
219 case MIPI_DSI_FMT_RGB565:
220 return 16;
221 }
222
223 return -EINVAL;
224}
225
226struct mipi_dsi_device *
227mipi_dsi_device_register_full(struct mipi_dsi_host *host,
228 const struct mipi_dsi_device_info *info);
229void mipi_dsi_device_unregister(struct mipi_dsi_device *dsi);
230struct mipi_dsi_device *of_find_mipi_dsi_device_by_node(struct device_node *np);
231int mipi_dsi_attach(struct mipi_dsi_device *dsi);
232int mipi_dsi_detach(struct mipi_dsi_device *dsi);
233int mipi_dsi_shutdown_peripheral(struct mipi_dsi_device *dsi);
234int mipi_dsi_turn_on_peripheral(struct mipi_dsi_device *dsi);
235int mipi_dsi_set_maximum_return_packet_size(struct mipi_dsi_device *dsi,
236 u16 value);
237ssize_t mipi_dsi_compression_mode(struct mipi_dsi_device *dsi, bool enable);
238ssize_t mipi_dsi_picture_parameter_set(struct mipi_dsi_device *dsi,
239 const struct drm_dsc_picture_parameter_set *pps);
240
241ssize_t mipi_dsi_generic_write(struct mipi_dsi_device *dsi, const void *payload,
242 size_t size);
243ssize_t mipi_dsi_generic_read(struct mipi_dsi_device *dsi, const void *params,
244 size_t num_params, void *data, size_t size);
245
246
247
248
249
250
251
252
253enum mipi_dsi_dcs_tear_mode {
254 MIPI_DSI_DCS_TEAR_MODE_VBLANK,
255 MIPI_DSI_DCS_TEAR_MODE_VHBLANK,
256};
257
258#define MIPI_DSI_DCS_POWER_MODE_DISPLAY (1 << 2)
259#define MIPI_DSI_DCS_POWER_MODE_NORMAL (1 << 3)
260#define MIPI_DSI_DCS_POWER_MODE_SLEEP (1 << 4)
261#define MIPI_DSI_DCS_POWER_MODE_PARTIAL (1 << 5)
262#define MIPI_DSI_DCS_POWER_MODE_IDLE (1 << 6)
263
264ssize_t mipi_dsi_dcs_write_buffer(struct mipi_dsi_device *dsi,
265 const void *data, size_t len);
266ssize_t mipi_dsi_dcs_write(struct mipi_dsi_device *dsi, u8 cmd,
267 const void *data, size_t len);
268ssize_t mipi_dsi_dcs_read(struct mipi_dsi_device *dsi, u8 cmd, void *data,
269 size_t len);
270int mipi_dsi_dcs_nop(struct mipi_dsi_device *dsi);
271int mipi_dsi_dcs_soft_reset(struct mipi_dsi_device *dsi);
272int mipi_dsi_dcs_get_power_mode(struct mipi_dsi_device *dsi, u8 *mode);
273int mipi_dsi_dcs_get_pixel_format(struct mipi_dsi_device *dsi, u8 *format);
274int mipi_dsi_dcs_enter_sleep_mode(struct mipi_dsi_device *dsi);
275int mipi_dsi_dcs_exit_sleep_mode(struct mipi_dsi_device *dsi);
276int mipi_dsi_dcs_set_display_off(struct mipi_dsi_device *dsi);
277int mipi_dsi_dcs_set_display_on(struct mipi_dsi_device *dsi);
278int mipi_dsi_dcs_set_column_address(struct mipi_dsi_device *dsi, u16 start,
279 u16 end);
280int mipi_dsi_dcs_set_page_address(struct mipi_dsi_device *dsi, u16 start,
281 u16 end);
282int mipi_dsi_dcs_set_tear_off(struct mipi_dsi_device *dsi);
283int mipi_dsi_dcs_set_tear_on(struct mipi_dsi_device *dsi,
284 enum mipi_dsi_dcs_tear_mode mode);
285int mipi_dsi_dcs_set_pixel_format(struct mipi_dsi_device *dsi, u8 format);
286int mipi_dsi_dcs_set_tear_scanline(struct mipi_dsi_device *dsi, u16 scanline);
287int mipi_dsi_dcs_set_display_brightness(struct mipi_dsi_device *dsi,
288 u16 brightness);
289int mipi_dsi_dcs_get_display_brightness(struct mipi_dsi_device *dsi,
290 u16 *brightness);
291
292
293
294
295
296
297
298
299struct mipi_dsi_driver {
300 struct device_driver driver;
301 int(*probe)(struct mipi_dsi_device *dsi);
302 int(*remove)(struct mipi_dsi_device *dsi);
303 void (*shutdown)(struct mipi_dsi_device *dsi);
304};
305
306static inline struct mipi_dsi_driver *
307to_mipi_dsi_driver(struct device_driver *driver)
308{
309 return container_of(driver, struct mipi_dsi_driver, driver);
310}
311
312static inline void *mipi_dsi_get_drvdata(const struct mipi_dsi_device *dsi)
313{
314 return dev_get_drvdata(&dsi->dev);
315}
316
317static inline void mipi_dsi_set_drvdata(struct mipi_dsi_device *dsi, void *data)
318{
319 dev_set_drvdata(&dsi->dev, data);
320}
321
322int mipi_dsi_driver_register_full(struct mipi_dsi_driver *driver,
323 struct module *owner);
324void mipi_dsi_driver_unregister(struct mipi_dsi_driver *driver);
325
326#define mipi_dsi_driver_register(driver) \
327 mipi_dsi_driver_register_full(driver, THIS_MODULE)
328
329#define module_mipi_dsi_driver(__mipi_dsi_driver) \
330 module_driver(__mipi_dsi_driver, mipi_dsi_driver_register, \
331 mipi_dsi_driver_unregister)
332
333#endif
334