Commit d87f5e90 authored by H Hartley Sweeten's avatar H Hartley Sweeten Committed by Greg Kroah-Hartman

staging: comedi: ni_tio: validate clock source

Refactor the functions that determine the clock source bits so that they
return -EINVAL if the clock source is invalid. Pass the errno back to
ni_tio_insn_config().
Signed-off-by: default avatarH Hartley Sweeten <hsweeten@visionengravers.com>
Reviewed-by: default avatarIan Abbott <abbotti@mev.co.uk>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent a19b9b47
...@@ -608,7 +608,7 @@ int ni_tio_arm(struct ni_gpct *counter, bool arm, unsigned int start_trigger) ...@@ -608,7 +608,7 @@ int ni_tio_arm(struct ni_gpct *counter, bool arm, unsigned int start_trigger)
} }
EXPORT_SYMBOL_GPL(ni_tio_arm); EXPORT_SYMBOL_GPL(ni_tio_arm);
static unsigned int ni_660x_clk_src(unsigned int clock_source) static int ni_660x_clk_src(unsigned int clock_source, unsigned int *bits)
{ {
unsigned int clk_src = clock_source & NI_GPCT_CLOCK_SRC_SELECT_MASK; unsigned int clk_src = clock_source & NI_GPCT_CLOCK_SRC_SELECT_MASK;
unsigned int ni_660x_clock; unsigned int ni_660x_clock;
...@@ -653,14 +653,13 @@ static unsigned int ni_660x_clk_src(unsigned int clock_source) ...@@ -653,14 +653,13 @@ static unsigned int ni_660x_clk_src(unsigned int clock_source)
} }
if (i <= NI_660X_MAX_SRC_PIN) if (i <= NI_660X_MAX_SRC_PIN)
break; break;
ni_660x_clock = 0; return -EINVAL;
BUG();
break;
} }
return GI_SRC_SEL(ni_660x_clock); *bits = GI_SRC_SEL(ni_660x_clock);
return 0;
} }
static unsigned int ni_m_clk_src(unsigned int clock_source) static int ni_m_clk_src(unsigned int clock_source, unsigned int *bits)
{ {
unsigned int clk_src = clock_source & NI_GPCT_CLOCK_SRC_SELECT_MASK; unsigned int clk_src = clock_source & NI_GPCT_CLOCK_SRC_SELECT_MASK;
unsigned int ni_m_series_clock; unsigned int ni_m_series_clock;
...@@ -711,13 +710,10 @@ static unsigned int ni_m_clk_src(unsigned int clock_source) ...@@ -711,13 +710,10 @@ static unsigned int ni_m_clk_src(unsigned int clock_source)
} }
if (i <= NI_M_MAX_PFI_CHAN) if (i <= NI_M_MAX_PFI_CHAN)
break; break;
pr_err("invalid clock source 0x%lx\n", return -EINVAL;
(unsigned long)clock_source);
BUG();
ni_m_series_clock = 0;
break;
} }
return GI_SRC_SEL(ni_m_series_clock); *bits = GI_SRC_SEL(ni_m_series_clock);
return 0;
}; };
static void ni_tio_set_source_subselect(struct ni_gpct *counter, static void ni_tio_set_source_subselect(struct ni_gpct *counter,
...@@ -755,18 +751,26 @@ static int ni_tio_set_clock_src(struct ni_gpct *counter, ...@@ -755,18 +751,26 @@ static int ni_tio_set_clock_src(struct ni_gpct *counter,
struct ni_gpct_device *counter_dev = counter->counter_dev; struct ni_gpct_device *counter_dev = counter->counter_dev;
unsigned int cidx = counter->counter_index; unsigned int cidx = counter->counter_index;
unsigned int bits = 0; unsigned int bits = 0;
int ret;
/* FIXME: validate clock source */
switch (counter_dev->variant) { switch (counter_dev->variant) {
case ni_gpct_variant_660x: case ni_gpct_variant_660x:
bits |= ni_660x_clk_src(clock_source); ret = ni_660x_clk_src(clock_source, &bits);
break; break;
case ni_gpct_variant_e_series: case ni_gpct_variant_e_series:
case ni_gpct_variant_m_series: case ni_gpct_variant_m_series:
default: default:
bits |= ni_m_clk_src(clock_source); ret = ni_m_clk_src(clock_source, &bits);
break; break;
} }
if (ret) {
struct comedi_device *dev = counter_dev->dev;
dev_err(dev->class_dev, "invalid clock source 0x%x\n",
clock_source);
return ret;
}
if (clock_source & NI_GPCT_INVERT_CLOCK_SRC_BIT) if (clock_source & NI_GPCT_INVERT_CLOCK_SRC_BIT)
bits |= GI_SRC_POL_INVERT; bits |= GI_SRC_POL_INVERT;
ni_tio_set_bits(counter, NITIO_INPUT_SEL_REG(cidx), ni_tio_set_bits(counter, NITIO_INPUT_SEL_REG(cidx),
......
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