Subversion Repositories Kolibri OS

Rev

Rev 6936 | Details | Compare with Previous | Last modification | View Log | RSS feed

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