lkml.org 
[lkml]   [2015]   [Jul]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.19.y-ckt 195/251] hwmon: (mcp3021) Fix broken output scaling
    Date
    3.19.8-ckt4 -stable review patch.  If anyone has any objections, please let me know.

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

    From: "Stevens, Nick" <Nick.Stevens@digi.com>

    commit 347d7e45bd09ce09cbc30d5cea9de377eb22f55c upstream.

    The mcp3021 scaling code is dividing the VDD (full-scale) value in
    millivolts by the A2D resolution to obtain the scaling factor. When VDD
    is 3300mV (the standard value) and the resolution is 12-bit (4096
    divisions), the result is a scale factor of 3300/4096, which is always
    one. Effectively, the raw A2D reading is always being returned because
    no scaling is applied.

    This patch fixes the issue and simplifies the register-to-volts
    calculation, removing the unneeded "output_scale" struct member.

    Signed-off-by: Nick Stevens <Nick.Stevens@digi.com>
    [Guenter Roeck: Dropped unnecessary value check]
    Signed-off-by: Guenter Roeck <linux@roeck-us.net>
    Signed-off-by: Kamal Mostafa <kamal@canonical.com>
    ---
    drivers/hwmon/mcp3021.c | 14 +-------------
    1 file changed, 1 insertion(+), 13 deletions(-)

    diff --git a/drivers/hwmon/mcp3021.c b/drivers/hwmon/mcp3021.c
    index d219c06..972444a 100644
    --- a/drivers/hwmon/mcp3021.c
    +++ b/drivers/hwmon/mcp3021.c
    @@ -31,14 +31,11 @@
    /* output format */
    #define MCP3021_SAR_SHIFT 2
    #define MCP3021_SAR_MASK 0x3ff
    -
    #define MCP3021_OUTPUT_RES 10 /* 10-bit resolution */
    -#define MCP3021_OUTPUT_SCALE 4

    #define MCP3221_SAR_SHIFT 0
    #define MCP3221_SAR_MASK 0xfff
    #define MCP3221_OUTPUT_RES 12 /* 12-bit resolution */
    -#define MCP3221_OUTPUT_SCALE 1

    enum chips {
    mcp3021,
    @@ -54,7 +51,6 @@ struct mcp3021_data {
    u16 sar_shift;
    u16 sar_mask;
    u8 output_res;
    - u8 output_scale;
    };

    static int mcp3021_read16(struct i2c_client *client)
    @@ -84,13 +80,7 @@ static int mcp3021_read16(struct i2c_client *client)

    static inline u16 volts_from_reg(struct mcp3021_data *data, u16 val)
    {
    - if (val == 0)
    - return 0;
    -
    - val = val * data->output_scale - data->output_scale / 2;
    -
    - return val * DIV_ROUND_CLOSEST(data->vdd,
    - (1 << data->output_res) * data->output_scale);
    + return DIV_ROUND_CLOSEST(data->vdd * val, 1 << data->output_res);
    }

    static ssize_t show_in_input(struct device *dev, struct device_attribute *attr,
    @@ -132,14 +122,12 @@ static int mcp3021_probe(struct i2c_client *client,
    data->sar_shift = MCP3021_SAR_SHIFT;
    data->sar_mask = MCP3021_SAR_MASK;
    data->output_res = MCP3021_OUTPUT_RES;
    - data->output_scale = MCP3021_OUTPUT_SCALE;
    break;

    case mcp3221:
    data->sar_shift = MCP3221_SAR_SHIFT;
    data->sar_mask = MCP3221_SAR_MASK;
    data->output_res = MCP3221_OUTPUT_RES;
    - data->output_scale = MCP3221_OUTPUT_SCALE;
    break;
    }

    --
    1.9.1


    \
     
     \ /
      Last update: 2015-07-16 03:41    [W:7.113 / U:0.044 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site