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