On 06/11/2013 10:44 PM, Guenter Roeck wrote: > On Tue, Jun 11, 2013 at 08:55:06PM +0100, Jonathan Cameron wrote: >> On 06/10/2013 04:42 PM, Sebastian Andrzej Siewior wrote: >>> On the am335x I export ADC channels indexed by their number as specified >>> in the datasheet. The channels are shared between the TSC & ADC and be >>> used either by TSC or the ADC. So it is possible that the TSC uses >>> chanels 0 & 1 and the ADC is using channels 2 & 3. The total number of >>> channles of the ADC is 2 but the individual numbers are 2 and 3. >>> This patch changes the check for the the requesting channel by walking >>> over the list and comparing the channel number. >>> >> This doesn't work in general. The index is not the same as channel >> (or any other form of index present). Note that modified channels may >> all have channel set to 0 (accel_x, accel_y etc for instance). >> >> The index refers directly into those channels registered. >> Is it possible for channels to move at runtime between the two units? >> I would imagine not as this is very much a case of wiring. >> >> Thus we have a fairly messy bit if interdependence in the device >> tree but it should work. >> >> I don't actually have much / any real experience of device tree configurations >> and this is Guenter's code, hence I have cc'd him. >> >> Note that it is acceptable and relatively common to have missing >> values in scan_index but that isn't really relevant here. >> >> Jonathan >>> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@xxxxxxxxxxxxx> >>> --- >>> drivers/iio/inkern.c | 13 ++++++------- >>> 1 file changed, 6 insertions(+), 7 deletions(-) >>> >>> diff --git a/drivers/iio/inkern.c b/drivers/iio/inkern.c >>> index dca4eed..1a40077 100644 >>> --- a/drivers/iio/inkern.c >>> +++ b/drivers/iio/inkern.c >>> @@ -107,6 +107,7 @@ static int __of_iio_channel_get(struct iio_channel *channel, >>> struct iio_dev *indio_dev; >>> int err; >>> struct of_phandle_args iiospec; >>> + int i; >>> >>> err = of_parse_phandle_with_args(np, "io-channels", >>> "#io-channel-cells", >>> @@ -123,15 +124,13 @@ static int __of_iio_channel_get(struct iio_channel *channel, >>> indio_dev = dev_to_iio_dev(idev); >>> channel->indio_dev = indio_dev; >>> index = iiospec.args_count ? iiospec.args[0] : 0; >>> - if (index >= indio_dev->num_channels) { >>> - err = -EINVAL; >>> - goto err_put; >>> + for (i = 0; i < indio_dev->num_channels; i++) { >>> + if (indio_dev->channels[i].channel == index) { >>> + channel->channel = &indio_dev->channels[i]; >>> + return 0; >>> + } >>> } > > Too long ago since I looked into that, but this code changes the API > from "get nth channel" to "channel with channel index n". > Not really sure I understand why that should be necessary. > yea, this will definitively not work channels of different types will usually have the same channel numbers. -- To unsubscribe from this list: send the line "unsubscribe linux-iio" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html