summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAkshay Bhat <nodeax@gmail.com>2012-07-16 22:38:23 -0400
committerAkshay Bhat <nodeax@gmail.com>2012-07-16 22:38:23 -0400
commit57bf21dda4582d0ca5b4ae0c0593df2f43bfeab7 (patch)
tree2038d97b3dbb373f62b83f735b1b3b5cbb93cc14
parentd4db91ab1363105727850fa89fbdddae2dfb0ee1 (diff)
DCU: DCU unit test integrated, sys class interface bug fixes
-rw-r--r--arch/arm/plat-mxc/devices/platform-mvf_dcuv4.c2
-rw-r--r--arch/arm/plat-mxc/include/mach/dcu-v4.h2
-rw-r--r--drivers/mvf/dcu4/dcu4_driver.c216
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
};