forked from mirrors/linux
		
	drm/panel-simple: Non-eDP panels don't need "HPD" handling
All of the "HPD" handling added to panel-simple recently was for eDP panels. Remove it from panel-simple now that panel-edp handles eDP panels. The "prepare_to_enable" delay only makes sense in the context of HPD, so remove it too. No non-eDP panels used it anyway. Signed-off-by: Douglas Anderson <dianders@chromium.org> Acked-by: Sam Ravnborg <sam@ravnborg.org> Acked-by: Linus Walleij <linus.walleij@linaro.org> Link: https://patchwork.freedesktop.org/patch/msgid/20210914132020.v5.9.I77d7a48df0a6585ef2cc2ff140fbe8f236a9a9f7@changeid
This commit is contained in:
		
							parent
							
								
									3fd68b7b13
								
							
						
					
					
						commit
						b6d5ffce11
					
				
					 1 changed files with 4 additions and 130 deletions
				
			
		| 
						 | 
				
			
			@ -23,7 +23,6 @@
 | 
			
		|||
 | 
			
		||||
#include <linux/delay.h>
 | 
			
		||||
#include <linux/gpio/consumer.h>
 | 
			
		||||
#include <linux/iopoll.h>
 | 
			
		||||
#include <linux/module.h>
 | 
			
		||||
#include <linux/of_platform.h>
 | 
			
		||||
#include <linux/platform_device.h>
 | 
			
		||||
| 
						 | 
				
			
			@ -92,44 +91,6 @@ struct panel_desc {
 | 
			
		|||
		 */
 | 
			
		||||
		unsigned int prepare;
 | 
			
		||||
 | 
			
		||||
		/**
 | 
			
		||||
		 * @delay.hpd_absent_delay: Time to wait if HPD isn't hooked up.
 | 
			
		||||
		 *
 | 
			
		||||
		 * Add this to the prepare delay if we know Hot Plug Detect
 | 
			
		||||
		 * isn't used.
 | 
			
		||||
		 */
 | 
			
		||||
		unsigned int hpd_absent_delay;
 | 
			
		||||
 | 
			
		||||
		/**
 | 
			
		||||
		 * @delay.prepare_to_enable: Time between prepare and enable.
 | 
			
		||||
		 *
 | 
			
		||||
		 * The minimum time, in milliseconds, that needs to have passed
 | 
			
		||||
		 * between when prepare finished and enable may begin. If at
 | 
			
		||||
		 * enable time less time has passed since prepare finished,
 | 
			
		||||
		 * the driver waits for the remaining time.
 | 
			
		||||
		 *
 | 
			
		||||
		 * If a fixed enable delay is also specified, we'll start
 | 
			
		||||
		 * counting before delaying for the fixed delay.
 | 
			
		||||
		 *
 | 
			
		||||
		 * If a fixed prepare delay is also specified, we won't start
 | 
			
		||||
		 * counting until after the fixed delay. We can't overlap this
 | 
			
		||||
		 * fixed delay with the min time because the fixed delay
 | 
			
		||||
		 * doesn't happen at the end of the function if a HPD GPIO was
 | 
			
		||||
		 * specified.
 | 
			
		||||
		 *
 | 
			
		||||
		 * In other words:
 | 
			
		||||
		 *   prepare()
 | 
			
		||||
		 *     ...
 | 
			
		||||
		 *     // do fixed prepare delay
 | 
			
		||||
		 *     // wait for HPD GPIO if applicable
 | 
			
		||||
		 *     // start counting for prepare_to_enable
 | 
			
		||||
		 *
 | 
			
		||||
		 *   enable()
 | 
			
		||||
		 *     // do fixed enable delay
 | 
			
		||||
		 *     // enforce prepare_to_enable min time
 | 
			
		||||
		 */
 | 
			
		||||
		unsigned int prepare_to_enable;
 | 
			
		||||
 | 
			
		||||
		/**
 | 
			
		||||
		 * @delay.enable: Time for the panel to display a valid frame.
 | 
			
		||||
		 *
 | 
			
		||||
| 
						 | 
				
			
			@ -174,7 +135,6 @@ struct panel_desc {
 | 
			
		|||
struct panel_simple {
 | 
			
		||||
	struct drm_panel base;
 | 
			
		||||
	bool enabled;
 | 
			
		||||
	bool no_hpd;
 | 
			
		||||
 | 
			
		||||
	bool prepared;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -187,7 +147,6 @@ struct panel_simple {
 | 
			
		|||
	struct i2c_adapter *ddc;
 | 
			
		||||
 | 
			
		||||
	struct gpio_desc *enable_gpio;
 | 
			
		||||
	struct gpio_desc *hpd_gpio;
 | 
			
		||||
 | 
			
		||||
	struct edid *edid;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -371,31 +330,11 @@ static int panel_simple_unprepare(struct drm_panel *panel)
 | 
			
		|||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int panel_simple_get_hpd_gpio(struct device *dev, struct panel_simple *p)
 | 
			
		||||
static int panel_simple_resume(struct device *dev)
 | 
			
		||||
{
 | 
			
		||||
	struct panel_simple *p = dev_get_drvdata(dev);
 | 
			
		||||
	int err;
 | 
			
		||||
 | 
			
		||||
	p->hpd_gpio = devm_gpiod_get_optional(dev, "hpd", GPIOD_IN);
 | 
			
		||||
	if (IS_ERR(p->hpd_gpio)) {
 | 
			
		||||
		err = PTR_ERR(p->hpd_gpio);
 | 
			
		||||
 | 
			
		||||
		if (err != -EPROBE_DEFER)
 | 
			
		||||
			dev_err(dev, "failed to get 'hpd' GPIO: %d\n", err);
 | 
			
		||||
 | 
			
		||||
		return err;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int panel_simple_prepare_once(struct panel_simple *p)
 | 
			
		||||
{
 | 
			
		||||
	struct device *dev = p->base.dev;
 | 
			
		||||
	unsigned int delay;
 | 
			
		||||
	int err;
 | 
			
		||||
	int hpd_asserted;
 | 
			
		||||
	unsigned long hpd_wait_us;
 | 
			
		||||
 | 
			
		||||
	panel_simple_wait(p->unprepared_time, p->desc->delay.unprepare);
 | 
			
		||||
 | 
			
		||||
	err = regulator_enable(p->supply);
 | 
			
		||||
| 
						 | 
				
			
			@ -406,68 +345,12 @@ static int panel_simple_prepare_once(struct panel_simple *p)
 | 
			
		|||
 | 
			
		||||
	gpiod_set_value_cansleep(p->enable_gpio, 1);
 | 
			
		||||
 | 
			
		||||
	delay = p->desc->delay.prepare;
 | 
			
		||||
	if (p->no_hpd)
 | 
			
		||||
		delay += p->desc->delay.hpd_absent_delay;
 | 
			
		||||
	if (delay)
 | 
			
		||||
		msleep(delay);
 | 
			
		||||
 | 
			
		||||
	if (p->hpd_gpio) {
 | 
			
		||||
		if (p->desc->delay.hpd_absent_delay)
 | 
			
		||||
			hpd_wait_us = p->desc->delay.hpd_absent_delay * 1000UL;
 | 
			
		||||
		else
 | 
			
		||||
			hpd_wait_us = 2000000;
 | 
			
		||||
 | 
			
		||||
		err = readx_poll_timeout(gpiod_get_value_cansleep, p->hpd_gpio,
 | 
			
		||||
					 hpd_asserted, hpd_asserted,
 | 
			
		||||
					 1000, hpd_wait_us);
 | 
			
		||||
		if (hpd_asserted < 0)
 | 
			
		||||
			err = hpd_asserted;
 | 
			
		||||
 | 
			
		||||
		if (err) {
 | 
			
		||||
			if (err != -ETIMEDOUT)
 | 
			
		||||
				dev_err(dev,
 | 
			
		||||
					"error waiting for hpd GPIO: %d\n", err);
 | 
			
		||||
			goto error;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if (p->desc->delay.prepare)
 | 
			
		||||
		msleep(p->desc->delay.prepare);
 | 
			
		||||
 | 
			
		||||
	p->prepared_time = ktime_get();
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
 | 
			
		||||
error:
 | 
			
		||||
	gpiod_set_value_cansleep(p->enable_gpio, 0);
 | 
			
		||||
	regulator_disable(p->supply);
 | 
			
		||||
	p->unprepared_time = ktime_get();
 | 
			
		||||
 | 
			
		||||
	return err;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Some panels simply don't always come up and need to be power cycled to
 | 
			
		||||
 * work properly.  We'll allow for a handful of retries.
 | 
			
		||||
 */
 | 
			
		||||
#define MAX_PANEL_PREPARE_TRIES		5
 | 
			
		||||
 | 
			
		||||
static int panel_simple_resume(struct device *dev)
 | 
			
		||||
{
 | 
			
		||||
	struct panel_simple *p = dev_get_drvdata(dev);
 | 
			
		||||
	int ret;
 | 
			
		||||
	int try;
 | 
			
		||||
 | 
			
		||||
	for (try = 0; try < MAX_PANEL_PREPARE_TRIES; try++) {
 | 
			
		||||
		ret = panel_simple_prepare_once(p);
 | 
			
		||||
		if (ret != -ETIMEDOUT)
 | 
			
		||||
			break;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (ret == -ETIMEDOUT)
 | 
			
		||||
		dev_err(dev, "Prepare timeout after %d tries\n", try);
 | 
			
		||||
	else if (try)
 | 
			
		||||
		dev_warn(dev, "Prepare needed %d retries\n", try);
 | 
			
		||||
 | 
			
		||||
	return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int panel_simple_prepare(struct drm_panel *panel)
 | 
			
		||||
| 
						 | 
				
			
			@ -500,8 +383,6 @@ static int panel_simple_enable(struct drm_panel *panel)
 | 
			
		|||
	if (p->desc->delay.enable)
 | 
			
		||||
		msleep(p->desc->delay.enable);
 | 
			
		||||
 | 
			
		||||
	panel_simple_wait(p->prepared_time, p->desc->delay.prepare_to_enable);
 | 
			
		||||
 | 
			
		||||
	p->enabled = true;
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
| 
						 | 
				
			
			@ -674,13 +555,6 @@ static int panel_simple_probe(struct device *dev, const struct panel_desc *desc)
 | 
			
		|||
	panel->prepared_time = 0;
 | 
			
		||||
	panel->desc = desc;
 | 
			
		||||
 | 
			
		||||
	panel->no_hpd = of_property_read_bool(dev->of_node, "no-hpd");
 | 
			
		||||
	if (!panel->no_hpd) {
 | 
			
		||||
		err = panel_simple_get_hpd_gpio(dev, panel);
 | 
			
		||||
		if (err)
 | 
			
		||||
			return err;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	panel->supply = devm_regulator_get(dev, "power");
 | 
			
		||||
	if (IS_ERR(panel->supply))
 | 
			
		||||
		return PTR_ERR(panel->supply);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue