iio: adc: mediatek: mt6577-auxadc, add mt6765 support
1. Add calibrated sample data support 2. Use of_match_table to decide each platform's feature set Signed-off-by: Chun-Hung Wu <chun-hung.wu@mediatek.com> Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
This commit is contained in:
parent
73e1ccdab3
commit
6d97024dce
@ -42,10 +42,26 @@
|
|||||||
#define MT6577_AUXADC_POWER_READY_MS 1
|
#define MT6577_AUXADC_POWER_READY_MS 1
|
||||||
#define MT6577_AUXADC_SAMPLE_READY_US 25
|
#define MT6577_AUXADC_SAMPLE_READY_US 25
|
||||||
|
|
||||||
|
struct mtk_auxadc_compatible {
|
||||||
|
bool sample_data_cali;
|
||||||
|
bool check_global_idle;
|
||||||
|
};
|
||||||
|
|
||||||
struct mt6577_auxadc_device {
|
struct mt6577_auxadc_device {
|
||||||
void __iomem *reg_base;
|
void __iomem *reg_base;
|
||||||
struct clk *adc_clk;
|
struct clk *adc_clk;
|
||||||
struct mutex lock;
|
struct mutex lock;
|
||||||
|
const struct mtk_auxadc_compatible *dev_comp;
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct mtk_auxadc_compatible mt8173_compat = {
|
||||||
|
.sample_data_cali = false,
|
||||||
|
.check_global_idle = true,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct mtk_auxadc_compatible mt6765_compat = {
|
||||||
|
.sample_data_cali = true,
|
||||||
|
.check_global_idle = false,
|
||||||
};
|
};
|
||||||
|
|
||||||
#define MT6577_AUXADC_CHANNEL(idx) { \
|
#define MT6577_AUXADC_CHANNEL(idx) { \
|
||||||
@ -74,6 +90,11 @@ static const struct iio_chan_spec mt6577_auxadc_iio_channels[] = {
|
|||||||
MT6577_AUXADC_CHANNEL(15),
|
MT6577_AUXADC_CHANNEL(15),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static int mt_auxadc_get_cali_data(int rawdata, bool enable_cali)
|
||||||
|
{
|
||||||
|
return rawdata;
|
||||||
|
}
|
||||||
|
|
||||||
static inline void mt6577_auxadc_mod_reg(void __iomem *reg,
|
static inline void mt6577_auxadc_mod_reg(void __iomem *reg,
|
||||||
u32 or_mask, u32 and_mask)
|
u32 or_mask, u32 and_mask)
|
||||||
{
|
{
|
||||||
@ -120,15 +141,17 @@ static int mt6577_auxadc_read(struct iio_dev *indio_dev,
|
|||||||
/* we must delay here for hardware sample channel data */
|
/* we must delay here for hardware sample channel data */
|
||||||
udelay(MT6577_AUXADC_SAMPLE_READY_US);
|
udelay(MT6577_AUXADC_SAMPLE_READY_US);
|
||||||
|
|
||||||
/* check MTK_AUXADC_CON2 if auxadc is idle */
|
if (adc_dev->dev_comp->check_global_idle) {
|
||||||
ret = readl_poll_timeout(adc_dev->reg_base + MT6577_AUXADC_CON2, val,
|
/* check MTK_AUXADC_CON2 if auxadc is idle */
|
||||||
((val & MT6577_AUXADC_STA) == 0),
|
ret = readl_poll_timeout(adc_dev->reg_base + MT6577_AUXADC_CON2,
|
||||||
MT6577_AUXADC_SLEEP_US,
|
val, ((val & MT6577_AUXADC_STA) == 0),
|
||||||
MT6577_AUXADC_TIMEOUT_US);
|
MT6577_AUXADC_SLEEP_US,
|
||||||
if (ret < 0) {
|
MT6577_AUXADC_TIMEOUT_US);
|
||||||
dev_err(indio_dev->dev.parent,
|
if (ret < 0) {
|
||||||
"wait for auxadc idle time out\n");
|
dev_err(indio_dev->dev.parent,
|
||||||
goto err_timeout;
|
"wait for auxadc idle time out\n");
|
||||||
|
goto err_timeout;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* read channel and make sure ready bit == 1 */
|
/* read channel and make sure ready bit == 1 */
|
||||||
@ -163,6 +186,8 @@ static int mt6577_auxadc_read_raw(struct iio_dev *indio_dev,
|
|||||||
int *val2,
|
int *val2,
|
||||||
long info)
|
long info)
|
||||||
{
|
{
|
||||||
|
struct mt6577_auxadc_device *adc_dev = iio_priv(indio_dev);
|
||||||
|
|
||||||
switch (info) {
|
switch (info) {
|
||||||
case IIO_CHAN_INFO_PROCESSED:
|
case IIO_CHAN_INFO_PROCESSED:
|
||||||
*val = mt6577_auxadc_read(indio_dev, chan);
|
*val = mt6577_auxadc_read(indio_dev, chan);
|
||||||
@ -172,6 +197,8 @@ static int mt6577_auxadc_read_raw(struct iio_dev *indio_dev,
|
|||||||
chan->channel);
|
chan->channel);
|
||||||
return *val;
|
return *val;
|
||||||
}
|
}
|
||||||
|
if (adc_dev->dev_comp->sample_data_cali)
|
||||||
|
*val = mt_auxadc_get_cali_data(*val, true);
|
||||||
return IIO_VAL_INT;
|
return IIO_VAL_INT;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@ -304,10 +331,11 @@ static SIMPLE_DEV_PM_OPS(mt6577_auxadc_pm_ops,
|
|||||||
mt6577_auxadc_resume);
|
mt6577_auxadc_resume);
|
||||||
|
|
||||||
static const struct of_device_id mt6577_auxadc_of_match[] = {
|
static const struct of_device_id mt6577_auxadc_of_match[] = {
|
||||||
{ .compatible = "mediatek,mt2701-auxadc", },
|
{ .compatible = "mediatek,mt2701-auxadc", .data = &mt8173_compat},
|
||||||
{ .compatible = "mediatek,mt2712-auxadc", },
|
{ .compatible = "mediatek,mt2712-auxadc", .data = &mt8173_compat},
|
||||||
{ .compatible = "mediatek,mt7622-auxadc", },
|
{ .compatible = "mediatek,mt7622-auxadc", .data = &mt8173_compat},
|
||||||
{ .compatible = "mediatek,mt8173-auxadc", },
|
{ .compatible = "mediatek,mt8173-auxadc", .data = &mt8173_compat},
|
||||||
|
{ .compatible = "mediatek,mt6765-auxadc", .data = &mt6765_compat},
|
||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
MODULE_DEVICE_TABLE(of, mt6577_auxadc_of_match);
|
MODULE_DEVICE_TABLE(of, mt6577_auxadc_of_match);
|
||||||
|
Loading…
Reference in New Issue
Block a user