Commit 172c1e85 authored by Linus Walleij's avatar Linus Walleij Committed by Patrik Jakobsson

drm: gma500: Convert to GPIO descriptors

Finalize he conversion of GMA500 to use only GPIO descriptors.
The GPIO look-up-table is associated with the device directly
in the GMA500 Medfield chip driver since no explicit platform
type device (such as in x86/platform/intel-mid) exists: the
GMA500 probes directly from the PCI device. Apparently GPIOs
128 and 34 are used on all of these so just go ahead and
register those for resetting the DSI pipes.
Acked-by: default avatarPatrik Jakobsson <patrik.r.jakobsson@gmail.com>
Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
Signed-off-by: default avatarPatrik Jakobsson <patrik.r.jakobsson@gmail.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20200703125901.513476-1-linus.walleij@linaro.org
parent 9c6b876c
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
**************************************************************************/ **************************************************************************/
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/gpio/machine.h>
#include <asm/intel_scu_ipc.h> #include <asm/intel_scu_ipc.h>
...@@ -505,12 +506,31 @@ static const struct psb_offset mdfld_regmap[3] = { ...@@ -505,12 +506,31 @@ static const struct psb_offset mdfld_regmap[3] = {
}, },
}; };
/*
* The GPIO lines for resetting DSI pipe 0 and 2 are available in the
* PCI device 0000:00:0c.0 on the Medfield.
*/
static struct gpiod_lookup_table mdfld_dsi_pipe_gpio_table = {
.table = {
GPIO_LOOKUP("0000:00:0c.0", 128, "dsi-pipe0-reset",
GPIO_ACTIVE_HIGH),
GPIO_LOOKUP("0000:00:0c.0", 34, "dsi-pipe2-reset",
GPIO_ACTIVE_HIGH),
{ },
},
};
static int mdfld_chip_setup(struct drm_device *dev) static int mdfld_chip_setup(struct drm_device *dev)
{ {
struct drm_psb_private *dev_priv = dev->dev_private; struct drm_psb_private *dev_priv = dev->dev_private;
if (pci_enable_msi(dev->pdev)) if (pci_enable_msi(dev->pdev))
dev_warn(dev->dev, "Enabling MSI failed!\n"); dev_warn(dev->dev, "Enabling MSI failed!\n");
dev_priv->regmap = mdfld_regmap; dev_priv->regmap = mdfld_regmap;
/* Associate the GPIO lines with the DRM device */
mdfld_dsi_pipe_gpio_table.dev_id = dev_name(dev->dev);
gpiod_add_lookup_table(&mdfld_dsi_pipe_gpio_table);
return mid_chip_setup(dev); return mid_chip_setup(dev);
} }
......
...@@ -955,7 +955,7 @@ struct mdfld_dsi_encoder *mdfld_dsi_dpi_init(struct drm_device *dev, ...@@ -955,7 +955,7 @@ struct mdfld_dsi_encoder *mdfld_dsi_dpi_init(struct drm_device *dev,
/* panel hard-reset */ /* panel hard-reset */
if (p_funcs->reset) { if (p_funcs->reset) {
ret = p_funcs->reset(pipe); ret = p_funcs->reset(dev, pipe);
if (ret) { if (ret) {
DRM_ERROR("Panel %d hard-reset failed\n", pipe); DRM_ERROR("Panel %d hard-reset failed\n", pipe);
return NULL; return NULL;
......
...@@ -28,6 +28,7 @@ ...@@ -28,6 +28,7 @@
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/moduleparam.h> #include <linux/moduleparam.h>
#include <linux/pm_runtime.h> #include <linux/pm_runtime.h>
#include <linux/gpio/consumer.h>
#include <asm/intel_scu_ipc.h> #include <asm/intel_scu_ipc.h>
...@@ -432,42 +433,42 @@ static int mdfld_dsi_get_default_config(struct drm_device *dev, ...@@ -432,42 +433,42 @@ static int mdfld_dsi_get_default_config(struct drm_device *dev,
return 0; return 0;
} }
int mdfld_dsi_panel_reset(int pipe) int mdfld_dsi_panel_reset(struct drm_device *ddev, int pipe)
{ {
unsigned gpio; struct device *dev = ddev->dev;
int ret = 0; struct gpio_desc *gpiod;
/*
* Raise the GPIO reset line for the corresponding pipe to HIGH,
* this is probably because it is active low so this takes the
* respective pipe out of reset. (We have no code to put it back
* into reset in this driver.)
*/
switch (pipe) { switch (pipe) {
case 0: case 0:
gpio = 128; gpiod = gpiod_get(dev, "dsi-pipe0-reset", GPIOD_OUT_HIGH);
if (IS_ERR(gpiod))
return PTR_ERR(gpiod);
break; break;
case 2: case 2:
gpio = 34; gpiod = gpiod_get(dev, "dsi-pipe2-reset", GPIOD_OUT_HIGH);
if (IS_ERR(gpiod))
return PTR_ERR(gpiod);
break; break;
default: default:
DRM_ERROR("Invalid output\n"); DRM_DEV_ERROR(dev, "Invalid output pipe\n");
return -EINVAL; return -EINVAL;
} }
gpiod_put(gpiod);
ret = gpio_request(gpio, "gfx"); /* Flush posted writes on the device */
if (ret) { gpiod = gpiod_get(dev, "dsi-pipe0-reset", GPIOD_ASIS);
DRM_ERROR("gpio_rqueset failed\n"); if (IS_ERR(gpiod))
return ret; return PTR_ERR(gpiod);
} gpiod_get_value(gpiod);
gpiod_put(gpiod);
ret = gpio_direction_output(gpio, 1);
if (ret) {
DRM_ERROR("gpio_direction_output failed\n");
goto gpio_error;
}
gpio_get_value(128); return 0;
gpio_error:
if (gpio_is_valid(gpio))
gpio_free(gpio);
return ret;
} }
/* /*
......
...@@ -372,6 +372,6 @@ extern void mdfld_dsi_controller_init(struct mdfld_dsi_config *dsi_config, ...@@ -372,6 +372,6 @@ extern void mdfld_dsi_controller_init(struct mdfld_dsi_config *dsi_config,
extern int mdfld_dsi_get_power_mode(struct mdfld_dsi_config *dsi_config, extern int mdfld_dsi_get_power_mode(struct mdfld_dsi_config *dsi_config,
u32 *mode, bool hs); u32 *mode, bool hs);
extern int mdfld_dsi_panel_reset(int pipe); extern int mdfld_dsi_panel_reset(struct drm_device *dev, int pipe);
#endif /*__MDFLD_DSI_OUTPUT_H__*/ #endif /*__MDFLD_DSI_OUTPUT_H__*/
...@@ -54,7 +54,7 @@ struct panel_funcs { ...@@ -54,7 +54,7 @@ struct panel_funcs {
const struct drm_encoder_helper_funcs *encoder_helper_funcs; const struct drm_encoder_helper_funcs *encoder_helper_funcs;
struct drm_display_mode * (*get_config_mode)(struct drm_device *); struct drm_display_mode * (*get_config_mode)(struct drm_device *);
int (*get_panel_info)(struct drm_device *, int, struct panel_info *); int (*get_panel_info)(struct drm_device *, int, struct panel_info *);
int (*reset)(int pipe); int (*reset)(struct drm_device *, int);
void (*drv_ic_init)(struct mdfld_dsi_config *dsi_config, int pipe); void (*drv_ic_init)(struct mdfld_dsi_config *dsi_config, int pipe);
}; };
......
...@@ -13,7 +13,6 @@ ...@@ -13,7 +13,6 @@
#include <drm/drm_encoder.h> #include <drm/drm_encoder.h>
#include <drm/drm_probe_helper.h> #include <drm/drm_probe_helper.h>
#include <drm/drm_vblank.h> #include <drm/drm_vblank.h>
#include <linux/gpio.h>
#include "gma_display.h" #include "gma_display.h"
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment