Merge branch 'for_3.8-rc1' into v4l_for_linus
* for_3.8-rc1: (243 commits) [media] omap3isp: Replace cpu_is_omap3630() with ISP revision check [media] omap3isp: Prepare/unprepare clocks before/after enable/disable [media] omap3isp: preview: Add support for 8-bit formats at the sink pad [media] omap3isp: Replace printk with dev_* [media] omap3isp: Find source pad from external entity [media] omap3isp: Configure CSI-2 phy based on platform data [media] omap3isp: Add PHY routing configuration [media] omap3isp: Add CSI configuration registers from control block to ISP resources [media] omap3isp: Remove unneeded module memory address definitions [media] omap3isp: Use monotonic timestamps for statistics buffers [media] uvcvideo: Fix control value clamping for unsigned integer controls [media] uvcvideo: Mark first output terminal as default video node [media] uvcvideo: Add VIDIOC_[GS]_PRIORITY support [media] uvcvideo: Return -ENOTTY for unsupported ioctls [media] uvcvideo: Set device_caps in VIDIOC_QUERYCAP [media] uvcvideo: Don't fail when an unsupported format is requested [media] uvcvideo: Return -EACCES when trying to access a read/write-only control [media] uvcvideo: Set error_idx properly for extended controls API failures [media] rtl28xxu: add NOXON DAB/DAB+ USB dongle rev 2 [media] fc2580: write some registers conditionally ...
This commit is contained in:
		
				commit
				
					
						77c53d0b56
					
				
			
		
					 314 changed files with 7781 additions and 1890 deletions
				
			
		|  | @ -2586,6 +2586,13 @@ ioctls.</para> | ||||||
| 	  <para>Vendor and device specific media bus pixel formats. | 	  <para>Vendor and device specific media bus pixel formats. | ||||||
| 	    <xref linkend="v4l2-mbus-vendor-spec-fmts" />.</para> | 	    <xref linkend="v4l2-mbus-vendor-spec-fmts" />.</para> | ||||||
|         </listitem> |         </listitem> | ||||||
|  |         <listitem> | ||||||
|  | 	  <para>Importing DMABUF file descriptors as a new IO method described | ||||||
|  | 	  in <xref linkend="dmabuf" />.</para> | ||||||
|  |         </listitem> | ||||||
|  |         <listitem> | ||||||
|  | 	  <para>Exporting DMABUF files using &VIDIOC-EXPBUF; ioctl.</para> | ||||||
|  |         </listitem> | ||||||
|       </itemizedlist> |       </itemizedlist> | ||||||
|     </section> |     </section> | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -331,7 +331,7 @@ application until one or more buffers can be dequeued. By default | ||||||
| outgoing queue. When the <constant>O_NONBLOCK</constant> flag was | outgoing queue. When the <constant>O_NONBLOCK</constant> flag was | ||||||
| given to the &func-open; function, <constant>VIDIOC_DQBUF</constant> | given to the &func-open; function, <constant>VIDIOC_DQBUF</constant> | ||||||
| returns immediately with an &EAGAIN; when no buffer is available. The | returns immediately with an &EAGAIN; when no buffer is available. The | ||||||
| &func-select; or &func-poll; function are always available.</para> | &func-select; or &func-poll; functions are always available.</para> | ||||||
| 
 | 
 | ||||||
|     <para>To start and stop capturing or output applications call the |     <para>To start and stop capturing or output applications call the | ||||||
| &VIDIOC-STREAMON; and &VIDIOC-STREAMOFF; ioctl. Note | &VIDIOC-STREAMON; and &VIDIOC-STREAMOFF; ioctl. Note | ||||||
|  | @ -472,6 +472,165 @@ rest should be evident.</para> | ||||||
|       </footnote></para> |       </footnote></para> | ||||||
|   </section> |   </section> | ||||||
| 
 | 
 | ||||||
|  |   <section id="dmabuf"> | ||||||
|  |     <title>Streaming I/O (DMA buffer importing)</title> | ||||||
|  | 
 | ||||||
|  |     <note> | ||||||
|  |       <title>Experimental</title> | ||||||
|  |       <para>This is an <link linkend="experimental"> experimental </link> | ||||||
|  |       interface and may change in the future.</para> | ||||||
|  |     </note> | ||||||
|  | 
 | ||||||
|  | <para>The DMABUF framework provides a generic method for sharing buffers | ||||||
|  | between multiple devices. Device drivers that support DMABUF can export a DMA | ||||||
|  | buffer to userspace as a file descriptor (known as the exporter role), import a | ||||||
|  | DMA buffer from userspace using a file descriptor previously exported for a | ||||||
|  | different or the same device (known as the importer role), or both. This | ||||||
|  | section describes the DMABUF importer role API in V4L2.</para> | ||||||
|  | 
 | ||||||
|  |     <para>Refer to <link linked="vidioc-expbuf"> DMABUF exporting </link> for | ||||||
|  | details about exporting V4L2 buffers as DMABUF file descriptors.</para> | ||||||
|  | 
 | ||||||
|  | <para>Input and output devices support the streaming I/O method when the | ||||||
|  | <constant>V4L2_CAP_STREAMING</constant> flag in the | ||||||
|  | <structfield>capabilities</structfield> field of &v4l2-capability; returned by | ||||||
|  | the &VIDIOC-QUERYCAP; ioctl is set. Whether importing DMA buffers through | ||||||
|  | DMABUF file descriptors is supported is determined by calling the | ||||||
|  | &VIDIOC-REQBUFS; ioctl with the memory type set to | ||||||
|  | <constant>V4L2_MEMORY_DMABUF</constant>.</para> | ||||||
|  | 
 | ||||||
|  |     <para>This I/O method is dedicated to sharing DMA buffers between different | ||||||
|  | devices, which may be V4L devices or other video-related devices (e.g. DRM). | ||||||
|  | Buffers (planes) are allocated by a driver on behalf of an application. Next, | ||||||
|  | these buffers are exported to the application as file descriptors using an API | ||||||
|  | which is specific for an allocator driver.  Only such file descriptor are | ||||||
|  | exchanged. The descriptors and meta-information are passed in &v4l2-buffer; (or | ||||||
|  | in &v4l2-plane; in the multi-planar API case).  The driver must be switched | ||||||
|  | into DMABUF I/O mode by calling the &VIDIOC-REQBUFS; with the desired buffer | ||||||
|  | type.</para> | ||||||
|  | 
 | ||||||
|  |     <example> | ||||||
|  |       <title>Initiating streaming I/O with DMABUF file descriptors</title> | ||||||
|  | 
 | ||||||
|  |       <programlisting> | ||||||
|  | &v4l2-requestbuffers; reqbuf; | ||||||
|  | 
 | ||||||
|  | memset(&reqbuf, 0, sizeof (reqbuf)); | ||||||
|  | reqbuf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; | ||||||
|  | reqbuf.memory = V4L2_MEMORY_DMABUF; | ||||||
|  | reqbuf.count = 1; | ||||||
|  | 
 | ||||||
|  | if (ioctl(fd, &VIDIOC-REQBUFS;, &reqbuf) == -1) { | ||||||
|  | 	if (errno == EINVAL) | ||||||
|  | 		printf("Video capturing or DMABUF streaming is not supported\n"); | ||||||
|  | 	else | ||||||
|  | 		perror("VIDIOC_REQBUFS"); | ||||||
|  | 
 | ||||||
|  | 	exit(EXIT_FAILURE); | ||||||
|  | } | ||||||
|  |       </programlisting> | ||||||
|  |     </example> | ||||||
|  | 
 | ||||||
|  |     <para>The buffer (plane) file descriptor is passed on the fly with the | ||||||
|  | &VIDIOC-QBUF; ioctl. In case of multiplanar buffers, every plane can be | ||||||
|  | associated with a different DMABUF descriptor. Although buffers are commonly | ||||||
|  | cycled, applications can pass a different DMABUF descriptor at each | ||||||
|  | <constant>VIDIOC_QBUF</constant> call.</para> | ||||||
|  | 
 | ||||||
|  |     <example> | ||||||
|  |       <title>Queueing DMABUF using single plane API</title> | ||||||
|  | 
 | ||||||
|  |       <programlisting> | ||||||
|  | int buffer_queue(int v4lfd, int index, int dmafd) | ||||||
|  | { | ||||||
|  | 	&v4l2-buffer; buf; | ||||||
|  | 
 | ||||||
|  | 	memset(&buf, 0, sizeof buf); | ||||||
|  | 	buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; | ||||||
|  | 	buf.memory = V4L2_MEMORY_DMABUF; | ||||||
|  | 	buf.index = index; | ||||||
|  | 	buf.m.fd = dmafd; | ||||||
|  | 
 | ||||||
|  | 	if (ioctl(v4lfd, &VIDIOC-QBUF;, &buf) == -1) { | ||||||
|  | 		perror("VIDIOC_QBUF"); | ||||||
|  | 		return -1; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  |       </programlisting> | ||||||
|  |     </example> | ||||||
|  | 
 | ||||||
|  |     <example> | ||||||
|  |       <title>Queueing DMABUF using multi plane API</title> | ||||||
|  | 
 | ||||||
|  |       <programlisting> | ||||||
|  | int buffer_queue_mp(int v4lfd, int index, int dmafd[], int n_planes) | ||||||
|  | { | ||||||
|  | 	&v4l2-buffer; buf; | ||||||
|  | 	&v4l2-plane; planes[VIDEO_MAX_PLANES]; | ||||||
|  | 	int i; | ||||||
|  | 
 | ||||||
|  | 	memset(&buf, 0, sizeof buf); | ||||||
|  | 	buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; | ||||||
|  | 	buf.memory = V4L2_MEMORY_DMABUF; | ||||||
|  | 	buf.index = index; | ||||||
|  | 	buf.m.planes = planes; | ||||||
|  | 	buf.length = n_planes; | ||||||
|  | 
 | ||||||
|  | 	memset(&planes, 0, sizeof planes); | ||||||
|  | 
 | ||||||
|  | 	for (i = 0; i < n_planes; ++i) | ||||||
|  | 		buf.m.planes[i].m.fd = dmafd[i]; | ||||||
|  | 
 | ||||||
|  | 	if (ioctl(v4lfd, &VIDIOC-QBUF;, &buf) == -1) { | ||||||
|  | 		perror("VIDIOC_QBUF"); | ||||||
|  | 		return -1; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  |       </programlisting> | ||||||
|  |     </example> | ||||||
|  | 
 | ||||||
|  |     <para>Captured or displayed buffers are dequeued with the | ||||||
|  | &VIDIOC-DQBUF; ioctl. The driver can unlock the buffer at any | ||||||
|  | time between the completion of the DMA and this ioctl. The memory is | ||||||
|  | also unlocked when &VIDIOC-STREAMOFF; is called, &VIDIOC-REQBUFS;, or | ||||||
|  | when the device is closed.</para> | ||||||
|  | 
 | ||||||
|  |     <para>For capturing applications it is customary to enqueue a | ||||||
|  | number of empty buffers, to start capturing and enter the read loop. | ||||||
|  | Here the application waits until a filled buffer can be dequeued, and | ||||||
|  | re-enqueues the buffer when the data is no longer needed. Output | ||||||
|  | applications fill and enqueue buffers, when enough buffers are stacked | ||||||
|  | up output is started. In the write loop, when the application | ||||||
|  | runs out of free buffers it must wait until an empty buffer can be | ||||||
|  | dequeued and reused. Two methods exist to suspend execution of the | ||||||
|  | application until one or more buffers can be dequeued. By default | ||||||
|  | <constant>VIDIOC_DQBUF</constant> blocks when no buffer is in the | ||||||
|  | outgoing queue. When the <constant>O_NONBLOCK</constant> flag was | ||||||
|  | given to the &func-open; function, <constant>VIDIOC_DQBUF</constant> | ||||||
|  | returns immediately with an &EAGAIN; when no buffer is available. The | ||||||
|  | &func-select; and &func-poll; functions are always available.</para> | ||||||
|  | 
 | ||||||
|  |     <para>To start and stop capturing or displaying applications call the | ||||||
|  | &VIDIOC-STREAMON; and &VIDIOC-STREAMOFF; ioctls. Note that | ||||||
|  | <constant>VIDIOC_STREAMOFF</constant> removes all buffers from both queues and | ||||||
|  | unlocks all buffers as a side effect. Since there is no notion of doing | ||||||
|  | anything "now" on a multitasking system, if an application needs to synchronize | ||||||
|  | with another event it should examine the &v4l2-buffer; | ||||||
|  | <structfield>timestamp</structfield> of captured buffers, or set the field | ||||||
|  | before enqueuing buffers for output.</para> | ||||||
|  | 
 | ||||||
|  |     <para>Drivers implementing DMABUF importing I/O must support the | ||||||
|  | <constant>VIDIOC_REQBUFS</constant>, <constant>VIDIOC_QBUF</constant>, | ||||||
|  | <constant>VIDIOC_DQBUF</constant>, <constant>VIDIOC_STREAMON</constant> and | ||||||
|  | <constant>VIDIOC_STREAMOFF</constant> ioctls, and the | ||||||
|  | <function>select()</function> and <function>poll()</function> functions.</para> | ||||||
|  | 
 | ||||||
|  |   </section> | ||||||
|  | 
 | ||||||
|   <section id="async"> |   <section id="async"> | ||||||
|     <title>Asynchronous I/O</title> |     <title>Asynchronous I/O</title> | ||||||
| 
 | 
 | ||||||
|  | @ -672,6 +831,14 @@ memory, set by the application. See <xref linkend="userp" /> for details. | ||||||
| 	    in the <structfield>length</structfield> field of this | 	    in the <structfield>length</structfield> field of this | ||||||
| 	    <structname>v4l2_buffer</structname> structure.</entry> | 	    <structname>v4l2_buffer</structname> structure.</entry> | ||||||
| 	  </row> | 	  </row> | ||||||
|  | 	  <row> | ||||||
|  | 	    <entry></entry> | ||||||
|  | 	    <entry>int</entry> | ||||||
|  | 	    <entry><structfield>fd</structfield></entry> | ||||||
|  | 	    <entry>For the single-plane API and when | ||||||
|  | <structfield>memory</structfield> is <constant>V4L2_MEMORY_DMABUF</constant> this | ||||||
|  | is the file descriptor associated with a DMABUF buffer.</entry> | ||||||
|  | 	  </row> | ||||||
| 	  <row> | 	  <row> | ||||||
| 	    <entry>__u32</entry> | 	    <entry>__u32</entry> | ||||||
| 	    <entry><structfield>length</structfield></entry> | 	    <entry><structfield>length</structfield></entry> | ||||||
|  | @ -743,6 +910,15 @@ should set this to 0.</entry> | ||||||
| 	      pointer to the memory allocated for this plane by an application. | 	      pointer to the memory allocated for this plane by an application. | ||||||
| 	      </entry> | 	      </entry> | ||||||
| 	  </row> | 	  </row> | ||||||
|  | 	  <row> | ||||||
|  | 	    <entry></entry> | ||||||
|  | 	    <entry>int</entry> | ||||||
|  | 	    <entry><structfield>fd</structfield></entry> | ||||||
|  | 	    <entry>When the memory type in the containing &v4l2-buffer; is | ||||||
|  | 		<constant>V4L2_MEMORY_DMABUF</constant>, this is a file | ||||||
|  | 		descriptor associated with a DMABUF buffer, similar to the | ||||||
|  | 		<structfield>fd</structfield> field in &v4l2-buffer;.</entry> | ||||||
|  | 	  </row> | ||||||
| 	  <row> | 	  <row> | ||||||
| 	    <entry>__u32</entry> | 	    <entry>__u32</entry> | ||||||
| 	    <entry><structfield>data_offset</structfield></entry> | 	    <entry><structfield>data_offset</structfield></entry> | ||||||
|  | @ -923,7 +1099,7 @@ application. Drivers set or clear this flag when the | ||||||
| 	  </row> | 	  </row> | ||||||
| 	  <row> | 	  <row> | ||||||
| 	    <entry><constant>V4L2_BUF_FLAG_NO_CACHE_INVALIDATE</constant></entry> | 	    <entry><constant>V4L2_BUF_FLAG_NO_CACHE_INVALIDATE</constant></entry> | ||||||
| 	    <entry>0x0400</entry> | 	    <entry>0x0800</entry> | ||||||
| 	    <entry>Caches do not have to be invalidated for this buffer. | 	    <entry>Caches do not have to be invalidated for this buffer. | ||||||
| Typically applications shall use this flag if the data captured in the buffer | Typically applications shall use this flag if the data captured in the buffer | ||||||
| is not going to be touched by the CPU, instead the buffer will, probably, be | is not going to be touched by the CPU, instead the buffer will, probably, be | ||||||
|  | @ -932,7 +1108,7 @@ passed on to a DMA-capable hardware unit for further processing or output. | ||||||
| 	  </row> | 	  </row> | ||||||
| 	  <row> | 	  <row> | ||||||
| 	    <entry><constant>V4L2_BUF_FLAG_NO_CACHE_CLEAN</constant></entry> | 	    <entry><constant>V4L2_BUF_FLAG_NO_CACHE_CLEAN</constant></entry> | ||||||
| 	    <entry>0x0800</entry> | 	    <entry>0x1000</entry> | ||||||
| 	    <entry>Caches do not have to be cleaned for this buffer. | 	    <entry>Caches do not have to be cleaned for this buffer. | ||||||
| Typically applications shall use this flag for output buffers if the data | Typically applications shall use this flag for output buffers if the data | ||||||
| in this buffer has not been created by the CPU but by some DMA-capable unit, | in this buffer has not been created by the CPU but by some DMA-capable unit, | ||||||
|  | @ -964,6 +1140,12 @@ pointer</link> I/O.</entry> | ||||||
| 	    <entry>3</entry> | 	    <entry>3</entry> | ||||||
| 	    <entry>[to do]</entry> | 	    <entry>[to do]</entry> | ||||||
| 	  </row> | 	  </row> | ||||||
|  | 	  <row> | ||||||
|  | 	    <entry><constant>V4L2_MEMORY_DMABUF</constant></entry> | ||||||
|  | 	    <entry>4</entry> | ||||||
|  | 	    <entry>The buffer is used for <link linkend="dmabuf">DMA shared | ||||||
|  | buffer</link> I/O.</entry> | ||||||
|  | 	  </row> | ||||||
| 	</tbody> | 	</tbody> | ||||||
|       </tgroup> |       </tgroup> | ||||||
|     </table> |     </table> | ||||||
|  |  | ||||||
|  | @ -543,6 +543,7 @@ and discussions on the V4L mailing list.</revremark> | ||||||
|     &sub-enuminput; |     &sub-enuminput; | ||||||
|     &sub-enumoutput; |     &sub-enumoutput; | ||||||
|     &sub-enumstd; |     &sub-enumstd; | ||||||
|  |     &sub-expbuf; | ||||||
|     &sub-g-audio; |     &sub-g-audio; | ||||||
|     &sub-g-audioout; |     &sub-g-audioout; | ||||||
|     &sub-g-crop; |     &sub-g-crop; | ||||||
|  |  | ||||||
|  | @ -6,7 +6,8 @@ | ||||||
| 
 | 
 | ||||||
|   <refnamediv> |   <refnamediv> | ||||||
|     <refname>VIDIOC_CREATE_BUFS</refname> |     <refname>VIDIOC_CREATE_BUFS</refname> | ||||||
|     <refpurpose>Create buffers for Memory Mapped or User Pointer I/O</refpurpose> |     <refpurpose>Create buffers for Memory Mapped or User Pointer or DMA Buffer | ||||||
|  |     I/O</refpurpose> | ||||||
|   </refnamediv> |   </refnamediv> | ||||||
| 
 | 
 | ||||||
|   <refsynopsisdiv> |   <refsynopsisdiv> | ||||||
|  | @ -55,11 +56,11 @@ | ||||||
|     </note> |     </note> | ||||||
| 
 | 
 | ||||||
|     <para>This ioctl is used to create buffers for <link linkend="mmap">memory |     <para>This ioctl is used to create buffers for <link linkend="mmap">memory | ||||||
| mapped</link> or <link linkend="userp">user pointer</link> | mapped</link> or <link linkend="userp">user pointer</link> or <link | ||||||
| I/O. It can be used as an alternative or in addition to the | linkend="dmabuf">DMA buffer</link> I/O. It can be used as an alternative or in | ||||||
| <constant>VIDIOC_REQBUFS</constant> ioctl, when a tighter control over buffers | addition to the <constant>VIDIOC_REQBUFS</constant> ioctl, when a tighter | ||||||
| is required. This ioctl can be called multiple times to create buffers of | control over buffers is required. This ioctl can be called multiple times to | ||||||
| different sizes.</para> | create buffers of different sizes.</para> | ||||||
| 
 | 
 | ||||||
|     <para>To allocate device buffers applications initialize relevant fields of |     <para>To allocate device buffers applications initialize relevant fields of | ||||||
| the <structname>v4l2_create_buffers</structname> structure. They set the | the <structname>v4l2_create_buffers</structname> structure. They set the | ||||||
|  | @ -109,7 +110,8 @@ information.</para> | ||||||
| 	    <entry>__u32</entry> | 	    <entry>__u32</entry> | ||||||
| 	    <entry><structfield>memory</structfield></entry> | 	    <entry><structfield>memory</structfield></entry> | ||||||
| 	    <entry>Applications set this field to | 	    <entry>Applications set this field to | ||||||
| <constant>V4L2_MEMORY_MMAP</constant> or | <constant>V4L2_MEMORY_MMAP</constant>, | ||||||
|  | <constant>V4L2_MEMORY_DMABUF</constant> or | ||||||
| <constant>V4L2_MEMORY_USERPTR</constant>. See <xref linkend="v4l2-memory" | <constant>V4L2_MEMORY_USERPTR</constant>. See <xref linkend="v4l2-memory" | ||||||
| /></entry> | /></entry> | ||||||
| 	  </row> | 	  </row> | ||||||
|  |  | ||||||
							
								
								
									
										212
									
								
								Documentation/DocBook/media/v4l/vidioc-expbuf.xml
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										212
									
								
								Documentation/DocBook/media/v4l/vidioc-expbuf.xml
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,212 @@ | ||||||
|  | <refentry id="vidioc-expbuf"> | ||||||
|  | 
 | ||||||
|  |   <refmeta> | ||||||
|  |     <refentrytitle>ioctl VIDIOC_EXPBUF</refentrytitle> | ||||||
|  |     &manvol; | ||||||
|  |   </refmeta> | ||||||
|  | 
 | ||||||
|  |   <refnamediv> | ||||||
|  |     <refname>VIDIOC_EXPBUF</refname> | ||||||
|  |     <refpurpose>Export a buffer as a DMABUF file descriptor.</refpurpose> | ||||||
|  |   </refnamediv> | ||||||
|  | 
 | ||||||
|  |   <refsynopsisdiv> | ||||||
|  |     <funcsynopsis> | ||||||
|  |       <funcprototype> | ||||||
|  | 	<funcdef>int <function>ioctl</function></funcdef> | ||||||
|  | 	<paramdef>int <parameter>fd</parameter></paramdef> | ||||||
|  | 	<paramdef>int <parameter>request</parameter></paramdef> | ||||||
|  | 	<paramdef>struct v4l2_exportbuffer *<parameter>argp</parameter></paramdef> | ||||||
|  |       </funcprototype> | ||||||
|  |     </funcsynopsis> | ||||||
|  |   </refsynopsisdiv> | ||||||
|  | 
 | ||||||
|  |   <refsect1> | ||||||
|  |     <title>Arguments</title> | ||||||
|  | 
 | ||||||
|  |     <variablelist> | ||||||
|  |       <varlistentry> | ||||||
|  | 	<term><parameter>fd</parameter></term> | ||||||
|  | 	<listitem> | ||||||
|  | 	  <para>&fd;</para> | ||||||
|  | 	</listitem> | ||||||
|  |       </varlistentry> | ||||||
|  |       <varlistentry> | ||||||
|  | 	<term><parameter>request</parameter></term> | ||||||
|  | 	<listitem> | ||||||
|  | 	  <para>VIDIOC_EXPBUF</para> | ||||||
|  | 	</listitem> | ||||||
|  |       </varlistentry> | ||||||
|  |       <varlistentry> | ||||||
|  | 	<term><parameter>argp</parameter></term> | ||||||
|  | 	<listitem> | ||||||
|  | 	  <para></para> | ||||||
|  | 	</listitem> | ||||||
|  |       </varlistentry> | ||||||
|  |     </variablelist> | ||||||
|  |   </refsect1> | ||||||
|  | 
 | ||||||
|  |   <refsect1> | ||||||
|  |     <title>Description</title> | ||||||
|  | 
 | ||||||
|  |     <note> | ||||||
|  |       <title>Experimental</title> | ||||||
|  |       <para>This is an <link linkend="experimental"> experimental </link> | ||||||
|  |       interface and may change in the future.</para> | ||||||
|  |     </note> | ||||||
|  | 
 | ||||||
|  | <para>This ioctl is an extension to the <link linkend="mmap">memory | ||||||
|  | mapping</link> I/O method, therefore it is available only for | ||||||
|  | <constant>V4L2_MEMORY_MMAP</constant> buffers.  It can be used to export a | ||||||
|  | buffer as a DMABUF file at any time after buffers have been allocated with the | ||||||
|  | &VIDIOC-REQBUFS; ioctl.</para> | ||||||
|  | 
 | ||||||
|  | <para> To export a buffer, applications fill &v4l2-exportbuffer;.  The | ||||||
|  | <structfield> type </structfield> field is set to the same buffer type as was | ||||||
|  | previously used with  &v4l2-requestbuffers;<structfield> type </structfield>. | ||||||
|  | Applications must also set the <structfield> index </structfield> field. Valid | ||||||
|  | index numbers range from zero to the number of buffers allocated with | ||||||
|  | &VIDIOC-REQBUFS; (&v4l2-requestbuffers;<structfield> count </structfield>) | ||||||
|  | minus one.  For the multi-planar API, applications set the <structfield> plane | ||||||
|  | </structfield> field to the index of the plane to be exported. Valid planes | ||||||
|  | range from zero to the maximal number of valid planes for the currently active | ||||||
|  | format. For the single-planar API, applications must set <structfield> plane | ||||||
|  | </structfield> to zero.  Additional flags may be posted in the <structfield> | ||||||
|  | flags </structfield> field.  Refer to a manual for open() for details. | ||||||
|  | Currently only O_CLOEXEC is supported.  All other fields must be set to zero. | ||||||
|  | In the case of multi-planar API, every plane is exported separately using | ||||||
|  | multiple <constant> VIDIOC_EXPBUF </constant> calls. </para> | ||||||
|  | 
 | ||||||
|  | <para> After calling <constant>VIDIOC_EXPBUF</constant> the <structfield> fd | ||||||
|  | </structfield> field will be set by a driver.  This is a DMABUF file | ||||||
|  | descriptor. The application may pass it to other DMABUF-aware devices. Refer to | ||||||
|  | <link linkend="dmabuf">DMABUF importing</link> for details about importing | ||||||
|  | DMABUF files into V4L2 nodes. It is recommended to close a DMABUF file when it | ||||||
|  | is no longer used to allow the associated memory to be reclaimed. </para> | ||||||
|  | 
 | ||||||
|  |   </refsect1> | ||||||
|  |   <refsect1> | ||||||
|  |    <section> | ||||||
|  |       <title>Examples</title> | ||||||
|  | 
 | ||||||
|  |       <example> | ||||||
|  | 	<title>Exporting a buffer.</title> | ||||||
|  | 	<programlisting> | ||||||
|  | int buffer_export(int v4lfd, &v4l2-buf-type; bt, int index, int *dmafd) | ||||||
|  | { | ||||||
|  | 	&v4l2-exportbuffer; expbuf; | ||||||
|  | 
 | ||||||
|  | 	memset(&expbuf, 0, sizeof(expbuf)); | ||||||
|  | 	expbuf.type = bt; | ||||||
|  | 	expbuf.index = index; | ||||||
|  | 	if (ioctl(v4lfd, &VIDIOC-EXPBUF;, &expbuf) == -1) { | ||||||
|  | 		perror("VIDIOC_EXPBUF"); | ||||||
|  | 		return -1; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	*dmafd = expbuf.fd; | ||||||
|  | 
 | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  |         </programlisting> | ||||||
|  |       </example> | ||||||
|  | 
 | ||||||
|  |       <example> | ||||||
|  | 	<title>Exporting a buffer using the multi-planar API.</title> | ||||||
|  | 	<programlisting> | ||||||
|  | int buffer_export_mp(int v4lfd, &v4l2-buf-type; bt, int index, | ||||||
|  | 	int dmafd[], int n_planes) | ||||||
|  | { | ||||||
|  | 	int i; | ||||||
|  | 
 | ||||||
|  | 	for (i = 0; i < n_planes; ++i) { | ||||||
|  | 		&v4l2-exportbuffer; expbuf; | ||||||
|  | 
 | ||||||
|  | 		memset(&expbuf, 0, sizeof(expbuf)); | ||||||
|  | 		expbuf.type = bt; | ||||||
|  | 		expbuf.index = index; | ||||||
|  | 		expbuf.plane = i; | ||||||
|  | 		if (ioctl(v4lfd, &VIDIOC-EXPBUF;, &expbuf) == -1) { | ||||||
|  | 			perror("VIDIOC_EXPBUF"); | ||||||
|  | 			while (i) | ||||||
|  | 				close(dmafd[--i]); | ||||||
|  | 			return -1; | ||||||
|  | 		} | ||||||
|  | 		dmafd[i] = expbuf.fd; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  |         </programlisting> | ||||||
|  |       </example> | ||||||
|  |    </section> | ||||||
|  |   </refsect1> | ||||||
|  | 
 | ||||||
|  |   <refsect1> | ||||||
|  |     <table pgwide="1" frame="none" id="v4l2-exportbuffer"> | ||||||
|  |       <title>struct <structname>v4l2_exportbuffer</structname></title> | ||||||
|  |       <tgroup cols="3"> | ||||||
|  | 	&cs-str; | ||||||
|  | 	<tbody valign="top"> | ||||||
|  | 	  <row> | ||||||
|  | 	    <entry>__u32</entry> | ||||||
|  | 	    <entry><structfield>type</structfield></entry> | ||||||
|  | 	    <entry>Type of the buffer, same as &v4l2-format; | ||||||
|  | <structfield>type</structfield> or &v4l2-requestbuffers; | ||||||
|  | <structfield>type</structfield>, set by the application. See <xref | ||||||
|  | linkend="v4l2-buf-type" /></entry> | ||||||
|  | 	  </row> | ||||||
|  | 	  <row> | ||||||
|  | 	    <entry>__u32</entry> | ||||||
|  | 	    <entry><structfield>index</structfield></entry> | ||||||
|  | 	    <entry>Number of the buffer, set by the application. This field is | ||||||
|  | only used for <link linkend="mmap">memory mapping</link> I/O and can range from | ||||||
|  | zero to the number of buffers allocated with the &VIDIOC-REQBUFS; and/or | ||||||
|  | &VIDIOC-CREATE-BUFS; ioctls. </entry> | ||||||
|  | 	  </row> | ||||||
|  | 	  <row> | ||||||
|  | 	    <entry>__u32</entry> | ||||||
|  | 	    <entry><structfield>plane</structfield></entry> | ||||||
|  | 	    <entry>Index of the plane to be exported when using the | ||||||
|  | multi-planar API. Otherwise this value must be set to zero. </entry> | ||||||
|  | 	  </row> | ||||||
|  | 	  <row> | ||||||
|  | 	    <entry>__u32</entry> | ||||||
|  | 	    <entry><structfield>flags</structfield></entry> | ||||||
|  | 	    <entry>Flags for the newly created file, currently only <constant> | ||||||
|  | O_CLOEXEC </constant> is supported, refer to the manual of open() for more | ||||||
|  | details.</entry> | ||||||
|  | 	  </row> | ||||||
|  | 	  <row> | ||||||
|  | 	    <entry>__s32</entry> | ||||||
|  | 	    <entry><structfield>fd</structfield></entry> | ||||||
|  | 	    <entry>The DMABUF file descriptor associated with a buffer. Set by | ||||||
|  | 		the driver.</entry> | ||||||
|  | 	  </row> | ||||||
|  | 	  <row> | ||||||
|  | 	    <entry>__u32</entry> | ||||||
|  | 	    <entry><structfield>reserved[11]</structfield></entry> | ||||||
|  | 	    <entry>Reserved field for future use. Must be set to zero.</entry> | ||||||
|  | 	  </row> | ||||||
|  | 	</tbody> | ||||||
|  |       </tgroup> | ||||||
|  |     </table> | ||||||
|  | 
 | ||||||
|  |   </refsect1> | ||||||
|  | 
 | ||||||
|  |   <refsect1> | ||||||
|  |     &return-value; | ||||||
|  |     <variablelist> | ||||||
|  |       <varlistentry> | ||||||
|  | 	<term><errorcode>EINVAL</errorcode></term> | ||||||
|  | 	<listitem> | ||||||
|  | 	  <para>A queue is not in MMAP mode or DMABUF exporting is not | ||||||
|  | supported or <structfield> flags </structfield> or <structfield> type | ||||||
|  | </structfield> or <structfield> index </structfield> or <structfield> plane | ||||||
|  | </structfield> fields are invalid.</para> | ||||||
|  | 	</listitem> | ||||||
|  |       </varlistentry> | ||||||
|  |     </variablelist> | ||||||
|  |   </refsect1> | ||||||
|  | 
 | ||||||
|  | </refentry> | ||||||
|  | @ -109,6 +109,23 @@ they cannot be swapped out to disk. Buffers remain locked until | ||||||
| dequeued, until the &VIDIOC-STREAMOFF; or &VIDIOC-REQBUFS; ioctl is | dequeued, until the &VIDIOC-STREAMOFF; or &VIDIOC-REQBUFS; ioctl is | ||||||
| called, or until the device is closed.</para> | called, or until the device is closed.</para> | ||||||
| 
 | 
 | ||||||
|  |     <para>To enqueue a <link linkend="dmabuf">DMABUF</link> buffer applications | ||||||
|  | set the <structfield>memory</structfield> field to | ||||||
|  | <constant>V4L2_MEMORY_DMABUF</constant> and the <structfield>m.fd</structfield> | ||||||
|  | field to a file descriptor associated with a DMABUF buffer. When the | ||||||
|  | multi-planar API is used the <structfield>m.fd</structfield> fields of the | ||||||
|  | passed array of &v4l2-plane; have to be used instead. When | ||||||
|  | <constant>VIDIOC_QBUF</constant> is called with a pointer to this structure the | ||||||
|  | driver sets the <constant>V4L2_BUF_FLAG_QUEUED</constant> flag and clears the | ||||||
|  | <constant>V4L2_BUF_FLAG_MAPPED</constant> and | ||||||
|  | <constant>V4L2_BUF_FLAG_DONE</constant> flags in the | ||||||
|  | <structfield>flags</structfield> field, or it returns an error code.  This | ||||||
|  | ioctl locks the buffer. Locking a buffer means passing it to a driver for a | ||||||
|  | hardware access (usually DMA).  If an application accesses (reads/writes) a | ||||||
|  | locked buffer then the result is undefined.  Buffers remain locked until | ||||||
|  | dequeued, until the &VIDIOC-STREAMOFF; or &VIDIOC-REQBUFS; ioctl is called, or | ||||||
|  | until the device is closed.</para> | ||||||
|  | 
 | ||||||
|     <para>Applications call the <constant>VIDIOC_DQBUF</constant> |     <para>Applications call the <constant>VIDIOC_DQBUF</constant> | ||||||
| ioctl to dequeue a filled (capturing) or displayed (output) buffer | ioctl to dequeue a filled (capturing) or displayed (output) buffer | ||||||
| from the driver's outgoing queue. They just set the | from the driver's outgoing queue. They just set the | ||||||
|  |  | ||||||
|  | @ -48,28 +48,30 @@ | ||||||
|   <refsect1> |   <refsect1> | ||||||
|     <title>Description</title> |     <title>Description</title> | ||||||
| 
 | 
 | ||||||
|     <para>This ioctl is used to initiate <link linkend="mmap">memory | <para>This ioctl is used to initiate <link linkend="mmap">memory mapped</link>, | ||||||
| mapped</link> or <link linkend="userp">user pointer</link> | <link linkend="userp">user pointer</link> or <link | ||||||
| I/O. Memory mapped buffers are located in device memory and must be | linkend="dmabuf">DMABUF</link> based I/O.  Memory mapped buffers are located in | ||||||
| allocated with this ioctl before they can be mapped into the | device memory and must be allocated with this ioctl before they can be mapped | ||||||
| application's address space. User buffers are allocated by | into the application's address space. User buffers are allocated by | ||||||
| applications themselves, and this ioctl is merely used to switch the | applications themselves, and this ioctl is merely used to switch the driver | ||||||
| driver into user pointer I/O mode and to setup some internal structures.</para> | into user pointer I/O mode and to setup some internal structures. | ||||||
|  | Similarly, DMABUF buffers are allocated by applications through a device | ||||||
|  | driver, and this ioctl only configures the driver into DMABUF I/O mode without | ||||||
|  | performing any direct allocation.</para> | ||||||
| 
 | 
 | ||||||
|     <para>To allocate device buffers applications initialize all |     <para>To allocate device buffers applications initialize all fields of the | ||||||
| fields of the <structname>v4l2_requestbuffers</structname> structure. | <structname>v4l2_requestbuffers</structname> structure.  They set the | ||||||
| They set the <structfield>type</structfield> field to the respective | <structfield>type</structfield> field to the respective stream or buffer type, | ||||||
| stream or buffer type, the <structfield>count</structfield> field to | the <structfield>count</structfield> field to the desired number of buffers, | ||||||
| the desired number of buffers, <structfield>memory</structfield> | <structfield>memory</structfield> must be set to the requested I/O method and | ||||||
| must be set to the requested I/O method and the <structfield>reserved</structfield> array | the <structfield>reserved</structfield> array must be zeroed. When the ioctl is | ||||||
| must be zeroed. When the ioctl | called with a pointer to this structure the driver will attempt to allocate the | ||||||
| is called with a pointer to this structure the driver will attempt to allocate | requested number of buffers and it stores the actual number allocated in the | ||||||
| the requested number of buffers and it stores the actual number | <structfield>count</structfield> field. It can be smaller than the number | ||||||
| allocated in the <structfield>count</structfield> field. It can be | requested, even zero, when the driver runs out of free memory. A larger number | ||||||
| smaller than the number requested, even zero, when the driver runs out | is also possible when the driver requires more buffers to function correctly. | ||||||
| of free memory. A larger number is also possible when the driver requires | For example video output requires at least two buffers, one displayed and one | ||||||
| more buffers to function correctly. For example video output requires at least two buffers, | filled by the application.</para> | ||||||
| one displayed and one filled by the application.</para> |  | ||||||
|     <para>When the I/O method is not supported the ioctl |     <para>When the I/O method is not supported the ioctl | ||||||
| returns an &EINVAL;.</para> | returns an &EINVAL;.</para> | ||||||
| 
 | 
 | ||||||
|  | @ -102,7 +104,8 @@ as the &v4l2-format; <structfield>type</structfield> field. See <xref | ||||||
| 	    <entry>__u32</entry> | 	    <entry>__u32</entry> | ||||||
| 	    <entry><structfield>memory</structfield></entry> | 	    <entry><structfield>memory</structfield></entry> | ||||||
| 	    <entry>Applications set this field to | 	    <entry>Applications set this field to | ||||||
| <constant>V4L2_MEMORY_MMAP</constant> or | <constant>V4L2_MEMORY_MMAP</constant>, | ||||||
|  | <constant>V4L2_MEMORY_DMABUF</constant> or | ||||||
| <constant>V4L2_MEMORY_USERPTR</constant>. See <xref linkend="v4l2-memory" | <constant>V4L2_MEMORY_USERPTR</constant>. See <xref linkend="v4l2-memory" | ||||||
| />.</entry> | />.</entry> | ||||||
| 	  </row> | 	  </row> | ||||||
|  |  | ||||||
							
								
								
									
										250
									
								
								MAINTAINERS
									
										
									
									
									
								
							
							
						
						
									
										250
									
								
								MAINTAINERS
									
										
									
									
									
								
							|  | @ -337,6 +337,13 @@ W:	http://wireless.kernel.org/ | ||||||
| S:	Orphan | S:	Orphan | ||||||
| F:	drivers/net/wireless/adm8211.* | F:	drivers/net/wireless/adm8211.* | ||||||
| 
 | 
 | ||||||
|  | ADP1653 FLASH CONTROLLER DRIVER | ||||||
|  | M:	Sakari Ailus <sakari.ailus@iki.fi> | ||||||
|  | L:	linux-media@vger.kernel.org | ||||||
|  | S:	Maintained | ||||||
|  | F:	drivers/media/i2c/adp1653.c | ||||||
|  | F:	include/media/adp1653.h | ||||||
|  | 
 | ||||||
| ADP5520 BACKLIGHT DRIVER WITH IO EXPANDER (ADP5520/ADP5501) | ADP5520 BACKLIGHT DRIVER WITH IO EXPANDER (ADP5520/ADP5501) | ||||||
| M:	Michael Hennerich <michael.hennerich@analog.com> | M:	Michael Hennerich <michael.hennerich@analog.com> | ||||||
| L:	device-drivers-devel@blackfin.uclinux.org | L:	device-drivers-devel@blackfin.uclinux.org | ||||||
|  | @ -1488,6 +1495,14 @@ F:	include/linux/ax25.h | ||||||
| F:	include/net/ax25.h | F:	include/net/ax25.h | ||||||
| F:	net/ax25/ | F:	net/ax25/ | ||||||
| 
 | 
 | ||||||
|  | AZ6007 DVB DRIVER | ||||||
|  | M:	Mauro Carvalho Chehab <mchehab@redhat.com> | ||||||
|  | L:	linux-media@vger.kernel.org | ||||||
|  | W:	http://linuxtv.org | ||||||
|  | T:	git git://linuxtv.org/media_tree.git | ||||||
|  | S:	Maintained | ||||||
|  | F:	drivers/media/usb/dvb-usb-v2/az6007.c | ||||||
|  | 
 | ||||||
| B43 WIRELESS DRIVER | B43 WIRELESS DRIVER | ||||||
| M:	Stefano Brivio <stefano.brivio@polimi.it> | M:	Stefano Brivio <stefano.brivio@polimi.it> | ||||||
| L:	linux-wireless@vger.kernel.org | L:	linux-wireless@vger.kernel.org | ||||||
|  | @ -1740,11 +1755,11 @@ F:	Documentation/filesystems/btrfs.txt | ||||||
| F:	fs/btrfs/ | F:	fs/btrfs/ | ||||||
| 
 | 
 | ||||||
| BTTV VIDEO4LINUX DRIVER | BTTV VIDEO4LINUX DRIVER | ||||||
| M:	Mauro Carvalho Chehab <mchehab@infradead.org> | M:	Mauro Carvalho Chehab <mchehab@redhat.com> | ||||||
| L:	linux-media@vger.kernel.org | L:	linux-media@vger.kernel.org | ||||||
| W:	http://linuxtv.org | W:	http://linuxtv.org | ||||||
| T:	git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media.git | T:	git git://linuxtv.org/media_tree.git | ||||||
| S:	Maintained | S:	Odd fixes | ||||||
| F:	Documentation/video4linux/bttv/ | F:	Documentation/video4linux/bttv/ | ||||||
| F:	drivers/media/pci/bt8xx/bttv* | F:	drivers/media/pci/bt8xx/bttv* | ||||||
| 
 | 
 | ||||||
|  | @ -1773,7 +1788,7 @@ F:	fs/cachefiles/ | ||||||
| CAFE CMOS INTEGRATED CAMERA CONTROLLER DRIVER | CAFE CMOS INTEGRATED CAMERA CONTROLLER DRIVER | ||||||
| M:	Jonathan Corbet <corbet@lwn.net> | M:	Jonathan Corbet <corbet@lwn.net> | ||||||
| L:	linux-media@vger.kernel.org | L:	linux-media@vger.kernel.org | ||||||
| T:	git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media.git | T:	git git://linuxtv.org/media_tree.git | ||||||
| S:	Maintained | S:	Maintained | ||||||
| F:	Documentation/video4linux/cafe_ccic | F:	Documentation/video4linux/cafe_ccic | ||||||
| F:	drivers/media/platform/marvell-ccic/ | F:	drivers/media/platform/marvell-ccic/ | ||||||
|  | @ -2160,12 +2175,22 @@ CX18 VIDEO4LINUX DRIVER | ||||||
| M:	Andy Walls <awalls@md.metrocast.net> | M:	Andy Walls <awalls@md.metrocast.net> | ||||||
| L:	ivtv-devel@ivtvdriver.org (moderated for non-subscribers) | L:	ivtv-devel@ivtvdriver.org (moderated for non-subscribers) | ||||||
| L:	linux-media@vger.kernel.org | L:	linux-media@vger.kernel.org | ||||||
| T:	git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media.git | T:	git git://linuxtv.org/media_tree.git | ||||||
| W:	http://linuxtv.org | W:	http://linuxtv.org | ||||||
| W:	http://www.ivtvdriver.org/index.php/Cx18 | W:	http://www.ivtvdriver.org/index.php/Cx18 | ||||||
| S:	Maintained | S:	Maintained | ||||||
| F:	Documentation/video4linux/cx18.txt | F:	Documentation/video4linux/cx18.txt | ||||||
| F:	drivers/media/pci/cx18/ | F:	drivers/media/pci/cx18/ | ||||||
|  | F:	include/uapi/linux/ivtv* | ||||||
|  | 
 | ||||||
|  | CX88 VIDEO4LINUX DRIVER | ||||||
|  | M:	Mauro Carvalho Chehab <mchehab@redhat.com> | ||||||
|  | L:	linux-media@vger.kernel.org | ||||||
|  | W:	http://linuxtv.org | ||||||
|  | T:	git git://linuxtv.org/media_tree.git | ||||||
|  | S:	Odd fixes | ||||||
|  | F:	Documentation/video4linux/cx88/ | ||||||
|  | F:	drivers/media/pci/cx88/ | ||||||
| 
 | 
 | ||||||
| CXD2820R MEDIA DRIVER | CXD2820R MEDIA DRIVER | ||||||
| M:	Antti Palosaari <crope@iki.fi> | M:	Antti Palosaari <crope@iki.fi> | ||||||
|  | @ -2852,6 +2877,14 @@ L:	netdev@vger.kernel.org | ||||||
| S:	Maintained | S:	Maintained | ||||||
| F:	drivers/net/ethernet/ibm/ehea/ | F:	drivers/net/ethernet/ibm/ehea/ | ||||||
| 
 | 
 | ||||||
|  | EM28XX VIDEO4LINUX DRIVER | ||||||
|  | M:	Mauro Carvalho Chehab <mchehab@redhat.com> | ||||||
|  | L:	linux-media@vger.kernel.org | ||||||
|  | W:	http://linuxtv.org | ||||||
|  | T:	git git://linuxtv.org/media_tree.git | ||||||
|  | S:	Maintained | ||||||
|  | F:	drivers/media/usb/em28xx/ | ||||||
|  | 
 | ||||||
| EMBEDDED LINUX | EMBEDDED LINUX | ||||||
| M:	Paul Gortmaker <paul.gortmaker@windriver.com> | M:	Paul Gortmaker <paul.gortmaker@windriver.com> | ||||||
| M:	Matt Mackall <mpm@selenic.com> | M:	Matt Mackall <mpm@selenic.com> | ||||||
|  | @ -3050,6 +3083,14 @@ T:	git git://git.alsa-project.org/alsa-kernel.git | ||||||
| S:	Maintained | S:	Maintained | ||||||
| F:	sound/firewire/ | F:	sound/firewire/ | ||||||
| 
 | 
 | ||||||
|  | FIREWIRE MEDIA DRIVERS (firedtv) | ||||||
|  | M:	Stefan Richter <stefanr@s5r6.in-berlin.de> | ||||||
|  | L:	linux-media@vger.kernel.org | ||||||
|  | L:	linux1394-devel@lists.sourceforge.net | ||||||
|  | T:	git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media.git | ||||||
|  | S:	Maintained | ||||||
|  | F:	drivers/media/firewire/ | ||||||
|  | 
 | ||||||
| FIREWIRE SBP-2 TARGET | FIREWIRE SBP-2 TARGET | ||||||
| M:	Chris Boot <bootc@bootc.net> | M:	Chris Boot <bootc@bootc.net> | ||||||
| L:	linux-scsi@vger.kernel.org | L:	linux-scsi@vger.kernel.org | ||||||
|  | @ -3336,56 +3377,56 @@ F:	drivers/net/ethernet/aeroflex/ | ||||||
| GSPCA FINEPIX SUBDRIVER | GSPCA FINEPIX SUBDRIVER | ||||||
| M:	Frank Zago <frank@zago.net> | M:	Frank Zago <frank@zago.net> | ||||||
| L:	linux-media@vger.kernel.org | L:	linux-media@vger.kernel.org | ||||||
| T:	git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media.git | T:	git git://linuxtv.org/media_tree.git | ||||||
| S:	Maintained | S:	Maintained | ||||||
| F:	drivers/media/usb/gspca/finepix.c | F:	drivers/media/usb/gspca/finepix.c | ||||||
| 
 | 
 | ||||||
| GSPCA GL860 SUBDRIVER | GSPCA GL860 SUBDRIVER | ||||||
| M:	Olivier Lorin <o.lorin@laposte.net> | M:	Olivier Lorin <o.lorin@laposte.net> | ||||||
| L:	linux-media@vger.kernel.org | L:	linux-media@vger.kernel.org | ||||||
| T:	git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media.git | T:	git git://linuxtv.org/media_tree.git | ||||||
| S:	Maintained | S:	Maintained | ||||||
| F:	drivers/media/usb/gspca/gl860/ | F:	drivers/media/usb/gspca/gl860/ | ||||||
| 
 | 
 | ||||||
| GSPCA M5602 SUBDRIVER | GSPCA M5602 SUBDRIVER | ||||||
| M:	Erik Andren <erik.andren@gmail.com> | M:	Erik Andren <erik.andren@gmail.com> | ||||||
| L:	linux-media@vger.kernel.org | L:	linux-media@vger.kernel.org | ||||||
| T:	git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media.git | T:	git git://linuxtv.org/media_tree.git | ||||||
| S:	Maintained | S:	Maintained | ||||||
| F:	drivers/media/usb/gspca/m5602/ | F:	drivers/media/usb/gspca/m5602/ | ||||||
| 
 | 
 | ||||||
| GSPCA PAC207 SONIXB SUBDRIVER | GSPCA PAC207 SONIXB SUBDRIVER | ||||||
| M:	Hans de Goede <hdegoede@redhat.com> | M:	Hans de Goede <hdegoede@redhat.com> | ||||||
| L:	linux-media@vger.kernel.org | L:	linux-media@vger.kernel.org | ||||||
| T:	git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media.git | T:	git git://linuxtv.org/media_tree.git | ||||||
| S:	Maintained | S:	Maintained | ||||||
| F:	drivers/media/usb/gspca/pac207.c | F:	drivers/media/usb/gspca/pac207.c | ||||||
| 
 | 
 | ||||||
| GSPCA SN9C20X SUBDRIVER | GSPCA SN9C20X SUBDRIVER | ||||||
| M:	Brian Johnson <brijohn@gmail.com> | M:	Brian Johnson <brijohn@gmail.com> | ||||||
| L:	linux-media@vger.kernel.org | L:	linux-media@vger.kernel.org | ||||||
| T:	git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media.git | T:	git git://linuxtv.org/media_tree.git | ||||||
| S:	Maintained | S:	Maintained | ||||||
| F:	drivers/media/usb/gspca/sn9c20x.c | F:	drivers/media/usb/gspca/sn9c20x.c | ||||||
| 
 | 
 | ||||||
| GSPCA T613 SUBDRIVER | GSPCA T613 SUBDRIVER | ||||||
| M:	Leandro Costantino <lcostantino@gmail.com> | M:	Leandro Costantino <lcostantino@gmail.com> | ||||||
| L:	linux-media@vger.kernel.org | L:	linux-media@vger.kernel.org | ||||||
| T:	git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media.git | T:	git git://linuxtv.org/media_tree.git | ||||||
| S:	Maintained | S:	Maintained | ||||||
| F:	drivers/media/usb/gspca/t613.c | F:	drivers/media/usb/gspca/t613.c | ||||||
| 
 | 
 | ||||||
| GSPCA USB WEBCAM DRIVER | GSPCA USB WEBCAM DRIVER | ||||||
| M:	Hans de Goede <hdegoede@redhat.com> | M:	Hans de Goede <hdegoede@redhat.com> | ||||||
| L:	linux-media@vger.kernel.org | L:	linux-media@vger.kernel.org | ||||||
| T:	git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media.git | T:	git git://linuxtv.org/media_tree.git | ||||||
| S:	Maintained | S:	Maintained | ||||||
| F:	drivers/media/usb/gspca/ | F:	drivers/media/usb/gspca/ | ||||||
| 
 | 
 | ||||||
| STK1160 USB VIDEO CAPTURE DRIVER | STK1160 USB VIDEO CAPTURE DRIVER | ||||||
| M:	Ezequiel Garcia <elezegarcia@gmail.com> | M:	Ezequiel Garcia <elezegarcia@gmail.com> | ||||||
| L:	linux-media@vger.kernel.org | L:	linux-media@vger.kernel.org | ||||||
| T:	git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media.git | T:	git git://linuxtv.org/media_tree.git | ||||||
| S:	Maintained | S:	Maintained | ||||||
| F:	drivers/media/usb/stk1160/ | F:	drivers/media/usb/stk1160/ | ||||||
| 
 | 
 | ||||||
|  | @ -3784,6 +3825,12 @@ F:	net/ieee802154/ | ||||||
| F:	net/mac802154/ | F:	net/mac802154/ | ||||||
| F:	drivers/ieee802154/ | F:	drivers/ieee802154/ | ||||||
| 
 | 
 | ||||||
|  | IGUANAWORKS USB IR TRANSCEIVER | ||||||
|  | M:	Sean Young <sean@mess.org> | ||||||
|  | L:	linux-media@vger.kernel.org | ||||||
|  | S:	Maintained | ||||||
|  | F:	drivers/media/rc/iguanair.c | ||||||
|  | 
 | ||||||
| IIO SUBSYSTEM AND DRIVERS | IIO SUBSYSTEM AND DRIVERS | ||||||
| M:	Jonathan Cameron <jic23@cam.ac.uk> | M:	Jonathan Cameron <jic23@cam.ac.uk> | ||||||
| L:	linux-iio@vger.kernel.org | L:	linux-iio@vger.kernel.org | ||||||
|  | @ -4158,17 +4205,41 @@ S:	Maintained | ||||||
| F:	Documentation/hwmon/it87 | F:	Documentation/hwmon/it87 | ||||||
| F:	drivers/hwmon/it87.c | F:	drivers/hwmon/it87.c | ||||||
| 
 | 
 | ||||||
|  | IT913X MEDIA DRIVER | ||||||
|  | M:	Malcolm Priestley <tvboxspy@gmail.com> | ||||||
|  | L:	linux-media@vger.kernel.org | ||||||
|  | W:	http://linuxtv.org/ | ||||||
|  | Q:	http://patchwork.linuxtv.org/project/linux-media/list/ | ||||||
|  | S:	Maintained | ||||||
|  | F:	drivers/media/usb/dvb-usb-v2/it913x* | ||||||
|  | 
 | ||||||
|  | IT913X FE MEDIA DRIVER | ||||||
|  | M:	Malcolm Priestley <tvboxspy@gmail.com> | ||||||
|  | L:	linux-media@vger.kernel.org | ||||||
|  | W:	http://linuxtv.org/ | ||||||
|  | Q:	http://patchwork.linuxtv.org/project/linux-media/list/ | ||||||
|  | S:	Maintained | ||||||
|  | F:	drivers/media/dvb-frontends/it913x-fe* | ||||||
|  | 
 | ||||||
| IVTV VIDEO4LINUX DRIVER | IVTV VIDEO4LINUX DRIVER | ||||||
| M:	Andy Walls <awalls@md.metrocast.net> | M:	Andy Walls <awalls@md.metrocast.net> | ||||||
| L:	ivtv-devel@ivtvdriver.org (moderated for non-subscribers) | L:	ivtv-devel@ivtvdriver.org (moderated for non-subscribers) | ||||||
| L:	linux-media@vger.kernel.org | L:	linux-media@vger.kernel.org | ||||||
| T:	git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media.git | T:	git git://linuxtv.org/media_tree.git | ||||||
| W:	http://www.ivtvdriver.org | W:	http://www.ivtvdriver.org | ||||||
| S:	Maintained | S:	Maintained | ||||||
| F:	Documentation/video4linux/*.ivtv | F:	Documentation/video4linux/*.ivtv | ||||||
| F:	drivers/media/pci/ivtv/ | F:	drivers/media/pci/ivtv/ | ||||||
| F:	include/linux/ivtv* | F:	include/linux/ivtv* | ||||||
| 
 | 
 | ||||||
|  | IX2505V MEDIA DRIVER | ||||||
|  | M:	Malcolm Priestley <tvboxspy@gmail.com> | ||||||
|  | L:	linux-media@vger.kernel.org | ||||||
|  | W:	http://linuxtv.org/ | ||||||
|  | Q:	http://patchwork.linuxtv.org/project/linux-media/list/ | ||||||
|  | S:	Maintained | ||||||
|  | F:	drivers/media/dvb-frontends/ix2505v* | ||||||
|  | 
 | ||||||
| JC42.4 TEMPERATURE SENSOR DRIVER | JC42.4 TEMPERATURE SENSOR DRIVER | ||||||
| M:	Guenter Roeck <linux@roeck-us.net> | M:	Guenter Roeck <linux@roeck-us.net> | ||||||
| L:	lm-sensors@lm-sensors.org | L:	lm-sensors@lm-sensors.org | ||||||
|  | @ -4613,6 +4684,14 @@ S:	Maintained | ||||||
| F:	Documentation/hwmon/lm90 | F:	Documentation/hwmon/lm90 | ||||||
| F:	drivers/hwmon/lm90.c | F:	drivers/hwmon/lm90.c | ||||||
| 
 | 
 | ||||||
|  | LME2510 MEDIA DRIVER | ||||||
|  | M:	Malcolm Priestley <tvboxspy@gmail.com> | ||||||
|  | L:	linux-media@vger.kernel.org | ||||||
|  | W:	http://linuxtv.org/ | ||||||
|  | Q:	http://patchwork.linuxtv.org/project/linux-media/list/ | ||||||
|  | S:	Maintained | ||||||
|  | F:	drivers/media/usb/dvb-usb-v2/lmedm04* | ||||||
|  | 
 | ||||||
| LOCKDEP AND LOCKSTAT | LOCKDEP AND LOCKSTAT | ||||||
| M:	Peter Zijlstra <peterz@infradead.org> | M:	Peter Zijlstra <peterz@infradead.org> | ||||||
| M:	Ingo Molnar <mingo@redhat.com> | M:	Ingo Molnar <mingo@redhat.com> | ||||||
|  | @ -4703,6 +4782,14 @@ W:	http://www.tazenda.demon.co.uk/phil/linux-hp | ||||||
| S:	Maintained | S:	Maintained | ||||||
| F:	arch/m68k/hp300/ | F:	arch/m68k/hp300/ | ||||||
| 
 | 
 | ||||||
|  | M88RS2000 MEDIA DRIVER | ||||||
|  | M:	Malcolm Priestley <tvboxspy@gmail.com> | ||||||
|  | L:	linux-media@vger.kernel.org | ||||||
|  | W:	http://linuxtv.org/ | ||||||
|  | Q:	http://patchwork.linuxtv.org/project/linux-media/list/ | ||||||
|  | S:	Maintained | ||||||
|  | F:	drivers/media/dvb-frontends/m88rs2000* | ||||||
|  | 
 | ||||||
| MAC80211 | MAC80211 | ||||||
| M:	Johannes Berg <johannes@sipsolutions.net> | M:	Johannes Berg <johannes@sipsolutions.net> | ||||||
| L:	linux-wireless@vger.kernel.org | L:	linux-wireless@vger.kernel.org | ||||||
|  | @ -4795,12 +4882,12 @@ F:	Documentation/hwmon/max6650 | ||||||
| F:	drivers/hwmon/max6650.c | F:	drivers/hwmon/max6650.c | ||||||
| 
 | 
 | ||||||
| MEDIA INPUT INFRASTRUCTURE (V4L/DVB) | MEDIA INPUT INFRASTRUCTURE (V4L/DVB) | ||||||
| M:	Mauro Carvalho Chehab <mchehab@infradead.org> | M:	Mauro Carvalho Chehab <mchehab@redhat.com> | ||||||
| P:	LinuxTV.org Project | P:	LinuxTV.org Project | ||||||
| L:	linux-media@vger.kernel.org | L:	linux-media@vger.kernel.org | ||||||
| W:	http://linuxtv.org | W:	http://linuxtv.org | ||||||
| Q:	http://patchwork.kernel.org/project/linux-media/list/ | Q:	http://patchwork.kernel.org/project/linux-media/list/ | ||||||
| T:	git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media.git | T:	git git://linuxtv.org/media_tree.git | ||||||
| S:	Maintained | S:	Maintained | ||||||
| F:	Documentation/dvb/ | F:	Documentation/dvb/ | ||||||
| F:	Documentation/video4linux/ | F:	Documentation/video4linux/ | ||||||
|  | @ -4808,8 +4895,13 @@ F:	Documentation/DocBook/media/ | ||||||
| F:	drivers/media/ | F:	drivers/media/ | ||||||
| F:	drivers/staging/media/ | F:	drivers/staging/media/ | ||||||
| F:	include/media/ | F:	include/media/ | ||||||
| F:	include/linux/dvb/ | F:	include/uapi/linux/dvb/ | ||||||
| F:	include/linux/videodev*.h | F:	include/uapi/linux/videodev2.h | ||||||
|  | F:	include/uapi/linux/media.h | ||||||
|  | F:	include/uapi/linux/v4l2-* | ||||||
|  | F:	include/uapi/linux/meye.h | ||||||
|  | F:	include/uapi/linux/ivtv* | ||||||
|  | F:	include/uapi/linux/uvcvideo.h | ||||||
| 
 | 
 | ||||||
| MEGARAID SCSI DRIVERS | MEGARAID SCSI DRIVERS | ||||||
| M:	Neela Syam Kolli <megaraidlinux@lsi.com> | M:	Neela Syam Kolli <megaraidlinux@lsi.com> | ||||||
|  | @ -4883,7 +4975,7 @@ W:	http://popies.net/meye/ | ||||||
| S:	Orphan | S:	Orphan | ||||||
| F:	Documentation/video4linux/meye.txt | F:	Documentation/video4linux/meye.txt | ||||||
| F:	drivers/media/pci/meye/ | F:	drivers/media/pci/meye/ | ||||||
| F:	include/linux/meye.h | F:	include/uapi/linux/meye.h | ||||||
| 
 | 
 | ||||||
| MOTOROLA IMX MMC/SD HOST CONTROLLER INTERFACE DRIVER | MOTOROLA IMX MMC/SD HOST CONTROLLER INTERFACE DRIVER | ||||||
| M:	Pavel Pisa <ppisa@pikron.com> | M:	Pavel Pisa <ppisa@pikron.com> | ||||||
|  | @ -4897,6 +4989,13 @@ S:	Maintained | ||||||
| F:	Documentation/serial/moxa-smartio | F:	Documentation/serial/moxa-smartio | ||||||
| F:	drivers/tty/mxser.* | F:	drivers/tty/mxser.* | ||||||
| 
 | 
 | ||||||
|  | MR800 AVERMEDIA USB FM RADIO DRIVER | ||||||
|  | M:	Alexey Klimov <klimov.linux@gmail.com> | ||||||
|  | L:	linux-media@vger.kernel.org | ||||||
|  | T:	git git://linuxtv.org/media_tree.git | ||||||
|  | S:	Maintained | ||||||
|  | F:	drivers/media/radio/radio-mr800.c | ||||||
|  | 
 | ||||||
| MSI LAPTOP SUPPORT | MSI LAPTOP SUPPORT | ||||||
| M:	"Lee, Chun-Yi" <jlee@novell.com> | M:	"Lee, Chun-Yi" <jlee@novell.com> | ||||||
| L:	platform-driver-x86@vger.kernel.org | L:	platform-driver-x86@vger.kernel.org | ||||||
|  | @ -5357,7 +5456,7 @@ F:	drivers/char/pcmcia/cm4040_cs.* | ||||||
| OMNIVISION OV7670 SENSOR DRIVER | OMNIVISION OV7670 SENSOR DRIVER | ||||||
| M:	Jonathan Corbet <corbet@lwn.net> | M:	Jonathan Corbet <corbet@lwn.net> | ||||||
| L:	linux-media@vger.kernel.org | L:	linux-media@vger.kernel.org | ||||||
| T:	git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media.git | T:	git git://linuxtv.org/media_tree.git | ||||||
| S:	Maintained | S:	Maintained | ||||||
| F:	drivers/media/i2c/ov7670.c | F:	drivers/media/i2c/ov7670.c | ||||||
| 
 | 
 | ||||||
|  | @ -5900,11 +5999,18 @@ M:	Mike Isely <isely@pobox.com> | ||||||
| L:	pvrusb2@isely.net	(subscribers-only) | L:	pvrusb2@isely.net	(subscribers-only) | ||||||
| L:	linux-media@vger.kernel.org | L:	linux-media@vger.kernel.org | ||||||
| W:	http://www.isely.net/pvrusb2/ | W:	http://www.isely.net/pvrusb2/ | ||||||
| T:	git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media.git | T:	git git://linuxtv.org/media_tree.git | ||||||
| S:	Maintained | S:	Maintained | ||||||
| F:	Documentation/video4linux/README.pvrusb2 | F:	Documentation/video4linux/README.pvrusb2 | ||||||
| F:	drivers/media/usb/pvrusb2/ | F:	drivers/media/usb/pvrusb2/ | ||||||
| 
 | 
 | ||||||
|  | PWC WEBCAM DRIVER | ||||||
|  | M:	Hans de Goede <hdegoede@redhat.com> | ||||||
|  | L:	linux-media@vger.kernel.org | ||||||
|  | T:	git git://linuxtv.org/media_tree.git | ||||||
|  | S:	Maintained | ||||||
|  | F:	drivers/media/usb/pwc/* | ||||||
|  | 
 | ||||||
| PWM SUBSYSTEM | PWM SUBSYSTEM | ||||||
| M:	Thierry Reding <thierry.reding@avionic-design.de> | M:	Thierry Reding <thierry.reding@avionic-design.de> | ||||||
| L:	linux-kernel@vger.kernel.org | L:	linux-kernel@vger.kernel.org | ||||||
|  | @ -6047,6 +6153,21 @@ S:	Maintained | ||||||
| F:	drivers/video/aty/radeon* | F:	drivers/video/aty/radeon* | ||||||
| F:	include/linux/radeonfb.h | F:	include/linux/radeonfb.h | ||||||
| 
 | 
 | ||||||
|  | RADIOSHARK RADIO DRIVER | ||||||
|  | M:	Hans de Goede <hdegoede@redhat.com> | ||||||
|  | L:	linux-media@vger.kernel.org | ||||||
|  | T:	git git://linuxtv.org/media_tree.git | ||||||
|  | S:	Maintained | ||||||
|  | F:	drivers/media/radio/radio-shark.c | ||||||
|  | 
 | ||||||
|  | RADIOSHARK2 RADIO DRIVER | ||||||
|  | M:	Hans de Goede <hdegoede@redhat.com> | ||||||
|  | L:	linux-media@vger.kernel.org | ||||||
|  | T:	git git://linuxtv.org/media_tree.git | ||||||
|  | S:	Maintained | ||||||
|  | F:	drivers/media/radio/radio-shark2.c | ||||||
|  | F:	drivers/media/radio/radio-tea5777.c | ||||||
|  | 
 | ||||||
| RAGE128 FRAMEBUFFER DISPLAY DRIVER | RAGE128 FRAMEBUFFER DISPLAY DRIVER | ||||||
| M:	Paul Mackerras <paulus@samba.org> | M:	Paul Mackerras <paulus@samba.org> | ||||||
| L:	linux-fbdev@vger.kernel.org | L:	linux-fbdev@vger.kernel.org | ||||||
|  | @ -6287,10 +6408,19 @@ L:	linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | ||||||
| S:	Supported | S:	Supported | ||||||
| F:	drivers/mmc/host/s3cmci.* | F:	drivers/mmc/host/s3cmci.* | ||||||
| 
 | 
 | ||||||
|  | SAA7134 VIDEO4LINUX DRIVER | ||||||
|  | M:	Mauro Carvalho Chehab <mchehab@redhat.com> | ||||||
|  | L:	linux-media@vger.kernel.org | ||||||
|  | W:	http://linuxtv.org | ||||||
|  | T:	git git://linuxtv.org/media_tree.git | ||||||
|  | S:	Odd fixes | ||||||
|  | F:	Documentation/video4linux/saa7134/ | ||||||
|  | F:	drivers/media/pci/saa7134/ | ||||||
|  | 
 | ||||||
| SAA7146 VIDEO4LINUX-2 DRIVER | SAA7146 VIDEO4LINUX-2 DRIVER | ||||||
| M:	Michael Hunold <michael@mihu.de> | M:	Michael Hunold <michael@mihu.de> | ||||||
| L:	linux-media@vger.kernel.org | L:	linux-media@vger.kernel.org | ||||||
| T:	git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media.git | T:	git git://linuxtv.org/media_tree.git | ||||||
| W:	http://www.mihu.de/linux/saa7146 | W:	http://www.mihu.de/linux/saa7146 | ||||||
| S:	Maintained | S:	Maintained | ||||||
| F:	drivers/media/common/saa7146/ | F:	drivers/media/common/saa7146/ | ||||||
|  | @ -6325,6 +6455,14 @@ F:	drivers/regulator/s5m*.c | ||||||
| F:	drivers/rtc/rtc-sec.c | F:	drivers/rtc/rtc-sec.c | ||||||
| F:	include/linux/mfd/samsung/ | F:	include/linux/mfd/samsung/ | ||||||
| 
 | 
 | ||||||
|  | SAMSUNG S3C24XX/S3C64XX SOC SERIES CAMIF DRIVER | ||||||
|  | M:	Sylwester Nawrocki <sylvester.nawrocki@gmail.com> | ||||||
|  | L:	linux-media@vger.kernel.org | ||||||
|  | L:	linux-samsung-soc@vger.kernel.org (moderated for non-subscribers) | ||||||
|  | S:	Maintained | ||||||
|  | F:	drivers/media/platform/s3c-camif/ | ||||||
|  | F:	include/media/s3c_camif.h | ||||||
|  | 
 | ||||||
| SERIAL DRIVERS | SERIAL DRIVERS | ||||||
| M:	Alan Cox <alan@linux.intel.com> | M:	Alan Cox <alan@linux.intel.com> | ||||||
| L:	linux-serial@vger.kernel.org | L:	linux-serial@vger.kernel.org | ||||||
|  | @ -6618,6 +6756,18 @@ S:	Supported | ||||||
| F:	arch/arm/mach-davinci | F:	arch/arm/mach-davinci | ||||||
| F:	drivers/i2c/busses/i2c-davinci.c | F:	drivers/i2c/busses/i2c-davinci.c | ||||||
| 
 | 
 | ||||||
|  | TI DAVINCI SERIES MEDIA DRIVER | ||||||
|  | M:	Manjunath Hadli <manjunath.hadli@ti.com> | ||||||
|  | M:	Prabhakar Lad <prabhakar.lad@ti.com> | ||||||
|  | L:	linux-media@vger.kernel.org | ||||||
|  | L:	davinci-linux-open-source@linux.davincidsp.com (moderated for non-subscribers) | ||||||
|  | W:	http://linuxtv.org/ | ||||||
|  | Q:	http://patchwork.linuxtv.org/project/linux-media/list/ | ||||||
|  | T:	git git://linuxtv.org/mhadli/v4l-dvb-davinci_devices.git | ||||||
|  | S:	Supported | ||||||
|  | F:	drivers/media/platform/davinci/ | ||||||
|  | F:	include/media/davinci/ | ||||||
|  | 
 | ||||||
| SIS 190 ETHERNET DRIVER | SIS 190 ETHERNET DRIVER | ||||||
| M:	Francois Romieu <romieu@fr.zoreil.com> | M:	Francois Romieu <romieu@fr.zoreil.com> | ||||||
| L:	netdev@vger.kernel.org | L:	netdev@vger.kernel.org | ||||||
|  | @ -6684,6 +6834,15 @@ M:	Nicolas Pitre <nico@fluxnic.net> | ||||||
| S:	Odd Fixes | S:	Odd Fixes | ||||||
| F:	drivers/net/ethernet/smsc/smc91x.* | F:	drivers/net/ethernet/smsc/smc91x.* | ||||||
| 
 | 
 | ||||||
|  | SMIA AND SMIA++ IMAGE SENSOR DRIVER | ||||||
|  | M:	Sakari Ailus <sakari.ailus@iki.fi> | ||||||
|  | L:	linux-media@vger.kernel.org | ||||||
|  | S:	Maintained | ||||||
|  | F:	drivers/media/i2c/smiapp | ||||||
|  | F:	include/media/smiapp.h | ||||||
|  | F:	drivers/media/i2c/smiapp-pll.c | ||||||
|  | F:	drivers/media/i2c/smiapp-pll.h | ||||||
|  | 
 | ||||||
| SMM665 HARDWARE MONITOR DRIVER | SMM665 HARDWARE MONITOR DRIVER | ||||||
| M:	Guenter Roeck <linux@roeck-us.net> | M:	Guenter Roeck <linux@roeck-us.net> | ||||||
| L:	lm-sensors@lm-sensors.org | L:	lm-sensors@lm-sensors.org | ||||||
|  | @ -6742,7 +6901,7 @@ F:	arch/ia64/sn/ | ||||||
| SOC-CAMERA V4L2 SUBSYSTEM | SOC-CAMERA V4L2 SUBSYSTEM | ||||||
| M:	Guennadi Liakhovetski <g.liakhovetski@gmx.de> | M:	Guennadi Liakhovetski <g.liakhovetski@gmx.de> | ||||||
| L:	linux-media@vger.kernel.org | L:	linux-media@vger.kernel.org | ||||||
| T:	git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media.git | T:	git git://linuxtv.org/media_tree.git | ||||||
| S:	Maintained | S:	Maintained | ||||||
| F:	include/media/soc* | F:	include/media/soc* | ||||||
| F:	drivers/media/i2c/soc_camera/ | F:	drivers/media/i2c/soc_camera/ | ||||||
|  | @ -7232,6 +7391,22 @@ T:	git git://linuxtv.org/mkrufky/tuners.git | ||||||
| S:	Maintained | S:	Maintained | ||||||
| F:	drivers/media/tuners/tda8290.* | F:	drivers/media/tuners/tda8290.* | ||||||
| 
 | 
 | ||||||
|  | TEA5761 TUNER DRIVER | ||||||
|  | M:	Mauro Carvalho Chehab <mchehab@redhat.com> | ||||||
|  | L:	linux-media@vger.kernel.org | ||||||
|  | W:	http://linuxtv.org | ||||||
|  | T:	git git://linuxtv.org/media_tree.git | ||||||
|  | S:	Odd fixes | ||||||
|  | F:	drivers/media/tuners/tea5761.* | ||||||
|  | 
 | ||||||
|  | TEA5767 TUNER DRIVER | ||||||
|  | M:	Mauro Carvalho Chehab <mchehab@redhat.com> | ||||||
|  | L:	linux-media@vger.kernel.org | ||||||
|  | W:	http://linuxtv.org | ||||||
|  | T:	git git://linuxtv.org/media_tree.git | ||||||
|  | S:	Maintained | ||||||
|  | F:	drivers/media/tuners/tea5767.* | ||||||
|  | 
 | ||||||
| TEAM DRIVER | TEAM DRIVER | ||||||
| M:	Jiri Pirko <jpirko@redhat.com> | M:	Jiri Pirko <jpirko@redhat.com> | ||||||
| L:	netdev@vger.kernel.org | L:	netdev@vger.kernel.org | ||||||
|  | @ -7239,6 +7414,12 @@ S:	Supported | ||||||
| F:	drivers/net/team/ | F:	drivers/net/team/ | ||||||
| F:	include/linux/if_team.h | F:	include/linux/if_team.h | ||||||
| 
 | 
 | ||||||
|  | TECHNOTREND USB IR RECEIVER | ||||||
|  | M:	Sean Young <sean@mess.org> | ||||||
|  | L:	linux-media@vger.kernel.org | ||||||
|  | S:	Maintained | ||||||
|  | F:	drivers/media/rc/ttusbir.c | ||||||
|  | 
 | ||||||
| TEGRA SUPPORT | TEGRA SUPPORT | ||||||
| M:	Stephen Warren <swarren@wwwdotorg.org> | M:	Stephen Warren <swarren@wwwdotorg.org> | ||||||
| L:	linux-tegra@vger.kernel.org | L:	linux-tegra@vger.kernel.org | ||||||
|  | @ -7391,6 +7572,14 @@ S:	Maintained | ||||||
| F:	include/linux/shmem_fs.h | F:	include/linux/shmem_fs.h | ||||||
| F:	mm/shmem.c | F:	mm/shmem.c | ||||||
| 
 | 
 | ||||||
|  | TM6000 VIDEO4LINUX DRIVER | ||||||
|  | M:	Mauro Carvalho Chehab <mchehab@redhat.com> | ||||||
|  | L:	linux-media@vger.kernel.org | ||||||
|  | W:	http://linuxtv.org | ||||||
|  | T:	git git://linuxtv.org/media_tree.git | ||||||
|  | S:	Odd fixes | ||||||
|  | F:	drivers/media/usb/tm6000/ | ||||||
|  | 
 | ||||||
| TPM DEVICE DRIVER | TPM DEVICE DRIVER | ||||||
| M:	Kent Yoder <key@linux.vnet.ibm.com> | M:	Kent Yoder <key@linux.vnet.ibm.com> | ||||||
| M:	Rajiv Andrade <mail@srajiv.net> | M:	Rajiv Andrade <mail@srajiv.net> | ||||||
|  | @ -7785,7 +7974,7 @@ USB SN9C1xx DRIVER | ||||||
| M:	Luca Risolia <luca.risolia@studio.unibo.it> | M:	Luca Risolia <luca.risolia@studio.unibo.it> | ||||||
| L:	linux-usb@vger.kernel.org | L:	linux-usb@vger.kernel.org | ||||||
| L:	linux-media@vger.kernel.org | L:	linux-media@vger.kernel.org | ||||||
| T:	git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media.git | T:	git git://linuxtv.org/media_tree.git | ||||||
| W:	http://www.linux-projects.org | W:	http://www.linux-projects.org | ||||||
| S:	Maintained | S:	Maintained | ||||||
| F:	Documentation/video4linux/sn9c102.txt | F:	Documentation/video4linux/sn9c102.txt | ||||||
|  | @ -7821,10 +8010,11 @@ USB VIDEO CLASS | ||||||
| M:	Laurent Pinchart <laurent.pinchart@ideasonboard.com> | M:	Laurent Pinchart <laurent.pinchart@ideasonboard.com> | ||||||
| L:	linux-uvc-devel@lists.sourceforge.net (subscribers-only) | L:	linux-uvc-devel@lists.sourceforge.net (subscribers-only) | ||||||
| L:	linux-media@vger.kernel.org | L:	linux-media@vger.kernel.org | ||||||
| T:	git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media.git | T:	git git://linuxtv.org/media_tree.git | ||||||
| W:	http://www.ideasonboard.org/uvc/ | W:	http://www.ideasonboard.org/uvc/ | ||||||
| S:	Maintained | S:	Maintained | ||||||
| F:	drivers/media/usb/uvc/ | F:	drivers/media/usb/uvc/ | ||||||
|  | F:	include/uapi/linux/uvcvideo.h | ||||||
| 
 | 
 | ||||||
| USB WEBCAM GADGET | USB WEBCAM GADGET | ||||||
| M:	Laurent Pinchart <laurent.pinchart@ideasonboard.com> | M:	Laurent Pinchart <laurent.pinchart@ideasonboard.com> | ||||||
|  | @ -7856,7 +8046,7 @@ USB ZR364XX DRIVER | ||||||
| M:	Antoine Jacquet <royale@zerezo.com> | M:	Antoine Jacquet <royale@zerezo.com> | ||||||
| L:	linux-usb@vger.kernel.org | L:	linux-usb@vger.kernel.org | ||||||
| L:	linux-media@vger.kernel.org | L:	linux-media@vger.kernel.org | ||||||
| T:	git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media.git | T:	git git://linuxtv.org/media_tree.git | ||||||
| W:	http://royale.zerezo.com/zr364xx/ | W:	http://royale.zerezo.com/zr364xx/ | ||||||
| S:	Maintained | S:	Maintained | ||||||
| F:	Documentation/video4linux/zr364xx.txt | F:	Documentation/video4linux/zr364xx.txt | ||||||
|  | @ -8211,6 +8401,14 @@ L:	linux-edac@vger.kernel.org | ||||||
| S:	Maintained | S:	Maintained | ||||||
| F:	arch/x86/kernel/cpu/mcheck/* | F:	arch/x86/kernel/cpu/mcheck/* | ||||||
| 
 | 
 | ||||||
|  | XC2028/3028 TUNER DRIVER | ||||||
|  | M:	Mauro Carvalho Chehab <mchehab@redhat.com> | ||||||
|  | L:	linux-media@vger.kernel.org | ||||||
|  | W:	http://linuxtv.org | ||||||
|  | T:	git git://linuxtv.org/media_tree.git | ||||||
|  | S:	Maintained | ||||||
|  | F:	drivers/media/tuners/tuner-xc2028.* | ||||||
|  | 
 | ||||||
| XEN HYPERVISOR INTERFACE | XEN HYPERVISOR INTERFACE | ||||||
| M:	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> | M:	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> | ||||||
| M:	Jeremy Fitzhardinge <jeremy@goop.org> | M:	Jeremy Fitzhardinge <jeremy@goop.org> | ||||||
|  |  | ||||||
|  | @ -200,6 +200,16 @@ static struct resource omap3isp_resources[] = { | ||||||
| 		.end		= OMAP3630_ISP_CSI2C_REGS2_END, | 		.end		= OMAP3630_ISP_CSI2C_REGS2_END, | ||||||
| 		.flags		= IORESOURCE_MEM, | 		.flags		= IORESOURCE_MEM, | ||||||
| 	}, | 	}, | ||||||
|  | 	{ | ||||||
|  | 		.start		= OMAP343X_CTRL_BASE + OMAP343X_CONTROL_CSIRXFE, | ||||||
|  | 		.end		= OMAP343X_CTRL_BASE + OMAP343X_CONTROL_CSIRXFE + 3, | ||||||
|  | 		.flags		= IORESOURCE_MEM, | ||||||
|  | 	}, | ||||||
|  | 	{ | ||||||
|  | 		.start		= OMAP343X_CTRL_BASE + OMAP3630_CONTROL_CAMERA_PHY_CTRL, | ||||||
|  | 		.end		= OMAP343X_CTRL_BASE + OMAP3630_CONTROL_CAMERA_PHY_CTRL + 3, | ||||||
|  | 		.flags		= IORESOURCE_MEM, | ||||||
|  | 	}, | ||||||
| 	{ | 	{ | ||||||
| 		.start		= 24 + OMAP_INTC_START, | 		.start		= 24 + OMAP_INTC_START, | ||||||
| 		.flags		= IORESOURCE_IRQ, | 		.flags		= IORESOURCE_IRQ, | ||||||
|  |  | ||||||
|  | @ -26,6 +26,7 @@ | ||||||
| #include <linux/i2c/pxa-i2c.h> | #include <linux/i2c/pxa-i2c.h> | ||||||
| #include <linux/pwm_backlight.h> | #include <linux/pwm_backlight.h> | ||||||
| 
 | 
 | ||||||
|  | #include <media/mt9v022.h> | ||||||
| #include <media/soc_camera.h> | #include <media/soc_camera.h> | ||||||
| 
 | 
 | ||||||
| #include <linux/platform_data/camera-pxa.h> | #include <linux/platform_data/camera-pxa.h> | ||||||
|  | @ -468,6 +469,10 @@ static struct i2c_board_info __initdata pcm990_i2c_devices[] = { | ||||||
| 	}, | 	}, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | static struct mt9v022_platform_data mt9v022_pdata = { | ||||||
|  | 	.y_skip_top = 1, | ||||||
|  | }; | ||||||
|  | 
 | ||||||
| static struct i2c_board_info pcm990_camera_i2c[] = { | static struct i2c_board_info pcm990_camera_i2c[] = { | ||||||
| 	{ | 	{ | ||||||
| 		I2C_BOARD_INFO("mt9v022", 0x48), | 		I2C_BOARD_INFO("mt9v022", 0x48), | ||||||
|  | @ -480,6 +485,7 @@ static struct soc_camera_link iclink[] = { | ||||||
| 	{ | 	{ | ||||||
| 		.bus_id			= 0, /* Must match with the camera ID */ | 		.bus_id			= 0, /* Must match with the camera ID */ | ||||||
| 		.board_info		= &pcm990_camera_i2c[0], | 		.board_info		= &pcm990_camera_i2c[0], | ||||||
|  | 		.priv			= &mt9v022_pdata, | ||||||
| 		.i2c_adapter_id		= 0, | 		.i2c_adapter_id		= 0, | ||||||
| 		.query_bus_param	= pcm990_camera_query_bus_param, | 		.query_bus_param	= pcm990_camera_query_bus_param, | ||||||
| 		.set_bus_param		= pcm990_camera_set_bus_param, | 		.set_bus_param		= pcm990_camera_set_bus_param, | ||||||
|  |  | ||||||
|  | @ -218,6 +218,8 @@ void dmam_release_declared_memory(struct device *dev) | ||||||
| } | } | ||||||
| EXPORT_SYMBOL(dmam_release_declared_memory); | EXPORT_SYMBOL(dmam_release_declared_memory); | ||||||
| 
 | 
 | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| /*
 | /*
 | ||||||
|  * Create scatter-list for the already allocated DMA buffer. |  * Create scatter-list for the already allocated DMA buffer. | ||||||
|  */ |  */ | ||||||
|  | @ -236,8 +238,6 @@ int dma_common_get_sgtable(struct device *dev, struct sg_table *sgt, | ||||||
| } | } | ||||||
| EXPORT_SYMBOL(dma_common_get_sgtable); | EXPORT_SYMBOL(dma_common_get_sgtable); | ||||||
| 
 | 
 | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
| /*
 | /*
 | ||||||
|  * Create userspace mapping for the DMA-coherent memory. |  * Create userspace mapping for the DMA-coherent memory. | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
|  | @ -116,7 +116,7 @@ int picolcd_init_cir(struct picolcd_data *data, struct hid_report *report) | ||||||
| 
 | 
 | ||||||
| 	rdev->priv             = data; | 	rdev->priv             = data; | ||||||
| 	rdev->driver_type      = RC_DRIVER_IR_RAW; | 	rdev->driver_type      = RC_DRIVER_IR_RAW; | ||||||
| 	rdev->allowed_protos   = RC_TYPE_ALL; | 	rdev->allowed_protos   = RC_BIT_ALL; | ||||||
| 	rdev->open             = picolcd_cir_open; | 	rdev->open             = picolcd_cir_open; | ||||||
| 	rdev->close            = picolcd_cir_close; | 	rdev->close            = picolcd_cir_close; | ||||||
| 	rdev->input_name       = data->hdev->name; | 	rdev->input_name       = data->hdev->name; | ||||||
|  |  | ||||||
|  | @ -1,3 +1,10 @@ | ||||||
|  | # Used by common drivers, when they need to ask questions | ||||||
|  | config MEDIA_COMMON_OPTIONS | ||||||
|  | 	bool | ||||||
|  | 
 | ||||||
|  | comment "common driver options" | ||||||
|  | 	depends on MEDIA_COMMON_OPTIONS | ||||||
|  | 
 | ||||||
| source "drivers/media/common/b2c2/Kconfig" | source "drivers/media/common/b2c2/Kconfig" | ||||||
| source "drivers/media/common/saa7146/Kconfig" | source "drivers/media/common/saa7146/Kconfig" | ||||||
| source "drivers/media/common/siano/Kconfig" | source "drivers/media/common/siano/Kconfig" | ||||||
|  |  | ||||||
|  | @ -17,11 +17,6 @@ config DVB_B2C2_FLEXCOP | ||||||
| 	select DVB_CX24123 if MEDIA_SUBDRV_AUTOSELECT | 	select DVB_CX24123 if MEDIA_SUBDRV_AUTOSELECT | ||||||
| 	select MEDIA_TUNER_SIMPLE if MEDIA_SUBDRV_AUTOSELECT | 	select MEDIA_TUNER_SIMPLE if MEDIA_SUBDRV_AUTOSELECT | ||||||
| 	select DVB_TUNER_CX24113 if MEDIA_SUBDRV_AUTOSELECT | 	select DVB_TUNER_CX24113 if MEDIA_SUBDRV_AUTOSELECT | ||||||
| 	help |  | ||||||
| 	  Support for the digital TV receiver chip made by B2C2 Inc. included in |  | ||||||
| 	  Technisats PCI cards and USB boxes. |  | ||||||
| 
 |  | ||||||
| 	  Say Y if you own such a device and want to use it. |  | ||||||
| 
 | 
 | ||||||
| # Selected via the PCI or USB flexcop drivers | # Selected via the PCI or USB flexcop drivers | ||||||
| config DVB_B2C2_FLEXCOP_DEBUG | config DVB_B2C2_FLEXCOP_DEBUG | ||||||
|  |  | ||||||
|  | @ -4,14 +4,16 @@ | ||||||
| 
 | 
 | ||||||
| config SMS_SIANO_MDTV | config SMS_SIANO_MDTV | ||||||
| 	tristate | 	tristate | ||||||
| 	depends on DVB_CORE && RC_CORE && HAS_DMA | 	depends on DVB_CORE && HAS_DMA | ||||||
|  | 	depends on !RC_CORE || RC_CORE | ||||||
| 	depends on SMS_USB_DRV || SMS_SDIO_DRV | 	depends on SMS_USB_DRV || SMS_SDIO_DRV | ||||||
| 	default y | 	default y | ||||||
|  | 
 | ||||||
|  | config SMS_SIANO_RC | ||||||
|  | 	bool "Enable Remote Controller support for Siano devices" | ||||||
|  | 	depends on SMS_SIANO_MDTV && RC_CORE | ||||||
|  | 	depends on SMS_USB_DRV || SMS_SDIO_DRV | ||||||
|  | 	depends on MEDIA_COMMON_OPTIONS | ||||||
|  | 	default y | ||||||
| 	---help--- | 	---help--- | ||||||
| 	  Choose Y or M here if you have MDTV receiver with a Siano chipset. | 	  Choose Y to select Remote Controller support for Siano driver. | ||||||
| 
 |  | ||||||
| 	  To compile this driver as a module, choose M here |  | ||||||
| 	  (The module will be called smsmdtv). |  | ||||||
| 
 |  | ||||||
| 	  Further documentation on this driver can be found on the WWW |  | ||||||
| 	  at http://www.siano-ms.com/ |  | ||||||
|  |  | ||||||
|  | @ -1,7 +1,11 @@ | ||||||
| smsmdtv-objs := smscoreapi.o sms-cards.o smsendian.o smsir.o | smsmdtv-objs := smscoreapi.o sms-cards.o smsendian.o | ||||||
| 
 | 
 | ||||||
| obj-$(CONFIG_SMS_SIANO_MDTV) += smsmdtv.o smsdvb.o | obj-$(CONFIG_SMS_SIANO_MDTV) += smsmdtv.o smsdvb.o | ||||||
| 
 | 
 | ||||||
|  | ifeq ($(CONFIG_SMS_SIANO_RC),y) | ||||||
|  |   smsmdtv-objs += smsir.o | ||||||
|  | endif | ||||||
|  | 
 | ||||||
| ccflags-y += -Idrivers/media/dvb-core | ccflags-y += -Idrivers/media/dvb-core | ||||||
| ccflags-y += $(extra-cflags-y) $(extra-cflags-m) | ccflags-y += $(extra-cflags-y) $(extra-cflags-m) | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1092,7 +1092,7 @@ EXPORT_SYMBOL_GPL(smscore_onresponse); | ||||||
|  * @return pointer to descriptor on success, NULL on error. |  * @return pointer to descriptor on success, NULL on error. | ||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
| struct smscore_buffer_t *get_entry(struct smscore_device_t *coredev) | static struct smscore_buffer_t *get_entry(struct smscore_device_t *coredev) | ||||||
| { | { | ||||||
| 	struct smscore_buffer_t *cb = NULL; | 	struct smscore_buffer_t *cb = NULL; | ||||||
| 	unsigned long flags; | 	unsigned long flags; | ||||||
|  |  | ||||||
|  | @ -88,7 +88,7 @@ int sms_ir_init(struct smscore_device_t *coredev) | ||||||
| 
 | 
 | ||||||
| 	dev->priv = coredev; | 	dev->priv = coredev; | ||||||
| 	dev->driver_type = RC_DRIVER_IR_RAW; | 	dev->driver_type = RC_DRIVER_IR_RAW; | ||||||
| 	dev->allowed_protos = RC_TYPE_ALL; | 	dev->allowed_protos = RC_BIT_ALL; | ||||||
| 	dev->map_name = sms_get_board(board_id)->rc_codes; | 	dev->map_name = sms_get_board(board_id)->rc_codes; | ||||||
| 	dev->driver_name = MODULE_NAME; | 	dev->driver_name = MODULE_NAME; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -46,10 +46,19 @@ struct ir_t { | ||||||
| 	u32 controller; | 	u32 controller; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | #ifdef CONFIG_SMS_SIANO_RC | ||||||
| int sms_ir_init(struct smscore_device_t *coredev); | int sms_ir_init(struct smscore_device_t *coredev); | ||||||
| void sms_ir_exit(struct smscore_device_t *coredev); | void sms_ir_exit(struct smscore_device_t *coredev); | ||||||
| void sms_ir_event(struct smscore_device_t *coredev, | void sms_ir_event(struct smscore_device_t *coredev, | ||||||
| 			const char *buf, int len); | 			const char *buf, int len); | ||||||
|  | #else | ||||||
|  | inline static int sms_ir_init(struct smscore_device_t *coredev) { | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  | inline static void sms_ir_exit(struct smscore_device_t *coredev) {}; | ||||||
|  | inline static void sms_ir_event(struct smscore_device_t *coredev, | ||||||
|  | 			const char *buf, int len) {}; | ||||||
|  | #endif | ||||||
| 
 | 
 | ||||||
| #endif /* __SMS_IR_H__ */ | #endif /* __SMS_IR_H__ */ | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -877,7 +877,7 @@ static int dvb_dmxdev_pes_filter_set(struct dmxdev *dmxdev, | ||||||
| 	dvb_dmxdev_filter_stop(dmxdevfilter); | 	dvb_dmxdev_filter_stop(dmxdevfilter); | ||||||
| 	dvb_dmxdev_filter_reset(dmxdevfilter); | 	dvb_dmxdev_filter_reset(dmxdevfilter); | ||||||
| 
 | 
 | ||||||
| 	if (params->pes_type > DMX_PES_OTHER || params->pes_type < 0) | 	if ((unsigned)params->pes_type > DMX_PES_OTHER) | ||||||
| 		return -EINVAL; | 		return -EINVAL; | ||||||
| 
 | 
 | ||||||
| 	dmxdevfilter->type = DMXDEV_TYPE_PES; | 	dmxdevfilter->type = DMXDEV_TYPE_PES; | ||||||
|  |  | ||||||
|  | @ -26,6 +26,7 @@ | ||||||
| #include <linux/types.h> | #include <linux/types.h> | ||||||
| #include <linux/spinlock.h> | #include <linux/spinlock.h> | ||||||
| #include <linux/kernel.h> | #include <linux/kernel.h> | ||||||
|  | #include <linux/time.h> | ||||||
| #include <linux/timer.h> | #include <linux/timer.h> | ||||||
| #include <linux/wait.h> | #include <linux/wait.h> | ||||||
| #include <linux/fs.h> | #include <linux/fs.h> | ||||||
|  |  | ||||||
|  | @ -250,6 +250,7 @@ | ||||||
| #define USB_PID_TERRATEC_T3				0x10a0 | #define USB_PID_TERRATEC_T3				0x10a0 | ||||||
| #define USB_PID_TERRATEC_T5				0x10a1 | #define USB_PID_TERRATEC_T5				0x10a1 | ||||||
| #define USB_PID_NOXON_DAB_STICK				0x00b3 | #define USB_PID_NOXON_DAB_STICK				0x00b3 | ||||||
|  | #define USB_PID_NOXON_DAB_STICK_REV2			0x00e0 | ||||||
| #define USB_PID_PINNACLE_EXPRESSCARD_320CX		0x022e | #define USB_PID_PINNACLE_EXPRESSCARD_320CX		0x022e | ||||||
| #define USB_PID_PINNACLE_PCTV2000E			0x022c | #define USB_PID_PINNACLE_PCTV2000E			0x022c | ||||||
| #define USB_PID_PINNACLE_PCTV_DVB_T_FLASH		0x0228 | #define USB_PID_PINNACLE_PCTV_DVB_T_FLASH		0x0228 | ||||||
|  |  | ||||||
|  | @ -1029,12 +1029,6 @@ static struct dtv_cmds_h dtv_cmds[DTV_MAX_COMMAND + 1] = { | ||||||
| 	/* Get */ | 	/* Get */ | ||||||
| 	_DTV_CMD(DTV_DISEQC_SLAVE_REPLY, 0, 1), | 	_DTV_CMD(DTV_DISEQC_SLAVE_REPLY, 0, 1), | ||||||
| 	_DTV_CMD(DTV_API_VERSION, 0, 0), | 	_DTV_CMD(DTV_API_VERSION, 0, 0), | ||||||
| 	_DTV_CMD(DTV_CODE_RATE_HP, 0, 0), |  | ||||||
| 	_DTV_CMD(DTV_CODE_RATE_LP, 0, 0), |  | ||||||
| 	_DTV_CMD(DTV_GUARD_INTERVAL, 0, 0), |  | ||||||
| 	_DTV_CMD(DTV_TRANSMISSION_MODE, 0, 0), |  | ||||||
| 	_DTV_CMD(DTV_HIERARCHY, 0, 0), |  | ||||||
| 	_DTV_CMD(DTV_INTERLEAVING, 0, 0), |  | ||||||
| 
 | 
 | ||||||
| 	_DTV_CMD(DTV_ENUM_DELSYS, 0, 0), | 	_DTV_CMD(DTV_ENUM_DELSYS, 0, 0), | ||||||
| 
 | 
 | ||||||
|  | @ -1042,13 +1036,11 @@ static struct dtv_cmds_h dtv_cmds[DTV_MAX_COMMAND + 1] = { | ||||||
| 	_DTV_CMD(DTV_ATSCMH_RS_FRAME_ENSEMBLE, 1, 0), | 	_DTV_CMD(DTV_ATSCMH_RS_FRAME_ENSEMBLE, 1, 0), | ||||||
| 
 | 
 | ||||||
| 	_DTV_CMD(DTV_ATSCMH_FIC_VER, 0, 0), | 	_DTV_CMD(DTV_ATSCMH_FIC_VER, 0, 0), | ||||||
| 	_DTV_CMD(DTV_ATSCMH_PARADE_ID, 0, 0), |  | ||||||
| 	_DTV_CMD(DTV_ATSCMH_NOG, 0, 0), | 	_DTV_CMD(DTV_ATSCMH_NOG, 0, 0), | ||||||
| 	_DTV_CMD(DTV_ATSCMH_TNOG, 0, 0), | 	_DTV_CMD(DTV_ATSCMH_TNOG, 0, 0), | ||||||
| 	_DTV_CMD(DTV_ATSCMH_SGN, 0, 0), | 	_DTV_CMD(DTV_ATSCMH_SGN, 0, 0), | ||||||
| 	_DTV_CMD(DTV_ATSCMH_PRC, 0, 0), | 	_DTV_CMD(DTV_ATSCMH_PRC, 0, 0), | ||||||
| 	_DTV_CMD(DTV_ATSCMH_RS_FRAME_MODE, 0, 0), | 	_DTV_CMD(DTV_ATSCMH_RS_FRAME_MODE, 0, 0), | ||||||
| 	_DTV_CMD(DTV_ATSCMH_RS_FRAME_ENSEMBLE, 0, 0), |  | ||||||
| 	_DTV_CMD(DTV_ATSCMH_RS_CODE_MODE_PRI, 0, 0), | 	_DTV_CMD(DTV_ATSCMH_RS_CODE_MODE_PRI, 0, 0), | ||||||
| 	_DTV_CMD(DTV_ATSCMH_RS_CODE_MODE_SEC, 0, 0), | 	_DTV_CMD(DTV_ATSCMH_RS_CODE_MODE_SEC, 0, 0), | ||||||
| 	_DTV_CMD(DTV_ATSCMH_SCCC_BLOCK_MODE, 0, 0), | 	_DTV_CMD(DTV_ATSCMH_SCCC_BLOCK_MODE, 0, 0), | ||||||
|  | @ -1056,8 +1048,6 @@ static struct dtv_cmds_h dtv_cmds[DTV_MAX_COMMAND + 1] = { | ||||||
| 	_DTV_CMD(DTV_ATSCMH_SCCC_CODE_MODE_B, 0, 0), | 	_DTV_CMD(DTV_ATSCMH_SCCC_CODE_MODE_B, 0, 0), | ||||||
| 	_DTV_CMD(DTV_ATSCMH_SCCC_CODE_MODE_C, 0, 0), | 	_DTV_CMD(DTV_ATSCMH_SCCC_CODE_MODE_C, 0, 0), | ||||||
| 	_DTV_CMD(DTV_ATSCMH_SCCC_CODE_MODE_D, 0, 0), | 	_DTV_CMD(DTV_ATSCMH_SCCC_CODE_MODE_D, 0, 0), | ||||||
| 
 |  | ||||||
| 	_DTV_CMD(DTV_LNA, 0, 0), |  | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| static void dtv_property_dump(struct dvb_frontend *fe, struct dtv_property *tvp) | static void dtv_property_dump(struct dvb_frontend *fe, struct dtv_property *tvp) | ||||||
|  |  | ||||||
|  | @ -139,7 +139,7 @@ static int cx22700_set_tps(struct cx22700_state *state, | ||||||
| 	if (p->code_rate_HP == FEC_4_5 || p->code_rate_LP == FEC_4_5) | 	if (p->code_rate_HP == FEC_4_5 || p->code_rate_LP == FEC_4_5) | ||||||
| 		return -EINVAL; | 		return -EINVAL; | ||||||
| 
 | 
 | ||||||
| 	if (p->guard_interval < GUARD_INTERVAL_1_32 || | 	if ((int)p->guard_interval < GUARD_INTERVAL_1_32 || | ||||||
| 	    p->guard_interval > GUARD_INTERVAL_1_4) | 	    p->guard_interval > GUARD_INTERVAL_1_4) | ||||||
| 		return -EINVAL; | 		return -EINVAL; | ||||||
| 
 | 
 | ||||||
|  | @ -152,7 +152,7 @@ static int cx22700_set_tps(struct cx22700_state *state, | ||||||
| 	    p->modulation != QAM_64) | 	    p->modulation != QAM_64) | ||||||
| 		return -EINVAL; | 		return -EINVAL; | ||||||
| 
 | 
 | ||||||
| 	if (p->hierarchy < HIERARCHY_NONE || | 	if ((int)p->hierarchy < HIERARCHY_NONE || | ||||||
| 	    p->hierarchy > HIERARCHY_4) | 	    p->hierarchy > HIERARCHY_4) | ||||||
| 		return -EINVAL; | 		return -EINVAL; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -338,7 +338,7 @@ static int cx24123_set_fec(struct cx24123_state *state, fe_code_rate_t fec) | ||||||
| { | { | ||||||
| 	u8 nom_reg = cx24123_readreg(state, 0x0e) & ~0x07; | 	u8 nom_reg = cx24123_readreg(state, 0x0e) & ~0x07; | ||||||
| 
 | 
 | ||||||
| 	if ((fec < FEC_NONE) || (fec > FEC_AUTO)) | 	if (((int)fec < FEC_NONE) || (fec > FEC_AUTO)) | ||||||
| 		fec = FEC_AUTO; | 		fec = FEC_AUTO; | ||||||
| 
 | 
 | ||||||
| 	/* Set the soft decision threshold */ | 	/* Set the soft decision threshold */ | ||||||
|  |  | ||||||
|  | @ -97,7 +97,7 @@ static inline int dib9000_set_slave_frontend(struct dvb_frontend *fe, struct dvb | ||||||
| 	return -ENODEV; | 	return -ENODEV; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int dib9000_remove_slave_frontend(struct dvb_frontend *fe) | static inline int dib9000_remove_slave_frontend(struct dvb_frontend *fe) | ||||||
| { | { | ||||||
| 	printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__); | 	printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__); | ||||||
| 	return -ENODEV; | 	return -ENODEV; | ||||||
|  |  | ||||||
|  | @ -1748,7 +1748,8 @@ static int DRX_Stop(struct drxd_state *state) | ||||||
| 	return status; | 	return status; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int SetOperationMode(struct drxd_state *state, int oMode) | #if 0	/* Currently unused */
 | ||||||
|  | static int SetOperationMode(struct drxd_state *state, int oMode) | ||||||
| { | { | ||||||
| 	int status; | 	int status; | ||||||
| 
 | 
 | ||||||
|  | @ -1788,6 +1789,7 @@ int SetOperationMode(struct drxd_state *state, int oMode) | ||||||
| 		state->operation_mode = oMode; | 		state->operation_mode = oMode; | ||||||
| 	return status; | 	return status; | ||||||
| } | } | ||||||
|  | #endif | ||||||
| 
 | 
 | ||||||
| static int StartDiversity(struct drxd_state *state) | static int StartDiversity(struct drxd_state *state) | ||||||
| { | { | ||||||
|  | @ -2612,7 +2614,7 @@ static int CDRXD(struct drxd_state *state, u32 IntermediateFrequency) | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int DRXD_init(struct drxd_state *state, const u8 * fw, u32 fw_size) | static int DRXD_init(struct drxd_state *state, const u8 *fw, u32 fw_size) | ||||||
| { | { | ||||||
| 	int status = 0; | 	int status = 0; | ||||||
| 	u32 driverVersion; | 	u32 driverVersion; | ||||||
|  | @ -2774,7 +2776,7 @@ int DRXD_init(struct drxd_state *state, const u8 * fw, u32 fw_size) | ||||||
| 	return status; | 	return status; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int DRXD_status(struct drxd_state *state, u32 * pLockStatus) | static int DRXD_status(struct drxd_state *state, u32 *pLockStatus) | ||||||
| { | { | ||||||
| 	DRX_GetLockStatus(state, pLockStatus); | 	DRX_GetLockStatus(state, pLockStatus); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -65,16 +65,6 @@ static bool IsQAM(struct drxk_state *state) | ||||||
| 	    state->m_OperationMode == OM_QAM_ITU_C; | 	    state->m_OperationMode == OM_QAM_ITU_C; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool IsA1WithPatchCode(struct drxk_state *state) |  | ||||||
| { |  | ||||||
| 	return state->m_DRXK_A1_PATCH_CODE; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| bool IsA1WithRomCode(struct drxk_state *state) |  | ||||||
| { |  | ||||||
| 	return state->m_DRXK_A1_ROM_CODE; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| #define NOA1ROM 0 | #define NOA1ROM 0 | ||||||
| 
 | 
 | ||||||
| #define DRXDAP_FASI_SHORT_FORMAT(addr) (((addr) & 0xFC30FF80) == 0) | #define DRXDAP_FASI_SHORT_FORMAT(addr) (((addr) & 0xFC30FF80) == 0) | ||||||
|  | @ -189,7 +179,7 @@ static inline u32 MulDiv32(u32 a, u32 b, u32 c) | ||||||
| 	return (u32) tmp64; | 	return (u32) tmp64; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| inline u32 Frac28a(u32 a, u32 c) | static inline u32 Frac28a(u32 a, u32 c) | ||||||
| { | { | ||||||
| 	int i = 0; | 	int i = 0; | ||||||
| 	u32 Q1 = 0; | 	u32 Q1 = 0; | ||||||
|  | @ -587,7 +577,7 @@ static int write_block(struct drxk_state *state, u32 Address, | ||||||
| #define DRXK_MAX_RETRIES_POWERUP 20 | #define DRXK_MAX_RETRIES_POWERUP 20 | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| int PowerUpDevice(struct drxk_state *state) | static int PowerUpDevice(struct drxk_state *state) | ||||||
| { | { | ||||||
| 	int status; | 	int status; | ||||||
| 	u8 data = 0; | 	u8 data = 0; | ||||||
|  | @ -720,11 +710,6 @@ static int init_state(struct drxk_state *state) | ||||||
| 
 | 
 | ||||||
| 	state->m_bPowerDown = (ulPowerDown != 0); | 	state->m_bPowerDown = (ulPowerDown != 0); | ||||||
| 
 | 
 | ||||||
| 	state->m_DRXK_A1_PATCH_CODE = false; |  | ||||||
| 	state->m_DRXK_A1_ROM_CODE = false; |  | ||||||
| 	state->m_DRXK_A2_ROM_CODE = false; |  | ||||||
| 	state->m_DRXK_A3_ROM_CODE = false; |  | ||||||
| 	state->m_DRXK_A2_PATCH_CODE = false; |  | ||||||
| 	state->m_DRXK_A3_PATCH_CODE = false; | 	state->m_DRXK_A3_PATCH_CODE = false; | ||||||
| 
 | 
 | ||||||
| 	/* Init AGC and PGA parameters */ | 	/* Init AGC and PGA parameters */ | ||||||
|  | @ -921,7 +906,7 @@ static int GetDeviceCapabilities(struct drxk_state *state) | ||||||
| 	status = write16(state, SCU_RAM_GPIO__A, SCU_RAM_GPIO_HW_LOCK_IND_DISABLE); | 	status = write16(state, SCU_RAM_GPIO__A, SCU_RAM_GPIO_HW_LOCK_IND_DISABLE); | ||||||
| 	if (status < 0) | 	if (status < 0) | ||||||
| 		goto error; | 		goto error; | ||||||
| 	status = write16(state, SIO_TOP_COMM_KEY__A, 0xFABA); | 	status = write16(state, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY_KEY); | ||||||
| 	if (status < 0) | 	if (status < 0) | ||||||
| 		goto error; | 		goto error; | ||||||
| 	status = read16(state, SIO_PDR_OHW_CFG__A, &sioPdrOhwCfg); | 	status = read16(state, SIO_PDR_OHW_CFG__A, &sioPdrOhwCfg); | ||||||
|  | @ -1217,7 +1202,7 @@ static int MPEGTSConfigurePins(struct drxk_state *state, bool mpegEnable) | ||||||
| 		goto error; | 		goto error; | ||||||
| 
 | 
 | ||||||
| 	/*  MPEG TS pad configuration */ | 	/*  MPEG TS pad configuration */ | ||||||
| 	status = write16(state, SIO_TOP_COMM_KEY__A, 0xFABA); | 	status = write16(state, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY_KEY); | ||||||
| 	if (status < 0) | 	if (status < 0) | ||||||
| 		goto error; | 		goto error; | ||||||
| 
 | 
 | ||||||
|  | @ -5461,6 +5446,7 @@ static int QAMDemodulatorCommand(struct drxk_state *state, | ||||||
| 	} else { | 	} else { | ||||||
| 		printk(KERN_WARNING "drxk: Unknown QAM demodulator parameter " | 		printk(KERN_WARNING "drxk: Unknown QAM demodulator parameter " | ||||||
| 			"count %d\n", numberOfParameters); | 			"count %d\n", numberOfParameters); | ||||||
|  | 		status = -EINVAL; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| error: | error: | ||||||
|  |  | ||||||
|  | @ -320,11 +320,7 @@ struct drxk_state { | ||||||
| 
 | 
 | ||||||
| 	u8               *m_microcode; | 	u8               *m_microcode; | ||||||
| 	int               m_microcode_length; | 	int               m_microcode_length; | ||||||
| 	bool              m_DRXK_A1_PATCH_CODE; |  | ||||||
| 	bool              m_DRXK_A1_ROM_CODE; |  | ||||||
| 	bool              m_DRXK_A2_ROM_CODE; |  | ||||||
| 	bool		  m_DRXK_A3_ROM_CODE; | 	bool		  m_DRXK_A3_ROM_CODE; | ||||||
| 	bool              m_DRXK_A2_PATCH_CODE; |  | ||||||
| 	bool              m_DRXK_A3_PATCH_CODE; | 	bool              m_DRXK_A3_PATCH_CODE; | ||||||
| 
 | 
 | ||||||
| 	bool              m_rfmirror; | 	bool              m_rfmirror; | ||||||
|  |  | ||||||
|  | @ -30,7 +30,6 @@ | ||||||
| #include "ds3000.h" | #include "ds3000.h" | ||||||
| 
 | 
 | ||||||
| static int debug; | static int debug; | ||||||
| static int force_fw_upload; |  | ||||||
| 
 | 
 | ||||||
| #define dprintk(args...) \ | #define dprintk(args...) \ | ||||||
| 	do { \ | 	do { \ | ||||||
|  | @ -234,7 +233,6 @@ struct ds3000_state { | ||||||
| 	struct i2c_adapter *i2c; | 	struct i2c_adapter *i2c; | ||||||
| 	const struct ds3000_config *config; | 	const struct ds3000_config *config; | ||||||
| 	struct dvb_frontend frontend; | 	struct dvb_frontend frontend; | ||||||
| 	u8 skip_fw_load; |  | ||||||
| 	/* previous uncorrected block counter for DVB-S2 */ | 	/* previous uncorrected block counter for DVB-S2 */ | ||||||
| 	u16 prevUCBS2; | 	u16 prevUCBS2; | ||||||
| }; | }; | ||||||
|  | @ -397,9 +395,6 @@ static int ds3000_firmware_ondemand(struct dvb_frontend *fe) | ||||||
| 	if (ret < 0) | 	if (ret < 0) | ||||||
| 		return ret; | 		return ret; | ||||||
| 
 | 
 | ||||||
| 	if (state->skip_fw_load || !force_fw_upload) |  | ||||||
| 		return 0;	/* Firmware already uploaded, skipping */ |  | ||||||
| 
 |  | ||||||
| 	/* Load firmware */ | 	/* Load firmware */ | ||||||
| 	/* request the firmware, this will block until someone uploads it */ | 	/* request the firmware, this will block until someone uploads it */ | ||||||
| 	printk(KERN_INFO "%s: Waiting for firmware upload (%s)...\n", __func__, | 	printk(KERN_INFO "%s: Waiting for firmware upload (%s)...\n", __func__, | ||||||
|  | @ -413,9 +408,6 @@ static int ds3000_firmware_ondemand(struct dvb_frontend *fe) | ||||||
| 		return ret; | 		return ret; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	/* Make sure we don't recurse back through here during loading */ |  | ||||||
| 	state->skip_fw_load = 1; |  | ||||||
| 
 |  | ||||||
| 	ret = ds3000_load_firmware(fe, fw); | 	ret = ds3000_load_firmware(fe, fw); | ||||||
| 	if (ret) | 	if (ret) | ||||||
| 		printk("%s: Writing firmware to device failed\n", __func__); | 		printk("%s: Writing firmware to device failed\n", __func__); | ||||||
|  | @ -425,9 +417,6 @@ static int ds3000_firmware_ondemand(struct dvb_frontend *fe) | ||||||
| 	dprintk("%s: Firmware upload %s\n", __func__, | 	dprintk("%s: Firmware upload %s\n", __func__, | ||||||
| 			ret == 0 ? "complete" : "failed"); | 			ret == 0 ? "complete" : "failed"); | ||||||
| 
 | 
 | ||||||
| 	/* Ensure firmware is always loaded if required */ |  | ||||||
| 	state->skip_fw_load = 0; |  | ||||||
| 
 |  | ||||||
| 	return ret; | 	return ret; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -1309,10 +1298,8 @@ static struct dvb_frontend_ops ds3000_ops = { | ||||||
| module_param(debug, int, 0644); | module_param(debug, int, 0644); | ||||||
| MODULE_PARM_DESC(debug, "Activates frontend debugging (default:0)"); | MODULE_PARM_DESC(debug, "Activates frontend debugging (default:0)"); | ||||||
| 
 | 
 | ||||||
| module_param(force_fw_upload, int, 0644); |  | ||||||
| MODULE_PARM_DESC(force_fw_upload, "Force firmware upload (default:0)"); |  | ||||||
| 
 |  | ||||||
| MODULE_DESCRIPTION("DVB Frontend module for Montage Technology " | MODULE_DESCRIPTION("DVB Frontend module for Montage Technology " | ||||||
| 			"DS3000/TS2020 hardware"); | 			"DS3000/TS2020 hardware"); | ||||||
| MODULE_AUTHOR("Konstantin Dimitrov"); | MODULE_AUTHOR("Konstantin Dimitrov"); | ||||||
| MODULE_LICENSE("GPL"); | MODULE_LICENSE("GPL"); | ||||||
|  | MODULE_FIRMWARE(DS3000_DEFAULT_FIRMWARE); | ||||||
|  |  | ||||||
|  | @ -180,11 +180,11 @@ static int apply_frontend_param(struct dvb_frontend *fe) | ||||||
| 	    p->transmission_mode != TRANSMISSION_MODE_8K) | 	    p->transmission_mode != TRANSMISSION_MODE_8K) | ||||||
| 		return -EINVAL; | 		return -EINVAL; | ||||||
| 
 | 
 | ||||||
| 	if (p->guard_interval < GUARD_INTERVAL_1_32 || | 	if ((int)p->guard_interval < GUARD_INTERVAL_1_32 || | ||||||
| 	    p->guard_interval > GUARD_INTERVAL_1_4) | 	    p->guard_interval > GUARD_INTERVAL_1_4) | ||||||
| 		return -EINVAL; | 		return -EINVAL; | ||||||
| 
 | 
 | ||||||
| 	if (p->hierarchy < HIERARCHY_NONE || | 	if ((int)p->hierarchy < HIERARCHY_NONE || | ||||||
| 	    p->hierarchy > HIERARCHY_4) | 	    p->hierarchy > HIERARCHY_4) | ||||||
| 		return -EINVAL; | 		return -EINVAL; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -549,7 +549,7 @@ static int mt312_set_frontend(struct dvb_frontend *fe) | ||||||
| 	    || (p->frequency > fe->ops.info.frequency_max)) | 	    || (p->frequency > fe->ops.info.frequency_max)) | ||||||
| 		return -EINVAL; | 		return -EINVAL; | ||||||
| 
 | 
 | ||||||
| 	if ((p->inversion < INVERSION_OFF) | 	if (((int)p->inversion < INVERSION_OFF) | ||||||
| 	    || (p->inversion > INVERSION_ON)) | 	    || (p->inversion > INVERSION_ON)) | ||||||
| 		return -EINVAL; | 		return -EINVAL; | ||||||
| 
 | 
 | ||||||
|  | @ -557,7 +557,7 @@ static int mt312_set_frontend(struct dvb_frontend *fe) | ||||||
| 	    || (p->symbol_rate > fe->ops.info.symbol_rate_max)) | 	    || (p->symbol_rate > fe->ops.info.symbol_rate_max)) | ||||||
| 		return -EINVAL; | 		return -EINVAL; | ||||||
| 
 | 
 | ||||||
| 	if ((p->fec_inner < FEC_NONE) | 	if (((int)p->fec_inner < FEC_NONE) | ||||||
| 	    || (p->fec_inner > FEC_AUTO)) | 	    || (p->fec_inner > FEC_AUTO)) | ||||||
| 		return -EINVAL; | 		return -EINVAL; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -130,7 +130,7 @@ static int rtl2830_rd_reg(struct rtl2830_priv *priv, u16 reg, u8 *val) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* write single register with mask */ | /* write single register with mask */ | ||||||
| int rtl2830_wr_reg_mask(struct rtl2830_priv *priv, u16 reg, u8 val, u8 mask) | static int rtl2830_wr_reg_mask(struct rtl2830_priv *priv, u16 reg, u8 val, u8 mask) | ||||||
| { | { | ||||||
| 	int ret; | 	int ret; | ||||||
| 	u8 tmp; | 	u8 tmp; | ||||||
|  | @ -150,7 +150,7 @@ int rtl2830_wr_reg_mask(struct rtl2830_priv *priv, u16 reg, u8 val, u8 mask) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* read single register with mask */ | /* read single register with mask */ | ||||||
| int rtl2830_rd_reg_mask(struct rtl2830_priv *priv, u16 reg, u8 *val, u8 mask) | static int rtl2830_rd_reg_mask(struct rtl2830_priv *priv, u16 reg, u8 *val, u8 mask) | ||||||
| { | { | ||||||
| 	int ret, i; | 	int ret, i; | ||||||
| 	u8 tmp; | 	u8 tmp; | ||||||
|  | @ -256,7 +256,7 @@ static int rtl2830_sleep(struct dvb_frontend *fe) | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int rtl2830_get_tune_settings(struct dvb_frontend *fe, | static int rtl2830_get_tune_settings(struct dvb_frontend *fe, | ||||||
| 	struct dvb_frontend_tune_settings *s) | 	struct dvb_frontend_tune_settings *s) | ||||||
| { | { | ||||||
| 	s->min_delay_ms = 500; | 	s->min_delay_ms = 500; | ||||||
|  |  | ||||||
|  | @ -265,7 +265,7 @@ static int rtl2832_rd_reg(struct rtl2832_priv *priv, u8 reg, u8 page, u8 *val) | ||||||
| 	return rtl2832_rd_regs(priv, reg, page, val, 1); | 	return rtl2832_rd_regs(priv, reg, page, val, 1); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int rtl2832_rd_demod_reg(struct rtl2832_priv *priv, int reg, u32 *val) | static int rtl2832_rd_demod_reg(struct rtl2832_priv *priv, int reg, u32 *val) | ||||||
| { | { | ||||||
| 	int ret; | 	int ret; | ||||||
| 
 | 
 | ||||||
|  | @ -305,7 +305,7 @@ err: | ||||||
| 
 | 
 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int rtl2832_wr_demod_reg(struct rtl2832_priv *priv, int reg, u32 val) | static int rtl2832_wr_demod_reg(struct rtl2832_priv *priv, int reg, u32 val) | ||||||
| { | { | ||||||
| 	int ret, i; | 	int ret, i; | ||||||
| 	u8 len; | 	u8 len; | ||||||
|  | @ -510,7 +510,7 @@ static int rtl2832_sleep(struct dvb_frontend *fe) | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int rtl2832_get_tune_settings(struct dvb_frontend *fe, | static int rtl2832_get_tune_settings(struct dvb_frontend *fe, | ||||||
| 	struct dvb_frontend_tune_settings *s) | 	struct dvb_frontend_tune_settings *s) | ||||||
| { | { | ||||||
| 	struct rtl2832_priv *priv = fe->demodulator_priv; | 	struct rtl2832_priv *priv = fe->demodulator_priv; | ||||||
|  |  | ||||||
|  | @ -1260,7 +1260,7 @@ static inline void CONVERT32(u32 x, char *str) | ||||||
| 	*str	= '\0'; | 	*str	= '\0'; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int stb0899_get_dev_id(struct stb0899_state *state) | static int stb0899_get_dev_id(struct stb0899_state *state) | ||||||
| { | { | ||||||
| 	u8 chip_id, release; | 	u8 chip_id, release; | ||||||
| 	u16 id; | 	u16 id; | ||||||
|  |  | ||||||
|  | @ -879,7 +879,8 @@ static u8 stv0367_readbits(struct stv0367_state *state, u32 label) | ||||||
| 	return val; | 	return val; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| u8 stv0367_getbits(u8 reg, u32 label) | #if 0 /* Currently, unused */
 | ||||||
|  | static u8 stv0367_getbits(u8 reg, u32 label) | ||||||
| { | { | ||||||
| 	u8 mask, pos; | 	u8 mask, pos; | ||||||
| 
 | 
 | ||||||
|  | @ -887,7 +888,7 @@ u8 stv0367_getbits(u8 reg, u32 label) | ||||||
| 
 | 
 | ||||||
| 	return (reg & mask) >> pos; | 	return (reg & mask) >> pos; | ||||||
| } | } | ||||||
| 
 | #endif | ||||||
| static int stv0367ter_gate_ctrl(struct dvb_frontend *fe, int enable) | static int stv0367ter_gate_ctrl(struct dvb_frontend *fe, int enable) | ||||||
| { | { | ||||||
| 	struct stv0367_state *state = fe->demodulator_priv; | 	struct stv0367_state *state = fe->demodulator_priv; | ||||||
|  | @ -1263,8 +1264,8 @@ stv0367_ter_signal_type stv0367ter_check_cpamp(struct stv0367_state *state, | ||||||
| 	return CPAMPStatus; | 	return CPAMPStatus; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| enum | static enum stv0367_ter_signal_type | ||||||
| stv0367_ter_signal_type stv0367ter_lock_algo(struct stv0367_state *state) | stv0367ter_lock_algo(struct stv0367_state *state) | ||||||
| { | { | ||||||
| 	enum stv0367_ter_signal_type ret_flag; | 	enum stv0367_ter_signal_type ret_flag; | ||||||
| 	short int wd, tempo; | 	short int wd, tempo; | ||||||
|  | @ -1528,7 +1529,7 @@ static int stv0367ter_sleep(struct dvb_frontend *fe) | ||||||
| 	return stv0367ter_standby(fe, 1); | 	return stv0367ter_standby(fe, 1); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int stv0367ter_init(struct dvb_frontend *fe) | static int stv0367ter_init(struct dvb_frontend *fe) | ||||||
| { | { | ||||||
| 	struct stv0367_state *state = fe->demodulator_priv; | 	struct stv0367_state *state = fe->demodulator_priv; | ||||||
| 	struct stv0367ter_state *ter_state = state->ter_state; | 	struct stv0367ter_state *ter_state = state->ter_state; | ||||||
|  | @ -2378,7 +2379,7 @@ static u32 stv0367cab_get_adc_freq(struct dvb_frontend *fe, u32 ExtClk_Hz) | ||||||
| 	return ADCClk_Hz; | 	return ADCClk_Hz; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| enum stv0367cab_mod stv0367cab_SetQamSize(struct stv0367_state *state, | static enum stv0367cab_mod stv0367cab_SetQamSize(struct stv0367_state *state, | ||||||
| 						 u32 SymbolRate, | 						 u32 SymbolRate, | ||||||
| 						 enum stv0367cab_mod QAMSize) | 						 enum stv0367cab_mod QAMSize) | ||||||
| { | { | ||||||
|  | @ -2762,7 +2763,7 @@ static int stv0367cab_sleep(struct dvb_frontend *fe) | ||||||
| 	return stv0367cab_standby(fe, 1); | 	return stv0367cab_standby(fe, 1); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int stv0367cab_init(struct dvb_frontend *fe) | static int stv0367cab_init(struct dvb_frontend *fe) | ||||||
| { | { | ||||||
| 	struct stv0367_state *state = fe->demodulator_priv; | 	struct stv0367_state *state = fe->demodulator_priv; | ||||||
| 	struct stv0367cab_state *cab_state = state->cab_state; | 	struct stv0367cab_state *cab_state = state->cab_state; | ||||||
|  |  | ||||||
|  | @ -96,7 +96,8 @@ static int tda10071_rd_reg(struct tda10071_priv *priv, u8 reg, u8 *val) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* write single register with mask */ | /* write single register with mask */ | ||||||
| int tda10071_wr_reg_mask(struct tda10071_priv *priv, u8 reg, u8 val, u8 mask) | static int tda10071_wr_reg_mask(struct tda10071_priv *priv, | ||||||
|  | 				u8 reg, u8 val, u8 mask) | ||||||
| { | { | ||||||
| 	int ret; | 	int ret; | ||||||
| 	u8 tmp; | 	u8 tmp; | ||||||
|  | @ -116,7 +117,8 @@ int tda10071_wr_reg_mask(struct tda10071_priv *priv, u8 reg, u8 val, u8 mask) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* read single register with mask */ | /* read single register with mask */ | ||||||
| int tda10071_rd_reg_mask(struct tda10071_priv *priv, u8 reg, u8 *val, u8 mask) | static int tda10071_rd_reg_mask(struct tda10071_priv *priv, | ||||||
|  | 				u8 reg, u8 *val, u8 mask) | ||||||
| { | { | ||||||
| 	int ret, i; | 	int ret, i; | ||||||
| 	u8 tmp; | 	u8 tmp; | ||||||
|  |  | ||||||
|  | @ -32,6 +32,7 @@ | ||||||
| #include <asm/div64.h> | #include <asm/div64.h> | ||||||
| 
 | 
 | ||||||
| #include "dvb_frontend.h" | #include "dvb_frontend.h" | ||||||
|  | #include "tda18271c2dd.h" | ||||||
| 
 | 
 | ||||||
| struct SStandardParam { | struct SStandardParam { | ||||||
| 	s32   m_IFFrequency; | 	s32   m_IFFrequency; | ||||||
|  |  | ||||||
|  | @ -13,6 +13,7 @@ | ||||||
| #ifndef _FIREDTV_H | #ifndef _FIREDTV_H | ||||||
| #define _FIREDTV_H | #define _FIREDTV_H | ||||||
| 
 | 
 | ||||||
|  | #include <linux/time.h> | ||||||
| #include <linux/dvb/dmx.h> | #include <linux/dvb/dmx.h> | ||||||
| #include <linux/dvb/frontend.h> | #include <linux/dvb/frontend.h> | ||||||
| #include <linux/list.h> | #include <linux/list.h> | ||||||
|  |  | ||||||
|  | @ -3,10 +3,10 @@ | ||||||
|  * |  * | ||||||
|  * Copyright (C) 2008--2011 Nokia Corporation |  * Copyright (C) 2008--2011 Nokia Corporation | ||||||
|  * |  * | ||||||
|  * Contact: Sakari Ailus <sakari.ailus@maxwell.research.nokia.com> |  * Contact: Sakari Ailus <sakari.ailus@iki.fi> | ||||||
|  * |  * | ||||||
|  * Contributors: |  * Contributors: | ||||||
|  *	Sakari Ailus <sakari.ailus@maxwell.research.nokia.com> |  *	Sakari Ailus <sakari.ailus@iki.fi> | ||||||
|  *	Tuukka Toivonen <tuukkat76@gmail.com> |  *	Tuukka Toivonen <tuukkat76@gmail.com> | ||||||
|  * |  * | ||||||
|  * This program is free software; you can redistribute it and/or |  * This program is free software; you can redistribute it and/or | ||||||
|  |  | ||||||
|  | @ -681,18 +681,7 @@ static struct i2c_driver adv7183_driver = { | ||||||
| 	.id_table       = adv7183_id, | 	.id_table       = adv7183_id, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| static __init int adv7183_init(void) | module_i2c_driver(adv7183_driver); | ||||||
| { |  | ||||||
| 	return i2c_add_driver(&adv7183_driver); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| static __exit void adv7183_exit(void) |  | ||||||
| { |  | ||||||
| 	i2c_del_driver(&adv7183_driver); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| module_init(adv7183_init); |  | ||||||
| module_exit(adv7183_exit); |  | ||||||
| 
 | 
 | ||||||
| MODULE_DESCRIPTION("Analog Devices ADV7183 video decoder driver"); | MODULE_DESCRIPTION("Analog Devices ADV7183 video decoder driver"); | ||||||
| MODULE_AUTHOR("Scott Jiang <Scott.Jiang.Linux@gmail.com>"); | MODULE_AUTHOR("Scott Jiang <Scott.Jiang.Linux@gmail.com>"); | ||||||
|  |  | ||||||
|  | @ -486,8 +486,18 @@ static inline int edid_read_block(struct v4l2_subdev *sd, unsigned len, u8 *val) | ||||||
| 	struct i2c_client *client = state->i2c_edid; | 	struct i2c_client *client = state->i2c_edid; | ||||||
| 	u8 msgbuf0[1] = { 0 }; | 	u8 msgbuf0[1] = { 0 }; | ||||||
| 	u8 msgbuf1[256]; | 	u8 msgbuf1[256]; | ||||||
| 	struct i2c_msg msg[2] = { { client->addr, 0, 1, msgbuf0 }, | 	struct i2c_msg msg[2] = { | ||||||
| 				  { client->addr, 0 | I2C_M_RD, len, msgbuf1 } | 		{ | ||||||
|  | 			.addr = client->addr, | ||||||
|  | 			.len = 1, | ||||||
|  | 			.buf = msgbuf0 | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			.addr = client->addr, | ||||||
|  | 			.flags = I2C_M_RD, | ||||||
|  | 			.len = len, | ||||||
|  | 			.buf = msgbuf1 | ||||||
|  | 		}, | ||||||
| 	}; | 	}; | ||||||
| 
 | 
 | ||||||
| 	if (i2c_transfer(client->adapter, msg, 2) < 0) | 	if (i2c_transfer(client->adapter, msg, 2) < 0) | ||||||
|  |  | ||||||
|  | @ -2065,7 +2065,7 @@ static int cx25840_irq_handler(struct v4l2_subdev *sd, u32 status, | ||||||
| #define DIF_BPF_COEFF3435	(0x38c) | #define DIF_BPF_COEFF3435	(0x38c) | ||||||
| #define DIF_BPF_COEFF36		(0x390) | #define DIF_BPF_COEFF36		(0x390) | ||||||
| 
 | 
 | ||||||
| void cx23885_dif_setup(struct i2c_client *client, u32 ifHz) | static void cx23885_dif_setup(struct i2c_client *client, u32 ifHz) | ||||||
| { | { | ||||||
| 	u64 pll_freq; | 	u64 pll_freq; | ||||||
| 	u32 pll_freq_word; | 	u32 pll_freq_word; | ||||||
|  |  | ||||||
|  | @ -284,7 +284,7 @@ static int ir_probe(struct i2c_client *client, const struct i2c_device_id *id) | ||||||
| { | { | ||||||
| 	char *ir_codes = NULL; | 	char *ir_codes = NULL; | ||||||
| 	const char *name = NULL; | 	const char *name = NULL; | ||||||
| 	u64 rc_type = RC_TYPE_UNKNOWN; | 	u64 rc_type = RC_BIT_UNKNOWN; | ||||||
| 	struct IR_i2c *ir; | 	struct IR_i2c *ir; | ||||||
| 	struct rc_dev *rc = NULL; | 	struct rc_dev *rc = NULL; | ||||||
| 	struct i2c_adapter *adap = client->adapter; | 	struct i2c_adapter *adap = client->adapter; | ||||||
|  | @ -303,7 +303,7 @@ static int ir_probe(struct i2c_client *client, const struct i2c_device_id *id) | ||||||
| 	case 0x64: | 	case 0x64: | ||||||
| 		name        = "Pixelview"; | 		name        = "Pixelview"; | ||||||
| 		ir->get_key = get_key_pixelview; | 		ir->get_key = get_key_pixelview; | ||||||
| 		rc_type     = RC_TYPE_OTHER; | 		rc_type     = RC_BIT_OTHER; | ||||||
| 		ir_codes    = RC_MAP_EMPTY; | 		ir_codes    = RC_MAP_EMPTY; | ||||||
| 		break; | 		break; | ||||||
| 	case 0x18: | 	case 0x18: | ||||||
|  | @ -311,31 +311,31 @@ static int ir_probe(struct i2c_client *client, const struct i2c_device_id *id) | ||||||
| 	case 0x1a: | 	case 0x1a: | ||||||
| 		name        = "Hauppauge"; | 		name        = "Hauppauge"; | ||||||
| 		ir->get_key = get_key_haup; | 		ir->get_key = get_key_haup; | ||||||
| 		rc_type     = RC_TYPE_RC5; | 		rc_type     = RC_BIT_RC5; | ||||||
| 		ir_codes    = RC_MAP_HAUPPAUGE; | 		ir_codes    = RC_MAP_HAUPPAUGE; | ||||||
| 		break; | 		break; | ||||||
| 	case 0x30: | 	case 0x30: | ||||||
| 		name        = "KNC One"; | 		name        = "KNC One"; | ||||||
| 		ir->get_key = get_key_knc1; | 		ir->get_key = get_key_knc1; | ||||||
| 		rc_type     = RC_TYPE_OTHER; | 		rc_type     = RC_BIT_OTHER; | ||||||
| 		ir_codes    = RC_MAP_EMPTY; | 		ir_codes    = RC_MAP_EMPTY; | ||||||
| 		break; | 		break; | ||||||
| 	case 0x6b: | 	case 0x6b: | ||||||
| 		name        = "FusionHDTV"; | 		name        = "FusionHDTV"; | ||||||
| 		ir->get_key = get_key_fusionhdtv; | 		ir->get_key = get_key_fusionhdtv; | ||||||
| 		rc_type     = RC_TYPE_RC5; | 		rc_type     = RC_BIT_RC5; | ||||||
| 		ir_codes    = RC_MAP_FUSIONHDTV_MCE; | 		ir_codes    = RC_MAP_FUSIONHDTV_MCE; | ||||||
| 		break; | 		break; | ||||||
| 	case 0x40: | 	case 0x40: | ||||||
| 		name        = "AVerMedia Cardbus remote"; | 		name        = "AVerMedia Cardbus remote"; | ||||||
| 		ir->get_key = get_key_avermedia_cardbus; | 		ir->get_key = get_key_avermedia_cardbus; | ||||||
| 		rc_type     = RC_TYPE_OTHER; | 		rc_type     = RC_BIT_OTHER; | ||||||
| 		ir_codes    = RC_MAP_AVERMEDIA_CARDBUS; | 		ir_codes    = RC_MAP_AVERMEDIA_CARDBUS; | ||||||
| 		break; | 		break; | ||||||
| 	case 0x71: | 	case 0x71: | ||||||
| 		name        = "Hauppauge/Zilog Z8"; | 		name        = "Hauppauge/Zilog Z8"; | ||||||
| 		ir->get_key = get_key_haup_xvr; | 		ir->get_key = get_key_haup_xvr; | ||||||
| 		rc_type     = RC_TYPE_RC5; | 		rc_type     = RC_BIT_RC5; | ||||||
| 		ir_codes    = RC_MAP_HAUPPAUGE; | 		ir_codes    = RC_MAP_HAUPPAUGE; | ||||||
| 		break; | 		break; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | @ -343,7 +343,7 @@ static int s5k4ecgx_load_firmware(struct v4l2_subdev *sd) | ||||||
| 	} | 	} | ||||||
| 	regs_num = le32_to_cpu(get_unaligned_le32(fw->data)); | 	regs_num = le32_to_cpu(get_unaligned_le32(fw->data)); | ||||||
| 
 | 
 | ||||||
| 	v4l2_dbg(3, debug, sd, "FW: %s size %d register sets %d\n", | 	v4l2_dbg(3, debug, sd, "FW: %s size %zu register sets %d\n", | ||||||
| 		 S5K4ECGX_FIRMWARE, fw->size, regs_num); | 		 S5K4ECGX_FIRMWARE, fw->size, regs_num); | ||||||
| 
 | 
 | ||||||
| 	regs_num++; /* Add header */ | 	regs_num++; /* Add header */ | ||||||
|  |  | ||||||
|  | @ -4,7 +4,7 @@ | ||||||
|  * Generic driver for SMIA/SMIA++ compliant camera modules |  * Generic driver for SMIA/SMIA++ compliant camera modules | ||||||
|  * |  * | ||||||
|  * Copyright (C) 2011--2012 Nokia Corporation |  * Copyright (C) 2011--2012 Nokia Corporation | ||||||
|  * Contact: Sakari Ailus <sakari.ailus@maxwell.research.nokia.com> |  * Contact: Sakari Ailus <sakari.ailus@iki.fi> | ||||||
|  * |  * | ||||||
|  * This program is free software; you can redistribute it and/or |  * This program is free software; you can redistribute it and/or | ||||||
|  * modify it under the terms of the GNU General Public License |  * modify it under the terms of the GNU General Public License | ||||||
|  | @ -58,7 +58,7 @@ static int bounds_check(struct device *dev, uint32_t val, | ||||||
| 	if (val >= min && val <= max) | 	if (val >= min && val <= max) | ||||||
| 		return 0; | 		return 0; | ||||||
| 
 | 
 | ||||||
| 	dev_warn(dev, "%s out of bounds: %d (%d--%d)\n", str, val, min, max); | 	dev_dbg(dev, "%s out of bounds: %d (%d--%d)\n", str, val, min, max); | ||||||
| 
 | 
 | ||||||
| 	return -EINVAL; | 	return -EINVAL; | ||||||
| } | } | ||||||
|  | @ -87,14 +87,14 @@ static void print_pll(struct device *dev, struct smiapp_pll *pll) | ||||||
| 	dev_dbg(dev, "vt_pix_clk_freq_hz \t%d\n", pll->vt_pix_clk_freq_hz); | 	dev_dbg(dev, "vt_pix_clk_freq_hz \t%d\n", pll->vt_pix_clk_freq_hz); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int smiapp_pll_calculate(struct device *dev, struct smiapp_pll_limits *limits, | static int __smiapp_pll_calculate(struct device *dev, | ||||||
| 			 struct smiapp_pll *pll) | 				  const struct smiapp_pll_limits *limits, | ||||||
|  | 				  struct smiapp_pll *pll, uint32_t mul, | ||||||
|  | 				  uint32_t div, uint32_t lane_op_clock_ratio) | ||||||
| { | { | ||||||
| 	uint32_t sys_div; | 	uint32_t sys_div; | ||||||
| 	uint32_t best_pix_div = INT_MAX >> 1; | 	uint32_t best_pix_div = INT_MAX >> 1; | ||||||
| 	uint32_t vt_op_binning_div; | 	uint32_t vt_op_binning_div; | ||||||
| 	uint32_t lane_op_clock_ratio; |  | ||||||
| 	uint32_t mul, div; |  | ||||||
| 	uint32_t more_mul_min, more_mul_max; | 	uint32_t more_mul_min, more_mul_max; | ||||||
| 	uint32_t more_mul_factor; | 	uint32_t more_mul_factor; | ||||||
| 	uint32_t min_vt_div, max_vt_div, vt_div; | 	uint32_t min_vt_div, max_vt_div, vt_div; | ||||||
|  | @ -102,54 +102,6 @@ int smiapp_pll_calculate(struct device *dev, struct smiapp_pll_limits *limits, | ||||||
| 	unsigned int i; | 	unsigned int i; | ||||||
| 	int rval; | 	int rval; | ||||||
| 
 | 
 | ||||||
| 	if (pll->flags & SMIAPP_PLL_FLAG_OP_PIX_CLOCK_PER_LANE) |  | ||||||
| 		lane_op_clock_ratio = pll->lanes; |  | ||||||
| 	else |  | ||||||
| 		lane_op_clock_ratio = 1; |  | ||||||
| 	dev_dbg(dev, "lane_op_clock_ratio: %d\n", lane_op_clock_ratio); |  | ||||||
| 
 |  | ||||||
| 	dev_dbg(dev, "binning: %dx%d\n", pll->binning_horizontal, |  | ||||||
| 		pll->binning_vertical); |  | ||||||
| 
 |  | ||||||
| 	/* CSI transfers 2 bits per clock per lane; thus times 2 */ |  | ||||||
| 	pll->pll_op_clk_freq_hz = pll->link_freq * 2 |  | ||||||
| 		* (pll->lanes / lane_op_clock_ratio); |  | ||||||
| 
 |  | ||||||
| 	/* Figure out limits for pre-pll divider based on extclk */ |  | ||||||
| 	dev_dbg(dev, "min / max pre_pll_clk_div: %d / %d\n", |  | ||||||
| 		limits->min_pre_pll_clk_div, limits->max_pre_pll_clk_div); |  | ||||||
| 	limits->max_pre_pll_clk_div = |  | ||||||
| 		min_t(uint16_t, limits->max_pre_pll_clk_div, |  | ||||||
| 		      clk_div_even(pll->ext_clk_freq_hz / |  | ||||||
| 				   limits->min_pll_ip_freq_hz)); |  | ||||||
| 	limits->min_pre_pll_clk_div = |  | ||||||
| 		max_t(uint16_t, limits->min_pre_pll_clk_div, |  | ||||||
| 		      clk_div_even_up( |  | ||||||
| 			      DIV_ROUND_UP(pll->ext_clk_freq_hz, |  | ||||||
| 					   limits->max_pll_ip_freq_hz))); |  | ||||||
| 	dev_dbg(dev, "pre-pll check: min / max pre_pll_clk_div: %d / %d\n", |  | ||||||
| 		limits->min_pre_pll_clk_div, limits->max_pre_pll_clk_div); |  | ||||||
| 
 |  | ||||||
| 	i = gcd(pll->pll_op_clk_freq_hz, pll->ext_clk_freq_hz); |  | ||||||
| 	mul = div_u64(pll->pll_op_clk_freq_hz, i); |  | ||||||
| 	div = pll->ext_clk_freq_hz / i; |  | ||||||
| 	dev_dbg(dev, "mul %d / div %d\n", mul, div); |  | ||||||
| 
 |  | ||||||
| 	limits->min_pre_pll_clk_div = |  | ||||||
| 		max_t(uint16_t, limits->min_pre_pll_clk_div, |  | ||||||
| 		      clk_div_even_up( |  | ||||||
| 			      DIV_ROUND_UP(mul * pll->ext_clk_freq_hz, |  | ||||||
| 					   limits->max_pll_op_freq_hz))); |  | ||||||
| 	dev_dbg(dev, "pll_op check: min / max pre_pll_clk_div: %d / %d\n", |  | ||||||
| 		limits->min_pre_pll_clk_div, limits->max_pre_pll_clk_div); |  | ||||||
| 
 |  | ||||||
| 	if (limits->min_pre_pll_clk_div > limits->max_pre_pll_clk_div) { |  | ||||||
| 		dev_err(dev, "unable to compute pre_pll divisor\n"); |  | ||||||
| 		return -EINVAL; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	pll->pre_pll_clk_div = limits->min_pre_pll_clk_div; |  | ||||||
| 
 |  | ||||||
| 	/*
 | 	/*
 | ||||||
| 	 * Get pre_pll_clk_div so that our pll_op_clk_freq_hz won't be | 	 * Get pre_pll_clk_div so that our pll_op_clk_freq_hz won't be | ||||||
| 	 * too high. | 	 * too high. | ||||||
|  | @ -162,7 +114,7 @@ int smiapp_pll_calculate(struct device *dev, struct smiapp_pll_limits *limits, | ||||||
| 		more_mul_max); | 		more_mul_max); | ||||||
| 	/* Don't go above max pll op frequency. */ | 	/* Don't go above max pll op frequency. */ | ||||||
| 	more_mul_max = | 	more_mul_max = | ||||||
| 		min_t(int, | 		min_t(uint32_t, | ||||||
| 		      more_mul_max, | 		      more_mul_max, | ||||||
| 		      limits->max_pll_op_freq_hz | 		      limits->max_pll_op_freq_hz | ||||||
| 		      / (pll->ext_clk_freq_hz / pll->pre_pll_clk_div * mul)); | 		      / (pll->ext_clk_freq_hz / pll->pre_pll_clk_div * mul)); | ||||||
|  | @ -170,7 +122,7 @@ int smiapp_pll_calculate(struct device *dev, struct smiapp_pll_limits *limits, | ||||||
| 		more_mul_max); | 		more_mul_max); | ||||||
| 	/* Don't go above the division capability of op sys clock divider. */ | 	/* Don't go above the division capability of op sys clock divider. */ | ||||||
| 	more_mul_max = min(more_mul_max, | 	more_mul_max = min(more_mul_max, | ||||||
| 			   limits->max_op_sys_clk_div * pll->pre_pll_clk_div | 			   limits->op.max_sys_clk_div * pll->pre_pll_clk_div | ||||||
| 			   / div); | 			   / div); | ||||||
| 	dev_dbg(dev, "more_mul_max: max_op_sys_clk_div check: %d\n", | 	dev_dbg(dev, "more_mul_max: max_op_sys_clk_div check: %d\n", | ||||||
| 		more_mul_max); | 		more_mul_max); | ||||||
|  | @ -193,14 +145,14 @@ int smiapp_pll_calculate(struct device *dev, struct smiapp_pll_limits *limits, | ||||||
| 		more_mul_min); | 		more_mul_min); | ||||||
| 
 | 
 | ||||||
| 	if (more_mul_min > more_mul_max) { | 	if (more_mul_min > more_mul_max) { | ||||||
| 		dev_warn(dev, | 		dev_dbg(dev, | ||||||
| 			 "unable to compute more_mul_min and more_mul_max"); | 			"unable to compute more_mul_min and more_mul_max\n"); | ||||||
| 		return -EINVAL; | 		return -EINVAL; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	more_mul_factor = lcm(div, pll->pre_pll_clk_div) / div; | 	more_mul_factor = lcm(div, pll->pre_pll_clk_div) / div; | ||||||
| 	dev_dbg(dev, "more_mul_factor: %d\n", more_mul_factor); | 	dev_dbg(dev, "more_mul_factor: %d\n", more_mul_factor); | ||||||
| 	more_mul_factor = lcm(more_mul_factor, limits->min_op_sys_clk_div); | 	more_mul_factor = lcm(more_mul_factor, limits->op.min_sys_clk_div); | ||||||
| 	dev_dbg(dev, "more_mul_factor: min_op_sys_clk_div: %d\n", | 	dev_dbg(dev, "more_mul_factor: min_op_sys_clk_div: %d\n", | ||||||
| 		more_mul_factor); | 		more_mul_factor); | ||||||
| 	i = roundup(more_mul_min, more_mul_factor); | 	i = roundup(more_mul_min, more_mul_factor); | ||||||
|  | @ -209,7 +161,7 @@ int smiapp_pll_calculate(struct device *dev, struct smiapp_pll_limits *limits, | ||||||
| 
 | 
 | ||||||
| 	dev_dbg(dev, "final more_mul: %d\n", i); | 	dev_dbg(dev, "final more_mul: %d\n", i); | ||||||
| 	if (i > more_mul_max) { | 	if (i > more_mul_max) { | ||||||
| 		dev_warn(dev, "final more_mul is bad, max %d", more_mul_max); | 		dev_dbg(dev, "final more_mul is bad, max %d\n", more_mul_max); | ||||||
| 		return -EINVAL; | 		return -EINVAL; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | @ -268,19 +220,19 @@ int smiapp_pll_calculate(struct device *dev, struct smiapp_pll_limits *limits, | ||||||
| 	dev_dbg(dev, "min_vt_div: %d\n", min_vt_div); | 	dev_dbg(dev, "min_vt_div: %d\n", min_vt_div); | ||||||
| 	min_vt_div = max(min_vt_div, | 	min_vt_div = max(min_vt_div, | ||||||
| 			 DIV_ROUND_UP(pll->pll_op_clk_freq_hz, | 			 DIV_ROUND_UP(pll->pll_op_clk_freq_hz, | ||||||
| 				      limits->max_vt_pix_clk_freq_hz)); | 				      limits->vt.max_pix_clk_freq_hz)); | ||||||
| 	dev_dbg(dev, "min_vt_div: max_vt_pix_clk_freq_hz: %d\n", | 	dev_dbg(dev, "min_vt_div: max_vt_pix_clk_freq_hz: %d\n", | ||||||
| 		min_vt_div); | 		min_vt_div); | ||||||
| 	min_vt_div = max_t(uint32_t, min_vt_div, | 	min_vt_div = max_t(uint32_t, min_vt_div, | ||||||
| 			   limits->min_vt_pix_clk_div | 			   limits->vt.min_pix_clk_div | ||||||
| 			   * limits->min_vt_sys_clk_div); | 			   * limits->vt.min_sys_clk_div); | ||||||
| 	dev_dbg(dev, "min_vt_div: min_vt_clk_div: %d\n", min_vt_div); | 	dev_dbg(dev, "min_vt_div: min_vt_clk_div: %d\n", min_vt_div); | ||||||
| 
 | 
 | ||||||
| 	max_vt_div = limits->max_vt_sys_clk_div * limits->max_vt_pix_clk_div; | 	max_vt_div = limits->vt.max_sys_clk_div * limits->vt.max_pix_clk_div; | ||||||
| 	dev_dbg(dev, "max_vt_div: %d\n", max_vt_div); | 	dev_dbg(dev, "max_vt_div: %d\n", max_vt_div); | ||||||
| 	max_vt_div = min(max_vt_div, | 	max_vt_div = min(max_vt_div, | ||||||
| 			 DIV_ROUND_UP(pll->pll_op_clk_freq_hz, | 			 DIV_ROUND_UP(pll->pll_op_clk_freq_hz, | ||||||
| 				      limits->min_vt_pix_clk_freq_hz)); | 				      limits->vt.min_pix_clk_freq_hz)); | ||||||
| 	dev_dbg(dev, "max_vt_div: min_vt_pix_clk_freq_hz: %d\n", | 	dev_dbg(dev, "max_vt_div: min_vt_pix_clk_freq_hz: %d\n", | ||||||
| 		max_vt_div); | 		max_vt_div); | ||||||
| 
 | 
 | ||||||
|  | @ -288,28 +240,28 @@ int smiapp_pll_calculate(struct device *dev, struct smiapp_pll_limits *limits, | ||||||
| 	 * Find limitsits for sys_clk_div. Not all values are possible | 	 * Find limitsits for sys_clk_div. Not all values are possible | ||||||
| 	 * with all values of pix_clk_div. | 	 * with all values of pix_clk_div. | ||||||
| 	 */ | 	 */ | ||||||
| 	min_sys_div = limits->min_vt_sys_clk_div; | 	min_sys_div = limits->vt.min_sys_clk_div; | ||||||
| 	dev_dbg(dev, "min_sys_div: %d\n", min_sys_div); | 	dev_dbg(dev, "min_sys_div: %d\n", min_sys_div); | ||||||
| 	min_sys_div = max(min_sys_div, | 	min_sys_div = max(min_sys_div, | ||||||
| 			  DIV_ROUND_UP(min_vt_div, | 			  DIV_ROUND_UP(min_vt_div, | ||||||
| 				       limits->max_vt_pix_clk_div)); | 				       limits->vt.max_pix_clk_div)); | ||||||
| 	dev_dbg(dev, "min_sys_div: max_vt_pix_clk_div: %d\n", min_sys_div); | 	dev_dbg(dev, "min_sys_div: max_vt_pix_clk_div: %d\n", min_sys_div); | ||||||
| 	min_sys_div = max(min_sys_div, | 	min_sys_div = max(min_sys_div, | ||||||
| 			  pll->pll_op_clk_freq_hz | 			  pll->pll_op_clk_freq_hz | ||||||
| 			  / limits->max_vt_sys_clk_freq_hz); | 			  / limits->vt.max_sys_clk_freq_hz); | ||||||
| 	dev_dbg(dev, "min_sys_div: max_pll_op_clk_freq_hz: %d\n", min_sys_div); | 	dev_dbg(dev, "min_sys_div: max_pll_op_clk_freq_hz: %d\n", min_sys_div); | ||||||
| 	min_sys_div = clk_div_even_up(min_sys_div); | 	min_sys_div = clk_div_even_up(min_sys_div); | ||||||
| 	dev_dbg(dev, "min_sys_div: one or even: %d\n", min_sys_div); | 	dev_dbg(dev, "min_sys_div: one or even: %d\n", min_sys_div); | ||||||
| 
 | 
 | ||||||
| 	max_sys_div = limits->max_vt_sys_clk_div; | 	max_sys_div = limits->vt.max_sys_clk_div; | ||||||
| 	dev_dbg(dev, "max_sys_div: %d\n", max_sys_div); | 	dev_dbg(dev, "max_sys_div: %d\n", max_sys_div); | ||||||
| 	max_sys_div = min(max_sys_div, | 	max_sys_div = min(max_sys_div, | ||||||
| 			  DIV_ROUND_UP(max_vt_div, | 			  DIV_ROUND_UP(max_vt_div, | ||||||
| 				       limits->min_vt_pix_clk_div)); | 				       limits->vt.min_pix_clk_div)); | ||||||
| 	dev_dbg(dev, "max_sys_div: min_vt_pix_clk_div: %d\n", max_sys_div); | 	dev_dbg(dev, "max_sys_div: min_vt_pix_clk_div: %d\n", max_sys_div); | ||||||
| 	max_sys_div = min(max_sys_div, | 	max_sys_div = min(max_sys_div, | ||||||
| 			  DIV_ROUND_UP(pll->pll_op_clk_freq_hz, | 			  DIV_ROUND_UP(pll->pll_op_clk_freq_hz, | ||||||
| 				       limits->min_vt_pix_clk_freq_hz)); | 				       limits->vt.min_pix_clk_freq_hz)); | ||||||
| 	dev_dbg(dev, "max_sys_div: min_vt_pix_clk_freq_hz: %d\n", max_sys_div); | 	dev_dbg(dev, "max_sys_div: min_vt_pix_clk_freq_hz: %d\n", max_sys_div); | ||||||
| 
 | 
 | ||||||
| 	/*
 | 	/*
 | ||||||
|  | @ -322,15 +274,15 @@ int smiapp_pll_calculate(struct device *dev, struct smiapp_pll_limits *limits, | ||||||
| 		for (sys_div = min_sys_div; | 		for (sys_div = min_sys_div; | ||||||
| 		     sys_div <= max_sys_div; | 		     sys_div <= max_sys_div; | ||||||
| 		     sys_div += 2 - (sys_div & 1)) { | 		     sys_div += 2 - (sys_div & 1)) { | ||||||
| 			int pix_div = DIV_ROUND_UP(vt_div, sys_div); | 			uint16_t pix_div = DIV_ROUND_UP(vt_div, sys_div); | ||||||
| 
 | 
 | ||||||
| 			if (pix_div < limits->min_vt_pix_clk_div | 			if (pix_div < limits->vt.min_pix_clk_div | ||||||
| 			    || pix_div > limits->max_vt_pix_clk_div) { | 			    || pix_div > limits->vt.max_pix_clk_div) { | ||||||
| 				dev_dbg(dev, | 				dev_dbg(dev, | ||||||
| 					"pix_div %d too small or too big (%d--%d)\n", | 					"pix_div %d too small or too big (%d--%d)\n", | ||||||
| 					pix_div, | 					pix_div, | ||||||
| 					limits->min_vt_pix_clk_div, | 					limits->vt.min_pix_clk_div, | ||||||
| 					limits->max_vt_pix_clk_div); | 					limits->vt.max_pix_clk_div); | ||||||
| 				continue; | 				continue; | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
|  | @ -354,15 +306,9 @@ int smiapp_pll_calculate(struct device *dev, struct smiapp_pll_limits *limits, | ||||||
| 	pll->pixel_rate_csi = | 	pll->pixel_rate_csi = | ||||||
| 		pll->op_pix_clk_freq_hz * lane_op_clock_ratio; | 		pll->op_pix_clk_freq_hz * lane_op_clock_ratio; | ||||||
| 
 | 
 | ||||||
| 	print_pll(dev, pll); | 	rval = bounds_check(dev, pll->pll_ip_clk_freq_hz, | ||||||
| 
 | 			    limits->min_pll_ip_freq_hz, | ||||||
| 	rval = bounds_check(dev, pll->pre_pll_clk_div, | 			    limits->max_pll_ip_freq_hz, | ||||||
| 			    limits->min_pre_pll_clk_div, |  | ||||||
| 			    limits->max_pre_pll_clk_div, "pre_pll_clk_div"); |  | ||||||
| 	if (!rval) |  | ||||||
| 		rval = bounds_check( |  | ||||||
| 			dev, pll->pll_ip_clk_freq_hz, |  | ||||||
| 			limits->min_pll_ip_freq_hz, limits->max_pll_ip_freq_hz, |  | ||||||
| 			    "pll_ip_clk_freq_hz"); | 			    "pll_ip_clk_freq_hz"); | ||||||
| 	if (!rval) | 	if (!rval) | ||||||
| 		rval = bounds_check( | 		rval = bounds_check( | ||||||
|  | @ -377,42 +323,121 @@ int smiapp_pll_calculate(struct device *dev, struct smiapp_pll_limits *limits, | ||||||
| 	if (!rval) | 	if (!rval) | ||||||
| 		rval = bounds_check( | 		rval = bounds_check( | ||||||
| 			dev, pll->op_sys_clk_div, | 			dev, pll->op_sys_clk_div, | ||||||
| 			limits->min_op_sys_clk_div, limits->max_op_sys_clk_div, | 			limits->op.min_sys_clk_div, limits->op.max_sys_clk_div, | ||||||
| 			"op_sys_clk_div"); | 			"op_sys_clk_div"); | ||||||
| 	if (!rval) | 	if (!rval) | ||||||
| 		rval = bounds_check( | 		rval = bounds_check( | ||||||
| 			dev, pll->op_pix_clk_div, | 			dev, pll->op_pix_clk_div, | ||||||
| 			limits->min_op_pix_clk_div, limits->max_op_pix_clk_div, | 			limits->op.min_pix_clk_div, limits->op.max_pix_clk_div, | ||||||
| 			"op_pix_clk_div"); | 			"op_pix_clk_div"); | ||||||
| 	if (!rval) | 	if (!rval) | ||||||
| 		rval = bounds_check( | 		rval = bounds_check( | ||||||
| 			dev, pll->op_sys_clk_freq_hz, | 			dev, pll->op_sys_clk_freq_hz, | ||||||
| 			limits->min_op_sys_clk_freq_hz, | 			limits->op.min_sys_clk_freq_hz, | ||||||
| 			limits->max_op_sys_clk_freq_hz, | 			limits->op.max_sys_clk_freq_hz, | ||||||
| 			"op_sys_clk_freq_hz"); | 			"op_sys_clk_freq_hz"); | ||||||
| 	if (!rval) | 	if (!rval) | ||||||
| 		rval = bounds_check( | 		rval = bounds_check( | ||||||
| 			dev, pll->op_pix_clk_freq_hz, | 			dev, pll->op_pix_clk_freq_hz, | ||||||
| 			limits->min_op_pix_clk_freq_hz, | 			limits->op.min_pix_clk_freq_hz, | ||||||
| 			limits->max_op_pix_clk_freq_hz, | 			limits->op.max_pix_clk_freq_hz, | ||||||
| 			"op_pix_clk_freq_hz"); | 			"op_pix_clk_freq_hz"); | ||||||
| 	if (!rval) | 	if (!rval) | ||||||
| 		rval = bounds_check( | 		rval = bounds_check( | ||||||
| 			dev, pll->vt_sys_clk_freq_hz, | 			dev, pll->vt_sys_clk_freq_hz, | ||||||
| 			limits->min_vt_sys_clk_freq_hz, | 			limits->vt.min_sys_clk_freq_hz, | ||||||
| 			limits->max_vt_sys_clk_freq_hz, | 			limits->vt.max_sys_clk_freq_hz, | ||||||
| 			"vt_sys_clk_freq_hz"); | 			"vt_sys_clk_freq_hz"); | ||||||
| 	if (!rval) | 	if (!rval) | ||||||
| 		rval = bounds_check( | 		rval = bounds_check( | ||||||
| 			dev, pll->vt_pix_clk_freq_hz, | 			dev, pll->vt_pix_clk_freq_hz, | ||||||
| 			limits->min_vt_pix_clk_freq_hz, | 			limits->vt.min_pix_clk_freq_hz, | ||||||
| 			limits->max_vt_pix_clk_freq_hz, | 			limits->vt.max_pix_clk_freq_hz, | ||||||
| 			"vt_pix_clk_freq_hz"); | 			"vt_pix_clk_freq_hz"); | ||||||
| 
 | 
 | ||||||
| 	return rval; | 	return rval; | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | int smiapp_pll_calculate(struct device *dev, | ||||||
|  | 			 const struct smiapp_pll_limits *limits, | ||||||
|  | 			 struct smiapp_pll *pll) | ||||||
|  | { | ||||||
|  | 	uint16_t min_pre_pll_clk_div; | ||||||
|  | 	uint16_t max_pre_pll_clk_div; | ||||||
|  | 	uint32_t lane_op_clock_ratio; | ||||||
|  | 	uint32_t mul, div; | ||||||
|  | 	unsigned int i; | ||||||
|  | 	int rval = -EINVAL; | ||||||
|  | 
 | ||||||
|  | 	if (pll->flags & SMIAPP_PLL_FLAG_OP_PIX_CLOCK_PER_LANE) | ||||||
|  | 		lane_op_clock_ratio = pll->csi2.lanes; | ||||||
|  | 	else | ||||||
|  | 		lane_op_clock_ratio = 1; | ||||||
|  | 	dev_dbg(dev, "lane_op_clock_ratio: %d\n", lane_op_clock_ratio); | ||||||
|  | 
 | ||||||
|  | 	dev_dbg(dev, "binning: %dx%d\n", pll->binning_horizontal, | ||||||
|  | 		pll->binning_vertical); | ||||||
|  | 
 | ||||||
|  | 	switch (pll->bus_type) { | ||||||
|  | 	case SMIAPP_PLL_BUS_TYPE_CSI2: | ||||||
|  | 		/* CSI transfers 2 bits per clock per lane; thus times 2 */ | ||||||
|  | 		pll->pll_op_clk_freq_hz = pll->link_freq * 2 | ||||||
|  | 			* (pll->csi2.lanes / lane_op_clock_ratio); | ||||||
|  | 		break; | ||||||
|  | 	case SMIAPP_PLL_BUS_TYPE_PARALLEL: | ||||||
|  | 		pll->pll_op_clk_freq_hz = pll->link_freq * pll->bits_per_pixel | ||||||
|  | 			/ DIV_ROUND_UP(pll->bits_per_pixel, | ||||||
|  | 				       pll->parallel.bus_width); | ||||||
|  | 		break; | ||||||
|  | 	default: | ||||||
|  | 		return -EINVAL; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/* Figure out limits for pre-pll divider based on extclk */ | ||||||
|  | 	dev_dbg(dev, "min / max pre_pll_clk_div: %d / %d\n", | ||||||
|  | 		limits->min_pre_pll_clk_div, limits->max_pre_pll_clk_div); | ||||||
|  | 	max_pre_pll_clk_div = | ||||||
|  | 		min_t(uint16_t, limits->max_pre_pll_clk_div, | ||||||
|  | 		      clk_div_even(pll->ext_clk_freq_hz / | ||||||
|  | 				   limits->min_pll_ip_freq_hz)); | ||||||
|  | 	min_pre_pll_clk_div = | ||||||
|  | 		max_t(uint16_t, limits->min_pre_pll_clk_div, | ||||||
|  | 		      clk_div_even_up( | ||||||
|  | 			      DIV_ROUND_UP(pll->ext_clk_freq_hz, | ||||||
|  | 					   limits->max_pll_ip_freq_hz))); | ||||||
|  | 	dev_dbg(dev, "pre-pll check: min / max pre_pll_clk_div: %d / %d\n", | ||||||
|  | 		min_pre_pll_clk_div, max_pre_pll_clk_div); | ||||||
|  | 
 | ||||||
|  | 	i = gcd(pll->pll_op_clk_freq_hz, pll->ext_clk_freq_hz); | ||||||
|  | 	mul = div_u64(pll->pll_op_clk_freq_hz, i); | ||||||
|  | 	div = pll->ext_clk_freq_hz / i; | ||||||
|  | 	dev_dbg(dev, "mul %d / div %d\n", mul, div); | ||||||
|  | 
 | ||||||
|  | 	min_pre_pll_clk_div = | ||||||
|  | 		max_t(uint16_t, min_pre_pll_clk_div, | ||||||
|  | 		      clk_div_even_up( | ||||||
|  | 			      DIV_ROUND_UP(mul * pll->ext_clk_freq_hz, | ||||||
|  | 					   limits->max_pll_op_freq_hz))); | ||||||
|  | 	dev_dbg(dev, "pll_op check: min / max pre_pll_clk_div: %d / %d\n", | ||||||
|  | 		min_pre_pll_clk_div, max_pre_pll_clk_div); | ||||||
|  | 
 | ||||||
|  | 	for (pll->pre_pll_clk_div = min_pre_pll_clk_div; | ||||||
|  | 	     pll->pre_pll_clk_div <= max_pre_pll_clk_div; | ||||||
|  | 	     pll->pre_pll_clk_div += 2 - (pll->pre_pll_clk_div & 1)) { | ||||||
|  | 		rval = __smiapp_pll_calculate(dev, limits, pll, mul, div, | ||||||
|  | 					      lane_op_clock_ratio); | ||||||
|  | 		if (rval) | ||||||
|  | 			continue; | ||||||
|  | 
 | ||||||
|  | 		print_pll(dev, pll); | ||||||
|  | 		return 0; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	dev_info(dev, "unable to compute pre_pll divisor\n"); | ||||||
|  | 	return rval; | ||||||
|  | } | ||||||
| EXPORT_SYMBOL_GPL(smiapp_pll_calculate); | EXPORT_SYMBOL_GPL(smiapp_pll_calculate); | ||||||
| 
 | 
 | ||||||
| MODULE_AUTHOR("Sakari Ailus <sakari.ailus@maxwell.research.nokia.com>"); | MODULE_AUTHOR("Sakari Ailus <sakari.ailus@iki.fi>"); | ||||||
| MODULE_DESCRIPTION("Generic SMIA/SMIA++ PLL calculator"); | MODULE_DESCRIPTION("Generic SMIA/SMIA++ PLL calculator"); | ||||||
| MODULE_LICENSE("GPL"); | MODULE_LICENSE("GPL"); | ||||||
|  |  | ||||||
|  | @ -4,7 +4,7 @@ | ||||||
|  * Generic driver for SMIA/SMIA++ compliant camera modules |  * Generic driver for SMIA/SMIA++ compliant camera modules | ||||||
|  * |  * | ||||||
|  * Copyright (C) 2012 Nokia Corporation |  * Copyright (C) 2012 Nokia Corporation | ||||||
|  * Contact: Sakari Ailus <sakari.ailus@maxwell.research.nokia.com> |  * Contact: Sakari Ailus <sakari.ailus@iki.fi> | ||||||
|  * |  * | ||||||
|  * This program is free software; you can redistribute it and/or |  * This program is free software; you can redistribute it and/or | ||||||
|  * modify it under the terms of the GNU General Public License |  * modify it under the terms of the GNU General Public License | ||||||
|  | @ -27,16 +27,34 @@ | ||||||
| 
 | 
 | ||||||
| #include <linux/device.h> | #include <linux/device.h> | ||||||
| 
 | 
 | ||||||
|  | /* CSI-2 or CCP-2 */ | ||||||
|  | #define SMIAPP_PLL_BUS_TYPE_CSI2				0x00 | ||||||
|  | #define SMIAPP_PLL_BUS_TYPE_PARALLEL				0x01 | ||||||
|  | 
 | ||||||
|  | /* op pix clock is for all lanes in total normally */ | ||||||
|  | #define SMIAPP_PLL_FLAG_OP_PIX_CLOCK_PER_LANE			(1 << 0) | ||||||
|  | #define SMIAPP_PLL_FLAG_NO_OP_CLOCKS				(1 << 1) | ||||||
|  | 
 | ||||||
| struct smiapp_pll { | struct smiapp_pll { | ||||||
|  | 	/* input values */ | ||||||
|  | 	uint8_t bus_type; | ||||||
|  | 	union { | ||||||
|  | 		struct { | ||||||
| 			uint8_t lanes; | 			uint8_t lanes; | ||||||
|  | 		} csi2; | ||||||
|  | 		struct { | ||||||
|  | 			uint8_t bus_width; | ||||||
|  | 		} parallel; | ||||||
|  | 	}; | ||||||
|  | 	uint8_t flags; | ||||||
| 	uint8_t binning_horizontal; | 	uint8_t binning_horizontal; | ||||||
| 	uint8_t binning_vertical; | 	uint8_t binning_vertical; | ||||||
| 	uint8_t scale_m; | 	uint8_t scale_m; | ||||||
| 	uint8_t scale_n; | 	uint8_t scale_n; | ||||||
| 	uint8_t bits_per_pixel; | 	uint8_t bits_per_pixel; | ||||||
| 	uint16_t flags; |  | ||||||
| 	uint32_t link_freq; | 	uint32_t link_freq; | ||||||
| 
 | 
 | ||||||
|  | 	/* output values */ | ||||||
| 	uint16_t pre_pll_clk_div; | 	uint16_t pre_pll_clk_div; | ||||||
| 	uint16_t pll_multiplier; | 	uint16_t pll_multiplier; | ||||||
| 	uint16_t op_sys_clk_div; | 	uint16_t op_sys_clk_div; | ||||||
|  | @ -55,6 +73,17 @@ struct smiapp_pll { | ||||||
| 	uint32_t pixel_rate_csi; | 	uint32_t pixel_rate_csi; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | struct smiapp_pll_branch_limits { | ||||||
|  | 	uint16_t min_sys_clk_div; | ||||||
|  | 	uint16_t max_sys_clk_div; | ||||||
|  | 	uint32_t min_sys_clk_freq_hz; | ||||||
|  | 	uint32_t max_sys_clk_freq_hz; | ||||||
|  | 	uint16_t min_pix_clk_div; | ||||||
|  | 	uint16_t max_pix_clk_div; | ||||||
|  | 	uint32_t min_pix_clk_freq_hz; | ||||||
|  | 	uint32_t max_pix_clk_freq_hz; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
| struct smiapp_pll_limits { | struct smiapp_pll_limits { | ||||||
| 	/* Strict PLL limits */ | 	/* Strict PLL limits */ | ||||||
| 	uint32_t min_ext_clk_freq_hz; | 	uint32_t min_ext_clk_freq_hz; | ||||||
|  | @ -68,36 +97,18 @@ struct smiapp_pll_limits { | ||||||
| 	uint32_t min_pll_op_freq_hz; | 	uint32_t min_pll_op_freq_hz; | ||||||
| 	uint32_t max_pll_op_freq_hz; | 	uint32_t max_pll_op_freq_hz; | ||||||
| 
 | 
 | ||||||
| 	uint16_t min_vt_sys_clk_div; | 	struct smiapp_pll_branch_limits vt; | ||||||
| 	uint16_t max_vt_sys_clk_div; | 	struct smiapp_pll_branch_limits op; | ||||||
| 	uint32_t min_vt_sys_clk_freq_hz; |  | ||||||
| 	uint32_t max_vt_sys_clk_freq_hz; |  | ||||||
| 	uint16_t min_vt_pix_clk_div; |  | ||||||
| 	uint16_t max_vt_pix_clk_div; |  | ||||||
| 	uint32_t min_vt_pix_clk_freq_hz; |  | ||||||
| 	uint32_t max_vt_pix_clk_freq_hz; |  | ||||||
| 
 |  | ||||||
| 	uint16_t min_op_sys_clk_div; |  | ||||||
| 	uint16_t max_op_sys_clk_div; |  | ||||||
| 	uint32_t min_op_sys_clk_freq_hz; |  | ||||||
| 	uint32_t max_op_sys_clk_freq_hz; |  | ||||||
| 	uint16_t min_op_pix_clk_div; |  | ||||||
| 	uint16_t max_op_pix_clk_div; |  | ||||||
| 	uint32_t min_op_pix_clk_freq_hz; |  | ||||||
| 	uint32_t max_op_pix_clk_freq_hz; |  | ||||||
| 
 | 
 | ||||||
| 	/* Other relevant limits */ | 	/* Other relevant limits */ | ||||||
| 	uint32_t min_line_length_pck_bin; | 	uint32_t min_line_length_pck_bin; | ||||||
| 	uint32_t min_line_length_pck; | 	uint32_t min_line_length_pck; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| /* op pix clock is for all lanes in total normally */ |  | ||||||
| #define SMIAPP_PLL_FLAG_OP_PIX_CLOCK_PER_LANE			(1 << 0) |  | ||||||
| #define SMIAPP_PLL_FLAG_NO_OP_CLOCKS				(1 << 1) |  | ||||||
| 
 |  | ||||||
| struct device; | struct device; | ||||||
| 
 | 
 | ||||||
| int smiapp_pll_calculate(struct device *dev, struct smiapp_pll_limits *limits, | int smiapp_pll_calculate(struct device *dev, | ||||||
|  | 			 const struct smiapp_pll_limits *limits, | ||||||
| 			 struct smiapp_pll *pll); | 			 struct smiapp_pll *pll); | ||||||
| 
 | 
 | ||||||
| #endif /* SMIAPP_PLL_H */ | #endif /* SMIAPP_PLL_H */ | ||||||
|  |  | ||||||
|  | @ -4,7 +4,7 @@ | ||||||
|  * Generic driver for SMIA/SMIA++ compliant camera modules |  * Generic driver for SMIA/SMIA++ compliant camera modules | ||||||
|  * |  * | ||||||
|  * Copyright (C) 2010--2012 Nokia Corporation |  * Copyright (C) 2010--2012 Nokia Corporation | ||||||
|  * Contact: Sakari Ailus <sakari.ailus@maxwell.research.nokia.com> |  * Contact: Sakari Ailus <sakari.ailus@iki.fi> | ||||||
|  * |  * | ||||||
|  * Based on smiapp driver by Vimarsh Zutshi |  * Based on smiapp driver by Vimarsh Zutshi | ||||||
|  * Based on jt8ev1.c by Vimarsh Zutshi |  * Based on jt8ev1.c by Vimarsh Zutshi | ||||||
|  | @ -252,23 +252,23 @@ static int smiapp_pll_update(struct smiapp_sensor *sensor) | ||||||
| 		.min_pll_op_freq_hz = sensor->limits[SMIAPP_LIMIT_MIN_PLL_OP_FREQ_HZ], | 		.min_pll_op_freq_hz = sensor->limits[SMIAPP_LIMIT_MIN_PLL_OP_FREQ_HZ], | ||||||
| 		.max_pll_op_freq_hz = sensor->limits[SMIAPP_LIMIT_MAX_PLL_OP_FREQ_HZ], | 		.max_pll_op_freq_hz = sensor->limits[SMIAPP_LIMIT_MAX_PLL_OP_FREQ_HZ], | ||||||
| 
 | 
 | ||||||
| 		.min_op_sys_clk_div = sensor->limits[SMIAPP_LIMIT_MIN_OP_SYS_CLK_DIV], | 		.op.min_sys_clk_div = sensor->limits[SMIAPP_LIMIT_MIN_OP_SYS_CLK_DIV], | ||||||
| 		.max_op_sys_clk_div = sensor->limits[SMIAPP_LIMIT_MAX_OP_SYS_CLK_DIV], | 		.op.max_sys_clk_div = sensor->limits[SMIAPP_LIMIT_MAX_OP_SYS_CLK_DIV], | ||||||
| 		.min_op_pix_clk_div = sensor->limits[SMIAPP_LIMIT_MIN_OP_PIX_CLK_DIV], | 		.op.min_pix_clk_div = sensor->limits[SMIAPP_LIMIT_MIN_OP_PIX_CLK_DIV], | ||||||
| 		.max_op_pix_clk_div = sensor->limits[SMIAPP_LIMIT_MAX_OP_PIX_CLK_DIV], | 		.op.max_pix_clk_div = sensor->limits[SMIAPP_LIMIT_MAX_OP_PIX_CLK_DIV], | ||||||
| 		.min_op_sys_clk_freq_hz = sensor->limits[SMIAPP_LIMIT_MIN_OP_SYS_CLK_FREQ_HZ], | 		.op.min_sys_clk_freq_hz = sensor->limits[SMIAPP_LIMIT_MIN_OP_SYS_CLK_FREQ_HZ], | ||||||
| 		.max_op_sys_clk_freq_hz = sensor->limits[SMIAPP_LIMIT_MAX_OP_SYS_CLK_FREQ_HZ], | 		.op.max_sys_clk_freq_hz = sensor->limits[SMIAPP_LIMIT_MAX_OP_SYS_CLK_FREQ_HZ], | ||||||
| 		.min_op_pix_clk_freq_hz = sensor->limits[SMIAPP_LIMIT_MIN_OP_PIX_CLK_FREQ_HZ], | 		.op.min_pix_clk_freq_hz = sensor->limits[SMIAPP_LIMIT_MIN_OP_PIX_CLK_FREQ_HZ], | ||||||
| 		.max_op_pix_clk_freq_hz = sensor->limits[SMIAPP_LIMIT_MAX_OP_PIX_CLK_FREQ_HZ], | 		.op.max_pix_clk_freq_hz = sensor->limits[SMIAPP_LIMIT_MAX_OP_PIX_CLK_FREQ_HZ], | ||||||
| 
 | 
 | ||||||
| 		.min_vt_sys_clk_div = sensor->limits[SMIAPP_LIMIT_MIN_VT_SYS_CLK_DIV], | 		.vt.min_sys_clk_div = sensor->limits[SMIAPP_LIMIT_MIN_VT_SYS_CLK_DIV], | ||||||
| 		.max_vt_sys_clk_div = sensor->limits[SMIAPP_LIMIT_MAX_VT_SYS_CLK_DIV], | 		.vt.max_sys_clk_div = sensor->limits[SMIAPP_LIMIT_MAX_VT_SYS_CLK_DIV], | ||||||
| 		.min_vt_pix_clk_div = sensor->limits[SMIAPP_LIMIT_MIN_VT_PIX_CLK_DIV], | 		.vt.min_pix_clk_div = sensor->limits[SMIAPP_LIMIT_MIN_VT_PIX_CLK_DIV], | ||||||
| 		.max_vt_pix_clk_div = sensor->limits[SMIAPP_LIMIT_MAX_VT_PIX_CLK_DIV], | 		.vt.max_pix_clk_div = sensor->limits[SMIAPP_LIMIT_MAX_VT_PIX_CLK_DIV], | ||||||
| 		.min_vt_sys_clk_freq_hz = sensor->limits[SMIAPP_LIMIT_MIN_VT_SYS_CLK_FREQ_HZ], | 		.vt.min_sys_clk_freq_hz = sensor->limits[SMIAPP_LIMIT_MIN_VT_SYS_CLK_FREQ_HZ], | ||||||
| 		.max_vt_sys_clk_freq_hz = sensor->limits[SMIAPP_LIMIT_MAX_VT_SYS_CLK_FREQ_HZ], | 		.vt.max_sys_clk_freq_hz = sensor->limits[SMIAPP_LIMIT_MAX_VT_SYS_CLK_FREQ_HZ], | ||||||
| 		.min_vt_pix_clk_freq_hz = sensor->limits[SMIAPP_LIMIT_MIN_VT_PIX_CLK_FREQ_HZ], | 		.vt.min_pix_clk_freq_hz = sensor->limits[SMIAPP_LIMIT_MIN_VT_PIX_CLK_FREQ_HZ], | ||||||
| 		.max_vt_pix_clk_freq_hz = sensor->limits[SMIAPP_LIMIT_MAX_VT_PIX_CLK_FREQ_HZ], | 		.vt.max_pix_clk_freq_hz = sensor->limits[SMIAPP_LIMIT_MAX_VT_PIX_CLK_FREQ_HZ], | ||||||
| 
 | 
 | ||||||
| 		.min_line_length_pck_bin = sensor->limits[SMIAPP_LIMIT_MIN_LINE_LENGTH_PCK_BIN], | 		.min_line_length_pck_bin = sensor->limits[SMIAPP_LIMIT_MIN_LINE_LENGTH_PCK_BIN], | ||||||
| 		.min_line_length_pck = sensor->limits[SMIAPP_LIMIT_MIN_LINE_LENGTH_PCK], | 		.min_line_length_pck = sensor->limits[SMIAPP_LIMIT_MIN_LINE_LENGTH_PCK], | ||||||
|  | @ -276,11 +276,6 @@ static int smiapp_pll_update(struct smiapp_sensor *sensor) | ||||||
| 	struct smiapp_pll *pll = &sensor->pll; | 	struct smiapp_pll *pll = &sensor->pll; | ||||||
| 	int rval; | 	int rval; | ||||||
| 
 | 
 | ||||||
| 	memset(&sensor->pll, 0, sizeof(sensor->pll)); |  | ||||||
| 
 |  | ||||||
| 	pll->lanes = sensor->platform_data->lanes; |  | ||||||
| 	pll->ext_clk_freq_hz = sensor->platform_data->ext_clk; |  | ||||||
| 
 |  | ||||||
| 	if (sensor->minfo.smiapp_profile == SMIAPP_PROFILE_0) { | 	if (sensor->minfo.smiapp_profile == SMIAPP_PROFILE_0) { | ||||||
| 		/*
 | 		/*
 | ||||||
| 		 * Fill in operational clock divisors limits from the | 		 * Fill in operational clock divisors limits from the | ||||||
|  | @ -288,28 +283,14 @@ static int smiapp_pll_update(struct smiapp_sensor *sensor) | ||||||
| 		 * requirements regarding them are essentially the | 		 * requirements regarding them are essentially the | ||||||
| 		 * same as on VT ones. | 		 * same as on VT ones. | ||||||
| 		 */ | 		 */ | ||||||
| 		lim.min_op_sys_clk_div = lim.min_vt_sys_clk_div; | 		lim.op = lim.vt; | ||||||
| 		lim.max_op_sys_clk_div = lim.max_vt_sys_clk_div; |  | ||||||
| 		lim.min_op_pix_clk_div = lim.min_vt_pix_clk_div; |  | ||||||
| 		lim.max_op_pix_clk_div = lim.max_vt_pix_clk_div; |  | ||||||
| 		lim.min_op_sys_clk_freq_hz = lim.min_vt_sys_clk_freq_hz; |  | ||||||
| 		lim.max_op_sys_clk_freq_hz = lim.max_vt_sys_clk_freq_hz; |  | ||||||
| 		lim.min_op_pix_clk_freq_hz = lim.min_vt_pix_clk_freq_hz; |  | ||||||
| 		lim.max_op_pix_clk_freq_hz = lim.max_vt_pix_clk_freq_hz; |  | ||||||
| 		/* Profile 0 sensors have no separate OP clock branch. */ |  | ||||||
| 		pll->flags |= SMIAPP_PLL_FLAG_NO_OP_CLOCKS; |  | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if (smiapp_needs_quirk(sensor, |  | ||||||
| 			       SMIAPP_QUIRK_FLAG_OP_PIX_CLOCK_PER_LANE)) |  | ||||||
| 		pll->flags |= SMIAPP_PLL_FLAG_OP_PIX_CLOCK_PER_LANE; |  | ||||||
| 
 |  | ||||||
| 	pll->binning_horizontal = sensor->binning_horizontal; | 	pll->binning_horizontal = sensor->binning_horizontal; | ||||||
| 	pll->binning_vertical = sensor->binning_vertical; | 	pll->binning_vertical = sensor->binning_vertical; | ||||||
| 	pll->link_freq = | 	pll->link_freq = | ||||||
| 		sensor->link_freq->qmenu_int[sensor->link_freq->val]; | 		sensor->link_freq->qmenu_int[sensor->link_freq->val]; | ||||||
| 	pll->scale_m = sensor->scale_m; | 	pll->scale_m = sensor->scale_m; | ||||||
| 	pll->scale_n = sensor->limits[SMIAPP_LIMIT_SCALER_N_MIN]; |  | ||||||
| 	pll->bits_per_pixel = sensor->csi_format->compressed; | 	pll->bits_per_pixel = sensor->csi_format->compressed; | ||||||
| 
 | 
 | ||||||
| 	rval = smiapp_pll_calculate(&client->dev, &lim, pll); | 	rval = smiapp_pll_calculate(&client->dev, &lim, pll); | ||||||
|  | @ -1010,7 +991,7 @@ static int smiapp_setup_flash_strobe(struct smiapp_sensor *sensor) | ||||||
| 	 * do not change, or if you do at least know what you're | 	 * do not change, or if you do at least know what you're | ||||||
| 	 * doing. :-) | 	 * doing. :-) | ||||||
| 	 * | 	 * | ||||||
| 	 * Sakari Ailus <sakari.ailus@maxwell.research.nokia.com> 2010-10-25 | 	 * Sakari Ailus <sakari.ailus@iki.fi> 2010-10-25 | ||||||
| 	 * | 	 * | ||||||
| 	 * flash_strobe_length [us] / 10^6 = (tFlash_strobe_width_ctrl | 	 * flash_strobe_length [us] / 10^6 = (tFlash_strobe_width_ctrl | ||||||
| 	 *	/ EXTCLK freq [Hz]) * flash_strobe_adjustment | 	 *	/ EXTCLK freq [Hz]) * flash_strobe_adjustment | ||||||
|  | @ -2369,6 +2350,7 @@ static int smiapp_registered(struct v4l2_subdev *subdev) | ||||||
| { | { | ||||||
| 	struct smiapp_sensor *sensor = to_smiapp_sensor(subdev); | 	struct smiapp_sensor *sensor = to_smiapp_sensor(subdev); | ||||||
| 	struct i2c_client *client = v4l2_get_subdevdata(subdev); | 	struct i2c_client *client = v4l2_get_subdevdata(subdev); | ||||||
|  | 	struct smiapp_pll *pll = &sensor->pll; | ||||||
| 	struct smiapp_subdev *last = NULL; | 	struct smiapp_subdev *last = NULL; | ||||||
| 	u32 tmp; | 	u32 tmp; | ||||||
| 	unsigned int i; | 	unsigned int i; | ||||||
|  | @ -2635,6 +2617,18 @@ static int smiapp_registered(struct v4l2_subdev *subdev) | ||||||
| 	if (rval < 0) | 	if (rval < 0) | ||||||
| 		goto out_nvm_release; | 		goto out_nvm_release; | ||||||
| 
 | 
 | ||||||
|  | 	/* prepare PLL configuration input values */ | ||||||
|  | 	pll->bus_type = SMIAPP_PLL_BUS_TYPE_CSI2; | ||||||
|  | 	pll->csi2.lanes = sensor->platform_data->lanes; | ||||||
|  | 	pll->ext_clk_freq_hz = sensor->platform_data->ext_clk; | ||||||
|  | 	/* Profile 0 sensors have no separate OP clock branch. */ | ||||||
|  | 	if (sensor->minfo.smiapp_profile == SMIAPP_PROFILE_0) | ||||||
|  | 		pll->flags |= SMIAPP_PLL_FLAG_NO_OP_CLOCKS; | ||||||
|  | 	if (smiapp_needs_quirk(sensor, | ||||||
|  | 			       SMIAPP_QUIRK_FLAG_OP_PIX_CLOCK_PER_LANE)) | ||||||
|  | 		pll->flags |= SMIAPP_PLL_FLAG_OP_PIX_CLOCK_PER_LANE; | ||||||
|  | 	pll->scale_n = sensor->limits[SMIAPP_LIMIT_SCALER_N_MIN]; | ||||||
|  | 
 | ||||||
| 	rval = smiapp_update_mode(sensor); | 	rval = smiapp_update_mode(sensor); | ||||||
| 	if (rval) { | 	if (rval) { | ||||||
| 		dev_err(&client->dev, "update mode failed\n"); | 		dev_err(&client->dev, "update mode failed\n"); | ||||||
|  | @ -2893,6 +2887,6 @@ static struct i2c_driver smiapp_i2c_driver = { | ||||||
| 
 | 
 | ||||||
| module_i2c_driver(smiapp_i2c_driver); | module_i2c_driver(smiapp_i2c_driver); | ||||||
| 
 | 
 | ||||||
| MODULE_AUTHOR("Sakari Ailus <sakari.ailus@maxwell.research.nokia.com>"); | MODULE_AUTHOR("Sakari Ailus <sakari.ailus@iki.fi>"); | ||||||
| MODULE_DESCRIPTION("Generic SMIA/SMIA++ camera module driver"); | MODULE_DESCRIPTION("Generic SMIA/SMIA++ camera module driver"); | ||||||
| MODULE_LICENSE("GPL"); | MODULE_LICENSE("GPL"); | ||||||
|  |  | ||||||
|  | @ -4,7 +4,7 @@ | ||||||
|  * Generic driver for SMIA/SMIA++ compliant camera modules |  * Generic driver for SMIA/SMIA++ compliant camera modules | ||||||
|  * |  * | ||||||
|  * Copyright (C) 2011--2012 Nokia Corporation |  * Copyright (C) 2011--2012 Nokia Corporation | ||||||
|  * Contact: Sakari Ailus <sakari.ailus@maxwell.research.nokia.com> |  * Contact: Sakari Ailus <sakari.ailus@iki.fi> | ||||||
|  * |  * | ||||||
|  * This program is free software; you can redistribute it and/or |  * This program is free software; you can redistribute it and/or | ||||||
|  * modify it under the terms of the GNU General Public License |  * modify it under the terms of the GNU General Public License | ||||||
|  |  | ||||||
|  | @ -4,7 +4,7 @@ | ||||||
|  * Generic driver for SMIA/SMIA++ compliant camera modules |  * Generic driver for SMIA/SMIA++ compliant camera modules | ||||||
|  * |  * | ||||||
|  * Copyright (C) 2011--2012 Nokia Corporation |  * Copyright (C) 2011--2012 Nokia Corporation | ||||||
|  * Contact: Sakari Ailus <sakari.ailus@maxwell.research.nokia.com> |  * Contact: Sakari Ailus <sakari.ailus@iki.fi> | ||||||
|  * |  * | ||||||
|  * This program is free software; you can redistribute it and/or |  * This program is free software; you can redistribute it and/or | ||||||
|  * modify it under the terms of the GNU General Public License |  * modify it under the terms of the GNU General Public License | ||||||
|  |  | ||||||
|  | @ -4,7 +4,7 @@ | ||||||
|  * Generic driver for SMIA/SMIA++ compliant camera modules |  * Generic driver for SMIA/SMIA++ compliant camera modules | ||||||
|  * |  * | ||||||
|  * Copyright (C) 2011--2012 Nokia Corporation |  * Copyright (C) 2011--2012 Nokia Corporation | ||||||
|  * Contact: Sakari Ailus <sakari.ailus@maxwell.research.nokia.com> |  * Contact: Sakari Ailus <sakari.ailus@iki.fi> | ||||||
|  * |  * | ||||||
|  * This program is free software; you can redistribute it and/or |  * This program is free software; you can redistribute it and/or | ||||||
|  * modify it under the terms of the GNU General Public License |  * modify it under the terms of the GNU General Public License | ||||||
|  |  | ||||||
|  | @ -4,7 +4,7 @@ | ||||||
|  * Generic driver for SMIA/SMIA++ compliant camera modules |  * Generic driver for SMIA/SMIA++ compliant camera modules | ||||||
|  * |  * | ||||||
|  * Copyright (C) 2011--2012 Nokia Corporation |  * Copyright (C) 2011--2012 Nokia Corporation | ||||||
|  * Contact: Sakari Ailus <sakari.ailus@maxwell.research.nokia.com> |  * Contact: Sakari Ailus <sakari.ailus@iki.fi> | ||||||
|  * |  * | ||||||
|  * This program is free software; you can redistribute it and/or |  * This program is free software; you can redistribute it and/or | ||||||
|  * modify it under the terms of the GNU General Public License |  * modify it under the terms of the GNU General Public License | ||||||
|  |  | ||||||
|  | @ -4,7 +4,7 @@ | ||||||
|  * Generic driver for SMIA/SMIA++ compliant camera modules |  * Generic driver for SMIA/SMIA++ compliant camera modules | ||||||
|  * |  * | ||||||
|  * Copyright (C) 2011--2012 Nokia Corporation |  * Copyright (C) 2011--2012 Nokia Corporation | ||||||
|  * Contact: Sakari Ailus <sakari.ailus@maxwell.research.nokia.com> |  * Contact: Sakari Ailus <sakari.ailus@iki.fi> | ||||||
|  * |  * | ||||||
|  * This program is free software; you can redistribute it and/or |  * This program is free software; you can redistribute it and/or | ||||||
|  * modify it under the terms of the GNU General Public License |  * modify it under the terms of the GNU General Public License | ||||||
|  |  | ||||||
|  | @ -4,7 +4,7 @@ | ||||||
|  * Generic driver for SMIA/SMIA++ compliant camera modules |  * Generic driver for SMIA/SMIA++ compliant camera modules | ||||||
|  * |  * | ||||||
|  * Copyright (C) 2011--2012 Nokia Corporation |  * Copyright (C) 2011--2012 Nokia Corporation | ||||||
|  * Contact: Sakari Ailus <sakari.ailus@maxwell.research.nokia.com> |  * Contact: Sakari Ailus <sakari.ailus@iki.fi> | ||||||
|  * |  * | ||||||
|  * This program is free software; you can redistribute it and/or |  * This program is free software; you can redistribute it and/or | ||||||
|  * modify it under the terms of the GNU General Public License |  * modify it under the terms of the GNU General Public License | ||||||
|  |  | ||||||
|  | @ -4,7 +4,7 @@ | ||||||
|  * Generic driver for SMIA/SMIA++ compliant camera modules |  * Generic driver for SMIA/SMIA++ compliant camera modules | ||||||
|  * |  * | ||||||
|  * Copyright (C) 2011--2012 Nokia Corporation |  * Copyright (C) 2011--2012 Nokia Corporation | ||||||
|  * Contact: Sakari Ailus <sakari.ailus@maxwell.research.nokia.com> |  * Contact: Sakari Ailus <sakari.ailus@iki.fi> | ||||||
|  * |  * | ||||||
|  * This program is free software; you can redistribute it and/or |  * This program is free software; you can redistribute it and/or | ||||||
|  * modify it under the terms of the GNU General Public License |  * modify it under the terms of the GNU General Public License | ||||||
|  |  | ||||||
|  | @ -4,7 +4,7 @@ | ||||||
|  * Generic driver for SMIA/SMIA++ compliant camera modules |  * Generic driver for SMIA/SMIA++ compliant camera modules | ||||||
|  * |  * | ||||||
|  * Copyright (C) 2011--2012 Nokia Corporation |  * Copyright (C) 2011--2012 Nokia Corporation | ||||||
|  * Contact: Sakari Ailus <sakari.ailus@maxwell.research.nokia.com> |  * Contact: Sakari Ailus <sakari.ailus@iki.fi> | ||||||
|  * |  * | ||||||
|  * This program is free software; you can redistribute it and/or |  * This program is free software; you can redistribute it and/or | ||||||
|  * modify it under the terms of the GNU General Public License |  * modify it under the terms of the GNU General Public License | ||||||
|  |  | ||||||
|  | @ -4,7 +4,7 @@ | ||||||
|  * Generic driver for SMIA/SMIA++ compliant camera modules |  * Generic driver for SMIA/SMIA++ compliant camera modules | ||||||
|  * |  * | ||||||
|  * Copyright (C) 2010--2012 Nokia Corporation |  * Copyright (C) 2010--2012 Nokia Corporation | ||||||
|  * Contact: Sakari Ailus <sakari.ailus@maxwell.research.nokia.com> |  * Contact: Sakari Ailus <sakari.ailus@iki.fi> | ||||||
|  * |  * | ||||||
|  * This program is free software; you can redistribute it and/or |  * This program is free software; you can redistribute it and/or | ||||||
|  * modify it under the terms of the GNU General Public License |  * modify it under the terms of the GNU General Public License | ||||||
|  |  | ||||||
|  | @ -15,6 +15,7 @@ | ||||||
| #include <linux/log2.h> | #include <linux/log2.h> | ||||||
| #include <linux/module.h> | #include <linux/module.h> | ||||||
| 
 | 
 | ||||||
|  | #include <media/mt9v022.h> | ||||||
| #include <media/soc_camera.h> | #include <media/soc_camera.h> | ||||||
| #include <media/soc_mediabus.h> | #include <media/soc_mediabus.h> | ||||||
| #include <media/v4l2-subdev.h> | #include <media/v4l2-subdev.h> | ||||||
|  | @ -50,6 +51,7 @@ MODULE_PARM_DESC(sensor_type, "Sensor type: \"colour\" or \"monochrome\""); | ||||||
| #define MT9V022_PIXEL_OPERATION_MODE	0x0f | #define MT9V022_PIXEL_OPERATION_MODE	0x0f | ||||||
| #define MT9V022_LED_OUT_CONTROL		0x1b | #define MT9V022_LED_OUT_CONTROL		0x1b | ||||||
| #define MT9V022_ADC_MODE_CONTROL	0x1c | #define MT9V022_ADC_MODE_CONTROL	0x1c | ||||||
|  | #define MT9V022_REG32			0x20 | ||||||
| #define MT9V022_ANALOG_GAIN		0x35 | #define MT9V022_ANALOG_GAIN		0x35 | ||||||
| #define MT9V022_BLACK_LEVEL_CALIB_CTRL	0x47 | #define MT9V022_BLACK_LEVEL_CALIB_CTRL	0x47 | ||||||
| #define MT9V022_PIXCLK_FV_LV		0x74 | #define MT9V022_PIXCLK_FV_LV		0x74 | ||||||
|  | @ -71,6 +73,14 @@ MODULE_PARM_DESC(sensor_type, "Sensor type: \"colour\" or \"monochrome\""); | ||||||
| #define MT9V022_COLUMN_SKIP		1 | #define MT9V022_COLUMN_SKIP		1 | ||||||
| #define MT9V022_ROW_SKIP		4 | #define MT9V022_ROW_SKIP		4 | ||||||
| 
 | 
 | ||||||
|  | #define MT9V022_HORIZONTAL_BLANKING_MIN	43 | ||||||
|  | #define MT9V022_HORIZONTAL_BLANKING_MAX	1023 | ||||||
|  | #define MT9V022_HORIZONTAL_BLANKING_DEF	94 | ||||||
|  | #define MT9V022_VERTICAL_BLANKING_MIN	2 | ||||||
|  | #define MT9V022_VERTICAL_BLANKING_MAX	3000 | ||||||
|  | #define MT9V022_VERTICAL_BLANKING_DEF	45 | ||||||
|  | 
 | ||||||
|  | #define is_mt9v022_rev3(id)	(id == 0x1313) | ||||||
| #define is_mt9v024(id)		(id == 0x1324) | #define is_mt9v024(id)		(id == 0x1324) | ||||||
| 
 | 
 | ||||||
| /* MT9V022 has only one fixed colorspace per pixelcode */ | /* MT9V022 has only one fixed colorspace per pixelcode */ | ||||||
|  | @ -136,6 +146,8 @@ struct mt9v022 { | ||||||
| 		struct v4l2_ctrl *autogain; | 		struct v4l2_ctrl *autogain; | ||||||
| 		struct v4l2_ctrl *gain; | 		struct v4l2_ctrl *gain; | ||||||
| 	}; | 	}; | ||||||
|  | 	struct v4l2_ctrl *hblank; | ||||||
|  | 	struct v4l2_ctrl *vblank; | ||||||
| 	struct v4l2_rect rect;	/* Sensor window */ | 	struct v4l2_rect rect;	/* Sensor window */ | ||||||
| 	const struct mt9v022_datafmt *fmt; | 	const struct mt9v022_datafmt *fmt; | ||||||
| 	const struct mt9v022_datafmt *fmts; | 	const struct mt9v022_datafmt *fmts; | ||||||
|  | @ -143,6 +155,7 @@ struct mt9v022 { | ||||||
| 	int num_fmts; | 	int num_fmts; | ||||||
| 	int model;	/* V4L2_IDENT_MT9V022* codes from v4l2-chip-ident.h */ | 	int model;	/* V4L2_IDENT_MT9V022* codes from v4l2-chip-ident.h */ | ||||||
| 	u16 chip_control; | 	u16 chip_control; | ||||||
|  | 	u16 chip_version; | ||||||
| 	unsigned short y_skip_top;	/* Lines to skip at the top */ | 	unsigned short y_skip_top;	/* Lines to skip at the top */ | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | @ -225,12 +238,32 @@ static int mt9v022_s_stream(struct v4l2_subdev *sd, int enable) | ||||||
| 	struct i2c_client *client = v4l2_get_subdevdata(sd); | 	struct i2c_client *client = v4l2_get_subdevdata(sd); | ||||||
| 	struct mt9v022 *mt9v022 = to_mt9v022(client); | 	struct mt9v022 *mt9v022 = to_mt9v022(client); | ||||||
| 
 | 
 | ||||||
| 	if (enable) | 	if (enable) { | ||||||
| 		/* Switch to master "normal" mode */ | 		/* Switch to master "normal" mode */ | ||||||
| 		mt9v022->chip_control &= ~0x10; | 		mt9v022->chip_control &= ~0x10; | ||||||
| 	else | 		if (is_mt9v022_rev3(mt9v022->chip_version) || | ||||||
|  | 		    is_mt9v024(mt9v022->chip_version)) { | ||||||
|  | 			/*
 | ||||||
|  | 			 * Unset snapshot mode specific settings: clear bit 9 | ||||||
|  | 			 * and bit 2 in reg. 0x20 when in normal mode. | ||||||
|  | 			 */ | ||||||
|  | 			if (reg_clear(client, MT9V022_REG32, 0x204)) | ||||||
|  | 				return -EIO; | ||||||
|  | 		} | ||||||
|  | 	} else { | ||||||
| 		/* Switch to snapshot mode */ | 		/* Switch to snapshot mode */ | ||||||
| 		mt9v022->chip_control |= 0x10; | 		mt9v022->chip_control |= 0x10; | ||||||
|  | 		if (is_mt9v022_rev3(mt9v022->chip_version) || | ||||||
|  | 		    is_mt9v024(mt9v022->chip_version)) { | ||||||
|  | 			/*
 | ||||||
|  | 			 * Required settings for snapshot mode: set bit 9 | ||||||
|  | 			 * (RST enable) and bit 2 (CR enable) in reg. 0x20 | ||||||
|  | 			 * See TechNote TN0960 or TN-09-225. | ||||||
|  | 			 */ | ||||||
|  | 			if (reg_set(client, MT9V022_REG32, 0x204)) | ||||||
|  | 				return -EIO; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
| 
 | 
 | ||||||
| 	if (reg_write(client, MT9V022_CHIP_CONTROL, mt9v022->chip_control) < 0) | 	if (reg_write(client, MT9V022_CHIP_CONTROL, mt9v022->chip_control) < 0) | ||||||
| 		return -EIO; | 		return -EIO; | ||||||
|  | @ -282,11 +315,10 @@ static int mt9v022_s_crop(struct v4l2_subdev *sd, const struct v4l2_crop *a) | ||||||
| 		 * Default 94, Phytec driver says: | 		 * Default 94, Phytec driver says: | ||||||
| 		 * "width + horizontal blank >= 660" | 		 * "width + horizontal blank >= 660" | ||||||
| 		 */ | 		 */ | ||||||
| 		ret = reg_write(client, MT9V022_HORIZONTAL_BLANKING, | 		ret = v4l2_ctrl_s_ctrl(mt9v022->hblank, | ||||||
| 				rect.width > 660 - 43 ? 43 : | 				rect.width > 660 - 43 ? 43 : 660 - rect.width); | ||||||
| 				660 - rect.width); |  | ||||||
| 	if (!ret) | 	if (!ret) | ||||||
| 		ret = reg_write(client, MT9V022_VERTICAL_BLANKING, 45); | 		ret = v4l2_ctrl_s_ctrl(mt9v022->vblank, 45); | ||||||
| 	if (!ret) | 	if (!ret) | ||||||
| 		ret = reg_write(client, MT9V022_WINDOW_WIDTH, rect.width); | 		ret = reg_write(client, MT9V022_WINDOW_WIDTH, rect.width); | ||||||
| 	if (!ret) | 	if (!ret) | ||||||
|  | @ -509,6 +541,18 @@ static int mt9v022_g_volatile_ctrl(struct v4l2_ctrl *ctrl) | ||||||
| 		range = exp->maximum - exp->minimum; | 		range = exp->maximum - exp->minimum; | ||||||
| 		exp->val = ((data - 1) * range + 239) / 479 + exp->minimum; | 		exp->val = ((data - 1) * range + 239) / 479 + exp->minimum; | ||||||
| 		return 0; | 		return 0; | ||||||
|  | 	case V4L2_CID_HBLANK: | ||||||
|  | 		data = reg_read(client, MT9V022_HORIZONTAL_BLANKING); | ||||||
|  | 		if (data < 0) | ||||||
|  | 			return -EIO; | ||||||
|  | 		ctrl->val = data; | ||||||
|  | 		return 0; | ||||||
|  | 	case V4L2_CID_VBLANK: | ||||||
|  | 		data = reg_read(client, MT9V022_VERTICAL_BLANKING); | ||||||
|  | 		if (data < 0) | ||||||
|  | 			return -EIO; | ||||||
|  | 		ctrl->val = data; | ||||||
|  | 		return 0; | ||||||
| 	} | 	} | ||||||
| 	return -EINVAL; | 	return -EINVAL; | ||||||
| } | } | ||||||
|  | @ -590,6 +634,16 @@ static int mt9v022_s_ctrl(struct v4l2_ctrl *ctrl) | ||||||
| 				return -EIO; | 				return -EIO; | ||||||
| 		} | 		} | ||||||
| 		return 0; | 		return 0; | ||||||
|  | 	case V4L2_CID_HBLANK: | ||||||
|  | 		if (reg_write(client, MT9V022_HORIZONTAL_BLANKING, | ||||||
|  | 				ctrl->val) < 0) | ||||||
|  | 			return -EIO; | ||||||
|  | 		return 0; | ||||||
|  | 	case V4L2_CID_VBLANK: | ||||||
|  | 		if (reg_write(client, MT9V022_VERTICAL_BLANKING, | ||||||
|  | 				ctrl->val) < 0) | ||||||
|  | 			return -EIO; | ||||||
|  | 		return 0; | ||||||
| 	} | 	} | ||||||
| 	return -EINVAL; | 	return -EINVAL; | ||||||
| } | } | ||||||
|  | @ -621,6 +675,8 @@ static int mt9v022_video_probe(struct i2c_client *client) | ||||||
| 		goto ei2c; | 		goto ei2c; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	mt9v022->chip_version = data; | ||||||
|  | 
 | ||||||
| 	mt9v022->reg = is_mt9v024(data) ? &mt9v024_register : | 	mt9v022->reg = is_mt9v024(data) ? &mt9v024_register : | ||||||
| 			&mt9v022_register; | 			&mt9v022_register; | ||||||
| 
 | 
 | ||||||
|  | @ -819,6 +875,7 @@ static int mt9v022_probe(struct i2c_client *client, | ||||||
| 	struct mt9v022 *mt9v022; | 	struct mt9v022 *mt9v022; | ||||||
| 	struct soc_camera_link *icl = soc_camera_i2c_to_link(client); | 	struct soc_camera_link *icl = soc_camera_i2c_to_link(client); | ||||||
| 	struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent); | 	struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent); | ||||||
|  | 	struct mt9v022_platform_data *pdata = icl->priv; | ||||||
| 	int ret; | 	int ret; | ||||||
| 
 | 
 | ||||||
| 	if (!icl) { | 	if (!icl) { | ||||||
|  | @ -857,10 +914,21 @@ static int mt9v022_probe(struct i2c_client *client, | ||||||
| 	mt9v022->exposure = v4l2_ctrl_new_std(&mt9v022->hdl, &mt9v022_ctrl_ops, | 	mt9v022->exposure = v4l2_ctrl_new_std(&mt9v022->hdl, &mt9v022_ctrl_ops, | ||||||
| 			V4L2_CID_EXPOSURE, 1, 255, 1, 255); | 			V4L2_CID_EXPOSURE, 1, 255, 1, 255); | ||||||
| 
 | 
 | ||||||
|  | 	mt9v022->hblank = v4l2_ctrl_new_std(&mt9v022->hdl, &mt9v022_ctrl_ops, | ||||||
|  | 			V4L2_CID_HBLANK, MT9V022_HORIZONTAL_BLANKING_MIN, | ||||||
|  | 			MT9V022_HORIZONTAL_BLANKING_MAX, 1, | ||||||
|  | 			MT9V022_HORIZONTAL_BLANKING_DEF); | ||||||
|  | 
 | ||||||
|  | 	mt9v022->vblank = v4l2_ctrl_new_std(&mt9v022->hdl, &mt9v022_ctrl_ops, | ||||||
|  | 			V4L2_CID_VBLANK, MT9V022_VERTICAL_BLANKING_MIN, | ||||||
|  | 			MT9V022_VERTICAL_BLANKING_MAX, 1, | ||||||
|  | 			MT9V022_VERTICAL_BLANKING_DEF); | ||||||
|  | 
 | ||||||
| 	mt9v022->subdev.ctrl_handler = &mt9v022->hdl; | 	mt9v022->subdev.ctrl_handler = &mt9v022->hdl; | ||||||
| 	if (mt9v022->hdl.error) { | 	if (mt9v022->hdl.error) { | ||||||
| 		int err = mt9v022->hdl.error; | 		int err = mt9v022->hdl.error; | ||||||
| 
 | 
 | ||||||
|  | 		dev_err(&client->dev, "control initialisation err %d\n", err); | ||||||
| 		kfree(mt9v022); | 		kfree(mt9v022); | ||||||
| 		return err; | 		return err; | ||||||
| 	} | 	} | ||||||
|  | @ -871,10 +939,10 @@ static int mt9v022_probe(struct i2c_client *client, | ||||||
| 	mt9v022->chip_control = MT9V022_CHIP_CONTROL_DEFAULT; | 	mt9v022->chip_control = MT9V022_CHIP_CONTROL_DEFAULT; | ||||||
| 
 | 
 | ||||||
| 	/*
 | 	/*
 | ||||||
| 	 * MT9V022 _really_ corrupts the first read out line. | 	 * On some platforms the first read out line is corrupted. | ||||||
| 	 * TODO: verify on i.MX31 | 	 * Workaround it by skipping if indicated by platform data. | ||||||
| 	 */ | 	 */ | ||||||
| 	mt9v022->y_skip_top	= 1; | 	mt9v022->y_skip_top	= pdata ? pdata->y_skip_top : 0; | ||||||
| 	mt9v022->rect.left	= MT9V022_COLUMN_SKIP; | 	mt9v022->rect.left	= MT9V022_COLUMN_SKIP; | ||||||
| 	mt9v022->rect.top	= MT9V022_ROW_SKIP; | 	mt9v022->rect.top	= MT9V022_ROW_SKIP; | ||||||
| 	mt9v022->rect.width	= MT9V022_MAX_WIDTH; | 	mt9v022->rect.width	= MT9V022_MAX_WIDTH; | ||||||
|  |  | ||||||
|  | @ -586,9 +586,20 @@ static const struct regval_list ov2640_format_change_preamble_regs[] = { | ||||||
| 	ENDMARKER, | 	ENDMARKER, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| static const struct regval_list ov2640_yuv422_regs[] = { | static const struct regval_list ov2640_yuyv_regs[] = { | ||||||
|  | 	{ IMAGE_MODE, IMAGE_MODE_YUV422 }, | ||||||
|  | 	{ 0xd7, 0x03 }, | ||||||
|  | 	{ 0x33, 0xa0 }, | ||||||
|  | 	{ 0xe5, 0x1f }, | ||||||
|  | 	{ 0xe1, 0x67 }, | ||||||
|  | 	{ RESET,  0x00 }, | ||||||
|  | 	{ R_BYPASS, R_BYPASS_USE_DSP }, | ||||||
|  | 	ENDMARKER, | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | static const struct regval_list ov2640_uyvy_regs[] = { | ||||||
| 	{ IMAGE_MODE, IMAGE_MODE_LBYTE_FIRST | IMAGE_MODE_YUV422 }, | 	{ IMAGE_MODE, IMAGE_MODE_LBYTE_FIRST | IMAGE_MODE_YUV422 }, | ||||||
| 	{ 0xD7, 0x01 }, | 	{ 0xd7, 0x01 }, | ||||||
| 	{ 0x33, 0xa0 }, | 	{ 0x33, 0xa0 }, | ||||||
| 	{ 0xe1, 0x67 }, | 	{ 0xe1, 0x67 }, | ||||||
| 	{ RESET,  0x00 }, | 	{ RESET,  0x00 }, | ||||||
|  | @ -596,7 +607,15 @@ static const struct regval_list ov2640_yuv422_regs[] = { | ||||||
| 	ENDMARKER, | 	ENDMARKER, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| static const struct regval_list ov2640_rgb565_regs[] = { | static const struct regval_list ov2640_rgb565_be_regs[] = { | ||||||
|  | 	{ IMAGE_MODE, IMAGE_MODE_RGB565 }, | ||||||
|  | 	{ 0xd7, 0x03 }, | ||||||
|  | 	{ RESET,  0x00 }, | ||||||
|  | 	{ R_BYPASS, R_BYPASS_USE_DSP }, | ||||||
|  | 	ENDMARKER, | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | static const struct regval_list ov2640_rgb565_le_regs[] = { | ||||||
| 	{ IMAGE_MODE, IMAGE_MODE_LBYTE_FIRST | IMAGE_MODE_RGB565 }, | 	{ IMAGE_MODE, IMAGE_MODE_LBYTE_FIRST | IMAGE_MODE_RGB565 }, | ||||||
| 	{ 0xd7, 0x03 }, | 	{ 0xd7, 0x03 }, | ||||||
| 	{ RESET,  0x00 }, | 	{ RESET,  0x00 }, | ||||||
|  | @ -605,7 +624,9 @@ static const struct regval_list ov2640_rgb565_regs[] = { | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| static enum v4l2_mbus_pixelcode ov2640_codes[] = { | static enum v4l2_mbus_pixelcode ov2640_codes[] = { | ||||||
|  | 	V4L2_MBUS_FMT_YUYV8_2X8, | ||||||
| 	V4L2_MBUS_FMT_UYVY8_2X8, | 	V4L2_MBUS_FMT_UYVY8_2X8, | ||||||
|  | 	V4L2_MBUS_FMT_RGB565_2X8_BE, | ||||||
| 	V4L2_MBUS_FMT_RGB565_2X8_LE, | 	V4L2_MBUS_FMT_RGB565_2X8_LE, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | @ -787,14 +808,22 @@ static int ov2640_set_params(struct i2c_client *client, u32 *width, u32 *height, | ||||||
| 	/* select format */ | 	/* select format */ | ||||||
| 	priv->cfmt_code = 0; | 	priv->cfmt_code = 0; | ||||||
| 	switch (code) { | 	switch (code) { | ||||||
|  | 	case V4L2_MBUS_FMT_RGB565_2X8_BE: | ||||||
|  | 		dev_dbg(&client->dev, "%s: Selected cfmt RGB565 BE", __func__); | ||||||
|  | 		selected_cfmt_regs = ov2640_rgb565_be_regs; | ||||||
|  | 		break; | ||||||
| 	case V4L2_MBUS_FMT_RGB565_2X8_LE: | 	case V4L2_MBUS_FMT_RGB565_2X8_LE: | ||||||
| 		dev_dbg(&client->dev, "%s: Selected cfmt RGB565", __func__); | 		dev_dbg(&client->dev, "%s: Selected cfmt RGB565 LE", __func__); | ||||||
| 		selected_cfmt_regs = ov2640_rgb565_regs; | 		selected_cfmt_regs = ov2640_rgb565_le_regs; | ||||||
|  | 		break; | ||||||
|  | 	case V4L2_MBUS_FMT_YUYV8_2X8: | ||||||
|  | 		dev_dbg(&client->dev, "%s: Selected cfmt YUYV (YUV422)", __func__); | ||||||
|  | 		selected_cfmt_regs = ov2640_yuyv_regs; | ||||||
| 		break; | 		break; | ||||||
| 	default: | 	default: | ||||||
| 	case V4L2_MBUS_FMT_UYVY8_2X8: | 	case V4L2_MBUS_FMT_UYVY8_2X8: | ||||||
| 		dev_dbg(&client->dev, "%s: Selected cfmt YUV422", __func__); | 		dev_dbg(&client->dev, "%s: Selected cfmt UYVY", __func__); | ||||||
| 		selected_cfmt_regs = ov2640_yuv422_regs; | 		selected_cfmt_regs = ov2640_uyvy_regs; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	/* reset hardware */ | 	/* reset hardware */ | ||||||
|  | @ -859,10 +888,12 @@ static int ov2640_g_fmt(struct v4l2_subdev *sd, | ||||||
| 	mf->code	= priv->cfmt_code; | 	mf->code	= priv->cfmt_code; | ||||||
| 
 | 
 | ||||||
| 	switch (mf->code) { | 	switch (mf->code) { | ||||||
|  | 	case V4L2_MBUS_FMT_RGB565_2X8_BE: | ||||||
| 	case V4L2_MBUS_FMT_RGB565_2X8_LE: | 	case V4L2_MBUS_FMT_RGB565_2X8_LE: | ||||||
| 		mf->colorspace = V4L2_COLORSPACE_SRGB; | 		mf->colorspace = V4L2_COLORSPACE_SRGB; | ||||||
| 		break; | 		break; | ||||||
| 	default: | 	default: | ||||||
|  | 	case V4L2_MBUS_FMT_YUYV8_2X8: | ||||||
| 	case V4L2_MBUS_FMT_UYVY8_2X8: | 	case V4L2_MBUS_FMT_UYVY8_2X8: | ||||||
| 		mf->colorspace = V4L2_COLORSPACE_JPEG; | 		mf->colorspace = V4L2_COLORSPACE_JPEG; | ||||||
| 	} | 	} | ||||||
|  | @ -879,11 +910,13 @@ static int ov2640_s_fmt(struct v4l2_subdev *sd, | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 	switch (mf->code) { | 	switch (mf->code) { | ||||||
|  | 	case V4L2_MBUS_FMT_RGB565_2X8_BE: | ||||||
| 	case V4L2_MBUS_FMT_RGB565_2X8_LE: | 	case V4L2_MBUS_FMT_RGB565_2X8_LE: | ||||||
| 		mf->colorspace = V4L2_COLORSPACE_SRGB; | 		mf->colorspace = V4L2_COLORSPACE_SRGB; | ||||||
| 		break; | 		break; | ||||||
| 	default: | 	default: | ||||||
| 		mf->code = V4L2_MBUS_FMT_UYVY8_2X8; | 		mf->code = V4L2_MBUS_FMT_UYVY8_2X8; | ||||||
|  | 	case V4L2_MBUS_FMT_YUYV8_2X8: | ||||||
| 	case V4L2_MBUS_FMT_UYVY8_2X8: | 	case V4L2_MBUS_FMT_UYVY8_2X8: | ||||||
| 		mf->colorspace = V4L2_COLORSPACE_JPEG; | 		mf->colorspace = V4L2_COLORSPACE_JPEG; | ||||||
| 	} | 	} | ||||||
|  | @ -896,21 +929,21 @@ static int ov2640_s_fmt(struct v4l2_subdev *sd, | ||||||
| static int ov2640_try_fmt(struct v4l2_subdev *sd, | static int ov2640_try_fmt(struct v4l2_subdev *sd, | ||||||
| 			  struct v4l2_mbus_framefmt *mf) | 			  struct v4l2_mbus_framefmt *mf) | ||||||
| { | { | ||||||
| 	const struct ov2640_win_size *win; |  | ||||||
| 
 |  | ||||||
| 	/*
 | 	/*
 | ||||||
| 	 * select suitable win | 	 * select suitable win, but don't store it | ||||||
| 	 */ | 	 */ | ||||||
| 	win = ov2640_select_win(&mf->width, &mf->height); | 	ov2640_select_win(&mf->width, &mf->height); | ||||||
| 
 | 
 | ||||||
| 	mf->field	= V4L2_FIELD_NONE; | 	mf->field	= V4L2_FIELD_NONE; | ||||||
| 
 | 
 | ||||||
| 	switch (mf->code) { | 	switch (mf->code) { | ||||||
|  | 	case V4L2_MBUS_FMT_RGB565_2X8_BE: | ||||||
| 	case V4L2_MBUS_FMT_RGB565_2X8_LE: | 	case V4L2_MBUS_FMT_RGB565_2X8_LE: | ||||||
| 		mf->colorspace = V4L2_COLORSPACE_SRGB; | 		mf->colorspace = V4L2_COLORSPACE_SRGB; | ||||||
| 		break; | 		break; | ||||||
| 	default: | 	default: | ||||||
| 		mf->code = V4L2_MBUS_FMT_UYVY8_2X8; | 		mf->code = V4L2_MBUS_FMT_UYVY8_2X8; | ||||||
|  | 	case V4L2_MBUS_FMT_YUYV8_2X8: | ||||||
| 	case V4L2_MBUS_FMT_UYVY8_2X8: | 	case V4L2_MBUS_FMT_UYVY8_2X8: | ||||||
| 		mf->colorspace = V4L2_COLORSPACE_JPEG; | 		mf->colorspace = V4L2_COLORSPACE_JPEG; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | @ -910,18 +910,7 @@ static struct i2c_driver vs6624_driver = { | ||||||
| 	.id_table       = vs6624_id, | 	.id_table       = vs6624_id, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| static __init int vs6624_init(void) | module_i2c_driver(vs6624_driver); | ||||||
| { |  | ||||||
| 	return i2c_add_driver(&vs6624_driver); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| static __exit void vs6624_exit(void) |  | ||||||
| { |  | ||||||
| 	i2c_del_driver(&vs6624_driver); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| module_init(vs6624_init); |  | ||||||
| module_exit(vs6624_exit); |  | ||||||
| 
 | 
 | ||||||
| MODULE_DESCRIPTION("VS6624 sensor driver"); | MODULE_DESCRIPTION("VS6624 sensor driver"); | ||||||
| MODULE_AUTHOR("Scott Jiang <Scott.Jiang.Linux@gmail.com>"); | MODULE_AUTHOR("Scott Jiang <Scott.Jiang.Linux@gmail.com>"); | ||||||
|  |  | ||||||
|  | @ -4,7 +4,8 @@ | ||||||
| 
 | 
 | ||||||
| config SMS_SDIO_DRV | config SMS_SDIO_DRV | ||||||
| 	tristate "Siano SMS1xxx based MDTV via SDIO interface" | 	tristate "Siano SMS1xxx based MDTV via SDIO interface" | ||||||
| 	depends on DVB_CORE && RC_CORE && HAS_DMA | 	depends on DVB_CORE && HAS_DMA | ||||||
| 	depends on MMC | 	depends on MMC | ||||||
|  | 	select MEDIA_COMMON_OPTIONS | ||||||
| 	---help--- | 	---help--- | ||||||
| 	  Choose if you would like to have Siano's support for SDIO interface | 	  Choose if you would like to have Siano's support for SDIO interface | ||||||
|  |  | ||||||
|  | @ -200,7 +200,7 @@ static void flush_request_modules(struct bttv *dev) | ||||||
| } | } | ||||||
| #else | #else | ||||||
| #define request_modules(dev) | #define request_modules(dev) | ||||||
| #define flush_request_modules(dev) | #define flush_request_modules(dev) do {} while(0) | ||||||
| #endif /* CONFIG_MODULES */ | #endif /* CONFIG_MODULES */ | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -301,11 +301,10 @@ const struct bttv_tvnorm bttv_tvnorms[] = { | ||||||
| 			/* totalwidth */ 1135, | 			/* totalwidth */ 1135, | ||||||
| 			/* sqwidth */ 944, | 			/* sqwidth */ 944, | ||||||
| 			/* vdelay */ 0x20, | 			/* vdelay */ 0x20, | ||||||
| 			/* sheight */ 576, |  | ||||||
| 			/* videostart0 */ 23) |  | ||||||
| 		/* bt878 (and bt848?) can capture another
 | 		/* bt878 (and bt848?) can capture another
 | ||||||
| 		   line below active video. */ | 		   line below active video. */ | ||||||
| 		.cropcap.bounds.height = (576 + 2) + 0x20 - 2, | 			/* sheight */ (576 + 2) + 0x20 - 2, | ||||||
|  | 			/* videostart0 */ 23) | ||||||
| 	},{ | 	},{ | ||||||
| 		.v4l2_id        = V4L2_STD_NTSC_M | V4L2_STD_NTSC_M_KR, | 		.v4l2_id        = V4L2_STD_NTSC_M | V4L2_STD_NTSC_M_KR, | ||||||
| 		.name           = "NTSC", | 		.name           = "NTSC", | ||||||
|  |  | ||||||
|  | @ -197,7 +197,7 @@ err_exit: | ||||||
| 	return ret; | 	return ret; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int cx18_alsa_load(struct cx18 *cx) | static int __init cx18_alsa_load(struct cx18 *cx) | ||||||
| { | { | ||||||
| 	struct v4l2_device *v4l2_dev = &cx->v4l2_dev; | 	struct v4l2_device *v4l2_dev = &cx->v4l2_dev; | ||||||
| 	struct cx18_stream *s; | 	struct cx18_stream *s; | ||||||
|  |  | ||||||
|  | @ -37,6 +37,7 @@ | ||||||
| #include "cx18-streams.h" | #include "cx18-streams.h" | ||||||
| #include "cx18-fileops.h" | #include "cx18-fileops.h" | ||||||
| #include "cx18-alsa.h" | #include "cx18-alsa.h" | ||||||
|  | #include "cx18-alsa-pcm.h" | ||||||
| 
 | 
 | ||||||
| static unsigned int pcm_debug; | static unsigned int pcm_debug; | ||||||
| module_param(pcm_debug, int, 0644); | module_param(pcm_debug, int, 0644); | ||||||
|  |  | ||||||
|  | @ -98,7 +98,7 @@ static int cx18_i2c_new_ir(struct cx18 *cx, struct i2c_adapter *adap, u32 hw, | ||||||
| 	case CX18_HW_Z8F0811_IR_RX_HAUP: | 	case CX18_HW_Z8F0811_IR_RX_HAUP: | ||||||
| 		init_data->ir_codes = RC_MAP_HAUPPAUGE; | 		init_data->ir_codes = RC_MAP_HAUPPAUGE; | ||||||
| 		init_data->internal_get_key_func = IR_KBD_GET_KEY_HAUP_XVR; | 		init_data->internal_get_key_func = IR_KBD_GET_KEY_HAUP_XVR; | ||||||
| 		init_data->type = RC_TYPE_RC5; | 		init_data->type = RC_BIT_RC5; | ||||||
| 		init_data->name = cx->card_name; | 		init_data->name = cx->card_name; | ||||||
| 		info.platform_data = init_data; | 		info.platform_data = init_data; | ||||||
| 		break; | 		break; | ||||||
|  |  | ||||||
|  | @ -97,7 +97,7 @@ static struct { | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| void cx18_dma_free(struct videobuf_queue *q, | static void cx18_dma_free(struct videobuf_queue *q, | ||||||
| 	struct cx18_stream *s, struct cx18_videobuf_buffer *buf) | 	struct cx18_stream *s, struct cx18_videobuf_buffer *buf) | ||||||
| { | { | ||||||
| 	videobuf_waiton(q, &buf->vb, 0, 0); | 	videobuf_waiton(q, &buf->vb, 0, 0); | ||||||
|  |  | ||||||
|  | @ -263,7 +263,7 @@ static int netup_fpga_op_rw(struct fpga_internal *inter, int addr, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* flag - mem/io, read - read/write */ | /* flag - mem/io, read - read/write */ | ||||||
| int altera_ci_op_cam(struct dvb_ca_en50221 *en50221, int slot, | static int altera_ci_op_cam(struct dvb_ca_en50221 *en50221, int slot, | ||||||
| 				u8 flag, u8 read, int addr, u8 val) | 				u8 flag, u8 read, int addr, u8 val) | ||||||
| { | { | ||||||
| 
 | 
 | ||||||
|  | @ -298,31 +298,32 @@ int altera_ci_op_cam(struct dvb_ca_en50221 *en50221, int slot, | ||||||
| 	return mem; | 	return mem; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int altera_ci_read_attribute_mem(struct dvb_ca_en50221 *en50221, | static int altera_ci_read_attribute_mem(struct dvb_ca_en50221 *en50221, | ||||||
| 					int slot, int addr) | 					int slot, int addr) | ||||||
| { | { | ||||||
| 	return altera_ci_op_cam(en50221, slot, 0, NETUP_CI_FLG_RD, addr, 0); | 	return altera_ci_op_cam(en50221, slot, 0, NETUP_CI_FLG_RD, addr, 0); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int altera_ci_write_attribute_mem(struct dvb_ca_en50221 *en50221, | static int altera_ci_write_attribute_mem(struct dvb_ca_en50221 *en50221, | ||||||
| 					 int slot, int addr, u8 data) | 					 int slot, int addr, u8 data) | ||||||
| { | { | ||||||
| 	return altera_ci_op_cam(en50221, slot, 0, 0, addr, data); | 	return altera_ci_op_cam(en50221, slot, 0, 0, addr, data); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int altera_ci_read_cam_ctl(struct dvb_ca_en50221 *en50221, int slot, u8 addr) | static int altera_ci_read_cam_ctl(struct dvb_ca_en50221 *en50221, | ||||||
|  | 				  int slot, u8 addr) | ||||||
| { | { | ||||||
| 	return altera_ci_op_cam(en50221, slot, NETUP_CI_FLG_CTL, | 	return altera_ci_op_cam(en50221, slot, NETUP_CI_FLG_CTL, | ||||||
| 						NETUP_CI_FLG_RD, addr, 0); | 						NETUP_CI_FLG_RD, addr, 0); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int altera_ci_write_cam_ctl(struct dvb_ca_en50221 *en50221, int slot, | static int altera_ci_write_cam_ctl(struct dvb_ca_en50221 *en50221, int slot, | ||||||
| 				   u8 addr, u8 data) | 				   u8 addr, u8 data) | ||||||
| { | { | ||||||
| 	return altera_ci_op_cam(en50221, slot, NETUP_CI_FLG_CTL, 0, addr, data); | 	return altera_ci_op_cam(en50221, slot, NETUP_CI_FLG_CTL, 0, addr, data); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int altera_ci_slot_reset(struct dvb_ca_en50221 *en50221, int slot) | static int altera_ci_slot_reset(struct dvb_ca_en50221 *en50221, int slot) | ||||||
| { | { | ||||||
| 	struct altera_ci_state *state = en50221->data; | 	struct altera_ci_state *state = en50221->data; | ||||||
| 	struct fpga_internal *inter = state->internal; | 	struct fpga_internal *inter = state->internal; | ||||||
|  | @ -365,13 +366,13 @@ int altera_ci_slot_reset(struct dvb_ca_en50221 *en50221, int slot) | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int altera_ci_slot_shutdown(struct dvb_ca_en50221 *en50221, int slot) | static int altera_ci_slot_shutdown(struct dvb_ca_en50221 *en50221, int slot) | ||||||
| { | { | ||||||
| 	/* not implemented */ | 	/* not implemented */ | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int altera_ci_slot_ts_ctl(struct dvb_ca_en50221 *en50221, int slot) | static int altera_ci_slot_ts_ctl(struct dvb_ca_en50221 *en50221, int slot) | ||||||
| { | { | ||||||
| 	struct altera_ci_state *state = en50221->data; | 	struct altera_ci_state *state = en50221->data; | ||||||
| 	struct fpga_internal *inter = state->internal; | 	struct fpga_internal *inter = state->internal; | ||||||
|  | @ -448,8 +449,8 @@ int altera_ci_irq(void *dev) | ||||||
| } | } | ||||||
| EXPORT_SYMBOL(altera_ci_irq); | EXPORT_SYMBOL(altera_ci_irq); | ||||||
| 
 | 
 | ||||||
| int altera_poll_ci_slot_status(struct dvb_ca_en50221 *en50221, int slot, | static int altera_poll_ci_slot_status(struct dvb_ca_en50221 *en50221, | ||||||
| 								int open) | 				      int slot, int open) | ||||||
| { | { | ||||||
| 	struct altera_ci_state *state = en50221->data; | 	struct altera_ci_state *state = en50221->data; | ||||||
| 
 | 
 | ||||||
|  | @ -459,7 +460,7 @@ int altera_poll_ci_slot_status(struct dvb_ca_en50221 *en50221, int slot, | ||||||
| 	return state->status; | 	return state->status; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void altera_hw_filt_release(void *main_dev, int filt_nr) | static void altera_hw_filt_release(void *main_dev, int filt_nr) | ||||||
| { | { | ||||||
| 	struct fpga_inode *temp_int = find_inode(main_dev); | 	struct fpga_inode *temp_int = find_inode(main_dev); | ||||||
| 	struct netup_hw_pid_filter *pid_filt = NULL; | 	struct netup_hw_pid_filter *pid_filt = NULL; | ||||||
|  | @ -581,7 +582,7 @@ static void altera_toggle_fullts_streaming(struct netup_hw_pid_filter *pid_filt, | ||||||
| 	mutex_unlock(&inter->fpga_mutex); | 	mutex_unlock(&inter->fpga_mutex); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int altera_pid_feed_control(void *demux_dev, int filt_nr, | static int altera_pid_feed_control(void *demux_dev, int filt_nr, | ||||||
| 		struct dvb_demux_feed *feed, int onoff) | 		struct dvb_demux_feed *feed, int onoff) | ||||||
| { | { | ||||||
| 	struct fpga_inode *temp_int = find_dinode(demux_dev); | 	struct fpga_inode *temp_int = find_dinode(demux_dev); | ||||||
|  | @ -603,41 +604,41 @@ int altera_pid_feed_control(void *demux_dev, int filt_nr, | ||||||
| } | } | ||||||
| EXPORT_SYMBOL(altera_pid_feed_control); | EXPORT_SYMBOL(altera_pid_feed_control); | ||||||
| 
 | 
 | ||||||
| int altera_ci_start_feed(struct dvb_demux_feed *feed, int num) | static int altera_ci_start_feed(struct dvb_demux_feed *feed, int num) | ||||||
| { | { | ||||||
| 	altera_pid_feed_control(feed->demux, num, feed, 1); | 	altera_pid_feed_control(feed->demux, num, feed, 1); | ||||||
| 
 | 
 | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int altera_ci_stop_feed(struct dvb_demux_feed *feed, int num) | static int altera_ci_stop_feed(struct dvb_demux_feed *feed, int num) | ||||||
| { | { | ||||||
| 	altera_pid_feed_control(feed->demux, num, feed, 0); | 	altera_pid_feed_control(feed->demux, num, feed, 0); | ||||||
| 
 | 
 | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int altera_ci_start_feed_1(struct dvb_demux_feed *feed) | static int altera_ci_start_feed_1(struct dvb_demux_feed *feed) | ||||||
| { | { | ||||||
| 	return altera_ci_start_feed(feed, 1); | 	return altera_ci_start_feed(feed, 1); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int altera_ci_stop_feed_1(struct dvb_demux_feed *feed) | static int altera_ci_stop_feed_1(struct dvb_demux_feed *feed) | ||||||
| { | { | ||||||
| 	return altera_ci_stop_feed(feed, 1); | 	return altera_ci_stop_feed(feed, 1); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int altera_ci_start_feed_2(struct dvb_demux_feed *feed) | static int altera_ci_start_feed_2(struct dvb_demux_feed *feed) | ||||||
| { | { | ||||||
| 	return altera_ci_start_feed(feed, 2); | 	return altera_ci_start_feed(feed, 2); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int altera_ci_stop_feed_2(struct dvb_demux_feed *feed) | static int altera_ci_stop_feed_2(struct dvb_demux_feed *feed) | ||||||
| { | { | ||||||
| 	return altera_ci_stop_feed(feed, 2); | 	return altera_ci_stop_feed(feed, 2); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int altera_hw_filt_init(struct altera_ci_config *config, int hw_filt_nr) | static int altera_hw_filt_init(struct altera_ci_config *config, int hw_filt_nr) | ||||||
| { | { | ||||||
| 	struct netup_hw_pid_filter *pid_filt = NULL; | 	struct netup_hw_pid_filter *pid_filt = NULL; | ||||||
| 	struct fpga_inode *temp_int = find_inode(config->dev); | 	struct fpga_inode *temp_int = find_inode(config->dev); | ||||||
|  |  | ||||||
|  | @ -24,6 +24,7 @@ | ||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
| #include "cx23885.h" | #include "cx23885.h" | ||||||
|  | #include "cimax2.h" | ||||||
| #include "dvb_ca_en50221.h" | #include "dvb_ca_en50221.h" | ||||||
| /**** Bit definitions for MC417_RWD and MC417_OEN registers  ***
 | /**** Bit definitions for MC417_RWD and MC417_OEN registers  ***
 | ||||||
|   bits 31-16 |   bits 31-16 | ||||||
|  | @ -87,7 +88,7 @@ struct netup_ci_state { | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| int netup_read_i2c(struct i2c_adapter *i2c_adap, u8 addr, u8 reg, | static int netup_read_i2c(struct i2c_adapter *i2c_adap, u8 addr, u8 reg, | ||||||
| 						u8 *buf, int len) | 						u8 *buf, int len) | ||||||
| { | { | ||||||
| 	int ret; | 	int ret; | ||||||
|  | @ -120,7 +121,7 @@ int netup_read_i2c(struct i2c_adapter *i2c_adap, u8 addr, u8 reg, | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int netup_write_i2c(struct i2c_adapter *i2c_adap, u8 addr, u8 reg, | static int netup_write_i2c(struct i2c_adapter *i2c_adap, u8 addr, u8 reg, | ||||||
| 						u8 *buf, int len) | 						u8 *buf, int len) | ||||||
| { | { | ||||||
| 	int ret; | 	int ret; | ||||||
|  | @ -147,7 +148,7 @@ int netup_write_i2c(struct i2c_adapter *i2c_adap, u8 addr, u8 reg, | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int netup_ci_get_mem(struct cx23885_dev *dev) | static int netup_ci_get_mem(struct cx23885_dev *dev) | ||||||
| { | { | ||||||
| 	int mem; | 	int mem; | ||||||
| 	unsigned long timeout = jiffies + msecs_to_jiffies(1); | 	unsigned long timeout = jiffies + msecs_to_jiffies(1); | ||||||
|  | @ -166,7 +167,7 @@ int netup_ci_get_mem(struct cx23885_dev *dev) | ||||||
| 	return mem & 0xff; | 	return mem & 0xff; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int netup_ci_op_cam(struct dvb_ca_en50221 *en50221, int slot, | static int netup_ci_op_cam(struct dvb_ca_en50221 *en50221, int slot, | ||||||
| 				u8 flag, u8 read, int addr, u8 data) | 				u8 flag, u8 read, int addr, u8 data) | ||||||
| { | { | ||||||
| 	struct netup_ci_state *state = en50221->data; | 	struct netup_ci_state *state = en50221->data; | ||||||
|  | @ -248,7 +249,8 @@ int netup_ci_write_attribute_mem(struct dvb_ca_en50221 *en50221, | ||||||
| 	return netup_ci_op_cam(en50221, slot, 0, 0, addr, data); | 	return netup_ci_op_cam(en50221, slot, 0, 0, addr, data); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int netup_ci_read_cam_ctl(struct dvb_ca_en50221 *en50221, int slot, u8 addr) | int netup_ci_read_cam_ctl(struct dvb_ca_en50221 *en50221, int slot, | ||||||
|  | 				 u8 addr) | ||||||
| { | { | ||||||
| 	return netup_ci_op_cam(en50221, slot, NETUP_CI_CTL, | 	return netup_ci_op_cam(en50221, slot, NETUP_CI_CTL, | ||||||
| 							NETUP_CI_RD, addr, 0); | 							NETUP_CI_RD, addr, 0); | ||||||
|  | @ -295,7 +297,7 @@ int netup_ci_slot_shutdown(struct dvb_ca_en50221 *en50221, int slot) | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int netup_ci_set_irq(struct dvb_ca_en50221 *en50221, u8 irq_mode) | static int netup_ci_set_irq(struct dvb_ca_en50221 *en50221, u8 irq_mode) | ||||||
| { | { | ||||||
| 	struct netup_ci_state *state = en50221->data; | 	struct netup_ci_state *state = en50221->data; | ||||||
| 	int ret; | 	int ret; | ||||||
|  | @ -399,7 +401,8 @@ int netup_ci_slot_status(struct cx23885_dev *dev, u32 pci_status) | ||||||
| 	return 1; | 	return 1; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int netup_poll_ci_slot_status(struct dvb_ca_en50221 *en50221, int slot, int open) | int netup_poll_ci_slot_status(struct dvb_ca_en50221 *en50221, | ||||||
|  | 				     int slot, int open) | ||||||
| { | { | ||||||
| 	struct netup_ci_state *state = en50221->data; | 	struct netup_ci_state *state = en50221->data; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -45,8 +45,10 @@ | ||||||
| 
 | 
 | ||||||
| #define AUDIO_SRAM_CHANNEL	SRAM_CH07 | #define AUDIO_SRAM_CHANNEL	SRAM_CH07 | ||||||
| 
 | 
 | ||||||
| #define dprintk(level, fmt, arg...)	if (audio_debug >= level) \ | #define dprintk(level, fmt, arg...) do {				\ | ||||||
| 	printk(KERN_INFO "%s: " fmt, chip->dev->name , ## arg) | 	if (audio_debug + 1 > level)					\ | ||||||
|  | 		printk(KERN_INFO "%s: " fmt, chip->dev->name , ## arg);	\ | ||||||
|  | } while(0) | ||||||
| 
 | 
 | ||||||
| #define dprintk_core(level, fmt, arg...)	if (audio_debug >= level) \ | #define dprintk_core(level, fmt, arg...)	if (audio_debug >= level) \ | ||||||
| 	printk(KERN_DEBUG "%s: " fmt, chip->dev->name , ## arg) | 	printk(KERN_DEBUG "%s: " fmt, chip->dev->name , ## arg) | ||||||
|  |  | ||||||
|  | @ -22,6 +22,7 @@ | ||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
| #include "cx23885.h" | #include "cx23885.h" | ||||||
|  | #include "cx23885-av.h" | ||||||
| 
 | 
 | ||||||
| void cx23885_av_work_handler(struct work_struct *work) | void cx23885_av_work_handler(struct work_struct *work) | ||||||
| { | { | ||||||
|  |  | ||||||
|  | @ -1427,7 +1427,7 @@ void cx23885_ir_fini(struct cx23885_dev *dev) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int netup_jtag_io(void *device, int tms, int tdi, int read_tdo) | static int netup_jtag_io(void *device, int tms, int tdi, int read_tdo) | ||||||
| { | { | ||||||
| 	int data; | 	int data; | ||||||
| 	int tdo = 0; | 	int tdo = 0; | ||||||
|  |  | ||||||
|  | @ -303,7 +303,7 @@ static struct sram_channel cx23887_sram_channels[] = { | ||||||
| 	}, | 	}, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| void cx23885_irq_add(struct cx23885_dev *dev, u32 mask) | static void cx23885_irq_add(struct cx23885_dev *dev, u32 mask) | ||||||
| { | { | ||||||
| 	unsigned long flags; | 	unsigned long flags; | ||||||
| 	spin_lock_irqsave(&dev->pci_irqmask_lock, flags); | 	spin_lock_irqsave(&dev->pci_irqmask_lock, flags); | ||||||
|  | @ -1516,8 +1516,7 @@ int cx23885_restart_queue(struct cx23885_tsport *port, | ||||||
| 			buf = list_entry(q->queued.next, struct cx23885_buffer, | 			buf = list_entry(q->queued.next, struct cx23885_buffer, | ||||||
| 					 vb.queue); | 					 vb.queue); | ||||||
| 			if (NULL == prev) { | 			if (NULL == prev) { | ||||||
| 				list_del(&buf->vb.queue); | 				list_move_tail(&buf->vb.queue, &q->active); | ||||||
| 				list_add_tail(&buf->vb.queue, &q->active); |  | ||||||
| 				cx23885_start_dma(port, q, buf); | 				cx23885_start_dma(port, q, buf); | ||||||
| 				buf->vb.state = VIDEOBUF_ACTIVE; | 				buf->vb.state = VIDEOBUF_ACTIVE; | ||||||
| 				buf->count    = q->count++; | 				buf->count    = q->count++; | ||||||
|  | @ -1528,8 +1527,7 @@ int cx23885_restart_queue(struct cx23885_tsport *port, | ||||||
| 			} else if (prev->vb.width  == buf->vb.width  && | 			} else if (prev->vb.width  == buf->vb.width  && | ||||||
| 				   prev->vb.height == buf->vb.height && | 				   prev->vb.height == buf->vb.height && | ||||||
| 				   prev->fmt       == buf->fmt) { | 				   prev->fmt       == buf->fmt) { | ||||||
| 				list_del(&buf->vb.queue); | 				list_move_tail(&buf->vb.queue, &q->active); | ||||||
| 				list_add_tail(&buf->vb.queue, &q->active); |  | ||||||
| 				buf->vb.state = VIDEOBUF_ACTIVE; | 				buf->vb.state = VIDEOBUF_ACTIVE; | ||||||
| 				buf->count    = q->count++; | 				buf->count    = q->count++; | ||||||
| 				prev->risc.jmp[1] = cpu_to_le32(buf->risc.dma); | 				prev->risc.jmp[1] = cpu_to_le32(buf->risc.dma); | ||||||
|  |  | ||||||
|  | @ -659,7 +659,7 @@ static struct mt2063_config terratec_mt2063_config[] = { | ||||||
| 	}, | 	}, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| int netup_altera_fpga_rw(void *device, int flag, int data, int read) | static int netup_altera_fpga_rw(void *device, int flag, int data, int read) | ||||||
| { | { | ||||||
| 	struct cx23885_dev *dev = (struct cx23885_dev *)device; | 	struct cx23885_dev *dev = (struct cx23885_dev *)device; | ||||||
| 	unsigned long timeout = jiffies + msecs_to_jiffies(1); | 	unsigned long timeout = jiffies + msecs_to_jiffies(1); | ||||||
|  |  | ||||||
|  | @ -29,6 +29,7 @@ | ||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
| #include "cx23885.h" | #include "cx23885.h" | ||||||
|  | #include "cx23885-f300.h" | ||||||
| 
 | 
 | ||||||
| #define F300_DATA	GPIO_0 | #define F300_DATA	GPIO_0 | ||||||
| #define F300_RESET	GPIO_1 | #define F300_RESET	GPIO_1 | ||||||
|  |  | ||||||
|  | @ -40,6 +40,7 @@ | ||||||
| #include <media/v4l2-subdev.h> | #include <media/v4l2-subdev.h> | ||||||
| 
 | 
 | ||||||
| #include "cx23885.h" | #include "cx23885.h" | ||||||
|  | #include "cx23885-input.h" | ||||||
| 
 | 
 | ||||||
| #define MODULE_NAME "cx23885" | #define MODULE_NAME "cx23885" | ||||||
| 
 | 
 | ||||||
|  | @ -270,21 +271,21 @@ int cx23885_input_init(struct cx23885_dev *dev) | ||||||
| 	case CX23885_BOARD_HAUPPAUGE_HVR1250: | 	case CX23885_BOARD_HAUPPAUGE_HVR1250: | ||||||
| 		/* Integrated CX2388[58] IR controller */ | 		/* Integrated CX2388[58] IR controller */ | ||||||
| 		driver_type = RC_DRIVER_IR_RAW; | 		driver_type = RC_DRIVER_IR_RAW; | ||||||
| 		allowed_protos = RC_TYPE_ALL; | 		allowed_protos = RC_BIT_ALL; | ||||||
| 		/* The grey Hauppauge RC-5 remote */ | 		/* The grey Hauppauge RC-5 remote */ | ||||||
| 		rc_map = RC_MAP_HAUPPAUGE; | 		rc_map = RC_MAP_HAUPPAUGE; | ||||||
| 		break; | 		break; | ||||||
| 	case CX23885_BOARD_TERRATEC_CINERGY_T_PCIE_DUAL: | 	case CX23885_BOARD_TERRATEC_CINERGY_T_PCIE_DUAL: | ||||||
| 		/* Integrated CX23885 IR controller */ | 		/* Integrated CX23885 IR controller */ | ||||||
| 		driver_type = RC_DRIVER_IR_RAW; | 		driver_type = RC_DRIVER_IR_RAW; | ||||||
| 		allowed_protos = RC_TYPE_NEC; | 		allowed_protos = RC_BIT_NEC; | ||||||
| 		/* The grey Terratec remote with orange buttons */ | 		/* The grey Terratec remote with orange buttons */ | ||||||
| 		rc_map = RC_MAP_NEC_TERRATEC_CINERGY_XS; | 		rc_map = RC_MAP_NEC_TERRATEC_CINERGY_XS; | ||||||
| 		break; | 		break; | ||||||
| 	case CX23885_BOARD_TEVII_S470: | 	case CX23885_BOARD_TEVII_S470: | ||||||
| 		/* Integrated CX23885 IR controller */ | 		/* Integrated CX23885 IR controller */ | ||||||
| 		driver_type = RC_DRIVER_IR_RAW; | 		driver_type = RC_DRIVER_IR_RAW; | ||||||
| 		allowed_protos = RC_TYPE_ALL; | 		allowed_protos = RC_BIT_ALL; | ||||||
| 		/* A guess at the remote */ | 		/* A guess at the remote */ | ||||||
| 		rc_map = RC_MAP_TEVII_NEC; | 		rc_map = RC_MAP_TEVII_NEC; | ||||||
| 		break; | 		break; | ||||||
|  |  | ||||||
|  | @ -23,7 +23,7 @@ | ||||||
| 
 | 
 | ||||||
| #ifndef _CX23885_INPUT_H_ | #ifndef _CX23885_INPUT_H_ | ||||||
| #define _CX23885_INPUT_H_ | #define _CX23885_INPUT_H_ | ||||||
| int cx23885_input_rx_work_handler(struct cx23885_dev *dev, u32 events); | void cx23885_input_rx_work_handler(struct cx23885_dev *dev, u32 events); | ||||||
| 
 | 
 | ||||||
| int cx23885_input_init(struct cx23885_dev *dev); | int cx23885_input_init(struct cx23885_dev *dev); | ||||||
| void cx23885_input_fini(struct cx23885_dev *dev); | void cx23885_input_fini(struct cx23885_dev *dev); | ||||||
|  |  | ||||||
|  | @ -22,6 +22,8 @@ | ||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
| #include "cx23885.h" | #include "cx23885.h" | ||||||
|  | #include "cx23885-ioctl.h" | ||||||
|  | 
 | ||||||
| #include <media/v4l2-chip-ident.h> | #include <media/v4l2-chip-ident.h> | ||||||
| 
 | 
 | ||||||
| int cx23885_g_chip_ident(struct file *file, void *fh, | int cx23885_g_chip_ident(struct file *file, void *fh, | ||||||
|  |  | ||||||
|  | @ -24,6 +24,7 @@ | ||||||
| #include <media/v4l2-device.h> | #include <media/v4l2-device.h> | ||||||
| 
 | 
 | ||||||
| #include "cx23885.h" | #include "cx23885.h" | ||||||
|  | #include "cx23885-ir.h" | ||||||
| #include "cx23885-input.h" | #include "cx23885-input.h" | ||||||
| 
 | 
 | ||||||
| #define CX23885_IR_RX_FIFO_SERVICE_REQ		0 | #define CX23885_IR_RX_FIFO_SERVICE_REQ		0 | ||||||
|  |  | ||||||
|  | @ -29,6 +29,7 @@ | ||||||
| #include <media/rc-core.h> | #include <media/rc-core.h> | ||||||
| 
 | 
 | ||||||
| #include "cx23885.h" | #include "cx23885.h" | ||||||
|  | #include "cx23888-ir.h" | ||||||
| 
 | 
 | ||||||
| static unsigned int ir_888_debug; | static unsigned int ir_888_debug; | ||||||
| module_param(ir_888_debug, int, 0644); | module_param(ir_888_debug, int, 0644); | ||||||
|  |  | ||||||
|  | @ -24,6 +24,7 @@ | ||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
| #include "cx23885.h" | #include "cx23885.h" | ||||||
|  | #include "netup-init.h" | ||||||
| 
 | 
 | ||||||
| static void i2c_av_write(struct i2c_adapter *i2c, u16 reg, u8 val) | static void i2c_av_write(struct i2c_adapter *i2c, u16 reg, u8 val) | ||||||
| { | { | ||||||
|  |  | ||||||
|  | @ -44,7 +44,7 @@ MODULE_LICENSE("GPL"); | ||||||
| static int _intr_msk = FLD_AUD_SRC_RISCI1 | FLD_AUD_SRC_OF | | static int _intr_msk = FLD_AUD_SRC_RISCI1 | FLD_AUD_SRC_OF | | ||||||
| 			FLD_AUD_SRC_SYNC | FLD_AUD_SRC_OPC_ERR; | 			FLD_AUD_SRC_SYNC | FLD_AUD_SRC_OPC_ERR; | ||||||
| 
 | 
 | ||||||
| int cx25821_sram_channel_setup_upstream_audio(struct cx25821_dev *dev, | static int cx25821_sram_channel_setup_upstream_audio(struct cx25821_dev *dev, | ||||||
| 					      struct sram_channel *ch, | 					      struct sram_channel *ch, | ||||||
| 					      unsigned int bpl, u32 risc) | 					      unsigned int bpl, u32 risc) | ||||||
| { | { | ||||||
|  | @ -133,7 +133,7 @@ static __le32 *cx25821_risc_field_upstream_audio(struct cx25821_dev *dev, | ||||||
| 	return rp; | 	return rp; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int cx25821_risc_buffer_upstream_audio(struct cx25821_dev *dev, | static int cx25821_risc_buffer_upstream_audio(struct cx25821_dev *dev, | ||||||
| 				       struct pci_dev *pci, | 				       struct pci_dev *pci, | ||||||
| 				       unsigned int bpl, unsigned int lines) | 				       unsigned int bpl, unsigned int lines) | ||||||
| { | { | ||||||
|  | @ -197,7 +197,7 @@ int cx25821_risc_buffer_upstream_audio(struct cx25821_dev *dev, | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void cx25821_free_memory_audio(struct cx25821_dev *dev) | static void cx25821_free_memory_audio(struct cx25821_dev *dev) | ||||||
| { | { | ||||||
| 	if (dev->_risc_virt_addr) { | 	if (dev->_risc_virt_addr) { | ||||||
| 		pci_free_consistent(dev->pci, dev->_audiorisc_size, | 		pci_free_consistent(dev->pci, dev->_audiorisc_size, | ||||||
|  | @ -256,7 +256,7 @@ void cx25821_free_mem_upstream_audio(struct cx25821_dev *dev) | ||||||
| 	cx25821_free_memory_audio(dev); | 	cx25821_free_memory_audio(dev); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int cx25821_get_audio_data(struct cx25821_dev *dev, | static int cx25821_get_audio_data(struct cx25821_dev *dev, | ||||||
| 			   struct sram_channel *sram_ch) | 			   struct sram_channel *sram_ch) | ||||||
| { | { | ||||||
| 	struct file *myfile; | 	struct file *myfile; | ||||||
|  | @ -351,7 +351,7 @@ static void cx25821_audioups_handler(struct work_struct *work) | ||||||
| 			sram_channels); | 			sram_channels); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int cx25821_openfile_audio(struct cx25821_dev *dev, | static int cx25821_openfile_audio(struct cx25821_dev *dev, | ||||||
| 			   struct sram_channel *sram_ch) | 			   struct sram_channel *sram_ch) | ||||||
| { | { | ||||||
| 	struct file *myfile; | 	struct file *myfile; | ||||||
|  | @ -490,7 +490,7 @@ error: | ||||||
| 	return ret; | 	return ret; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int cx25821_audio_upstream_irq(struct cx25821_dev *dev, int chan_num, | static int cx25821_audio_upstream_irq(struct cx25821_dev *dev, int chan_num, | ||||||
| 			       u32 status) | 			       u32 status) | ||||||
| { | { | ||||||
| 	int i = 0; | 	int i = 0; | ||||||
|  | @ -634,7 +634,7 @@ static void cx25821_wait_fifo_enable(struct cx25821_dev *dev, | ||||||
| 
 | 
 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int cx25821_start_audio_dma_upstream(struct cx25821_dev *dev, | static int cx25821_start_audio_dma_upstream(struct cx25821_dev *dev, | ||||||
| 					    struct sram_channel *sram_ch) | 					    struct sram_channel *sram_ch) | ||||||
| { | { | ||||||
| 	u32 tmp = 0; | 	u32 tmp = 0; | ||||||
|  | @ -700,9 +700,7 @@ fail_irq: | ||||||
| int cx25821_audio_upstream_init(struct cx25821_dev *dev, int channel_select) | int cx25821_audio_upstream_init(struct cx25821_dev *dev, int channel_select) | ||||||
| { | { | ||||||
| 	struct sram_channel *sram_ch; | 	struct sram_channel *sram_ch; | ||||||
| 	int retval = 0; |  | ||||||
| 	int err = 0; | 	int err = 0; | ||||||
| 	int str_length = 0; |  | ||||||
| 
 | 
 | ||||||
| 	if (dev->_audio_is_running) { | 	if (dev->_audio_is_running) { | ||||||
| 		pr_warn("Audio Channel is still running so return!\n"); | 		pr_warn("Audio Channel is still running so return!\n"); | ||||||
|  | @ -731,26 +729,28 @@ int cx25821_audio_upstream_init(struct cx25821_dev *dev, int channel_select) | ||||||
| 	_line_size = AUDIO_LINE_SIZE; | 	_line_size = AUDIO_LINE_SIZE; | ||||||
| 
 | 
 | ||||||
| 	if (dev->input_audiofilename) { | 	if (dev->input_audiofilename) { | ||||||
| 		str_length = strlen(dev->input_audiofilename); | 		dev->_audiofilename = kstrdup(dev->input_audiofilename, | ||||||
| 		dev->_audiofilename = kmemdup(dev->input_audiofilename, | 					      GFP_KERNEL); | ||||||
| 					      str_length + 1, GFP_KERNEL); |  | ||||||
| 
 | 
 | ||||||
| 		if (!dev->_audiofilename) | 		if (!dev->_audiofilename) { | ||||||
|  | 			err = -ENOMEM; | ||||||
| 			goto error; | 			goto error; | ||||||
|  | 		} | ||||||
| 
 | 
 | ||||||
| 		/* Default if filename is empty string */ | 		/* Default if filename is empty string */ | ||||||
| 		if (strcmp(dev->input_audiofilename, "") == 0) | 		if (strcmp(dev->input_audiofilename, "") == 0) | ||||||
| 			dev->_audiofilename = "/root/audioGOOD.wav"; | 			dev->_audiofilename = "/root/audioGOOD.wav"; | ||||||
| 	} else { | 	} else { | ||||||
| 		str_length = strlen(_defaultAudioName); | 		dev->_audiofilename = kstrdup(_defaultAudioName, | ||||||
| 		dev->_audiofilename = kmemdup(_defaultAudioName, | 					      GFP_KERNEL); | ||||||
| 					      str_length + 1, GFP_KERNEL); |  | ||||||
| 
 | 
 | ||||||
| 		if (!dev->_audiofilename) | 		if (!dev->_audiofilename) { | ||||||
|  | 			err = -ENOMEM; | ||||||
| 			goto error; | 			goto error; | ||||||
| 		} | 		} | ||||||
|  | 	} | ||||||
| 
 | 
 | ||||||
| 	retval = cx25821_sram_channel_setup_upstream_audio(dev, sram_ch, | 	cx25821_sram_channel_setup_upstream_audio(dev, sram_ch, | ||||||
| 						  _line_size, 0); | 						  _line_size, 0); | ||||||
| 
 | 
 | ||||||
| 	dev->audio_upstream_riscbuf_size = | 	dev->audio_upstream_riscbuf_size = | ||||||
|  | @ -759,9 +759,9 @@ int cx25821_audio_upstream_init(struct cx25821_dev *dev, int channel_select) | ||||||
| 	dev->audio_upstream_databuf_size = AUDIO_DATA_BUF_SZ * NUM_AUDIO_PROGS; | 	dev->audio_upstream_databuf_size = AUDIO_DATA_BUF_SZ * NUM_AUDIO_PROGS; | ||||||
| 
 | 
 | ||||||
| 	/* Allocating buffers and prepare RISC program */ | 	/* Allocating buffers and prepare RISC program */ | ||||||
| 	retval = cx25821_audio_upstream_buffer_prepare(dev, sram_ch, | 	err = cx25821_audio_upstream_buffer_prepare(dev, sram_ch, | ||||||
| 							_line_size); | 							_line_size); | ||||||
| 	if (retval < 0) { | 	if (err < 0) { | ||||||
| 		pr_err("%s: Failed to set up Audio upstream buffers!\n", | 		pr_err("%s: Failed to set up Audio upstream buffers!\n", | ||||||
| 			dev->name); | 			dev->name); | ||||||
| 		goto error; | 		goto error; | ||||||
|  |  | ||||||
|  | @ -25,17 +25,17 @@ | ||||||
| 
 | 
 | ||||||
| #define SetBit(Bit)  (1 << Bit) | #define SetBit(Bit)  (1 << Bit) | ||||||
| 
 | 
 | ||||||
| inline u8 getBit(u32 sample, u8 index) | static inline u8 getBit(u32 sample, u8 index) | ||||||
| { | { | ||||||
| 	return (u8) ((sample >> index) & 1); | 	return (u8) ((sample >> index) & 1); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| inline u32 clearBitAtPos(u32 value, u8 bit) | static inline u32 clearBitAtPos(u32 value, u8 bit) | ||||||
| { | { | ||||||
| 	return value & ~(1 << bit); | 	return value & ~(1 << bit); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| inline u32 setBitAtPos(u32 sample, u8 bit) | static inline u32 setBitAtPos(u32 sample, u8 bit) | ||||||
| { | { | ||||||
| 	sample |= (1 << bit); | 	sample |= (1 << bit); | ||||||
| 	return sample; | 	return sample; | ||||||
|  |  | ||||||
|  | @ -329,7 +329,8 @@ int cx25821_i2c_unregister(struct cx25821_i2c *bus) | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void cx25821_av_clk(struct cx25821_dev *dev, int enable) | #if 0 /* Currently unused */
 | ||||||
|  | static void cx25821_av_clk(struct cx25821_dev *dev, int enable) | ||||||
| { | { | ||||||
| 	/* write 0 to bus 2 addr 0x144 via i2x_xfer() */ | 	/* write 0 to bus 2 addr 0x144 via i2x_xfer() */ | ||||||
| 	char buffer[3]; | 	char buffer[3]; | ||||||
|  | @ -351,6 +352,7 @@ void cx25821_av_clk(struct cx25821_dev *dev, int enable) | ||||||
| 
 | 
 | ||||||
| 	i2c_xfer(&dev->i2c_bus[0].i2c_adap, &msg, 1); | 	i2c_xfer(&dev->i2c_bus[0].i2c_adap, &msg, 1); | ||||||
| } | } | ||||||
|  | #endif | ||||||
| 
 | 
 | ||||||
| int cx25821_i2c_read(struct cx25821_i2c *bus, u16 reg_addr, int *value) | int cx25821_i2c_read(struct cx25821_i2c *bus, u16 reg_addr, int *value) | ||||||
| { | { | ||||||
|  |  | ||||||
|  | @ -123,9 +123,10 @@ static __le32 *cx25821_risc_field_upstream_ch2(struct cx25821_dev *dev, | ||||||
| 	return rp; | 	return rp; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int cx25821_risc_buffer_upstream_ch2(struct cx25821_dev *dev, | static int cx25821_risc_buffer_upstream_ch2(struct cx25821_dev *dev, | ||||||
| 					    struct pci_dev *pci, | 					    struct pci_dev *pci, | ||||||
| 				     unsigned int top_offset, unsigned int bpl, | 					    unsigned int top_offset, | ||||||
|  | 					    unsigned int bpl, | ||||||
| 					    unsigned int lines) | 					    unsigned int lines) | ||||||
| { | { | ||||||
| 	__le32 *rp; | 	__le32 *rp; | ||||||
|  | @ -255,7 +256,8 @@ void cx25821_free_mem_upstream_ch2(struct cx25821_dev *dev) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int cx25821_get_frame_ch2(struct cx25821_dev *dev, struct sram_channel *sram_ch) | static int cx25821_get_frame_ch2(struct cx25821_dev *dev, | ||||||
|  | 				 struct sram_channel *sram_ch) | ||||||
| { | { | ||||||
| 	struct file *myfile; | 	struct file *myfile; | ||||||
| 	int frame_index_temp = dev->_frame_index_ch2; | 	int frame_index_temp = dev->_frame_index_ch2; | ||||||
|  | @ -360,7 +362,8 @@ static void cx25821_vidups_handler_ch2(struct work_struct *work) | ||||||
| 			_channel2_upstream_select].sram_channels); | 			_channel2_upstream_select].sram_channels); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int cx25821_openfile_ch2(struct cx25821_dev *dev, struct sram_channel *sram_ch) | static int cx25821_openfile_ch2(struct cx25821_dev *dev, | ||||||
|  | 				struct sram_channel *sram_ch) | ||||||
| { | { | ||||||
| 	struct file *myfile; | 	struct file *myfile; | ||||||
| 	int i = 0, j = 0; | 	int i = 0, j = 0; | ||||||
|  | @ -507,7 +510,8 @@ error: | ||||||
| 	return ret; | 	return ret; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int cx25821_video_upstream_irq_ch2(struct cx25821_dev *dev, int chan_num, | static int cx25821_video_upstream_irq_ch2(struct cx25821_dev *dev, | ||||||
|  | 					  int chan_num, | ||||||
| 					  u32 status) | 					  u32 status) | ||||||
| { | { | ||||||
| 	u32 int_msk_tmp; | 	u32 int_msk_tmp; | ||||||
|  | @ -647,7 +651,7 @@ static void cx25821_set_pixelengine_ch2(struct cx25821_dev *dev, | ||||||
| 	cx_write(ch->vid_cdt_size, VID_CDT_SIZE >> 3); | 	cx_write(ch->vid_cdt_size, VID_CDT_SIZE >> 3); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int cx25821_start_video_dma_upstream_ch2(struct cx25821_dev *dev, | static int cx25821_start_video_dma_upstream_ch2(struct cx25821_dev *dev, | ||||||
| 						struct sram_channel *sram_ch) | 						struct sram_channel *sram_ch) | ||||||
| { | { | ||||||
| 	u32 tmp = 0; | 	u32 tmp = 0; | ||||||
|  | @ -704,11 +708,9 @@ int cx25821_vidupstream_init_ch2(struct cx25821_dev *dev, int channel_select, | ||||||
| { | { | ||||||
| 	struct sram_channel *sram_ch; | 	struct sram_channel *sram_ch; | ||||||
| 	u32 tmp; | 	u32 tmp; | ||||||
| 	int retval = 0; |  | ||||||
| 	int err = 0; | 	int err = 0; | ||||||
| 	int data_frame_size = 0; | 	int data_frame_size = 0; | ||||||
| 	int risc_buffer_size = 0; | 	int risc_buffer_size = 0; | ||||||
| 	int str_length = 0; |  | ||||||
| 
 | 
 | ||||||
| 	if (dev->_is_running_ch2) { | 	if (dev->_is_running_ch2) { | ||||||
| 		pr_info("Video Channel is still running so return!\n"); | 		pr_info("Video Channel is still running so return!\n"); | ||||||
|  | @ -744,19 +746,15 @@ int cx25821_vidupstream_init_ch2(struct cx25821_dev *dev, int channel_select, | ||||||
| 	risc_buffer_size = dev->_isNTSC_ch2 ? | 	risc_buffer_size = dev->_isNTSC_ch2 ? | ||||||
| 		NTSC_RISC_BUF_SIZE : PAL_RISC_BUF_SIZE; | 		NTSC_RISC_BUF_SIZE : PAL_RISC_BUF_SIZE; | ||||||
| 
 | 
 | ||||||
| 	if (dev->input_filename_ch2) { | 	if (dev->input_filename_ch2) | ||||||
| 		str_length = strlen(dev->input_filename_ch2); | 		dev->_filename_ch2 = kstrdup(dev->input_filename_ch2, | ||||||
| 		dev->_filename_ch2 = kmemdup(dev->input_filename_ch2, | 								GFP_KERNEL); | ||||||
| 					     str_length + 1, GFP_KERNEL); | 	else | ||||||
|  | 		dev->_filename_ch2 = kstrdup(dev->_defaultname_ch2, | ||||||
|  | 								GFP_KERNEL); | ||||||
| 
 | 
 | ||||||
| 		if (!dev->_filename_ch2) | 	if (!dev->_filename_ch2) { | ||||||
| 			goto error; | 		err = -ENOENT; | ||||||
| 	} else { |  | ||||||
| 		str_length = strlen(dev->_defaultname_ch2); |  | ||||||
| 		dev->_filename_ch2 = kmemdup(dev->_defaultname_ch2, |  | ||||||
| 					     str_length + 1, GFP_KERNEL); |  | ||||||
| 
 |  | ||||||
| 		if (!dev->_filename_ch2) |  | ||||||
| 		goto error; | 		goto error; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | @ -773,7 +771,7 @@ int cx25821_vidupstream_init_ch2(struct cx25821_dev *dev, int channel_select, | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	retval = cx25821_sram_channel_setup_upstream(dev, sram_ch, | 	err = cx25821_sram_channel_setup_upstream(dev, sram_ch, | ||||||
| 						dev->_line_size_ch2, 0); | 						dev->_line_size_ch2, 0); | ||||||
| 
 | 
 | ||||||
| 	/* setup fifo + format */ | 	/* setup fifo + format */ | ||||||
|  | @ -783,9 +781,9 @@ int cx25821_vidupstream_init_ch2(struct cx25821_dev *dev, int channel_select, | ||||||
| 	dev->upstream_databuf_size_ch2 = data_frame_size * 2; | 	dev->upstream_databuf_size_ch2 = data_frame_size * 2; | ||||||
| 
 | 
 | ||||||
| 	/* Allocating buffers and prepare RISC program */ | 	/* Allocating buffers and prepare RISC program */ | ||||||
| 	retval = cx25821_upstream_buffer_prepare_ch2(dev, sram_ch, | 	err = cx25821_upstream_buffer_prepare_ch2(dev, sram_ch, | ||||||
| 						dev->_line_size_ch2); | 						dev->_line_size_ch2); | ||||||
| 	if (retval < 0) { | 	if (err < 0) { | ||||||
| 		pr_err("%s: Failed to set up Video upstream buffers!\n", | 		pr_err("%s: Failed to set up Video upstream buffers!\n", | ||||||
| 		       dev->name); | 		       dev->name); | ||||||
| 		goto error; | 		goto error; | ||||||
|  |  | ||||||
|  | @ -173,7 +173,7 @@ static __le32 *cx25821_risc_field_upstream(struct cx25821_dev *dev, __le32 * rp, | ||||||
| 	return rp; | 	return rp; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int cx25821_risc_buffer_upstream(struct cx25821_dev *dev, | static int cx25821_risc_buffer_upstream(struct cx25821_dev *dev, | ||||||
| 					struct pci_dev *pci, | 					struct pci_dev *pci, | ||||||
| 					unsigned int top_offset, | 					unsigned int top_offset, | ||||||
| 					unsigned int bpl, unsigned int lines) | 					unsigned int bpl, unsigned int lines) | ||||||
|  | @ -300,7 +300,8 @@ void cx25821_free_mem_upstream_ch1(struct cx25821_dev *dev) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int cx25821_get_frame(struct cx25821_dev *dev, struct sram_channel *sram_ch) | static int cx25821_get_frame(struct cx25821_dev *dev, | ||||||
|  | 			     struct sram_channel *sram_ch) | ||||||
| { | { | ||||||
| 	struct file *myfile; | 	struct file *myfile; | ||||||
| 	int frame_index_temp = dev->_frame_index; | 	int frame_index_temp = dev->_frame_index; | ||||||
|  | @ -405,7 +406,8 @@ static void cx25821_vidups_handler(struct work_struct *work) | ||||||
| 			sram_channels); | 			sram_channels); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int cx25821_openfile(struct cx25821_dev *dev, struct sram_channel *sram_ch) | static int cx25821_openfile(struct cx25821_dev *dev, | ||||||
|  | 			    struct sram_channel *sram_ch) | ||||||
| { | { | ||||||
| 	struct file *myfile; | 	struct file *myfile; | ||||||
| 	int i = 0, j = 0; | 	int i = 0, j = 0; | ||||||
|  | @ -486,8 +488,9 @@ int cx25821_openfile(struct cx25821_dev *dev, struct sram_channel *sram_ch) | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int cx25821_upstream_buffer_prepare(struct cx25821_dev *dev, | static int cx25821_upstream_buffer_prepare(struct cx25821_dev *dev, | ||||||
| 				    struct sram_channel *sram_ch, int bpl) | 					   struct sram_channel *sram_ch, | ||||||
|  | 					   int bpl) | ||||||
| { | { | ||||||
| 	int ret = 0; | 	int ret = 0; | ||||||
| 	dma_addr_t dma_addr; | 	dma_addr_t dma_addr; | ||||||
|  | @ -548,7 +551,7 @@ error: | ||||||
| 	return ret; | 	return ret; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int cx25821_video_upstream_irq(struct cx25821_dev *dev, int chan_num, | static int cx25821_video_upstream_irq(struct cx25821_dev *dev, int chan_num, | ||||||
| 				      u32 status) | 				      u32 status) | ||||||
| { | { | ||||||
| 	u32 int_msk_tmp; | 	u32 int_msk_tmp; | ||||||
|  | @ -664,7 +667,8 @@ static irqreturn_t cx25821_upstream_irq(int irq, void *dev_id) | ||||||
| 	return IRQ_RETVAL(handled); | 	return IRQ_RETVAL(handled); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void cx25821_set_pixelengine(struct cx25821_dev *dev, struct sram_channel *ch, | static void cx25821_set_pixelengine(struct cx25821_dev *dev, | ||||||
|  | 				    struct sram_channel *ch, | ||||||
| 				    int pix_format) | 				    int pix_format) | ||||||
| { | { | ||||||
| 	int width = WIDTH_D1; | 	int width = WIDTH_D1; | ||||||
|  | @ -696,7 +700,7 @@ void cx25821_set_pixelengine(struct cx25821_dev *dev, struct sram_channel *ch, | ||||||
| 	cx_write(ch->vid_cdt_size, VID_CDT_SIZE >> 3); | 	cx_write(ch->vid_cdt_size, VID_CDT_SIZE >> 3); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int cx25821_start_video_dma_upstream(struct cx25821_dev *dev, | static int cx25821_start_video_dma_upstream(struct cx25821_dev *dev, | ||||||
| 					    struct sram_channel *sram_ch) | 					    struct sram_channel *sram_ch) | ||||||
| { | { | ||||||
| 	u32 tmp = 0; | 	u32 tmp = 0; | ||||||
|  | @ -753,7 +757,6 @@ int cx25821_vidupstream_init_ch1(struct cx25821_dev *dev, int channel_select, | ||||||
| { | { | ||||||
| 	struct sram_channel *sram_ch; | 	struct sram_channel *sram_ch; | ||||||
| 	u32 tmp; | 	u32 tmp; | ||||||
| 	int retval = 0; |  | ||||||
| 	int err = 0; | 	int err = 0; | ||||||
| 	int data_frame_size = 0; | 	int data_frame_size = 0; | ||||||
| 	int risc_buffer_size = 0; | 	int risc_buffer_size = 0; | ||||||
|  | @ -796,16 +799,20 @@ int cx25821_vidupstream_init_ch1(struct cx25821_dev *dev, int channel_select, | ||||||
| 		dev->_filename = kmemdup(dev->input_filename, str_length + 1, | 		dev->_filename = kmemdup(dev->input_filename, str_length + 1, | ||||||
| 					 GFP_KERNEL); | 					 GFP_KERNEL); | ||||||
| 
 | 
 | ||||||
| 		if (!dev->_filename) | 		if (!dev->_filename) { | ||||||
|  | 			err = -ENOENT; | ||||||
| 			goto error; | 			goto error; | ||||||
|  | 		} | ||||||
| 	} else { | 	} else { | ||||||
| 		str_length = strlen(dev->_defaultname); | 		str_length = strlen(dev->_defaultname); | ||||||
| 		dev->_filename = kmemdup(dev->_defaultname, str_length + 1, | 		dev->_filename = kmemdup(dev->_defaultname, str_length + 1, | ||||||
| 					 GFP_KERNEL); | 					 GFP_KERNEL); | ||||||
| 
 | 
 | ||||||
| 		if (!dev->_filename) | 		if (!dev->_filename) { | ||||||
|  | 			err = -ENOENT; | ||||||
| 			goto error; | 			goto error; | ||||||
| 		} | 		} | ||||||
|  | 	} | ||||||
| 
 | 
 | ||||||
| 	/* Default if filename is empty string */ | 	/* Default if filename is empty string */ | ||||||
| 	if (strcmp(dev->_filename, "") == 0) { | 	if (strcmp(dev->_filename, "") == 0) { | ||||||
|  | @ -828,7 +835,7 @@ int cx25821_vidupstream_init_ch1(struct cx25821_dev *dev, int channel_select, | ||||||
| 	dev->_line_size = (dev->_pixel_format == PIXEL_FRMT_422) ? | 	dev->_line_size = (dev->_pixel_format == PIXEL_FRMT_422) ? | ||||||
| 		(WIDTH_D1 * 2) : (WIDTH_D1 * 3) / 2; | 		(WIDTH_D1 * 2) : (WIDTH_D1 * 3) / 2; | ||||||
| 
 | 
 | ||||||
| 	retval = cx25821_sram_channel_setup_upstream(dev, sram_ch, | 	err = cx25821_sram_channel_setup_upstream(dev, sram_ch, | ||||||
| 			dev->_line_size, 0); | 			dev->_line_size, 0); | ||||||
| 
 | 
 | ||||||
| 	/* setup fifo + format */ | 	/* setup fifo + format */ | ||||||
|  | @ -838,8 +845,8 @@ int cx25821_vidupstream_init_ch1(struct cx25821_dev *dev, int channel_select, | ||||||
| 	dev->upstream_databuf_size = data_frame_size * 2; | 	dev->upstream_databuf_size = data_frame_size * 2; | ||||||
| 
 | 
 | ||||||
| 	/* Allocating buffers and prepare RISC program */ | 	/* Allocating buffers and prepare RISC program */ | ||||||
| 	retval = cx25821_upstream_buffer_prepare(dev, sram_ch, dev->_line_size); | 	err = cx25821_upstream_buffer_prepare(dev, sram_ch, dev->_line_size); | ||||||
| 	if (retval < 0) { | 	if (err < 0) { | ||||||
| 		pr_err("%s: Failed to set up Video upstream buffers!\n", | 		pr_err("%s: Failed to set up Video upstream buffers!\n", | ||||||
| 		       dev->name); | 		       dev->name); | ||||||
| 		goto error; | 		goto error; | ||||||
|  |  | ||||||
|  | @ -291,7 +291,7 @@ int cx25821_start_video_dma(struct cx25821_dev *dev, | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int cx25821_restart_video_queue(struct cx25821_dev *dev, | static int cx25821_restart_video_queue(struct cx25821_dev *dev, | ||||||
| 				       struct cx25821_dmaqueue *q, | 				       struct cx25821_dmaqueue *q, | ||||||
| 				       struct sram_channel *channel) | 				       struct sram_channel *channel) | ||||||
| { | { | ||||||
|  | @ -342,7 +342,7 @@ int cx25821_restart_video_queue(struct cx25821_dev *dev, | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void cx25821_vid_timeout(unsigned long data) | static void cx25821_vid_timeout(unsigned long data) | ||||||
| { | { | ||||||
| 	struct cx25821_data *timeout_data = (struct cx25821_data *)data; | 	struct cx25821_data *timeout_data = (struct cx25821_data *)data; | ||||||
| 	struct cx25821_dev *dev = timeout_data->dev; | 	struct cx25821_dev *dev = timeout_data->dev; | ||||||
|  |  | ||||||
|  | @ -45,11 +45,15 @@ | ||||||
| #include "cx88.h" | #include "cx88.h" | ||||||
| #include "cx88-reg.h" | #include "cx88-reg.h" | ||||||
| 
 | 
 | ||||||
| #define dprintk(level,fmt, arg...)	if (debug >= level) \ | #define dprintk(level, fmt, arg...) do {				\ | ||||||
| 	printk(KERN_INFO "%s/1: " fmt, chip->core->name , ## arg) | 	if (debug + 1 > level)						\ | ||||||
|  | 		printk(KERN_INFO "%s/1: " fmt, chip->core->name , ## arg);\ | ||||||
|  | } while(0) | ||||||
| 
 | 
 | ||||||
| #define dprintk_core(level,fmt, arg...)	if (debug >= level) \ | #define dprintk_core(level, fmt, arg...) do {				\ | ||||||
| 	printk(KERN_DEBUG "%s/1: " fmt, chip->core->name , ## arg) | 	if (debug + 1 > level)						\ | ||||||
|  | 		printk(KERN_DEBUG "%s/1: " fmt, chip->core->name , ## arg);\ | ||||||
|  | } while(0) | ||||||
| 
 | 
 | ||||||
| /****************************************************************************
 | /****************************************************************************
 | ||||||
| 	Data type declarations - Can be moded to a header file later | 	Data type declarations - Can be moded to a header file later | ||||||
|  |  | ||||||
|  | @ -53,9 +53,10 @@ static unsigned int debug; | ||||||
| module_param(debug,int,0644); | module_param(debug,int,0644); | ||||||
| MODULE_PARM_DESC(debug,"enable debug messages [blackbird]"); | MODULE_PARM_DESC(debug,"enable debug messages [blackbird]"); | ||||||
| 
 | 
 | ||||||
| #define dprintk(level,fmt, arg...)	if (debug >= level) \ | #define dprintk(level, fmt, arg...) do {				      \ | ||||||
| 	printk(KERN_DEBUG "%s/2-bb: " fmt, dev->core->name , ## arg) | 	if (debug + 1 > level)						      \ | ||||||
| 
 | 		printk(KERN_DEBUG "%s/2-bb: " fmt, dev->core->name , ## arg); \ | ||||||
|  | } while(0) | ||||||
| 
 | 
 | ||||||
| /* ------------------------------------------------------------------ */ | /* ------------------------------------------------------------------ */ | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -646,22 +646,22 @@ int cx88_reset(struct cx88_core *core) | ||||||
| 
 | 
 | ||||||
| /* ------------------------------------------------------------------ */ | /* ------------------------------------------------------------------ */ | ||||||
| 
 | 
 | ||||||
| static unsigned int inline norm_swidth(v4l2_std_id norm) | static inline unsigned int norm_swidth(v4l2_std_id norm) | ||||||
| { | { | ||||||
| 	return (norm & (V4L2_STD_MN & ~V4L2_STD_PAL_Nc)) ? 754 : 922; | 	return (norm & (V4L2_STD_MN & ~V4L2_STD_PAL_Nc)) ? 754 : 922; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static unsigned int inline norm_hdelay(v4l2_std_id norm) | static inline unsigned int norm_hdelay(v4l2_std_id norm) | ||||||
| { | { | ||||||
| 	return (norm & (V4L2_STD_MN & ~V4L2_STD_PAL_Nc)) ? 135 : 186; | 	return (norm & (V4L2_STD_MN & ~V4L2_STD_PAL_Nc)) ? 135 : 186; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static unsigned int inline norm_vdelay(v4l2_std_id norm) | static inline unsigned int norm_vdelay(v4l2_std_id norm) | ||||||
| { | { | ||||||
| 	return (norm & V4L2_STD_625_50) ? 0x24 : 0x18; | 	return (norm & V4L2_STD_625_50) ? 0x24 : 0x18; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static unsigned int inline norm_fsc8(v4l2_std_id norm) | static inline unsigned int norm_fsc8(v4l2_std_id norm) | ||||||
| { | { | ||||||
| 	if (norm & V4L2_STD_PAL_M) | 	if (norm & V4L2_STD_PAL_M) | ||||||
| 		return 28604892;      // 3.575611 MHz
 | 		return 28604892;      // 3.575611 MHz
 | ||||||
|  | @ -681,7 +681,7 @@ static unsigned int inline norm_fsc8(v4l2_std_id norm) | ||||||
| 	return 35468950;      // 4.43361875 MHz +/- 5 Hz
 | 	return 35468950;      // 4.43361875 MHz +/- 5 Hz
 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static unsigned int inline norm_htotal(v4l2_std_id norm) | static inline unsigned int norm_htotal(v4l2_std_id norm) | ||||||
| { | { | ||||||
| 
 | 
 | ||||||
| 	unsigned int fsc4=norm_fsc8(norm)/2; | 	unsigned int fsc4=norm_fsc8(norm)/2; | ||||||
|  | @ -692,7 +692,7 @@ static unsigned int inline norm_htotal(v4l2_std_id norm) | ||||||
| 				((fsc4+262)/525*1001+15000)/30000; | 				((fsc4+262)/525*1001+15000)/30000; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static unsigned int inline norm_vbipack(v4l2_std_id norm) | static inline unsigned int norm_vbipack(v4l2_std_id norm) | ||||||
| { | { | ||||||
| 	return (norm & V4L2_STD_625_50) ? 511 : 400; | 	return (norm & V4L2_STD_625_50) ? 511 : 400; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -248,7 +248,7 @@ int cx88_ir_init(struct cx88_core *core, struct pci_dev *pci) | ||||||
| 	struct cx88_IR *ir; | 	struct cx88_IR *ir; | ||||||
| 	struct rc_dev *dev; | 	struct rc_dev *dev; | ||||||
| 	char *ir_codes = NULL; | 	char *ir_codes = NULL; | ||||||
| 	u64 rc_type = RC_TYPE_OTHER; | 	u64 rc_type = RC_BIT_OTHER; | ||||||
| 	int err = -ENOMEM; | 	int err = -ENOMEM; | ||||||
| 	u32 hardware_mask = 0;	/* For devices with a hardware mask, when
 | 	u32 hardware_mask = 0;	/* For devices with a hardware mask, when
 | ||||||
| 				 * used with a full-code IR table | 				 * used with a full-code IR table | ||||||
|  | @ -416,7 +416,7 @@ int cx88_ir_init(struct cx88_core *core, struct pci_dev *pci) | ||||||
| 		break; | 		break; | ||||||
| 	case CX88_BOARD_TWINHAN_VP1027_DVBS: | 	case CX88_BOARD_TWINHAN_VP1027_DVBS: | ||||||
| 		ir_codes         = RC_MAP_TWINHAN_VP1027_DVBS; | 		ir_codes         = RC_MAP_TWINHAN_VP1027_DVBS; | ||||||
| 		rc_type          = RC_TYPE_NEC; | 		rc_type          = RC_BIT_NEC; | ||||||
| 		ir->sampling     = 0xff00; /* address */ | 		ir->sampling     = 0xff00; /* address */ | ||||||
| 		break; | 		break; | ||||||
| 	} | 	} | ||||||
|  | @ -592,7 +592,7 @@ void cx88_i2c_init_ir(struct cx88_core *core) | ||||||
| 	case CX88_BOARD_LEADTEK_PVR2000: | 	case CX88_BOARD_LEADTEK_PVR2000: | ||||||
| 		addr_list = pvr2000_addr_list; | 		addr_list = pvr2000_addr_list; | ||||||
| 		core->init_data.name = "cx88 Leadtek PVR 2000 remote"; | 		core->init_data.name = "cx88 Leadtek PVR 2000 remote"; | ||||||
| 		core->init_data.type = RC_TYPE_UNKNOWN; | 		core->init_data.type = RC_BIT_UNKNOWN; | ||||||
| 		core->init_data.get_key = get_key_pvr2000; | 		core->init_data.get_key = get_key_pvr2000; | ||||||
| 		core->init_data.ir_codes = RC_MAP_EMPTY; | 		core->init_data.ir_codes = RC_MAP_EMPTY; | ||||||
| 		break; | 		break; | ||||||
|  | @ -613,7 +613,7 @@ void cx88_i2c_init_ir(struct cx88_core *core) | ||||||
| 			/* Hauppauge XVR */ | 			/* Hauppauge XVR */ | ||||||
| 			core->init_data.name = "cx88 Hauppauge XVR remote"; | 			core->init_data.name = "cx88 Hauppauge XVR remote"; | ||||||
| 			core->init_data.ir_codes = RC_MAP_HAUPPAUGE; | 			core->init_data.ir_codes = RC_MAP_HAUPPAUGE; | ||||||
| 			core->init_data.type = RC_TYPE_RC5; | 			core->init_data.type = RC_BIT_RC5; | ||||||
| 			core->init_data.internal_get_key_func = IR_KBD_GET_KEY_HAUP_XVR; | 			core->init_data.internal_get_key_func = IR_KBD_GET_KEY_HAUP_XVR; | ||||||
| 
 | 
 | ||||||
| 			info.platform_data = &core->init_data; | 			info.platform_data = &core->init_data; | ||||||
|  |  | ||||||
|  | @ -45,11 +45,15 @@ static unsigned int debug; | ||||||
| module_param(debug,int,0644); | module_param(debug,int,0644); | ||||||
| MODULE_PARM_DESC(debug,"enable debug messages [mpeg]"); | MODULE_PARM_DESC(debug,"enable debug messages [mpeg]"); | ||||||
| 
 | 
 | ||||||
| #define dprintk(level,fmt, arg...)	if (debug >= level) \ | #define dprintk(level, fmt, arg...) do {				       \ | ||||||
| 	printk(KERN_DEBUG "%s/2-mpeg: " fmt, dev->core->name, ## arg) | 	if (debug + 1 > level)						       \ | ||||||
|  | 		printk(KERN_DEBUG "%s/2-mpeg: " fmt, dev->core->name, ## arg); \ | ||||||
|  | } while(0) | ||||||
| 
 | 
 | ||||||
| #define mpeg_dbg(level,fmt, arg...)	if (debug >= level) \ | #define mpeg_dbg(level, fmt, arg...) do {				  \ | ||||||
| 	printk(KERN_DEBUG "%s/2-mpeg: " fmt, core->name, ## arg) | 	if (debug + 1 > level)						  \ | ||||||
|  | 		printk(KERN_DEBUG "%s/2-mpeg: " fmt, core->name, ## arg); \ | ||||||
|  | } while(0) | ||||||
| 
 | 
 | ||||||
| #if defined(CONFIG_MODULES) && defined(MODULE) | #if defined(CONFIG_MODULES) && defined(MODULE) | ||||||
| static void request_module_async(struct work_struct *work) | static void request_module_async(struct work_struct *work) | ||||||
|  | @ -217,8 +221,7 @@ static int cx8802_restart_queue(struct cx8802_dev    *dev, | ||||||
| 				return 0; | 				return 0; | ||||||
| 			buf = list_entry(q->queued.next, struct cx88_buffer, vb.queue); | 			buf = list_entry(q->queued.next, struct cx88_buffer, vb.queue); | ||||||
| 			if (NULL == prev) { | 			if (NULL == prev) { | ||||||
| 				list_del(&buf->vb.queue); | 				list_move_tail(&buf->vb.queue, &q->active); | ||||||
| 				list_add_tail(&buf->vb.queue,&q->active); |  | ||||||
| 				cx8802_start_dma(dev, q, buf); | 				cx8802_start_dma(dev, q, buf); | ||||||
| 				buf->vb.state = VIDEOBUF_ACTIVE; | 				buf->vb.state = VIDEOBUF_ACTIVE; | ||||||
| 				buf->count    = q->count++; | 				buf->count    = q->count++; | ||||||
|  | @ -229,8 +232,7 @@ static int cx8802_restart_queue(struct cx8802_dev    *dev, | ||||||
| 			} else if (prev->vb.width  == buf->vb.width  && | 			} else if (prev->vb.width  == buf->vb.width  && | ||||||
| 				   prev->vb.height == buf->vb.height && | 				   prev->vb.height == buf->vb.height && | ||||||
| 				   prev->fmt       == buf->fmt) { | 				   prev->fmt       == buf->fmt) { | ||||||
| 				list_del(&buf->vb.queue); | 				list_move_tail(&buf->vb.queue, &q->active); | ||||||
| 				list_add_tail(&buf->vb.queue,&q->active); |  | ||||||
| 				buf->vb.state = VIDEOBUF_ACTIVE; | 				buf->vb.state = VIDEOBUF_ACTIVE; | ||||||
| 				buf->count    = q->count++; | 				buf->count    = q->count++; | ||||||
| 				prev->risc.jmp[1] = cpu_to_le32(buf->risc.dma); | 				prev->risc.jmp[1] = cpu_to_le32(buf->risc.dma); | ||||||
|  |  | ||||||
|  | @ -94,13 +94,13 @@ enum cx8802_board_access { | ||||||
| /* ----------------------------------------------------------- */ | /* ----------------------------------------------------------- */ | ||||||
| /* tv norms                                                    */ | /* tv norms                                                    */ | ||||||
| 
 | 
 | ||||||
| static unsigned int inline norm_maxw(v4l2_std_id norm) | static inline unsigned int norm_maxw(v4l2_std_id norm) | ||||||
| { | { | ||||||
| 	return (norm & (V4L2_STD_MN & ~V4L2_STD_PAL_Nc)) ? 720 : 768; | 	return (norm & (V4L2_STD_MN & ~V4L2_STD_PAL_Nc)) ? 720 : 768; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| static unsigned int inline norm_maxh(v4l2_std_id norm) | static inline unsigned int norm_maxh(v4l2_std_id norm) | ||||||
| { | { | ||||||
| 	return (norm & V4L2_STD_625_50) ? 576 : 480; | 	return (norm & V4L2_STD_625_50) ? 576 : 480; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -736,7 +736,7 @@ static irqreturn_t dm1105_irq(int irq, void *dev_id) | ||||||
| 	return IRQ_HANDLED; | 	return IRQ_HANDLED; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int __devinit dm1105_ir_init(struct dm1105_dev *dm1105) | static int __devinit dm1105_ir_init(struct dm1105_dev *dm1105) | ||||||
| { | { | ||||||
| 	struct rc_dev *dev; | 	struct rc_dev *dev; | ||||||
| 	int err = -ENOMEM; | 	int err = -ENOMEM; | ||||||
|  | @ -776,7 +776,7 @@ int __devinit dm1105_ir_init(struct dm1105_dev *dm1105) | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void __devexit dm1105_ir_exit(struct dm1105_dev *dm1105) | static void __devexit dm1105_ir_exit(struct dm1105_dev *dm1105) | ||||||
| { | { | ||||||
| 	rc_unregister_device(dm1105->ir.dev); | 	rc_unregister_device(dm1105->ir.dev); | ||||||
| } | } | ||||||
|  | @ -1128,8 +1128,10 @@ static int __devinit dm1105_probe(struct pci_dev *pdev, | ||||||
| 	INIT_WORK(&dev->work, dm1105_dmx_buffer); | 	INIT_WORK(&dev->work, dm1105_dmx_buffer); | ||||||
| 	sprintf(dev->wqn, "%s/%d", dvb_adapter->name, dvb_adapter->num); | 	sprintf(dev->wqn, "%s/%d", dvb_adapter->name, dvb_adapter->num); | ||||||
| 	dev->wq = create_singlethread_workqueue(dev->wqn); | 	dev->wq = create_singlethread_workqueue(dev->wqn); | ||||||
| 	if (!dev->wq) | 	if (!dev->wq) { | ||||||
|  | 		ret = -ENOMEM; | ||||||
| 		goto err_dvb_net; | 		goto err_dvb_net; | ||||||
|  | 	} | ||||||
| 
 | 
 | ||||||
| 	ret = request_irq(pdev->irq, dm1105_irq, IRQF_SHARED, | 	ret = request_irq(pdev->irq, dm1105_irq, IRQF_SHARED, | ||||||
| 						DRIVER_NAME, dev); | 						DRIVER_NAME, dev); | ||||||
|  |  | ||||||
|  | @ -205,7 +205,7 @@ err_exit: | ||||||
| 	return ret; | 	return ret; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int ivtv_alsa_load(struct ivtv *itv) | static int __init ivtv_alsa_load(struct ivtv *itv) | ||||||
| { | { | ||||||
| 	struct v4l2_device *v4l2_dev = &itv->v4l2_dev; | 	struct v4l2_device *v4l2_dev = &itv->v4l2_dev; | ||||||
| 	struct ivtv_stream *s; | 	struct ivtv_stream *s; | ||||||
|  |  | ||||||
|  | @ -37,6 +37,7 @@ | ||||||
| #include "ivtv-streams.h" | #include "ivtv-streams.h" | ||||||
| #include "ivtv-fileops.h" | #include "ivtv-fileops.h" | ||||||
| #include "ivtv-alsa.h" | #include "ivtv-alsa.h" | ||||||
|  | #include "ivtv-alsa-pcm.h" | ||||||
| 
 | 
 | ||||||
| static unsigned int pcm_debug; | static unsigned int pcm_debug; | ||||||
| module_param(pcm_debug, int, 0644); | module_param(pcm_debug, int, 0644); | ||||||
|  | @ -69,7 +70,8 @@ static struct snd_pcm_hardware snd_ivtv_hw_capture = { | ||||||
| 	.periods_max = 98,		/* 12544, */ | 	.periods_max = 98,		/* 12544, */ | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| void ivtv_alsa_announce_pcm_data(struct snd_ivtv_card *itvsc, u8 *pcm_data, | static void ivtv_alsa_announce_pcm_data(struct snd_ivtv_card *itvsc, | ||||||
|  | 					u8 *pcm_data, | ||||||
| 					size_t num_bytes) | 					size_t num_bytes) | ||||||
| { | { | ||||||
| 	struct snd_pcm_substream *substream; | 	struct snd_pcm_substream *substream; | ||||||
|  |  | ||||||
|  | @ -21,7 +21,3 @@ | ||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
| int __init snd_ivtv_pcm_create(struct snd_ivtv_card *itvsc); | int __init snd_ivtv_pcm_create(struct snd_ivtv_card *itvsc); | ||||||
| 
 |  | ||||||
| /* Used by ivtv driver to announce the PCM data to the module */ |  | ||||||
| void ivtv_alsa_announce_pcm_data(struct snd_ivtv_card *card, u8 *pcm_data, |  | ||||||
| 				 size_t num_bytes); |  | ||||||
|  |  | ||||||
|  | @ -276,7 +276,7 @@ void ivtv_init_mpeg_decoder(struct ivtv *itv) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* Try to restart the card & restore previous settings */ | /* Try to restart the card & restore previous settings */ | ||||||
| int ivtv_firmware_restart(struct ivtv *itv) | static int ivtv_firmware_restart(struct ivtv *itv) | ||||||
| { | { | ||||||
| 	int rc = 0; | 	int rc = 0; | ||||||
| 	v4l2_std_id std; | 	v4l2_std_id std; | ||||||
|  |  | ||||||
|  | @ -200,21 +200,21 @@ static int ivtv_i2c_new_ir(struct ivtv *itv, u32 hw, const char *type, u8 addr) | ||||||
| 		init_data->ir_codes = RC_MAP_AVERMEDIA_CARDBUS; | 		init_data->ir_codes = RC_MAP_AVERMEDIA_CARDBUS; | ||||||
| 		init_data->internal_get_key_func = | 		init_data->internal_get_key_func = | ||||||
| 					IR_KBD_GET_KEY_AVERMEDIA_CARDBUS; | 					IR_KBD_GET_KEY_AVERMEDIA_CARDBUS; | ||||||
| 		init_data->type = RC_TYPE_OTHER; | 		init_data->type = RC_BIT_OTHER; | ||||||
| 		init_data->name = "AVerMedia AVerTV card"; | 		init_data->name = "AVerMedia AVerTV card"; | ||||||
| 		break; | 		break; | ||||||
| 	case IVTV_HW_I2C_IR_RX_HAUP_EXT: | 	case IVTV_HW_I2C_IR_RX_HAUP_EXT: | ||||||
| 	case IVTV_HW_I2C_IR_RX_HAUP_INT: | 	case IVTV_HW_I2C_IR_RX_HAUP_INT: | ||||||
| 		init_data->ir_codes = RC_MAP_HAUPPAUGE; | 		init_data->ir_codes = RC_MAP_HAUPPAUGE; | ||||||
| 		init_data->internal_get_key_func = IR_KBD_GET_KEY_HAUP; | 		init_data->internal_get_key_func = IR_KBD_GET_KEY_HAUP; | ||||||
| 		init_data->type = RC_TYPE_RC5; | 		init_data->type = RC_BIT_RC5; | ||||||
| 		init_data->name = itv->card_name; | 		init_data->name = itv->card_name; | ||||||
| 		break; | 		break; | ||||||
| 	case IVTV_HW_Z8F0811_IR_RX_HAUP: | 	case IVTV_HW_Z8F0811_IR_RX_HAUP: | ||||||
| 		/* Default to grey remote */ | 		/* Default to grey remote */ | ||||||
| 		init_data->ir_codes = RC_MAP_HAUPPAUGE; | 		init_data->ir_codes = RC_MAP_HAUPPAUGE; | ||||||
| 		init_data->internal_get_key_func = IR_KBD_GET_KEY_HAUP_XVR; | 		init_data->internal_get_key_func = IR_KBD_GET_KEY_HAUP_XVR; | ||||||
| 		init_data->type = RC_TYPE_RC5; | 		init_data->type = RC_BIT_RC5; | ||||||
| 		init_data->name = itv->card_name; | 		init_data->name = itv->card_name; | ||||||
| 		break; | 		break; | ||||||
| 	case IVTV_HW_I2C_IR_RX_ADAPTEC: | 	case IVTV_HW_I2C_IR_RX_ADAPTEC: | ||||||
|  | @ -222,7 +222,7 @@ static int ivtv_i2c_new_ir(struct ivtv *itv, u32 hw, const char *type, u8 addr) | ||||||
| 		init_data->name = itv->card_name; | 		init_data->name = itv->card_name; | ||||||
| 		/* FIXME: The protocol and RC_MAP needs to be corrected */ | 		/* FIXME: The protocol and RC_MAP needs to be corrected */ | ||||||
| 		init_data->ir_codes = RC_MAP_EMPTY; | 		init_data->ir_codes = RC_MAP_EMPTY; | ||||||
| 		init_data->type = RC_TYPE_UNKNOWN; | 		init_data->type = RC_BIT_UNKNOWN; | ||||||
| 		break; | 		break; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -993,7 +993,7 @@ int ivtv_s_input(struct file *file, void *fh, unsigned int inp) | ||||||
| 	v4l2_std_id std; | 	v4l2_std_id std; | ||||||
| 	int i; | 	int i; | ||||||
| 
 | 
 | ||||||
| 	if (inp < 0 || inp >= itv->nof_inputs) | 	if (inp >= itv->nof_inputs) | ||||||
| 		return -EINVAL; | 		return -EINVAL; | ||||||
| 
 | 
 | ||||||
| 	if (inp == itv->active_input) { | 	if (inp == itv->active_input) { | ||||||
|  | @ -1168,7 +1168,7 @@ void ivtv_s_std_dec(struct ivtv *itv, v4l2_std_id *std) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int ivtv_s_std(struct file *file, void *fh, v4l2_std_id *std) | static int ivtv_s_std(struct file *file, void *fh, v4l2_std_id *std) | ||||||
| { | { | ||||||
| 	struct ivtv *itv = fh2id(fh)->itv; | 	struct ivtv *itv = fh2id(fh)->itv; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -18,6 +18,8 @@ | ||||||
| 	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | 	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||||||
| */ | */ | ||||||
| 
 | 
 | ||||||
|  | #if 0 /* Currently unused */
 | ||||||
|  | 
 | ||||||
| #include <media/rc-core.h> | #include <media/rc-core.h> | ||||||
| #include <linux/pci.h> | #include <linux/pci.h> | ||||||
| 
 | 
 | ||||||
|  | @ -150,10 +152,11 @@ out: | ||||||
| 	return err; | 	return err; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int mantis_exit(struct mantis_pci *mantis) | int mantis_init_exit(struct mantis_pci *mantis) | ||||||
| { | { | ||||||
| 	rc_unregister_device(mantis->rc); | 	rc_unregister_device(mantis->rc); | ||||||
| 	rc_map_unregister(&ir_mantis_map); | 	rc_map_unregister(&ir_mantis_map); | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | #endif | ||||||
|  |  | ||||||
Some files were not shown because too many files have changed in this diff Show more
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Mauro Carvalho Chehab
				Mauro Carvalho Chehab