From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
To: Zubair Lutfullah <zubair.lutfullah@gmail.com>
Cc: jic23@cam.ac.uk, lee.jones@linaro.org, linux-iio@vger.kernel.org,
linux-input@vger.kernel.org, linux-kernel@vger.kernel.org,
gregkh@linuxfoundation.org
Subject: Re: [PATCH 2/2] iio: ti_am335x_adc: Add continuous sampling support
Date: Wed, 28 Aug 2013 15:01:24 +0200 [thread overview]
Message-ID: <20130828130124.GC14111@linutronix.de> (raw)
In-Reply-To: <1377470724-15710-3-git-send-email-zubair.lutfullah@gmail.com>
* Zubair Lutfullah | 2013-08-25 23:45:24 [+0100]:
I am mostly happy with it. There are just two things I pointed out.
Besides that, it looks good from my side.
>diff --git a/drivers/iio/adc/ti_am335x_adc.c b/drivers/iio/adc/ti_am335x_a=
dc.c
>index a952538..ae2202b 100644
>--- a/drivers/iio/adc/ti_am335x_adc.c
>+++ b/drivers/iio/adc/ti_am335x_adc.c
>@@ -85,7 +96,175 @@ static void tiadc_step_config(struct tiadc_device *adc=
_dev)
> adc_dev->channel_step[i] =3D steps;
> steps++;
> }
>+}
>+
>+static irqreturn_t tiadc_irq(int irq, void *private)
>+{
>+ struct iio_dev *indio_dev =3D private;
>+ struct tiadc_device *adc_dev =3D iio_priv(indio_dev);
>+ unsigned int status, config;
>+ status =3D tiadc_readl(adc_dev, REG_IRQSTATUS);
>+
>+ /*
>+ * ADC and touchscreen share the IRQ line.
>+ * FIFO0 interrupts are used by TSC. Handle FIFO1 IRQs here only
>+ */
>+ if (status & IRQENB_FIFO1OVRRUN) {
>+ /* FIFO Overrun. Clear flag. Disable/Enable ADC to recover */
>+ config =3D tiadc_readl(adc_dev, REG_CTRL);
>+ config &=3D ~(CNTRLREG_TSCSSENB);
>+ tiadc_writel(adc_dev, REG_CTRL, config);
>+ tiadc_writel(adc_dev, REG_IRQSTATUS, IRQENB_FIFO1OVRRUN
>+ | IRQENB_FIFO1UNDRFLW | IRQENB_FIFO1THRES);
>+ tiadc_writel(adc_dev, REG_CTRL, (config | CNTRLREG_TSCSSENB));
>+ } else if (status & IRQENB_FIFO1THRES) {
>+ /* Trigger to push FIFO data to iio buffer */
>+ tiadc_writel(adc_dev, REG_IRQCLR, IRQENB_FIFO1THRES);
>+ iio_trigger_poll(indio_dev->trig, iio_get_time_ns());
>+ } else
>+ return IRQ_NONE;
>+
>+ /* If any IRQ flags left, return none. So TSC can handle its IRQs */
>+ status =3D tiadc_readl(adc_dev, REG_IRQSTATUS);
>+ if (status =3D=3D false)
>+ return IRQ_HANDLED;
>+ else
>+ return IRQ_NONE;
As I said in 1/2 of this series, you shouldn't do this. Both handlers of a
shared line are invoked once an interrupt is detected.
=E2=80=A6
>+static int tiadc_buffer_postenable(struct iio_dev *indio_dev)
>+{
>+ struct tiadc_device *adc_dev =3D iio_priv(indio_dev);
>+ struct iio_buffer *buffer =3D indio_dev->buffer;
>+ unsigned int enb =3D 0, stepnum;
>+ u8 bit;
>+
>+ adc_dev->data =3D kmalloc(indio_dev->scan_bytes, GFP_KERNEL);
>+ if (adc_dev->data =3D=3D NULL)
>+ return -ENOMEM;
>+
>+ tiadc_step_config(indio_dev);
>+ for_each_set_bit(bit, buffer->scan_mask,
>+ adc_dev->channels) {
>+ struct iio_chan_spec const *chan =3D indio_dev->channels + bit;
>+ /*
>+ * There are a total of 16 steps available
>+ * that are shared between ADC and touchscreen.
>+ * We start configuring from step 16 to 0 incase of
>+ * ADC. Hence the relation between input channel
>+ * and step for ADC would be as below.
>+ */
>+ stepnum =3D chan->channel + 9;
>+ enb |=3D (1 << stepnum);
Hmm. This looks odd.
=20
In tiadc_step_config() we do:
| steps =3D TOTAL_STEPS - adc_dev->channels;
|=E2=80=A6
| for (i =3D 0; i < adc_dev->channels; i++) {
| chan =3D adc_dev->channel_line[i];
| tiadc_writel(adc_dev,
| REG_STEPCONFIG(steps),
| stepconfig
| |
| STEPCONFIG_INP(chan));
| tiadc_writel(adc_dev,
| REG_STEPDELAY(steps),
| STEPCONFIG_OPENDLY);
| adc_dev->channel_step[i]
| =3D
| steps;
| steps++;
| }
That means if we have only one channel we enable the last step bit /
topmost that is bit 16. For the "default" four channels we get 0x1e000
as mask which means bit 13 to 16.=20
If you do have only one channel with the number 4 you then
get_adc_step_mask() will compute the correct step mask but here enable
step 14 instead of step 16.
What about the following as replacement?
index 08681d3..3bfcf1b 100644
--- a/drivers/iio/adc/ti_am335x_adc.c
+++ b/drivers/iio/adc/ti_am335x_adc.c
@@ -65,6 +65,11 @@ static u32 get_adc_step_mask(struct tiadc_device *adc_de=
v)
return step_en;
}
=20
+static u32 get_adc_step_bit(struct tiadc_device *adc_dev, int chan)
+{
+ return 1 << adc_dev->channel_step[chan];
+}
+
static void tiadc_step_config(struct iio_dev *indio_dev)
{
struct tiadc_device *adc_dev =3D iio_priv(indio_dev);
@@ -179,7 +187,7 @@ static int tiadc_buffer_postenable(struct iio_dev *indi=
o_dev)
{
struct tiadc_device *adc_dev =3D iio_priv(indio_dev);
struct iio_buffer *buffer =3D indio_dev->buffer;
- unsigned int enb =3D 0, stepnum;
+ unsigned int enb =3D 0;
u8 bit;
=20
adc_dev->data =3D kmalloc(indio_dev->scan_bytes, GFP_KERNEL);
@@ -187,19 +195,8 @@ static int tiadc_buffer_postenable(struct iio_dev *ind=
io_dev)
return -ENOMEM;
=20
tiadc_step_config(indio_dev);
- for_each_set_bit(bit, buffer->scan_mask,
- adc_dev->channels) {
- struct iio_chan_spec const *chan =3D indio_dev->channels + bit;
- /*
- * There are a total of 16 steps available
- * that are shared between ADC and touchscreen.
- * We start configuring from step 16 to 0 incase of
- * ADC. Hence the relation between input channel
- * and step for ADC would be as below.
- */
- stepnum =3D chan->channel + 9;
- enb |=3D (1 << stepnum);
- }
+ for_each_set_bit(bit, buffer->scan_mask, adc_dev->channels)
+ enb |=3D get_adc_step_bit(adc_dev, bit);
=20
adc_dev->buffer_en_ch_steps =3D enb;
am335x_tsc_se_set(adc_dev->mfd_tscadc, enb);
Would it work? This is untested but it could work :)
Sebastian
next prev parent reply other threads:[~2013-08-28 13:01 UTC|newest]
Thread overview: 40+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-08-25 22:45 [PATCH V6 0/2] iio: input: ti_am335x_adc: Add continuous sampling support Zubair Lutfullah
2013-08-25 22:45 ` [PATCH 1/2] input: ti_am335x_tsc: Enable shared IRQ for TSC Zubair Lutfullah
2013-08-28 10:42 ` Sebastian Andrzej Siewior
2013-08-28 18:49 ` Zubair Lutfullah :
2013-08-25 22:45 ` [PATCH 2/2] iio: ti_am335x_adc: Add continuous sampling support Zubair Lutfullah
2013-08-27 8:42 ` Lee Jones
2013-08-28 10:31 ` [PATCH] iio: am335x-iio-adc: select triggered buffer Sebastian Andrzej Siewior
2013-08-28 18:32 ` Zubair Lutfullah :
2013-08-28 13:01 ` Sebastian Andrzej Siewior [this message]
2013-08-28 18:43 ` [PATCH 2/2] iio: ti_am335x_adc: Add continuous sampling support Zubair Lutfullah :
2013-08-29 7:49 ` Sebastian Andrzej Siewior
2013-08-28 14:18 ` Sebastian Andrzej Siewior
2013-08-28 18:22 ` Zubair Lutfullah :
2013-08-28 18:38 ` Sebastian Andrzej Siewior
2013-08-28 18:55 ` Zubair Lutfullah :
2013-08-28 16:43 ` Sebastian Andrzej Siewior
2013-08-28 18:19 ` Zubair Lutfullah :
2013-08-28 18:35 ` Sebastian Andrzej Siewior
2013-08-28 18:59 ` Zubair Lutfullah :
2013-08-29 7:56 ` Sebastian Andrzej Siewior
-- strict thread matches above, loose matches on Subject: below --
2013-09-01 11:07 [PATCH V7 0/2] iio: input: ti_am335x_tscadc: Add continuous sampling support to adc Zubair Lutfullah
2013-09-01 11:07 ` [PATCH 2/2] iio: ti_am335x_adc: Add continuous sampling support Zubair Lutfullah
2013-09-01 11:17 [PATCH V8 0/2] iio: input: ti_am335x_tscadc: Add continuous sampling support to adc Zubair Lutfullah
2013-09-01 11:17 ` [PATCH 2/2] iio: ti_am335x_adc: Add continuous sampling support Zubair Lutfullah
2013-09-08 13:42 ` Jonathan Cameron
2013-09-11 16:02 ` Zubair Lutfullah :
2013-09-17 4:44 [PATCH V9 0/2] iio: input: " Zubair Lutfullah
2013-09-17 4:44 ` [PATCH 2/2] iio: " Zubair Lutfullah
2013-09-18 4:27 ` Dmitry Torokhov
2013-09-18 6:54 ` Zubair Lutfullah :
2013-09-18 9:39 ` Jonathan Cameron
2013-09-18 11:25 ` Zubair Lutfullah :
2013-09-18 14:15 ` Dmitry Torokhov
2013-09-18 16:12 ` Jonathan Cameron
2013-09-18 16:24 ` Dmitry Torokhov
2013-09-18 17:05 ` Jonathan Cameron
2013-09-19 5:16 ` Zubair Lutfullah :
2013-09-19 5:33 ` Jonathan Cameron
2013-09-18 11:23 [PATCH V10 0/2] iio: input: " Zubair Lutfullah
2013-09-18 11:23 ` [PATCH 2/2] iio: " Zubair Lutfullah
2013-09-18 13:58 ` Jonathan Cameron
2013-09-19 5:24 ` Zubair Lutfullah :
2013-09-19 5:41 ` Jonathan Cameron
2013-09-19 5:55 ` Zubair Lutfullah :
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20130828130124.GC14111@linutronix.de \
--to=bigeasy@linutronix.de \
--cc=gregkh@linuxfoundation.org \
--cc=jic23@cam.ac.uk \
--cc=lee.jones@linaro.org \
--cc=linux-iio@vger.kernel.org \
--cc=linux-input@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=zubair.lutfullah@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).