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: Thomas Zimmermann <tzimmermann@suse.de> Reviewed-by: Jocelyn Falempe <jfalempe@redhat.com> Tested-by: Jocelyn Falempe <jfalempe@redhat.com> Link: https://patchwork.freedesktop.org/patch/msgid/20220516134343.6085-5-tzimmermann@suse.de
This commit is contained in:
parent
16f1456466
commit
b279df2429
|
@ -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 {
|
||||||
|
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
|
|
||||||
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,
|
||||||
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 =
|
||||||
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)
|
||||||
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)
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in New Issue