diff options
author | Akshay Bhat <nodeax@gmail.com> | 2012-07-16 22:38:23 -0400 |
---|---|---|
committer | Akshay Bhat <nodeax@gmail.com> | 2012-07-16 22:38:23 -0400 |
commit | 57bf21dda4582d0ca5b4ae0c0593df2f43bfeab7 (patch) | |
tree | 2038d97b3dbb373f62b83f735b1b3b5cbb93cc14 | |
parent | d4db91ab1363105727850fa89fbdddae2dfb0ee1 (diff) |
DCU: DCU unit test integrated, sys class interface bug fixes
-rw-r--r-- | arch/arm/plat-mxc/devices/platform-mvf_dcuv4.c | 2 | ||||
-rw-r--r-- | arch/arm/plat-mxc/include/mach/dcu-v4.h | 2 | ||||
-rw-r--r-- | drivers/mvf/dcu4/dcu4_driver.c | 216 |
3 files changed, 213 insertions, 7 deletions
diff --git a/arch/arm/plat-mxc/devices/platform-mvf_dcuv4.c b/arch/arm/plat-mxc/devices/platform-mvf_dcuv4.c index 3e5623624793..1756cf109246 100644 --- a/arch/arm/plat-mxc/devices/platform-mvf_dcuv4.c +++ b/arch/arm/plat-mxc/devices/platform-mvf_dcuv4.c @@ -51,7 +51,6 @@ void vf600_dcuv4_blank(int id, int enable) { if(id == 0) { - printk("Blanking \n"); //disable pclk mxc_iomux_vmvf_setup_pad(VF6XX_PAD_PAD_110__RGPIOC_GPIO110); //disable backlight @@ -63,7 +62,6 @@ void vf600_dcuv4_blank(int id, int enable) { if(id == 0) { - printk("UnBlanking \n"); //enable pclk mxc_iomux_vmvf_setup_pad(VF6XX_PAD_PAD_110__TCON0_DATA_OUT18); //enable backlight diff --git a/arch/arm/plat-mxc/include/mach/dcu-v4.h b/arch/arm/plat-mxc/include/mach/dcu-v4.h index b0b87eebda1b..a80b7884c0ad 100644 --- a/arch/arm/plat-mxc/include/mach/dcu-v4.h +++ b/arch/arm/plat-mxc/include/mach/dcu-v4.h @@ -128,7 +128,7 @@ typedef enum typedef enum { ALPHA_BLEND_DISABLED = 0, - ALPHA_BLEND_ENABLED + ALPHA_BLEND_ENABLED = 2 }alpha_aa_config; /*! diff --git a/drivers/mvf/dcu4/dcu4_driver.c b/drivers/mvf/dcu4/dcu4_driver.c index 129b9ff2efdb..e6a637cf5f95 100644 --- a/drivers/mvf/dcu4/dcu4_driver.c +++ b/drivers/mvf/dcu4/dcu4_driver.c @@ -53,6 +53,8 @@ #define DCU_UNBLANK 0 #define DCU_BLANK 1 +#define DCU_UNIT_TEST + static struct dcu_soc dcu_array[MVF_DCU_MAX_NUM]; static int g_dcu_hw_rev; static int major; @@ -61,6 +63,8 @@ static uint32_t *tcon0_ctrl1; /* Static functions */ static irqreturn_t dcu_irq_handler(int irq, void *desc); +void dcu_enable_colorbar_mode(struct dcu_soc *dcu); +void dcu_disable_colorbar_mode(struct dcu_soc *dcu); static dcu_bpp_format format_to_layerencoding(uint32_t fmt) { @@ -297,12 +301,21 @@ static int __devinit dcu_clk_setup_enable(struct dcu_soc *dcu, struct platform_device *pdev) { char dcu_clk[] = "dcu0_clk_root"; + char dcu_clk_pg[] = "dcu0_clk"; + struct clk *dcu_clk_pg_base; dcu_clk[3] += pdev->id; + dcu_clk_pg_base = clk_get(dcu->platform_dev, dcu_clk_pg); + if (IS_ERR(dcu_clk_pg_base)) { + dev_err(dcu->platform_dev, "dcu_pg_clk_get failed"); + return PTR_ERR(dcu_clk_pg_base); + } + clk_enable(dcu_clk_pg_base); + dcu->dcu_clk = clk_get(dcu->platform_dev, dcu_clk); if (IS_ERR(dcu->dcu_clk)) { - dev_err(dcu->platform_dev, "clk_get failed"); + dev_err(dcu->platform_dev, "dcu_clk_get failed"); return PTR_ERR(dcu->dcu_clk); } clk_set_rate(dcu->dcu_clk,120000000); @@ -666,6 +679,137 @@ int __devexit dcu_remove(struct platform_device *pdev) return 0; } +#ifdef DCU_UNIT_TEST +static const uint32_t white_color[]= { + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF +}; + +static const uint32_t black_color[]= { + 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 +}; + +void dcu_unit_test_config_display(struct dcu_soc *dcu) +{ + dcu_di_signal_cfg_t sig; + sig.Hsync_pol = 0; + sig.Vsync_pol = 0; + dcu_init_panel(dcu, 11000000, 480, 272, 2, 41, 2, 1, + 2, 1, 0, sig); +} + +void dcu_unit_test(struct dcu_soc *dcu) +{ + dcu_color_t color; + color.color_r = 0xFF; + + //Color bar mode test + dcu_enable_colorbar_mode(dcu); + printk("Colorbar mode enabled\n"); + msleep(5000); + dcu_disable_colorbar_mode(dcu); + printk("Colorbar mode disabled\n"); + msleep(5000); + + //Background color test + dcu_set_bgnd_color(dcu, color); + printk("Background color set to red\n"); + dcu_enable(dcu); + msleep(5000); + color.color_r = 0x00; + color.color_g = 0xFF; + dcu_set_bgnd_color(dcu, color); + printk("Background color set to green\n"); + msleep(5000); + + //Layer test + dcu_init_layer(dcu, 0, + V4L2_PIX_FMT_RGB32, 16, 16, + (dma_addr_t)black_color, + 0, 0); + dcu_enable_layer(dcu,0); + printk("Layer 0 enabled, 16x16 Black square @top left corner\n"); + msleep(5000); + dcu_init_layer(dcu, 1, + V4L2_PIX_FMT_RGB32, 16, 16, + (dma_addr_t)black_color, + 16, 16); + dcu_enable_layer(dcu,1); + printk("Layer 1 enabled, 16x16 Black square @offset 16x16 from top left corner\n"); + msleep(5000); + dcu_set_layer_position(dcu, 1, 32,32); + printk("Layer 1 position now @offset 32x32 from top left corner\n"); + dcu_update_layer_buffer(dcu, 1, (dma_addr_t)white_color); + printk("Layer 1 image updated to white color\n"); + msleep(5000); + dcu_config_layer_alpha(dcu, 1, 0x3F, ALPHA_BLEND_ENABLED); + printk("Layer 1 alpha set to 0x3F\n"); + msleep(5000); + + //Test enable disable of DCU and layer + dcu_disable(dcu); + printk("DCU disabled\n"); + msleep(5000); + printk("DCU enabled\n"); + dcu_enable(dcu); + msleep(5000); + dcu_disable_layer(dcu, 1, 0); + dcu_uninit_layer(dcu, 1); + printk("Layer 1 disabled and uninit\n"); + msleep(5000); + dcu_disable_layer(dcu, 0, 0); + dcu_uninit_layer(dcu, 0); + printk("Layer 0 disabled and uninit\n"); + dcu_disable(dcu); + printk("DCU disabled\n"); +} +#endif + void dcu_dump_registers(struct dcu_soc *dcu) { /* Display related */ @@ -1577,7 +1721,22 @@ static ssize_t get_dcu_colorbar_state(struct device *dev, struct device_attribute *attr, char *buf) { uint32_t reg; - struct dcu_soc *dcu = container_of(dev, struct dcu_soc, dcu_cdev); + struct dcu_soc *dcu = &dcu_array[0]; + int i; + + if(dcu->display_configured == false) + { + return sprintf(buf, "Display currently not configured\n"); + } + + for(i=0; i<MVF_DCU_MAX_NUM; i++) + { + if(dcu_array[i].dcu_cdev == dev) + { + dcu = &dcu_array[i]; + break; + } + } _dcu_lock(dcu); reg = dcu_read(dcu, DCU_DCU_MODE_OFFSET); @@ -1595,8 +1754,27 @@ static ssize_t set_dcu_colorbar_state(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { - struct dcu_soc *dcu = container_of(dev, struct dcu_soc, dcu_cdev); - int colorbarmode, r; + struct dcu_soc *dcu = &dcu_array[0]; + int colorbarmode, r,i; + + for(i=0; i<MVF_DCU_MAX_NUM; i++) + { + if(dcu_array[i].dcu_cdev == dev) + { + dcu = &dcu_array[i]; + break; + } + } + + if(dcu->display_configured == false) + { +#ifdef DCU_UNIT_TEST + dcu_unit_test_config_display(dcu); +#else + printk("Display currently not configured\n"); + return count; +#endif + } r = kstrtoint(buf, 0, &colorbarmode); if (r) @@ -1612,8 +1790,38 @@ static ssize_t set_dcu_colorbar_state(struct device *dev, } DEVICE_ATTR(dcu_colorbar_mode, 0644, get_dcu_colorbar_state, set_dcu_colorbar_state); +#ifdef DCU_UNIT_TEST +static ssize_t perform_dcu_unit_test(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct dcu_soc *dcu = &dcu_array[0]; + int i; + + for(i=0; i<MVF_DCU_MAX_NUM; i++) + { + if(dcu_array[i].dcu_cdev == dev) + { + dcu = &dcu_array[i]; + break; + } + } + + if(dcu->display_configured == false) + { + dcu_unit_test_config_display(dcu); + } + dcu_unit_test(dcu); + return count; +} +DEVICE_ATTR(dcu_unit_test, 0644, NULL, perform_dcu_unit_test); +#endif + static struct device_attribute *dcu_sysfs_attrs[] = { &dev_attr_dcu_colorbar_mode, +#ifdef DCU_UNIT_TEST + &dev_attr_dcu_unit_test, +#endif NULL }; |