IMX6dl show uboot logo to kernel splash screen when change logo to android.

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

IMX6dl show uboot logo to kernel splash screen when change logo to android.

Jump to solution
9,976 Views
尚飞汤
Contributor IV

can anyone tell me how to slove??? i have do the patch of freescale.

Labels (1)
0 Kudos
1 Solution
4,696 Views
尚飞汤
Contributor IV

嗨,li,现在的现象看来应该不是我打得patch问题,是否有其他模块干扰到display部分的可能呢?

View solution in original post

43 Replies
1,739 Views
qiang_li-mpu_se
NXP Employee
NXP Employee

没有

0 Kudos
1,739 Views
尚飞汤
Contributor IV

Dear Li:

经过几天的验证,我发现我们的ipu warning导致闪屏的根本原因是以太网那边的FHY IC

进行MDIO操作引起的。拿去FAY IC的MDIO操作就能清除IPU WARNING的出现,从根本上解掉这个问题,

对此研究了一下贵司的ipu架构,但是并未发现二者有什么联系,特此请教一下,为何MDIO的操作会导致

Display的ipu传输出问题呢?

1,739 Views
qiang_li-mpu_se
NXP Employee
NXP Employee

如果不打“show uboot logo to kernel splash screen patch”, 你是否有遇到这个问题?从开发板来看,并不存在这个问题,估计还是你打的patch有问题。

0 Kudos
1,737 Views
尚飞汤
Contributor IV

Dear Li:

对于你说的patch,我这边后来有进行修正,按照你的patch打进去,然后针对我们的项目做了一些改动,最终可以实现正常显示,但是还是会有ipu_warning存在。后来将display的驱动前移才发现ipu_warning保持原位置不动,但是如果前移MDIO时候,ipu_warning也会前移。我想这个足以说明和patch是一点关系没有的,对此还望您可以抛开pacth看待这个问题。

1,737 Views
qiang_li-mpu_se
NXP Employee
NXP Employee

你们MDIO的操作代码是怎么样的?如果它改到了IPU的clock,是可以导致ipu_warning的。

1,753 Views
尚飞汤
Contributor IV

dear Qiang li,this is my change list ,please have a check,which is so urgency for me.

aaron@bp153:~/work_place/imx6jb2/_oem_scripts$ git diff ../kernel_imx/arch/arm/configs/imx6_android_pat215_defconfig

../kernel_imx/arch/arm/mach-mx6/Kconfig

../kernel_imx/arch/arm/mach-mx6/clock.c

../kernel_imx/arch/arm/plat-mxc/include/mach/ipu-v3.h

../kernel_imx/drivers/mxc/ipu3/ipu_common.c

../kernel_imx/drivers/mxc/ipu3/ipu_disp.c

../kernel_imx/drivers/video/fbmem.c

../kernel_imx/drivers/video/mxc/mxc_dispdrv.h

../kernel_imx/drivers/video/mxc/mxc_ipuv3_fb.c

diff --git a/kernel_imx/arch/arm/configs/imx6_android_pat215_defconfig b/kernel_

index 90fe5d2..bfc0e35 100644

--- a/kernel_imx/arch/arm/configs/imx6_android_pat215_defconfig

+++ b/kernel_imx/arch/arm/configs/imx6_android_pat215_defconfig

@@ -345,6 +345,11 @@ CONFIG_USB_EHCI_ARC_H1=y

CONFIG_USB_FSL_ARC_OTG=y

# CONFIG_MX6_INTER_LDO_BYPASS is not set

CONFIG_MX6_CLK_FOR_BOOTUI_TRANS=y

+#Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel

+# CONFIG_MX6_CLK_FOR_BOOTUI_TRANS_LCD_IPU1_DI0 is not set

+CONFIG_MX6_CLK_FOR_BOOTUI_TRANS_LVDS_IPU1_DI1=y

+# CONFIG_MX6_CLK_FOR_BOOTUI_TRANS_HDMI_IPU2_DI0 is not set

+#Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel

CONFIG_ISP1504_MXC=y

# CONFIG_MXC_IRQ_PRIOR is not set

CONFIG_MXC_PWM=y

diff --git a/kernel_imx/arch/arm/mach-mx6/Kconfig b/kernel_imx/arch/arm/mach-mx6

index 0fafbe4..3e48a1a 100755

--- a/kernel_imx/arch/arm/mach-mx6/Kconfig

+++ b/kernel_imx/arch/arm/mach-mx6/Kconfig

@@ -338,7 +338,7 @@ config USB_EHCI_ARC_H1

config USB_FSL_ARC_OTG

        tristate "FSL USB OTG support"

-

+#

config MX6_INTER_LDO_BYPASS

        bool "Internal LDO in MX6Q/DL bypass"

        depends on  REGULATOR_PFUZE100 && CPU_FREQ_IMX && ARCH_MX6

@@ -347,16 +347,40 @@ config MX6_INTER_LDO_BYPASS

         This is choosed for bypass internal LDO in MX6. If choose it, internal

         LDO will replaced by external pmic regulator(e.g. pfuze100), VDDCORE

         can be adjust automatically adjust by cpu frequency.

-

+#Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel

config MX6_CLK_FOR_BOOTUI_TRANS

        bool "MX6 clk setting for smooth UI transtion from bootloader to kernel"

        depends on MXC_IPU_V3H

-       default n

+       default y

        help

         This is choosed to keep enable IPU related clocks and PWM clocks and

         avoid setting IPU related clocks' parents when initializing clock tree

         so that bootloader splashimage can transition to kernel smoothly.

+choice

+       prompt "Select Display Interface"

+

+config MX6_CLK_FOR_BOOTUI_TRANS_LCD_IPU1_DI0

+       bool "Smooth UI transtion on LCD, IPU1, DI0."

+       depends on MX6_CLK_FOR_BOOTUI_TRANS

+       help

+        This is choosed to keep enable IPU related setting on LCD panel which

+        is connected on IPU1 DI0 port..

+

+config MX6_CLK_FOR_BOOTUI_TRANS_LVDS_IPU1_DI1

+       bool "Smooth UI transtion on LVDS, IPU1, DI1."

+       depends on MX6_CLK_FOR_BOOTUI_TRANS

+       help

+        This is choosed to keep enable IPU related setting on LVDS panel which

+        is connected on IPU1 DI1 port..

+config MX6_CLK_FOR_BOOTUI_TRANS_HDMI_IPU2_DI0

+       bool "Smooth UI transtion on HDMI, IPU2, DI0."

+       depends on MX6_CLK_FOR_BOOTUI_TRANS

+       help

+        This is choosed to keep enable IPU related setting on HDMI panel which

+        is connected on IPU2 DI0 port..

+endchoice

+#Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel

config MACH_IMX_BLUETOOTH_RFKILL

        tristate "i.MX Bluetooth rfkill interface support"

        depends on RFKILL

diff --git a/kernel_imx/arch/arm/mach-mx6/clock.c b/kernel_imx/arch/arm/mach-mx6

index 574b142..c29d714 100644

--- a/kernel_imx/arch/arm/mach-mx6/clock.c

+++ b/kernel_imx/arch/arm/mach-mx6/clock.c

@@ -5429,13 +5429,14 @@ int __init mx6_clocks_init(unsigned long ckil, unsigned

                 * to support splashimage so we should not disable the

                 * clock to keep the display running.

                 */

+

                pll3_pfd_540M.disable(&pll3_pfd_540M);

                pll3_usb_otg_main_clk.disable(&pll3_usb_otg_main_clk);

#endif

        }

#endif

        pll4_audio_main_clk.disable(&pll4_audio_main_clk);

-       pll5_video_main_clk.disable(&pll5_video_main_clk);

+       //pll5_video_main_clk.disable(&pll5_video_main_clk);

        pll6_mlb150_main_clk.disable(&pll6_mlb150_main_clk);

        pll7_usb_host_main_clk.disable(&pll7_usb_host_main_clk);

        pll8_enet_main_clk.disable(&pll8_enet_main_clk);

@@ -5445,18 +5446,21 @@ int __init mx6_clocks_init(unsigned long ckil, unsigned

        /* Initialize Audio and Video PLLs to valid frequency. */

        clk_set_rate(&pll4_audio_main_clk, 176000000);

-       clk_set_rate(&pll5_video_main_clk, 650000000);

-

+       clk_set_rate(&pll5_video_main_clk, 650000000);

+

        /*

         * We don't set ipu1_di_clk[1]'s parent clock to

         * pll5_video_main_clk as bootloader may need

         * the parent to be ldb_di1_clk to support LVDS

         * panel splashimage.

         */

-       clk_set_parent(&ipu1_di_clk[0], &pll5_video_main_clk);

+/*Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel{*/

+//     clk_set_parent(&ipu1_di_clk[0], &pll5_video_main_clk);

#ifndef CONFIG_MX6_CLK_FOR_BOOTUI_TRANS

-       clk_set_parent(&ipu1_di_clk[1], &pll5_video_main_clk);

+       clk_set_parent(&ipu1_di_clk[0], &pll5_video_main_clk);

#endif

+       clk_set_parent(&ipu1_di_clk[1], &pll5_video_main_clk);

+/*Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel}*/

        clk_set_parent(&ipu2_di_clk[0], &pll5_video_main_clk);

        clk_set_parent(&ipu2_di_clk[1], &pll5_video_main_clk);

@@ -5559,8 +5563,12 @@ int __init mx6_clocks_init(unsigned long ckil, unsigned l

                      * default, so we need to enable the clocks to

                      * keep the display running.

                      */

-                    3 << MXC_CCM_CCGRx_CG7_OFFSET |    /* ldb_di1_clk */

-                    3 << MXC_CCM_CCGRx_CG2_OFFSET |    /* ipu1_di1_clk */

+/*Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel{*/

+                 //   3 << MXC_CCM_CCGRx_CG7_OFFSET |  /* ldb_di1_clk */

+                    3 << MXC_CCM_CCGRx_CG6_OFFSET |    /* ldb_di0_clk */

+                 //   3 << MXC_CCM_CCGRx_CG2_OFFSET |  /* ipu1_di1_clk */

+/*Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel}*/

+                    3 << MXC_CCM_CCGRx_CG1_OFFSET |    /* ipu1_di0_clk */

                     3 << MXC_CCM_CCGRx_CG0_OFFSET |    /* ipu1_clk */

#endif

                     3 << MXC_CCM_CCGRx_CG10_OFFSET, MXC_CCM_CCGR3);

@@ -5572,8 +5580,14 @@ int __init mx6_clocks_init(unsigned long ckil, unsigned l

                         * so we need to enable the clock to keep the

                         * backlight on.

                         */

+/*Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel{*/

+               #if 0

                        (machine_is_mx6q_sabresd() ?

                        (3 << MXC_CCM_CCGRx_CG8_OFFSET) : 0) | /* pwm1_clk */

+               #else

+                       3 << MXC_CCM_CCGRx_CG10_OFFSET | /* pwm3_clk */

+               #endif

+/*Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel{*/

#endif

                        1 << MXC_CCM_CCGRx_CG6_OFFSET |

                        1 << MXC_CCM_CCGRx_CG4_OFFSET, MXC_CCM_CCGR4);

diff --git a/kernel_imx/arch/arm/plat-mxc/include/mach/ipu-v3.h b/kernel_imx/arc

index f4f7a06..3d1316e 100755

--- a/kernel_imx/arch/arm/plat-mxc/include/mach/ipu-v3.h

+++ b/kernel_imx/arch/arm/plat-mxc/include/mach/ipu-v3.h

@@ -763,5 +763,28 @@ struct imx_ipuv3_platform_data {

         */

        bool bypass_reset;

};

-

+/*Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel{*/

+#ifdef CONFIG_MX6_CLK_FOR_BOOTUI_TRANS

+void ipu_disable_irq_late_init(struct ipu_soc *ipu, uint32_t irq);

+void ipu_clear_irq_late_init(struct ipu_soc *ipu, uint32_t irq);

+int ipu_request_irq_late_init(struct ipu_soc *ipu, uint32_t irq,

+                               irqreturn_t(*handler) (int, void *),

+                               uint32_t irq_flags, const char *devname, void *d

+int32_t ipu_disp_get_window_pos_late_init(struct ipu_soc *ipu, ipu_channel_t ch

+                               int16_t *y_pos);

+int32_t ipu_disp_set_global_alpha_late_init(struct ipu_soc *ipu, ipu_channel_t

+                                 uint8_t alpha);

+int32_t ipu_disp_set_color_key_late_init(struct ipu_soc *ipu, ipu_channel_t cha

+                              uint32_t colorKey);

+int32_t ipu_init_channel_late_init(struct ipu_soc *ipu, ipu_channel_t channel,

+int32_t ipu_init_channel_buffer_late_init(struct ipu_soc *ipu, ipu_channel_t ch

+                               uint32_t pixel_fmt,

+                               uint16_t width, uint16_t height,

+                               uint32_t stride,

+                               ipu_rotate_mode_t rot_mode,

+                               dma_addr_t phyaddr_0, dma_addr_t phyaddr_1,

+                               dma_addr_t phyaddr_2,

+                               uint32_t u_offset, uint32_t v_offset);

+#endif

+/*Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel}*/

#endif /* __MACH_IPU_V3_H_ */

diff --git a/kernel_imx/drivers/mxc/ipu3/ipu_common.c b/kernel_imx/drivers/mxc/i

index 563d532..f953975 100644

--- a/kernel_imx/drivers/mxc/ipu3/ipu_common.c

+++ b/kernel_imx/drivers/mxc/ipu3/ipu_common.c

@@ -174,8 +174,15 @@ static int __devinit ipu_clk_setup_enable(struct ipu_soc *i

         * clock to damage the channel setup by

         * bootloader.

         */

+/*Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel{*/

+#ifdef CONFIG_MX6_CLK_FOR_BOOTUI_TRANS

+       if (!plat_data->bypass_reset) {

+#endif

        clk_enable(ipu->ipu_clk);

-

+#ifdef CONFIG_MX6_CLK_FOR_BOOTUI_TRANS

+       }

+#endif

+/*Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel}*/

        ipu->pixel_clk[0].parent = ipu->ipu_clk;

        ipu->pixel_clk[1].parent = ipu->ipu_clk;

@@ -249,11 +256,16 @@ static int __devinit ipu_probe(struct platform_device *pde

        g_ipu_hw_rev = plat_data->rev;

        ipu->dev = &pdev->dev;

-

-       if (!plat_data->bypass_reset)

-               if (plat_data->init)

-                       plat_data->init(pdev->id);

-

+/*Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel{*/

+#ifdef CONFIG_MX6_CLK_FOR_BOOTUI_TRANS

+       if (!plat_data->bypass_reset) {

+#endif

+       if (plat_data->init)

+               plat_data->init(pdev->id);

+#ifdef CONFIG_MX6_CLK_FOR_BOOTUI_TRANS

+       }

+#endif

+/*Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel}*/

        ipu->irq_err = platform_get_irq(pdev, 0);

        ipu->irq_sync = platform_get_irq(pdev, 1);

        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);

@@ -275,7 +287,6 @@ static int __devinit ipu_probe(struct platform_device *pdev)

                dev_err(ipu->dev, "request ERR interrupt failed\n");

                goto failed_req_irq_err;

        }

-

        ipu_base = res->start;

        /* base fixup */

        if (g_ipu_hw_rev == 4)  /* IPUv3H */

@@ -337,8 +348,11 @@ static int __devinit ipu_probe(struct platform_device *pdev

        }

        platform_set_drvdata(pdev, ipu);

-

+/*Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel{*/

+#ifdef CONFIG_MX6_CLK_FOR_BOOTUI_TRANS

        if (!plat_data->bypass_reset) {

+#endif

+/*Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel{*/

                ipu_reset(ipu);

                ipu_disp_init(ipu);

@@ -346,8 +360,14 @@ static int __devinit ipu_probe(struct platform_device *pdev

                /* Set MCU_T to divide MCU access window into 2 */

                ipu_cm_write(ipu, 0x00400000L | (IPU_MCU_T_DEFAULT << 18),

                             IPU_DISP_GEN);

+/*Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel{*/

+#ifdef CONFIG_MX6_CLK_FOR_BOOTUI_TRANS

+       } else {

+               ipu->fg_csc_type = ipu->bg_csc_type = CSC_NONE;

+               ipu->color_key_4rgb = true;

        }

-

+#endif

+/*Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel{*/

        /* Set sync refresh channels and CSI->mem channel as high priority */

        ipu_idmac_write(ipu, 0x18800001L, IDMAC_CHA_PRI(0));

@@ -356,10 +376,15 @@ static int __devinit ipu_probe(struct platform_device *pde

        ipu_cm_write(ipu, 0xFFFFFFFF, IPU_INT_CTRL(6));

        ipu_cm_write(ipu, 0xFFFFFFFF, IPU_INT_CTRL(9));

        ipu_cm_write(ipu, 0xFFFFFFFF, IPU_INT_CTRL(10));

-

-       if (!plat_data->bypass_reset)

-               clk_disable(ipu->ipu_clk);

-

+/*Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel{*/

+#ifdef CONFIG_MX6_CLK_FOR_BOOTUI_TRANS

+       if (!plat_data->bypass_reset) {

+#endif

+       clk_disable(ipu->ipu_clk);

+#ifdef CONFIG_MX6_CLK_FOR_BOOTUI_TRANS

+       }

+#endif

+/*Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel{*/

        register_ipu_device(ipu, pdev->id);

        ipu->online = true;

@@ -1079,7 +1104,7 @@ int32_t ipu_init_channel_buffer(struct ipu_soc *ipu, ipu_c

        uint32_t reg;

        uint32_t dma_chan;

        uint32_t burst_size;

-

+       WARN_ON(1);

        dma_chan = channel_2_dma(channel, type);

        if (!idma_is_valid(dma_chan))

                return -EINVAL;

@@ -2914,3 +2939,383 @@ static void __exit ipu_gen_uninit(void)

}

module_exit(ipu_gen_uninit);

+/*Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel{*/

+#ifdef CONFIG_MX6_CLK_FOR_BOOTUI_TRANS

+int32_t ipu_init_channel_late_init(struct ipu_soc *ipu, ipu_channel_t channel,

+{

+       int ret = 0;

+       uint32_t ipu_conf;

+

+       dev_dbg(ipu->dev, "init channel = %d\n", IPU_CHAN_ID(channel));

+

+       _ipu_get(ipu);

+

+       mutex_lock(&ipu->mutex_lock);

+

+       /* Re-enable error interrupts every time a channel is initialized */

+       ipu_cm_write(ipu, 0xFFFFFFFF, IPU_INT_CTRL(5));

+       ipu_cm_write(ipu, 0xFFFFFFFF, IPU_INT_CTRL(6));

+       ipu_cm_write(ipu, 0xFFFFFFFF, IPU_INT_CTRL(9));

+       ipu_cm_write(ipu, 0xFFFFFFFF, IPU_INT_CTRL(10));

+

+       if (ipu->channel_init_mask & (1L << IPU_CHAN_ID(channel))) {

+               dev_warn(ipu->dev, "Warning: channel already initialized %d\n",

+                       IPU_CHAN_ID(channel));

+       }

+

+       ipu_conf = ipu_cm_read(ipu, IPU_CONF);

+

+       switch (channel) {

+       case MEM_DC_SYNC:

+               if (params->mem_dc_sync.di > 1) {

+                       ret = -EINVAL;

+                       goto err;

+               }

+

+               ipu->dc_di_assignment[1] = params->mem_dc_sync.di;

+//             _ipu_dc_init(ipu, 1, params->mem_dc_sync.di,

+//                          params->mem_dc_sync.interlaced,

+//                          params->mem_dc_sync.out_pixel_fmt);

+               ipu->di_use_count[params->mem_dc_sync.di]++;

+               ipu->dc_use_count++;

+               ipu->dmfc_use_count++;

+               break;

+       case MEM_BG_SYNC:

+               if (params->mem_dp_bg_sync.di > 1) {

+                       ret = -EINVAL;

+                       goto err;

+               }

+

+               if (params->mem_dp_bg_sync.alpha_chan_en)

+                       ipu->thrd_chan_en[IPU_CHAN_ID(channel)] = true;

+

+               ipu->dc_di_assignment[5] = params->mem_dp_bg_sync.di;

+//             _ipu_dp_init(ipu, channel, params->mem_dp_bg_sync.in_pixel_fmt,

+//                              params->mem_dp_bg_sync.out_pixel_fmt);

+//             _ipu_dc_init(ipu, 5, params->mem_dp_bg_sync.di,

+//                              params->mem_dp_bg_sync.interlaced,

+//                              params->mem_dp_bg_sync.out_pixel_fmt);

+               ipu->di_use_count[params->mem_dp_bg_sync.di]++;

+               ipu->dc_use_count++;

+               ipu->dp_use_count++;

+               ipu->dmfc_use_count++;

+               break;

+       case MEM_FG_SYNC:

+               _ipu_dp_init(ipu, channel, params->mem_dp_fg_sync.in_pixel_fmt,

+                            params->mem_dp_fg_sync.out_pixel_fmt);

+

+               if (params->mem_dp_fg_sync.alpha_chan_en)

+                       ipu->thrd_chan_en[IPU_CHAN_ID(channel)] = true;

+

+               ipu->dc_use_count++;

+               ipu->dp_use_count++;

+               ipu->dmfc_use_count++;

+               break;

+       default:

+               dev_err(ipu->dev, "Missing channel initialization\n");

+               break;

+       }

+

+       ipu->channel_init_mask |= 1L << IPU_CHAN_ID(channel);

+

+       ipu_cm_write(ipu, ipu_conf, IPU_CONF);

+

+err:

+       mutex_unlock(&ipu->mutex_lock);

+       return ret;

+}

+EXPORT_SYMBOL(ipu_init_channel_late_init);

+

+int32_t ipu_init_channel_buffer_late_init(struct ipu_soc *ipu, ipu_channel_t ch

+                               ipu_buffer_t type,

+                               uint32_t pixel_fmt,

+                               uint16_t width, uint16_t height,

+                               uint32_t stride,

+                               ipu_rotate_mode_t rot_mode,

+                               dma_addr_t phyaddr_0, dma_addr_t phyaddr_1,

+                               dma_addr_t phyaddr_2,

+                               uint32_t u, uint32_t v)

+{

+       uint32_t reg;

+       uint32_t dma_chan;

+       uint32_t burst_size;

+

+       dma_chan = channel_2_dma(channel, type);

+       if (!idma_is_valid(dma_chan))

+               return -EINVAL;

+       if (stride < width * bytes_per_pixel(pixel_fmt))

+               stride = width * bytes_per_pixel(pixel_fmt);

+

+       if (stride % 4) {

+               dev_err(ipu->dev,

+                       "Stride not 32-bit aligned, stride = %d\n", stride);

+               return -EINVAL;

+       }

+       /* IC & IRT channels' width must be multiple of 8 pixels */

+       if ((_ipu_is_ic_chan(dma_chan) || _ipu_is_irt_chan(dma_chan))

+               && (width % 8)) {

+               dev_err(ipu->dev, "Width must be 8 pixel multiple\n");

+               return -EINVAL;

+       }

+

+       if (_ipu_is_vdi_out_chan(dma_chan) &&

+               ((width < 16) || (height < 16) || (width % 2) || (height % 4)))

+               dev_err(ipu->dev, "vdi width/height limited err\n");

+               return -EINVAL;

+       }

+

+       /* IPUv3EX and IPUv3M support triple buffer */

+       if ((!_ipu_is_trb_chan(dma_chan)) && phyaddr_2) {

+               dev_err(ipu->dev, "Chan%d doesn't support triple buffer "

+                                  "mode\n", dma_chan);

+               return -EINVAL;

+       }

+       if (!phyaddr_1 && phyaddr_2) {

+               dev_err(ipu->dev, "Chan%d's buf1 physical addr is NULL for "

+                                  "triple buffer mode\n", dma_chan);

+               return -EINVAL;

+       }

+

+       mutex_lock(&ipu->mutex_lock);

+

+       /* Build parameter memory data for DMA channel */

+       _ipu_ch_param_init(ipu, dma_chan, pixel_fmt, width, height, stride, u, v

+                          phyaddr_0, phyaddr_1, phyaddr_2);

+

+       /* Set correlative channel parameter of local alpha channel */

+       if ((_ipu_is_ic_graphic_chan(dma_chan) ||

+            _ipu_is_dp_graphic_chan(dma_chan)) &&

+           (ipu->thrd_chan_en[IPU_CHAN_ID(channel)] == true)) {

+               _ipu_ch_param_set_alpha_use_separate_channel(ipu, dma_chan, true

+               _ipu_ch_param_set_alpha_buffer_memory(ipu, dma_chan);

+               _ipu_ch_param_set_alpha_condition_read(ipu, dma_chan);

+               /* fix alpha width as 8 and burst size as 16*/

+               _ipu_ch_params_set_alpha_width(ipu, dma_chan, 8);

+               _ipu_ch_param_set_burst_size(ipu, dma_chan, 16);

+       } else if (_ipu_is_ic_graphic_chan(dma_chan) &&

+                  ipu_pixel_format_has_alpha(pixel_fmt))

+               _ipu_ch_param_set_alpha_use_separate_channel(ipu, dma_chan, fals

+

+       if (rot_mode)

+               _ipu_ch_param_set_rotation(ipu, dma_chan, rot_mode);

+

+       /* IC and ROT channels have restriction of 8 or 16 pix burst length */

+       if (_ipu_is_ic_chan(dma_chan) || _ipu_is_vdi_out_chan(dma_chan)) {

+               if ((width % 16) == 0)

+                       _ipu_ch_param_set_burst_size(ipu, dma_chan, 16);

+               else

+                       _ipu_ch_param_set_burst_size(ipu, dma_chan, 8);

+       } else if (_ipu_is_irt_chan(dma_chan)) {

+               _ipu_ch_param_set_burst_size(ipu, dma_chan, 8);

+               _ipu_ch_param_set_block_mode(ipu, dma_chan);

+       } else if (_ipu_is_dmfc_chan(dma_chan)) {

+               burst_size = _ipu_ch_param_get_burst_size(ipu, dma_chan);

+               //_ipu_dmfc_set_wait4eot(ipu, dma_chan, width);

+               _ipu_dmfc_set_burst_size(ipu, dma_chan, burst_size);

+       }

+

+       if (_ipu_disp_chan_is_interlaced(ipu, channel) ||

+               ipu->chan_is_interlaced[dma_chan])

+               _ipu_ch_param_set_interlaced_scan(ipu, dma_chan);

+

+       if (_ipu_is_ic_chan(dma_chan) || _ipu_is_irt_chan(dma_chan) ||

+               _ipu_is_vdi_out_chan(dma_chan)) {

+               burst_size = _ipu_ch_param_get_burst_size(ipu, dma_chan);

+               _ipu_ic_idma_init(ipu, dma_chan, width, height, burst_size,

+                       rot_mode);

+       } else if (_ipu_is_smfc_chan(dma_chan)) {

+               burst_size = _ipu_ch_param_get_burst_size(ipu, dma_chan);

+               if ((pixel_fmt == IPU_PIX_FMT_GENERIC) &&

+                       ((_ipu_ch_param_get_bpp(ipu, dma_chan) == 5) ||

+                       (_ipu_ch_param_get_bpp(ipu, dma_chan) == 3)))

+                       burst_size = burst_size >> 4;

+               else

+                       burst_size = burst_size >> 2;

+               _ipu_smfc_set_burst_size(ipu, channel, burst_size-1);

+       }

+

+       /* AXI-id */

+       if (idma_is_set(ipu, IDMAC_CHA_PRI, dma_chan)) {

+               unsigned reg = IDMAC_CH_LOCK_EN_1;

+               uint32_t value = 0;

+               if (cpu_is_mx53() || cpu_is_mx6q() || cpu_is_mx6dl()) {

+                       _ipu_ch_param_set_axi_id(ipu, dma_chan, 0);

+                       switch (dma_chan) {

+                       case 5:

+                               value = 0x3;

+                               break;

+                       case 11:

+                               value = 0x3 << 2;

+                               break;

+                       case 12:

+                               value = 0x3 << 4;

+                               break;

+                       case 14:

+                               value = 0x3 << 6;

+                               break;

+                       case 15:

+                               value = 0x3 << 8;

+                               break;

+                       case 20:

+                               value = 0x3 << 10;

+                               break;

+                       case 21:

+                               value = 0x3 << 12;

+                               break;

+                       case 22:

+                               value = 0x3 << 14;

+                               break;

+                       case 23:

+                               value = 0x3 << 16;

+                               break;

+                       case 27:

+                               value = 0x3 << 18;

+                               break;

+                       case 28:

+                               value = 0x3 << 20;

+                               break;

+                       case 45:

+                               reg = IDMAC_CH_LOCK_EN_2;

+                               value = 0x3 << 0;

+                               break;

+                       case 46:

+                               reg = IDMAC_CH_LOCK_EN_2;

+                               value = 0x3 << 2;

+                               break;

+                       case 47:

+                               reg = IDMAC_CH_LOCK_EN_2;

+                               value = 0x3 << 4;

+                               break;

+                       case 48:

+                               reg = IDMAC_CH_LOCK_EN_2;

+                               value = 0x3 << 6;

+                               break;

+                       case 49:

+                               reg = IDMAC_CH_LOCK_EN_2;

+                               value = 0x3 << 8;

+                               break;

+                       case 50:

+                               reg = IDMAC_CH_LOCK_EN_2;

+                               value = 0x3 << 10;

+                               break;

+                       default:

+                               break;

+                       }

+                       value |= ipu_idmac_read(ipu, reg);

+                       ipu_idmac_write(ipu, value, reg);

+               } else

+                       _ipu_ch_param_set_axi_id(ipu, dma_chan, 1);

+       } else {

+               if (cpu_is_mx6q() || cpu_is_mx6dl())

+                       _ipu_ch_param_set_axi_id(ipu, dma_chan, 1);

+       }

+

+       _ipu_ch_param_dump(ipu, dma_chan);

+

+       if (phyaddr_2 && g_ipu_hw_rev >= 2) {

+               reg = ipu_cm_read(ipu, IPU_CHA_DB_MODE_SEL(dma_chan));

+               reg &= ~idma_mask(dma_chan);

+               ipu_cm_write(ipu, reg, IPU_CHA_DB_MODE_SEL(dma_chan));

+

+               reg = ipu_cm_read(ipu, IPU_CHA_TRB_MODE_SEL(dma_chan));

+               reg |= idma_mask(dma_chan);

+               ipu_cm_write(ipu, reg, IPU_CHA_TRB_MODE_SEL(dma_chan));

+

+               /* Set IDMAC third buffer's cpmem number */

+               /* See __ipu_ch_get_third_buf_cpmem_num() for mapping */

+               ipu_idmac_write(ipu, 0x00444047L, IDMAC_SUB_ADDR_4);

+               ipu_idmac_write(ipu, 0x46004241L, IDMAC_SUB_ADDR_3);

+               ipu_idmac_write(ipu, 0x00000045L, IDMAC_SUB_ADDR_1);

+

+               /* Reset to buffer 0 */

+               ipu_cm_write(ipu, tri_cur_buf_mask(dma_chan),

+                               IPU_CHA_TRIPLE_CUR_BUF(dma_chan));

+       } else {

+               reg = ipu_cm_read(ipu, IPU_CHA_TRB_MODE_SEL(dma_chan));

+               reg &= ~idma_mask(dma_chan);

+               ipu_cm_write(ipu, reg, IPU_CHA_TRB_MODE_SEL(dma_chan));

+

+               reg = ipu_cm_read(ipu, IPU_CHA_DB_MODE_SEL(dma_chan));

+               if (phyaddr_1)

+                       reg |= idma_mask(dma_chan);

+               else

+                       reg &= ~idma_mask(dma_chan);

+               ipu_cm_write(ipu, reg, IPU_CHA_DB_MODE_SEL(dma_chan));

+

+               /* Reset to buffer 0 */

+               ipu_cm_write(ipu, idma_mask(dma_chan),

+                               IPU_CHA_CUR_BUF(dma_chan));

+

+       }

+

+       mutex_unlock(&ipu->mutex_lock);

+

+       return 0;

+}

+EXPORT_SYMBOL(ipu_init_channel_buffer_late_init);

+

+void ipu_disable_irq_late_init(struct ipu_soc *ipu, uint32_t irq)

+{

+       uint32_t reg;

+       unsigned long lock_flags;

+

+       spin_lock_irqsave(&ipu->int_reg_spin_lock, lock_flags);

+

+       reg = ipu_cm_read(ipu, IPUIRQ_2_CTRLREG(irq));

+       reg &= ~IPUIRQ_2_MASK(irq);

+       ipu_cm_write(ipu, reg, IPUIRQ_2_CTRLREG(irq));

+

+       spin_unlock_irqrestore(&ipu->int_reg_spin_lock, lock_flags);

+}

+EXPORT_SYMBOL(ipu_disable_irq_late_init);

+

+void ipu_clear_irq_late_init(struct ipu_soc *ipu, uint32_t irq)

+{

+       unsigned long lock_flags;

+

+       spin_lock_irqsave(&ipu->int_reg_spin_lock, lock_flags);

+

+       ipu_cm_write(ipu, IPUIRQ_2_MASK(irq), IPUIRQ_2_STATREG(irq));

+

+       spin_unlock_irqrestore(&ipu->int_reg_spin_lock, lock_flags);

+}

+EXPORT_SYMBOL(ipu_clear_irq_late_init);

+

+int ipu_request_irq_late_init(struct ipu_soc *ipu, uint32_t irq,

+                   irqreturn_t(*handler) (int, void *),

+                   uint32_t irq_flags, const char *devname, void *dev_id)

+{

+       uint32_t reg;

+       unsigned long lock_flags;

+

+       BUG_ON(irq >= IPU_IRQ_COUNT);

+

+       spin_lock_irqsave(&ipu->int_reg_spin_lock, lock_flags);

+

+       if (ipu->irq_list[irq].handler != NULL) {

+               dev_err(ipu->dev,

+                       "handler already installed on irq %d\n", irq);

+               spin_unlock_irqrestore(&ipu->int_reg_spin_lock, lock_flags);

+               return -EINVAL;

+       }

+

+       ipu->irq_list[irq].handler = handler;

+       ipu->irq_list[irq].flags = irq_flags;

+       ipu->irq_list[irq].dev_id = dev_id;

+       ipu->irq_list[irq].name = devname;

+

+       /* clear irq stat for previous use */

+       ipu_cm_write(ipu, IPUIRQ_2_MASK(irq), IPUIRQ_2_STATREG(irq));

+       /* disable the interrupt */

+       reg = ipu_cm_read(ipu, IPUIRQ_2_CTRLREG(irq));

+       reg &= ~IPUIRQ_2_MASK(irq);

+       ipu_cm_write(ipu, reg, IPUIRQ_2_CTRLREG(irq));

+

+       spin_unlock_irqrestore(&ipu->int_reg_spin_lock, lock_flags);

+

+       return 0;

+}

+

+EXPORT_SYMBOL(ipu_request_irq_late_init);

+#endif

+/*Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel}*/

diff --git a/kernel_imx/drivers/mxc/ipu3/ipu_disp.c b/kernel_imx/drivers/mxc/ipu

index 35b7819..0b94750 100644

--- a/kernel_imx/drivers/mxc/ipu3/ipu_disp.c

+++ b/kernel_imx/drivers/mxc/ipu3/ipu_disp.c

@@ -282,6 +282,7 @@ void _ipu_dmfc_init(struct ipu_soc *ipu, int dmfc_type, int

                 * 1C, 2C and 6B, 6F unused;

                 */

                dev_info(ipu->dev, "IPU DMFC DP HIGH RESOLUTION: 1(0,1), 5B(2~5)

+               printk("[aaron]********add for debug1*******\n");

                dmfc_wr_chan = 0x00000090;

                dmfc_dp_chan = 0x0000968a;

                ipu->dmfc_size_28 = 128*4;

@@ -338,6 +339,7 @@ void _ipu_dmfc_set_wait4eot(struct ipu_soc *ipu, int dma_cha

        u32 dmfc_gen1 = ipu_dmfc_read(ipu, DMFC_GENERAL1);

        if (width >= HIGH_RESOLUTION_WIDTH) {

+               printk("[aaron]:**********add for debug01*****\n");

                if (dma_chan == 23)

                        _ipu_dmfc_init(ipu, DMFC_HIGH_RESOLUTION_DP, 0);

                else if (dma_chan == 28)

@@ -2110,5 +2112,135 @@ void __devinit ipu_disp_init(struct ipu_soc *ipu)

        ipu->fg_csc_type = ipu->bg_csc_type = CSC_NONE;

        ipu->color_key_4rgb = true;

        _ipu_init_dc_mappings(ipu);

+       printk("[aaron]:**********add for debug00*****\n");

        _ipu_dmfc_init(ipu, DMFC_NORMAL, 1);

}

+/*Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel{*/

+#ifdef CONFIG_MX6_CLK_FOR_BOOTUI_TRANS

+int32_t ipu_disp_set_global_alpha_late_init(struct ipu_soc *ipu, ipu_channel_t

+                               bool enable, uint8_t alpha)

+{

+       uint32_t reg;

+       uint32_t flow;

+       bool bg_chan;

+

+       if (channel == MEM_BG_SYNC || channel == MEM_FG_SYNC)

+               flow = DP_SYNC;

+       else if (channel == MEM_BG_ASYNC0 || channel == MEM_FG_ASYNC0)

+               flow = DP_ASYNC0;

+       else if (channel == MEM_BG_ASYNC1 || channel == MEM_FG_ASYNC1)

+               flow = DP_ASYNC1;

+       else

+               return -EINVAL;

+

+       if (channel == MEM_BG_SYNC || channel == MEM_BG_ASYNC0 ||

+           channel == MEM_BG_ASYNC1)

+               bg_chan = true;

+       else

+               bg_chan = false;

+

+       mutex_lock(&ipu->mutex_lock);

+

+       if (bg_chan) {

+               reg = ipu_dp_read(ipu, DP_COM_CONF(flow));

+               ipu_dp_write(ipu, reg & ~DP_COM_CONF_GWSEL, DP_COM_CONF(flow));

+       } else {

+               reg = ipu_dp_read(ipu, DP_COM_CONF(flow));

+               ipu_dp_write(ipu, reg | DP_COM_CONF_GWSEL, DP_COM_CONF(flow));

+       }

+

+       if (enable) {

+               reg = ipu_dp_read(ipu, DP_GRAPH_WIND_CTRL(flow)) & 0x00FFFFFFL;

+               ipu_dp_write(ipu, reg | ((uint32_t) alpha << 24),

+                            DP_GRAPH_WIND_CTRL(flow));

+

+               reg = ipu_dp_read(ipu, DP_COM_CONF(flow));

+               ipu_dp_write(ipu, reg | DP_COM_CONF_GWAM, DP_COM_CONF(flow));

+       } else {

+               reg = ipu_dp_read(ipu, DP_COM_CONF(flow));

+               ipu_dp_write(ipu, reg & ~DP_COM_CONF_GWAM, DP_COM_CONF(flow));

+       }

+

+       reg = ipu_cm_read(ipu, IPU_SRM_PRI2) | 0x8;

+       ipu_cm_write(ipu, reg, IPU_SRM_PRI2);

+

+       mutex_unlock(&ipu->mutex_lock);

+

+       return 0;

+}

+EXPORT_SYMBOL(ipu_disp_set_global_alpha_late_init);

+

+int32_t ipu_disp_set_color_key_late_init(struct ipu_soc *ipu, ipu_channel_t cha

+                               bool enable, uint32_t color_key)

+{

+       uint32_t reg, flow;

+       int y, u, v;

+       int red, green, blue;

+

+       if (channel == MEM_BG_SYNC || channel == MEM_FG_SYNC)

+               flow = DP_SYNC;

+       else if (channel == MEM_BG_ASYNC0 || channel == MEM_FG_ASYNC0)

+               flow = DP_ASYNC0;

+       else if (channel == MEM_BG_ASYNC1 || channel == MEM_FG_ASYNC1)

+               flow = DP_ASYNC1;

+       else

+               return -EINVAL;

+

+       mutex_lock(&ipu->mutex_lock);

+

+       ipu->color_key_4rgb = true;

+       /* Transform color key from rgb to yuv if CSC is enabled */

+       if (((ipu->fg_csc_type == RGB2YUV) && (ipu->bg_csc_type == YUV2YUV)) ||

+                       ((ipu->fg_csc_type == YUV2YUV) && (ipu->bg_csc_type == R

+                       ((ipu->fg_csc_type == YUV2YUV) && (ipu->bg_csc_type == Y

+                       ((ipu->fg_csc_type == YUV2RGB) && (ipu->bg_csc_type == Y

+

+               dev_dbg(ipu->dev, "color key 0x%x need change to yuv fmt\n", col

+

+               red = (color_key >> 16) & 0xFF;

+               green = (color_key >> 8) & 0xFF;

+               blue = color_key & 0xFF;

+

+               y = _rgb_to_yuv(0, red, green, blue);

+               u = _rgb_to_yuv(1, red, green, blue);

+               v = _rgb_to_yuv(2, red, green, blue);

+               color_key = (y << 16) | (u << 8) | v;

+

+               ipu->color_key_4rgb = false;

+

+               dev_dbg(ipu->dev, "color key change to yuv fmt 0x%x\n", color_ke

+       }

+

+       if (enable) {

+               reg = ipu_dp_read(ipu, DP_GRAPH_WIND_CTRL(flow)) & 0xFF000000L;

+               ipu_dp_write(ipu, reg | color_key, DP_GRAPH_WIND_CTRL(flow));

+

+               reg = ipu_dp_read(ipu, DP_COM_CONF(flow));

+               ipu_dp_write(ipu, reg | DP_COM_CONF_GWCKE, DP_COM_CONF(flow));

+       } else {

+               reg = ipu_dp_read(ipu, DP_COM_CONF(flow));

+               ipu_dp_write(ipu, reg & ~DP_COM_CONF_GWCKE, DP_COM_CONF(flow));

+       }

+

+       reg = ipu_cm_read(ipu, IPU_SRM_PRI2) | 0x8;

+       ipu_cm_write(ipu, reg, IPU_SRM_PRI2);

+

+       mutex_unlock(&ipu->mutex_lock);

+

+       return 0;

+}

+EXPORT_SYMBOL(ipu_disp_set_color_key_late_init);

+

+int32_t ipu_disp_get_window_pos_late_init(struct ipu_soc *ipu, ipu_channel_t ch

+                               int16_t *x_pos, int16_t *y_pos)

+{

+       int ret;

+

+       mutex_lock(&ipu->mutex_lock);

+       ret = _ipu_disp_get_window_pos(ipu, channel, x_pos, y_pos);

+       mutex_unlock(&ipu->mutex_lock);

+       return ret;

+}

+EXPORT_SYMBOL(ipu_disp_get_window_pos_late_init);

+#endif

+/*Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel}*/

diff --git a/kernel_imx/drivers/video/fbmem.c b/kernel_imx/drivers/video/fbmem.c

index 7a41220..af2aafa 100644

--- a/kernel_imx/drivers/video/fbmem.c

+++ b/kernel_imx/drivers/video/fbmem.c

@@ -34,7 +34,9 @@

#include <linux/fb.h>

#include <asm/fb.h>

-

+/*Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel{*/

+#include <asm/setup.h>

+/*Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel}*/

     /*

      *  Frame buffer device initialization and setup routines

@@ -658,12 +660,18 @@ int fb_prepare_logo(struct fb_info *info, int rotate)

int fb_show_logo(struct fb_info *info, int rotate)

{

        int y;

-

-       y = fb_show_logo_line(info, rotate, fb_logo.logo, 0,

-                             num_online_cpus());

-       y = fb_show_extra_logos(info, y, rotate);

-

-       return y;

+/*Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel{*/

+       if (strnstr(boot_command_line, "androidboot.mode=charger", COMMAND_LINE_

+               // dont show boot logo

+               return  0;

+       }

+       else {

+               y = fb_show_logo_line(info, rotate, fb_logo.logo, 0,

+                                     num_online_cpus());

+               y = fb_show_extra_logos(info, y, rotate);

+               return y;

+       }

+/*Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel}*/

}

#else

int fb_prepare_logo(struct fb_info *info, int rotate) { return 0; }

@@ -1632,7 +1640,75 @@ static int do_register_framebuffer(struct fb_info *fb_inf

        unlock_fb_info(fb_info);

        return 0;

}

+/*Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel{*/

+static int do_register_framebuffer_logo(struct fb_info *fb_info)

+{

+       int i, ret;

+       struct fb_event event;

+       struct fb_videomode mode;

+

+       if (fb_check_foreignness(fb_info))

+               return -ENOSYS;

+

+       do_remove_conflicting_framebuffers(fb_info->apertures, fb_info->fix.id,

+                                        fb_is_primary_device(fb_info));

+

+       if (num_registered_fb == FB_MAX)

+               return -ENXIO;

+

+       num_registered_fb++;

+       for (i = 0 ; i < FB_MAX; i++)

+               if (!registered_fb[i])

+                       break;

+       fb_info->node = i;

+       atomic_set(&fb_info->count, 1);

+       mutex_init(&fb_info->lock);

+       mutex_init(&fb_info->mm_lock);

+

+       fb_info->dev = device_create(fb_class, fb_info->device,

+                                    MKDEV(FB_MAJOR, i), NULL, "fb%d", i);

+       if (IS_ERR(fb_info->dev)) {

+               /* Not fatal */

+               printk(KERN_WARNING "Unable to create device for framebuffer %d;

+               fb_info->dev = NULL;

+       } else

+               fb_init_device(fb_info);

+

+       if (fb_info->pixmap.addr == NULL) {

+               fb_info->pixmap.addr = kmalloc(FBPIXMAPSIZE, GFP_KERNEL);

+               if (fb_info->pixmap.addr) {

+                       fb_info->pixmap.size = FBPIXMAPSIZE;

+                       fb_info->pixmap.buf_align = 1;

+                       fb_info->pixmap.scan_align = 1;

+                       fb_info->pixmap.access_align = 32;

+                       fb_info->pixmap.flags = FB_PIXMAP_DEFAULT;

+               }

+       }

+       fb_info->pixmap.offset = 0;

+

+       if (!fb_info->pixmap.blit_x)

+               fb_info->pixmap.blit_x = ~(u32)0;

+

+       if (!fb_info->pixmap.blit_y)

+               fb_info->pixmap.blit_y = ~(u32)0;

+

+       if (!fb_info->modelist.prev || !fb_info->modelist.next)

+               INIT_LIST_HEAD(&fb_info->modelist);

+

+       fb_var_to_videomode(&mode, &fb_info->var);

+       fb_add_videomode(&mode, &fb_info->modelist);

+       registered_fb[i] = fb_info;

+       event.info = fb_info;

+

+       if (!lock_fb_info(fb_info))

+               return -ENODEV;

+       //ret = fb_notifier_call_chain(FB_EVENT_FB_REGISTERED, &event);

+       printk("do_register_framebuffer_logo ret = %d\n", ret);

+       unlock_fb_info(fb_info);

+       return 0;

+}

+/*Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel}*/

static int do_unregister_framebuffer(struct fb_info *fb_info)

{

        struct fb_event event;

@@ -1709,10 +1785,19 @@ register_framebuffer(struct fb_info *fb_info)

        mutex_lock(&registration_lock);

        ret = do_register_framebuffer(fb_info);

        mutex_unlock(&registration_lock);

-

        return ret;

}

+/*Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel{*/

+int register_framebuffer_logo(struct fb_info *fb_info)

+{

+       int ret;

+       mutex_lock(&registration_lock);

+       ret = do_register_framebuffer_logo(fb_info);

+       mutex_unlock(&registration_lock);

+       return ret;

+}

+/*Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel}*/

/**

  *     unregister_framebuffer - releases a frame buffer device

  *     @fb_info: frame buffer info structure

diff --git a/kernel_imx/drivers/video/mxc/mxc_dispdrv.h b/kernel_imx/drivers/vid

index 9a72217..ea579ca 100644

--- a/kernel_imx/drivers/video/mxc/mxc_dispdrv.h

+++ b/kernel_imx/drivers/video/mxc/mxc_dispdrv.h

@@ -40,6 +40,13 @@ struct mxc_dispdrv_driver {

        void (*disable) (struct mxc_dispdrv_handle *);

        /* display driver setup function, called at early part of fb_set_par */

        int (*setup) (struct mxc_dispdrv_handle *, struct fb_info *fbi);

+/*Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel{*/

+#ifdef CONFIG_MX6_CLK_FOR_BOOTUI_TRANS

+       /* display driver late init done. */

+       void (*late_init_done) (struct mxc_dispdrv_handle *);

+#endif

+/*Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel{*/

+

};

struct mxc_dispdrv_handle *mxc_dispdrv_register(struct mxc_dispdrv_driver *drv)

diff --git a/kernel_imx/drivers/video/mxc/mxc_ipuv3_fb.c b/kernel_imx/drivers/vi

index 7c3e419..e0d9d4c 100644

--- a/kernel_imx/drivers/video/mxc/mxc_ipuv3_fb.c

+++ b/kernel_imx/drivers/video/mxc/mxc_ipuv3_fb.c

@@ -51,7 +51,9 @@

#include <asm/mach-types.h>

#include <mach/ipu-v3.h>

#include "mxc_dispdrv.h"

-

+/*Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel{*/

+#define delay 0

+/*Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel}*/

/*

  * Driver name

  */

@@ -76,6 +78,11 @@ struct mxcfb_info {

        bool overlay;

        bool alpha_chan_en;

        bool late_init;

+/*Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel{*/

+#ifdef CONFIG_MX6_CLK_FOR_BOOTUI_TRANS

+       bool late_init_idmac_done;

+#endif

+/*Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel}*/

        bool first_set_par;

        dma_addr_t alpha_phy_addr0;

        dma_addr_t alpha_phy_addr1;

@@ -322,8 +329,20 @@ static int _setup_disp_channel1(struct fb_info *fbi)

                if (mxc_fbi->alpha_chan_en)

                        params.mem_dp_bg_sync.alpha_chan_en = true;

        }

+/*Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel{*/

+#ifdef CONFIG_MX6_CLK_FOR_BOOTUI_TRANS

+       if (mxc_fbi->late_init)

+       {

+               ipu_init_channel_late_init(mxc_fbi->ipu, mxc_fbi->ipu_ch, &param

+       }

+       else

+       {

+               ipu_init_channel(mxc_fbi->ipu, mxc_fbi->ipu_ch, &params);

+       }

+#else

        ipu_init_channel(mxc_fbi->ipu, mxc_fbi->ipu_ch, &params);

-

+#endif

+/*Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel}*/

        return 0;

}

@@ -380,7 +399,61 @@ static int _setup_disp_channel2(struct fb_info *fbi)

                init_completion(&mxc_fbi->alpha_flip_complete);

                complete(&mxc_fbi->alpha_flip_complete);

        }

+/*Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel{*/

+#ifdef CONFIG_MX6_CLK_FOR_BOOTUI_TRANS

+       if (mxc_fbi->late_init) {

+               mxc_fbi->cur_ipu_buf = 0;

+               retval = ipu_init_channel_buffer_late_init(mxc_fbi->ipu,

+                                                mxc_fbi->ipu_ch, IPU_INPUT_BUFF

+                                                fbi_to_pixfmt(fbi),

+                                                fbi->var.xres, fbi->var.yres,

+                                                fb_stride,

+                                                fbi->var.rotate,

+                                                base,

+                                                base,

+                                                fbi->var.accel_flags &

+                                                       FB_ACCEL_DOUBLE_FLAG ? 0

+                                                0, 0);

+               if (retval) {

+                       dev_err(fbi->device,

+                               "ipu_init_channel_buffer error %d\n", retval);

+                       return retval;

+               }

+

+               /* update u/v offset */

+               ipu_update_channel_offset(mxc_fbi->ipu, mxc_fbi->ipu_ch,

+                               IPU_INPUT_BUFFER,

+                               fbi_to_pixfmt(fbi),

+                               fr_w,

+                               fr_h,

+                               fr_w,

+                               0, 0,

+                               fr_yoff,

+                               fr_xoff);

+               if (mxc_fbi->alpha_chan_en) {

+                       retval = ipu_init_channel_buffer_late_init(mxc_fbi->ipu,

+                                                        mxc_fbi->ipu_ch,

+                                                        IPU_ALPHA_IN_BUFFER,

+                                                        IPU_PIX_FMT_GENERIC,

+                                                        fbi->var.xres, fbi->var

+                                                        fbi->var.xres,

+                                                        fbi->var.rotate,

+                                                        mxc_fbi->alpha_phy_addr

+                                                        mxc_fbi->alpha_phy_addr

+                                                        0,

+                                                        0, 0);

+                       if (retval) {

+                               dev_err(fbi->device,

+                                       "ipu_init_channel_buffer error %d\n", re

+                               return retval;

+                       }

+               }

+               mxc_fbi->late_init_idmac_done = true;

+       } else

+       {

+#endif

+/*Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel}*/

        retval = ipu_init_channel_buffer(mxc_fbi->ipu,

                                         mxc_fbi->ipu_ch, IPU_INPUT_BUFFER,

                                         fbi_to_pixfmt(fbi),

@@ -427,14 +500,34 @@ static int _setup_disp_channel2(struct fb_info *fbi)

                        return retval;

                }

        }

-

+/*Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel{*/

+#ifdef CONFIG_MX6_CLK_FOR_BOOTUI_TRANS

+       }

+#endif

+/*Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel}*/

        return retval;

}

static bool mxcfb_need_to_set_par(struct fb_info *fbi)

{

        struct mxcfb_info *mxc_fbi = fbi->par;

+/*Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel{*/

+#ifdef CONFIG_MX6_CLK_FOR_BOOTUI_TRANS

+       if (mxc_fbi->late_init) {

+               if ((mxc_fbi->cur_var.xres != fbi->var.xres) ||

+                       (mxc_fbi->cur_var.yres != fbi->var.yres) ||

+                       (mxc_fbi->cur_var.bits_per_pixel != fbi->var.bits_per_pi

+                       mxc_fbi->late_init = false;

+                       if (mxc_fbi->dispdrv && mxc_fbi->dispdrv->drv->late_init

+                               mxc_fbi->dispdrv->drv->late_init_done(mxc_fbi->d

+                       return true;

+               }

+               if (mxc_fbi->late_init_idmac_done)

+                       return false;

+       }

+#endif

+/*Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel}*/

        if ((fbi->var.activate & FB_ACTIVATE_FORCE) &&

            (fbi->var.activate & FB_ACTIVATE_MASK) == FB_ACTIVATE_NOW)

                return true;

@@ -487,7 +580,31 @@ static int mxcfb_set_par(struct fb_info *fbi)

        if (fbi->var.xres == 0 || fbi->var.yres == 0)

                return 0;

+/*Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel{*/

+#ifdef CONFIG_MX6_CLK_FOR_BOOTUI_TRANS

+       if (mxc_fbi->late_init) {

+               if (ovfbi_enable) {

+                       ov_pos_ret = ipu_disp_get_window_pos_late_init(

+                                                       mxc_fbi_fg->ipu, mxc_fbi

+                                                       &ov_pos_x, &ov_pos_y);

+                       if (ov_pos_ret < 0)

+                               dev_err(fbi->device, "Get overlay pos failed, di

+                                               mxc_fbi->dispdrv->drv->name);

+

+                       ipu_clear_irq_late_init(mxc_fbi_fg->ipu, mxc_fbi_fg->ipu

+                       ipu_disable_irq_late_init(mxc_fbi_fg->ipu, mxc_fbi_fg->i

+                       ipu_clear_irq_late_init(mxc_fbi_fg->ipu, mxc_fbi_fg->ipu

+                       ipu_disable_irq_late_init(mxc_fbi_fg->ipu, mxc_fbi_fg->i

+               }

+               ipu_clear_irq_late_init(mxc_fbi->ipu, mxc_fbi->ipu_ch_irq);

+               ipu_disable_irq_late_init(mxc_fbi->ipu, mxc_fbi->ipu_ch_irq);

+               ipu_clear_irq_late_init(mxc_fbi->ipu, mxc_fbi->ipu_ch_nf_irq);

+               ipu_disable_irq_late_init(mxc_fbi->ipu, mxc_fbi->ipu_ch_nf_irq);

+       } else

+       {

+#endif

+/*Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel}*/

        if (ovfbi_enable) {

                ov_pos_ret = ipu_disp_get_window_pos(

                                                mxc_fbi_fg->ipu, mxc_fbi_fg->ipu

@@ -511,7 +628,11 @@ static int mxcfb_set_par(struct fb_info *fbi)

        ipu_disable_irq(mxc_fbi->ipu, mxc_fbi->ipu_ch_nf_irq);

        ipu_disable_channel(mxc_fbi->ipu, mxc_fbi->ipu_ch, true);

        ipu_uninit_channel(mxc_fbi->ipu, mxc_fbi->ipu_ch);

-

+/*Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel{*/

+#ifdef CONFIG_MX6_CLK_FOR_BOOTUI_TRANS

+       }

+#endif

+/*Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel}*/

        /*

         * Disable IPU hsp clock if it is enabled for an

         * additional time in ipu common driver.

@@ -525,7 +646,6 @@ static int mxcfb_set_par(struct fb_info *fbi)

        if (!fbi->fix.smem_start || (mem_len > fbi->fix.smem_len)) {

                if (fbi->fix.smem_start)

                        mxcfb_unmap_video_memory(fbi);

-

                if (mxcfb_map_video_memory(fbi) < 0)

                        return -ENOMEM;

        }

@@ -535,9 +655,15 @@ static int mxcfb_set_par(struct fb_info *fbi)

                 * Clear the screen in case uboot fb pixel format is not

                 * the same to kernel fb pixel format.

                 */

-               if (mxc_fbi->late_init)

-                       memset((char *)fbi->screen_base, 0, fbi->fix.smem_len);

-

+/*Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel{*/

+#ifdef CONFIG_MX6_CLK_FOR_BOOTUI_TRANS

+               if (!mxc_fbi->late_init) {

+#endif

+               memset((char *)fbi->screen_base, 0, fbi->fix.smem_len);

+#ifdef CONFIG_MX6_CLK_FOR_BOOTUI_TRANS

+               }

+#endif

+/*Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel}*/

                mxc_fbi->first_set_par = false;

        }

@@ -604,6 +730,11 @@ static int mxcfb_set_par(struct fb_info *fbi)

                _setup_disp_channel1(mxc_fbi->ovfbi);

        if (!mxc_fbi->overlay) {

+/*Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel{*/

+#ifdef CONFIG_MX6_CLK_FOR_BOOTUI_TRANS

+               if (!mxc_fbi->late_init) {

+#endif

+/*Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel}*/

                uint32_t out_pixel_fmt;

                memset(&sig_cfg, 0, sizeof(sig_cfg));

@@ -645,7 +776,11 @@ static int mxcfb_set_par(struct fb_info *fbi)

                                "mxcfb: Error initializing panel.\n");

                        return -EINVAL;

                }

-

+/*Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel{*/

+#ifdef CONFIG_MX6_CLK_FOR_BOOTUI_TRANS

+               }

+#endif

+/*Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel}*/

                fbi->mode =

                    (struct fb_videomode *)fb_match_mode(&fbi->var,

                                                         &fbi->modelist);

@@ -878,7 +1013,13 @@ static int mxcfb_check_var(struct fb_var_screeninfo *var,

                        bg_xres = fbi_tmp->var.xres;

                        bg_yres = fbi_tmp->var.yres;

                }

-

+/*Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel{*/

+#ifdef CONFIG_MX6_CLK_FOR_BOOTUI_TRANS

+               if (mxc_fbi->late_init)

+                       ipu_disp_get_window_pos_late_init(mxc_fbi->ipu, mxc_fbi-

+               else

+#endif

+/*Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel}*/

                ipu_disp_get_window_pos(mxc_fbi->ipu, mxc_fbi->ipu_ch, &pos_x, &

                if ((var->xres + pos_x) > bg_xres)

@@ -892,8 +1033,9 @@ static int mxcfb_check_var(struct fb_var_screeninfo *var, s

        if (var->xres_virtual < var->xres)

                var->xres_virtual = var->xres;

-

-       if (var->yres_virtual < var->yres)

+/*Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel{*/

+       if (var->yres_virtual <= var->yres)

+/*Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel{*/

                var->yres_virtual = var->yres * 3;

        if ((var->bits_per_pixel != 32) && (var->bits_per_pixel != 24) &&

@@ -1466,6 +1608,15 @@ static int mxcfb_blank(int blank, struct fb_info *info)

        case FB_BLANK_VSYNC_SUSPEND:

        case FB_BLANK_HSYNC_SUSPEND:

        case FB_BLANK_NORMAL:

+/*Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel{*/

+#ifdef CONFIG_MX6_CLK_FOR_BOOTUI_TRANS

+               if (mxc_fbi->late_init) {

+                       mxc_fbi->late_init = false;

+                       if (mxc_fbi->dispdrv && mxc_fbi->dispdrv->drv->late_init

+                               mxc_fbi->dispdrv->drv->late_init_done(mxc_fbi->d

+               }

+#endif

+/*Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel{*/

                if (mxc_fbi->dispdrv && mxc_fbi->dispdrv->drv->disable)

                        mxc_fbi->dispdrv->drv->disable(mxc_fbi->dispdrv);

                ipu_disable_channel(mxc_fbi->ipu, mxc_fbi->ipu_ch, true);

@@ -2157,7 +2308,9 @@ static int mxcfb_option_setup(struct platform_device *pdev

        return 0;

}

-

+/*Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel{*/

+extern int     register_framebuffer_logo(struct fb_info *fb_info);

+/*Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel{*/

static int mxcfb_register(struct fb_info *fbi)

{

        struct mxcfb_info *mxcfbi = (struct mxcfb_info *)fbi->par;

@@ -2187,7 +2340,46 @@ static int mxcfb_register(struct fb_info *fbi)

                INIT_LIST_HEAD(&fbi->modelist);

        fb_var_to_videomode(&m, &fbi->var);

        fb_add_videomode(&m, &fbi->modelist);

+/*Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel{*/

+#ifdef CONFIG_MX6_CLK_FOR_BOOTUI_TRANS

+       if (mxcfbi->late_init) {

+               if (ipu_request_irq_late_init(mxcfbi->ipu, mxcfbi->ipu_ch_irq,

+                       mxcfb_irq_handler, IPU_IRQF_ONESHOT, MXCFB_NAME, fbi) !=

+                       dev_err(fbi->device, "Error registering EOF irq handler.

+                       ret = -EBUSY;

+                       goto err0;

+               }

+               if (ipu_request_irq_late_init(mxcfbi->ipu, mxcfbi->ipu_ch_nf_irq

+                       mxcfb_nf_irq_handler, IPU_IRQF_ONESHOT, MXCFB_NAME, fbi)

+                       dev_err(fbi->device, "Error registering NFACK irq handle

+                       ret = -EBUSY;

+                       goto err1;

+               }

+

+               if (mxcfbi->ipu_vsync_pre_irq != -1) {

+                       if (ipu_request_irq_late_init(mxcfbi->ipu, mxcfbi->ipu_v

+                                               mxcfb_vsync_pre_irq_handler, 0,

+                                               MXCFB_NAME, fbi) != 0) {

+                               dev_err(fbi->device, "Error registering VSYNC ir

+                                                        "handler.\n");

+                               ret = -EBUSY;

+                               goto err2;

+                       }

+               }

+               if (mxcfbi->ipu_alp_ch_irq != -1) {

+                       if (ipu_request_irq_late_init(mxcfbi->ipu, mxcfbi->ipu_a

+                                       mxcfb_alpha_irq_handler, IPU_IRQF_ONESHO

+                                               MXCFB_NAME, fbi) != 0) {

+                               dev_err(fbi->device, "Error registering alpha ir

+                                               "handler.\n");

+                               ret = -EBUSY;

+                               goto err3;

+                       }

+               }

+       } else {

+#endif

+/*Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel}*/

        if (ipu_request_irq(mxcfbi->ipu, mxcfbi->ipu_ch_irq,

                mxcfb_irq_handler, IPU_IRQF_ONESHOT, MXCFB_NAME, fbi) != 0) {

                dev_err(fbi->device, "Error registering EOF irq handler.\n");

@@ -2224,7 +2416,12 @@ static int mxcfb_register(struct fb_info *fbi)

                        ret = -EBUSY;

                        goto err3;

                }

-

+/*Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel{*/

+#ifdef CONFIG_MX6_CLK_FOR_BOOTUI_TRANS

+       }

+#endif

+/*Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel}*/

+       printk("mxcfbi->late_init = %d\n", mxcfbi->late_init);

        if (!mxcfbi->late_init) {

                fbi->var.activate |= FB_ACTIVATE_FORCE;

                console_lock();

@@ -2258,13 +2455,35 @@ static int mxcfb_register(struct fb_info *fbi)

                        _setup_disp_channel1(fbi);

                        ipu_enable_channel(mxcfbi->ipu, mxcfbi->ipu_ch);

                        console_unlock();

+/*Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel{*/

+#ifdef CONFIG_MX6_CLK_FOR_BOOTUI_TRANS

+                       mxcfbi->cur_var = fbi->var;

+                       fbi->mode =

+                               (struct fb_videomode *)fb_match_mode(&fbi->var,

+                               printk("mxcfbi->cur_var = %d\n", mxcfbi->cur_var

+                               printk("fb_info->mode->name = %s\n", fbi->mode->

+                               printk("fb_info->mode->sync = %d\n", fbi->mode->

+                               printk("fb_info->mode->vmode = %d\n", fbi->mode-

+                               printk("fb_info->mode->flag = %d\n", fbi->mode->

+#endif

+               mxcfbi->late_init = false;

+               goto logo;

+/*Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel}*/

                }

        }

        ret = register_framebuffer(fbi);

        if (ret < 0)

                goto err6;

-

+/*Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel{*/

+       return ret;

+logo:

+       ret = register_framebuffer_logo(fbi);

+       if (ret < 0){

+               mdelay(delay);

+               goto err6;

+       }

+/*Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel}*/

        return ret;

err6:

        if (mxcfbi->next_blank == FB_BLANK_UNBLANK) {

@@ -2311,6 +2530,10 @@ static int mxcfb_setup_overlay(struct platform_device *pd

                struct fb_info *fbi_bg, struct resource *res)

{

        struct fb_info *ovfbi;

+

+#ifdef CONFIG_MX6_CLK_FOR_BOOTUI_TRANS

+       struct ipuv3_fb_platform_data *plat_data = pdev->dev.platform_data;

+#endif

        struct mxcfb_info *mxcfbi_bg = (struct mxcfb_info *)fbi_bg->par;

        struct mxcfb_info *mxcfbi_fg;

        int ret = 0;

@@ -2338,7 +2561,11 @@ static int mxcfb_setup_overlay(struct platform_device *pd

        mxcfbi_fg->ipu_di_pix_fmt = mxcfbi_bg->ipu_di_pix_fmt;

        mxcfbi_fg->overlay = true;

        mxcfbi_fg->cur_blank = mxcfbi_fg->next_blank = FB_BLANK_POWERDOWN;

-

+/*Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel{*/

+#ifdef CONFIG_MX6_CLK_FOR_BOOTUI_TRANS

+       mxcfbi_fg->late_init = plat_data->late_init;

+#endif

+/*Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel}*/

        /* Need dummy values until real panel is configured */

        ovfbi->var.xres = 240;

        ovfbi->var.yres = 320;

@@ -2427,7 +2654,12 @@ static int mxcfb_probe(struct platform_device *pdev)

        spin_lock_init(&mxcfbi->lock);

        mxcfbi->fbi = fbi;

        mxcfbi->ipu_int_clk = plat_data->int_clk;

+/*Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel{*/

+#ifdef CONFIG_MX6_CLK_FOR_BOOTUI_TRANS

        mxcfbi->late_init = plat_data->late_init;

+       mxcfbi->late_init_idmac_done = false;

+#endif

+/*Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel}*/

        mxcfbi->first_set_par = true;

        mxcfbi->panel_width_mm = plat_data->panel_width_mm;

        mxcfbi->panel_height_mm = plat_data->panel_height_mm;

@@ -2477,11 +2709,23 @@ static int mxcfb_probe(struct platform_device *pdev)

                ret = mxcfb_register(fbi);

                if (ret < 0)

                        goto mxcfb_register_failed;

-

+/*Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel{*/

+#ifdef CONFIG_MX6_CLK_FOR_BOOTUI_TRANS

+               if (mxcfbi->late_init) {

+                       ipu_disp_set_global_alpha_late_init(mxcfbi->ipu, mxcfbi-

+                                                 true, 0x80);

+                       ipu_disp_set_color_key_late_init(mxcfbi->ipu, mxcfbi->ip

+               } else {

+#endif

+/*Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel}*/

                ipu_disp_set_global_alpha(mxcfbi->ipu, mxcfbi->ipu_ch,

                                          true, 0x80);

                ipu_disp_set_color_key(mxcfbi->ipu, mxcfbi->ipu_ch, false, 0);

-

+/*Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel{*/

+#ifdef CONFIG_MX6_CLK_FOR_BOOTUI_TRANS

+               }

+#endif

+/*Qisda,Aaron.SF.Tang,20150506,add for uboot logo show to the kernel{*/

                res = platform_get_resource(pdev, IORESOURCE_MEM, 1);

                ret = mxcfb_setup_overlay(pdev, fbi, res);

0 Kudos
1,752 Views
qiang_li-mpu_se
NXP Employee
NXP Employee

Please apply the attached kernel patch and try.

0 Kudos
1,752 Views
尚飞汤
Contributor IV

Dear Qiang li,it is no use to patch this,  the time of the problem  seems happened  at this time.i just don't know how to deal with that.please have a look of this part .thanks very much.

[    5.337301] imx-ipuv3 imx-ipuv3.0: IPU DMFC DP HIGH RESOLUTION: 1(0,1), 5B(2~5), 5F(6,7)

[    3.610600] NET: Registered protocol family 17

[    3.610632] NET: Registered protocol family 15

[    3.610742] Bluetooth: RFCOMM TTY layer initialized

[    3.610757] Bluetooth: RFCOMM socket layer initialized

[    3.610763] Bluetooth: RFCOMM ver 1.11

[    3.610770] Bluetooth: BNEP (Ethernet Emulation) ver 1.3

[    3.610776] Bluetooth: BNEP filters: protocol multicast

[    3.610783] Bluetooth: HIDP (Human Interface Emulation) ver 1.2

[    3.610967] L2TP core driver, V2.0

[    3.610988] PPPoL2TP kernel driver, V2.0

[    3.610993] L2TP IP encapsulation support (L2TPv3)

[    3.670573] L2TP netlink interface

[    3.671660] hub 2-0:1.0: state 7 ports 1 chg 0000 evt 0002

[    3.679699] L2TP ethernet pseudowire support (L2TPv3)

[    3.684832] lib80211: common routines for IEEE802.11 drivers

[    3.690641] lib80211_crypt: registered algorithm 'NULL'

[    3.695939] lib80211_crypt: registered algorithm 'WEP'

[    3.701245] lib80211_crypt: registered algorithm 'CCMP'

[    3.701987] mmc0: new high speed DDR MMC card at address 0001

[    3.712457] lib80211_crypt: registered algorithm 'TKIP'

[    3.717811] VFP support v0.3:

[    3.720789] hub 2-1:1.0: port 2: status 0101 change 0001

[    3.720818] implementor 41 architecture 3 part 30 variant 9 rev 4

[    3.721250] Bus freq driver module loaded

[    3.721260] Bus freq driver Enabled

[    3.723123] mxc_dvfs_core_probe

[    3.723436] DVFS driver module loaded

[    3.747246] snvs_rtc snvs_rtc.0: setting system clock to 2016-12-02 00:07:04 UTC (1480637224)

[    3.747274] mmcblk0: mmc0:0001 S10008 7.12 GiB

[    3.760604] mmcblk0boot0: mmc0:0001 S10008 partition 1 4.00 MiB

[    3.767318] Freeing init memory: 220K

[    4.439886] usb 2-1.2.1: default language 0x0409

[    4.445209] usb 2-1.2.1: udev 4, busnum 2, minor = 131

[    4.450520] usb 2-1.2.1: New USB device found, idVendor=05e3, idProduct=0608

[    4.457801] usb 2-1.2.1: New USB device strings: Mfr=0, Product=1, SerialNumber=0

[    4.465827] usb 2-1.2.1: Product: USB2.0 Hub

[    4.472069] usb 2-1.2.1: usb_probe_device

[    4.476229] usb 2-1.2.1: configuration #1 chosen from 1 choice

[    4.482770] usb 2-1.2.1: adding 2-1.2.1:1.0 (config #1, interface 0)

[    4.490063] hub 2-1.2.1:1.0: usb_probe_interface

[    4.493023] android_usb: already disabled

[    4.493176] android_usb: already disabled

[    4.493347] mtp_bind_config

[    4.493383] adb_bind_config

[    4.499247] adb_open

[    4.511181] hub 2-1.2.1:1.0: usb_probe_interface - got id

[    4.517437] hub 2-1.2.1:1.0: USB hub found

[    4.522097] hub 2-1.2.1:1.0: 4 ports detected

[    4.526559] hub 2-1.2.1:1.0: standalone hub

[    4.531149] hub 2-1.2.1:1.0: ganged power switching

[    4.536196] android_work: sent uevent USB_STATE=CONNECTED

[    4.541833] hub 2-1.2.1:1.0: global over-current protection

[    4.547692] hub 2-1.2.1:1.0: Single TT

[    4.551760] hub 2-1.2.1:1.0: TT requires at most 32 FS bit times (2664 ns)

[    4.558805] hub 2-1.2.1:1.0: Port indicators are supported

[    4.564680] hub 2-1.2.1:1.0: power on to power good time: 100ms

[    4.571630] hub 2-1.2.1:1.0: local power source is good

[    4.577456] hub 2-1.2.1:1.0: no over-current condition exists

[    4.583646] hub 2-1.2.1:1.0: enabling power on all ports

[    4.590895] /home/aaron/work_place/imx6jb2/kernel_imx/drivers/usb/core/inode.c: creating file '004'

[    4.600574] hub 2-1.2:1.0: port 3, status 0101, change 0000, 12 Mb/s

[    4.623900] android_usb gadget: high speed config #1: android

[    4.630168] android_work: sent uevent USB_STATE=CONFIGURED

/system/bin/sh: No controlling tty: open /dev/tty: No such device or address

/system/bin/sh: warning: won't have full job control

[    4.687883] usb 2-1.2.3: new full speed USB device number 5 using fsl-ehci

[    4.695057] hub 2-1.2.1:1.0: port 1: status 0301 change 0001

[    4.763257] eth0: Freescale FEC PHY driver [Generic PHY] (mii_bus:phy_addr=1:04, irq=-1)

[    4.772036] mx6q_sabresd_fec_phy_init

[    4.776802] ADDRCONF(NETDEV_UP): eth0: link is not ready

[    4.799099] usb 2-1.2.1: link qh256-0001/d5a7fc60 start 3 [1/0 us]

[    4.807937] usb 2-1.2.3: skipped 1 descriptor after interface

[    4.814830] usb 2-1.2.3: default language 0x0409

[    4.820986] usb 2-1.2.3: udev 5, busnum 2, minor = 132

[    4.826649] usb 2-1.2.3: New USB device found, idVendor=0eef, idProduct=c000

[    4.834076] usb 2-1.2.3: New USB device strings: Mfr=1, Product=2, SerialNumber=0

[    4.842072] usb 2-1.2.3: Product: eGalaxTouch EXC3104-0404-03.00.00

[    4.848678] usb 2-1.2.3: Manufacturer: eGalax Inc.

[    4.857230] usb 2-1.2.3: usb_probe_device

[    4.861340] usb 2-1.2.3: configuration #1 chosen from 1 choice

[    4.869481] usb 2-1.2.3: adding 2-1.2.3:1.0 (config #1, interface 0)

[    4.883288] usbserial_generic 2-1.2.3:1.0: usb_probe_interface

[    4.891212] usbserial_generic 2-1.2.3:1.0: usb_probe_interface - got id

[    4.901031] usbhid 2-1.2.3:1.0: usb_probe_interface

[    4.906080] usbhid 2-1.2.3:1.0: usb_probe_interface - got id

[    4.920825] warning: `rild' uses 32-bit capabilities (legacy support in use)

root@android:/ # [    4.937692] input: eGalax Inc. eGalaxTouch EXC3104-0404-03.00.00 as /devices/platform/fsl-ehci.1/usb2/2-1/2-1.2/2-1.2.3/2-1.2.3:1.0/input/input3

[    4.955185] generic-usb 0003:0EEF:C000.0001: input,hidraw0: USB HID v2.10 Pointer [eGalax Inc. eGalaxTouch EXC3104-0404-03.00.00] on usb-fsl-ehci.1-1.2.3/input0

[    4.972662] /home/aaron/work_place/imx6jb2/kernel_imx/drivers/usb/core/inode.c: creating file '005'

[    4.982009] hub 2-1.2:1.0: state 7 ports 4 chg 0000 evt 0002

[    4.988388] hub 2-1.2.1:1.0: state 7 ports 4 chg 0002 evt 0000

[    4.994725] hub 2-1.2.1:1.0: port 1, status 0301, change 0000, 1.5 Mb/s

[    5.107238] usb 2-1.2.1.1: new low speed USB device number 6 using fsl-ehci

[    5.219592] usb 2-1.2.1.1: skipped 1 descriptor after interface

[    5.220070] usb 2-1.2.1.1: default language 0x0409

[    5.221078] usb 2-1.2.1.1: udev 6, busnum 2, minor = 133

[    5.221087] usb 2-1.2.1.1: New USB device found, idVendor=192f, idProduct=0916

[    5.221096] usb 2-1.2.1.1: New USB device strings: Mfr=0, Product=2, SerialNumber=0

[    5.221104] usb 2-1.2.1.1: Product: USB Optical Mouse

[    5.223433] usb 2-1.2.1.1: usb_probe_device

[    5.223453] usb 2-1.2.1.1: configuration #1 chosen from 1 choice

[    5.223889] usb 2-1.2.1.1: adding 2-1.2.1.1:1.0 (config #1, interface 0)

[    5.230958] usbserial_generic 2-1.2.1.1:1.0: usb_probe_interface

[    5.230979] usbserial_generic 2-1.2.1.1:1.0: usb_probe_interface - got id

[    5.231210] usbhid 2-1.2.1.1:1.0: usb_probe_interface

[    5.231224] usbhid 2-1.2.1.1:1.0: usb_probe_interface - got id

[    5.249830] input: USB Optical Mouse as /devices/platform/fsl-ehci.1/usb2/2-1/2-1.2/2-1.2.1/2-1.2.1.1/2-1.2.1.1:1.0/input/input4

[    5.258543] generic-usb 0003:192F:0916.0002: input,hidraw1: USB HID v1.11 Mouse [USB Optical Mouse] on usb-fsl-ehci.1-1.2.1.1/input0

[    5.258644] /home/aaron/work_place/imx6jb2/kernel_imx/drivers/usb/core/inode.c: creating file '006'

[    5.258737] hub 2-1.2.1:1.0: state 7 ports 4 chg 0000 evt 0002

[    5.281941] usb 2-1.2.3: link qh1-0601/d5d9ef20 start 0 [1/3 us]

[    5.282417] usb 2-1.2.3: unlink qh1-0601/d5d9ef20 start 0 [1/3 us]

[    5.282727] fsl-ehci fsl-ehci.1: reused qh d5d9ef20 schedule

[    5.282738] usb 2-1.2.3: link qh1-0601/d5d9ef20 start 0 [1/3 us]

[    5.337285] [aaron]:**********add for debug01*****

[    5.337301] imx-ipuv3 imx-ipuv3.0: IPU DMFC DP HIGH RESOLUTION: 1(0,1), 5B(2~5), 5F(6,7)

[    5.337308] [aaron]********add for debug1*******

[    5.339565] input: eGalaxTouch_VirtualDevice as /devices/virtual/input/input5

[    5.677140] ERROR: v4l2 capture: slave not found!

[    5.690302] ERROR: v4l2 capture: slave not found!

[    5.705912] ERROR: v4l2 capture: slave not found!

[    5.712679] ERROR: v4l2 capture: slave not found!

[   11.726695] request_suspend_state: wakeup (3->0) at 11529514003 (2016-12-02 00:07:12.494691002 UTC)

0 Kudos
1,752 Views
qiang_li-mpu_se
NXP Employee
NXP Employee

For continued debug, you can add dead loop code "while(1);" at some kernel code position, and check after which code, the LVDS display will disappear, then you can check that code to find the issue.

0 Kudos
1,752 Views
尚飞汤
Contributor IV

can you give me a way to shitdown the backlight when change the logo???

0 Kudos
1,752 Views
qiang_li-mpu_se
NXP Employee
NXP Employee

You should find which code caused the LVDS display un-continued first. The "while(1);" debug method can be used to find it. You just need add it to your modified code one by one, and test.

0 Kudos
1,752 Views
尚飞汤
Contributor IV

hai,qiang li, can you tell me what the fellow pare parameters means:

int ipu_id;

int ipu_di;

i was so puzzled about them.

0 Kudos
1,752 Views
qiang_li-mpu_se
NXP Employee
NXP Employee

For iMX6D/Q, there are two IPUs in each chip, they are identified with ipu_id.

For each IPU, there are two display interface (DI) which can support two display devices, they are identified with ipu_di.

0 Kudos
1,752 Views
尚飞汤
Contributor IV

Dear qiang li:

i find my log have the follow warning,can my problem caused by this???

how can i deal with this warning? i find our another program have no this kind of warning ,and works good.

<4>[    1.943758] imx-ipuv3 imx-ipuv3.0: IPU Warning - IPU_INT_STAT_5 = 0x00800000

<4>[    1.950927] imx-ipuv3 imx-ipuv3.0: IPU Warning - IPU_INT_STAT_10 = 0x00080000

0 Kudos
1,752 Views
qiang_li-mpu_se
NXP Employee
NXP Employee

Debug method had already been sent to you:

add dead loop code "while(1);" at some kernel code position.

0 Kudos
1,746 Views
尚飞汤
Contributor IV

Dear Qiang li:

can you tell me why appear the two warning??? just what's the warning meaning???i wasn't touch freescale's ipu.

0 Kudos
1,738 Views
qiang_li-mpu_se
NXP Employee
NXP Employee

That warning means there is something wrong in your porting. You should locate which of your porting code caused the warning, then we can check why.

0 Kudos
1,738 Views
尚飞汤
Contributor IV

dear qiang li,i read the imx6dl document find the follow:

IPU Warning - IPU_INT_STAT_10 = 0x00080000

DI0 Synchronous display error interrupt

This bit indicates on the interrupt that is a result of an error during access to a synchronous display via DI0

IPU Warning - IPU_INT_STAT_5 = 0x00800000

New Frame before end-of-frame error indication of Channel interrupt. This bit is the status bit of New

Frame before end-of-frame error interrupt of Channel #n.

n Indicates the corresponding DMA channel number.

0 Interrupt is cleared.

1 Interrupt is requested.

however,i cannot decice what leads to this warning.can you help to tell me which config maybe connected with this warning??? come on, i just have this question!!!

0 Kudos
1,738 Views
qiang_li-mpu_se
NXP Employee
NXP Employee

I have no other suggestions:

That warning means there is something wrong in your porting. You should locate which of your porting code caused the warning, then we can check why.

You can add debug messages in all functions of ipu_common.c, ipu_disp.c, mxc_ipuv3_fb.c, then add "while(1);" dead loop for some code position one by one, then record a table as followed:

Code position for while(1)                    Result

Line xxx at ipu_disp.c                           Uboot logo keeps on display

...

Line xxx at ipu_disp.c                           Uboot logo disappears, and nothing on display

Then you can narrow down the issue code.

0 Kudos
1,738 Views
尚飞汤
Contributor IV

come on li,i have try your tips ,but i still can not find the root of the warning.

however,i just find the follow :

<6>[    0.861844] mxc_sdc_fb mxc_sdc_fb.0: register mxc display driver ldb

<7>[    0.861919] [aaron]******ldb disp_init

<3>[    0.872093] _regulator_get: get() with no identifier

<7>[    0.872162] [aaron]*****ch018

<7>[    0.872731] [******11111*******]

<7>[    0.872856] [******11111*******]

<7>[    0.872922] [******11111*******]

<7>[    0.872986] [******11111*******]

<7>[    0.873053] [******11111*******]

<7>[    0.873190] mxcfbi->cur_var = 1024

<7>[    0.873254] fb_info->mode->name = LDB-PAT215

<7>[    0.873320] fb_info->mode->sync = 0

<7>[    0.873443] fb_info->mode->vmode = 0

<7>[    0.873507] fb_info->mode->flag = 1

<7>[    0.873792] do_register_framebuffer_logo ret = 0

<7>[    0.873938] [******11111*******]

<7>[    0.874005] [******11111*******]

<7>[    0.874074] [******11111*******]

<6>[    0.874480] mxc_sdc_fb mxc_sdc_fb.1: register mxc display driver hdmi

<3>[    0.874555] mxc_sdc_fb mxc_sdc_fb.1: NO mxc display driver found!

<6>[    0.875287] imx-sdma imx-sdma: loaded firmware 1.1

<6>[    0.879908] imx-sdma imx-sdma: initialized

<6>[    1.022359] Serial: IMX driver

<6>[    1.022600] imx-uart.4: ttymxc4 at MMIO 0x21f4000 (irq = 62) is a IMX

<6>[    1.023150] imx-uart.0: ttymxc0 at MMIO 0x2020000 (irq = 58) is a IMX

<6>[    1.023715] imx-uart.3: ttymxc3 at MMIO 0x21f0000 (irq = 61) is a IMX

<6>[    1.029917] loop: module loaded

<4>[    1.030162] i2c-core: driver [isl29003] using legacy suspend method

<4>[    1.030236] i2c-core: driver [isl29003] using legacy resume method

<7>[    1.030925] /home/aaron/work_place/Pat_215/imx6jb2/kernel_imx/drivers/misc/qdebug.c dev_init done.

<6>[    1.032083] FEC Ethernet Driver

<6>[    1.034731] fec_enet_mii_bus: probed

<4>[    1.040105] ------------[ cut here ]------------

<4>[    1.040247] WARNING: at /home/aaron/work_place/Pat_215/imx6jb2/kernel_imx/drivers/mxc/ipu3/ipu_common.c:2460 ipu_err_irq_handler+0x38/0x154()

<7>[    1.040372] Modules linked in:

<7>[    1.040528] [<c004c9e4>] (unwind_backtrace+0x0/0x138) from [<c008472c>] (warn_slowpath_common+0x4c/0x64)

<7>[    1.040659] [<c008472c>] (warn_slowpath_common+0x4c/0x64) from [<c0084760>] (warn_slowpath_null+0x1c/0x24)

<7>[    1.040789] [<c0084760>] (warn_slowpath_null+0x1c/0x24) from [<c03f42ec>] (ipu_err_irq_handler+0x38/0x154)

<7>[    1.040925] [<c03f42ec>] (ipu_err_irq_handler+0x38/0x154) from [<c00c95b4>] (handle_irq_event_percpu+0x6c/0x2b8)

<7>[    1.041007] [<c00c95b4>] (handle_irq_event_percpu+0x6c/0x2b8) from [<c00c983c>] (handle_irq_event+0x3c/0x5c)

<7>[    1.041138] [<c00c983c>] (handle_irq_event+0x3c/0x5c) from [<c00cbc18>] (handle_fasteoi_irq+0xbc/0x164)

<7>[    1.041269] [<c00cbc18>] (handle_fasteoi_irq+0xbc/0x164) from [<c00c8eec>] (generic_handle_irq+0x2c/0x40)

<7>[    1.041400] [<c00c8eec>] (generic_handle_irq+0x2c/0x40) from [<c00461b0>] (handle_IRQ+0x4c/0xac)

<7>[    1.041528] [<c00461b0>] (handle_IRQ+0x4c/0xac) from [<c004534c>] (__irq_svc+0x4c/0xe8)

<7>[    1.041604] [<c004534c>] (__irq_svc+0x4c/0xe8) from [<c0046468>] (default_idle+0x24/0x28)

<7>[    1.041734] [<c0046468>] (default_idle+0x24/0x28) from [<c0046778>] (cpu_idle+0xc8/0x108)

<7>[    1.041863] [<c0046778>] (cpu_idle+0xc8/0x108) from [<c00088bc>] (start_kernel+0x29c/0x2ec)

<7>[    1.041992] [<c00088bc>] (start_kernel+0x29c/0x2ec) from [<10008040>] (0x10008040)

<4>[    1.042074] ---[ end trace 9af12ae536c31c8a ]---

<4>[    1.042200] imx-ipuv3 imx-ipuv3.0: IPU Warning - IPU_INT_STAT_5 = 0x00800000

<4>[    1.042274] imx-ipuv3 imx-ipuv3.0: IPU Warning - IPU_INT_STAT_10 = 0x00080000

can you give me more tips?please

0 Kudos
1,738 Views
尚飞汤
Contributor IV

。。。。your tips has no meaning just.it is unrealistic to add every function.

thanks~

0 Kudos