These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / hwmon / ntc_thermistor.c
index 6880011..feed306 100644 (file)
@@ -53,6 +53,7 @@ static const struct platform_device_id ntc_thermistor_id[] = {
        { "ncp03wb473", TYPE_NCPXXWB473 },
        { "ncp15wl333", TYPE_NCPXXWL333 },
        { "b57330v2103", TYPE_B57330V2103},
+       { "ncp03wf104", TYPE_NCPXXWF104 },
        { },
 };
 
@@ -135,6 +136,43 @@ static const struct ntc_compensation ncpXXwl333[] = {
        { .temp_c       = 125, .ohm     = 707 },
 };
 
+static const struct ntc_compensation ncpXXwf104[] = {
+       { .temp_c       = -40, .ohm     = 4397119 },
+       { .temp_c       = -35, .ohm     = 3088599 },
+       { .temp_c       = -30, .ohm     = 2197225 },
+       { .temp_c       = -25, .ohm     = 1581881 },
+       { .temp_c       = -20, .ohm     = 1151037 },
+       { .temp_c       = -15, .ohm     = 846579 },
+       { .temp_c       = -10, .ohm     = 628988 },
+       { .temp_c       = -5, .ohm      = 471632 },
+       { .temp_c       = 0, .ohm       = 357012 },
+       { .temp_c       = 5, .ohm       = 272500 },
+       { .temp_c       = 10, .ohm      = 209710 },
+       { .temp_c       = 15, .ohm      = 162651 },
+       { .temp_c       = 20, .ohm      = 127080 },
+       { .temp_c       = 25, .ohm      = 100000 },
+       { .temp_c       = 30, .ohm      = 79222 },
+       { .temp_c       = 35, .ohm      = 63167 },
+       { .temp_c       = 40, .ohm      = 50677 },
+       { .temp_c       = 45, .ohm      = 40904 },
+       { .temp_c       = 50, .ohm      = 33195 },
+       { .temp_c       = 55, .ohm      = 27091 },
+       { .temp_c       = 60, .ohm      = 22224 },
+       { .temp_c       = 65, .ohm      = 18323 },
+       { .temp_c       = 70, .ohm      = 15184 },
+       { .temp_c       = 75, .ohm      = 12635 },
+       { .temp_c       = 80, .ohm      = 10566 },
+       { .temp_c       = 85, .ohm      = 8873 },
+       { .temp_c       = 90, .ohm      = 7481 },
+       { .temp_c       = 95, .ohm      = 6337 },
+       { .temp_c       = 100, .ohm     = 5384 },
+       { .temp_c       = 105, .ohm     = 4594 },
+       { .temp_c       = 110, .ohm     = 3934 },
+       { .temp_c       = 115, .ohm     = 3380 },
+       { .temp_c       = 120, .ohm     = 2916 },
+       { .temp_c       = 125, .ohm     = 2522 },
+};
+
 /*
  * The following compensation table is from the specification of EPCOS NTC
  * Thermistors Datasheet
@@ -190,20 +228,21 @@ struct ntc_data {
 static int ntc_adc_iio_read(struct ntc_thermistor_platform_data *pdata)
 {
        struct iio_channel *channel = pdata->chan;
-       s64 result;
-       int val, ret;
+       int raw, uv, ret;
 
-       ret = iio_read_channel_raw(channel, &val);
+       ret = iio_read_channel_raw(channel, &raw);
        if (ret < 0) {
                pr_err("read channel() error: %d\n", ret);
                return ret;
        }
 
-       /* unit: mV */
-       result = pdata->pullup_uv * (s64) val;
-       result >>= 12;
+       ret = iio_convert_raw_to_processed(channel, raw, &uv, 1000);
+       if (ret < 0) {
+               /* Assume 12 bit ADC with vref at pullup_uv */
+               uv = (pdata->pullup_uv * (s64)raw) >> 12;
+       }
 
-       return (int)result;
+       return uv;
 }
 
 static const struct of_device_id ntc_match[] = {
@@ -219,6 +258,8 @@ static const struct of_device_id ntc_match[] = {
                .data = &ntc_thermistor_id[4] },
        { .compatible = "epcos,b57330v2103",
                .data = &ntc_thermistor_id[5]},
+       { .compatible = "murata,ncp03wf104",
+               .data = &ntc_thermistor_id[6] },
 
        /* Usage of vendor name "ntc" is deprecated */
        { .compatible = "ntc,ncp15wb473",
@@ -309,30 +350,27 @@ static inline u64 div64_u64_safe(u64 dividend, u64 divisor)
 static int get_ohm_of_thermistor(struct ntc_data *data, unsigned int uv)
 {
        struct ntc_thermistor_platform_data *pdata = data->pdata;
-       u64 mv = uv / 1000;
-       u64 pmv = pdata->pullup_uv / 1000;
+       u32 puv = pdata->pullup_uv;
        u64 n, puo, pdo;
        puo = pdata->pullup_ohm;
        pdo = pdata->pulldown_ohm;
 
-       if (mv == 0) {
-               if (pdata->connect == NTC_CONNECTED_POSITIVE)
-                       return INT_MAX;
-               return 0;
-       }
-       if (mv >= pmv)
+       if (uv == 0)
+               return (pdata->connect == NTC_CONNECTED_POSITIVE) ?
+                       INT_MAX : 0;
+       if (uv >= puv)
                return (pdata->connect == NTC_CONNECTED_POSITIVE) ?
                        0 : INT_MAX;
 
        if (pdata->connect == NTC_CONNECTED_POSITIVE && puo == 0)
-               n = div64_u64_safe(pdo * (pmv - mv), mv);
+               n = div_u64(pdo * (puv - uv), uv);
        else if (pdata->connect == NTC_CONNECTED_GROUND && pdo == 0)
-               n = div64_u64_safe(puo * mv, pmv - mv);
+               n = div_u64(puo * uv, puv - uv);
        else if (pdata->connect == NTC_CONNECTED_POSITIVE)
-               n = div64_u64_safe(pdo * puo * (pmv - mv),
-                               puo * mv - pdo * (pmv - mv));
+               n = div64_u64_safe(pdo * puo * (puv - uv),
+                               puo * uv - pdo * (puv - uv));
        else
-               n = div64_u64_safe(pdo * puo * mv, pdo * (pmv - mv) - puo * mv);
+               n = div64_u64_safe(pdo * puo * uv, pdo * (puv - uv) - puo * uv);
 
        if (n > INT_MAX)
                n = INT_MAX;
@@ -439,7 +477,7 @@ static int ntc_thermistor_get_ohm(struct ntc_data *data)
        return -EINVAL;
 }
 
-static int ntc_read_temp(void *dev, long *temp)
+static int ntc_read_temp(void *dev, int *temp)
 {
        struct ntc_data *data = dev_get_drvdata(dev);
        int ohm;
@@ -567,6 +605,10 @@ static int ntc_thermistor_probe(struct platform_device *pdev)
                data->comp = b57330v2103;
                data->n_comp = ARRAY_SIZE(b57330v2103);
                break;
+       case TYPE_NCPXXWF104:
+               data->comp = ncpXXwf104;
+               data->n_comp = ARRAY_SIZE(ncpXXwf104);
+               break;
        default:
                dev_err(&pdev->dev, "Unknown device type: %lu(%s)\n",
                                pdev_id->driver_data, pdev_id->name);