because they might design two of those chips on a single board.
You never know.

Signed-off-by: Sebastian Andrzej Siewior <[email protected]>
---
 drivers/media/video/tvp514x.c |   52 +++++++++++++++++++++++-----------------
 1 files changed, 30 insertions(+), 22 deletions(-)

diff --git a/drivers/media/video/tvp514x.c b/drivers/media/video/tvp514x.c
index 8e23aa5..f9eb6dc 100644
--- a/drivers/media/video/tvp514x.c
+++ b/drivers/media/video/tvp514x.c
@@ -103,7 +103,7 @@ struct tvp514x_std_info {
  * @route: input and output routing at chip level
  */
 struct tvp514x_decoder {
-       struct v4l2_int_device *v4l2_int_device;
+       struct v4l2_int_device v4l2_int_device;
        const struct tvp514x_platform_data *pdata;
        struct i2c_client *client;
 
@@ -1369,17 +1369,14 @@ static struct tvp514x_decoder tvp514x_dev = {
        .current_std = STD_NTSC_MJ,
        .std_list = tvp514x_std_list,
        .num_stds = ARRAY_SIZE(tvp514x_std_list),
-
-};
-
-static struct v4l2_int_device tvp514x_int_device = {
-       .module = THIS_MODULE,
-       .name = TVP514X_MODULE_NAME,
-       .priv = &tvp514x_dev,
-       .type = v4l2_int_type_slave,
-       .u = {
-             .slave = &tvp514x_slave,
-             },
+       .v4l2_int_device = {
+               .module = THIS_MODULE,
+               .name = TVP514X_MODULE_NAME,
+               .type = v4l2_int_type_slave,
+               .u = {
+                       .slave = &tvp514x_slave,
+               },
+       },
 };
 
 /**
@@ -1392,18 +1389,26 @@ static struct v4l2_int_device tvp514x_int_device = {
 static int
 tvp514x_probe(struct i2c_client *client, const struct i2c_device_id *id)
 {
-       struct tvp514x_decoder *decoder = &tvp514x_dev;
+       struct tvp514x_decoder *decoder;
        int err;
 
        /* Check if the adapter supports the needed features */
        if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA))
                return -EIO;
 
-       decoder->pdata = client->dev.platform_data;
-       if (!decoder->pdata) {
+       decoder = kzalloc(sizeof(*decoder), GFP_KERNEL);
+       if (!decoder)
+               return -ENOMEM;
+
+       if (!client->dev.platform_data) {
                v4l_err(client, "No platform data!!\n");
-               return -ENODEV;
+               err = -ENODEV;
+               goto out_free;
        }
+
+       *decoder = tvp514x_dev;
+       decoder->v4l2_int_device.priv = decoder;
+       decoder->pdata = client->dev.platform_data;
        /*
         * Fetch platform specific data, and configure the
         * tvp514x_reg_list[] accordingly. Since this is one
@@ -1419,23 +1424,26 @@ tvp514x_probe(struct i2c_client *client, const struct 
i2c_device_id *id)
         */
        decoder->id = (struct i2c_device_id *)id;
        /* Attach to Master */
-       strcpy(tvp514x_int_device.u.slave->attach_to, decoder->pdata->master);
-       decoder->v4l2_int_device = &tvp514x_int_device;
+       strcpy(decoder->v4l2_int_device.u.slave->attach_to, 
decoder->pdata->master);
        decoder->client = client;
        i2c_set_clientdata(client, decoder);
 
        /* Register with V4L2 layer as slave device */
-       err = v4l2_int_device_register(decoder->v4l2_int_device);
+       err = v4l2_int_device_register(&decoder->v4l2_int_device);
        if (err) {
                i2c_set_clientdata(client, NULL);
                v4l_err(client,
                        "Unable to register to v4l2. Err[%d]\n", err);
+               goto out_free;
 
        } else
                v4l_info(client, "Registered to v4l2 master %s!!\n",
                                decoder->pdata->master);
-
        return 0;
+
+out_free:
+       kfree(decoder);
+       return err;
 }
 
 /**
@@ -1452,9 +1460,9 @@ static int __exit tvp514x_remove(struct i2c_client 
*client)
        if (!client->adapter)
                return -ENODEV; /* our client isn't attached */
 
-       v4l2_int_device_unregister(decoder->v4l2_int_device);
+       v4l2_int_device_unregister(&decoder->v4l2_int_device);
        i2c_set_clientdata(client, NULL);
-
+       kfree(decoder);
        return 0;
 }
 /*
-- 
1.5.6.5

--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to