Commit b279df24 authored by Thomas Zimmermann's avatar Thomas Zimmermann

drm/mgag200: Switch I2C code to managed cleanup

Store the I2C state within struct mga_device and switch I2C to
managed release. Simplifies the related code and lets us remove
mga_connector_destroy().
Signed-off-by: default avatarThomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: default avatarJocelyn Falempe <jfalempe@redhat.com>
Tested-by: default avatarJocelyn Falempe <jfalempe@redhat.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20220516134343.6085-5-tzimmermann@suse.de
parent 16f14564
...@@ -179,7 +179,6 @@ struct mga_i2c_chan { ...@@ -179,7 +179,6 @@ struct mga_i2c_chan {
struct mga_connector { struct mga_connector {
struct drm_connector base; struct drm_connector base;
struct mga_i2c_chan *i2c;
}; };
struct mga_mc { struct mga_mc {
...@@ -239,6 +238,7 @@ struct mga_device { ...@@ -239,6 +238,7 @@ struct mga_device {
struct mga_connector connector; struct mga_connector connector;
struct mgag200_pll pixpll; struct mgag200_pll pixpll;
struct mga_i2c_chan i2c;
struct drm_simple_display_pipe display_pipe; struct drm_simple_display_pipe display_pipe;
}; };
...@@ -251,8 +251,7 @@ static inline struct mga_device *to_mga_device(struct drm_device *dev) ...@@ -251,8 +251,7 @@ static inline struct mga_device *to_mga_device(struct drm_device *dev)
int mgag200_modeset_init(struct mga_device *mdev); int mgag200_modeset_init(struct mga_device *mdev);
/* mgag200_i2c.c */ /* mgag200_i2c.c */
struct mga_i2c_chan *mgag200_i2c_create(struct drm_device *dev); int mgag200_i2c_init(struct mga_device *mdev, struct mga_i2c_chan *i2c);
void mgag200_i2c_destroy(struct mga_i2c_chan *i2c);
/* mgag200_mm.c */ /* mgag200_mm.c */
int mgag200_mm_init(struct mga_device *mdev); int mgag200_mm_init(struct mga_device *mdev);
......
...@@ -86,10 +86,16 @@ static int mga_gpio_getscl(void *data) ...@@ -86,10 +86,16 @@ static int mga_gpio_getscl(void *data)
return (mga_i2c_read_gpio(mdev) & i2c->clock) ? 1 : 0; return (mga_i2c_read_gpio(mdev) & i2c->clock) ? 1 : 0;
} }
struct mga_i2c_chan *mgag200_i2c_create(struct drm_device *dev) static void mgag200_i2c_release(void *res)
{ {
struct mga_device *mdev = to_mga_device(dev); struct mga_i2c_chan *i2c = res;
struct mga_i2c_chan *i2c;
i2c_del_adapter(&i2c->adapter);
}
int mgag200_i2c_init(struct mga_device *mdev, struct mga_i2c_chan *i2c)
{
struct drm_device *dev = &mdev->base;
int ret; int ret;
int data, clock; int data, clock;
...@@ -118,10 +124,6 @@ struct mga_i2c_chan *mgag200_i2c_create(struct drm_device *dev) ...@@ -118,10 +124,6 @@ struct mga_i2c_chan *mgag200_i2c_create(struct drm_device *dev)
break; break;
} }
i2c = kzalloc(sizeof(struct mga_i2c_chan), GFP_KERNEL);
if (!i2c)
return ERR_PTR(-ENOMEM);
i2c->data = data; i2c->data = data;
i2c->clock = clock; i2c->clock = clock;
i2c->adapter.owner = THIS_MODULE; i2c->adapter.owner = THIS_MODULE;
...@@ -143,20 +145,7 @@ struct mga_i2c_chan *mgag200_i2c_create(struct drm_device *dev) ...@@ -143,20 +145,7 @@ struct mga_i2c_chan *mgag200_i2c_create(struct drm_device *dev)
ret = i2c_bit_add_bus(&i2c->adapter); ret = i2c_bit_add_bus(&i2c->adapter);
if (ret) if (ret)
goto err_kfree; return ret;
return i2c; return devm_add_action_or_reset(dev->dev, mgag200_i2c_release, i2c);
err_kfree:
kfree(i2c);
return ERR_PTR(ret);
}
void mgag200_i2c_destroy(struct mga_i2c_chan *i2c)
{
if (!i2c)
return;
i2c_del_adapter(&i2c->adapter);
kfree(i2c);
} }
...@@ -811,13 +811,6 @@ static enum drm_mode_status mga_vga_mode_valid(struct drm_connector *connector, ...@@ -811,13 +811,6 @@ static enum drm_mode_status mga_vga_mode_valid(struct drm_connector *connector,
return MODE_OK; return MODE_OK;
} }
static void mga_connector_destroy(struct drm_connector *connector)
{
struct mga_connector *mga_connector = to_mga_connector(connector);
mgag200_i2c_destroy(mga_connector->i2c);
drm_connector_cleanup(connector);
}
static const struct drm_connector_helper_funcs mga_vga_connector_helper_funcs = { static const struct drm_connector_helper_funcs mga_vga_connector_helper_funcs = {
.get_modes = mgag200_vga_connector_helper_get_modes, .get_modes = mgag200_vga_connector_helper_get_modes,
.mode_valid = mga_vga_mode_valid, .mode_valid = mga_vga_mode_valid,
...@@ -826,7 +819,7 @@ static const struct drm_connector_helper_funcs mga_vga_connector_helper_funcs = ...@@ -826,7 +819,7 @@ static const struct drm_connector_helper_funcs mga_vga_connector_helper_funcs =
static const struct drm_connector_funcs mga_vga_connector_funcs = { static const struct drm_connector_funcs mga_vga_connector_funcs = {
.reset = drm_atomic_helper_connector_reset, .reset = drm_atomic_helper_connector_reset,
.fill_modes = drm_helper_probe_single_connector_modes, .fill_modes = drm_helper_probe_single_connector_modes,
.destroy = mga_connector_destroy, .destroy = drm_connector_cleanup,
.atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state, .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
.atomic_destroy_state = drm_atomic_helper_connector_destroy_state, .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
}; };
...@@ -836,12 +829,11 @@ static int mgag200_vga_connector_init(struct mga_device *mdev) ...@@ -836,12 +829,11 @@ static int mgag200_vga_connector_init(struct mga_device *mdev)
struct drm_device *dev = &mdev->base; struct drm_device *dev = &mdev->base;
struct mga_connector *mconnector = &mdev->connector; struct mga_connector *mconnector = &mdev->connector;
struct drm_connector *connector = &mconnector->base; struct drm_connector *connector = &mconnector->base;
struct mga_i2c_chan *i2c; struct mga_i2c_chan *i2c = &mdev->i2c;
int ret; int ret;
i2c = mgag200_i2c_create(dev); ret = mgag200_i2c_init(mdev, i2c);
if (IS_ERR(i2c)) { if (ret) {
ret = PTR_ERR(i2c)
drm_err(dev, "failed to add DDC bus: %d\n", ret); drm_err(dev, "failed to add DDC bus: %d\n", ret);
return ret; return ret;
} }
...@@ -851,16 +843,10 @@ static int mgag200_vga_connector_init(struct mga_device *mdev) ...@@ -851,16 +843,10 @@ static int mgag200_vga_connector_init(struct mga_device *mdev)
DRM_MODE_CONNECTOR_VGA, DRM_MODE_CONNECTOR_VGA,
&i2c->adapter); &i2c->adapter);
if (ret) if (ret)
goto err_mgag200_i2c_destroy; return ret;
drm_connector_helper_add(connector, &mga_vga_connector_helper_funcs); drm_connector_helper_add(connector, &mga_vga_connector_helper_funcs);
mconnector->i2c = i2c;
return 0; return 0;
err_mgag200_i2c_destroy:
mgag200_i2c_destroy(i2c);
return ret;
} }
/* /*
......
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