|
@@ -56,6 +56,8 @@ struct panel_desc {
|
|
|
/**
|
|
|
* @prepare: the time (in milliseconds) that it takes for the panel to
|
|
|
* become ready and start receiving video data
|
|
|
+ * @hpd_absent_delay: Add this to the prepare delay if we know Hot
|
|
|
+ * Plug Detect isn't used.
|
|
|
* @enable: the time (in milliseconds) that it takes for the panel to
|
|
|
* display the first valid frame after starting to receive
|
|
|
* video data
|
|
@@ -66,6 +68,7 @@ struct panel_desc {
|
|
|
*/
|
|
|
struct {
|
|
|
unsigned int prepare;
|
|
|
+ unsigned int hpd_absent_delay;
|
|
|
unsigned int enable;
|
|
|
unsigned int disable;
|
|
|
unsigned int unprepare;
|
|
@@ -79,6 +82,7 @@ struct panel_simple {
|
|
|
struct drm_panel base;
|
|
|
bool prepared;
|
|
|
bool enabled;
|
|
|
+ bool no_hpd;
|
|
|
|
|
|
const struct panel_desc *desc;
|
|
|
|
|
@@ -202,6 +206,7 @@ static int panel_simple_unprepare(struct drm_panel *panel)
|
|
|
static int panel_simple_prepare(struct drm_panel *panel)
|
|
|
{
|
|
|
struct panel_simple *p = to_panel_simple(panel);
|
|
|
+ unsigned int delay;
|
|
|
int err;
|
|
|
|
|
|
if (p->prepared)
|
|
@@ -215,8 +220,11 @@ static int panel_simple_prepare(struct drm_panel *panel)
|
|
|
|
|
|
gpiod_set_value_cansleep(p->enable_gpio, 1);
|
|
|
|
|
|
- if (p->desc->delay.prepare)
|
|
|
- msleep(p->desc->delay.prepare);
|
|
|
+ delay = p->desc->delay.prepare;
|
|
|
+ if (p->no_hpd)
|
|
|
+ delay += p->desc->delay.hpd_absent_delay;
|
|
|
+ if (delay)
|
|
|
+ msleep(delay);
|
|
|
|
|
|
p->prepared = true;
|
|
|
|
|
@@ -305,6 +313,8 @@ static int panel_simple_probe(struct device *dev, const struct panel_desc *desc)
|
|
|
panel->prepared = false;
|
|
|
panel->desc = desc;
|
|
|
|
|
|
+ panel->no_hpd = of_property_read_bool(dev->of_node, "no-hpd");
|
|
|
+
|
|
|
panel->supply = devm_regulator_get(dev, "power");
|
|
|
if (IS_ERR(panel->supply))
|
|
|
return PTR_ERR(panel->supply);
|