3
3
* Copyright (c) 2015 MediaTek Inc.
4
4
*/
5
5
6
+ #include <linux/bitfield.h>
6
7
#include <linux/clk.h>
7
8
#include <linux/component.h>
8
9
#include <linux/iopoll.h>
70
71
#define DSI_PSCTRL 0x1c
71
72
#define DSI_PS_WC GENMASK(13, 0)
72
73
#define DSI_PS_SEL GENMASK(17, 16)
73
- #define PACKED_PS_16BIT_RGB565 (0 << 16)
74
- #define PACKED_PS_18BIT_RGB666 (1 << 16)
75
- #define LOOSELY_PS_24BIT_RGB666 (2 << 16)
76
- #define PACKED_PS_24BIT_RGB888 (3 << 16)
74
+ #define PACKED_PS_16BIT_RGB565 0
75
+ #define PACKED_PS_18BIT_RGB666 1
76
+ #define LOOSELY_PS_24BIT_RGB666 2
77
+ #define PACKED_PS_24BIT_RGB888 3
77
78
78
79
#define DSI_VSA_NL 0x20
79
80
#define DSI_VBP_NL 0x24
80
81
#define DSI_VFP_NL 0x28
81
82
#define DSI_VACT_NL 0x2C
83
+ #define VACT_NL GENMASK(14, 0)
82
84
#define DSI_SIZE_CON 0x38
85
+ #define DSI_HEIGHT GENMASK(30, 16)
86
+ #define DSI_WIDTH GENMASK(14, 0)
83
87
#define DSI_HSA_WC 0x50
84
88
#define DSI_HBP_WC 0x54
85
89
#define DSI_HFP_WC 0x58
122
126
123
127
#define DSI_PHY_TIMECON2 0x118
124
128
#define CONT_DET GENMASK(7, 0)
129
+ #define DA_HS_SYNC GENMASK(15, 8)
125
130
#define CLK_ZERO GENMASK(23, 16)
126
131
#define CLK_TRAIL GENMASK(31, 24)
127
132
@@ -253,14 +258,23 @@ static void mtk_dsi_phy_timconfig(struct mtk_dsi *dsi)
253
258
timing -> clk_hs_zero = timing -> clk_hs_trail * 4 ;
254
259
timing -> clk_hs_exit = 2 * timing -> clk_hs_trail ;
255
260
256
- timcon0 = timing -> lpx | timing -> da_hs_prepare << 8 |
257
- timing -> da_hs_zero << 16 | timing -> da_hs_trail << 24 ;
258
- timcon1 = timing -> ta_go | timing -> ta_sure << 8 |
259
- timing -> ta_get << 16 | timing -> da_hs_exit << 24 ;
260
- timcon2 = 1 << 8 | timing -> clk_hs_zero << 16 |
261
- timing -> clk_hs_trail << 24 ;
262
- timcon3 = timing -> clk_hs_prepare | timing -> clk_hs_post << 8 |
263
- timing -> clk_hs_exit << 16 ;
261
+ timcon0 = FIELD_PREP (LPX , timing -> lpx ) |
262
+ FIELD_PREP (HS_PREP , timing -> da_hs_prepare ) |
263
+ FIELD_PREP (HS_ZERO , timing -> da_hs_zero ) |
264
+ FIELD_PREP (HS_TRAIL , timing -> da_hs_trail );
265
+
266
+ timcon1 = FIELD_PREP (TA_GO , timing -> ta_go ) |
267
+ FIELD_PREP (TA_SURE , timing -> ta_sure ) |
268
+ FIELD_PREP (TA_GET , timing -> ta_get ) |
269
+ FIELD_PREP (DA_HS_EXIT , timing -> da_hs_exit );
270
+
271
+ timcon2 = FIELD_PREP (DA_HS_SYNC , 1 ) |
272
+ FIELD_PREP (CLK_ZERO , timing -> clk_hs_zero ) |
273
+ FIELD_PREP (CLK_TRAIL , timing -> clk_hs_trail );
274
+
275
+ timcon3 = FIELD_PREP (CLK_HS_PREP , timing -> clk_hs_prepare ) |
276
+ FIELD_PREP (CLK_HS_POST , timing -> clk_hs_post ) |
277
+ FIELD_PREP (CLK_HS_EXIT , timing -> clk_hs_exit );
264
278
265
279
writel (timcon0 , dsi -> regs + DSI_PHY_TIMECON0 );
266
280
writel (timcon1 , dsi -> regs + DSI_PHY_TIMECON1 );
@@ -353,71 +367,61 @@ static void mtk_dsi_set_vm_cmd(struct mtk_dsi *dsi)
353
367
354
368
static void mtk_dsi_rxtx_control (struct mtk_dsi * dsi )
355
369
{
356
- u32 tmp_reg ;
370
+ u32 regval , tmp_reg = 0 ;
371
+ u8 i ;
357
372
358
- switch (dsi -> lanes ) {
359
- case 1 :
360
- tmp_reg = 1 << 2 ;
361
- break ;
362
- case 2 :
363
- tmp_reg = 3 << 2 ;
364
- break ;
365
- case 3 :
366
- tmp_reg = 7 << 2 ;
367
- break ;
368
- case 4 :
369
- tmp_reg = 0xf << 2 ;
370
- break ;
371
- default :
372
- tmp_reg = 0xf << 2 ;
373
- break ;
374
- }
373
+ /* Number of DSI lanes (max 4 lanes), each bit enables one DSI lane. */
374
+ for (i = 0 ; i < dsi -> lanes ; i ++ )
375
+ tmp_reg |= BIT (i );
376
+
377
+ regval = FIELD_PREP (LANE_NUM , tmp_reg );
375
378
376
379
if (dsi -> mode_flags & MIPI_DSI_CLOCK_NON_CONTINUOUS )
377
- tmp_reg |= HSTX_CKLP_EN ;
380
+ regval |= HSTX_CKLP_EN ;
378
381
379
382
if (dsi -> mode_flags & MIPI_DSI_MODE_NO_EOT_PACKET )
380
- tmp_reg |= DIS_EOT ;
383
+ regval |= DIS_EOT ;
381
384
382
- writel (tmp_reg , dsi -> regs + DSI_TXRX_CTRL );
385
+ writel (regval , dsi -> regs + DSI_TXRX_CTRL );
383
386
}
384
387
385
388
static void mtk_dsi_ps_control (struct mtk_dsi * dsi , bool config_vact )
386
389
{
387
- struct videomode * vm = & dsi -> vm ;
388
- u32 dsi_buf_bpp , ps_wc ;
389
- u32 ps_bpp_mode ;
390
+ u32 dsi_buf_bpp , ps_val , ps_wc , vact_nl ;
390
391
391
392
if (dsi -> format == MIPI_DSI_FMT_RGB565 )
392
393
dsi_buf_bpp = 2 ;
393
394
else
394
395
dsi_buf_bpp = 3 ;
395
396
396
- ps_wc = vm -> hactive * dsi_buf_bpp ;
397
- ps_bpp_mode = ps_wc ;
397
+ /* Word count */
398
+ ps_wc = FIELD_PREP (DSI_PS_WC , dsi -> vm .hactive * dsi_buf_bpp );
399
+ ps_val = ps_wc ;
398
400
401
+ /* Pixel Stream type */
399
402
switch (dsi -> format ) {
400
403
default :
401
404
fallthrough ;
402
405
case MIPI_DSI_FMT_RGB888 :
403
- ps_bpp_mode |= PACKED_PS_24BIT_RGB888 ;
406
+ ps_val |= FIELD_PREP ( DSI_PS_SEL , PACKED_PS_24BIT_RGB888 ) ;
404
407
break ;
405
408
case MIPI_DSI_FMT_RGB666 :
406
- ps_bpp_mode |= LOOSELY_PS_24BIT_RGB666 ;
409
+ ps_val |= FIELD_PREP ( DSI_PS_SEL , LOOSELY_PS_24BIT_RGB666 ) ;
407
410
break ;
408
411
case MIPI_DSI_FMT_RGB666_PACKED :
409
- ps_bpp_mode |= PACKED_PS_18BIT_RGB666 ;
412
+ ps_val |= FIELD_PREP ( DSI_PS_SEL , PACKED_PS_18BIT_RGB666 ) ;
410
413
break ;
411
414
case MIPI_DSI_FMT_RGB565 :
412
- ps_bpp_mode |= PACKED_PS_16BIT_RGB565 ;
415
+ ps_val |= FIELD_PREP ( DSI_PS_SEL , PACKED_PS_16BIT_RGB565 ) ;
413
416
break ;
414
417
}
415
418
416
419
if (config_vact ) {
417
- writel (vm -> vactive , dsi -> regs + DSI_VACT_NL );
420
+ vact_nl = FIELD_PREP (VACT_NL , dsi -> vm .vactive );
421
+ writel (vact_nl , dsi -> regs + DSI_VACT_NL );
418
422
writel (ps_wc , dsi -> regs + DSI_HSTX_CKL_WC );
419
423
}
420
- writel (ps_bpp_mode , dsi -> regs + DSI_PSCTRL );
424
+ writel (ps_val , dsi -> regs + DSI_PSCTRL );
421
425
}
422
426
423
427
static void mtk_dsi_config_vdo_timing (struct mtk_dsi * dsi )
@@ -444,7 +448,8 @@ static void mtk_dsi_config_vdo_timing(struct mtk_dsi *dsi)
444
448
writel (vm -> vactive , dsi -> regs + DSI_VACT_NL );
445
449
446
450
if (dsi -> driver_data -> has_size_ctl )
447
- writel (vm -> vactive << 16 | vm -> hactive ,
451
+ writel (FIELD_PREP (DSI_HEIGHT , vm -> vactive ) |
452
+ FIELD_PREP (DSI_WIDTH , vm -> hactive ),
448
453
dsi -> regs + DSI_SIZE_CON );
449
454
450
455
horizontal_sync_active_byte = (vm -> hsync_len * dsi_tmp_buf_bpp - 10 );
0 commit comments