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