GNU Linux-libre 4.19.211-gnu1
[releases.git] / drivers / gpu / drm / rockchip / cdn-dp-reg.c
1 /*
2  * Copyright (C) Fuzhou Rockchip Electronics Co.Ltd
3  * Author: Chris Zhong <zyw@rock-chips.com>
4  *
5  * This software is licensed under the terms of the GNU General Public
6  * License version 2, as published by the Free Software Foundation, and
7  * may be copied, distributed, and modified under those terms.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  */
14
15 #include <linux/clk.h>
16 #include <linux/device.h>
17 #include <linux/delay.h>
18 #include <linux/io.h>
19 #include <linux/iopoll.h>
20 #include <linux/reset.h>
21
22 #include "cdn-dp-core.h"
23 #include "cdn-dp-reg.h"
24
25 #define CDN_DP_SPDIF_CLK                200000000
26 #define FW_ALIVE_TIMEOUT_US             1000000
27 #define MAILBOX_RETRY_US                1000
28 #define MAILBOX_TIMEOUT_US              5000000
29 #define LINK_TRAINING_RETRY_MS          20
30 #define LINK_TRAINING_TIMEOUT_MS        500
31
32 void cdn_dp_set_fw_clk(struct cdn_dp_device *dp, unsigned long clk)
33 {
34         writel(clk / 1000000, dp->regs + SW_CLK_H);
35 }
36
37 void cdn_dp_clock_reset(struct cdn_dp_device *dp)
38 {
39         u32 val;
40
41         val = DPTX_FRMR_DATA_CLK_RSTN_EN |
42               DPTX_FRMR_DATA_CLK_EN |
43               DPTX_PHY_DATA_RSTN_EN |
44               DPTX_PHY_DATA_CLK_EN |
45               DPTX_PHY_CHAR_RSTN_EN |
46               DPTX_PHY_CHAR_CLK_EN |
47               SOURCE_AUX_SYS_CLK_RSTN_EN |
48               SOURCE_AUX_SYS_CLK_EN |
49               DPTX_SYS_CLK_RSTN_EN |
50               DPTX_SYS_CLK_EN |
51               CFG_DPTX_VIF_CLK_RSTN_EN |
52               CFG_DPTX_VIF_CLK_EN;
53         writel(val, dp->regs + SOURCE_DPTX_CAR);
54
55         val = SOURCE_PHY_RSTN_EN | SOURCE_PHY_CLK_EN;
56         writel(val, dp->regs + SOURCE_PHY_CAR);
57
58         val = SOURCE_PKT_SYS_RSTN_EN |
59               SOURCE_PKT_SYS_CLK_EN |
60               SOURCE_PKT_DATA_RSTN_EN |
61               SOURCE_PKT_DATA_CLK_EN;
62         writel(val, dp->regs + SOURCE_PKT_CAR);
63
64         val = SPDIF_CDR_CLK_RSTN_EN |
65               SPDIF_CDR_CLK_EN |
66               SOURCE_AIF_SYS_RSTN_EN |
67               SOURCE_AIF_SYS_CLK_EN |
68               SOURCE_AIF_CLK_RSTN_EN |
69               SOURCE_AIF_CLK_EN;
70         writel(val, dp->regs + SOURCE_AIF_CAR);
71
72         val = SOURCE_CIPHER_SYSTEM_CLK_RSTN_EN |
73               SOURCE_CIPHER_SYS_CLK_EN |
74               SOURCE_CIPHER_CHAR_CLK_RSTN_EN |
75               SOURCE_CIPHER_CHAR_CLK_EN;
76         writel(val, dp->regs + SOURCE_CIPHER_CAR);
77
78         val = SOURCE_CRYPTO_SYS_CLK_RSTN_EN |
79               SOURCE_CRYPTO_SYS_CLK_EN;
80         writel(val, dp->regs + SOURCE_CRYPTO_CAR);
81
82         /* enable Mailbox and PIF interrupt */
83         writel(0, dp->regs + APB_INT_MASK);
84 }
85
86 static int cdn_dp_mailbox_read(struct cdn_dp_device *dp)
87 {
88         int val, ret;
89
90         ret = readx_poll_timeout(readl, dp->regs + MAILBOX_EMPTY_ADDR,
91                                  val, !val, MAILBOX_RETRY_US,
92                                  MAILBOX_TIMEOUT_US);
93         if (ret < 0)
94                 return ret;
95
96         return readl(dp->regs + MAILBOX0_RD_DATA) & 0xff;
97 }
98
99 static int cdp_dp_mailbox_write(struct cdn_dp_device *dp, u8 val)
100 {
101         int ret, full;
102
103         ret = readx_poll_timeout(readl, dp->regs + MAILBOX_FULL_ADDR,
104                                  full, !full, MAILBOX_RETRY_US,
105                                  MAILBOX_TIMEOUT_US);
106         if (ret < 0)
107                 return ret;
108
109         writel(val, dp->regs + MAILBOX0_WR_DATA);
110
111         return 0;
112 }
113
114 static int cdn_dp_mailbox_validate_receive(struct cdn_dp_device *dp,
115                                            u8 module_id, u8 opcode,
116                                            u16 req_size)
117 {
118         u32 mbox_size, i;
119         u8 header[4];
120         int ret;
121
122         /* read the header of the message */
123         for (i = 0; i < 4; i++) {
124                 ret = cdn_dp_mailbox_read(dp);
125                 if (ret < 0)
126                         return ret;
127
128                 header[i] = ret;
129         }
130
131         mbox_size = (header[2] << 8) | header[3];
132
133         if (opcode != header[0] || module_id != header[1] ||
134             req_size != mbox_size) {
135                 /*
136                  * If the message in mailbox is not what we want, we need to
137                  * clear the mailbox by reading its contents.
138                  */
139                 for (i = 0; i < mbox_size; i++)
140                         if (cdn_dp_mailbox_read(dp) < 0)
141                                 break;
142
143                 return -EINVAL;
144         }
145
146         return 0;
147 }
148
149 static int cdn_dp_mailbox_read_receive(struct cdn_dp_device *dp,
150                                        u8 *buff, u16 buff_size)
151 {
152         u32 i;
153         int ret;
154
155         for (i = 0; i < buff_size; i++) {
156                 ret = cdn_dp_mailbox_read(dp);
157                 if (ret < 0)
158                         return ret;
159
160                 buff[i] = ret;
161         }
162
163         return 0;
164 }
165
166 static int cdn_dp_mailbox_send(struct cdn_dp_device *dp, u8 module_id,
167                                u8 opcode, u16 size, u8 *message)
168 {
169         u8 header[4];
170         int ret, i;
171
172         header[0] = opcode;
173         header[1] = module_id;
174         header[2] = (size >> 8) & 0xff;
175         header[3] = size & 0xff;
176
177         for (i = 0; i < 4; i++) {
178                 ret = cdp_dp_mailbox_write(dp, header[i]);
179                 if (ret)
180                         return ret;
181         }
182
183         for (i = 0; i < size; i++) {
184                 ret = cdp_dp_mailbox_write(dp, message[i]);
185                 if (ret)
186                         return ret;
187         }
188
189         return 0;
190 }
191
192 static int cdn_dp_reg_write(struct cdn_dp_device *dp, u16 addr, u32 val)
193 {
194         u8 msg[6];
195
196         msg[0] = (addr >> 8) & 0xff;
197         msg[1] = addr & 0xff;
198         msg[2] = (val >> 24) & 0xff;
199         msg[3] = (val >> 16) & 0xff;
200         msg[4] = (val >> 8) & 0xff;
201         msg[5] = val & 0xff;
202         return cdn_dp_mailbox_send(dp, MB_MODULE_ID_DP_TX, DPTX_WRITE_REGISTER,
203                                    sizeof(msg), msg);
204 }
205
206 static int cdn_dp_reg_write_bit(struct cdn_dp_device *dp, u16 addr,
207                                 u8 start_bit, u8 bits_no, u32 val)
208 {
209         u8 field[8];
210
211         field[0] = (addr >> 8) & 0xff;
212         field[1] = addr & 0xff;
213         field[2] = start_bit;
214         field[3] = bits_no;
215         field[4] = (val >> 24) & 0xff;
216         field[5] = (val >> 16) & 0xff;
217         field[6] = (val >> 8) & 0xff;
218         field[7] = val & 0xff;
219
220         return cdn_dp_mailbox_send(dp, MB_MODULE_ID_DP_TX, DPTX_WRITE_FIELD,
221                                    sizeof(field), field);
222 }
223
224 int cdn_dp_dpcd_read(struct cdn_dp_device *dp, u32 addr, u8 *data, u16 len)
225 {
226         u8 msg[5], reg[5];
227         int ret;
228
229         msg[0] = (len >> 8) & 0xff;
230         msg[1] = len & 0xff;
231         msg[2] = (addr >> 16) & 0xff;
232         msg[3] = (addr >> 8) & 0xff;
233         msg[4] = addr & 0xff;
234         ret = cdn_dp_mailbox_send(dp, MB_MODULE_ID_DP_TX, DPTX_READ_DPCD,
235                                   sizeof(msg), msg);
236         if (ret)
237                 goto err_dpcd_read;
238
239         ret = cdn_dp_mailbox_validate_receive(dp, MB_MODULE_ID_DP_TX,
240                                               DPTX_READ_DPCD,
241                                               sizeof(reg) + len);
242         if (ret)
243                 goto err_dpcd_read;
244
245         ret = cdn_dp_mailbox_read_receive(dp, reg, sizeof(reg));
246         if (ret)
247                 goto err_dpcd_read;
248
249         ret = cdn_dp_mailbox_read_receive(dp, data, len);
250
251 err_dpcd_read:
252         return ret;
253 }
254
255 int cdn_dp_dpcd_write(struct cdn_dp_device *dp, u32 addr, u8 value)
256 {
257         u8 msg[6], reg[5];
258         int ret;
259
260         msg[0] = 0;
261         msg[1] = 1;
262         msg[2] = (addr >> 16) & 0xff;
263         msg[3] = (addr >> 8) & 0xff;
264         msg[4] = addr & 0xff;
265         msg[5] = value;
266         ret = cdn_dp_mailbox_send(dp, MB_MODULE_ID_DP_TX, DPTX_WRITE_DPCD,
267                                   sizeof(msg), msg);
268         if (ret)
269                 goto err_dpcd_write;
270
271         ret = cdn_dp_mailbox_validate_receive(dp, MB_MODULE_ID_DP_TX,
272                                               DPTX_WRITE_DPCD, sizeof(reg));
273         if (ret)
274                 goto err_dpcd_write;
275
276         ret = cdn_dp_mailbox_read_receive(dp, reg, sizeof(reg));
277         if (ret)
278                 goto err_dpcd_write;
279
280         if (addr != (reg[2] << 16 | reg[3] << 8 | reg[4]))
281                 ret = -EINVAL;
282
283 err_dpcd_write:
284         if (ret)
285                 DRM_DEV_ERROR(dp->dev, "dpcd write failed: %d\n", ret);
286         return ret;
287 }
288
289 int cdn_dp_load_firmware(struct cdn_dp_device *dp, const u32 *i_mem,
290                          u32 i_size, const u32 *d_mem, u32 d_size)
291 {
292         u32 reg;
293         int i, ret;
294
295         /* reset ucpu before load firmware*/
296         writel(APB_IRAM_PATH | APB_DRAM_PATH | APB_XT_RESET,
297                dp->regs + APB_CTRL);
298
299         for (i = 0; i < i_size; i += 4)
300                 writel(*i_mem++, dp->regs + ADDR_IMEM + i);
301
302         for (i = 0; i < d_size; i += 4)
303                 writel(*d_mem++, dp->regs + ADDR_DMEM + i);
304
305         /* un-reset ucpu */
306         writel(0, dp->regs + APB_CTRL);
307
308         /* check the keep alive register to make sure fw working */
309         ret = readx_poll_timeout(readl, dp->regs + KEEP_ALIVE,
310                                  reg, reg, 2000, FW_ALIVE_TIMEOUT_US);
311         if (ret < 0) {
312                 DRM_DEV_ERROR(dp->dev, "failed to loaded the FW reg = %x\n",
313                               reg);
314                 return -EINVAL;
315         }
316
317         reg = readl(dp->regs + VER_L) & 0xff;
318         dp->fw_version = reg;
319         reg = readl(dp->regs + VER_H) & 0xff;
320         dp->fw_version |= reg << 8;
321         reg = readl(dp->regs + VER_LIB_L_ADDR) & 0xff;
322         dp->fw_version |= reg << 16;
323         reg = readl(dp->regs + VER_LIB_H_ADDR) & 0xff;
324         dp->fw_version |= reg << 24;
325
326         DRM_DEV_DEBUG(dp->dev, "firmware version: %x\n", dp->fw_version);
327
328         return 0;
329 }
330
331 int cdn_dp_set_firmware_active(struct cdn_dp_device *dp, bool enable)
332 {
333         u8 msg[5];
334         int ret, i;
335
336         msg[0] = GENERAL_MAIN_CONTROL;
337         msg[1] = MB_MODULE_ID_GENERAL;
338         msg[2] = 0;
339         msg[3] = 1;
340         msg[4] = enable ? FW_ACTIVE : FW_STANDBY;
341
342         for (i = 0; i < sizeof(msg); i++) {
343                 ret = cdp_dp_mailbox_write(dp, msg[i]);
344                 if (ret)
345                         goto err_set_firmware_active;
346         }
347
348         /* read the firmware state */
349         for (i = 0; i < sizeof(msg); i++)  {
350                 ret = cdn_dp_mailbox_read(dp);
351                 if (ret < 0)
352                         goto err_set_firmware_active;
353
354                 msg[i] = ret;
355         }
356
357         ret = 0;
358
359 err_set_firmware_active:
360         if (ret < 0)
361                 DRM_DEV_ERROR(dp->dev, "set firmware active failed\n");
362         return ret;
363 }
364
365 int cdn_dp_set_host_cap(struct cdn_dp_device *dp, u8 lanes, bool flip)
366 {
367         u8 msg[8];
368         int ret;
369
370         msg[0] = CDN_DP_MAX_LINK_RATE;
371         msg[1] = lanes | SCRAMBLER_EN;
372         msg[2] = VOLTAGE_LEVEL_2;
373         msg[3] = PRE_EMPHASIS_LEVEL_3;
374         msg[4] = PTS1 | PTS2 | PTS3 | PTS4;
375         msg[5] = FAST_LT_NOT_SUPPORT;
376         msg[6] = flip ? LANE_MAPPING_FLIPPED : LANE_MAPPING_NORMAL;
377         msg[7] = ENHANCED;
378
379         ret = cdn_dp_mailbox_send(dp, MB_MODULE_ID_DP_TX,
380                                   DPTX_SET_HOST_CAPABILITIES,
381                                   sizeof(msg), msg);
382         if (ret)
383                 goto err_set_host_cap;
384
385         ret = cdn_dp_reg_write(dp, DP_AUX_SWAP_INVERSION_CONTROL,
386                                AUX_HOST_INVERT);
387
388 err_set_host_cap:
389         if (ret)
390                 DRM_DEV_ERROR(dp->dev, "set host cap failed: %d\n", ret);
391         return ret;
392 }
393
394 int cdn_dp_event_config(struct cdn_dp_device *dp)
395 {
396         u8 msg[5];
397         int ret;
398
399         memset(msg, 0, sizeof(msg));
400
401         msg[0] = DPTX_EVENT_ENABLE_HPD | DPTX_EVENT_ENABLE_TRAINING;
402
403         ret = cdn_dp_mailbox_send(dp, MB_MODULE_ID_DP_TX, DPTX_ENABLE_EVENT,
404                                   sizeof(msg), msg);
405         if (ret)
406                 DRM_DEV_ERROR(dp->dev, "set event config failed: %d\n", ret);
407
408         return ret;
409 }
410
411 u32 cdn_dp_get_event(struct cdn_dp_device *dp)
412 {
413         return readl(dp->regs + SW_EVENTS0);
414 }
415
416 int cdn_dp_get_hpd_status(struct cdn_dp_device *dp)
417 {
418         u8 status;
419         int ret;
420
421         ret = cdn_dp_mailbox_send(dp, MB_MODULE_ID_DP_TX, DPTX_HPD_STATE,
422                                   0, NULL);
423         if (ret)
424                 goto err_get_hpd;
425
426         ret = cdn_dp_mailbox_validate_receive(dp, MB_MODULE_ID_DP_TX,
427                                               DPTX_HPD_STATE, sizeof(status));
428         if (ret)
429                 goto err_get_hpd;
430
431         ret = cdn_dp_mailbox_read_receive(dp, &status, sizeof(status));
432         if (ret)
433                 goto err_get_hpd;
434
435         return status;
436
437 err_get_hpd:
438         DRM_DEV_ERROR(dp->dev, "get hpd status failed: %d\n", ret);
439         return ret;
440 }
441
442 int cdn_dp_get_edid_block(void *data, u8 *edid,
443                           unsigned int block, size_t length)
444 {
445         struct cdn_dp_device *dp = data;
446         u8 msg[2], reg[2], i;
447         int ret;
448
449         for (i = 0; i < 4; i++) {
450                 msg[0] = block / 2;
451                 msg[1] = block % 2;
452
453                 ret = cdn_dp_mailbox_send(dp, MB_MODULE_ID_DP_TX, DPTX_GET_EDID,
454                                           sizeof(msg), msg);
455                 if (ret)
456                         continue;
457
458                 ret = cdn_dp_mailbox_validate_receive(dp, MB_MODULE_ID_DP_TX,
459                                                       DPTX_GET_EDID,
460                                                       sizeof(reg) + length);
461                 if (ret)
462                         continue;
463
464                 ret = cdn_dp_mailbox_read_receive(dp, reg, sizeof(reg));
465                 if (ret)
466                         continue;
467
468                 ret = cdn_dp_mailbox_read_receive(dp, edid, length);
469                 if (ret)
470                         continue;
471
472                 if (reg[0] == length && reg[1] == block / 2)
473                         break;
474         }
475
476         if (ret)
477                 DRM_DEV_ERROR(dp->dev, "get block[%d] edid failed: %d\n", block,
478                               ret);
479
480         return ret;
481 }
482
483 static int cdn_dp_training_start(struct cdn_dp_device *dp)
484 {
485         unsigned long timeout;
486         u8 msg, event[2];
487         int ret;
488
489         msg = LINK_TRAINING_RUN;
490
491         /* start training */
492         ret = cdn_dp_mailbox_send(dp, MB_MODULE_ID_DP_TX, DPTX_TRAINING_CONTROL,
493                                   sizeof(msg), &msg);
494         if (ret)
495                 goto err_training_start;
496
497         timeout = jiffies + msecs_to_jiffies(LINK_TRAINING_TIMEOUT_MS);
498         while (time_before(jiffies, timeout)) {
499                 msleep(LINK_TRAINING_RETRY_MS);
500                 ret = cdn_dp_mailbox_send(dp, MB_MODULE_ID_DP_TX,
501                                           DPTX_READ_EVENT, 0, NULL);
502                 if (ret)
503                         goto err_training_start;
504
505                 ret = cdn_dp_mailbox_validate_receive(dp, MB_MODULE_ID_DP_TX,
506                                                       DPTX_READ_EVENT,
507                                                       sizeof(event));
508                 if (ret)
509                         goto err_training_start;
510
511                 ret = cdn_dp_mailbox_read_receive(dp, event, sizeof(event));
512                 if (ret)
513                         goto err_training_start;
514
515                 if (event[1] & EQ_PHASE_FINISHED)
516                         return 0;
517         }
518
519         ret = -ETIMEDOUT;
520
521 err_training_start:
522         DRM_DEV_ERROR(dp->dev, "training failed: %d\n", ret);
523         return ret;
524 }
525
526 static int cdn_dp_get_training_status(struct cdn_dp_device *dp)
527 {
528         u8 status[10];
529         int ret;
530
531         ret = cdn_dp_mailbox_send(dp, MB_MODULE_ID_DP_TX, DPTX_READ_LINK_STAT,
532                                   0, NULL);
533         if (ret)
534                 goto err_get_training_status;
535
536         ret = cdn_dp_mailbox_validate_receive(dp, MB_MODULE_ID_DP_TX,
537                                               DPTX_READ_LINK_STAT,
538                                               sizeof(status));
539         if (ret)
540                 goto err_get_training_status;
541
542         ret = cdn_dp_mailbox_read_receive(dp, status, sizeof(status));
543         if (ret)
544                 goto err_get_training_status;
545
546         dp->link.rate = status[0];
547         dp->link.num_lanes = status[1];
548
549 err_get_training_status:
550         if (ret)
551                 DRM_DEV_ERROR(dp->dev, "get training status failed: %d\n", ret);
552         return ret;
553 }
554
555 int cdn_dp_train_link(struct cdn_dp_device *dp)
556 {
557         int ret;
558
559         ret = cdn_dp_training_start(dp);
560         if (ret) {
561                 DRM_DEV_ERROR(dp->dev, "Failed to start training %d\n", ret);
562                 return ret;
563         }
564
565         ret = cdn_dp_get_training_status(dp);
566         if (ret) {
567                 DRM_DEV_ERROR(dp->dev, "Failed to get training stat %d\n", ret);
568                 return ret;
569         }
570
571         DRM_DEV_DEBUG_KMS(dp->dev, "rate:0x%x, lanes:%d\n", dp->link.rate,
572                           dp->link.num_lanes);
573         return ret;
574 }
575
576 int cdn_dp_set_video_status(struct cdn_dp_device *dp, int active)
577 {
578         u8 msg;
579         int ret;
580
581         msg = !!active;
582
583         ret = cdn_dp_mailbox_send(dp, MB_MODULE_ID_DP_TX, DPTX_SET_VIDEO,
584                                   sizeof(msg), &msg);
585         if (ret)
586                 DRM_DEV_ERROR(dp->dev, "set video status failed: %d\n", ret);
587
588         return ret;
589 }
590
591 static int cdn_dp_get_msa_misc(struct video_info *video,
592                                struct drm_display_mode *mode)
593 {
594         u32 msa_misc;
595         u8 val[2] = {0};
596
597         switch (video->color_fmt) {
598         case PXL_RGB:
599         case Y_ONLY:
600                 val[0] = 0;
601                 break;
602         /* set YUV default color space conversion to BT601 */
603         case YCBCR_4_4_4:
604                 val[0] = 6 + BT_601 * 8;
605                 break;
606         case YCBCR_4_2_2:
607                 val[0] = 5 + BT_601 * 8;
608                 break;
609         case YCBCR_4_2_0:
610                 val[0] = 5;
611                 break;
612         };
613
614         switch (video->color_depth) {
615         case 6:
616                 val[1] = 0;
617                 break;
618         case 8:
619                 val[1] = 1;
620                 break;
621         case 10:
622                 val[1] = 2;
623                 break;
624         case 12:
625                 val[1] = 3;
626                 break;
627         case 16:
628                 val[1] = 4;
629                 break;
630         };
631
632         msa_misc = 2 * val[0] + 32 * val[1] +
633                    ((video->color_fmt == Y_ONLY) ? (1 << 14) : 0);
634
635         return msa_misc;
636 }
637
638 int cdn_dp_config_video(struct cdn_dp_device *dp)
639 {
640         struct video_info *video = &dp->video_info;
641         struct drm_display_mode *mode = &dp->mode;
642         u64 symbol;
643         u32 val, link_rate, rem;
644         u8 bit_per_pix, tu_size_reg = TU_SIZE;
645         int ret;
646
647         bit_per_pix = (video->color_fmt == YCBCR_4_2_2) ?
648                       (video->color_depth * 2) : (video->color_depth * 3);
649
650         link_rate = drm_dp_bw_code_to_link_rate(dp->link.rate) / 1000;
651
652         ret = cdn_dp_reg_write(dp, BND_HSYNC2VSYNC, VIF_BYPASS_INTERLACE);
653         if (ret)
654                 goto err_config_video;
655
656         ret = cdn_dp_reg_write(dp, HSYNC2VSYNC_POL_CTRL, 0);
657         if (ret)
658                 goto err_config_video;
659
660         /*
661          * get a best tu_size and valid symbol:
662          * 1. chose Lclk freq(162Mhz, 270Mhz, 540Mhz), set TU to 32
663          * 2. calculate VS(valid symbol) = TU * Pclk * Bpp / (Lclk * Lanes)
664          * 3. if VS > *.85 or VS < *.1 or VS < 2 or TU < VS + 4, then set
665          *    TU += 2 and repeat 2nd step.
666          */
667         do {
668                 tu_size_reg += 2;
669                 symbol = tu_size_reg * mode->clock * bit_per_pix;
670                 do_div(symbol, dp->link.num_lanes * link_rate * 8);
671                 rem = do_div(symbol, 1000);
672                 if (tu_size_reg > 64) {
673                         ret = -EINVAL;
674                         DRM_DEV_ERROR(dp->dev,
675                                       "tu error, clk:%d, lanes:%d, rate:%d\n",
676                                       mode->clock, dp->link.num_lanes,
677                                       link_rate);
678                         goto err_config_video;
679                 }
680         } while ((symbol <= 1) || (tu_size_reg - symbol < 4) ||
681                  (rem > 850) || (rem < 100));
682
683         val = symbol + (tu_size_reg << 8);
684         val |= TU_CNT_RST_EN;
685         ret = cdn_dp_reg_write(dp, DP_FRAMER_TU, val);
686         if (ret)
687                 goto err_config_video;
688
689         /* set the FIFO Buffer size */
690         val = div_u64(mode->clock * (symbol + 1), 1000) + link_rate;
691         val /= (dp->link.num_lanes * link_rate);
692         val = div_u64(8 * (symbol + 1), bit_per_pix) - val;
693         val += 2;
694         ret = cdn_dp_reg_write(dp, DP_VC_TABLE(15), val);
695
696         switch (video->color_depth) {
697         case 6:
698                 val = BCS_6;
699                 break;
700         case 8:
701                 val = BCS_8;
702                 break;
703         case 10:
704                 val = BCS_10;
705                 break;
706         case 12:
707                 val = BCS_12;
708                 break;
709         case 16:
710                 val = BCS_16;
711                 break;
712         };
713
714         val += video->color_fmt << 8;
715         ret = cdn_dp_reg_write(dp, DP_FRAMER_PXL_REPR, val);
716         if (ret)
717                 goto err_config_video;
718
719         val = video->h_sync_polarity ? DP_FRAMER_SP_HSP : 0;
720         val |= video->v_sync_polarity ? DP_FRAMER_SP_VSP : 0;
721         ret = cdn_dp_reg_write(dp, DP_FRAMER_SP, val);
722         if (ret)
723                 goto err_config_video;
724
725         val = (mode->hsync_start - mode->hdisplay) << 16;
726         val |= mode->htotal - mode->hsync_end;
727         ret = cdn_dp_reg_write(dp, DP_FRONT_BACK_PORCH, val);
728         if (ret)
729                 goto err_config_video;
730
731         val = mode->hdisplay * bit_per_pix / 8;
732         ret = cdn_dp_reg_write(dp, DP_BYTE_COUNT, val);
733         if (ret)
734                 goto err_config_video;
735
736         val = mode->htotal | ((mode->htotal - mode->hsync_start) << 16);
737         ret = cdn_dp_reg_write(dp, MSA_HORIZONTAL_0, val);
738         if (ret)
739                 goto err_config_video;
740
741         val = mode->hsync_end - mode->hsync_start;
742         val |= (mode->hdisplay << 16) | (video->h_sync_polarity << 15);
743         ret = cdn_dp_reg_write(dp, MSA_HORIZONTAL_1, val);
744         if (ret)
745                 goto err_config_video;
746
747         val = mode->vtotal;
748         val |= (mode->vtotal - mode->vsync_start) << 16;
749         ret = cdn_dp_reg_write(dp, MSA_VERTICAL_0, val);
750         if (ret)
751                 goto err_config_video;
752
753         val = mode->vsync_end - mode->vsync_start;
754         val |= (mode->vdisplay << 16) | (video->v_sync_polarity << 15);
755         ret = cdn_dp_reg_write(dp, MSA_VERTICAL_1, val);
756         if (ret)
757                 goto err_config_video;
758
759         val = cdn_dp_get_msa_misc(video, mode);
760         ret = cdn_dp_reg_write(dp, MSA_MISC, val);
761         if (ret)
762                 goto err_config_video;
763
764         ret = cdn_dp_reg_write(dp, STREAM_CONFIG, 1);
765         if (ret)
766                 goto err_config_video;
767
768         val = mode->hsync_end - mode->hsync_start;
769         val |= mode->hdisplay << 16;
770         ret = cdn_dp_reg_write(dp, DP_HORIZONTAL, val);
771         if (ret)
772                 goto err_config_video;
773
774         val = mode->vdisplay;
775         val |= (mode->vtotal - mode->vsync_start) << 16;
776         ret = cdn_dp_reg_write(dp, DP_VERTICAL_0, val);
777         if (ret)
778                 goto err_config_video;
779
780         val = mode->vtotal;
781         ret = cdn_dp_reg_write(dp, DP_VERTICAL_1, val);
782         if (ret)
783                 goto err_config_video;
784
785         ret = cdn_dp_reg_write_bit(dp, DP_VB_ID, 2, 1, 0);
786
787 err_config_video:
788         if (ret)
789                 DRM_DEV_ERROR(dp->dev, "config video failed: %d\n", ret);
790         return ret;
791 }
792
793 int cdn_dp_audio_stop(struct cdn_dp_device *dp, struct audio_info *audio)
794 {
795         int ret;
796
797         ret = cdn_dp_reg_write(dp, AUDIO_PACK_CONTROL, 0);
798         if (ret) {
799                 DRM_DEV_ERROR(dp->dev, "audio stop failed: %d\n", ret);
800                 return ret;
801         }
802
803         writel(0, dp->regs + SPDIF_CTRL_ADDR);
804
805         /* clearn the audio config and reset */
806         writel(0, dp->regs + AUDIO_SRC_CNTL);
807         writel(0, dp->regs + AUDIO_SRC_CNFG);
808         writel(AUDIO_SW_RST, dp->regs + AUDIO_SRC_CNTL);
809         writel(0, dp->regs + AUDIO_SRC_CNTL);
810
811         /* reset smpl2pckt component  */
812         writel(0, dp->regs + SMPL2PKT_CNTL);
813         writel(AUDIO_SW_RST, dp->regs + SMPL2PKT_CNTL);
814         writel(0, dp->regs + SMPL2PKT_CNTL);
815
816         /* reset FIFO */
817         writel(AUDIO_SW_RST, dp->regs + FIFO_CNTL);
818         writel(0, dp->regs + FIFO_CNTL);
819
820         if (audio->format == AFMT_SPDIF)
821                 clk_disable_unprepare(dp->spdif_clk);
822
823         return 0;
824 }
825
826 int cdn_dp_audio_mute(struct cdn_dp_device *dp, bool enable)
827 {
828         int ret;
829
830         ret = cdn_dp_reg_write_bit(dp, DP_VB_ID, 4, 1, enable);
831         if (ret)
832                 DRM_DEV_ERROR(dp->dev, "audio mute failed: %d\n", ret);
833
834         return ret;
835 }
836
837 static void cdn_dp_audio_config_i2s(struct cdn_dp_device *dp,
838                                     struct audio_info *audio)
839 {
840         int sub_pckt_num = 1, i2s_port_en_val = 0xf, i;
841         u32 val;
842
843         if (audio->channels == 2) {
844                 if (dp->link.num_lanes == 1)
845                         sub_pckt_num = 2;
846                 else
847                         sub_pckt_num = 4;
848
849                 i2s_port_en_val = 1;
850         } else if (audio->channels == 4) {
851                 i2s_port_en_val = 3;
852         }
853
854         writel(0x0, dp->regs + SPDIF_CTRL_ADDR);
855
856         writel(SYNC_WR_TO_CH_ZERO, dp->regs + FIFO_CNTL);
857
858         val = MAX_NUM_CH(audio->channels);
859         val |= NUM_OF_I2S_PORTS(audio->channels);
860         val |= AUDIO_TYPE_LPCM;
861         val |= CFG_SUB_PCKT_NUM(sub_pckt_num);
862         writel(val, dp->regs + SMPL2PKT_CNFG);
863
864         if (audio->sample_width == 16)
865                 val = 0;
866         else if (audio->sample_width == 24)
867                 val = 1 << 9;
868         else
869                 val = 2 << 9;
870
871         val |= AUDIO_CH_NUM(audio->channels);
872         val |= I2S_DEC_PORT_EN(i2s_port_en_val);
873         val |= TRANS_SMPL_WIDTH_32;
874         writel(val, dp->regs + AUDIO_SRC_CNFG);
875
876         for (i = 0; i < (audio->channels + 1) / 2; i++) {
877                 if (audio->sample_width == 16)
878                         val = (0x02 << 8) | (0x02 << 20);
879                 else if (audio->sample_width == 24)
880                         val = (0x0b << 8) | (0x0b << 20);
881
882                 val |= ((2 * i) << 4) | ((2 * i + 1) << 16);
883                 writel(val, dp->regs + STTS_BIT_CH(i));
884         }
885
886         switch (audio->sample_rate) {
887         case 32000:
888                 val = SAMPLING_FREQ(3) |
889                       ORIGINAL_SAMP_FREQ(0xc);
890                 break;
891         case 44100:
892                 val = SAMPLING_FREQ(0) |
893                       ORIGINAL_SAMP_FREQ(0xf);
894                 break;
895         case 48000:
896                 val = SAMPLING_FREQ(2) |
897                       ORIGINAL_SAMP_FREQ(0xd);
898                 break;
899         case 88200:
900                 val = SAMPLING_FREQ(8) |
901                       ORIGINAL_SAMP_FREQ(0x7);
902                 break;
903         case 96000:
904                 val = SAMPLING_FREQ(0xa) |
905                       ORIGINAL_SAMP_FREQ(5);
906                 break;
907         case 176400:
908                 val = SAMPLING_FREQ(0xc) |
909                       ORIGINAL_SAMP_FREQ(3);
910                 break;
911         case 192000:
912                 val = SAMPLING_FREQ(0xe) |
913                       ORIGINAL_SAMP_FREQ(1);
914                 break;
915         }
916         val |= 4;
917         writel(val, dp->regs + COM_CH_STTS_BITS);
918
919         writel(SMPL2PKT_EN, dp->regs + SMPL2PKT_CNTL);
920         writel(I2S_DEC_START, dp->regs + AUDIO_SRC_CNTL);
921 }
922
923 static void cdn_dp_audio_config_spdif(struct cdn_dp_device *dp)
924 {
925         u32 val;
926
927         writel(SYNC_WR_TO_CH_ZERO, dp->regs + FIFO_CNTL);
928
929         val = MAX_NUM_CH(2) | AUDIO_TYPE_LPCM | CFG_SUB_PCKT_NUM(4);
930         writel(val, dp->regs + SMPL2PKT_CNFG);
931         writel(SMPL2PKT_EN, dp->regs + SMPL2PKT_CNTL);
932
933         val = SPDIF_ENABLE | SPDIF_AVG_SEL | SPDIF_JITTER_BYPASS;
934         writel(val, dp->regs + SPDIF_CTRL_ADDR);
935
936         clk_prepare_enable(dp->spdif_clk);
937         clk_set_rate(dp->spdif_clk, CDN_DP_SPDIF_CLK);
938 }
939
940 int cdn_dp_audio_config(struct cdn_dp_device *dp, struct audio_info *audio)
941 {
942         int ret;
943
944         /* reset the spdif clk before config */
945         if (audio->format == AFMT_SPDIF) {
946                 reset_control_assert(dp->spdif_rst);
947                 reset_control_deassert(dp->spdif_rst);
948         }
949
950         ret = cdn_dp_reg_write(dp, CM_LANE_CTRL, LANE_REF_CYC);
951         if (ret)
952                 goto err_audio_config;
953
954         ret = cdn_dp_reg_write(dp, CM_CTRL, 0);
955         if (ret)
956                 goto err_audio_config;
957
958         if (audio->format == AFMT_I2S)
959                 cdn_dp_audio_config_i2s(dp, audio);
960         else if (audio->format == AFMT_SPDIF)
961                 cdn_dp_audio_config_spdif(dp);
962
963         ret = cdn_dp_reg_write(dp, AUDIO_PACK_CONTROL, AUDIO_PACK_EN);
964
965 err_audio_config:
966         if (ret)
967                 DRM_DEV_ERROR(dp->dev, "audio config failed: %d\n", ret);
968         return ret;
969 }