lkml.org 
[lkml]   [2014]   [Feb]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.12 42/82] iio: ak8975: Fix calculation formula for convert micro tesla to gauss unit
    Date
    3.12-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Beomho Seo <beomho.seo@samsung.com>

    commit bef44abccb2677e8d16e50b75316d4fd1061be81 upstream.

    This effects the reported scale of the raw values, and thus userspace
    applications that use this value.

    One micro tesla equal 0.01 gauss. So I have fixed calculation formula And add RAW_TO_GAUSS macro.
    ASA is in the range of 0 to 255. If multiply 0.003, calculation result(in_magn_[*]_scale) is
    always 0. So multiply 3000 and return and IIO_VAL_INT_PLUS_MICRO.
    As a result, read_raw call back function return accurate scale value.

    Signed-off-by: Beomho Seo <beomho.seo@samsung.com>
    Signed-off-by: Jonathan Cameron <jic23@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/iio/magnetometer/ak8975.c | 16 +++++++++-------
    1 file changed, 9 insertions(+), 7 deletions(-)

    --- a/drivers/iio/magnetometer/ak8975.c
    +++ b/drivers/iio/magnetometer/ak8975.c
    @@ -85,6 +85,7 @@
    #define AK8975_MAX_CONVERSION_TIMEOUT 500
    #define AK8975_CONVERSION_DONE_POLL_TIME 10
    #define AK8975_DATA_READY_TIMEOUT ((100*HZ)/1000)
    +#define RAW_TO_GAUSS(asa) ((((asa) + 128) * 3000) / 256)

    /*
    * Per-instance context data for the device.
    @@ -265,15 +266,15 @@ static int ak8975_setup(struct i2c_clien
    *
    * Since 1uT = 100 gauss, our final scale factor becomes:
    *
    - * Hadj = H * ((ASA + 128) / 256) * 3/10 * 100
    - * Hadj = H * ((ASA + 128) * 30 / 256
    + * Hadj = H * ((ASA + 128) / 256) * 3/10 * 1/100
    + * Hadj = H * ((ASA + 128) * 0.003) / 256
    *
    * Since ASA doesn't change, we cache the resultant scale factor into the
    * device context in ak8975_setup().
    */
    - data->raw_to_gauss[0] = ((data->asa[0] + 128) * 30) >> 8;
    - data->raw_to_gauss[1] = ((data->asa[1] + 128) * 30) >> 8;
    - data->raw_to_gauss[2] = ((data->asa[2] + 128) * 30) >> 8;
    + data->raw_to_gauss[0] = RAW_TO_GAUSS(data->asa[0]);
    + data->raw_to_gauss[1] = RAW_TO_GAUSS(data->asa[1]);
    + data->raw_to_gauss[2] = RAW_TO_GAUSS(data->asa[2]);

    return 0;
    }
    @@ -428,8 +429,9 @@ static int ak8975_read_raw(struct iio_de
    case IIO_CHAN_INFO_RAW:
    return ak8975_read_axis(indio_dev, chan->address, val);
    case IIO_CHAN_INFO_SCALE:
    - *val = data->raw_to_gauss[chan->address];
    - return IIO_VAL_INT;
    + *val = 0;
    + *val2 = data->raw_to_gauss[chan->address];
    + return IIO_VAL_INT_PLUS_MICRO;
    }
    return -EINVAL;
    }



    \
     
     \ /
      Last update: 2014-02-21 02:41    [W:4.877 / U:0.060 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site