[PATCH v2 2/2] iio: adc: imx93_adc: load calibrated values even calibration failed

Haibo Chen posted 2 patches 1 month, 3 weeks ago
[PATCH v2 2/2] iio: adc: imx93_adc: load calibrated values even calibration failed
Posted by Haibo Chen 1 month, 3 weeks ago
ADC calibration might fail because of the noise on reference voltage.
To avoid calibration fail, need to meet the following requirement:
    ADC reference voltage Noise < 1.8V * 1/2^ENOB

For the case which the ADC reference voltage on board do not meet
the requirement, still load the calibrated values, so ADC can also
work but maybe not that accurate.

Signed-off-by: Haibo Chen <haibo.chen@nxp.com>
---
 drivers/iio/adc/imx93_adc.c | 18 +++++++++++++++---
 1 file changed, 15 insertions(+), 3 deletions(-)

diff --git a/drivers/iio/adc/imx93_adc.c b/drivers/iio/adc/imx93_adc.c
index 8471737ac04a2bac0417a6397f20865f6a2c01ca..17b0a2548b0a3614ac537b01e28bc3144d17d6fc 100644
--- a/drivers/iio/adc/imx93_adc.c
+++ b/drivers/iio/adc/imx93_adc.c
@@ -38,6 +38,7 @@
 #define IMX93_ADC_PCDR6		0x118
 #define IMX93_ADC_PCDR7		0x11C
 #define IMX93_ADC_CALSTAT	0x39C
+#define IMX93_ADC_CALCFG0	0x3A0
 
 /* ADC bit shift */
 #define IMX93_ADC_MCR_MODE_MASK			BIT(29)
@@ -58,6 +59,8 @@
 #define IMX93_ADC_IMR_ECH_MASK			BIT(0)
 #define IMX93_ADC_PCDR_CDATA_MASK		GENMASK(11, 0)
 
+#define IMX93_ADC_CALCFG0_LDFAIL_MASK		BIT(4)
+
 /* ADC status */
 #define IMX93_ADC_MSR_ADCSTATUS_IDLE			0
 #define IMX93_ADC_MSR_ADCSTATUS_POWER_DOWN		1
@@ -145,7 +148,7 @@ static void imx93_adc_config_ad_clk(struct imx93_adc *adc)
 
 static int imx93_adc_calibration(struct imx93_adc *adc)
 {
-	u32 mcr, msr;
+	u32 mcr, msr, calcfg;
 	int ret;
 
 	/* make sure ADC in power down mode */
@@ -158,6 +161,11 @@ static int imx93_adc_calibration(struct imx93_adc *adc)
 
 	imx93_adc_power_up(adc);
 
+	/* Enable loading of calibrated values even in fail condition */
+	calcfg = readl(adc->regs + IMX93_ADC_CALCFG0);
+	calcfg |= IMX93_ADC_CALCFG0_LDFAIL_MASK;
+	writel(calcfg, adc->regs + IMX93_ADC_CALCFG0);
+
 	/*
 	 * TODO: we use the default TSAMP/NRSMPL/AVGEN in MCR,
 	 * can add the setting of these bit if need in future.
@@ -180,9 +188,13 @@ static int imx93_adc_calibration(struct imx93_adc *adc)
 	/* check whether calbration is success or not */
 	msr = readl(adc->regs + IMX93_ADC_MSR);
 	if (msr & IMX93_ADC_MSR_CALFAIL_MASK) {
+		/*
+		 * Only give warning here, this means the noise of the
+		 * reference voltage do not meet the requirement:
+		 *     ADC reference voltage Noise < 1.8V * 1/2^ENOB
+		 * And the resault of ADC is not that accurate.
+		 */
 		dev_warn(adc->dev, "ADC calibration failed!\n");
-		imx93_adc_power_down(adc);
-		return -EAGAIN;
 	}
 
 	return 0;

-- 
2.34.1
Re: [PATCH v2 2/2] iio: adc: imx93_adc: load calibrated values even calibration failed
Posted by Frank Li 1 month, 3 weeks ago
On Tue, Aug 12, 2025 at 04:04:23PM +0800, Haibo Chen wrote:
> ADC calibration might fail because of the noise on reference voltage.
> To avoid calibration fail, need to meet the following requirement:
>     ADC reference voltage Noise < 1.8V * 1/2^ENOB
>
> For the case which the ADC reference voltage on board do not meet
> the requirement, still load the calibrated values, so ADC can also
> work but maybe not that accurate.
>
> Signed-off-by: Haibo Chen <haibo.chen@nxp.com>

Reviewed-by: Frank Li <Frank.Li@nxp.com>

> ---
>  drivers/iio/adc/imx93_adc.c | 18 +++++++++++++++---
>  1 file changed, 15 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/iio/adc/imx93_adc.c b/drivers/iio/adc/imx93_adc.c
> index 8471737ac04a2bac0417a6397f20865f6a2c01ca..17b0a2548b0a3614ac537b01e28bc3144d17d6fc 100644
> --- a/drivers/iio/adc/imx93_adc.c
> +++ b/drivers/iio/adc/imx93_adc.c
> @@ -38,6 +38,7 @@
>  #define IMX93_ADC_PCDR6		0x118
>  #define IMX93_ADC_PCDR7		0x11C
>  #define IMX93_ADC_CALSTAT	0x39C
> +#define IMX93_ADC_CALCFG0	0x3A0
>
>  /* ADC bit shift */
>  #define IMX93_ADC_MCR_MODE_MASK			BIT(29)
> @@ -58,6 +59,8 @@
>  #define IMX93_ADC_IMR_ECH_MASK			BIT(0)
>  #define IMX93_ADC_PCDR_CDATA_MASK		GENMASK(11, 0)
>
> +#define IMX93_ADC_CALCFG0_LDFAIL_MASK		BIT(4)
> +
>  /* ADC status */
>  #define IMX93_ADC_MSR_ADCSTATUS_IDLE			0
>  #define IMX93_ADC_MSR_ADCSTATUS_POWER_DOWN		1
> @@ -145,7 +148,7 @@ static void imx93_adc_config_ad_clk(struct imx93_adc *adc)
>
>  static int imx93_adc_calibration(struct imx93_adc *adc)
>  {
> -	u32 mcr, msr;
> +	u32 mcr, msr, calcfg;
>  	int ret;
>
>  	/* make sure ADC in power down mode */
> @@ -158,6 +161,11 @@ static int imx93_adc_calibration(struct imx93_adc *adc)
>
>  	imx93_adc_power_up(adc);
>
> +	/* Enable loading of calibrated values even in fail condition */
> +	calcfg = readl(adc->regs + IMX93_ADC_CALCFG0);
> +	calcfg |= IMX93_ADC_CALCFG0_LDFAIL_MASK;
> +	writel(calcfg, adc->regs + IMX93_ADC_CALCFG0);
> +
>  	/*
>  	 * TODO: we use the default TSAMP/NRSMPL/AVGEN in MCR,
>  	 * can add the setting of these bit if need in future.
> @@ -180,9 +188,13 @@ static int imx93_adc_calibration(struct imx93_adc *adc)
>  	/* check whether calbration is success or not */
>  	msr = readl(adc->regs + IMX93_ADC_MSR);
>  	if (msr & IMX93_ADC_MSR_CALFAIL_MASK) {
> +		/*
> +		 * Only give warning here, this means the noise of the
> +		 * reference voltage do not meet the requirement:
> +		 *     ADC reference voltage Noise < 1.8V * 1/2^ENOB
> +		 * And the resault of ADC is not that accurate.
> +		 */
>  		dev_warn(adc->dev, "ADC calibration failed!\n");
> -		imx93_adc_power_down(adc);
> -		return -EAGAIN;
>  	}
>
>  	return 0;
>
> --
> 2.34.1
>
Re: [PATCH v2 2/2] iio: adc: imx93_adc: load calibrated values even calibration failed
Posted by Primoz Fiser 1 month, 3 weeks ago
Hi Haibo,

On 12. 08. 25 10:04, Haibo Chen wrote:
> ADC calibration might fail because of the noise on reference voltage.
> To avoid calibration fail, need to meet the following requirement:
>     ADC reference voltage Noise < 1.8V * 1/2^ENOB
> 
> For the case which the ADC reference voltage on board do not meet
> the requirement, still load the calibrated values, so ADC can also
> work but maybe not that accurate.

Reviewed-by: Primoz Fiser <primoz.fiser@norik.com>

Thanks for fixing this.

BR,
Primoz

> 
> Signed-off-by: Haibo Chen <haibo.chen@nxp.com>
> ---
>  drivers/iio/adc/imx93_adc.c | 18 +++++++++++++++---
>  1 file changed, 15 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/iio/adc/imx93_adc.c b/drivers/iio/adc/imx93_adc.c
> index 8471737ac04a2bac0417a6397f20865f6a2c01ca..17b0a2548b0a3614ac537b01e28bc3144d17d6fc 100644
> --- a/drivers/iio/adc/imx93_adc.c
> +++ b/drivers/iio/adc/imx93_adc.c
> @@ -38,6 +38,7 @@
>  #define IMX93_ADC_PCDR6		0x118
>  #define IMX93_ADC_PCDR7		0x11C
>  #define IMX93_ADC_CALSTAT	0x39C
> +#define IMX93_ADC_CALCFG0	0x3A0
>  
>  /* ADC bit shift */
>  #define IMX93_ADC_MCR_MODE_MASK			BIT(29)
> @@ -58,6 +59,8 @@
>  #define IMX93_ADC_IMR_ECH_MASK			BIT(0)
>  #define IMX93_ADC_PCDR_CDATA_MASK		GENMASK(11, 0)
>  
> +#define IMX93_ADC_CALCFG0_LDFAIL_MASK		BIT(4)
> +
>  /* ADC status */
>  #define IMX93_ADC_MSR_ADCSTATUS_IDLE			0
>  #define IMX93_ADC_MSR_ADCSTATUS_POWER_DOWN		1
> @@ -145,7 +148,7 @@ static void imx93_adc_config_ad_clk(struct imx93_adc *adc)
>  
>  static int imx93_adc_calibration(struct imx93_adc *adc)
>  {
> -	u32 mcr, msr;
> +	u32 mcr, msr, calcfg;
>  	int ret;
>  
>  	/* make sure ADC in power down mode */
> @@ -158,6 +161,11 @@ static int imx93_adc_calibration(struct imx93_adc *adc)
>  
>  	imx93_adc_power_up(adc);
>  
> +	/* Enable loading of calibrated values even in fail condition */
> +	calcfg = readl(adc->regs + IMX93_ADC_CALCFG0);
> +	calcfg |= IMX93_ADC_CALCFG0_LDFAIL_MASK;
> +	writel(calcfg, adc->regs + IMX93_ADC_CALCFG0);
> +
>  	/*
>  	 * TODO: we use the default TSAMP/NRSMPL/AVGEN in MCR,
>  	 * can add the setting of these bit if need in future.
> @@ -180,9 +188,13 @@ static int imx93_adc_calibration(struct imx93_adc *adc)
>  	/* check whether calbration is success or not */
>  	msr = readl(adc->regs + IMX93_ADC_MSR);
>  	if (msr & IMX93_ADC_MSR_CALFAIL_MASK) {
> +		/*
> +		 * Only give warning here, this means the noise of the
> +		 * reference voltage do not meet the requirement:
> +		 *     ADC reference voltage Noise < 1.8V * 1/2^ENOB
> +		 * And the resault of ADC is not that accurate.
> +		 */
>  		dev_warn(adc->dev, "ADC calibration failed!\n");
> -		imx93_adc_power_down(adc);
> -		return -EAGAIN;
>  	}
>  
>  	return 0;
> 

-- 
Primoz Fiser
phone: +386-41-390-545
email: primoz.fiser@norik.com
--
Norik systems d.o.o.
Your embedded software partner
Slovenia, EU
phone: +386-41-540-545
email: info@norik.com
Re: [PATCH v2 2/2] iio: adc: imx93_adc: load calibrated values even calibration failed
Posted by Jonathan Cameron 1 month, 3 weeks ago
On Tue, 12 Aug 2025 10:45:48 +0200
Primoz Fiser <primoz.fiser@norik.com> wrote:

> Hi Haibo,
> 
> On 12. 08. 25 10:04, Haibo Chen wrote:
> > ADC calibration might fail because of the noise on reference voltage.
> > To avoid calibration fail, need to meet the following requirement:
> >     ADC reference voltage Noise < 1.8V * 1/2^ENOB
> > 
> > For the case which the ADC reference voltage on board do not meet
> > the requirement, still load the calibrated values, so ADC can also
> > work but maybe not that accurate.  
> 
> Reviewed-by: Primoz Fiser <primoz.fiser@norik.com>
> 
> Thanks for fixing this.
> 
> BR,
> Primoz
> 
> > 
> > Signed-off-by: Haibo Chen <haibo.chen@nxp.com>
> > ---
> >  drivers/iio/adc/imx93_adc.c | 18 +++++++++++++++---
> >  1 file changed, 15 insertions(+), 3 deletions(-)
> > 
> > diff --git a/drivers/iio/adc/imx93_adc.c b/drivers/iio/adc/imx93_adc.c
> > index 8471737ac04a2bac0417a6397f20865f6a2c01ca..17b0a2548b0a3614ac537b01e28bc3144d17d6fc 100644
> > --- a/drivers/iio/adc/imx93_adc.c
> > +++ b/drivers/iio/adc/imx93_adc.c
> > @@ -38,6 +38,7 @@
> >  #define IMX93_ADC_PCDR6		0x118
> >  #define IMX93_ADC_PCDR7		0x11C
> >  #define IMX93_ADC_CALSTAT	0x39C
> > +#define IMX93_ADC_CALCFG0	0x3A0
> >  
> >  /* ADC bit shift */
> >  #define IMX93_ADC_MCR_MODE_MASK			BIT(29)
> > @@ -58,6 +59,8 @@
> >  #define IMX93_ADC_IMR_ECH_MASK			BIT(0)
> >  #define IMX93_ADC_PCDR_CDATA_MASK		GENMASK(11, 0)
> >  
> > +#define IMX93_ADC_CALCFG0_LDFAIL_MASK		BIT(4)
> > +
> >  /* ADC status */
> >  #define IMX93_ADC_MSR_ADCSTATUS_IDLE			0
> >  #define IMX93_ADC_MSR_ADCSTATUS_POWER_DOWN		1
> > @@ -145,7 +148,7 @@ static void imx93_adc_config_ad_clk(struct imx93_adc *adc)
> >  
> >  static int imx93_adc_calibration(struct imx93_adc *adc)
> >  {
> > -	u32 mcr, msr;
> > +	u32 mcr, msr, calcfg;
> >  	int ret;
> >  
> >  	/* make sure ADC in power down mode */
> > @@ -158,6 +161,11 @@ static int imx93_adc_calibration(struct imx93_adc *adc)
> >  
> >  	imx93_adc_power_up(adc);
> >  
> > +	/* Enable loading of calibrated values even in fail condition */
> > +	calcfg = readl(adc->regs + IMX93_ADC_CALCFG0);
> > +	calcfg |= IMX93_ADC_CALCFG0_LDFAIL_MASK;
> > +	writel(calcfg, adc->regs + IMX93_ADC_CALCFG0);
> > +
> >  	/*
> >  	 * TODO: we use the default TSAMP/NRSMPL/AVGEN in MCR,
> >  	 * can add the setting of these bit if need in future.
> > @@ -180,9 +188,13 @@ static int imx93_adc_calibration(struct imx93_adc *adc)
> >  	/* check whether calbration is success or not */
> >  	msr = readl(adc->regs + IMX93_ADC_MSR);
> >  	if (msr & IMX93_ADC_MSR_CALFAIL_MASK) {
> > +		/*
> > +		 * Only give warning here, this means the noise of the
> > +		 * reference voltage do not meet the requirement:
> > +		 *     ADC reference voltage Noise < 1.8V * 1/2^ENOB
> > +		 * And the resault of ADC is not that accurate.

result

If nothing else comes up I'll probably just fix that whilst applying.

Jonathan


> > +		 */
> >  		dev_warn(adc->dev, "ADC calibration failed!\n");
> > -		imx93_adc_power_down(adc);
> > -		return -EAGAIN;
> >  	}
> >  
> >  	return 0;
> >   
>