Re: [PATCH] media/at91sam9x5-video: new driver for the high end overlay on at91sam9x5

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hello Sylwester,

On Sun, Jul 03, 2011 at 05:29:25PM +0200, Sylwester Nawrocki wrote:
> On 07/02/2011 10:09 PM, Uwe Kleine-König wrote:
> >>> +	if (rect->left<   0)
> >>> +		hwxpos = 0;
> >>> +	else
> >>> +		hwxpos = rect->left;
> >>
> >> Could be rewritten as:
> >>
> >> 	hwxpos = rect->left<  0 ? 0 : rect->left;
> > could even be rewritten as
> > 
> > 	hwxpos = max(rect->left, 0);
> 
> ok, I give up, couldn't make it any simpler;)
:-)

> >>> +static void at91sam9x5_video_vb_wait_prepare(struct vb2_queue *q)
> >>> +{
> >>> +	struct at91sam9x5_video_priv *priv =
> >>> +		container_of(q, struct at91sam9x5_video_priv, queue);
> >>> +	unsigned long flags;
> >>> +
> >>> +	debug("cfgupdate=%d hwstate=%d cfgstate=%d\n",
> >>> +			priv->cfgupdate, priv->hwstate, priv->cfgstate);
> >>> +	debug("bufs=%p,%p\n", priv->cur.vb, priv->next.vb);
> >>> +	spin_lock_irqsave(&priv->lock, flags);
> >>> +
> >>> +	at91sam9x5_video_handle_irqstat(priv);
> >>> +
> >>> +	at91sam9x5_video_write32(priv, REG_HEOIER,
> >>> +			REG_HEOIxR_ADD | REG_HEOIxR_DMA |
> >>> +			REG_HEOIxR_UADD | REG_HEOIxR_UDMA |
> >>> +			REG_HEOIxR_VADD | REG_HEOIxR_VDMA);
> >>
> >> What the above two calls are intended to be doing ?
> >
> > handle_irqstat handles the eventual pending irqs. The second call
> > enables irqs for "frame done" (..._DMA) and "new descriptor loaded"
> > (..._ADD).
> 
> OK, so it looks to me like irqs are unmasked in wait_prepare and masked
> back in wait_finish. I would try to move this logic to start_streaming and
> the interrupt handler.
The upside of my approach is that if the driver always has two buffers
it never needs to interrupt the cpu and so improves overall system
performance.

> It seems this way too much dependant on when wait_prepare/wait_finish are
> called by videobuf2. AFAIK those callbacks are not called in non-blocking
> mode.
Even when I don't enable irqs I give buffers back in the
at91sam9x5_video_handle_irqstat routine.
 
> >>> +const struct vb2_ops at91sam9x5_video_vb_ops = {
> >>> +	.queue_setup = at91sam9x5_video_vb_queue_setup,
> >>> +
> >>> +	.wait_prepare = at91sam9x5_video_vb_wait_prepare,
> >>> +	.wait_finish = at91sam9x5_video_vb_wait_finish,
> >>
> >> These 2 functions are intended to unlock and lock respectively the mutex
> >> that is used to serialize ioctl handlers, in particular DQBUF.
> >> I'm not sure if you're doing the right thing in
> >> at91sam9x5_video_vb_wait_prepare/at91sam9x5_video_vb_wait_finish.
> > I'm not taking a mutex for sure.
> 
> All right, so this needs to be changed. If you decide to add a file
> operations mutex and protect each file operation individually in the driver,
> rather than assigning a pointer to such mutex to struct video_device::lock
> and let the core serialize file ops, then wait_prepare/wait_finish
> could be omitted.
I didn't notice there is a lock member in struct video_device. I'll take
a look to benefit from it.
 
> >>> +
> >>> +	.buf_prepare = at91sam9x5_video_vb_buf_prepare,
> >>> +	.buf_queue = at91sam9x5_video_vb_buf_queue,
> >>> +};
> 
> Also if your driver is supposed to support write() method,
> vidioc_streamon/vidioc_streamoff should be just a pass-through for
> vb2_streamon/vb2_streamoff and the hardware control should happen in
> start_streaming, stop_streaming callbacks.
> 
> I can't see a stop_streaming callback in your vb2 operations set.
> It's been made mandatory recently, thus it would be good to add it.
The logic is in at91sam9x5_video_vb_buf_queue because I can enable the
channel only with a buffer at hand.
 
> >>> +
> >>> +static int at91sam9x5_video_vidioc_querycap(struct file *filp,
> >>> +		void *fh, struct v4l2_capability *cap)
> >>> +{
> >>> +	strcpy(cap->driver, DRIVER_NAME);
> 
> I would go for a strlcpy here, better to be safe than sorry. ;-)
Right.
 
> >>> +	cap->capabilities = V4L2_CAP_VIDEO_OUTPUT | V4L2_CAP_STREAMING |
> >>> +		V4L2_CAP_VIDEO_OVERLAY;
> >>> +
> >>> +	/* XXX */
> >>> +	cap->version = 0;
> >>
> >> There is no need to set this field any more. It will be overwritten
> >> with kernel versions in __video_do_ioctl(). See this for more details:
> >> http://git.linuxtv.org/media_tree.git?a=commit;h=33436a81b0d4d1036ffcf0edb7e3bfa65d18ad08
> > I saw the discussion on the ML, but missed that it was already
> > committed.
> > 
> >>> +	cap->card[0] = '\0';
> >>> +	cap->bus_info[0] = '\0';
> > I assume I need to fill these with more sensible values?
> 
> I think bus_info is not very useful for this driver and can be left as is.
> As for cap->card, I'm not sure. Some drivers just just fill it in with
> a video node name (/dev/video*), some are more creative.
> Here is what the V4L2 specifications says:
> http://linuxtv.org/downloads/v4l-dvb-apis/vidioc-querycap.html

Thanks
Uwe

-- 
Pengutronix e.K.                           | Uwe Kleine-König            |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux