/* read channel and make sure old ready bit == 0 */
ret = readl_poll_timeout(reg_channel, val,
((val & MT6577_AUXADC_RDY0) == 0),
MT6577_AUXADC_SLEEP_US,
MT6577_AUXADC_TIMEOUT_US); if (ret < 0) {
dev_err(indio_dev->dev.parent, "wait for channel[%d] ready bit clear time out\n",
chan->channel); goto err_timeout;
}
/* set bit to trigger sample */
mt6577_auxadc_mod_reg(adc_dev->reg_base + MT6577_AUXADC_CON1,
1 << chan->channel, 0);
/* we must delay here for hardware sample channel data */
udelay(MT6577_AUXADC_SAMPLE_READY_US);
if (adc_dev->dev_comp->check_global_idle) { /* check MTK_AUXADC_CON2 if auxadc is idle */
ret = readl_poll_timeout(adc_dev->reg_base + MT6577_AUXADC_CON2,
val, ((val & MT6577_AUXADC_STA) == 0),
MT6577_AUXADC_SLEEP_US,
MT6577_AUXADC_TIMEOUT_US); if (ret < 0) {
dev_err(indio_dev->dev.parent, "wait for auxadc idle time out\n"); goto err_timeout;
}
}
/* read channel and make sure ready bit == 1 */
ret = readl_poll_timeout(reg_channel, val,
((val & MT6577_AUXADC_RDY0) != 0),
MT6577_AUXADC_SLEEP_US,
MT6577_AUXADC_TIMEOUT_US); if (ret < 0) {
dev_err(indio_dev->dev.parent, "wait for channel[%d] data ready time out\n",
chan->channel); goto err_timeout;
}
/* read data */
val = readl(reg_channel) & MT6577_AUXADC_DAT_MASK;
mutex_unlock(&adc_dev->lock);
return val;
err_timeout:
mutex_unlock(&adc_dev->lock);
return -ETIMEDOUT;
}
staticint mt6577_auxadc_read_raw(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, int *val, int *val2, long info)
{ struct mt6577_auxadc_device *adc_dev = iio_priv(indio_dev);
switch (info) { case IIO_CHAN_INFO_PROCESSED:
*val = mt6577_auxadc_read(indio_dev, chan); if (*val < 0) {
dev_err(indio_dev->dev.parent, "failed to sample data on channel[%d]\n",
chan->channel); return *val;
} if (adc_dev->dev_comp->sample_data_cali)
*val = mt_auxadc_get_cali_data(*val, true);
/* Convert adc raw data to voltage: 0 - 1500 mV */
*val = *val * VOLTAGE_FULL_RANGE / AUXADC_PRECISE;
adc_dev->reg_base = devm_platform_ioremap_resource(pdev, 0); if (IS_ERR(adc_dev->reg_base)) return dev_err_probe(&pdev->dev, PTR_ERR(adc_dev->reg_base), "failed to get auxadc base address\n");
adc_dev->adc_clk = devm_clk_get_enabled(&pdev->dev, "main"); if (IS_ERR(adc_dev->adc_clk)) return dev_err_probe(&pdev->dev, PTR_ERR(adc_dev->adc_clk), "failed to enable auxadc clock\n");
ret = devm_add_action_or_reset(&pdev->dev, mt6577_power_off, adc_dev); if (ret) return dev_err_probe(&pdev->dev, ret, "Failed to add action to managed power off\n");
ret = devm_iio_device_register(&pdev->dev, indio_dev); if (ret < 0) return dev_err_probe(&pdev->dev, ret, "failed to register iio device\n");
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.