.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;
 
        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));
        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);
 }
 
                goto err0;
        }
 
+       taal_hw_reset(dssdev);
+
        omapdss_dsi_vc_enable_hs(TCH, false);
 
        r = taal_sleep_out(td);
 
        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();
 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);
 
        dev_err(&dssdev->dev, "performing LCD reset\n");
 
        taal_power_off(dssdev);
+       taal_hw_reset(dssdev);
        taal_power_on(dssdev);
 
        dsi_bus_unlock();