Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=0a196b6fa9b42a2bb49733b37565aaaa97ffb07f
Commit:     0a196b6fa9b42a2bb49733b37565aaaa97ffb07f
Parent:     a44f1c43dfa98e2eb763968890157bfaf9001add
Author:     Chris Pascoe <[EMAIL PROTECTED]>
AuthorDate: Mon Nov 19 09:29:59 2007 -0300
Committer:  Mauro Carvalho Chehab <[EMAIL PROTECTED]>
CommitDate: Fri Jan 25 19:02:27 2008 -0200

    V4L/DVB (6642): xc2028: don't duplicate max_len in priv
    
    There is no need to duplicate the max_len field from the ctrl structure
    in the private data.  If we use it directly from priv->ctrl, we can memcpy
    the structure (apart from strings) to reduce maintenance as it grows.
    
    Enforce a minimum max_len length of 8 data bytes (+ 1 address byte) as seems
    to be required by the tuner.
    
    Also, use kstrdup instead of open coding the string duplication.
    
    Signed-off-by: Chris Pascoe <[EMAIL PROTECTED]>
    Signed-off-by: Mauro Carvalho Chehab <[EMAIL PROTECTED]>
---
 drivers/media/video/tuner-xc2028.c |   37 +++++++++++++++--------------------
 1 files changed, 16 insertions(+), 21 deletions(-)

diff --git a/drivers/media/video/tuner-xc2028.c 
b/drivers/media/video/tuner-xc2028.c
index c921d60..e194496 100644
--- a/drivers/media/video/tuner-xc2028.c
+++ b/drivers/media/video/tuner-xc2028.c
@@ -75,9 +75,6 @@ struct xc2028_data {
                                                              6M, 7M or 8M */
        int                     need_load_generic; /* The generic firmware
                                                              were loaded? */
-
-       int                     max_len;        /* Max firmware chunk */
-
        enum tuner_mode mode;
        struct i2c_client       *i2c_client;
 
@@ -426,7 +423,7 @@ static int load_firmware(struct dvb_frontend *fe, unsigned 
int type,
 {
        struct xc2028_data *priv = fe->tuner_priv;
        int                pos, rc;
-       unsigned char      *p, *endp, buf[priv->max_len];
+       unsigned char      *p, *endp, buf[priv->ctrl.max_len];
 
        tuner_dbg("%s called\n", __FUNCTION__);
 
@@ -505,8 +502,8 @@ static int load_firmware(struct dvb_frontend *fe, unsigned 
int type,
 
                /* Sends message chunks */
                while (size > 0) {
-                       int len = (size < priv->max_len - 1) ?
-                                  size : priv->max_len - 1;
+                       int len = (size < priv->ctrl.max_len - 1) ?
+                                  size : priv->ctrl.max_len - 1;
 
                        memcpy(buf + 1, p, len);
 
@@ -881,32 +878,30 @@ static int xc2028_set_config(struct dvb_frontend *fe, 
void *priv_cfg)
 {
        struct xc2028_data *priv = fe->tuner_priv;
        struct xc2028_ctrl *p    = priv_cfg;
+       int                 rc   = 0;
 
        tuner_dbg("%s called\n", __FUNCTION__);
 
        mutex_lock(&priv->lock);
 
-       priv->ctrl.type = p->type;
-
-       if (p->fname) {
-               kfree(priv->ctrl.fname);
+       kfree(priv->ctrl.fname);
+       free_firmware(priv);
 
-               priv->ctrl.fname = kmalloc(strlen(p->fname) + 1, GFP_KERNEL);
-               if (priv->ctrl.fname == NULL) {
-                       mutex_unlock(&priv->lock);
-                       return -ENOMEM;
-               }
+       memcpy(&priv->ctrl, p, sizeof(priv->ctrl));
+       priv->ctrl.fname = NULL;
 
-               free_firmware(priv);
-               strcpy(priv->ctrl.fname, p->fname);
+       if (p->fname) {
+               priv->ctrl.fname = kstrdup(p->fname, GFP_KERNEL);
+               if (priv->ctrl.fname == NULL)
+                       rc = -ENOMEM;
        }
 
-       if (p->max_len > 0)
-               priv->max_len = p->max_len;
+       if (priv->ctrl.max_len < 9)
+               priv->ctrl.max_len = 13;
 
        mutex_unlock(&priv->lock);
 
-       return 0;
+       return rc;
 }
 
 static const struct dvb_tuner_ops xc2028_dvb_tuner_ops = {
@@ -967,7 +962,7 @@ void *xc2028_attach(struct dvb_frontend *fe, struct 
xc2028_config *cfg)
                priv->i2c_props.adap = cfg->i2c_adap;
                priv->video_dev = video_dev;
                priv->tuner_callback = cfg->callback;
-               priv->max_len = 13;
+               priv->ctrl.max_len = 13;
 
                mutex_init(&priv->lock);
 
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to