drm/panel: simple: Add reset gpio

Change-Id: I12a4495a5897535b2a2fe8117a626ee7639dfef0
Signed-off-by: Wyon Bi <bivvy.bi@rock-chips.com>
This commit is contained in:
Wyon Bi 2019-07-04 09:14:54 +08:00 committed by Tao Huang
parent d75f6df07e
commit 12353d7243

View File

@ -83,6 +83,8 @@ struct panel_desc {
* turn the display off (no content is visible)
* @unprepare: the time (in milliseconds) that it takes for the panel
* to power itself down completely
* @reset: the time (in milliseconds) that it takes for the panel
* to reset itself completely
*/
struct {
unsigned int prepare;
@ -90,6 +92,7 @@ struct panel_desc {
unsigned int enable;
unsigned int disable;
unsigned int unprepare;
unsigned int reset;
} delay;
u32 bus_format;
@ -109,6 +112,7 @@ struct panel_simple {
struct i2c_adapter *ddc;
struct gpio_desc *enable_gpio;
struct gpio_desc *reset_gpio;
struct gpio_desc *hpd_gpio;
struct drm_display_mode override_mode;
@ -256,6 +260,7 @@ static int panel_simple_unprepare(struct drm_panel *panel)
if (!p->prepared)
return 0;
gpiod_set_value_cansleep(p->reset_gpio, 1);
gpiod_set_value_cansleep(p->enable_gpio, 0);
regulator_disable(p->supply);
@ -311,6 +316,16 @@ static int panel_simple_prepare(struct drm_panel *panel)
gpiod_set_value_cansleep(p->enable_gpio, 1);
if (p->desc->delay.reset)
msleep(p->desc->delay.prepare);
gpiod_set_value_cansleep(p->reset_gpio, 1);
if (p->desc->delay.reset)
msleep(p->desc->delay.reset);
gpiod_set_value_cansleep(p->reset_gpio, 0);
delay = p->desc->delay.prepare;
if (p->no_hpd)
delay += p->desc->delay.hpd_absent_delay;
@ -537,7 +552,15 @@ static int panel_simple_probe(struct device *dev, const struct panel_desc *desc)
if (IS_ERR(panel->enable_gpio)) {
err = PTR_ERR(panel->enable_gpio);
if (err != -EPROBE_DEFER)
dev_err(dev, "failed to request GPIO: %d\n", err);
dev_err(dev, "failed to get enable GPIO: %d\n", err);
return err;
}
panel->reset_gpio = devm_gpiod_get_optional(dev, "reset", GPIOD_ASIS);
if (IS_ERR(panel->reset_gpio)) {
err = PTR_ERR(panel->reset_gpio);
if (err != -EPROBE_DEFER)
dev_err(dev, "failed to get reset GPIO: %d\n", err);
return err;
}
@ -4345,6 +4368,7 @@ static int panel_simple_of_get_desc_data(struct device *dev,
of_property_read_u32(np, "enable-delay-ms", &desc->delay.enable);
of_property_read_u32(np, "disable-delay-ms", &desc->delay.disable);
of_property_read_u32(np, "unprepare-delay-ms", &desc->delay.unprepare);
of_property_read_u32(np, "reset-delay-ms", &desc->delay.reset);
return 0;
}