iio: mxs-lradc: add scale attribute to channels
Some LRADC channels have fixed pre-dividers and all have an optional divider by two which allows a maximum input voltage of VDDIO - 50mV. This patch - adds the scaling info flag to all channels - grabs the max reference voltage per channel (where the fixed pre-dividers apply) - allows to read the scaling attribute (computed from the Vref) Signed-off-by: Hector Palacios <hector.palacios@digi.com>. Signed-off-by: Alexandre Belloni <alexandre.belloni@free-electrons.com> Acked-by: Marek Vasut <marex@denx.de> Signed-off-by: Jonathan Cameron <jic23@kernel.org>
This commit is contained in:
parent
971672c0b3
commit
f6db68a405
|
@ -111,16 +111,59 @@ static const char * const mx28_lradc_irq_names[] = {
|
||||||
struct mxs_lradc_of_config {
|
struct mxs_lradc_of_config {
|
||||||
const int irq_count;
|
const int irq_count;
|
||||||
const char * const *irq_name;
|
const char * const *irq_name;
|
||||||
|
const uint32_t *vref_mv;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define VREF_MV_BASE 1850
|
||||||
|
|
||||||
|
static const uint32_t mx23_vref_mv[LRADC_MAX_TOTAL_CHANS] = {
|
||||||
|
VREF_MV_BASE, /* CH0 */
|
||||||
|
VREF_MV_BASE, /* CH1 */
|
||||||
|
VREF_MV_BASE, /* CH2 */
|
||||||
|
VREF_MV_BASE, /* CH3 */
|
||||||
|
VREF_MV_BASE, /* CH4 */
|
||||||
|
VREF_MV_BASE, /* CH5 */
|
||||||
|
VREF_MV_BASE * 2, /* CH6 VDDIO */
|
||||||
|
VREF_MV_BASE * 4, /* CH7 VBATT */
|
||||||
|
VREF_MV_BASE, /* CH8 Temp sense 0 */
|
||||||
|
VREF_MV_BASE, /* CH9 Temp sense 1 */
|
||||||
|
VREF_MV_BASE, /* CH10 */
|
||||||
|
VREF_MV_BASE, /* CH11 */
|
||||||
|
VREF_MV_BASE, /* CH12 USB_DP */
|
||||||
|
VREF_MV_BASE, /* CH13 USB_DN */
|
||||||
|
VREF_MV_BASE, /* CH14 VBG */
|
||||||
|
VREF_MV_BASE * 4, /* CH15 VDD5V */
|
||||||
|
};
|
||||||
|
|
||||||
|
static const uint32_t mx28_vref_mv[LRADC_MAX_TOTAL_CHANS] = {
|
||||||
|
VREF_MV_BASE, /* CH0 */
|
||||||
|
VREF_MV_BASE, /* CH1 */
|
||||||
|
VREF_MV_BASE, /* CH2 */
|
||||||
|
VREF_MV_BASE, /* CH3 */
|
||||||
|
VREF_MV_BASE, /* CH4 */
|
||||||
|
VREF_MV_BASE, /* CH5 */
|
||||||
|
VREF_MV_BASE, /* CH6 */
|
||||||
|
VREF_MV_BASE * 4, /* CH7 VBATT */
|
||||||
|
VREF_MV_BASE, /* CH8 Temp sense 0 */
|
||||||
|
VREF_MV_BASE, /* CH9 Temp sense 1 */
|
||||||
|
VREF_MV_BASE * 2, /* CH10 VDDIO */
|
||||||
|
VREF_MV_BASE, /* CH11 VTH */
|
||||||
|
VREF_MV_BASE * 2, /* CH12 VDDA */
|
||||||
|
VREF_MV_BASE, /* CH13 VDDD */
|
||||||
|
VREF_MV_BASE, /* CH14 VBG */
|
||||||
|
VREF_MV_BASE * 4, /* CH15 VDD5V */
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct mxs_lradc_of_config mxs_lradc_of_config[] = {
|
static const struct mxs_lradc_of_config mxs_lradc_of_config[] = {
|
||||||
[IMX23_LRADC] = {
|
[IMX23_LRADC] = {
|
||||||
.irq_count = ARRAY_SIZE(mx23_lradc_irq_names),
|
.irq_count = ARRAY_SIZE(mx23_lradc_irq_names),
|
||||||
.irq_name = mx23_lradc_irq_names,
|
.irq_name = mx23_lradc_irq_names,
|
||||||
|
.vref_mv = mx23_vref_mv,
|
||||||
},
|
},
|
||||||
[IMX28_LRADC] = {
|
[IMX28_LRADC] = {
|
||||||
.irq_count = ARRAY_SIZE(mx28_lradc_irq_names),
|
.irq_count = ARRAY_SIZE(mx28_lradc_irq_names),
|
||||||
.irq_name = mx28_lradc_irq_names,
|
.irq_name = mx28_lradc_irq_names,
|
||||||
|
.vref_mv = mx28_vref_mv,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -155,6 +198,8 @@ struct mxs_lradc {
|
||||||
|
|
||||||
struct completion completion;
|
struct completion completion;
|
||||||
|
|
||||||
|
const uint32_t *vref_mv;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Touchscreen LRADC channels receives a private slot in the CTRL4
|
* Touchscreen LRADC channels receives a private slot in the CTRL4
|
||||||
* register, the slot #7. Therefore only 7 slots instead of 8 in the
|
* register, the slot #7. Therefore only 7 slots instead of 8 in the
|
||||||
|
@ -836,6 +881,8 @@ static int mxs_lradc_read_raw(struct iio_dev *iio_dev,
|
||||||
const struct iio_chan_spec *chan,
|
const struct iio_chan_spec *chan,
|
||||||
int *val, int *val2, long m)
|
int *val, int *val2, long m)
|
||||||
{
|
{
|
||||||
|
struct mxs_lradc *lradc = iio_priv(iio_dev);
|
||||||
|
|
||||||
/* Check for invalid channel */
|
/* Check for invalid channel */
|
||||||
if (chan->channel > LRADC_MAX_TOTAL_CHANS)
|
if (chan->channel > LRADC_MAX_TOTAL_CHANS)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
@ -857,7 +904,9 @@ static int mxs_lradc_read_raw(struct iio_dev *iio_dev,
|
||||||
return IIO_VAL_INT_PLUS_MICRO;
|
return IIO_VAL_INT_PLUS_MICRO;
|
||||||
}
|
}
|
||||||
|
|
||||||
return -EINVAL;
|
*val = lradc->vref_mv[chan->channel];
|
||||||
|
*val2 = chan->scan_type.realbits;
|
||||||
|
return IIO_VAL_FRACTIONAL_LOG2;
|
||||||
|
|
||||||
case IIO_CHAN_INFO_OFFSET:
|
case IIO_CHAN_INFO_OFFSET:
|
||||||
if (chan->type == IIO_TEMP) {
|
if (chan->type == IIO_TEMP) {
|
||||||
|
@ -1189,7 +1238,8 @@ static const struct iio_buffer_setup_ops mxs_lradc_buffer_ops = {
|
||||||
.type = (chan_type), \
|
.type = (chan_type), \
|
||||||
.indexed = 1, \
|
.indexed = 1, \
|
||||||
.scan_index = (idx), \
|
.scan_index = (idx), \
|
||||||
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
|
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
|
||||||
|
BIT(IIO_CHAN_INFO_SCALE), \
|
||||||
.channel = (idx), \
|
.channel = (idx), \
|
||||||
.scan_type = { \
|
.scan_type = { \
|
||||||
.sign = 'u', \
|
.sign = 'u', \
|
||||||
|
@ -1381,6 +1431,8 @@ static int mxs_lradc_probe(struct platform_device *pdev)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
lradc->vref_mv = of_cfg->vref_mv;
|
||||||
|
|
||||||
platform_set_drvdata(pdev, iio);
|
platform_set_drvdata(pdev, iio);
|
||||||
|
|
||||||
init_completion(&lradc->completion);
|
init_completion(&lradc->completion);
|
||||||
|
|
Loading…
Reference in New Issue