drm: gma500: Convert to GPIO descriptors
authorLinus Walleij <linus.walleij@linaro.org>
Fri, 3 Jul 2020 12:59:01 +0000 (14:59 +0200)
committerPatrik Jakobsson <patrik.r.jakobsson@gmail.com>
Wed, 19 Aug 2020 13:48:09 +0000 (15:48 +0200)
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@gmail.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Patrik Jakobsson <patrik.r.jakobsson@gmail.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20200703125901.513476-1-linus.walleij@linaro.org
drivers/gpu/drm/gma500/mdfld_device.c
drivers/gpu/drm/gma500/mdfld_dsi_dpi.c
drivers/gpu/drm/gma500/mdfld_dsi_output.c
drivers/gpu/drm/gma500/mdfld_dsi_output.h
drivers/gpu/drm/gma500/mdfld_output.h
drivers/gpu/drm/gma500/psb_intel_drv.h

index b718efccdcf297b056408685b47944fec77f572b..be9cf6b1e3b39ede4bced4f638caf51ffa2a32e9 100644 (file)
@@ -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);
 }
 
index c976a9dd9240d907b38df1018818cac39f7d62cc..ae1223f631a7f8af9e4957430917d8cd076cd811 100644 (file)
@@ -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;
index 2f3486f32fedc4eea6718409ed934d0c5fa59cef..4aab76613bd9e7977a52eb2c38afbb7fd8f002bd 100644 (file)
@@ -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;
 }
 
 /*
index 0cccfe400a98a9c90284eaed7a5348c2735c4920..5c0db3c2903ff8762cff3b35c8607b05597aa7d8 100644 (file)
@@ -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__*/
index 17a944d70add3a4532eee94980bd49e80ed0f567..37a516cc56beac1aaaf9b9b0ce4e05018663c0c9 100644 (file)
@@ -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);
 };
 
index 3dd5718c3e31575c3d5057cab63715145e00bbbd..5340225d6997b9d0cf3a359075b869f2a76c5b57 100644 (file)
@@ -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"
 
 /*