On Tue, Feb 06, 2024 at 07:58:18AM +0100, Mike Looijmans wrote:
Skeleton driver for the TI ADS1298 medical ADC. This device isThanks for an update, I have only a few style comments and a single one about
typically used for ECG and similar measurements. Supports data
acquisition at configurable scale and sampling frequency.
comparison (see below). If you are going to address them as suggested, feel
free to add
Reviewed-by: Andy Shevchenko <andriy.shevchenko@xxxxxxxxxxxxxxx>
to the next version.
...
+/* Registers */+ Blank line? (And so on for all registers that have bitfields defined)
+#define ADS1298_REG_ID 0x00
+#define ADS1298_MASK_ID_FAMILY GENMASK(7, 3)
+#define ADS1298_MASK_ID_CHANNELS GENMASK(2, 0)
+#define ADS1298_ID_FAMILY_ADS129X 0x90
+#define ADS1298_ID_FAMILY_ADS129XR 0xd0
+#define ADS1298_REG_CONFIG1 0x01...
+#define ADS1298_MASK_CONFIG1_HR BIT(7)
+#define ADS1298_MASK_CONFIG1_DR GENMASK(2, 0)
+#define ADS1298_SHIFT_DR_HR 6
+#define ADS1298_SHIFT_DR_LP 7
+#define ADS1298_LOWEST_DR 0x06
+ factor = (rate >> ADS1298_SHIFT_DR_HR) / val;I just realized that this comparison is probably better in a form
+ if (factor >= 128)
if (factor >= ADS1298_MASK_CONFIG1_HR)
as it points out why this is a special case in comparison to 'if (factor)'
below. What do you think?
...
+ wasbusy = --priv->rdata_xfer_busy;Why preincrement? How would it be different from postincrement?
+ if (wasbusy) {To me more robust code would look like
if (wasbusy < 1)
return;
...
if (wasbusy > 1)
...
+ /*...
+ * DRDY interrupt occurred before SPI completion. Start a new
+ * SPI transaction now to retrieve the data that wasn't latched
+ * into the ADS1298 chip's transfer buffer yet.
+ */
+ spi_async(priv->spi, &priv->rdata_msg);
+ /*
+ * If more than one DRDY took place, there was an overrun. Since
+ * the sample is already lost, reset the counter to 1 so that
+ * we will wait for a DRDY interrupt after this SPI transaction.
+ */
+ if (wasbusy > 1)
+ priv->rdata_xfer_busy = 1;
+ }
+ /*For
+ * for a single transfer mode we're kept in direct_mode until
+ * completion, avoiding a race with buffered IO....
+ */
+ wasbusy = priv->rdata_xfer_busy++;So, it starts from negative?
+ /* When no SPI transfer in transit, start one now */To be compatible with above perhaps
+ if (!wasbusy)
if (wasbusy < 1)
also makes it more robust (all negative numbers will be considered the same.
+ spi_async(priv->spi, &priv->rdata_msg);
...
+ dev_dbg(dev, "Found %s, %u channels\n", ads1298_family_name(val),Castings in printf() is a big red flag usually (it's rarely we need them).
+ (unsigned int)(4 + 2 * (val & ADS1298_MASK_ID_CHANNELS)));
Why is it here?
...
+ if (reset_gpio) {I would rewrite it as
+ /* Minimum reset pulsewidth is 2 clock cycles */
+ udelay(ADS1298_CLOCKS_TO_USECS(2));
+ gpiod_set_value(reset_gpio, 0);
/* Minimum reset pulsewidth is 2 clock cycles */
gpiod_set_value(reset_gpio, 1);
udelay(ADS1298_CLOCKS_TO_USECS(2));
gpiod_set_value(reset_gpio, 0);
to be sure we have a reset done correctly, and the comment will make more
sense.