Commit 2143adb0 authored by Russell King's avatar Russell King

drm/i2c: tda998x: allocate tda998x_priv inside tda998x_create()

Move the tda998x_priv allocation inside tda998x_create() and simplify
the tda998x_create()'s arguments.  Pass the same to tda998x_destroy().
Tested-by: default avatarPeter Rosin <peda@axentia.se>
Signed-off-by: default avatarRussell King <rmk+kernel@armlinux.org.uk>
parent 30bd8b86
...@@ -1576,8 +1576,10 @@ static const struct drm_bridge_funcs tda998x_bridge_funcs = { ...@@ -1576,8 +1576,10 @@ static const struct drm_bridge_funcs tda998x_bridge_funcs = {
.enable = tda998x_bridge_enable, .enable = tda998x_bridge_enable,
}; };
static void tda998x_destroy(struct tda998x_priv *priv) static void tda998x_destroy(struct device *dev)
{ {
struct tda998x_priv *priv = dev_get_drvdata(dev);
drm_bridge_remove(&priv->bridge); drm_bridge_remove(&priv->bridge);
/* disable all IRQs and free the IRQ handler */ /* disable all IRQs and free the IRQ handler */
...@@ -1662,13 +1664,21 @@ static void tda998x_set_config(struct tda998x_priv *priv, ...@@ -1662,13 +1664,21 @@ static void tda998x_set_config(struct tda998x_priv *priv,
priv->audio_params = p->audio_params; priv->audio_params = p->audio_params;
} }
static int tda998x_create(struct i2c_client *client, struct tda998x_priv *priv) static int tda998x_create(struct device *dev)
{ {
struct i2c_client *client = to_i2c_client(dev);
struct device_node *np = client->dev.of_node; struct device_node *np = client->dev.of_node;
struct i2c_board_info cec_info; struct i2c_board_info cec_info;
struct tda998x_priv *priv;
u32 video; u32 video;
int rev_lo, rev_hi, ret; int rev_lo, rev_hi, ret;
priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
if (!priv)
return -ENOMEM;
dev_set_drvdata(dev, priv);
mutex_init(&priv->mutex); /* protect the page access */ mutex_init(&priv->mutex); /* protect the page access */
mutex_init(&priv->audio_mutex); /* protect access from audio thread */ mutex_init(&priv->audio_mutex); /* protect access from audio thread */
mutex_init(&priv->edid_mutex); mutex_init(&priv->edid_mutex);
...@@ -1843,7 +1853,7 @@ static int tda998x_create(struct i2c_client *client, struct tda998x_priv *priv) ...@@ -1843,7 +1853,7 @@ static int tda998x_create(struct i2c_client *client, struct tda998x_priv *priv)
return 0; return 0;
fail: fail:
tda998x_destroy(priv); tda998x_destroy(dev);
err_irq: err_irq:
return ret; return ret;
} }
...@@ -1895,24 +1905,16 @@ static int tda998x_encoder_init(struct device *dev, struct drm_device *drm) ...@@ -1895,24 +1905,16 @@ static int tda998x_encoder_init(struct device *dev, struct drm_device *drm)
static int tda998x_bind(struct device *dev, struct device *master, void *data) static int tda998x_bind(struct device *dev, struct device *master, void *data)
{ {
struct i2c_client *client = to_i2c_client(dev);
struct drm_device *drm = data; struct drm_device *drm = data;
struct tda998x_priv *priv;
int ret; int ret;
priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); ret = tda998x_create(dev);
if (!priv)
return -ENOMEM;
dev_set_drvdata(dev, priv);
ret = tda998x_create(client, priv);
if (ret) if (ret)
return ret; return ret;
ret = tda998x_encoder_init(dev, drm); ret = tda998x_encoder_init(dev, drm);
if (ret) { if (ret) {
tda998x_destroy(priv); tda998x_destroy(dev);
return ret; return ret;
} }
return 0; return 0;
...@@ -1924,7 +1926,7 @@ static void tda998x_unbind(struct device *dev, struct device *master, ...@@ -1924,7 +1926,7 @@ static void tda998x_unbind(struct device *dev, struct device *master,
struct tda998x_priv *priv = dev_get_drvdata(dev); struct tda998x_priv *priv = dev_get_drvdata(dev);
drm_encoder_cleanup(&priv->encoder); drm_encoder_cleanup(&priv->encoder);
tda998x_destroy(priv); tda998x_destroy(dev);
} }
static const struct component_ops tda998x_ops = { static const struct component_ops tda998x_ops = {
......
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