mirror of
				git://git.openwrt.org/openwrt/openwrt.git
				synced 2025-10-31 05:54:26 -04:00 
			
		
		
		
	Also removes random module and switches to new bcm2711 thermal driver. Boot tested on RPi 4B v1.1 4G. Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
		
			
				
	
	
		
			97 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			97 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| From 1decb017f990ea61ab421e316bf1af3a5199b73a Mon Sep 17 00:00:00 2001
 | |
| From: Jernej Skrabec <jernej.skrabec@siol.net>
 | |
| Date: Fri, 11 Oct 2019 06:32:43 -0300
 | |
| Subject: [PATCH] media: v4l2-mem2mem: add stateless_(try_)decoder_cmd
 | |
|  ioctl helpers
 | |
| 
 | |
| Commit bef41d93aac64b54c3008ca6170bec54f85784f5 upstream.
 | |
| 
 | |
| These helpers are used by stateless codecs when they support multiple
 | |
| slices per frame and hold capture buffer flag is set. It's expected that
 | |
| all such codecs will use this code.
 | |
| 
 | |
| Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
 | |
| Co-developed-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
 | |
| Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
 | |
| Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
 | |
| ---
 | |
|  drivers/media/v4l2-core/v4l2-mem2mem.c | 53 ++++++++++++++++++++++++++
 | |
|  include/media/v4l2-mem2mem.h           |  4 ++
 | |
|  2 files changed, 57 insertions(+)
 | |
| 
 | |
| --- a/drivers/media/v4l2-core/v4l2-mem2mem.c
 | |
| +++ b/drivers/media/v4l2-core/v4l2-mem2mem.c
 | |
| @@ -1218,6 +1218,59 @@ int v4l2_m2m_ioctl_try_decoder_cmd(struc
 | |
|  }
 | |
|  EXPORT_SYMBOL_GPL(v4l2_m2m_ioctl_try_decoder_cmd);
 | |
|  
 | |
| +int v4l2_m2m_ioctl_stateless_try_decoder_cmd(struct file *file, void *fh,
 | |
| +					     struct v4l2_decoder_cmd *dc)
 | |
| +{
 | |
| +	if (dc->cmd != V4L2_DEC_CMD_FLUSH)
 | |
| +		return -EINVAL;
 | |
| +
 | |
| +	dc->flags = 0;
 | |
| +
 | |
| +	return 0;
 | |
| +}
 | |
| +EXPORT_SYMBOL_GPL(v4l2_m2m_ioctl_stateless_try_decoder_cmd);
 | |
| +
 | |
| +int v4l2_m2m_ioctl_stateless_decoder_cmd(struct file *file, void *priv,
 | |
| +					 struct v4l2_decoder_cmd *dc)
 | |
| +{
 | |
| +	struct v4l2_fh *fh = file->private_data;
 | |
| +	struct vb2_v4l2_buffer *out_vb, *cap_vb;
 | |
| +	struct v4l2_m2m_dev *m2m_dev = fh->m2m_ctx->m2m_dev;
 | |
| +	unsigned long flags;
 | |
| +	int ret;
 | |
| +
 | |
| +	ret = v4l2_m2m_ioctl_stateless_try_decoder_cmd(file, priv, dc);
 | |
| +	if (ret < 0)
 | |
| +		return ret;
 | |
| +
 | |
| +	spin_lock_irqsave(&m2m_dev->job_spinlock, flags);
 | |
| +	out_vb = v4l2_m2m_last_src_buf(fh->m2m_ctx);
 | |
| +	cap_vb = v4l2_m2m_last_dst_buf(fh->m2m_ctx);
 | |
| +
 | |
| +	/*
 | |
| +	 * If there is an out buffer pending, then clear any HOLD flag.
 | |
| +	 *
 | |
| +	 * By clearing this flag we ensure that when this output
 | |
| +	 * buffer is processed any held capture buffer will be released.
 | |
| +	 */
 | |
| +	if (out_vb) {
 | |
| +		out_vb->flags &= ~V4L2_BUF_FLAG_M2M_HOLD_CAPTURE_BUF;
 | |
| +	} else if (cap_vb && cap_vb->is_held) {
 | |
| +		/*
 | |
| +		 * If there were no output buffers, but there is a
 | |
| +		 * capture buffer that is held, then release that
 | |
| +		 * buffer.
 | |
| +		 */
 | |
| +		cap_vb->is_held = false;
 | |
| +		v4l2_m2m_dst_buf_remove(fh->m2m_ctx);
 | |
| +		v4l2_m2m_buf_done(cap_vb, VB2_BUF_STATE_DONE);
 | |
| +	}
 | |
| +	spin_unlock_irqrestore(&m2m_dev->job_spinlock, flags);
 | |
| +
 | |
| +	return 0;
 | |
| +}
 | |
| +EXPORT_SYMBOL_GPL(v4l2_m2m_ioctl_stateless_decoder_cmd);
 | |
| +
 | |
|  /*
 | |
|   * v4l2_file_operations helpers. It is assumed here same lock is used
 | |
|   * for the output and the capture buffer queue.
 | |
| --- a/include/media/v4l2-mem2mem.h
 | |
| +++ b/include/media/v4l2-mem2mem.h
 | |
| @@ -701,6 +701,10 @@ int v4l2_m2m_ioctl_try_encoder_cmd(struc
 | |
|  				   struct v4l2_encoder_cmd *ec);
 | |
|  int v4l2_m2m_ioctl_try_decoder_cmd(struct file *file, void *fh,
 | |
|  				   struct v4l2_decoder_cmd *dc);
 | |
| +int v4l2_m2m_ioctl_stateless_try_decoder_cmd(struct file *file, void *fh,
 | |
| +					     struct v4l2_decoder_cmd *dc);
 | |
| +int v4l2_m2m_ioctl_stateless_decoder_cmd(struct file *file, void *priv,
 | |
| +					 struct v4l2_decoder_cmd *dc);
 | |
|  int v4l2_m2m_fop_mmap(struct file *file, struct vm_area_struct *vma);
 | |
|  __poll_t v4l2_m2m_fop_poll(struct file *file, poll_table *wait);
 | |
|  
 |