mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-28 15:41:40 +00:00
adc: stm32mp15: add support of generic channels binding
Add support of generic IIO channels binding: ./devicetree/bindings/iio/adc/adc.yaml Keep support of st,adc-channels for backward compatibility. Signed-off-by: Olivier Moysan <olivier.moysan@foss.st.com> Reviewed-by: Patrick Delaunay <patrick.delaunay@foss.st.com> Reviewed-by: Patrice Chotard <patrice.chotard@foss.st.com>
This commit is contained in:
parent
1727d46bf9
commit
a9aa2aef5f
1 changed files with 44 additions and 5 deletions
|
@ -200,24 +200,63 @@ static int stm32_adc_legacy_chan_init(struct udevice *dev, unsigned int num_chan
|
|||
return ret;
|
||||
}
|
||||
|
||||
static int stm32_adc_generic_chan_init(struct udevice *dev, unsigned int num_channels)
|
||||
{
|
||||
struct adc_uclass_plat *uc_pdata = dev_get_uclass_plat(dev);
|
||||
struct stm32_adc *adc = dev_get_priv(dev);
|
||||
ofnode child;
|
||||
int val, ret;
|
||||
|
||||
ofnode_for_each_subnode(child, dev_ofnode(dev)) {
|
||||
ret = ofnode_read_u32(child, "reg", &val);
|
||||
if (ret) {
|
||||
dev_err(dev, "Missing channel index %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (val >= adc->cfg->max_channels) {
|
||||
dev_err(dev, "Invalid channel %d\n", val);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
uc_pdata->channel_mask |= 1 << val;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int stm32_adc_chan_of_init(struct udevice *dev)
|
||||
{
|
||||
struct adc_uclass_plat *uc_pdata = dev_get_uclass_plat(dev);
|
||||
struct stm32_adc *adc = dev_get_priv(dev);
|
||||
unsigned int num_channels;
|
||||
int ret;
|
||||
bool legacy = false;
|
||||
|
||||
ret = stm32_adc_get_legacy_chan_count(dev);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
num_channels = ret;
|
||||
num_channels = dev_get_child_count(dev);
|
||||
/* If no channels have been found, fallback to channels legacy properties. */
|
||||
if (!num_channels) {
|
||||
legacy = true;
|
||||
|
||||
ret = stm32_adc_get_legacy_chan_count(dev);
|
||||
if (!ret) {
|
||||
dev_err(dev, "No channel found\n");
|
||||
return -ENODATA;
|
||||
} else if (ret < 0) {
|
||||
return ret;
|
||||
}
|
||||
num_channels = ret;
|
||||
}
|
||||
|
||||
if (num_channels > adc->cfg->max_channels) {
|
||||
dev_err(dev, "too many st,adc-channels: %d\n", num_channels);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
ret = stm32_adc_legacy_chan_init(dev, num_channels);
|
||||
if (legacy)
|
||||
ret = stm32_adc_legacy_chan_init(dev, num_channels);
|
||||
else
|
||||
ret = stm32_adc_generic_chan_init(dev, num_channels);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
|
|
Loading…
Reference in a new issue