mtd: gpmi: change the BCH layout setting for large oob NAND
[oweals/u-boot.git] / drivers / adc / adc-uclass.c
index 738c1eabdc347f5fa03c81983e1544be1e303e1c..0a492eba5437c3e0dad9c7c410138ff312ede3d8 100644 (file)
@@ -6,6 +6,7 @@
 
 #include <common.h>
 #include <errno.h>
+#include <div64.h>
 #include <dm.h>
 #include <dm/lists.h>
 #include <dm/device-internal.h>
@@ -77,6 +78,18 @@ int adc_data_mask(struct udevice *dev, unsigned int *data_mask)
        return 0;
 }
 
+int adc_channel_mask(struct udevice *dev, unsigned int *channel_mask)
+{
+       struct adc_uclass_platdata *uc_pdata = dev_get_uclass_platdata(dev);
+
+       if (!uc_pdata)
+               return -ENOSYS;
+
+       *channel_mask = uc_pdata->channel_mask;
+
+       return 0;
+}
+
 int adc_stop(struct udevice *dev)
 {
        const struct adc_ops *ops = dev_get_driver_ops(dev);
@@ -329,6 +342,30 @@ int adc_vss_value(struct udevice *dev, int *uV)
        return 0;
 }
 
+int adc_raw_to_uV(struct udevice *dev, unsigned int raw, int *uV)
+{
+       unsigned int data_mask;
+       int ret, val, vref;
+       u64 raw64 = raw;
+
+       ret = adc_vdd_value(dev, &vref);
+       if (ret)
+               return ret;
+
+       if (!adc_vss_value(dev, &val))
+               vref -= val;
+
+       ret = adc_data_mask(dev, &data_mask);
+       if (ret)
+               return ret;
+
+       raw64 *= vref;
+       do_div(raw64, data_mask);
+       *uV = raw64;
+
+       return 0;
+}
+
 static int adc_vdd_platdata_set(struct udevice *dev)
 {
        struct adc_uclass_platdata *uc_pdata = dev_get_uclass_platdata(dev);