Skip to contentSkip to conversation

iio: adc: npcm: add Arbel NPCM8XX support

PATCH Superseded Tomer Maimon 4 participants 10 messages Jul 11, 2022 – Jul 12, 2022

Subsystems (3)

v1 of 3 Superseded Latest is v3 →

lore
Share & tools
lore

Tomer Maimon

author maintainer
#0 lore raw

cover iio: adc: npcm: add Arbel NPCM8XX support

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(-)
Signature · 1 line
2.33.0
author maintainer
#1 lore raw

PATCH 1/2 dt-bindings: iio: adc: npcm: Add npcm845 compatible string

Add a compatible string for Nuvoton BMC NPCM845 ADC.

---
 .../devicetree/bindings/iio/adc/nuvoton,npcm750-adc.yaml     | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)
Documentation/devicetree/bindings/iio/adc/nuvoton,npcm750-adc.yaml +4 -1
index 001cf263b7d5..c9e9c5bf5e5b 100644
@@ -14,7 +14,10 @@ description:
 
 properties:
   compatible:
-    const: nuvoton,npcm750-adc
+    oneOf:
+      - items:
+          - const: nuvoton,npcm750-adc
+          - const: nuvoton,npcm845-adc
 
   reg:
     maxItems: 1
Signature · 1 line
2.33.0
maintainer
#2 lore raw

Re: [PATCH v1 1/2] dt-bindings: iio: adc: npcm: Add npcm845 compatible string

Quoted 7 lines · Tomer Maimon

Add a compatible string for Nuvoton BMC NPCM845 ADC.

---
 .../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.

author maintainer
#3 lore raw

Re: [PATCH v1 1/2] dt-bindings: iio: adc: npcm: Add npcm845 compatible string

Hi Rob,

Thanks for your comment, it will be addressed next version.

Quoted 27 lines · Rob Herring
Quoted 7 lines · Tomer Maimon

Add a compatible string for Nuvoton BMC NPCM845 ADC.

---
 .../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.

Quoted 8 lines

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

#4 lore raw

Re: [PATCH v1 1/2] dt-bindings: iio: adc: npcm: Add npcm845 compatible string

In reply to Tomer Maimon
Quoted 12 lines · Tomer Maimon

Add a compatible string for Nuvoton BMC NPCM845 ADC.

---
 .../devicetree/bindings/iio/adc/nuvoton,npcm750-adc.yaml     | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)
Documentation/devicetree/bindings/iio/adc/nuvoton,npcm750-adc.yaml +0 -0
index 001cf263b7d5..c9e9c5bf5e5b 100644

Documentation/devicetree/bindings/iio/adc/nuvoton,npcm750-adc.yaml description: · line 18

Quoted 6 lines
Documentation/devicetree/bindings/iio/adc/nuvoton,npcm750-adc.yaml +2 -1
@@ -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.

Documentation/devicetree/bindings/iio/adc/nuvoton,npcm750-adc.yaml description: · line 23

Quoted 5 lines
Documentation/devicetree/bindings/iio/adc/nuvoton,npcm750-adc.yaml +2 -0
+          - const: nuvoton,npcm750-adc
+          - const: nuvoton,npcm845-adc
 
   reg:
     maxItems: 1

Best regards,
Krzysztof

author maintainer
#5 lore raw

Re: [PATCH v1 1/2] dt-bindings: iio: adc: npcm: Add npcm845 compatible string

Hi Krzysztof,

Quoted 24 lines · Krzysztof Kozlowski
Quoted 12 lines · Tomer Maimon

Add a compatible string for Nuvoton BMC NPCM845 ADC.

---
 .../devicetree/bindings/iio/adc/nuvoton,npcm750-adc.yaml     | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)
Documentation/devicetree/bindings/iio/adc/nuvoton,npcm750-adc.yaml +0 -0
index 001cf263b7d5..c9e9c5bf5e5b 100644

Documentation/devicetree/bindings/iio/adc/nuvoton,npcm750-adc.yaml description: · line 18

Quoted 6 lines
Documentation/devicetree/bindings/iio/adc/nuvoton,npcm750-adc.yaml +2 -1
@@ -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.

Quoted 1 line

You probably wanted an enum here.

indeed, thanks for your comment.

Quoted 10 lines

Documentation/devicetree/bindings/iio/adc/nuvoton,npcm750-adc.yaml description: · line 23

Quoted 6 lines
Documentation/devicetree/bindings/iio/adc/nuvoton,npcm750-adc.yaml +2 -0
+          - const: nuvoton,npcm750-adc
+          - const: nuvoton,npcm845-adc
 
   reg:
     maxItems: 1

Best regards,
Krzysztof

Best regards,

Tomer

author maintainer
#6 lore raw

PATCH 2/2 iio: adc: npcm: Add NPCM8XX support

In reply to Tomer Maimon

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.

---
 drivers/iio/adc/npcm_adc.c | 39 ++++++++++++++++++++++++++++++--------
 1 file changed, 31 insertions(+), 8 deletions(-)
drivers/iio/adc/npcm_adc.c +31 -8
index f7bc0bb7f112..efacba256056 100644
@@ -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);
Signature · 1 line
2.33.0
#7 lore raw

Re: [PATCH v1 2/2] iio: adc: npcm: Add NPCM8XX support

Quoted 7 lines · Tomer Maimon

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!

...

Quoted 6 lines
        struct device *dev = &pdev->dev;
drivers/iio/adc/npcm_adc.c +1 -0
+       const struct of_device_id *match;
 
        indio_dev = devm_iio_device_alloc(&pdev->dev, sizeof(*info));
        if (!indio_dev)
                return -ENOMEM;

drivers/iio/adc/npcm_adc.c static int npcm_adc_probe(struct platform_device *pdev) · line 223

Quoted 10 lines
drivers/iio/adc/npcm_adc.c +6 -1
        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;
Signature · 2 lines
With Best Regards,
Andy Shevchenko
#8 lore raw

Re: [PATCH v1 2/2] iio: adc: npcm: Add NPCM8XX support

Quoted 1 line · Andy Shevchenko

On Mon, Jul 11, 2022 at 3:59 PM Tomer Maimon <[email protected]> wrote:

...

Quoted 11 lines

drivers/iio/adc/npcm_adc.c static int npcm_adc_probe(struct platform_device *pdev) · line 223

Quoted 10 lines
        struct device *dev = &pdev->dev;
drivers/iio/adc/npcm_adc.c +7 -0
+       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;
Quoted 7 lines

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.

Signature · 2 lines
With Best Regards,
Andy Shevchenko
author maintainer
#9 lore raw

Re: [PATCH v1 2/2] iio: adc: npcm: Add NPCM8XX support

Hi Andy,

Thanks for your comments, they will be addressed next version.

Quoted 28 lines · Andy Shevchenko
Quoted 1 line · Andy Shevchenko

On Mon, Jul 11, 2022 at 3:59 PM Tomer Maimon <[email protected]> wrote:

...

Quoted 11 lines

drivers/iio/adc/npcm_adc.c static int npcm_adc_probe(struct platform_device *pdev) · line 223

Quoted 10 lines
        struct device *dev = &pdev->dev;
drivers/iio/adc/npcm_adc.c +7 -0
+       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;
Quoted 7 lines

Instead of above

  info->data = device_get_match_data(dev);
  if (!info->data)
    return -ENODEV;

Or

Quoted 8 lines
  return dev_err_probe(dev, -EINVAL, "...\n");

if you want that message to be issued.

--
With Best Regards,
Andy Shevchenko

Best regards,

Tomer