gpu:drm:tilcdc: get preferred_bpp value from DT
authorBenoit Parrot <bparrot@ti.com>
Tue, 18 Jun 2013 22:18:31 +0000 (17:18 -0500)
committerDave Airlie <airlied@redhat.com>
Thu, 20 Jun 2013 04:08:01 +0000 (14:08 +1000)
The preferred_bpp value in currently hard-coded to 16.
This causes color corruption on the am335x-evm lcd panel which
requires 32 bpp instead. This changes attempts to use the configured
bpp value from the DT or built-in panel-info struct.

Signed-off-by: Benoit Parrot <bparrot@ti.com>
Acked-by: Rob Clark <robdclark@gmail.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
drivers/gpu/drm/tilcdc/tilcdc_drv.c
drivers/gpu/drm/tilcdc/tilcdc_drv.h
drivers/gpu/drm/tilcdc/tilcdc_panel.c
drivers/gpu/drm/tilcdc/tilcdc_slave.c
drivers/gpu/drm/tilcdc/tilcdc_tfp410.c

index 2b5461bcd9fb9da8fcaa0a980e1a32f9ef4161aa..f2a6528ddef0929346ffdc22560aa6b15fe87200 100644 (file)
@@ -157,7 +157,9 @@ static int tilcdc_load(struct drm_device *dev, unsigned long flags)
        struct platform_device *pdev = dev->platformdev;
        struct device_node *node = pdev->dev.of_node;
        struct tilcdc_drm_private *priv;
+       struct tilcdc_module *mod;
        struct resource *res;
+       u32 bpp = 0;
        int ret;
 
        priv = kzalloc(sizeof(*priv), GFP_KERNEL);
@@ -256,7 +258,15 @@ static int tilcdc_load(struct drm_device *dev, unsigned long flags)
 
        platform_set_drvdata(pdev, dev);
 
-       priv->fbdev = drm_fbdev_cma_init(dev, 16,
+
+       list_for_each_entry(mod, &module_list, list) {
+               DBG("%s: preferred_bpp: %d", mod->name, mod->preferred_bpp);
+               bpp = mod->preferred_bpp;
+               if (bpp > 0)
+                       break;
+       }
+
+       priv->fbdev = drm_fbdev_cma_init(dev, bpp,
                        dev->mode_config.num_crtc,
                        dev->mode_config.num_connector);
 
index 8242b5a4307b92110b9f10bfaf39b9e52be3e4f6..090684341fdb1964e85588e303904ef2495550ad 100644 (file)
@@ -89,6 +89,7 @@ struct tilcdc_module {
        const char *name;
        struct list_head list;
        const struct tilcdc_module_ops *funcs;
+       unsigned int preferred_bpp;
 };
 
 void tilcdc_module_init(struct tilcdc_module *mod, const char *name,
index 09176654fddb9ccc2aba3a697ec58192516c6245..86c67329b6051e0a4f97b457022a1354925d1284 100644 (file)
@@ -393,6 +393,8 @@ static int panel_probe(struct platform_device *pdev)
                goto fail;
        }
 
+       mod->preferred_bpp = panel_mod->info->bpp;
+
        panel_mod->backlight = of_find_backlight_by_node(node);
        if (panel_mod->backlight)
                dev_info(&pdev->dev, "found backlight\n");
index db1d2fc9dfb51dbdb7e066fcab4feee2cc6fcb7c..8bf4fd19181c48df7f697db72cf7f5f1c608e853 100644 (file)
@@ -323,6 +323,8 @@ static int slave_probe(struct platform_device *pdev)
                goto fail;
        }
 
+       mod->preferred_bpp = slave_info.bpp;
+
        i2c_node = of_find_node_by_phandle(i2c_phandle);
        if (!i2c_node) {
                dev_err(&pdev->dev, "could not get i2c bus node\n");
index a36788fbcd98416d37781fe20cf76999b977656a..925c7cddeff9a16e44bb99273e8ff84f784e8b62 100644 (file)
@@ -354,6 +354,8 @@ static int tfp410_probe(struct platform_device *pdev)
                goto fail;
        }
 
+       mod->preferred_bpp = dvi_info.bpp;
+
        i2c_node = of_find_node_by_phandle(i2c_phandle);
        if (!i2c_node) {
                dev_err(&pdev->dev, "could not get i2c bus node\n");