Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1157615

[PATCH 4.0 032/148] iio: adc: cc10001: Fix the channel number mapping

From Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Newsgroups linux.kernel
Subject [PATCH 4.0 032/148] iio: adc: cc10001: Fix the channel number mapping
Date 2015-06-03 15:00 +0200
Message-ID <pxgr3-1sR-83@gated-at.bofh.it> (permalink)
References <pxfOh-E4-3@gated-at.bofh.it>
Organization linux.* mail to news gateway

Show all headers | View raw


4.0-stable review patch.  If anyone has any objections, please let me know.

------------------

From: Naidu Tellapati <naidu.tellapati@imgtec.com>

commit 13415a998adb1802b5bd6bd5a336331589e866a1 upstream.

When some of the ADC channels are reserved for remote CPUs,
the scan index and the corresponding channel number doesn't
match. This leads to convesion on the incorrect channel during
triggered capture.

Fix this by using a scan index to channel mapping encoded
in the iio_chan_spec for this purpose while starting conversion
on a particular ADC channel in trigger handler.

Also, the channel_map is not really used anywhere but in probe(), so
no need to keep track of it. Remove it from device structure.

While here, add 1 to number of channels to register timestamp channel
with the IIO core.

Fixes: 1664f6a5b0c8 ("iio: adc: Cosmic Circuits 10001 ADC driver")
Signed-off-by: Naidu Tellapati <naidu.tellapati@imgtec.com>
Signed-off-by: Ezequiel Garcia <ezequiel.garcia@imgtec.com>
Signed-off-by: Jonathan Cameron <jic23@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

---
 drivers/iio/adc/cc10001_adc.c |   24 +++++++++++++-----------
 1 file changed, 13 insertions(+), 11 deletions(-)

--- a/drivers/iio/adc/cc10001_adc.c
+++ b/drivers/iio/adc/cc10001_adc.c
@@ -62,7 +62,6 @@ struct cc10001_adc_device {
 	u16 *buf;
 
 	struct mutex lock;
-	unsigned long channel_map;
 	unsigned int start_delay_ns;
 	unsigned int eoc_delay_ns;
 };
@@ -129,6 +128,7 @@ static irqreturn_t cc10001_adc_trigger_h
 	struct iio_dev *indio_dev;
 	unsigned int delay_ns;
 	unsigned int channel;
+	unsigned int scan_idx;
 	bool sample_invalid;
 	u16 *data;
 	int i;
@@ -150,9 +150,10 @@ static irqreturn_t cc10001_adc_trigger_h
 
 	i = 0;
 	sample_invalid = false;
-	for_each_set_bit(channel, indio_dev->active_scan_mask,
+	for_each_set_bit(scan_idx, indio_dev->active_scan_mask,
 				  indio_dev->masklength) {
 
+		channel = indio_dev->channels[scan_idx].channel;
 		cc10001_adc_start(adc_dev, channel);
 
 		data[i] = cc10001_adc_poll_done(indio_dev, channel, delay_ns);
@@ -255,22 +256,22 @@ static const struct iio_info cc10001_adc
 	.update_scan_mode = &cc10001_update_scan_mode,
 };
 
-static int cc10001_adc_channel_init(struct iio_dev *indio_dev)
+static int cc10001_adc_channel_init(struct iio_dev *indio_dev,
+				    unsigned long channel_map)
 {
-	struct cc10001_adc_device *adc_dev = iio_priv(indio_dev);
 	struct iio_chan_spec *chan_array, *timestamp;
 	unsigned int bit, idx = 0;
 
-	indio_dev->num_channels = bitmap_weight(&adc_dev->channel_map,
-						CC10001_ADC_NUM_CHANNELS);
+	indio_dev->num_channels = bitmap_weight(&channel_map,
+						CC10001_ADC_NUM_CHANNELS) + 1;
 
-	chan_array = devm_kcalloc(&indio_dev->dev, indio_dev->num_channels + 1,
+	chan_array = devm_kcalloc(&indio_dev->dev, indio_dev->num_channels,
 				  sizeof(struct iio_chan_spec),
 				  GFP_KERNEL);
 	if (!chan_array)
 		return -ENOMEM;
 
-	for_each_set_bit(bit, &adc_dev->channel_map, CC10001_ADC_NUM_CHANNELS) {
+	for_each_set_bit(bit, &channel_map, CC10001_ADC_NUM_CHANNELS) {
 		struct iio_chan_spec *chan = &chan_array[idx];
 
 		chan->type = IIO_VOLTAGE;
@@ -305,6 +306,7 @@ static int cc10001_adc_probe(struct plat
 	unsigned long adc_clk_rate;
 	struct resource *res;
 	struct iio_dev *indio_dev;
+	unsigned long channel_map;
 	int ret;
 
 	indio_dev = devm_iio_device_alloc(&pdev->dev, sizeof(*adc_dev));
@@ -313,9 +315,9 @@ static int cc10001_adc_probe(struct plat
 
 	adc_dev = iio_priv(indio_dev);
 
-	adc_dev->channel_map = GENMASK(CC10001_ADC_NUM_CHANNELS - 1, 0);
+	channel_map = GENMASK(CC10001_ADC_NUM_CHANNELS - 1, 0);
 	if (!of_property_read_u32(node, "adc-reserved-channels", &ret))
-		adc_dev->channel_map &= ~ret;
+		channel_map &= ~ret;
 
 	adc_dev->reg = devm_regulator_get(&pdev->dev, "vref");
 	if (IS_ERR(adc_dev->reg))
@@ -361,7 +363,7 @@ static int cc10001_adc_probe(struct plat
 	adc_dev->start_delay_ns = adc_dev->eoc_delay_ns * CC10001_WAIT_CYCLES;
 
 	/* Setup the ADC channels available on the device */
-	ret = cc10001_adc_channel_init(indio_dev);
+	ret = cc10001_adc_channel_init(indio_dev, channel_map);
 	if (ret < 0)
 		goto err_disable_clk;
 


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Back to linux.kernel | Previous | NextPrevious in thread | Next in thread | Find similar | Unroll thread


Thread

[PATCH 4.0 000/148] 4.0.5-stable review Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2015-06-03 15:00 +0200
  [PATCH 4.0 021/148] mfd: da9052: Fix broken regulator probe Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2015-06-03 15:00 +0200
  [PATCH 4.0 061/148] ASoC: wm8994: correct BCLK DIV 348 to 384 Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2015-06-03 15:00 +0200
  [PATCH 4.0 026/148] hwmon: (ntc_thermistor) Ensure iio channel is of type IIO_VOLTAGE Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2015-06-03 15:00 +0200
  [PATCH 4.0 048/148] module: Call module notifier on failure after complete_formation() Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2015-06-03 15:00 +0200
  [PATCH 4.0 053/148] ALSA: hda/realtek - ALC292 dock fix for Thinkpad L450 Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2015-06-03 15:00 +0200
  [PATCH 4.0 046/148] lib: Fix strnlen_user() to not touch memory after specified maximum Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2015-06-03 15:00 +0200
  [PATCH 4.0 065/148] staging: vt6655: device_free_tx_buf use only ieee80211_tx_status_irqsafe Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2015-06-03 15:00 +0200
  [PATCH 4.0 008/148] KVM: MMU: fix CR4.SMEP=1, CR0.WP=0 with shadow pages Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2015-06-03 15:00 +0200
  [PATCH 4.0 033/148] iio: adc: cc10001: Fix incorrect use of power-up/power-down register Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2015-06-03 15:00 +0200
  [PATCH 4.0 034/148] iio: adc: cc10001: Add delay before setting START bit Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2015-06-03 15:00 +0200
  [PATCH 4.0 040/148] hwmon: (tmp401) Do not auto-detect chip on I2C address 0x37 Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2015-06-03 15:00 +0200
  [PATCH 4.0 049/148] ALSA: usb-audio: Add quirk for MS LifeCam Studio Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2015-06-03 15:00 +0200
  [PATCH 4.0 009/148] KVM: MMU: fix smap permission check Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2015-06-03 15:00 +0200
  [PATCH 4.0 023/148] Revert "libceph: clear r_req_lru_item in __unregister_linger_request()" Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2015-06-03 15:00 +0200
  [PATCH 4.0 050/148] ALSA: hda - Add Conexant codecs CX20721, CX20722, CX20723 and CX20724 Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2015-06-03 15:00 +0200
  [PATCH 4.0 045/148] brcmfmac: avoid null pointer access when brcmf_msgbuf_get_pktid() fails Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2015-06-03 15:00 +0200
  [PATCH 4.0 035/148] iio: adc: cc10001: Fix regulator_get_voltage() return value check Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2015-06-03 15:00 +0200
  [PATCH 4.0 060/148] ASoC: wm8960: fix "RINPUT3" audio route error Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2015-06-03 15:00 +0200
  [PATCH 4.0 022/148] libceph: request a new osdmap if lingering request maps to no osd Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2015-06-03 15:00 +0200
  [PATCH 4.0 025/148] xen/events: dont bind non-percpu VIRQs with percpu chip Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2015-06-03 15:00 +0200
  [PATCH 4.0 004/148] iommu/arm-smmu: Fix sign-extension of upstream bus addresses at stage 1 Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2015-06-03 15:00 +0200
  [PATCH 4.0 057/148] ASoC: mc13783: Fix wrong mask value used in mc13xxx_reg_rmw() calls Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2015-06-03 15:00 +0200
  [PATCH 4.0 024/148] Btrfs: fix racy system chunk allocation when setting block group ro Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2015-06-03 15:00 +0200
  [PATCH 4.0 051/148] ALSA: hda - Add headphone quirk for Lifebook E752 Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2015-06-03 15:00 +0200
  [PATCH 4.0 007/148] x86/fpu: Disable XSAVES* support for now Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2015-06-03 15:00 +0200
  [PATCH 4.0 064/148] staging: vt6656: use ieee80211_tx_info to select packet type. Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2015-06-03 15:00 +0200
  [PATCH 4.0 056/148] ALSA: hda - Fix noise on AMD radeon 290x controller Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2015-06-03 15:00 +0200
  [PATCH 4.0 003/148] iommu/amd: Fix bug in put_pasid_state_wait Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2015-06-03 15:00 +0200
  [PATCH 4.0 032/148] iio: adc: cc10001: Fix the channel number mapping Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2015-06-03 15:00 +0200
  [PATCH 4.0 015/148] omfs: fix sign confusion for bitmap loop counter Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2015-06-03 15:10 +0200
  [PATCH 4.0 018/148] lguest: fix out-by-one error in address checking. Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2015-06-03 15:10 +0200
  [PATCH 4.0 002/148] fs_pin: Allow for the possibility that m_list or s_list go unused. Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2015-06-03 15:10 +0200
  [PATCH 4.0 016/148] xfs: xfs_attr_inactive leaves inconsistent attr fork state behind Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2015-06-03 15:10 +0200
  [PATCH 4.0 014/148] fs, omfs: add NULL terminator in the end up the token list Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2015-06-03 15:10 +0200
  [PATCH 4.0 017/148] xfs: xfs_iozero can return positive errno Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2015-06-03 15:10 +0200
  [PATCH 4.0 019/148] ovl: dont remove non-empty opaque directory Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2015-06-03 15:10 +0200
  Re: [PATCH 4.0 000/148] 4.0.5-stable review Shuah Khan <shuahkh@osg.samsung.com> - 2015-06-03 19:00 +0200

csiph-web