mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-07 11:26:02 +09:00
drm/panel: simple: Add reset gpio
Change-Id: I12a4495a5897535b2a2fe8117a626ee7639dfef0 Signed-off-by: Wyon Bi <bivvy.bi@rock-chips.com>
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user