On Sun, Jun 28, 2020 at 1:29 AM Linus Walleij <linus.walleij@xxxxxxxxxx> 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 > 88 and 34 are used on all of these so just go ahead and Is 88 meant to be 128 here? > register those for resetting the DSI pipes. > > Cc: Patrik Jakobsson <patrik.r.jakobsson@xxxxxxxxx> > Signed-off-by: Linus Walleij <linus.walleij@xxxxxxxxxx> > --- > 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..c9478261964a 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; > - } > + /* Always read the pipe0 GPIO line, FIXME: explain why! */ Probably needed for flushing the posted write. If I understand PCI specs correctly, reading pipe0 will flush all posted writes on the device so both pipes would get flushed. How about: /* Flush posted writes on device */ If you address the above: Acked-by: Patrik Jakobsson <patrik.r.jakobsson@xxxxxxxxx> > + 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 > _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel