linux-fbdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v3 00/21] OMAP: DSS2: Taal panel driver updates
@ 2010-05-05 14:27 Jani Nikula
  2010-05-05 14:27 ` [PATCH v3 01/21] OMAP: DSS2: Taal: Add panel hardware reset Jani Nikula
  0 siblings, 1 reply; 22+ messages in thread
From: Jani Nikula @ 2010-05-05 14:27 UTC (permalink / raw)
  To: Tomi.Valkeinen, tony; +Cc: linux-omap, linux-fbdev, ext-jani.1.nikula

Hi -

This set of patches, on top of [1], contains assorted fixes and cleanups to the
Taal panel driver (01-14), configures board/platform specific things in a new
Nokia DSI command mode panel specific struct instead of DSS structs (15-17), and
makes it feasible to add support for similar DSI command mode panels in the same
driver (18-21).

v3: 
- patch 01: move taal_hw_reset() earlier than request_irq() in probe to be ready
  to handle the irqs
- patch 07: add panel enabled check also to taal_enable_te(), not just
  taal_run_test()

v2:
- No functional changes since v1, just filled in some missing commit messages
  (thanks Tony for your feedback!)

[1] git://gitorious.org/linux-omap-dss2/linux.git

BR,
Jani.


Jani Nikula (20):
  OMAP: DSS2: Taal: Add panel hardware reset
  OMAP: DSS2: Taal: Add locks to protect taal data access
  OMAP: DSS2: Taal: Cosmetic improvement to backlight properties
    initialization
  OMAP: DSS2: Taal: Remove platform enable/disable
  OMAP: DSS2: Taal: Fix request_irq() error handling
  OMAP: DSS2: Taal: Remove ESD work cancel from driver probe error
    handling
  OMAP: DSS2: Taal: Improve taal_power_on() error handling
  OMAP: DSS2: Taal: Ensure panel is enabled in enable_te() and
    run_test()
  OMAP: DSS2: Taal: Change DSI bus locking to avoid deadlock in ESD
    work
  OMAP: DSS2: Taal: Check taal_power_on() return value in taal_resume()
  OMAP: DSS2: Taal: Change ESD work management
  OMAP: DSS2: Taal: Change probe error handling labels
  OMAP: DSS2: Taal: Add proper external TE support
  OMAP: DSS2: Add Nokia DSI command mode panel configuration struct
  OMAP: DSS2: Taal: Use Nokia DSI panel data
  OMAP: DSS2: Taal: Configure ESD check in DSI panel data
  OMAP: DSS2: Taal: Add panel specific configuration structure
  OMAP: DSS2: Taal: Print panel name in addition to revision
  OMAP: DSS2: Taal: Add regulator configuration support
  OMAP: DSS2: Taal: CABC workaround is Taal specific

Valkeinen Tomi (Nokia-D/Helsinki) (1):
  OMAP: DSS2: Taal: add locks to taal_bl_update_status

 arch/arm/plat-omap/include/plat/nokia-dsi-panel.h |   31 ++
 drivers/video/omap2/displays/panel-taal.c         |  552 ++++++++++++++++-----
 2 files changed, 463 insertions(+), 120 deletions(-)
 create mode 100644 arch/arm/plat-omap/include/plat/nokia-dsi-panel.h


^ permalink raw reply	[flat|nested] 22+ messages in thread

* [PATCH v3 01/21] OMAP: DSS2: Taal: Add panel hardware reset
  2010-05-05 14:27 [PATCH v3 00/21] OMAP: DSS2: Taal panel driver updates Jani Nikula
@ 2010-05-05 14:27 ` Jani Nikula
  2010-05-05 14:27   ` [PATCH v3 02/21] OMAP: DSS2: Taal: add locks to taal_bl_update_status Jani Nikula
  0 siblings, 1 reply; 22+ messages in thread
From: Jani Nikula @ 2010-05-05 14:27 UTC (permalink / raw)
  To: Tomi.Valkeinen, tony; +Cc: linux-omap, linux-fbdev, ext-jani.1.nikula

From: Jani Nikula <ext-jani.1.nikula@nokia.com>

Issue a proper reset pulse on the reset line instead of just doing power
on/off.

Signed-off-by: Jani Nikula <ext-jani.1.nikula@nokia.com>
---
 drivers/video/omap2/displays/panel-taal.c |   44 ++++++++++++++++++++++++++--
 1 files changed, 40 insertions(+), 4 deletions(-)

diff --git a/drivers/video/omap2/displays/panel-taal.c b/drivers/video/omap2/displays/panel-taal.c
index aaf5d30..181dfe4 100644
--- a/drivers/video/omap2/displays/panel-taal.c
+++ b/drivers/video/omap2/displays/panel-taal.c
@@ -488,6 +488,22 @@ static struct attribute_group taal_attr_group = {
 	.attrs = taal_attrs,
 };
 
+static void taal_hw_reset(struct omap_dss_device *dssdev)
+{
+	if (dssdev->reset_gpio = -1)
+		return;
+
+	gpio_set_value(dssdev->reset_gpio, 1);
+	udelay(10);
+	/* reset the panel */
+	gpio_set_value(dssdev->reset_gpio, 0);
+	/* assert reset for at least 10us */
+	udelay(10);
+	gpio_set_value(dssdev->reset_gpio, 1);
+	/* wait 5ms after releasing reset */
+	msleep(5);
+}
+
 static int taal_probe(struct omap_dss_device *dssdev)
 {
 	struct backlight_properties props;
@@ -525,6 +541,8 @@ static int taal_probe(struct omap_dss_device *dssdev)
 
 	dev_set_drvdata(&dssdev->dev, td);
 
+	taal_hw_reset(dssdev);
+
 	/* if no platform set_backlight() defined, presume DSI backlight
 	 * control */
 	memset(&props, 0, sizeof(struct backlight_properties));
@@ -626,6 +644,9 @@ static void taal_remove(struct omap_dss_device *dssdev)
 	cancel_delayed_work_sync(&td->esd_work);
 	destroy_workqueue(td->esd_wq);
 
+	/* reset, to be sure that the panel is in a valid state */
+	taal_hw_reset(dssdev);
+
 	kfree(td);
 }
 
@@ -652,6 +673,8 @@ static int taal_power_on(struct omap_dss_device *dssdev)
 		goto err0;
 	}
 
+	taal_hw_reset(dssdev);
+
 	omapdss_dsi_vc_enable_hs(TCH, false);
 
 	r = taal_sleep_out(td);
@@ -702,6 +725,10 @@ 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");
+
+	taal_hw_reset(dssdev);
+
 	omapdss_dsi_display_disable(dssdev);
 err0:
 	dsi_bus_unlock();
@@ -714,16 +741,24 @@ err0:
 static void taal_power_off(struct omap_dss_device *dssdev)
 {
 	struct taal_data *td = dev_get_drvdata(&dssdev->dev);
+	int r;
 
 	dsi_bus_lock();
 
 	cancel_delayed_work(&td->esd_work);
 
-	taal_dcs_write_0(DCS_DISPLAY_OFF);
-	taal_sleep_in(td);
+	r = taal_dcs_write_0(DCS_DISPLAY_OFF);
+	if (!r) {
+		r = taal_sleep_in(td);
+		/* wait a bit so that the message goes through */
+		msleep(10);
+	}
 
-	/* wait a bit so that the message goes through */
-	msleep(10);
+	if (r) {
+		dev_err(&dssdev->dev,
+				"error disabling panel, issuing HW reset\n");
+		taal_hw_reset(dssdev);
+	}
 
 	omapdss_dsi_display_disable(dssdev);
 
@@ -1184,6 +1219,7 @@ err:
 	dev_err(&dssdev->dev, "performing LCD reset\n");
 
 	taal_power_off(dssdev);
+	taal_hw_reset(dssdev);
 	taal_power_on(dssdev);
 
 	dsi_bus_unlock();
-- 
1.6.5.2


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH v3 02/21] OMAP: DSS2: Taal: add locks to taal_bl_update_status
  2010-05-05 14:27 ` [PATCH v3 01/21] OMAP: DSS2: Taal: Add panel hardware reset Jani Nikula
@ 2010-05-05 14:27   ` Jani Nikula
  2010-05-05 14:27     ` [PATCH v3 03/21] OMAP: DSS2: Taal: Add locks to protect taal data access Jani Nikula
  0 siblings, 1 reply; 22+ messages in thread
From: Jani Nikula @ 2010-05-05 14:27 UTC (permalink / raw)
  To: Tomi.Valkeinen, tony; +Cc: linux-omap, linux-fbdev, ext-jani.1.nikula

From: Valkeinen Tomi (Nokia-D/Helsinki) <Tomi.Valkeinen@nokia.com>

From: Tomi Valkeinen <tomi.valkeinen@nokia.com>

taal_bl_update_status was missing locks to protect taal_data. This caused
a kernel crash randomly, as the code attempted to set the brightness while
the OMAP's DSI block was actually disabled.

Signed-off-by: Tomi Valkeinen <tomi.valkeinen@nokia.com>
---
 drivers/video/omap2/displays/panel-taal.c |   18 ++++++++++--------
 1 files changed, 10 insertions(+), 8 deletions(-)

diff --git a/drivers/video/omap2/displays/panel-taal.c b/drivers/video/omap2/displays/panel-taal.c
index 181dfe4..8fbb94e 100644
--- a/drivers/video/omap2/displays/panel-taal.c
+++ b/drivers/video/omap2/displays/panel-taal.c
@@ -290,24 +290,26 @@ static int taal_bl_update_status(struct backlight_device *dev)
 
 	dev_dbg(&dssdev->dev, "update brightness to %d\n", level);
 
+	mutex_lock(&td->lock);
+
 	if (td->use_dsi_bl) {
 		if (td->enabled) {
 			dsi_bus_lock();
 			r = taal_dcs_write_1(DCS_BRIGHTNESS, level);
 			dsi_bus_unlock();
-			if (r)
-				return r;
+		} else {
+			r = 0;
 		}
 	} else {
 		if (!dssdev->set_backlight)
-			return -EINVAL;
-
-		r = dssdev->set_backlight(dssdev, level);
-		if (r)
-			return r;
+			r = -EINVAL;
+		else
+			r = dssdev->set_backlight(dssdev, level);
 	}
 
-	return 0;
+	mutex_unlock(&td->lock);
+
+	return r;
 }
 
 static int taal_bl_get_intensity(struct backlight_device *dev)
-- 
1.6.5.2


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH v3 03/21] OMAP: DSS2: Taal: Add locks to protect taal data access
  2010-05-05 14:27   ` [PATCH v3 02/21] OMAP: DSS2: Taal: add locks to taal_bl_update_status Jani Nikula
@ 2010-05-05 14:27     ` Jani Nikula
  2010-05-05 14:27       ` [PATCH v3 04/21] OMAP: DSS2: Taal: Cosmetic improvement to backlight properties initialization Jani Nikula
  0 siblings, 1 reply; 22+ messages in thread
From: Jani Nikula @ 2010-05-05 14:27 UTC (permalink / raw)
  To: Tomi.Valkeinen, tony; +Cc: linux-omap, linux-fbdev, ext-jani.1.nikula

From: Jani Nikula <ext-jani.1.nikula@nokia.com>

Avoid potential race conditions in sysfs access to taal data.

Signed-off-by: Jani Nikula <ext-jani.1.nikula@nokia.com>
---
 drivers/video/omap2/displays/panel-taal.c |   12 ++++++++++++
 1 files changed, 12 insertions(+), 0 deletions(-)

diff --git a/drivers/video/omap2/displays/panel-taal.c b/drivers/video/omap2/displays/panel-taal.c
index 8fbb94e..0eed328 100644
--- a/drivers/video/omap2/displays/panel-taal.c
+++ b/drivers/video/omap2/displays/panel-taal.c
@@ -364,6 +364,8 @@ static ssize_t taal_num_errors_show(struct device *dev,
 	u8 errors;
 	int r;
 
+	mutex_lock(&td->lock);
+
 	if (td->enabled) {
 		dsi_bus_lock();
 		r = taal_dcs_read_1(DCS_READ_NUM_ERRORS, &errors);
@@ -372,6 +374,8 @@ static ssize_t taal_num_errors_show(struct device *dev,
 		r = -ENODEV;
 	}
 
+	mutex_unlock(&td->lock);
+
 	if (r)
 		return r;
 
@@ -386,6 +390,8 @@ static ssize_t taal_hw_revision_show(struct device *dev,
 	u8 id1, id2, id3;
 	int r;
 
+	mutex_lock(&td->lock);
+
 	if (td->enabled) {
 		dsi_bus_lock();
 		r = taal_get_id(&id1, &id2, &id3);
@@ -394,6 +400,8 @@ static ssize_t taal_hw_revision_show(struct device *dev,
 		r = -ENODEV;
 	}
 
+	mutex_unlock(&td->lock);
+
 	if (r)
 		return r;
 
@@ -443,6 +451,8 @@ static ssize_t store_cabc_mode(struct device *dev,
 	if (i = ARRAY_SIZE(cabc_modes))
 		return -EINVAL;
 
+	mutex_lock(&td->lock);
+
 	if (td->enabled) {
 		dsi_bus_lock();
 		if (!td->cabc_broken)
@@ -452,6 +462,8 @@ static ssize_t store_cabc_mode(struct device *dev,
 
 	td->cabc_mode = i;
 
+	mutex_unlock(&td->lock);
+
 	return count;
 }
 
-- 
1.6.5.2


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH v3 04/21] OMAP: DSS2: Taal: Cosmetic improvement to backlight properties initialization
  2010-05-05 14:27     ` [PATCH v3 03/21] OMAP: DSS2: Taal: Add locks to protect taal data access Jani Nikula
@ 2010-05-05 14:27       ` Jani Nikula
  2010-05-05 14:27         ` [PATCH v3 05/21] OMAP: DSS2: Taal: Remove platform enable/disable Jani Nikula
  0 siblings, 1 reply; 22+ messages in thread
From: Jani Nikula @ 2010-05-05 14:27 UTC (permalink / raw)
  To: Tomi.Valkeinen, tony; +Cc: linux-omap, linux-fbdev, ext-jani.1.nikula

From: Jani Nikula <ext-jani.1.nikula@nokia.com>

Let the compiler worry about the type for us.

Signed-off-by: Jani Nikula <ext-jani.1.nikula@nokia.com>
---
 drivers/video/omap2/displays/panel-taal.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/drivers/video/omap2/displays/panel-taal.c b/drivers/video/omap2/displays/panel-taal.c
index 0eed328..53fc369 100644
--- a/drivers/video/omap2/displays/panel-taal.c
+++ b/drivers/video/omap2/displays/panel-taal.c
@@ -559,7 +559,7 @@ static int taal_probe(struct omap_dss_device *dssdev)
 
 	/* if no platform set_backlight() defined, presume DSI backlight
 	 * control */
-	memset(&props, 0, sizeof(struct backlight_properties));
+	memset(&props, 0, sizeof(props));
 	if (!dssdev->set_backlight)
 		td->use_dsi_bl = true;
 
-- 
1.6.5.2


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH v3 05/21] OMAP: DSS2: Taal: Remove platform enable/disable
  2010-05-05 14:27       ` [PATCH v3 04/21] OMAP: DSS2: Taal: Cosmetic improvement to backlight properties initialization Jani Nikula
@ 2010-05-05 14:27         ` Jani Nikula
  2010-05-05 14:27           ` [PATCH v3 06/21] OMAP: DSS2: Taal: Fix request_irq() error handling Jani Nikula
  0 siblings, 1 reply; 22+ messages in thread
From: Jani Nikula @ 2010-05-05 14:27 UTC (permalink / raw)
  To: Tomi.Valkeinen, tony; +Cc: linux-omap, linux-fbdev, ext-jani.1.nikula

From: Jani Nikula <ext-jani.1.nikula@nokia.com>

After the addition of proper hardware reset, taal_hw_reset(), there's no
need for an additional platform enable/disable. Remove them.

Signed-off-by: Jani Nikula <ext-jani.1.nikula@nokia.com>
---
 drivers/video/omap2/displays/panel-taal.c |   11 -----------
 1 files changed, 0 insertions(+), 11 deletions(-)

diff --git a/drivers/video/omap2/displays/panel-taal.c b/drivers/video/omap2/displays/panel-taal.c
index 53fc369..b7d1275 100644
--- a/drivers/video/omap2/displays/panel-taal.c
+++ b/drivers/video/omap2/displays/panel-taal.c
@@ -670,12 +670,6 @@ static int taal_power_on(struct omap_dss_device *dssdev)
 	u8 id1, id2, id3;
 	int r;
 
-	if (dssdev->platform_enable) {
-		r = dssdev->platform_enable(dssdev);
-		if (r)
-			return r;
-	}
-
 	/* it seems we have to wait a bit until taal is ready */
 	msleep(5);
 
@@ -746,8 +740,6 @@ err:
 	omapdss_dsi_display_disable(dssdev);
 err0:
 	dsi_bus_unlock();
-	if (dssdev->platform_disable)
-		dssdev->platform_disable(dssdev);
 
 	return r;
 }
@@ -776,9 +768,6 @@ static void taal_power_off(struct omap_dss_device *dssdev)
 
 	omapdss_dsi_display_disable(dssdev);
 
-	if (dssdev->platform_disable)
-		dssdev->platform_disable(dssdev);
-
 	td->enabled = 0;
 
 	dsi_bus_unlock();
-- 
1.6.5.2


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH v3 06/21] OMAP: DSS2: Taal: Fix request_irq() error handling
  2010-05-05 14:27         ` [PATCH v3 05/21] OMAP: DSS2: Taal: Remove platform enable/disable Jani Nikula
@ 2010-05-05 14:27           ` Jani Nikula
  2010-05-05 14:27             ` [PATCH v3 07/21] OMAP: DSS2: Taal: Remove ESD work cancel from driver probe " Jani Nikula
  0 siblings, 1 reply; 22+ messages in thread
From: Jani Nikula @ 2010-05-05 14:27 UTC (permalink / raw)
  To: Tomi.Valkeinen, tony; +Cc: linux-omap, linux-fbdev, ext-jani.1.nikula

From: Jani Nikula <ext-jani.1.nikula@nokia.com>

Separate gpio_request() and request_irq() error handling.

Signed-off-by: Jani Nikula <ext-jani.1.nikula@nokia.com>
---
 drivers/video/omap2/displays/panel-taal.c |   14 +++++++-------
 1 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/drivers/video/omap2/displays/panel-taal.c b/drivers/video/omap2/displays/panel-taal.c
index b7d1275..788aa91 100644
--- a/drivers/video/omap2/displays/panel-taal.c
+++ b/drivers/video/omap2/displays/panel-taal.c
@@ -603,7 +603,7 @@ static int taal_probe(struct omap_dss_device *dssdev)
 		if (r) {
 			dev_err(&dssdev->dev, "IRQ request failed\n");
 			gpio_free(gpio);
-			goto err3;
+			goto err4;
 		}
 
 		init_completion(&td->te_completion);
@@ -614,16 +614,16 @@ static int taal_probe(struct omap_dss_device *dssdev)
 	r = sysfs_create_group(&dssdev->dev.kobj, &taal_attr_group);
 	if (r) {
 		dev_err(&dssdev->dev, "failed to create sysfs files\n");
-		goto err4;
+		goto err5;
 	}
 
 	return 0;
+err5:
+	if (td->use_ext_te)
+		free_irq(gpio_to_irq(dssdev->phy.dsi.ext_te_gpio), dssdev);
 err4:
-	if (td->use_ext_te) {
-		int gpio = dssdev->phy.dsi.ext_te_gpio;
-		free_irq(gpio_to_irq(gpio), dssdev);
-		gpio_free(gpio);
-	}
+	if (td->use_ext_te)
+		gpio_free(dssdev->phy.dsi.ext_te_gpio);
 err3:
 	backlight_device_unregister(bldev);
 err2:
-- 
1.6.5.2


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH v3 07/21] OMAP: DSS2: Taal: Remove ESD work cancel from driver probe error handling
  2010-05-05 14:27           ` [PATCH v3 06/21] OMAP: DSS2: Taal: Fix request_irq() error handling Jani Nikula
@ 2010-05-05 14:27             ` Jani Nikula
  2010-05-05 14:27               ` [PATCH v3 08/21] OMAP: DSS2: Taal: Improve taal_power_on() " Jani Nikula
  0 siblings, 1 reply; 22+ messages in thread
From: Jani Nikula @ 2010-05-05 14:27 UTC (permalink / raw)
  To: Tomi.Valkeinen, tony; +Cc: linux-omap, linux-fbdev, ext-jani.1.nikula

From: Jani Nikula <ext-jani.1.nikula@nokia.com>

ESD work is never queued in probe, no need to cancel it on probe error.

Signed-off-by: Jani Nikula <ext-jani.1.nikula@nokia.com>
---
 drivers/video/omap2/displays/panel-taal.c |    1 -
 1 files changed, 0 insertions(+), 1 deletions(-)

diff --git a/drivers/video/omap2/displays/panel-taal.c b/drivers/video/omap2/displays/panel-taal.c
index 788aa91..d0701e2 100644
--- a/drivers/video/omap2/displays/panel-taal.c
+++ b/drivers/video/omap2/displays/panel-taal.c
@@ -627,7 +627,6 @@ err4:
 err3:
 	backlight_device_unregister(bldev);
 err2:
-	cancel_delayed_work_sync(&td->esd_work);
 	destroy_workqueue(td->esd_wq);
 err1:
 	kfree(td);
-- 
1.6.5.2


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH v3 08/21] OMAP: DSS2: Taal: Improve taal_power_on() error handling
  2010-05-05 14:27             ` [PATCH v3 07/21] OMAP: DSS2: Taal: Remove ESD work cancel from driver probe " Jani Nikula
@ 2010-05-05 14:27               ` Jani Nikula
  2010-05-05 14:27                 ` [PATCH v3 09/21] OMAP: DSS2: Taal: Ensure panel is enabled in enable_te() and run_test() Jani Nikula
  0 siblings, 1 reply; 22+ messages in thread
From: Jani Nikula @ 2010-05-05 14:27 UTC (permalink / raw)
  To: Tomi.Valkeinen, tony; +Cc: linux-omap, linux-fbdev, ext-jani.1.nikula

From: Jani Nikula <ext-jani.1.nikula@nokia.com>

Check return values and bail out on errors.

Signed-off-by: Jani Nikula <ext-jani.1.nikula@nokia.com>
---
 drivers/video/omap2/displays/panel-taal.c |   30 ++++++++++++++++++++++------
 1 files changed, 23 insertions(+), 7 deletions(-)

diff --git a/drivers/video/omap2/displays/panel-taal.c b/drivers/video/omap2/displays/panel-taal.c
index d0701e2..a093eda 100644
--- a/drivers/video/omap2/displays/panel-taal.c
+++ b/drivers/video/omap2/displays/panel-taal.c
@@ -696,16 +696,32 @@ static int taal_power_on(struct omap_dss_device *dssdev)
 	if (id2 = 0x00 || id2 = 0xff || id2 = 0x81)
 		td->cabc_broken = true;
 
-	taal_dcs_write_1(DCS_BRIGHTNESS, 0xff);
-	taal_dcs_write_1(DCS_CTRL_DISPLAY, (1<<2) | (1<<5)); /* BL | BCTRL */
+	r = taal_dcs_write_1(DCS_BRIGHTNESS, 0xff);
+	if (r)
+		goto err;
 
-	taal_dcs_write_1(DCS_PIXEL_FORMAT, 0x7); /* 24bit/pixel */
+	r = taal_dcs_write_1(DCS_CTRL_DISPLAY,
+			(1<<2) | (1<<5));	/* BL | BCTRL */
+	if (r)
+		goto err;
 
-	taal_set_addr_mode(td->rotate, td->mirror);
-	if (!td->cabc_broken)
-		taal_dcs_write_1(DCS_WRITE_CABC, td->cabc_mode);
+	r = taal_dcs_write_1(DCS_PIXEL_FORMAT, 0x7); /* 24bit/pixel */
+	if (r)
+		goto err;
 
-	taal_dcs_write_0(DCS_DISPLAY_ON);
+	r = taal_set_addr_mode(td->rotate, td->mirror);
+	if (r)
+		goto err;
+
+	if (!td->cabc_broken) {
+		r = taal_dcs_write_1(DCS_WRITE_CABC, td->cabc_mode);
+		if (r)
+			goto err;
+	}
+
+	r = taal_dcs_write_0(DCS_DISPLAY_ON);
+	if (r)
+		goto err;
 
 	r = _taal_enable_te(dssdev, td->te_enabled);
 	if (r)
-- 
1.6.5.2


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH v3 09/21] OMAP: DSS2: Taal: Ensure panel is enabled in enable_te() and run_test()
  2010-05-05 14:27               ` [PATCH v3 08/21] OMAP: DSS2: Taal: Improve taal_power_on() " Jani Nikula
@ 2010-05-05 14:27                 ` Jani Nikula
  2010-05-05 14:27                   ` [PATCH v3 10/21] OMAP: DSS2: Taal: Change DSI bus locking to avoid deadlock in ESD work Jani Nikula
  0 siblings, 1 reply; 22+ messages in thread
From: Jani Nikula @ 2010-05-05 14:27 UTC (permalink / raw)
  To: Tomi.Valkeinen, tony; +Cc: linux-omap, linux-fbdev, ext-jani.1.nikula

From: Jani Nikula <ext-jani.1.nikula@nokia.com>

Bail out from taal_enable_te() and taal_run_test() if panel is not
enabled.

Signed-off-by: Jani Nikula <ext-jani.1.nikula@nokia.com>
---
 drivers/video/omap2/displays/panel-taal.c |   31 +++++++++++++++++++++-------
 1 files changed, 23 insertions(+), 8 deletions(-)

diff --git a/drivers/video/omap2/displays/panel-taal.c b/drivers/video/omap2/displays/panel-taal.c
index a093eda..214d3cf 100644
--- a/drivers/video/omap2/displays/panel-taal.c
+++ b/drivers/video/omap2/displays/panel-taal.c
@@ -946,11 +946,8 @@ static int taal_sync(struct omap_dss_device *dssdev)
 
 static int _taal_enable_te(struct omap_dss_device *dssdev, bool enable)
 {
-	struct taal_data *td = dev_get_drvdata(&dssdev->dev);
 	int r;
 
-	td->te_enabled = enable;
-
 	if (enable)
 		r = taal_dcs_write_1(DCS_TEAR_ON, 0);
 	else
@@ -973,11 +970,22 @@ static int taal_enable_te(struct omap_dss_device *dssdev, bool enable)
 	mutex_lock(&td->lock);
 	dsi_bus_lock();
 
-	r = _taal_enable_te(dssdev, enable);
+	if (td->enabled) {
+		r = _taal_enable_te(dssdev, enable);
+		if (r)
+			goto err;
+	}
+
+	td->te_enabled = enable;
 
 	dsi_bus_unlock();
 	mutex_unlock(&td->lock);
 
+	return 0;
+err:
+	dsi_bus_unlock();
+	mutex_unlock(&td->lock);
+
 	return r;
 }
 
@@ -1077,23 +1085,30 @@ static int taal_run_test(struct omap_dss_device *dssdev, int test_num)
 	int r;
 
 	mutex_lock(&td->lock);
+
+	if (!td->enabled) {
+		r = -ENODEV;
+		goto err1;
+	}
+
 	dsi_bus_lock();
 
 	r = taal_dcs_read_1(DCS_GET_ID1, &id1);
 	if (r)
-		goto err;
+		goto err2;
 	r = taal_dcs_read_1(DCS_GET_ID2, &id2);
 	if (r)
-		goto err;
+		goto err2;
 	r = taal_dcs_read_1(DCS_GET_ID3, &id3);
 	if (r)
-		goto err;
+		goto err2;
 
 	dsi_bus_unlock();
 	mutex_unlock(&td->lock);
 	return 0;
-err:
+err2:
 	dsi_bus_unlock();
+err1:
 	mutex_unlock(&td->lock);
 	return r;
 }
-- 
1.6.5.2


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH v3 10/21] OMAP: DSS2: Taal: Change DSI bus locking to avoid deadlock in ESD work
  2010-05-05 14:27                 ` [PATCH v3 09/21] OMAP: DSS2: Taal: Ensure panel is enabled in enable_te() and run_test() Jani Nikula
@ 2010-05-05 14:27                   ` Jani Nikula
  2010-05-05 14:27                     ` [PATCH v3 11/21] OMAP: DSS2: Taal: Check taal_power_on() return value in taal_resume() Jani Nikula
  0 siblings, 1 reply; 22+ messages in thread
From: Jani Nikula @ 2010-05-05 14:27 UTC (permalink / raw)
  To: Tomi.Valkeinen, tony; +Cc: linux-omap, linux-fbdev, ext-jani.1.nikula

From: Jani Nikula <ext-jani.1.nikula@nokia.com>

Move dsi_bus_lock/unlock() out of taal_power_on/off() to avoid deadlock
in taal_esd_work().

Signed-off-by: Jani Nikula <ext-jani.1.nikula@nokia.com>
---
 drivers/video/omap2/displays/panel-taal.c |   29 +++++++++++++++++++----------
 1 files changed, 19 insertions(+), 10 deletions(-)

diff --git a/drivers/video/omap2/displays/panel-taal.c b/drivers/video/omap2/displays/panel-taal.c
index 214d3cf..af159c1 100644
--- a/drivers/video/omap2/displays/panel-taal.c
+++ b/drivers/video/omap2/displays/panel-taal.c
@@ -672,8 +672,6 @@ static int taal_power_on(struct omap_dss_device *dssdev)
 	/* it seems we have to wait a bit until taal is ready */
 	msleep(5);
 
-	dsi_bus_lock();
-
 	r = omapdss_dsi_display_enable(dssdev);
 	if (r) {
 		dev_err(&dssdev->dev, "failed to enable DSI\n");
@@ -744,8 +742,6 @@ static int taal_power_on(struct omap_dss_device *dssdev)
 
 	omapdss_dsi_vc_enable_hs(TCH, true);
 
-	dsi_bus_unlock();
-
 	return 0;
 err:
 	dev_err(&dssdev->dev, "error while enabling panel, issuing HW reset\n");
@@ -754,8 +750,6 @@ err:
 
 	omapdss_dsi_display_disable(dssdev);
 err0:
-	dsi_bus_unlock();
-
 	return r;
 }
 
@@ -764,8 +758,6 @@ static void taal_power_off(struct omap_dss_device *dssdev)
 	struct taal_data *td = dev_get_drvdata(&dssdev->dev);
 	int r;
 
-	dsi_bus_lock();
-
 	cancel_delayed_work(&td->esd_work);
 
 	r = taal_dcs_write_0(DCS_DISPLAY_OFF);
@@ -784,8 +776,6 @@ static void taal_power_off(struct omap_dss_device *dssdev)
 	omapdss_dsi_display_disable(dssdev);
 
 	td->enabled = 0;
-
-	dsi_bus_unlock();
 }
 
 static int taal_enable(struct omap_dss_device *dssdev)
@@ -802,7 +792,12 @@ static int taal_enable(struct omap_dss_device *dssdev)
 		goto err;
 	}
 
+	dsi_bus_lock();
+
 	r = taal_power_on(dssdev);
+
+	dsi_bus_unlock();
+
 	if (r)
 		goto err;
 
@@ -825,9 +820,13 @@ static void taal_disable(struct omap_dss_device *dssdev)
 
 	mutex_lock(&td->lock);
 
+	dsi_bus_lock();
+
 	if (dssdev->state = OMAP_DSS_DISPLAY_ACTIVE)
 		taal_power_off(dssdev);
 
+	dsi_bus_unlock();
+
 	dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
 
 	mutex_unlock(&td->lock);
@@ -847,7 +846,12 @@ static int taal_suspend(struct omap_dss_device *dssdev)
 		goto err;
 	}
 
+	dsi_bus_lock();
+
 	taal_power_off(dssdev);
+
+	dsi_bus_unlock();
+
 	dssdev->state = OMAP_DSS_DISPLAY_SUSPENDED;
 
 	mutex_unlock(&td->lock);
@@ -872,7 +876,12 @@ static int taal_resume(struct omap_dss_device *dssdev)
 		goto err;
 	}
 
+	dsi_bus_lock();
+
 	r = taal_power_on(dssdev);
+
+	dsi_bus_unlock();
+
 	dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
 
 	mutex_unlock(&td->lock);
-- 
1.6.5.2


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH v3 11/21] OMAP: DSS2: Taal: Check taal_power_on() return value in taal_resume()
  2010-05-05 14:27                   ` [PATCH v3 10/21] OMAP: DSS2: Taal: Change DSI bus locking to avoid deadlock in ESD work Jani Nikula
@ 2010-05-05 14:27                     ` Jani Nikula
  2010-05-05 14:27                       ` [PATCH v3 12/21] OMAP: DSS2: Taal: Change ESD work management Jani Nikula
  0 siblings, 1 reply; 22+ messages in thread
From: Jani Nikula @ 2010-05-05 14:27 UTC (permalink / raw)
  To: Tomi.Valkeinen, tony; +Cc: linux-omap, linux-fbdev, ext-jani.1.nikula

From: Jani Nikula <ext-jani.1.nikula@nokia.com>

Change state only if power on was succesful.

Signed-off-by: Jani Nikula <ext-jani.1.nikula@nokia.com>
---
 drivers/video/omap2/displays/panel-taal.c |    5 ++++-
 1 files changed, 4 insertions(+), 1 deletions(-)

diff --git a/drivers/video/omap2/displays/panel-taal.c b/drivers/video/omap2/displays/panel-taal.c
index af159c1..7b5f845 100644
--- a/drivers/video/omap2/displays/panel-taal.c
+++ b/drivers/video/omap2/displays/panel-taal.c
@@ -882,7 +882,10 @@ static int taal_resume(struct omap_dss_device *dssdev)
 
 	dsi_bus_unlock();
 
-	dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
+	if (r)
+		dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
+	else
+		dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
 
 	mutex_unlock(&td->lock);
 
-- 
1.6.5.2


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH v3 12/21] OMAP: DSS2: Taal: Change ESD work management
  2010-05-05 14:27                     ` [PATCH v3 11/21] OMAP: DSS2: Taal: Check taal_power_on() return value in taal_resume() Jani Nikula
@ 2010-05-05 14:27                       ` Jani Nikula
  2010-05-05 14:27                         ` [PATCH v3 13/21] OMAP: DSS2: Taal: Change probe error handling labels Jani Nikula
  0 siblings, 1 reply; 22+ messages in thread
From: Jani Nikula @ 2010-05-05 14:27 UTC (permalink / raw)
  To: Tomi.Valkeinen, tony; +Cc: linux-omap, linux-fbdev, ext-jani.1.nikula

From: Jani Nikula <ext-jani.1.nikula@nokia.com>

Move ESD work queuing and cancelling out of taal_power_on/off() to avoid
problems related to taal_esd_work() calling the power on/off functions.

Signed-off-by: Jani Nikula <ext-jani.1.nikula@nokia.com>
---
 drivers/video/omap2/displays/panel-taal.c |   25 ++++++++++++++++---------
 1 files changed, 16 insertions(+), 9 deletions(-)

diff --git a/drivers/video/omap2/displays/panel-taal.c b/drivers/video/omap2/displays/panel-taal.c
index 7b5f845..fa4c67b 100644
--- a/drivers/video/omap2/displays/panel-taal.c
+++ b/drivers/video/omap2/displays/panel-taal.c
@@ -654,7 +654,7 @@ static void taal_remove(struct omap_dss_device *dssdev)
 	taal_bl_update_status(bldev);
 	backlight_device_unregister(bldev);
 
-	cancel_delayed_work_sync(&td->esd_work);
+	cancel_delayed_work(&td->esd_work);
 	destroy_workqueue(td->esd_wq);
 
 	/* reset, to be sure that the panel is in a valid state */
@@ -725,10 +725,6 @@ static int taal_power_on(struct omap_dss_device *dssdev)
 	if (r)
 		goto err;
 
-#ifdef TAAL_USE_ESD_CHECK
-	queue_delayed_work(td->esd_wq, &td->esd_work, TAAL_ESD_CHECK_PERIOD);
-#endif
-
 	td->enabled = 1;
 
 	if (!td->intro_printed) {
@@ -758,8 +754,6 @@ static void taal_power_off(struct omap_dss_device *dssdev)
 	struct taal_data *td = dev_get_drvdata(&dssdev->dev);
 	int r;
 
-	cancel_delayed_work(&td->esd_work);
-
 	r = taal_dcs_write_0(DCS_DISPLAY_OFF);
 	if (!r) {
 		r = taal_sleep_in(td);
@@ -801,6 +795,10 @@ static int taal_enable(struct omap_dss_device *dssdev)
 	if (r)
 		goto err;
 
+#ifdef TAAL_USE_ESD_CHECK
+	queue_delayed_work(td->esd_wq, &td->esd_work, TAAL_ESD_CHECK_PERIOD);
+#endif
+
 	dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
 
 	mutex_unlock(&td->lock);
@@ -820,6 +818,8 @@ static void taal_disable(struct omap_dss_device *dssdev)
 
 	mutex_lock(&td->lock);
 
+	cancel_delayed_work(&td->esd_work);
+
 	dsi_bus_lock();
 
 	if (dssdev->state = OMAP_DSS_DISPLAY_ACTIVE)
@@ -846,6 +846,8 @@ static int taal_suspend(struct omap_dss_device *dssdev)
 		goto err;
 	}
 
+	cancel_delayed_work(&td->esd_work);
+
 	dsi_bus_lock();
 
 	taal_power_off(dssdev);
@@ -882,10 +884,15 @@ static int taal_resume(struct omap_dss_device *dssdev)
 
 	dsi_bus_unlock();
 
-	if (r)
+	if (r) {
 		dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
-	else
+	} else {
 		dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
+#ifdef TAAL_USE_ESD_CHECK
+		queue_delayed_work(td->esd_wq, &td->esd_work,
+				TAAL_ESD_CHECK_PERIOD);
+#endif
+	}
 
 	mutex_unlock(&td->lock);
 
-- 
1.6.5.2


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH v3 13/21] OMAP: DSS2: Taal: Change probe error handling labels
  2010-05-05 14:27                       ` [PATCH v3 12/21] OMAP: DSS2: Taal: Change ESD work management Jani Nikula
@ 2010-05-05 14:27                         ` Jani Nikula
  2010-05-05 14:27                           ` [PATCH v3 14/21] OMAP: DSS2: Taal: Add proper external TE support Jani Nikula
  0 siblings, 1 reply; 22+ messages in thread
From: Jani Nikula @ 2010-05-05 14:27 UTC (permalink / raw)
  To: Tomi.Valkeinen, tony; +Cc: linux-omap, linux-fbdev, ext-jani.1.nikula

From: Jani Nikula <ext-jani.1.nikula@nokia.com>

Switch from numbered to named labels to make it easier to add new
labels for error handling.

Signed-off-by: Jani Nikula <ext-jani.1.nikula@nokia.com>
---
 drivers/video/omap2/displays/panel-taal.c |   24 ++++++++++++------------
 1 files changed, 12 insertions(+), 12 deletions(-)

diff --git a/drivers/video/omap2/displays/panel-taal.c b/drivers/video/omap2/displays/panel-taal.c
index fa4c67b..e32424c 100644
--- a/drivers/video/omap2/displays/panel-taal.c
+++ b/drivers/video/omap2/displays/panel-taal.c
@@ -539,7 +539,7 @@ static int taal_probe(struct omap_dss_device *dssdev)
 	td = kzalloc(sizeof(*td), GFP_KERNEL);
 	if (!td) {
 		r = -ENOMEM;
-		goto err0;
+		goto err;
 	}
 	td->dssdev = dssdev;
 
@@ -549,7 +549,7 @@ static int taal_probe(struct omap_dss_device *dssdev)
 	if (td->esd_wq = NULL) {
 		dev_err(&dssdev->dev, "can't create ESD workqueue\n");
 		r = -ENOMEM;
-		goto err1;
+		goto err_wq;
 	}
 	INIT_DELAYED_WORK_DEFERRABLE(&td->esd_work, taal_esd_work);
 
@@ -571,7 +571,7 @@ static int taal_probe(struct omap_dss_device *dssdev)
 					  &taal_bl_ops, &props);
 	if (IS_ERR(bldev)) {
 		r = PTR_ERR(bldev);
-		goto err2;
+		goto err_bl;
 	}
 
 	td->bldev = bldev;
@@ -591,7 +591,7 @@ static int taal_probe(struct omap_dss_device *dssdev)
 		r = gpio_request(gpio, "taal irq");
 		if (r) {
 			dev_err(&dssdev->dev, "GPIO request failed\n");
-			goto err3;
+			goto err_gpio;
 		}
 
 		gpio_direction_input(gpio);
@@ -603,7 +603,7 @@ static int taal_probe(struct omap_dss_device *dssdev)
 		if (r) {
 			dev_err(&dssdev->dev, "IRQ request failed\n");
 			gpio_free(gpio);
-			goto err4;
+			goto err_irq;
 		}
 
 		init_completion(&td->te_completion);
@@ -614,23 +614,23 @@ static int taal_probe(struct omap_dss_device *dssdev)
 	r = sysfs_create_group(&dssdev->dev.kobj, &taal_attr_group);
 	if (r) {
 		dev_err(&dssdev->dev, "failed to create sysfs files\n");
-		goto err5;
+		goto err_sysfs;
 	}
 
 	return 0;
-err5:
+err_sysfs:
 	if (td->use_ext_te)
 		free_irq(gpio_to_irq(dssdev->phy.dsi.ext_te_gpio), dssdev);
-err4:
+err_irq:
 	if (td->use_ext_te)
 		gpio_free(dssdev->phy.dsi.ext_te_gpio);
-err3:
+err_gpio:
 	backlight_device_unregister(bldev);
-err2:
+err_bl:
 	destroy_workqueue(td->esd_wq);
-err1:
+err_wq:
 	kfree(td);
-err0:
+err:
 	return r;
 }
 
-- 
1.6.5.2


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH v3 14/21] OMAP: DSS2: Taal: Add proper external TE support
  2010-05-05 14:27                         ` [PATCH v3 13/21] OMAP: DSS2: Taal: Change probe error handling labels Jani Nikula
@ 2010-05-05 14:27                           ` Jani Nikula
  2010-05-05 14:27                             ` [PATCH v3 15/21] OMAP: DSS2: Add Nokia DSI command mode panel configuration struct Jani Nikula
  0 siblings, 1 reply; 22+ messages in thread
From: Jani Nikula @ 2010-05-05 14:27 UTC (permalink / raw)
  To: Tomi.Valkeinen, tony; +Cc: linux-omap, linux-fbdev, ext-jani.1.nikula

From: Jani Nikula <ext-jani.1.nikula@nokia.com>

Add gpio irq based external TE support with timeout.

Signed-off-by: Jani Nikula <ext-jani.1.nikula@nokia.com>
---
 drivers/video/omap2/displays/panel-taal.c |   93 +++++++++++++++++++++++------
 1 files changed, 75 insertions(+), 18 deletions(-)

diff --git a/drivers/video/omap2/displays/panel-taal.c b/drivers/video/omap2/displays/panel-taal.c
index e32424c..0c259ab 100644
--- a/drivers/video/omap2/displays/panel-taal.c
+++ b/drivers/video/omap2/displays/panel-taal.c
@@ -28,7 +28,6 @@
 #include <linux/fb.h>
 #include <linux/interrupt.h>
 #include <linux/gpio.h>
-#include <linux/completion.h>
 #include <linux/workqueue.h>
 #include <linux/slab.h>
 #include <linux/mutex.h>
@@ -65,6 +64,8 @@
 /* #define TAAL_USE_ESD_CHECK */
 #define TAAL_ESD_CHECK_PERIOD	msecs_to_jiffies(5000)
 
+static irqreturn_t taal_te_isr(int irq, void *data);
+static void taal_te_timeout_work_callback(struct work_struct *work);
 static int _taal_enable_te(struct omap_dss_device *dssdev, bool enable);
 
 struct taal_data {
@@ -85,7 +86,15 @@ struct taal_data {
 
 	bool te_enabled;
 	bool use_ext_te;
-	struct completion te_completion;
+
+	atomic_t do_update;
+	struct {
+		u16 x;
+		u16 y;
+		u16 w;
+		u16 h;
+	} update_region;
+	struct delayed_work te_timeout_work;
 
 	bool use_dsi_bl;
 
@@ -346,16 +355,6 @@ static void taal_get_resolution(struct omap_dss_device *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);
-
-	complete_all(&td->te_completion);
-
-	return IRQ_HANDLED;
-}
-
 static ssize_t taal_num_errors_show(struct device *dev,
 		struct device_attribute *attr, char *buf)
 {
@@ -545,6 +544,8 @@ static int taal_probe(struct omap_dss_device *dssdev)
 
 	mutex_init(&td->lock);
 
+	atomic_set(&td->do_update, 0);
+
 	td->esd_wq = create_singlethread_workqueue("taal_esd");
 	if (td->esd_wq = NULL) {
 		dev_err(&dssdev->dev, "can't create ESD workqueue\n");
@@ -606,9 +607,12 @@ static int taal_probe(struct omap_dss_device *dssdev)
 			goto err_irq;
 		}
 
-		init_completion(&td->te_completion);
+		INIT_DELAYED_WORK_DEFERRABLE(&td->te_timeout_work,
+					taal_te_timeout_work_callback);
 
 		td->use_ext_te = true;
+
+		dev_dbg(&dssdev->dev, "Using GPIO TE\n");
 	}
 
 	r = sysfs_create_group(&dssdev->dev.kobj, &taal_attr_group);
@@ -909,6 +913,47 @@ static void taal_framedone_cb(int err, void *data)
 	dsi_bus_unlock();
 }
 
+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);
+	int old;
+	int r;
+
+	old = atomic_cmpxchg(&td->do_update, 1, 0);
+
+	if (old) {
+		cancel_delayed_work(&td->te_timeout_work);
+
+		r = omap_dsi_update(dssdev, TCH,
+				td->update_region.x,
+				td->update_region.y,
+				td->update_region.w,
+				td->update_region.h,
+				taal_framedone_cb, dssdev);
+		if (r)
+			goto err;
+	}
+
+	return IRQ_HANDLED;
+err:
+	dev_err(&dssdev->dev, "start update failed\n");
+	dsi_bus_unlock();
+	return IRQ_HANDLED;
+}
+
+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;
+
+	dev_err(&dssdev->dev, "TE not received for 250ms!\n");
+
+	atomic_set(&td->do_update, 0);
+	dsi_bus_unlock();
+}
+
 static int taal_update(struct omap_dss_device *dssdev,
 				    u16 x, u16 y, u16 w, u16 h)
 {
@@ -933,10 +978,21 @@ static int taal_update(struct omap_dss_device *dssdev,
 	if (r)
 		goto err;
 
-	r = omap_dsi_update(dssdev, TCH, x, y, w, h,
-			taal_framedone_cb, dssdev);
-	if (r)
-		goto err;
+	if (td->te_enabled && td->use_ext_te) {
+		td->update_region.x = x;
+		td->update_region.y = y;
+		td->update_region.w = w;
+		td->update_region.h = h;
+		barrier();
+		schedule_delayed_work(&td->te_timeout_work,
+				msecs_to_jiffies(250));
+		atomic_set(&td->do_update, 1);
+	} else {
+		r = omap_dsi_update(dssdev, TCH, x, y, w, h,
+				taal_framedone_cb, dssdev);
+		if (r)
+			goto err;
+	}
 
 	/* note: no bus_unlock here. unlock is in framedone_cb */
 	mutex_unlock(&td->lock);
@@ -972,7 +1028,8 @@ static int _taal_enable_te(struct omap_dss_device *dssdev, bool enable)
 	else
 		r = taal_dcs_write_0(DCS_TEAR_OFF);
 
-	omapdss_dsi_enable_te(dssdev, enable);
+	if (!td->use_ext_te)
+		omapdss_dsi_enable_te(dssdev, enable);
 
 	/* XXX for some reason, DSI TE breaks if we don't wait here.
 	 * Panel bug? Needs more studying */
-- 
1.6.5.2


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH v3 15/21] OMAP: DSS2: Add Nokia DSI command mode panel configuration struct
  2010-05-05 14:27                           ` [PATCH v3 14/21] OMAP: DSS2: Taal: Add proper external TE support Jani Nikula
@ 2010-05-05 14:27                             ` Jani Nikula
  2010-05-05 14:27                               ` [PATCH v3 16/21] OMAP: DSS2: Taal: Use Nokia DSI panel data Jani Nikula
  0 siblings, 1 reply; 22+ messages in thread
From: Jani Nikula @ 2010-05-05 14:27 UTC (permalink / raw)
  To: Tomi.Valkeinen, tony; +Cc: linux-omap, linux-fbdev, ext-jani.1.nikula

From: Jani Nikula <ext-jani.1.nikula@nokia.com>

Introduce a configuration struct for platform/board specific information
of Nokia DSI command mode panels, to be used in addition to struct
omap_dss_device (passed via the 'void *data' member).

Signed-off-by: Jani Nikula <ext-jani.1.nikula@nokia.com>
---
 arch/arm/plat-omap/include/plat/nokia-dsi-panel.h |   31 +++++++++++++++++++++
 1 files changed, 31 insertions(+), 0 deletions(-)
 create mode 100644 arch/arm/plat-omap/include/plat/nokia-dsi-panel.h

diff --git a/arch/arm/plat-omap/include/plat/nokia-dsi-panel.h b/arch/arm/plat-omap/include/plat/nokia-dsi-panel.h
new file mode 100644
index 0000000..01ab657
--- /dev/null
+++ b/arch/arm/plat-omap/include/plat/nokia-dsi-panel.h
@@ -0,0 +1,31 @@
+#ifndef __ARCH_ARM_PLAT_OMAP_NOKIA_DSI_PANEL_H
+#define __ARCH_ARM_PLAT_OMAP_NOKIA_DSI_PANEL_H
+
+#include "display.h"
+
+/**
+ * struct nokia_dsi_panel_data - Nokia DSI panel driver configuration
+ * @name: panel name
+ * @use_ext_te: use external TE
+ * @ext_te_gpio: external TE GPIO
+ * @use_esd_check: perform ESD checks
+ * @max_backlight_level: maximum backlight level
+ * @set_backlight: pointer to backlight set function
+ * @get_backlight: pointer to backlight get function
+ */
+struct nokia_dsi_panel_data {
+	const char *name;
+
+	int reset_gpio;
+
+	bool use_ext_te;
+	int ext_te_gpio;
+
+	bool use_esd_check;
+
+	int max_backlight_level;
+	int (*set_backlight)(struct omap_dss_device *dssdev, int level);
+	int (*get_backlight)(struct omap_dss_device *dssdev);
+};
+
+#endif /* __ARCH_ARM_PLAT_OMAP_NOKIA_DSI_PANEL_H */
-- 
1.6.5.2


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH v3 16/21] OMAP: DSS2: Taal: Use Nokia DSI panel data
  2010-05-05 14:27                             ` [PATCH v3 15/21] OMAP: DSS2: Add Nokia DSI command mode panel configuration struct Jani Nikula
@ 2010-05-05 14:27                               ` Jani Nikula
  2010-05-05 14:27                                 ` [PATCH v3 17/21] OMAP: DSS2: Taal: Configure ESD check in " Jani Nikula
  0 siblings, 1 reply; 22+ messages in thread
From: Jani Nikula @ 2010-05-05 14:27 UTC (permalink / raw)
  To: Tomi.Valkeinen, tony; +Cc: linux-omap, linux-fbdev, ext-jani.1.nikula

From: Jani Nikula <ext-jani.1.nikula@nokia.com>

Get board specific information from the Nokia DSI panel data structure
instead of the DSS.

Signed-off-by: Jani Nikula <ext-jani.1.nikula@nokia.com>
---
 drivers/video/omap2/displays/panel-taal.c |   59 ++++++++++++++++++----------
 1 files changed, 38 insertions(+), 21 deletions(-)

diff --git a/drivers/video/omap2/displays/panel-taal.c b/drivers/video/omap2/displays/panel-taal.c
index 0c259ab..538829b 100644
--- a/drivers/video/omap2/displays/panel-taal.c
+++ b/drivers/video/omap2/displays/panel-taal.c
@@ -33,6 +33,7 @@
 #include <linux/mutex.h>
 
 #include <plat/display.h>
+#include <plat/nokia-dsi-panel.h>
 
 /* DSI Virtual channel. Hardcoded for now. */
 #define TCH 0
@@ -85,7 +86,6 @@ struct taal_data {
 	bool mirror;
 
 	bool te_enabled;
-	bool use_ext_te;
 
 	atomic_t do_update;
 	struct {
@@ -107,6 +107,12 @@ struct taal_data {
 	struct delayed_work esd_work;
 };
 
+static inline struct nokia_dsi_panel_data
+*get_panel_data(const struct omap_dss_device *dssdev)
+{
+	return (struct nokia_dsi_panel_data *) dssdev->data;
+}
+
 static void taal_esd_work(struct work_struct *work);
 
 static void hw_guard_start(struct taal_data *td, int guard_msec)
@@ -288,6 +294,7 @@ 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 nokia_dsi_panel_data *panel_data = get_panel_data(dssdev);
 	int r;
 	int level;
 
@@ -310,10 +317,10 @@ static int taal_bl_update_status(struct backlight_device *dev)
 			r = 0;
 		}
 	} else {
-		if (!dssdev->set_backlight)
+		if (!panel_data->set_backlight)
 			r = -EINVAL;
 		else
-			r = dssdev->set_backlight(dssdev, level);
+			r = panel_data->set_backlight(dssdev, level);
 	}
 
 	mutex_unlock(&td->lock);
@@ -503,16 +510,18 @@ static struct attribute_group taal_attr_group = {
 
 static void taal_hw_reset(struct omap_dss_device *dssdev)
 {
-	if (dssdev->reset_gpio = -1)
+	struct nokia_dsi_panel_data *panel_data = get_panel_data(dssdev);
+
+	if (panel_data->reset_gpio = -1)
 		return;
 
-	gpio_set_value(dssdev->reset_gpio, 1);
+	gpio_set_value(panel_data->reset_gpio, 1);
 	udelay(10);
 	/* reset the panel */
-	gpio_set_value(dssdev->reset_gpio, 0);
+	gpio_set_value(panel_data->reset_gpio, 0);
 	/* assert reset for at least 10us */
 	udelay(10);
-	gpio_set_value(dssdev->reset_gpio, 1);
+	gpio_set_value(panel_data->reset_gpio, 1);
 	/* wait 5ms after releasing reset */
 	msleep(5);
 }
@@ -522,6 +531,7 @@ static int taal_probe(struct omap_dss_device *dssdev)
 	struct backlight_properties props;
 	struct taal_data *td;
 	struct backlight_device *bldev;
+	struct nokia_dsi_panel_data *panel_data = get_panel_data(dssdev);
 	int r;
 
 	const struct omap_video_timings taal_panel_timings = {
@@ -531,6 +541,11 @@ static int taal_probe(struct omap_dss_device *dssdev)
 
 	dev_dbg(&dssdev->dev, "probe\n");
 
+	if (!panel_data || !panel_data->name) {
+		r = -EINVAL;
+		goto err;
+	}
+
 	dssdev->panel.config = OMAP_DSS_LCD_TFT;
 	dssdev->panel.timings = taal_panel_timings;
 	dssdev->ctrl.pixel_size = 24;
@@ -561,7 +576,7 @@ static int taal_probe(struct omap_dss_device *dssdev)
 	/* if no platform set_backlight() defined, presume DSI backlight
 	 * control */
 	memset(&props, 0, sizeof(props));
-	if (!dssdev->set_backlight)
+	if (!panel_data->set_backlight)
 		td->use_dsi_bl = true;
 
 	if (td->use_dsi_bl)
@@ -586,8 +601,8 @@ static int taal_probe(struct omap_dss_device *dssdev)
 
 	taal_bl_update_status(bldev);
 
-	if (dssdev->phy.dsi.ext_te) {
-		int gpio = dssdev->phy.dsi.ext_te_gpio;
+	if (panel_data->use_ext_te) {
+		int gpio = panel_data->ext_te_gpio;
 
 		r = gpio_request(gpio, "taal irq");
 		if (r) {
@@ -610,8 +625,6 @@ static int taal_probe(struct omap_dss_device *dssdev)
 		INIT_DELAYED_WORK_DEFERRABLE(&td->te_timeout_work,
 					taal_te_timeout_work_callback);
 
-		td->use_ext_te = true;
-
 		dev_dbg(&dssdev->dev, "Using GPIO TE\n");
 	}
 
@@ -623,11 +636,11 @@ static int taal_probe(struct omap_dss_device *dssdev)
 
 	return 0;
 err_sysfs:
-	if (td->use_ext_te)
-		free_irq(gpio_to_irq(dssdev->phy.dsi.ext_te_gpio), dssdev);
+	if (panel_data->use_ext_te)
+		free_irq(gpio_to_irq(panel_data->ext_te_gpio), dssdev);
 err_irq:
-	if (td->use_ext_te)
-		gpio_free(dssdev->phy.dsi.ext_te_gpio);
+	if (panel_data->use_ext_te)
+		gpio_free(panel_data->ext_te_gpio);
 err_gpio:
 	backlight_device_unregister(bldev);
 err_bl:
@@ -641,14 +654,15 @@ err:
 static void taal_remove(struct omap_dss_device *dssdev)
 {
 	struct taal_data *td = dev_get_drvdata(&dssdev->dev);
+	struct nokia_dsi_panel_data *panel_data = get_panel_data(dssdev);
 	struct backlight_device *bldev;
 
 	dev_dbg(&dssdev->dev, "remove\n");
 
 	sysfs_remove_group(&dssdev->dev.kobj, &taal_attr_group);
 
-	if (td->use_ext_te) {
-		int gpio = dssdev->phy.dsi.ext_te_gpio;
+	if (panel_data->use_ext_te) {
+		int gpio = panel_data->ext_te_gpio;
 		free_irq(gpio_to_irq(gpio), dssdev);
 		gpio_free(gpio);
 	}
@@ -958,6 +972,7 @@ 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 nokia_dsi_panel_data *panel_data = get_panel_data(dssdev);
 	int r;
 
 	dev_dbg(&dssdev->dev, "update %d, %d, %d x %d\n", x, y, w, h);
@@ -978,7 +993,7 @@ static int taal_update(struct omap_dss_device *dssdev,
 	if (r)
 		goto err;
 
-	if (td->te_enabled && td->use_ext_te) {
+	if (td->te_enabled && panel_data->use_ext_te) {
 		td->update_region.x = x;
 		td->update_region.y = y;
 		td->update_region.w = w;
@@ -1021,6 +1036,7 @@ static int taal_sync(struct omap_dss_device *dssdev)
 
 static int _taal_enable_te(struct omap_dss_device *dssdev, bool enable)
 {
+	struct nokia_dsi_panel_data *panel_data = get_panel_data(dssdev);
 	int r;
 
 	if (enable)
@@ -1028,7 +1044,7 @@ static int _taal_enable_te(struct omap_dss_device *dssdev, bool enable)
 	else
 		r = taal_dcs_write_0(DCS_TEAR_OFF);
 
-	if (!td->use_ext_te)
+	if (!panel_data->use_ext_te)
 		omapdss_dsi_enable_te(dssdev, enable);
 
 	/* XXX for some reason, DSI TE breaks if we don't wait here.
@@ -1272,6 +1288,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 nokia_dsi_panel_data *panel_data = get_panel_data(dssdev);
 	u8 state1, state2;
 	int r;
 
@@ -1312,7 +1329,7 @@ static void taal_esd_work(struct work_struct *work)
 	}
 	/* Self-diagnostics result is also shown on TE GPIO line. We need
 	 * to re-enable TE after self diagnostics */
-	if (td->use_ext_te && td->te_enabled) {
+	if (td->te_enabled && panel_data->use_ext_te) {
 		r = taal_dcs_write_1(DCS_TEAR_ON, 0);
 		if (r)
 			goto err;
-- 
1.6.5.2


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH v3 17/21] OMAP: DSS2: Taal: Configure ESD check in DSI panel data
  2010-05-05 14:27                               ` [PATCH v3 16/21] OMAP: DSS2: Taal: Use Nokia DSI panel data Jani Nikula
@ 2010-05-05 14:27                                 ` Jani Nikula
  2010-05-05 14:27                                   ` [PATCH v3 18/21] OMAP: DSS2: Taal: Add panel specific configuration structure Jani Nikula
  0 siblings, 1 reply; 22+ messages in thread
From: Jani Nikula @ 2010-05-05 14:27 UTC (permalink / raw)
  To: Tomi.Valkeinen, tony; +Cc: linux-omap, linux-fbdev, ext-jani.1.nikula

From: Jani Nikula <ext-jani.1.nikula@nokia.com>

Make ESD check usage configurable in DSI panel data, as opposed to a

Signed-off-by: Jani Nikula <ext-jani.1.nikula@nokia.com>
---
 drivers/video/omap2/displays/panel-taal.c |   16 ++++++++--------
 1 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/drivers/video/omap2/displays/panel-taal.c b/drivers/video/omap2/displays/panel-taal.c
index 538829b..9502a4d 100644
--- a/drivers/video/omap2/displays/panel-taal.c
+++ b/drivers/video/omap2/displays/panel-taal.c
@@ -62,7 +62,6 @@
 #define DCS_GET_ID2		0xdb
 #define DCS_GET_ID3		0xdc
 
-/* #define TAAL_USE_ESD_CHECK */
 #define TAAL_ESD_CHECK_PERIOD	msecs_to_jiffies(5000)
 
 static irqreturn_t taal_te_isr(int irq, void *data);
@@ -793,6 +792,7 @@ static void taal_power_off(struct omap_dss_device *dssdev)
 static int taal_enable(struct omap_dss_device *dssdev)
 {
 	struct taal_data *td = dev_get_drvdata(&dssdev->dev);
+	struct nokia_dsi_panel_data *panel_data = get_panel_data(dssdev);
 	int r;
 
 	dev_dbg(&dssdev->dev, "enable\n");
@@ -813,9 +813,9 @@ static int taal_enable(struct omap_dss_device *dssdev)
 	if (r)
 		goto err;
 
-#ifdef TAAL_USE_ESD_CHECK
-	queue_delayed_work(td->esd_wq, &td->esd_work, TAAL_ESD_CHECK_PERIOD);
-#endif
+	if (panel_data->use_esd_check)
+		queue_delayed_work(td->esd_wq, &td->esd_work,
+				TAAL_ESD_CHECK_PERIOD);
 
 	dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
 
@@ -885,6 +885,7 @@ err:
 static int taal_resume(struct omap_dss_device *dssdev)
 {
 	struct taal_data *td = dev_get_drvdata(&dssdev->dev);
+	struct nokia_dsi_panel_data *panel_data = get_panel_data(dssdev);
 	int r;
 
 	dev_dbg(&dssdev->dev, "resume\n");
@@ -906,10 +907,9 @@ static int taal_resume(struct omap_dss_device *dssdev)
 		dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
 	} else {
 		dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
-#ifdef TAAL_USE_ESD_CHECK
-		queue_delayed_work(td->esd_wq, &td->esd_work,
-				TAAL_ESD_CHECK_PERIOD);
-#endif
+		if (panel_data->use_esd_check)
+			queue_delayed_work(td->esd_wq, &td->esd_work,
+					TAAL_ESD_CHECK_PERIOD);
 	}
 
 	mutex_unlock(&td->lock);
-- 
1.6.5.2


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH v3 18/21] OMAP: DSS2: Taal: Add panel specific configuration structure
  2010-05-05 14:27                                 ` [PATCH v3 17/21] OMAP: DSS2: Taal: Configure ESD check in " Jani Nikula
@ 2010-05-05 14:27                                   ` Jani Nikula
  2010-05-05 14:27                                     ` [PATCH v3 19/21] OMAP: DSS2: Taal: Print panel name in addition to revision Jani Nikula
  0 siblings, 1 reply; 22+ messages in thread
From: Jani Nikula @ 2010-05-05 14:27 UTC (permalink / raw)
  To: Tomi.Valkeinen, tony; +Cc: linux-omap, linux-fbdev, ext-jani.1.nikula

From: Jani Nikula <ext-jani.1.nikula@nokia.com>

Add a structure for panel specific configration to be able to support
more than one panel in the future.

Signed-off-by: Jani Nikula <ext-jani.1.nikula@nokia.com>
---
 drivers/video/omap2/displays/panel-taal.c |  108 +++++++++++++++++++++++------
 1 files changed, 87 insertions(+), 21 deletions(-)

diff --git a/drivers/video/omap2/displays/panel-taal.c b/drivers/video/omap2/displays/panel-taal.c
index 9502a4d..9f40f32 100644
--- a/drivers/video/omap2/displays/panel-taal.c
+++ b/drivers/video/omap2/displays/panel-taal.c
@@ -68,6 +68,58 @@ static irqreturn_t taal_te_isr(int irq, void *data);
 static void taal_te_timeout_work_callback(struct work_struct *work);
 static int _taal_enable_te(struct omap_dss_device *dssdev, bool enable);
 
+/**
+ * struct panel_config - panel configuration
+ * @name: panel name
+ * @type: panel type
+ * @timings: panel resolution
+ * @sleep: various panel specific delays, passed to msleep() if non-zero
+ * @reset_sequence: reset sequence timings, passed to udelay() if non-zero
+ */
+struct panel_config {
+	const char *name;
+	int type;
+
+	struct omap_video_timings timings;
+
+	struct {
+		unsigned int sleep_in;
+		unsigned int sleep_out;
+		unsigned int hw_reset;
+		unsigned int enable_te;
+	} sleep;
+
+	struct {
+		unsigned int high;
+		unsigned int low;
+	} reset_sequence;
+};
+
+enum {
+	PANEL_TAAL,
+};
+
+static struct panel_config panel_configs[] = {
+	{
+		.name		= "taal",
+		.type		= PANEL_TAAL,
+		.timings	= {
+			.x_res		= 864,
+			.y_res		= 480,
+		},
+		.sleep		= {
+			.sleep_in	= 5,
+			.sleep_out	= 5,
+			.hw_reset	= 5,
+			.enable_te	= 100, /* possible panel bug */
+		},
+		.reset_sequence	= {
+			.high		= 10,
+			.low		= 10,
+		},
+	},
+};
+
 struct taal_data {
 	struct mutex lock;
 
@@ -104,6 +156,8 @@ struct taal_data {
 
 	struct workqueue_struct *esd_wq;
 	struct delayed_work esd_work;
+
+	struct panel_config *panel_config;
 };
 
 static inline struct nokia_dsi_panel_data
@@ -173,7 +227,8 @@ static int taal_sleep_in(struct taal_data *td)
 
 	hw_guard_start(td, 120);
 
-	msleep(5);
+	if (td->panel_config->sleep.sleep_in)
+		msleep(td->panel_config->sleep.sleep_in);
 
 	return 0;
 }
@@ -190,7 +245,8 @@ static int taal_sleep_out(struct taal_data *td)
 
 	hw_guard_start(td, 120);
 
-	msleep(5);
+	if (td->panel_config->sleep.sleep_out)
+		msleep(td->panel_config->sleep.sleep_out);
 
 	return 0;
 }
@@ -509,20 +565,24 @@ 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 nokia_dsi_panel_data *panel_data = get_panel_data(dssdev);
 
 	if (panel_data->reset_gpio = -1)
 		return;
 
 	gpio_set_value(panel_data->reset_gpio, 1);
-	udelay(10);
+	if (td->panel_config->reset_sequence.high)
+		udelay(td->panel_config->reset_sequence.high);
 	/* reset the panel */
 	gpio_set_value(panel_data->reset_gpio, 0);
-	/* assert reset for at least 10us */
-	udelay(10);
+	/* assert reset */
+	if (td->panel_config->reset_sequence.low)
+		udelay(td->panel_config->reset_sequence.low);
 	gpio_set_value(panel_data->reset_gpio, 1);
-	/* wait 5ms after releasing reset */
-	msleep(5);
+	/* wait after releasing reset */
+	if (td->panel_config->sleep.hw_reset)
+		msleep(td->panel_config->sleep.hw_reset);
 }
 
 static int taal_probe(struct omap_dss_device *dssdev)
@@ -531,12 +591,8 @@ static int taal_probe(struct omap_dss_device *dssdev)
 	struct taal_data *td;
 	struct backlight_device *bldev;
 	struct nokia_dsi_panel_data *panel_data = get_panel_data(dssdev);
-	int r;
-
-	const struct omap_video_timings taal_panel_timings = {
-		.x_res		= 864,
-		.y_res		= 480,
-	};
+	struct panel_config *panel_config = NULL;
+	int r, i;
 
 	dev_dbg(&dssdev->dev, "probe\n");
 
@@ -545,8 +601,20 @@ static int taal_probe(struct omap_dss_device *dssdev)
 		goto err;
 	}
 
+	for (i = 0; i < ARRAY_SIZE(panel_configs); i++) {
+		if (strcmp(panel_data->name, panel_configs[i].name) = 0) {
+			panel_config = &panel_configs[i];
+			break;
+		}
+	}
+
+	if (!panel_config) {
+		r = -EINVAL;
+		goto err;
+	}
+
 	dssdev->panel.config = OMAP_DSS_LCD_TFT;
-	dssdev->panel.timings = taal_panel_timings;
+	dssdev->panel.timings = panel_config->timings;
 	dssdev->ctrl.pixel_size = 24;
 
 	td = kzalloc(sizeof(*td), GFP_KERNEL);
@@ -555,6 +623,7 @@ static int taal_probe(struct omap_dss_device *dssdev)
 		goto err;
 	}
 	td->dssdev = dssdev;
+	td->panel_config = panel_config;
 
 	mutex_init(&td->lock);
 
@@ -686,9 +755,6 @@ static int taal_power_on(struct omap_dss_device *dssdev)
 	u8 id1, id2, id3;
 	int r;
 
-	/* it seems we have to wait a bit until taal is ready */
-	msleep(5);
-
 	r = omapdss_dsi_display_enable(dssdev);
 	if (r) {
 		dev_err(&dssdev->dev, "failed to enable DSI\n");
@@ -774,7 +840,7 @@ static void taal_power_off(struct omap_dss_device *dssdev)
 	r = taal_dcs_write_0(DCS_DISPLAY_OFF);
 	if (!r) {
 		r = taal_sleep_in(td);
-		/* wait a bit so that the message goes through */
+		/* HACK: wait a bit so that the message goes through */
 		msleep(10);
 	}
 
@@ -1036,6 +1102,7 @@ static int taal_sync(struct omap_dss_device *dssdev)
 
 static int _taal_enable_te(struct omap_dss_device *dssdev, bool enable)
 {
+	struct taal_data *td = dev_get_drvdata(&dssdev->dev);
 	struct nokia_dsi_panel_data *panel_data = get_panel_data(dssdev);
 	int r;
 
@@ -1047,9 +1114,8 @@ static int _taal_enable_te(struct omap_dss_device *dssdev, bool enable)
 	if (!panel_data->use_ext_te)
 		omapdss_dsi_enable_te(dssdev, enable);
 
-	/* XXX for some reason, DSI TE breaks if we don't wait here.
-	 * Panel bug? Needs more studying */
-	msleep(100);
+	if (td->panel_config->sleep.enable_te)
+		msleep(td->panel_config->sleep.enable_te);
 
 	return r;
 }
-- 
1.6.5.2


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH v3 19/21] OMAP: DSS2: Taal: Print panel name in addition to revision
  2010-05-05 14:27                                   ` [PATCH v3 18/21] OMAP: DSS2: Taal: Add panel specific configuration structure Jani Nikula
@ 2010-05-05 14:27                                     ` Jani Nikula
  2010-05-05 14:27                                       ` [PATCH v3 20/21] OMAP: DSS2: Taal: Add regulator configuration support Jani Nikula
  0 siblings, 1 reply; 22+ messages in thread
From: Jani Nikula @ 2010-05-05 14:27 UTC (permalink / raw)
  To: Tomi.Valkeinen, tony; +Cc: linux-omap, linux-fbdev, ext-jani.1.nikula

From: Jani Nikula <ext-jani.1.nikula@nokia.com>

The driver will support other panels in addition to Taal, print also the
name.

Signed-off-by: Jani Nikula <ext-jani.1.nikula@nokia.com>
---
 drivers/video/omap2/displays/panel-taal.c |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/video/omap2/displays/panel-taal.c b/drivers/video/omap2/displays/panel-taal.c
index 9f40f32..b73cd12 100644
--- a/drivers/video/omap2/displays/panel-taal.c
+++ b/drivers/video/omap2/displays/panel-taal.c
@@ -811,8 +811,8 @@ static int taal_power_on(struct omap_dss_device *dssdev)
 	td->enabled = 1;
 
 	if (!td->intro_printed) {
-		dev_info(&dssdev->dev, "revision %02x.%02x.%02x\n",
-				id1, id2, id3);
+		dev_info(&dssdev->dev, "%s panel revision %02x.%02x.%02x\n",
+			td->panel_config->name, id1, id2, id3);
 		if (td->cabc_broken)
 			dev_info(&dssdev->dev,
 					"old Taal version, CABC disabled\n");
-- 
1.6.5.2


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH v3 20/21] OMAP: DSS2: Taal: Add regulator configuration support
  2010-05-05 14:27                                     ` [PATCH v3 19/21] OMAP: DSS2: Taal: Print panel name in addition to revision Jani Nikula
@ 2010-05-05 14:27                                       ` Jani Nikula
  2010-05-05 14:27                                         ` [PATCH v3 21/21] OMAP: DSS2: Taal: CABC workaround is Taal specific Jani Nikula
  0 siblings, 1 reply; 22+ messages in thread
From: Jani Nikula @ 2010-05-05 14:27 UTC (permalink / raw)
  To: Tomi.Valkeinen, tony; +Cc: linux-omap, linux-fbdev, ext-jani.1.nikula

From: Jani Nikula <ext-jani.1.nikula@nokia.com>

Add support for configuring regulators in the panel specific
configuration data.

Signed-off-by: Jani Nikula <ext-jani.1.nikula@nokia.com>
---
 drivers/video/omap2/displays/panel-taal.c |   83 +++++++++++++++++++++++++++++
 1 files changed, 83 insertions(+), 0 deletions(-)

diff --git a/drivers/video/omap2/displays/panel-taal.c b/drivers/video/omap2/displays/panel-taal.c
index b73cd12..617723b 100644
--- a/drivers/video/omap2/displays/panel-taal.c
+++ b/drivers/video/omap2/displays/panel-taal.c
@@ -30,6 +30,7 @@
 #include <linux/gpio.h>
 #include <linux/workqueue.h>
 #include <linux/slab.h>
+#include <linux/regulator/consumer.h>
 #include <linux/mutex.h>
 
 #include <plat/display.h>
@@ -68,6 +69,73 @@ static irqreturn_t taal_te_isr(int irq, void *data);
 static void taal_te_timeout_work_callback(struct work_struct *work);
 static int _taal_enable_te(struct omap_dss_device *dssdev, bool enable);
 
+struct panel_regulator {
+	struct regulator *regulator;
+	const char *name;
+	int min_uV;
+	int max_uV;
+};
+
+static void free_regulators(struct panel_regulator *regulators, int n)
+{
+	int i;
+
+	for (i = 0; i < n; i++) {
+		/* disable/put in reverse order */
+		regulator_disable(regulators[n - i - 1].regulator);
+		regulator_put(regulators[n - i - 1].regulator);
+	}
+}
+
+static int init_regulators(struct omap_dss_device *dssdev,
+			struct panel_regulator *regulators, int n)
+{
+	int r, i, v;
+
+	for (i = 0; i < n; i++) {
+		struct regulator *reg;
+
+		reg = regulator_get(&dssdev->dev, regulators[i].name);
+		if (IS_ERR(reg)) {
+			dev_err(&dssdev->dev, "failed to get regulator %s\n",
+				regulators[i].name);
+			r = PTR_ERR(reg);
+			goto err;
+		}
+
+		/* FIXME: better handling of fixed vs. variable regulators */
+		v = regulator_get_voltage(reg);
+		if (v < regulators[i].min_uV || v > regulators[i].max_uV) {
+			r = regulator_set_voltage(reg, regulators[i].min_uV,
+						regulators[i].max_uV);
+			if (r) {
+				dev_err(&dssdev->dev,
+					"failed to set regulator %s voltage\n",
+					regulators[i].name);
+				regulator_put(reg);
+				goto err;
+			}
+		}
+
+		r = regulator_enable(reg);
+		if (r) {
+			dev_err(&dssdev->dev, "failed to enable regulator %s\n",
+				regulators[i].name);
+			regulator_put(reg);
+			goto err;
+		}
+
+		regulators[i].regulator = reg;
+	}
+
+	return 0;
+
+err:
+	free_regulators(regulators, i);
+
+	return r;
+}
+
 /**
  * struct panel_config - panel configuration
  * @name: panel name
@@ -75,6 +143,8 @@ static int _taal_enable_te(struct omap_dss_device *dssdev, bool enable);
  * @timings: panel resolution
  * @sleep: various panel specific delays, passed to msleep() if non-zero
  * @reset_sequence: reset sequence timings, passed to udelay() if non-zero
+ * @regulators: array of panel regulators
+ * @num_regulators: number of regulators in the array
  */
 struct panel_config {
 	const char *name;
@@ -93,6 +163,9 @@ struct panel_config {
 		unsigned int high;
 		unsigned int low;
 	} reset_sequence;
+
+	struct panel_regulator *regulators;
+	int num_regulators;
 };
 
 enum {
@@ -629,6 +702,11 @@ static int taal_probe(struct omap_dss_device *dssdev)
 
 	atomic_set(&td->do_update, 0);
 
+	r = init_regulators(dssdev, panel_config->regulators,
+			panel_config->num_regulators);
+	if (r)
+		goto err_reg;
+
 	td->esd_wq = create_singlethread_workqueue("taal_esd");
 	if (td->esd_wq = NULL) {
 		dev_err(&dssdev->dev, "can't create ESD workqueue\n");
@@ -714,6 +792,8 @@ err_gpio:
 err_bl:
 	destroy_workqueue(td->esd_wq);
 err_wq:
+	free_regulators(panel_config->regulators, panel_config->num_regulators);
+err_reg:
 	kfree(td);
 err:
 	return r;
@@ -746,6 +826,9 @@ static void taal_remove(struct omap_dss_device *dssdev)
 	/* reset, to be sure that the panel is in a valid state */
 	taal_hw_reset(dssdev);
 
+	free_regulators(td->panel_config->regulators,
+			td->panel_config->num_regulators);
+
 	kfree(td);
 }
 
-- 
1.6.5.2


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH v3 21/21] OMAP: DSS2: Taal: CABC workaround is Taal specific
  2010-05-05 14:27                                       ` [PATCH v3 20/21] OMAP: DSS2: Taal: Add regulator configuration support Jani Nikula
@ 2010-05-05 14:27                                         ` Jani Nikula
  0 siblings, 0 replies; 22+ messages in thread
From: Jani Nikula @ 2010-05-05 14:27 UTC (permalink / raw)
  To: Tomi.Valkeinen, tony; +Cc: linux-omap, linux-fbdev, ext-jani.1.nikula

From: Jani Nikula <ext-jani.1.nikula@nokia.com>

Prepare for supporting panels other than Taal in this driver.

Signed-off-by: Jani Nikula <ext-jani.1.nikula@nokia.com>
---
 drivers/video/omap2/displays/panel-taal.c |    5 +++--
 1 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/video/omap2/displays/panel-taal.c b/drivers/video/omap2/displays/panel-taal.c
index 617723b..981e38d 100644
--- a/drivers/video/omap2/displays/panel-taal.c
+++ b/drivers/video/omap2/displays/panel-taal.c
@@ -856,8 +856,9 @@ static int taal_power_on(struct omap_dss_device *dssdev)
 	if (r)
 		goto err;
 
-	/* on early revisions CABC is broken */
-	if (id2 = 0x00 || id2 = 0xff || id2 = 0x81)
+	/* on early Taal revisions CABC is broken */
+	if (td->panel_config->type = PANEL_TAAL &&
+		(id2 = 0x00 || id2 = 0xff || id2 = 0x81))
 		td->cabc_broken = true;
 
 	r = taal_dcs_write_1(DCS_BRIGHTNESS, 0xff);
-- 
1.6.5.2


^ permalink raw reply related	[flat|nested] 22+ messages in thread

end of thread, other threads:[~2010-05-05 14:27 UTC | newest]

Thread overview: 22+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-05-05 14:27 [PATCH v3 00/21] OMAP: DSS2: Taal panel driver updates Jani Nikula
2010-05-05 14:27 ` [PATCH v3 01/21] OMAP: DSS2: Taal: Add panel hardware reset Jani Nikula
2010-05-05 14:27   ` [PATCH v3 02/21] OMAP: DSS2: Taal: add locks to taal_bl_update_status Jani Nikula
2010-05-05 14:27     ` [PATCH v3 03/21] OMAP: DSS2: Taal: Add locks to protect taal data access Jani Nikula
2010-05-05 14:27       ` [PATCH v3 04/21] OMAP: DSS2: Taal: Cosmetic improvement to backlight properties initialization Jani Nikula
2010-05-05 14:27         ` [PATCH v3 05/21] OMAP: DSS2: Taal: Remove platform enable/disable Jani Nikula
2010-05-05 14:27           ` [PATCH v3 06/21] OMAP: DSS2: Taal: Fix request_irq() error handling Jani Nikula
2010-05-05 14:27             ` [PATCH v3 07/21] OMAP: DSS2: Taal: Remove ESD work cancel from driver probe " Jani Nikula
2010-05-05 14:27               ` [PATCH v3 08/21] OMAP: DSS2: Taal: Improve taal_power_on() " Jani Nikula
2010-05-05 14:27                 ` [PATCH v3 09/21] OMAP: DSS2: Taal: Ensure panel is enabled in enable_te() and run_test() Jani Nikula
2010-05-05 14:27                   ` [PATCH v3 10/21] OMAP: DSS2: Taal: Change DSI bus locking to avoid deadlock in ESD work Jani Nikula
2010-05-05 14:27                     ` [PATCH v3 11/21] OMAP: DSS2: Taal: Check taal_power_on() return value in taal_resume() Jani Nikula
2010-05-05 14:27                       ` [PATCH v3 12/21] OMAP: DSS2: Taal: Change ESD work management Jani Nikula
2010-05-05 14:27                         ` [PATCH v3 13/21] OMAP: DSS2: Taal: Change probe error handling labels Jani Nikula
2010-05-05 14:27                           ` [PATCH v3 14/21] OMAP: DSS2: Taal: Add proper external TE support Jani Nikula
2010-05-05 14:27                             ` [PATCH v3 15/21] OMAP: DSS2: Add Nokia DSI command mode panel configuration struct Jani Nikula
2010-05-05 14:27                               ` [PATCH v3 16/21] OMAP: DSS2: Taal: Use Nokia DSI panel data Jani Nikula
2010-05-05 14:27                                 ` [PATCH v3 17/21] OMAP: DSS2: Taal: Configure ESD check in " Jani Nikula
2010-05-05 14:27                                   ` [PATCH v3 18/21] OMAP: DSS2: Taal: Add panel specific configuration structure Jani Nikula
2010-05-05 14:27                                     ` [PATCH v3 19/21] OMAP: DSS2: Taal: Print panel name in addition to revision Jani Nikula
2010-05-05 14:27                                       ` [PATCH v3 20/21] OMAP: DSS2: Taal: Add regulator configuration support Jani Nikula
2010-05-05 14:27                                         ` [PATCH v3 21/21] OMAP: DSS2: Taal: CABC workaround is Taal specific Jani Nikula

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).