[PATCH v3] drm: gma500: Convert to GPIO descriptors
Patrik Jakobsson
patrik.r.jakobsson at gmail.com
Wed Aug 19 13:54:01 UTC 2020
On Fri, Jul 3, 2020 at 3:01 PM Linus Walleij <linus.walleij at linaro.org> wrote:
>
> 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: Patrik Jakobsson <patrik.r.jakobsson at gmail.com>
> Signed-off-by: Linus Walleij <linus.walleij at linaro.org>
> ---
> ChangeLog v2->v3:
> - Actually commit the last comment fix.
Applied to drm-misc-next
-Patrik
> ---
> drivers/gpu/drm/gma500/mdfld_device.c | 20 +++++++++
> drivers/gpu/drm/gma500/mdfld_dsi_dpi.c | 2 +-
> drivers/gpu/drm/gma500/mdfld_dsi_output.c | 51 ++++++++++++-----------
> drivers/gpu/drm/gma500/mdfld_dsi_output.h | 2 +-
> drivers/gpu/drm/gma500/mdfld_output.h | 2 +-
> drivers/gpu/drm/gma500/psb_intel_drv.h | 1 -
> 6 files changed, 49 insertions(+), 29 deletions(-)
>
> diff --git a/drivers/gpu/drm/gma500/mdfld_device.c b/drivers/gpu/drm/gma500/mdfld_device.c
> index b718efccdcf2..be9cf6b1e3b3 100644
> --- a/drivers/gpu/drm/gma500/mdfld_device.c
> +++ b/drivers/gpu/drm/gma500/mdfld_device.c
> @@ -6,6 +6,7 @@
> **************************************************************************/
>
> #include <linux/delay.h>
> +#include <linux/gpio/machine.h>
>
> #include <asm/intel_scu_ipc.h>
>
> @@ -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)
> {
> struct drm_psb_private *dev_priv = dev->dev_private;
> if (pci_enable_msi(dev->pdev))
> dev_warn(dev->dev, "Enabling MSI failed!\n");
> 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);
> }
>
> diff --git a/drivers/gpu/drm/gma500/mdfld_dsi_dpi.c b/drivers/gpu/drm/gma500/mdfld_dsi_dpi.c
> index c976a9dd9240..ae1223f631a7 100644
> --- a/drivers/gpu/drm/gma500/mdfld_dsi_dpi.c
> +++ b/drivers/gpu/drm/gma500/mdfld_dsi_dpi.c
> @@ -955,7 +955,7 @@ struct mdfld_dsi_encoder *mdfld_dsi_dpi_init(struct drm_device *dev,
>
> /* panel hard-reset */
> if (p_funcs->reset) {
> - ret = p_funcs->reset(pipe);
> + ret = p_funcs->reset(dev, pipe);
> if (ret) {
> DRM_ERROR("Panel %d hard-reset failed\n", pipe);
> return NULL;
> diff --git a/drivers/gpu/drm/gma500/mdfld_dsi_output.c b/drivers/gpu/drm/gma500/mdfld_dsi_output.c
> index f350ac1ead18..6473290126f2 100644
> --- a/drivers/gpu/drm/gma500/mdfld_dsi_output.c
> +++ b/drivers/gpu/drm/gma500/mdfld_dsi_output.c
> @@ -28,6 +28,7 @@
> #include <linux/delay.h>
> #include <linux/moduleparam.h>
> #include <linux/pm_runtime.h>
> +#include <linux/gpio/consumer.h>
>
> #include <asm/intel_scu_ipc.h>
>
> @@ -432,42 +433,42 @@ static int mdfld_dsi_get_default_config(struct drm_device *dev,
> return 0;
> }
>
> -int mdfld_dsi_panel_reset(int pipe)
> +int mdfld_dsi_panel_reset(struct drm_device *ddev, int pipe)
> {
> - unsigned gpio;
> - int ret = 0;
> -
> + struct device *dev = ddev->dev;
> + 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) {
> case 0:
> - gpio = 128;
> + gpiod = gpiod_get(dev, "dsi-pipe0-reset", GPIOD_OUT_HIGH);
> + if (IS_ERR(gpiod))
> + return PTR_ERR(gpiod);
> break;
> case 2:
> - gpio = 34;
> + gpiod = gpiod_get(dev, "dsi-pipe2-reset", GPIOD_OUT_HIGH);
> + if (IS_ERR(gpiod))
> + return PTR_ERR(gpiod);
> break;
> default:
> - DRM_ERROR("Invalid output\n");
> + DRM_DEV_ERROR(dev, "Invalid output pipe\n");
> return -EINVAL;
> }
> + gpiod_put(gpiod);
>
> - ret = gpio_request(gpio, "gfx");
> - if (ret) {
> - DRM_ERROR("gpio_rqueset failed\n");
> - return ret;
> - }
> -
> - ret = gpio_direction_output(gpio, 1);
> - if (ret) {
> - DRM_ERROR("gpio_direction_output failed\n");
> - goto gpio_error;
> - }
> + /* Flush posted writes on the device */
> + gpiod = gpiod_get(dev, "dsi-pipe0-reset", GPIOD_ASIS);
> + if (IS_ERR(gpiod))
> + return PTR_ERR(gpiod);
> + gpiod_get_value(gpiod);
> + gpiod_put(gpiod);
>
> - gpio_get_value(128);
> -
> -gpio_error:
> - if (gpio_is_valid(gpio))
> - gpio_free(gpio);
> -
> - return ret;
> + return 0;
> }
>
> /*
> diff --git a/drivers/gpu/drm/gma500/mdfld_dsi_output.h b/drivers/gpu/drm/gma500/mdfld_dsi_output.h
> index 0cccfe400a98..5c0db3c2903f 100644
> --- a/drivers/gpu/drm/gma500/mdfld_dsi_output.h
> +++ b/drivers/gpu/drm/gma500/mdfld_dsi_output.h
> @@ -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,
> 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__*/
> diff --git a/drivers/gpu/drm/gma500/mdfld_output.h b/drivers/gpu/drm/gma500/mdfld_output.h
> index 17a944d70add..37a516cc56be 100644
> --- a/drivers/gpu/drm/gma500/mdfld_output.h
> +++ b/drivers/gpu/drm/gma500/mdfld_output.h
> @@ -54,7 +54,7 @@ struct panel_funcs {
> const struct drm_encoder_helper_funcs *encoder_helper_funcs;
> struct drm_display_mode * (*get_config_mode)(struct drm_device *);
> 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);
> };
>
> diff --git a/drivers/gpu/drm/gma500/psb_intel_drv.h b/drivers/gpu/drm/gma500/psb_intel_drv.h
> index fb601983cef0..9221d1f545b0 100644
> --- a/drivers/gpu/drm/gma500/psb_intel_drv.h
> +++ b/drivers/gpu/drm/gma500/psb_intel_drv.h
> @@ -13,7 +13,6 @@
> #include <drm/drm_encoder.h>
> #include <drm/drm_probe_helper.h>
> #include <drm/drm_vblank.h>
> -#include <linux/gpio.h>
> #include "gma_display.h"
>
> /*
> --
> 2.25.4
>
More information about the dri-devel
mailing list