Skip to content

Commit

Permalink
fbdev: omapfb: panel-sony-acx565akm: switch to using gpiod API
Browse files Browse the repository at this point in the history
Switch the driver from legacy gpio API that is deprecated to the newer
gpiod API that respects line polarities described in ACPI/DT.

Note that because existing DTSes specify incorrect polarity of reset
lines (active high) and GPU drivers have adopted to this, we follow
the suit and use inverted values when controlling reset lines.

Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Signed-off-by: Helge Deller <deller@gmx.de>
  • Loading branch information
dtor authored and hdeller committed Dec 14, 2022
1 parent 5845b32 commit 844c245
Showing 1 changed file with 31 additions and 35 deletions.
66 changes: 31 additions & 35 deletions drivers/video/fbdev/omap2/omapfb/displays/panel-sony-acx565akm.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,8 @@
#include <linux/sched.h>
#include <linux/backlight.h>
#include <linux/fb.h>
#include <linux/gpio.h>
#include <linux/gpio/consumer.h>
#include <linux/of.h>
#include <linux/of_gpio.h>

#include <video/omapfb_dss.h>

Expand Down Expand Up @@ -56,7 +55,8 @@ struct panel_drv_data {
struct omap_dss_device dssdev;
struct omap_dss_device *in;

int reset_gpio;
struct gpio_desc *reset_gpio;

int datapairs;

struct omap_video_timings videomode;
Expand Down Expand Up @@ -545,8 +545,13 @@ static int acx565akm_panel_power_on(struct omap_dss_device *dssdev)
/*FIXME tweak me */
msleep(50);

if (gpio_is_valid(ddata->reset_gpio))
gpio_set_value(ddata->reset_gpio, 1);
/*
* Note that we appear to activate the reset line here. However
* existing DTSes specified incorrect polarity for it (active high),
* so in fact this deasserts the reset line.
*/
if (ddata->reset_gpio)
gpiod_set_value_cansleep(ddata->reset_gpio, 1);

if (ddata->enabled) {
dev_dbg(&ddata->spi->dev, "panel already enabled\n");
Expand Down Expand Up @@ -595,8 +600,9 @@ static void acx565akm_panel_power_off(struct omap_dss_device *dssdev)
*/
msleep(50);

if (gpio_is_valid(ddata->reset_gpio))
gpio_set_value(ddata->reset_gpio, 0);
/* see comment in acx565akm_panel_power_on() */
if (ddata->reset_gpio)
gpiod_set_value_cansleep(ddata->reset_gpio, 0);

/* FIXME need to tweak this delay */
msleep(100);
Expand Down Expand Up @@ -687,22 +693,6 @@ static struct omap_dss_driver acx565akm_ops = {
.get_resolution = omapdss_default_get_resolution,
};

static int acx565akm_probe_of(struct spi_device *spi)
{
struct panel_drv_data *ddata = dev_get_drvdata(&spi->dev);
struct device_node *np = spi->dev.of_node;

ddata->reset_gpio = of_get_named_gpio(np, "reset-gpios", 0);

ddata->in = omapdss_of_find_source_for_first_ep(np);
if (IS_ERR(ddata->in)) {
dev_err(&spi->dev, "failed to find video source\n");
return PTR_ERR(ddata->in);
}

return 0;
}

static int acx565akm_probe(struct spi_device *spi)
{
struct panel_drv_data *ddata;
Expand All @@ -729,19 +719,25 @@ static int acx565akm_probe(struct spi_device *spi)

mutex_init(&ddata->mutex);

r = acx565akm_probe_of(spi);
if (r)
ddata->in = omapdss_of_find_source_for_first_ep(spi->dev.of_node);
r = PTR_ERR_OR_ZERO(ddata->in);
if (r) {
dev_err(&spi->dev, "failed to find video source\n");
return r;

if (gpio_is_valid(ddata->reset_gpio)) {
r = devm_gpio_request_one(&spi->dev, ddata->reset_gpio,
GPIOF_OUT_INIT_LOW, "lcd reset");
if (r)
goto err_gpio;
}

if (gpio_is_valid(ddata->reset_gpio))
gpio_set_value(ddata->reset_gpio, 1);
ddata->reset_gpio = devm_gpiod_get_optional(&spi->dev, "reset",
GPIOD_OUT_LOW);
r = PTR_ERR_OR_ZERO(ddata->reset_gpio);
if (r)
goto err_gpio;

if (ddata->reset_gpio) {
gpiod_set_consumer_name(ddata->reset_gpio, "lcd reset");

/* release the reset line */
gpiod_set_value_cansleep(ddata->reset_gpio, 1);
}

/*
* After reset we have to wait 5 msec before the first
Expand All @@ -753,8 +749,8 @@ static int acx565akm_probe(struct spi_device *spi)

r = panel_detect(ddata);

if (!ddata->enabled && gpio_is_valid(ddata->reset_gpio))
gpio_set_value(ddata->reset_gpio, 0);
if (!ddata->enabled && ddata->reset_gpio)
gpiod_set_value_cansleep(ddata->reset_gpio, 0);

if (r) {
dev_err(&spi->dev, "%s panel detect error\n", __func__);
Expand Down

0 comments on commit 844c245

Please sign in to comment.