lkml.org 
[lkml]   [2020]   [May]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v4 08/11] iio: light: cm32181: Use units of 1/100000th for calibscale and lux_per_bit
    Date
    Use units of 1/100000th for calibscale and lux_per_bit. The similar
    cm3232 driver already uses 1/100000th as unit for calibscale.

    This allows for higher-accuracy and makes it easier to add support
    for getting device-specific calibscale and lux_per_bit values from
    a device's ACPI tables, as the values in the ACPI tables also use
    1/100000th units.

    This units change means that our intermediate values in cm32181_get_lux()
    may get quite big, change the type of the lux variable to a u64 to
    deal with this.

    Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
    Signed-off-by: Hans de Goede <hdegoede@redhat.com>
    ---
    drivers/iio/light/cm32181.c | 22 +++++++++++-----------
    1 file changed, 11 insertions(+), 11 deletions(-)

    diff --git a/drivers/iio/light/cm32181.c b/drivers/iio/light/cm32181.c
    index f5af986e1ed4..59c95e22ad00 100644
    --- a/drivers/iio/light/cm32181.c
    +++ b/drivers/iio/light/cm32181.c
    @@ -45,11 +45,11 @@
    #define CM32181_CMD_ALS_SM_MASK (0x03 << CM32181_CMD_ALS_SM_SHIFT)
    #define CM32181_CMD_ALS_SM_DEFAULT (0x01 << CM32181_CMD_ALS_SM_SHIFT)

    -#define CM32181_MLUX_PER_BIT 5 /* ALS_SM=01 IT=800ms */
    -#define CM32181_MLUX_PER_BIT_BASE_IT 800000 /* Based on IT=800ms */
    -#define CM32181_CALIBSCALE_DEFAULT 1000
    -#define CM32181_CALIBSCALE_RESOLUTION 1000
    -#define MLUX_PER_LUX 1000
    +#define CM32181_LUX_PER_BIT 500 /* ALS_SM=01 IT=800ms */
    +#define CM32181_LUX_PER_BIT_RESOLUTION 100000
    +#define CM32181_LUX_PER_BIT_BASE_IT 800000 /* Based on IT=800ms */
    +#define CM32181_CALIBSCALE_DEFAULT 100000
    +#define CM32181_CALIBSCALE_RESOLUTION 100000

    #define SMBUS_ALERT_RESPONSE_ADDRESS 0x0c

    @@ -219,15 +219,15 @@ static int cm32181_get_lux(struct cm32181_chip *cm32181)
    struct i2c_client *client = cm32181->client;
    int ret;
    int als_it;
    - unsigned long lux;
    + u64 lux;

    ret = cm32181_read_als_it(cm32181, &als_it);
    if (ret < 0)
    return -EINVAL;

    - lux = CM32181_MLUX_PER_BIT;
    - lux *= CM32181_MLUX_PER_BIT_BASE_IT;
    - lux /= als_it;
    + lux = CM32181_LUX_PER_BIT;
    + lux *= CM32181_LUX_PER_BIT_BASE_IT;
    + lux = div_u64(lux, als_it);

    ret = i2c_smbus_read_word_data(client, CM32181_REG_ADDR_ALS);
    if (ret < 0)
    @@ -235,8 +235,8 @@ static int cm32181_get_lux(struct cm32181_chip *cm32181)

    lux *= ret;
    lux *= cm32181->calibscale;
    - lux /= CM32181_CALIBSCALE_RESOLUTION;
    - lux /= MLUX_PER_LUX;
    + lux = div_u64(lux, CM32181_CALIBSCALE_RESOLUTION);
    + lux = div_u64(lux, CM32181_LUX_PER_BIT_RESOLUTION);

    if (lux > 0xFFFF)
    lux = 0xFFFF;
    --
    2.26.0
    \
     
     \ /
      Last update: 2020-05-04 14:57    [W:2.603 / U:0.132 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site