imx: mx6/7: support lcdif
Subsystems (3)
v2 cover imx: mx6/7: support lcdif
Changes v2:
1. Rebased on Latest U-Boot
2. Add i.MX7 LCDIF support
This patch set is to introduce lcdif support for i.MX6/7. Patchset tested on mx6ul_14x14/9x9_evk and mx7dsabresd boards.
1/14
There are two LCD interface for i.MX6SX and one interface for i.MX6UL, so change the prototype mxs_set_lcdclk to handle different interface.
[2,3]/14
I am not sure, but from my understanding, the 'board_' should be discarded.
4/14
mx28 and mx6ul/sx have similar register layout and bit definitions, so move related structure and bit definitions to imx-common.
[5,6,7]/14
is to add related CCM macros, clock apis for enable lcdif on i.MX6
8/14
support lcdif for i.MX6UL 14x14/9x9 board
9/14
Introduce lcdif_power_down, to make system stable when reset or boot os
[10,11]/14
Need to call lcdif_power_down, before trigger wdog reset or boot os. Or we may met unexpected system hang.
[12,13,14]/14
Mainly support LCDIF for i.MX7.
Peng Fan (14):
mxs: add parameter base_addr for mxs_set_lcdclk
sandisk: sfp: correct function name
xfi3: correct function name
imx: imx-common: move lcdif structure and macro definition to
imx-common
imx: mx6: fix register address
imx: mx6: crm_reg: add LCDIF related macros
imx: mx6: add clock api for lcdif
imx: mx6ul_14x14_evk: support lcdif display
video: mxsfb: introduce lcdif_power_down
imx: mx6: implement reset_misc
imx: imx-common: power down lcdif before boot os
imx: mx7: compile misc.c for mx7
imx: mx7 use the common lcdif register structure
imx: mx7dsabresd: support lcdif
arch/arm/cpu/arm926ejs/mxs/clock.c | 2 +- arch/arm/cpu/armv7/mx6/clock.c | 239 ++++++++++++++++++++++ arch/arm/cpu/armv7/mx6/soc.c | 8 + arch/arm/imx-common/Makefile | 2 +- arch/arm/imx-common/cpu.c | 3 + arch/arm/include/asm/arch-mx6/clock.h | 2 + arch/arm/include/asm/arch-mx6/crm_regs.h | 34 ++- arch/arm/include/asm/arch-mx6/imx-regs.h | 15 +- arch/arm/include/asm/arch-mx7/imx-regs.h | 96 +-------- arch/arm/include/asm/arch-mxs/clock.h | 2 +- arch/arm/include/asm/arch-mxs/regs-lcdif.h | 201 +----------------- arch/arm/include/asm/imx-common/regs-lcdif.h | 224 ++++++++++++++++++++ arch/arm/include/asm/imx-common/sys_proto.h | 2 + board/creative/xfi3/xfi3.c | 2 +- board/freescale/mx6ul_14x14_evk/mx6ul_14x14_evk.c | 63 ++++++ board/freescale/mx7dsabresd/mx7dsabresd.c | 64 ++++++ board/sandisk/sansa_fuze_plus/sfp.c | 2 +- drivers/video/mxsfb.c | 19 +- include/configs/mx6ul_14x14_evk.h | 18 ++ include/configs/mx7dsabresd.h | 17 ++ 20 files changed, 705 insertions(+), 310 deletions(-) create mode 100644 arch/arm/include/asm/imx-common/regs-lcdif.h
Signature · 1 line
1.8.4
PATCH v2 1/14 mxs: add parameter base_addr for mxs_set_lcdclk
Change mxs_set_lcdclk prototype to add a new parameter base_addr. There are two LCD interfaces for i.MX6SX, we may support LCDIF1 or LCDIF2.
---
V2:
none
arch/arm/cpu/arm926ejs/mxs/clock.c | 2 +- arch/arm/include/asm/arch-mxs/clock.h | 2 +- drivers/video/mxsfb.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-)
arch/arm/cpu/arm926ejs/mxs/clock.c +1 -1
@@ -309,7 +309,7 @@ void mxs_set_ssp_busclock(unsigned int bus, uint32_t freq) bus, tgtclk, freq); } -void mxs_set_lcdclk (uint32_t freq) +void mxs_set_lcdclk (uint32_t base_addr,uint32_t freq) {struct mxs_clkctrl_regs *clkctrl_regs = (struct mxs_clkctrl_regs *)MXS_CLKCTRL_BASE ;
arch/arm/include/asm/arch-mxs/clock.h +1 -1
@@ -46,7 +46,7 @@ uint32_t mxc_get_clock(enum mxc_clock clk);void mxs_set_ioclk (enum mxs_ioclock io,uint32_t freq);void mxs_set_sspclk (enum mxs_sspclock ssp,uint32_t freq,int xtal);void mxs_set_ssp_busclock (unsigned int bus,uint32_t freq); -void mxs_set_lcdclk (uint32_t freq); +void mxs_set_lcdclk (uint32_t base_addr,uint32_t freq);/* Compatibility with the FEC Ethernet driver */ #define imx_get_fecclk () mxc_get_clock(MXC_AHB_CLK)
drivers/video/mxsfb.c +1 -1
@@ -55,7 +55,7 @@ static void mxs_lcd_init(GraphicDevice *panel,uint8_t valid_data =0 ;/* Kick in the LCDIF clock */ -mxs_set_lcdclk (PS2KHZ (mode->pixclock)); +mxs_set_lcdclk (MXS_LCDIF_BASE ,PS2KHZ (mode->pixclock));/* Restart the LCDIF block */ mxs_reset_block (®s->hw_lcdif_ctrl_reg);
Signature · 1 line
1.8.4
PATCH v2 1/14 mxs: add parameter base_addr for mxs_set_lcdclk
Hi Peng,
Quoted 4 lines · Peng Fan
Change
mxs_set_lcdclkprototype to add a new parameterbase_addr. There are two LCD interfaces for i.MX6SX, we may support LCDIF1 or LCDIF2.
ok - from your commit message I am waiting that both LCDIF1 and LCDIF2 can be supported, and a user (board maintainer) can switch between them. And in later patch mxs_set_lcdclk() is avalilable for mx6sx and mx6ul, that makes this inconsistent.
But I do not understand how the support for the second LCDIF is implemented. I should see that the register set points to LCDIF1 or LCDIF2.
More as extending to both LCDIF1 and LCDIF2, it looks to me that this is consistent with mxs_set_lcdclk() in mx7.
arch/arm/include/asm/arch-mxs/clock.h
Quoted 27 lines
Signed-off-by Peng Fan <[email protected]>Cc Stefano Babic <[email protected]>Cc Anatolij Gustschin <[email protected]>---
V2:
nonearch/arm/cpu/arm926ejs/mxs/clock.c | 2 +- arch/arm/include/asm/arch-mxs/clock.h | 2 +- drivers/video/mxsfb.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-)arch/arm/cpu/arm926ejs/mxs/clock.c +1
-1@@ -309,7 +309,7 @@ void mxs_set_ssp_busclock(unsigned int bus, uint32_t freq) bus, tgtclk, freq); } -void mxs_set_lcdclk (uint32_t freq) +void mxs_set_lcdclk (uint32_t base_addr,uint32_t freq) {struct mxs_clkctrl_regs *clkctrl_regs = (struct mxs_clkctrl_regs *)MXS_CLKCTRL_BASE ;arch/arm/include/asm/arch-mxs/clock.h +0
-0
This patch should generate warnings, because base_addr is not used. You should at least add an __maybe_unused attribute.
Anyway, I am asking myself if it makes sense to pass an address. Really, you want to pass an index if you want to support LCDIF1 or LCDIF2. This makes more sense as passing an address. In you code later (patch 7/14), you check the address like an index:
if (base_addr == LCDIF1_BASE_ADDR) {This makes inconsistent. If you need it as address, this means you will use it as address later, casting to a register structure. If you use as I understand as index, that please use an enumeration for it.
Quoted 18 lines
index fc9d75b..8840335 100644
arch/arm/include/asm/arch-mxs/clock.h +1
-1@@ -46,7 +46,7 @@ uint32_t mxc_get_clock(enum mxc_clock clk);void mxs_set_ioclk (enum mxs_ioclock io,uint32_t freq);void mxs_set_sspclk (enum mxs_sspclock ssp,uint32_t freq,int xtal);void mxs_set_ssp_busclock (unsigned int bus,uint32_t freq); -void mxs_set_lcdclk (uint32_t freq); +void mxs_set_lcdclk (uint32_t base_addr,uint32_t freq);/* Compatibility with the FEC Ethernet driver */ #define imx_get_fecclk () mxc_get_clock(MXC_AHB_CLK)drivers/video/mxsfb.c +0
-0
drivers/video/mxsfb.c static void mxs_lcd_init(GraphicDevice *panel, · line 61
Quoted 8 lines
drivers/video/mxsfb.c +1
-1@@ -55,7 +55,7 @@ static void mxs_lcd_init(GraphicDevice *panel,uint8_t valid_data =0 ;/* Kick in the LCDIF clock */ -mxs_set_lcdclk (PS2KHZ (mode->pixclock)); +mxs_set_lcdclk (MXS_LCDIF_BASE ,PS2KHZ (mode->pixclock));/* Restart the LCDIF block */ mxs_reset_block (®s->hw_lcdif_ctrl_reg);
Best regards,
Stefano Babic
Signature · 5 lines
===================================================================== DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de =====================================================================
PATCH v2 1/14 mxs: add parameter base_addr for mxs_set_lcdclk
Hi Stefano,
Sorry for this late reply.
Quoted 9 lines · Stefano Babic
Hi Peng,
Quoted 4 lines · Peng Fan
Change
mxs_set_lcdclkprototype to add a new parameterbase_addr. There are two LCD interfaces for i.MX6SX, we may support LCDIF1 or LCDIF2.
Quoted 4 lines
ok - from your commit message I am waiting that both LCDIF1 and LCDIF2 can be supported, and a user (board maintainer) can switch between them. And in later patch
mxs_set_lcdclk()is avalilable for mx6sx and mx6ul, that makes this inconsistent.
I can not get you about 'inconsistent'.
The reason to add LCDIF1 and LCDIF2
support is that the board design may use LCDIF1 or LCDIF2. The mxs_set_lcdlck should support setting clock for LCDIF1 and LCDIF2.
There two LCDIFs for i.MX6SX and i.MX7D.
Quoted 6 lines
But I do not understand how the support for the second LCDIF is implemented. I should see that the register set points to LCDIF1 or LCDIF2.
More as extending to both LCDIF1 and LCDIF2, it looks to me that this is consistent with
mxs_set_lcdclk()in mx7.
The current mxs_set_lcdclk for mx7 is same with freescale vendor uboot, but its prototype is not consistent with the current upstream uboot. Since its prototype is same with my idea in this patchset, I do not need to change it.
Quoted 23 lines
Quoted 23 lines
Signed-off-by Peng Fan <[email protected]>Cc Stefano Babic <[email protected]>Cc Anatolij Gustschin <[email protected]>---
V2:
nonearch/arm/cpu/arm926ejs/mxs/clock.c | 2 +- arch/arm/include/asm/arch-mxs/clock.h | 2 +- drivers/video/mxsfb.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-)arch/arm/cpu/arm926ejs/mxs/clock.c +0
-0@@ -309,7 +309,7 @@ void mxs_set_ssp_busclock(unsigned int bus, uint32_t freq) bus, tgtclk, freq); }
Quoted 9 lines
arch/arm/include/asm/arch-mxs/clock.h
Quoted 6 lines
arch/arm/cpu/arm926ejs/mxs/clock.c +1
-1-void mxs_set_lcdclk (uint32_t freq) +void mxs_set_lcdclk (uint32_t base_addr,uint32_t freq) {struct mxs_clkctrl_regs *clkctrl_regs = (struct mxs_clkctrl_regs *)MXS_CLKCTRL_BASE ;arch/arm/include/asm/arch-mxs/clock.h +0
-0This patch should generate warnings, because
base_addris not used. You should at least add an__maybe_unusedattribute.
Ok. will add this attribute.
Quoted 7 lines
Anyway, I am asking myself if it makes sense to pass an address. Really, you want to pass an index if you want to support LCDIF1 or LCDIF2. This makes more sense as passing an address. In you code later (patch 7/14), you check the address like an index:
Quoted 5 lines
if (base_addr == LCDIF1_BASE_ADDR) {This makes inconsistent. If you need it as address, this means you will use it as address later, casting to a register structure. If you use as I understand as index, that please use an enumeration for it.
I'll switch to use index.mxs_set_clk(u32 index, u32 freq), and in mxs_set_clk, choose coresponding base address according to index.
Regards,
Peng.
Quoted 37 lines
Quoted 19 lines
index fc9d75b..8840335 100644
arch/arm/include/asm/arch-mxs/clock.h +1
-1@@ -46,7 +46,7 @@ uint32_t mxc_get_clock(enum mxc_clock clk);void mxs_set_ioclk (enum mxs_ioclock io,uint32_t freq);void mxs_set_sspclk (enum mxs_sspclock ssp,uint32_t freq,int xtal);void mxs_set_ssp_busclock (unsigned int bus,uint32_t freq); -void mxs_set_lcdclk (uint32_t freq); +void mxs_set_lcdclk (uint32_t base_addr,uint32_t freq);/* Compatibility with the FEC Ethernet driver */ #define imx_get_fecclk () mxc_get_clock(MXC_AHB_CLK)drivers/video/mxsfb.c +0
-0drivers/video/mxsfb.c static void mxs_lcd_init(GraphicDevice *panel, · line 61
Quoted 8 lines
drivers/video/mxsfb.c +1
-1@@ -55,7 +55,7 @@ static void mxs_lcd_init(GraphicDevice *panel,uint8_t valid_data =0 ;/* Kick in the LCDIF clock */ -mxs_set_lcdclk (PS2KHZ (mode->pixclock)); +mxs_set_lcdclk (MXS_LCDIF_BASE ,PS2KHZ (mode->pixclock));/* Restart the LCDIF block */ mxs_reset_block (®s->hw_lcdif_ctrl_reg);Best regards,
Stefano BabicSignature · 5 lines
===================================================================== DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de =====================================================================
PATCH v2 1/14 mxs: add parameter base_addr for mxs_set_lcdclk
Hi Peng,
Quoted 19 lines · Peng Fan
Hi Stefano,
Sorry for this late reply.
Quoted 9 lines · Stefano Babic
Hi Peng,
Quoted 4 lines · Peng Fan
Change
mxs_set_lcdclkprototype to add a new parameterbase_addr. There are two LCD interfaces for i.MX6SX, we may support LCDIF1 or LCDIF2.Quoted 4 lines
ok - from your commit message I am waiting that both LCDIF1 and LCDIF2 can be supported, and a user (board maintainer) can switch between them. And in later patch
mxs_set_lcdclk()is avalilable for mx6sx and mx6ul, that makes this inconsistent.
Quoted 7 lines
I can not get you about 'inconsistent'.
The reason to add LCDIF1 and LCDIF2
support is that the board design may use LCDIF1 or LCDIF2. Themxs_set_lcdlckshould support setting clock for LCDIF1 and LCDIF2.There two LCDIFs for i.MX6SX and i.MX7D.
This is fine, but I had the impression that the patch supports LCDIF1 on mx6(sx|ul) and mx7, not LCDIF2. It looks like I have misunderstood. Can you help me to better understand ? Does it really work with LCDIF2 ?
Quoted 4 lines
Quoted 4 lines
But I do not understand how the support for the second LCDIF is implemented. I should see that the register set points to LCDIF1 or LCDIF2.
Again this is the point I misunderstand.
Best regards,
Stefano Babic
Signature · 5 lines
===================================================================== DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de =====================================================================
PATCH v2 1/14 mxs: add parameter base_addr for mxs_set_lcdclk
Hi Stefano,
Quoted 28 lines · Stefano Babic
Hi Peng,
Quoted 25 lines · Peng Fan
Hi Stefano,
Sorry for this late reply.
Quoted 9 lines · Stefano Babic
Hi Peng,
Quoted 4 lines · Peng Fan
Change
mxs_set_lcdclkprototype to add a new parameterbase_addr. There are two LCD interfaces for i.MX6SX, we may support LCDIF1 or LCDIF2.Quoted 4 lines
ok - from your commit message I am waiting that both LCDIF1 and LCDIF2 can be supported, and a user (board maintainer) can switch between them. And in later patch
mxs_set_lcdclk()is avalilable for mx6sx and mx6ul, that makes this inconsistent.I can not get you about 'inconsistent'.
The reason to add LCDIF1 and LCDIF2
support is that the board design may use LCDIF1 or LCDIF2. Themxs_set_lcdlckshould support setting clock for LCDIF1 and LCDIF2.
Quoted 5 lines
Quoted 1 line
There two LCDIFs for i.MX6SX and i.MX7D.
This is fine, but I had the impression that the patch supports LCDIF1 on mx6(sx|ul) and mx7, not LCDIF2. It looks like I have misunderstood. Can you help me to better understand ? Does it really work with LCDIF2 ?
The patch set contains clk related register settings, see mxs_set_lcdclk, in patch [PATCH V2 07/14] imx: mx6: add clock api for lcdif. I need to address your comments about this patch.
The is_cpu_type(MXC_CPU_MX6SX) handles the LCDIF2.
I have not tested it for lCDIF2, but it's in fsl's vendor uboot, it should work. For now, I only have 6ul and 7d in hand to test LCDIF1.
Regards,
Peng.
Quoted 18 lines
Quoted 5 lines
Quoted 5 lines
But I do not understand how the support for the second LCDIF is implemented. I should see that the register set points to LCDIF1 or LCDIF2.
Again this is the point I misunderstand.
Best regards,
Stefano BabicSignature · 5 lines
===================================================================== DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de =====================================================================
PATCH v2 2/14 sandisk: sfp: correct function name
In reply to Peng Fanboard_mxsfb_system_setup shoule be named mxsfb_system_setup.
---
V2:
none
board/sandisk/sansa_fuze_plus/sfp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
board/sandisk/sansa_fuze_plus/sfp.c +1 -1
@@ -311,7 +311,7 @@ static const struct { { 0x07, 0 , 0x0173 }, }; -void board_mxsfb_system_setup (void ) +void mxsfb_system_setup (void ) {struct mxs_lcdif_regs *regs = (struct mxs_lcdif_regs *)MXS_LCDIF_BASE ;uint32_t id;
Signature · 1 line
1.8.4
PATCH v2 2/14 sandisk: sfp: correct function name
Hi Peng,
Quoted 19 lines · Peng Fan
board_mxsfb_system_setupshoule be namedmxsfb_system_setup.Signed-off-by Peng Fan <[email protected]>Cc Marek Vasut <[email protected]>Cc Stefano Babic <[email protected]>---
V2:
noneboard/sandisk/sansa_fuze_plus/sfp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)board/sandisk/sansa_fuze_plus/sfp.c +0
-0
board/sandisk/sansa_fuze_plus/sfp.c static const struct { · line 317
Quoted 8 lines
board/sandisk/sansa_fuze_plus/sfp.c +1
-1@@ -311,7 +311,7 @@ static const struct { { 0x07, 0 , 0x0173 }, }; -void board_mxsfb_system_setup (void ) +void mxsfb_system_setup (void ) {struct mxs_lcdif_regs *regs = (struct mxs_lcdif_regs *)MXS_LCDIF_BASE ;uint32_t id;
This is really a bug. Wrong name was not seen before. It looks like this series mixes some new features (LCDIF) with bug fixes that are quite orthogonal, as in this case. I will propose that I will start merge the easy fixes (as this one), and you won't need to post them in a new version.
Best regards,
Stefano Babic
Signature · 5 lines
===================================================================== DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de =====================================================================
PATCH v2 3/14 xfi3: correct function name
In reply to Peng Fanboard_mxsfb_system_setup shoule be named mxsfb_system_setup.
---
V2:
none
board/creative/xfi3/xfi3.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
board/creative/xfi3/xfi3.c +1 -1
@@ -163,7 +163,7 @@ static const struct { { 0x21, 0, 0x0000 }, }; -void board_mxsfb_system_setup (void ) +void mxsfb_system_setup (void ) {struct mxs_lcdif_regs *regs = (struct mxs_lcdif_regs *)MXS_LCDIF_BASE ;int i;
Signature · 1 line
1.8.4
PATCH v2 3/14 xfi3: correct function name
Quoted 1 line · Peng Fan
board_mxsfb_system_setupshoule be namedmxsfb_system_setup.
^---should
But really it is better *must*, else it is dead code as we currently have.
Quoted 18 lines
Signed-off-by Peng Fan <[email protected]>Cc Marek Vasut <[email protected]>Cc Stefano Babic <[email protected]>---
V2:
noneboard/creative/xfi3/xfi3.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)board/creative/xfi3/xfi3.c +0
-0
board/creative/xfi3/xfi3.c static const struct { · line 169
Quoted 8 lines
board/creative/xfi3/xfi3.c +1
-1@@ -163,7 +163,7 @@ static const struct { { 0x21, 0, 0x0000 }, }; -void board_mxsfb_system_setup (void ) +void mxsfb_system_setup (void ) {struct mxs_lcdif_regs *regs = (struct mxs_lcdif_regs *)MXS_LCDIF_BASE ;int i;
Best regards,
Stefano Babic
Signature · 5 lines
===================================================================== DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de =====================================================================
PATCH v2 3/14 xfi3: correct function name
Hi Stefano,
Quoted 5 lines · Stefano Babic
Quoted 1 line · Peng Fan
board_mxsfb_system_setupshoule be namedmxsfb_system_setup.^---shouldBut really it is better *must*, else it is dead code as we currently have.
Will fix the typo in V3.
Thanks,
Peng.
Quoted 37 lines
Quoted 19 lines
Signed-off-by Peng Fan <[email protected]>Cc Marek Vasut <[email protected]>Cc Stefano Babic <[email protected]>---
V2:
noneboard/creative/xfi3/xfi3.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)board/creative/xfi3/xfi3.c +0
-0board/creative/xfi3/xfi3.c static const struct { · line 169
Quoted 8 lines
board/creative/xfi3/xfi3.c +1
-1@@ -163,7 +163,7 @@ static const struct { { 0x21, 0, 0x0000 }, }; -void board_mxsfb_system_setup (void ) +void mxsfb_system_setup (void ) {struct mxs_lcdif_regs *regs = (struct mxs_lcdif_regs *)MXS_LCDIF_BASE ;int i;Best regards,
Stefano BabicSignature · 5 lines
===================================================================== DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de =====================================================================
PATCH v2 4/14 imx: imx-common: move lcdif structure and macro definition to imx-common
In reply to Peng FanMove 'struct mxs_lcdif_regs' and lcdif related macro definitions to arch/arm/include/asm/imx-common/regs-lcdif.h.
i.MX6SX/UL/28 have similar register layout and bit definitions of registers.
---
V2:
none
arch/arm/include/asm/arch-mxs/regs-lcdif.h | 201 +----------------------- arch/arm/include/asm/imx-common/regs-lcdif.h | 222 +++++++++++++++++++++++++++ 2 files changed, 223 insertions(+), 200 deletions(-) create mode 100644 arch/arm/include/asm/imx-common/regs-lcdif.h
arch/arm/include/asm/arch-mxs/regs-lcdif.h +1 -200
@@ -13,205 +13,6 @@#ifndef __MX28_REGS_LCDIF_H__#define __MX28_REGS_LCDIF_H__ -#include <asm/imx-common/regs-common.h> - -#ifndef __ASSEMBLY__ -struct mxs_lcdif_regs { - mxs_reg_32(hw_lcdif_ctrl) /* 0x00 */ - mxs_reg_32(hw_lcdif_ctrl1) /* 0x10 */ -#if defined(CONFIG_MX28) - mxs_reg_32(hw_lcdif_ctrl2) /* 0x20 */ -#endif - mxs_reg_32(hw_lcdif_transfer_count) /* 0x20/0x30 */ - mxs_reg_32(hw_lcdif_cur_buf) /* 0x30/0x40 */ - mxs_reg_32(hw_lcdif_next_buf) /* 0x40/0x50 */ - -#if defined(CONFIG_MX23) - uint32_t reserved1[4]; -#endif - - mxs_reg_32(hw_lcdif_timing) /* 0x60 */ - mxs_reg_32(hw_lcdif_vdctrl0) /* 0x70 */ - mxs_reg_32(hw_lcdif_vdctrl1) /* 0x80 */ - mxs_reg_32(hw_lcdif_vdctrl2) /* 0x90 */ - mxs_reg_32(hw_lcdif_vdctrl3) /* 0xa0 */ - mxs_reg_32(hw_lcdif_vdctrl4) /* 0xb0 */ - mxs_reg_32(hw_lcdif_dvictrl0) /* 0xc0 */ - mxs_reg_32(hw_lcdif_dvictrl1) /* 0xd0 */ - mxs_reg_32(hw_lcdif_dvictrl2) /* 0xe0 */ - mxs_reg_32(hw_lcdif_dvictrl3) /* 0xf0 */ - mxs_reg_32(hw_lcdif_dvictrl4) /* 0x100 */ - mxs_reg_32(hw_lcdif_csc_coeffctrl0) /* 0x110 */ - mxs_reg_32(hw_lcdif_csc_coeffctrl1) /* 0x120 */ - mxs_reg_32(hw_lcdif_csc_coeffctrl2) /* 0x130 */ - mxs_reg_32(hw_lcdif_csc_coeffctrl3) /* 0x140 */ - mxs_reg_32(hw_lcdif_csc_coeffctrl4) /* 0x150 */ - mxs_reg_32(hw_lcdif_csc_offset) /* 0x160 */ - mxs_reg_32(hw_lcdif_csc_limit) /* 0x170 */ - -#if defined(CONFIG_MX23) - uint32_t reserved2[12]; -#endif - mxs_reg_32(hw_lcdif_data) /* 0x1b0/0x180 */ - mxs_reg_32(hw_lcdif_bm_error_stat) /* 0x1c0/0x190 */ -#if defined(CONFIG_MX28) - mxs_reg_32(hw_lcdif_crc_stat) /* 0x1a0 */ -#endif - mxs_reg_32(hw_lcdif_lcdif_stat) /* 0x1d0/0x1b0 */ - mxs_reg_32(hw_lcdif_version) /* 0x1e0/0x1c0 */ - mxs_reg_32(hw_lcdif_debug0) /* 0x1f0/0x1d0 */ - mxs_reg_32(hw_lcdif_debug1) /* 0x200/0x1e0 */ - mxs_reg_32(hw_lcdif_debug2) /* 0x1f0 */ -}; -#endif - -#define LCDIF_CTRL_SFTRST (1 << 31) -#define LCDIF_CTRL_CLKGATE (1 << 30) -#define LCDIF_CTRL_YCBCR422_INPUT (1 << 29) -#define LCDIF_CTRL_READ_WRITEB (1 << 28) -#define LCDIF_CTRL_WAIT_FOR_VSYNC_EDGE (1 << 27) -#define LCDIF_CTRL_DATA_SHIFT_DIR (1 << 26) -#define LCDIF_CTRL_SHIFT_NUM_BITS_MASK (0x1f << 21) -#define LCDIF_CTRL_SHIFT_NUM_BITS_OFFSET 21 -#define LCDIF_CTRL_DVI_MODE (1 << 20) -#define LCDIF_CTRL_BYPASS_COUNT (1 << 19) -#define LCDIF_CTRL_VSYNC_MODE (1 << 18) -#define LCDIF_CTRL_DOTCLK_MODE (1 << 17) -#define LCDIF_CTRL_DATA_SELECT (1 << 16) -#define LCDIF_CTRL_INPUT_DATA_SWIZZLE_MASK (0x3 << 14) -#define LCDIF_CTRL_INPUT_DATA_SWIZZLE_OFFSET 14 -#define LCDIF_CTRL_CSC_DATA_SWIZZLE_MASK (0x3 << 12) -#define LCDIF_CTRL_CSC_DATA_SWIZZLE_OFFSET 12 -#define LCDIF_CTRL_LCD_DATABUS_WIDTH_MASK (0x3 << 10) -#define LCDIF_CTRL_LCD_DATABUS_WIDTH_OFFSET 10 -#define LCDIF_CTRL_LCD_DATABUS_WIDTH_16BIT (0 << 10) -#define LCDIF_CTRL_LCD_DATABUS_WIDTH_8BIT (1 << 10) -#define LCDIF_CTRL_LCD_DATABUS_WIDTH_18BIT (2 << 10) -#define LCDIF_CTRL_LCD_DATABUS_WIDTH_24BIT (3 << 10) -#define LCDIF_CTRL_WORD_LENGTH_MASK (0x3 << 8) -#define LCDIF_CTRL_WORD_LENGTH_OFFSET 8 -#define LCDIF_CTRL_WORD_LENGTH_16BIT (0 << 8) -#define LCDIF_CTRL_WORD_LENGTH_8BIT (1 << 8) -#define LCDIF_CTRL_WORD_LENGTH_18BIT (2 << 8) -#define LCDIF_CTRL_WORD_LENGTH_24BIT (3 << 8) -#define LCDIF_CTRL_RGB_TO_YCBCR422_CSC (1 << 7) -#define LCDIF_CTRL_LCDIF_MASTER (1 << 5) -#define LCDIF_CTRL_DATA_FORMAT_16_BIT (1 << 3) -#define LCDIF_CTRL_DATA_FORMAT_18_BIT (1 << 2) -#define LCDIF_CTRL_DATA_FORMAT_24_BIT (1 << 1) -#define LCDIF_CTRL_RUN (1 << 0) - -#define LCDIF_CTRL1_COMBINE_MPU_WR_STRB (1 << 27) -#define LCDIF_CTRL1_BM_ERROR_IRQ_EN (1 << 26) -#define LCDIF_CTRL1_BM_ERROR_IRQ (1 << 25) -#define LCDIF_CTRL1_RECOVER_ON_UNDERFLOW (1 << 24) -#define LCDIF_CTRL1_INTERLACE_FIELDS (1 << 23) -#define LCDIF_CTRL1_START_INTERLACE_FROM_SECOND_FIELD (1 << 22) -#define LCDIF_CTRL1_FIFO_CLEAR (1 << 21) -#define LCDIF_CTRL1_IRQ_ON_ALTERNATE_FIELDS (1 << 20) -#define LCDIF_CTRL1_BYTE_PACKING_FORMAT_MASK (0xf << 16) -#define LCDIF_CTRL1_BYTE_PACKING_FORMAT_OFFSET 16 -#define LCDIF_CTRL1_OVERFLOW_IRQ_EN (1 << 15) -#define LCDIF_CTRL1_UNDERFLOW_IRQ_EN (1 << 14) -#define LCDIF_CTRL1_CUR_FRAME_DONE_IRQ_EN (1 << 13) -#define LCDIF_CTRL1_VSYNC_EDGE_IRQ_EN (1 << 12) -#define LCDIF_CTRL1_OVERFLOW_IRQ (1 << 11) -#define LCDIF_CTRL1_UNDERFLOW_IRQ (1 << 10) -#define LCDIF_CTRL1_CUR_FRAME_DONE_IRQ (1 << 9) -#define LCDIF_CTRL1_VSYNC_EDGE_IRQ (1 << 8) -#define LCDIF_CTRL1_BUSY_ENABLE (1 << 2) -#define LCDIF_CTRL1_MODE86 (1 << 1) -#define LCDIF_CTRL1_RESET (1 << 0) - -#define LCDIF_CTRL2_OUTSTANDING_REQS_MASK (0x7 << 21) -#define LCDIF_CTRL2_OUTSTANDING_REQS_OFFSET 21 -#define LCDIF_CTRL2_OUTSTANDING_REQS_REQ_1 (0x0 << 21) -#define LCDIF_CTRL2_OUTSTANDING_REQS_REQ_2 (0x1 << 21) -#define LCDIF_CTRL2_OUTSTANDING_REQS_REQ_4 (0x2 << 21) -#define LCDIF_CTRL2_OUTSTANDING_REQS_REQ_8 (0x3 << 21) -#define LCDIF_CTRL2_OUTSTANDING_REQS_REQ_16 (0x4 << 21) -#define LCDIF_CTRL2_BURST_LEN_8 (1 << 20) -#define LCDIF_CTRL2_ODD_LINE_PATTERN_MASK (0x7 << 16) -#define LCDIF_CTRL2_ODD_LINE_PATTERN_OFFSET 16 -#define LCDIF_CTRL2_ODD_LINE_PATTERN_RGB (0x0 << 16) -#define LCDIF_CTRL2_ODD_LINE_PATTERN_RBG (0x1 << 16) -#define LCDIF_CTRL2_ODD_LINE_PATTERN_GBR (0x2 << 16) -#define LCDIF_CTRL2_ODD_LINE_PATTERN_GRB (0x3 << 16) -#define LCDIF_CTRL2_ODD_LINE_PATTERN_BRG (0x4 << 16) -#define LCDIF_CTRL2_ODD_LINE_PATTERN_BGR (0x5 << 16) -#define LCDIF_CTRL2_EVEN_LINE_PATTERN_MASK (0x7 << 12) -#define LCDIF_CTRL2_EVEN_LINE_PATTERN_OFFSET 12 -#define LCDIF_CTRL2_EVEN_LINE_PATTERN_RGB (0x0 << 12) -#define LCDIF_CTRL2_EVEN_LINE_PATTERN_RBG (0x1 << 12) -#define LCDIF_CTRL2_EVEN_LINE_PATTERN_GBR (0x2 << 12) -#define LCDIF_CTRL2_EVEN_LINE_PATTERN_GRB (0x3 << 12) -#define LCDIF_CTRL2_EVEN_LINE_PATTERN_BRG (0x4 << 12) -#define LCDIF_CTRL2_EVEN_LINE_PATTERN_BGR (0x5 << 12) -#define LCDIF_CTRL2_READ_PACK_DIR (1 << 10) -#define LCDIF_CTRL2_READ_MODE_OUTPUT_IN_RGB_FORMAT (1 << 9) -#define LCDIF_CTRL2_READ_MODE_6_BIT_INPUT (1 << 8) -#define LCDIF_CTRL2_READ_MODE_NUM_PACKED_SUBWORDS_MASK (0x7 << 4) -#define LCDIF_CTRL2_READ_MODE_NUM_PACKED_SUBWORDS_OFFSET 4 -#define LCDIF_CTRL2_INITIAL_DUMMY_READ_MASK (0x7 << 1) -#define LCDIF_CTRL2_INITIAL_DUMMY_READ_OFFSET 1 - -#define LCDIF_TRANSFER_COUNT_V_COUNT_MASK (0xffff << 16) -#define LCDIF_TRANSFER_COUNT_V_COUNT_OFFSET 16 -#define LCDIF_TRANSFER_COUNT_H_COUNT_MASK (0xffff << 0) -#define LCDIF_TRANSFER_COUNT_H_COUNT_OFFSET 0 - -#define LCDIF_CUR_BUF_ADDR_MASK 0xffffffff -#define LCDIF_CUR_BUF_ADDR_OFFSET 0 - -#define LCDIF_NEXT_BUF_ADDR_MASK 0xffffffff -#define LCDIF_NEXT_BUF_ADDR_OFFSET 0 - -#define LCDIF_TIMING_CMD_HOLD_MASK (0xff << 24) -#define LCDIF_TIMING_CMD_HOLD_OFFSET 24 -#define LCDIF_TIMING_CMD_SETUP_MASK (0xff << 16) -#define LCDIF_TIMING_CMD_SETUP_OFFSET 16 -#define LCDIF_TIMING_DATA_HOLD_MASK (0xff << 8) -#define LCDIF_TIMING_DATA_HOLD_OFFSET 8 -#define LCDIF_TIMING_DATA_SETUP_MASK (0xff << 0) -#define LCDIF_TIMING_DATA_SETUP_OFFSET 0 - -#define LCDIF_VDCTRL0_VSYNC_OEB (1 << 29) -#define LCDIF_VDCTRL0_ENABLE_PRESENT (1 << 28) -#define LCDIF_VDCTRL0_VSYNC_POL (1 << 27) -#define LCDIF_VDCTRL0_HSYNC_POL (1 << 26) -#define LCDIF_VDCTRL0_DOTCLK_POL (1 << 25) -#define LCDIF_VDCTRL0_ENABLE_POL (1 << 24) -#define LCDIF_VDCTRL0_VSYNC_PERIOD_UNIT (1 << 21) -#define LCDIF_VDCTRL0_VSYNC_PULSE_WIDTH_UNIT (1 << 20) -#define LCDIF_VDCTRL0_HALF_LINE (1 << 19) -#define LCDIF_VDCTRL0_HALF_LINE_MODE (1 << 18) -#define LCDIF_VDCTRL0_VSYNC_PULSE_WIDTH_MASK 0x3ffff -#define LCDIF_VDCTRL0_VSYNC_PULSE_WIDTH_OFFSET 0 - -#define LCDIF_VDCTRL1_VSYNC_PERIOD_MASK 0xffffffff -#define LCDIF_VDCTRL1_VSYNC_PERIOD_OFFSET 0 - -#if defined(CONFIG_MX23) -#define LCDIF_VDCTRL2_HSYNC_PULSE_WIDTH_MASK (0xff << 24) -#define LCDIF_VDCTRL2_HSYNC_PULSE_WIDTH_OFFSET 24 -#elif defined(CONFIG_MX28) -#define LCDIF_VDCTRL2_HSYNC_PULSE_WIDTH_MASK (0x3fff << 18) -#define LCDIF_VDCTRL2_HSYNC_PULSE_WIDTH_OFFSET 18 -#endif -#define LCDIF_VDCTRL2_HSYNC_PERIOD_MASK 0x3ffff -#define LCDIF_VDCTRL2_HSYNC_PERIOD_OFFSET 0 - -#define LCDIF_VDCTRL3_MUX_SYNC_SIGNALS (1 << 29) -#define LCDIF_VDCTRL3_VSYNC_ONLY (1 << 28) -#define LCDIF_VDCTRL3_HORIZONTAL_WAIT_CNT_MASK (0xfff << 16) -#define LCDIF_VDCTRL3_HORIZONTAL_WAIT_CNT_OFFSET 16 -#define LCDIF_VDCTRL3_VERTICAL_WAIT_CNT_MASK (0xffff << 0) -#define LCDIF_VDCTRL3_VERTICAL_WAIT_CNT_OFFSET 0 - -#define LCDIF_VDCTRL4_DOTCLK_DLY_SEL_MASK (0x7 << 29) -#define LCDIF_VDCTRL4_DOTCLK_DLY_SEL_OFFSET 29 -#define LCDIF_VDCTRL4_SYNC_SIGNALS_ON (1 << 18) -#define LCDIF_VDCTRL4_DOTCLK_H_VALID_DATA_CNT_MASK 0x3ffff -#define LCDIF_VDCTRL4_DOTCLK_H_VALID_DATA_CNT_OFFSET 0 +#include <asm/imx-common/regs-lcdif.h> #endif /* __MX28_REGS_LCDIF_H__ */
arch/arm/include/asm/imx-common/regs-lcdif.h new file +222 -0
222 lines not on this page · raw message
Signature · 1 line
1.8.4
PATCH v2 4/14 imx: imx-common: move lcdif structure and macro definition to imx-common
Hi Peng,
Quoted 5 lines · Peng Fan
Move 'struct
mxs_lcdif_regs' and lcdif related macro definitions toarch/arm/include/asm/imx-common/regs-lcdif.h.i.MX6SX/UL/28 have similar register layout and bit definitions of registers.
I do not like this approach. Please split this patch into two: the first patch moves only into imx-common (and please use -M in format-patch to detect renaming), and the second one changes what you need to change. There is then no trace about changes in commit.
Quoted 442 lines
Signed-off-by Peng Fan <[email protected]>Cc Stefano Babic <[email protected]>---
V2:
nonearch/arm/include/asm/arch-mxs/regs-lcdif.h | 201 +----------------------- arch/arm/include/asm/imx-common/regs-lcdif.h | 222 +++++++++++++++++++++++++++ 2 files changed, 223 insertions(+), 200 deletions(-) create mode 100644 arch/arm/include/asm/imx-common/regs-lcdif.harch/arm/include/asm/arch-mxs/regs-lcdif.h +1
-200@@ -13,205 +13,6 @@#ifndef __MX28_REGS_LCDIF_H__#define __MX28_REGS_LCDIF_H__ -#include <asm/imx-common/regs-common.h> - -#ifndef __ASSEMBLY__ -struct mxs_lcdif_regs { - mxs_reg_32(hw_lcdif_ctrl) /* 0x00 */ - mxs_reg_32(hw_lcdif_ctrl1) /* 0x10 */ -#if defined(CONFIG_MX28) - mxs_reg_32(hw_lcdif_ctrl2) /* 0x20 */ -#endif - mxs_reg_32(hw_lcdif_transfer_count) /* 0x20/0x30 */ - mxs_reg_32(hw_lcdif_cur_buf) /* 0x30/0x40 */ - mxs_reg_32(hw_lcdif_next_buf) /* 0x40/0x50 */ - -#if defined(CONFIG_MX23) - uint32_t reserved1[4]; -#endif - - mxs_reg_32(hw_lcdif_timing) /* 0x60 */ - mxs_reg_32(hw_lcdif_vdctrl0) /* 0x70 */ - mxs_reg_32(hw_lcdif_vdctrl1) /* 0x80 */ - mxs_reg_32(hw_lcdif_vdctrl2) /* 0x90 */ - mxs_reg_32(hw_lcdif_vdctrl3) /* 0xa0 */ - mxs_reg_32(hw_lcdif_vdctrl4) /* 0xb0 */ - mxs_reg_32(hw_lcdif_dvictrl0) /* 0xc0 */ - mxs_reg_32(hw_lcdif_dvictrl1) /* 0xd0 */ - mxs_reg_32(hw_lcdif_dvictrl2) /* 0xe0 */ - mxs_reg_32(hw_lcdif_dvictrl3) /* 0xf0 */ - mxs_reg_32(hw_lcdif_dvictrl4) /* 0x100 */ - mxs_reg_32(hw_lcdif_csc_coeffctrl0) /* 0x110 */ - mxs_reg_32(hw_lcdif_csc_coeffctrl1) /* 0x120 */ - mxs_reg_32(hw_lcdif_csc_coeffctrl2) /* 0x130 */ - mxs_reg_32(hw_lcdif_csc_coeffctrl3) /* 0x140 */ - mxs_reg_32(hw_lcdif_csc_coeffctrl4) /* 0x150 */ - mxs_reg_32(hw_lcdif_csc_offset) /* 0x160 */ - mxs_reg_32(hw_lcdif_csc_limit) /* 0x170 */ - -#if defined(CONFIG_MX23) - uint32_t reserved2[12]; -#endif - mxs_reg_32(hw_lcdif_data) /* 0x1b0/0x180 */ - mxs_reg_32(hw_lcdif_bm_error_stat) /* 0x1c0/0x190 */ -#if defined(CONFIG_MX28) - mxs_reg_32(hw_lcdif_crc_stat) /* 0x1a0 */ -#endif - mxs_reg_32(hw_lcdif_lcdif_stat) /* 0x1d0/0x1b0 */ - mxs_reg_32(hw_lcdif_version) /* 0x1e0/0x1c0 */ - mxs_reg_32(hw_lcdif_debug0) /* 0x1f0/0x1d0 */ - mxs_reg_32(hw_lcdif_debug1) /* 0x200/0x1e0 */ - mxs_reg_32(hw_lcdif_debug2) /* 0x1f0 */ -}; -#endif - -#define LCDIF_CTRL_SFTRST (1 << 31) -#define LCDIF_CTRL_CLKGATE (1 << 30) -#define LCDIF_CTRL_YCBCR422_INPUT (1 << 29) -#define LCDIF_CTRL_READ_WRITEB (1 << 28) -#define LCDIF_CTRL_WAIT_FOR_VSYNC_EDGE (1 << 27) -#define LCDIF_CTRL_DATA_SHIFT_DIR (1 << 26) -#define LCDIF_CTRL_SHIFT_NUM_BITS_MASK (0x1f << 21) -#define LCDIF_CTRL_SHIFT_NUM_BITS_OFFSET 21 -#define LCDIF_CTRL_DVI_MODE (1 << 20) -#define LCDIF_CTRL_BYPASS_COUNT (1 << 19) -#define LCDIF_CTRL_VSYNC_MODE (1 << 18) -#define LCDIF_CTRL_DOTCLK_MODE (1 << 17) -#define LCDIF_CTRL_DATA_SELECT (1 << 16) -#define LCDIF_CTRL_INPUT_DATA_SWIZZLE_MASK (0x3 << 14) -#define LCDIF_CTRL_INPUT_DATA_SWIZZLE_OFFSET 14 -#define LCDIF_CTRL_CSC_DATA_SWIZZLE_MASK (0x3 << 12) -#define LCDIF_CTRL_CSC_DATA_SWIZZLE_OFFSET 12 -#define LCDIF_CTRL_LCD_DATABUS_WIDTH_MASK (0x3 << 10) -#define LCDIF_CTRL_LCD_DATABUS_WIDTH_OFFSET 10 -#define LCDIF_CTRL_LCD_DATABUS_WIDTH_16BIT (0 << 10) -#define LCDIF_CTRL_LCD_DATABUS_WIDTH_8BIT (1 << 10) -#define LCDIF_CTRL_LCD_DATABUS_WIDTH_18BIT (2 << 10) -#define LCDIF_CTRL_LCD_DATABUS_WIDTH_24BIT (3 << 10) -#define LCDIF_CTRL_WORD_LENGTH_MASK (0x3 << 8) -#define LCDIF_CTRL_WORD_LENGTH_OFFSET 8 -#define LCDIF_CTRL_WORD_LENGTH_16BIT (0 << 8) -#define LCDIF_CTRL_WORD_LENGTH_8BIT (1 << 8) -#define LCDIF_CTRL_WORD_LENGTH_18BIT (2 << 8) -#define LCDIF_CTRL_WORD_LENGTH_24BIT (3 << 8) -#define LCDIF_CTRL_RGB_TO_YCBCR422_CSC (1 << 7) -#define LCDIF_CTRL_LCDIF_MASTER (1 << 5) -#define LCDIF_CTRL_DATA_FORMAT_16_BIT (1 << 3) -#define LCDIF_CTRL_DATA_FORMAT_18_BIT (1 << 2) -#define LCDIF_CTRL_DATA_FORMAT_24_BIT (1 << 1) -#define LCDIF_CTRL_RUN (1 << 0) - -#define LCDIF_CTRL1_COMBINE_MPU_WR_STRB (1 << 27) -#define LCDIF_CTRL1_BM_ERROR_IRQ_EN (1 << 26) -#define LCDIF_CTRL1_BM_ERROR_IRQ (1 << 25) -#define LCDIF_CTRL1_RECOVER_ON_UNDERFLOW (1 << 24) -#define LCDIF_CTRL1_INTERLACE_FIELDS (1 << 23) -#define LCDIF_CTRL1_START_INTERLACE_FROM_SECOND_FIELD (1 << 22) -#define LCDIF_CTRL1_FIFO_CLEAR (1 << 21) -#define LCDIF_CTRL1_IRQ_ON_ALTERNATE_FIELDS (1 << 20) -#define LCDIF_CTRL1_BYTE_PACKING_FORMAT_MASK (0xf << 16) -#define LCDIF_CTRL1_BYTE_PACKING_FORMAT_OFFSET 16 -#define LCDIF_CTRL1_OVERFLOW_IRQ_EN (1 << 15) -#define LCDIF_CTRL1_UNDERFLOW_IRQ_EN (1 << 14) -#define LCDIF_CTRL1_CUR_FRAME_DONE_IRQ_EN (1 << 13) -#define LCDIF_CTRL1_VSYNC_EDGE_IRQ_EN (1 << 12) -#define LCDIF_CTRL1_OVERFLOW_IRQ (1 << 11) -#define LCDIF_CTRL1_UNDERFLOW_IRQ (1 << 10) -#define LCDIF_CTRL1_CUR_FRAME_DONE_IRQ (1 << 9) -#define LCDIF_CTRL1_VSYNC_EDGE_IRQ (1 << 8) -#define LCDIF_CTRL1_BUSY_ENABLE (1 << 2) -#define LCDIF_CTRL1_MODE86 (1 << 1) -#define LCDIF_CTRL1_RESET (1 << 0) - -#define LCDIF_CTRL2_OUTSTANDING_REQS_MASK (0x7 << 21) -#define LCDIF_CTRL2_OUTSTANDING_REQS_OFFSET 21 -#define LCDIF_CTRL2_OUTSTANDING_REQS_REQ_1 (0x0 << 21) -#define LCDIF_CTRL2_OUTSTANDING_REQS_REQ_2 (0x1 << 21) -#define LCDIF_CTRL2_OUTSTANDING_REQS_REQ_4 (0x2 << 21) -#define LCDIF_CTRL2_OUTSTANDING_REQS_REQ_8 (0x3 << 21) -#define LCDIF_CTRL2_OUTSTANDING_REQS_REQ_16 (0x4 << 21) -#define LCDIF_CTRL2_BURST_LEN_8 (1 << 20) -#define LCDIF_CTRL2_ODD_LINE_PATTERN_MASK (0x7 << 16) -#define LCDIF_CTRL2_ODD_LINE_PATTERN_OFFSET 16 -#define LCDIF_CTRL2_ODD_LINE_PATTERN_RGB (0x0 << 16) -#define LCDIF_CTRL2_ODD_LINE_PATTERN_RBG (0x1 << 16) -#define LCDIF_CTRL2_ODD_LINE_PATTERN_GBR (0x2 << 16) -#define LCDIF_CTRL2_ODD_LINE_PATTERN_GRB (0x3 << 16) -#define LCDIF_CTRL2_ODD_LINE_PATTERN_BRG (0x4 << 16) -#define LCDIF_CTRL2_ODD_LINE_PATTERN_BGR (0x5 << 16) -#define LCDIF_CTRL2_EVEN_LINE_PATTERN_MASK (0x7 << 12) -#define LCDIF_CTRL2_EVEN_LINE_PATTERN_OFFSET 12 -#define LCDIF_CTRL2_EVEN_LINE_PATTERN_RGB (0x0 << 12) -#define LCDIF_CTRL2_EVEN_LINE_PATTERN_RBG (0x1 << 12) -#define LCDIF_CTRL2_EVEN_LINE_PATTERN_GBR (0x2 << 12) -#define LCDIF_CTRL2_EVEN_LINE_PATTERN_GRB (0x3 << 12) -#define LCDIF_CTRL2_EVEN_LINE_PATTERN_BRG (0x4 << 12) -#define LCDIF_CTRL2_EVEN_LINE_PATTERN_BGR (0x5 << 12) -#define LCDIF_CTRL2_READ_PACK_DIR (1 << 10) -#define LCDIF_CTRL2_READ_MODE_OUTPUT_IN_RGB_FORMAT (1 << 9) -#define LCDIF_CTRL2_READ_MODE_6_BIT_INPUT (1 << 8) -#define LCDIF_CTRL2_READ_MODE_NUM_PACKED_SUBWORDS_MASK (0x7 << 4) -#define LCDIF_CTRL2_READ_MODE_NUM_PACKED_SUBWORDS_OFFSET 4 -#define LCDIF_CTRL2_INITIAL_DUMMY_READ_MASK (0x7 << 1) -#define LCDIF_CTRL2_INITIAL_DUMMY_READ_OFFSET 1 - -#define LCDIF_TRANSFER_COUNT_V_COUNT_MASK (0xffff << 16) -#define LCDIF_TRANSFER_COUNT_V_COUNT_OFFSET 16 -#define LCDIF_TRANSFER_COUNT_H_COUNT_MASK (0xffff << 0) -#define LCDIF_TRANSFER_COUNT_H_COUNT_OFFSET 0 - -#define LCDIF_CUR_BUF_ADDR_MASK 0xffffffff -#define LCDIF_CUR_BUF_ADDR_OFFSET 0 - -#define LCDIF_NEXT_BUF_ADDR_MASK 0xffffffff -#define LCDIF_NEXT_BUF_ADDR_OFFSET 0 - -#define LCDIF_TIMING_CMD_HOLD_MASK (0xff << 24) -#define LCDIF_TIMING_CMD_HOLD_OFFSET 24 -#define LCDIF_TIMING_CMD_SETUP_MASK (0xff << 16) -#define LCDIF_TIMING_CMD_SETUP_OFFSET 16 -#define LCDIF_TIMING_DATA_HOLD_MASK (0xff << 8) -#define LCDIF_TIMING_DATA_HOLD_OFFSET 8 -#define LCDIF_TIMING_DATA_SETUP_MASK (0xff << 0) -#define LCDIF_TIMING_DATA_SETUP_OFFSET 0 - -#define LCDIF_VDCTRL0_VSYNC_OEB (1 << 29) -#define LCDIF_VDCTRL0_ENABLE_PRESENT (1 << 28) -#define LCDIF_VDCTRL0_VSYNC_POL (1 << 27) -#define LCDIF_VDCTRL0_HSYNC_POL (1 << 26) -#define LCDIF_VDCTRL0_DOTCLK_POL (1 << 25) -#define LCDIF_VDCTRL0_ENABLE_POL (1 << 24) -#define LCDIF_VDCTRL0_VSYNC_PERIOD_UNIT (1 << 21) -#define LCDIF_VDCTRL0_VSYNC_PULSE_WIDTH_UNIT (1 << 20) -#define LCDIF_VDCTRL0_HALF_LINE (1 << 19) -#define LCDIF_VDCTRL0_HALF_LINE_MODE (1 << 18) -#define LCDIF_VDCTRL0_VSYNC_PULSE_WIDTH_MASK 0x3ffff -#define LCDIF_VDCTRL0_VSYNC_PULSE_WIDTH_OFFSET 0 - -#define LCDIF_VDCTRL1_VSYNC_PERIOD_MASK 0xffffffff -#define LCDIF_VDCTRL1_VSYNC_PERIOD_OFFSET 0 - -#if defined(CONFIG_MX23) -#define LCDIF_VDCTRL2_HSYNC_PULSE_WIDTH_MASK (0xff << 24) -#define LCDIF_VDCTRL2_HSYNC_PULSE_WIDTH_OFFSET 24 -#elif defined(CONFIG_MX28) -#define LCDIF_VDCTRL2_HSYNC_PULSE_WIDTH_MASK (0x3fff << 18) -#define LCDIF_VDCTRL2_HSYNC_PULSE_WIDTH_OFFSET 18 -#endif -#define LCDIF_VDCTRL2_HSYNC_PERIOD_MASK 0x3ffff -#define LCDIF_VDCTRL2_HSYNC_PERIOD_OFFSET 0 - -#define LCDIF_VDCTRL3_MUX_SYNC_SIGNALS (1 << 29) -#define LCDIF_VDCTRL3_VSYNC_ONLY (1 << 28) -#define LCDIF_VDCTRL3_HORIZONTAL_WAIT_CNT_MASK (0xfff << 16) -#define LCDIF_VDCTRL3_HORIZONTAL_WAIT_CNT_OFFSET 16 -#define LCDIF_VDCTRL3_VERTICAL_WAIT_CNT_MASK (0xffff << 0) -#define LCDIF_VDCTRL3_VERTICAL_WAIT_CNT_OFFSET 0 - -#define LCDIF_VDCTRL4_DOTCLK_DLY_SEL_MASK (0x7 << 29) -#define LCDIF_VDCTRL4_DOTCLK_DLY_SEL_OFFSET 29 -#define LCDIF_VDCTRL4_SYNC_SIGNALS_ON (1 << 18) -#define LCDIF_VDCTRL4_DOTCLK_H_VALID_DATA_CNT_MASK 0x3ffff -#define LCDIF_VDCTRL4_DOTCLK_H_VALID_DATA_CNT_OFFSET 0 +#include <asm/imx-common/regs-lcdif.h> #endif /* __MX28_REGS_LCDIF_H__ */ arch/arm/include/asm/imx-common/regs-lcdif.h new file +212
-0@@ -0,0 +1,222 @@ +/* +* Freescale i.MX28/6SX/6UL LCDIF Register Definitions +* +* SPDX-License-Identifier: GPL-2.0+ +*/ +#ifndef __IMX_REGS_LCDIF_H__ +#define __IMX_REGS_LCDIF_H__ + +#if !(defined(__KERNEL_STRICT_NAMES) || defined(__ASSEMBLY__)) +#include <linux/types.h> +#include <asm/imx-common/regs-common.h> + +/* eLCDIF controller registers */ +struct mxs_lcdif_regs { +mxs_reg_32 (hw_lcdif_ctrl) + mxs_reg_32(hw_lcdif_ctrl1) +#if defined(CONFIG_MX28 ) || defined(CONFIG_MX6SX ) || defined(CONFIG_MX6UL ) + mxs_reg_32(hw_lcdif_ctrl2) +#endif +mxs_reg_32 (hw_lcdif_transfer_count) + mxs_reg_32(hw_lcdif_cur_buf) + mxs_reg_32(hw_lcdif_next_buf) +#if defined(CONFIG_MX23 ) +uint32_t reserved1[4 ]; +#endif +mxs_reg_32 (hw_lcdif_timing) + mxs_reg_32(hw_lcdif_vdctrl0) +mxs_reg_32 (hw_lcdif_vdctrl1) + mxs_reg_32(hw_lcdif_vdctrl2) +mxs_reg_32 (hw_lcdif_vdctrl3) + mxs_reg_32(hw_lcdif_vdctrl4) +mxs_reg_32 (hw_lcdif_dvictrl0) + mxs_reg_32(hw_lcdif_dvictrl1) +mxs_reg_32 (hw_lcdif_dvictrl2) + mxs_reg_32(hw_lcdif_dvictrl3) +mxs_reg_32 (hw_lcdif_dvictrl4) + mxs_reg_32(hw_lcdif_csc_coeffctrl0) +mxs_reg_32 (hw_lcdif_csc_coeffctrl1) + mxs_reg_32(hw_lcdif_csc_coeffctrl2) +mxs_reg_32 (hw_lcdif_csc_coeffctrl3) + mxs_reg_32(hw_lcdif_csc_coeffctrl4) +mxs_reg_32 (hw_lcdif_csc_offset) + mxs_reg_32(hw_lcdif_csc_limit) +#if defined(CONFIG_MX23 ) +uint32_t reserved2[12 ]; +#endif +mxs_reg_32 (hw_lcdif_data) + mxs_reg_32(hw_lcdif_bm_error_stat) +#if defined(CONFIG_MX28 ) || defined(CONFIG_MX6SX ) || defined(CONFIG_MX6UL ) + mxs_reg_32(hw_lcdif_crc_stat) +#endif +mxs_reg_32 (hw_lcdif_lcdif_stat) + mxs_reg_32(hw_lcdif_version) +mxs_reg_32 (hw_lcdif_debug0) + mxs_reg_32(hw_lcdif_debug1) + mxs_reg_32(hw_lcdif_debug2) +#if defined(CONFIG_MX6SX ) || defined(CONFIG_MX6UL ) +mxs_reg_32 (hw_lcdif_thres) + mxs_reg_32(hw_lcdif_as_ctrl) +mxs_reg_32 (hw_lcdif_as_buf) + mxs_reg_32(hw_lcdif_as_next_buf) +mxs_reg_32 (hw_lcdif_as_clrkeylow) + mxs_reg_32(hw_lcdif_as_clrkeyhigh) +mxs_reg_32 (hw_lcdif_as_sync_delay) + mxs_reg_32(hw_lcdif_as_debug3) +mxs_reg_32 (hw_lcdif_as_debug4) + mxs_reg_32(hw_lcdif_as_debug5) +#endif +}; +#endif + +#define LCDIF_CTRL_SFTRST (1 << 31) +#define LCDIF_CTRL_CLKGATE (1 << 30) +#define LCDIF_CTRL_YCBCR422_INPUT (1 << 29) +#define LCDIF_CTRL_READ_WRITEB (1 << 28) +#define LCDIF_CTRL_WAIT_FOR_VSYNC_EDGE (1 << 27) +#define LCDIF_CTRL_DATA_SHIFT_DIR (1 << 26) +#define LCDIF_CTRL_SHIFT_NUM_BITS_MASK (0x1f << 21) +#define LCDIF_CTRL_SHIFT_NUM_BITS_OFFSET 21 +#define LCDIF_CTRL_DVI_MODE (1 << 20) +#define LCDIF_CTRL_BYPASS_COUNT (1 << 19) +#define LCDIF_CTRL_VSYNC_MODE (1 << 18) +#define LCDIF_CTRL_DOTCLK_MODE (1 << 17) +#define LCDIF_CTRL_DATA_SELECT (1 << 16) +#define LCDIF_CTRL_INPUT_DATA_SWIZZLE_MASK (0x3 << 14) +#define LCDIF_CTRL_INPUT_DATA_SWIZZLE_OFFSET 14 +#define LCDIF_CTRL_CSC_DATA_SWIZZLE_MASK (0x3 << 12) +#define LCDIF_CTRL_CSC_DATA_SWIZZLE_OFFSET 12 +#define LCDIF_CTRL_LCD_DATABUS_WIDTH_MASK (0x3 << 10) +#define LCDIF_CTRL_LCD_DATABUS_WIDTH_OFFSET 10 +#define LCDIF_CTRL_LCD_DATABUS_WIDTH_16BIT (0 << 10) +#define LCDIF_CTRL_LCD_DATABUS_WIDTH_8BIT (1 << 10) +#define LCDIF_CTRL_LCD_DATABUS_WIDTH_18BIT (2 << 10) +#define LCDIF_CTRL_LCD_DATABUS_WIDTH_24BIT (3 << 10) +#define LCDIF_CTRL_WORD_LENGTH_MASK (0x3 << 8) +#define LCDIF_CTRL_WORD_LENGTH_OFFSET 8 +#define LCDIF_CTRL_WORD_LENGTH_16BIT (0 << 8) +#define LCDIF_CTRL_WORD_LENGTH_8BIT (1 << 8) +#define LCDIF_CTRL_WORD_LENGTH_18BIT (2 << 8) +#define LCDIF_CTRL_WORD_LENGTH_24BIT (3 << 8) +#define LCDIF_CTRL_RGB_TO_YCBCR422_CSC (1 << 7) +#define LCDIF_CTRL_LCDIF_MASTER (1 << 5) +#define LCDIF_CTRL_DATA_FORMAT_16_BIT (1 << 3) +#define LCDIF_CTRL_DATA_FORMAT_18_BIT (1 << 2) +#define LCDIF_CTRL_DATA_FORMAT_24_BIT (1 << 1) +#define LCDIF_CTRL_RUN (1 << 0) + +#define LCDIF_CTRL1_COMBINE_MPU_WR_STRB (1 << 27) +#define LCDIF_CTRL1_BM_ERROR_IRQ_EN (1 << 26) +#define LCDIF_CTRL1_BM_ERROR_IRQ (1 << 25) +#define LCDIF_CTRL1_RECOVER_ON_UNDERFLOW (1 << 24) +#define LCDIF_CTRL1_INTERLACE_FIELDS (1 << 23) +#define LCDIF_CTRL1_START_INTERLACE_FROM_SECOND_FIELD (1 << 22) +#define LCDIF_CTRL1_FIFO_CLEAR (1 << 21) +#define LCDIF_CTRL1_IRQ_ON_ALTERNATE_FIELDS (1 << 20) +#define LCDIF_CTRL1_BYTE_PACKING_FORMAT_MASK (0xf << 16) +#define LCDIF_CTRL1_BYTE_PACKING_FORMAT_OFFSET 16 +#define LCDIF_CTRL1_OVERFLOW_IRQ_EN (1 << 15) +#define LCDIF_CTRL1_UNDERFLOW_IRQ_EN (1 << 14) +#define LCDIF_CTRL1_CUR_FRAME_DONE_IRQ_EN (1 << 13) +#define LCDIF_CTRL1_VSYNC_EDGE_IRQ_EN (1 << 12) +#define LCDIF_CTRL1_OVERFLOW_IRQ (1 << 11) +#define LCDIF_CTRL1_UNDERFLOW_IRQ (1 << 10) +#define LCDIF_CTRL1_CUR_FRAME_DONE_IRQ (1 << 9) +#define LCDIF_CTRL1_VSYNC_EDGE_IRQ (1 << 8) +#define LCDIF_CTRL1_BUSY_ENABLE (1 << 2) +#define LCDIF_CTRL1_MODE86 (1 << 1) +#define LCDIF_CTRL1_RESET (1 << 0) + +#define LCDIF_CTRL2_OUTSTANDING_REQS_MASK (0x7 << 21) +#define LCDIF_CTRL2_OUTSTANDING_REQS_OFFSET 21 +#define LCDIF_CTRL2_OUTSTANDING_REQS_REQ_1 (0x0 << 21) +#define LCDIF_CTRL2_OUTSTANDING_REQS_REQ_2 (0x1 << 21) +#define LCDIF_CTRL2_OUTSTANDING_REQS_REQ_4 (0x2 << 21) +#define LCDIF_CTRL2_OUTSTANDING_REQS_REQ_8 (0x3 << 21) +#define LCDIF_CTRL2_OUTSTANDING_REQS_REQ_16 (0x4 << 21) +#define LCDIF_CTRL2_BURST_LEN_8 (1 << 20) +#define LCDIF_CTRL2_ODD_LINE_PATTERN_MASK (0x7 << 16) +#define LCDIF_CTRL2_ODD_LINE_PATTERN_OFFSET 16 +#define LCDIF_CTRL2_ODD_LINE_PATTERN_RGB (0x0 << 16) +#define LCDIF_CTRL2_ODD_LINE_PATTERN_RBG (0x1 << 16) +#define LCDIF_CTRL2_ODD_LINE_PATTERN_GBR (0x2 << 16) +#define LCDIF_CTRL2_ODD_LINE_PATTERN_GRB (0x3 << 16) +#define LCDIF_CTRL2_ODD_LINE_PATTERN_BRG (0x4 << 16) +#define LCDIF_CTRL2_ODD_LINE_PATTERN_BGR (0x5 << 16) +#define LCDIF_CTRL2_EVEN_LINE_PATTERN_MASK (0x7 << 12) +#define LCDIF_CTRL2_EVEN_LINE_PATTERN_OFFSET 12 +#define LCDIF_CTRL2_EVEN_LINE_PATTERN_RGB (0x0 << 12) +#define LCDIF_CTRL2_EVEN_LINE_PATTERN_RBG (0x1 << 12) +#define LCDIF_CTRL2_EVEN_LINE_PATTERN_GBR (0x2 << 12) +#define LCDIF_CTRL2_EVEN_LINE_PATTERN_GRB (0x3 << 12) +#define LCDIF_CTRL2_EVEN_LINE_PATTERN_BRG (0x4 << 12) +#define LCDIF_CTRL2_EVEN_LINE_PATTERN_BGR (0x5 << 12) +#define LCDIF_CTRL2_READ_PACK_DIR (1 << 10) +#define LCDIF_CTRL2_READ_MODE_OUTPUT_IN_RGB_FORMAT (1 << 9) +#define LCDIF_CTRL2_READ_MODE_6_BIT_INPUT (1 << 8) +#define LCDIF_CTRL2_READ_MODE_NUM_PACKED_SUBWORDS_MASK (0x7 << 4) +#define LCDIF_CTRL2_READ_MODE_NUM_PACKED_SUBWORDS_OFFSET 4 +#define LCDIF_CTRL2_INITIAL_DUMMY_READ_MASK (0x7 << 1) +#define LCDIF_CTRL2_INITIAL_DUMMY_READ_OFFSET 1 + +#define LCDIF_TRANSFER_COUNT_V_COUNT_MASK (0xffff << 16) +#define LCDIF_TRANSFER_COUNT_V_COUNT_OFFSET 16 +#define LCDIF_TRANSFER_COUNT_H_COUNT_MASK (0xffff << 0) +#define LCDIF_TRANSFER_COUNT_H_COUNT_OFFSET 0 + +#define LCDIF_CUR_BUF_ADDR_MASK 0xffffffff +#define LCDIF_CUR_BUF_ADDR_OFFSET 0 + +#define LCDIF_NEXT_BUF_ADDR_MASK 0xffffffff +#define LCDIF_NEXT_BUF_ADDR_OFFSET 0 + +#define LCDIF_TIMING_CMD_HOLD_MASK (0xff << 24) +#define LCDIF_TIMING_CMD_HOLD_OFFSET 24 +#define LCDIF_TIMING_CMD_SETUP_MASK (0xff << 16) +#define LCDIF_TIMING_CMD_SETUP_OFFSET 16 +#define LCDIF_TIMING_DATA_HOLD_MASK (0xff << 8) +#define LCDIF_TIMING_DATA_HOLD_OFFSET 8 +#define LCDIF_TIMING_DATA_SETUP_MASK (0xff << 0) +#define LCDIF_TIMING_DATA_SETUP_OFFSET 0 + +#define LCDIF_VDCTRL0_VSYNC_OEB (1 << 29) +#define LCDIF_VDCTRL0_ENABLE_PRESENT (1 << 28) +#define LCDIF_VDCTRL0_VSYNC_POL (1 << 27) +#define LCDIF_VDCTRL0_HSYNC_POL (1 << 26) +#define LCDIF_VDCTRL0_DOTCLK_POL (1 << 25) +#define LCDIF_VDCTRL0_ENABLE_POL (1 << 24) +#define LCDIF_VDCTRL0_VSYNC_PERIOD_UNIT (1 << 21) +#define LCDIF_VDCTRL0_VSYNC_PULSE_WIDTH_UNIT (1 << 20) +#define LCDIF_VDCTRL0_HALF_LINE (1 << 19) +#define LCDIF_VDCTRL0_HALF_LINE_MODE (1 << 18) +#define LCDIF_VDCTRL0_VSYNC_PULSE_WIDTH_MASK 0x3ffff +#define LCDIF_VDCTRL0_VSYNC_PULSE_WIDTH_OFFSET 0 + +#define LCDIF_VDCTRL1_VSYNC_PERIOD_MASK 0xffffffff +#define LCDIF_VDCTRL1_VSYNC_PERIOD_OFFSET 0 + +#if defined(CONFIG_MX23 ) +#define LCDIF_VDCTRL2_HSYNC_PULSE_WIDTH_MASK (0xff << 24) +#define LCDIF_VDCTRL2_HSYNC_PULSE_WIDTH_OFFSET 24 +#else +#define LCDIF_VDCTRL2_HSYNC_PULSE_WIDTH_MASK (0x3fff << 18) +#define LCDIF_VDCTRL2_HSYNC_PULSE_WIDTH_OFFSET 18 +#endif + +#define LCDIF_VDCTRL2_HSYNC_PERIOD_MASK 0x3ffff +#define LCDIF_VDCTRL2_HSYNC_PERIOD_OFFSET 0 + +#define LCDIF_VDCTRL3_MUX_SYNC_SIGNALS (1 << 29) +#define LCDIF_VDCTRL3_VSYNC_ONLY (1 << 28) +#define LCDIF_VDCTRL3_HORIZONTAL_WAIT_CNT_MASK (0xfff << 16) +#define LCDIF_VDCTRL3_HORIZONTAL_WAIT_CNT_OFFSET 16
arch/arm/include/asm/imx-common/regs-lcdif.h line 222
Quoted 10 lines
arch/arm/include/asm/imx-common/regs-lcdif.h new file +10
-0+#define LCDIF_VDCTRL3_VERTICAL_WAIT_CNT_MASK (0xffff << 0) +#define LCDIF_VDCTRL3_VERTICAL_WAIT_CNT_OFFSET 0 + +#define LCDIF_VDCTRL4_DOTCLK_DLY_SEL_MASK (0x7 << 29) +#define LCDIF_VDCTRL4_DOTCLK_DLY_SEL_OFFSET 29 +#define LCDIF_VDCTRL4_SYNC_SIGNALS_ON (1 << 18) +#define LCDIF_VDCTRL4_DOTCLK_H_VALID_DATA_CNT_MASK 0x3ffff +#define LCDIF_VDCTRL4_DOTCLK_H_VALID_DATA_CNT_OFFSET 0 + +#endif /* __IMX_REGS_LCDIF_H__ */
Best regards,
Stefano Babic
Signature · 5 lines
===================================================================== DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de =====================================================================
PATCH v2 4/14 imx: imx-common: move lcdif structure and macro definition to imx-common
Hi Stefano,
Quoted 6 lines · Stefano Babic
Hi Peng,
Quoted 3 lines · Peng Fan
Move 'struct
mxs_lcdif_regs' and lcdif related macro definitions toarch/arm/include/asm/imx-common/regs-lcdif.h.
Quoted 7 lines
Quoted 2 lines
i.MX6SX/UL/28 have similar register layout and bit definitions of registers.
I do not like this approach. Please split this patch into two: the first patch moves only into imx-common (and please use -M in format-patch to detect renaming), and the second one changes what you need to change. There is then no trace about changes in commit.
Ok. Will split this patch into two patches as you suggested.
Thanks,
Peng.
Quoted 463 lines
Quoted 443 lines
Signed-off-by Peng Fan <[email protected]>Cc Stefano Babic <[email protected]>---
V2:
nonearch/arm/include/asm/arch-mxs/regs-lcdif.h | 201 +----------------------- arch/arm/include/asm/imx-common/regs-lcdif.h | 222 +++++++++++++++++++++++++++ 2 files changed, 223 insertions(+), 200 deletions(-) create mode 100644 arch/arm/include/asm/imx-common/regs-lcdif.harch/arm/include/asm/arch-mxs/regs-lcdif.h +1
-200@@ -13,205 +13,6 @@#ifndef __MX28_REGS_LCDIF_H__#define __MX28_REGS_LCDIF_H__ -#include <asm/imx-common/regs-common.h> - -#ifndef __ASSEMBLY__ -struct mxs_lcdif_regs { - mxs_reg_32(hw_lcdif_ctrl) /* 0x00 */ - mxs_reg_32(hw_lcdif_ctrl1) /* 0x10 */ -#if defined(CONFIG_MX28) - mxs_reg_32(hw_lcdif_ctrl2) /* 0x20 */ -#endif - mxs_reg_32(hw_lcdif_transfer_count) /* 0x20/0x30 */ - mxs_reg_32(hw_lcdif_cur_buf) /* 0x30/0x40 */ - mxs_reg_32(hw_lcdif_next_buf) /* 0x40/0x50 */ - -#if defined(CONFIG_MX23) - uint32_t reserved1[4]; -#endif - - mxs_reg_32(hw_lcdif_timing) /* 0x60 */ - mxs_reg_32(hw_lcdif_vdctrl0) /* 0x70 */ - mxs_reg_32(hw_lcdif_vdctrl1) /* 0x80 */ - mxs_reg_32(hw_lcdif_vdctrl2) /* 0x90 */ - mxs_reg_32(hw_lcdif_vdctrl3) /* 0xa0 */ - mxs_reg_32(hw_lcdif_vdctrl4) /* 0xb0 */ - mxs_reg_32(hw_lcdif_dvictrl0) /* 0xc0 */ - mxs_reg_32(hw_lcdif_dvictrl1) /* 0xd0 */ - mxs_reg_32(hw_lcdif_dvictrl2) /* 0xe0 */ - mxs_reg_32(hw_lcdif_dvictrl3) /* 0xf0 */ - mxs_reg_32(hw_lcdif_dvictrl4) /* 0x100 */ - mxs_reg_32(hw_lcdif_csc_coeffctrl0) /* 0x110 */ - mxs_reg_32(hw_lcdif_csc_coeffctrl1) /* 0x120 */ - mxs_reg_32(hw_lcdif_csc_coeffctrl2) /* 0x130 */ - mxs_reg_32(hw_lcdif_csc_coeffctrl3) /* 0x140 */ - mxs_reg_32(hw_lcdif_csc_coeffctrl4) /* 0x150 */ - mxs_reg_32(hw_lcdif_csc_offset) /* 0x160 */ - mxs_reg_32(hw_lcdif_csc_limit) /* 0x170 */ - -#if defined(CONFIG_MX23) - uint32_t reserved2[12]; -#endif - mxs_reg_32(hw_lcdif_data) /* 0x1b0/0x180 */ - mxs_reg_32(hw_lcdif_bm_error_stat) /* 0x1c0/0x190 */ -#if defined(CONFIG_MX28) - mxs_reg_32(hw_lcdif_crc_stat) /* 0x1a0 */ -#endif - mxs_reg_32(hw_lcdif_lcdif_stat) /* 0x1d0/0x1b0 */ - mxs_reg_32(hw_lcdif_version) /* 0x1e0/0x1c0 */ - mxs_reg_32(hw_lcdif_debug0) /* 0x1f0/0x1d0 */ - mxs_reg_32(hw_lcdif_debug1) /* 0x200/0x1e0 */ - mxs_reg_32(hw_lcdif_debug2) /* 0x1f0 */ -}; -#endif - -#define LCDIF_CTRL_SFTRST (1 << 31) -#define LCDIF_CTRL_CLKGATE (1 << 30) -#define LCDIF_CTRL_YCBCR422_INPUT (1 << 29) -#define LCDIF_CTRL_READ_WRITEB (1 << 28) -#define LCDIF_CTRL_WAIT_FOR_VSYNC_EDGE (1 << 27) -#define LCDIF_CTRL_DATA_SHIFT_DIR (1 << 26) -#define LCDIF_CTRL_SHIFT_NUM_BITS_MASK (0x1f << 21) -#define LCDIF_CTRL_SHIFT_NUM_BITS_OFFSET 21 -#define LCDIF_CTRL_DVI_MODE (1 << 20) -#define LCDIF_CTRL_BYPASS_COUNT (1 << 19) -#define LCDIF_CTRL_VSYNC_MODE (1 << 18) -#define LCDIF_CTRL_DOTCLK_MODE (1 << 17) -#define LCDIF_CTRL_DATA_SELECT (1 << 16) -#define LCDIF_CTRL_INPUT_DATA_SWIZZLE_MASK (0x3 << 14) -#define LCDIF_CTRL_INPUT_DATA_SWIZZLE_OFFSET 14 -#define LCDIF_CTRL_CSC_DATA_SWIZZLE_MASK (0x3 << 12) -#define LCDIF_CTRL_CSC_DATA_SWIZZLE_OFFSET 12 -#define LCDIF_CTRL_LCD_DATABUS_WIDTH_MASK (0x3 << 10) -#define LCDIF_CTRL_LCD_DATABUS_WIDTH_OFFSET 10 -#define LCDIF_CTRL_LCD_DATABUS_WIDTH_16BIT (0 << 10) -#define LCDIF_CTRL_LCD_DATABUS_WIDTH_8BIT (1 << 10) -#define LCDIF_CTRL_LCD_DATABUS_WIDTH_18BIT (2 << 10) -#define LCDIF_CTRL_LCD_DATABUS_WIDTH_24BIT (3 << 10) -#define LCDIF_CTRL_WORD_LENGTH_MASK (0x3 << 8) -#define LCDIF_CTRL_WORD_LENGTH_OFFSET 8 -#define LCDIF_CTRL_WORD_LENGTH_16BIT (0 << 8) -#define LCDIF_CTRL_WORD_LENGTH_8BIT (1 << 8) -#define LCDIF_CTRL_WORD_LENGTH_18BIT (2 << 8) -#define LCDIF_CTRL_WORD_LENGTH_24BIT (3 << 8) -#define LCDIF_CTRL_RGB_TO_YCBCR422_CSC (1 << 7) -#define LCDIF_CTRL_LCDIF_MASTER (1 << 5) -#define LCDIF_CTRL_DATA_FORMAT_16_BIT (1 << 3) -#define LCDIF_CTRL_DATA_FORMAT_18_BIT (1 << 2) -#define LCDIF_CTRL_DATA_FORMAT_24_BIT (1 << 1) -#define LCDIF_CTRL_RUN (1 << 0) - -#define LCDIF_CTRL1_COMBINE_MPU_WR_STRB (1 << 27) -#define LCDIF_CTRL1_BM_ERROR_IRQ_EN (1 << 26) -#define LCDIF_CTRL1_BM_ERROR_IRQ (1 << 25) -#define LCDIF_CTRL1_RECOVER_ON_UNDERFLOW (1 << 24) -#define LCDIF_CTRL1_INTERLACE_FIELDS (1 << 23) -#define LCDIF_CTRL1_START_INTERLACE_FROM_SECOND_FIELD (1 << 22) -#define LCDIF_CTRL1_FIFO_CLEAR (1 << 21) -#define LCDIF_CTRL1_IRQ_ON_ALTERNATE_FIELDS (1 << 20) -#define LCDIF_CTRL1_BYTE_PACKING_FORMAT_MASK (0xf << 16) -#define LCDIF_CTRL1_BYTE_PACKING_FORMAT_OFFSET 16 -#define LCDIF_CTRL1_OVERFLOW_IRQ_EN (1 << 15) -#define LCDIF_CTRL1_UNDERFLOW_IRQ_EN (1 << 14) -#define LCDIF_CTRL1_CUR_FRAME_DONE_IRQ_EN (1 << 13) -#define LCDIF_CTRL1_VSYNC_EDGE_IRQ_EN (1 << 12) -#define LCDIF_CTRL1_OVERFLOW_IRQ (1 << 11) -#define LCDIF_CTRL1_UNDERFLOW_IRQ (1 << 10) -#define LCDIF_CTRL1_CUR_FRAME_DONE_IRQ (1 << 9) -#define LCDIF_CTRL1_VSYNC_EDGE_IRQ (1 << 8) -#define LCDIF_CTRL1_BUSY_ENABLE (1 << 2) -#define LCDIF_CTRL1_MODE86 (1 << 1) -#define LCDIF_CTRL1_RESET (1 << 0) - -#define LCDIF_CTRL2_OUTSTANDING_REQS_MASK (0x7 << 21) -#define LCDIF_CTRL2_OUTSTANDING_REQS_OFFSET 21 -#define LCDIF_CTRL2_OUTSTANDING_REQS_REQ_1 (0x0 << 21) -#define LCDIF_CTRL2_OUTSTANDING_REQS_REQ_2 (0x1 << 21) -#define LCDIF_CTRL2_OUTSTANDING_REQS_REQ_4 (0x2 << 21) -#define LCDIF_CTRL2_OUTSTANDING_REQS_REQ_8 (0x3 << 21) -#define LCDIF_CTRL2_OUTSTANDING_REQS_REQ_16 (0x4 << 21) -#define LCDIF_CTRL2_BURST_LEN_8 (1 << 20) -#define LCDIF_CTRL2_ODD_LINE_PATTERN_MASK (0x7 << 16) -#define LCDIF_CTRL2_ODD_LINE_PATTERN_OFFSET 16 -#define LCDIF_CTRL2_ODD_LINE_PATTERN_RGB (0x0 << 16) -#define LCDIF_CTRL2_ODD_LINE_PATTERN_RBG (0x1 << 16) -#define LCDIF_CTRL2_ODD_LINE_PATTERN_GBR (0x2 << 16) -#define LCDIF_CTRL2_ODD_LINE_PATTERN_GRB (0x3 << 16) -#define LCDIF_CTRL2_ODD_LINE_PATTERN_BRG (0x4 << 16) -#define LCDIF_CTRL2_ODD_LINE_PATTERN_BGR (0x5 << 16) -#define LCDIF_CTRL2_EVEN_LINE_PATTERN_MASK (0x7 << 12) -#define LCDIF_CTRL2_EVEN_LINE_PATTERN_OFFSET 12 -#define LCDIF_CTRL2_EVEN_LINE_PATTERN_RGB (0x0 << 12) -#define LCDIF_CTRL2_EVEN_LINE_PATTERN_RBG (0x1 << 12) -#define LCDIF_CTRL2_EVEN_LINE_PATTERN_GBR (0x2 << 12) -#define LCDIF_CTRL2_EVEN_LINE_PATTERN_GRB (0x3 << 12) -#define LCDIF_CTRL2_EVEN_LINE_PATTERN_BRG (0x4 << 12) -#define LCDIF_CTRL2_EVEN_LINE_PATTERN_BGR (0x5 << 12) -#define LCDIF_CTRL2_READ_PACK_DIR (1 << 10) -#define LCDIF_CTRL2_READ_MODE_OUTPUT_IN_RGB_FORMAT (1 << 9) -#define LCDIF_CTRL2_READ_MODE_6_BIT_INPUT (1 << 8) -#define LCDIF_CTRL2_READ_MODE_NUM_PACKED_SUBWORDS_MASK (0x7 << 4) -#define LCDIF_CTRL2_READ_MODE_NUM_PACKED_SUBWORDS_OFFSET 4 -#define LCDIF_CTRL2_INITIAL_DUMMY_READ_MASK (0x7 << 1) -#define LCDIF_CTRL2_INITIAL_DUMMY_READ_OFFSET 1 - -#define LCDIF_TRANSFER_COUNT_V_COUNT_MASK (0xffff << 16) -#define LCDIF_TRANSFER_COUNT_V_COUNT_OFFSET 16 -#define LCDIF_TRANSFER_COUNT_H_COUNT_MASK (0xffff << 0) -#define LCDIF_TRANSFER_COUNT_H_COUNT_OFFSET 0 - -#define LCDIF_CUR_BUF_ADDR_MASK 0xffffffff -#define LCDIF_CUR_BUF_ADDR_OFFSET 0 - -#define LCDIF_NEXT_BUF_ADDR_MASK 0xffffffff -#define LCDIF_NEXT_BUF_ADDR_OFFSET 0 - -#define LCDIF_TIMING_CMD_HOLD_MASK (0xff << 24) -#define LCDIF_TIMING_CMD_HOLD_OFFSET 24 -#define LCDIF_TIMING_CMD_SETUP_MASK (0xff << 16) -#define LCDIF_TIMING_CMD_SETUP_OFFSET 16 -#define LCDIF_TIMING_DATA_HOLD_MASK (0xff << 8) -#define LCDIF_TIMING_DATA_HOLD_OFFSET 8 -#define LCDIF_TIMING_DATA_SETUP_MASK (0xff << 0) -#define LCDIF_TIMING_DATA_SETUP_OFFSET 0 - -#define LCDIF_VDCTRL0_VSYNC_OEB (1 << 29) -#define LCDIF_VDCTRL0_ENABLE_PRESENT (1 << 28) -#define LCDIF_VDCTRL0_VSYNC_POL (1 << 27) -#define LCDIF_VDCTRL0_HSYNC_POL (1 << 26) -#define LCDIF_VDCTRL0_DOTCLK_POL (1 << 25) -#define LCDIF_VDCTRL0_ENABLE_POL (1 << 24) -#define LCDIF_VDCTRL0_VSYNC_PERIOD_UNIT (1 << 21) -#define LCDIF_VDCTRL0_VSYNC_PULSE_WIDTH_UNIT (1 << 20) -#define LCDIF_VDCTRL0_HALF_LINE (1 << 19) -#define LCDIF_VDCTRL0_HALF_LINE_MODE (1 << 18) -#define LCDIF_VDCTRL0_VSYNC_PULSE_WIDTH_MASK 0x3ffff -#define LCDIF_VDCTRL0_VSYNC_PULSE_WIDTH_OFFSET 0 - -#define LCDIF_VDCTRL1_VSYNC_PERIOD_MASK 0xffffffff -#define LCDIF_VDCTRL1_VSYNC_PERIOD_OFFSET 0 - -#if defined(CONFIG_MX23) -#define LCDIF_VDCTRL2_HSYNC_PULSE_WIDTH_MASK (0xff << 24) -#define LCDIF_VDCTRL2_HSYNC_PULSE_WIDTH_OFFSET 24 -#elif defined(CONFIG_MX28) -#define LCDIF_VDCTRL2_HSYNC_PULSE_WIDTH_MASK (0x3fff << 18) -#define LCDIF_VDCTRL2_HSYNC_PULSE_WIDTH_OFFSET 18 -#endif -#define LCDIF_VDCTRL2_HSYNC_PERIOD_MASK 0x3ffff -#define LCDIF_VDCTRL2_HSYNC_PERIOD_OFFSET 0 - -#define LCDIF_VDCTRL3_MUX_SYNC_SIGNALS (1 << 29) -#define LCDIF_VDCTRL3_VSYNC_ONLY (1 << 28) -#define LCDIF_VDCTRL3_HORIZONTAL_WAIT_CNT_MASK (0xfff << 16) -#define LCDIF_VDCTRL3_HORIZONTAL_WAIT_CNT_OFFSET 16 -#define LCDIF_VDCTRL3_VERTICAL_WAIT_CNT_MASK (0xffff << 0) -#define LCDIF_VDCTRL3_VERTICAL_WAIT_CNT_OFFSET 0 - -#define LCDIF_VDCTRL4_DOTCLK_DLY_SEL_MASK (0x7 << 29) -#define LCDIF_VDCTRL4_DOTCLK_DLY_SEL_OFFSET 29 -#define LCDIF_VDCTRL4_SYNC_SIGNALS_ON (1 << 18) -#define LCDIF_VDCTRL4_DOTCLK_H_VALID_DATA_CNT_MASK 0x3ffff -#define LCDIF_VDCTRL4_DOTCLK_H_VALID_DATA_CNT_OFFSET 0 +#include <asm/imx-common/regs-lcdif.h> #endif /* __MX28_REGS_LCDIF_H__ */ arch/arm/include/asm/imx-common/regs-lcdif.h new file +212
-0@@ -0,0 +1,222 @@ +/* +* Freescale i.MX28/6SX/6UL LCDIF Register Definitions +* +* SPDX-License-Identifier: GPL-2.0+ +*/ +#ifndef __IMX_REGS_LCDIF_H__ +#define __IMX_REGS_LCDIF_H__ + +#if !(defined(__KERNEL_STRICT_NAMES) || defined(__ASSEMBLY__)) +#include <linux/types.h> +#include <asm/imx-common/regs-common.h> + +/* eLCDIF controller registers */ +struct mxs_lcdif_regs { +mxs_reg_32 (hw_lcdif_ctrl) + mxs_reg_32(hw_lcdif_ctrl1) +#if defined(CONFIG_MX28 ) || defined(CONFIG_MX6SX ) || defined(CONFIG_MX6UL ) + mxs_reg_32(hw_lcdif_ctrl2) +#endif +mxs_reg_32 (hw_lcdif_transfer_count) + mxs_reg_32(hw_lcdif_cur_buf) + mxs_reg_32(hw_lcdif_next_buf) +#if defined(CONFIG_MX23 ) +uint32_t reserved1[4 ]; +#endif +mxs_reg_32 (hw_lcdif_timing) + mxs_reg_32(hw_lcdif_vdctrl0) +mxs_reg_32 (hw_lcdif_vdctrl1) + mxs_reg_32(hw_lcdif_vdctrl2) +mxs_reg_32 (hw_lcdif_vdctrl3) + mxs_reg_32(hw_lcdif_vdctrl4) +mxs_reg_32 (hw_lcdif_dvictrl0) + mxs_reg_32(hw_lcdif_dvictrl1) +mxs_reg_32 (hw_lcdif_dvictrl2) + mxs_reg_32(hw_lcdif_dvictrl3) +mxs_reg_32 (hw_lcdif_dvictrl4) + mxs_reg_32(hw_lcdif_csc_coeffctrl0) +mxs_reg_32 (hw_lcdif_csc_coeffctrl1) + mxs_reg_32(hw_lcdif_csc_coeffctrl2) +mxs_reg_32 (hw_lcdif_csc_coeffctrl3) + mxs_reg_32(hw_lcdif_csc_coeffctrl4) +mxs_reg_32 (hw_lcdif_csc_offset) + mxs_reg_32(hw_lcdif_csc_limit) +#if defined(CONFIG_MX23 ) +uint32_t reserved2[12 ]; +#endif +mxs_reg_32 (hw_lcdif_data) + mxs_reg_32(hw_lcdif_bm_error_stat) +#if defined(CONFIG_MX28 ) || defined(CONFIG_MX6SX ) || defined(CONFIG_MX6UL ) + mxs_reg_32(hw_lcdif_crc_stat) +#endif +mxs_reg_32 (hw_lcdif_lcdif_stat) + mxs_reg_32(hw_lcdif_version) +mxs_reg_32 (hw_lcdif_debug0) + mxs_reg_32(hw_lcdif_debug1) + mxs_reg_32(hw_lcdif_debug2) +#if defined(CONFIG_MX6SX ) || defined(CONFIG_MX6UL ) +mxs_reg_32 (hw_lcdif_thres) + mxs_reg_32(hw_lcdif_as_ctrl) +mxs_reg_32 (hw_lcdif_as_buf) + mxs_reg_32(hw_lcdif_as_next_buf) +mxs_reg_32 (hw_lcdif_as_clrkeylow) + mxs_reg_32(hw_lcdif_as_clrkeyhigh) +mxs_reg_32 (hw_lcdif_as_sync_delay) + mxs_reg_32(hw_lcdif_as_debug3) +mxs_reg_32 (hw_lcdif_as_debug4) + mxs_reg_32(hw_lcdif_as_debug5) +#endif +}; +#endif + +#define LCDIF_CTRL_SFTRST (1 << 31) +#define LCDIF_CTRL_CLKGATE (1 << 30) +#define LCDIF_CTRL_YCBCR422_INPUT (1 << 29) +#define LCDIF_CTRL_READ_WRITEB (1 << 28) +#define LCDIF_CTRL_WAIT_FOR_VSYNC_EDGE (1 << 27) +#define LCDIF_CTRL_DATA_SHIFT_DIR (1 << 26) +#define LCDIF_CTRL_SHIFT_NUM_BITS_MASK (0x1f << 21) +#define LCDIF_CTRL_SHIFT_NUM_BITS_OFFSET 21 +#define LCDIF_CTRL_DVI_MODE (1 << 20) +#define LCDIF_CTRL_BYPASS_COUNT (1 << 19) +#define LCDIF_CTRL_VSYNC_MODE (1 << 18) +#define LCDIF_CTRL_DOTCLK_MODE (1 << 17) +#define LCDIF_CTRL_DATA_SELECT (1 << 16) +#define LCDIF_CTRL_INPUT_DATA_SWIZZLE_MASK (0x3 << 14) +#define LCDIF_CTRL_INPUT_DATA_SWIZZLE_OFFSET 14 +#define LCDIF_CTRL_CSC_DATA_SWIZZLE_MASK (0x3 << 12) +#define LCDIF_CTRL_CSC_DATA_SWIZZLE_OFFSET 12 +#define LCDIF_CTRL_LCD_DATABUS_WIDTH_MASK (0x3 << 10) +#define LCDIF_CTRL_LCD_DATABUS_WIDTH_OFFSET 10 +#define LCDIF_CTRL_LCD_DATABUS_WIDTH_16BIT (0 << 10) +#define LCDIF_CTRL_LCD_DATABUS_WIDTH_8BIT (1 << 10) +#define LCDIF_CTRL_LCD_DATABUS_WIDTH_18BIT (2 << 10) +#define LCDIF_CTRL_LCD_DATABUS_WIDTH_24BIT (3 << 10) +#define LCDIF_CTRL_WORD_LENGTH_MASK (0x3 << 8) +#define LCDIF_CTRL_WORD_LENGTH_OFFSET 8 +#define LCDIF_CTRL_WORD_LENGTH_16BIT (0 << 8) +#define LCDIF_CTRL_WORD_LENGTH_8BIT (1 << 8) +#define LCDIF_CTRL_WORD_LENGTH_18BIT (2 << 8) +#define LCDIF_CTRL_WORD_LENGTH_24BIT (3 << 8) +#define LCDIF_CTRL_RGB_TO_YCBCR422_CSC (1 << 7) +#define LCDIF_CTRL_LCDIF_MASTER (1 << 5) +#define LCDIF_CTRL_DATA_FORMAT_16_BIT (1 << 3) +#define LCDIF_CTRL_DATA_FORMAT_18_BIT (1 << 2) +#define LCDIF_CTRL_DATA_FORMAT_24_BIT (1 << 1) +#define LCDIF_CTRL_RUN (1 << 0) + +#define LCDIF_CTRL1_COMBINE_MPU_WR_STRB (1 << 27) +#define LCDIF_CTRL1_BM_ERROR_IRQ_EN (1 << 26) +#define LCDIF_CTRL1_BM_ERROR_IRQ (1 << 25) +#define LCDIF_CTRL1_RECOVER_ON_UNDERFLOW (1 << 24) +#define LCDIF_CTRL1_INTERLACE_FIELDS (1 << 23) +#define LCDIF_CTRL1_START_INTERLACE_FROM_SECOND_FIELD (1 << 22) +#define LCDIF_CTRL1_FIFO_CLEAR (1 << 21) +#define LCDIF_CTRL1_IRQ_ON_ALTERNATE_FIELDS (1 << 20) +#define LCDIF_CTRL1_BYTE_PACKING_FORMAT_MASK (0xf << 16) +#define LCDIF_CTRL1_BYTE_PACKING_FORMAT_OFFSET 16 +#define LCDIF_CTRL1_OVERFLOW_IRQ_EN (1 << 15) +#define LCDIF_CTRL1_UNDERFLOW_IRQ_EN (1 << 14) +#define LCDIF_CTRL1_CUR_FRAME_DONE_IRQ_EN (1 << 13) +#define LCDIF_CTRL1_VSYNC_EDGE_IRQ_EN (1 << 12) +#define LCDIF_CTRL1_OVERFLOW_IRQ (1 << 11) +#define LCDIF_CTRL1_UNDERFLOW_IRQ (1 << 10) +#define LCDIF_CTRL1_CUR_FRAME_DONE_IRQ (1 << 9) +#define LCDIF_CTRL1_VSYNC_EDGE_IRQ (1 << 8) +#define LCDIF_CTRL1_BUSY_ENABLE (1 << 2) +#define LCDIF_CTRL1_MODE86 (1 << 1) +#define LCDIF_CTRL1_RESET (1 << 0) + +#define LCDIF_CTRL2_OUTSTANDING_REQS_MASK (0x7 << 21) +#define LCDIF_CTRL2_OUTSTANDING_REQS_OFFSET 21 +#define LCDIF_CTRL2_OUTSTANDING_REQS_REQ_1 (0x0 << 21) +#define LCDIF_CTRL2_OUTSTANDING_REQS_REQ_2 (0x1 << 21) +#define LCDIF_CTRL2_OUTSTANDING_REQS_REQ_4 (0x2 << 21) +#define LCDIF_CTRL2_OUTSTANDING_REQS_REQ_8 (0x3 << 21) +#define LCDIF_CTRL2_OUTSTANDING_REQS_REQ_16 (0x4 << 21) +#define LCDIF_CTRL2_BURST_LEN_8 (1 << 20) +#define LCDIF_CTRL2_ODD_LINE_PATTERN_MASK (0x7 << 16) +#define LCDIF_CTRL2_ODD_LINE_PATTERN_OFFSET 16 +#define LCDIF_CTRL2_ODD_LINE_PATTERN_RGB (0x0 << 16) +#define LCDIF_CTRL2_ODD_LINE_PATTERN_RBG (0x1 << 16) +#define LCDIF_CTRL2_ODD_LINE_PATTERN_GBR (0x2 << 16) +#define LCDIF_CTRL2_ODD_LINE_PATTERN_GRB (0x3 << 16) +#define LCDIF_CTRL2_ODD_LINE_PATTERN_BRG (0x4 << 16) +#define LCDIF_CTRL2_ODD_LINE_PATTERN_BGR (0x5 << 16) +#define LCDIF_CTRL2_EVEN_LINE_PATTERN_MASK (0x7 << 12) +#define LCDIF_CTRL2_EVEN_LINE_PATTERN_OFFSET 12 +#define LCDIF_CTRL2_EVEN_LINE_PATTERN_RGB (0x0 << 12) +#define LCDIF_CTRL2_EVEN_LINE_PATTERN_RBG (0x1 << 12) +#define LCDIF_CTRL2_EVEN_LINE_PATTERN_GBR (0x2 << 12) +#define LCDIF_CTRL2_EVEN_LINE_PATTERN_GRB (0x3 << 12) +#define LCDIF_CTRL2_EVEN_LINE_PATTERN_BRG (0x4 << 12) +#define LCDIF_CTRL2_EVEN_LINE_PATTERN_BGR (0x5 << 12) +#define LCDIF_CTRL2_READ_PACK_DIR (1 << 10) +#define LCDIF_CTRL2_READ_MODE_OUTPUT_IN_RGB_FORMAT (1 << 9) +#define LCDIF_CTRL2_READ_MODE_6_BIT_INPUT (1 << 8) +#define LCDIF_CTRL2_READ_MODE_NUM_PACKED_SUBWORDS_MASK (0x7 << 4) +#define LCDIF_CTRL2_READ_MODE_NUM_PACKED_SUBWORDS_OFFSET 4 +#define LCDIF_CTRL2_INITIAL_DUMMY_READ_MASK (0x7 << 1) +#define LCDIF_CTRL2_INITIAL_DUMMY_READ_OFFSET 1 + +#define LCDIF_TRANSFER_COUNT_V_COUNT_MASK (0xffff << 16) +#define LCDIF_TRANSFER_COUNT_V_COUNT_OFFSET 16 +#define LCDIF_TRANSFER_COUNT_H_COUNT_MASK (0xffff << 0) +#define LCDIF_TRANSFER_COUNT_H_COUNT_OFFSET 0 + +#define LCDIF_CUR_BUF_ADDR_MASK 0xffffffff +#define LCDIF_CUR_BUF_ADDR_OFFSET 0 + +#define LCDIF_NEXT_BUF_ADDR_MASK 0xffffffff +#define LCDIF_NEXT_BUF_ADDR_OFFSET 0 + +#define LCDIF_TIMING_CMD_HOLD_MASK (0xff << 24) +#define LCDIF_TIMING_CMD_HOLD_OFFSET 24 +#define LCDIF_TIMING_CMD_SETUP_MASK (0xff << 16) +#define LCDIF_TIMING_CMD_SETUP_OFFSET 16 +#define LCDIF_TIMING_DATA_HOLD_MASK (0xff << 8) +#define LCDIF_TIMING_DATA_HOLD_OFFSET 8 +#define LCDIF_TIMING_DATA_SETUP_MASK (0xff << 0) +#define LCDIF_TIMING_DATA_SETUP_OFFSET 0 + +#define LCDIF_VDCTRL0_VSYNC_OEB (1 << 29) +#define LCDIF_VDCTRL0_ENABLE_PRESENT (1 << 28) +#define LCDIF_VDCTRL0_VSYNC_POL (1 << 27) +#define LCDIF_VDCTRL0_HSYNC_POL (1 << 26) +#define LCDIF_VDCTRL0_DOTCLK_POL (1 << 25) +#define LCDIF_VDCTRL0_ENABLE_POL (1 << 24) +#define LCDIF_VDCTRL0_VSYNC_PERIOD_UNIT (1 << 21) +#define LCDIF_VDCTRL0_VSYNC_PULSE_WIDTH_UNIT (1 << 20) +#define LCDIF_VDCTRL0_HALF_LINE (1 << 19) +#define LCDIF_VDCTRL0_HALF_LINE_MODE (1 << 18) +#define LCDIF_VDCTRL0_VSYNC_PULSE_WIDTH_MASK 0x3ffff +#define LCDIF_VDCTRL0_VSYNC_PULSE_WIDTH_OFFSET 0 + +#define LCDIF_VDCTRL1_VSYNC_PERIOD_MASK 0xffffffff +#define LCDIF_VDCTRL1_VSYNC_PERIOD_OFFSET 0 + +#if defined(CONFIG_MX23 ) +#define LCDIF_VDCTRL2_HSYNC_PULSE_WIDTH_MASK (0xff << 24) +#define LCDIF_VDCTRL2_HSYNC_PULSE_WIDTH_OFFSET 24 +#else +#define LCDIF_VDCTRL2_HSYNC_PULSE_WIDTH_MASK (0x3fff << 18) +#define LCDIF_VDCTRL2_HSYNC_PULSE_WIDTH_OFFSET 18 +#endif + +#define LCDIF_VDCTRL2_HSYNC_PERIOD_MASK 0x3ffff +#define LCDIF_VDCTRL2_HSYNC_PERIOD_OFFSET 0 + +#define LCDIF_VDCTRL3_MUX_SYNC_SIGNALS (1 << 29) +#define LCDIF_VDCTRL3_VSYNC_ONLY (1 << 28) +#define LCDIF_VDCTRL3_HORIZONTAL_WAIT_CNT_MASK (0xfff << 16) +#define LCDIF_VDCTRL3_HORIZONTAL_WAIT_CNT_OFFSET 16arch/arm/include/asm/imx-common/regs-lcdif.h line 222
Quoted 10 lines
arch/arm/include/asm/imx-common/regs-lcdif.h new file +10
-0+#define LCDIF_VDCTRL3_VERTICAL_WAIT_CNT_MASK (0xffff << 0) +#define LCDIF_VDCTRL3_VERTICAL_WAIT_CNT_OFFSET 0 + +#define LCDIF_VDCTRL4_DOTCLK_DLY_SEL_MASK (0x7 << 29) +#define LCDIF_VDCTRL4_DOTCLK_DLY_SEL_OFFSET 29 +#define LCDIF_VDCTRL4_SYNC_SIGNALS_ON (1 << 18) +#define LCDIF_VDCTRL4_DOTCLK_H_VALID_DATA_CNT_MASK 0x3ffff +#define LCDIF_VDCTRL4_DOTCLK_H_VALID_DATA_CNT_OFFSET 0 + +#endif /* __IMX_REGS_LCDIF_H__ */ Best regards,
Stefano BabicSignature · 5 lines
===================================================================== DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de =====================================================================
PATCH v2 5/14 imx: mx6: fix register address
In reply to Peng Fan1. Move WDOG3_BASE_ADDR to '#if !(defined(__ASSEMBLY__))'.
2. Add i.MX6UL LCDIF register base address. And Introduce LCDIF1_BASE_ADDR to support runtime check.
3. include <asm/imx-common/regs-lcdif.h> for imx-regs.h to avoid building error for mxsfb.c, since mxsfb.c use imx-regs.h.
---
V2:
none
arch/arm/include/asm/arch-mx6/imx-regs.h | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-)
arch/arm/include/asm/arch-mx6/imx-regs.h +10 -5
@@ -264,6 +264,7 @@#define CSU_BASE_ADDR (AIPS2_OFF_BASE_ADDR + 0x40000)#define IP2APB_PERFMON1_BASE_ADDR (AIPS2_OFF_BASE_ADDR + 0x44000)#define IP2APB_PERFMON2_BASE_ADDR (AIPS2_OFF_BASE_ADDR + 0x48000) +#define MX6UL_LCDIF1_BASE_ADDR (AIPS2_OFF_BASE_ADDR + 0x48000)#ifdef CONFIG_MX6SX #define DEBUG_MONITOR_BASE_ADDR (AIPS2_OFF_BASE_ADDR + 0x4C000)#else
@@ -300,7 +301,6 @@#define CSI1_BASE_ADDR (AIPS3_ARB_BASE_ADDR + 0x14000)#define PXP_BASE_ADDR (AIPS3_ARB_BASE_ADDR + 0x18000)#define CSI2_BASE_ADDR (AIPS3_ARB_BASE_ADDR + 0x1C000) -#define LCDIF1_BASE_ADDR (AIPS3_ARB_BASE_ADDR + 0x20000)#define LCDIF2_BASE_ADDR (AIPS3_ARB_BASE_ADDR + 0x24000)#define VADC_BASE_ADDR (AIPS3_ARB_BASE_ADDR + 0x28000)#define VDEC_BASE_ADDR (AIPS3_ARB_BASE_ADDR + 0x2C000)
@@ -319,12 +319,9 @@#define PWM7_BASE_ADDR (AIPS3_ARB_BASE_ADDR + 0xAC000)#define PWM8_BASE_ADDR (AIPS3_ARB_BASE_ADDR + 0xB0000)#endif +#define MX6SX_LCDIF1_BASE_ADDR (AIPS3_ARB_BASE_ADDR + 0x20000)#define MX6SX_WDOG3_BASE_ADDR (AIPS3_ARB_BASE_ADDR + 0x88000) -/* only for i.MX6SX/UL */ -#define WDOG3_BASE_ADDR (is_cpu_type(MXC_CPU_MX6UL) ? \ - MX6UL_WDOG3_BASE_ADDR : MX6SX_WDOG3_BASE_ADDR) -#define CHIP_REV_1_0 0x10#define CHIP_REV_1_2 0x12#define CHIP_REV_1_5 0x15
@@ -336,9 +333,17 @@#endif #define FEC_QUIRK_ENET_MAC +#include <asm/imx-common/regs-lcdif.h> #if !(defined(__KERNEL_STRICT_NAMES) || defined(__ASSEMBLY__))#include <asm/types.h> +/* only for i.MX6SX/UL */ +#define WDOG3_BASE_ADDR (is_cpu_type(MXC_CPU_MX6UL) ? \ + MX6UL_WDOG3_BASE_ADDR : MX6SX_WDOG3_BASE_ADDR) +#define LCDIF1_BASE_ADDR (is_cpu_type(MXC_CPU_MX6UL)) ? \ + MX6UL_LCDIF1_BASE_ADDR : MX6SX_LCDIF1_BASE_ADDR + +extern void imx_get_mac_from_fuse (int dev_id,unsigned char *mac);#define SRC_SCR_CORE_1_RESET_OFFSET 14
Signature · 1 line
1.8.4
PATCH v2 6/14 imx: mx6: crm_reg: add LCDIF related macros
In reply to Peng FanAdd i.MX6UL/SX LCDIF related macros. Discard uneccessary '#ifdef xxx'.
---
V2:
none
arch/arm/include/asm/arch-mx6/crm_regs.h | 34 ++++++++++++++++++++++++++++---- 1 file changed, 30 insertions(+), 4 deletions(-)
arch/arm/include/asm/arch-mx6/crm_regs.h +30 -4
@@ -174,6 +174,9 @@ struct mxc_ccm_reg {#define MXC_CCM_CBCMR_GPU3D_SHADER_PODF_OFFSET 29#define MXC_CCM_CBCMR_GPU3D_CORE_PODF_MASK (0x7 << 26)#define MXC_CCM_CBCMR_GPU3D_CORE_PODF_OFFSET 26 +/* LCDIF on i.MX6SX/UL */ +#define MXC_CCM_CBCMR_LCDIF1_PODF_MASK (0x7 << 23) +#define MXC_CCM_CBCMR_LCDIF1_PODF_OFFSET 23#define MXC_CCM_CBCMR_GPU2D_CORE_PODF_MASK (0x7 << 23)#define MXC_CCM_CBCMR_GPU2D_CORE_PODF_OFFSET 23#define MXC_CCM_CBCMR_PRE_PERIPH2_CLK_SEL_MASK (0x3 << 21)
@@ -210,7 +213,10 @@ struct mxc_ccm_reg {#define MXC_CCM_CSCMR1_ACLK_EMI_OFFSET 27#define MXC_CCM_CSCMR1_ACLK_EMI_SLOW_PODF_MASK (0x7 << 23)#define MXC_CCM_CSCMR1_ACLK_EMI_SLOW_PODF_OFFSET 23 -/* ACLK_EMI_PODF is LCFIF2_PODF on MX6SX */ +/* LCFIF2_PODF on i.MX6SX */ +#define MXC_CCM_CSCMR1_LCDIF2_PODF_MASK (0x7 << 20) +#define MXC_CCM_CSCMR1_LCDIF2_PODF_OFFSET 20 +/* ACLK_EMI on i.MX6DQ/SDL/DQP */ #define MXC_CCM_CSCMR1_ACLK_EMI_PODF_MASK (0x7 << 20)#define MXC_CCM_CSCMR1_ACLK_EMI_PODF_OFFSET 20/* CSCMR1_GPMI/BCH exist on i.MX6UL */
@@ -400,6 +406,20 @@ struct mxc_ccm_reg {#define MXC_CCM_CSCDR2_ECSPI_CLK_PODF_OFFSET 19/* ECSPI_CLK_SEL exists on i.MX6SX/SL/QP */ #define MXC_CCM_CSCDR2_ECSPI_CLK_SEL_MASK (0x1 << 18) +/* LCDIF1 on i.MX6SX/UL */ +#define MXC_CCM_CSCDR2_LCDIF1_PRED_SEL_MASK (0x7 << 15) +#define MXC_CCM_CSCDR2_LCDIF1_PRED_SEL_OFFSET 15 +#define MXC_CCM_CSCDR2_LCDIF1_PRE_DIV_MASK (0x7 << 12) +#define MXC_CCM_CSCDR2_LCDIF1_PRE_DIV_OFFSET 12 +#define MXC_CCM_CSCDR2_LCDIF1_CLK_SEL_MASK (0x7 << 9) +#define MXC_CCM_CSCDR2_LCDIF1_CLK_SEL_OFFSET 9 +/* LCDIF2 on i.MX6SX */ +#define MXC_CCM_CSCDR2_LCDIF2_PRED_SEL_MASK (0x7 << 6) +#define MXC_CCM_CSCDR2_LCDIF2_PRED_SEL_OFFSET 6 +#define MXC_CCM_CSCDR2_LCDIF2_PRE_DIV_MASK (0x7 << 3) +#define MXC_CCM_CSCDR2_LCDIF2_PRE_DIV_OFFSET 3 +#define MXC_CCM_CSCDR2_LCDIF2_CLK_SEL_MASK (0x7 << 0) +#define MXC_CCM_CSCDR2_LCDIF2_CLK_SEL_OFFSET 0/* All IPU2_DI1 are LCDIF1 on MX6SX */ #define MXC_CCM_CHSCCDR_IPU2_DI1_PRE_CLK_SEL_MASK (0x7 << 15)
@@ -622,17 +642,16 @@ struct mxc_ccm_reg {#define MXC_CCM_CCGR2_IPMUX3_MASK (3 << MXC_CCM_CCGR2_IPMUX3_OFFSET)#define MXC_CCM_CCGR2_IPSYNC_IP2APB_TZASC1_IPGS_OFFSET 22#define MXC_CCM_CCGR2_IPSYNC_IP2APB_TZASC1_IPGS_MASK (3 << MXC_CCM_CCGR2_IPSYNC_IP2APB_TZASC1_IPGS_OFFSET) -#ifdef CONFIG_MX6SX +/* i.MX6SX/UL LCD and PXP */ #define MXC_CCM_CCGR2_LCD_OFFSET 28#define MXC_CCM_CCGR2_LCD_MASK (3 << MXC_CCM_CCGR2_LCD_OFFSET)#define MXC_CCM_CCGR2_PXP_OFFSET 30#define MXC_CCM_CCGR2_PXP_MASK (3 << MXC_CCM_CCGR2_PXP_OFFSET) -#else +#define MXC_CCM_CCGR2_IPSYNC_IP2APB_TZASC2_IPG_OFFSET 24#define MXC_CCM_CCGR2_IPSYNC_IP2APB_TZASC2_IPG_MASK (3 << MXC_CCM_CCGR2_IPSYNC_IP2APB_TZASC2_IPG_OFFSET)#define MXC_CCM_CCGR2_IPSYNC_VDOA_IPG_MASTER_CLK_OFFSET 26#define MXC_CCM_CCGR2_IPSYNC_VDOA_IPG_MASTER_CLK_MASK (3 << MXC_CCM_CCGR2_IPSYNC_VDOA_IPG_MASTER_CLK_OFFSET) -#endif /* Exist on i.MX6SX */ #define MXC_CCM_CCGR3_M4_OFFSET 2
@@ -685,6 +704,13 @@ struct mxc_ccm_reg {#define MXC_CCM_CCGR3_MMDC_CORE_IPG_CLK_P0_MASK (3 << MXC_CCM_CCGR3_MMDC_CORE_IPG_CLK_P0_OFFSET)#define MXC_CCM_CCGR3_MMDC_CORE_IPG_CLK_P1_OFFSET 26#define MXC_CCM_CCGR3_MMDC_CORE_IPG_CLK_P1_MASK (3 << MXC_CCM_CCGR3_MMDC_CORE_IPG_CLK_P1_OFFSET) + +#define MXC_CCM_CCGR3_DISP_AXI_OFFSET 6 +#define MXC_CCM_CCGR3_DISP_AXI_MASK (3 << MXC_CCM_CCGR3_DISP_AXI_OFFSET) +#define MXC_CCM_CCGR3_LCDIF2_PIX_OFFSET 8 +#define MXC_CCM_CCGR3_LCDIF2_PIX_MASK (3 << MXC_CCM_CCGR3_LCDIF2_PIX_OFFSET) +#define MXC_CCM_CCGR3_LCDIF1_PIX_OFFSET 10 +#define MXC_CCM_CCGR3_LCDIF1_PIX_MASK (3 << MXC_CCM_CCGR3_LCDIF1_PIX_OFFSET)/* AXI on i.MX6UL */ #define MXC_CCM_CCGR3_AXI_CLK_OFFSET 28#define MXC_CCM_CCGR3_AXI_CLK_MASK (3 << MXC_CCM_CCGR3_AXI_CLK_OFFSET)
Signature · 1 line
1.8.4
PATCH v2 6/14 imx: mx6: crm_reg: add LCDIF related macros
Quoted 85 lines · Peng Fan
Add i.MX6UL/SX LCDIF related macros. Discard uneccessary '#ifdef xxx'.
Signed-off-by Peng Fan <[email protected]>Cc Stefano Babic <[email protected]>---
V2:
nonearch/arm/include/asm/arch-mx6/crm_regs.h | 34 ++++++++++++++++++++++++++++---- 1 file changed, 30 insertions(+), 4 deletions(-)arch/arm/include/asm/arch-mx6/crm_regs.h +23
-4@@ -174,6 +174,9 @@ struct mxc_ccm_reg {#define MXC_CCM_CBCMR_GPU3D_SHADER_PODF_OFFSET 29#define MXC_CCM_CBCMR_GPU3D_CORE_PODF_MASK (0x7 << 26)#define MXC_CCM_CBCMR_GPU3D_CORE_PODF_OFFSET 26 +/* LCDIF on i.MX6SX/UL */ +#define MXC_CCM_CBCMR_LCDIF1_PODF_MASK (0x7 << 23) +#define MXC_CCM_CBCMR_LCDIF1_PODF_OFFSET 23#define MXC_CCM_CBCMR_GPU2D_CORE_PODF_MASK (0x7 << 23)#define MXC_CCM_CBCMR_GPU2D_CORE_PODF_OFFSET 23#define MXC_CCM_CBCMR_PRE_PERIPH2_CLK_SEL_MASK (0x3 << 21)@@ -210,7 +213,10 @@ struct mxc_ccm_reg {#define MXC_CCM_CSCMR1_ACLK_EMI_OFFSET 27#define MXC_CCM_CSCMR1_ACLK_EMI_SLOW_PODF_MASK (0x7 << 23)#define MXC_CCM_CSCMR1_ACLK_EMI_SLOW_PODF_OFFSET 23 -/* ACLK_EMI_PODF is LCFIF2_PODF on MX6SX */ +/* LCFIF2_PODF on i.MX6SX */ +#define MXC_CCM_CSCMR1_LCDIF2_PODF_MASK (0x7 << 20) +#define MXC_CCM_CSCMR1_LCDIF2_PODF_OFFSET 20 +/* ACLK_EMI on i.MX6DQ/SDL/DQP */ #define MXC_CCM_CSCMR1_ACLK_EMI_PODF_MASK (0x7 << 20)#define MXC_CCM_CSCMR1_ACLK_EMI_PODF_OFFSET 20/* CSCMR1_GPMI/BCH exist on i.MX6UL */ @@ -400,6 +406,20 @@ struct mxc_ccm_reg {#define MXC_CCM_CSCDR2_ECSPI_CLK_PODF_OFFSET 19/* ECSPI_CLK_SEL exists on i.MX6SX/SL/QP */ #define MXC_CCM_CSCDR2_ECSPI_CLK_SEL_MASK (0x1 << 18) +/* LCDIF1 on i.MX6SX/UL */ +#define MXC_CCM_CSCDR2_LCDIF1_PRED_SEL_MASK (0x7 << 15) +#define MXC_CCM_CSCDR2_LCDIF1_PRED_SEL_OFFSET 15 +#define MXC_CCM_CSCDR2_LCDIF1_PRE_DIV_MASK (0x7 << 12) +#define MXC_CCM_CSCDR2_LCDIF1_PRE_DIV_OFFSET 12 +#define MXC_CCM_CSCDR2_LCDIF1_CLK_SEL_MASK (0x7 << 9) +#define MXC_CCM_CSCDR2_LCDIF1_CLK_SEL_OFFSET 9 +/* LCDIF2 on i.MX6SX */ +#define MXC_CCM_CSCDR2_LCDIF2_PRED_SEL_MASK (0x7 << 6) +#define MXC_CCM_CSCDR2_LCDIF2_PRED_SEL_OFFSET 6 +#define MXC_CCM_CSCDR2_LCDIF2_PRE_DIV_MASK (0x7 << 3) +#define MXC_CCM_CSCDR2_LCDIF2_PRE_DIV_OFFSET 3 +#define MXC_CCM_CSCDR2_LCDIF2_CLK_SEL_MASK (0x7 << 0) +#define MXC_CCM_CSCDR2_LCDIF2_CLK_SEL_OFFSET 0/* All IPU2_DI1 are LCDIF1 on MX6SX */ #define MXC_CCM_CHSCCDR_IPU2_DI1_PRE_CLK_SEL_MASK (0x7 << 15)@@ -622,17 +642,16 @@ struct mxc_ccm_reg {#define MXC_CCM_CCGR2_IPMUX3_MASK (3 << MXC_CCM_CCGR2_IPMUX3_OFFSET)#define MXC_CCM_CCGR2_IPSYNC_IP2APB_TZASC1_IPGS_OFFSET 22#define MXC_CCM_CCGR2_IPSYNC_IP2APB_TZASC1_IPGS_MASK (3 << MXC_CCM_CCGR2_IPSYNC_IP2APB_TZASC1_IPGS_OFFSET) -#ifdef CONFIG_MX6SX +/* i.MX6SX/UL LCD and PXP */ #define MXC_CCM_CCGR2_LCD_OFFSET 28#define MXC_CCM_CCGR2_LCD_MASK (3 << MXC_CCM_CCGR2_LCD_OFFSET)#define MXC_CCM_CCGR2_PXP_OFFSET 30#define MXC_CCM_CCGR2_PXP_MASK (3 << MXC_CCM_CCGR2_PXP_OFFSET) -#else +#define MXC_CCM_CCGR2_IPSYNC_IP2APB_TZASC2_IPG_OFFSET 24#define MXC_CCM_CCGR2_IPSYNC_IP2APB_TZASC2_IPG_MASK (3 << MXC_CCM_CCGR2_IPSYNC_IP2APB_TZASC2_IPG_OFFSET)#define MXC_CCM_CCGR2_IPSYNC_VDOA_IPG_MASTER_CLK_OFFSET 26#define MXC_CCM_CCGR2_IPSYNC_VDOA_IPG_MASTER_CLK_MASK (3 << MXC_CCM_CCGR2_IPSYNC_VDOA_IPG_MASTER_CLK_OFFSET) -#endif /* Exist on i.MX6SX */ #define MXC_CCM_CCGR3_M4_OFFSET 2@@ -685,6 +704,13 @@ struct mxc_ccm_reg {#define MXC_CCM_CCGR3_MMDC_CORE_IPG_CLK_P0_MASK (3 << MXC_CCM_CCGR3_MMDC_CORE_IPG_CLK_P0_OFFSET)#define MXC_CCM_CCGR3_MMDC_CORE_IPG_CLK_P1_OFFSET 26#define MXC_CCM_CCGR3_MMDC_CORE_IPG_CLK_P1_MASK (3 << MXC_CCM_CCGR3_MMDC_CORE_IPG_CLK_P1_OFFSET)
arch/arm/include/asm/arch-mx6/crm_regs.h struct mxc_ccm_reg { · line 716
Quoted 10 lines
arch/arm/include/asm/arch-mx6/crm_regs.h +7
-0+ +#define MXC_CCM_CCGR3_DISP_AXI_OFFSET 6 +#define MXC_CCM_CCGR3_DISP_AXI_MASK (3 << MXC_CCM_CCGR3_DISP_AXI_OFFSET) +#define MXC_CCM_CCGR3_LCDIF2_PIX_OFFSET 8 +#define MXC_CCM_CCGR3_LCDIF2_PIX_MASK (3 << MXC_CCM_CCGR3_LCDIF2_PIX_OFFSET) +#define MXC_CCM_CCGR3_LCDIF1_PIX_OFFSET 10 +#define MXC_CCM_CCGR3_LCDIF1_PIX_MASK (3 << MXC_CCM_CCGR3_LCDIF1_PIX_OFFSET)/* AXI on i.MX6UL */ #define MXC_CCM_CCGR3_AXI_CLK_OFFSET 28#define MXC_CCM_CCGR3_AXI_CLK_MASK (3 << MXC_CCM_CCGR3_AXI_CLK_OFFSET)
Best regards,
Stefano Babic
Signature · 5 lines
===================================================================== DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de =====================================================================
PATCH v2 7/14 imx: mx6: add clock api for lcdif
In reply to Peng FanImplement mxs_set_lcdclk, enable_lcdif_clock and enable_pll_video. The three API can be used to configure lcdif related clock when CONFIG_VIDEO_MXS enabled.
---
V2:
none
arch/arm/cpu/armv7/mx6/clock.c | 239 ++++++++++++++++++++++++++++++++++ arch/arm/include/asm/arch-mx6/clock.h | 2 + 2 files changed, 241 insertions(+)
arch/arm/cpu/armv7/mx6/clock.c +239 -0
@@ -473,6 +473,245 @@ static u32 get_mmdc_ch0_clk(void) } } +#if defined(CONFIG_VIDEO_MXS ) +static int enable_pll_video (u32 pll_div,u32 pll_num,u32 pll_denom, +u32 post_div) +{ +u32 reg =0 ; +ulong start; + +debug ("pll5 div = %d, num = %d, denom = %d\n" , + pll_div, pll_num, pll_denom); + +/* Power up PLL5 video */ +writel (BM_ANADIG_PLL_VIDEO_POWERDOWN | +BM_ANADIG_PLL_VIDEO_BYPASS | +BM_ANADIG_PLL_VIDEO_DIV_SELECT | +BM_ANADIG_PLL_VIDEO_POST_DIV_SELECT , + &imx_ccm->analog_pll_video_clr); + +/* Set div, num and denom */ +switch (post_div) { +case 1 : +writel (BF_ANADIG_PLL_VIDEO_DIV_SELECT (pll_div) | +BF_ANADIG_PLL_VIDEO_POST_DIV_SELECT (0x2 ), + &imx_ccm->analog_pll_video_set); +break ; +case 2 : +writel (BF_ANADIG_PLL_VIDEO_DIV_SELECT (pll_div) | +BF_ANADIG_PLL_VIDEO_POST_DIV_SELECT (0x1 ), + &imx_ccm->analog_pll_video_set); +break ; +case 4 : +writel (BF_ANADIG_PLL_VIDEO_DIV_SELECT (pll_div) | +BF_ANADIG_PLL_VIDEO_POST_DIV_SELECT (0x0 ), + &imx_ccm->analog_pll_video_set); +break ; +default : +puts ("Wrong test_div!\n" ); +return -EINVAL ; + } + +writel (BF_ANADIG_PLL_VIDEO_NUM_A (pll_num), + &imx_ccm->analog_pll_video_num); +writel (BF_ANADIG_PLL_VIDEO_DENOM_B (pll_denom), + &imx_ccm->analog_pll_video_denom); + +/* Wait PLL5 lock */ + start =get_timer (0 );/* Get current timestamp */ + +do { + reg =readl (&imx_ccm->analog_pll_video); +if (reg &BM_ANADIG_PLL_VIDEO_LOCK ) { +/* Enable PLL out */ +writel (BM_ANADIG_PLL_VIDEO_ENABLE , + &imx_ccm->analog_pll_video_set); +return 0 ; + } + }while (get_timer (0 ) < (start +10 ));/* Wait 10ms */ + +printf ("Lock PLL5 timeout\n" ); + +return -ETIME ; +} + +/* +* 24M--> PLL_VIDEO -> LCDIFx_PRED -> LCDIFx_PODF -> LCD +* +* 'freq' using KHz as unit, see driver/video/mxsfb.c. +*/ +void mxs_set_lcdclk (u32 base_addr,u32 freq) +{ +u32 reg =0 ; +u32 hck =MXC_HCLK /1000 ; +/* DIV_SELECT ranges from 27 to 54 */ +u32 min = hck *27 ; +u32 max = hck *54 ; +u32 temp, best =0 ; +u32 i, j, max_pred =8 , max_postd =8 , pred =1 , postd =1 ; +u32 pll_div, pll_num, pll_denom, post_div =1 ; + +debug ("mxs_set_lcdclk, freq = %dKHz\n" , freq); + +if ((!is_cpu_type (MXC_CPU_MX6SX )) && !is_cpu_type (MXC_CPU_MX6UL )) +return ; + +if (base_addr ==LCDIF1_BASE_ADDR ) { + reg =readl (&imx_ccm->cscdr2); +/* Can't change clocks when clock not from pre-mux */ +if ((reg &MXC_CCM_CSCDR2_LCDIF1_CLK_SEL_MASK ) !=0 ) +return ; + } + +if (is_cpu_type (MXC_CPU_MX6SX )) { + reg =readl (&imx_ccm->cscdr2); +/* Can't change clocks when clock not from pre-mux */ +if ((reg &MXC_CCM_CSCDR2_LCDIF2_CLK_SEL_MASK ) !=0 ) +return ; + } + + temp = freq * max_pred * max_postd; +if (temp > max) { +puts ("Please decrease freq, too large!\n" ); +return ; + } +if (temp < min) { +/* +* Register: PLL_VIDEO +* Bit Field: POST_DIV_SELECT +* 00 ??? Divide by 4. +* 01 ??? Divide by 2. +* 10 ??? Divide by 1. +* 11 ??? Reserved +* No need to check post_div(1) +*/ +for (post_div =2 ; post_div <=4 ; post_div <<=1 ) { +if ((temp * post_div) > min) { + freq *= post_div; +break ; + } + } + +if (post_div >4 ) { +printf ("Fail to set rate to %dkhz" , freq); +return ; + } + } + +/* Choose the best pred and postd to match freq for lcd */ +for (i =1 ; i <= max_pred; i++) { +for (j =1 ; j <= max_postd; j++) { + temp = freq * i * j; +if (temp > max || temp < min) +continue ; +if (best ==0 || temp < best) { + best = temp; + pred = i; + postd = j; + } + } + } + +if (best ==0 ) { +printf ("Fail to set rate to %dKHz" , freq); +return ; + } + +debug ("best %d, pred = %d, postd = %d\n" , best, pred, postd); + + pll_div = best / hck; + pll_denom =1000000 ; + pll_num = (best - hck * pll_div) * pll_denom / hck; + +/* +* pll_num +* (24MHz * (pll_div + --------- )) +* pll_denom +*freq KHz = -------------------------------- +* post_div * pred * postd * 1000 +*/ + +if (base_addr ==LCDIF1_BASE_ADDR ) { +if (enable_pll_video (pll_div, pll_num, pll_denom, post_div)) +return ; + +/* Select pre-lcd clock to PLL5 and set pre divider */ +clrsetbits_le32 (&imx_ccm->cscdr2, +MXC_CCM_CSCDR2_LCDIF1_PRED_SEL_MASK | +MXC_CCM_CSCDR2_LCDIF1_PRE_DIV_MASK , + (0x2 <<MXC_CCM_CSCDR2_LCDIF1_PRED_SEL_OFFSET ) | + ((pred -1 ) << +MXC_CCM_CSCDR2_LCDIF1_PRE_DIV_OFFSET )); + +/* Set the post divider */ +clrsetbits_le32 (&imx_ccm->cbcmr, +MXC_CCM_CBCMR_LCDIF1_PODF_MASK , + ((postd -1 ) << +MXC_CCM_CBCMR_LCDIF1_PODF_OFFSET )); + } + +if (is_cpu_type (MXC_CPU_MX6SX )) { +if (enable_pll_video (pll_div, pll_num, pll_denom, post_div)) +return ; + +/* Select pre-lcd clock to PLL5 and set pre divider */ +clrsetbits_le32 (&imx_ccm->cscdr2, +MXC_CCM_CSCDR2_LCDIF2_PRED_SEL_MASK | +MXC_CCM_CSCDR2_LCDIF2_PRE_DIV_MASK , + (0x2 <<MXC_CCM_CSCDR2_LCDIF2_PRED_SEL_OFFSET ) | + ((pred -1 ) << +MXC_CCM_CSCDR2_LCDIF2_PRE_DIV_OFFSET )); + +/* Set the post divider */ +clrsetbits_le32 (&imx_ccm->cscmr1, +MXC_CCM_CSCMR1_LCDIF2_PODF_MASK , + ((postd -1 ) << +MXC_CCM_CSCMR1_LCDIF2_PODF_OFFSET )); + } +} + +void enable_lcdif_clock (u32 index) +{ +u32 reg =0 ; +u32 lcdif_clk_sel_mask, lcdif_ccgr3_mask; + +if (is_cpu_type (MXC_CPU_MX6SX )) { +if (index >1 ) +return ; +/* Set to pre-mux clock at default */ + lcdif_clk_sel_mask = (index ==1 ) ? +MXC_CCM_CSCDR2_LCDIF2_CLK_SEL_MASK : +MXC_CCM_CSCDR2_LCDIF1_CLK_SEL_MASK ; + lcdif_ccgr3_mask = (index ==1 ) ? + (MXC_CCM_CCGR3_LCDIF2_PIX_MASK | +MXC_CCM_CCGR3_DISP_AXI_MASK ) : + (MXC_CCM_CCGR3_LCDIF1_PIX_MASK | +MXC_CCM_CCGR3_DISP_AXI_MASK ); + }else if (is_cpu_type (MXC_CPU_MX6UL )) { +if (index >0 ) +return ; +/* Set to pre-mux clock at default */ + lcdif_clk_sel_mask =MXC_CCM_CSCDR2_LCDIF1_CLK_SEL_MASK ; + lcdif_ccgr3_mask =MXC_CCM_CCGR3_LCDIF1_PIX_MASK ; + }else { +return ; + } + + reg =readl (&imx_ccm->cscdr2); + reg &= ~lcdif_clk_sel_mask; +writel (reg, &imx_ccm->cscdr2); + +/* Enable the LCDIF pix clock */ + reg =readl (&imx_ccm->CCGR3); + reg |= lcdif_ccgr3_mask; +writel (reg, &imx_ccm->CCGR3); + + reg =readl (&imx_ccm->CCGR2); + reg |=MXC_CCM_CCGR2_LCD_MASK ; +writel (reg, &imx_ccm->CCGR2); +} +#endif +#ifdef CONFIG_FSL_QSPI /* qspi_num can be from 0 - 1 */ void enable_qspi_clk (int qspi_num)
arch/arm/include/asm/arch-mx6/clock.h +2 -0
@@ -66,6 +66,8 @@ int enable_spi_clk(unsigned char enable, unsigned spi_num);void enable_ipu_clock (void );int enable_fec_anatop_clock (int fec_id,enum enet_freq freq);void enable_enet_clk (unsigned char enable); +void enable_lcdif_clock (unsigned int index);void enable_qspi_clk (int qspi_num);void enable_thermal_clk (void ); +void mxs_set_lcdclk (u32 base_addr,u32 freq);#endif /* __ASM_ARCH_CLOCK_H */
Signature · 1 line
1.8.4
PATCH v2 7/14 imx: mx6: add clock api for lcdif
Hi Peng,
Quoted 71 lines · Peng Fan
Implement
mxs_set_lcdclk,enable_lcdif_clockandenable_pll_video. The three API can be used to configure lcdif related clock whenCONFIG_VIDEO_MXSenabled.Signed-off-by Peng Fan <[email protected]>Cc Stefano Babic <[email protected]>---
V2:
nonearch/arm/cpu/armv7/mx6/clock.c | 239 ++++++++++++++++++++++++++++++++++ arch/arm/include/asm/arch-mx6/clock.h | 2 + 2 files changed, 241 insertions(+)arch/arm/cpu/armv7/mx6/clock.c +48
-0@@ -473,6 +473,245 @@ static u32 get_mmdc_ch0_clk(void) } } +#if defined(CONFIG_VIDEO_MXS ) +static int enable_pll_video (u32 pll_div,u32 pll_num,u32 pll_denom, +u32 post_div) +{ +u32 reg =0 ; +ulong start; + +debug ("pll5 div = %d, num = %d, denom = %d\n" , + pll_div, pll_num, pll_denom); + +/* Power up PLL5 video */ +writel (BM_ANADIG_PLL_VIDEO_POWERDOWN | +BM_ANADIG_PLL_VIDEO_BYPASS | +BM_ANADIG_PLL_VIDEO_DIV_SELECT | +BM_ANADIG_PLL_VIDEO_POST_DIV_SELECT , + &imx_ccm->analog_pll_video_clr); + +/* Set div, num and denom */ +switch (post_div) { +case 1 : +writel (BF_ANADIG_PLL_VIDEO_DIV_SELECT (pll_div) | +BF_ANADIG_PLL_VIDEO_POST_DIV_SELECT (0x2 ), + &imx_ccm->analog_pll_video_set); +break ; +case 2 : +writel (BF_ANADIG_PLL_VIDEO_DIV_SELECT (pll_div) | +BF_ANADIG_PLL_VIDEO_POST_DIV_SELECT (0x1 ), + &imx_ccm->analog_pll_video_set); +break ; +case 4 : +writel (BF_ANADIG_PLL_VIDEO_DIV_SELECT (pll_div) | +BF_ANADIG_PLL_VIDEO_POST_DIV_SELECT (0x0 ), + &imx_ccm->analog_pll_video_set); +break ; +default : +puts ("Wrong test_div!\n" ); +return -EINVAL ; + } + +writel (BF_ANADIG_PLL_VIDEO_NUM_A (pll_num), + &imx_ccm->analog_pll_video_num); +writel (BF_ANADIG_PLL_VIDEO_DENOM_B (pll_denom), + &imx_ccm->analog_pll_video_denom); + +/* Wait PLL5 lock */ + start =get_timer (0 );/* Get current timestamp */ + + do {
arch/arm/cpu/armv7/mx6/clock.c static u32 get_mmdc_ch0_clk(void) · line 533
Quoted 10 lines
arch/arm/cpu/armv7/mx6/clock.c +10
-0+ reg =readl (&imx_ccm->analog_pll_video); +if (reg &BM_ANADIG_PLL_VIDEO_LOCK ) { +/* Enable PLL out */ +writel (BM_ANADIG_PLL_VIDEO_ENABLE , + &imx_ccm->analog_pll_video_set); +return 0 ; + } + }while (get_timer (0 ) < (start +10 ));/* Wait 10ms */ + +printf ("Lock PLL5 timeout\n" );
Maybe puts() is better here
Quoted 16 lines
arch/arm/cpu/armv7/mx6/clock.c +16
-0+ +return -ETIME ; +} + +/* +* 24M--> PLL_VIDEO -> LCDIFx_PRED -> LCDIFx_PODF -> LCD +* +* 'freq' using KHz as unit, see driver/video/mxsfb.c. +*/ +void mxs_set_lcdclk (u32 base_addr,u32 freq) +{ +u32 reg =0 ; +u32 hck =MXC_HCLK /1000 ; +/* DIV_SELECT ranges from 27 to 54 */ +u32 min = hck *27 ; +u32 max = hck *54 ;
arch/arm/cpu/armv7/mx6/clock.c static u32 get_mmdc_ch0_clk(void) · line 559
Quoted 10 lines
arch/arm/cpu/armv7/mx6/clock.c +10
-0+u32 temp, best =0 ; +u32 i, j, max_pred =8 , max_postd =8 , pred =1 , postd =1 ; +u32 pll_div, pll_num, pll_denom, post_div =1 ; + +debug ("mxs_set_lcdclk, freq = %dKHz\n" , freq); + +if ((!is_cpu_type (MXC_CPU_MX6SX )) && !is_cpu_type (MXC_CPU_MX6UL )) +return ; + +if (base_addr ==LCDIF1_BASE_ADDR ) {
As mentioned before: base_addr is really an index, it is not used as address. The interface is then confusing.
Quoted 30 lines
arch/arm/cpu/armv7/mx6/clock.c +30
-0+ reg =readl (&imx_ccm->cscdr2); +/* Can't change clocks when clock not from pre-mux */ +if ((reg &MXC_CCM_CSCDR2_LCDIF1_CLK_SEL_MASK ) !=0 ) +return ; + } + +if (is_cpu_type (MXC_CPU_MX6SX )) { + reg =readl (&imx_ccm->cscdr2); +/* Can't change clocks when clock not from pre-mux */ +if ((reg &MXC_CCM_CSCDR2_LCDIF2_CLK_SEL_MASK ) !=0 ) +return ; + } + + temp = freq * max_pred * max_postd; +if (temp > max) { +puts ("Please decrease freq, too large!\n" ); +return ; + } +if (temp < min) { +/* +* Register: PLL_VIDEO +* Bit Field: POST_DIV_SELECT +* 00 ? Divide by 4. +* 01 ? Divide by 2. +* 10 ? Divide by 1. +* 11 ? Reserved +* No need to check post_div(1) +*/ +for (post_div =2 ; post_div <=4 ; post_div <<=1 ) { +if ((temp * post_div) > min) {
arch/arm/cpu/armv7/mx6/clock.c static u32 get_mmdc_ch0_clk(void) · line 599
Quoted 10 lines
arch/arm/cpu/armv7/mx6/clock.c +10
-0+ freq *= post_div; +break ; + } + } + +if (post_div >4 ) { +printf ("Fail to set rate to %dkhz" , freq); +return ; + } + }
It is not clear what happens in the calling function in error case. The error is not propagate to the caller. Of course, we see the error on the console. Is it enough ? The caller will tzry to go on setting the LCD controller even in case this function fails.
Quoted 46 lines
arch/arm/cpu/armv7/mx6/clock.c +46
-0+ +/* Choose the best pred and postd to match freq for lcd */ +for (i =1 ; i <= max_pred; i++) { +for (j =1 ; j <= max_postd; j++) { + temp = freq * i * j; +if (temp > max || temp < min) +continue ; +if (best ==0 || temp < best) { + best = temp; + pred = i; + postd = j; + } + } + } + +if (best ==0 ) { +printf ("Fail to set rate to %dKHz" , freq); +return ; + } + +debug ("best %d, pred = %d, postd = %d\n" , best, pred, postd); + + pll_div = best / hck; + pll_denom =1000000 ; + pll_num = (best - hck * pll_div) * pll_denom / hck; + +/* +* pll_num +* (24MHz * (pll_div + --------- )) +* pll_denom +*freq KHz = -------------------------------- +* post_div * pred * postd * 1000 +*/ + +if (base_addr ==LCDIF1_BASE_ADDR ) { +if (enable_pll_video (pll_div, pll_num, pll_denom, post_div)) +return ; + +/* Select pre-lcd clock to PLL5 and set pre divider */ +clrsetbits_le32 (&imx_ccm->cscdr2, +MXC_CCM_CSCDR2_LCDIF1_PRED_SEL_MASK | +MXC_CCM_CSCDR2_LCDIF1_PRE_DIV_MASK , + (0x2 <<MXC_CCM_CSCDR2_LCDIF1_PRED_SEL_OFFSET ) | + ((pred -1 ) << +MXC_CCM_CSCDR2_LCDIF1_PRE_DIV_OFFSET )); +
arch/arm/cpu/armv7/mx6/clock.c static u32 get_mmdc_ch0_clk(void) · line 655
Quoted 10 lines
arch/arm/cpu/armv7/mx6/clock.c +10
-0+/* Set the post divider */ +clrsetbits_le32 (&imx_ccm->cbcmr, +MXC_CCM_CBCMR_LCDIF1_PODF_MASK , + ((postd -1 ) << +MXC_CCM_CBCMR_LCDIF1_PODF_OFFSET )); + } + +if (is_cpu_type (MXC_CPU_MX6SX )) { +if (enable_pll_video (pll_div, pll_num, pll_denom, post_div)) +return ;
This is not very good readable. If the cpu is i.MX6SX and LCD is LCDIF1, is enable_pll_video called twice ? Why ?
Should we not use something like:
if (lcd == LCDIF1 || is_cpu_type(MXC_CPU_MX6SX)) {
if (enable_pll_video(pll_div, pll_num, pll_denom, post_div))
return;
}Quoted 9 lines
arch/arm/cpu/armv7/mx6/clock.c +9
-0+ +/* Select pre-lcd clock to PLL5 and set pre divider */ +clrsetbits_le32 (&imx_ccm->cscdr2, +MXC_CCM_CSCDR2_LCDIF2_PRED_SEL_MASK | +MXC_CCM_CSCDR2_LCDIF2_PRE_DIV_MASK , + (0x2 <<MXC_CCM_CSCDR2_LCDIF2_PRED_SEL_OFFSET ) | + ((pred -1 ) << +MXC_CCM_CSCDR2_LCDIF2_PRE_DIV_OFFSET )); +
arch/arm/cpu/armv7/mx6/clock.c static u32 get_mmdc_ch0_clk(void) · line 674
Quoted 10 lines
arch/arm/cpu/armv7/mx6/clock.c +10
-0+/* Set the post divider */ +clrsetbits_le32 (&imx_ccm->cscmr1, +MXC_CCM_CSCMR1_LCDIF2_PODF_MASK , + ((postd -1 ) << +MXC_CCM_CSCMR1_LCDIF2_PODF_OFFSET )); + } +} + +void enable_lcdif_clock (u32 index) +{
You see, you are already using an index. Now you have a mix sometimes with an enumeration (this index), sometimes with "base_addr".
Quoted 49 lines
arch/arm/cpu/armv7/mx6/clock.c +40
-0+u32 reg =0 ; +u32 lcdif_clk_sel_mask, lcdif_ccgr3_mask; + +if (is_cpu_type (MXC_CPU_MX6SX )) { +if (index >1 ) +return ; +/* Set to pre-mux clock at default */ + lcdif_clk_sel_mask = (index ==1 ) ? +MXC_CCM_CSCDR2_LCDIF2_CLK_SEL_MASK : +MXC_CCM_CSCDR2_LCDIF1_CLK_SEL_MASK ; + lcdif_ccgr3_mask = (index ==1 ) ? + (MXC_CCM_CCGR3_LCDIF2_PIX_MASK | +MXC_CCM_CCGR3_DISP_AXI_MASK ) : + (MXC_CCM_CCGR3_LCDIF1_PIX_MASK | +MXC_CCM_CCGR3_DISP_AXI_MASK ); + }else if (is_cpu_type (MXC_CPU_MX6UL )) { +if (index >0 ) +return ; +/* Set to pre-mux clock at default */ + lcdif_clk_sel_mask =MXC_CCM_CSCDR2_LCDIF1_CLK_SEL_MASK ; + lcdif_ccgr3_mask =MXC_CCM_CCGR3_LCDIF1_PIX_MASK ; + }else { +return ; + } + + reg =readl (&imx_ccm->cscdr2); + reg &= ~lcdif_clk_sel_mask; +writel (reg, &imx_ccm->cscdr2); + +/* Enable the LCDIF pix clock */ + reg =readl (&imx_ccm->CCGR3); + reg |= lcdif_ccgr3_mask; +writel (reg, &imx_ccm->CCGR3); + + reg =readl (&imx_ccm->CCGR2); + reg |=MXC_CCM_CCGR2_LCD_MASK ; + writel(reg, &imx_ccm->CCGR2); +} +#endif +#ifdef CONFIG_FSL_QSPI /* qspi_num can be from 0 - 1 */ void enable_qspi_clk (int qspi_num)arch/arm/include/asm/arch-mx6/clock.h +0
-0
arch/arm/include/asm/arch-mx6/clock.h int enable_spi_clk(unsigned char enable, unsigned spi_num); · line 73
Quoted 8 lines
arch/arm/include/asm/arch-mx6/clock.h +2
-0@@ -66,6 +66,8 @@ int enable_spi_clk(unsigned char enable, unsigned spi_num);void enable_ipu_clock (void );int enable_fec_anatop_clock (int fec_id,enum enet_freq freq);void enable_enet_clk (unsigned char enable); +void enable_lcdif_clock (unsigned int index);void enable_qspi_clk (int qspi_num);void enable_thermal_clk (void ); +void mxs_set_lcdclk (u32 base_addr,u32 freq);#endif /* __ASM_ARCH_CLOCK_H */
Best regards,
Stefano Babic
Signature · 5 lines
===================================================================== DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de =====================================================================
PATCH v2 7/14 imx: mx6: add clock api for lcdif
Hi Stefano,
Quoted 78 lines · Stefano Babic
Hi Peng,
Quoted 75 lines · Peng Fan
Implement
mxs_set_lcdclk,enable_lcdif_clockandenable_pll_video. The three API can be used to configure lcdif related clock whenCONFIG_VIDEO_MXSenabled.Signed-off-by Peng Fan <[email protected]>Cc Stefano Babic <[email protected]>---
V2:
nonearch/arm/cpu/armv7/mx6/clock.c | 239 ++++++++++++++++++++++++++++++++++ arch/arm/include/asm/arch-mx6/clock.h | 2 + 2 files changed, 241 insertions(+)arch/arm/cpu/armv7/mx6/clock.c +52
-0@@ -473,6 +473,245 @@ static u32 get_mmdc_ch0_clk(void) } } +#if defined(CONFIG_VIDEO_MXS ) +static int enable_pll_video (u32 pll_div,u32 pll_num,u32 pll_denom, +u32 post_div) +{ +u32 reg =0 ; +ulong start; + +debug ("pll5 div = %d, num = %d, denom = %d\n" , + pll_div, pll_num, pll_denom); + +/* Power up PLL5 video */ +writel (BM_ANADIG_PLL_VIDEO_POWERDOWN | +BM_ANADIG_PLL_VIDEO_BYPASS | +BM_ANADIG_PLL_VIDEO_DIV_SELECT | +BM_ANADIG_PLL_VIDEO_POST_DIV_SELECT , + &imx_ccm->analog_pll_video_clr); + +/* Set div, num and denom */ +switch (post_div) { +case 1 : +writel (BF_ANADIG_PLL_VIDEO_DIV_SELECT (pll_div) | +BF_ANADIG_PLL_VIDEO_POST_DIV_SELECT (0x2 ), + &imx_ccm->analog_pll_video_set); +break ; +case 2 : +writel (BF_ANADIG_PLL_VIDEO_DIV_SELECT (pll_div) | +BF_ANADIG_PLL_VIDEO_POST_DIV_SELECT (0x1 ), + &imx_ccm->analog_pll_video_set); +break ; +case 4 : +writel (BF_ANADIG_PLL_VIDEO_DIV_SELECT (pll_div) | +BF_ANADIG_PLL_VIDEO_POST_DIV_SELECT (0x0 ), + &imx_ccm->analog_pll_video_set); +break ; +default : +puts ("Wrong test_div!\n" ); +return -EINVAL ; + } + +writel (BF_ANADIG_PLL_VIDEO_NUM_A (pll_num), + &imx_ccm->analog_pll_video_num); +writel (BF_ANADIG_PLL_VIDEO_DENOM_B (pll_denom), + &imx_ccm->analog_pll_video_denom); + +/* Wait PLL5 lock */ + start =get_timer (0 );/* Get current timestamp */ + + do { + reg = readl(&imx_ccm->analog_pll_video); + if (reg & BM_ANADIG_PLL_VIDEO_LOCK) { + /* Enable PLL out */ + writel(BM_ANADIG_PLL_VIDEO_ENABLE,
Quoted 8 lines
arch/arm/cpu/armv7/mx6/clock.c static u32 get_mmdc_ch0_clk(void) · line 533
Quoted 6 lines
arch/arm/cpu/armv7/mx6/clock.c +6
-0+ &imx_ccm->analog_pll_video_set); +return 0 ; + } + }while (get_timer (0 ) < (start +10 ));/* Wait 10ms */ + +printf ("Lock PLL5 timeout\n" );Maybe
puts()is better here
Thanks, will use puts in V3.
Quoted 22 lines
Quoted 22 lines
arch/arm/cpu/armv7/mx6/clock.c +21
-0+ +return -ETIME ; +} + +/* +* 24M--> PLL_VIDEO -> LCDIFx_PRED -> LCDIFx_PODF -> LCD +* +* 'freq' using KHz as unit, see driver/video/mxsfb.c. +*/ +void mxs_set_lcdclk (u32 base_addr,u32 freq) +{ +u32 reg =0 ; +u32 hck =MXC_HCLK /1000 ; +/* DIV_SELECT ranges from 27 to 54 */ +u32 min = hck *27 ; +u32 max = hck *54 ; +u32 temp, best =0 ; +u32 i, j, max_pred =8 , max_postd =8 , pred =1 , postd =1 ; +u32 pll_div, pll_num, pll_denom, post_div =1 ; + +debug ("mxs_set_lcdclk, freq = %dKHz\n" , freq);
Quoted 8 lines
arch/arm/cpu/armv7/mx6/clock.c static u32 get_mmdc_ch0_clk(void) · line 559
Quoted 5 lines
arch/arm/cpu/armv7/mx6/clock.c +5
-0+ +if ((!is_cpu_type (MXC_CPU_MX6SX )) && !is_cpu_type (MXC_CPU_MX6UL )) +return ; + +if (base_addr ==LCDIF1_BASE_ADDR ) {As mentioned before:
base_addris really an index, it is not used as address. The interface is then confusing.
Will switch to use index.
Quoted 38 lines
Quoted 38 lines
arch/arm/cpu/armv7/mx6/clock.c +37
-0+ reg =readl (&imx_ccm->cscdr2); +/* Can't change clocks when clock not from pre-mux */ +if ((reg &MXC_CCM_CSCDR2_LCDIF1_CLK_SEL_MASK ) !=0 ) +return ; + } + +if (is_cpu_type (MXC_CPU_MX6SX )) { + reg =readl (&imx_ccm->cscdr2); +/* Can't change clocks when clock not from pre-mux */ +if ((reg &MXC_CCM_CSCDR2_LCDIF2_CLK_SEL_MASK ) !=0 ) +return ; + } + + temp = freq * max_pred * max_postd; +if (temp > max) { +puts ("Please decrease freq, too large!\n" ); +return ; + } +if (temp < min) { +/* +* Register: PLL_VIDEO +* Bit Field: POST_DIV_SELECT +* 00 ? Divide by 4. +* 01 ? Divide by 2. +* 10 ? Divide by 1. +* 11 ? Reserved +* No need to check post_div(1) +*/ +for (post_div =2 ; post_div <=4 ; post_div <<=1 ) { +if ((temp * post_div) > min) { + freq *= post_div; +break ; + } + } + +if (post_div >4 ) { +printf ("Fail to set rate to %dkhz" , freq);
Quoted 8 lines
arch/arm/cpu/armv7/mx6/clock.c static u32 get_mmdc_ch0_clk(void) · line 571
Quoted 3 lines
arch/arm/cpu/armv7/mx6/clock.c +3
-0+return ; + } + }It is not clear what happens in the calling function in error case. The error is not propagate to the caller. Of course, we see the error on the console. Is it enough ? The caller will tzry to go on setting the LCD controller even in case this function fails.
Maybe we should change the prototype of
"void mxs_set_lcdclk(u32 freq)" to "int mxs_set_lcdclk(u32 index, u32 freq);"
Quoted 53 lines
Quoted 53 lines
arch/arm/cpu/armv7/mx6/clock.c +51
-0+ +/* Choose the best pred and postd to match freq for lcd */ +for (i =1 ; i <= max_pred; i++) { +for (j =1 ; j <= max_postd; j++) { + temp = freq * i * j; +if (temp > max || temp < min) +continue ; +if (best ==0 || temp < best) { + best = temp; + pred = i; + postd = j; + } + } + } + +if (best ==0 ) { +printf ("Fail to set rate to %dKHz" , freq); +return ; + } + +debug ("best %d, pred = %d, postd = %d\n" , best, pred, postd); + + pll_div = best / hck; + pll_denom =1000000 ; + pll_num = (best - hck * pll_div) * pll_denom / hck; + +/* +* pll_num +* (24MHz * (pll_div + --------- )) +* pll_denom +*freq KHz = -------------------------------- +* post_div * pred * postd * 1000 +*/ + +if (base_addr ==LCDIF1_BASE_ADDR ) { +if (enable_pll_video (pll_div, pll_num, pll_denom, post_div)) +return ; + +/* Select pre-lcd clock to PLL5 and set pre divider */ +clrsetbits_le32 (&imx_ccm->cscdr2, +MXC_CCM_CSCDR2_LCDIF1_PRED_SEL_MASK | +MXC_CCM_CSCDR2_LCDIF1_PRE_DIV_MASK , + (0x2 <<MXC_CCM_CSCDR2_LCDIF1_PRED_SEL_OFFSET ) | + ((pred -1 ) << +MXC_CCM_CSCDR2_LCDIF1_PRE_DIV_OFFSET )); + +/* Set the post divider */ +clrsetbits_le32 (&imx_ccm->cbcmr, +MXC_CCM_CBCMR_LCDIF1_PODF_MASK , + ((postd -1 ) << +MXC_CCM_CBCMR_LCDIF1_PODF_OFFSET ));
Quoted 8 lines
arch/arm/cpu/armv7/mx6/clock.c static u32 get_mmdc_ch0_clk(void) · line 655
Quoted 5 lines
arch/arm/cpu/armv7/mx6/clock.c +5
-0+ } + +if (is_cpu_type (MXC_CPU_MX6SX )) { +if (enable_pll_video (pll_div, pll_num, pll_denom, post_div)) +return ;This is not very good readable. If the cpu is i.MX6SX and LCD is LCDIF1, is
enable_pll_videocalled twice ? Why ?
My bad. Will fix this in V3.
Quoted 23 lines
Should we not use something like:
if (lcd == LCDIF1 || is_cpu_type(MXC_CPU_MX6SX)) { if (enable_pll_video(pll_div, pll_num, pll_denom, post_div)) return; }Quoted 14 lines
arch/arm/cpu/armv7/mx6/clock.c +14
-0+ +/* Select pre-lcd clock to PLL5 and set pre divider */ +clrsetbits_le32 (&imx_ccm->cscdr2, +MXC_CCM_CSCDR2_LCDIF2_PRED_SEL_MASK | +MXC_CCM_CSCDR2_LCDIF2_PRE_DIV_MASK , + (0x2 <<MXC_CCM_CSCDR2_LCDIF2_PRED_SEL_OFFSET ) | + ((pred -1 ) << +MXC_CCM_CSCDR2_LCDIF2_PRE_DIV_OFFSET )); + +/* Set the post divider */ +clrsetbits_le32 (&imx_ccm->cscmr1, +MXC_CCM_CSCMR1_LCDIF2_PODF_MASK , + ((postd -1 ) << +MXC_CCM_CSCMR1_LCDIF2_PODF_OFFSET ));
Quoted 8 lines
arch/arm/cpu/armv7/mx6/clock.c static u32 get_mmdc_ch0_clk(void) · line 674
Quoted 5 lines
arch/arm/cpu/armv7/mx6/clock.c +5
-0+ } +} + +void enable_lcdif_clock (u32 index) +{You see, you are already using an index. Now you have a mix sometimes with an enumeration (this index), sometimes with "
base_addr".
Will fix global in the patch set about usage of base_addr. Switch to use index.
Thanks,
Peng.
Quoted 68 lines
Quoted 50 lines
arch/arm/cpu/armv7/mx6/clock.c +40
-0+u32 reg =0 ; +u32 lcdif_clk_sel_mask, lcdif_ccgr3_mask; + +if (is_cpu_type (MXC_CPU_MX6SX )) { +if (index >1 ) +return ; +/* Set to pre-mux clock at default */ + lcdif_clk_sel_mask = (index ==1 ) ? +MXC_CCM_CSCDR2_LCDIF2_CLK_SEL_MASK : +MXC_CCM_CSCDR2_LCDIF1_CLK_SEL_MASK ; + lcdif_ccgr3_mask = (index ==1 ) ? + (MXC_CCM_CCGR3_LCDIF2_PIX_MASK | +MXC_CCM_CCGR3_DISP_AXI_MASK ) : + (MXC_CCM_CCGR3_LCDIF1_PIX_MASK | +MXC_CCM_CCGR3_DISP_AXI_MASK ); + }else if (is_cpu_type (MXC_CPU_MX6UL )) { +if (index >0 ) +return ; +/* Set to pre-mux clock at default */ + lcdif_clk_sel_mask =MXC_CCM_CSCDR2_LCDIF1_CLK_SEL_MASK ; + lcdif_ccgr3_mask =MXC_CCM_CCGR3_LCDIF1_PIX_MASK ; + }else { +return ; + } + + reg =readl (&imx_ccm->cscdr2); + reg &= ~lcdif_clk_sel_mask; +writel (reg, &imx_ccm->cscdr2); + +/* Enable the LCDIF pix clock */ + reg =readl (&imx_ccm->CCGR3); + reg |= lcdif_ccgr3_mask; +writel (reg, &imx_ccm->CCGR3); + + reg =readl (&imx_ccm->CCGR2); + reg |=MXC_CCM_CCGR2_LCD_MASK ; + writel(reg, &imx_ccm->CCGR2); +} +#endif +#ifdef CONFIG_FSL_QSPI /* qspi_num can be from 0 - 1 */ void enable_qspi_clk (int qspi_num)arch/arm/include/asm/arch-mx6/clock.h +0
-0arch/arm/include/asm/arch-mx6/clock.h int enable_spi_clk(unsigned char enable, unsigned spi_num); · line 73
Quoted 8 lines
arch/arm/include/asm/arch-mx6/clock.h +2
-0@@ -66,6 +66,8 @@ int enable_spi_clk(unsigned char enable, unsigned spi_num);void enable_ipu_clock (void );int enable_fec_anatop_clock (int fec_id,enum enet_freq freq);void enable_enet_clk (unsigned char enable); +void enable_lcdif_clock (unsigned int index);void enable_qspi_clk (int qspi_num);void enable_thermal_clk (void ); +void mxs_set_lcdclk (u32 base_addr,u32 freq);#endif /* __ASM_ARCH_CLOCK_H */ Best regards,
Stefano BabicSignature · 5 lines
===================================================================== DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de =====================================================================
PATCH v2 7/14 imx: mx6: add clock api for lcdif
In reply to Stefano BabicHi Stefano,
Quoted 246 lines · Stefano Babic
Hi Peng,
Quoted 71 lines · Peng Fan
Implement
mxs_set_lcdclk,enable_lcdif_clockandenable_pll_video. The three API can be used to configure lcdif related clock whenCONFIG_VIDEO_MXSenabled.Signed-off-by Peng Fan <[email protected]>Cc Stefano Babic <[email protected]>---
V2:
nonearch/arm/cpu/armv7/mx6/clock.c | 239 ++++++++++++++++++++++++++++++++++ arch/arm/include/asm/arch-mx6/clock.h | 2 + 2 files changed, 241 insertions(+)arch/arm/cpu/armv7/mx6/clock.c +48
-0@@ -473,6 +473,245 @@ static u32 get_mmdc_ch0_clk(void) } } +#if defined(CONFIG_VIDEO_MXS ) +static int enable_pll_video (u32 pll_div,u32 pll_num,u32 pll_denom, +u32 post_div) +{ +u32 reg =0 ; +ulong start; + +debug ("pll5 div = %d, num = %d, denom = %d\n" , + pll_div, pll_num, pll_denom); + +/* Power up PLL5 video */ +writel (BM_ANADIG_PLL_VIDEO_POWERDOWN | +BM_ANADIG_PLL_VIDEO_BYPASS | +BM_ANADIG_PLL_VIDEO_DIV_SELECT | +BM_ANADIG_PLL_VIDEO_POST_DIV_SELECT , + &imx_ccm->analog_pll_video_clr); + +/* Set div, num and denom */ +switch (post_div) { +case 1 : +writel (BF_ANADIG_PLL_VIDEO_DIV_SELECT (pll_div) | +BF_ANADIG_PLL_VIDEO_POST_DIV_SELECT (0x2 ), + &imx_ccm->analog_pll_video_set); +break ; +case 2 : +writel (BF_ANADIG_PLL_VIDEO_DIV_SELECT (pll_div) | +BF_ANADIG_PLL_VIDEO_POST_DIV_SELECT (0x1 ), + &imx_ccm->analog_pll_video_set); +break ; +case 4 : +writel (BF_ANADIG_PLL_VIDEO_DIV_SELECT (pll_div) | +BF_ANADIG_PLL_VIDEO_POST_DIV_SELECT (0x0 ), + &imx_ccm->analog_pll_video_set); +break ; +default : +puts ("Wrong test_div!\n" ); +return -EINVAL ; + } + +writel (BF_ANADIG_PLL_VIDEO_NUM_A (pll_num), + &imx_ccm->analog_pll_video_num); +writel (BF_ANADIG_PLL_VIDEO_DENOM_B (pll_denom), + &imx_ccm->analog_pll_video_denom); + +/* Wait PLL5 lock */ + start =get_timer (0 );/* Get current timestamp */ + + do {arch/arm/cpu/armv7/mx6/clock.c static u32 get_mmdc_ch0_clk(void) · line 533
Quoted 10 lines
arch/arm/cpu/armv7/mx6/clock.c +10
-0+ reg =readl (&imx_ccm->analog_pll_video); +if (reg &BM_ANADIG_PLL_VIDEO_LOCK ) { +/* Enable PLL out */ +writel (BM_ANADIG_PLL_VIDEO_ENABLE , + &imx_ccm->analog_pll_video_set); +return 0 ; + } + }while (get_timer (0 ) < (start +10 ));/* Wait 10ms */ + +printf ("Lock PLL5 timeout\n" );Maybe
puts()is better hereQuoted 16 lines
arch/arm/cpu/armv7/mx6/clock.c +16
-0+ +return -ETIME ; +} + +/* +* 24M--> PLL_VIDEO -> LCDIFx_PRED -> LCDIFx_PODF -> LCD +* +* 'freq' using KHz as unit, see driver/video/mxsfb.c. +*/ +void mxs_set_lcdclk (u32 base_addr,u32 freq) +{ +u32 reg =0 ; +u32 hck =MXC_HCLK /1000 ; +/* DIV_SELECT ranges from 27 to 54 */ +u32 min = hck *27 ; +u32 max = hck *54 ;arch/arm/cpu/armv7/mx6/clock.c static u32 get_mmdc_ch0_clk(void) · line 559
Quoted 10 lines
arch/arm/cpu/armv7/mx6/clock.c +10
-0+u32 temp, best =0 ; +u32 i, j, max_pred =8 , max_postd =8 , pred =1 , postd =1 ; +u32 pll_div, pll_num, pll_denom, post_div =1 ; + +debug ("mxs_set_lcdclk, freq = %dKHz\n" , freq); + +if ((!is_cpu_type (MXC_CPU_MX6SX )) && !is_cpu_type (MXC_CPU_MX6UL )) +return ; + +if (base_addr ==LCDIF1_BASE_ADDR ) {As mentioned before:
base_addris really an index, it is not used as address. The interface is then confusing.Quoted 30 lines
arch/arm/cpu/armv7/mx6/clock.c +30
-0+ reg =readl (&imx_ccm->cscdr2); +/* Can't change clocks when clock not from pre-mux */ +if ((reg &MXC_CCM_CSCDR2_LCDIF1_CLK_SEL_MASK ) !=0 ) +return ; + } + +if (is_cpu_type (MXC_CPU_MX6SX )) { + reg =readl (&imx_ccm->cscdr2); +/* Can't change clocks when clock not from pre-mux */ +if ((reg &MXC_CCM_CSCDR2_LCDIF2_CLK_SEL_MASK ) !=0 ) +return ; + } + + temp = freq * max_pred * max_postd; +if (temp > max) { +puts ("Please decrease freq, too large!\n" ); +return ; + } +if (temp < min) { +/* +* Register: PLL_VIDEO +* Bit Field: POST_DIV_SELECT +* 00 ? Divide by 4. +* 01 ? Divide by 2. +* 10 ? Divide by 1. +* 11 ? Reserved +* No need to check post_div(1) +*/ +for (post_div =2 ; post_div <=4 ; post_div <<=1 ) { +if ((temp * post_div) > min) {arch/arm/cpu/armv7/mx6/clock.c static u32 get_mmdc_ch0_clk(void) · line 599
Quoted 10 lines
arch/arm/cpu/armv7/mx6/clock.c +10
-0+ freq *= post_div; +break ; + } + } + +if (post_div >4 ) { +printf ("Fail to set rate to %dkhz" , freq); +return ; + } + }It is not clear what happens in the calling function in error case. The error is not propagate to the caller. Of course, we see the error on the console. Is it enough ? The caller will tzry to go on setting the LCD controller even in case this function fails.
Quoted 46 lines
arch/arm/cpu/armv7/mx6/clock.c +46
-0+ +/* Choose the best pred and postd to match freq for lcd */ +for (i =1 ; i <= max_pred; i++) { +for (j =1 ; j <= max_postd; j++) { + temp = freq * i * j; +if (temp > max || temp < min) +continue ; +if (best ==0 || temp < best) { + best = temp; + pred = i; + postd = j; + } + } + } + +if (best ==0 ) { +printf ("Fail to set rate to %dKHz" , freq); +return ; + } + +debug ("best %d, pred = %d, postd = %d\n" , best, pred, postd); + + pll_div = best / hck; + pll_denom =1000000 ; + pll_num = (best - hck * pll_div) * pll_denom / hck; + +/* +* pll_num +* (24MHz * (pll_div + --------- )) +* pll_denom +*freq KHz = -------------------------------- +* post_div * pred * postd * 1000 +*/ + +if (base_addr ==LCDIF1_BASE_ADDR ) { +if (enable_pll_video (pll_div, pll_num, pll_denom, post_div)) +return ; + +/* Select pre-lcd clock to PLL5 and set pre divider */ +clrsetbits_le32 (&imx_ccm->cscdr2, +MXC_CCM_CSCDR2_LCDIF1_PRED_SEL_MASK | +MXC_CCM_CSCDR2_LCDIF1_PRE_DIV_MASK , + (0x2 <<MXC_CCM_CSCDR2_LCDIF1_PRED_SEL_OFFSET ) | + ((pred -1 ) << +MXC_CCM_CSCDR2_LCDIF1_PRE_DIV_OFFSET )); +arch/arm/cpu/armv7/mx6/clock.c static u32 get_mmdc_ch0_clk(void) · line 655
Quoted 10 lines
arch/arm/cpu/armv7/mx6/clock.c +10
-0+/* Set the post divider */ +clrsetbits_le32 (&imx_ccm->cbcmr, +MXC_CCM_CBCMR_LCDIF1_PODF_MASK , + ((postd -1 ) << +MXC_CCM_CBCMR_LCDIF1_PODF_OFFSET )); + } + +if (is_cpu_type (MXC_CPU_MX6SX )) { +if (enable_pll_video (pll_div, pll_num, pll_denom, post_div)) +return ;This is not very good readable. If the cpu is i.MX6SX and LCD is LCDIF1, is
enable_pll_videocalled twice ? Why ?Should we not use something like:
if (lcd == LCDIF1 || is_cpu_type(MXC_CPU_MX6SX)) { if (enable_pll_video(pll_div, pll_num, pll_denom, post_div)) return; }Quoted 14 lines
arch/arm/cpu/armv7/mx6/clock.c +14
-0+ +/* Select pre-lcd clock to PLL5 and set pre divider */ +clrsetbits_le32 (&imx_ccm->cscdr2, +MXC_CCM_CSCDR2_LCDIF2_PRED_SEL_MASK | +MXC_CCM_CSCDR2_LCDIF2_PRE_DIV_MASK , + (0x2 <<MXC_CCM_CSCDR2_LCDIF2_PRED_SEL_OFFSET ) | + ((pred -1 ) << +MXC_CCM_CSCDR2_LCDIF2_PRE_DIV_OFFSET )); + +/* Set the post divider */ +clrsetbits_le32 (&imx_ccm->cscmr1, +MXC_CCM_CSCMR1_LCDIF2_PODF_MASK , + ((postd -1 ) << +MXC_CCM_CSCMR1_LCDIF2_PODF_OFFSET ));
Quoted 8 lines
arch/arm/cpu/armv7/mx6/clock.c static u32 get_mmdc_ch0_clk(void) · line 674
Quoted 5 lines
arch/arm/cpu/armv7/mx6/clock.c +5
-0+ } +} + +void enable_lcdif_clock (u32 index) +{You see, you are already using an index. Now you have a mix sometimes with an enumeration (this index), sometimes with "
base_addr".
After a thought, I think use base_addr is better. In drivers/video/mxs_fb.c, MXS_LCDIF_BASE is used, I do not want to introduce another macro such as MXS_LCDIF_INDEX. So choose base_addr can avoid add more macro definitions in board header files. I'll switch to use base_addr in the patch set.
Regards,
Peng.
Quoted 68 lines
Quoted 50 lines
arch/arm/cpu/armv7/mx6/clock.c +40
-0+u32 reg =0 ; +u32 lcdif_clk_sel_mask, lcdif_ccgr3_mask; + +if (is_cpu_type (MXC_CPU_MX6SX )) { +if (index >1 ) +return ; +/* Set to pre-mux clock at default */ + lcdif_clk_sel_mask = (index ==1 ) ? +MXC_CCM_CSCDR2_LCDIF2_CLK_SEL_MASK : +MXC_CCM_CSCDR2_LCDIF1_CLK_SEL_MASK ; + lcdif_ccgr3_mask = (index ==1 ) ? + (MXC_CCM_CCGR3_LCDIF2_PIX_MASK | +MXC_CCM_CCGR3_DISP_AXI_MASK ) : + (MXC_CCM_CCGR3_LCDIF1_PIX_MASK | +MXC_CCM_CCGR3_DISP_AXI_MASK ); + }else if (is_cpu_type (MXC_CPU_MX6UL )) { +if (index >0 ) +return ; +/* Set to pre-mux clock at default */ + lcdif_clk_sel_mask =MXC_CCM_CSCDR2_LCDIF1_CLK_SEL_MASK ; + lcdif_ccgr3_mask =MXC_CCM_CCGR3_LCDIF1_PIX_MASK ; + }else { +return ; + } + + reg =readl (&imx_ccm->cscdr2); + reg &= ~lcdif_clk_sel_mask; +writel (reg, &imx_ccm->cscdr2); + +/* Enable the LCDIF pix clock */ + reg =readl (&imx_ccm->CCGR3); + reg |= lcdif_ccgr3_mask; +writel (reg, &imx_ccm->CCGR3); + + reg =readl (&imx_ccm->CCGR2); + reg |=MXC_CCM_CCGR2_LCD_MASK ; + writel(reg, &imx_ccm->CCGR2); +} +#endif +#ifdef CONFIG_FSL_QSPI /* qspi_num can be from 0 - 1 */ void enable_qspi_clk (int qspi_num)arch/arm/include/asm/arch-mx6/clock.h +0
-0arch/arm/include/asm/arch-mx6/clock.h int enable_spi_clk(unsigned char enable, unsigned spi_num); · line 73
Quoted 8 lines
arch/arm/include/asm/arch-mx6/clock.h +2
-0@@ -66,6 +66,8 @@ int enable_spi_clk(unsigned char enable, unsigned spi_num);void enable_ipu_clock (void );int enable_fec_anatop_clock (int fec_id,enum enet_freq freq);void enable_enet_clk (unsigned char enable); +void enable_lcdif_clock (unsigned int index);void enable_qspi_clk (int qspi_num);void enable_thermal_clk (void ); +void mxs_set_lcdclk (u32 base_addr,u32 freq);#endif /* __ASM_ARCH_CLOCK_H */ Best regards,
Stefano BabicSignature · 5 lines
===================================================================== DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de =====================================================================
PATCH v2 8/14 imx: mx6ul_14x14_evk: support lcdif display
In reply to Peng FanSupport lcdif display:
1. Add pinmux and pad settings for LCDIF
2. Introduce setup_lcd to do the settings for LCDIF
3. Enable VIDEO related macros in board header files
4. Add a new env videomode which is needed by mxsfb.c. The settings for videomode in this patch is for TFT43AB.
5. Tested on mx6ul 14x14/9x9 evk.
---
V2:
Rebased to Latest U-Boot, resolve conflicts.
board/freescale/mx6ul_14x14_evk/mx6ul_14x14_evk.c | 63 +++++++++++++++++++++++ include/configs/mx6ul_14x14_evk.h | 18 +++++++ 2 files changed, 81 insertions(+)
board/freescale/mx6ul_14x14_evk/mx6ul_14x14_evk.c +63 -0
@@ -52,6 +52,9 @@ DECLARE_GLOBAL_DATA_PTR; PAD_CTL_SPEED_HIGH | \ PAD_CTL_DSE_48ohm | PAD_CTL_SRE_FAST) +#define LCD_PAD_CTRL (PAD_CTL_HYS | PAD_CTL_PUS_100K_UP | PAD_CTL_PUE | \ + PAD_CTL_PKE | PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm) +#define MDIO_PAD_CTRL (PAD_CTL_PUS_100K_UP | PAD_CTL_PUE | \ PAD_CTL_DSE_48ohm | PAD_CTL_SRE_FAST | PAD_CTL_ODE)
@@ -568,6 +571,62 @@ int board_phy_config(struct phy_device *phydev) }#endif +#ifdef CONFIG_VIDEO_MXS +static iomux_v3_cfg_t const lcd_pads[] = { +MX6_PAD_LCD_CLK__LCDIF_CLK |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_ENABLE__LCDIF_ENABLE |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_HSYNC__LCDIF_HSYNC |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_VSYNC__LCDIF_VSYNC |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_DATA00__LCDIF_DATA00 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_DATA01__LCDIF_DATA01 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_DATA02__LCDIF_DATA02 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_DATA03__LCDIF_DATA03 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_DATA04__LCDIF_DATA04 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_DATA05__LCDIF_DATA05 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_DATA06__LCDIF_DATA06 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_DATA07__LCDIF_DATA07 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_DATA08__LCDIF_DATA08 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_DATA09__LCDIF_DATA09 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_DATA10__LCDIF_DATA10 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_DATA11__LCDIF_DATA11 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_DATA12__LCDIF_DATA12 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_DATA13__LCDIF_DATA13 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_DATA14__LCDIF_DATA14 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_DATA15__LCDIF_DATA15 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_DATA16__LCDIF_DATA16 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_DATA17__LCDIF_DATA17 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_DATA18__LCDIF_DATA18 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_DATA19__LCDIF_DATA19 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_DATA20__LCDIF_DATA20 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_DATA21__LCDIF_DATA21 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_DATA22__LCDIF_DATA22 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_DATA23__LCDIF_DATA23 |MUX_PAD_CTRL (LCD_PAD_CTRL ), + +/* LCD_RST */ +MX6_PAD_SNVS_TAMPER9__GPIO5_IO09 |MUX_PAD_CTRL (NO_PAD_CTRL ), + +/* Use GPIO for Brightness adjustment, duty cycle = period. */ +MX6_PAD_GPIO1_IO08__GPIO1_IO08 |MUX_PAD_CTRL (NO_PAD_CTRL ), +}; + +static int setup_lcd (void ) +{ +enable_lcdif_clock (0 ); + +imx_iomux_v3_setup_multiple_pads (lcd_pads,ARRAY_SIZE (lcd_pads)); + +/* Reset the LCD */ +gpio_direction_output (IMX_GPIO_NR (5 ,9 ) ,0 ); +udelay (500 ); +gpio_direction_output (IMX_GPIO_NR (5 ,9 ) ,1 ); + +/* Set Brightness to high */ +gpio_direction_output (IMX_GPIO_NR (1 ,8 ) ,1 ); + +return 0 ; +} +#endif +int board_early_init_f (void ) {setup_iomux_uart ();
@@ -600,6 +659,10 @@ int board_init(void)board_qspi_init ();#endif +#ifdef CONFIG_VIDEO_MXS +setup_lcd (); +#endif +return 0 ; }
include/configs/mx6ul_14x14_evk.h +18 -0
@@ -77,6 +77,7 @@"fdt_addr=0x83000000\0" \"boot_fdt=try\0" \"ip_dyn=yes\0" \ +"videomode=video=ctfb:x:480,y:272,depth:24,pclk:108695,le:8,ri:4,up:2,lo:4,hs:41,vs:10,sync:0,vmode:0\0" \ "mmcdev="__stringify(CONFIG_SYS_MMC_ENV_DEV)"\0" \ "mmcpart=" __stringify(CONFIG_SYS_MMC_IMG_LOAD_PART) "\0" \"mmcroot=" CONFIG_MMCROOT " rootwait rw\0" \
@@ -242,4 +243,21 @@#define CONFIG_IMX_THERMAL +#define CONFIG_VIDEO +#ifdef CONFIG_VIDEO +#define CONFIG_CFB_CONSOLE +#define CONFIG_VIDEO_MXS +#define CONFIG_VIDEO_LOGO +#define CONFIG_VIDEO_SW_CURSOR +#define CONFIG_VGA_AS_SINGLE_DEVICE +#define CONFIG_SYS_CONSOLE_IS_IN_ENV +#define CONFIG_SPLASH_SCREEN +#define CONFIG_SPLASH_SCREEN_ALIGN +#define CONFIG_CMD_BMP +#define CONFIG_BMP_16BPP +#define CONFIG_VIDEO_BMP_RLE8 +#define CONFIG_VIDEO_BMP_LOGO +#define MXS_LCDIF_BASE MX6UL_LCDIF1_BASE_ADDR +#endif +#endif
Signature · 1 line
1.8.4
PATCH v2 8/14 imx: mx6ul_14x14_evk: support lcdif display
Hi Peng,
Quoted 76 lines · Peng Fan
Support lcdif display:
1. Add pinmux and pad settings for LCDIF
2. Introducesetup_lcdto do the settings for LCDIF
3. Enable VIDEO related macros in board header files
4. Add a new env videomode which is needed bymxsfb.c. The settings for videomode in this patch is for TFT43AB.
5. Tested on mx6ul 14x14/9x9 evk.Signed-off-by Peng Fan <[email protected]>Cc Stefano Babic <[email protected]>---
V2:
Rebased to Latest U-Boot, resolve conflicts.board/freescale/mx6ul_14x14_evk/mx6ul_14x14_evk.c | 63 +++++++++++++++++++++++ include/configs/mx6ul_14x14_evk.h | 18 +++++++ 2 files changed, 81 insertions(+)board/freescale/mx6ul_14x14_evk/mx6ul_14x14_evk.c +42
-0@@ -52,6 +52,9 @@ DECLARE_GLOBAL_DATA_PTR; PAD_CTL_SPEED_HIGH | \ PAD_CTL_DSE_48ohm | PAD_CTL_SRE_FAST) +#define LCD_PAD_CTRL (PAD_CTL_HYS | PAD_CTL_PUS_100K_UP | PAD_CTL_PUE | \ + PAD_CTL_PKE | PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm) +#define MDIO_PAD_CTRL (PAD_CTL_PUS_100K_UP | PAD_CTL_PUE | \ PAD_CTL_DSE_48ohm | PAD_CTL_SRE_FAST | PAD_CTL_ODE)@@ -568,6 +571,62 @@ int board_phy_config(struct phy_device *phydev) }#endif +#ifdef CONFIG_VIDEO_MXS +static iomux_v3_cfg_t const lcd_pads[] = { +MX6_PAD_LCD_CLK__LCDIF_CLK |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_ENABLE__LCDIF_ENABLE |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_HSYNC__LCDIF_HSYNC |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_VSYNC__LCDIF_VSYNC |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_DATA00__LCDIF_DATA00 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_DATA01__LCDIF_DATA01 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_DATA02__LCDIF_DATA02 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_DATA03__LCDIF_DATA03 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_DATA04__LCDIF_DATA04 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_DATA05__LCDIF_DATA05 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_DATA06__LCDIF_DATA06 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_DATA07__LCDIF_DATA07 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_DATA08__LCDIF_DATA08 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_DATA09__LCDIF_DATA09 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_DATA10__LCDIF_DATA10 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_DATA11__LCDIF_DATA11 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_DATA12__LCDIF_DATA12 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_DATA13__LCDIF_DATA13 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_DATA14__LCDIF_DATA14 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_DATA15__LCDIF_DATA15 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_DATA16__LCDIF_DATA16 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_DATA17__LCDIF_DATA17 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_DATA18__LCDIF_DATA18 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_DATA19__LCDIF_DATA19 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_DATA20__LCDIF_DATA20 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_DATA21__LCDIF_DATA21 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_DATA22__LCDIF_DATA22 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_DATA23__LCDIF_DATA23 |MUX_PAD_CTRL (LCD_PAD_CTRL ), + +/* LCD_RST */ +MX6_PAD_SNVS_TAMPER9__GPIO5_IO09 |MUX_PAD_CTRL (NO_PAD_CTRL ), + +/* Use GPIO for Brightness adjustment, duty cycle = period. */ +MX6_PAD_GPIO1_IO08__GPIO1_IO08 |MUX_PAD_CTRL (NO_PAD_CTRL ), +}; + +static int setup_lcd (void )
board/freescale/mx6ul_14x14_evk/mx6ul_14x14_evk.c int board_phy_config(struct phy_device *phydev) · line 622
Quoted 10 lines
board/freescale/mx6ul_14x14_evk/mx6ul_14x14_evk.c +10
-0+{ +enable_lcdif_clock (0 ); + +imx_iomux_v3_setup_multiple_pads (lcd_pads,ARRAY_SIZE (lcd_pads)); + +/* Reset the LCD */ +gpio_direction_output (IMX_GPIO_NR (5 ,9 ) ,0 ); +udelay (500 ); +gpio_direction_output (IMX_GPIO_NR (5 ,9 ) ,1 ); +
Just a curiosity: a display reset ? Why is this needed ?
Quoted 26 lines
board/freescale/mx6ul_14x14_evk/mx6ul_14x14_evk.c +11
-0+/* Set Brightness to high */ +gpio_direction_output (IMX_GPIO_NR (1 ,8 ) ,1 ); + + return 0; +} +#endif +int board_early_init_f (void ) {setup_iomux_uart ();@@ -600,6 +659,10 @@ int board_init(void)board_qspi_init ();#endif +#ifdef CONFIG_VIDEO_MXS +setup_lcd (); +#endif +return 0 ; }include/configs/mx6ul_14x14_evk.h +0
-0
include/configs/mx6ul_14x14_evk.h line 80
Quoted 4 lines
include/configs/mx6ul_14x14_evk.h +1
-0@@ -77,6 +77,7 @@"fdt_addr=0x83000000\0" \"boot_fdt=try\0" \"ip_dyn=yes\0" \ +"videomode=video=ctfb:x:480,y:272,depth:24,pclk:108695,le:8,ri:4,up:2,lo:4,hs:41,vs:10,sync:0,vmode:0\0" \
Why this ? Setup is in device tree, we should not need it, do we ?
Quoted 16 lines
include/configs/mx6ul_14x14_evk.h +8
-0"mmcdev="__stringify(CONFIG_SYS_MMC_ENV_DEV)"\0" \ "mmcpart=" __stringify(CONFIG_SYS_MMC_IMG_LOAD_PART) "\0" \"mmcroot=" CONFIG_MMCROOT " rootwait rw\0" \@@ -242,4 +243,21 @@#define CONFIG_IMX_THERMAL +#define CONFIG_VIDEO +#ifdef CONFIG_VIDEO +#define CONFIG_CFB_CONSOLE +#define CONFIG_VIDEO_MXS +#define CONFIG_VIDEO_LOGO +#define CONFIG_VIDEO_SW_CURSOR +#define CONFIG_VGA_AS_SINGLE_DEVICE +#define CONFIG_SYS_CONSOLE_IS_IN_ENV
include/configs/mx6ul_14x14_evk.h line 263
Quoted 10 lines
include/configs/mx6ul_14x14_evk.h +9
-0+#define CONFIG_SPLASH_SCREEN +#define CONFIG_SPLASH_SCREEN_ALIGN +#define CONFIG_CMD_BMP +#define CONFIG_BMP_16BPP +#define CONFIG_VIDEO_BMP_RLE8 +#define CONFIG_VIDEO_BMP_LOGO +#define MXS_LCDIF_BASE MX6UL_LCDIF1_BASE_ADDR +#endif +#endif
Best regards,
Stefano Babic
Signature · 5 lines
===================================================================== DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de =====================================================================
PATCH v2 8/14 imx: mx6ul_14x14_evk: support lcdif display
Hi Stefano,
Quoted 83 lines · Stefano Babic
Hi Peng,
Quoted 80 lines · Peng Fan
Support lcdif display:
1. Add pinmux and pad settings for LCDIF
2. Introducesetup_lcdto do the settings for LCDIF
3. Enable VIDEO related macros in board header files
4. Add a new env videomode which is needed bymxsfb.c. The settings for videomode in this patch is for TFT43AB.
5. Tested on mx6ul 14x14/9x9 evk.Signed-off-by Peng Fan <[email protected]>Cc Stefano Babic <[email protected]>---
V2:
Rebased to Latest U-Boot, resolve conflicts.board/freescale/mx6ul_14x14_evk/mx6ul_14x14_evk.c | 63 +++++++++++++++++++++++ include/configs/mx6ul_14x14_evk.h | 18 +++++++ 2 files changed, 81 insertions(+)board/freescale/mx6ul_14x14_evk/mx6ul_14x14_evk.c +46
-0@@ -52,6 +52,9 @@ DECLARE_GLOBAL_DATA_PTR; PAD_CTL_SPEED_HIGH | \ PAD_CTL_DSE_48ohm | PAD_CTL_SRE_FAST) +#define LCD_PAD_CTRL (PAD_CTL_HYS | PAD_CTL_PUS_100K_UP | PAD_CTL_PUE | \ + PAD_CTL_PKE | PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm) +#define MDIO_PAD_CTRL (PAD_CTL_PUS_100K_UP | PAD_CTL_PUE | \ PAD_CTL_DSE_48ohm | PAD_CTL_SRE_FAST | PAD_CTL_ODE)@@ -568,6 +571,62 @@ int board_phy_config(struct phy_device *phydev) }#endif +#ifdef CONFIG_VIDEO_MXS +static iomux_v3_cfg_t const lcd_pads[] = { +MX6_PAD_LCD_CLK__LCDIF_CLK |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_ENABLE__LCDIF_ENABLE |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_HSYNC__LCDIF_HSYNC |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_VSYNC__LCDIF_VSYNC |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_DATA00__LCDIF_DATA00 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_DATA01__LCDIF_DATA01 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_DATA02__LCDIF_DATA02 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_DATA03__LCDIF_DATA03 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_DATA04__LCDIF_DATA04 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_DATA05__LCDIF_DATA05 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_DATA06__LCDIF_DATA06 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_DATA07__LCDIF_DATA07 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_DATA08__LCDIF_DATA08 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_DATA09__LCDIF_DATA09 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_DATA10__LCDIF_DATA10 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_DATA11__LCDIF_DATA11 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_DATA12__LCDIF_DATA12 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_DATA13__LCDIF_DATA13 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_DATA14__LCDIF_DATA14 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_DATA15__LCDIF_DATA15 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_DATA16__LCDIF_DATA16 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_DATA17__LCDIF_DATA17 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_DATA18__LCDIF_DATA18 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_DATA19__LCDIF_DATA19 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_DATA20__LCDIF_DATA20 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_DATA21__LCDIF_DATA21 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_DATA22__LCDIF_DATA22 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX6_PAD_LCD_DATA23__LCDIF_DATA23 |MUX_PAD_CTRL (LCD_PAD_CTRL ), + +/* LCD_RST */ +MX6_PAD_SNVS_TAMPER9__GPIO5_IO09 |MUX_PAD_CTRL (NO_PAD_CTRL ), + +/* Use GPIO for Brightness adjustment, duty cycle = period. */ +MX6_PAD_GPIO1_IO08__GPIO1_IO08 |MUX_PAD_CTRL (NO_PAD_CTRL ), +}; + +static int setup_lcd (void ) +{ +enable_lcdif_clock (0 ); + +imx_iomux_v3_setup_multiple_pads (lcd_pads,ARRAY_SIZE (lcd_pads));
Quoted 8 lines
board/freescale/mx6ul_14x14_evk/mx6ul_14x14_evk.c int board_phy_config(struct phy_device *phydev) · line 622
Quoted 6 lines
board/freescale/mx6ul_14x14_evk/mx6ul_14x14_evk.c +6
-0+ +/* Reset the LCD */ +gpio_direction_output (IMX_GPIO_NR (5 ,9 ) ,0 ); +udelay (500 ); +gpio_direction_output (IMX_GPIO_NR (5 ,9 ) ,1 ); +Just a curiosity: a display reset ? Why is this needed ?
Yeah. Just want to make it stable. When first coding this part, it was added here. We did not stress test without this reset.
Quoted 22 lines
Quoted 22 lines
board/freescale/mx6ul_14x14_evk/mx6ul_14x14_evk.c +11
-0+/* Set Brightness to high */ +gpio_direction_output (IMX_GPIO_NR (1 ,8 ) ,1 ); + + return 0; +} +#endif +int board_early_init_f (void ) {setup_iomux_uart ();@@ -600,6 +659,10 @@ int board_init(void)board_qspi_init ();#endif +#ifdef CONFIG_VIDEO_MXS +setup_lcd (); +#endif +return 0 ; }
Quoted 11 lines
include/configs/mx6ul_14x14_evk.h line 80
Quoted 9 lines
include/configs/mx6ul_14x14_evk.h +1
-0@@ -77,6 +77,7 @@"fdt_addr=0x83000000\0" \"boot_fdt=try\0" \"ip_dyn=yes\0" \ +"videomode=video=ctfb:x:480,y:272,depth:24,pclk:108695,le:8,ri:4,up:2,lo:4,hs:41,vs:10,sync:0,vmode:0\0" \Why this ? Setup is in device tree, we should not need it, do we ?
We do not support device tree for i.MX uboot for now. driver/video/mxsfb.c will use the env to init the lcdif, if without the videomode env, the driver do not know the parameters to init the lcdif controller.
Regards,
Peng.
Quoted 37 lines
Quoted 17 lines
include/configs/mx6ul_14x14_evk.h +8
-0"mmcdev="__stringify(CONFIG_SYS_MMC_ENV_DEV)"\0" \ "mmcpart=" __stringify(CONFIG_SYS_MMC_IMG_LOAD_PART) "\0" \"mmcroot=" CONFIG_MMCROOT " rootwait rw\0" \@@ -242,4 +243,21 @@#define CONFIG_IMX_THERMAL +#define CONFIG_VIDEO +#ifdef CONFIG_VIDEO +#define CONFIG_CFB_CONSOLE +#define CONFIG_VIDEO_MXS +#define CONFIG_VIDEO_LOGO +#define CONFIG_VIDEO_SW_CURSOR +#define CONFIG_VGA_AS_SINGLE_DEVICE +#define CONFIG_SYS_CONSOLE_IS_IN_ENV include/configs/mx6ul_14x14_evk.h line 263
Quoted 10 lines
include/configs/mx6ul_14x14_evk.h +9
-0+#define CONFIG_SPLASH_SCREEN +#define CONFIG_SPLASH_SCREEN_ALIGN +#define CONFIG_CMD_BMP +#define CONFIG_BMP_16BPP +#define CONFIG_VIDEO_BMP_RLE8 +#define CONFIG_VIDEO_BMP_LOGO +#define MXS_LCDIF_BASE MX6UL_LCDIF1_BASE_ADDR +#endif +#endif Best regards,
Stefano BabicSignature · 5 lines
===================================================================== DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de =====================================================================
PATCH v2 9/14 video: mxsfb: introduce lcdif_power_down
In reply to Peng FanIntroudce a new function lcdif_power_down.
1. Waits for a VSYNC interrupt to guarantee the reset is done at the VSYNC edge, which somehow makes the LCDIF consume the display FIFO(?) and helps the LCDIF work normally at the kernel stage.
2. Add power down function to stop lcdif.
The reason to introduce lcdif_power_down is that we want lcdif to be in initial state when doing uboot reset or before kernel boot to make system stable, otherwise system may hang.
---
V2:
none
arch/arm/include/asm/imx-common/sys_proto.h | 2 ++ drivers/video/mxsfb.c | 17 +++++++++++++++++ 2 files changed, 19 insertions(+)
arch/arm/include/asm/imx-common/sys_proto.h +2 -0
@@ -47,6 +47,8 @@ int fecmxc_initialize(bd_t *bis);u32 get_ahb_clk (void );u32 get_periph_clk (void ); +void lcdif_power_down (void ); +int mxs_reset_block (struct mxs_register_32 *reg);int mxs_wait_mask_set (struct mxs_register_32 *reg,u32 mask,u32 timeout);int mxs_wait_mask_clr (struct mxs_register_32 *reg,u32 mask,u32 timeout);
drivers/video/mxsfb.c +17 -0
@@ -131,6 +131,23 @@ static void mxs_lcd_init(GraphicDevice *panel,writel (LCDIF_CTRL_RUN , ®s->hw_lcdif_ctrl_set); } +void lcdif_power_down (void ) +{ +struct mxs_lcdif_regs *regs = (struct mxs_lcdif_regs *)MXS_LCDIF_BASE ; +int timeout =1000000 ; + +writel (panel.frameAdrs, ®s->hw_lcdif_cur_buf_reg); +writel (panel.frameAdrs, ®s->hw_lcdif_next_buf_reg); +writel (LCDIF_CTRL1_VSYNC_EDGE_IRQ , ®s->hw_lcdif_ctrl1_clr); +while (--timeout) { +if (readl (®s->hw_lcdif_ctrl1_reg) & +LCDIF_CTRL1_VSYNC_EDGE_IRQ ) +break ; +udelay (1 ); + } +mxs_reset_block ((struct mxs_register_32 *)®s->hw_lcdif_ctrl_reg); +} +void *video_hw_init (void ) {int bpp =-1 ;
Signature · 1 line
1.8.4
PATCH v2 9/14 video: mxsfb: introduce lcdif_power_down
Hi Peng,
Quoted 11 lines · Peng Fan
Introudce a new function
lcdif_power_down.1. Waits for a VSYNC interrupt to guarantee the reset is done at the VSYNC edge, which somehow makes the LCDIF consume the display FIFO(?) and helps the LCDIF work normally at the kernel stage.
2. Add power down function to stop lcdif.The reason to introduce
lcdif_power_downis that we want lcdif to be in initial state when doing uboot reset or before kernel boot to make system stable, otherwise system may hang.
The explanation is independent from the processor type. But checking in the next patch, this code runs only for 6UL. Why not for the 6sx ?
Quoted 44 lines
Signed-off-by Peng Fan <[email protected]>Cc Stefano Babic <[email protected]>Cc Anatolij Gustschin <[email protected]>---
V2:
nonearch/arm/include/asm/imx-common/sys_proto.h | 2 ++ drivers/video/mxsfb.c | 17 +++++++++++++++++ 2 files changed, 19 insertions(+)arch/arm/include/asm/imx-common/sys_proto.h +2
-0@@ -47,6 +47,8 @@ int fecmxc_initialize(bd_t *bis);u32 get_ahb_clk (void );u32 get_periph_clk (void ); +void lcdif_power_down (void ); +int mxs_reset_block (struct mxs_register_32 *reg);int mxs_wait_mask_set (struct mxs_register_32 *reg,u32 mask,u32 timeout);int mxs_wait_mask_clr (struct mxs_register_32 *reg,u32 mask,u32 timeout);drivers/video/mxsfb.c +10
-0@@ -131,6 +131,23 @@ static void mxs_lcd_init(GraphicDevice *panel,writel (LCDIF_CTRL_RUN , ®s->hw_lcdif_ctrl_set); } +void lcdif_power_down (void ) +{ +struct mxs_lcdif_regs *regs = (struct mxs_lcdif_regs *)MXS_LCDIF_BASE ; +int timeout =1000000 ; + +writel (panel.frameAdrs, ®s->hw_lcdif_cur_buf_reg); +writel (panel.frameAdrs, ®s->hw_lcdif_next_buf_reg); +writel (LCDIF_CTRL1_VSYNC_EDGE_IRQ , ®s->hw_lcdif_ctrl1_clr); +while (--timeout) { + if (readl(®s->hw_lcdif_ctrl1_reg) &
drivers/video/mxsfb.c static void mxs_lcd_init(GraphicDevice *panel, · line 153
Quoted 10 lines
drivers/video/mxsfb.c +7
-0+ LCDIF_CTRL1_VSYNC_EDGE_IRQ) +break ; +udelay (1 ); + } +mxs_reset_block ((struct mxs_register_32 *)®s->hw_lcdif_ctrl_reg); +} +void *video_hw_init (void ) {int bpp =-1 ;
Best regards,
Stefano Babic
Signature · 5 lines
===================================================================== DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de =====================================================================
PATCH v2 9/14 video: mxsfb: introduce lcdif_power_down
Hi Stefano,
Quoted 10 lines · Stefano Babic
Hi Peng,
Quoted 7 lines · Peng Fan
Introudce a new function
lcdif_power_down.1. Waits for a VSYNC interrupt to guarantee the reset is done at the VSYNC edge, which somehow makes the LCDIF consume the display FIFO(?) and helps the LCDIF work normally at the kernel stage.
2. Add power down function to stop lcdif.
Quoted 7 lines
Quoted 4 lines
The reason to introduce
lcdif_power_downis that we want lcdif to be in initial state when doing uboot reset or before kernel boot to make system stable, otherwise system may hang.The explanation is independent from the processor type. But checking in the next patch, this code runs only for 6UL. Why not for the 6sx ?
We met the issue on i.MX6UL EVK, but did not met issue on i.MX6SX SDB. So I add the check. After a thought, it should be open to CONFIG_VIDEO_MXS.
To those which use LPDDR2 or LPDDR3, if LCDIF is enabled, lcdif_power_down is a must, since there is no reset pin as DDR3. No reset pin will make ddr not stable. Anyway lcdif_power_down do not hurts to those use DDR3.
Will use
#ifdef CONFIG_VIDEO_MXSlcdif_power_down();
#endif
Regards,
Peng.
Quoted 66 lines
Quoted 46 lines
Signed-off-by Peng Fan <[email protected]>Cc Stefano Babic <[email protected]>Cc Anatolij Gustschin <[email protected]>---
V2:
nonearch/arm/include/asm/imx-common/sys_proto.h | 2 ++ drivers/video/mxsfb.c | 17 +++++++++++++++++ 2 files changed, 19 insertions(+)arch/arm/include/asm/imx-common/sys_proto.h +2
-0@@ -47,6 +47,8 @@ int fecmxc_initialize(bd_t *bis);u32 get_ahb_clk (void );u32 get_periph_clk (void ); +void lcdif_power_down (void ); +int mxs_reset_block (struct mxs_register_32 *reg);int mxs_wait_mask_set (struct mxs_register_32 *reg,u32 mask,u32 timeout);int mxs_wait_mask_clr (struct mxs_register_32 *reg,u32 mask,u32 timeout);drivers/video/mxsfb.c +10
-0@@ -131,6 +131,23 @@ static void mxs_lcd_init(GraphicDevice *panel,writel (LCDIF_CTRL_RUN , ®s->hw_lcdif_ctrl_set); } +void lcdif_power_down (void ) +{ +struct mxs_lcdif_regs *regs = (struct mxs_lcdif_regs *)MXS_LCDIF_BASE ; +int timeout =1000000 ; + +writel (panel.frameAdrs, ®s->hw_lcdif_cur_buf_reg); +writel (panel.frameAdrs, ®s->hw_lcdif_next_buf_reg); +writel (LCDIF_CTRL1_VSYNC_EDGE_IRQ , ®s->hw_lcdif_ctrl1_clr); +while (--timeout) { + if (readl(®s->hw_lcdif_ctrl1_reg) &drivers/video/mxsfb.c static void mxs_lcd_init(GraphicDevice *panel, · line 153
Quoted 10 lines
drivers/video/mxsfb.c +7
-0+ LCDIF_CTRL1_VSYNC_EDGE_IRQ) +break ; +udelay (1 ); + } +mxs_reset_block ((struct mxs_register_32 *)®s->hw_lcdif_ctrl_reg); +} +void *video_hw_init (void ) {int bpp =-1 ;Best regards,
Stefano BabicSignature · 5 lines
===================================================================== DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de =====================================================================
PATCH v2 10/14 imx: mx6: implement reset_misc
In reply to Peng FanWe need to power down lcdif before uboot reset to make reset can pass stress test. Or system may hang.
---
V2:
none
arch/arm/cpu/armv7/mx6/soc.c | 8 ++++++++ 1 file changed, 8 insertions(+)
arch/arm/cpu/armv7/mx6/soc.c +8 -0
@@ -392,6 +392,14 @@ const struct boot_mode soc_boot_modes[] = { {NULL, 0}, }; +void reset_misc (void ) +{ +#ifdef CONFIG_VIDEO_MXS +if (is_cpu_type (MXC_CPU_MX6UL )) +lcdif_power_down (); +#endif +} +void s_init (void ) {struct anatop_regs *anatop = (struct anatop_regs *)ANATOP_BASE_ADDR ;
Signature · 1 line
1.8.4
PATCH v2 11/14 imx: imx-common: power down lcdif before boot os
In reply to Peng FanNeed to call lcdif_power_down to make lcdif in initial state before kernel boot. Similar issue for uboot reset with lcdif enabled, system will hang after serveral times resetting. Need to let lcdif initial state to make all go well.
---
V2:
none
arch/arm/imx-common/cpu.c | 3 +++ 1 file changed, 3 insertions(+)
arch/arm/imx-common/cpu.c +3 -0
@@ -279,6 +279,9 @@ void arch_preboot_os(void)/* disable video before launching O/S */ ipuv3_fb_shutdown ();#endif +#if defined(CONFIG_VIDEO_MXS ) +lcdif_power_down (); +#endif }void set_chipselect_size (int const cs_size)
Signature · 1 line
1.8.4
PATCH v2 12/14 imx: mx7: compile misc.c for mx7
In reply to Peng FanCompile misc.c for mx7, since we need related function for lcdif and nand.
---
V2:
new patch
arch/arm/imx-common/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm/imx-common/Makefile +1 -1
@@ -14,7 +14,7 @@ ifeq ($(SOC),$(filter $(SOC),mx5 mx6)) obj-y += timer.o cpu.o speed.o obj-$(CONFIG_SYS_I2C_MXC) += i2c-mxv7.o endif -ifeq ($(SOC),$(filter $(SOC),mx6 mxs)) +ifeq ($(SOC),$(filter $(SOC),mx7 mx6 mxs)) obj-y += misc.o obj-$(CONFIG_SPL_BUILD) += spl.o endif
Signature · 1 line
1.8.4
PATCH v2 13/14 imx: mx7 use the common lcdif register structure
In reply to Peng FanUse the common lcdif register struct, but not define another same register.
Introduce i.MX7 in lcdif register structure.
---
V2:
new patch
arch/arm/include/asm/arch-mx7/imx-regs.h | 96 +--------------------------- arch/arm/include/asm/imx-common/regs-lcdif.h | 8 ++- 2 files changed, 6 insertions(+), 98 deletions(-)
arch/arm/include/asm/arch-mx7/imx-regs.h +1 -95
@@ -217,6 +217,7 @@#define SNVS_LPGPR 0x68#if !(defined(__KERNEL_STRICT_NAMES) || defined(__ASSEMBLY__)) +#include <asm/imx-common/regs-lcdif.h> #include <asm/types.h> extern void imx_get_mac_from_fuse (int dev_id,unsigned char *mac);
@@ -1029,101 +1030,6 @@ struct rdc_sema_regs {u16 rstgt;/* Reset Gate */ }; -/* eLCDIF controller registers */ -struct mxs_lcdif_regs { -u32 hw_lcdif_ctrl;/* 0x00 */ -u32 hw_lcdif_ctrl_set; -u32 hw_lcdif_ctrl_clr; -u32 hw_lcdif_ctrl_tog; -u32 hw_lcdif_ctrl1;/* 0x10 */ -u32 hw_lcdif_ctrl1_set; -u32 hw_lcdif_ctrl1_clr; -u32 hw_lcdif_ctrl1_tog; -u32 hw_lcdif_ctrl2;/* 0x20 */ -u32 hw_lcdif_ctrl2_set; -u32 hw_lcdif_ctrl2_clr; -u32 hw_lcdif_ctrl2_tog; -u32 hw_lcdif_transfer_count;/* 0x30 */ -u32 reserved1[3 ]; -u32 hw_lcdif_cur_buf;/* 0x40 */ -u32 reserved2[3 ]; -u32 hw_lcdif_next_buf;/* 0x50 */ -u32 reserved3[3 ]; -u32 hw_lcdif_timing;/* 0x60 */ -u32 reserved4[3 ]; -u32 hw_lcdif_vdctrl0;/* 0x70 */ -u32 hw_lcdif_vdctrl0_set; -u32 hw_lcdif_vdctrl0_clr; -u32 hw_lcdif_vdctrl0_tog; -u32 hw_lcdif_vdctrl1;/* 0x80 */ -u32 reserved5[3 ]; -u32 hw_lcdif_vdctrl2;/* 0x90 */ -u32 reserved6[3 ]; -u32 hw_lcdif_vdctrl3;/* 0xa0 */ -u32 reserved7[3 ]; -u32 hw_lcdif_vdctrl4;/* 0xb0 */ -u32 reserved8[3 ]; -u32 hw_lcdif_dvictrl0;/* 0xc0 */ -u32 reserved9[3 ]; -u32 hw_lcdif_dvictrl1;/* 0xd0 */ -u32 reserved10[3 ]; -u32 hw_lcdif_dvictrl2;/* 0xe0 */ -u32 reserved11[3 ]; -u32 hw_lcdif_dvictrl3;/* 0xf0 */ -u32 reserved12[3 ]; -u32 hw_lcdif_dvictrl4;/* 0x100 */ -u32 reserved13[3 ]; -u32 hw_lcdif_csc_coeffctrl0;/* 0x110 */ -u32 reserved14[3 ]; -u32 hw_lcdif_csc_coeffctrl1;/* 0x120 */ -u32 reserved15[3 ]; -u32 hw_lcdif_csc_coeffctrl2;/* 0x130 */ -u32 reserved16[3 ]; -u32 hw_lcdif_csc_coeffctrl3;/* 0x140 */ -u32 reserved17[3 ]; -u32 hw_lcdif_csc_coeffctrl4;/* 0x150 */ -u32 reserved18[3 ]; -u32 hw_lcdif_csc_offset;/* 0x160 */ -u32 reserved19[3 ]; -u32 hw_lcdif_csc_limit;/* 0x170 */ -u32 reserved20[3 ]; -u32 hw_lcdif_data;/* 0x180 */ -u32 reserved21[3 ]; -u32 hw_lcdif_bm_error_stat;/* 0x190 */ -u32 reserved22[3 ]; -u32 hw_lcdif_crc_stat;/* 0x1a0 */ -u32 reserved23[3 ]; -u32 hw_lcdif_lcdif_stat;/* 0x1b0 */ -u32 reserved24[3 ]; -u32 hw_lcdif_version;/* 0x1c0 */ -u32 reserved25[3 ]; -u32 hw_lcdif_debug0;/* 0x1d0 */ -u32 reserved26[3 ]; -u32 hw_lcdif_debug1;/* 0x1e0 */ -u32 reserved27[3 ]; -u32 hw_lcdif_debug2;/* 0x1f0 */ -u32 reserved28[3 ]; -u32 hw_lcdif_thres;/* 0x200 */ -u32 reserved29[3 ]; -u32 hw_lcdif_as_ctrl;/* 0x210 */ -u32 reserved30[3 ]; -u32 hw_lcdif_as_buf;/* 0x220 */ -u32 reserved31[3 ]; -u32 hw_lcdif_as_next_buf;/* 0x230 */ -u32 reserved32[3 ]; -u32 hw_lcdif_as_clrkeylow;/* 0x240 */ -u32 reserved33[3 ]; -u32 hw_lcdif_as_clrkeyhigh;/* 0x250 */ -u32 reserved34[3 ]; -u32 hw_lcdif_as_sync_delay;/* 0x260 */ -u32 reserved35[3 ]; -u32 hw_lcdif_as_debug3;/* 0x270 */ -u32 reserved36[3 ]; -u32 hw_lcdif_as_debug4;/* 0x280 */ -u32 reserved37[3 ]; -u32 hw_lcdif_as_debug5;/* 0x290 */ -}; -#define MXS_LCDIF_BASE ELCDIF1_IPS_BASE_ADDR#define LCDIF_CTRL_SFTRST (1 << 31)
arch/arm/include/asm/imx-common/regs-lcdif.h +5 -3
@@ -14,7 +14,8 @@struct mxs_lcdif_regs {mxs_reg_32 (hw_lcdif_ctrl) mxs_reg_32(hw_lcdif_ctrl1) -#if defined(CONFIG_MX28 ) || defined(CONFIG_MX6SX ) || defined(CONFIG_MX6UL ) +#if defined(CONFIG_MX28 ) || defined(CONFIG_MX6SX ) || defined(CONFIG_MX6UL ) || \ + defined(CONFIG_MX7 ) mxs_reg_32(hw_lcdif_ctrl2)#endif mxs_reg_32 (hw_lcdif_transfer_count)
@@ -46,7 +47,8 @@ struct mxs_lcdif_regs {#endif mxs_reg_32(hw_lcdif_data) mxs_reg_32(hw_lcdif_bm_error_stat) -#if defined(CONFIG_MX28 ) || defined(CONFIG_MX6SX ) || defined(CONFIG_MX6UL ) +#if defined(CONFIG_MX28 ) || defined(CONFIG_MX6SX ) || defined(CONFIG_MX6UL ) || \ + defined(CONFIG_MX7 ) mxs_reg_32(hw_lcdif_crc_stat)#endif mxs_reg_32 (hw_lcdif_lcdif_stat)
@@ -54,7 +56,7 @@ struct mxs_lcdif_regs { mxs_reg_32(hw_lcdif_debug0) mxs_reg_32(hw_lcdif_debug1) mxs_reg_32(hw_lcdif_debug2) -#if defined(CONFIG_MX6SX ) || defined(CONFIG_MX6UL ) +#if defined(CONFIG_MX6SX ) || defined(CONFIG_MX6UL ) || defined(CONFIG_MX7 ) mxs_reg_32(hw_lcdif_thres) mxs_reg_32(hw_lcdif_as_ctrl) mxs_reg_32(hw_lcdif_as_buf)
Signature · 1 line
1.8.4
PATCH v2 14/14 imx: mx7dsabresd: support lcdif
In reply to Peng FanSupport LCDIF for mx7dsabresd board:
1. Add pinmux settings
2. Add VIDEO related macro definition and videomode env settings.
---
V2:
new patch
board/freescale/mx7dsabresd/mx7dsabresd.c | 64 +++++++++++++++++++++++++++++++ include/configs/mx7dsabresd.h | 17 ++++++++ 2 files changed, 81 insertions(+)
board/freescale/mx7dsabresd/mx7dsabresd.c +64 -0
@@ -41,6 +41,9 @@ DECLARE_GLOBAL_DATA_PTR;#define I2C_PAD_CTRL (PAD_CTL_DSE_3P3V_32OHM | PAD_CTL_SRE_SLOW | \ PAD_CTL_HYS | PAD_CTL_PUE | PAD_CTL_PUS_PU100KOHM) +#define LCD_PAD_CTRL (PAD_CTL_HYS | PAD_CTL_PUS_PU100KOHM | \ + PAD_CTL_DSE_3P3V_49OHM) +#ifdef CONFIG_SYS_I2C_MXC #define PC MUX_PAD_CTRL(I2C_PAD_CTRL)/* I2C1 for PMIC */
@@ -190,6 +193,63 @@ static void iox74lv_init(void)gpio_direction_output (IOX_STCP ,1 ); }; +#ifdef CONFIG_VIDEO_MXS +static iomux_v3_cfg_t const lcd_pads[] = { +MX7D_PAD_LCD_CLK__LCD_CLK |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX7D_PAD_LCD_ENABLE__LCD_ENABLE |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX7D_PAD_LCD_HSYNC__LCD_HSYNC |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX7D_PAD_LCD_VSYNC__LCD_VSYNC |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX7D_PAD_LCD_DATA00__LCD_DATA0 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX7D_PAD_LCD_DATA01__LCD_DATA1 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX7D_PAD_LCD_DATA02__LCD_DATA2 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX7D_PAD_LCD_DATA03__LCD_DATA3 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX7D_PAD_LCD_DATA04__LCD_DATA4 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX7D_PAD_LCD_DATA05__LCD_DATA5 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX7D_PAD_LCD_DATA06__LCD_DATA6 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX7D_PAD_LCD_DATA07__LCD_DATA7 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX7D_PAD_LCD_DATA08__LCD_DATA8 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX7D_PAD_LCD_DATA09__LCD_DATA9 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX7D_PAD_LCD_DATA10__LCD_DATA10 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX7D_PAD_LCD_DATA11__LCD_DATA11 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX7D_PAD_LCD_DATA12__LCD_DATA12 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX7D_PAD_LCD_DATA13__LCD_DATA13 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX7D_PAD_LCD_DATA14__LCD_DATA14 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX7D_PAD_LCD_DATA15__LCD_DATA15 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX7D_PAD_LCD_DATA16__LCD_DATA16 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX7D_PAD_LCD_DATA17__LCD_DATA17 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX7D_PAD_LCD_DATA18__LCD_DATA18 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX7D_PAD_LCD_DATA19__LCD_DATA19 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX7D_PAD_LCD_DATA20__LCD_DATA20 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX7D_PAD_LCD_DATA21__LCD_DATA21 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX7D_PAD_LCD_DATA22__LCD_DATA22 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +MX7D_PAD_LCD_DATA23__LCD_DATA23 |MUX_PAD_CTRL (LCD_PAD_CTRL ), + +MX7D_PAD_LCD_RESET__GPIO3_IO4 |MUX_PAD_CTRL (LCD_PAD_CTRL ), +}; + +static iomux_v3_cfg_t const pwm_pads[] = { +/* Use GPIO for Brightness adjustment, duty cycle = period */ +MX7D_PAD_GPIO1_IO01__GPIO1_IO1 |MUX_PAD_CTRL (NO_PAD_CTRL ), +}; + +static int setup_lcd (void ) +{ +imx_iomux_v3_setup_multiple_pads (lcd_pads,ARRAY_SIZE (lcd_pads)); + +imx_iomux_v3_setup_multiple_pads (pwm_pads,ARRAY_SIZE (pwm_pads)); + +/* Reset LCD */ +gpio_direction_output (IMX_GPIO_NR (3 ,4 ) ,0 ); +udelay (500 ); +gpio_direction_output (IMX_GPIO_NR (3 ,4 ) ,1 ); + +/* Set Brightness to high */ +gpio_direction_output (IMX_GPIO_NR (1 ,1 ) ,1 ); + +return 0 ; +} +#endif +#ifdef CONFIG_FEC_MXC static iomux_v3_cfg_t const fec1_pads[] = { MX7D_PAD_ENET1_RGMII_RX_CTL__ENET1_RGMII_RX_CTL | MUX_PAD_CTRL(ENET_RX_PAD_CTRL),
@@ -417,6 +477,10 @@ int board_init(void)setup_fec ();#endif +#ifdef CONFIG_VIDEO_MXS +setup_lcd (); +#endif +return 0 ; }
include/configs/mx7dsabresd.h +17 -0
@@ -76,6 +76,7 @@"fdt_addr=0x83000000\0" \"boot_fdt=try\0" \"ip_dyn=yes\0" \ +"videomode=video=ctfb:x:480,y:272,depth:24,pclk:108695,le:8,ri:4,up:2,lo:4,hs:41,vs:10,sync:0,vmode:0\0" \ "mmcdev="__stringify(CONFIG_SYS_MMC_ENV_DEV)"\0" \ "mmcpart=" __stringify(CONFIG_SYS_MMC_IMG_LOAD_PART) "\0" \"mmcroot=" CONFIG_MMCROOT " rootwait rw\0" \
@@ -188,4 +189,20 @@#define CONFIG_IMX_THERMAL +#define CONFIG_VIDEO +#ifdef CONFIG_VIDEO +#define CONFIG_CFB_CONSOLE +#define CONFIG_VIDEO_MXS +#define CONFIG_VIDEO_LOGO +#define CONFIG_VIDEO_SW_CURSOR +#define CONFIG_VGA_AS_SINGLE_DEVICE +#define CONFIG_SYS_CONSOLE_IS_IN_ENV +#define CONFIG_SPLASH_SCREEN +#define CONFIG_SPLASH_SCREEN_ALIGN +#define CONFIG_CMD_BMP +#define CONFIG_BMP_16BPP +#define CONFIG_VIDEO_BMP_RLE8 +#define CONFIG_VIDEO_BMP_LOGO +#endif +#endif /* __CONFIG_H */
Signature · 1 line
1.8.4