cafe_ccic slowness in VIDIOC_S_FMT
Mitch Bradley
wmb at laptop.org
Sun Jul 8 14:53:51 EDT 2007
In the OFW CaFe camera driver's I2C code, there is a 1 ms delay after
observing that one of bits 18,17,16 is set in the RAW IRQ Status
Register (offset 0x28). Additionally, in the case of an I2C write,
there is another 2 ms delay before beginning to pool those bits.
I don't know how Lilian derived those delay values.
In the 1 ms case, there is a comment that says "20 usec delay". It is
possible that 20 uS would be enough; the API that this code was written
to only goes down to millisecond granularity.
David Woodhouse wrote:
> On Sun, 2007-07-08 at 06:01 -0600, Jonathan Corbet wrote:
>
>> Trying to make this better was already on my list. The problem is that
>> the Cafe i2c has to be treated *really* gently or you start getting
>> those nifty "write timed out" problems. But there is almost certainly
>> room for improvement, it's just a matter of working out what the minimum
>> delays are. I'll try to get to it once I'm back home.
>>
>
> Do we have a coherent explanation of these problems in the datasheet
> and/or errata? Are they planned to be fixed in a future version of the
> CAFÉ?
>
> The majority of the problem in this case is the scheduler -- just
> changing from msleep(2) to mdelay(2) reduces the time taken for ov7670
> init by an order of magnitude (~377 ticks to ~32). Going to mdelay(1)
> halves it again, but that 1ms is about as low as we can go -- poll for
> completion any sooner than that, and something strange happens. We need
> to hook that up to an analyser and work out _what_ is happening, unless
> we've already done so.
>
> I've committed this...
>
> commit 4ef53002bc09fef121bf3ec2d2faaafc2d6edb85
> Author: David Woodhouse <dwmw2 at infradead.org>
> Date: Sun Jul 8 14:39:12 2007 -0400
>
> [CAFÉ CCIC] Use mdelay() instead of msleep() for smbus write
>
> If we msleep we lose about two timeslices for every write and the
> camera init takes 4 seconds or so. It really doesn't take long; for now
> just wait for it.
>
> Signed-off-by: David Woodhouse <dwmw2 at infradead.org>
>
> diff --git a/drivers/media/video/cafe_ccic.c b/drivers/media/video/cafe_ccic.c
> index c08f650..8648785 100644
> --- a/drivers/media/video/cafe_ccic.c
> +++ b/drivers/media/video/cafe_ccic.c
> @@ -369,10 +369,13 @@ static int cafe_smbus_write_data(struct cafe_camera *cam,
> rval = value | ((command << TWSIC1_ADDR_SHIFT) & TWSIC1_ADDR);
> cafe_reg_write(cam, REG_TWSIC1, rval);
> spin_unlock_irqrestore(&cam->dev_lock, flags);
> - msleep(2); /* Required or things flake */
> + mdelay(2); /* It'll probably take about 900µs anyway, and the
> + CAFÉ is apparently quite sensitive to being poked
> + at this point. If we can work out precisely what's
> + going on and reduce this delay, it would be nice. */
>
> wait_event_timeout(cam->smbus_wait, cafe_smbus_write_done(cam),
> - CAFE_SMBUS_TIMEOUT);
> + CAFE_SMBUS_TIMEOUT);
> spin_lock_irqsave(&cam->dev_lock, flags);
> rval = cafe_reg_read(cam, REG_TWSIC1);
> spin_unlock_irqrestore(&cam->dev_lock, flags);
>
>
>
More information about the Devel
mailing list