lkml.org 
[lkml]   [2005]   [Mar]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectRe: [01/11] fix amd64 2.6.11 oops on modprobe (saa7110)
    Hi Greg, all,

    > > Not that I really care, but isn't there a rule that a patch "... can
    > > not contain any "trivial" fixes in it (spelling changes, whitespace
    > > cleanups, etc.)"?
    >
    > Good point. Jean, care to respin the patch?

    Sure, sorry for the trouble.

    ---

    This is a rewrite of the saa7110_write_block function, which was
    plain broken in the case where the underlying adapter supports
    I2C_FUNC_I2C. It also includes related fixes which ensure that
    different parts of the driver agree on the number of registers the
    chip has.

    Signed-off-by: Jean Delvare <khali@linux-fr.org>
    Signed-off-by: Chris Wright <chrisw@osdl.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

    --- linux-2.6.11/drivers/media/video/saa7110.c.orig 2005-03-03 08:01:14.000000000 +0100
    +++ linux-2.6.11/drivers/media/video/saa7110.c 2005-03-11 10:06:09.000000000 +0100
    @@ -60,8 +60,10 @@

    #define I2C_SAA7110 0x9C /* or 0x9E */

    +#define SAA7110_NR_REG 0x35
    +
    struct saa7110 {
    - unsigned char reg[54];
    + u8 reg[SAA7110_NR_REG];

    int norm;
    int input;
    @@ -95,31 +97,28 @@
    unsigned int len)
    {
    int ret = -1;
    - u8 reg = *data++;
    + u8 reg = *data; /* first register to write to */

    - len--;
    + /* Sanity check */
    + if (reg + (len - 1) > SAA7110_NR_REG)
    + return ret;

    /* the saa7110 has an autoincrement function, use it if
    * the adapter understands raw I2C */
    if (i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
    struct saa7110 *decoder = i2c_get_clientdata(client);
    struct i2c_msg msg;
    - u8 block_data[54];

    - msg.len = 0;
    - msg.buf = (char *) block_data;
    + msg.len = len;
    + msg.buf = (char *) data;
    msg.addr = client->addr;
    - msg.flags = client->flags;
    - while (len >= 1) {
    - msg.len = 0;
    - block_data[msg.len++] = reg;
    - while (len-- >= 1 && msg.len < 54)
    - block_data[msg.len++] =
    - decoder->reg[reg++] = *data++;
    - ret = i2c_transfer(client->adapter, &msg, 1);
    - }
    + msg.flags = 0;
    + ret = i2c_transfer(client->adapter, &msg, 1);
    +
    + /* Cache the written data */
    + memcpy(decoder->reg + reg, data + 1, len - 1);
    } else {
    - while (len-- >= 1) {
    + for (++data, --len; len; len--) {
    if ((ret = saa7110_write(client, reg++,
    *data++)) < 0)
    break;
    @@ -192,7 +191,7 @@
    return 0;
    }

    -static const unsigned char initseq[] = {
    +static const unsigned char initseq[1 + SAA7110_NR_REG] = {
    0, 0x4C, 0x3C, 0x0D, 0xEF, 0xBD, 0xF2, 0x03, 0x00,
    /* 0x08 */ 0xF8, 0xF8, 0x60, 0x60, 0x00, 0x86, 0x18, 0x90,
    /* 0x10 */ 0x00, 0x59, 0x40, 0x46, 0x42, 0x1A, 0xFF, 0xDA,

    --
    Jean Delvare
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2005-03-22 14:11    [W:0.034 / U:0.036 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site