@@ -189,9 +189,8 @@
.datasheet_name = "SAR_ADC_CH"#_chan, \
}
-#define MESON_SAR_ADC_TEMP_CHAN(_chan) { \
+#define MESON_SAR_ADC_TEMP_CHAN() { \
.type = IIO_TEMP, \
- .channel = _chan, \
.address = MESON_SAR_ADC_VOLTAGE_AND_TEMP_CHANNEL, \
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
BIT(IIO_CHAN_INFO_AVERAGE_RAW), \
@@ -202,31 +201,6 @@
.datasheet_name = "TEMP_SENSOR", \
}
-static const struct iio_chan_spec meson_sar_adc_iio_channels[] = {
- MESON_SAR_ADC_CHAN(0),
- MESON_SAR_ADC_CHAN(1),
- MESON_SAR_ADC_CHAN(2),
- MESON_SAR_ADC_CHAN(3),
- MESON_SAR_ADC_CHAN(4),
- MESON_SAR_ADC_CHAN(5),
- MESON_SAR_ADC_CHAN(6),
- MESON_SAR_ADC_CHAN(7),
- IIO_CHAN_SOFT_TIMESTAMP(8),
-};
-
-static const struct iio_chan_spec meson_sar_adc_and_temp_iio_channels[] = {
- MESON_SAR_ADC_CHAN(0),
- MESON_SAR_ADC_CHAN(1),
- MESON_SAR_ADC_CHAN(2),
- MESON_SAR_ADC_CHAN(3),
- MESON_SAR_ADC_CHAN(4),
- MESON_SAR_ADC_CHAN(5),
- MESON_SAR_ADC_CHAN(6),
- MESON_SAR_ADC_CHAN(7),
- MESON_SAR_ADC_TEMP_CHAN(8),
- IIO_CHAN_SOFT_TIMESTAMP(9),
-};
-
enum meson_sar_adc_avg_mode {
NO_AVERAGING = 0x0,
MEAN_AVERAGING = 0x1,
@@ -249,6 +223,31 @@ enum meson_sar_adc_chan7_mux_sel {
CHAN7_MUX_CH7_INPUT = 0x7,
};
+enum meson_sar_adc_channel_index {
+ INDEX_CHAN_0,
+ INDEX_CHAN_1,
+ INDEX_CHAN_2,
+ INDEX_CHAN_3,
+ INDEX_CHAN_4,
+ INDEX_CHAN_5,
+ INDEX_CHAN_6,
+ INDEX_CHAN_7,
+ INDEX_CHAN_SOFT_TIMESTAMP,
+};
+
+static const struct iio_chan_spec meson_sar_adc_iio_channels[] = {
+ MESON_SAR_ADC_CHAN(INDEX_CHAN_0),
+ MESON_SAR_ADC_CHAN(INDEX_CHAN_1),
+ MESON_SAR_ADC_CHAN(INDEX_CHAN_2),
+ MESON_SAR_ADC_CHAN(INDEX_CHAN_3),
+ MESON_SAR_ADC_CHAN(INDEX_CHAN_4),
+ MESON_SAR_ADC_CHAN(INDEX_CHAN_5),
+ MESON_SAR_ADC_CHAN(INDEX_CHAN_6),
+ MESON_SAR_ADC_CHAN(INDEX_CHAN_7),
+ IIO_CHAN_SOFT_TIMESTAMP(INDEX_CHAN_SOFT_TIMESTAMP),
+ MESON_SAR_ADC_TEMP_CHAN(), /* must be the last item */
+};
+
struct meson_sar_adc_param {
bool has_bl30_integration;
unsigned long clock_rate;
@@ -338,6 +337,19 @@ static int meson_sar_adc_wait_busy_clear(struct iio_dev *indio_dev)
1, 10000);
}
+static void meson_sar_adc_set_chan7_mux(struct iio_dev *indio_dev,
+ enum meson_sar_adc_chan7_mux_sel sel)
+{
+ struct meson_sar_adc_priv *priv = iio_priv(indio_dev);
+ u32 regval;
+
+ regval = FIELD_PREP(MESON_SAR_ADC_REG3_CTRL_CHAN7_MUX_SEL_MASK, sel);
+ regmap_update_bits(priv->regmap, MESON_SAR_ADC_REG3,
+ MESON_SAR_ADC_REG3_CTRL_CHAN7_MUX_SEL_MASK, regval);
+
+ usleep_range(10, 20);
+}
+
static int meson_sar_adc_read_raw_sample(struct iio_dev *indio_dev,
const struct iio_chan_spec *chan,
int *val)
@@ -434,19 +446,6 @@ static void meson_sar_adc_enable_channel(struct iio_dev *indio_dev,
}
}
-static void meson_sar_adc_set_chan7_mux(struct iio_dev *indio_dev,
- enum meson_sar_adc_chan7_mux_sel sel)
-{
- struct meson_sar_adc_priv *priv = iio_priv(indio_dev);
- u32 regval;
-
- regval = FIELD_PREP(MESON_SAR_ADC_REG3_CTRL_CHAN7_MUX_SEL_MASK, sel);
- regmap_update_bits(priv->regmap, MESON_SAR_ADC_REG3,
- MESON_SAR_ADC_REG3_CTRL_CHAN7_MUX_SEL_MASK, regval);
-
- usleep_range(10, 20);
-}
-
static void meson_sar_adc_start_sample_engine(struct iio_dev *indio_dev)
{
struct meson_sar_adc_priv *priv = iio_priv(indio_dev);
@@ -1016,7 +1015,7 @@ static int meson_sar_adc_calib(struct iio_dev *indio_dev)
meson_sar_adc_set_chan7_mux(indio_dev, CHAN7_MUX_VDD_DIV4);
usleep_range(10, 20);
ret = meson_sar_adc_get_sample(indio_dev,
- &indio_dev->channels[7],
+ &indio_dev->channels[INDEX_CHAN_7],
MEAN_AVERAGING, EIGHT_SAMPLES, &value0);
if (ret < 0)
goto out;
@@ -1024,7 +1023,7 @@ static int meson_sar_adc_calib(struct iio_dev *indio_dev)
meson_sar_adc_set_chan7_mux(indio_dev, CHAN7_MUX_VDD_MUL3_DIV4);
usleep_range(10, 20);
ret = meson_sar_adc_get_sample(indio_dev,
- &indio_dev->channels[7],
+ &indio_dev->channels[INDEX_CHAN_7],
MEAN_AVERAGING, EIGHT_SAMPLES, &value1);
if (ret < 0)
goto out;
@@ -1242,15 +1241,11 @@ static int meson_sar_adc_probe(struct platform_device *pdev)
return ret;
}
- if (priv->temperature_sensor_calibrated) {
- indio_dev->channels = meson_sar_adc_and_temp_iio_channels;
- indio_dev->num_channels =
- ARRAY_SIZE(meson_sar_adc_and_temp_iio_channels);
- } else {
- indio_dev->channels = meson_sar_adc_iio_channels;
- indio_dev->num_channels =
- ARRAY_SIZE(meson_sar_adc_iio_channels);
- }
+ indio_dev->channels = meson_sar_adc_iio_channels;
+ indio_dev->num_channels = ARRAY_SIZE(meson_sar_adc_iio_channels);
+ // last item is temp channel
+ if (!priv->temperature_sensor_calibrated)
+ indio_dev->num_channels--;
ret = meson_sar_adc_init(indio_dev);
if (ret)
- remove channel array double definition - add channel index enum - move enums declaration before variables declaration - move meson_sar_adc_set_chan7_mux routine upper Signed-off-by: George Stark <GNStark@sberdevices.ru> --- drivers/iio/adc/meson_saradc.c | 97 ++++++++++++++++------------------ 1 file changed, 46 insertions(+), 51 deletions(-)