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: Thomas Zimmermann <tzimmermann@xxxxxxx> Reviewed-by: Jocelyn Falempe <jfalempe@xxxxxxxxxx> Tested-by: Jocelyn Falempe <jfalempe@xxxxxxxxxx> --- drivers/gpu/drm/mgag200/mgag200_drv.h | 5 ++-- drivers/gpu/drm/mgag200/mgag200_i2c.c | 33 +++++++++----------------- drivers/gpu/drm/mgag200/mgag200_mode.c | 24 ++++--------------- 3 files changed, 18 insertions(+), 44 deletions(-) diff --git a/drivers/gpu/drm/mgag200/mgag200_drv.h b/drivers/gpu/drm/mgag200/mgag200_drv.h index a18384c41fc4..5bdd09432114 100644 --- a/drivers/gpu/drm/mgag200/mgag200_drv.h +++ b/drivers/gpu/drm/mgag200/mgag200_drv.h @@ -179,7 +179,6 @@ struct mga_i2c_chan { struct mga_connector { struct drm_connector base; - struct mga_i2c_chan *i2c; }; struct mga_mc { @@ -239,6 +238,7 @@ struct mga_device { struct mga_connector connector; struct mgag200_pll pixpll; + struct mga_i2c_chan i2c; struct drm_simple_display_pipe display_pipe; }; @@ -251,8 +251,7 @@ static inline struct mga_device *to_mga_device(struct drm_device *dev) int mgag200_modeset_init(struct mga_device *mdev); /* mgag200_i2c.c */ -struct mga_i2c_chan *mgag200_i2c_create(struct drm_device *dev); -void mgag200_i2c_destroy(struct mga_i2c_chan *i2c); +int mgag200_i2c_init(struct mga_device *mdev, struct mga_i2c_chan *i2c); /* mgag200_mm.c */ int mgag200_mm_init(struct mga_device *mdev); diff --git a/drivers/gpu/drm/mgag200/mgag200_i2c.c b/drivers/gpu/drm/mgag200/mgag200_i2c.c index 31e2c641a781..f57b33917152 100644 --- a/drivers/gpu/drm/mgag200/mgag200_i2c.c +++ b/drivers/gpu/drm/mgag200/mgag200_i2c.c @@ -86,10 +86,16 @@ static int mga_gpio_getscl(void *data) 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; + struct mga_i2c_chan *i2c = res; + + 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 data, clock; @@ -118,10 +124,6 @@ struct mga_i2c_chan *mgag200_i2c_create(struct drm_device *dev) break; } - i2c = kzalloc(sizeof(struct mga_i2c_chan), GFP_KERNEL); - if (!i2c) - return ERR_PTR(-ENOMEM); - i2c->data = data; i2c->clock = clock; i2c->adapter.owner = THIS_MODULE; @@ -143,20 +145,7 @@ struct mga_i2c_chan *mgag200_i2c_create(struct drm_device *dev) ret = i2c_bit_add_bus(&i2c->adapter); if (ret) - goto err_kfree; + return ret; - return 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); + return devm_add_action_or_reset(dev->dev, mgag200_i2c_release, i2c); } - diff --git a/drivers/gpu/drm/mgag200/mgag200_mode.c b/drivers/gpu/drm/mgag200/mgag200_mode.c index 4c0680dd1a78..ae78950e270b 100644 --- a/drivers/gpu/drm/mgag200/mgag200_mode.c +++ b/drivers/gpu/drm/mgag200/mgag200_mode.c @@ -811,13 +811,6 @@ static enum drm_mode_status mga_vga_mode_valid(struct drm_connector *connector, 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 = { .get_modes = mgag200_vga_connector_helper_get_modes, .mode_valid = mga_vga_mode_valid, @@ -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 = { .reset = drm_atomic_helper_connector_reset, .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_destroy_state = drm_atomic_helper_connector_destroy_state, }; @@ -836,12 +829,11 @@ static int mgag200_vga_connector_init(struct mga_device *mdev) struct drm_device *dev = &mdev->base; struct mga_connector *mconnector = &mdev->connector; struct drm_connector *connector = &mconnector->base; - struct mga_i2c_chan *i2c; + struct mga_i2c_chan *i2c = &mdev->i2c; int ret; - i2c = mgag200_i2c_create(dev); - if (IS_ERR(i2c)) { - ret = PTR_ERR(i2c) + ret = mgag200_i2c_init(mdev, i2c); + if (ret) { drm_err(dev, "failed to add DDC bus: %d\n", ret); return ret; } @@ -851,16 +843,10 @@ static int mgag200_vga_connector_init(struct mga_device *mdev) DRM_MODE_CONNECTOR_VGA, &i2c->adapter); if (ret) - goto err_mgag200_i2c_destroy; + return ret; drm_connector_helper_add(connector, &mga_vga_connector_helper_funcs); - mconnector->i2c = i2c; - return 0; - -err_mgag200_i2c_destroy: - mgag200_i2c_destroy(i2c); - return ret; } /* -- 2.36.1