Commit 9f127546 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'char-misc-6.1-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc

Pull char/misc fixes from Greg KH:
 "Some small driver fixes for 6.1-rc3.  They include:

   - iio driver bugfixes

   - counter driver bugfixes

   - coresight bugfixes, including a revert and then a second fix to get
     it right.

  All of these have been in linux-next with no reported problems"

* tag 'char-misc-6.1-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc: (21 commits)
  misc: sgi-gru: use explicitly signed char
  coresight: cti: Fix hang in cti_disable_hw()
  Revert "coresight: cti: Fix hang in cti_disable_hw()"
  counter: 104-quad-8: Fix race getting function mode and direction
  counter: microchip-tcb-capture: Handle Signal1 read and Synapse
  coresight: cti: Fix hang in cti_disable_hw()
  coresight: Fix possible deadlock with lock dependency
  counter: ti-ecap-capture: fix IS_ERR() vs NULL check
  counter: Reduce DEFINE_COUNTER_ARRAY_POLARITY() to defining counter_array
  iio: bmc150-accel-core: Fix unsafe buffer attributes
  iio: adxl367: Fix unsafe buffer attributes
  iio: adxl372: Fix unsafe buffer attributes
  iio: at91-sama5d2_adc: Fix unsafe buffer attributes
  iio: temperature: ltc2983: allocate iio channels once
  tools: iio: iio_utils: fix digit calculation
  iio: adc: stm32-adc: fix channel sampling time init
  iio: adc: mcp3911: mask out device ID in debug prints
  iio: adc: mcp3911: use correct id bits
  iio: adc: mcp3911: return proper error code on failure to allocate trigger
  iio: adc: mcp3911: fix sizeof() vs ARRAY_SIZE() bug
  ...
parents c4d25ce6 67704738
...@@ -232,34 +232,45 @@ static const enum counter_function quad8_count_functions_list[] = { ...@@ -232,34 +232,45 @@ static const enum counter_function quad8_count_functions_list[] = {
COUNTER_FUNCTION_QUADRATURE_X4, COUNTER_FUNCTION_QUADRATURE_X4,
}; };
static int quad8_function_get(const struct quad8 *const priv, const size_t id,
enum counter_function *const function)
{
if (!priv->quadrature_mode[id]) {
*function = COUNTER_FUNCTION_PULSE_DIRECTION;
return 0;
}
switch (priv->quadrature_scale[id]) {
case 0:
*function = COUNTER_FUNCTION_QUADRATURE_X1_A;
return 0;
case 1:
*function = COUNTER_FUNCTION_QUADRATURE_X2_A;
return 0;
case 2:
*function = COUNTER_FUNCTION_QUADRATURE_X4;
return 0;
default:
/* should never reach this path */
return -EINVAL;
}
}
static int quad8_function_read(struct counter_device *counter, static int quad8_function_read(struct counter_device *counter,
struct counter_count *count, struct counter_count *count,
enum counter_function *function) enum counter_function *function)
{ {
struct quad8 *const priv = counter_priv(counter); struct quad8 *const priv = counter_priv(counter);
const int id = count->id;
unsigned long irqflags; unsigned long irqflags;
int retval;
spin_lock_irqsave(&priv->lock, irqflags); spin_lock_irqsave(&priv->lock, irqflags);
if (priv->quadrature_mode[id]) retval = quad8_function_get(priv, count->id, function);
switch (priv->quadrature_scale[id]) {
case 0:
*function = COUNTER_FUNCTION_QUADRATURE_X1_A;
break;
case 1:
*function = COUNTER_FUNCTION_QUADRATURE_X2_A;
break;
case 2:
*function = COUNTER_FUNCTION_QUADRATURE_X4;
break;
}
else
*function = COUNTER_FUNCTION_PULSE_DIRECTION;
spin_unlock_irqrestore(&priv->lock, irqflags); spin_unlock_irqrestore(&priv->lock, irqflags);
return 0; return retval;
} }
static int quad8_function_write(struct counter_device *counter, static int quad8_function_write(struct counter_device *counter,
...@@ -359,6 +370,7 @@ static int quad8_action_read(struct counter_device *counter, ...@@ -359,6 +370,7 @@ static int quad8_action_read(struct counter_device *counter,
enum counter_synapse_action *action) enum counter_synapse_action *action)
{ {
struct quad8 *const priv = counter_priv(counter); struct quad8 *const priv = counter_priv(counter);
unsigned long irqflags;
int err; int err;
enum counter_function function; enum counter_function function;
const size_t signal_a_id = count->synapses[0].signal->id; const size_t signal_a_id = count->synapses[0].signal->id;
...@@ -374,9 +386,21 @@ static int quad8_action_read(struct counter_device *counter, ...@@ -374,9 +386,21 @@ static int quad8_action_read(struct counter_device *counter,
return 0; return 0;
} }
err = quad8_function_read(counter, count, &function); spin_lock_irqsave(&priv->lock, irqflags);
if (err)
/* Get Count function and direction atomically */
err = quad8_function_get(priv, count->id, &function);
if (err) {
spin_unlock_irqrestore(&priv->lock, irqflags);
return err;
}
err = quad8_direction_read(counter, count, &direction);
if (err) {
spin_unlock_irqrestore(&priv->lock, irqflags);
return err; return err;
}
spin_unlock_irqrestore(&priv->lock, irqflags);
/* Default action mode */ /* Default action mode */
*action = COUNTER_SYNAPSE_ACTION_NONE; *action = COUNTER_SYNAPSE_ACTION_NONE;
...@@ -389,10 +413,6 @@ static int quad8_action_read(struct counter_device *counter, ...@@ -389,10 +413,6 @@ static int quad8_action_read(struct counter_device *counter,
return 0; return 0;
case COUNTER_FUNCTION_QUADRATURE_X1_A: case COUNTER_FUNCTION_QUADRATURE_X1_A:
if (synapse->signal->id == signal_a_id) { if (synapse->signal->id == signal_a_id) {
err = quad8_direction_read(counter, count, &direction);
if (err)
return err;
if (direction == COUNTER_COUNT_DIRECTION_FORWARD) if (direction == COUNTER_COUNT_DIRECTION_FORWARD)
*action = COUNTER_SYNAPSE_ACTION_RISING_EDGE; *action = COUNTER_SYNAPSE_ACTION_RISING_EDGE;
else else
......
...@@ -28,7 +28,6 @@ struct mchp_tc_data { ...@@ -28,7 +28,6 @@ struct mchp_tc_data {
int qdec_mode; int qdec_mode;
int num_channels; int num_channels;
int channel[2]; int channel[2];
bool trig_inverted;
}; };
static const enum counter_function mchp_tc_count_functions[] = { static const enum counter_function mchp_tc_count_functions[] = {
...@@ -153,7 +152,7 @@ static int mchp_tc_count_signal_read(struct counter_device *counter, ...@@ -153,7 +152,7 @@ static int mchp_tc_count_signal_read(struct counter_device *counter,
regmap_read(priv->regmap, ATMEL_TC_REG(priv->channel[0], SR), &sr); regmap_read(priv->regmap, ATMEL_TC_REG(priv->channel[0], SR), &sr);
if (priv->trig_inverted) if (signal->id == 1)
sigstatus = (sr & ATMEL_TC_MTIOB); sigstatus = (sr & ATMEL_TC_MTIOB);
else else
sigstatus = (sr & ATMEL_TC_MTIOA); sigstatus = (sr & ATMEL_TC_MTIOA);
...@@ -171,6 +170,17 @@ static int mchp_tc_count_action_read(struct counter_device *counter, ...@@ -171,6 +170,17 @@ static int mchp_tc_count_action_read(struct counter_device *counter,
struct mchp_tc_data *const priv = counter_priv(counter); struct mchp_tc_data *const priv = counter_priv(counter);
u32 cmr; u32 cmr;
if (priv->qdec_mode) {
*action = COUNTER_SYNAPSE_ACTION_BOTH_EDGES;
return 0;
}
/* Only TIOA signal is evaluated in non-QDEC mode */
if (synapse->signal->id != 0) {
*action = COUNTER_SYNAPSE_ACTION_NONE;
return 0;
}
regmap_read(priv->regmap, ATMEL_TC_REG(priv->channel[0], CMR), &cmr); regmap_read(priv->regmap, ATMEL_TC_REG(priv->channel[0], CMR), &cmr);
switch (cmr & ATMEL_TC_ETRGEDG) { switch (cmr & ATMEL_TC_ETRGEDG) {
...@@ -199,8 +209,8 @@ static int mchp_tc_count_action_write(struct counter_device *counter, ...@@ -199,8 +209,8 @@ static int mchp_tc_count_action_write(struct counter_device *counter,
struct mchp_tc_data *const priv = counter_priv(counter); struct mchp_tc_data *const priv = counter_priv(counter);
u32 edge = ATMEL_TC_ETRGEDG_NONE; u32 edge = ATMEL_TC_ETRGEDG_NONE;
/* QDEC mode is rising edge only */ /* QDEC mode is rising edge only; only TIOA handled in non-QDEC mode */
if (priv->qdec_mode) if (priv->qdec_mode || synapse->signal->id != 0)
return -EINVAL; return -EINVAL;
switch (action) { switch (action) {
......
...@@ -377,7 +377,8 @@ static const enum counter_signal_polarity ecap_cnt_pol_avail[] = { ...@@ -377,7 +377,8 @@ static const enum counter_signal_polarity ecap_cnt_pol_avail[] = {
COUNTER_SIGNAL_POLARITY_NEGATIVE, COUNTER_SIGNAL_POLARITY_NEGATIVE,
}; };
static DEFINE_COUNTER_ARRAY_POLARITY(ecap_cnt_pol_array, ecap_cnt_pol_avail, ECAP_NB_CEVT); static DEFINE_COUNTER_AVAILABLE(ecap_cnt_pol_available, ecap_cnt_pol_avail);
static DEFINE_COUNTER_ARRAY_POLARITY(ecap_cnt_pol_array, ecap_cnt_pol_available, ECAP_NB_CEVT);
static struct counter_comp ecap_cnt_signal_ext[] = { static struct counter_comp ecap_cnt_signal_ext[] = {
COUNTER_COMP_ARRAY_POLARITY(ecap_cnt_pol_read, ecap_cnt_pol_write, ecap_cnt_pol_array), COUNTER_COMP_ARRAY_POLARITY(ecap_cnt_pol_read, ecap_cnt_pol_write, ecap_cnt_pol_array),
...@@ -479,8 +480,8 @@ static int ecap_cnt_probe(struct platform_device *pdev) ...@@ -479,8 +480,8 @@ static int ecap_cnt_probe(struct platform_device *pdev)
int ret; int ret;
counter_dev = devm_counter_alloc(dev, sizeof(*ecap_dev)); counter_dev = devm_counter_alloc(dev, sizeof(*ecap_dev));
if (IS_ERR(counter_dev)) if (!counter_dev)
return PTR_ERR(counter_dev); return -ENOMEM;
counter_dev->name = ECAP_DRV_NAME; counter_dev->name = ECAP_DRV_NAME;
counter_dev->parent = dev; counter_dev->parent = dev;
......
...@@ -1687,14 +1687,15 @@ struct coresight_device *coresight_register(struct coresight_desc *desc) ...@@ -1687,14 +1687,15 @@ struct coresight_device *coresight_register(struct coresight_desc *desc)
ret = coresight_fixup_device_conns(csdev); ret = coresight_fixup_device_conns(csdev);
if (!ret) if (!ret)
ret = coresight_fixup_orphan_conns(csdev); ret = coresight_fixup_orphan_conns(csdev);
if (!ret && cti_assoc_ops && cti_assoc_ops->add)
cti_assoc_ops->add(csdev);
out_unlock: out_unlock:
mutex_unlock(&coresight_mutex); mutex_unlock(&coresight_mutex);
/* Success */ /* Success */
if (!ret) if (!ret) {
if (cti_assoc_ops && cti_assoc_ops->add)
cti_assoc_ops->add(csdev);
return csdev; return csdev;
}
/* Unregister the device if needed */ /* Unregister the device if needed */
if (registered) { if (registered) {
......
...@@ -90,11 +90,9 @@ void cti_write_all_hw_regs(struct cti_drvdata *drvdata) ...@@ -90,11 +90,9 @@ void cti_write_all_hw_regs(struct cti_drvdata *drvdata)
static int cti_enable_hw(struct cti_drvdata *drvdata) static int cti_enable_hw(struct cti_drvdata *drvdata)
{ {
struct cti_config *config = &drvdata->config; struct cti_config *config = &drvdata->config;
struct device *dev = &drvdata->csdev->dev;
unsigned long flags; unsigned long flags;
int rc = 0; int rc = 0;
pm_runtime_get_sync(dev->parent);
spin_lock_irqsave(&drvdata->spinlock, flags); spin_lock_irqsave(&drvdata->spinlock, flags);
/* no need to do anything if enabled or unpowered*/ /* no need to do anything if enabled or unpowered*/
...@@ -119,7 +117,6 @@ static int cti_enable_hw(struct cti_drvdata *drvdata) ...@@ -119,7 +117,6 @@ static int cti_enable_hw(struct cti_drvdata *drvdata)
/* cannot enable due to error */ /* cannot enable due to error */
cti_err_not_enabled: cti_err_not_enabled:
spin_unlock_irqrestore(&drvdata->spinlock, flags); spin_unlock_irqrestore(&drvdata->spinlock, flags);
pm_runtime_put(dev->parent);
return rc; return rc;
} }
...@@ -153,7 +150,6 @@ static void cti_cpuhp_enable_hw(struct cti_drvdata *drvdata) ...@@ -153,7 +150,6 @@ static void cti_cpuhp_enable_hw(struct cti_drvdata *drvdata)
static int cti_disable_hw(struct cti_drvdata *drvdata) static int cti_disable_hw(struct cti_drvdata *drvdata)
{ {
struct cti_config *config = &drvdata->config; struct cti_config *config = &drvdata->config;
struct device *dev = &drvdata->csdev->dev;
struct coresight_device *csdev = drvdata->csdev; struct coresight_device *csdev = drvdata->csdev;
spin_lock(&drvdata->spinlock); spin_lock(&drvdata->spinlock);
...@@ -175,7 +171,6 @@ static int cti_disable_hw(struct cti_drvdata *drvdata) ...@@ -175,7 +171,6 @@ static int cti_disable_hw(struct cti_drvdata *drvdata)
coresight_disclaim_device_unlocked(csdev); coresight_disclaim_device_unlocked(csdev);
CS_LOCK(drvdata->base); CS_LOCK(drvdata->base);
spin_unlock(&drvdata->spinlock); spin_unlock(&drvdata->spinlock);
pm_runtime_put(dev->parent);
return 0; return 0;
/* not disabled this call */ /* not disabled this call */
...@@ -541,7 +536,7 @@ cti_match_fixup_csdev(struct cti_device *ctidev, const char *node_name, ...@@ -541,7 +536,7 @@ cti_match_fixup_csdev(struct cti_device *ctidev, const char *node_name,
/* /*
* Search the cti list to add an associated CTI into the supplied CS device * Search the cti list to add an associated CTI into the supplied CS device
* This will set the association if CTI declared before the CS device. * This will set the association if CTI declared before the CS device.
* (called from coresight_register() with coresight_mutex locked). * (called from coresight_register() without coresight_mutex locked).
*/ */
static void cti_add_assoc_to_csdev(struct coresight_device *csdev) static void cti_add_assoc_to_csdev(struct coresight_device *csdev)
{ {
...@@ -569,7 +564,8 @@ static void cti_add_assoc_to_csdev(struct coresight_device *csdev) ...@@ -569,7 +564,8 @@ static void cti_add_assoc_to_csdev(struct coresight_device *csdev)
* if we found a matching csdev then update the ECT * if we found a matching csdev then update the ECT
* association pointer for the device with this CTI. * association pointer for the device with this CTI.
*/ */
csdev->ect_dev = ect_item->csdev; coresight_set_assoc_ectdev_mutex(csdev->ect_dev,
ect_item->csdev);
break; break;
} }
} }
......
...@@ -1185,17 +1185,30 @@ static ssize_t adxl367_get_fifo_watermark(struct device *dev, ...@@ -1185,17 +1185,30 @@ static ssize_t adxl367_get_fifo_watermark(struct device *dev,
return sysfs_emit(buf, "%d\n", fifo_watermark); return sysfs_emit(buf, "%d\n", fifo_watermark);
} }
static IIO_CONST_ATTR(hwfifo_watermark_min, "1"); static ssize_t hwfifo_watermark_min_show(struct device *dev,
static IIO_CONST_ATTR(hwfifo_watermark_max, struct device_attribute *attr,
__stringify(ADXL367_FIFO_MAX_WATERMARK)); char *buf)
{
return sysfs_emit(buf, "%s\n", "1");
}
static ssize_t hwfifo_watermark_max_show(struct device *dev,
struct device_attribute *attr,
char *buf)
{
return sysfs_emit(buf, "%s\n", __stringify(ADXL367_FIFO_MAX_WATERMARK));
}
static IIO_DEVICE_ATTR_RO(hwfifo_watermark_min, 0);
static IIO_DEVICE_ATTR_RO(hwfifo_watermark_max, 0);
static IIO_DEVICE_ATTR(hwfifo_watermark, 0444, static IIO_DEVICE_ATTR(hwfifo_watermark, 0444,
adxl367_get_fifo_watermark, NULL, 0); adxl367_get_fifo_watermark, NULL, 0);
static IIO_DEVICE_ATTR(hwfifo_enabled, 0444, static IIO_DEVICE_ATTR(hwfifo_enabled, 0444,
adxl367_get_fifo_enabled, NULL, 0); adxl367_get_fifo_enabled, NULL, 0);
static const struct attribute *adxl367_fifo_attributes[] = { static const struct attribute *adxl367_fifo_attributes[] = {
&iio_const_attr_hwfifo_watermark_min.dev_attr.attr, &iio_dev_attr_hwfifo_watermark_min.dev_attr.attr,
&iio_const_attr_hwfifo_watermark_max.dev_attr.attr, &iio_dev_attr_hwfifo_watermark_max.dev_attr.attr,
&iio_dev_attr_hwfifo_watermark.dev_attr.attr, &iio_dev_attr_hwfifo_watermark.dev_attr.attr,
&iio_dev_attr_hwfifo_enabled.dev_attr.attr, &iio_dev_attr_hwfifo_enabled.dev_attr.attr,
NULL, NULL,
......
...@@ -998,17 +998,30 @@ static ssize_t adxl372_get_fifo_watermark(struct device *dev, ...@@ -998,17 +998,30 @@ static ssize_t adxl372_get_fifo_watermark(struct device *dev,
return sprintf(buf, "%d\n", st->watermark); return sprintf(buf, "%d\n", st->watermark);
} }
static IIO_CONST_ATTR(hwfifo_watermark_min, "1"); static ssize_t hwfifo_watermark_min_show(struct device *dev,
static IIO_CONST_ATTR(hwfifo_watermark_max, struct device_attribute *attr,
__stringify(ADXL372_FIFO_SIZE)); char *buf)
{
return sysfs_emit(buf, "%s\n", "1");
}
static ssize_t hwfifo_watermark_max_show(struct device *dev,
struct device_attribute *attr,
char *buf)
{
return sysfs_emit(buf, "%s\n", __stringify(ADXL372_FIFO_SIZE));
}
static IIO_DEVICE_ATTR_RO(hwfifo_watermark_min, 0);
static IIO_DEVICE_ATTR_RO(hwfifo_watermark_max, 0);
static IIO_DEVICE_ATTR(hwfifo_watermark, 0444, static IIO_DEVICE_ATTR(hwfifo_watermark, 0444,
adxl372_get_fifo_watermark, NULL, 0); adxl372_get_fifo_watermark, NULL, 0);
static IIO_DEVICE_ATTR(hwfifo_enabled, 0444, static IIO_DEVICE_ATTR(hwfifo_enabled, 0444,
adxl372_get_fifo_enabled, NULL, 0); adxl372_get_fifo_enabled, NULL, 0);
static const struct attribute *adxl372_fifo_attributes[] = { static const struct attribute *adxl372_fifo_attributes[] = {
&iio_const_attr_hwfifo_watermark_min.dev_attr.attr, &iio_dev_attr_hwfifo_watermark_min.dev_attr.attr,
&iio_const_attr_hwfifo_watermark_max.dev_attr.attr, &iio_dev_attr_hwfifo_watermark_max.dev_attr.attr,
&iio_dev_attr_hwfifo_watermark.dev_attr.attr, &iio_dev_attr_hwfifo_watermark.dev_attr.attr,
&iio_dev_attr_hwfifo_enabled.dev_attr.attr, &iio_dev_attr_hwfifo_enabled.dev_attr.attr,
NULL, NULL,
......
...@@ -925,17 +925,30 @@ static const struct iio_chan_spec_ext_info bmc150_accel_ext_info[] = { ...@@ -925,17 +925,30 @@ static const struct iio_chan_spec_ext_info bmc150_accel_ext_info[] = {
{ } { }
}; };
static IIO_CONST_ATTR(hwfifo_watermark_min, "1"); static ssize_t hwfifo_watermark_min_show(struct device *dev,
static IIO_CONST_ATTR(hwfifo_watermark_max, struct device_attribute *attr,
__stringify(BMC150_ACCEL_FIFO_LENGTH)); char *buf)
{
return sysfs_emit(buf, "%s\n", "1");
}
static ssize_t hwfifo_watermark_max_show(struct device *dev,
struct device_attribute *attr,
char *buf)
{
return sysfs_emit(buf, "%s\n", __stringify(BMC150_ACCEL_FIFO_LENGTH));
}
static IIO_DEVICE_ATTR_RO(hwfifo_watermark_min, 0);
static IIO_DEVICE_ATTR_RO(hwfifo_watermark_max, 0);
static IIO_DEVICE_ATTR(hwfifo_enabled, S_IRUGO, static IIO_DEVICE_ATTR(hwfifo_enabled, S_IRUGO,
bmc150_accel_get_fifo_state, NULL, 0); bmc150_accel_get_fifo_state, NULL, 0);
static IIO_DEVICE_ATTR(hwfifo_watermark, S_IRUGO, static IIO_DEVICE_ATTR(hwfifo_watermark, S_IRUGO,
bmc150_accel_get_fifo_watermark, NULL, 0); bmc150_accel_get_fifo_watermark, NULL, 0);
static const struct attribute *bmc150_accel_fifo_attributes[] = { static const struct attribute *bmc150_accel_fifo_attributes[] = {
&iio_const_attr_hwfifo_watermark_min.dev_attr.attr, &iio_dev_attr_hwfifo_watermark_min.dev_attr.attr,
&iio_const_attr_hwfifo_watermark_max.dev_attr.attr, &iio_dev_attr_hwfifo_watermark_max.dev_attr.attr,
&iio_dev_attr_hwfifo_watermark.dev_attr.attr, &iio_dev_attr_hwfifo_watermark.dev_attr.attr,
&iio_dev_attr_hwfifo_enabled.dev_attr.attr, &iio_dev_attr_hwfifo_enabled.dev_attr.attr,
NULL, NULL,
......
...@@ -2193,17 +2193,30 @@ static ssize_t at91_adc_get_watermark(struct device *dev, ...@@ -2193,17 +2193,30 @@ static ssize_t at91_adc_get_watermark(struct device *dev,
return scnprintf(buf, PAGE_SIZE, "%d\n", st->dma_st.watermark); return scnprintf(buf, PAGE_SIZE, "%d\n", st->dma_st.watermark);
} }
static ssize_t hwfifo_watermark_min_show(struct device *dev,
struct device_attribute *attr,
char *buf)
{
return sysfs_emit(buf, "%s\n", "2");
}
static ssize_t hwfifo_watermark_max_show(struct device *dev,
struct device_attribute *attr,
char *buf)
{
return sysfs_emit(buf, "%s\n", AT91_HWFIFO_MAX_SIZE_STR);
}
static IIO_DEVICE_ATTR(hwfifo_enabled, 0444, static IIO_DEVICE_ATTR(hwfifo_enabled, 0444,
at91_adc_get_fifo_state, NULL, 0); at91_adc_get_fifo_state, NULL, 0);
static IIO_DEVICE_ATTR(hwfifo_watermark, 0444, static IIO_DEVICE_ATTR(hwfifo_watermark, 0444,
at91_adc_get_watermark, NULL, 0); at91_adc_get_watermark, NULL, 0);
static IIO_DEVICE_ATTR_RO(hwfifo_watermark_min, 0);
static IIO_CONST_ATTR(hwfifo_watermark_min, "2"); static IIO_DEVICE_ATTR_RO(hwfifo_watermark_max, 0);
static IIO_CONST_ATTR(hwfifo_watermark_max, AT91_HWFIFO_MAX_SIZE_STR);
static const struct attribute *at91_adc_fifo_attributes[] = { static const struct attribute *at91_adc_fifo_attributes[] = {
&iio_const_attr_hwfifo_watermark_min.dev_attr.attr, &iio_dev_attr_hwfifo_watermark_min.dev_attr.attr,
&iio_const_attr_hwfifo_watermark_max.dev_attr.attr, &iio_dev_attr_hwfifo_watermark_max.dev_attr.attr,
&iio_dev_attr_hwfifo_watermark.dev_attr.attr, &iio_dev_attr_hwfifo_watermark.dev_attr.attr,
&iio_dev_attr_hwfifo_enabled.dev_attr.attr, &iio_dev_attr_hwfifo_enabled.dev_attr.attr,
NULL, NULL,
......
...@@ -55,8 +55,9 @@ ...@@ -55,8 +55,9 @@
/* Internal voltage reference in mV */ /* Internal voltage reference in mV */
#define MCP3911_INT_VREF_MV 1200 #define MCP3911_INT_VREF_MV 1200
#define MCP3911_REG_READ(reg, id) ((((reg) << 1) | ((id) << 5) | (1 << 0)) & 0xff) #define MCP3911_REG_READ(reg, id) ((((reg) << 1) | ((id) << 6) | (1 << 0)) & 0xff)
#define MCP3911_REG_WRITE(reg, id) ((((reg) << 1) | ((id) << 5) | (0 << 0)) & 0xff) #define MCP3911_REG_WRITE(reg, id) ((((reg) << 1) | ((id) << 6) | (0 << 0)) & 0xff)
#define MCP3911_REG_MASK GENMASK(4, 1)
#define MCP3911_NUM_CHANNELS 2 #define MCP3911_NUM_CHANNELS 2
...@@ -89,8 +90,8 @@ static int mcp3911_read(struct mcp3911 *adc, u8 reg, u32 *val, u8 len) ...@@ -89,8 +90,8 @@ static int mcp3911_read(struct mcp3911 *adc, u8 reg, u32 *val, u8 len)
be32_to_cpus(val); be32_to_cpus(val);
*val >>= ((4 - len) * 8); *val >>= ((4 - len) * 8);
dev_dbg(&adc->spi->dev, "reading 0x%x from register 0x%x\n", *val, dev_dbg(&adc->spi->dev, "reading 0x%x from register 0x%lx\n", *val,
reg >> 1); FIELD_GET(MCP3911_REG_MASK, reg));
return ret; return ret;
} }
...@@ -248,7 +249,7 @@ static int mcp3911_write_raw(struct iio_dev *indio_dev, ...@@ -248,7 +249,7 @@ static int mcp3911_write_raw(struct iio_dev *indio_dev,
break; break;
case IIO_CHAN_INFO_OVERSAMPLING_RATIO: case IIO_CHAN_INFO_OVERSAMPLING_RATIO:
for (int i = 0; i < sizeof(mcp3911_osr_table); i++) { for (int i = 0; i < ARRAY_SIZE(mcp3911_osr_table); i++) {
if (val == mcp3911_osr_table[i]) { if (val == mcp3911_osr_table[i]) {
val = FIELD_PREP(MCP3911_CONFIG_OSR, i); val = FIELD_PREP(MCP3911_CONFIG_OSR, i);
ret = mcp3911_update(adc, MCP3911_REG_CONFIG, MCP3911_CONFIG_OSR, ret = mcp3911_update(adc, MCP3911_REG_CONFIG, MCP3911_CONFIG_OSR,
...@@ -496,7 +497,7 @@ static int mcp3911_probe(struct spi_device *spi) ...@@ -496,7 +497,7 @@ static int mcp3911_probe(struct spi_device *spi)
indio_dev->name, indio_dev->name,
iio_device_id(indio_dev)); iio_device_id(indio_dev));
if (!adc->trig) if (!adc->trig)
return PTR_ERR(adc->trig); return -ENOMEM;
adc->trig->ops = &mcp3911_trigger_ops; adc->trig->ops = &mcp3911_trigger_ops;
iio_trigger_set_drvdata(adc->trig, adc); iio_trigger_set_drvdata(adc->trig, adc);
......
...@@ -2086,18 +2086,19 @@ static int stm32_adc_generic_chan_init(struct iio_dev *indio_dev, ...@@ -2086,18 +2086,19 @@ static int stm32_adc_generic_chan_init(struct iio_dev *indio_dev,
stm32_adc_chan_init_one(indio_dev, &channels[scan_index], val, stm32_adc_chan_init_one(indio_dev, &channels[scan_index], val,
vin[1], scan_index, differential); vin[1], scan_index, differential);
val = 0;
ret = fwnode_property_read_u32(child, "st,min-sample-time-ns", &val); ret = fwnode_property_read_u32(child, "st,min-sample-time-ns", &val);
/* st,min-sample-time-ns is optional */ /* st,min-sample-time-ns is optional */
if (!ret) { if (ret && ret != -EINVAL) {
stm32_adc_smpr_init(adc, channels[scan_index].channel, val);
if (differential)
stm32_adc_smpr_init(adc, vin[1], val);
} else if (ret != -EINVAL) {
dev_err(&indio_dev->dev, "Invalid st,min-sample-time-ns property %d\n", dev_err(&indio_dev->dev, "Invalid st,min-sample-time-ns property %d\n",
ret); ret);
goto err; goto err;
} }
stm32_adc_smpr_init(adc, channels[scan_index].channel, val);
if (differential)
stm32_adc_smpr_init(adc, vin[1], val);
scan_index++; scan_index++;
} }
......
...@@ -858,7 +858,7 @@ static int tsl2583_probe(struct i2c_client *clientp, ...@@ -858,7 +858,7 @@ static int tsl2583_probe(struct i2c_client *clientp,
TSL2583_POWER_OFF_DELAY_MS); TSL2583_POWER_OFF_DELAY_MS);
pm_runtime_use_autosuspend(&clientp->dev); pm_runtime_use_autosuspend(&clientp->dev);
ret = devm_iio_device_register(indio_dev->dev.parent, indio_dev); ret = iio_device_register(indio_dev);
if (ret) { if (ret) {
dev_err(&clientp->dev, "%s: iio registration failed\n", dev_err(&clientp->dev, "%s: iio registration failed\n",
__func__); __func__);
......
...@@ -1385,13 +1385,6 @@ static int ltc2983_setup(struct ltc2983_data *st, bool assign_iio) ...@@ -1385,13 +1385,6 @@ static int ltc2983_setup(struct ltc2983_data *st, bool assign_iio)
return ret; return ret;
} }
st->iio_chan = devm_kzalloc(&st->spi->dev,
st->iio_channels * sizeof(*st->iio_chan),
GFP_KERNEL);
if (!st->iio_chan)
return -ENOMEM;
ret = regmap_update_bits(st->regmap, LTC2983_GLOBAL_CONFIG_REG, ret = regmap_update_bits(st->regmap, LTC2983_GLOBAL_CONFIG_REG,
LTC2983_NOTCH_FREQ_MASK, LTC2983_NOTCH_FREQ_MASK,
LTC2983_NOTCH_FREQ(st->filter_notch_freq)); LTC2983_NOTCH_FREQ(st->filter_notch_freq));
...@@ -1514,6 +1507,12 @@ static int ltc2983_probe(struct spi_device *spi) ...@@ -1514,6 +1507,12 @@ static int ltc2983_probe(struct spi_device *spi)
gpiod_set_value_cansleep(gpio, 0); gpiod_set_value_cansleep(gpio, 0);
} }
st->iio_chan = devm_kzalloc(&spi->dev,
st->iio_channels * sizeof(*st->iio_chan),
GFP_KERNEL);
if (!st->iio_chan)
return -ENOMEM;
ret = ltc2983_setup(st, true); ret = ltc2983_setup(st, true);
if (ret) if (ret)
return ret; return ret;
......
...@@ -152,7 +152,7 @@ static int gru_assign_asid(struct gru_state *gru) ...@@ -152,7 +152,7 @@ static int gru_assign_asid(struct gru_state *gru)
* Optionally, build an array of chars that contain the bit numbers allocated. * Optionally, build an array of chars that contain the bit numbers allocated.
*/ */
static unsigned long reserve_resources(unsigned long *p, int n, int mmax, static unsigned long reserve_resources(unsigned long *p, int n, int mmax,
char *idx) signed char *idx)
{ {
unsigned long bits = 0; unsigned long bits = 0;
int i; int i;
...@@ -170,14 +170,14 @@ static unsigned long reserve_resources(unsigned long *p, int n, int mmax, ...@@ -170,14 +170,14 @@ static unsigned long reserve_resources(unsigned long *p, int n, int mmax,
} }
unsigned long gru_reserve_cb_resources(struct gru_state *gru, int cbr_au_count, unsigned long gru_reserve_cb_resources(struct gru_state *gru, int cbr_au_count,
char *cbmap) signed char *cbmap)
{ {
return reserve_resources(&gru->gs_cbr_map, cbr_au_count, GRU_CBR_AU, return reserve_resources(&gru->gs_cbr_map, cbr_au_count, GRU_CBR_AU,
cbmap); cbmap);
} }
unsigned long gru_reserve_ds_resources(struct gru_state *gru, int dsr_au_count, unsigned long gru_reserve_ds_resources(struct gru_state *gru, int dsr_au_count,
char *dsmap) signed char *dsmap)
{ {
return reserve_resources(&gru->gs_dsr_map, dsr_au_count, GRU_DSR_AU, return reserve_resources(&gru->gs_dsr_map, dsr_au_count, GRU_DSR_AU,
dsmap); dsmap);
......
...@@ -351,7 +351,7 @@ struct gru_thread_state { ...@@ -351,7 +351,7 @@ struct gru_thread_state {
pid_t ts_tgid_owner; /* task that is using the pid_t ts_tgid_owner; /* task that is using the
context - for migration */ context - for migration */
short ts_user_blade_id;/* user selected blade */ short ts_user_blade_id;/* user selected blade */
char ts_user_chiplet_id;/* user selected chiplet */ signed char ts_user_chiplet_id;/* user selected chiplet */
unsigned short ts_sizeavail; /* Pagesizes in use */ unsigned short ts_sizeavail; /* Pagesizes in use */
int ts_tsid; /* thread that owns the int ts_tsid; /* thread that owns the
structure */ structure */
...@@ -364,11 +364,11 @@ struct gru_thread_state { ...@@ -364,11 +364,11 @@ struct gru_thread_state {
required for contest */ required for contest */
unsigned char ts_cbr_au_count;/* Number of CBR resources unsigned char ts_cbr_au_count;/* Number of CBR resources
required for contest */ required for contest */
char ts_cch_req_slice;/* CCH packet slice */ signed char ts_cch_req_slice;/* CCH packet slice */
char ts_blade; /* If >= 0, migrate context if signed char ts_blade; /* If >= 0, migrate context if
ref from different blade */ ref from different blade */
char ts_force_cch_reload; signed char ts_force_cch_reload;
char ts_cbr_idx[GRU_CBR_AU];/* CBR numbers of each signed char ts_cbr_idx[GRU_CBR_AU];/* CBR numbers of each
allocated CB */ allocated CB */
int ts_data_valid; /* Indicates if ts_gdata has int ts_data_valid; /* Indicates if ts_gdata has
valid data */ valid data */
...@@ -643,9 +643,9 @@ extern struct gru_thread_state *gru_alloc_gts(struct vm_area_struct *vma, ...@@ -643,9 +643,9 @@ extern struct gru_thread_state *gru_alloc_gts(struct vm_area_struct *vma,
int cbr_au_count, int dsr_au_count, int cbr_au_count, int dsr_au_count,
unsigned char tlb_preload_count, int options, int tsid); unsigned char tlb_preload_count, int options, int tsid);
extern unsigned long gru_reserve_cb_resources(struct gru_state *gru, extern unsigned long gru_reserve_cb_resources(struct gru_state *gru,
int cbr_au_count, char *cbmap); int cbr_au_count, signed char *cbmap);
extern unsigned long gru_reserve_ds_resources(struct gru_state *gru, extern unsigned long gru_reserve_ds_resources(struct gru_state *gru,
int dsr_au_count, char *dsmap); int dsr_au_count, signed char *dsmap);
extern vm_fault_t gru_fault(struct vm_fault *vmf); extern vm_fault_t gru_fault(struct vm_fault *vmf);
extern struct gru_mm_struct *gru_register_mmu_notifier(void); extern struct gru_mm_struct *gru_register_mmu_notifier(void);
extern void gru_drop_mmu_notifier(struct gru_mm_struct *gms); extern void gru_drop_mmu_notifier(struct gru_mm_struct *gms);
......
...@@ -542,11 +542,10 @@ struct counter_array { ...@@ -542,11 +542,10 @@ struct counter_array {
#define DEFINE_COUNTER_ARRAY_CAPTURE(_name, _length) \ #define DEFINE_COUNTER_ARRAY_CAPTURE(_name, _length) \
DEFINE_COUNTER_ARRAY_U64(_name, _length) DEFINE_COUNTER_ARRAY_U64(_name, _length)
#define DEFINE_COUNTER_ARRAY_POLARITY(_name, _enums, _length) \ #define DEFINE_COUNTER_ARRAY_POLARITY(_name, _available, _length) \
DEFINE_COUNTER_AVAILABLE(_name##_available, _enums); \
struct counter_array _name = { \ struct counter_array _name = { \
.type = COUNTER_COMP_SIGNAL_POLARITY, \ .type = COUNTER_COMP_SIGNAL_POLARITY, \
.avail = &(_name##_available), \ .avail = &(_available), \
.length = (_length), \ .length = (_length), \
} }
......
...@@ -547,6 +547,10 @@ static int calc_digits(int num) ...@@ -547,6 +547,10 @@ static int calc_digits(int num)
{ {
int count = 0; int count = 0;
/* It takes a digit to represent zero */
if (!num)
return 1;
while (num != 0) { while (num != 0) {
num /= 10; num /= 10;
count++; count++;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment