Message ID | 20221123162012.2.Ifb433baf31af3661271d98b7c155958aa5f7afdb@changeid |
---|---|
State | Accepted |
Commit | a9aa2aef5fbe9cbab61fbcc6e61cbabb7176f4f7 |
Delegated to: | Patrice Chotard |
Headers | show |
Series | adc: stm32mp15: add support of generic channels binding | expand |
Hi, On 11/23/22 16:20, Olivier Moysan wrote: > 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> > --- > > drivers/adc/stm32-adc.c | 51 ++++++++++++++++++++++++++++++++++++----- > 1 file changed, 45 insertions(+), 6 deletions(-) > > diff --git a/drivers/adc/stm32-adc.c b/drivers/adc/stm32-adc.c > index 1250385fbb92..85efc119dbf1 100644 > --- a/drivers/adc/stm32-adc.c > +++ b/drivers/adc/stm32-adc.c > @@ -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; > - > - ret = stm32_adc_get_legacy_chan_count(dev); > - if (ret < 0) > - return ret; > - num_channels = ret; > + bool legacy = false; > + > + 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; > Reviewed-by: Patrick Delaunay <patrick.delaunay@foss.st.com> Thanks Patrick
On 11/23/22 16:20, Olivier Moysan wrote: > 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> > --- > > drivers/adc/stm32-adc.c | 51 ++++++++++++++++++++++++++++++++++++----- > 1 file changed, 45 insertions(+), 6 deletions(-) > > diff --git a/drivers/adc/stm32-adc.c b/drivers/adc/stm32-adc.c > index 1250385fbb92..85efc119dbf1 100644 > --- a/drivers/adc/stm32-adc.c > +++ b/drivers/adc/stm32-adc.c > @@ -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; > - > - ret = stm32_adc_get_legacy_chan_count(dev); > - if (ret < 0) > - return ret; > - num_channels = ret; > + bool legacy = false; > + > + 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; > Reviewed-by: Patrice Chotard <patrice.chotard@foss.st.com> Thanks Patrice
On 12/7/22 16:57, Patrice CHOTARD wrote: > > > On 11/23/22 16:20, Olivier Moysan wrote: >> 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> >> --- >> >> drivers/adc/stm32-adc.c | 51 ++++++++++++++++++++++++++++++++++++----- >> 1 file changed, 45 insertions(+), 6 deletions(-) >> >> diff --git a/drivers/adc/stm32-adc.c b/drivers/adc/stm32-adc.c >> index 1250385fbb92..85efc119dbf1 100644 >> --- a/drivers/adc/stm32-adc.c >> +++ b/drivers/adc/stm32-adc.c >> @@ -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; >> - >> - ret = stm32_adc_get_legacy_chan_count(dev); >> - if (ret < 0) >> - return ret; >> - num_channels = ret; >> + bool legacy = false; >> + >> + 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; >> > Reviewed-by: Patrice Chotard <patrice.chotard@foss.st.com> > > Thanks > Patrice > _______________________________________________ > Uboot-stm32 mailing list > Uboot-stm32@st-md-mailman.stormreply.com > https://st-md-mailman.stormreply.com/mailman/listinfo/uboot-stm32 Applied to u-boot-stm/master Thanks Patrice
diff --git a/drivers/adc/stm32-adc.c b/drivers/adc/stm32-adc.c index 1250385fbb92..85efc119dbf1 100644 --- a/drivers/adc/stm32-adc.c +++ b/drivers/adc/stm32-adc.c @@ -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; - - ret = stm32_adc_get_legacy_chan_count(dev); - if (ret < 0) - return ret; - num_channels = ret; + bool legacy = false; + + 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;
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> --- drivers/adc/stm32-adc.c | 51 ++++++++++++++++++++++++++++++++++++----- 1 file changed, 45 insertions(+), 6 deletions(-)