162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (C) 2022 Richtek Technology Corp.
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Author: ChiaEn Wu <chiaen_wu@richtek.com>
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#include <linux/bits.h>
962306a36Sopenharmony_ci#include <linux/bitfield.h>
1062306a36Sopenharmony_ci#include <linux/iio/iio.h>
1162306a36Sopenharmony_ci#include <linux/kernel.h>
1262306a36Sopenharmony_ci#include <linux/mod_devicetable.h>
1362306a36Sopenharmony_ci#include <linux/module.h>
1462306a36Sopenharmony_ci#include <linux/mutex.h>
1562306a36Sopenharmony_ci#include <linux/platform_device.h>
1662306a36Sopenharmony_ci#include <linux/regmap.h>
1762306a36Sopenharmony_ci#include <linux/sysfs.h>
1862306a36Sopenharmony_ci#include <linux/units.h>
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci#include <dt-bindings/iio/adc/mediatek,mt6370_adc.h>
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ci#define MT6370_REG_DEV_INFO		0x100
2362306a36Sopenharmony_ci#define MT6370_REG_CHG_CTRL3		0x113
2462306a36Sopenharmony_ci#define MT6370_REG_CHG_CTRL7		0x117
2562306a36Sopenharmony_ci#define MT6370_REG_CHG_ADC		0x121
2662306a36Sopenharmony_ci#define MT6370_REG_ADC_DATA_H		0x14C
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_ci#define MT6370_ADC_START_MASK		BIT(0)
2962306a36Sopenharmony_ci#define MT6370_ADC_IN_SEL_MASK		GENMASK(7, 4)
3062306a36Sopenharmony_ci#define MT6370_AICR_ICHG_MASK		GENMASK(7, 2)
3162306a36Sopenharmony_ci#define MT6370_VENID_MASK		GENMASK(7, 4)
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_ci#define MT6370_AICR_100_mA		0x0
3462306a36Sopenharmony_ci#define MT6370_AICR_150_mA		0x1
3562306a36Sopenharmony_ci#define MT6370_AICR_200_mA		0x2
3662306a36Sopenharmony_ci#define MT6370_AICR_250_mA		0x3
3762306a36Sopenharmony_ci#define MT6370_AICR_300_mA		0x4
3862306a36Sopenharmony_ci#define MT6370_AICR_350_mA		0x5
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci#define MT6370_ICHG_100_mA		0x0
4162306a36Sopenharmony_ci#define MT6370_ICHG_200_mA		0x1
4262306a36Sopenharmony_ci#define MT6370_ICHG_300_mA		0x2
4362306a36Sopenharmony_ci#define MT6370_ICHG_400_mA		0x3
4462306a36Sopenharmony_ci#define MT6370_ICHG_500_mA		0x4
4562306a36Sopenharmony_ci#define MT6370_ICHG_600_mA		0x5
4662306a36Sopenharmony_ci#define MT6370_ICHG_700_mA		0x6
4762306a36Sopenharmony_ci#define MT6370_ICHG_800_mA		0x7
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ci#define ADC_CONV_TIME_MS		35
5062306a36Sopenharmony_ci#define ADC_CONV_POLLING_TIME_US	1000
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_ci#define MT6370_VID_RT5081		0x8
5362306a36Sopenharmony_ci#define MT6370_VID_RT5081A		0xA
5462306a36Sopenharmony_ci#define MT6370_VID_MT6370		0xE
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_cistruct mt6370_adc_data {
5762306a36Sopenharmony_ci	struct device *dev;
5862306a36Sopenharmony_ci	struct regmap *regmap;
5962306a36Sopenharmony_ci	/*
6062306a36Sopenharmony_ci	 * This mutex lock is for preventing the different ADC channels
6162306a36Sopenharmony_ci	 * from being read at the same time.
6262306a36Sopenharmony_ci	 */
6362306a36Sopenharmony_ci	struct mutex adc_lock;
6462306a36Sopenharmony_ci	unsigned int vid;
6562306a36Sopenharmony_ci};
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_cistatic int mt6370_adc_read_channel(struct mt6370_adc_data *priv, int chan,
6862306a36Sopenharmony_ci				   unsigned long addr, int *val)
6962306a36Sopenharmony_ci{
7062306a36Sopenharmony_ci	unsigned int reg_val;
7162306a36Sopenharmony_ci	__be16 be_val;
7262306a36Sopenharmony_ci	int ret;
7362306a36Sopenharmony_ci
7462306a36Sopenharmony_ci	mutex_lock(&priv->adc_lock);
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_ci	reg_val = MT6370_ADC_START_MASK |
7762306a36Sopenharmony_ci		  FIELD_PREP(MT6370_ADC_IN_SEL_MASK, addr);
7862306a36Sopenharmony_ci	ret = regmap_write(priv->regmap, MT6370_REG_CHG_ADC, reg_val);
7962306a36Sopenharmony_ci	if (ret)
8062306a36Sopenharmony_ci		goto adc_unlock;
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_ci	msleep(ADC_CONV_TIME_MS);
8362306a36Sopenharmony_ci
8462306a36Sopenharmony_ci	ret = regmap_read_poll_timeout(priv->regmap,
8562306a36Sopenharmony_ci				       MT6370_REG_CHG_ADC, reg_val,
8662306a36Sopenharmony_ci				       !(reg_val & MT6370_ADC_START_MASK),
8762306a36Sopenharmony_ci				       ADC_CONV_POLLING_TIME_US,
8862306a36Sopenharmony_ci				       ADC_CONV_TIME_MS * MILLI * 3);
8962306a36Sopenharmony_ci	if (ret) {
9062306a36Sopenharmony_ci		dev_err(priv->dev, "Failed to read ADC register (%d)\n", ret);
9162306a36Sopenharmony_ci		goto adc_unlock;
9262306a36Sopenharmony_ci	}
9362306a36Sopenharmony_ci
9462306a36Sopenharmony_ci	ret = regmap_raw_read(priv->regmap, MT6370_REG_ADC_DATA_H,
9562306a36Sopenharmony_ci			      &be_val, sizeof(be_val));
9662306a36Sopenharmony_ci	if (ret)
9762306a36Sopenharmony_ci		goto adc_unlock;
9862306a36Sopenharmony_ci
9962306a36Sopenharmony_ci	*val = be16_to_cpu(be_val);
10062306a36Sopenharmony_ci	ret = IIO_VAL_INT;
10162306a36Sopenharmony_ci
10262306a36Sopenharmony_ciadc_unlock:
10362306a36Sopenharmony_ci	mutex_unlock(&priv->adc_lock);
10462306a36Sopenharmony_ci
10562306a36Sopenharmony_ci	return ret;
10662306a36Sopenharmony_ci}
10762306a36Sopenharmony_ci
10862306a36Sopenharmony_cistatic int mt6370_adc_get_ibus_scale(struct mt6370_adc_data *priv)
10962306a36Sopenharmony_ci{
11062306a36Sopenharmony_ci	switch (priv->vid) {
11162306a36Sopenharmony_ci	case MT6370_VID_RT5081:
11262306a36Sopenharmony_ci	case MT6370_VID_RT5081A:
11362306a36Sopenharmony_ci	case MT6370_VID_MT6370:
11462306a36Sopenharmony_ci		return 3350;
11562306a36Sopenharmony_ci	default:
11662306a36Sopenharmony_ci		return 3875;
11762306a36Sopenharmony_ci	}
11862306a36Sopenharmony_ci}
11962306a36Sopenharmony_ci
12062306a36Sopenharmony_cistatic int mt6370_adc_get_ibat_scale(struct mt6370_adc_data *priv)
12162306a36Sopenharmony_ci{
12262306a36Sopenharmony_ci	switch (priv->vid) {
12362306a36Sopenharmony_ci	case MT6370_VID_RT5081:
12462306a36Sopenharmony_ci	case MT6370_VID_RT5081A:
12562306a36Sopenharmony_ci	case MT6370_VID_MT6370:
12662306a36Sopenharmony_ci		return 2680;
12762306a36Sopenharmony_ci	default:
12862306a36Sopenharmony_ci		return 3870;
12962306a36Sopenharmony_ci	}
13062306a36Sopenharmony_ci}
13162306a36Sopenharmony_ci
13262306a36Sopenharmony_cistatic int mt6370_adc_read_scale(struct mt6370_adc_data *priv,
13362306a36Sopenharmony_ci				 int chan, int *val1, int *val2)
13462306a36Sopenharmony_ci{
13562306a36Sopenharmony_ci	unsigned int reg_val;
13662306a36Sopenharmony_ci	int ret;
13762306a36Sopenharmony_ci
13862306a36Sopenharmony_ci	switch (chan) {
13962306a36Sopenharmony_ci	case MT6370_CHAN_VBAT:
14062306a36Sopenharmony_ci	case MT6370_CHAN_VSYS:
14162306a36Sopenharmony_ci	case MT6370_CHAN_CHG_VDDP:
14262306a36Sopenharmony_ci		*val1 = 5;
14362306a36Sopenharmony_ci		return IIO_VAL_INT;
14462306a36Sopenharmony_ci	case MT6370_CHAN_IBUS:
14562306a36Sopenharmony_ci		ret = regmap_read(priv->regmap, MT6370_REG_CHG_CTRL3, &reg_val);
14662306a36Sopenharmony_ci		if (ret)
14762306a36Sopenharmony_ci			return ret;
14862306a36Sopenharmony_ci
14962306a36Sopenharmony_ci		reg_val = FIELD_GET(MT6370_AICR_ICHG_MASK, reg_val);
15062306a36Sopenharmony_ci		switch (reg_val) {
15162306a36Sopenharmony_ci		case MT6370_AICR_100_mA:
15262306a36Sopenharmony_ci		case MT6370_AICR_150_mA:
15362306a36Sopenharmony_ci		case MT6370_AICR_200_mA:
15462306a36Sopenharmony_ci		case MT6370_AICR_250_mA:
15562306a36Sopenharmony_ci		case MT6370_AICR_300_mA:
15662306a36Sopenharmony_ci		case MT6370_AICR_350_mA:
15762306a36Sopenharmony_ci			*val1 = mt6370_adc_get_ibus_scale(priv);
15862306a36Sopenharmony_ci			break;
15962306a36Sopenharmony_ci		default:
16062306a36Sopenharmony_ci			*val1 = 5000;
16162306a36Sopenharmony_ci			break;
16262306a36Sopenharmony_ci		}
16362306a36Sopenharmony_ci
16462306a36Sopenharmony_ci		*val2 = 100;
16562306a36Sopenharmony_ci
16662306a36Sopenharmony_ci		return IIO_VAL_FRACTIONAL;
16762306a36Sopenharmony_ci	case MT6370_CHAN_IBAT:
16862306a36Sopenharmony_ci		ret = regmap_read(priv->regmap, MT6370_REG_CHG_CTRL7, &reg_val);
16962306a36Sopenharmony_ci		if (ret)
17062306a36Sopenharmony_ci			return ret;
17162306a36Sopenharmony_ci
17262306a36Sopenharmony_ci		reg_val = FIELD_GET(MT6370_AICR_ICHG_MASK, reg_val);
17362306a36Sopenharmony_ci		switch (reg_val) {
17462306a36Sopenharmony_ci		case MT6370_ICHG_100_mA:
17562306a36Sopenharmony_ci		case MT6370_ICHG_200_mA:
17662306a36Sopenharmony_ci		case MT6370_ICHG_300_mA:
17762306a36Sopenharmony_ci		case MT6370_ICHG_400_mA:
17862306a36Sopenharmony_ci			*val1 = 2375;
17962306a36Sopenharmony_ci			break;
18062306a36Sopenharmony_ci		case MT6370_ICHG_500_mA:
18162306a36Sopenharmony_ci		case MT6370_ICHG_600_mA:
18262306a36Sopenharmony_ci		case MT6370_ICHG_700_mA:
18362306a36Sopenharmony_ci		case MT6370_ICHG_800_mA:
18462306a36Sopenharmony_ci			*val1 = mt6370_adc_get_ibat_scale(priv);
18562306a36Sopenharmony_ci			break;
18662306a36Sopenharmony_ci		default:
18762306a36Sopenharmony_ci			*val1 = 5000;
18862306a36Sopenharmony_ci			break;
18962306a36Sopenharmony_ci		}
19062306a36Sopenharmony_ci
19162306a36Sopenharmony_ci		*val2 = 100;
19262306a36Sopenharmony_ci
19362306a36Sopenharmony_ci		return IIO_VAL_FRACTIONAL;
19462306a36Sopenharmony_ci	case MT6370_CHAN_VBUSDIV5:
19562306a36Sopenharmony_ci		*val1 = 25;
19662306a36Sopenharmony_ci		return IIO_VAL_INT;
19762306a36Sopenharmony_ci	case MT6370_CHAN_VBUSDIV2:
19862306a36Sopenharmony_ci		*val1 = 10;
19962306a36Sopenharmony_ci		return IIO_VAL_INT;
20062306a36Sopenharmony_ci	case MT6370_CHAN_TS_BAT:
20162306a36Sopenharmony_ci		*val1 = 25;
20262306a36Sopenharmony_ci		*val2 = 10000;
20362306a36Sopenharmony_ci		return IIO_VAL_FRACTIONAL;
20462306a36Sopenharmony_ci	case MT6370_CHAN_TEMP_JC:
20562306a36Sopenharmony_ci		*val1 = 2000;
20662306a36Sopenharmony_ci		return IIO_VAL_INT;
20762306a36Sopenharmony_ci	default:
20862306a36Sopenharmony_ci		return -EINVAL;
20962306a36Sopenharmony_ci	}
21062306a36Sopenharmony_ci}
21162306a36Sopenharmony_ci
21262306a36Sopenharmony_cistatic int mt6370_adc_read_offset(struct mt6370_adc_data *priv,
21362306a36Sopenharmony_ci				  int chan, int *val)
21462306a36Sopenharmony_ci{
21562306a36Sopenharmony_ci	*val = -20;
21662306a36Sopenharmony_ci
21762306a36Sopenharmony_ci	return IIO_VAL_INT;
21862306a36Sopenharmony_ci}
21962306a36Sopenharmony_ci
22062306a36Sopenharmony_cistatic int mt6370_adc_read_raw(struct iio_dev *iio_dev,
22162306a36Sopenharmony_ci			       const struct iio_chan_spec *chan,
22262306a36Sopenharmony_ci			       int *val, int *val2, long mask)
22362306a36Sopenharmony_ci{
22462306a36Sopenharmony_ci	struct mt6370_adc_data *priv = iio_priv(iio_dev);
22562306a36Sopenharmony_ci
22662306a36Sopenharmony_ci	switch (mask) {
22762306a36Sopenharmony_ci	case IIO_CHAN_INFO_RAW:
22862306a36Sopenharmony_ci		return mt6370_adc_read_channel(priv, chan->channel,
22962306a36Sopenharmony_ci					       chan->address, val);
23062306a36Sopenharmony_ci	case IIO_CHAN_INFO_SCALE:
23162306a36Sopenharmony_ci		return mt6370_adc_read_scale(priv, chan->channel, val, val2);
23262306a36Sopenharmony_ci	case IIO_CHAN_INFO_OFFSET:
23362306a36Sopenharmony_ci		return mt6370_adc_read_offset(priv, chan->channel, val);
23462306a36Sopenharmony_ci	default:
23562306a36Sopenharmony_ci		return -EINVAL;
23662306a36Sopenharmony_ci	}
23762306a36Sopenharmony_ci}
23862306a36Sopenharmony_ci
23962306a36Sopenharmony_cistatic const char * const mt6370_channel_labels[MT6370_CHAN_MAX] = {
24062306a36Sopenharmony_ci	[MT6370_CHAN_VBUSDIV5] = "vbusdiv5",
24162306a36Sopenharmony_ci	[MT6370_CHAN_VBUSDIV2] = "vbusdiv2",
24262306a36Sopenharmony_ci	[MT6370_CHAN_VSYS] = "vsys",
24362306a36Sopenharmony_ci	[MT6370_CHAN_VBAT] = "vbat",
24462306a36Sopenharmony_ci	[MT6370_CHAN_TS_BAT] = "ts_bat",
24562306a36Sopenharmony_ci	[MT6370_CHAN_IBUS] = "ibus",
24662306a36Sopenharmony_ci	[MT6370_CHAN_IBAT] = "ibat",
24762306a36Sopenharmony_ci	[MT6370_CHAN_CHG_VDDP] = "chg_vddp",
24862306a36Sopenharmony_ci	[MT6370_CHAN_TEMP_JC] = "temp_jc",
24962306a36Sopenharmony_ci};
25062306a36Sopenharmony_ci
25162306a36Sopenharmony_cistatic int mt6370_adc_read_label(struct iio_dev *iio_dev,
25262306a36Sopenharmony_ci				 struct iio_chan_spec const *chan, char *label)
25362306a36Sopenharmony_ci{
25462306a36Sopenharmony_ci	return sysfs_emit(label, "%s\n", mt6370_channel_labels[chan->channel]);
25562306a36Sopenharmony_ci}
25662306a36Sopenharmony_ci
25762306a36Sopenharmony_cistatic const struct iio_info mt6370_adc_iio_info = {
25862306a36Sopenharmony_ci	.read_raw = mt6370_adc_read_raw,
25962306a36Sopenharmony_ci	.read_label = mt6370_adc_read_label,
26062306a36Sopenharmony_ci};
26162306a36Sopenharmony_ci
26262306a36Sopenharmony_ci#define MT6370_ADC_CHAN(_idx, _type, _addr, _extra_info) {	\
26362306a36Sopenharmony_ci	.type = _type,						\
26462306a36Sopenharmony_ci	.channel = MT6370_CHAN_##_idx,				\
26562306a36Sopenharmony_ci	.address = _addr,					\
26662306a36Sopenharmony_ci	.scan_index = MT6370_CHAN_##_idx,			\
26762306a36Sopenharmony_ci	.indexed = 1,						\
26862306a36Sopenharmony_ci	.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |		\
26962306a36Sopenharmony_ci			      BIT(IIO_CHAN_INFO_SCALE) |	\
27062306a36Sopenharmony_ci			      _extra_info,			\
27162306a36Sopenharmony_ci}
27262306a36Sopenharmony_ci
27362306a36Sopenharmony_cistatic const struct iio_chan_spec mt6370_adc_channels[] = {
27462306a36Sopenharmony_ci	MT6370_ADC_CHAN(VBUSDIV5, IIO_VOLTAGE, 1, 0),
27562306a36Sopenharmony_ci	MT6370_ADC_CHAN(VBUSDIV2, IIO_VOLTAGE, 2, 0),
27662306a36Sopenharmony_ci	MT6370_ADC_CHAN(VSYS, IIO_VOLTAGE, 3, 0),
27762306a36Sopenharmony_ci	MT6370_ADC_CHAN(VBAT, IIO_VOLTAGE, 4, 0),
27862306a36Sopenharmony_ci	MT6370_ADC_CHAN(TS_BAT, IIO_VOLTAGE, 6, 0),
27962306a36Sopenharmony_ci	MT6370_ADC_CHAN(IBUS, IIO_CURRENT, 8, 0),
28062306a36Sopenharmony_ci	MT6370_ADC_CHAN(IBAT, IIO_CURRENT, 9, 0),
28162306a36Sopenharmony_ci	MT6370_ADC_CHAN(CHG_VDDP, IIO_VOLTAGE, 11, 0),
28262306a36Sopenharmony_ci	MT6370_ADC_CHAN(TEMP_JC, IIO_TEMP, 12, BIT(IIO_CHAN_INFO_OFFSET)),
28362306a36Sopenharmony_ci};
28462306a36Sopenharmony_ci
28562306a36Sopenharmony_cistatic int mt6370_get_vendor_info(struct mt6370_adc_data *priv)
28662306a36Sopenharmony_ci{
28762306a36Sopenharmony_ci	unsigned int dev_info;
28862306a36Sopenharmony_ci	int ret;
28962306a36Sopenharmony_ci
29062306a36Sopenharmony_ci	ret = regmap_read(priv->regmap, MT6370_REG_DEV_INFO, &dev_info);
29162306a36Sopenharmony_ci	if (ret)
29262306a36Sopenharmony_ci		return ret;
29362306a36Sopenharmony_ci
29462306a36Sopenharmony_ci	priv->vid = FIELD_GET(MT6370_VENID_MASK, dev_info);
29562306a36Sopenharmony_ci
29662306a36Sopenharmony_ci	return 0;
29762306a36Sopenharmony_ci}
29862306a36Sopenharmony_ci
29962306a36Sopenharmony_cistatic int mt6370_adc_probe(struct platform_device *pdev)
30062306a36Sopenharmony_ci{
30162306a36Sopenharmony_ci	struct device *dev = &pdev->dev;
30262306a36Sopenharmony_ci	struct mt6370_adc_data *priv;
30362306a36Sopenharmony_ci	struct iio_dev *indio_dev;
30462306a36Sopenharmony_ci	struct regmap *regmap;
30562306a36Sopenharmony_ci	int ret;
30662306a36Sopenharmony_ci
30762306a36Sopenharmony_ci	regmap = dev_get_regmap(pdev->dev.parent, NULL);
30862306a36Sopenharmony_ci	if (!regmap)
30962306a36Sopenharmony_ci		return dev_err_probe(dev, -ENODEV, "Failed to get regmap\n");
31062306a36Sopenharmony_ci
31162306a36Sopenharmony_ci	indio_dev = devm_iio_device_alloc(dev, sizeof(*priv));
31262306a36Sopenharmony_ci	if (!indio_dev)
31362306a36Sopenharmony_ci		return -ENOMEM;
31462306a36Sopenharmony_ci
31562306a36Sopenharmony_ci	priv = iio_priv(indio_dev);
31662306a36Sopenharmony_ci	priv->dev = dev;
31762306a36Sopenharmony_ci	priv->regmap = regmap;
31862306a36Sopenharmony_ci	mutex_init(&priv->adc_lock);
31962306a36Sopenharmony_ci
32062306a36Sopenharmony_ci	ret = mt6370_get_vendor_info(priv);
32162306a36Sopenharmony_ci	if (ret)
32262306a36Sopenharmony_ci		return dev_err_probe(dev, ret, "Failed to get vid\n");
32362306a36Sopenharmony_ci
32462306a36Sopenharmony_ci	ret = regmap_write(priv->regmap, MT6370_REG_CHG_ADC, 0);
32562306a36Sopenharmony_ci	if (ret)
32662306a36Sopenharmony_ci		return dev_err_probe(dev, ret, "Failed to reset ADC\n");
32762306a36Sopenharmony_ci
32862306a36Sopenharmony_ci	indio_dev->name = "mt6370-adc";
32962306a36Sopenharmony_ci	indio_dev->info = &mt6370_adc_iio_info;
33062306a36Sopenharmony_ci	indio_dev->modes = INDIO_DIRECT_MODE;
33162306a36Sopenharmony_ci	indio_dev->channels = mt6370_adc_channels;
33262306a36Sopenharmony_ci	indio_dev->num_channels = ARRAY_SIZE(mt6370_adc_channels);
33362306a36Sopenharmony_ci
33462306a36Sopenharmony_ci	return devm_iio_device_register(dev, indio_dev);
33562306a36Sopenharmony_ci}
33662306a36Sopenharmony_ci
33762306a36Sopenharmony_cistatic const struct of_device_id mt6370_adc_of_id[] = {
33862306a36Sopenharmony_ci	{ .compatible = "mediatek,mt6370-adc", },
33962306a36Sopenharmony_ci	{}
34062306a36Sopenharmony_ci};
34162306a36Sopenharmony_ciMODULE_DEVICE_TABLE(of, mt6370_adc_of_id);
34262306a36Sopenharmony_ci
34362306a36Sopenharmony_cistatic struct platform_driver mt6370_adc_driver = {
34462306a36Sopenharmony_ci	.driver = {
34562306a36Sopenharmony_ci		.name = "mt6370-adc",
34662306a36Sopenharmony_ci		.of_match_table = mt6370_adc_of_id,
34762306a36Sopenharmony_ci	},
34862306a36Sopenharmony_ci	.probe = mt6370_adc_probe,
34962306a36Sopenharmony_ci};
35062306a36Sopenharmony_cimodule_platform_driver(mt6370_adc_driver);
35162306a36Sopenharmony_ci
35262306a36Sopenharmony_ciMODULE_AUTHOR("ChiaEn Wu <chiaen_wu@richtek.com>");
35362306a36Sopenharmony_ciMODULE_DESCRIPTION("MT6370 ADC Driver");
35462306a36Sopenharmony_ciMODULE_LICENSE("GPL v2");
355