iio: adc: sc27xx: refactor some functions for support more PMiCs
authorCixi Geng <cixi.geng1@unisoc.com>
Tue, 19 Apr 2022 14:24:56 +0000 (22:24 +0800)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Thu, 28 Apr 2022 18:22:56 +0000 (19:22 +0100)
Refactor the common adc_nvmem_cell_calib_data,adc_to_volt and call
these in the origin sc27xx_adc_scale_calibration,sc27xx_adc_to_volt

Signed-off-by: Cixi Geng <cixi.geng1@unisoc.com>
Link: https://lore.kernel.org/r/20220419142458.884933-6-gengcixi@gmail.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/adc/sc27xx_adc.c

index 0409c4515ad33a5f02fc859b190b667b8512ed66..1d02390619949f0f72c7f81e8267fe3b696c112f 100644 (file)
@@ -135,16 +135,41 @@ static int sc27xx_adc_get_calib_data(u32 calib_data, int calib_adc)
        return ((calib_data & 0xff) + calib_adc - 128) * 4;
 }
 
+/* get the adc nvmem cell calibration data */
+static int adc_nvmem_cell_calib_data(struct sc27xx_adc_data *data, const char *cell_name)
+{
+       struct nvmem_cell *cell;
+       void *buf;
+       u32 origin_calib_data = 0;
+       size_t len;
+
+       if (!data)
+               return -EINVAL;
+
+       cell = nvmem_cell_get(data->dev, cell_name);
+       if (IS_ERR(cell))
+               return PTR_ERR(cell);
+
+       buf = nvmem_cell_read(cell, &len);
+       if (IS_ERR(buf)) {
+               nvmem_cell_put(cell);
+               return PTR_ERR(buf);
+       }
+
+       memcpy(&origin_calib_data, buf, min(len, sizeof(u32)));
+
+       kfree(buf);
+       nvmem_cell_put(cell);
+       return origin_calib_data;
+}
+
 static int sc27xx_adc_scale_calibration(struct sc27xx_adc_data *data,
                                        bool big_scale)
 {
        const struct sc27xx_adc_linear_graph *calib_graph;
        struct sc27xx_adc_linear_graph *graph;
-       struct nvmem_cell *cell;
        const char *cell_name;
        u32 calib_data = 0;
-       void *buf;
-       size_t len;
 
        if (big_scale) {
                calib_graph = data->var_data->bscale_cal;
@@ -156,24 +181,13 @@ static int sc27xx_adc_scale_calibration(struct sc27xx_adc_data *data,
                cell_name = "small_scale_calib";
        }
 
-       cell = nvmem_cell_get(data->dev, cell_name);
-       if (IS_ERR(cell))
-               return PTR_ERR(cell);
-
-       buf = nvmem_cell_read(cell, &len);
-       nvmem_cell_put(cell);
-
-       if (IS_ERR(buf))
-               return PTR_ERR(buf);
-
-       memcpy(&calib_data, buf, min(len, sizeof(u32)));
+       calib_data = adc_nvmem_cell_calib_data(data, cell_name);
 
        /* Only need to calibrate the adc values in the linear graph. */
        graph->adc0 = sc27xx_adc_get_calib_data(calib_data, calib_graph->adc0);
        graph->adc1 = sc27xx_adc_get_calib_data(calib_data >> 8,
                                                calib_graph->adc1);
 
-       kfree(buf);
        return 0;
 }
 
@@ -309,7 +323,7 @@ static void sc27xx_adc_volt_ratio(struct sc27xx_adc_data *data,
        *div_denominator = ratio & SC27XX_RATIO_DENOMINATOR_MASK;
 }
 
-static int sc27xx_adc_to_volt(struct sc27xx_adc_linear_graph *graph,
+static int adc_to_volt(struct sc27xx_adc_linear_graph *graph,
                              int raw_adc)
 {
        int tmp;
@@ -318,6 +332,16 @@ static int sc27xx_adc_to_volt(struct sc27xx_adc_linear_graph *graph,
        tmp /= (graph->adc0 - graph->adc1);
        tmp += graph->volt1;
 
+       return tmp;
+}
+
+static int sc27xx_adc_to_volt(struct sc27xx_adc_linear_graph *graph,
+                             int raw_adc)
+{
+       int tmp;
+
+       tmp = adc_to_volt(graph, raw_adc);
+
        return tmp < 0 ? 0 : tmp;
 }