@@ -33,10 +33,14 @@
#include <linux/module.h>
#include <linux/delay.h>
#include <linux/slab.h>
+#include <linux/platform_device.h>
#include <video/omapdss.h>
#include <video/omap-panel-generic-dpi.h>
+static struct omap_dss_driver generic_dpi_panel_driver;
+#define to_drv_data(x) container_of(x, struct panel_drv_data, dssdev)
+
struct panel_config {
struct omap_video_timings timings;
@@ -517,12 +521,16 @@ static struct panel_config generic_dpi_panels[] = {
};
struct panel_drv_data {
+ struct omap_dss_device dssdev;
- struct omap_dss_device *dssdev;
-
- struct panel_config *panel_config;
+ const struct panel_config *panel_config;
struct mutex lock;
+
+ const struct panel_generic_dpi_data *pdata;
+
+ const char *name;
+ int data_lines;
};
static inline struct panel_generic_dpi_data
@@ -534,9 +542,9 @@ static inline struct panel_generic_dpi_data
static int generic_dpi_panel_power_on(struct omap_dss_device *dssdev)
{
int r;
- struct panel_generic_dpi_data *panel_data = get_panel_data(dssdev);
- struct panel_drv_data *drv_data = dev_get_drvdata(&dssdev->dev);
- struct panel_config *panel_config = drv_data->panel_config;
+ struct panel_drv_data *drv_data = to_drv_data(dssdev);
+ const struct panel_config *panel_config = drv_data->panel_config;
+ const struct panel_generic_dpi_data *pdata = drv_data->pdata;
if (dssdev->state == OMAP_DSS_DISPLAY_ACTIVE)
return 0;
@@ -552,8 +560,8 @@ static int generic_dpi_panel_power_on(struct omap_dss_device *dssdev)
if (panel_config->power_on_delay)
msleep(panel_config->power_on_delay);
- if (panel_data->platform_enable) {
- r = panel_data->platform_enable(dssdev);
+ if (pdata && pdata->platform_enable) {
+ r = pdata->platform_enable(dssdev);
if (r)
goto err1;
}
@@ -567,15 +575,15 @@ err0:
static void generic_dpi_panel_power_off(struct omap_dss_device *dssdev)
{
- struct panel_generic_dpi_data *panel_data = get_panel_data(dssdev);
- struct panel_drv_data *drv_data = dev_get_drvdata(&dssdev->dev);
- struct panel_config *panel_config = drv_data->panel_config;
+ struct panel_drv_data *drv_data = to_drv_data(dssdev);
+ const struct panel_config *panel_config = drv_data->panel_config;
+ const struct panel_generic_dpi_data *pdata = drv_data->pdata;
if (dssdev->state != OMAP_DSS_DISPLAY_ACTIVE)
return;
- if (panel_data->platform_disable)
- panel_data->platform_disable(dssdev);
+ if (pdata && pdata->platform_disable)
+ pdata->platform_disable(dssdev);
/* wait couple of vsyncs after disabling the LCD */
if (panel_config->power_off_delay)
@@ -584,20 +592,16 @@ static void generic_dpi_panel_power_off(struct omap_dss_device *dssdev)
omapdss_dpi_display_disable(dssdev);
}
-static int generic_dpi_panel_probe(struct omap_dss_device *dssdev)
+static int generic_dpi_panel_probe_pdata(struct platform_device *pdev)
{
- struct panel_generic_dpi_data *panel_data = get_panel_data(dssdev);
+ const struct panel_generic_dpi_data *pdata =
+ dev_get_platdata(&pdev->dev);
+ struct panel_drv_data *drv_data = dev_get_drvdata(&pdev->dev);
struct panel_config *panel_config = NULL;
- struct panel_drv_data *drv_data = NULL;
int i;
- dev_dbg(&dssdev->dev, "probe\n");
-
- if (!panel_data || !panel_data->name)
- return -EINVAL;
-
for (i = 0; i < ARRAY_SIZE(generic_dpi_panels); i++) {
- if (strcmp(panel_data->name, generic_dpi_panels[i].name) == 0) {
+ if (strcmp(pdata->name, generic_dpi_panels[i].name) == 0) {
panel_config = &generic_dpi_panels[i];
break;
}
@@ -606,36 +610,70 @@ static int generic_dpi_panel_probe(struct omap_dss_device *dssdev)
if (!panel_config)
return -EINVAL;
- dssdev->panel.timings = panel_config->timings;
+ drv_data->panel_config = panel_config;
+ drv_data->pdata = pdata;
+ drv_data->name = pdata->display_name;
+ drv_data->data_lines = pdata->data_lines;
- drv_data = kzalloc(sizeof(*drv_data), GFP_KERNEL);
+ return 0;
+}
+
+static int generic_dpi_panel_probe(struct platform_device *pdev)
+{
+ struct panel_drv_data *drv_data;
+ struct omap_dss_device *dssdev;
+ int r;
+
+ dev_dbg(&pdev->dev, "probe\n");
+
+ drv_data = devm_kzalloc(&pdev->dev, sizeof(*drv_data), GFP_KERNEL);
if (!drv_data)
return -ENOMEM;
- drv_data->dssdev = dssdev;
- drv_data->panel_config = panel_config;
+ dev_set_drvdata(&pdev->dev, drv_data);
+
+ if (dev_get_platdata(&pdev->dev)) {
+ r = generic_dpi_panel_probe_pdata(pdev);
+ if (r)
+ return r;
+ } else {
+ return -EINVAL;
+ }
mutex_init(&drv_data->lock);
- dev_set_drvdata(&dssdev->dev, drv_data);
+ dssdev = &drv_data->dssdev;
+ dssdev->driver = &generic_dpi_panel_driver;
+ dssdev->name = drv_data->name;
+ dssdev->phy.dpi.data_lines = drv_data->data_lines;
+ dssdev->panel.timings = drv_data->panel_config->timings;
+ dssdev->panel_dev = &pdev->dev;
+
+ r = omap_dpi_register_panel(dssdev);
+ if (r) {
+ dev_err(&pdev->dev, "Failed to register panel\n");
+ return r;
+ }
return 0;
}
-static void __exit generic_dpi_panel_remove(struct omap_dss_device *dssdev)
+static int __exit generic_dpi_panel_remove(struct platform_device *pdev)
{
- struct panel_drv_data *drv_data = dev_get_drvdata(&dssdev->dev);
+ struct panel_drv_data *drv_data = dev_get_drvdata(&pdev->dev);
- dev_dbg(&dssdev->dev, "remove\n");
+ dev_dbg(&pdev->dev, "remove\n");
- kfree(drv_data);
+ omap_dpi_free_panel(&drv_data->dssdev);
- dev_set_drvdata(&dssdev->dev, NULL);
+ dev_set_drvdata(&pdev->dev, NULL);
+
+ return 0;
}
static int generic_dpi_panel_enable(struct omap_dss_device *dssdev)
{
- struct panel_drv_data *drv_data = dev_get_drvdata(&dssdev->dev);
+ struct panel_drv_data *drv_data = to_drv_data(dssdev);
int r;
mutex_lock(&drv_data->lock);
@@ -653,7 +691,7 @@ err:
static void generic_dpi_panel_disable(struct omap_dss_device *dssdev)
{
- struct panel_drv_data *drv_data = dev_get_drvdata(&dssdev->dev);
+ struct panel_drv_data *drv_data = to_drv_data(dssdev);
mutex_lock(&drv_data->lock);
@@ -667,7 +705,7 @@ static void generic_dpi_panel_disable(struct omap_dss_device *dssdev)
static void generic_dpi_panel_set_timings(struct omap_dss_device *dssdev,
struct omap_video_timings *timings)
{
- struct panel_drv_data *drv_data = dev_get_drvdata(&dssdev->dev);
+ struct panel_drv_data *drv_data = to_drv_data(dssdev);
mutex_lock(&drv_data->lock);
@@ -681,7 +719,7 @@ static void generic_dpi_panel_set_timings(struct omap_dss_device *dssdev,
static void generic_dpi_panel_get_timings(struct omap_dss_device *dssdev,
struct omap_video_timings *timings)
{
- struct panel_drv_data *drv_data = dev_get_drvdata(&dssdev->dev);
+ struct panel_drv_data *drv_data = to_drv_data(dssdev);
mutex_lock(&drv_data->lock);
@@ -693,7 +731,7 @@ static void generic_dpi_panel_get_timings(struct omap_dss_device *dssdev,
static int generic_dpi_panel_check_timings(struct omap_dss_device *dssdev,
struct omap_video_timings *timings)
{
- struct panel_drv_data *drv_data = dev_get_drvdata(&dssdev->dev);
+ struct panel_drv_data *drv_data = to_drv_data(dssdev);
int r;
mutex_lock(&drv_data->lock);
@@ -705,10 +743,7 @@ static int generic_dpi_panel_check_timings(struct omap_dss_device *dssdev,
return r;
}
-static struct omap_dss_driver dpi_driver = {
- .probe = generic_dpi_panel_probe,
- .remove = __exit_p(generic_dpi_panel_remove),
-
+static struct omap_dss_driver generic_dpi_panel_driver = {
.enable = generic_dpi_panel_enable,
.disable = generic_dpi_panel_disable,
@@ -716,22 +751,28 @@ static struct omap_dss_driver dpi_driver = {
.get_timings = generic_dpi_panel_get_timings,
.check_timings = generic_dpi_panel_check_timings,
- .driver = {
- .name = "generic_dpi_panel",
- .owner = THIS_MODULE,
+ .get_resolution = omapdss_default_get_resolution,
+};
+
+static struct platform_driver generic_dpi_panel_platform_driver = {
+ .probe = generic_dpi_panel_probe,
+ .remove = __exit_p(generic_dpi_panel_remove),
+ .driver = {
+ .name = "generic_dpi_panel",
+ .owner = THIS_MODULE,
},
};
-static int __init generic_dpi_panel_drv_init(void)
+static int __init generic_dpi_panel_init(void)
{
- return omap_dss_register_driver(&dpi_driver);
+ return platform_driver_register(&generic_dpi_panel_platform_driver);
}
-static void __exit generic_dpi_panel_drv_exit(void)
+static void __exit generic_dpi_panel_exit(void)
{
- omap_dss_unregister_driver(&dpi_driver);
+ platform_driver_unregister(&generic_dpi_panel_platform_driver);
}
-module_init(generic_dpi_panel_drv_init);
-module_exit(generic_dpi_panel_drv_exit);
+module_init(generic_dpi_panel_init);
+module_exit(generic_dpi_panel_exit);
MODULE_LICENSE("GPL");
Convert panel-generic-dpi driver from omap_dss_driver to a platform driver. The driver uses the new panel support from omapdss. Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com> --- drivers/video/omap2/displays/panel-generic-dpi.c | 141 ++++++++++++++-------- 1 file changed, 91 insertions(+), 50 deletions(-)