| From eb1ae34e48a09b7a1179c579aed042b032e408f4 Mon Sep 17 00:00:00 2001 |
| From: Thomas Zimmermann <tzimmermann@suse.de> |
| Date: Mon, 13 May 2024 14:51:07 +0200 |
| Subject: drm/mgag200: Bind I2C lifetime to DRM device |
| |
| From: Thomas Zimmermann <tzimmermann@suse.de> |
| |
| commit eb1ae34e48a09b7a1179c579aed042b032e408f4 upstream. |
| |
| Managed cleanup with devm_add_action_or_reset() will release the I2C |
| adapter when the underlying Linux device goes away. But the connector |
| still refers to it, so this cleanup leaves behind a stale pointer |
| in struct drm_connector.ddc. |
| |
| Bind the lifetime of the I2C adapter to the connector's lifetime by |
| using DRM's managed release. When the DRM device goes away (after |
| the Linux device) DRM will first clean up the connector and then |
| clean up the I2C adapter. |
| |
| Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de> |
| Reviewed-by: Jocelyn Falempe <jfalempe@redhat.com> |
| Fixes: b279df242972 ("drm/mgag200: Switch I2C code to managed cleanup") |
| Cc: Thomas Zimmermann <tzimmermann@suse.de> |
| Cc: Jocelyn Falempe <jfalempe@redhat.com> |
| Cc: Dave Airlie <airlied@redhat.com> |
| Cc: dri-devel@lists.freedesktop.org |
| Cc: <stable@vger.kernel.org> # v6.0+ |
| Link: https://patchwork.freedesktop.org/patch/msgid/20240513125620.6337-3-tzimmermann@suse.de |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/gpu/drm/mgag200/mgag200_i2c.c | 6 ++++-- |
| 1 file changed, 4 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/gpu/drm/mgag200/mgag200_i2c.c |
| +++ b/drivers/gpu/drm/mgag200/mgag200_i2c.c |
| @@ -31,6 +31,8 @@ |
| #include <linux/i2c.h> |
| #include <linux/pci.h> |
| |
| +#include <drm/drm_managed.h> |
| + |
| #include "mgag200_drv.h" |
| |
| static int mga_i2c_read_gpio(struct mga_device *mdev) |
| @@ -86,7 +88,7 @@ static int mga_gpio_getscl(void *data) |
| return (mga_i2c_read_gpio(mdev) & i2c->clock) ? 1 : 0; |
| } |
| |
| -static void mgag200_i2c_release(void *res) |
| +static void mgag200_i2c_release(struct drm_device *dev, void *res) |
| { |
| struct mga_i2c_chan *i2c = res; |
| |
| @@ -126,5 +128,5 @@ int mgag200_i2c_init(struct mga_device * |
| if (ret) |
| return ret; |
| |
| - return devm_add_action_or_reset(dev->dev, mgag200_i2c_release, i2c); |
| + return drmm_add_action_or_reset(dev, mgag200_i2c_release, i2c); |
| } |