Convert Taal 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@xxxxxx> --- drivers/video/omap2/displays/panel-taal.c | 294 +++++++++++++++++------------ 1 file changed, 173 insertions(+), 121 deletions(-) diff --git a/drivers/video/omap2/displays/panel-taal.c b/drivers/video/omap2/displays/panel-taal.c index 2fc923d..01de2a9 100644 --- a/drivers/video/omap2/displays/panel-taal.c +++ b/drivers/video/omap2/displays/panel-taal.c @@ -31,6 +31,7 @@ #include <linux/workqueue.h> #include <linux/slab.h> #include <linux/mutex.h> +#include <linux/platform_device.h> #include <video/omapdss.h> #include <video/omap-panel-nokia-dsi.h> @@ -55,6 +56,9 @@ static int _taal_enable_te(struct omap_dss_device *dssdev, bool enable); static int taal_panel_reset(struct omap_dss_device *dssdev); struct taal_data { + struct omap_dss_device dssdev; + struct platform_device *pdev; + struct mutex lock; struct backlight_device *bldev; @@ -64,7 +68,7 @@ struct taal_data { */ unsigned long hw_guard_wait; /* max guard time in jiffies */ - struct omap_dss_device *dssdev; + struct omap_dss_output *src; /* panel HW configuration from DT or platform data */ int reset_gpio; @@ -99,6 +103,10 @@ struct taal_data { struct delayed_work ulps_work; }; +static struct omap_dss_driver taal_driver; + +#define to_panel_data(x) container_of(x, struct taal_data, dssdev) + static void taal_esd_work(struct work_struct *work); static void taal_ulps_work(struct work_struct *work); @@ -123,7 +131,7 @@ static int taal_dcs_read_1(struct taal_data *td, u8 dcs_cmd, u8 *data) int r; u8 buf[1]; - r = dsi_vc_dcs_read(td->dssdev, td->channel, dcs_cmd, buf, 1); + r = dsi_vc_dcs_read(&td->dssdev, td->channel, dcs_cmd, buf, 1); if (r < 0) return r; @@ -135,7 +143,7 @@ static int taal_dcs_read_1(struct taal_data *td, u8 dcs_cmd, u8 *data) static int taal_dcs_write_0(struct taal_data *td, u8 dcs_cmd) { - return dsi_vc_dcs_write(td->dssdev, td->channel, &dcs_cmd, 1); + return dsi_vc_dcs_write(&td->dssdev, td->channel, &dcs_cmd, 1); } static int taal_dcs_write_1(struct taal_data *td, u8 dcs_cmd, u8 param) @@ -143,7 +151,7 @@ static int taal_dcs_write_1(struct taal_data *td, u8 dcs_cmd, u8 param) u8 buf[2]; buf[0] = dcs_cmd; buf[1] = param; - return dsi_vc_dcs_write(td->dssdev, td->channel, buf, 2); + return dsi_vc_dcs_write(&td->dssdev, td->channel, buf, 2); } static int taal_sleep_in(struct taal_data *td) @@ -155,7 +163,7 @@ static int taal_sleep_in(struct taal_data *td) hw_guard_wait(td); cmd = MIPI_DCS_ENTER_SLEEP_MODE; - r = dsi_vc_dcs_write_nosync(td->dssdev, td->channel, &cmd, 1); + r = dsi_vc_dcs_write_nosync(&td->dssdev, td->channel, &cmd, 1); if (r) return r; @@ -216,7 +224,7 @@ static int taal_set_update_window(struct taal_data *td, buf[3] = (x2 >> 8) & 0xff; buf[4] = (x2 >> 0) & 0xff; - r = dsi_vc_dcs_write_nosync(td->dssdev, td->channel, buf, sizeof(buf)); + r = dsi_vc_dcs_write_nosync(&td->dssdev, td->channel, buf, sizeof(buf)); if (r) return r; @@ -226,18 +234,18 @@ static int taal_set_update_window(struct taal_data *td, buf[3] = (y2 >> 8) & 0xff; buf[4] = (y2 >> 0) & 0xff; - r = dsi_vc_dcs_write_nosync(td->dssdev, td->channel, buf, sizeof(buf)); + r = dsi_vc_dcs_write_nosync(&td->dssdev, td->channel, buf, sizeof(buf)); if (r) return r; - dsi_vc_send_bta_sync(td->dssdev, td->channel); + dsi_vc_send_bta_sync(&td->dssdev, td->channel); return r; } static void taal_queue_esd_work(struct omap_dss_device *dssdev) { - struct taal_data *td = dev_get_drvdata(&dssdev->dev); + struct taal_data *td = to_panel_data(dssdev); if (td->esd_interval > 0) queue_delayed_work(td->workqueue, &td->esd_work, @@ -246,14 +254,14 @@ static void taal_queue_esd_work(struct omap_dss_device *dssdev) static void taal_cancel_esd_work(struct omap_dss_device *dssdev) { - struct taal_data *td = dev_get_drvdata(&dssdev->dev); + struct taal_data *td = to_panel_data(dssdev); cancel_delayed_work(&td->esd_work); } static void taal_queue_ulps_work(struct omap_dss_device *dssdev) { - struct taal_data *td = dev_get_drvdata(&dssdev->dev); + struct taal_data *td = to_panel_data(dssdev); if (td->ulps_timeout > 0) queue_delayed_work(td->workqueue, &td->ulps_work, @@ -262,14 +270,14 @@ static void taal_queue_ulps_work(struct omap_dss_device *dssdev) static void taal_cancel_ulps_work(struct omap_dss_device *dssdev) { - struct taal_data *td = dev_get_drvdata(&dssdev->dev); + struct taal_data *td = to_panel_data(dssdev); cancel_delayed_work(&td->ulps_work); } static int taal_enter_ulps(struct omap_dss_device *dssdev) { - struct taal_data *td = dev_get_drvdata(&dssdev->dev); + struct taal_data *td = to_panel_data(dssdev); int r; if (td->ulps_enabled) @@ -291,7 +299,7 @@ static int taal_enter_ulps(struct omap_dss_device *dssdev) return 0; err: - dev_err(&dssdev->dev, "enter ULPS failed"); + dev_err(&td->pdev->dev, "enter ULPS failed"); taal_panel_reset(dssdev); td->ulps_enabled = false; @@ -303,7 +311,7 @@ err: static int taal_exit_ulps(struct omap_dss_device *dssdev) { - struct taal_data *td = dev_get_drvdata(&dssdev->dev); + struct taal_data *td = to_panel_data(dssdev); int r; if (!td->ulps_enabled) @@ -311,7 +319,7 @@ static int taal_exit_ulps(struct omap_dss_device *dssdev) r = omapdss_dsi_display_enable(dssdev); if (r) { - dev_err(&dssdev->dev, "failed to enable DSI\n"); + dev_err(&td->pdev->dev, "failed to enable DSI\n"); goto err1; } @@ -319,7 +327,7 @@ static int taal_exit_ulps(struct omap_dss_device *dssdev) r = _taal_enable_te(dssdev, true); if (r) { - dev_err(&dssdev->dev, "failed to re-enable TE"); + dev_err(&td->pdev->dev, "failed to re-enable TE"); goto err2; } @@ -333,7 +341,7 @@ static int taal_exit_ulps(struct omap_dss_device *dssdev) return 0; err2: - dev_err(&dssdev->dev, "failed to exit ULPS"); + dev_err(&td->pdev->dev, "failed to exit ULPS"); r = taal_panel_reset(dssdev); if (!r) { @@ -349,7 +357,7 @@ err1: static int taal_wake_up(struct omap_dss_device *dssdev) { - struct taal_data *td = dev_get_drvdata(&dssdev->dev); + struct taal_data *td = to_panel_data(dssdev); if (td->ulps_enabled) return taal_exit_ulps(dssdev); @@ -362,7 +370,7 @@ static int taal_wake_up(struct omap_dss_device *dssdev) static int taal_bl_update_status(struct backlight_device *dev) { struct omap_dss_device *dssdev = dev_get_drvdata(&dev->dev); - struct taal_data *td = dev_get_drvdata(&dssdev->dev); + struct taal_data *td = to_panel_data(dssdev); int r; int level; @@ -372,7 +380,7 @@ static int taal_bl_update_status(struct backlight_device *dev) else level = 0; - dev_dbg(&dssdev->dev, "update brightness to %d\n", level); + dev_dbg(&td->pdev->dev, "update brightness to %d\n", level); mutex_lock(&td->lock); @@ -417,8 +425,10 @@ static void taal_get_resolution(struct omap_dss_device *dssdev, static ssize_t taal_num_errors_show(struct device *dev, struct device_attribute *attr, char *buf) { - struct omap_dss_device *dssdev = to_dss_device(dev); - struct taal_data *td = dev_get_drvdata(&dssdev->dev); + + struct platform_device *pdev = to_platform_device(dev); + struct taal_data *td = dev_get_drvdata(&pdev->dev); + struct omap_dss_device *dssdev = &td->dssdev; u8 errors = 0; int r; @@ -447,8 +457,9 @@ static ssize_t taal_num_errors_show(struct device *dev, static ssize_t taal_hw_revision_show(struct device *dev, struct device_attribute *attr, char *buf) { - struct omap_dss_device *dssdev = to_dss_device(dev); - struct taal_data *td = dev_get_drvdata(&dssdev->dev); + struct platform_device *pdev = to_platform_device(dev); + struct taal_data *td = dev_get_drvdata(&pdev->dev); + struct omap_dss_device *dssdev = &td->dssdev; u8 id1, id2, id3; int r; @@ -485,8 +496,8 @@ static ssize_t show_cabc_mode(struct device *dev, struct device_attribute *attr, char *buf) { - struct omap_dss_device *dssdev = to_dss_device(dev); - struct taal_data *td = dev_get_drvdata(&dssdev->dev); + struct platform_device *pdev = to_platform_device(dev); + struct taal_data *td = dev_get_drvdata(&pdev->dev); const char *mode_str; int mode; int len; @@ -505,8 +516,9 @@ static ssize_t store_cabc_mode(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { - struct omap_dss_device *dssdev = to_dss_device(dev); - struct taal_data *td = dev_get_drvdata(&dssdev->dev); + struct platform_device *pdev = to_platform_device(dev); + struct taal_data *td = dev_get_drvdata(&pdev->dev); + struct omap_dss_device *dssdev = &td->dssdev; int i; int r; @@ -567,8 +579,9 @@ static ssize_t taal_store_esd_interval(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { - struct omap_dss_device *dssdev = to_dss_device(dev); - struct taal_data *td = dev_get_drvdata(&dssdev->dev); + struct platform_device *pdev = to_platform_device(dev); + struct taal_data *td = dev_get_drvdata(&pdev->dev); + struct omap_dss_device *dssdev = &td->dssdev; unsigned long t; int r; @@ -591,8 +604,8 @@ static ssize_t taal_show_esd_interval(struct device *dev, struct device_attribute *attr, char *buf) { - struct omap_dss_device *dssdev = to_dss_device(dev); - struct taal_data *td = dev_get_drvdata(&dssdev->dev); + struct platform_device *pdev = to_platform_device(dev); + struct taal_data *td = dev_get_drvdata(&pdev->dev); unsigned t; mutex_lock(&td->lock); @@ -606,8 +619,9 @@ static ssize_t taal_store_ulps(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { - struct omap_dss_device *dssdev = to_dss_device(dev); - struct taal_data *td = dev_get_drvdata(&dssdev->dev); + struct platform_device *pdev = to_platform_device(dev); + struct taal_data *td = dev_get_drvdata(&pdev->dev); + struct omap_dss_device *dssdev = &td->dssdev; unsigned long t; int r; @@ -640,8 +654,8 @@ static ssize_t taal_show_ulps(struct device *dev, struct device_attribute *attr, char *buf) { - struct omap_dss_device *dssdev = to_dss_device(dev); - struct taal_data *td = dev_get_drvdata(&dssdev->dev); + struct platform_device *pdev = to_platform_device(dev); + struct taal_data *td = dev_get_drvdata(&pdev->dev); unsigned t; mutex_lock(&td->lock); @@ -655,8 +669,9 @@ static ssize_t taal_store_ulps_timeout(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { - struct omap_dss_device *dssdev = to_dss_device(dev); - struct taal_data *td = dev_get_drvdata(&dssdev->dev); + struct platform_device *pdev = to_platform_device(dev); + struct taal_data *td = dev_get_drvdata(&pdev->dev); + struct omap_dss_device *dssdev = &td->dssdev; unsigned long t; int r; @@ -686,8 +701,8 @@ static ssize_t taal_show_ulps_timeout(struct device *dev, struct device_attribute *attr, char *buf) { - struct omap_dss_device *dssdev = to_dss_device(dev); - struct taal_data *td = dev_get_drvdata(&dssdev->dev); + struct platform_device *pdev = to_platform_device(dev); + struct taal_data *td = dev_get_drvdata(&pdev->dev); unsigned t; mutex_lock(&td->lock); @@ -727,7 +742,7 @@ static struct attribute_group taal_attr_group = { static void taal_hw_reset(struct omap_dss_device *dssdev) { - struct taal_data *td = dev_get_drvdata(&dssdev->dev); + struct taal_data *td = to_panel_data(dssdev); if (!gpio_is_valid(td->reset_gpio)) return; @@ -743,9 +758,17 @@ static void taal_hw_reset(struct omap_dss_device *dssdev) msleep(5); } -static void taal_probe_pdata(struct taal_data *td, - const struct nokia_dsi_panel_data *pdata) +static int taal_probe_pdata(struct platform_device *pdev) { + const struct nokia_dsi_panel_data *pdata = dev_get_platdata(&pdev->dev); + struct taal_data *td = dev_get_drvdata(&pdev->dev); + + td->src = omap_dss_find_output(pdata->source); + if (!td->src) { + dev_err(&pdev->dev, "Failed to find video source\n"); + return -ENODEV; + } + td->reset_gpio = pdata->reset_gpio; if (pdata->use_ext_te) @@ -759,32 +782,44 @@ static void taal_probe_pdata(struct taal_data *td, td->use_dsi_backlight = pdata->use_dsi_backlight; td->pin_config = pdata->pin_config; + + td->dssdev.name = pdata->name; + + return 0; } -static int taal_probe(struct omap_dss_device *dssdev) +static int taal_probe(struct platform_device *pdev) { + const struct nokia_dsi_panel_data *pdata = dev_get_platdata(&pdev->dev); + struct omap_dss_device *dssdev; struct backlight_properties props; struct taal_data *td; struct backlight_device *bldev = NULL; int r; - dev_dbg(&dssdev->dev, "probe\n"); + dev_dbg(&pdev->dev, "probe\n"); - td = devm_kzalloc(&dssdev->dev, sizeof(*td), GFP_KERNEL); + td = devm_kzalloc(&pdev->dev, sizeof(*td), GFP_KERNEL); if (!td) return -ENOMEM; - dev_set_drvdata(&dssdev->dev, td); - td->dssdev = dssdev; + td->pdev = pdev; - if (dssdev->data) { - const struct nokia_dsi_panel_data *pdata = dssdev->data; + dev_set_drvdata(&pdev->dev, td); - taal_probe_pdata(td, pdata); + if (pdata) { + r = taal_probe_pdata(pdev); + if (r) { + dev_err(&pdev->dev, "failed to read platform data\n"); + return r; + } } else { return -ENODEV; } + dssdev = &td->dssdev; + dssdev->driver = &taal_driver; + dssdev->panel_dev = &pdev->dev; dssdev->panel.timings.x_res = 864; dssdev->panel.timings.y_res = 480; dssdev->panel.timings.pixel_clock = DIV_ROUND_UP(864 * 480 * 60, 1000); @@ -792,46 +827,55 @@ static int taal_probe(struct omap_dss_device *dssdev) dssdev->caps = OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE | OMAP_DSS_DISPLAY_CAP_TEAR_ELIM; + dev_set_drvdata(&pdev->dev, td); + + + r = omap_dsi_register_panel(dssdev, td->src); + if (r) { + dev_err(&pdev->dev, "Failed to register panel\n"); + return r; + } + mutex_init(&td->lock); atomic_set(&td->do_update, 0); if (gpio_is_valid(td->reset_gpio)) { - r = devm_gpio_request_one(&dssdev->dev, td->reset_gpio, + r = devm_gpio_request_one(&pdev->dev, td->reset_gpio, GPIOF_OUT_INIT_LOW, "taal rst"); if (r) { - dev_err(&dssdev->dev, "failed to request reset gpio\n"); + dev_err(&pdev->dev, "failed to request reset gpio\n"); return r; } } if (gpio_is_valid(td->ext_te_gpio)) { - r = devm_gpio_request_one(&dssdev->dev, td->ext_te_gpio, + r = devm_gpio_request_one(&pdev->dev, td->ext_te_gpio, GPIOF_IN, "taal irq"); if (r) { - dev_err(&dssdev->dev, "GPIO request failed\n"); + dev_err(&pdev->dev, "GPIO request failed\n"); return r; } - r = devm_request_irq(&dssdev->dev, gpio_to_irq(td->ext_te_gpio), + r = devm_request_irq(&pdev->dev, gpio_to_irq(td->ext_te_gpio), taal_te_isr, IRQF_TRIGGER_RISING, "taal vsync", dssdev); if (r) { - dev_err(&dssdev->dev, "IRQ request failed\n"); + dev_err(&pdev->dev, "IRQ request failed\n"); return r; } INIT_DEFERRABLE_WORK(&td->te_timeout_work, taal_te_timeout_work_callback); - dev_dbg(&dssdev->dev, "Using GPIO TE\n"); + dev_dbg(&pdev->dev, "Using GPIO TE\n"); } td->workqueue = create_singlethread_workqueue("taal_esd"); if (td->workqueue == NULL) { - dev_err(&dssdev->dev, "can't create ESD workqueue\n"); + dev_err(&pdev->dev, "can't create ESD workqueue\n"); return -ENOMEM; } INIT_DEFERRABLE_WORK(&td->esd_work, taal_esd_work); @@ -844,8 +888,8 @@ static int taal_probe(struct omap_dss_device *dssdev) props.max_brightness = 255; props.type = BACKLIGHT_RAW; - bldev = backlight_device_register(dev_name(&dssdev->dev), - &dssdev->dev, dssdev, &taal_bl_ops, &props); + bldev = backlight_device_register(dev_name(&pdev->dev), + &pdev->dev, dssdev, &taal_bl_ops, &props); if (IS_ERR(bldev)) { r = PTR_ERR(bldev); goto err_bl; @@ -862,19 +906,19 @@ static int taal_probe(struct omap_dss_device *dssdev) r = omap_dsi_request_vc(dssdev, &td->channel); if (r) { - dev_err(&dssdev->dev, "failed to get virtual channel\n"); + dev_err(&pdev->dev, "failed to get virtual channel\n"); goto err_req_vc; } r = omap_dsi_set_vc_id(dssdev, td->channel, TCH); if (r) { - dev_err(&dssdev->dev, "failed to set VC_ID\n"); + dev_err(&pdev->dev, "failed to set VC_ID\n"); goto err_vc_id; } - r = sysfs_create_group(&dssdev->dev.kobj, &taal_attr_group); + r = sysfs_create_group(&pdev->dev.kobj, &taal_attr_group); if (r) { - dev_err(&dssdev->dev, "failed to create sysfs files\n"); + dev_err(&pdev->dev, "failed to create sysfs files\n"); goto err_vc_id; } @@ -890,14 +934,15 @@ err_bl: return r; } -static void __exit taal_remove(struct omap_dss_device *dssdev) +static int __exit taal_remove(struct platform_device *pdev) { - struct taal_data *td = dev_get_drvdata(&dssdev->dev); + struct taal_data *td = dev_get_drvdata(&pdev->dev); + struct omap_dss_device *dssdev = &td->dssdev; struct backlight_device *bldev; - dev_dbg(&dssdev->dev, "remove\n"); + dev_dbg(&pdev->dev, "remove\n"); - sysfs_remove_group(&dssdev->dev.kobj, &taal_attr_group); + sysfs_remove_group(&pdev->dev.kobj, &taal_attr_group); omap_dsi_release_vc(dssdev, td->channel); bldev = td->bldev; @@ -913,11 +958,15 @@ static void __exit taal_remove(struct omap_dss_device *dssdev) /* reset, to be sure that the panel is in a valid state */ taal_hw_reset(dssdev); + + omap_dsi_free_panel(&td->dssdev); + + return 0; } static int taal_power_on(struct omap_dss_device *dssdev) { - struct taal_data *td = dev_get_drvdata(&dssdev->dev); + struct taal_data *td = to_panel_data(dssdev); u8 id1, id2, id3; int r; struct omap_dss_dsi_config dsi_config = { @@ -932,19 +981,19 @@ static int taal_power_on(struct omap_dss_device *dssdev) r = omapdss_dsi_configure_pins(dssdev, &td->pin_config); if (r) { - dev_err(&dssdev->dev, "failed to configure DSI pins\n"); + dev_err(&td->pdev->dev, "failed to configure DSI pins\n"); goto err0; }; r = omapdss_dsi_set_config(dssdev, &dsi_config); if (r) { - dev_err(&dssdev->dev, "failed to configure DSI\n"); + dev_err(&td->pdev->dev, "failed to configure DSI\n"); goto err0; } r = omapdss_dsi_display_enable(dssdev); if (r) { - dev_err(&dssdev->dev, "failed to enable DSI\n"); + dev_err(&td->pdev->dev, "failed to enable DSI\n"); goto err0; } @@ -999,10 +1048,10 @@ static int taal_power_on(struct omap_dss_device *dssdev) td->enabled = 1; if (!td->intro_printed) { - dev_info(&dssdev->dev, "panel revision %02x.%02x.%02x\n", + dev_info(&td->pdev->dev, "panel revision %02x.%02x.%02x\n", id1, id2, id3); if (td->cabc_broken) - dev_info(&dssdev->dev, + dev_info(&td->pdev->dev, "old Taal version, CABC disabled\n"); td->intro_printed = true; } @@ -1011,7 +1060,7 @@ static int taal_power_on(struct omap_dss_device *dssdev) return 0; err: - dev_err(&dssdev->dev, "error while enabling panel, issuing HW reset\n"); + dev_err(&td->pdev->dev, "error while enabling panel, issuing HW reset\n"); taal_hw_reset(dssdev); @@ -1022,7 +1071,7 @@ err0: static void taal_power_off(struct omap_dss_device *dssdev) { - struct taal_data *td = dev_get_drvdata(&dssdev->dev); + struct taal_data *td = to_panel_data(dssdev); int r; dsi_disable_video_output(dssdev, td->channel); @@ -1032,7 +1081,7 @@ static void taal_power_off(struct omap_dss_device *dssdev) r = taal_sleep_in(td); if (r) { - dev_err(&dssdev->dev, + dev_err(&td->pdev->dev, "error disabling panel, issuing HW reset\n"); taal_hw_reset(dssdev); } @@ -1044,7 +1093,9 @@ static void taal_power_off(struct omap_dss_device *dssdev) static int taal_panel_reset(struct omap_dss_device *dssdev) { - dev_err(&dssdev->dev, "performing LCD reset\n"); + struct taal_data *td = to_panel_data(dssdev); + + dev_err(&td->pdev->dev, "performing LCD reset\n"); taal_power_off(dssdev); taal_hw_reset(dssdev); @@ -1053,10 +1104,10 @@ static int taal_panel_reset(struct omap_dss_device *dssdev) static int taal_enable(struct omap_dss_device *dssdev) { - struct taal_data *td = dev_get_drvdata(&dssdev->dev); + struct taal_data *td = to_panel_data(dssdev); int r; - dev_dbg(&dssdev->dev, "enable\n"); + dev_dbg(&td->pdev->dev, "enable\n"); mutex_lock(&td->lock); @@ -1082,16 +1133,16 @@ static int taal_enable(struct omap_dss_device *dssdev) return 0; err: - dev_dbg(&dssdev->dev, "enable failed\n"); + dev_dbg(&td->pdev->dev, "enable failed\n"); mutex_unlock(&td->lock); return r; } static void taal_disable(struct omap_dss_device *dssdev) { - struct taal_data *td = dev_get_drvdata(&dssdev->dev); + struct taal_data *td = to_panel_data(dssdev); - dev_dbg(&dssdev->dev, "disable\n"); + dev_dbg(&td->pdev->dev, "disable\n"); mutex_lock(&td->lock); @@ -1118,14 +1169,16 @@ static void taal_disable(struct omap_dss_device *dssdev) static void taal_framedone_cb(int err, void *data) { struct omap_dss_device *dssdev = data; - dev_dbg(&dssdev->dev, "framedone, err %d\n", err); + struct taal_data *td = to_panel_data(dssdev); + + dev_dbg(&td->pdev->dev, "framedone, err %d\n", err); dsi_bus_unlock(dssdev); } static irqreturn_t taal_te_isr(int irq, void *data) { struct omap_dss_device *dssdev = data; - struct taal_data *td = dev_get_drvdata(&dssdev->dev); + struct taal_data *td = to_panel_data(dssdev); int old; int r; @@ -1142,7 +1195,7 @@ static irqreturn_t taal_te_isr(int irq, void *data) return IRQ_HANDLED; err: - dev_err(&dssdev->dev, "start update failed\n"); + dev_err(&td->pdev->dev, "start update failed\n"); dsi_bus_unlock(dssdev); return IRQ_HANDLED; } @@ -1151,9 +1204,9 @@ static void taal_te_timeout_work_callback(struct work_struct *work) { struct taal_data *td = container_of(work, struct taal_data, te_timeout_work.work); - struct omap_dss_device *dssdev = td->dssdev; + struct omap_dss_device *dssdev = &td->dssdev; - dev_err(&dssdev->dev, "TE not received for 250ms!\n"); + dev_err(&td->pdev->dev, "TE not received for 250ms!\n"); atomic_set(&td->do_update, 0); dsi_bus_unlock(dssdev); @@ -1162,10 +1215,10 @@ static void taal_te_timeout_work_callback(struct work_struct *work) static int taal_update(struct omap_dss_device *dssdev, u16 x, u16 y, u16 w, u16 h) { - struct taal_data *td = dev_get_drvdata(&dssdev->dev); + struct taal_data *td = to_panel_data(dssdev); int r; - dev_dbg(&dssdev->dev, "update %d, %d, %d x %d\n", x, y, w, h); + dev_dbg(&td->pdev->dev, "update %d, %d, %d x %d\n", x, y, w, h); mutex_lock(&td->lock); dsi_bus_lock(dssdev); @@ -1208,23 +1261,23 @@ err: static int taal_sync(struct omap_dss_device *dssdev) { - struct taal_data *td = dev_get_drvdata(&dssdev->dev); + struct taal_data *td = to_panel_data(dssdev); - dev_dbg(&dssdev->dev, "sync\n"); + dev_dbg(&td->pdev->dev, "sync\n"); mutex_lock(&td->lock); dsi_bus_lock(dssdev); dsi_bus_unlock(dssdev); mutex_unlock(&td->lock); - dev_dbg(&dssdev->dev, "sync done\n"); + dev_dbg(&td->pdev->dev, "sync done\n"); return 0; } static int _taal_enable_te(struct omap_dss_device *dssdev, bool enable) { - struct taal_data *td = dev_get_drvdata(&dssdev->dev); + struct taal_data *td = to_panel_data(dssdev); int r; if (enable) @@ -1243,7 +1296,7 @@ static int _taal_enable_te(struct omap_dss_device *dssdev, bool enable) static int taal_enable_te(struct omap_dss_device *dssdev, bool enable) { - struct taal_data *td = dev_get_drvdata(&dssdev->dev); + struct taal_data *td = to_panel_data(dssdev); int r; mutex_lock(&td->lock); @@ -1279,7 +1332,7 @@ err: static int taal_get_te(struct omap_dss_device *dssdev) { - struct taal_data *td = dev_get_drvdata(&dssdev->dev); + struct taal_data *td = to_panel_data(dssdev); int r; mutex_lock(&td->lock); @@ -1291,7 +1344,7 @@ static int taal_get_te(struct omap_dss_device *dssdev) static int taal_run_test(struct omap_dss_device *dssdev, int test_num) { - struct taal_data *td = dev_get_drvdata(&dssdev->dev); + struct taal_data *td = to_panel_data(dssdev); u8 id1, id2, id3; int r; @@ -1336,7 +1389,7 @@ static int taal_memory_read(struct omap_dss_device *dssdev, int first = 1; int plen; unsigned buf_used = 0; - struct taal_data *td = dev_get_drvdata(&dssdev->dev); + struct taal_data *td = to_panel_data(dssdev); if (size < w * h * 3) return -ENOMEM; @@ -1380,19 +1433,19 @@ static int taal_memory_read(struct omap_dss_device *dssdev, buf + buf_used, size - buf_used); if (r < 0) { - dev_err(&dssdev->dev, "read error\n"); + dev_err(&td->pdev->dev, "read error\n"); goto err3; } buf_used += r; if (r < plen) { - dev_err(&dssdev->dev, "short read\n"); + dev_err(&td->pdev->dev, "short read\n"); break; } if (signal_pending(current)) { - dev_err(&dssdev->dev, "signal pending, " + dev_err(&td->pdev->dev, "signal pending, " "aborting memory read\n"); r = -ERESTARTSYS; goto err3; @@ -1414,7 +1467,7 @@ static void taal_ulps_work(struct work_struct *work) { struct taal_data *td = container_of(work, struct taal_data, ulps_work.work); - struct omap_dss_device *dssdev = td->dssdev; + struct omap_dss_device *dssdev = &td->dssdev; mutex_lock(&td->lock); @@ -1435,7 +1488,7 @@ static void taal_esd_work(struct work_struct *work) { struct taal_data *td = container_of(work, struct taal_data, esd_work.work); - struct omap_dss_device *dssdev = td->dssdev; + struct omap_dss_device *dssdev = &td->dssdev; u8 state1, state2; int r; @@ -1450,26 +1503,26 @@ static void taal_esd_work(struct work_struct *work) r = taal_wake_up(dssdev); if (r) { - dev_err(&dssdev->dev, "failed to exit ULPS\n"); + dev_err(&td->pdev->dev, "failed to exit ULPS\n"); goto err; } r = taal_dcs_read_1(td, MIPI_DCS_GET_DIAGNOSTIC_RESULT, &state1); if (r) { - dev_err(&dssdev->dev, "failed to read Taal status\n"); + dev_err(&td->pdev->dev, "failed to read Taal status\n"); goto err; } /* Run self diagnostics */ r = taal_sleep_out(td); if (r) { - dev_err(&dssdev->dev, "failed to run Taal self-diagnostics\n"); + dev_err(&td->pdev->dev, "failed to run Taal self-diagnostics\n"); goto err; } r = taal_dcs_read_1(td, MIPI_DCS_GET_DIAGNOSTIC_RESULT, &state2); if (r) { - dev_err(&dssdev->dev, "failed to read Taal status\n"); + dev_err(&td->pdev->dev, "failed to read Taal status\n"); goto err; } @@ -1477,7 +1530,7 @@ static void taal_esd_work(struct work_struct *work) * Bit6 if the test passes. */ if (!((state1 ^ state2) & (1 << 6))) { - dev_err(&dssdev->dev, "LCD self diagnostics failed\n"); + dev_err(&td->pdev->dev, "LCD self diagnostics failed\n"); goto err; } /* Self-diagnostics result is also shown on TE GPIO line. We need @@ -1495,7 +1548,7 @@ static void taal_esd_work(struct work_struct *work) mutex_unlock(&td->lock); return; err: - dev_err(&dssdev->dev, "performing LCD reset\n"); + dev_err(&td->pdev->dev, "performing LCD reset\n"); taal_panel_reset(dssdev); @@ -1507,9 +1560,6 @@ err: } static struct omap_dss_driver taal_driver = { - .probe = taal_probe, - .remove = __exit_p(taal_remove), - .enable = taal_enable, .disable = taal_disable, @@ -1524,23 +1574,25 @@ static struct omap_dss_driver taal_driver = { .run_test = taal_run_test, .memory_read = taal_memory_read, +}; - .driver = { - .name = "taal", - .owner = THIS_MODULE, +static struct platform_driver taal_platform_driver = { + .probe = taal_probe, + .remove = __exit_p(taal_remove), + .driver = { + .name = "taal", + .owner = THIS_MODULE, }, }; static int __init taal_init(void) { - omap_dss_register_driver(&taal_driver); - - return 0; + return platform_driver_register(&taal_platform_driver); } static void __exit taal_exit(void) { - omap_dss_unregister_driver(&taal_driver); + platform_driver_unregister(&taal_platform_driver); } module_init(taal_init); -- 1.7.10.4 -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html