* [PATCH v1 1/3] meson saradc: code refactoring
2023-06-21 6:26 [PATCH v1 0/3] meson saradc: add iio channels to read channel 7 mux inputs George Stark
@ 2023-06-21 6:26 ` George Stark
2023-06-21 14:08 ` Andy Shevchenko
2023-06-21 6:26 ` [PATCH v1 2/3] meson saradc: add channel labels George Stark
` (2 subsequent siblings)
3 siblings, 1 reply; 8+ messages in thread
From: George Stark @ 2023-06-21 6:26 UTC (permalink / raw)
To: jic23, lars, neil.armstrong, khilman, jbrunet,
martin.blumenstingl, andriy.shevchenko, nuno.sa, gnstark
Cc: linux-iio, linux-arm-kernel, linux-kernel, linux-amlogic, kernel,
George Stark
- 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(-)
diff --git a/drivers/iio/adc/meson_saradc.c b/drivers/iio/adc/meson_saradc.c
index 18937a262af6..42f0389e123d 100644
--- a/drivers/iio/adc/meson_saradc.c
+++ b/drivers/iio/adc/meson_saradc.c
@@ -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)
--
2.38.4
^ permalink raw reply related [flat|nested] 8+ messages in thread* Re: [PATCH v1 1/3] meson saradc: code refactoring
2023-06-21 6:26 ` [PATCH v1 1/3] meson saradc: code refactoring George Stark
@ 2023-06-21 14:08 ` Andy Shevchenko
0 siblings, 0 replies; 8+ messages in thread
From: Andy Shevchenko @ 2023-06-21 14:08 UTC (permalink / raw)
To: George Stark
Cc: jic23, lars, neil.armstrong, khilman, jbrunet,
martin.blumenstingl, nuno.sa, linux-iio, linux-arm-kernel,
linux-kernel, linux-amlogic, kernel
On Wed, Jun 21, 2023 at 09:26:08AM +0300, George Stark wrote:
> - remove channel array double definition
> - add channel index enum
> - move enums declaration before variables declaration
> - move meson_sar_adc_set_chan7_mux routine upper
4 patches then?
...
> + // last item is temp channel
Is C++ comment style is used in the entire file?
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH v1 2/3] meson saradc: add channel labels
2023-06-21 6:26 [PATCH v1 0/3] meson saradc: add iio channels to read channel 7 mux inputs George Stark
2023-06-21 6:26 ` [PATCH v1 1/3] meson saradc: code refactoring George Stark
@ 2023-06-21 6:26 ` George Stark
2023-06-21 14:08 ` Andy Shevchenko
2023-06-21 6:26 ` [PATCH v1 3/3] meson saradc: support reading from channel7 mux inputs George Stark
2023-06-21 14:10 ` [PATCH v1 0/3] meson saradc: add iio channels to read channel 7 " Andy Shevchenko
3 siblings, 1 reply; 8+ messages in thread
From: George Stark @ 2023-06-21 6:26 UTC (permalink / raw)
To: jic23, lars, neil.armstrong, khilman, jbrunet,
martin.blumenstingl, andriy.shevchenko, nuno.sa, gnstark
Cc: linux-iio, linux-arm-kernel, linux-kernel, linux-amlogic, kernel,
George Stark
patch adds channel attribute 'label' with channel name
Signed-off-by: George Stark <GNStark@sberdevices.ru>
---
drivers/iio/adc/meson_saradc.c | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/drivers/iio/adc/meson_saradc.c b/drivers/iio/adc/meson_saradc.c
index 42f0389e123d..66d6f527122c 100644
--- a/drivers/iio/adc/meson_saradc.c
+++ b/drivers/iio/adc/meson_saradc.c
@@ -1044,8 +1044,20 @@ static int meson_sar_adc_calib(struct iio_dev *indio_dev)
return ret;
}
+static int read_label(struct iio_dev *indio_dev,
+ struct iio_chan_spec const *chan,
+ char *label)
+{
+ if (chan->type == IIO_TEMP)
+ return sprintf(label, "%s\n", "temp-sensor");
+ if (chan->type == IIO_VOLTAGE)
+ return sprintf(label, "channel-%d\n", chan->channel);
+ return 0;
+}
+
static const struct iio_info meson_sar_adc_iio_info = {
.read_raw = meson_sar_adc_iio_info_read_raw,
+ .read_label = read_label,
};
static const struct meson_sar_adc_param meson_sar_adc_meson8_param = {
--
2.38.4
^ permalink raw reply related [flat|nested] 8+ messages in thread* Re: [PATCH v1 2/3] meson saradc: add channel labels
2023-06-21 6:26 ` [PATCH v1 2/3] meson saradc: add channel labels George Stark
@ 2023-06-21 14:08 ` Andy Shevchenko
0 siblings, 0 replies; 8+ messages in thread
From: Andy Shevchenko @ 2023-06-21 14:08 UTC (permalink / raw)
To: George Stark
Cc: jic23, lars, neil.armstrong, khilman, jbrunet,
martin.blumenstingl, nuno.sa, linux-iio, linux-arm-kernel,
linux-kernel, linux-amlogic, kernel
On Wed, Jun 21, 2023 at 09:26:09AM +0300, George Stark wrote:
> patch adds channel attribute 'label' with channel name
Please update commit message in accordance with English grammar and
Submitting Patches document (e.g. imperative mode should be used).
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH v1 3/3] meson saradc: support reading from channel7 mux inputs
2023-06-21 6:26 [PATCH v1 0/3] meson saradc: add iio channels to read channel 7 mux inputs George Stark
2023-06-21 6:26 ` [PATCH v1 1/3] meson saradc: code refactoring George Stark
2023-06-21 6:26 ` [PATCH v1 2/3] meson saradc: add channel labels George Stark
@ 2023-06-21 6:26 ` George Stark
2023-06-21 14:10 ` Andy Shevchenko
2023-06-21 14:10 ` [PATCH v1 0/3] meson saradc: add iio channels to read channel 7 " Andy Shevchenko
3 siblings, 1 reply; 8+ messages in thread
From: George Stark @ 2023-06-21 6:26 UTC (permalink / raw)
To: jic23, lars, neil.armstrong, khilman, jbrunet,
martin.blumenstingl, andriy.shevchenko, nuno.sa, gnstark
Cc: linux-iio, linux-arm-kernel, linux-kernel, linux-amlogic, kernel,
George Stark
meson saradc channel 7 is connected to muxer that can switch channel
input to well-known sources like Vdd, GND and several Vdd dividers.
This patch adds iio channel for every mux input.
Signed-off-by: George Stark <GNStark@sberdevices.ru>
---
drivers/iio/adc/meson_saradc.c | 65 +++++++++++++++++++++++++++++++---
1 file changed, 61 insertions(+), 4 deletions(-)
diff --git a/drivers/iio/adc/meson_saradc.c b/drivers/iio/adc/meson_saradc.c
index 66d6f527122c..c4f350b4523e 100644
--- a/drivers/iio/adc/meson_saradc.c
+++ b/drivers/iio/adc/meson_saradc.c
@@ -163,6 +163,7 @@
#define MESON_SAR_ADC_MAX_FIFO_SIZE 32
#define MESON_SAR_ADC_TIMEOUT 100 /* ms */
#define MESON_SAR_ADC_VOLTAGE_AND_TEMP_CHANNEL 6
+#define MESON_SAR_ADC_VOLTAGE_AND_MUX_CHANNEL 7
#define MESON_SAR_ADC_TEMP_OFFSET 27
/* temperature sensor calibration information in eFuse */
@@ -201,6 +202,19 @@
.datasheet_name = "TEMP_SENSOR", \
}
+#define MESON_SAR_ADC_MUX(_chan, _sel) { \
+ .type = IIO_VOLTAGE, \
+ .channel = _chan, \
+ .indexed = 1, \
+ .address = MESON_SAR_ADC_VOLTAGE_AND_MUX_CHANNEL, \
+ .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
+ BIT(IIO_CHAN_INFO_AVERAGE_RAW), \
+ .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \
+ .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_CALIBBIAS) | \
+ BIT(IIO_CHAN_INFO_CALIBSCALE), \
+ .datasheet_name = "SAR_ADC_MUX_"#_sel, \
+}
+
enum meson_sar_adc_avg_mode {
NO_AVERAGING = 0x0,
MEAN_AVERAGING = 0x1,
@@ -233,6 +247,27 @@ enum meson_sar_adc_channel_index {
INDEX_CHAN_6,
INDEX_CHAN_7,
INDEX_CHAN_SOFT_TIMESTAMP,
+ INDEX_MUX_0_VSS,
+ INDEX_MUX_1_VDD_DIV4,
+ INDEX_MUX_2_VDD_DIV2,
+ INDEX_MUX_3_VDD_MUL3_DIV4,
+ INDEX_MUX_4_VDD,
+};
+
+static enum meson_sar_adc_chan7_mux_sel chan7_mux_values[] = {
+ CHAN7_MUX_VSS,
+ CHAN7_MUX_VDD_DIV4,
+ CHAN7_MUX_VDD_DIV2,
+ CHAN7_MUX_VDD_MUL3_DIV4,
+ CHAN7_MUX_VDD,
+};
+
+static const char * const chan7_mux_names[] = {
+ "gnd",
+ "0.25vdd",
+ "0.5vdd",
+ "0.75vdd",
+ "vdd",
};
static const struct iio_chan_spec meson_sar_adc_iio_channels[] = {
@@ -245,6 +280,11 @@ static const struct iio_chan_spec meson_sar_adc_iio_channels[] = {
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_MUX(INDEX_MUX_0_VSS, 0),
+ MESON_SAR_ADC_MUX(INDEX_MUX_1_VDD_DIV4, 1),
+ MESON_SAR_ADC_MUX(INDEX_MUX_2_VDD_DIV2, 2),
+ MESON_SAR_ADC_MUX(INDEX_MUX_3_VDD_MUL3_DIV4, 3),
+ MESON_SAR_ADC_MUX(INDEX_MUX_4_VDD, 4),
MESON_SAR_ADC_TEMP_CHAN(), /* must be the last item */
};
@@ -284,6 +324,7 @@ struct meson_sar_adc_priv {
bool temperature_sensor_calibrated;
u8 temperature_sensor_coefficient;
u16 temperature_sensor_adc_val;
+ enum meson_sar_adc_chan7_mux_sel chan7_mux_sel;
};
static const struct regmap_config meson_sar_adc_regmap_config_gxbb = {
@@ -348,6 +389,8 @@ static void meson_sar_adc_set_chan7_mux(struct iio_dev *indio_dev,
MESON_SAR_ADC_REG3_CTRL_CHAN7_MUX_SEL_MASK, regval);
usleep_range(10, 20);
+
+ priv->chan7_mux_sel = sel;
}
static int meson_sar_adc_read_raw_sample(struct iio_dev *indio_dev,
@@ -443,6 +486,15 @@ static void meson_sar_adc_enable_channel(struct iio_dev *indio_dev,
regmap_update_bits(priv->regmap,
MESON_SAR_ADC_DELTA_10,
MESON_SAR_ADC_DELTA_10_TEMP_SEL, regval);
+ } else if (chan->address == MESON_SAR_ADC_VOLTAGE_AND_MUX_CHANNEL) {
+ enum meson_sar_adc_chan7_mux_sel sel;
+
+ if (chan->channel == INDEX_CHAN_7)
+ sel = CHAN7_MUX_CH7_INPUT;
+ else
+ sel = chan7_mux_values[chan->channel - INDEX_MUX_0_VSS];
+ if (sel != priv->chan7_mux_sel)
+ meson_sar_adc_set_chan7_mux(indio_dev, sel);
}
}
@@ -1015,7 +1067,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[INDEX_CHAN_7],
+ &indio_dev->channels[INDEX_MUX_1_VDD_DIV4],
MEAN_AVERAGING, EIGHT_SAMPLES, &value0);
if (ret < 0)
goto out;
@@ -1023,7 +1075,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[INDEX_CHAN_7],
+ &indio_dev->channels[INDEX_MUX_3_VDD_MUL3_DIV4],
MEAN_AVERAGING, EIGHT_SAMPLES, &value1);
if (ret < 0)
goto out;
@@ -1050,8 +1102,13 @@ static int read_label(struct iio_dev *indio_dev,
{
if (chan->type == IIO_TEMP)
return sprintf(label, "%s\n", "temp-sensor");
- if (chan->type == IIO_VOLTAGE)
- return sprintf(label, "channel-%d\n", chan->channel);
+ if (chan->type == IIO_VOLTAGE) {
+ if (chan->channel <= INDEX_CHAN_7)
+ return sprintf(label, "channel-%d\n", chan->channel);
+ if (chan->channel >= INDEX_MUX_0_VSS)
+ return sprintf(label, "%s\n",
+ chan7_mux_names[chan->channel - INDEX_MUX_0_VSS]);
+ }
return 0;
}
--
2.38.4
^ permalink raw reply related [flat|nested] 8+ messages in thread* Re: [PATCH v1 3/3] meson saradc: support reading from channel7 mux inputs
2023-06-21 6:26 ` [PATCH v1 3/3] meson saradc: support reading from channel7 mux inputs George Stark
@ 2023-06-21 14:10 ` Andy Shevchenko
0 siblings, 0 replies; 8+ messages in thread
From: Andy Shevchenko @ 2023-06-21 14:10 UTC (permalink / raw)
To: George Stark
Cc: jic23, lars, neil.armstrong, khilman, jbrunet,
martin.blumenstingl, nuno.sa, linux-iio, linux-arm-kernel,
linux-kernel, linux-amlogic, kernel
On Wed, Jun 21, 2023 at 09:26:10AM +0300, George Stark wrote:
> meson saradc channel 7 is connected to muxer that can switch channel
> input to well-known sources like Vdd, GND and several Vdd dividers.
> This patch adds iio channel for every mux input.
Same comments as per patch 2.
...
> +static const char * const chan7_mux_names[] = {
> + "gnd",
> + "0.25vdd",
> + "0.5vdd",
> + "0.75vdd",
> + "vdd",
> };
Looks good to me now, thank you for fixing this.
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v1 0/3] meson saradc: add iio channels to read channel 7 mux inputs
2023-06-21 6:26 [PATCH v1 0/3] meson saradc: add iio channels to read channel 7 mux inputs George Stark
` (2 preceding siblings ...)
2023-06-21 6:26 ` [PATCH v1 3/3] meson saradc: support reading from channel7 mux inputs George Stark
@ 2023-06-21 14:10 ` Andy Shevchenko
3 siblings, 0 replies; 8+ messages in thread
From: Andy Shevchenko @ 2023-06-21 14:10 UTC (permalink / raw)
To: George Stark
Cc: jic23, lars, neil.armstrong, khilman, jbrunet,
martin.blumenstingl, nuno.sa, linux-iio, linux-arm-kernel,
linux-kernel, linux-amlogic, kernel
On Wed, Jun 21, 2023 at 09:26:07AM +0300, George Stark wrote:
> From: George Stark <GNStark@sberdevices.ru>
>
> In meson saradc channel7 is connected to muxer which allows to measure
> inner sources like Vdd, GND, several Vdd dividers. This patch series
> adds independent iio channel (with label) for every chan7 mux input.
> Mux switch is handled transparent for clients.
> This functionality can help debug\test\calibrate adc.
> This code is relevant for all supported amlogic soc families
Code wise looks good to me, some remarks about commit messages and comments.
> This patch series was created after discussion [1], [2]
>
> [1] https://lore.kernel.org/lkml/20230524000111.14370-1-gnstark@sberdevices.ru/
> [2] https://lore.kernel.org/lkml/20230527214854.126517-1-gnstark@sberdevices.ru/
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 8+ messages in thread