Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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: H Hartley Sweeten <hsweeten@visionengravers.com>
Reviewed-by: Ian Abbott <abbotti@mev.co.uk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

authored by

H Hartley Sweeten and committed by
Greg Kroah-Hartman
d87f5e90 a19b9b47

+19 -15
+19 -15
drivers/staging/comedi/drivers/ni_tio.c
··· 608 608 } 609 609 EXPORT_SYMBOL_GPL(ni_tio_arm); 610 610 611 - static unsigned int ni_660x_clk_src(unsigned int clock_source) 611 + static int ni_660x_clk_src(unsigned int clock_source, unsigned int *bits) 612 612 { 613 613 unsigned int clk_src = clock_source & NI_GPCT_CLOCK_SRC_SELECT_MASK; 614 614 unsigned int ni_660x_clock; ··· 653 653 } 654 654 if (i <= NI_660X_MAX_SRC_PIN) 655 655 break; 656 - ni_660x_clock = 0; 657 - BUG(); 658 - break; 656 + return -EINVAL; 659 657 } 660 - return GI_SRC_SEL(ni_660x_clock); 658 + *bits = GI_SRC_SEL(ni_660x_clock); 659 + return 0; 661 660 } 662 661 663 - static unsigned int ni_m_clk_src(unsigned int clock_source) 662 + static int ni_m_clk_src(unsigned int clock_source, unsigned int *bits) 664 663 { 665 664 unsigned int clk_src = clock_source & NI_GPCT_CLOCK_SRC_SELECT_MASK; 666 665 unsigned int ni_m_series_clock; ··· 710 711 } 711 712 if (i <= NI_M_MAX_PFI_CHAN) 712 713 break; 713 - pr_err("invalid clock source 0x%lx\n", 714 - (unsigned long)clock_source); 715 - BUG(); 716 - ni_m_series_clock = 0; 717 - break; 714 + return -EINVAL; 718 715 } 719 - return GI_SRC_SEL(ni_m_series_clock); 716 + *bits = GI_SRC_SEL(ni_m_series_clock); 717 + return 0; 720 718 }; 721 719 722 720 static void ni_tio_set_source_subselect(struct ni_gpct *counter, ··· 751 755 struct ni_gpct_device *counter_dev = counter->counter_dev; 752 756 unsigned int cidx = counter->counter_index; 753 757 unsigned int bits = 0; 758 + int ret; 754 759 755 - /* FIXME: validate clock source */ 756 760 switch (counter_dev->variant) { 757 761 case ni_gpct_variant_660x: 758 - bits |= ni_660x_clk_src(clock_source); 762 + ret = ni_660x_clk_src(clock_source, &bits); 759 763 break; 760 764 case ni_gpct_variant_e_series: 761 765 case ni_gpct_variant_m_series: 762 766 default: 763 - bits |= ni_m_clk_src(clock_source); 767 + ret = ni_m_clk_src(clock_source, &bits); 764 768 break; 765 769 } 770 + if (ret) { 771 + struct comedi_device *dev = counter_dev->dev; 772 + 773 + dev_err(dev->class_dev, "invalid clock source 0x%x\n", 774 + clock_source); 775 + return ret; 776 + } 777 + 766 778 if (clock_source & NI_GPCT_INVERT_CLOCK_SRC_BIT) 767 779 bits |= GI_SRC_POL_INVERT; 768 780 ni_tio_set_bits(counter, NITIO_INPUT_SEL_REG(cidx),