2023-03-24 14:17:48

by ChiaEn Wu

[permalink] [raw]
Subject: [PATCH] iio: adc: mt6370: Fix ibus and ibat scaling value of some specific vendor ID chips

The scale value of ibus and ibat on the datasheet is incorrect due to the
customer report after the experimentation with some specific vendor ID
chips.

Signed-off-by: ChiaEn Wu <[email protected]>
---
drivers/iio/adc/mt6370-adc.c | 48 ++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 46 insertions(+), 2 deletions(-)

diff --git a/drivers/iio/adc/mt6370-adc.c b/drivers/iio/adc/mt6370-adc.c
index bc62e5a..eea7223 100644
--- a/drivers/iio/adc/mt6370-adc.c
+++ b/drivers/iio/adc/mt6370-adc.c
@@ -19,6 +19,7 @@

#include <dt-bindings/iio/adc/mediatek,mt6370_adc.h>

+#define MT6370_REG_DEV_INFO 0x100
#define MT6370_REG_CHG_CTRL3 0x113
#define MT6370_REG_CHG_CTRL7 0x117
#define MT6370_REG_CHG_ADC 0x121
@@ -27,6 +28,7 @@
#define MT6370_ADC_START_MASK BIT(0)
#define MT6370_ADC_IN_SEL_MASK GENMASK(7, 4)
#define MT6370_AICR_ICHG_MASK GENMASK(7, 2)
+#define MT6370_VENID_MASK GENMASK(7, 4)

#define MT6370_AICR_100_mA 0x0
#define MT6370_AICR_150_mA 0x1
@@ -47,6 +49,10 @@
#define ADC_CONV_TIME_MS 35
#define ADC_CONV_POLLING_TIME_US 1000

+#define MT6370_VID_RT5081 0x8
+#define MT6370_VID_RT5081A 0xA
+#define MT6370_VID_MT6370 0xE
+
struct mt6370_adc_data {
struct device *dev;
struct regmap *regmap;
@@ -55,6 +61,7 @@ struct mt6370_adc_data {
* from being read at the same time.
*/
struct mutex adc_lock;
+ int vid;
};

static int mt6370_adc_read_channel(struct mt6370_adc_data *priv, int chan,
@@ -98,6 +105,26 @@ static int mt6370_adc_read_channel(struct mt6370_adc_data *priv, int chan,
return ret;
}

+static int mt6370_adc_get_ibus_scale(struct mt6370_adc_data *priv)
+{
+ if (priv->vid == MT6370_VID_RT5081 ||
+ priv->vid == MT6370_VID_RT5081A ||
+ priv->vid == MT6370_VID_MT6370)
+ return 3350;
+ else
+ return 3875;
+}
+
+static int mt6370_adc_get_ibat_scale(struct mt6370_adc_data *priv)
+{
+ if (priv->vid == MT6370_VID_RT5081 ||
+ priv->vid == MT6370_VID_RT5081A ||
+ priv->vid == MT6370_VID_MT6370)
+ return 2680;
+ else
+ return 3870;
+}
+
static int mt6370_adc_read_scale(struct mt6370_adc_data *priv,
int chan, int *val1, int *val2)
{
@@ -123,7 +150,7 @@ static int mt6370_adc_read_scale(struct mt6370_adc_data *priv,
case MT6370_AICR_250_mA:
case MT6370_AICR_300_mA:
case MT6370_AICR_350_mA:
- *val1 = 3350;
+ *val1 = mt6370_adc_get_ibus_scale(priv);
break;
default:
*val1 = 5000;
@@ -150,7 +177,7 @@ static int mt6370_adc_read_scale(struct mt6370_adc_data *priv,
case MT6370_ICHG_600_mA:
case MT6370_ICHG_700_mA:
case MT6370_ICHG_800_mA:
- *val1 = 2680;
+ *val1 = mt6370_adc_get_ibat_scale(priv);
break;
default:
*val1 = 5000;
@@ -251,6 +278,19 @@ static const struct iio_chan_spec mt6370_adc_channels[] = {
MT6370_ADC_CHAN(TEMP_JC, IIO_TEMP, 12, BIT(IIO_CHAN_INFO_OFFSET)),
};

+static int mt6370_get_vendor_info(struct mt6370_adc_data *priv)
+{
+ unsigned int dev_info;
+ int ret;
+
+ ret = regmap_read(priv->regmap, MT6370_REG_DEV_INFO, &dev_info);
+ if (ret)
+ return ret;
+
+ priv->vid = FIELD_GET(MT6370_VENID_MASK, dev_info);
+ return 0;
+}
+
static int mt6370_adc_probe(struct platform_device *pdev)
{
struct device *dev = &pdev->dev;
@@ -263,6 +303,10 @@ static int mt6370_adc_probe(struct platform_device *pdev)
if (!regmap)
return dev_err_probe(dev, -ENODEV, "Failed to get regmap\n");

+ ret = mt6370_get_vendor_info(priv);
+ if (ret)
+ return dev_err_probe(dev, ret, "Failed to get vid\n");
+
indio_dev = devm_iio_device_alloc(dev, sizeof(*priv));
if (!indio_dev)
return -ENOMEM;
--
2.7.4


2023-03-24 16:24:36

by kernel test robot

[permalink] [raw]
Subject: Re: [PATCH] iio: adc: mt6370: Fix ibus and ibat scaling value of some specific vendor ID chips

Hi ChiaEn,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on jic23-iio/togreg]
[also build test WARNING on linus/master v6.3-rc3 next-20230324]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url: https://github.com/intel-lab-lkp/linux/commits/ChiaEn-Wu/iio-adc-mt6370-Fix-ibus-and-ibat-scaling-value-of-some-specific-vendor-ID-chips/20230324-221545
base: https://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio.git togreg
patch link: https://lore.kernel.org/r/1679667167-16261-1-git-send-email-chiaen_wu%40richtek.com
patch subject: [PATCH] iio: adc: mt6370: Fix ibus and ibat scaling value of some specific vendor ID chips
config: riscv-randconfig-r034-20230324 (https://download.01.org/0day-ci/archive/20230325/[email protected]/config)
compiler: clang version 17.0.0 (https://github.com/llvm/llvm-project 67409911353323ca5edf2049ef0df54132fa1ca7)
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# install riscv cross compiling tool for clang build
# apt-get install binutils-riscv64-linux-gnu
# https://github.com/intel-lab-lkp/linux/commit/9822359d5de2dba531d882cfee6949864a2d6170
git remote add linux-review https://github.com/intel-lab-lkp/linux
git fetch --no-tags linux-review ChiaEn-Wu/iio-adc-mt6370-Fix-ibus-and-ibat-scaling-value-of-some-specific-vendor-ID-chips/20230324-221545
git checkout 9822359d5de2dba531d882cfee6949864a2d6170
# save the config file
mkdir build_dir && cp config build_dir/.config
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=riscv olddefconfig
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=riscv SHELL=/bin/bash drivers/iio/adc/

If you fix the issue, kindly add following tag where applicable
| Reported-by: kernel test robot <[email protected]>
| Link: https://lore.kernel.org/oe-kbuild-all/[email protected]/

All warnings (new ones prefixed by >>):

>> drivers/iio/adc/mt6370-adc.c:306:31: warning: variable 'priv' is uninitialized when used here [-Wuninitialized]
ret = mt6370_get_vendor_info(priv);
^~~~
drivers/iio/adc/mt6370-adc.c:297:30: note: initialize the variable 'priv' to silence this warning
struct mt6370_adc_data *priv;
^
= NULL
1 warning generated.


vim +/priv +306 drivers/iio/adc/mt6370-adc.c

293
294 static int mt6370_adc_probe(struct platform_device *pdev)
295 {
296 struct device *dev = &pdev->dev;
297 struct mt6370_adc_data *priv;
298 struct iio_dev *indio_dev;
299 struct regmap *regmap;
300 int ret;
301
302 regmap = dev_get_regmap(pdev->dev.parent, NULL);
303 if (!regmap)
304 return dev_err_probe(dev, -ENODEV, "Failed to get regmap\n");
305
> 306 ret = mt6370_get_vendor_info(priv);
307 if (ret)
308 return dev_err_probe(dev, ret, "Failed to get vid\n");
309
310 indio_dev = devm_iio_device_alloc(dev, sizeof(*priv));
311 if (!indio_dev)
312 return -ENOMEM;
313
314 priv = iio_priv(indio_dev);
315 priv->dev = dev;
316 priv->regmap = regmap;
317 mutex_init(&priv->adc_lock);
318
319 ret = regmap_write(priv->regmap, MT6370_REG_CHG_ADC, 0);
320 if (ret)
321 return dev_err_probe(dev, ret, "Failed to reset ADC\n");
322
323 indio_dev->name = "mt6370-adc";
324 indio_dev->info = &mt6370_adc_iio_info;
325 indio_dev->modes = INDIO_DIRECT_MODE;
326 indio_dev->channels = mt6370_adc_channels;
327 indio_dev->num_channels = ARRAY_SIZE(mt6370_adc_channels);
328
329 return devm_iio_device_register(dev, indio_dev);
330 }
331

--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests

2023-03-26 15:54:47

by Jonathan Cameron

[permalink] [raw]
Subject: Re: [PATCH] iio: adc: mt6370: Fix ibus and ibat scaling value of some specific vendor ID chips

On Fri, 24 Mar 2023 22:12:47 +0800
ChiaEn Wu <[email protected]> wrote:

> The scale value of ibus and ibat on the datasheet is incorrect due to the
> customer report after the experimentation with some specific vendor ID
> chips.
>
> Signed-off-by: ChiaEn Wu <[email protected]>

Hi. Only significant issue here is the one the build bot found.
A few other trivial formatting suggestions inline.

Thanks,

Jonathan


>
> static int mt6370_adc_read_channel(struct mt6370_adc_data *priv, int chan,
> @@ -98,6 +105,26 @@ static int mt6370_adc_read_channel(struct mt6370_adc_data *priv, int chan,
> return ret;
> }
>
> +static int mt6370_adc_get_ibus_scale(struct mt6370_adc_data *priv)
> +{
> + if (priv->vid == MT6370_VID_RT5081 ||
> + priv->vid == MT6370_VID_RT5081A ||
> + priv->vid == MT6370_VID_MT6370)
> + return 3350;
> + else

I'd drop the else. We are special casing the matches above, so it makes sense
for them to be out of line. The 'normal' case doesn't need to be indented.

> + return 3875;
> +}
> +
> +static int mt6370_adc_get_ibat_scale(struct mt6370_adc_data *priv)
> +{
> + if (priv->vid == MT6370_VID_RT5081 ||
> + priv->vid == MT6370_VID_RT5081A ||
> + priv->vid == MT6370_VID_MT6370)
> + return 2680;
> + else
> + return 3870;
> +}
> +
> static int mt6370_adc_read_scale(struct mt6370_adc_data *priv,
> int chan, int *val1, int *val2)
> {
> @@ -123,7 +150,7 @@ static int mt6370_adc_read_scale(struct mt6370_adc_data *priv,
> case MT6370_AICR_250_mA:
> case MT6370_AICR_300_mA:
> case MT6370_AICR_350_mA:
> - *val1 = 3350;
> + *val1 = mt6370_adc_get_ibus_scale(priv);
> break;
> default:
> *val1 = 5000;
> @@ -150,7 +177,7 @@ static int mt6370_adc_read_scale(struct mt6370_adc_data *priv,
> case MT6370_ICHG_600_mA:
> case MT6370_ICHG_700_mA:
> case MT6370_ICHG_800_mA:
> - *val1 = 2680;
> + *val1 = mt6370_adc_get_ibat_scale(priv);
> break;
> default:
> *val1 = 5000;
> @@ -251,6 +278,19 @@ static const struct iio_chan_spec mt6370_adc_channels[] = {
> MT6370_ADC_CHAN(TEMP_JC, IIO_TEMP, 12, BIT(IIO_CHAN_INFO_OFFSET)),
> };
>
> +static int mt6370_get_vendor_info(struct mt6370_adc_data *priv)
> +{
> + unsigned int dev_info;
> + int ret;
> +
> + ret = regmap_read(priv->regmap, MT6370_REG_DEV_INFO, &dev_info);
> + if (ret)
> + return ret;
> +
> + priv->vid = FIELD_GET(MT6370_VENID_MASK, dev_info);

Blank line preferred before a simple return like this. Makes the code a tiny
bit more readable.

> + return 0;
> +}
> +
> static int mt6370_adc_probe(struct platform_device *pdev)
> {
> struct device *dev = &pdev->dev;
> @@ -263,6 +303,10 @@ static int mt6370_adc_probe(struct platform_device *pdev)
> if (!regmap)
> return dev_err_probe(dev, -ENODEV, "Failed to get regmap\n");
>
> + ret = mt6370_get_vendor_info(priv);

The build bot spotted this one. Can't use priv yet as it doesn't exist
for a few more lines.

> + if (ret)
> + return dev_err_probe(dev, ret, "Failed to get vid\n");
> +
> indio_dev = devm_iio_device_alloc(dev, sizeof(*priv));
> if (!indio_dev)
> return -ENOMEM;

2023-03-30 15:29:59

by Dan Carpenter

[permalink] [raw]
Subject: Re: [PATCH] iio: adc: mt6370: Fix ibus and ibat scaling value of some specific vendor ID chips

Hi ChiaEn,

https://git-scm.com/docs/git-format-patch#_base_tree_information]

url: https://github.com/intel-lab-lkp/linux/commits/ChiaEn-Wu/iio-adc-mt6370-Fix-ibus-and-ibat-scaling-value-of-some-specific-vendor-ID-chips/20230324-221545
base: https://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio.git togreg
patch link: https://lore.kernel.org/r/1679667167-16261-1-git-send-email-chiaen_wu%40richtek.com
patch subject: [PATCH] iio: adc: mt6370: Fix ibus and ibat scaling value of some specific vendor ID chips
config: m68k-randconfig-m041-20230329 (https://download.01.org/0day-ci/archive/20230330/[email protected]/config)
compiler: m68k-linux-gcc (GCC) 12.1.0

If you fix the issue, kindly add following tag where applicable
| Reported-by: kernel test robot <[email protected]>
| Reported-by: Dan Carpenter <[email protected]>
| Link: https://lore.kernel.org/r/[email protected]/

smatch warnings:
drivers/iio/adc/mt6370-adc.c:306 mt6370_adc_probe() error: uninitialized symbol 'priv'.

vim +/priv +306 drivers/iio/adc/mt6370-adc.c

c1404d1b659fe3d ChiaEn Wu 2022-10-11 294 static int mt6370_adc_probe(struct platform_device *pdev)
c1404d1b659fe3d ChiaEn Wu 2022-10-11 295 {
c1404d1b659fe3d ChiaEn Wu 2022-10-11 296 struct device *dev = &pdev->dev;
c1404d1b659fe3d ChiaEn Wu 2022-10-11 297 struct mt6370_adc_data *priv;
c1404d1b659fe3d ChiaEn Wu 2022-10-11 298 struct iio_dev *indio_dev;
c1404d1b659fe3d ChiaEn Wu 2022-10-11 299 struct regmap *regmap;
c1404d1b659fe3d ChiaEn Wu 2022-10-11 300 int ret;
c1404d1b659fe3d ChiaEn Wu 2022-10-11 301
c1404d1b659fe3d ChiaEn Wu 2022-10-11 302 regmap = dev_get_regmap(pdev->dev.parent, NULL);
c1404d1b659fe3d ChiaEn Wu 2022-10-11 303 if (!regmap)
c1404d1b659fe3d ChiaEn Wu 2022-10-11 304 return dev_err_probe(dev, -ENODEV, "Failed to get regmap\n");
c1404d1b659fe3d ChiaEn Wu 2022-10-11 305
9822359d5de2dba ChiaEn Wu 2023-03-24 @306 ret = mt6370_get_vendor_info(priv);

"priv" is uninitialized.

9822359d5de2dba ChiaEn Wu 2023-03-24 307 if (ret)
9822359d5de2dba ChiaEn Wu 2023-03-24 308 return dev_err_probe(dev, ret, "Failed to get vid\n");
9822359d5de2dba ChiaEn Wu 2023-03-24 309
c1404d1b659fe3d ChiaEn Wu 2022-10-11 310 indio_dev = devm_iio_device_alloc(dev, sizeof(*priv));
c1404d1b659fe3d ChiaEn Wu 2022-10-11 311 if (!indio_dev)
c1404d1b659fe3d ChiaEn Wu 2022-10-11 312 return -ENOMEM;
c1404d1b659fe3d ChiaEn Wu 2022-10-11 313
c1404d1b659fe3d ChiaEn Wu 2022-10-11 314 priv = iio_priv(indio_dev);
^^^^^^^^^^^^^^^^^^^^^^^^^^

c1404d1b659fe3d ChiaEn Wu 2022-10-11 315 priv->dev = dev;
c1404d1b659fe3d ChiaEn Wu 2022-10-11 316 priv->regmap = regmap;
c1404d1b659fe3d ChiaEn Wu 2022-10-11 317 mutex_init(&priv->adc_lock);

--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests