33 * Copyright (c) 2015 MediaTek Inc.
44 */
55
6+ #include <linux/bitfield.h>
67#include <linux/clk.h>
78#include <linux/component.h>
89#include <linux/iopoll.h>
7071#define DSI_PSCTRL 0x1c
7172#define DSI_PS_WC GENMASK(13, 0)
7273#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
7778
7879#define DSI_VSA_NL 0x20
7980#define DSI_VBP_NL 0x24
8081#define DSI_VFP_NL 0x28
8182#define DSI_VACT_NL 0x2C
83+ #define VACT_NL GENMASK(14, 0)
8284#define DSI_SIZE_CON 0x38
85+ #define DSI_HEIGHT GENMASK(30, 16)
86+ #define DSI_WIDTH GENMASK(14, 0)
8387#define DSI_HSA_WC 0x50
8488#define DSI_HBP_WC 0x54
8589#define DSI_HFP_WC 0x58
122126
123127#define DSI_PHY_TIMECON2 0x118
124128#define CONT_DET GENMASK(7, 0)
129+ #define DA_HS_SYNC GENMASK(15, 8)
125130#define CLK_ZERO GENMASK(23, 16)
126131#define CLK_TRAIL GENMASK(31, 24)
127132
@@ -253,14 +258,23 @@ static void mtk_dsi_phy_timconfig(struct mtk_dsi *dsi)
253258 timing -> clk_hs_zero = timing -> clk_hs_trail * 4 ;
254259 timing -> clk_hs_exit = 2 * timing -> clk_hs_trail ;
255260
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 );
264278
265279 writel (timcon0 , dsi -> regs + DSI_PHY_TIMECON0 );
266280 writel (timcon1 , dsi -> regs + DSI_PHY_TIMECON1 );
@@ -353,71 +367,61 @@ static void mtk_dsi_set_vm_cmd(struct mtk_dsi *dsi)
353367
354368static void mtk_dsi_rxtx_control (struct mtk_dsi * dsi )
355369{
356- u32 tmp_reg ;
370+ u32 regval , tmp_reg = 0 ;
371+ u8 i ;
357372
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 );
375378
376379 if (dsi -> mode_flags & MIPI_DSI_CLOCK_NON_CONTINUOUS )
377- tmp_reg |= HSTX_CKLP_EN ;
380+ regval |= HSTX_CKLP_EN ;
378381
379382 if (dsi -> mode_flags & MIPI_DSI_MODE_NO_EOT_PACKET )
380- tmp_reg |= DIS_EOT ;
383+ regval |= DIS_EOT ;
381384
382- writel (tmp_reg , dsi -> regs + DSI_TXRX_CTRL );
385+ writel (regval , dsi -> regs + DSI_TXRX_CTRL );
383386}
384387
385388static void mtk_dsi_ps_control (struct mtk_dsi * dsi , bool config_vact )
386389{
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 ;
390391
391392 if (dsi -> format == MIPI_DSI_FMT_RGB565 )
392393 dsi_buf_bpp = 2 ;
393394 else
394395 dsi_buf_bpp = 3 ;
395396
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 ;
398400
401+ /* Pixel Stream type */
399402 switch (dsi -> format ) {
400403 default :
401404 fallthrough ;
402405 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 ) ;
404407 break ;
405408 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 ) ;
407410 break ;
408411 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 ) ;
410413 break ;
411414 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 ) ;
413416 break ;
414417 }
415418
416419 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 );
418422 writel (ps_wc , dsi -> regs + DSI_HSTX_CKL_WC );
419423 }
420- writel (ps_bpp_mode , dsi -> regs + DSI_PSCTRL );
424+ writel (ps_val , dsi -> regs + DSI_PSCTRL );
421425}
422426
423427static 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)
444448 writel (vm -> vactive , dsi -> regs + DSI_VACT_NL );
445449
446450 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 ),
448453 dsi -> regs + DSI_SIZE_CON );
449454
450455 horizontal_sync_active_byte = (vm -> hsync_len * dsi_tmp_buf_bpp - 10 );
0 commit comments