1 /*
2  * Copyright © 2010 Intel Corporation
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the "Software"),
6  * to deal in the Software without restriction, including without limitation
7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8  * and/or sell copies of the Software, and to permit persons to whom the
9  * Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice (including the next
12  * paragraph) shall be included in all copies or substantial portions of the
13  * Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21  * DEALINGS IN THE SOFTWARE.
22  *
23  * Authors:
24  * Jackie Li<yaodong.li@intel.com>
25  */
26 
27 #include <linux/delay.h>
28 #include <linux/freezer.h>
29 
30 #include <video/mipi_display.h>
31 
32 #include "mdfld_dsi_dpi.h"
33 #include "mdfld_dsi_output.h"
34 #include "mdfld_dsi_pkg_sender.h"
35 
36 #define MDFLD_DSI_READ_MAX_COUNT		5000
37 
38 enum {
39 	MDFLD_DSI_PANEL_MODE_SLEEP = 0x1,
40 };
41 
42 enum {
43 	MDFLD_DSI_PKG_SENDER_FREE = 0x0,
44 	MDFLD_DSI_PKG_SENDER_BUSY = 0x1,
45 };
46 
47 static const char *const dsi_errors[] = {
48 	"RX SOT Error",
49 	"RX SOT Sync Error",
50 	"RX EOT Sync Error",
51 	"RX Escape Mode Entry Error",
52 	"RX LP TX Sync Error",
53 	"RX HS Receive Timeout Error",
54 	"RX False Control Error",
55 	"RX ECC Single Bit Error",
56 	"RX ECC Multibit Error",
57 	"RX Checksum Error",
58 	"RX DSI Data Type Not Recognised",
59 	"RX DSI VC ID Invalid",
60 	"TX False Control Error",
61 	"TX ECC Single Bit Error",
62 	"TX ECC Multibit Error",
63 	"TX Checksum Error",
64 	"TX DSI Data Type Not Recognised",
65 	"TX DSI VC ID invalid",
66 	"High Contention",
67 	"Low contention",
68 	"DPI FIFO Under run",
69 	"HS TX Timeout",
70 	"LP RX Timeout",
71 	"Turn Around ACK Timeout",
72 	"ACK With No Error",
73 	"RX Invalid TX Length",
74 	"RX Prot Violation",
75 	"HS Generic Write FIFO Full",
76 	"LP Generic Write FIFO Full",
77 	"Generic Read Data Avail",
78 	"Special Packet Sent",
79 	"Tearing Effect",
80 };
81 
wait_for_gen_fifo_empty(struct mdfld_dsi_pkg_sender * sender,u32 mask)82 static inline int wait_for_gen_fifo_empty(struct mdfld_dsi_pkg_sender *sender,
83 						u32 mask)
84 {
85 	struct drm_device *dev = sender->dev;
86 	u32 gen_fifo_stat_reg = sender->mipi_gen_fifo_stat_reg;
87 	int retry = 0xffff;
88 
89 	while (retry--) {
90 		if ((mask & REG_READ(gen_fifo_stat_reg)) == mask)
91 			return 0;
92 		udelay(100);
93 	}
94 	DRM_ERROR("fifo is NOT empty 0x%08x\n", REG_READ(gen_fifo_stat_reg));
95 	return -EIO;
96 }
97 
wait_for_all_fifos_empty(struct mdfld_dsi_pkg_sender * sender)98 static int wait_for_all_fifos_empty(struct mdfld_dsi_pkg_sender *sender)
99 {
100 	return wait_for_gen_fifo_empty(sender, (BIT(2) | BIT(10) | BIT(18) |
101 						BIT(26) | BIT(27) | BIT(28)));
102 }
103 
wait_for_lp_fifos_empty(struct mdfld_dsi_pkg_sender * sender)104 static int wait_for_lp_fifos_empty(struct mdfld_dsi_pkg_sender *sender)
105 {
106 	return wait_for_gen_fifo_empty(sender, (BIT(10) | BIT(26)));
107 }
108 
wait_for_hs_fifos_empty(struct mdfld_dsi_pkg_sender * sender)109 static int wait_for_hs_fifos_empty(struct mdfld_dsi_pkg_sender *sender)
110 {
111 	return wait_for_gen_fifo_empty(sender, (BIT(2) | BIT(18)));
112 }
113 
handle_dsi_error(struct mdfld_dsi_pkg_sender * sender,u32 mask)114 static int handle_dsi_error(struct mdfld_dsi_pkg_sender *sender, u32 mask)
115 {
116 	u32 intr_stat_reg = sender->mipi_intr_stat_reg;
117 	struct drm_device *dev = sender->dev;
118 
119 	dev_dbg(sender->dev->dev, "Handling error 0x%08x\n", mask);
120 
121 	switch (mask) {
122 	case BIT(0):
123 	case BIT(1):
124 	case BIT(2):
125 	case BIT(3):
126 	case BIT(4):
127 	case BIT(5):
128 	case BIT(6):
129 	case BIT(7):
130 	case BIT(8):
131 	case BIT(9):
132 	case BIT(10):
133 	case BIT(11):
134 	case BIT(12):
135 	case BIT(13):
136 		dev_dbg(sender->dev->dev, "No Action required\n");
137 		break;
138 	case BIT(14):
139 		/*wait for all fifo empty*/
140 		/*wait_for_all_fifos_empty(sender)*/
141 		break;
142 	case BIT(15):
143 		dev_dbg(sender->dev->dev, "No Action required\n");
144 		break;
145 	case BIT(16):
146 		break;
147 	case BIT(17):
148 		break;
149 	case BIT(18):
150 	case BIT(19):
151 		dev_dbg(sender->dev->dev, "High/Low contention detected\n");
152 		/*wait for contention recovery time*/
153 		/*mdelay(10);*/
154 		/*wait for all fifo empty*/
155 		if (0)
156 			wait_for_all_fifos_empty(sender);
157 		break;
158 	case BIT(20):
159 		dev_dbg(sender->dev->dev, "No Action required\n");
160 		break;
161 	case BIT(21):
162 		/*wait for all fifo empty*/
163 		/*wait_for_all_fifos_empty(sender);*/
164 		break;
165 	case BIT(22):
166 		break;
167 	case BIT(23):
168 	case BIT(24):
169 	case BIT(25):
170 	case BIT(26):
171 	case BIT(27):
172 		dev_dbg(sender->dev->dev, "HS Gen fifo full\n");
173 		REG_WRITE(intr_stat_reg, mask);
174 		wait_for_hs_fifos_empty(sender);
175 		break;
176 	case BIT(28):
177 		dev_dbg(sender->dev->dev, "LP Gen fifo full\n");
178 		REG_WRITE(intr_stat_reg, mask);
179 		wait_for_lp_fifos_empty(sender);
180 		break;
181 	case BIT(29):
182 	case BIT(30):
183 	case BIT(31):
184 		dev_dbg(sender->dev->dev, "No Action required\n");
185 		break;
186 	}
187 
188 	if (mask & REG_READ(intr_stat_reg))
189 		dev_dbg(sender->dev->dev,
190 				"Cannot clean interrupt 0x%08x\n", mask);
191 	return 0;
192 }
193 
dsi_error_handler(struct mdfld_dsi_pkg_sender * sender)194 static int dsi_error_handler(struct mdfld_dsi_pkg_sender *sender)
195 {
196 	struct drm_device *dev = sender->dev;
197 	u32 intr_stat_reg = sender->mipi_intr_stat_reg;
198 	u32 mask;
199 	u32 intr_stat;
200 	int i;
201 	int err = 0;
202 
203 	intr_stat = REG_READ(intr_stat_reg);
204 
205 	for (i = 0; i < 32; i++) {
206 		mask = (0x00000001UL) << i;
207 		if (intr_stat & mask) {
208 			dev_dbg(sender->dev->dev, "[DSI]: %s\n", dsi_errors[i]);
209 			err = handle_dsi_error(sender, mask);
210 			if (err)
211 				DRM_ERROR("Cannot handle error\n");
212 		}
213 	}
214 	return err;
215 }
216 
send_short_pkg(struct mdfld_dsi_pkg_sender * sender,u8 data_type,u8 cmd,u8 param,bool hs)217 static int send_short_pkg(struct mdfld_dsi_pkg_sender *sender, u8 data_type,
218 			u8 cmd, u8 param, bool hs)
219 {
220 	struct drm_device *dev = sender->dev;
221 	u32 ctrl_reg;
222 	u32 val;
223 	u8 virtual_channel = 0;
224 
225 	if (hs) {
226 		ctrl_reg = sender->mipi_hs_gen_ctrl_reg;
227 
228 		/* FIXME: wait_for_hs_fifos_empty(sender); */
229 	} else {
230 		ctrl_reg = sender->mipi_lp_gen_ctrl_reg;
231 
232 		/* FIXME: wait_for_lp_fifos_empty(sender); */
233 	}
234 
235 	val = FLD_VAL(param, 23, 16) | FLD_VAL(cmd, 15, 8) |
236 		FLD_VAL(virtual_channel, 7, 6) | FLD_VAL(data_type, 5, 0);
237 
238 	REG_WRITE(ctrl_reg, val);
239 
240 	return 0;
241 }
242 
send_long_pkg(struct mdfld_dsi_pkg_sender * sender,u8 data_type,u8 * data,int len,bool hs)243 static int send_long_pkg(struct mdfld_dsi_pkg_sender *sender, u8 data_type,
244 			u8 *data, int len, bool hs)
245 {
246 	struct drm_device *dev = sender->dev;
247 	u32 ctrl_reg;
248 	u32 data_reg;
249 	u32 val;
250 	u8 *p;
251 	u8 b1, b2, b3, b4;
252 	u8 virtual_channel = 0;
253 	int i;
254 
255 	if (hs) {
256 		ctrl_reg = sender->mipi_hs_gen_ctrl_reg;
257 		data_reg = sender->mipi_hs_gen_data_reg;
258 
259 		/* FIXME: wait_for_hs_fifos_empty(sender); */
260 	} else {
261 		ctrl_reg = sender->mipi_lp_gen_ctrl_reg;
262 		data_reg = sender->mipi_lp_gen_data_reg;
263 
264 		/* FIXME: wait_for_lp_fifos_empty(sender); */
265 	}
266 
267 	p = data;
268 	for (i = 0; i < len / 4; i++) {
269 		b1 = *p++;
270 		b2 = *p++;
271 		b3 = *p++;
272 		b4 = *p++;
273 
274 		REG_WRITE(data_reg, b4 << 24 | b3 << 16 | b2 << 8 | b1);
275 	}
276 
277 	i = len % 4;
278 	if (i) {
279 		b1 = 0; b2 = 0; b3 = 0;
280 
281 		switch (i) {
282 		case 3:
283 			b1 = *p++;
284 			b2 = *p++;
285 			b3 = *p++;
286 			break;
287 		case 2:
288 			b1 = *p++;
289 			b2 = *p++;
290 			break;
291 		case 1:
292 			b1 = *p++;
293 			break;
294 		}
295 
296 		REG_WRITE(data_reg, b3 << 16 | b2 << 8 | b1);
297 	}
298 
299 	val = FLD_VAL(len, 23, 8) | FLD_VAL(virtual_channel, 7, 6) |
300 		FLD_VAL(data_type, 5, 0);
301 
302 	REG_WRITE(ctrl_reg, val);
303 
304 	return 0;
305 }
306 
send_pkg_prepare(struct mdfld_dsi_pkg_sender * sender,u8 data_type,u8 * data,u16 len)307 static int send_pkg_prepare(struct mdfld_dsi_pkg_sender *sender, u8 data_type,
308 			u8 *data, u16 len)
309 {
310 	u8 cmd;
311 
312 	switch (data_type) {
313 	case MIPI_DSI_DCS_SHORT_WRITE:
314 	case MIPI_DSI_DCS_SHORT_WRITE_PARAM:
315 	case MIPI_DSI_DCS_LONG_WRITE:
316 		cmd = *data;
317 		break;
318 	default:
319 		return 0;
320 	}
321 
322 	/*this prevents other package sending while doing msleep*/
323 	sender->status = MDFLD_DSI_PKG_SENDER_BUSY;
324 
325 	/*wait for 120 milliseconds in case exit_sleep_mode just be sent*/
326 	if (unlikely(cmd == MIPI_DCS_ENTER_SLEEP_MODE)) {
327 		/*TODO: replace it with msleep later*/
328 		mdelay(120);
329 	}
330 
331 	if (unlikely(cmd == MIPI_DCS_EXIT_SLEEP_MODE)) {
332 		/*TODO: replace it with msleep later*/
333 		mdelay(120);
334 	}
335 	return 0;
336 }
337 
send_pkg_done(struct mdfld_dsi_pkg_sender * sender,u8 data_type,u8 * data,u16 len)338 static int send_pkg_done(struct mdfld_dsi_pkg_sender *sender, u8 data_type,
339 			u8 *data, u16 len)
340 {
341 	u8 cmd;
342 
343 	switch (data_type) {
344 	case MIPI_DSI_DCS_SHORT_WRITE:
345 	case MIPI_DSI_DCS_SHORT_WRITE_PARAM:
346 	case MIPI_DSI_DCS_LONG_WRITE:
347 		cmd = *data;
348 		break;
349 	default:
350 		return 0;
351 	}
352 
353 	/*update panel status*/
354 	if (unlikely(cmd == MIPI_DCS_ENTER_SLEEP_MODE)) {
355 		sender->panel_mode |= MDFLD_DSI_PANEL_MODE_SLEEP;
356 		/*TODO: replace it with msleep later*/
357 		mdelay(120);
358 	} else if (unlikely(cmd == MIPI_DCS_EXIT_SLEEP_MODE)) {
359 		sender->panel_mode &= ~MDFLD_DSI_PANEL_MODE_SLEEP;
360 		/*TODO: replace it with msleep later*/
361 		mdelay(120);
362 	} else if (unlikely(cmd == MIPI_DCS_SOFT_RESET)) {
363 		/*TODO: replace it with msleep later*/
364 		mdelay(5);
365 	}
366 
367 	sender->status = MDFLD_DSI_PKG_SENDER_FREE;
368 
369 	return 0;
370 }
371 
send_pkg(struct mdfld_dsi_pkg_sender * sender,u8 data_type,u8 * data,u16 len,bool hs)372 static int send_pkg(struct mdfld_dsi_pkg_sender *sender, u8 data_type,
373 		u8 *data, u16 len, bool hs)
374 {
375 	int ret;
376 
377 	/*handle DSI error*/
378 	ret = dsi_error_handler(sender);
379 	if (ret) {
380 		DRM_ERROR("Error handling failed\n");
381 		return -EAGAIN;
382 	}
383 
384 	/* send pkg */
385 	if (sender->status == MDFLD_DSI_PKG_SENDER_BUSY) {
386 		DRM_ERROR("sender is busy\n");
387 		return -EAGAIN;
388 	}
389 
390 	ret = send_pkg_prepare(sender, data_type, data, len);
391 	if (ret) {
392 		DRM_ERROR("send_pkg_prepare error\n");
393 		return ret;
394 	}
395 
396 	switch (data_type) {
397 	case MIPI_DSI_GENERIC_SHORT_WRITE_0_PARAM:
398 	case MIPI_DSI_GENERIC_SHORT_WRITE_1_PARAM:
399 	case MIPI_DSI_GENERIC_SHORT_WRITE_2_PARAM:
400 	case MIPI_DSI_GENERIC_READ_REQUEST_0_PARAM:
401 	case MIPI_DSI_GENERIC_READ_REQUEST_1_PARAM:
402 	case MIPI_DSI_GENERIC_READ_REQUEST_2_PARAM:
403 	case MIPI_DSI_DCS_SHORT_WRITE:
404 	case MIPI_DSI_DCS_SHORT_WRITE_PARAM:
405 	case MIPI_DSI_DCS_READ:
406 		ret = send_short_pkg(sender, data_type, data[0], data[1], hs);
407 		break;
408 	case MIPI_DSI_GENERIC_LONG_WRITE:
409 	case MIPI_DSI_DCS_LONG_WRITE:
410 		ret = send_long_pkg(sender, data_type, data, len, hs);
411 		break;
412 	}
413 
414 	send_pkg_done(sender, data_type, data, len);
415 
416 	/*FIXME: should I query complete and fifo empty here?*/
417 
418 	return ret;
419 }
420 
mdfld_dsi_send_mcs_long(struct mdfld_dsi_pkg_sender * sender,u8 * data,u32 len,bool hs)421 int mdfld_dsi_send_mcs_long(struct mdfld_dsi_pkg_sender *sender, u8 *data,
422 			u32 len, bool hs)
423 {
424 	unsigned long flags;
425 
426 	if (!sender || !data || !len) {
427 		DRM_ERROR("Invalid parameters\n");
428 		return -EINVAL;
429 	}
430 
431 	spin_lock_irqsave(&sender->lock, flags);
432 	send_pkg(sender, MIPI_DSI_DCS_LONG_WRITE, data, len, hs);
433 	spin_unlock_irqrestore(&sender->lock, flags);
434 
435 	return 0;
436 }
437 
mdfld_dsi_send_mcs_short(struct mdfld_dsi_pkg_sender * sender,u8 cmd,u8 param,u8 param_num,bool hs)438 int mdfld_dsi_send_mcs_short(struct mdfld_dsi_pkg_sender *sender, u8 cmd,
439 			u8 param, u8 param_num, bool hs)
440 {
441 	u8 data[2];
442 	unsigned long flags;
443 	u8 data_type;
444 
445 	if (!sender) {
446 		DRM_ERROR("Invalid parameter\n");
447 		return -EINVAL;
448 	}
449 
450 	data[0] = cmd;
451 
452 	if (param_num) {
453 		data_type = MIPI_DSI_DCS_SHORT_WRITE_PARAM;
454 		data[1] = param;
455 	} else {
456 		data_type = MIPI_DSI_DCS_SHORT_WRITE;
457 		data[1] = 0;
458 	}
459 
460 	spin_lock_irqsave(&sender->lock, flags);
461 	send_pkg(sender, data_type, data, sizeof(data), hs);
462 	spin_unlock_irqrestore(&sender->lock, flags);
463 
464 	return 0;
465 }
466 
mdfld_dsi_send_gen_short(struct mdfld_dsi_pkg_sender * sender,u8 param0,u8 param1,u8 param_num,bool hs)467 int mdfld_dsi_send_gen_short(struct mdfld_dsi_pkg_sender *sender, u8 param0,
468 			u8 param1, u8 param_num, bool hs)
469 {
470 	u8 data[2];
471 	unsigned long flags;
472 	u8 data_type;
473 
474 	if (!sender || param_num > 2) {
475 		DRM_ERROR("Invalid parameter\n");
476 		return -EINVAL;
477 	}
478 
479 	switch (param_num) {
480 	case 0:
481 		data_type = MIPI_DSI_GENERIC_SHORT_WRITE_0_PARAM;
482 		data[0] = 0;
483 		data[1] = 0;
484 		break;
485 	case 1:
486 		data_type = MIPI_DSI_GENERIC_SHORT_WRITE_1_PARAM;
487 		data[0] = param0;
488 		data[1] = 0;
489 		break;
490 	case 2:
491 		data_type = MIPI_DSI_GENERIC_SHORT_WRITE_2_PARAM;
492 		data[0] = param0;
493 		data[1] = param1;
494 		break;
495 	}
496 
497 	spin_lock_irqsave(&sender->lock, flags);
498 	send_pkg(sender, data_type, data, sizeof(data), hs);
499 	spin_unlock_irqrestore(&sender->lock, flags);
500 
501 	return 0;
502 }
503 
mdfld_dsi_send_gen_long(struct mdfld_dsi_pkg_sender * sender,u8 * data,u32 len,bool hs)504 int mdfld_dsi_send_gen_long(struct mdfld_dsi_pkg_sender *sender, u8 *data,
505 			u32 len, bool hs)
506 {
507 	unsigned long flags;
508 
509 	if (!sender || !data || !len) {
510 		DRM_ERROR("Invalid parameters\n");
511 		return -EINVAL;
512 	}
513 
514 	spin_lock_irqsave(&sender->lock, flags);
515 	send_pkg(sender, MIPI_DSI_GENERIC_LONG_WRITE, data, len, hs);
516 	spin_unlock_irqrestore(&sender->lock, flags);
517 
518 	return 0;
519 }
520 
__read_panel_data(struct mdfld_dsi_pkg_sender * sender,u8 data_type,u8 * data,u16 len,u32 * data_out,u16 len_out,bool hs)521 static int __read_panel_data(struct mdfld_dsi_pkg_sender *sender, u8 data_type,
522 			u8 *data, u16 len, u32 *data_out, u16 len_out, bool hs)
523 {
524 	unsigned long flags;
525 	struct drm_device *dev;
526 	int i;
527 	u32 gen_data_reg;
528 	int retry = MDFLD_DSI_READ_MAX_COUNT;
529 
530 	if (!sender || !data_out || !len_out) {
531 		DRM_ERROR("Invalid parameters\n");
532 		return -EINVAL;
533 	}
534 
535 	dev = sender->dev;
536 
537 	/**
538 	 * do reading.
539 	 * 0) send out generic read request
540 	 * 1) polling read data avail interrupt
541 	 * 2) read data
542 	 */
543 	spin_lock_irqsave(&sender->lock, flags);
544 
545 	REG_WRITE(sender->mipi_intr_stat_reg, BIT(29));
546 
547 	if ((REG_READ(sender->mipi_intr_stat_reg) & BIT(29)))
548 		DRM_ERROR("Can NOT clean read data valid interrupt\n");
549 
550 	/*send out read request*/
551 	send_pkg(sender, data_type, data, len, hs);
552 
553 	/*polling read data avail interrupt*/
554 	while (retry && !(REG_READ(sender->mipi_intr_stat_reg) & BIT(29))) {
555 		udelay(100);
556 		retry--;
557 	}
558 
559 	if (!retry) {
560 		spin_unlock_irqrestore(&sender->lock, flags);
561 		return -ETIMEDOUT;
562 	}
563 
564 	REG_WRITE(sender->mipi_intr_stat_reg, BIT(29));
565 
566 	/*read data*/
567 	if (hs)
568 		gen_data_reg = sender->mipi_hs_gen_data_reg;
569 	else
570 		gen_data_reg = sender->mipi_lp_gen_data_reg;
571 
572 	for (i = 0; i < len_out; i++)
573 		*(data_out + i) = REG_READ(gen_data_reg);
574 
575 	spin_unlock_irqrestore(&sender->lock, flags);
576 
577 	return 0;
578 }
579 
mdfld_dsi_read_mcs(struct mdfld_dsi_pkg_sender * sender,u8 cmd,u32 * data,u16 len,bool hs)580 int mdfld_dsi_read_mcs(struct mdfld_dsi_pkg_sender *sender, u8 cmd,
581 		u32 *data, u16 len, bool hs)
582 {
583 	if (!sender || !data || !len) {
584 		DRM_ERROR("Invalid parameters\n");
585 		return -EINVAL;
586 	}
587 
588 	return __read_panel_data(sender, MIPI_DSI_DCS_READ, &cmd, 1,
589 				data, len, hs);
590 }
591 
mdfld_dsi_pkg_sender_init(struct mdfld_dsi_connector * dsi_connector,int pipe)592 int mdfld_dsi_pkg_sender_init(struct mdfld_dsi_connector *dsi_connector,
593 								int pipe)
594 {
595 	struct mdfld_dsi_pkg_sender *pkg_sender;
596 	struct mdfld_dsi_config *dsi_config =
597 				mdfld_dsi_get_config(dsi_connector);
598 	struct drm_device *dev = dsi_config->dev;
599 	struct drm_psb_private *dev_priv = dev->dev_private;
600 	const struct psb_offset *map = &dev_priv->regmap[pipe];
601 	u32 mipi_val = 0;
602 
603 	if (!dsi_connector) {
604 		DRM_ERROR("Invalid parameter\n");
605 		return -EINVAL;
606 	}
607 
608 	pkg_sender = dsi_connector->pkg_sender;
609 
610 	if (!pkg_sender || IS_ERR(pkg_sender)) {
611 		pkg_sender = kzalloc(sizeof(struct mdfld_dsi_pkg_sender),
612 								GFP_KERNEL);
613 		if (!pkg_sender) {
614 			DRM_ERROR("Create DSI pkg sender failed\n");
615 			return -ENOMEM;
616 		}
617 		dsi_connector->pkg_sender = (void *)pkg_sender;
618 	}
619 
620 	pkg_sender->dev = dev;
621 	pkg_sender->dsi_connector = dsi_connector;
622 	pkg_sender->pipe = pipe;
623 	pkg_sender->pkg_num = 0;
624 	pkg_sender->panel_mode = 0;
625 	pkg_sender->status = MDFLD_DSI_PKG_SENDER_FREE;
626 
627 	/*init regs*/
628 	/* FIXME: should just copy the regmap ptr ? */
629 	pkg_sender->dpll_reg = map->dpll;
630 	pkg_sender->dspcntr_reg = map->cntr;
631 	pkg_sender->pipeconf_reg = map->conf;
632 	pkg_sender->dsplinoff_reg = map->linoff;
633 	pkg_sender->dspsurf_reg = map->surf;
634 	pkg_sender->pipestat_reg = map->status;
635 
636 	pkg_sender->mipi_intr_stat_reg = MIPI_INTR_STAT_REG(pipe);
637 	pkg_sender->mipi_lp_gen_data_reg = MIPI_LP_GEN_DATA_REG(pipe);
638 	pkg_sender->mipi_hs_gen_data_reg = MIPI_HS_GEN_DATA_REG(pipe);
639 	pkg_sender->mipi_lp_gen_ctrl_reg = MIPI_LP_GEN_CTRL_REG(pipe);
640 	pkg_sender->mipi_hs_gen_ctrl_reg = MIPI_HS_GEN_CTRL_REG(pipe);
641 	pkg_sender->mipi_gen_fifo_stat_reg = MIPI_GEN_FIFO_STAT_REG(pipe);
642 	pkg_sender->mipi_data_addr_reg = MIPI_DATA_ADD_REG(pipe);
643 	pkg_sender->mipi_data_len_reg = MIPI_DATA_LEN_REG(pipe);
644 	pkg_sender->mipi_cmd_addr_reg = MIPI_CMD_ADD_REG(pipe);
645 	pkg_sender->mipi_cmd_len_reg = MIPI_CMD_LEN_REG(pipe);
646 
647 	/*init lock*/
648 	spin_lock_init(&pkg_sender->lock);
649 
650 	if (mdfld_get_panel_type(dev, pipe) != TC35876X) {
651 		/**
652 		 * For video mode, don't enable DPI timing output here,
653 		 * will init the DPI timing output during mode setting.
654 		 */
655 		mipi_val = PASS_FROM_SPHY_TO_AFE | SEL_FLOPPED_HSTX;
656 
657 		if (pipe == 0)
658 			mipi_val |= 0x2;
659 
660 		REG_WRITE(MIPI_PORT_CONTROL(pipe), mipi_val);
661 		REG_READ(MIPI_PORT_CONTROL(pipe));
662 
663 		/* do dsi controller init */
664 		mdfld_dsi_controller_init(dsi_config, pipe);
665 	}
666 
667 	return 0;
668 }
669 
mdfld_dsi_pkg_sender_destroy(struct mdfld_dsi_pkg_sender * sender)670 void mdfld_dsi_pkg_sender_destroy(struct mdfld_dsi_pkg_sender *sender)
671 {
672 	if (!sender || IS_ERR(sender))
673 		return;
674 
675 	/*free*/
676 	kfree(sender);
677 }
678 
679 
680