This patch set adds Arbel NPCM8XX Analog-to-Digital Converter (ADC) support
to ADC NPCM driver.
The NPCM8XX ADC is a 12-bit converter for eight channel inputs.
The NPCM ADC driver tested on NPCM845 evaluation board.
Tomer Maimon (2):
dt-bindings: iio: adc: npcm: Add npcm845 compatible string
iio: adc: npcm: Add NPCM8XX support
.../bindings/iio/adc/nuvoton,npcm750-adc.yaml | 5 ++-
drivers/iio/adc/npcm_adc.c | 39 +++++++++++++++----
2 files changed, 35 insertions(+), 9 deletions(-)
--
2.33.0
Adding ADC NPCM8XX support to NPCM ADC driver.
ADC NPCM8XX uses a different resolution and voltage reference.
As part of adding NPCM8XX support:
- Add NPCM8XX specific compatible string.
- Add data to handle architecture-specific ADC parameters.
Signed-off-by: Tomer Maimon <[email protected]>
---
drivers/iio/adc/npcm_adc.c | 39 ++++++++++++++++++++++++++++++--------
1 file changed, 31 insertions(+), 8 deletions(-)
diff --git a/drivers/iio/adc/npcm_adc.c b/drivers/iio/adc/npcm_adc.c
index f7bc0bb7f112..efacba256056 100644
--- a/drivers/iio/adc/npcm_adc.c
+++ b/drivers/iio/adc/npcm_adc.c
@@ -16,6 +16,12 @@
#include <linux/uaccess.h>
#include <linux/reset.h>
+struct npcm_adc_info {
+ u32 data_mask;
+ u32 internal_vref;
+ u32 res_bits;
+};
+
struct npcm_adc {
bool int_status;
u32 adc_sample_hz;
@@ -34,6 +40,7 @@ struct npcm_adc {
* has finished.
*/
struct mutex lock;
+ struct npcm_adc_info *data;
};
/* ADC registers */
@@ -52,13 +59,21 @@ struct npcm_adc {
#define NPCM_ADCCON_CH(x) ((x) << 24)
#define NPCM_ADCCON_DIV_SHIFT 1
#define NPCM_ADCCON_DIV_MASK GENMASK(8, 1)
-#define NPCM_ADC_DATA_MASK(x) ((x) & GENMASK(9, 0))
#define NPCM_ADC_ENABLE (NPCM_ADCCON_ADC_EN | NPCM_ADCCON_ADC_INT_EN)
/* ADC General Definition */
-#define NPCM_RESOLUTION_BITS 10
-#define NPCM_INT_VREF_MV 2000
+static const struct npcm_adc_info npxm7xx_adc_info = {
+ .data_mask = GENMASK(9, 0),
+ .internal_vref = 2048,
+ .res_bits = 10,
+};
+
+static const struct npcm_adc_info npxm8xx_adc_info = {
+ .data_mask = GENMASK(11, 0),
+ .internal_vref = 1229,
+ .res_bits = 12,
+};
#define NPCM_ADC_CHAN(ch) { \
.type = IIO_VOLTAGE, \
@@ -129,7 +144,8 @@ static int npcm_adc_read(struct npcm_adc *info, int *val, u8 channel)
if (ret < 0)
return ret;
- *val = NPCM_ADC_DATA_MASK(ioread32(info->regs + NPCM_ADCDATA));
+ *val = ioread32(info->regs + NPCM_ADCDATA);
+ *val &= info->data->data_mask;
return 0;
}
@@ -157,9 +173,9 @@ static int npcm_adc_read_raw(struct iio_dev *indio_dev,
vref_uv = regulator_get_voltage(info->vref);
*val = vref_uv / 1000;
} else {
- *val = NPCM_INT_VREF_MV;
+ *val = info->data->internal_vref;
}
- *val2 = NPCM_RESOLUTION_BITS;
+ *val2 = info->data->res_bits;
return IIO_VAL_FRACTIONAL_LOG2;
case IIO_CHAN_INFO_SAMP_FREQ:
*val = info->adc_sample_hz;
@@ -176,7 +192,8 @@ static const struct iio_info npcm_adc_iio_info = {
};
static const struct of_device_id npcm_adc_match[] = {
- { .compatible = "nuvoton,npcm750-adc", },
+ { .compatible = "nuvoton,npcm750-adc", .data = &npxm7xx_adc_info},
+ { .compatible = "nuvoton,npcm845-adc", .data = &npxm8xx_adc_info},
{ /* sentinel */ }
};
MODULE_DEVICE_TABLE(of, npcm_adc_match);
@@ -190,14 +207,20 @@ static int npcm_adc_probe(struct platform_device *pdev)
struct npcm_adc *info;
struct iio_dev *indio_dev;
struct device *dev = &pdev->dev;
+ const struct of_device_id *match;
indio_dev = devm_iio_device_alloc(&pdev->dev, sizeof(*info));
if (!indio_dev)
return -ENOMEM;
info = iio_priv(indio_dev);
- mutex_init(&info->lock);
+ match = of_match_node(npcm_adc_match, pdev->dev.of_node);
+ if (!match || !match->data) {
+ dev_err(dev, "Failed getting npcm_adc_data\n");
+ return -ENODEV;
+ }
+ info->data = (struct npcm_adc_info *)match->data;
info->dev = &pdev->dev;
info->regs = devm_platform_ioremap_resource(pdev, 0);
--
2.33.0
Add a compatible string for Nuvoton BMC NPCM845 ADC.
Signed-off-by: Tomer Maimon <[email protected]>
---
.../devicetree/bindings/iio/adc/nuvoton,npcm750-adc.yaml | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/Documentation/devicetree/bindings/iio/adc/nuvoton,npcm750-adc.yaml b/Documentation/devicetree/bindings/iio/adc/nuvoton,npcm750-adc.yaml
index 001cf263b7d5..c9e9c5bf5e5b 100644
--- a/Documentation/devicetree/bindings/iio/adc/nuvoton,npcm750-adc.yaml
+++ b/Documentation/devicetree/bindings/iio/adc/nuvoton,npcm750-adc.yaml
@@ -14,7 +14,10 @@ description:
properties:
compatible:
- const: nuvoton,npcm750-adc
+ oneOf:
+ - items:
+ - const: nuvoton,npcm750-adc
+ - const: nuvoton,npcm845-adc
reg:
maxItems: 1
--
2.33.0
On Mon, Jul 11, 2022 at 3:59 PM Tomer Maimon <[email protected]> wrote:
>
> Adding ADC NPCM8XX support to NPCM ADC driver.
> ADC NPCM8XX uses a different resolution and voltage reference.
>
> As part of adding NPCM8XX support:
> - Add NPCM8XX specific compatible string.
> - Add data to handle architecture-specific ADC parameters.
Good patch, but one change can make it even better!
...
> struct device *dev = &pdev->dev;
> + const struct of_device_id *match;
>
> indio_dev = devm_iio_device_alloc(&pdev->dev, sizeof(*info));
> if (!indio_dev)
> return -ENOMEM;
> info = iio_priv(indio_dev);
>
> - mutex_init(&info->lock);
> + match = of_match_node(npcm_adc_match, pdev->dev.of_node);
> + if (!match || !match->data) {
> + dev_err(dev, "Failed getting npcm_adc_data\n");
> + return -ENODEV;
> + }
>
> + info->data = (struct npcm_adc_info *)match->data;
Instead of above
info->data = device_get_match_data(dev);
if (!info->data)
return -ENODEV;
--
With Best Regards,
Andy Shevchenko
On Mon, Jul 11, 2022 at 4:14 PM Andy Shevchenko
<[email protected]> wrote:
> On Mon, Jul 11, 2022 at 3:59 PM Tomer Maimon <[email protected]> wrote:
...
> > struct device *dev = &pdev->dev;
> > + const struct of_device_id *match;
> > + match = of_match_node(npcm_adc_match, pdev->dev.of_node);
> > + if (!match || !match->data) {
> > + dev_err(dev, "Failed getting npcm_adc_data\n");
> > + return -ENODEV;
> > + }
> >
> > + info->data = (struct npcm_adc_info *)match->data;
>
> Instead of above
>
> info->data = device_get_match_data(dev);
> if (!info->data)
> return -ENODEV;
Or
return dev_err_probe(dev, -EINVAL, "...\n");
if you want that message to be issued.
--
With Best Regards,
Andy Shevchenko
On Mon, 11 Jul 2022 16:43:10 +0300, Tomer Maimon wrote:
> Add a compatible string for Nuvoton BMC NPCM845 ADC.
>
> Signed-off-by: Tomer Maimon <[email protected]>
> ---
> .../devicetree/bindings/iio/adc/nuvoton,npcm750-adc.yaml | 5 ++++-
> 1 file changed, 4 insertions(+), 1 deletion(-)
>
My bot found errors running 'make DT_CHECKER_FLAGS=-m dt_binding_check'
on your patch (DT_CHECKER_FLAGS is new in v5.13):
yamllint warnings/errors:
dtschema/dtc warnings/errors:
/builds/robherring/linux-dt-review/Documentation/devicetree/bindings/iio/adc/nuvoton,npcm750-adc.example.dtb: adc@f000c000: compatible: 'oneOf' conditional failed, one must be fixed:
['nuvoton,npcm750-adc'] is too short
From schema: /builds/robherring/linux-dt-review/Documentation/devicetree/bindings/iio/adc/nuvoton,npcm750-adc.yaml
doc reference errors (make refcheckdocs):
See https://patchwork.ozlabs.org/patch/
This check can fail if there are any dependencies. The base for a patch
series is generally the most recent rc1.
If you already ran 'make dt_binding_check' and didn't see the above
error(s), then make sure 'yamllint' is installed and dt-schema is up to
date:
pip3 install dtschema --upgrade
Please check and re-submit.
Hi Rob,
Thanks for your comment, it will be addressed next version.
On Mon, 11 Jul 2022 at 20:55, Rob Herring <[email protected]> wrote:
>
> On Mon, 11 Jul 2022 16:43:10 +0300, Tomer Maimon wrote:
> > Add a compatible string for Nuvoton BMC NPCM845 ADC.
> >
> > Signed-off-by: Tomer Maimon <[email protected]>
> > ---
> > .../devicetree/bindings/iio/adc/nuvoton,npcm750-adc.yaml | 5 ++++-
> > 1 file changed, 4 insertions(+), 1 deletion(-)
> >
>
> My bot found errors running 'make DT_CHECKER_FLAGS=-m dt_binding_check'
> on your patch (DT_CHECKER_FLAGS is new in v5.13):
>
> yamllint warnings/errors:
>
> dtschema/dtc warnings/errors:
> /builds/robherring/linux-dt-review/Documentation/devicetree/bindings/iio/adc/nuvoton,npcm750-adc.example.dtb: adc@f000c000: compatible: 'oneOf' conditional failed, one must be fixed:
> ['nuvoton,npcm750-adc'] is too short
> From schema: /builds/robherring/linux-dt-review/Documentation/devicetree/bindings/iio/adc/nuvoton,npcm750-adc.yaml
>
> doc reference errors (make refcheckdocs):
>
> See https://patchwork.ozlabs.org/patch/
>
> This check can fail if there are any dependencies. The base for a patch
> series is generally the most recent rc1.
>
> If you already ran 'make dt_binding_check' and didn't see the above
> error(s), then make sure 'yamllint' is installed and dt-schema is up to
> date:
>
> pip3 install dtschema --upgrade
>
> Please check and re-submit.
>
Best regards,
Tomer
On 11/07/2022 15:43, Tomer Maimon wrote:
> Add a compatible string for Nuvoton BMC NPCM845 ADC.
>
> Signed-off-by: Tomer Maimon <[email protected]>
> ---
> .../devicetree/bindings/iio/adc/nuvoton,npcm750-adc.yaml | 5 ++++-
> 1 file changed, 4 insertions(+), 1 deletion(-)
>
> diff --git a/Documentation/devicetree/bindings/iio/adc/nuvoton,npcm750-adc.yaml b/Documentation/devicetree/bindings/iio/adc/nuvoton,npcm750-adc.yaml
> index 001cf263b7d5..c9e9c5bf5e5b 100644
> --- a/Documentation/devicetree/bindings/iio/adc/nuvoton,npcm750-adc.yaml
> +++ b/Documentation/devicetree/bindings/iio/adc/nuvoton,npcm750-adc.yaml
> @@ -14,7 +14,10 @@ description:
>
> properties:
> compatible:
> - const: nuvoton,npcm750-adc
> + oneOf:
> + - items:
This does not make sense. oneOf with one item. You also create now list
breaking all existing users/ABI.
You probably wanted an enum here.
> + - const: nuvoton,npcm750-adc
> + - const: nuvoton,npcm845-adc
>
> reg:
> maxItems: 1
Best regards,
Krzysztof
Hi Krzysztof,
On Tue, 12 Jul 2022 at 11:15, Krzysztof Kozlowski
<[email protected]> wrote:
>
> On 11/07/2022 15:43, Tomer Maimon wrote:
> > Add a compatible string for Nuvoton BMC NPCM845 ADC.
> >
> > Signed-off-by: Tomer Maimon <[email protected]>
> > ---
> > .../devicetree/bindings/iio/adc/nuvoton,npcm750-adc.yaml | 5 ++++-
> > 1 file changed, 4 insertions(+), 1 deletion(-)
> >
> > diff --git a/Documentation/devicetree/bindings/iio/adc/nuvoton,npcm750-adc.yaml b/Documentation/devicetree/bindings/iio/adc/nuvoton,npcm750-adc.yaml
> > index 001cf263b7d5..c9e9c5bf5e5b 100644
> > --- a/Documentation/devicetree/bindings/iio/adc/nuvoton,npcm750-adc.yaml
> > +++ b/Documentation/devicetree/bindings/iio/adc/nuvoton,npcm750-adc.yaml
> > @@ -14,7 +14,10 @@ description:
> >
> > properties:
> > compatible:
> > - const: nuvoton,npcm750-adc
> > + oneOf:
> > + - items:
>
> This does not make sense. oneOf with one item. You also create now list
> breaking all existing users/ABI.
>
> You probably wanted an enum here.
indeed, thanks for your comment.
>
> > + - const: nuvoton,npcm750-adc
> > + - const: nuvoton,npcm845-adc
> >
> > reg:
> > maxItems: 1
>
>
> Best regards,
> Krzysztof
Best regards,
Tomer
Hi Andy,
Thanks for your comments, they will be addressed next version.
On Mon, 11 Jul 2022 at 17:16, Andy Shevchenko <[email protected]> wrote:
>
> On Mon, Jul 11, 2022 at 4:14 PM Andy Shevchenko
> <[email protected]> wrote:
> > On Mon, Jul 11, 2022 at 3:59 PM Tomer Maimon <[email protected]> wrote:
>
> ...
>
> > > struct device *dev = &pdev->dev;
> > > + const struct of_device_id *match;
>
> > > + match = of_match_node(npcm_adc_match, pdev->dev.of_node);
> > > + if (!match || !match->data) {
> > > + dev_err(dev, "Failed getting npcm_adc_data\n");
> > > + return -ENODEV;
> > > + }
> > >
> > > + info->data = (struct npcm_adc_info *)match->data;
> >
> > Instead of above
> >
> > info->data = device_get_match_data(dev);
> > if (!info->data)
>
>
> > return -ENODEV;
>
> Or
>
> return dev_err_probe(dev, -EINVAL, "...\n");
>
> if you want that message to be issued.
>
>
> --
> With Best Regards,
> Andy Shevchenko
Best regards,
Tomer