lkml.org 
[lkml]   [2010]   [May]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[24/25] i2c-tiny-usb: Fix on big-endian systems
    2.6.27-stable review patch.  If anyone has any objections, please let us know.

    ------------------
    From: Jean Delvare <khali@linux-fr.org>

    commit 1c010ff8912cbc08d80e865aab9c32b6b00c527d upstream.

    The functionality bit vector is always returned as a little-endian
    32-bit number by the device, so it must be byte-swapped to the host
    endianness.

    On the other hand, the delay value is handled by the USB stack, so no
    byte swapping is needed on our side.

    This fixes bug #15105:
    http://bugzilla.kernel.org/show_bug.cgi?id=15105

    Reported-by: Jens Richter <jens@richter-stutensee.de>
    Signed-off-by: Jean Delvare <khali@linux-fr.org>
    Tested-by: Jens Richter <jens@richter-stutensee.de>
    Cc: Till Harbaum <till@harbaum.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

    ---
    drivers/i2c/busses/i2c-tiny-usb.c | 12 ++++++------
    1 file changed, 6 insertions(+), 6 deletions(-)

    --- a/drivers/i2c/busses/i2c-tiny-usb.c
    +++ b/drivers/i2c/busses/i2c-tiny-usb.c
    @@ -13,6 +13,7 @@
    #include <linux/kernel.h>
    #include <linux/errno.h>
    #include <linux/module.h>
    +#include <linux/types.h>

    /* include interfaces to usb layer */
    #include <linux/usb.h>
    @@ -31,8 +32,8 @@
    #define CMD_I2C_IO_END (1<<1)

    /* i2c bit delay, default is 10us -> 100kHz */
    -static int delay = 10;
    -module_param(delay, int, 0);
    +static unsigned short delay = 10;
    +module_param(delay, ushort, 0);
    MODULE_PARM_DESC(delay, "bit delay in microseconds, "
    "e.g. 10 for 100kHz (default is 100kHz)");

    @@ -109,7 +110,7 @@ static int usb_xfer(struct i2c_adapter *

    static u32 usb_func(struct i2c_adapter *adapter)
    {
    - u32 func;
    + __le32 func;

    /* get functionality from adapter */
    if (usb_read(adapter, CMD_GET_FUNC, 0, 0, &func, sizeof(func)) !=
    @@ -118,7 +119,7 @@ static u32 usb_func(struct i2c_adapter *
    return 0;
    }

    - return func;
    + return le32_to_cpu(func);
    }

    /* This is the actual algorithm we define */
    @@ -216,8 +217,7 @@ static int i2c_tiny_usb_probe(struct usb
    "i2c-tiny-usb at bus %03d device %03d",
    dev->usb_dev->bus->busnum, dev->usb_dev->devnum);

    - if (usb_write(&dev->adapter, CMD_SET_DELAY,
    - cpu_to_le16(delay), 0, NULL, 0) != 0) {
    + if (usb_write(&dev->adapter, CMD_SET_DELAY, delay, 0, NULL, 0) != 0) {
    dev_err(&dev->adapter.dev,
    "failure setting delay to %dus\n", delay);
    retval = -EIO;



    \
     
     \ /
      Last update: 2010-05-25 20:21    [W:0.025 / U:29.704 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site