X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=drivers%2Fadc%2Fadc-uclass.c;h=d435667258109801562684b9c5c12dab5a821de2;hb=c05ed00afb95fa5237f16962fccf5810437317bf;hp=9233fcdb6c1edb67befd534b681c0db80c26024b;hpb=5decbf53006c8e2aed8e5506b3961810c1544b3c;p=oweals%2Fu-boot.git diff --git a/drivers/adc/adc-uclass.c b/drivers/adc/adc-uclass.c index 9233fcdb6c..d435667258 100644 --- a/drivers/adc/adc-uclass.c +++ b/drivers/adc/adc-uclass.c @@ -1,21 +1,20 @@ +// SPDX-License-Identifier: GPL-2.0+ /* * Copyright (C) 2015 Samsung Electronics * Przemyslaw Marczak - * - * SPDX-License-Identifier: GPL-2.0+ */ #include #include +#include #include #include #include #include #include +#include #include -DECLARE_GLOBAL_DATA_PTR; - #define ADC_UCLASS_PLATDATA_SIZE sizeof(struct adc_uclass_platdata) #define CHECK_NUMBER true #define CHECK_MASK (!CHECK_NUMBER) @@ -64,7 +63,7 @@ static int adc_supply_enable(struct udevice *dev) } if (ret) - error("%s: can't enable %s-supply!", dev->name, supply_type); + pr_err("%s: can't enable %s-supply!", dev->name, supply_type); return ret; } @@ -80,6 +79,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); @@ -267,10 +278,8 @@ static int adc_vdd_platdata_update(struct udevice *dev) * will bind before its supply regulator device, then the below 'get' * will return an error. */ - ret = device_get_supply_regulator(dev, "vdd-supply", - &uc_pdata->vdd_supply); - if (ret) - return ret; + if (!uc_pdata->vdd_supply) + return 0; ret = regulator_get_value(uc_pdata->vdd_supply); if (ret < 0) @@ -286,10 +295,8 @@ static int adc_vss_platdata_update(struct udevice *dev) struct adc_uclass_platdata *uc_pdata = dev_get_uclass_platdata(dev); int ret; - ret = device_get_supply_regulator(dev, "vss-supply", - &uc_pdata->vss_supply); - if (ret) - return ret; + if (!uc_pdata->vss_supply) + return 0; ret = regulator_get_value(uc_pdata->vss_supply); if (ret < 0) @@ -305,14 +312,11 @@ int adc_vdd_value(struct udevice *dev, int *uV) struct adc_uclass_platdata *uc_pdata = dev_get_uclass_platdata(dev); int ret, value_sign = uc_pdata->vdd_polarity_negative ? -1 : 1; - if (!uc_pdata->vdd_supply) - goto nodev; - /* Update the regulator Value. */ ret = adc_vdd_platdata_update(dev); if (ret) return ret; -nodev: + if (uc_pdata->vdd_microvolts == -ENODATA) return -ENODATA; @@ -326,14 +330,11 @@ int adc_vss_value(struct udevice *dev, int *uV) struct adc_uclass_platdata *uc_pdata = dev_get_uclass_platdata(dev); int ret, value_sign = uc_pdata->vss_polarity_negative ? -1 : 1; - if (!uc_pdata->vss_supply) - goto nodev; - /* Update the regulator Value. */ ret = adc_vss_platdata_update(dev); if (ret) return ret; -nodev: + if (uc_pdata->vss_microvolts == -ENODATA) return -ENODATA; @@ -342,23 +343,51 @@ nodev: 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); - int ret, offset = dev->of_offset; - const void *fdt = gd->fdt_blob; + int ret; char *prop; prop = "vdd-polarity-negative"; - uc_pdata->vdd_polarity_negative = fdtdec_get_bool(fdt, offset, prop); + uc_pdata->vdd_polarity_negative = dev_read_bool(dev, prop); + + /* Optionally get regulators */ + ret = device_get_supply_regulator(dev, "vdd-supply", + &uc_pdata->vdd_supply); + if (!ret) + return adc_vdd_platdata_update(dev); - ret = adc_vdd_platdata_update(dev); if (ret != -ENOENT) return ret; /* No vdd-supply phandle. */ prop = "vdd-microvolts"; - uc_pdata->vdd_microvolts = fdtdec_get_int(fdt, offset, prop, -ENODATA); + uc_pdata->vdd_microvolts = dev_read_u32_default(dev, prop, -ENODATA); return 0; } @@ -366,20 +395,23 @@ static int adc_vdd_platdata_set(struct udevice *dev) static int adc_vss_platdata_set(struct udevice *dev) { struct adc_uclass_platdata *uc_pdata = dev_get_uclass_platdata(dev); - int ret, offset = dev->of_offset; - const void *fdt = gd->fdt_blob; + int ret; char *prop; prop = "vss-polarity-negative"; - uc_pdata->vss_polarity_negative = fdtdec_get_bool(fdt, offset, prop); + uc_pdata->vss_polarity_negative = dev_read_bool(dev, prop); + + ret = device_get_supply_regulator(dev, "vss-supply", + &uc_pdata->vss_supply); + if (!ret) + return adc_vss_platdata_update(dev); - ret = adc_vss_platdata_update(dev); if (ret != -ENOENT) return ret; /* No vss-supply phandle. */ prop = "vss-microvolts"; - uc_pdata->vss_microvolts = fdtdec_get_int(fdt, offset, prop, -ENODATA); + uc_pdata->vss_microvolts = dev_read_u32_default(dev, prop, -ENODATA); return 0; } @@ -391,12 +423,12 @@ static int adc_pre_probe(struct udevice *dev) /* Set ADC VDD platdata: polarity, uV, regulator (phandle). */ ret = adc_vdd_platdata_set(dev); if (ret) - error("%s: Can't update Vdd. Error: %d", dev->name, ret); + pr_err("%s: Can't update Vdd. Error: %d", dev->name, ret); /* Set ADC VSS platdata: polarity, uV, regulator (phandle). */ ret = adc_vss_platdata_set(dev); if (ret) - error("%s: Can't update Vss. Error: %d", dev->name, ret); + pr_err("%s: Can't update Vss. Error: %d", dev->name, ret); return 0; }