1 /*
2  * Allwinner SoCs display driver.
3  *
4  * Copyright (C) 2016 Allwinner.
5  *
6  * This file is licensed under the terms of the GNU General Public
7  * License version 2.  This program is licensed "as is" without any
8  * warranty of any kind, whether express or implied.
9  */
10 
11 #ifndef __DE_DSI_TYPE_H__
12 #define __DE_DSI_TYPE_H__
13 
14 #include "de_lcd.h"
15 
16 union DSI_CTL0_t {
17     u32 dwval;
18     struct {
19         u32 module_en:1;
20         u32 res0:15;
21         u32 version:16;
22     } bits;
23 };
24 
25 union DSI_CTL1_t {
26     u32 dwval;
27     struct {
28         u32 phy_en:1;
29         u32 phy_rst:1;
30         u32 res0:2;
31         u32 phy_lane_num:2;
32         u32 res1:2;
33         u32 phy_clk_gating:1;
34         u32 phy_clk_lane_enable:1;
35         u32 res2:22;
36     } bits;
37 };
38 
39 union DSI_CTL2_t {
40     u32 dwval;
41     struct {
42         u32 lp_clk_div:8;
43         u32 res0:24;
44     } bits;
45 };
46 
47 union DSI_VID_CTL0_t {
48     u32 dwval;
49     struct {
50         u32 video_mode_en:1;
51         u32 res0:3;
52         u32 video_mode_cfg:2;
53         u32 res1:2;
54         u32 vsa_lp_en:1;
55         u32 vbp_lp_en:1;
56         u32 vact_lp_en:1;
57         u32 vfp_lp_en:1;
58         u32 hbp_lp_en:1;
59         u32 hfp_lp_en:1;
60         u32 res2:18;
61     } bits;
62 };
63 
64 union DSI_VID_CTL1_t {
65     u32 dwval;
66     struct {
67         u32 bta_per_frame:1;
68         u32 lp_cmd_en:1;
69         u32 res0:2;
70         u32 pkt_multi_en:1;
71         u32 pkt_null_in_hact:1;
72         u32 res1:2;
73         u32 pkt_num_per_line:10;
74         u32 res2:2;
75         u32 pkt_null_size:10;
76         u32 res3:2;
77     } bits;
78 };
79 
80 union DSI_VID_TIM0_t {
81     u32 dwval;
82     struct {
83         u32 vsa:4;
84         u32 res0:12;
85         u32 vbp:6;
86         u32 res1:10;
87     } bits;
88 };
89 
90 union DSI_VID_TIM1_t {
91     u32 dwval;
92     struct {
93         u32 vact:11;
94         u32 res0:5;
95         u32 vfp:6;
96         u32 res1:10;
97     } bits;
98 };
99 
100 union DSI_VID_TIM2_t {
101     u32 dwval;
102     struct {
103         u32 pixels_per_pkg:11;
104         u32 res0:5;
105         u32 ht:14;
106         u32 res1:2;
107     } bits;
108 };
109 
110 union DSI_VID_TIM3_t {
111     u32 dwval;
112     struct {
113         u32 hsa:9;
114         u32 res0:7;
115         u32 hbp:9;
116         u32 res1:7;
117     } bits;
118 };
119 
120 union DSI_DPI_CFG0_t {
121     u32 dwval;
122     struct {
123         u32 res0:8;
124         u32 dpi_format:3;
125         u32 res1:1;
126         u32 video_mode_format_18bit:1;
127         u32 res2:15;
128         u32 dpi_vid:2;
129         u32 res3:2;
130     } bits;
131 };
132 
133 union DSI_DPI_CFG1_t {
134     u32 dwval;
135     struct {
136         u32 vsync_ploarity:1;
137         u32 hsync_ploarity:1;
138         u32 res0:1;
139         u32 de_ploarity:1;
140         u32 shutd_polarity:1;
141         u32 colorm_polarity:1;
142         u32 res1:26;
143     } bits;
144 };
145 
146 union DSI_PKG_CTL0_t {
147     u32 dwval;
148     struct {
149         u32 dt:6;
150         u32 vc:2;
151         u32 wc:16;
152         u32 res0:8;
153     } bits;
154 };
155 
156 union DSI_PKG_CTL1_t {
157     u32 dwval;
158     struct {
159         u32 pld_byte1:8;
160         u32 pld_byte2:8;
161         u32 pld_byte3:8;
162         u32 pld_byte4:8;
163     } bits;
164 };
165 
166 union DSI_PKG_STATUS_t {
167     u32 dwval;
168     struct {
169         u32 fifo_cmd_empty:1;
170         u32 fifo_pld_w_empty:1;
171         u32 fifo_pld_r_empty:1;
172         u32 res0:1;
173         u32 fifo_cmd_full:1;
174         u32 fifo_pld_w_full:1;
175         u32 fifo_pld_r_full:1;
176         u32 res1:1;
177         u32 rd_cmd_busy:1;
178         u32 res2:23;
179     } bits;
180 };
181 
182 union DSI_PKG_CTL2_t {
183     u32 dwval;
184     struct {
185         u32 bta_en:1;
186         u32 res0:3;
187         u32 eotp_tx_en:1;
188         u32 res1:3;
189         u32 eotp_rx_en:1;
190         u32 ecc_rx_en:1;
191         u32 crc_rx_en:1;
192         u32 res2:17;
193         u32 vid_rx:2;
194         u32 res3:2;
195     } bits;
196 };
197 
198 union DSI_CMD_CTL_t {
199     u32 dwval;
200     struct {
201         u32 cmd_mode_en:1;
202         u32 res0:3;
203         u32 gen_sw_0p_tx_lp:1;
204         u32 gen_sw_1p_tx_lp:1;
205         u32 gen_sw_2p_tx_lp:1;
206         u32 gen_lw_tx_lp:1;
207         u32 gen_sr_0p_tx_lp:1;
208         u32 gen_sr_1p_tx_lp:1;
209         u32 gen_sr_2p_tx_lp:1;
210         u32 res1:1;
211         u32 dcs_sw_0p_tx_lp:1;
212         u32 dcs_sw_1p_tx_lp:1;
213         u32 dcs_lw_tx_lp:1;
214         u32 res2:1;
215         u32 dcs_sr_0p_tx_lp:1;
216         u32 res3:3;
217         u32 max_rd_pkg_size_lp:1;
218         u32 res4:3;
219         u32 pkg_ack_req:1;
220         u32 res5:3;
221         u32 te_ack_en:1;
222         u32 res6:3;
223     } bits;
224 };
225 
226 union DSI_DBI_CTL0_t {
227     u32 dwval;
228     struct {
229         u32 res0:4;
230         u32 dbi_in_format:4;
231         u32 dbi_out_format:4;
232         u32 lut_size_cfg:2;
233         u32 res1:2;
234         u32 partion_mode:1;
235         u32 res2:11;
236         u32 dbi_vid:2;
237         u32 res3:2;
238     } bits;
239 };
240 
241 union DSI_DBI_CTL1_t {
242     u32 dwval;
243     struct {
244         u32 wr_cmd_size:16;
245         u32 allowed_cmd_size:16;
246     } bits;
247 };
248 
249 union DSI_DBI_CTL2_t {
250     u32 dwval;
251     struct {
252         u32 dbi_fifo_cmd_empty:1;
253         u32 dbi_fifo_pld_w_empty:1;
254         u32 dbi_fifo_pld_r_empty:1;
255         u32 res0:1;
256         u32 dbi_fifo_cmd_full:1;
257         u32 dbi_fifo_pld_w_full:1;
258         u32 dbi_fifo_pld_r_full:1;
259         u32 res1:1;
260         u32 dbi_rd_cmd_busy:1;
261         u32 res2:23;
262     } bits;
263 };
264 
265 union DSI_TO_CTL0_t {
266     u32 dwval;
267     struct {
268         u32 to_clk_div:8;
269         u32 res0:24;
270     } bits;
271 };
272 
273 union DSI_TO_CTL1_t {
274     u32 dwval;
275     struct {
276         u32 to_hstx_set:16;
277         u32 to_lprx_set:16;
278     } bits;
279 };
280 
281 union DSI_VID_CTL2_t {
282     u32 dwval;
283     struct {
284         u32 lpcmd_time_invact:8;
285         u32 res0:8;
286         u32 lpcmd_time_outvact:8;
287         u32 res1:8;
288     } bits;
289 };
290 
291 union DSI_PHY_CTL0_t {
292     u32 dwval;
293     struct {
294         u32 phy_lp2hs_set:8;
295         u32 res0:8;
296         u32 phy_hs2lp_set:8;
297         u32 res1:8;
298     } bits;
299 };
300 
301 union DSI_PHY_CTL1_t {
302     u32 dwval;
303     struct {
304         u32 phy_stop_set:8;
305         u32 res0:8;
306         u32 max_rd_set:15;
307         u32 res1:1;
308     } bits;
309 };
310 
311 union DSI_PHY_CTL2_t {
312     u32 dwval;
313     struct {
314         u32 res0:4;
315         u32 phy_ck_tx_ulps_req:1;
316         u32 phy_ck_tx_ulps_exit:1;
317         u32 res1:2;
318         u32 phy_data_tx_ulps_req:1;
319         u32 phy_data_tx_upls_exit:1;
320         u32 res2:6;
321         u32 phy_tx_triger:4;
322         u32 res3:12;
323     } bits;
324 };
325 
326 union DSI_PHY_STATUS_t {
327     u32 dwval;
328     struct {
329         u32 phy_lock:1;
330         u32 res0:3;
331         u32 phy_dir:1;
332         u32 res1:3;
333         u32 phy_d0_stop:1;
334         u32 phy_d1_stop:1;
335         u32 phy_d2_stop:1;
336         u32 phy_d3_stop:1;
337         u32 phy_ck_stop:1;
338         u32 res2:3;
339         u32 phy_d0_no_ulps:1;
340         u32 phy_d1_no_ulps:1;
341         u32 phy_d2_no_ulps:1;
342         u32 phy_d3_no_ulps:1;
343         u32 phy_ck_no_ulps:1;
344         u32 res3:3;
345         u32 phy_d0rx_no_ulps:1;
346         u32 res4:7;
347     } bits;
348 };
349 
350 union DSI_PHY_CTL3_t {
351     u32 dwval;
352     struct {
353         u32 phy_cfg_clr:1;
354         u32 phy_cfg_clk:1;
355         u32 res0:2;
356         u32 phy_cfg_en:1;
357         u32 res1:11;
358         u32 phy_cfg_din:8;
359         u32 phy_cfg_dout:8;
360     } bits;
361 };
362 
363 union DSI_IRQ_EN0_t {
364     u32 dwval;
365     struct {
366         u32 ack_with_err_0:1;
367         u32 ack_with_err_1:1;
368         u32 ack_with_err_2:1;
369         u32 ack_with_err_3:1;
370         u32 ack_with_err_4:1;
371         u32 ack_with_err_5:1;
372         u32 ack_with_err_6:1;
373         u32 ack_with_err_7:1;
374         u32 ack_with_err_8:1;
375         u32 ack_with_err_9:1;
376         u32 ack_with_err_10:1;
377         u32 ack_with_err_11:1;
378         u32 ack_with_err_12:1;
379         u32 ack_with_err_13:1;
380         u32 ack_with_err_14:1;
381         u32 ack_with_err_15:1;
382         u32 dphy_errors_0:1;
383         u32 dphy_errors_1:1;
384         u32 dphy_errors_2:1;
385         u32 dphy_errors_3:1;
386         u32 dphy_errors_4:1;
387         u32 res0:11;
388     } bits;
389 };
390 
391 union DSI_IRQ_EN1_t {
392     u32 dwval;
393     struct {
394         u32 ecc_single_err:1;
395         u32 ecc_multi_err:1;
396         u32 crc_err:1;
397         u32 eopt_err:1;
398         u32 pkt_size_err:1;
399         u32 res0:3;
400         u32 dpi_pld_wr_err:1;
401         u32 res1:3;
402         u32 gen_cmd_wr_err:1;
403         u32 gen_pld_wr_err:1;
404         u32 gen_pld_send_err:1;
405         u32 gen_pld_rd_err:1;
406         u32 gen_pld_recv_err:1;
407         u32 res2:3;
408         u32 dbi_cmd_wr_err:1;
409         u32 dbi_pld_wr_err:1;
410         u32 dbi_pld_rd_err:1;
411         u32 dbi_pld_recv_err:1;
412         u32 dbi_illegal_comm_err:1;
413         u32 res3:3;
414         u32 to_hs_tx:1;
415         u32 to_lp_rx:1;
416         u32 res4:2;
417     } bits;
418 };
419 
420 union DSI_IRQ_STATUS0_t {
421     u32 dwval;
422     struct {
423         u32 ack_with_err_0:1;
424         u32 ack_with_err_1:1;
425         u32 ack_with_err_2:1;
426         u32 ack_with_err_3:1;
427         u32 ack_with_err_4:1;
428         u32 ack_with_err_5:1;
429         u32 ack_with_err_6:1;
430         u32 ack_with_err_7:1;
431         u32 ack_with_err_8:1;
432         u32 ack_with_err_9:1;
433         u32 ack_with_err_10:1;
434         u32 ack_with_err_11:1;
435         u32 ack_with_err_12:1;
436         u32 ack_with_err_13:1;
437         u32 ack_with_err_14:1;
438         u32 ack_with_err_15:1;
439         u32 dphy_errors_0:1;
440         u32 dphy_errors_1:1;
441         u32 dphy_errors_2:1;
442         u32 dphy_errors_3:1;
443         u32 dphy_errors_4:1;
444         u32 res0:11;
445     } bits;
446 };
447 
448 union DSI_IRQ_STATUS1_t {
449     u32 dwval;
450     struct {
451         u32 ecc_single_err:1;
452         u32 ecc_multi_err:1;
453         u32 crc_err:1;
454         u32 eopt_err:1;
455         u32 pkt_size_err:1;
456         u32 res0:3;
457         u32 dpi_pld_wr_err:1;
458         u32 res1:3;
459         u32 gen_cmd_wr_err:1;
460         u32 gen_pld_wr_err:1;
461         u32 gen_pld_send_err:1;
462         u32 gen_pld_rd_err:1;
463         u32 gen_pld_recv_err:1;
464         u32 res2:3;
465         u32 dbi_cmd_wr_err:1;
466         u32 dbi_pld_wr_err:1;
467         u32 dbi_pld_rd_err:1;
468         u32 dbi_pld_recv_err:1;
469         u32 dbi_illegal_comm_err:1;
470         u32 res3:3;
471         u32 to_hs_tx:1;
472         u32 to_lp_rx:1;
473         u32 res4:2;
474     } bits;
475 };
476 
477 union DSI_CFG0_t {
478     u32 dwval;
479     struct {
480         u32 base_dir:4;
481         u32 res0:11;
482         u32 bist_on:1;
483         u32 turn_dis_0:1;
484         u32 force_rx_0:1;
485         u32 force_tx_stop_0:1;
486         u32 res1:1;
487         u32 turn_dis_1:1;
488         u32 force_rx_1:1;
489         u32 force_tx_stop_1:1;
490         u32 res2:1;
491         u32 turn_dis_2:1;
492         u32 force_rx_2:1;
493         u32 force_tx_stop_2:1;
494         u32 res3:1;
495         u32 turn_dis_3:1;
496         u32 force_rx_3:1;
497         u32 force_tx_stop_3:1;
498         u32 res4:1;
499     } bits;
500 };
501 
502 union DSI_CFG1_t {
503     u32 dwval;
504     struct {
505         u32 dpi_color_mode:1;
506         u32 dpi_shut_down:1;
507         u32 dpi_src_format:2;
508         u32 res0:27;
509         u32 dpi_src:1;
510     } bits;
511 };
512 
513 union DSI_CFG2_t {
514     u32 dwval;
515     struct {
516         u32 dbi_rst:1;
517         u32 lcd_te_en:1;
518         u32 res0:29;
519         u32 dbi_src:1;
520     } bits;
521 };
522 
523 union DSI_CFG3_t {
524     u32 dwval;
525     struct {
526         u32 bist_en:1;
527         u32 res0:3;
528         u32 sram0_bist_en:1;
529         u32 sram1_bist_en:1;
530         u32 sram2_bist_en:1;
531         u32 sram3_bist_en:1;
532         u32 res1:12;
533         u32 reg_snk:3;
534         u32 res2:5;
535         u32 reg_rint:2;
536         u32 reg_rext:1;
537         u32 enrext:1;
538     } bits;
539 };
540 
541 union DSI_STATUS_t {
542     u32 dwval;
543     struct {
544         u32 bist_status:1;
545         u32 res0:31;
546     } bits;
547 };
548 
549 union DSI_RESERVD_REG_t {
550     __u32 dwval;
551     struct {
552         __u32 res0;
553     } bits;
554 };
555 
556 struct __de_dsi_dev_t {
557     union DSI_CTL0_t dsi_ctl0;
558     union DSI_CTL1_t dsi_ctl1;
559     union DSI_CTL2_t dsi_ctl2;
560     union DSI_RESERVD_REG_t dsi_reg00C;
561     union DSI_VID_CTL0_t dsi_vid_ctl0;
562     union DSI_RESERVD_REG_t dsi_reg014[2];
563     union DSI_VID_CTL1_t dsi_vid_ctl1;
564     union DSI_VID_TIM0_t dsi_vid_tim0;
565     union DSI_VID_TIM1_t dsi_vid_tim1;
566     union DSI_VID_TIM2_t dsi_vid_tim2;
567     union DSI_VID_TIM3_t dsi_vid_tim3;
568     union DSI_DPI_CFG0_t dsi_dpi_cfg0;
569     union DSI_RESERVD_REG_t dsi_reg034[2];
570     union DSI_DPI_CFG1_t dsi_dpi_cfg1;
571     union DSI_PKG_CTL0_t dsi_pkg_ctl0;
572     union DSI_PKG_CTL1_t dsi_pkg_ctl1;
573     union DSI_PKG_STATUS_t dsi_pkg_status;
574     union DSI_RESERVD_REG_t dsi_reg04C;
575     union DSI_PKG_CTL2_t dsi_pkg_ctl2;
576     union DSI_CMD_CTL_t dsi_cmd_ctl;
577     union DSI_RESERVD_REG_t dsi_reg058[10];
578     union DSI_DBI_CTL0_t dsi_dbi_ctl0;
579     union DSI_DBI_CTL1_t dsi_dbi_ctl1;
580     union DSI_DBI_CTL2_t dsi_dbi_ctl2;
581     union DSI_RESERVD_REG_t dsi_reg08C[5];
582     union DSI_TO_CTL0_t dsi_to_ctl0;
583     union DSI_TO_CTL1_t dsi_to_ctl1;
584     union DSI_VID_CTL2_t dsi_vid_ctl2;
585     union DSI_RESERVD_REG_t dsi_reg0AC;
586     union DSI_PHY_CTL0_t dsi_phy_ctl0;
587     union DSI_PHY_CTL1_t dsi_phy_ctl1;
588     union DSI_RESERVD_REG_t dsi_reg0B8[2];
589     union DSI_PHY_CTL2_t dsi_phy_ctl2;
590     union DSI_PHY_STATUS_t dsi_phy_status;
591     union DSI_RESERVD_REG_t dsi_reg0C8[10];
592     union DSI_PHY_CTL3_t dsi_phy_ctl3;
593     union DSI_RESERVD_REG_t dsi_reg0F4[59];
594     union DSI_IRQ_EN0_t dsi_irq_en0;
595     union DSI_IRQ_EN1_t dsi_irq_en1;
596     union DSI_RESERVD_REG_t dsi_reg1E8[2];
597     union DSI_IRQ_STATUS0_t dsi_irq_status0;
598     union DSI_IRQ_STATUS1_t dsi_irq_status1;
599     union DSI_RESERVD_REG_t dsi_reg1F8[130];
600     union DSI_CFG0_t dsi_cfg0;
601     union DSI_CFG1_t dsi_cfg1;
602     union DSI_CFG2_t dsi_cfg2;
603     union DSI_CFG3_t dsi_cfg3;
604     union DSI_STATUS_t dsi_statu_s;
605 };
606 
607 __u8 dsi_ecc_pro(__u32 dsi_ph);
608 __u16 dsi_crc_pro(__u8 *pd_p, __u32 pd_bytes);
609 __u16 dsi_crc_pro_pd_repeat(__u8 pd, __u32 pd_bytes);
610 
611 /* lvds */
612 union lvds_if_reg_t {
613     u32 dwval;
614     struct {
615         u32 lvds_data_revert:4;
616         u32 lvds_clk_revert:1;
617         u32 res0:15;
618         u32 lvds_clk_sel:1;
619         u32 res1:2;
620         u32 lvds_correct_mode:1;
621         u32 lvds_debug_mode:1;
622         u32 lvds_debug_en:1;
623         u32 lvds_bitwidth:1;
624         u32 lvds_mode:1;
625         u32 lvds_dir:1;
626         u32 lvds_even_odd_dir:1;
627         u32 lvds_link:1;
628         u32 lvds_en:1;
629     } bits;
630 };
631 
632 #endif
633