All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/1] [TIPC]: Fixed erroneous introduction of for_each_netdev
  2012-03-14 20:05 [Qemu-devel] 5 euros offerts sur votre première commande Claire de Libeedo
@ 2007-05-16  0:21 ` Jon Paul Maloy
  2007-05-16  0:25   ` David Miller
  2007-05-23 22:12   ` David Miller
  2007-05-18  0:33 ` [PATCH 1/3] [TIPC]: Improved support for Ethernet traffic filtering Jon Paul Maloy
                   ` (14 subsequent siblings)
  15 siblings, 2 replies; 104+ messages in thread
From: Jon Paul Maloy @ 2007-05-16  0:21 UTC (permalink / raw)
  To: David Miller; +Cc: netdev, Jon Paul Maloy


Signed-off-by: Jon Paul Maloy <jon.maloy@ericsson.com>
---
 net/tipc/eth_media.c |   10 ++++++----
 1 files changed, 6 insertions(+), 4 deletions(-)

diff --git a/net/tipc/eth_media.c b/net/tipc/eth_media.c
index 0ee6ded..c73c206 100644
--- a/net/tipc/eth_media.c
+++ b/net/tipc/eth_media.c
@@ -120,18 +120,20 @@ static int recv_msg(struct sk_buff *buf, struct net_device *dev,
 
 static int enable_bearer(struct tipc_bearer *tb_ptr)
 {
-	struct net_device *dev, *pdev;
+	struct net_device *dev = NULL;
+	struct net_device *pdev = NULL;
 	struct eth_bearer *eb_ptr = &eth_bearers[0];
 	struct eth_bearer *stop = &eth_bearers[MAX_ETH_BEARERS];
 	char *driver_name = strchr((const char *)tb_ptr->name, ':') + 1;
 
 	/* Find device with specified name */
-	dev = NULL;
-	for_each_netdev(pdev)
-		if (!strncmp(dev->name, driver_name, IFNAMSIZ)) {
+
+	for_each_netdev(pdev){
+		if (!strncmp(pdev->name, driver_name, IFNAMSIZ)) {
 			dev = pdev;
 			break;
 		}
+        }
 	if (!dev)
 		return -ENODEV;
 
-- 
1.5.0.5


^ permalink raw reply related	[flat|nested] 104+ messages in thread

* Re: [PATCH 1/1] [TIPC]: Fixed erroneous introduction of for_each_netdev
  2007-05-16  0:21 ` [PATCH 1/1] [TIPC]: Fixed erroneous introduction of for_each_netdev Jon Paul Maloy
@ 2007-05-16  0:25   ` David Miller
  2007-05-23 22:12   ` David Miller
  1 sibling, 0 replies; 104+ messages in thread
From: David Miller @ 2007-05-16  0:25 UTC (permalink / raw)
  To: jon.maloy; +Cc: netdev

From: Jon Paul Maloy <jon.maloy@ericsson.com>
Date: Tue, 15 May 2007 20:21:14 -0400

> 
> Signed-off-by: Jon Paul Maloy <jon.maloy@ericsson.com>

Sorry about that Jon, I thought the new code was correct :-/

^ permalink raw reply	[flat|nested] 104+ messages in thread

* [PATCH 1/3] [TIPC]: Improved support for Ethernet traffic filtering
  2012-03-14 20:05 [Qemu-devel] 5 euros offerts sur votre première commande Claire de Libeedo
  2007-05-16  0:21 ` [PATCH 1/1] [TIPC]: Fixed erroneous introduction of for_each_netdev Jon Paul Maloy
@ 2007-05-18  0:33 ` Jon Paul Maloy
  2007-05-18  0:33 ` [PATCH 2/3] [TIPC]: Use standard socket "not implemented" routines Jon Paul Maloy
                   ` (13 subsequent siblings)
  15 siblings, 0 replies; 104+ messages in thread
From: Jon Paul Maloy @ 2007-05-18  0:33 UTC (permalink / raw)
  To: David Miller; +Cc: Jon Paul Maloy, netdev, tipc-discussion

This patch simplifies TIPC's Ethernet receive routine to take
advantage of information already present in each incoming sk_buff
indicating whether the packet was explicitly sent to the interface,
has been broadcast to all interfaces, or was picked up because the
interface is in promiscous mode.

This new approach also fixes the problem of TIPC accepting unwanted
traffic through UML's multicast-based Ethernet interfaces (which
deliver traffic in a promiscuous manner even if the interface is
not configured to be promiscuous).

Signed-off-by: Allan Stephens <allan.stephens@windriver.com>
Signed-off-by: Jon Paul Maloy <jon.maloy@ericsson.com>
---
 net/tipc/eth_media.c |   11 ++++++-----
 1 files changed, 6 insertions(+), 5 deletions(-)

diff --git a/net/tipc/eth_media.c b/net/tipc/eth_media.c
index c73c206..19a71cf 100644
--- a/net/tipc/eth_media.c
+++ b/net/tipc/eth_media.c
@@ -1,8 +1,8 @@
 /*
  * net/tipc/eth_media.c: Ethernet bearer support for TIPC
  *
- * Copyright (c) 2001-2006, Ericsson AB
- * Copyright (c) 2005-2006, Wind River Systems
+ * Copyright (c) 2001-2007, Ericsson AB
+ * Copyright (c) 2005-2007, Wind River Systems
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -87,6 +87,9 @@ static int send_msg(struct sk_buff *buf, struct tipc_bearer *tb_ptr,
 /**
  * recv_msg - handle incoming TIPC message from an Ethernet interface
  *
+ * Accept only packets explicitly sent to this node, or broadcast packets;
+ * ignores packets sent using Ethernet multicast, and traffic sent to other
+ * nodes (which can happen if interface is running in promiscuous mode).
  * Routine truncates any Ethernet padding/CRC appended to the message,
  * and ensures message size matches actual length
  */
@@ -98,9 +101,7 @@ static int recv_msg(struct sk_buff *buf, struct net_device *dev,
 	u32 size;
 
 	if (likely(eb_ptr->bearer)) {
-	       if (likely(!dev->promiscuity) ||
-		   !memcmp(skb_mac_header(buf), dev->dev_addr, ETH_ALEN) ||
-		   !memcmp(skb_mac_header(buf), dev->broadcast, ETH_ALEN)) {
+		if (likely(buf->pkt_type <= PACKET_BROADCAST)) {
 			size = msg_size((struct tipc_msg *)buf->data);
 			skb_trim(buf, size);
 			if (likely(buf->len == size)) {
-- 
1.5.0.5


-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/

^ permalink raw reply related	[flat|nested] 104+ messages in thread

* [PATCH 2/3] [TIPC]: Use standard socket "not implemented" routines
  2012-03-14 20:05 [Qemu-devel] 5 euros offerts sur votre première commande Claire de Libeedo
  2007-05-16  0:21 ` [PATCH 1/1] [TIPC]: Fixed erroneous introduction of for_each_netdev Jon Paul Maloy
  2007-05-18  0:33 ` [PATCH 1/3] [TIPC]: Improved support for Ethernet traffic filtering Jon Paul Maloy
@ 2007-05-18  0:33 ` Jon Paul Maloy
  2007-05-18  0:33 ` [PATCH 3/3] [TIPC]: Optimize stream send routine to avoid fragmentation Jon Paul Maloy
                   ` (12 subsequent siblings)
  15 siblings, 0 replies; 104+ messages in thread
From: Jon Paul Maloy @ 2007-05-18  0:33 UTC (permalink / raw)
  To: David Miller; +Cc: Jon Paul Maloy, netdev, tipc-discussion

This patch modifies TIPC's socket API to utilize existing
generic routines to indicate unsupported operations, rather
than adding similar TIPC-specific routines.

Signed-off-by: Allan Stephens <allan.stephens@windriver.com>
Signed-off-by: Jon Paul Maloy <jon.maloy@ericsson.com>
---
 net/tipc/socket.c |   55 +++++++++++++---------------------------------------
 1 files changed, 14 insertions(+), 41 deletions(-)

diff --git a/net/tipc/socket.c b/net/tipc/socket.c
index 45832fb..ac7f2aa 100644
--- a/net/tipc/socket.c
+++ b/net/tipc/socket.c
@@ -1,8 +1,8 @@
 /*
  * net/tipc/socket.c: TIPC socket API
  *
- * Copyright (c) 2001-2006, Ericsson AB
- * Copyright (c) 2004-2006, Wind River Systems
+ * Copyright (c) 2001-2007, Ericsson AB
+ * Copyright (c) 2004-2007, Wind River Systems
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -1600,33 +1600,6 @@ static int getsockopt(struct socket *sock,
 }
 
 /**
- * Placeholders for non-implemented functionality
- *
- * Returns error code (POSIX-compliant where defined)
- */
-
-static int ioctl(struct socket *s, u32 cmd, unsigned long arg)
-{
-	return -EINVAL;
-}
-
-static int no_mmap(struct file *file, struct socket *sock,
-		   struct vm_area_struct *vma)
-{
-	return -EINVAL;
-}
-static ssize_t no_sendpage(struct socket *sock, struct page *page,
-			   int offset, size_t size, int flags)
-{
-	return -EINVAL;
-}
-
-static int no_skpair(struct socket *s1, struct socket *s2)
-{
-	return -EOPNOTSUPP;
-}
-
-/**
  * Protocol switches for the various types of TIPC sockets
  */
 
@@ -1636,19 +1609,19 @@ static struct proto_ops msg_ops = {
 	.release	= release,
 	.bind		= bind,
 	.connect	= connect,
-	.socketpair	= no_skpair,
+	.socketpair	= sock_no_socketpair,
 	.accept		= accept,
 	.getname	= get_name,
 	.poll		= poll,
-	.ioctl		= ioctl,
+	.ioctl		= sock_no_ioctl,
 	.listen		= listen,
 	.shutdown	= shutdown,
 	.setsockopt	= setsockopt,
 	.getsockopt	= getsockopt,
 	.sendmsg	= send_msg,
 	.recvmsg	= recv_msg,
-	.mmap		= no_mmap,
-	.sendpage	= no_sendpage
+        .mmap		= sock_no_mmap,
+        .sendpage	= sock_no_sendpage
 };
 
 static struct proto_ops packet_ops = {
@@ -1657,19 +1630,19 @@ static struct proto_ops packet_ops = {
 	.release	= release,
 	.bind		= bind,
 	.connect	= connect,
-	.socketpair	= no_skpair,
+	.socketpair	= sock_no_socketpair,
 	.accept		= accept,
 	.getname	= get_name,
 	.poll		= poll,
-	.ioctl		= ioctl,
+	.ioctl		= sock_no_ioctl,
 	.listen		= listen,
 	.shutdown	= shutdown,
 	.setsockopt	= setsockopt,
 	.getsockopt	= getsockopt,
 	.sendmsg	= send_packet,
 	.recvmsg	= recv_msg,
-	.mmap		= no_mmap,
-	.sendpage	= no_sendpage
+        .mmap		= sock_no_mmap,
+        .sendpage	= sock_no_sendpage
 };
 
 static struct proto_ops stream_ops = {
@@ -1678,19 +1651,19 @@ static struct proto_ops stream_ops = {
 	.release	= release,
 	.bind		= bind,
 	.connect	= connect,
-	.socketpair	= no_skpair,
+	.socketpair	= sock_no_socketpair,
 	.accept		= accept,
 	.getname	= get_name,
 	.poll		= poll,
-	.ioctl		= ioctl,
+	.ioctl		= sock_no_ioctl,
 	.listen		= listen,
 	.shutdown	= shutdown,
 	.setsockopt	= setsockopt,
 	.getsockopt	= getsockopt,
 	.sendmsg	= send_stream,
 	.recvmsg	= recv_stream,
-	.mmap		= no_mmap,
-	.sendpage	= no_sendpage
+        .mmap		= sock_no_mmap,
+        .sendpage	= sock_no_sendpage
 };
 
 static struct net_proto_family tipc_family_ops = {
-- 
1.5.0.5


-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/

^ permalink raw reply related	[flat|nested] 104+ messages in thread

* [PATCH 3/3] [TIPC]: Optimize stream send routine to avoid fragmentation
  2012-03-14 20:05 [Qemu-devel] 5 euros offerts sur votre première commande Claire de Libeedo
                   ` (2 preceding siblings ...)
  2007-05-18  0:33 ` [PATCH 2/3] [TIPC]: Use standard socket "not implemented" routines Jon Paul Maloy
@ 2007-05-18  0:33 ` Jon Paul Maloy
  2009-03-07 22:10 ` [PATCH 1/2] Propagata hci_register_sysfs() error Erik Andrén
                   ` (11 subsequent siblings)
  15 siblings, 0 replies; 104+ messages in thread
From: Jon Paul Maloy @ 2007-05-18  0:33 UTC (permalink / raw)
  To: David Miller; +Cc: Jon Paul Maloy, netdev, tipc-discussion

This patch enhances TIPC's stream socket send routine so that
it avoids transmitting data in chunks that require fragmentation
and reassembly, thereby improving performance at both the
sending and receiving ends of the connection.

The "maximum packet size" hint that records MTU info allows
the socket to decide how big a chunk it should send; in the
event that the hint has become stale, fragmentation may still
occur, but the data will be passed correctly and the hint will
be updated in time for the following send.  Note: The 66060 byte
pseudo-MTU used for intra-node connections requires the send
routine to perform an additional check to ensure it does not
exceed TIPC"s limit of 66000 bytes of user data per chunk.

Signed-off-by: Allan Stephens <allan.stephens@windriver.com>
Signed-off-by: Jon Paul Maloy <jon.maloy@ericsson.com>
---
 include/net/tipc/tipc_port.h |    6 ++++--
 net/tipc/link.c              |   16 ++++++++--------
 net/tipc/port.c              |   10 +++++-----
 net/tipc/port.h              |    6 ++----
 net/tipc/socket.c            |   25 +++++++++++++++++--------
 5 files changed, 36 insertions(+), 27 deletions(-)

diff --git a/include/net/tipc/tipc_port.h b/include/net/tipc/tipc_port.h
index 333bba6..cfc4ba4 100644
--- a/include/net/tipc/tipc_port.h
+++ b/include/net/tipc/tipc_port.h
@@ -1,8 +1,8 @@
 /*
  * include/net/tipc/tipc_port.h: Include file for privileged access to TIPC ports
  * 
- * Copyright (c) 1994-2006, Ericsson AB
- * Copyright (c) 2005, Wind River Systems
+ * Copyright (c) 1994-2007, Ericsson AB
+ * Copyright (c) 2005-2007, Wind River Systems
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -55,6 +55,7 @@
  * @conn_unacked: number of unacknowledged messages received from peer port
  * @published: non-zero if port has one or more associated names
  * @congested: non-zero if cannot send because of link or port congestion
+ * @max_pkt: maximum packet size "hint" used when building messages sent by port
  * @ref: unique reference to port in TIPC object registry
  * @phdr: preformatted message header used when sending messages
  */
@@ -68,6 +69,7 @@ struct tipc_port {
 	u32 conn_unacked;
 	int published;
 	u32 congested;
+	u32 max_pkt;
 	u32 ref;
 	struct tipc_msg phdr;
 };
diff --git a/net/tipc/link.c b/net/tipc/link.c
index 2124f32..5adfdfd 100644
--- a/net/tipc/link.c
+++ b/net/tipc/link.c
@@ -1,8 +1,8 @@
 /*
  * net/tipc/link.c: TIPC link code
  *
- * Copyright (c) 1996-2006, Ericsson AB
- * Copyright (c) 2004-2006, Wind River Systems
+ * Copyright (c) 1996-2007, Ericsson AB
+ * Copyright (c) 2004-2007, Wind River Systems
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -1260,7 +1260,7 @@ again:
 	 * (Must not hold any locks while building message.)
 	 */
 
-	res = msg_build(hdr, msg_sect, num_sect, sender->max_pkt,
+	res = msg_build(hdr, msg_sect, num_sect, sender->publ.max_pkt,
 			!sender->user_port, &buf);
 
 	read_lock_bh(&tipc_net_lock);
@@ -1271,7 +1271,7 @@ again:
 		if (likely(l_ptr)) {
 			if (likely(buf)) {
 				res = link_send_buf_fast(l_ptr, buf,
-							 &sender->max_pkt);
+							 &sender->publ.max_pkt);
 				if (unlikely(res < 0))
 					buf_discard(buf);
 exit:
@@ -1299,12 +1299,12 @@ exit:
 			 * then re-try fast path or fragment the message
 			 */
 
-			sender->max_pkt = link_max_pkt(l_ptr);
+			sender->publ.max_pkt = link_max_pkt(l_ptr);
 			tipc_node_unlock(node);
 			read_unlock_bh(&tipc_net_lock);
 
 
-			if ((msg_hdr_sz(hdr) + res) <= sender->max_pkt)
+			if ((msg_hdr_sz(hdr) + res) <= sender->publ.max_pkt)
 				goto again;
 
 			return link_send_sections_long(sender, msg_sect,
@@ -1357,7 +1357,7 @@ static int link_send_sections_long(struct port *sender,
 
 again:
 	fragm_no = 1;
-	max_pkt = sender->max_pkt - INT_H_SIZE;
+	max_pkt = sender->publ.max_pkt - INT_H_SIZE;
 		/* leave room for tunnel header in case of link changeover */
 	fragm_sz = max_pkt - INT_H_SIZE;
 		/* leave room for fragmentation header in each fragment */
@@ -1463,7 +1463,7 @@ error:
 			goto reject;
 		}
 		if (link_max_pkt(l_ptr) < max_pkt) {
-			sender->max_pkt = link_max_pkt(l_ptr);
+			sender->publ.max_pkt = link_max_pkt(l_ptr);
 			tipc_node_unlock(node);
 			for (; buf_chain; buf_chain = buf) {
 				buf = buf_chain->next;
diff --git a/net/tipc/port.c b/net/tipc/port.c
index bcd5da0..5d2b9ce 100644
--- a/net/tipc/port.c
+++ b/net/tipc/port.c
@@ -1,8 +1,8 @@
 /*
  * net/tipc/port.c: TIPC port code
  *
- * Copyright (c) 1992-2006, Ericsson AB
- * Copyright (c) 2004-2005, Wind River Systems
+ * Copyright (c) 1992-2007, Ericsson AB
+ * Copyright (c) 2004-2007, Wind River Systems
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -239,6 +239,8 @@ u32 tipc_createport_raw(void *usr_handle,
 	}
 
 	tipc_port_lock(ref);
+	p_ptr->publ.usr_handle = usr_handle;
+	p_ptr->publ.max_pkt = MAX_PKT_DEFAULT;
 	p_ptr->publ.ref = ref;
 	msg = &p_ptr->publ.phdr;
 	msg_init(msg, DATA_LOW, TIPC_NAMED_MSG, TIPC_OK, LONG_H_SIZE, 0);
@@ -248,11 +250,9 @@ u32 tipc_createport_raw(void *usr_handle,
 	msg_set_importance(msg,importance);
 	p_ptr->last_in_seqno = 41;
 	p_ptr->sent = 1;
-	p_ptr->publ.usr_handle = usr_handle;
 	INIT_LIST_HEAD(&p_ptr->wait_list);
 	INIT_LIST_HEAD(&p_ptr->subscription.nodesub_list);
 	p_ptr->congested_link = NULL;
-	p_ptr->max_pkt = MAX_PKT_DEFAULT;
 	p_ptr->dispatcher = dispatcher;
 	p_ptr->wakeup = wakeup;
 	p_ptr->user_port = NULL;
@@ -1243,7 +1243,7 @@ int tipc_connect2port(u32 ref, struct tipc_portid const *peer)
 	res = TIPC_OK;
 exit:
 	tipc_port_unlock(p_ptr);
-	p_ptr->max_pkt = tipc_link_get_max_pkt(peer->node, ref);
+	p_ptr->publ.max_pkt = tipc_link_get_max_pkt(peer->node, ref);
 	return res;
 }
 
diff --git a/net/tipc/port.h b/net/tipc/port.h
index 7ef4d64..e5f8c16 100644
--- a/net/tipc/port.h
+++ b/net/tipc/port.h
@@ -1,8 +1,8 @@
 /*
  * net/tipc/port.h: Include file for TIPC port code
  *
- * Copyright (c) 1994-2006, Ericsson AB
- * Copyright (c) 2004-2005, Wind River Systems
+ * Copyright (c) 1994-2007, Ericsson AB
+ * Copyright (c) 2004-2007, Wind River Systems
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -81,7 +81,6 @@ struct user_port {
  * @acked:
  * @publications: list of publications for port
  * @pub_count: total # of publications port has made during its lifetime
- * @max_pkt: maximum packet size "hint" used when building messages sent by port
  * @probing_state:
  * @probing_interval:
  * @last_in_seqno:
@@ -102,7 +101,6 @@ struct port {
 	u32 acked;
 	struct list_head publications;
 	u32 pub_count;
-	u32 max_pkt;
 	u32 probing_state;
 	u32 probing_interval;
 	u32 last_in_seqno;
diff --git a/net/tipc/socket.c b/net/tipc/socket.c
index ac7f2aa..4a8f37f 100644
--- a/net/tipc/socket.c
+++ b/net/tipc/socket.c
@@ -607,23 +607,24 @@ exit:
 static int send_stream(struct kiocb *iocb, struct socket *sock,
 		       struct msghdr *m, size_t total_len)
 {
+	struct tipc_port *tport;
 	struct msghdr my_msg;
 	struct iovec my_iov;
 	struct iovec *curr_iov;
 	int curr_iovlen;
 	char __user *curr_start;
+	u32 hdr_size;
 	int curr_left;
 	int bytes_to_send;
 	int bytes_sent;
 	int res;
 
-	if (likely(total_len <= TIPC_MAX_USER_MSG_SIZE))
-		return send_packet(iocb, sock, m, total_len);
-
-	/* Can only send large data streams if already connected */
+	/* Handle special cases where there is no connection */
 
 	if (unlikely(sock->state != SS_CONNECTED)) {
-		if (sock->state == SS_DISCONNECTING)
+		if (sock->state == SS_UNCONNECTED)
+			return send_packet(iocb, sock, m, total_len);
+		else if (sock->state == SS_DISCONNECTING)
 			return -EPIPE;
 		else
 			return -ENOTCONN;
@@ -648,17 +649,25 @@ static int send_stream(struct kiocb *iocb, struct socket *sock,
 	my_msg.msg_name = NULL;
 	bytes_sent = 0;
 
+	tport = tipc_sk(sock->sk)->p;
+	hdr_size = msg_hdr_sz(&tport->phdr);
+
 	while (curr_iovlen--) {
 		curr_start = curr_iov->iov_base;
 		curr_left = curr_iov->iov_len;
 
 		while (curr_left) {
-			bytes_to_send = (curr_left < TIPC_MAX_USER_MSG_SIZE)
-				? curr_left : TIPC_MAX_USER_MSG_SIZE;
+			bytes_to_send = tport->max_pkt - hdr_size;
+			if (bytes_to_send > TIPC_MAX_USER_MSG_SIZE)
+				bytes_to_send = TIPC_MAX_USER_MSG_SIZE;
+			if (curr_left < bytes_to_send)
+				bytes_to_send = curr_left;
 			my_iov.iov_base = curr_start;
 			my_iov.iov_len = bytes_to_send;
 			if ((res = send_packet(iocb, sock, &my_msg, 0)) < 0) {
-				return bytes_sent ? bytes_sent : res;
+				if (bytes_sent != 0)
+					res = bytes_sent;
+				return res;
 			}
 			curr_left -= bytes_to_send;
 			curr_start += bytes_to_send;
-- 
1.5.0.5


-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/

^ permalink raw reply related	[flat|nested] 104+ messages in thread

* Re: [PATCH 1/1] [TIPC]: Fixed erroneous introduction of for_each_netdev
  2007-05-16  0:21 ` [PATCH 1/1] [TIPC]: Fixed erroneous introduction of for_each_netdev Jon Paul Maloy
  2007-05-16  0:25   ` David Miller
@ 2007-05-23 22:12   ` David Miller
  1 sibling, 0 replies; 104+ messages in thread
From: David Miller @ 2007-05-23 22:12 UTC (permalink / raw)
  To: jon.maloy; +Cc: netdev

From: Jon Paul Maloy <jon.maloy@ericsson.com>
Date: Tue, 15 May 2007 20:21:14 -0400

> 
> Signed-off-by: Jon Paul Maloy <jon.maloy@ericsson.com>

Patch applied, thanks Jon.

I specifically had the developer of that change audit for this exact
kind of bug, my apologies that this one case still slipped through :-/

^ permalink raw reply	[flat|nested] 104+ messages in thread

* [PATCH 1/2] Propagata hci_register_sysfs() error
  2012-03-14 20:05 [Qemu-devel] 5 euros offerts sur votre première commande Claire de Libeedo
                   ` (3 preceding siblings ...)
  2007-05-18  0:33 ` [PATCH 3/3] [TIPC]: Optimize stream send routine to avoid fragmentation Jon Paul Maloy
@ 2009-03-07 22:10 ` Erik Andrén
  2009-03-07 22:10   ` [PATCH 2/2] Defer btaddconn and btdelconn workqueues until a device has actually connected Erik Andrén
  2009-03-09 19:55 ` Checkpatch fixes against bluetooth-testing Erik Andrén
                   ` (10 subsequent siblings)
  15 siblings, 1 reply; 104+ messages in thread
From: Erik Andrén @ 2009-03-07 22:10 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Erik Andrén

Currently if the hci_register_sysfs() function fails, the error is not propagated. Make it so.

Signed-off-by: Erik Andrén <erik.andren@gmail.com>
---
 net/bluetooth/hci_core.c |    9 ++++++---
 1 files changed, 6 insertions(+), 3 deletions(-)

diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c
index cd06151..9c98f6e 100644
--- a/net/bluetooth/hci_core.c
+++ b/net/bluetooth/hci_core.c
@@ -842,7 +842,7 @@ EXPORT_SYMBOL(hci_free_dev);
 int hci_register_dev(struct hci_dev *hdev)
 {
 	struct list_head *head = &hci_dev_list, *p;
-	int i, id = 0;
+	int i, err, id = 0;
 
 	BT_DBG("%p name %s type %d owner %p", hdev, hdev->name, hdev->type, hdev->owner);
 
@@ -855,7 +855,8 @@ int hci_register_dev(struct hci_dev *hdev)
 	list_for_each(p, &hci_dev_list) {
 		if (list_entry(p, struct hci_dev, list)->id != id)
 			break;
-		head = p; id++;
+		head = p;
+		id++;
 	}
 
 	sprintf(hdev->name, "hci%d", id);
@@ -898,7 +899,9 @@ int hci_register_dev(struct hci_dev *hdev)
 
 	write_unlock_bh(&hci_dev_list_lock);
 
-	hci_register_sysfs(hdev);
+	err = hci_register_sysfs(hdev);
+	if (err < 0)
+		return err;
 
 	hci_notify(hdev, HCI_DEV_REG);
 
-- 
1.5.6.3


^ permalink raw reply related	[flat|nested] 104+ messages in thread

* [PATCH 2/2] Defer btaddconn and btdelconn workqueues until a device has actually connected
  2009-03-07 22:10 ` [PATCH 1/2] Propagata hci_register_sysfs() error Erik Andrén
@ 2009-03-07 22:10   ` Erik Andrén
  0 siblings, 0 replies; 104+ messages in thread
From: Erik Andrén @ 2009-03-07 22:10 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Erik Andrén

Many distros always load the bluetooth module, even if no actual bluetooth device exists. This causes two workqueues: btaddconn and btdelconn to be
spawned at init time, clogging up the process list without performing any actual work.
This patch defers the workqueue creation until the first hci device has connected. Also, tear down the workqueues when the last device disconnects.

Signed-off-by: Erik Andrén <erik.andren@gmail.com>
---
 include/net/bluetooth/hci_core.h |    4 +-
 net/bluetooth/hci_core.c         |   11 ++++++---
 net/bluetooth/hci_sysfs.c        |   44 +++++++++++++++++++++----------------
 3 files changed, 34 insertions(+), 25 deletions(-)

diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h
index 01f9316..b3bc9fa 100644
--- a/include/net/bluetooth/hci_core.h
+++ b/include/net/bluetooth/hci_core.h
@@ -453,8 +453,8 @@ static inline int hci_recv_frame(struct sk_buff *skb)
 
 int hci_recv_fragment(struct hci_dev *hdev, int type, void *data, int count);
 
-int hci_register_sysfs(struct hci_dev *hdev);
-void hci_unregister_sysfs(struct hci_dev *hdev);
+int hci_register_sysfs(struct hci_dev *hdev, bool e);
+void hci_unregister_sysfs(struct hci_dev *hdev, bool e);
 void hci_conn_add_sysfs(struct hci_conn *conn);
 void hci_conn_del_sysfs(struct hci_conn *conn);
 
diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c
index 9c98f6e..c21753f 100644
--- a/net/bluetooth/hci_core.c
+++ b/net/bluetooth/hci_core.c
@@ -843,6 +843,7 @@ int hci_register_dev(struct hci_dev *hdev)
 {
 	struct list_head *head = &hci_dev_list, *p;
 	int i, err, id = 0;
+	bool empty;
 
 	BT_DBG("%p name %s type %d owner %p", hdev, hdev->name, hdev->type, hdev->owner);
 
@@ -859,6 +860,8 @@ int hci_register_dev(struct hci_dev *hdev)
 		id++;
 	}
 
+	empty = list_empty(&hci_dev_list);
+
 	sprintf(hdev->name, "hci%d", id);
 	hdev->id = id;
 	list_add(&hdev->list, head);
@@ -896,10 +899,9 @@ int hci_register_dev(struct hci_dev *hdev)
 	memset(&hdev->stat, 0, sizeof(struct hci_dev_stats));
 
 	atomic_set(&hdev->promisc, 0);
-
 	write_unlock_bh(&hci_dev_list_lock);
 
-	err = hci_register_sysfs(hdev);
+	err = hci_register_sysfs(hdev, empty);
 	if (err < 0)
 		return err;
 
@@ -913,13 +915,14 @@ EXPORT_SYMBOL(hci_register_dev);
 int hci_unregister_dev(struct hci_dev *hdev)
 {
 	int i;
+	bool empty;
 
 	BT_DBG("%p name %s type %d", hdev, hdev->name, hdev->type);
 
 	write_lock_bh(&hci_dev_list_lock);
 	list_del(&hdev->list);
+	empty = list_empty(&hci_dev_list);
 	write_unlock_bh(&hci_dev_list_lock);
-
 	hci_dev_do_close(hdev);
 
 	for (i = 0; i < 3; i++)
@@ -927,7 +930,7 @@ int hci_unregister_dev(struct hci_dev *hdev)
 
 	hci_notify(hdev, HCI_DEV_UNREG);
 
-	hci_unregister_sysfs(hdev);
+	hci_unregister_sysfs(hdev, empty);
 
 	__hci_dev_put(hdev);
 
diff --git a/net/bluetooth/hci_sysfs.c b/net/bluetooth/hci_sysfs.c
index 1a1f916..c7a48d9 100644
--- a/net/bluetooth/hci_sysfs.c
+++ b/net/bluetooth/hci_sysfs.c
@@ -404,7 +404,7 @@ static struct device_type bt_host = {
 	.release = bt_host_release,
 };
 
-int hci_register_sysfs(struct hci_dev *hdev)
+int hci_register_sysfs(struct hci_dev *hdev, bool e)
 {
 	struct device *dev = &hdev->dev;
 	int err;
@@ -423,42 +423,48 @@ int hci_register_sysfs(struct hci_dev *hdev)
 	if (err < 0)
 		return err;
 
+	/* Check if the hci device list only contains a single, new, entry.
+	   If so, setup the workqueues */
+	if (e) {
+		btaddconn = create_singlethread_workqueue("btaddconn");
+		if (!btaddconn) {
+			device_del(&hdev->dev);
+			return -ENOMEM;
+		}
+
+		btdelconn = create_singlethread_workqueue("btdelconn");
+		if (!btdelconn) {
+			device_del(&hdev->dev);
+			destroy_workqueue(btaddconn);
+			return -ENOMEM;
+		}
+	}
 	return 0;
 }
 
-void hci_unregister_sysfs(struct hci_dev *hdev)
+void hci_unregister_sysfs(struct hci_dev *hdev, bool e)
 {
 	BT_DBG("%p name %s type %d", hdev, hdev->name, hdev->type);
 
+	/* Check if there's any hci entries left. If not then its safe
+	   to tear down the workqueues */
+	if (e) {
+		destroy_workqueue(btaddconn);
+		destroy_workqueue(btdelconn);
+	}
 	device_del(&hdev->dev);
 }
 
 int __init bt_sysfs_init(void)
 {
-	btaddconn = create_singlethread_workqueue("btaddconn");
-	if (!btaddconn)
-		return -ENOMEM;
-
-	btdelconn = create_singlethread_workqueue("btdelconn");
-	if (!btdelconn) {
-		destroy_workqueue(btaddconn);
-		return -ENOMEM;
-	}
-
 	bt_class = class_create(THIS_MODULE, "bluetooth");
-	if (IS_ERR(bt_class)) {
-		destroy_workqueue(btdelconn);
-		destroy_workqueue(btaddconn);
+	if (IS_ERR(bt_class))
 		return PTR_ERR(bt_class);
-	}
 
 	return 0;
 }
 
 void bt_sysfs_cleanup(void)
 {
-	destroy_workqueue(btaddconn);
-	destroy_workqueue(btdelconn);
-
 	class_destroy(bt_class);
 }
-- 
1.5.6.3


^ permalink raw reply related	[flat|nested] 104+ messages in thread

* Checkpatch fixes against bluetooth-testing
  2012-03-14 20:05 [Qemu-devel] 5 euros offerts sur votre première commande Claire de Libeedo
                   ` (4 preceding siblings ...)
  2009-03-07 22:10 ` [PATCH 1/2] Propagata hci_register_sysfs() error Erik Andrén
@ 2009-03-09 19:55 ` Erik Andrén
  2009-03-09 19:55   ` [PATCH 1/3] Checkpatch.pl: Fixup hci_conn.c Erik Andrén
  2009-03-14 21:39 ` [PATCH 00/09][Staging] Checkpatch.pl fixes for the agnx driver Erik Andrén
                   ` (9 subsequent siblings)
  15 siblings, 1 reply; 104+ messages in thread
From: Erik Andrén @ 2009-03-09 19:55 UTC (permalink / raw)
  To: linux-bluetooth

Hi, this set of patches fixes issues as pointed out by the checkpatch.pl script.

Best regards,
Erik Andrén


^ permalink raw reply	[flat|nested] 104+ messages in thread

* [PATCH 1/3] Checkpatch.pl: Fixup hci_conn.c
  2009-03-09 19:55 ` Checkpatch fixes against bluetooth-testing Erik Andrén
@ 2009-03-09 19:55   ` Erik Andrén
  2009-03-09 19:55     ` [PATCH 2/3] Checkpatch.pl: Fixup hci_core.c Erik Andrén
  0 siblings, 1 reply; 104+ messages in thread
From: Erik Andrén @ 2009-03-09 19:55 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Erik Andrén

Signed-off-by: Erik Andrén <erik.andren@gmail.com>
---
 net/bluetooth/hci_conn.c |   23 +++++++++++++++--------
 1 files changed, 15 insertions(+), 8 deletions(-)

diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c
index 1181db0..437da1e 100644
--- a/net/bluetooth/hci_conn.c
+++ b/net/bluetooth/hci_conn.c
@@ -36,10 +36,10 @@
 #include <linux/skbuff.h>
 #include <linux/interrupt.h>
 #include <linux/notifier.h>
+#include <linux/uaccess.h>
 #include <net/sock.h>
 
 #include <asm/system.h>
-#include <asm/uaccess.h>
 #include <asm/unaligned.h>
 
 #include <net/bluetooth/bluetooth.h>
@@ -66,7 +66,8 @@ void hci_acl_connect(struct hci_conn *conn)
 	bacpy(&cp.bdaddr, &conn->dst);
 	cp.pscan_rep_mode = 0x02;
 
-	if ((ie = hci_inquiry_cache_lookup(hdev, &conn->dst))) {
+	ie = hci_inquiry_cache_lookup(hdev, &conn->dst);
+	if (ie) {
 		if (inquiry_entry_age(ie) <= INQUIRY_ENTRY_AGE_MAX) {
 			cp.pscan_rep_mode = ie->data.pscan_rep_mode;
 			cp.pscan_mode     = ie->data.pscan_mode;
@@ -341,8 +342,10 @@ struct hci_conn *hci_connect(struct hci_dev *hdev, int type, bdaddr_t *dst, __u8
 
 	BT_DBG("%s dst %s", hdev->name, batostr(dst));
 
-	if (!(acl = hci_conn_hash_lookup_ba(hdev, ACL_LINK, dst))) {
-		if (!(acl = hci_conn_add(hdev, ACL_LINK, dst)))
+	acl = hci_conn_hash_lookup_ba(hdev, ACL_LINK, dst);
+	if (!acl) {
+		acl = hci_conn_add(hdev, ACL_LINK, dst)
+		if (!acl)
 			return NULL;
 	}
 
@@ -357,8 +360,10 @@ struct hci_conn *hci_connect(struct hci_dev *hdev, int type, bdaddr_t *dst, __u8
 	if (type == ACL_LINK)
 		return acl;
 
-	if (!(sco = hci_conn_hash_lookup_ba(hdev, type, dst))) {
-		if (!(sco = hci_conn_add(hdev, type, dst))) {
+	sco = hci_conn_hash_lookup_ba(hdev, type, dst);
+	if (!sco) {
+		sco = hci_conn_add(hdev, type, dst);
+		if (!sco) {
 			hci_conn_put(acl);
 			return NULL;
 		}
@@ -599,10 +604,12 @@ int hci_get_conn_list(void __user *arg)
 
 	size = sizeof(req) + req.conn_num * sizeof(*ci);
 
-	if (!(cl = kmalloc(size, GFP_KERNEL)))
+	cl = kmalloc(size, GFP_KERNEL);
+	if (!cl)
 		return -ENOMEM;
 
-	if (!(hdev = hci_dev_get(req.dev_id))) {
+	hdev = hci_dev_get(req.dev_id);
+	if (!hdev) {
 		kfree(cl);
 		return -ENODEV;
 	}
-- 
1.5.6.3


^ permalink raw reply related	[flat|nested] 104+ messages in thread

* [PATCH 2/3] Checkpatch.pl: Fixup hci_core.c
  2009-03-09 19:55   ` [PATCH 1/3] Checkpatch.pl: Fixup hci_conn.c Erik Andrén
@ 2009-03-09 19:55     ` Erik Andrén
  2009-03-09 19:55       ` [PATCH 3/3] Checkpatch.pl: Fixup hci_event.c Erik Andrén
  0 siblings, 1 reply; 104+ messages in thread
From: Erik Andrén @ 2009-03-09 19:55 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Erik Andrén

Signed-off-by: Erik Andrén <erik.andren@gmail.com>
---
 net/bluetooth/hci_core.c |  102 ++++++++++++++++++++++++++++++---------------
 1 files changed, 68 insertions(+), 34 deletions(-)

diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c
index c21753f..b1a93c4 100644
--- a/net/bluetooth/hci_core.c
+++ b/net/bluetooth/hci_core.c
@@ -39,10 +39,10 @@
 #include <linux/skbuff.h>
 #include <linux/interrupt.h>
 #include <linux/notifier.h>
+#include <linux/uaccess.h>
 #include <net/sock.h>
 
 #include <asm/system.h>
-#include <asm/uaccess.h>
 #include <asm/unaligned.h>
 
 #include <net/bluetooth/bluetooth.h>
@@ -112,8 +112,11 @@ static void hci_req_cancel(struct hci_dev *hdev, int err)
 }
 
 /* Execute request and wait for completion. */
-static int __hci_request(struct hci_dev *hdev, void (*req)(struct hci_dev *hdev, unsigned long opt),
-				unsigned long opt, __u32 timeout)
+static int __hci_request(struct hci_dev *hdev,
+			 void (*req)(struct hci_dev *hdev,
+			 unsigned long opt),
+			 unsigned long opt,
+			 __u32 timeout)
 {
 	DECLARE_WAITQUEUE(wait, current);
 	int err = 0;
@@ -154,8 +157,11 @@ static int __hci_request(struct hci_dev *hdev, void (*req)(struct hci_dev *hdev,
 	return err;
 }
 
-static inline int hci_request(struct hci_dev *hdev, void (*req)(struct hci_dev *hdev, unsigned long opt),
-				unsigned long opt, __u32 timeout)
+static inline int hci_request(struct hci_dev *hdev,
+			      void (*req)(struct hci_dev *hdev,
+			      unsigned long opt),
+			      unsigned long opt,
+			      __u32 timeout)
 {
 	int ret;
 
@@ -330,7 +336,8 @@ static void inquiry_cache_flush(struct hci_dev *hdev)
 	}
 }
 
-struct inquiry_entry *hci_inquiry_cache_lookup(struct hci_dev *hdev, bdaddr_t *bdaddr)
+struct inquiry_entry *hci_inquiry_cache_lookup(struct hci_dev *hdev,
+					       bdaddr_t *bdaddr)
 {
 	struct inquiry_cache *cache = &hdev->inq_cache;
 	struct inquiry_entry *e;
@@ -350,11 +357,13 @@ void hci_inquiry_cache_update(struct hci_dev *hdev, struct inquiry_data *data)
 
 	BT_DBG("cache %p, %s", cache, batostr(&data->bdaddr));
 
-	if (!(e = hci_inquiry_cache_lookup(hdev, &data->bdaddr))) {
+	e = hci_inquiry_cache_lookup(hdev, &data->bdaddr);
+	if (!e) {
 		/* Entry not in the cache. Add new one. */
-		if (!(e = kzalloc(sizeof(struct inquiry_entry), GFP_ATOMIC)))
+		e = kzalloc(sizeof(struct inquiry_entry), GFP_ATOMIC);
+		if (!e)
 			return;
-		e->next     = cache->list;
+		e->next = cache->list;
 		cache->list = e;
 	}
 
@@ -414,7 +423,8 @@ int hci_inquiry(void __user *arg)
 	if (copy_from_user(&ir, ptr, sizeof(ir)))
 		return -EFAULT;
 
-	if (!(hdev = hci_dev_get(ir.dev_id)))
+	hdev = hci_dev_get(ir.dev_id);
+	if (!hdev)
 		return -ENODEV;
 
 	hci_dev_lock_bh(hdev);
@@ -427,16 +437,22 @@ int hci_inquiry(void __user *arg)
 	hci_dev_unlock_bh(hdev);
 
 	timeo = ir.length * msecs_to_jiffies(2000);
-	if (do_inquiry && (err = hci_request(hdev, hci_inq_req, (unsigned long)&ir, timeo)) < 0)
-		goto done;
 
-	/* for unlimited number of responses we will use buffer with 255 entries */
+	if (do_inquiry) {
+		err = hci_request(hdev, hci_inq_req, (unsigned long)&ir, timeo);
+		if (err < 0)
+			goto done;
+	}
+
+	/* for unlimited number of responses
+	   we will use buffer with 255 entries */
 	max_rsp = (ir.num_rsp == 0) ? 255 : ir.num_rsp;
 
 	/* cache_dump can't sleep. Therefore we allocate temp buffer and then
 	 * copy it to the user space.
 	 */
-	if (!(buf = kmalloc(sizeof(struct inquiry_info) * max_rsp, GFP_KERNEL))) {
+	buf = kmalloc(sizeof(struct inquiry_info) * max_rsp, GFP_KERNEL);
+	if (!buf) {
 		err = -ENOMEM;
 		goto done;
 	}
@@ -469,7 +485,8 @@ int hci_dev_open(__u16 dev)
 	struct hci_dev *hdev;
 	int ret = 0;
 
-	if (!(hdev = hci_dev_get(dev)))
+	hdev = hci_dev_get(dev)
+	if (!hdev)
 		return -ENODEV;
 
 	BT_DBG("%s %p", hdev->name, hdev);
@@ -493,7 +510,7 @@ int hci_dev_open(__u16 dev)
 		atomic_set(&hdev->cmd_cnt, 1);
 		set_bit(HCI_INIT, &hdev->flags);
 
-		//__hci_request(hdev, hci_reset_req, 0, HZ);
+		/* __hci_request(hdev, hci_reset_req, 0, HZ); */
 		ret = __hci_request(hdev, hci_init_req, 0,
 					msecs_to_jiffies(HCI_INIT_TIMEOUT));
 
@@ -599,7 +616,8 @@ int hci_dev_close(__u16 dev)
 	struct hci_dev *hdev;
 	int err;
 
-	if (!(hdev = hci_dev_get(dev)))
+	hdev = hci_dev_get(dev);
+	if (!hdev)
 		return -ENODEV;
 	err = hci_dev_do_close(hdev);
 	hci_dev_put(hdev);
@@ -611,7 +629,8 @@ int hci_dev_reset(__u16 dev)
 	struct hci_dev *hdev;
 	int ret = 0;
 
-	if (!(hdev = hci_dev_get(dev)))
+	hdev = hci_dev_get(dev);
+	if (!hdev)
 		return -ENODEV;
 
 	hci_req_lock(hdev);
@@ -651,7 +670,8 @@ int hci_dev_reset_stat(__u16 dev)
 	struct hci_dev *hdev;
 	int ret = 0;
 
-	if (!(hdev = hci_dev_get(dev)))
+	hdev = hci_dev_get(dev);
+	if (!hdev)
 		return -ENODEV;
 
 	memset(&hdev->stat, 0, sizeof(struct hci_dev_stats));
@@ -670,7 +690,8 @@ int hci_dev_cmd(unsigned int cmd, void __user *arg)
 	if (copy_from_user(&dr, arg, sizeof(dr)))
 		return -EFAULT;
 
-	if (!(hdev = hci_dev_get(dr.dev_id)))
+	hdev = hci_dev_get(dr.dev_id);
+	if (!hdev)
 		return -ENODEV;
 
 	switch (cmd) {
@@ -751,7 +772,8 @@ int hci_get_dev_list(void __user *arg)
 
 	size = sizeof(*dl) + dev_num * sizeof(*dr);
 
-	if (!(dl = kzalloc(size, GFP_KERNEL)))
+	dl = kzalloc(size, GFP_KERNEL);
+	if (!dl)
 		return -ENOMEM;
 
 	dr = dl->dev_req;
@@ -785,7 +807,8 @@ int hci_get_dev_info(void __user *arg)
 	if (copy_from_user(&di, arg, sizeof(di)))
 		return -EFAULT;
 
-	if (!(hdev = hci_dev_get(di.dev_id)))
+	hdev = hci_dev_get(di.dev_id);
+	if (!hdev)
 		return -ENODEV;
 
 	strcpy(di.name, hdev->name);
@@ -845,7 +868,8 @@ int hci_register_dev(struct hci_dev *hdev)
 	int i, err, id = 0;
 	bool empty;
 
-	BT_DBG("%p name %s type %d owner %p", hdev, hdev->name, hdev->type, hdev->owner);
+	BT_DBG("%p name %s type %d owner %p", hdev, hdev->name,
+	       hdev->type, hdev->owner);
 
 	if (!hdev->open || !hdev->close || !hdev->destruct)
 		return -EINVAL;
@@ -878,7 +902,7 @@ int hci_register_dev(struct hci_dev *hdev)
 	hdev->sniff_max_interval = 800;
 	hdev->sniff_min_interval = 80;
 
-	tasklet_init(&hdev->cmd_task, hci_cmd_task,(unsigned long) hdev);
+	tasklet_init(&hdev->cmd_task, hci_cmd_task, (unsigned long) hdev);
 	tasklet_init(&hdev->rx_task, hci_rx_task, (unsigned long) hdev);
 	tasklet_init(&hdev->tx_task, hci_tx_task, (unsigned long) hdev);
 
@@ -982,7 +1006,8 @@ int hci_recv_fragment(struct hci_dev *hdev, int type, void *data, int count)
 			case HCI_ACLDATA_PKT:
 				if (count >= HCI_ACL_HDR_SIZE) {
 					struct hci_acl_hdr *h = data;
-					len = HCI_ACL_HDR_SIZE + __le16_to_cpu(h->dlen);
+					len = HCI_ACL_HDR_SIZE +
+							__le16_to_cpu(h->dlen);
 				} else
 					return -EILSEQ;
 				break;
@@ -1208,7 +1233,8 @@ int hci_send_acl(struct hci_conn *conn, struct sk_buff *skb, __u16 flags)
 	bt_cb(skb)->pkt_type = HCI_ACLDATA_PKT;
 	hci_add_acl_hdr(skb, conn->handle, flags | ACL_START);
 
-	if (!(list = skb_shinfo(skb)->frag_list)) {
+	list = skb_shinfo(skb)->frag_list);
+	if (!list) {
 		/* Non fragmented */
 		BT_DBG("%s nonfrag skb %p len %d", hdev->name, skb, skb->len);
 
@@ -1274,7 +1300,8 @@ EXPORT_SYMBOL(hci_send_sco);
 /* ---- HCI TX task (outgoing data) ---- */
 
 /* HCI Connection scheduler */
-static inline struct hci_conn *hci_low_sent(struct hci_dev *hdev, __u8 type, int *quote)
+static inline struct hci_conn *hci_low_sent(struct hci_dev *hdev,
+					    __u8 type, int *quote)
 {
 	struct hci_conn_hash *h = &hdev->conn_hash;
 	struct hci_conn *conn = NULL;
@@ -1342,7 +1369,8 @@ static inline void hci_sched_acl(struct hci_dev *hdev)
 	if (!test_bit(HCI_RAW, &hdev->flags)) {
 		/* ACL tx timeout must be longer than maximum
 		 * link supervision timeout (40.9 seconds) */
-		if (!hdev->acl_cnt && time_after(jiffies, hdev->acl_last_tx + HZ * 45))
+		if (!hdev->acl_cnt &&
+			time_after(jiffies, hdev->acl_last_tx + HZ * 45))
 			hci_acl_tx_to(hdev);
 	}
 
@@ -1390,7 +1418,8 @@ static inline void hci_sched_esco(struct hci_dev *hdev)
 
 	BT_DBG("%s", hdev->name);
 
-	while (hdev->sco_cnt && (conn = hci_low_sent(hdev, ESCO_LINK, &quote))) {
+	while (hdev->sco_cnt &&
+		      (conn = hci_low_sent(hdev, ESCO_LINK, &quote))) {
 		while (quote-- && (skb = skb_dequeue(&conn->data_q))) {
 			BT_DBG("skb %p len %d", skb, skb->len);
 			hci_send_frame(skb);
@@ -1441,7 +1470,8 @@ static inline void hci_acldata_packet(struct hci_dev *hdev, struct sk_buff *skb)
 	flags  = hci_flags(handle);
 	handle = hci_handle(handle);
 
-	BT_DBG("%s len %d handle 0x%x flags 0x%x", hdev->name, skb->len, handle, flags);
+	BT_DBG("%s len %d handle 0x%x flags 0x%x",
+	       hdev->name, skb->len, handle, flags);
 
 	hdev->stat.acl_rx++;
 
@@ -1454,8 +1484,9 @@ static inline void hci_acldata_packet(struct hci_dev *hdev, struct sk_buff *skb)
 
 		hci_conn_enter_active_mode(conn);
 
+		hp = hci_proto[HCI_PROTO_L2CAP];
 		/* Send to upper protocol */
-		if ((hp = hci_proto[HCI_PROTO_L2CAP]) && hp->recv_acldata) {
+		if (hp && hp->recv_acldata) {
 			hp->recv_acldata(conn, skb, flags);
 			return;
 		}
@@ -1490,7 +1521,8 @@ static inline void hci_scodata_packet(struct hci_dev *hdev, struct sk_buff *skb)
 		register struct hci_proto *hp;
 
 		/* Send to upper protocol */
-		if ((hp = hci_proto[HCI_PROTO_SCO]) && hp->recv_scodata) {
+		hp = hci_proto[HCI_PROTO_SCO];
+		if (hp && hp->recv_scodata) {
 			hp->recv_scodata(conn, skb);
 			return;
 		}
@@ -1564,7 +1596,8 @@ static void hci_cmd_task(unsigned long arg)
 
 	BT_DBG("%s cmd %d", hdev->name, atomic_read(&hdev->cmd_cnt));
 
-	if (!atomic_read(&hdev->cmd_cnt) && time_after(jiffies, hdev->cmd_last_tx + HZ)) {
+	if (!atomic_read(&hdev->cmd_cnt) &&
+		    time_after(jiffies, hdev->cmd_last_tx + HZ)) {
 		BT_ERR("%s command tx timeout", hdev->name);
 		atomic_set(&hdev->cmd_cnt, 1);
 	}
@@ -1573,7 +1606,8 @@ static void hci_cmd_task(unsigned long arg)
 	if (atomic_read(&hdev->cmd_cnt) && (skb = skb_dequeue(&hdev->cmd_q))) {
 		kfree_skb(hdev->sent_cmd);
 
-		if ((hdev->sent_cmd = skb_clone(skb, GFP_ATOMIC))) {
+		hdev->sent_cmd = skb_clone(skb, GFP_ATOMIC);
+		if (hdev->sent_cmd) {
 			atomic_dec(&hdev->cmd_cnt);
 			hci_send_frame(skb);
 			hdev->cmd_last_tx = jiffies;
-- 
1.5.6.3


^ permalink raw reply related	[flat|nested] 104+ messages in thread

* [PATCH 3/3] Checkpatch.pl: Fixup hci_event.c
  2009-03-09 19:55     ` [PATCH 2/3] Checkpatch.pl: Fixup hci_core.c Erik Andrén
@ 2009-03-09 19:55       ` Erik Andrén
  0 siblings, 0 replies; 104+ messages in thread
From: Erik Andrén @ 2009-03-09 19:55 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Erik Andrén

Signed-off-by: Erik Andrén <erik.andren@gmail.com>
---
 net/bluetooth/hci_event.c |  172 +++++++++++++++++++++++++++++----------------
 1 files changed, 111 insertions(+), 61 deletions(-)

diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c
index 5553424..25f8fa4 100644
--- a/net/bluetooth/hci_event.c
+++ b/net/bluetooth/hci_event.c
@@ -36,10 +36,10 @@
 #include <linux/skbuff.h>
 #include <linux/interrupt.h>
 #include <linux/notifier.h>
+#include <linux/uaccess.h>
 #include <net/sock.h>
 
 #include <asm/system.h>
-#include <asm/uaccess.h>
 #include <asm/unaligned.h>
 
 #include <net/bluetooth/bluetooth.h>
@@ -77,12 +77,14 @@ static void hci_cc_exit_periodic_inq(struct hci_dev *hdev, struct sk_buff *skb)
 	hci_conn_check_pending(hdev);
 }
 
-static void hci_cc_remote_name_req_cancel(struct hci_dev *hdev, struct sk_buff *skb)
+static void hci_cc_remote_name_req_cancel(struct hci_dev *hdev,
+					  struct sk_buff *skb)
 {
 	BT_DBG("%s", hdev->name);
 }
 
-static void hci_cc_role_discovery(struct hci_dev *hdev, struct sk_buff *skb)
+static void hci_cc_role_discovery(struct hci_dev *hdev,
+				  struct sk_buff *skb)
 {
 	struct hci_rp_role_discovery *rp = (void *) skb->data;
 	struct hci_conn *conn;
@@ -148,7 +150,8 @@ static void hci_cc_write_link_policy(struct hci_dev *hdev, struct sk_buff *skb)
 	hci_dev_unlock(hdev);
 }
 
-static void hci_cc_read_def_link_policy(struct hci_dev *hdev, struct sk_buff *skb)
+static void hci_cc_read_def_link_policy(struct hci_dev *hdev,
+					struct sk_buff *skb)
 {
 	struct hci_rp_read_def_link_policy *rp = (void *) skb->data;
 
@@ -160,7 +163,8 @@ static void hci_cc_read_def_link_policy(struct hci_dev *hdev, struct sk_buff *sk
 	hdev->link_policy = __le16_to_cpu(rp->policy);
 }
 
-static void hci_cc_write_def_link_policy(struct hci_dev *hdev, struct sk_buff *skb)
+static void hci_cc_write_def_link_policy(struct hci_dev *hdev,
+					 struct sk_buff *skb)
 {
 	__u8 status = *((__u8 *) skb->data);
 	void *sent;
@@ -346,7 +350,8 @@ static void hci_cc_read_voice_setting(struct hci_dev *hdev, struct sk_buff *skb)
 	}
 }
 
-static void hci_cc_write_voice_setting(struct hci_dev *hdev, struct sk_buff *skb)
+static void hci_cc_write_voice_setting(struct hci_dev *hdev,
+				       struct sk_buff *skb)
 {
 	__u8 status = *((__u8 *) skb->data);
 	__u16 setting;
@@ -433,7 +438,8 @@ static void hci_cc_read_local_version(struct hci_dev *hdev, struct sk_buff *skb)
 					hdev->hci_ver, hdev->hci_rev);
 }
 
-static void hci_cc_read_local_commands(struct hci_dev *hdev, struct sk_buff *skb)
+static void hci_cc_read_local_commands(struct hci_dev *hdev,
+				       struct sk_buff *skb)
 {
 	struct hci_rp_read_local_commands *rp = (void *) skb->data;
 
@@ -445,7 +451,8 @@ static void hci_cc_read_local_commands(struct hci_dev *hdev, struct sk_buff *skb
 	memcpy(hdev->commands, rp->commands, sizeof(hdev->commands));
 }
 
-static void hci_cc_read_local_features(struct hci_dev *hdev, struct sk_buff *skb)
+static void hci_cc_read_local_features(struct hci_dev *hdev,
+				       struct sk_buff *skb)
 {
 	struct hci_rp_read_local_features *rp = (void *) skb->data;
 
@@ -613,11 +620,14 @@ static void hci_cs_add_sco(struct hci_dev *hdev, __u8 status)
 	hci_dev_lock(hdev);
 
 	acl = hci_conn_hash_lookup_handle(hdev, handle);
-	if (acl && (sco = acl->link)) {
-		sco->state = BT_CLOSED;
+	if (acl) {
+		sco = acl->link;
+		if (sco) {
+			sco->state = BT_CLOSED;
 
-		hci_proto_connect_cfm(sco, status);
-		hci_conn_del(sco);
+			hci_proto_connect_cfm(sco, status);
+			hci_conn_del(sco);
+		}
 	}
 
 	hci_dev_unlock(hdev);
@@ -758,11 +768,14 @@ static void hci_cs_setup_sync_conn(struct hci_dev *hdev, __u8 status)
 	hci_dev_lock(hdev);
 
 	acl = hci_conn_hash_lookup_handle(hdev, handle);
-	if (acl && (sco = acl->link)) {
-		sco->state = BT_CLOSED;
+	if (acl) {
+		sco = acl->link;
+		if (sco) {
+			sco->state = BT_CLOSED;
 
-		hci_proto_connect_cfm(sco, status);
-		hci_conn_del(sco);
+			hci_proto_connect_cfm(sco, status);
+			hci_conn_del(sco);
+		}
 	}
 
 	hci_dev_unlock(hdev);
@@ -814,7 +827,8 @@ static void hci_cs_exit_sniff_mode(struct hci_dev *hdev, __u8 status)
 	hci_dev_unlock(hdev);
 }
 
-static inline void hci_inquiry_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
+static inline void hci_inquiry_complete_evt(struct hci_dev *hdev,
+					    struct sk_buff *skb)
 {
 	__u8 status = *((__u8 *) skb->data);
 
@@ -827,7 +841,8 @@ static inline void hci_inquiry_complete_evt(struct hci_dev *hdev, struct sk_buff
 	hci_conn_check_pending(hdev);
 }
 
-static inline void hci_inquiry_result_evt(struct hci_dev *hdev, struct sk_buff *skb)
+static inline void hci_inquiry_result_evt(struct hci_dev *hdev,
+					  struct sk_buff *skb)
 {
 	struct inquiry_data data;
 	struct inquiry_info *info = (void *) (skb->data + 1);
@@ -856,7 +871,8 @@ static inline void hci_inquiry_result_evt(struct hci_dev *hdev, struct sk_buff *
 	hci_dev_unlock(hdev);
 }
 
-static inline void hci_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
+static inline void hci_conn_complete_evt(struct hci_dev *hdev,
+					 struct sk_buff *skb)
 {
 	struct hci_ev_conn_complete *ev = (void *) skb->data;
 	struct hci_conn *conn;
@@ -932,7 +948,8 @@ unlock:
 	hci_conn_check_pending(hdev);
 }
 
-static inline void hci_conn_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
+static inline void hci_conn_request_evt(struct hci_dev *hdev,
+					struct sk_buff *skb)
 {
 	struct hci_ev_conn_request *ev = (void *) skb->data;
 	int mask = hdev->link_mode;
@@ -949,12 +966,15 @@ static inline void hci_conn_request_evt(struct hci_dev *hdev, struct sk_buff *sk
 
 		hci_dev_lock(hdev);
 
-		if ((ie = hci_inquiry_cache_lookup(hdev, &ev->bdaddr)))
+		ie = hci_inquiry_cache_lookup(hdev, &ev->bdaddr);
+		if (ie)
 			memcpy(ie->data.dev_class, ev->dev_class, 3);
 
-		conn = hci_conn_hash_lookup_ba(hdev, ev->link_type, &ev->bdaddr);
+		conn = hci_conn_hash_lookup_ba(hdev,
+					       ev->link_type, &ev->bdaddr);
 		if (!conn) {
-			if (!(conn = hci_conn_add(hdev, ev->link_type, &ev->bdaddr))) {
+			conn = hci_conn_add(hdev, ev->link_type, &ev->bdaddr)
+			if (!conn) {
 				BT_ERR("No memmory for new connection");
 				hci_dev_unlock(hdev);
 				return;
@@ -1003,7 +1023,8 @@ static inline void hci_conn_request_evt(struct hci_dev *hdev, struct sk_buff *sk
 	}
 }
 
-static inline void hci_disconn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
+static inline void hci_disconn_complete_evt(struct hci_dev *hdev,
+					    struct sk_buff *skb)
 {
 	struct hci_ev_disconn_complete *ev = (void *) skb->data;
 	struct hci_conn *conn;
@@ -1026,7 +1047,8 @@ static inline void hci_disconn_complete_evt(struct hci_dev *hdev, struct sk_buff
 	hci_dev_unlock(hdev);
 }
 
-static inline void hci_auth_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
+static inline void hci_auth_complete_evt(struct hci_dev *hdev,
+					 struct sk_buff *skb)
 {
 	struct hci_ev_auth_complete *ev = (void *) skb->data;
 	struct hci_conn *conn;
@@ -1075,14 +1097,16 @@ static inline void hci_auth_complete_evt(struct hci_dev *hdev, struct sk_buff *s
 	hci_dev_unlock(hdev);
 }
 
-static inline void hci_remote_name_evt(struct hci_dev *hdev, struct sk_buff *skb)
+static inline void hci_remote_name_evt(struct hci_dev *hdev,
+				       struct sk_buff *skb)
 {
 	BT_DBG("%s", hdev->name);
 
 	hci_conn_check_pending(hdev);
 }
 
-static inline void hci_encrypt_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
+static inline void hci_encrypt_change_evt(struct hci_dev *hdev,
+					  struct sk_buff *skb)
 {
 	struct hci_ev_encrypt_change *ev = (void *) skb->data;
 	struct hci_conn *conn;
@@ -1117,7 +1141,8 @@ static inline void hci_encrypt_change_evt(struct hci_dev *hdev, struct sk_buff *
 	hci_dev_unlock(hdev);
 }
 
-static inline void hci_change_link_key_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
+static inline void hci_change_link_key_complete_evt(struct hci_dev *hdev,
+						    struct sk_buff *skb)
 {
 	struct hci_ev_change_link_key_complete *ev = (void *) skb->data;
 	struct hci_conn *conn;
@@ -1139,7 +1164,8 @@ static inline void hci_change_link_key_complete_evt(struct hci_dev *hdev, struct
 	hci_dev_unlock(hdev);
 }
 
-static inline void hci_remote_features_evt(struct hci_dev *hdev, struct sk_buff *skb)
+static inline void hci_remote_features_evt(struct hci_dev *hdev,
+					   struct sk_buff *skb)
 {
 	struct hci_ev_remote_features *ev = (void *) skb->data;
 	struct hci_conn *conn;
@@ -1173,17 +1199,20 @@ static inline void hci_remote_features_evt(struct hci_dev *hdev, struct sk_buff
 	hci_dev_unlock(hdev);
 }
 
-static inline void hci_remote_version_evt(struct hci_dev *hdev, struct sk_buff *skb)
+static inline void hci_remote_version_evt(struct hci_dev *hdev,
+					  struct sk_buff *skb)
 {
 	BT_DBG("%s", hdev->name);
 }
 
-static inline void hci_qos_setup_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
+static inline void hci_qos_setup_complete_evt(struct hci_dev *hdev,
+					      struct sk_buff *skb)
 {
 	BT_DBG("%s", hdev->name);
 }
 
-static inline void hci_cmd_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
+static inline void hci_cmd_complete_evt(struct hci_dev *hdev,
+					struct sk_buff *skb)
 {
 	struct hci_ev_cmd_complete *ev = (void *) skb->data;
 	__u16 opcode;
@@ -1375,7 +1404,8 @@ static inline void hci_cmd_status_evt(struct hci_dev *hdev, struct sk_buff *skb)
 	}
 }
 
-static inline void hci_role_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
+static inline void hci_role_change_evt(struct hci_dev *hdev,
+				       struct sk_buff *skb)
 {
 	struct hci_ev_role_change *ev = (void *) skb->data;
 	struct hci_conn *conn;
@@ -1401,7 +1431,8 @@ static inline void hci_role_change_evt(struct hci_dev *hdev, struct sk_buff *skb
 	hci_dev_unlock(hdev);
 }
 
-static inline void hci_num_comp_pkts_evt(struct hci_dev *hdev, struct sk_buff *skb)
+static inline void hci_num_comp_pkts_evt(struct hci_dev *hdev,
+					 struct sk_buff *skb)
 {
 	struct hci_ev_num_comp_pkts *ev = (void *) skb->data;
 	__le16 *ptr;
@@ -1430,10 +1461,12 @@ static inline void hci_num_comp_pkts_evt(struct hci_dev *hdev, struct sk_buff *s
 			conn->sent -= count;
 
 			if (conn->type == ACL_LINK) {
-				if ((hdev->acl_cnt += count) > hdev->acl_pkts)
+				hdev->acl_cnt += count;
+				if (hdev->acl_cnt > hdev->acl_pkts)
 					hdev->acl_cnt = hdev->acl_pkts;
 			} else {
-				if ((hdev->sco_cnt += count) > hdev->sco_pkts)
+				hdev->sco_cnt += count;
+				if (hdev->sco_cnt > hdev->sco_pkts)
 					hdev->sco_cnt = hdev->sco_pkts;
 			}
 		}
@@ -1444,7 +1477,8 @@ static inline void hci_num_comp_pkts_evt(struct hci_dev *hdev, struct sk_buff *s
 	tasklet_enable(&hdev->tx_task);
 }
 
-static inline void hci_mode_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
+static inline void hci_mode_change_evt(struct hci_dev *hdev,
+				       struct sk_buff *skb)
 {
 	struct hci_ev_mode_change *ev = (void *) skb->data;
 	struct hci_conn *conn;
@@ -1469,22 +1503,26 @@ static inline void hci_mode_change_evt(struct hci_dev *hdev, struct sk_buff *skb
 	hci_dev_unlock(hdev);
 }
 
-static inline void hci_pin_code_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
+static inline void hci_pin_code_request_evt(struct hci_dev *hdev,
+					    struct sk_buff *skb)
 {
 	BT_DBG("%s", hdev->name);
 }
 
-static inline void hci_link_key_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
+static inline void hci_link_key_request_evt(struct hci_dev *hdev,
+					    struct sk_buff *skb)
 {
 	BT_DBG("%s", hdev->name);
 }
 
-static inline void hci_link_key_notify_evt(struct hci_dev *hdev, struct sk_buff *skb)
+static inline void hci_link_key_notify_evt(struct hci_dev *hdev,
+					   struct sk_buff *skb)
 {
 	BT_DBG("%s", hdev->name);
 }
 
-static inline void hci_clock_offset_evt(struct hci_dev *hdev, struct sk_buff *skb)
+static inline void hci_clock_offset_evt(struct hci_dev *hdev,
+					struct sk_buff *skb)
 {
 	struct hci_ev_clock_offset *ev = (void *) skb->data;
 	struct hci_conn *conn;
@@ -1496,8 +1534,8 @@ static inline void hci_clock_offset_evt(struct hci_dev *hdev, struct sk_buff *sk
 	conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
 	if (conn && !ev->status) {
 		struct inquiry_entry *ie;
-
-		if ((ie = hci_inquiry_cache_lookup(hdev, &conn->dst))) {
+		ie = hci_inquiry_cache_lookup(hdev, &conn->dst);
+		if (ie) {
 			ie->data.clock_offset = ev->clock_offset;
 			ie->timestamp = jiffies;
 		}
@@ -1506,7 +1544,8 @@ static inline void hci_clock_offset_evt(struct hci_dev *hdev, struct sk_buff *sk
 	hci_dev_unlock(hdev);
 }
 
-static inline void hci_pkt_type_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
+static inline void hci_pkt_type_change_evt(struct hci_dev *hdev,
+					   struct sk_buff *skb)
 {
 	struct hci_ev_pkt_type_change *ev = (void *) skb->data;
 	struct hci_conn *conn;
@@ -1522,7 +1561,8 @@ static inline void hci_pkt_type_change_evt(struct hci_dev *hdev, struct sk_buff
 	hci_dev_unlock(hdev);
 }
 
-static inline void hci_pscan_rep_mode_evt(struct hci_dev *hdev, struct sk_buff *skb)
+static inline void hci_pscan_rep_mode_evt(struct hci_dev *hdev,
+					  struct sk_buff *skb)
 {
 	struct hci_ev_pscan_rep_mode *ev = (void *) skb->data;
 	struct inquiry_entry *ie;
@@ -1531,7 +1571,8 @@ static inline void hci_pscan_rep_mode_evt(struct hci_dev *hdev, struct sk_buff *
 
 	hci_dev_lock(hdev);
 
-	if ((ie = hci_inquiry_cache_lookup(hdev, &ev->bdaddr))) {
+	ie = hci_inquiry_cache_lookup(hdev, &ev->bdaddr);
+	if (ie) {
 		ie->data.pscan_rep_mode = ev->pscan_rep_mode;
 		ie->timestamp = jiffies;
 	}
@@ -1539,7 +1580,8 @@ static inline void hci_pscan_rep_mode_evt(struct hci_dev *hdev, struct sk_buff *
 	hci_dev_unlock(hdev);
 }
 
-static inline void hci_inquiry_result_with_rssi_evt(struct hci_dev *hdev, struct sk_buff *skb)
+static inline void hci_inquiry_result_with_rssi_evt(struct hci_dev *hdev,
+						    struct sk_buff *skb)
 {
 	struct inquiry_data data;
 	int num_rsp = *((__u8 *) skb->data);
@@ -1552,7 +1594,8 @@ static inline void hci_inquiry_result_with_rssi_evt(struct hci_dev *hdev, struct
 	hci_dev_lock(hdev);
 
 	if ((skb->len - 1) / num_rsp != sizeof(struct inquiry_info_with_rssi)) {
-		struct inquiry_info_with_rssi_and_pscan_mode *info = (void *) (skb->data + 1);
+		struct inquiry_info_with_rssi_and_pscan_mode *info =
+				(void *) (skb->data + 1);
 
 		for (; num_rsp; num_rsp--) {
 			bacpy(&data.bdaddr, &info->bdaddr);
@@ -1586,7 +1629,8 @@ static inline void hci_inquiry_result_with_rssi_evt(struct hci_dev *hdev, struct
 	hci_dev_unlock(hdev);
 }
 
-static inline void hci_remote_ext_features_evt(struct hci_dev *hdev, struct sk_buff *skb)
+static inline void hci_remote_ext_features_evt(struct hci_dev *hdev,
+					       struct sk_buff *skb)
 {
 	struct hci_ev_remote_ext_features *ev = (void *) skb->data;
 	struct hci_conn *conn;
@@ -1599,8 +1643,8 @@ static inline void hci_remote_ext_features_evt(struct hci_dev *hdev, struct sk_b
 	if (conn) {
 		if (!ev->status && ev->page == 0x01) {
 			struct inquiry_entry *ie;
-
-			if ((ie = hci_inquiry_cache_lookup(hdev, &conn->dst)))
+			ie = hci_inquiry_cache_lookup(hdev, &conn->dst);
+			if (ie)
 				ie->data.ssp_mode = (ev->features[0] & 0x01);
 
 			conn->ssp_mode = (ev->features[0] & 0x01);
@@ -1625,7 +1669,8 @@ static inline void hci_remote_ext_features_evt(struct hci_dev *hdev, struct sk_b
 	hci_dev_unlock(hdev);
 }
 
-static inline void hci_sync_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
+static inline void hci_sync_conn_complete_evt(struct hci_dev *hdev,
+					      struct sk_buff *skb)
 {
 	struct hci_ev_sync_conn_complete *ev = (void *) skb->data;
 	struct hci_conn *conn;
@@ -1669,12 +1714,14 @@ unlock:
 	hci_dev_unlock(hdev);
 }
 
-static inline void hci_sync_conn_changed_evt(struct hci_dev *hdev, struct sk_buff *skb)
+static inline void hci_sync_conn_changed_evt(struct hci_dev *hdev,
+					     struct sk_buff *skb)
 {
 	BT_DBG("%s", hdev->name);
 }
 
-static inline void hci_sniff_subrate_evt(struct hci_dev *hdev, struct sk_buff *skb)
+static inline void hci_sniff_subrate_evt(struct hci_dev *hdev,
+					 struct sk_buff *skb)
 {
 	struct hci_ev_sniff_subrate *ev = (void *) skb->data;
 	struct hci_conn *conn;
@@ -1684,13 +1731,12 @@ static inline void hci_sniff_subrate_evt(struct hci_dev *hdev, struct sk_buff *s
 	hci_dev_lock(hdev);
 
 	conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
-	if (conn) {
-	}
 
 	hci_dev_unlock(hdev);
 }
 
-static inline void hci_extended_inquiry_result_evt(struct hci_dev *hdev, struct sk_buff *skb)
+static inline void hci_extended_inquiry_result_evt(struct hci_dev *hdev,
+						   struct sk_buff *skb)
 {
 	struct inquiry_data data;
 	struct extended_inquiry_info *info = (void *) (skb->data + 1);
@@ -1719,7 +1765,8 @@ static inline void hci_extended_inquiry_result_evt(struct hci_dev *hdev, struct
 	hci_dev_unlock(hdev);
 }
 
-static inline void hci_io_capa_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
+static inline void hci_io_capa_request_evt(struct hci_dev *hdev,
+					   struct sk_buff *skb)
 {
 	struct hci_ev_io_capa_request *ev = (void *) skb->data;
 	struct hci_conn *conn;
@@ -1735,7 +1782,8 @@ static inline void hci_io_capa_request_evt(struct hci_dev *hdev, struct sk_buff
 	hci_dev_unlock(hdev);
 }
 
-static inline void hci_simple_pair_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
+static inline void hci_simple_pair_complete_evt(struct hci_dev *hdev,
+						struct sk_buff *skb)
 {
 	struct hci_ev_simple_pair_complete *ev = (void *) skb->data;
 	struct hci_conn *conn;
@@ -1751,7 +1799,8 @@ static inline void hci_simple_pair_complete_evt(struct hci_dev *hdev, struct sk_
 	hci_dev_unlock(hdev);
 }
 
-static inline void hci_remote_host_features_evt(struct hci_dev *hdev, struct sk_buff *skb)
+static inline void hci_remote_host_features_evt(struct hci_dev *hdev,
+						struct sk_buff *skb)
 {
 	struct hci_ev_remote_host_features *ev = (void *) skb->data;
 	struct inquiry_entry *ie;
@@ -1760,7 +1809,8 @@ static inline void hci_remote_host_features_evt(struct hci_dev *hdev, struct sk_
 
 	hci_dev_lock(hdev);
 
-	if ((ie = hci_inquiry_cache_lookup(hdev, &ev->bdaddr)))
+	ie = hci_inquiry_cache_lookup(hdev, &ev->bdaddr);
+	if (ie)
 		ie->data.ssp_mode = (ev->features[0] & 0x01);
 
 	hci_dev_unlock(hdev);
-- 
1.5.6.3


^ permalink raw reply related	[flat|nested] 104+ messages in thread

* [PATCH 00/09][Staging] Checkpatch.pl fixes for the agnx driver
  2012-03-14 20:05 [Qemu-devel] 5 euros offerts sur votre première commande Claire de Libeedo
                   ` (5 preceding siblings ...)
  2009-03-09 19:55 ` Checkpatch fixes against bluetooth-testing Erik Andrén
@ 2009-03-14 21:39 ` Erik Andrén
  2009-03-14 21:39   ` [PATCH 01/09] Checkpatch.pl: Fixup agnx.h Erik Andrén
  2009-03-19 20:47 ` [Staging] Checkpatch fixes for altpciechdma Erik Andrén
                   ` (8 subsequent siblings)
  15 siblings, 1 reply; 104+ messages in thread
From: Erik Andrén @ 2009-03-14 21:39 UTC (permalink / raw)
  To: greg; +Cc: linux-kernel

Hi,
The following patchset fixes a number of issues as pointed out by the checkpatch.pl script.

Best regards,
Erik Andrén



^ permalink raw reply	[flat|nested] 104+ messages in thread

* [PATCH 01/09] Checkpatch.pl: Fixup agnx.h
  2009-03-14 21:39 ` [PATCH 00/09][Staging] Checkpatch.pl fixes for the agnx driver Erik Andrén
@ 2009-03-14 21:39   ` Erik Andrén
  2009-03-14 21:39     ` [PATCH 02/09] Checkpatch.pl: Fixup debug.h Erik Andrén
  0 siblings, 1 reply; 104+ messages in thread
From: Erik Andrén @ 2009-03-14 21:39 UTC (permalink / raw)
  To: greg; +Cc: linux-kernel, Erik Andrén

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain, Size: 1728 bytes --]

Signed-off-by: Erik Andrén <erik.andren@gmail.com>
---
 drivers/staging/agnx/agnx.h |   14 +++++++-------
 1 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/drivers/staging/agnx/agnx.h b/drivers/staging/agnx/agnx.h
index 20f36da..9b5fc6c 100644
--- a/drivers/staging/agnx/agnx.h
+++ b/drivers/staging/agnx/agnx.h
@@ -41,16 +41,16 @@ static const struct ieee80211_rate agnx_rates_80211g[] = {
 /* 	{ .bitrate = 20, .hw_value = 2, .flags = IEEE80211_RATE_SHORT_PREAMBLE }, */
 /* 	{ .bitrate = 55, .hw_value = 3, .flags = IEEE80211_RATE_SHORT_PREAMBLE }, */
 /* 	{ .bitrate = 110, .hw_value = 4, .flags = IEEE80211_RATE_SHORT_PREAMBLE }, */
- 	{ .bitrate = 10, .hw_value = 1, },
- 	{ .bitrate = 20, .hw_value = 2, },
- 	{ .bitrate = 55, .hw_value = 3, },
- 	{ .bitrate = 110, .hw_value = 4,},
+	{ .bitrate = 10, .hw_value = 1, },
+	{ .bitrate = 20, .hw_value = 2, },
+	{ .bitrate = 55, .hw_value = 3, },
+	{ .bitrate = 110, .hw_value = 4,},
 
 	{ .bitrate = 60, .hw_value = 0xB, },
 	{ .bitrate = 90, .hw_value = 0xF, },
 	{ .bitrate = 120, .hw_value = 0xA },
 	{ .bitrate = 180, .hw_value = 0xE, },
-//	{ .bitrate = 240, .hw_value = 0xd, },
+/*	{ .bitrate = 240, .hw_value = 0xd, }, */
 	{ .bitrate = 360, .hw_value = 0xD, },
 	{ .bitrate = 480, .hw_value = 0x8, },
 	{ .bitrate = 540, .hw_value = 0xC, },
@@ -110,10 +110,10 @@ struct agnx_priv {
 	/* Need volatile? */
 	u32 irq_status;
 
-        struct delayed_work periodic_work; /* Periodic tasks like recalibrate*/
+	struct delayed_work periodic_work; /* Periodic tasks like recalibrate */
 	struct ieee80211_low_level_stats stats;
 
-//        unsigned int phymode;
+	/* unsigned int phymode; */
 	int mode;
 	int channel;
 	u8 bssid[ETH_ALEN];
-- 
1.6.0.4


^ permalink raw reply related	[flat|nested] 104+ messages in thread

* [PATCH 02/09] Checkpatch.pl: Fixup debug.h
  2009-03-14 21:39   ` [PATCH 01/09] Checkpatch.pl: Fixup agnx.h Erik Andrén
@ 2009-03-14 21:39     ` Erik Andrén
  2009-03-14 21:39       ` [PATCH 03/09] Checkpatch.pl: Fixup pci.c Erik Andrén
  0 siblings, 1 reply; 104+ messages in thread
From: Erik Andrén @ 2009-03-14 21:39 UTC (permalink / raw)
  To: greg; +Cc: linux-kernel, Erik Andrén

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain, Size: 3051 bytes --]

Signed-off-by: Erik Andrén <erik.andren@gmail.com>
---
 drivers/staging/agnx/debug.h |   21 ++++++++++-----------
 1 files changed, 10 insertions(+), 11 deletions(-)

diff --git a/drivers/staging/agnx/debug.h b/drivers/staging/agnx/debug.h
index e3e25dd..761d99c 100644
--- a/drivers/staging/agnx/debug.h
+++ b/drivers/staging/agnx/debug.h
@@ -23,7 +23,7 @@ static inline void agnx_bug(char *reason)
 
 static inline void agnx_print_desc(struct agnx_desc *desc)
 {
-        u32 reg = be32_to_cpu(desc->frag);
+	u32 reg = be32_to_cpu(desc->frag);
 
 	PRINTK_BITS(DESC, PACKET_LEN);
 
@@ -291,7 +291,7 @@ static inline void agnx_print_sta(struct agnx_priv *priv, unsigned int sta_idx)
 	PRINTK_LE32(STA, sta->phy_stats_high);
 	PRINTK_LE32(STA, sta->phy_stats_low);
 
-//	for (i = 0; i < 8; i++)
+	/* for (i = 0; i < 8; i++) */
 	agnx_print_sta_traffic(sta->traffic + 0);
 
 	PRINTK_LE16(STA, sta->traffic_class0_frag_success);
@@ -311,10 +311,10 @@ static inline void agnx_print_sta(struct agnx_priv *priv, unsigned int sta_idx)
 static inline void dump_ieee80211_hdr(struct ieee80211_hdr *hdr, char *tag)
 {
 	u16 fctl;
-        int hdrlen;
+	int hdrlen;
 	DECLARE_MAC_BUF(mac);
 
-        fctl = le16_to_cpu(hdr->frame_control);
+	fctl = le16_to_cpu(hdr->frame_control);
 	switch (fctl & IEEE80211_FCTL_FTYPE) {
 	case IEEE80211_FTYPE_DATA:
 		printk(PFX "%s DATA ", tag);
@@ -324,7 +324,7 @@ static inline void dump_ieee80211_hdr(struct ieee80211_hdr *hdr, char *tag)
 		break;
 	case IEEE80211_FTYPE_MGMT:
 		printk(PFX "%s MGMT ", tag);
-		switch(fctl & IEEE80211_FCTL_STYPE) {
+		switch (fctl & IEEE80211_FCTL_STYPE) {
 		case IEEE80211_STYPE_ASSOC_REQ:
 			printk("SubType: ASSOC_REQ ");
 			break;
@@ -369,7 +369,7 @@ static inline void dump_ieee80211_hdr(struct ieee80211_hdr *hdr, char *tag)
 		printk(PFX "%s Packet type: Unknow\n", tag);
 	}
 
-        hdrlen = ieee80211_hdrlen(fctl);
+	hdrlen = ieee80211_hdrlen(fctl);
 
 	if (hdrlen >= 4)
 		printk("FC=0x%04x DUR=0x%04x",
@@ -389,29 +389,28 @@ static inline void dump_txm_registers(struct agnx_priv *priv)
 {
 	void __iomem *ctl = priv->ctl;
 	int i;
-	for (i = 0; i <=0x1e8; i += 4) {
+	for (i = 0; i <= 0x1e8; i += 4)
 		printk(KERN_DEBUG PFX "TXM: %x---> 0x%.8x\n", i, ioread32(ctl + i));
-	}
 }
 static inline void dump_rxm_registers(struct agnx_priv *priv)
 {
 	void __iomem *ctl = priv->ctl;
 	int i;
-	for (i = 0; i <=0x108; i += 4)
+	for (i = 0; i <= 0x108; i += 4)
 		printk(KERN_DEBUG PFX "RXM: %x---> 0x%.8x\n", i, ioread32(ctl + 0x2000 + i));
 }
 static inline void dump_bm_registers(struct agnx_priv *priv)
 {
 	void __iomem *ctl = priv->ctl;
 	int i;
-	for (i = 0; i <=0x90; i += 4)
+	for (i = 0; i <= 0x90; i += 4)
 		printk(KERN_DEBUG PFX "BM: %x---> 0x%.8x\n", i, ioread32(ctl + 0x2c00 + i));
 }
 static inline void dump_cir_registers(struct agnx_priv *priv)
 {
 	void __iomem *ctl = priv->ctl;
 	int i;
-	for (i = 0; i <=0xb8; i += 4)
+	for (i = 0; i <= 0xb8; i += 4)
 		printk(KERN_DEBUG PFX "CIR: %x---> 0x%.8x\n", i, ioread32(ctl + 0x3000 + i));
 }
 
-- 
1.6.0.4


^ permalink raw reply related	[flat|nested] 104+ messages in thread

* [PATCH 03/09] Checkpatch.pl: Fixup pci.c
  2009-03-14 21:39     ` [PATCH 02/09] Checkpatch.pl: Fixup debug.h Erik Andrén
@ 2009-03-14 21:39       ` Erik Andrén
  2009-03-14 21:39         ` [PATCH 04/09] Checkpatch.pl: Fixup phy.c Erik Andrén
  0 siblings, 1 reply; 104+ messages in thread
From: Erik Andrén @ 2009-03-14 21:39 UTC (permalink / raw)
  To: greg; +Cc: linux-kernel, Erik Andrén

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain, Size: 6512 bytes --]

Signed-off-by: Erik Andrén <erik.andren@gmail.com>
---
 drivers/staging/agnx/pci.c |   68 +++++++++++++++++++++----------------------
 1 files changed, 33 insertions(+), 35 deletions(-)

diff --git a/drivers/staging/agnx/pci.c b/drivers/staging/agnx/pci.c
index 854630c..97bbf60 100644
--- a/drivers/staging/agnx/pci.c
+++ b/drivers/staging/agnx/pci.c
@@ -39,34 +39,34 @@ static inline void agnx_interrupt_ack(struct agnx_priv *priv, u32 *reason)
 	void __iomem *ctl = priv->ctl;
 	u32 reg;
 
-	if ( *reason & AGNX_STAT_RX ) {
+	if (*reason & AGNX_STAT_RX) {
 		/* Mark complete RX */
 		reg = ioread32(ctl + AGNX_CIR_RXCTL);
 		reg |= 0x4;
 		iowrite32(reg, ctl + AGNX_CIR_RXCTL);
 		/* disable Rx interrupt */
 	}
-	if ( *reason & AGNX_STAT_TX ) {
+	if (*reason & AGNX_STAT_TX) {
 		reg = ioread32(ctl + AGNX_CIR_TXDCTL);
 		if (reg & 0x4) {
 			iowrite32(reg, ctl + AGNX_CIR_TXDCTL);
 			*reason |= AGNX_STAT_TXD;
 		}
- 		reg = ioread32(ctl + AGNX_CIR_TXMCTL);
+		reg = ioread32(ctl + AGNX_CIR_TXMCTL);
 		if (reg & 0x4) {
 			iowrite32(reg, ctl + AGNX_CIR_TXMCTL);
 			*reason |= AGNX_STAT_TXM;
 		}
 	}
-	if ( *reason & AGNX_STAT_X ) {
-/* 		reg = ioread32(ctl + AGNX_INT_STAT); */
-/* 		iowrite32(reg, ctl + AGNX_INT_STAT); */
-/* 		/\* FIXME reinit interrupt mask *\/ */
-/* 		reg = 0xc390bf9 & ~IRQ_TX_BEACON; */
-/* 		reg &= ~IRQ_TX_DISABLE; */
-/* 		iowrite32(reg, ctl + AGNX_INT_MASK); */
-/* 		iowrite32(0x800, ctl + AGNX_CIR_BLKCTL); */
-	}
+/*	if (*reason & AGNX_STAT_X) {
+		reg = ioread32(ctl + AGNX_INT_STAT);
+		iowrite32(reg, ctl + AGNX_INT_STAT);
+		/* FIXME reinit interrupt mask *\/
+		reg = 0xc390bf9 & ~IRQ_TX_BEACON;
+		reg &= ~IRQ_TX_DISABLE;
+		iowrite32(reg, ctl + AGNX_INT_MASK);
+		iowrite32(0x800, ctl + AGNX_CIR_BLKCTL);
+	} */
 } /* agnx_interrupt_ack */
 
 static irqreturn_t agnx_interrupt_handler(int irq, void *dev_id)
@@ -79,7 +79,7 @@ static irqreturn_t agnx_interrupt_handler(int irq, void *dev_id)
 
 	spin_lock(&priv->lock);
 
-//	printk(KERN_ERR PFX "Get a interrupt %s\n", __func__);
+/*	printk(KERN_ERR PFX "Get a interrupt %s\n", __func__); */
 
 	if (priv->init_status != AGNX_START)
 		goto out;
@@ -92,7 +92,7 @@ static irqreturn_t agnx_interrupt_handler(int irq, void *dev_id)
 	ret = IRQ_HANDLED;
 	priv->irq_status = ioread32(ctl + AGNX_INT_STAT);
 
-//	printk(PFX "Interrupt reason is 0x%x\n", irq_reason);
+/*	printk(PFX "Interrupt reason is 0x%x\n", irq_reason); */
 	/* Make sure the txm and txd flags don't conflict with other unknown
 	   interrupt flag, maybe is not necessary */
 	irq_reason &= 0xF;
@@ -101,13 +101,13 @@ static irqreturn_t agnx_interrupt_handler(int irq, void *dev_id)
 	/* TODO Make sure the card finished initialized */
 	agnx_interrupt_ack(priv, &irq_reason);
 
-	if ( irq_reason & AGNX_STAT_RX )
+	if (irq_reason & AGNX_STAT_RX)
 		handle_rx_irq(priv);
-	if ( irq_reason & AGNX_STAT_TXD )
+	if (irq_reason & AGNX_STAT_TXD)
 		handle_txd_irq(priv);
-	if ( irq_reason & AGNX_STAT_TXM )
+	if (irq_reason & AGNX_STAT_TXM)
 		handle_txm_irq(priv);
-	if ( irq_reason & AGNX_STAT_X )
+	if (irq_reason & AGNX_STAT_X)
 		handle_other_irq(priv);
 
 	enable_rx_interrupt(priv);
@@ -171,7 +171,7 @@ static int agnx_alloc_rings(struct agnx_priv *priv)
 
 	len = priv->rx.size + priv->txm.size + priv->txd.size;
 
-//	priv->rx.info = kzalloc(sizeof(struct agnx_info) * len, GFP_KERNEL);
+/*	priv->rx.info = kzalloc(sizeof(struct agnx_info) * len, GFP_KERNEL); */
 	priv->rx.info = kzalloc(sizeof(struct agnx_info) * len, GFP_ATOMIC);
 	if (!priv->rx.info)
 		return -ENOMEM;
@@ -210,28 +210,27 @@ static void rings_free(struct agnx_priv *priv)
 #if 0
 static void agnx_periodic_work_handler(struct work_struct *work)
 {
-	struct agnx_priv *priv = container_of(work, struct agnx_priv,
-                                             periodic_work.work);
-//	unsigned long flags;
+	struct agnx_priv *priv = container_of(work, struct agnx_priv, periodic_work.work);
+/*	unsigned long flags; */
 	unsigned long delay;
 
 	/* fixme: using mutex?? */
-//	spin_lock_irqsave(&priv->lock, flags);
+/*	spin_lock_irqsave(&priv->lock, flags); */
 
 	/* TODO Recalibrate*/
-//	calibrate_oscillator(priv);
-//	antenna_calibrate(priv);
-//	agnx_send_packet(priv, 997);
+/*	calibrate_oscillator(priv); */
+/*	antenna_calibrate(priv); */
+/*	agnx_send_packet(priv, 997); /
 	/* FIXME */
 /* 	if (debug == 3) */
 /*                 delay = msecs_to_jiffies(AGNX_PERIODIC_DELAY); */
 /* 	else */
 	delay = msecs_to_jiffies(AGNX_PERIODIC_DELAY);
-//		delay = round_jiffies(HZ * 15);
+/*	delay = round_jiffies(HZ * 15); */
 
 	queue_delayed_work(priv->hw->workqueue, &priv->periodic_work, delay);
 
-//	spin_unlock_irqrestore(&priv->lock, flags);
+/*	spin_unlock_irqrestore(&priv->lock, flags); */
 }
 #endif
 
@@ -255,12 +254,12 @@ static int agnx_start(struct ieee80211_hw *dev)
 		goto out;
 	}
 
-//	mdelay(500);
+/*	mdelay(500); */
 
 	might_sleep();
 	agnx_hw_init(priv);
 
-//	mdelay(500);
+/*	mdelay(500); */
 	might_sleep();
 
 	priv->init_status = AGNX_START;
@@ -280,8 +279,8 @@ static void agnx_stop(struct ieee80211_hw *dev)
 	/* make sure hardware will not generate irq */
 	agnx_hw_reset(priv);
 	free_irq(priv->pdev->irq, dev);
-        flush_workqueue(priv->hw->workqueue);
-//	cancel_delayed_work_sync(&priv->periodic_work);
+	flush_workqueue(priv->hw->workqueue);
+/*	cancel_delayed_work_sync(&priv->periodic_work); */
 	unfill_rings(priv);
 	rings_free(priv);
 }
@@ -315,7 +314,6 @@ static int agnx_config_interface(struct ieee80211_hw *dev,
 	spin_lock(&priv->lock);
 
 	if (memcmp(conf->bssid, priv->bssid, ETH_ALEN)) {
-//		u32 reghi, reglo;
 		agnx_set_bssid(priv, conf->bssid);
 		memcpy(priv->bssid, conf->bssid, ETH_ALEN);
 		hash_write(priv, conf->bssid, BSSID_STAID);
@@ -425,7 +423,7 @@ static struct ieee80211_ops agnx_ops = {
 	.remove_interface	= agnx_remove_interface,
 	.config			= agnx_config,
 	.config_interface	= agnx_config_interface,
- 	.configure_filter	= agnx_configure_filter,
+	.configure_filter	= agnx_configure_filter,
 	.get_stats		= agnx_get_stats,
 	.get_tx_stats		= agnx_get_tx_stats,
 	.get_tsf		= agnx_get_tsft
@@ -504,7 +502,7 @@ static int __devinit agnx_pci_probe(struct pci_dev *pdev,
 
 	/* Map mem #1 and #2 */
 	priv->ctl = pci_iomap(pdev, 0, mem_len0);
-//	printk(KERN_DEBUG PFX"MEM1 mapped address is 0x%p\n", priv->ctl);
+/*	printk(KERN_DEBUG PFX"MEM1 mapped address is 0x%p\n", priv->ctl); */
 	if (!priv->ctl) {
 		printk(KERN_ERR PFX "Can't map device memory\n");
 		goto err_free_dev;
-- 
1.6.0.4


^ permalink raw reply related	[flat|nested] 104+ messages in thread

* [PATCH 04/09] Checkpatch.pl: Fixup phy.c
  2009-03-14 21:39       ` [PATCH 03/09] Checkpatch.pl: Fixup pci.c Erik Andrén
@ 2009-03-14 21:39         ` Erik Andrén
  2009-03-14 21:39           ` [PATCH 05/09] Checkpatch.pl: Fixup rf.c Erik Andrén
  0 siblings, 1 reply; 104+ messages in thread
From: Erik Andrén @ 2009-03-14 21:39 UTC (permalink / raw)
  To: greg; +Cc: linux-kernel, Erik Andrén

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain, Size: 3683 bytes --]

Signed-off-by: Erik Andrén <erik.andren@gmail.com>
---
 drivers/staging/agnx/phy.c |   32 ++++++++++++++++----------------
 1 files changed, 16 insertions(+), 16 deletions(-)

diff --git a/drivers/staging/agnx/phy.c b/drivers/staging/agnx/phy.c
index da8f10c..2be6331 100644
--- a/drivers/staging/agnx/phy.c
+++ b/drivers/staging/agnx/phy.c
@@ -114,7 +114,7 @@ static void mac_address_set(struct agnx_priv *priv)
 	/* FIXME */
 	reg = (mac_addr[0] << 24) | (mac_addr[1] << 16) | mac_addr[2] << 8 | mac_addr[3];
 	iowrite32(reg, ctl + AGNX_RXM_MACHI);
- 	reg = (mac_addr[4] << 8) | mac_addr[5];
+	reg = (mac_addr[4] << 8) | mac_addr[5];
 	iowrite32(reg, ctl + AGNX_RXM_MACLO);
 }
 
@@ -127,7 +127,7 @@ static void receiver_bssid_set(struct agnx_priv *priv, u8 *bssid)
 	/* FIXME */
 	reg = bssid[0] << 24 | (bssid[1] << 16) | (bssid[2] << 8) | bssid[3];
 	iowrite32(reg, ctl + AGNX_RXM_BSSIDHI);
- 	reg = (bssid[4] << 8) | bssid[5];
+	reg = (bssid[4] << 8) | bssid[5];
 	iowrite32(reg, ctl + AGNX_RXM_BSSIDLO);
 
 	/* Enable the receiver */
@@ -401,9 +401,9 @@ static void rx_management_init(struct agnx_priv *priv)
 		agnx_write32(ctl, 0x2074, 0x1f171710);
 		agnx_write32(ctl, 0x2078, 0x10100d0d);
 		agnx_write32(ctl, 0x207c, 0x11111010);
-	}
-	else
+	} else {
 		agnx_write32(ctl, AGNX_RXM_DELAY11, 0x0);
+	}
 	agnx_write32(ctl, AGNX_RXM_REQRATE, 0x8195e00);
 }
 
@@ -476,7 +476,7 @@ static void gain_ctlcnt_init(struct agnx_priv *priv)
 	/* It seemed if we set other bit to 1 the bit 0 will
 	   be auto change to 0 */
 	agnx_write32(ctl, AGNX_BM_TXTOPEER, 0x2 | 0x1);
-//	agnx_write32(ctl, AGNX_BM_TXTOPEER, 0x1);
+/*	agnx_write32(ctl, AGNX_BM_TXTOPEER, 0x1); */
 } /* gain_ctlcnt_init */
 
 
@@ -490,7 +490,7 @@ static void phy_init(struct agnx_priv *priv)
 	/* Load InitialGainTable */
 	gain_table_init(priv);
 
-  	agnx_write32(ctl, AGNX_CIR_ADDRWIN, 0x2000000);
+	agnx_write32(ctl, AGNX_CIR_ADDRWIN, 0x2000000);
 
 	/* Clear the following offsets in Memory Range #2: */
 	memset_io(data + 0x5040, 0, 0xa * 4);
@@ -586,7 +586,7 @@ static void phy_init(struct agnx_priv *priv)
 		agnx_write32(ctl, AGNX_GCR_SIFST11B, 0x28);
 		agnx_write32(ctl, AGNX_GCR_CWDETEC, 0x0);
 		agnx_write32(ctl, AGNX_GCR_0X38, 0x1e);
-//		agnx_write32(ctl, AGNX_GCR_BOACT, 0x26);
+/*		agnx_write32(ctl, AGNX_GCR_BOACT, 0x26);*/
 		agnx_write32(ctl, AGNX_GCR_DISCOVMOD, 0x3);
 
 		agnx_write32(ctl, AGNX_GCR_THCAP11A, 0x32);
@@ -810,10 +810,10 @@ static void card_interface_init(struct agnx_priv *priv)
 		}
 		print_hex_dump_bytes(PFX "EEPROM: ", DUMP_PREFIX_NONE, eeprom,
 				     ARRAY_SIZE(eeprom));
-	} while(0);
+	} while (0);
 
 	spi_rc_write(ctl, RF_CHIP0, 0x26);
-        reg = agnx_read32(ctl, AGNX_SPI_RLSW);
+	reg = agnx_read32(ctl, AGNX_SPI_RLSW);
 
 	/* Initialize the system interface */
 	system_itf_init(priv);
@@ -874,19 +874,19 @@ static void card_interface_init(struct agnx_priv *priv)
 	/* FIXME Enable the request */
 	/* Check packet length */
 	/* Set maximum packet length */
-/* 	agnx_write32(ctl, AGNX_RXM_REQRATE, 0x88195e00); */
-/* 	enable_receiver(priv); */
+/*	agnx_write32(ctl, AGNX_RXM_REQRATE, 0x88195e00); */
+/*	enable_receiver(priv); */
 
 	/* Set the Receiver BSSID */
 	receiver_bssid_set(priv, bssid);
 
 	/* FIXME Set to managed mode */
 	set_managed_mode(priv);
-//	set_promiscuous_mode(priv);
-/* 	set_scan_mode(priv); */
-/* 	set_learn_mode(priv); */
-// 	set_promis_and_managed(priv);
-// 	set_adhoc_mode(priv);
+/*	set_promiscuous_mode(priv); */
+/*	set_scan_mode(priv); */
+/*	set_learn_mode(priv); */
+/*	set_promis_and_managed(priv); */
+/*	set_adhoc_mode(priv); */
 
 	/* Set the recieve request rate */
 	/* Check packet length */
-- 
1.6.0.4


^ permalink raw reply related	[flat|nested] 104+ messages in thread

* [PATCH 05/09] Checkpatch.pl: Fixup rf.c
  2009-03-14 21:39         ` [PATCH 04/09] Checkpatch.pl: Fixup phy.c Erik Andrén
@ 2009-03-14 21:39           ` Erik Andrén
  2009-03-14 21:39             ` [PATCH 06/09] Checkpatch.pl: Fixup sta.c Erik Andrén
  0 siblings, 1 reply; 104+ messages in thread
From: Erik Andrén @ 2009-03-14 21:39 UTC (permalink / raw)
  To: greg; +Cc: linux-kernel, Erik Andrén

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain, Size: 2345 bytes --]

Signed-off-by: Erik Andrén <erik.andren@gmail.com>
---
 drivers/staging/agnx/rf.c |   21 ++++++++++-----------
 1 files changed, 10 insertions(+), 11 deletions(-)

diff --git a/drivers/staging/agnx/rf.c b/drivers/staging/agnx/rf.c
index 8294b6e..506d87a 100644
--- a/drivers/staging/agnx/rf.c
+++ b/drivers/staging/agnx/rf.c
@@ -109,12 +109,12 @@ void rf_chips_init(struct agnx_priv *priv)
 	}
 
 	/* Set SPI clock speed to 200NS */
-        reg = agnx_read32(ctl, AGNX_SPI_CFG);
-        reg &= ~0xF;
-        reg |= 0x3;
-        agnx_write32(ctl, AGNX_SPI_CFG, reg);
+	reg = agnx_read32(ctl, AGNX_SPI_CFG);
+	reg &= ~0xF;
+	reg |= 0x3;
+	agnx_write32(ctl, AGNX_SPI_CFG, reg);
 
-        /* Set SPI clock speed to 50NS */
+	/* Set SPI clock speed to 50NS */
 	reg = agnx_read32(ctl, AGNX_SPI_CFG);
 	reg &= ~0xF;
 	reg |= 0x1;
@@ -256,7 +256,7 @@ static void antenna_init(struct agnx_priv *priv, int num_antenna)
 		agnx_write32(ctl, AGNX_GCR_THD0BTFEST, 70);
 		agnx_write32(ctl, AGNX_GCR_SIGHTH, 100);
 		agnx_write32(ctl, AGNX_GCR_SIGLTH, 48);
-//		agnx_write32(ctl, AGNX_GCR_SIGLTH, 16);
+/*		agnx_write32(ctl, AGNX_GCR_SIGLTH, 16); */
 		break;
 	default:
 		printk(KERN_WARNING PFX "Unknow antenna number\n");
@@ -275,8 +275,8 @@ static void chain_update(struct agnx_priv *priv, u32 chain)
 	if (reg == 0x4)
 		spi_rf_write(ctl, RF_CHIP0|RF_CHIP1, reg|0x1000);
 	else if (reg != 0x0)
-     		spi_rf_write(ctl, RF_CHIP0|RF_CHIP1|RF_CHIP2, reg|0x1000);
-        else {
+		spi_rf_write(ctl, RF_CHIP0|RF_CHIP1|RF_CHIP2, reg|0x1000);
+	else {
 		if (chain == 3 || chain == 6) {
 			spi_rf_write(ctl, RF_CHIP0|RF_CHIP1|RF_CHIP2, reg|0x1000);
 			agnx_write32(ctl, AGNX_GCR_RXOVERIDE, 0x0);
@@ -634,8 +634,7 @@ static void chain_calibrate(struct agnx_priv *priv, struct chains *chains,
 	}
 } /* chain_calibrate */
 
-
-static void inline get_calibrete_value(struct agnx_priv *priv, struct chains *chains,
+static inline void get_calibrete_value(struct agnx_priv *priv, struct chains *chains,
 				       unsigned int num)
 {
 	void __iomem *ctl = priv->ctl;
@@ -652,7 +651,7 @@ static void inline get_calibrete_value(struct agnx_priv *priv, struct chains *ch
 	}
 
 	if (num == 0 || num == 1 || num == 2) {
-		if ( 0 == chains[num].cali)
+		if (0 == chains[num].cali)
 			chains[num].cali = 0xff;
 		else
 			chains[num].cali--;
-- 
1.6.0.4


^ permalink raw reply related	[flat|nested] 104+ messages in thread

* [PATCH 06/09] Checkpatch.pl: Fixup sta.c
  2009-03-14 21:39           ` [PATCH 05/09] Checkpatch.pl: Fixup rf.c Erik Andrén
@ 2009-03-14 21:39             ` Erik Andrén
  2009-03-14 21:39               ` [PATCH 07/09] Checkpatch.pl: Fixup sta.h Erik Andrén
  0 siblings, 1 reply; 104+ messages in thread
From: Erik Andrén @ 2009-03-14 21:39 UTC (permalink / raw)
  To: greg; +Cc: linux-kernel, Erik Andrén

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain, Size: 4108 bytes --]

Signed-off-by: Erik Andrén <erik.andren@gmail.com>
---
 drivers/staging/agnx/sta.c |   21 ++++++++++-----------
 1 files changed, 10 insertions(+), 11 deletions(-)

diff --git a/drivers/staging/agnx/sta.c b/drivers/staging/agnx/sta.c
index d3ac675..a3fd16c 100644
--- a/drivers/staging/agnx/sta.c
+++ b/drivers/staging/agnx/sta.c
@@ -18,7 +18,7 @@ void hash_read(struct agnx_priv *priv, u32 reghi, u32 reglo, u8 sta_id)
 	iowrite32(reglo, ctl + AGNX_RXM_HASH_CMD_LOW);
 
 	reghi = ioread32(ctl + AGNX_RXM_HASH_CMD_HIGH);
-        reglo = ioread32(ctl + AGNX_RXM_HASH_CMD_LOW);
+	reglo = ioread32(ctl + AGNX_RXM_HASH_CMD_LOW);
 	printk(PFX "RX hash cmd are : %.8x%.8x\n", reghi, reglo);
 }
 
@@ -40,7 +40,7 @@ void hash_write(struct agnx_priv *priv, u8 *mac_addr, u8 sta_id)
 	iowrite32(reghi, ctl + AGNX_RXM_HASH_CMD_HIGH);
 	iowrite32(reglo, ctl + AGNX_RXM_HASH_CMD_LOW);
 
-        reglo = ioread32(ctl + AGNX_RXM_HASH_CMD_LOW);
+	reglo = ioread32(ctl + AGNX_RXM_HASH_CMD_LOW);
 	if (!(reglo & 0x80000000))
 		printk(KERN_WARNING PFX "Update hash table failed\n");
 }
@@ -59,7 +59,7 @@ void hash_delete(struct agnx_priv *priv, u32 reghi, u32 reglo, u8 sta_id)
 	iowrite32(reglo, ctl + AGNX_RXM_HASH_CMD_LOW);
 	reghi = ioread32(ctl + AGNX_RXM_HASH_CMD_HIGH);
 
-        reglo = ioread32(ctl + AGNX_RXM_HASH_CMD_LOW);
+	reglo = ioread32(ctl + AGNX_RXM_HASH_CMD_LOW);
 	printk(PFX "RX hash cmd are : %.8x%.8x\n", reghi, reglo);
 
 }
@@ -69,15 +69,14 @@ void hash_dump(struct agnx_priv *priv, u8 sta_id)
 	void __iomem *ctl = priv->ctl;
 	u32 reghi, reglo;
 
-	reglo = 0x0;		/* dump command */
-	reglo|= 0x40000000;  	/* status bit */
+	reglo = 0x40000000;  	/* status bit */
 	iowrite32(reglo, ctl + AGNX_RXM_HASH_CMD_LOW);
 	iowrite32(sta_id << 16, ctl + AGNX_RXM_HASH_DUMP_DATA);
 
 	udelay(80);
 
 	reghi = ioread32(ctl + AGNX_RXM_HASH_CMD_HIGH);
-        reglo = ioread32(ctl + AGNX_RXM_HASH_CMD_LOW);
+	reglo = ioread32(ctl + AGNX_RXM_HASH_CMD_LOW);
 	printk(PFX "hash cmd are : %.8x%.8x\n", reghi, reglo);
 	reghi = ioread32(ctl + AGNX_RXM_HASH_CMD_FLAG);
 	printk(PFX "hash flag is : %.8x\n", reghi);
@@ -91,7 +90,7 @@ void hash_dump(struct agnx_priv *priv, u8 sta_id)
 void get_sta_power(struct agnx_priv *priv, struct agnx_sta_power *power, unsigned int sta_idx)
 {
 	void __iomem *ctl = priv->ctl;
-        memcpy_fromio(power, ctl + AGNX_TXM_STAPOWTEMP + sizeof(*power) * sta_idx,
+	memcpy_fromio(power, ctl + AGNX_TXM_STAPOWTEMP + sizeof(*power) * sta_idx,
 		      sizeof(*power));
 }
 
@@ -100,7 +99,7 @@ set_sta_power(struct agnx_priv *priv, struct agnx_sta_power *power, unsigned int
 {
 	void __iomem *ctl = priv->ctl;
 	/* FIXME   2. Write Template to offset + station number  */
-        memcpy_toio(ctl + AGNX_TXM_STAPOWTEMP + sizeof(*power) * sta_idx,
+	memcpy_toio(ctl + AGNX_TXM_STAPOWTEMP + sizeof(*power) * sta_idx,
 		    power, sizeof(*power));
 }
 
@@ -135,7 +134,7 @@ inline void set_sta(struct agnx_priv *priv, struct agnx_sta *sta, unsigned int s
 {
 	void __iomem *data = priv->data;
 
-        memcpy_toio(data + AGNX_PDUPOOL + sizeof(*sta) * sta_idx,
+	memcpy_toio(data + AGNX_PDUPOOL + sizeof(*sta) * sta_idx,
 		    sta, sizeof(*sta));
 }
 
@@ -165,7 +164,7 @@ static void sta_tx_workqueue_init(struct agnx_priv *priv, unsigned int sta_idx)
 
 	reg = agnx_set_bits(WORK_QUEUE_VALID, WORK_QUEUE_VALID_SHIFT, 1);
 	reg |= agnx_set_bits(WORK_QUEUE_ACK_TYPE, WORK_QUEUE_ACK_TYPE_SHIFT, 1);
-//	reg |= agnx_set_bits(WORK_QUEUE_ACK_TYPE, WORK_QUEUE_ACK_TYPE_SHIFT, 0);
+/*	reg |= agnx_set_bits(WORK_QUEUE_ACK_TYPE, WORK_QUEUE_ACK_TYPE_SHIFT, 0); */
 	tx_wq.reg2 |= cpu_to_le32(reg);
 
 	/* Suppose all 8 traffic class are used */
@@ -181,7 +180,7 @@ static void sta_traffic_init(struct agnx_sta_traffic *traffic)
 
 	reg = agnx_set_bits(NEW_PACKET, NEW_PACKET_SHIFT, 1);
 	reg |= agnx_set_bits(TRAFFIC_VALID, TRAFFIC_VALID_SHIFT, 1);
-//	reg |= agnx_set_bits(TRAFFIC_ACK_TYPE, TRAFFIC_ACK_TYPE_SHIFT, 1);
+/*	reg |= agnx_set_bits(TRAFFIC_ACK_TYPE, TRAFFIC_ACK_TYPE_SHIFT, 1); */
 	traffic->reg0 = cpu_to_le32(reg);
 
 	/* 	3. setting RX Sequence Number to 4095 */
-- 
1.6.0.4


^ permalink raw reply related	[flat|nested] 104+ messages in thread

* [PATCH 07/09] Checkpatch.pl: Fixup sta.h
  2009-03-14 21:39             ` [PATCH 06/09] Checkpatch.pl: Fixup sta.c Erik Andrén
@ 2009-03-14 21:39               ` Erik Andrén
  2009-03-14 21:39                 ` [PATCH 08/09] Checkpatch.pl: Fixup table.c Erik Andrén
  0 siblings, 1 reply; 104+ messages in thread
From: Erik Andrén @ 2009-03-14 21:39 UTC (permalink / raw)
  To: greg; +Cc: linux-kernel, Erik Andrén

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain, Size: 499 bytes --]

Signed-off-by: Erik Andrén <erik.andren@gmail.com>
---
 drivers/staging/agnx/sta.h |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/drivers/staging/agnx/sta.h b/drivers/staging/agnx/sta.h
index 58d0b12..94e2cf1 100644
--- a/drivers/staging/agnx/sta.h
+++ b/drivers/staging/agnx/sta.h
@@ -16,7 +16,7 @@ struct agnx_hash_cmd {
 #define PASS		0x00000001
 #define PASS_SHIFT	1
 	__be32 cmdlo;
-}__attribute__((__packed__));
+} __attribute__((__packed__));
 
 
 /*
-- 
1.6.0.4


^ permalink raw reply related	[flat|nested] 104+ messages in thread

* [PATCH 08/09] Checkpatch.pl: Fixup table.c
  2009-03-14 21:39               ` [PATCH 07/09] Checkpatch.pl: Fixup sta.h Erik Andrén
@ 2009-03-14 21:39                 ` Erik Andrén
  2009-03-14 21:39                   ` [PATCH 09/09] Checkpatch.pl: Fixup xmit.c Erik Andrén
  0 siblings, 1 reply; 104+ messages in thread
From: Erik Andrén @ 2009-03-14 21:39 UTC (permalink / raw)
  To: greg; +Cc: linux-kernel, Erik Andrén

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain, Size: 1969 bytes --]

Signed-off-by: Erik Andrén <erik.andren@gmail.com>
---
 drivers/staging/agnx/table.c |   12 ++++++------
 1 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/drivers/staging/agnx/table.c b/drivers/staging/agnx/table.c
index c600484..b52fef9 100644
--- a/drivers/staging/agnx/table.c
+++ b/drivers/staging/agnx/table.c
@@ -80,7 +80,7 @@ void routing_table_init(struct agnx_priv *priv)
 
 	disable_receiver(priv);
 
-	for ( type = 0; type < 0x3; type++ ) {
+	for (type = 0; type < 0x3; type++) {
 		for (subtype = 0; subtype < 0x10; subtype++) {
 			/* 1. Set Routing table to R/W and to Return status on Read */
 			reg = (type << ROUTAB_TYPE_SHIFT) |
@@ -89,7 +89,7 @@ void routing_table_init(struct agnx_priv *priv)
 			if (type == ROUTAB_TYPE_DATA) {
 				/* NULL goes to RFP */
 				if (subtype == ROUTAB_SUBTYPE_NULL)
-//					reg |= ROUTAB_ROUTE_RFP;
+/*					reg |= ROUTAB_ROUTE_RFP; */
 					reg |= ROUTAB_ROUTE_CPU;
 				/* QOS NULL goes to CPU */
 				else if (subtype == ROUTAB_SUBTYPE_QOSNULL)
@@ -104,7 +104,7 @@ void routing_table_init(struct agnx_priv *priv)
 					 (subtype == ROUTAB_SUBTYPE_QOSDATAPOLL) ||
 					 (subtype == ROUTAB_SUBTYPE_QOSDATAACKPOLL))
 					reg |= ROUTAB_ROUTE_ENCRY;
-//					reg |= ROUTAB_ROUTE_CPU;
+/*					reg |= ROUTAB_ROUTE_CPU; */
 				/*Drop NULL and QOS NULL ack, poll and poll ack*/
 				else if ((subtype == ROUTAB_SUBTYPE_NULLACK) ||
 					 (subtype == ROUTAB_SUBTYPE_QOSNULLACK) ||
@@ -112,11 +112,11 @@ void routing_table_init(struct agnx_priv *priv)
 					 (subtype == ROUTAB_SUBTYPE_QOSNULLPOLL) ||
 					 (subtype == ROUTAB_SUBTYPE_NULLPOLLACK) ||
 					 (subtype == ROUTAB_SUBTYPE_QOSNULLPOLLACK))
-//					reg |= ROUTAB_ROUTE_DROP;
+/*					reg |= ROUTAB_ROUTE_DROP; */
 					reg |= ROUTAB_ROUTE_CPU;
-			}
-			else
+			} else {
 				reg |= (ROUTAB_ROUTE_CPU);
+			}
 			iowrite32(reg, ctl + AGNX_RXM_ROUTAB);
 			/* Check to verify that the status bit cleared */
 			routing_table_delay();
-- 
1.6.0.4


^ permalink raw reply related	[flat|nested] 104+ messages in thread

* [PATCH 09/09] Checkpatch.pl: Fixup xmit.c
  2009-03-14 21:39                 ` [PATCH 08/09] Checkpatch.pl: Fixup table.c Erik Andrén
@ 2009-03-14 21:39                   ` Erik Andrén
  0 siblings, 0 replies; 104+ messages in thread
From: Erik Andrén @ 2009-03-14 21:39 UTC (permalink / raw)
  To: greg; +Cc: linux-kernel, Erik Andrén

Signed-off-by: Erik Andrén <erik.andren@gmail.com>
---
 drivers/staging/agnx/xmit.c |  216 +++++++++++++++++++++++--------------------
 1 files changed, 116 insertions(+), 100 deletions(-)

diff --git a/drivers/staging/agnx/xmit.c b/drivers/staging/agnx/xmit.c
index 7f01528..0e03408 100644
--- a/drivers/staging/agnx/xmit.c
+++ b/drivers/staging/agnx/xmit.c
@@ -17,8 +17,8 @@
 #include "debug.h"
 #include "phy.h"
 
-unsigned int rx_frame_cnt = 0;
-//unsigned int local_tx_sent_cnt = 0;
+unsigned int rx_frame_cnt;
+/* unsigned int local_tx_sent_cnt = 0; */
 
 static inline void disable_rx_engine(struct agnx_priv *priv)
 {
@@ -242,15 +242,15 @@ static void get_rx_stats(struct agnx_priv *priv, struct agnx_hdr *hdr,
 	memset(stat, 0, sizeof(*stat));
 	/* RSSI */
 	rssi = (u8 *)&hdr->phy_stats_lo;
-//	stat->ssi = (rssi[0] + rssi[1] + rssi[2]) / 3;
+/*	stat->ssi = (rssi[0] + rssi[1] + rssi[2]) / 3; */
 	/* Noise */
 	noise = ioread32(ctl + AGNX_GCR_NOISE0);
 	noise += ioread32(ctl + AGNX_GCR_NOISE1);
 	noise += ioread32(ctl + AGNX_GCR_NOISE2);
 	stat->noise = noise / 3;
 	/* Signal quality */
-	//snr = stat->ssi - stat->noise;
-	if (snr >=0 && snr < 40)
+/*	snr = stat->ssi - stat->noise; */
+	if (snr >= 0 && snr < 40)
 		stat->signal = 5 * snr / 2;
 	else if (snr >= 40)
 		stat->signal = 100;
@@ -269,10 +269,9 @@ static void get_rx_stats(struct agnx_priv *priv, struct agnx_hdr *hdr,
 
 	stat->band = IEEE80211_BAND_2GHZ;
 	stat->freq = agnx_channels[priv->channel - 1].center_freq;
-//	stat->antenna = 3;
-//	stat->mactime = be32_to_cpu(hdr->time_stamp);
-//	stat->channel = priv->channel;
-
+/*	stat->antenna = 3;
+	stat->mactime = be32_to_cpu(hdr->time_stamp);
+	stat->channel = priv->channel; */
 }
 
 static inline void combine_hdr_frag(struct ieee80211_hdr *ieeehdr,
@@ -296,7 +295,7 @@ static inline void combine_hdr_frag(struct ieee80211_hdr *ieeehdr,
 static inline int agnx_packet_check(struct agnx_priv *priv, struct agnx_hdr *agnxhdr,
 				    unsigned packet_len)
 {
-	if (agnx_get_bits(CRC_FAIL, CRC_FAIL_SHIFT, be32_to_cpu(agnxhdr->reg1)) == 1){
+	if (agnx_get_bits(CRC_FAIL, CRC_FAIL_SHIFT, be32_to_cpu(agnxhdr->reg1)) == 1) {
 		printk(PFX "RX: CRC check fail\n");
 		goto drop;
 	}
@@ -320,7 +319,7 @@ void handle_rx_irq(struct agnx_priv *priv)
 {
 	struct ieee80211_rx_status status;
 	unsigned int len;
-//	AGNX_TRACE;
+/*	AGNX_TRACE; */
 
 	do {
 		struct agnx_desc *desc;
@@ -341,54 +340,54 @@ void handle_rx_irq(struct agnx_priv *priv)
 
 		len = (frag & PACKET_LEN) >> PACKET_LEN_SHIFT;
 		if (agnx_packet_check(priv, hdr, len) == -1) {
- 			rx_desc_reusing(priv, i);
+			rx_desc_reusing(priv, i);
 			continue;
 		}
 		skb_put(skb, len);
 
 		do {
-			u16 fctl;
+				u16 fctl;
 			fctl = le16_to_cpu(((struct ieee80211_hdr *)hdr->mac_hdr)->frame_control);
-			if ((fctl & IEEE80211_FCTL_STYPE) != IEEE80211_STYPE_BEACON)// && !(fctl & IEEE80211_STYPE_BEACON))
+			if ((fctl & IEEE80211_FCTL_STYPE) != IEEE80211_STYPE_BEACON)/* && !(fctl & IEEE80211_STYPE_BEACON)) */
 				dump_ieee80211_hdr((struct ieee80211_hdr *)hdr->mac_hdr, "RX");
 		} while (0);
 
 		if (hdr->_11b0 && !hdr->_11g0) {
-/* 			int j; */
-/* 			u16 fctl = le16_to_cpu(((struct ieee80211_hdr *)hdr->mac_hdr) */
-/* 					       ->frame_control); */
-/* 			if ( (fctl & IEEE80211_FCTL_FTYPE) ==  IEEE80211_FTYPE_DATA) { */
-/* 				agnx_print_rx_hdr(hdr); */
-// 				agnx_print_sta(priv, BSSID_STAID);
-/* 				for (j = 0; j < 8; j++) */
-/* 					agnx_print_sta_tx_wq(priv, BSSID_STAID, j);		 */
-/* 			} */
+/*			int j;
+			u16 fctl = le16_to_cpu(((struct ieee80211_hdr *)hdr->mac_hdr)
+					       ->frame_control);
+			if ( (fctl & IEEE80211_FCTL_FTYPE) ==  IEEE80211_FTYPE_DATA) {
+				agnx_print_rx_hdr(hdr);
+				agnx_print_sta(priv, BSSID_STAID);
+				for (j = 0; j < 8; j++)
+					agnx_print_sta_tx_wq(priv, BSSID_STAID, j);
+			} */
 
 			get_rx_stats(priv, hdr, &status);
 			skb_pull(skb, sizeof(*hdr));
 			combine_hdr_frag((struct ieee80211_hdr *)hdr->mac_hdr, skb);
 		} else if (!hdr->_11b0 && hdr->_11g0) {
-//			int j;
+/*			int j; */
 			agnx_print_rx_hdr(hdr);
 			agnx_print_sta(priv, BSSID_STAID);
-//			for (j = 0; j < 8; j++)
+/*			for (j = 0; j < 8; j++) */
 			agnx_print_sta_tx_wq(priv, BSSID_STAID, 0);
 
 			print_hex_dump_bytes("agnx: RX_PACKET: ", DUMP_PREFIX_NONE,
 					     skb->data, skb->len + 8);
 
-//			if (agnx_plcp_get_bitrate_ofdm(&hdr->_11g0) == 0)
+/*			if (agnx_plcp_get_bitrate_ofdm(&hdr->_11g0) == 0) */
 			get_rx_stats(priv, hdr, &status);
 			skb_pull(skb, sizeof(*hdr));
 			combine_hdr_frag((struct ieee80211_hdr *)
 					 ((void *)&hdr->mac_hdr), skb);
-//			dump_ieee80211_hdr((struct ieee80211_hdr *)skb->data, "RX G");
+/*			dump_ieee80211_hdr((struct ieee80211_hdr *)skb->data, "RX G"); */
 		} else
 			agnx_bug("Unknown packets type");
 		ieee80211_rx_irqsafe(priv->hw, skb, &status);
 		rx_desc_reinit(priv, i);
 
-	} while ( priv->rx.idx++ );
+	} while (priv->rx.idx++);
 } /* handle_rx_irq */
 
 static inline void handle_tx_irq(struct agnx_priv *priv, struct agnx_ring *ring)
@@ -415,40 +414,40 @@ static inline void handle_tx_irq(struct agnx_priv *priv, struct agnx_ring *ring)
 		pci_unmap_single(priv->pdev, info->mapping, info->dma_len, PCI_DMA_TODEVICE);
 
 		do {
-//			int j;
+/*			int j; */
 			size_t len;
 			len = info->skb->len - sizeof(struct agnx_hdr) + info->hdr_len;
-			//	if (len == 614) {
-//				agnx_print_desc(desc);
+/*			if (len == 614) { */
+/*				agnx_print_desc(desc); */
 				if (info->type == PACKET) {
-//					agnx_print_tx_hdr((struct agnx_hdr *)info->skb->data);
-/* 					agnx_print_sta_power(priv, LOCAL_STAID); */
-/* 					agnx_print_sta(priv, LOCAL_STAID); */
-/* //					for (j = 0; j < 8; j++) */
-/* 					agnx_print_sta_tx_wq(priv, LOCAL_STAID, 0); */
-//					agnx_print_sta_power(priv, BSSID_STAID);
-//					agnx_print_sta(priv, BSSID_STAID);
-//					for (j = 0; j < 8; j++)
-//					agnx_print_sta_tx_wq(priv, BSSID_STAID, 0);
+/*					agnx_print_tx_hdr((struct agnx_hdr *)info->skb->data); */
+/*					agnx_print_sta_power(priv, LOCAL_STAID); */
+/*					agnx_print_sta(priv, LOCAL_STAID); */
+/*					for (j = 0; j < 8; j++) */
+/*					agnx_print_sta_tx_wq(priv, LOCAL_STAID, 0); */
+/*					agnx_print_sta_power(priv, BSSID_STAID); */
+/*					agnx_print_sta(priv, BSSID_STAID); */
+/*					for (j = 0; j < 8; j++) */
+/*					agnx_print_sta_tx_wq(priv, BSSID_STAID, 0); */
 				}
-//			}
+/*			} */
 		} while (0);
 
 		if (info->type == PACKET) {
-//			dump_txm_registers(priv);
-//			dump_rxm_registers(priv);
-//			dump_bm_registers(priv);
-//			dump_cir_registers(priv);
+/*			dump_txm_registers(priv);
+			dump_rxm_registers(priv);
+			dump_bm_registers(priv);
+			dump_cir_registers(priv); */
 		}
 
 		if (info->type == PACKET) {
-//			struct ieee80211_hdr *hdr;
+/*			struct ieee80211_hdr *hdr; */
 			struct ieee80211_tx_info *txi = IEEE80211_SKB_CB(info->skb);
 
 			skb_pull(info->skb, sizeof(struct agnx_hdr));
 			memcpy(skb_push(info->skb, info->hdr_len), &info->hdr, info->hdr_len);
 
-//			dump_ieee80211_hdr((struct ieee80211_hdr *)info->skb->data, "TX_HANDLE");
+/*			dump_ieee80211_hdr((struct ieee80211_hdr *)info->skb->data, "TX_HANDLE"); */
 /* 			print_hex_dump_bytes("agnx: TX_HANDLE: ", DUMP_PREFIX_NONE, */
 /* 					     info->skb->data, info->skb->len); */
 
@@ -462,7 +461,7 @@ static inline void handle_tx_irq(struct agnx_priv *priv, struct agnx_ring *ring)
 /* 				ieee80211_tx_status_irqsafe(priv->hw, info->skb, &(info->tx_status)); */
 /* 			} else */
 /* 				dev_kfree_skb_irq(info->skb); */
- 		}
+		}
 		memset(desc, 0, sizeof(*desc));
 		memset(info, 0, sizeof(*info));
 	}
@@ -485,7 +484,7 @@ void handle_txd_irq(struct agnx_priv *priv)
 
 void handle_other_irq(struct agnx_priv *priv)
 {
-//	void __iomem *ctl = priv->ctl;
+/*	void __iomem *ctl = priv->ctl; */
 	u32 status = priv->irq_status;
 	void __iomem *ctl = priv->ctl;
 	u32 reg;
@@ -526,11 +525,11 @@ void handle_other_irq(struct agnx_priv *priv)
 		iowrite32(reg, ctl + AGNX_INT_MASK);
 		iowrite32(IRQ_RX_FRAME, ctl + AGNX_INT_STAT);
 		printk(PFX "IRQ: RX Frame\n");
- 		rx_frame_cnt++;
+		rx_frame_cnt++;
 	}
 	if (status & IRQ_ERR_INT) {
 		iowrite32(IRQ_ERR_INT, ctl + AGNX_INT_STAT);
-//		agnx_hw_reset(priv);
+/*		agnx_hw_reset(priv); */
 		printk(PFX "IRQ: Error Interrupt\n");
 	}
 	if (status & IRQ_TX_QUE_FULL)
@@ -558,14 +557,14 @@ void handle_other_irq(struct agnx_priv *priv)
 
 static inline void route_flag_set(struct agnx_hdr *txhdr)
 {
-//	u32 reg = 0;
+/*	u32 reg = 0; */
 
 	/* FIXME */
-/*  	reg = (0x7 << ROUTE_COMPRESSION_SHIFT) & ROUTE_COMPRESSION; */
-/* 	txhdr->reg5 = cpu_to_be32(reg); */
- 	txhdr->reg5 = (0xa << 0x0) | (0x7 << 0x18);
-// 	txhdr->reg5 = cpu_to_be32((0xa << 0x0) | (0x7 << 0x18));
-// 	txhdr->reg5 = cpu_to_be32(0x7 << 0x0);
+/*	reg = (0x7 << ROUTE_COMPRESSION_SHIFT) & ROUTE_COMPRESSION; */
+/*	txhdr->reg5 = cpu_to_be32(reg); */
+	txhdr->reg5 = (0xa << 0x0) | (0x7 << 0x18);
+/*	txhdr->reg5 = cpu_to_be32((0xa << 0x0) | (0x7 << 0x18)); */
+/*	txhdr->reg5 = cpu_to_be32(0x7 << 0x0); */
 }
 
 /* Return 0 if no match */
@@ -579,12 +578,29 @@ static inline unsigned int get_power_level(unsigned int rate, unsigned int anten
 	case 55:
 	case 60:
 	case 90:
-	case 120: power_level = 22; break;
-	case 180: power_level = 19; break;
-	case 240: power_level = 18; break;
-	case 360: power_level = 16; break;
-	case 480: power_level = 15; break;
-	case 540: power_level = 14; break;
+	case 120:
+		power_level = 22;
+		break;
+
+	case 180:
+		power_level = 19;
+		break;
+
+	case 240:
+		power_level = 18;
+		break;
+
+	case 360:
+		power_level = 16;
+		break;
+
+	case 480:
+		power_level = 15;
+		break;
+
+	case 540:
+		power_level = 14;
+		break;
 	default:
 		agnx_bug("Error rate setting\n");
 	}
@@ -604,30 +620,30 @@ static inline void fill_agnx_hdr(struct agnx_priv *priv, struct agnx_info *tx_in
 
 	memset(txhdr, 0, sizeof(*txhdr));
 
-//	reg = agnx_set_bits(STATION_ID, STATION_ID_SHIFT, LOCAL_STAID);
+/*	reg = agnx_set_bits(STATION_ID, STATION_ID_SHIFT, LOCAL_STAID); */
 	reg = agnx_set_bits(STATION_ID, STATION_ID_SHIFT, BSSID_STAID);
 	reg |= agnx_set_bits(WORKQUEUE_ID, WORKQUEUE_ID_SHIFT, 0);
 	txhdr->reg4 = cpu_to_be32(reg);
 
 	/* Set the Hardware Sequence Number to 1? */
 	reg = agnx_set_bits(SEQUENCE_NUMBER, SEQUENCE_NUMBER_SHIFT, 0);
-//	reg = agnx_set_bits(SEQUENCE_NUMBER, SEQUENCE_NUMBER_SHIFT, 1);
+/*	reg = agnx_set_bits(SEQUENCE_NUMBER, SEQUENCE_NUMBER_SHIFT, 1); */
 	reg |= agnx_set_bits(MAC_HDR_LEN, MAC_HDR_LEN_SHIFT, tx_info->hdr_len);
 	txhdr->reg1 = cpu_to_be32(reg);
 	/* Set the agnx_hdr's MAC header */
 	memcpy(txhdr->mac_hdr, &tx_info->hdr, tx_info->hdr_len);
 
 	reg = agnx_set_bits(ACK, ACK_SHIFT, 1);
-//	reg = agnx_set_bits(ACK, ACK_SHIFT, 0);
+/*	reg = agnx_set_bits(ACK, ACK_SHIFT, 0); */
 	reg |= agnx_set_bits(MULTICAST, MULTICAST_SHIFT, 0);
-//	reg |= agnx_set_bits(MULTICAST, MULTICAST_SHIFT, 1);
+/*	reg |= agnx_set_bits(MULTICAST, MULTICAST_SHIFT, 1); */
 	reg |= agnx_set_bits(RELAY, RELAY_SHIFT, 0);
 	reg |= agnx_set_bits(TM, TM_SHIFT, 0);
 	txhdr->reg0 = cpu_to_be32(reg);
 
 	/* Set the long and short retry limits */
- 	txhdr->tx.short_retry_limit = tx_info->txi->control.rates[0].count;
- 	txhdr->tx.long_retry_limit = tx_info->txi->control.rates[0].count;
+	txhdr->tx.short_retry_limit = tx_info->txi->control.rates[0].count;
+	txhdr->tx.long_retry_limit = tx_info->txi->control.rates[0].count;
 
 	/* FIXME */
 	len = tx_info->skb->len - sizeof(*txhdr) + tx_info->hdr_len + FCS_LEN;
@@ -652,23 +668,23 @@ static void txm_power_set(struct agnx_priv *priv,
 	if (txi->control.rates[0].idx < 0) {
 		/* For B mode Short Preamble */
 		reg = agnx_set_bits(PHY_MODE, PHY_MODE_SHIFT, AGNX_MODE_80211B_SHORT);
-//		control->tx_rate = -control->tx_rate;
+/*		control->tx_rate = -control->tx_rate; */
 	} else
 		reg = agnx_set_bits(PHY_MODE, PHY_MODE_SHIFT, AGNX_MODE_80211G);
-//		reg = agnx_set_bits(PHY_MODE, PHY_MODE_SHIFT, AGNX_MODE_80211B_LONG);
+/*		reg = agnx_set_bits(PHY_MODE, PHY_MODE_SHIFT, AGNX_MODE_80211B_LONG); */
 	reg |= agnx_set_bits(SIGNAL, SIGNAL_SHIFT, 0xB);
 	reg |= agnx_set_bits(RATE, RATE_SHIFT, 0xB);
-//	reg |= agnx_set_bits(POWER_LEVEL, POWER_LEVEL_SHIFT, 15);
+/*	reg |= agnx_set_bits(POWER_LEVEL, POWER_LEVEL_SHIFT, 15); */
 	reg |= agnx_set_bits(POWER_LEVEL, POWER_LEVEL_SHIFT, 20);
 	/* if rate < 11M set it to 0 */
 	reg |= agnx_set_bits(NUM_TRANSMITTERS, NUM_TRANSMITTERS_SHIFT, 1);
-//	reg |= agnx_set_bits(EDCF, EDCF_SHIFT, 1);
-//	reg |= agnx_set_bits(TIFS, TIFS_SHIFT, 1);
+/*	reg |= agnx_set_bits(EDCF, EDCF_SHIFT, 1); */
+/*	reg |= agnx_set_bits(TIFS, TIFS_SHIFT, 1); */
 
 	power.reg = reg;
-//	power.reg = cpu_to_le32(reg);
+/*	power.reg = cpu_to_le32(reg); */
 
-//	set_sta_power(priv, &power, LOCAL_STAID);
+/*	set_sta_power(priv, &power, LOCAL_STAID); */
 	set_sta_power(priv, &power, BSSID_STAID);
 }
 
@@ -759,24 +775,24 @@ static int __agnx_tx(struct agnx_priv *priv, struct sk_buff *skb,
 
 	txm_power_set(priv, txi);
 
-/* 	do { */
-/* 		int j; */
-/* 		size_t len; */
-/* 		len = skb->len - hdr_info->dma_len + hdr_info->hdr_len;  */
-/* //		if (len == 614) { */
-/* 			agnx_print_desc(hdr_desc); */
-/* 			agnx_print_desc(frag_desc); */
-/* 			agnx_print_tx_hdr((struct agnx_hdr *)skb->data); */
-/* 			agnx_print_sta_power(priv, LOCAL_STAID); */
-/* 			agnx_print_sta(priv, LOCAL_STAID); */
-/* 			for (j = 0; j < 8; j++) */
-/* 				agnx_print_sta_tx_wq(priv, LOCAL_STAID, j); */
-/* 			agnx_print_sta_power(priv, BSSID_STAID); */
-/* 			agnx_print_sta(priv, BSSID_STAID); */
-/* 			for (j = 0; j < 8; j++) */
-/* 				agnx_print_sta_tx_wq(priv, BSSID_STAID, j); */
-/* 			//	} */
-/* 	} while (0); */
+/*	do { */
+/*		int j; */
+/*		size_t len; */
+/*		len = skb->len - hdr_info->dma_len + hdr_info->hdr_len;  */
+/*		if (len == 614) { */
+/*			agnx_print_desc(hdr_desc); */
+/*			agnx_print_desc(frag_desc); */
+/*			agnx_print_tx_hdr((struct agnx_hdr *)skb->data); */
+/*			agnx_print_sta_power(priv, LOCAL_STAID); */
+/*			agnx_print_sta(priv, LOCAL_STAID); */
+/*			for (j = 0; j < 8; j++) */
+/*				agnx_print_sta_tx_wq(priv, LOCAL_STAID, j); */
+/*			agnx_print_sta_power(priv, BSSID_STAID); */
+/*			agnx_print_sta(priv, BSSID_STAID); */
+/*			for (j = 0; j < 8; j++) */
+/*				agnx_print_sta_tx_wq(priv, BSSID_STAID, j); */
+/*			} */
+/*	} while (0); */
 
 	spin_unlock_irqrestore(&priv->lock, flags);
 
@@ -787,7 +803,7 @@ static int __agnx_tx(struct agnx_priv *priv, struct sk_buff *skb,
 		reg = (ioread32(priv->ctl + AGNX_CIR_TXMCTL));
 		reg |= 0x8;
 		iowrite32((reg), priv->ctl + AGNX_CIR_TXMCTL);
-	}while (0);
+	} while (0);
 
 	/* Trigger TXD */
 	do {
@@ -795,7 +811,7 @@ static int __agnx_tx(struct agnx_priv *priv, struct sk_buff *skb,
 		reg = (ioread32(priv->ctl + AGNX_CIR_TXDCTL));
 		reg |= 0x8;
 		iowrite32((reg), priv->ctl + AGNX_CIR_TXDCTL);
-	}while (0);
+	} while (0);
 
 	return 0;
 }
@@ -807,12 +823,12 @@ int _agnx_tx(struct agnx_priv *priv, struct sk_buff *skb)
 	if (tx_packet_check(skb))
 		return 0;
 
-/* 	print_hex_dump_bytes("agnx: TX_PACKET: ", DUMP_PREFIX_NONE, */
-/* 			     skb->data, skb->len); */
+/*	print_hex_dump_bytes("agnx: TX_PACKET: ", DUMP_PREFIX_NONE, */
+/*			     skb->data, skb->len); */
 
-        fctl = le16_to_cpu(*((__le16 *)skb->data));
+	fctl = le16_to_cpu(*((__le16 *)skb->data));
 
-	if ( (fctl & IEEE80211_FCTL_FTYPE)  == IEEE80211_FTYPE_DATA )
+	if ((fctl & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_DATA)
 		return __agnx_tx(priv, skb, &priv->txd);
 	else
 		return __agnx_tx(priv, skb, &priv->txm);
-- 
1.6.0.4


^ permalink raw reply related	[flat|nested] 104+ messages in thread

* [Staging] Checkpatch fixes for altpciechdma
  2012-03-14 20:05 [Qemu-devel] 5 euros offerts sur votre première commande Claire de Libeedo
                   ` (6 preceding siblings ...)
  2009-03-14 21:39 ` [PATCH 00/09][Staging] Checkpatch.pl fixes for the agnx driver Erik Andrén
@ 2009-03-19 20:47 ` Erik Andrén
  2009-03-19 20:47   ` [PATCH 1/1] Checkpatch.pl: Fixup altpciechdma.c Erik Andrén
  2009-03-19 20:57 ` [Staging] Fixup asus_oled Erik Andrén
                   ` (7 subsequent siblings)
  15 siblings, 1 reply; 104+ messages in thread
From: Erik Andrén @ 2009-03-19 20:47 UTC (permalink / raw)
  To: greg; +Cc: leon, linux-kernel

Hi,
This patch fixes some issues as pointed out by the checkpatch script.

Best regards,
Erik



^ permalink raw reply	[flat|nested] 104+ messages in thread

* [PATCH 1/1] Checkpatch.pl: Fixup altpciechdma.c
  2009-03-19 20:47 ` [Staging] Checkpatch fixes for altpciechdma Erik Andrén
@ 2009-03-19 20:47   ` Erik Andrén
  0 siblings, 0 replies; 104+ messages in thread
From: Erik Andrén @ 2009-03-19 20:47 UTC (permalink / raw)
  To: greg; +Cc: leon, linux-kernel, Erik Andrén

Signed-off-by: Erik Andrén <erik.andren@gmail.com>
---
 drivers/staging/altpciechdma/altpciechdma.c |   64 +++++++++++++--------------
 1 files changed, 31 insertions(+), 33 deletions(-)

diff --git a/drivers/staging/altpciechdma/altpciechdma.c b/drivers/staging/altpciechdma/altpciechdma.c
index f516140..d1ef74c 100644
--- a/drivers/staging/altpciechdma/altpciechdma.c
+++ b/drivers/staging/altpciechdma/altpciechdma.c
@@ -313,15 +313,16 @@ static int __devinit map_bars(struct ape_dev *ape, struct pci_dev *dev)
 			continue;
 		/* do not map BARs with address 0 */
 		if (!bar_start || !bar_end) {
-            printk(KERN_DEBUG "BAR #%d is not present?!\n", i);
+			printk(KERN_DEBUG "BAR #%d is not present?!\n", i);
 			rc = -1;
 			goto fail;
 		}
 		bar_length = bar_end - bar_start + 1;
 		/* BAR length is less than driver requires? */
 		if (bar_length < bar_min_len[i]) {
-            printk(KERN_DEBUG "BAR #%d length = %lu bytes but driver "
-            "requires at least %lu bytes\n", i, bar_length, bar_min_len[i]);
+			printk(KERN_DEBUG "BAR #%d length = %lu bytes but driver "
+			"requires at least %lu bytes\n",
+			i, bar_length, bar_min_len[i]);
 			rc = -1;
 			goto fail;
 		}
@@ -333,8 +334,8 @@ static int __devinit map_bars(struct ape_dev *ape, struct pci_dev *dev)
 			rc = -1;
 			goto fail;
 		}
-        printk(KERN_DEBUG "BAR[%d] mapped at 0x%p with length %lu(/%lu).\n", i,
-			ape->bar[i], bar_min_len[i], bar_length);
+		printk(KERN_DEBUG "BAR[%d] mapped at 0x%p with length %lu(/%lu).\n", i,
+		ape->bar[i], bar_min_len[i], bar_length);
 	}
 	/* succesfully mapped all required BAR regions */
 	rc = 0;
@@ -467,15 +468,14 @@ static inline int compare(u32 *p, u32 *q, int len)
 		} else {
 			fail++;
 			/* show the first few miscompares */
-			if (fail < 10) {
-                printk(KERN_DEBUG "[%p] = 0x%08x != [%p] = 0x%08x ?!\n", p, *p, q, *q);
-            /* but stop after a while */
-            } else if (fail == 10) {
-                printk(KERN_DEBUG "---more errors follow! not printed---\n");
-		  	} else {
+			if (fail < 10)
+				printk(KERN_DEBUG "[%p] = 0x%08x != [%p] = 0x%08x ?!\n", p, *p, q, *q);
+				/* but stop after a while */
+			else if (fail == 10)
+				printk(KERN_DEBUG "---more errors follow! not printed---\n");
+			else
 				/* stop compare after this many errors */
-                break;
-            }
+			break;
 		}
 		p++;
 		q++;
@@ -528,7 +528,7 @@ static int __devinit dma_test(struct ape_dev *ape, struct pci_dev *dev)
 	printk(KERN_DEBUG "ape->table_virt = 0x%p.\n", ape->table_virt);
 
 	if (!write_header || !read_header || !ape->table_virt)
-        goto fail;
+		goto fail;
 
 	/* allocate and map coherently-cached memory for a DMA-able buffer */
 	/* @see Documentation/PCI/PCI-DMA-mapping.txt, near line 318 */
@@ -565,9 +565,8 @@ static int __devinit dma_test(struct ape_dev *ape, struct pci_dev *dev)
 	/* read 8192 bytes from RC buffer to EP address 4096 */
 	ape_chdma_desc_set(&ape->table_virt->desc[n], buffer_bus, 4096, 2 * PAGE_SIZE);
 #if 1
-	for (i = 0; i < 255; i++) {
+	for (i = 0; i < 255; i++)
 		ape_chdma_desc_set(&ape->table_virt->desc[i], buffer_bus, 4096, 2 * PAGE_SIZE);
-	}
 	/* index of last descriptor */
 	n = i - 1;
 #endif
@@ -647,7 +646,7 @@ static int __devinit dma_test(struct ape_dev *ape, struct pci_dev *dev)
 		printk(KERN_DEBUG "EPLAST = %u, n = %d\n", eplast, n);
 		if (eplast == n) {
 			printk(KERN_DEBUG "DONE\n");
-            /* print IRQ count before the transfer */
+			/* print IRQ count before the transfer */
 			printk(KERN_DEBUG "#IRQs during transfer: %d\n", ape->irq_count - irq_count);
 			break;
 		}
@@ -661,9 +660,9 @@ static int __devinit dma_test(struct ape_dev *ape, struct pci_dev *dev)
 	n = 0;
 	ape_chdma_desc_set(&ape->table_virt->desc[n], buffer_bus + 8192, 4096, 2 * PAGE_SIZE);
 #if 1
-	for (i = 0; i < 255; i++) {
+	for (i = 0; i < 255; i++)
 		ape_chdma_desc_set(&ape->table_virt->desc[i], buffer_bus + 8192, 4096, 2 * PAGE_SIZE);
-	}
+
 	/* index of last descriptor */
 	n = i - 1;
 #endif
@@ -691,7 +690,7 @@ static int __devinit dma_test(struct ape_dev *ape, struct pci_dev *dev)
 	w = (u32)(n + 1);
 	/* enable updates of eplast for each descriptor completion */
 	w |= (u32)(1UL << 18)/*global EPLAST_EN*/;
-#if 0 // test variable, make a module option later
+#if 0   /* test variable, make a module option later */
 	/* enable MSI for each descriptor completion */
 	if (ape->msi_enabled)
 		w |= (1UL << 17)/*global MSI*/;
@@ -715,7 +714,7 @@ static int __devinit dma_test(struct ape_dev *ape, struct pci_dev *dev)
 	/** memory write barrier */
 	wmb();
 	/** dummy read to flush posted writes */
-	//(void)ioread32();
+	/* (void) ioread32(); */
 
 	printk(KERN_DEBUG "POLL FOR WRITE:\n");
 	/* poll for completion, 1000 times 1 millisecond */
@@ -844,7 +843,7 @@ static int __devinit probe(struct pci_dev *dev, const struct pci_device_id *id)
 	}
 	ape->got_regions = 1;
 
-#if 1 // @todo For now, disable 64-bit, because I do not understand the implications (DAC!)
+#if 1   /* @todo For now, disable 64-bit, because I do not understand the implications (DAC!) */
 	/* query for DMA transfer */
 	/* @see Documentation/PCI/PCI-DMA-mapping.txt */
 	if (!pci_set_dma_mask(dev, DMA_64BIT_MASK)) {
@@ -1048,10 +1047,9 @@ static ssize_t sg_write(struct file *file, const char __user *buf, size_t count,
 	printk(KERN_DEBUG DRV_NAME "_write(buf=0x%p, count=%lld, pos=%llu)\n",
 		buf, (s64)count, (u64)*pos);
 	/* TODO transfer boundaries at PAGE_SIZE granularity */
-	while (remaining > 0)
-	{
+	while (remaining > 0) {
 		/* limit DMA transfer size */
-		transfer_len = (remaining < APE_CHDMA_MAX_TRANSFER_LEN)? remaining:
+		transfer_len = (remaining < APE_CHDMA_MAX_TRANSFER_LEN) ? remaining :
 			APE_CHDMA_MAX_TRANSFER_LEN;
 		/* get all user space buffer pages and create a scattergather list */
 		sgm_map_user_pages(ape->sgm, transfer_addr, transfer_len, 0/*read from userspace*/);
@@ -1085,12 +1083,12 @@ static ssize_t sg_write(struct file *file, const char __user *buf, size_t count,
 /*
  * character device file operations
  */
-static struct file_operations sg_fops = {
-  .owner = THIS_MODULE,
-  .open = sg_open,
-  .release = sg_close,
-  .read = sg_read,
-  .write = sg_write,
+static const struct file_operations sg_fops = {
+	.owner = THIS_MODULE,
+	.open = sg_open,
+	.release = sg_close,
+	.read = sg_read,
+	.write = sg_write,
 };
 
 /* sg_init() - Initialize character device
@@ -1158,12 +1156,12 @@ static struct pci_driver pci_driver = {
  */
 static int __init alterapciechdma_init(void)
 {
-  int rc = 0;
+	int rc = 0;
 	printk(KERN_DEBUG DRV_NAME " init(), built at " __DATE__ " " __TIME__ "\n");
 	/* register this driver with the PCI bus driver */
 	rc = pci_register_driver(&pci_driver);
 	if (rc < 0)
-	  return rc;
+		return rc;
 	return 0;
 }
 
-- 
1.6.0.4


^ permalink raw reply related	[flat|nested] 104+ messages in thread

* [Staging] Fixup asus_oled
  2012-03-14 20:05 [Qemu-devel] 5 euros offerts sur votre première commande Claire de Libeedo
                   ` (7 preceding siblings ...)
  2009-03-19 20:47 ` [Staging] Checkpatch fixes for altpciechdma Erik Andrén
@ 2009-03-19 20:57 ` Erik Andrén
  2009-03-19 20:57   ` [PATCH 1/1] Fixup asus_oled.c Erik Andrén
  2012-04-18 16:51 ` [PATCH 2/2] staging:android:fix line over 80 characters issue in binders.c this patch fixes line over 80 characters warning that was found using checkpatch.pl tool Signed-off-by:Anirudh Bhat <abhat38@gmail.com> anirudh bhat
                   ` (6 subsequent siblings)
  15 siblings, 1 reply; 104+ messages in thread
From: Erik Andrén @ 2009-03-19 20:57 UTC (permalink / raw)
  To: greg; +Cc: sjakub, linux-kernel

Hi,
This patch fixes some issues that checkpatch.pl pointed out.

Best regards,
Erik



^ permalink raw reply	[flat|nested] 104+ messages in thread

* [PATCH 1/1] Fixup asus_oled.c
  2009-03-19 20:57 ` [Staging] Fixup asus_oled Erik Andrén
@ 2009-03-19 20:57   ` Erik Andrén
  2009-03-19 21:05     ` Erik Andrén
  0 siblings, 1 reply; 104+ messages in thread
From: Erik Andrén @ 2009-03-19 20:57 UTC (permalink / raw)
  To: greg; +Cc: sjakub, linux-kernel, Erik Andrén

---
 drivers/staging/asus_oled/asus_oled.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/drivers/staging/asus_oled/asus_oled.c b/drivers/staging/asus_oled/asus_oled.c
index d81f4bd..7a40f61 100644
--- a/drivers/staging/asus_oled/asus_oled.c
+++ b/drivers/staging/asus_oled/asus_oled.c
@@ -522,7 +522,7 @@ static ssize_t odev_set_picture(struct asus_oled_dev *odev, const char *buf, siz
 			line were equal to the last character in this line. */
 			if (odev->buf_offs % odev->width != 0) {
 				ret = append_values(odev, odev->last_val,
-					odev->width - (odev->buf_offs % odev->width);
+					odev->width - (odev->buf_offs % odev->width));
 				if (ret < 0)
 					return ret;
 			}
-- 
1.6.0.4


^ permalink raw reply related	[flat|nested] 104+ messages in thread

* Re: [PATCH 1/1] Fixup asus_oled.c
  2009-03-19 20:57   ` [PATCH 1/1] Fixup asus_oled.c Erik Andrén
@ 2009-03-19 21:05     ` Erik Andrén
  0 siblings, 0 replies; 104+ messages in thread
From: Erik Andrén @ 2009-03-19 21:05 UTC (permalink / raw)
  To: greg; +Cc: sjakub, linux-kernel

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Sorry, wrong patch.
I'll send the correct one shortly.

Erik Andrén wrote:
> ---
>  drivers/staging/asus_oled/asus_oled.c |    2 +-
>  1 files changed, 1 insertions(+), 1 deletions(-)
> 
> diff --git a/drivers/staging/asus_oled/asus_oled.c b/drivers/staging/asus_oled/asus_oled.c
> index d81f4bd..7a40f61 100644
> --- a/drivers/staging/asus_oled/asus_oled.c
> +++ b/drivers/staging/asus_oled/asus_oled.c
> @@ -522,7 +522,7 @@ static ssize_t odev_set_picture(struct asus_oled_dev *odev, const char *buf, siz
>  			line were equal to the last character in this line. */
>  			if (odev->buf_offs % odev->width != 0) {
>  				ret = append_values(odev, odev->last_val,
> -					odev->width - (odev->buf_offs % odev->width);
> +					odev->width - (odev->buf_offs % odev->width));
>  				if (ret < 0)
>  					return ret;
>  			}
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (GNU/Linux)

iEYEARECAAYFAknCs4kACgkQN7qBt+4UG0GJjQCgrpAc2Hmq5su3U4uBga3QNwYD
I2IAnj4eweBvjVaUtb+fgrXE4waKTvr7
=wCcy
-----END PGP SIGNATURE-----

^ permalink raw reply	[flat|nested] 104+ messages in thread

* [Qemu-devel] 5 euros offerts sur votre première commande
@ 2012-03-14 20:05 Claire de Libeedo
  2007-05-16  0:21 ` [PATCH 1/1] [TIPC]: Fixed erroneous introduction of for_each_netdev Jon Paul Maloy
                   ` (15 more replies)
  0 siblings, 16 replies; 104+ messages in thread
From: Claire de Libeedo @ 2012-03-14 20:05 UTC (permalink / raw)
  To: qemu-devel

[-- Attachment #1: Type: text/plain, Size: 217 bytes --]

  Si vous n'arrivez pas &#224; lire ce message,   cliquez ici , ou copiez-collez dans votre navigateur l'url suivante :  http://envoi-newsletter.com/emailer/newsletters/archives/list_archives.jsp?view=1&info=2658268  

[-- Attachment #2: Type: text/html, Size: 16887 bytes --]

^ permalink raw reply	[flat|nested] 104+ messages in thread

* [PATCH 2/2] staging:android:fix line over 80 characters issue in binders.c this patch fixes line over 80 characters warning that was found using checkpatch.pl tool Signed-off-by:Anirudh Bhat <abhat38@gmail.com>
  2012-03-14 20:05 [Qemu-devel] 5 euros offerts sur votre première commande Claire de Libeedo
                   ` (8 preceding siblings ...)
  2009-03-19 20:57 ` [Staging] Fixup asus_oled Erik Andrén
@ 2012-04-18 16:51 ` anirudh bhat
  2012-04-18 23:50   ` Greg KH
  2012-04-19  8:22 ` David Howells
                   ` (5 subsequent siblings)
  15 siblings, 1 reply; 104+ messages in thread
From: anirudh bhat @ 2012-04-18 16:51 UTC (permalink / raw)
  To: arve, dhowells, chris+android, hpa; +Cc: devel, linux-kernel, anirudh bhat

From: anirudh bhat <anirudhbhat@ubuntu.ubuntu-domain>

---
 drivers/staging/android/binder.c |   59 +++++++++++++++++++-------------------
 1 file changed, 30 insertions(+), 29 deletions(-)

diff --git a/drivers/staging/android/binder.c b/drivers/staging/android/binder.c
index c283212..ae341e0 100644
--- a/drivers/staging/android/binder.c
+++ b/drivers/staging/android/binder.c
@@ -644,8 +644,8 @@ static int binder_update_page_range(struct binder_proc *proc, int allocate,
 		goto free_range;
 
 	if (vma == NULL) {
-		printk(KERN_ERR "binder: %d: binder_alloc_buf failed to "
-		       "map pages in userspace, no vma\n", proc->pid);
+		printk(KERN_ERR "binder: %d: binder_alloc_buf failed to map pages in userspace, no vma\n",
+			proc->pid);
 		goto err_no_vma;
 	}
 
@@ -657,8 +657,8 @@ static int binder_update_page_range(struct binder_proc *proc, int allocate,
 		BUG_ON(*page);
 		*page = alloc_page(GFP_KERNEL | __GFP_ZERO);
 		if (*page == NULL) {
-			printk(KERN_ERR "binder: %d: binder_alloc_buf failed "
-			       "for page at %p\n", proc->pid, page_addr);
+			printk(KERN_ERR "binder: %d: binder_alloc_buf failed for page at %p\n",
+				proc->pid, page_addr);
 			goto err_alloc_page_failed;
 		}
 		tmp_area.addr = page_addr;
@@ -666,18 +666,16 @@ static int binder_update_page_range(struct binder_proc *proc, int allocate,
 		page_array_ptr = page;
 		ret = map_vm_area(&tmp_area, PAGE_KERNEL, &page_array_ptr);
 		if (ret) {
-			printk(KERN_ERR "binder: %d: binder_alloc_buf failed "
-			       "to map page at %p in kernel\n",
-			       proc->pid, page_addr);
+			printk(KERN_ERR "binder: %d: binder_alloc_buf failed to map page at %p in kernel\n",
+				proc->pid, page_addr);
 			goto err_map_kernel_failed;
 		}
 		user_page_addr =
 			(uintptr_t)page_addr + proc->user_buffer_offset;
 		ret = vm_insert_page(vma, user_page_addr, page[0]);
 		if (ret) {
-			printk(KERN_ERR "binder: %d: binder_alloc_buf failed "
-			       "to map page at %lx in userspace\n",
-			       proc->pid, user_page_addr);
+			printk(KERN_ERR "binder: %d: binder_alloc_buf failed to map page at %lx in userspace\n",
+				proc->pid, user_page_addr);
 			goto err_vm_insert_page_failed;
 		}
 		/* vm_insert_page does not seem to increment the refcount */
@@ -733,8 +731,8 @@ static struct binder_buffer *binder_alloc_buf(struct binder_proc *proc,
 		ALIGN(offsets_size, sizeof(void *));
 
 	if (size < data_size || size < offsets_size) {
-		binder_user_error("binder: %d: got transaction with invalid "
-			"size %zd-%zd\n", proc->pid, data_size, offsets_size);
+		binder_user_error("binder:%d:transaction with invalid size %zd-%zd\n",
+					proc->pid, data_size, offsets_size);
 		return NULL;
 	}
 
@@ -762,8 +760,8 @@ static struct binder_buffer *binder_alloc_buf(struct binder_proc *proc,
 		}
 	}
 	if (best_fit == NULL) {
-		printk(KERN_ERR "binder: %d: binder_alloc_buf size %zd failed, "
-		       "no address space\n", proc->pid, size);
+		printk(KERN_ERR "binder: %d: binder_alloc_buf size %zd failed,no address space\n",
+			proc->pid, size);
 		return NULL;
 	}
 	if (n == NULL) {
@@ -997,8 +995,8 @@ static int binder_inc_node(struct binder_node *node, int strong, int internal,
 			    node->internal_strong_refs == 0 &&
 			    !(node == binder_context_mgr_node &&
 			    node->has_strong_ref)) {
-				printk(KERN_ERR "binder: invalid inc strong "
-					"node for %d\n", node->debug_id);
+				printk(KERN_ERR "binder:invalid inc strong node for %d\n",
+					node->debug_id);
 				return -EINVAL;
 			}
 			node->internal_strong_refs++;
@@ -1013,8 +1011,8 @@ static int binder_inc_node(struct binder_node *node, int strong, int internal,
 			node->local_weak_refs++;
 		if (!node->has_weak_ref && list_empty(&node->work.entry)) {
 			if (target_list == NULL) {
-				printk(KERN_ERR "binder: invalid inc weak node "
-					"for %d\n", node->debug_id);
+				printk(KERN_ERR "binder: invalid inc weak node for %d\n",
+					node->debug_id);
 				return -EINVAL;
 			}
 			list_add_tail(&node->work.entry, target_list);
@@ -1206,10 +1204,11 @@ static int binder_dec_ref(struct binder_ref *ref, int strong)
 {
 	if (strong) {
 		if (ref->strong == 0) {
-			binder_user_error("binder: %d invalid dec strong, "
-					  "ref %d desc %d s %d w %d\n",
-					  ref->proc->pid, ref->debug_id,
-					  ref->desc, ref->strong, ref->weak);
+			binder_user_error("binder:%d invalid dec strong,ref %d desc %d s %d w %d\n",
+						ref->proc->pid, ref->debug_id,
+						ref->desc,
+						ref->strong,
+						ref->weak);
 			return -EINVAL;
 		}
 		ref->strong--;
@@ -1221,10 +1220,12 @@ static int binder_dec_ref(struct binder_ref *ref, int strong)
 		}
 	} else {
 		if (ref->weak == 0) {
-			binder_user_error("binder: %d invalid dec weak, "
-					  "ref %d desc %d s %d w %d\n",
-					  ref->proc->pid, ref->debug_id,
-					  ref->desc, ref->strong, ref->weak);
+			binder_user_error("binder: %d invalid dec weak,ref %d desc %d s %d w %d\n",
+						ref->proc->pid,
+						ref->debug_id,
+						ref->desc,
+						ref->strong,
+						ref->weak);
 			return -EINVAL;
 		}
 		ref->weak--;
@@ -3303,7 +3304,7 @@ static void print_binder_proc(struct seq_file *m,
 		m->count = start_pos;
 }
 
-static const char *binder_return_strings[] = {
+static const char *const binder_return_strings[] = {
 	"BR_ERROR",
 	"BR_OK",
 	"BR_TRANSACTION",
@@ -3324,7 +3325,7 @@ static const char *binder_return_strings[] = {
 	"BR_FAILED_REPLY"
 };
 
-static const char *binder_command_strings[] = {
+static const char *const binder_command_strings[] = {
 	"BC_TRANSACTION",
 	"BC_REPLY",
 	"BC_ACQUIRE_RESULT",
@@ -3344,7 +3345,7 @@ static const char *binder_command_strings[] = {
 	"BC_DEAD_BINDER_DONE"
 };
 
-static const char *binder_objstat_strings[] = {
+static const char *const binder_objstat_strings[] = {
 	"proc",
 	"thread",
 	"node",
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 104+ messages in thread

* Re: [PATCH 2/2] staging:android:fix line over 80 characters issue in binders.c this patch fixes line over 80 characters warning that was found using checkpatch.pl tool Signed-off-by:Anirudh Bhat <abhat38@gmail.com>
  2012-04-18 16:51 ` [PATCH 2/2] staging:android:fix line over 80 characters issue in binders.c this patch fixes line over 80 characters warning that was found using checkpatch.pl tool Signed-off-by:Anirudh Bhat <abhat38@gmail.com> anirudh bhat
@ 2012-04-18 23:50   ` Greg KH
  0 siblings, 0 replies; 104+ messages in thread
From: Greg KH @ 2012-04-18 23:50 UTC (permalink / raw)
  To: anirudh bhat
  Cc: arve, dhowells, chris+android, hpa, devel, anirudh bhat, linux-kernel

On Wed, Apr 18, 2012 at 10:21:55PM +0530, anirudh bhat wrote:
> From: anirudh bhat <anirudhbhat@ubuntu.ubuntu-domain>
> 

Where is patch 1/2?

I need a signed-off line in the patch.

I see the problem (you forgot to put an extra line after the first line
in your git commit), but that doesn't explain where the From: line came
from, that's a new one to me.


> diff --git a/drivers/staging/android/binder.c b/drivers/staging/android/binder.c
> index c283212..ae341e0 100644
> --- a/drivers/staging/android/binder.c
> +++ b/drivers/staging/android/binder.c
> @@ -644,8 +644,8 @@ static int binder_update_page_range(struct binder_proc *proc, int allocate,
>  		goto free_range;
>  
>  	if (vma == NULL) {
> -		printk(KERN_ERR "binder: %d: binder_alloc_buf failed to "
> -		       "map pages in userspace, no vma\n", proc->pid);
> +		printk(KERN_ERR "binder: %d: binder_alloc_buf failed to map pages in userspace, no vma\n",
> +			proc->pid);

No, breaking up printk lines is not acceptable, sorry, we don't take
that kind of patch for cleanups at all.

greg k-h

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [PATCH 2/2] staging:android:fix line over 80 characters issue in binders.c this patch fixes line over 80 characters warning that was found using checkpatch.pl tool Signed-off-by:Anirudh Bhat <abhat38@gmail.com>
  2012-03-14 20:05 [Qemu-devel] 5 euros offerts sur votre première commande Claire de Libeedo
                   ` (9 preceding siblings ...)
  2012-04-18 16:51 ` [PATCH 2/2] staging:android:fix line over 80 characters issue in binders.c this patch fixes line over 80 characters warning that was found using checkpatch.pl tool Signed-off-by:Anirudh Bhat <abhat38@gmail.com> anirudh bhat
@ 2012-04-19  8:22 ` David Howells
  2012-04-25  1:11   ` Calvin Walton
  2012-05-16 22:13 ` [PATCH v4 0/5] support for rtl2832 Thomas Mair
                   ` (4 subsequent siblings)
  15 siblings, 1 reply; 104+ messages in thread
From: David Howells @ 2012-04-19  8:22 UTC (permalink / raw)
  To: anirudh bhat
  Cc: dhowells, arve, chris+android, hpa, devel, linux-kernel, anirudh bhat

anirudh bhat <abhat38@gmail.com> wrote:

> -		printk(KERN_ERR "binder: %d: binder_alloc_buf failed to "
> -		       "map pages in userspace, no vma\n", proc->pid);
> +		printk(KERN_ERR "binder: %d: binder_alloc_buf failed to map pages in userspace, no vma\n",
> +			proc->pid);

Are these the wrong way round?  Surely these are introducing checkpatch
warnings rather than curing them?

If checkpatch is complaining about:

	printk(KERN_ERR "binder: %d: binder_alloc_buf failed to "
	       "map pages in userspace, no vma\n", proc->pid);

being a string split over multiple lines, then *checkpatch* needs to be fixed.

David

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [PATCH 2/2] staging:android:fix line over 80 characters issue in binders.c this patch fixes line over 80 characters warning that was found using checkpatch.pl tool Signed-off-by:Anirudh Bhat <abhat38@gmail.com>
  2012-04-19  8:22 ` David Howells
@ 2012-04-25  1:11   ` Calvin Walton
  0 siblings, 0 replies; 104+ messages in thread
From: Calvin Walton @ 2012-04-25  1:11 UTC (permalink / raw)
  To: David Howells
  Cc: anirudh bhat, arve, chris+android, hpa, devel, linux-kernel,
	anirudh bhat

On Thu, 2012-04-19 at 09:22 +0100, David Howells wrote:
> anirudh bhat <abhat38@gmail.com> wrote:
> 
> > -		printk(KERN_ERR "binder: %d: binder_alloc_buf failed to "
> > -		       "map pages in userspace, no vma\n", proc->pid);
> > +		printk(KERN_ERR "binder: %d: binder_alloc_buf failed to map pages in userspace, no vma\n",
> > +			proc->pid);
> 
> Are these the wrong way round?  Surely these are introducing checkpatch
> warnings rather than curing them?
> 
> If checkpatch is complaining about:
> 
> 	printk(KERN_ERR "binder: %d: binder_alloc_buf failed to "
> 	       "map pages in userspace, no vma\n", proc->pid);
> 
> being a string split over multiple lines, then *checkpatch* needs to be fixed.

This check was added to checkpatch on purpose, with the intention of
allowing you to use e.g.
$ git grep 'failed to match pages'
to find out where in the kernel source the message came from. If the
string is split and wrapped, that doesn't work.

This is mentioned as a recommendation in Documentation/CodingStyle as
well:
> Statements longer than 80 columns will be broken into sensible chunks, unless
> exceeding 80 columns significantly increases readability and does not hide
> information. Descendants are always substantially shorter than the parent and
> are placed substantially to the right. The same applies to function headers
> with a long argument list. However, never break user-visible strings such as
> printk messages, because that breaks the ability to grep for them.

-- 
Calvin Walton <calvin.walton@kepstin.ca>


^ permalink raw reply	[flat|nested] 104+ messages in thread

* [PATCH v4 0/5] support for rtl2832
  2012-03-14 20:05 [Qemu-devel] 5 euros offerts sur votre première commande Claire de Libeedo
                   ` (10 preceding siblings ...)
  2012-04-19  8:22 ` David Howells
@ 2012-05-16 22:13 ` Thomas Mair
  2012-05-16 22:13   ` [PATCH v4 1/5] rtl2832 ver. 0.4: removed signal statistics Thomas Mair
                     ` (5 more replies)
  2012-05-18 18:47 ` [PATCH v5 " Thomas Mair
                   ` (3 subsequent siblings)
  15 siblings, 6 replies; 104+ messages in thread
From: Thomas Mair @ 2012-05-16 22:13 UTC (permalink / raw)
  To: linus-media
  Cc: crope, pomidorabelisima, Thomas Mair, Linux Media Mailing List

This is the new version of the patch series to add support for the
rtl2832 demodulator driver. Before applying the patches you need to
add the fc0012/fc0013 driver from Hans-Frider Vogt.

The changes from the privious version of the patches are manly in the
rtl2832 demod driver to fix code style issues, a nasty bug in the
frontends Makefile and the removal of the signal statistics functionality
which was badly broken in version 0.3 of the driver.

The one thing that I am not really confident with is the Kconfig file for
the dvb frontend driver. Are the changes I made right? And if not what
kind of changes need to be made?

Thanks Antti and poma for your comments!

Regards
Thomas

Thomas Mair (5):
  rtl2832 ver. 0.4: removed signal statistics
  rtl28xxu: support for the rtl2832 demod driver
  rtl28xxu: renamed rtl2831_rd/rtl2831_wr to rtl28xx_rd/rtl28xx_wr
  rtl28xxu: support G-Tek Electronics Group Lifeview LV5TDLX DVB-T
  rtl28xxu: support Terratec Noxon DAB/DAB+ stick

 drivers/media/dvb/dvb-usb/Kconfig          |    3 +
 drivers/media/dvb/dvb-usb/dvb-usb-ids.h    |    3 +
 drivers/media/dvb/dvb-usb/rtl28xxu.c       |  513 ++++++++++++++++--
 drivers/media/dvb/frontends/Kconfig        |    7 +
 drivers/media/dvb/frontends/Makefile       |    1 +
 drivers/media/dvb/frontends/rtl2832.c      |  825 ++++++++++++++++++++++++++++
 drivers/media/dvb/frontends/rtl2832.h      |   74 +++
 drivers/media/dvb/frontends/rtl2832_priv.h |  258 +++++++++
 8 files changed, 1636 insertions(+), 48 deletions(-)
 create mode 100644 drivers/media/dvb/frontends/rtl2832.c
 create mode 100644 drivers/media/dvb/frontends/rtl2832.h
 create mode 100644 drivers/media/dvb/frontends/rtl2832_priv.h

-- 
1.7.7.6


^ permalink raw reply	[flat|nested] 104+ messages in thread

* [PATCH v4 1/5] rtl2832 ver. 0.4: removed signal statistics
  2012-05-16 22:13 ` [PATCH v4 0/5] support for rtl2832 Thomas Mair
@ 2012-05-16 22:13   ` Thomas Mair
  2012-05-17  3:36     ` poma
  2012-05-17 14:19     ` Antti Palosaari
  2012-05-16 22:13   ` [PATCH v4 2/5] rtl28xxu: support for the rtl2832 demod driver Thomas Mair
                     ` (4 subsequent siblings)
  5 siblings, 2 replies; 104+ messages in thread
From: Thomas Mair @ 2012-05-16 22:13 UTC (permalink / raw)
  To: linus-media
  Cc: crope, pomidorabelisima, Thomas Mair, Linux Media Mailing List

Changelog for ver. 0.3:
- removed statistics as their calculation was wrong
- fixed bug in Makefile
- indentation and code style improvements

Signed-off-by: Thomas Mair <thomas.mair86@googlemail.com>
---
 drivers/media/dvb/frontends/Kconfig        |    7 +
 drivers/media/dvb/frontends/Makefile       |    1 +
 drivers/media/dvb/frontends/rtl2832.c      |  825 ++++++++++++++++++++++++++++
 drivers/media/dvb/frontends/rtl2832.h      |   74 +++
 drivers/media/dvb/frontends/rtl2832_priv.h |  258 +++++++++
 5 files changed, 1165 insertions(+), 0 deletions(-)
 create mode 100644 drivers/media/dvb/frontends/rtl2832.c
 create mode 100644 drivers/media/dvb/frontends/rtl2832.h
 create mode 100644 drivers/media/dvb/frontends/rtl2832_priv.h

diff --git a/drivers/media/dvb/frontends/Kconfig b/drivers/media/dvb/frontends/Kconfig
index f479834..f7d67d7 100644
--- a/drivers/media/dvb/frontends/Kconfig
+++ b/drivers/media/dvb/frontends/Kconfig
@@ -432,6 +432,13 @@ config DVB_RTL2830
 	help
 	  Say Y when you want to support this frontend.
 
+config DVB_RTL2832
+	tristate "Realtek RTL2832 DVB-T"
+	depends on DVB_CORE && I2C
+	default m if DVB_FE_CUSTOMISE
+	help
+	  Say Y when you want to support this frontend.
+
 comment "DVB-C (cable) frontends"
 	depends on DVB_CORE
 
diff --git a/drivers/media/dvb/frontends/Makefile b/drivers/media/dvb/frontends/Makefile
index b0381dc..bbf2955 100644
--- a/drivers/media/dvb/frontends/Makefile
+++ b/drivers/media/dvb/frontends/Makefile
@@ -98,6 +98,7 @@ obj-$(CONFIG_DVB_IT913X_FE) += it913x-fe.o
 obj-$(CONFIG_DVB_A8293) += a8293.o
 obj-$(CONFIG_DVB_TDA10071) += tda10071.o
 obj-$(CONFIG_DVB_RTL2830) += rtl2830.o
+obj-$(CONFIG_DVB_RTL2830) += rtl2832.o
 obj-$(CONFIG_DVB_M88RS2000) += m88rs2000.o
 obj-$(CONFIG_DVB_AF9033) += af9033.o
 
diff --git a/drivers/media/dvb/frontends/rtl2832.c b/drivers/media/dvb/frontends/rtl2832.c
new file mode 100644
index 0000000..51c7927
--- /dev/null
+++ b/drivers/media/dvb/frontends/rtl2832.c
@@ -0,0 +1,825 @@
+/*
+ * Realtek RTL2832 DVB-T demodulator driver
+ *
+ * Copyright (C) 2012 Thomas Mair <thomas.mair86@gmail.com>
+ *
+ *	This program is free software; you can redistribute it and/or modify
+ *	it under the terms of the GNU General Public License as published by
+ *	the Free Software Foundation; either version 2 of the License, or
+ *	(at your option) any later version.
+ *
+ *	This program is distributed in the hope that it will be useful,
+ *	but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *	GNU General Public License for more details.
+ *
+ *	You should have received a copy of the GNU General Public License along
+ *	with this program; if not, write to the Free Software Foundation, Inc.,
+ *	51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#include "rtl2832_priv.h"
+
+
+int rtl2832_debug;
+module_param_named(debug, rtl2832_debug, int, 0644);
+MODULE_PARM_DESC(debug, "Turn on/off frontend debugging (default:off).");
+
+
+static int reg_mask[32] = {
+	0x00000001,
+	0x00000003,
+	0x00000007,
+	0x0000000f,
+	0x0000001f,
+	0x0000003f,
+	0x0000007f,
+	0x000000ff,
+	0x000001ff,
+	0x000003ff,
+	0x000007ff,
+	0x00000fff,
+	0x00001fff,
+	0x00003fff,
+	0x00007fff,
+	0x0000ffff,
+	0x0001ffff,
+	0x0003ffff,
+	0x0007ffff,
+	0x000fffff,
+	0x001fffff,
+	0x003fffff,
+	0x007fffff,
+	0x00ffffff,
+	0x01ffffff,
+	0x03ffffff,
+	0x07ffffff,
+	0x0fffffff,
+	0x1fffffff,
+	0x3fffffff,
+	0x7fffffff,
+	0xffffffff
+};
+
+struct rtl2832_reg_entry registers[] = {
+	[DVBT_SOFT_RST]		= {0x1, 0x1,   2, 2},
+	[DVBT_IIC_REPEAT]	= {0x1, 0x1,   3, 3},
+	[DVBT_TR_WAIT_MIN_8K]	= {0x1, 0x88, 11, 2},
+	[DVBT_RSD_BER_FAIL_VAL]	= {0x1, 0x8f, 15, 0},
+	[DVBT_EN_BK_TRK]	= {0x1, 0xa6,  7, 7},
+	[DVBT_AD_EN_REG]	= {0x0, 0x8,   7, 7},
+	[DVBT_AD_EN_REG1]	= {0x0, 0x8,   6, 6},
+	[DVBT_EN_BBIN]		= {0x1, 0xb1,  0, 0},
+	[DVBT_MGD_THD0]		= {0x1, 0x95,  7, 0},
+	[DVBT_MGD_THD1]		= {0x1, 0x96,  7, 0},
+	[DVBT_MGD_THD2]		= {0x1, 0x97,  7, 0},
+	[DVBT_MGD_THD3]		= {0x1, 0x98,  7, 0},
+	[DVBT_MGD_THD4]		= {0x1, 0x99,  7, 0},
+	[DVBT_MGD_THD5]		= {0x1, 0x9a,  7, 0},
+	[DVBT_MGD_THD6]		= {0x1, 0x9b,  7, 0},
+	[DVBT_MGD_THD7]		= {0x1, 0x9c,  7, 0},
+	[DVBT_EN_CACQ_NOTCH]	= {0x1, 0x61,  4, 4},
+	[DVBT_AD_AV_REF]	= {0x0, 0x9,   6, 0},
+	[DVBT_REG_PI]		= {0x0, 0xa,   2, 0},
+	[DVBT_PIP_ON]		= {0x0, 0x21,  3, 3},
+	[DVBT_SCALE1_B92]	= {0x2, 0x92,  7, 0},
+	[DVBT_SCALE1_B93]	= {0x2, 0x93,  7, 0},
+	[DVBT_SCALE1_BA7]	= {0x2, 0xa7,  7, 0},
+	[DVBT_SCALE1_BA9]	= {0x2, 0xa9,  7, 0},
+	[DVBT_SCALE1_BAA]	= {0x2, 0xaa,  7, 0},
+	[DVBT_SCALE1_BAB]	= {0x2, 0xab,  7, 0},
+	[DVBT_SCALE1_BAC]	= {0x2, 0xac,  7, 0},
+	[DVBT_SCALE1_BB0]	= {0x2, 0xb0,  7, 0},
+	[DVBT_SCALE1_BB1]	= {0x2, 0xb1,  7, 0},
+	[DVBT_KB_P1]		= {0x1, 0x64,  3, 1},
+	[DVBT_KB_P2]		= {0x1, 0x64,  6, 4},
+	[DVBT_KB_P3]		= {0x1, 0x65,  2, 0},
+	[DVBT_OPT_ADC_IQ]	= {0x0, 0x6,   5, 4},
+	[DVBT_AD_AVI]		= {0x0, 0x9,   1, 0},
+	[DVBT_AD_AVQ]		= {0x0, 0x9,   3, 2},
+	[DVBT_K1_CR_STEP12]	= {0x2, 0xad,  9, 4},
+	[DVBT_TRK_KS_P2]	= {0x1, 0x6f,  2, 0},
+	[DVBT_TRK_KS_I2]	= {0x1, 0x70,  5, 3},
+	[DVBT_TR_THD_SET2]	= {0x1, 0x72,  3, 0},
+	[DVBT_TRK_KC_P2]	= {0x1, 0x73,  5, 3},
+	[DVBT_TRK_KC_I2]	= {0x1, 0x75,  2, 0},
+	[DVBT_CR_THD_SET2]	= {0x1, 0x76,  7, 6},
+	[DVBT_PSET_IFFREQ]	= {0x1, 0x19, 21, 0},
+	[DVBT_SPEC_INV]		= {0x1, 0x15,  0, 0},
+	[DVBT_RSAMP_RATIO]	= {0x1, 0x9f, 27, 2},
+	[DVBT_CFREQ_OFF_RATIO]	= {0x1, 0x9d, 23, 4},
+	[DVBT_FSM_STAGE]	= {0x3, 0x51,  6, 3},
+	[DVBT_RX_CONSTEL]	= {0x3, 0x3c,  3, 2},
+	[DVBT_RX_HIER]		= {0x3, 0x3c,  6, 4},
+	[DVBT_RX_C_RATE_LP]	= {0x3, 0x3d,  2, 0},
+	[DVBT_RX_C_RATE_HP]	= {0x3, 0x3d,  5, 3},
+	[DVBT_GI_IDX]		= {0x3, 0x51,  1, 0},
+	[DVBT_FFT_MODE_IDX]	= {0x3, 0x51,  2, 2},
+	[DVBT_RSD_BER_EST]	= {0x3, 0x4e, 15, 0},
+	[DVBT_CE_EST_EVM]	= {0x4, 0xc,  15, 0},
+	[DVBT_RF_AGC_VAL]	= {0x3, 0x5b, 13, 0},
+	[DVBT_IF_AGC_VAL]	= {0x3, 0x59, 13, 0},
+	[DVBT_DAGC_VAL]		= {0x3, 0x5,   7, 0},
+	[DVBT_SFREQ_OFF]	= {0x3, 0x18, 13, 0},
+	[DVBT_CFREQ_OFF]	= {0x3, 0x5f, 17, 0},
+	[DVBT_POLAR_RF_AGC]	= {0x0, 0xe,   1, 1},
+	[DVBT_POLAR_IF_AGC]	= {0x0, 0xe,   0, 0},
+	[DVBT_AAGC_HOLD]	= {0x1, 0x4,   5, 5},
+	[DVBT_EN_RF_AGC]	= {0x1, 0x4,   6, 6},
+	[DVBT_EN_IF_AGC]	= {0x1, 0x4,   7, 7},
+	[DVBT_IF_AGC_MIN]	= {0x1, 0x8,   7, 0},
+	[DVBT_IF_AGC_MAX]	= {0x1, 0x9,   7, 0},
+	[DVBT_RF_AGC_MIN]	= {0x1, 0xa,   7, 0},
+	[DVBT_RF_AGC_MAX]	= {0x1, 0xb,   7, 0},
+	[DVBT_IF_AGC_MAN]	= {0x1, 0xc,   6, 6},
+	[DVBT_IF_AGC_MAN_VAL]	= {0x1, 0xc,  13, 0},
+	[DVBT_RF_AGC_MAN]	= {0x1, 0xe,   6, 6},
+	[DVBT_RF_AGC_MAN_VAL]	= {0x1, 0xe,  13, 0},
+	[DVBT_DAGC_TRG_VAL]	= {0x1, 0x12,  7, 0},
+	[DVBT_AGC_TARG_VAL_0]	= {0x1, 0x2,   0, 0},
+	[DVBT_AGC_TARG_VAL_8_1]	= {0x1, 0x3,   7, 0},
+	[DVBT_AAGC_LOOP_GAIN]	= {0x1, 0xc7,  5, 1},
+	[DVBT_LOOP_GAIN2_3_0]	= {0x1, 0x4,   4, 1},
+	[DVBT_LOOP_GAIN2_4]	= {0x1, 0x5,   7, 7},
+	[DVBT_LOOP_GAIN3]	= {0x1, 0xc8,  4, 0},
+	[DVBT_VTOP1]		= {0x1, 0x6,   5, 0},
+	[DVBT_VTOP2]		= {0x1, 0xc9,  5, 0},
+	[DVBT_VTOP3]		= {0x1, 0xca,  5, 0},
+	[DVBT_KRF1]		= {0x1, 0xcb,  7, 0},
+	[DVBT_KRF2]		= {0x1, 0x7,   7, 0},
+	[DVBT_KRF3]		= {0x1, 0xcd,  7, 0},
+	[DVBT_KRF4]		= {0x1, 0xce,  7, 0},
+	[DVBT_EN_GI_PGA]	= {0x1, 0xe5,  0, 0},
+	[DVBT_THD_LOCK_UP]	= {0x1, 0xd9,  8, 0},
+	[DVBT_THD_LOCK_DW]	= {0x1, 0xdb,  8, 0},
+	[DVBT_THD_UP1]		= {0x1, 0xdd,  7, 0},
+	[DVBT_THD_DW1]		= {0x1, 0xde,  7, 0},
+	[DVBT_INTER_CNT_LEN]	= {0x1, 0xd8,  3, 0},
+	[DVBT_GI_PGA_STATE]	= {0x1, 0xe6,  3, 3},
+	[DVBT_EN_AGC_PGA]	= {0x1, 0xd7,  0, 0},
+	[DVBT_CKOUTPAR]		= {0x1, 0x7b,  5, 5},
+	[DVBT_CKOUT_PWR]	= {0x1, 0x7b,  6, 6},
+	[DVBT_SYNC_DUR]		= {0x1, 0x7b,  7, 7},
+	[DVBT_ERR_DUR]		= {0x1, 0x7c,  0, 0},
+	[DVBT_SYNC_LVL]		= {0x1, 0x7c,  1, 1},
+	[DVBT_ERR_LVL]		= {0x1, 0x7c,  2, 2},
+	[DVBT_VAL_LVL]		= {0x1, 0x7c,  3, 3},
+	[DVBT_SERIAL]		= {0x1, 0x7c,  4, 4},
+	[DVBT_SER_LSB]		= {0x1, 0x7c,  5, 5},
+	[DVBT_CDIV_PH0]		= {0x1, 0x7d,  3, 0},
+	[DVBT_CDIV_PH1]		= {0x1, 0x7d,  7, 4},
+	[DVBT_MPEG_IO_OPT_2_2]	= {0x0, 0x6,   7, 7},
+	[DVBT_MPEG_IO_OPT_1_0]	= {0x0, 0x7,   7, 6},
+	[DVBT_CKOUTPAR_PIP]	= {0x0, 0xb7,  4, 4},
+	[DVBT_CKOUT_PWR_PIP]	= {0x0, 0xb7,  3, 3},
+	[DVBT_SYNC_LVL_PIP]	= {0x0, 0xb7,  2, 2},
+	[DVBT_ERR_LVL_PIP]	= {0x0, 0xb7,  1, 1},
+	[DVBT_VAL_LVL_PIP]	= {0x0, 0xb7,  0, 0},
+	[DVBT_CKOUTPAR_PID]	= {0x0, 0xb9,  4, 4},
+	[DVBT_CKOUT_PWR_PID]	= {0x0, 0xb9,  3, 3},
+	[DVBT_SYNC_LVL_PID]	= {0x0, 0xb9,  2, 2},
+	[DVBT_ERR_LVL_PID]	= {0x0, 0xb9,  1, 1},
+	[DVBT_VAL_LVL_PID]	= {0x0, 0xb9,  0, 0},
+	[DVBT_SM_PASS]		= {0x1, 0x93, 11, 0},
+	[DVBT_AD7_SETTING]	= {0x0, 0x11, 15, 0},
+	[DVBT_RSSI_R]		= {0x3, 0x1,   6, 0},
+	[DVBT_ACI_DET_IND]	= {0x3, 0x12,  0, 0},
+	[DVBT_REG_MON]		= {0x0, 0xd,   1, 0},
+	[DVBT_REG_MONSEL]	= {0x0, 0xd,   2, 2},
+	[DVBT_REG_GPE]		= {0x0, 0xd,   7, 7},
+	[DVBT_REG_GPO]		= {0x0, 0x10,  0, 0},
+	[DVBT_REG_4MSEL]	= {0x0, 0x13,  0, 0},
+};
+
+/* write multiple hardware registers */
+static int rtl2832_wr(struct rtl2832_priv *priv, u8 reg, u8 *val, int len)
+{
+	int ret;
+	u8 buf[1+len];
+	struct i2c_msg msg[1] = {
+		{
+			.addr = priv->cfg.i2c_addr,
+			.flags = 0,
+			.len = 1+len,
+			.buf = buf,
+		}
+	};
+
+	buf[0] = reg;
+	memcpy(&buf[1], val, len);
+
+	ret = i2c_transfer(priv->i2c, msg, 1);
+	if (ret == 1) {
+		ret = 0;
+	} else {
+		warn("i2c wr failed=%d reg=%02x len=%d", ret, reg, len);
+		ret = -EREMOTEIO;
+	}
+	return ret;
+}
+
+/* read multiple hardware registers */
+static int rtl2832_rd(struct rtl2832_priv *priv, u8 reg, u8 *val, int len)
+{
+	int ret;
+	struct i2c_msg msg[2] = {
+		{
+			.addr = priv->cfg.i2c_addr,
+			.flags = 0,
+			.len = 1,
+			.buf = &reg,
+		}, {
+			.addr = priv->cfg.i2c_addr,
+			.flags = I2C_M_RD,
+			.len = len,
+			.buf = val,
+		}
+	};
+
+	ret = i2c_transfer(priv->i2c, msg, 2);
+	if (ret == 2) {
+		ret = 0;
+	} else {
+		warn("i2c rd failed=%d reg=%02x len=%d", ret, reg, len);
+		ret = -EREMOTEIO;
+}
+return ret;
+}
+
+/* write multiple registers */
+static int rtl2832_wr_regs(struct rtl2832_priv *priv, u8 reg, u8 page, u8 *val,
+	int len)
+{
+	int ret;
+
+
+	/* switch bank if needed */
+	if (page != priv->page) {
+		ret = rtl2832_wr(priv, 0x00, &page, 1);
+		if (ret)
+			return ret;
+
+		priv->page = page;
+}
+
+return rtl2832_wr(priv, reg, val, len);
+}
+
+/* read multiple registers */
+static int rtl2832_rd_regs(struct rtl2832_priv *priv, u8 reg, u8 page, u8 *val,
+	int len)
+{
+	int ret;
+
+	/* switch bank if needed */
+	if (page != priv->page) {
+		ret = rtl2832_wr(priv, 0x00, &page, 1);
+		if (ret)
+			return ret;
+
+		priv->page = page;
+	}
+
+	return rtl2832_rd(priv, reg, val, len);
+}
+
+#if 0 /* currently not used */
+/* write single register */
+static int rtl2832_wr_reg(struct rtl2832_priv *priv, u8 reg, u8 page, u8 val)
+{
+	return rtl2832_wr_regs(priv, reg, page, &val, 1);
+}
+#endif
+
+/* read single register */
+static int rtl2832_rd_reg(struct rtl2832_priv *priv, u8 reg, u8 page, u8 *val)
+{
+	return rtl2832_rd_regs(priv, reg, page, val, 1);
+}
+
+int rtl2832_rd_demod_reg(struct rtl2832_priv *priv, int reg, u32 *val)
+{
+	int ret;
+
+	u8 reg_start_addr;
+	u8 msb, lsb;
+	u8 page;
+	u8 reading[4];
+	u32 reading_tmp;
+	int i;
+
+	u8 len;
+	u32 mask;
+
+	reg_start_addr = registers[reg].start_address;
+	msb = registers[reg].msb;
+	lsb = registers[reg].lsb;
+	page = registers[reg].page;
+
+	len = (msb >> 3) + 1;
+	mask = reg_mask[msb-lsb];
+
+
+	ret = rtl2832_rd_regs(priv, reg_start_addr, page, &reading[0], len);
+	if (ret)
+		goto err;
+
+	reading_tmp = 0;
+	for (i = 0; i < len; i++)
+		reading_tmp |= reading[i] << ((len-1-i)*8);
+
+	*val = (reading_tmp >> lsb) & mask;
+
+	return ret;
+
+err:
+	dbg("%s: failed=%d", __func__, ret);
+	return ret;
+
+}
+
+int rtl2832_wr_demod_reg(struct rtl2832_priv *priv, int reg, u32 val)
+{
+	int ret, i;
+	u8 len;
+	u8 reg_start_addr;
+	u8 msb, lsb;
+	u8 page;
+	u32 mask;
+
+
+	u8 reading[4];
+	u8 writing[4];
+	u32 reading_tmp;
+	u32 writing_tmp;
+
+
+	reg_start_addr = registers[reg].start_address;
+	msb = registers[reg].msb;
+	lsb = registers[reg].lsb;
+	page = registers[reg].page;
+
+	len = (msb >> 3) + 1;
+	mask = reg_mask[msb-lsb];
+
+
+	ret = rtl2832_rd_regs(priv, reg_start_addr, page, &reading[0], len);
+	if (ret)
+		goto err;
+
+	reading_tmp = 0;
+	for (i = 0; i < len; i++)
+		reading_tmp |= reading[i] << ((len-1-i)*8);
+
+	writing_tmp = reading_tmp & ~(mask << lsb);
+	writing_tmp |= ((val & mask) << lsb);
+
+
+	for (i = 0; i < len; i++)
+		writing[i] = (writing_tmp >> ((len-1-i)*8)) & 0xff;
+
+	ret = rtl2832_wr_regs(priv, reg_start_addr, page, &writing[0], len);
+	if (ret)
+		goto err;
+
+	return ret;
+
+err:
+	dbg("%s: failed=%d", __func__, ret);
+	return ret;
+
+}
+
+
+static int rtl2832_i2c_gate_ctrl(struct dvb_frontend *fe, int enable)
+{
+	int ret;
+	struct rtl2832_priv *priv = fe->demodulator_priv;
+
+	dbg("%s: enable=%d", __func__, enable);
+
+	/* gate already open or close */
+	if (priv->i2c_gate_state == enable)
+		return 0;
+
+	ret = rtl2832_wr_demod_reg(priv, DVBT_IIC_REPEAT, (enable ? 0x1 : 0x0));
+
+	if (ret)
+		goto err;
+
+	priv->i2c_gate_state = enable;
+
+	return ret;
+err:
+	dbg("%s: failed=%d", __func__, ret);
+	return ret;
+}
+
+
+
+static int rtl2832_init(struct dvb_frontend *fe)
+{
+	struct rtl2832_priv *priv = fe->demodulator_priv;
+	int i, ret;
+
+	u8 en_bbin;
+	u64 pset_iffreq;
+
+	/* initialization values for the demodulator registers */
+	struct rtl2832_reg_value rtl2832_initial_regs[] = {
+		{DVBT_AD_EN_REG,		0x1},
+		{DVBT_AD_EN_REG1,		0x1},
+		{DVBT_RSD_BER_FAIL_VAL,		0x2800},
+		{DVBT_MGD_THD0,			0x10},
+		{DVBT_MGD_THD1,			0x20},
+		{DVBT_MGD_THD2,			0x20},
+		{DVBT_MGD_THD3,			0x40},
+		{DVBT_MGD_THD4,			0x22},
+		{DVBT_MGD_THD5,			0x32},
+		{DVBT_MGD_THD6,			0x37},
+		{DVBT_MGD_THD7,			0x39},
+		{DVBT_EN_BK_TRK,		0x0},
+		{DVBT_EN_CACQ_NOTCH,		0x0},
+		{DVBT_AD_AV_REF,		0x2a},
+		{DVBT_REG_PI,			0x6},
+		{DVBT_PIP_ON,			0x0},
+		{DVBT_CDIV_PH0,			0x8},
+		{DVBT_CDIV_PH1,			0x8},
+		{DVBT_SCALE1_B92,		0x4},
+		{DVBT_SCALE1_B93,		0xb0},
+		{DVBT_SCALE1_BA7,		0x78},
+		{DVBT_SCALE1_BA9,		0x28},
+		{DVBT_SCALE1_BAA,		0x59},
+		{DVBT_SCALE1_BAB,		0x83},
+		{DVBT_SCALE1_BAC,		0xd4},
+		{DVBT_SCALE1_BB0,		0x65},
+		{DVBT_SCALE1_BB1,		0x43},
+		{DVBT_KB_P1,			0x1},
+		{DVBT_KB_P2,			0x4},
+		{DVBT_KB_P3,			0x7},
+		{DVBT_K1_CR_STEP12,		0xa},
+		{DVBT_REG_GPE,			0x1},
+		{DVBT_SERIAL,			0x0},
+		{DVBT_CDIV_PH0,			0x9},
+		{DVBT_CDIV_PH1,			0x9},
+		{DVBT_MPEG_IO_OPT_2_2,		0x0},
+		{DVBT_MPEG_IO_OPT_1_0,		0x0},
+		{DVBT_TRK_KS_P2,		0x4},
+		{DVBT_TRK_KS_I2,		0x7},
+		{DVBT_TR_THD_SET2,		0x6},
+		{DVBT_TRK_KC_I2,		0x5},
+		{DVBT_CR_THD_SET2,		0x1},
+		{DVBT_SPEC_INV,			0x0},
+		{DVBT_DAGC_TRG_VAL,		0x5a},
+		{DVBT_AGC_TARG_VAL_0,		0x0},
+		{DVBT_AGC_TARG_VAL_8_1,		0x5a},
+		{DVBT_AAGC_LOOP_GAIN,		0x16},
+		{DVBT_LOOP_GAIN2_3_0,		0x6},
+		{DVBT_LOOP_GAIN2_4,		0x1},
+		{DVBT_LOOP_GAIN3,		0x16},
+		{DVBT_VTOP1,			0x35},
+		{DVBT_VTOP2,			0x21},
+		{DVBT_VTOP3,			0x21},
+		{DVBT_KRF1,			0x0},
+		{DVBT_KRF2,			0x40},
+		{DVBT_KRF3,			0x10},
+		{DVBT_KRF4,			0x10},
+		{DVBT_IF_AGC_MIN,		0x80},
+		{DVBT_IF_AGC_MAX,		0x7f},
+		{DVBT_RF_AGC_MIN,		0x80},
+		{DVBT_RF_AGC_MAX,		0x7f},
+		{DVBT_POLAR_RF_AGC,		0x0},
+		{DVBT_POLAR_IF_AGC,		0x0},
+		{DVBT_AD7_SETTING,		0xe9bf},
+		{DVBT_EN_GI_PGA,		0x0},
+		{DVBT_THD_LOCK_UP,		0x0},
+		{DVBT_THD_LOCK_DW,		0x0},
+		{DVBT_THD_UP1,			0x11},
+		{DVBT_THD_DW1,			0xef},
+		{DVBT_INTER_CNT_LEN,		0xc},
+		{DVBT_GI_PGA_STATE,		0x0},
+		{DVBT_EN_AGC_PGA,		0x1},
+		{DVBT_IF_AGC_MAN,		0x0},
+	};
+
+
+	dbg("%s", __func__);
+
+	en_bbin = (priv->cfg.if_dvbt == 0 ? 0x1 : 0x0);
+
+	/*
+	* PSET_IFFREQ = - floor((IfFreqHz % CrystalFreqHz) * pow(2, 22)
+	*		/ CrystalFreqHz)
+	*/
+	pset_iffreq = priv->cfg.if_dvbt % priv->cfg.xtal;
+	pset_iffreq *= 0x400000;
+	pset_iffreq = div_u64(pset_iffreq, priv->cfg.xtal);
+	pset_iffreq = pset_iffreq & 0x3fffff;
+
+
+
+	for (i = 0; i < ARRAY_SIZE(rtl2832_initial_regs); i++) {
+		ret = rtl2832_wr_demod_reg(priv, rtl2832_initial_regs[i].reg,
+			rtl2832_initial_regs[i].value);
+		if (ret)
+			goto err;
+	}
+
+	/* if frequency settings */
+	ret = rtl2832_wr_demod_reg(priv, DVBT_EN_BBIN, en_bbin);
+		if (ret)
+			goto err;
+
+	ret = rtl2832_wr_demod_reg(priv, DVBT_PSET_IFFREQ, pset_iffreq);
+		if (ret)
+			goto err;
+
+	priv->sleeping = false;
+
+	return ret;
+
+err:
+	dbg("%s: failed=%d", __func__, ret);
+	return ret;
+}
+
+static int rtl2832_sleep(struct dvb_frontend *fe)
+{
+	struct rtl2832_priv *priv = fe->demodulator_priv;
+
+	dbg("%s", __func__);
+	priv->sleeping = true;
+	return 0;
+}
+
+int rtl2832_get_tune_settings(struct dvb_frontend *fe,
+	struct dvb_frontend_tune_settings *s)
+{
+	dbg("%s", __func__);
+	s->min_delay_ms = 1000;
+	s->step_size = fe->ops.info.frequency_stepsize * 2;
+	s->max_drift = (fe->ops.info.frequency_stepsize * 2) + 1;
+	return 0;
+}
+
+static int rtl2832_set_frontend(struct dvb_frontend *fe)
+{
+	struct rtl2832_priv *priv = fe->demodulator_priv;
+	struct dtv_frontend_properties *c = &fe->dtv_property_cache;
+	int ret, i, j;
+	u64 bw_mode, num, num2;
+	u32 resamp_ratio, cfreq_off_ratio;
+
+
+	static u8 bw_params[3][32] = {
+	/* 6 MHz bandwidth */
+		{
+		0xf5, 0xff, 0x15, 0x38, 0x5d, 0x6d, 0x52, 0x07, 0xfa, 0x2f,
+		0x53, 0xf5, 0x3f, 0xca, 0x0b, 0x91, 0xea, 0x30, 0x63, 0xb2,
+		0x13, 0xda, 0x0b, 0xc4, 0x18, 0x7e, 0x16, 0x66, 0x08, 0x67,
+		0x19, 0xe0,
+		},
+
+	/*  7 MHz bandwidth */
+		{
+		0xe7, 0xcc, 0xb5, 0xba, 0xe8, 0x2f, 0x67, 0x61, 0x00, 0xaf,
+		0x86, 0xf2, 0xbf, 0x59, 0x04, 0x11, 0xb6, 0x33, 0xa4, 0x30,
+		0x15, 0x10, 0x0a, 0x42, 0x18, 0xf8, 0x17, 0xd9, 0x07, 0x22,
+		0x19, 0x10,
+		},
+
+	/*  8 MHz bandwidth */
+		{
+		0x09, 0xf6, 0xd2, 0xa7, 0x9a, 0xc9, 0x27, 0x77, 0x06, 0xbf,
+		0xec, 0xf4, 0x4f, 0x0b, 0xfc, 0x01, 0x63, 0x35, 0x54, 0xa7,
+		0x16, 0x66, 0x08, 0xb4, 0x19, 0x6e, 0x19, 0x65, 0x05, 0xc8,
+		0x19, 0xe0,
+		},
+	};
+
+
+	dbg("%s: frequency=%d bandwidth_hz=%d inversion=%d", __func__,
+		c->frequency, c->bandwidth_hz, c->inversion);
+
+
+	/* program tuner */
+	if (fe->ops.tuner_ops.set_params)
+		fe->ops.tuner_ops.set_params(fe);
+
+
+	switch (c->bandwidth_hz) {
+	case 6000000:
+		i = 0;
+		bw_mode = 48000000;
+		break;
+	case 7000000:
+		i = 1;
+		bw_mode = 56000000;
+		break;
+	case 8000000:
+		i = 2;
+		bw_mode = 64000000;
+		break;
+	default:
+		dbg("invalid bandwidth");
+		return -EINVAL;
+	}
+
+	for (j = 0; j < sizeof(bw_params[j]); j++) {
+		ret = rtl2832_wr_regs(priv, 0x1c+j, 1, &bw_params[i][j], 1);
+		if (ret)
+			goto err;
+	}
+
+	/* calculate and set resample ratio
+	* RSAMP_RATIO = floor(CrystalFreqHz * 7 * pow(2, 22)
+	*	/ ConstWithBandwidthMode)
+	*/
+	num = priv->cfg.xtal * 7;
+	num *= 0x400000;
+	num = div_u64(num, bw_mode);
+	resamp_ratio =  num & 0x3ffffff;
+	ret = rtl2832_wr_demod_reg(priv, DVBT_RSAMP_RATIO, resamp_ratio);
+	if (ret)
+		goto err;
+
+	/* calculate and set cfreq off ratio
+	* CFREQ_OFF_RATIO = - floor(ConstWithBandwidthMode * pow(2, 20)
+	*	/ (CrystalFreqHz * 7))
+	*/
+	num = bw_mode << 20;
+	num2 = priv->cfg.xtal * 7;
+	num = div_u64(num, num2);
+	num = -num;
+	cfreq_off_ratio = num & 0xfffff;
+	ret = rtl2832_wr_demod_reg(priv, DVBT_CFREQ_OFF_RATIO, cfreq_off_ratio);
+	if (ret)
+		goto err;
+
+
+	/* soft reset */
+	ret = rtl2832_wr_demod_reg(priv, DVBT_SOFT_RST, 0x1);
+	if (ret)
+		goto err;
+
+	ret = rtl2832_wr_demod_reg(priv, DVBT_SOFT_RST, 0x0);
+	if (ret)
+		goto err;
+
+	return ret;
+err:
+	info("%s: failed=%d", __func__, ret);
+	return ret;
+}
+
+static int rtl2832_read_status(struct dvb_frontend *fe, fe_status_t *status)
+{
+	struct rtl2832_priv *priv = fe->demodulator_priv;
+	int ret;
+	u32 tmp;
+	*status = 0;
+
+
+	dbg("%s", __func__);
+	if (priv->sleeping)
+		return 0;
+
+	ret = rtl2832_rd_demod_reg(priv, DVBT_FSM_STAGE, &tmp);
+	if (ret)
+		goto err;
+
+	if (tmp == 11) {
+		*status |= FE_HAS_SIGNAL | FE_HAS_CARRIER |
+				FE_HAS_VITERBI | FE_HAS_SYNC | FE_HAS_LOCK;
+	}
+	/* TODO find out if this is also true for rtl2832? */
+	/*else if (tmp == 10) {
+		*status |= FE_HAS_SIGNAL | FE_HAS_CARRIER |
+				FE_HAS_VITERBI;
+	}*/
+
+	return ret;
+err:
+	info("%s: failed=%d", __func__, ret);
+	return ret;
+}
+
+static int rtl2832_read_snr(struct dvb_frontend *fe, u16 *snr)
+{
+	*snr = 0;
+	return 0;
+}
+
+static int rtl2832_read_ber(struct dvb_frontend *fe, u32 *ber)
+{
+	*ber = 0;
+	return 0;
+}
+
+static int rtl2832_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
+{
+	*ucblocks = 0;
+	return 0;
+}
+
+
+static int rtl2832_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
+{
+	*strength = 0;
+	return 0;
+}
+
+static struct dvb_frontend_ops rtl2832_ops;
+
+static void rtl2832_release(struct dvb_frontend *fe)
+{
+	struct rtl2832_priv *priv = fe->demodulator_priv;
+
+	dbg("%s", __func__);
+	kfree(priv);
+}
+
+struct dvb_frontend *rtl2832_attach(const struct rtl2832_config *cfg,
+	struct i2c_adapter *i2c)
+{
+	struct rtl2832_priv *priv = NULL;
+	int ret = 0;
+	u8 tmp;
+
+	dbg("%s", __func__);
+
+	/* allocate memory for the internal state */
+	priv = kzalloc(sizeof(struct rtl2832_priv), GFP_KERNEL);
+	if (priv == NULL)
+		goto err;
+
+	/* setup the priv */
+	priv->i2c = i2c;
+	priv->tuner = cfg->tuner;
+	memcpy(&priv->cfg, cfg, sizeof(struct rtl2832_config));
+
+	/* check if the demod is there */
+	ret = rtl2832_rd_reg(priv, 0x00, 0x0, &tmp);
+	if (ret)
+		goto err;
+
+	/* create dvb_frontend */
+	memcpy(&priv->fe.ops, &rtl2832_ops, sizeof(struct dvb_frontend_ops));
+	priv->fe.demodulator_priv = priv;
+
+	/* TODO implement sleep mode */
+	priv->sleeping = true;
+
+	return &priv->fe;
+err:
+	dbg("%s: failed=%d", __func__, ret);
+	kfree(priv);
+	return NULL;
+}
+EXPORT_SYMBOL(rtl2832_attach);
+
+static struct dvb_frontend_ops rtl2832_ops = {
+	.delsys = { SYS_DVBT },
+	.info = {
+		.name = "Realtek RTL2832 (DVB-T)",
+		.frequency_min	  = 174000000,
+		.frequency_max	  = 862000000,
+		.frequency_stepsize = 166667,
+		.caps = FE_CAN_FEC_1_2 |
+			FE_CAN_FEC_2_3 |
+			FE_CAN_FEC_3_4 |
+			FE_CAN_FEC_5_6 |
+			FE_CAN_FEC_7_8 |
+			FE_CAN_FEC_AUTO |
+			FE_CAN_QPSK |
+			FE_CAN_QAM_16 |
+			FE_CAN_QAM_64 |
+			FE_CAN_QAM_AUTO |
+			FE_CAN_TRANSMISSION_MODE_AUTO |
+			FE_CAN_GUARD_INTERVAL_AUTO |
+			FE_CAN_HIERARCHY_AUTO |
+			FE_CAN_RECOVER |
+			FE_CAN_MUTE_TS
+	 },
+
+	.release = rtl2832_release,
+
+	.init = rtl2832_init,
+	.sleep = rtl2832_sleep,
+
+	.get_tune_settings = rtl2832_get_tune_settings,
+
+	.set_frontend = rtl2832_set_frontend,
+
+	.read_status = rtl2832_read_status,
+	.read_snr = rtl2832_read_snr,
+	.read_ber = rtl2832_read_ber,
+	.read_ucblocks = rtl2832_read_ucblocks,
+	.read_signal_strength = rtl2832_read_signal_strength,
+	.i2c_gate_ctrl = rtl2832_i2c_gate_ctrl,
+};
+
+MODULE_AUTHOR("Thomas Mair <mair.thomas86@gmail.com>");
+MODULE_DESCRIPTION("Realtek RTL2832 DVB-T demodulator driver");
+MODULE_LICENSE("GPL");
+MODULE_VERSION("0.4");
diff --git a/drivers/media/dvb/frontends/rtl2832.h b/drivers/media/dvb/frontends/rtl2832.h
new file mode 100644
index 0000000..d94dc9a
--- /dev/null
+++ b/drivers/media/dvb/frontends/rtl2832.h
@@ -0,0 +1,74 @@
+/*
+ * Realtek RTL2832 DVB-T demodulator driver
+ *
+ * Copyright (C) 2012 Thomas Mair <thomas.mair86@gmail.com>
+ *
+ *	This program is free software; you can redistribute it and/or modify
+ *	it under the terms of the GNU General Public License as published by
+ *	the Free Software Foundation; either version 2 of the License, or
+ *	(at your option) any later version.
+ *
+ *	This program is distributed in the hope that it will be useful,
+ *	but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *	GNU General Public License for more details.
+ *
+ *	You should have received a copy of the GNU General Public License along
+ *	with this program; if not, write to the Free Software Foundation, Inc.,
+ *	51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#ifndef RTL2832_H
+#define RTL2832_H
+
+#include <linux/dvb/frontend.h>
+
+struct rtl2832_config {
+	/*
+	 * Demodulator I2C address.
+	 */
+	u8 i2c_addr;
+
+	/*
+	 * Xtal frequency.
+	 * Hz
+	 * 4000000, 16000000, 25000000, 28800000
+	 */
+	u32 xtal;
+
+	/*
+	 * IFs for all used modes.
+	 * Hz
+	 * 4570000, 4571429, 36000000, 36125000, 36166667, 44000000
+	 */
+	u32 if_dvbt;
+
+	/*
+	 */
+	u8 tuner;
+};
+
+
+#if defined(CONFIG_DVB_RTL2832) || \
+	(defined(CONFIG_DVB_RTL2832_MODULE) && defined(MODULE))
+extern struct dvb_frontend *rtl2832_attach(
+	const struct rtl2832_config *cfg,
+	struct i2c_adapter *i2c
+);
+
+extern struct i2c_adapter *rtl2832_get_tuner_i2c_adapter(
+	struct dvb_frontend *fe
+);
+#else
+static inline struct dvb_frontend *rtl2832_attach(
+	const struct rtl2832_config *config,
+	struct i2c_adapter *i2c
+)
+{
+	printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
+	return NULL;
+}
+#endif
+
+
+#endif /* RTL2832_H */
diff --git a/drivers/media/dvb/frontends/rtl2832_priv.h b/drivers/media/dvb/frontends/rtl2832_priv.h
new file mode 100644
index 0000000..3e52674
--- /dev/null
+++ b/drivers/media/dvb/frontends/rtl2832_priv.h
@@ -0,0 +1,258 @@
+/*
+ * Realtek RTL2832 DVB-T demodulator driver
+ *
+ * Copyright (C) 2012 Thomas Mair <thomas.mair86@gmail.com>
+ *
+ *	This program is free software; you can redistribute it and/or modify
+ *	it under the terms of the GNU General Public License as published by
+ *	the Free Software Foundation; either version 2 of the License, or
+ *	(at your option) any later version.
+ *
+ *	This program is distributed in the hope that it will be useful,
+ *	but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *	GNU General Public License for more details.
+ *
+ *	You should have received a copy of the GNU General Public License along
+ *	with this program; if not, write to the Free Software Foundation, Inc.,
+ *	51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#ifndef RTL2832_PRIV_H
+#define RTL2832_PRIV_H
+
+#include "dvb_frontend.h"
+#include "rtl2832.h"
+
+#define LOG_PREFIX "rtl2832"
+
+#undef dbg
+#define dbg(f, arg...) \
+	if (rtl2832_debug) \
+		printk(KERN_INFO LOG_PREFIX": " f "\n" , ## arg)
+#undef err
+#define err(f, arg...)  printk(KERN_ERR	LOG_PREFIX": " f "\n" , ## arg)
+#undef info
+#define info(f, arg...) printk(KERN_INFO LOG_PREFIX": " f "\n" , ## arg)
+#undef warn
+#define warn(f, arg...) printk(KERN_WARNING LOG_PREFIX": " f "\n" , ## arg)
+
+struct rtl2832_priv {
+	struct i2c_adapter *i2c;
+	struct dvb_frontend fe;
+	struct rtl2832_config cfg;
+
+	bool i2c_gate_state;
+	bool sleeping;
+
+	u8 tuner;
+	u8 page; /* active register page */
+};
+
+struct rtl2832_reg_entry {
+	u8 page;
+	u8 start_address;
+	u8 msb;
+	u8 lsb;
+};
+
+struct rtl2832_reg_value {
+	int reg;
+	u32 value;
+};
+
+
+/* Demod register bit names */
+enum DVBT_REG_BIT_NAME {
+	DVBT_SOFT_RST,
+	DVBT_IIC_REPEAT,
+	DVBT_TR_WAIT_MIN_8K,
+	DVBT_RSD_BER_FAIL_VAL,
+	DVBT_EN_BK_TRK,
+	DVBT_REG_PI,
+	DVBT_REG_PFREQ_1_0,
+	DVBT_PD_DA8,
+	DVBT_LOCK_TH,
+	DVBT_BER_PASS_SCAL,
+	DVBT_CE_FFSM_BYPASS,
+	DVBT_ALPHAIIR_N,
+	DVBT_ALPHAIIR_DIF,
+	DVBT_EN_TRK_SPAN,
+	DVBT_LOCK_TH_LEN,
+	DVBT_CCI_THRE,
+	DVBT_CCI_MON_SCAL,
+	DVBT_CCI_M0,
+	DVBT_CCI_M1,
+	DVBT_CCI_M2,
+	DVBT_CCI_M3,
+	DVBT_SPEC_INIT_0,
+	DVBT_SPEC_INIT_1,
+	DVBT_SPEC_INIT_2,
+	DVBT_AD_EN_REG,
+	DVBT_AD_EN_REG1,
+	DVBT_EN_BBIN,
+	DVBT_MGD_THD0,
+	DVBT_MGD_THD1,
+	DVBT_MGD_THD2,
+	DVBT_MGD_THD3,
+	DVBT_MGD_THD4,
+	DVBT_MGD_THD5,
+	DVBT_MGD_THD6,
+	DVBT_MGD_THD7,
+	DVBT_EN_CACQ_NOTCH,
+	DVBT_AD_AV_REF,
+	DVBT_PIP_ON,
+	DVBT_SCALE1_B92,
+	DVBT_SCALE1_B93,
+	DVBT_SCALE1_BA7,
+	DVBT_SCALE1_BA9,
+	DVBT_SCALE1_BAA,
+	DVBT_SCALE1_BAB,
+	DVBT_SCALE1_BAC,
+	DVBT_SCALE1_BB0,
+	DVBT_SCALE1_BB1,
+	DVBT_KB_P1,
+	DVBT_KB_P2,
+	DVBT_KB_P3,
+	DVBT_OPT_ADC_IQ,
+	DVBT_AD_AVI,
+	DVBT_AD_AVQ,
+	DVBT_K1_CR_STEP12,
+	DVBT_TRK_KS_P2,
+	DVBT_TRK_KS_I2,
+	DVBT_TR_THD_SET2,
+	DVBT_TRK_KC_P2,
+	DVBT_TRK_KC_I2,
+	DVBT_CR_THD_SET2,
+	DVBT_PSET_IFFREQ,
+	DVBT_SPEC_INV,
+	DVBT_BW_INDEX,
+	DVBT_RSAMP_RATIO,
+	DVBT_CFREQ_OFF_RATIO,
+	DVBT_FSM_STAGE,
+	DVBT_RX_CONSTEL,
+	DVBT_RX_HIER,
+	DVBT_RX_C_RATE_LP,
+	DVBT_RX_C_RATE_HP,
+	DVBT_GI_IDX,
+	DVBT_FFT_MODE_IDX,
+	DVBT_RSD_BER_EST,
+	DVBT_CE_EST_EVM,
+	DVBT_RF_AGC_VAL,
+	DVBT_IF_AGC_VAL,
+	DVBT_DAGC_VAL,
+	DVBT_SFREQ_OFF,
+	DVBT_CFREQ_OFF,
+	DVBT_POLAR_RF_AGC,
+	DVBT_POLAR_IF_AGC,
+	DVBT_AAGC_HOLD,
+	DVBT_EN_RF_AGC,
+	DVBT_EN_IF_AGC,
+	DVBT_IF_AGC_MIN,
+	DVBT_IF_AGC_MAX,
+	DVBT_RF_AGC_MIN,
+	DVBT_RF_AGC_MAX,
+	DVBT_IF_AGC_MAN,
+	DVBT_IF_AGC_MAN_VAL,
+	DVBT_RF_AGC_MAN,
+	DVBT_RF_AGC_MAN_VAL,
+	DVBT_DAGC_TRG_VAL,
+	DVBT_AGC_TARG_VAL,
+	DVBT_LOOP_GAIN_3_0,
+	DVBT_LOOP_GAIN_4,
+	DVBT_VTOP,
+	DVBT_KRF,
+	DVBT_AGC_TARG_VAL_0,
+	DVBT_AGC_TARG_VAL_8_1,
+	DVBT_AAGC_LOOP_GAIN,
+	DVBT_LOOP_GAIN2_3_0,
+	DVBT_LOOP_GAIN2_4,
+	DVBT_LOOP_GAIN3,
+	DVBT_VTOP1,
+	DVBT_VTOP2,
+	DVBT_VTOP3,
+	DVBT_KRF1,
+	DVBT_KRF2,
+	DVBT_KRF3,
+	DVBT_KRF4,
+	DVBT_EN_GI_PGA,
+	DVBT_THD_LOCK_UP,
+	DVBT_THD_LOCK_DW,
+	DVBT_THD_UP1,
+	DVBT_THD_DW1,
+	DVBT_INTER_CNT_LEN,
+	DVBT_GI_PGA_STATE,
+	DVBT_EN_AGC_PGA,
+	DVBT_CKOUTPAR,
+	DVBT_CKOUT_PWR,
+	DVBT_SYNC_DUR,
+	DVBT_ERR_DUR,
+	DVBT_SYNC_LVL,
+	DVBT_ERR_LVL,
+	DVBT_VAL_LVL,
+	DVBT_SERIAL,
+	DVBT_SER_LSB,
+	DVBT_CDIV_PH0,
+	DVBT_CDIV_PH1,
+	DVBT_MPEG_IO_OPT_2_2,
+	DVBT_MPEG_IO_OPT_1_0,
+	DVBT_CKOUTPAR_PIP,
+	DVBT_CKOUT_PWR_PIP,
+	DVBT_SYNC_LVL_PIP,
+	DVBT_ERR_LVL_PIP,
+	DVBT_VAL_LVL_PIP,
+	DVBT_CKOUTPAR_PID,
+	DVBT_CKOUT_PWR_PID,
+	DVBT_SYNC_LVL_PID,
+	DVBT_ERR_LVL_PID,
+	DVBT_VAL_LVL_PID,
+	DVBT_SM_PASS,
+	DVBT_UPDATE_REG_2,
+	DVBT_BTHD_P3,
+	DVBT_BTHD_D3,
+	DVBT_FUNC4_REG0,
+	DVBT_FUNC4_REG1,
+	DVBT_FUNC4_REG2,
+	DVBT_FUNC4_REG3,
+	DVBT_FUNC4_REG4,
+	DVBT_FUNC4_REG5,
+	DVBT_FUNC4_REG6,
+	DVBT_FUNC4_REG7,
+	DVBT_FUNC4_REG8,
+	DVBT_FUNC4_REG9,
+	DVBT_FUNC4_REG10,
+	DVBT_FUNC5_REG0,
+	DVBT_FUNC5_REG1,
+	DVBT_FUNC5_REG2,
+	DVBT_FUNC5_REG3,
+	DVBT_FUNC5_REG4,
+	DVBT_FUNC5_REG5,
+	DVBT_FUNC5_REG6,
+	DVBT_FUNC5_REG7,
+	DVBT_FUNC5_REG8,
+	DVBT_FUNC5_REG9,
+	DVBT_FUNC5_REG10,
+	DVBT_FUNC5_REG11,
+	DVBT_FUNC5_REG12,
+	DVBT_FUNC5_REG13,
+	DVBT_FUNC5_REG14,
+	DVBT_FUNC5_REG15,
+	DVBT_FUNC5_REG16,
+	DVBT_FUNC5_REG17,
+	DVBT_FUNC5_REG18,
+	DVBT_AD7_SETTING,
+	DVBT_RSSI_R,
+	DVBT_ACI_DET_IND,
+	DVBT_REG_MON,
+	DVBT_REG_MONSEL,
+	DVBT_REG_GPE,
+	DVBT_REG_GPO,
+	DVBT_REG_4MSEL,
+	DVBT_TEST_REG_1,
+	DVBT_TEST_REG_2,
+	DVBT_TEST_REG_3,
+	DVBT_TEST_REG_4,
+	DVBT_REG_BIT_NAME_ITEM_TERMINATOR,
+};
+
+#endif /* RTL2832_PRIV_H */
-- 
1.7.7.6


^ permalink raw reply related	[flat|nested] 104+ messages in thread

* [PATCH v4 2/5] rtl28xxu: support for the rtl2832 demod driver
  2012-05-16 22:13 ` [PATCH v4 0/5] support for rtl2832 Thomas Mair
  2012-05-16 22:13   ` [PATCH v4 1/5] rtl2832 ver. 0.4: removed signal statistics Thomas Mair
@ 2012-05-16 22:13   ` Thomas Mair
  2012-05-17 14:41     ` Antti Palosaari
  2012-05-16 22:13   ` [PATCH v4 3/5] rtl28xxu: renamed rtl2831_rd/rtl2831_wr to rtl28xx_rd/rtl28xx_wr Thomas Mair
                     ` (3 subsequent siblings)
  5 siblings, 1 reply; 104+ messages in thread
From: Thomas Mair @ 2012-05-16 22:13 UTC (permalink / raw)
  To: linus-media
  Cc: crope, pomidorabelisima, Thomas Mair, Linux Media Mailing List

This only adds support for the Terratec Cinergy T Stick Black device.

Signed-off-by: Thomas Mair <thomas.mair86@googlemail.com>
---
 drivers/media/dvb/dvb-usb/Kconfig       |    3 +
 drivers/media/dvb/dvb-usb/dvb-usb-ids.h |    1 +
 drivers/media/dvb/dvb-usb/rtl28xxu.c    |  431 +++++++++++++++++++++++++++++--
 3 files changed, 411 insertions(+), 24 deletions(-)

diff --git a/drivers/media/dvb/dvb-usb/Kconfig b/drivers/media/dvb/dvb-usb/Kconfig
index be1db75..98dd0d8 100644
--- a/drivers/media/dvb/dvb-usb/Kconfig
+++ b/drivers/media/dvb/dvb-usb/Kconfig
@@ -417,9 +417,12 @@ config DVB_USB_RTL28XXU
 	tristate "Realtek RTL28xxU DVB USB support"
 	depends on DVB_USB && EXPERIMENTAL
 	select DVB_RTL2830
+	select DVB_RTL2832
 	select MEDIA_TUNER_QT1010 if !MEDIA_TUNER_CUSTOMISE
 	select MEDIA_TUNER_MT2060 if !MEDIA_TUNER_CUSTOMISE
 	select MEDIA_TUNER_MXL5005S if !MEDIA_TUNER_CUSTOMISE
+	select MEDIA_TUNER_FC0012 if !MEDIA_TUNER_CUSTOMISE
+	select MEDIA_TUNER_FC0013 if !MEDIA_TUNER_CUSTOMISE
 	help
 	  Say Y here to support the Realtek RTL28xxU DVB USB receiver.
 
diff --git a/drivers/media/dvb/dvb-usb/dvb-usb-ids.h b/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
index 2418e41..fd37be0 100644
--- a/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
+++ b/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
@@ -157,6 +157,7 @@
 #define USB_PID_TERRATEC_CINERGY_T_STICK		0x0093
 #define USB_PID_TERRATEC_CINERGY_T_STICK_RC		0x0097
 #define USB_PID_TERRATEC_CINERGY_T_STICK_DUAL_RC	0x0099
+#define USB_PID_TERRATEC_CINERGY_T_STICK_BLACK_REV1	0x00a9
 #define USB_PID_TWINHAN_VP7041_COLD			0x3201
 #define USB_PID_TWINHAN_VP7041_WARM			0x3202
 #define USB_PID_TWINHAN_VP7020_COLD			0x3203
diff --git a/drivers/media/dvb/dvb-usb/rtl28xxu.c b/drivers/media/dvb/dvb-usb/rtl28xxu.c
index 8f4736a..bb66771 100644
--- a/drivers/media/dvb/dvb-usb/rtl28xxu.c
+++ b/drivers/media/dvb/dvb-usb/rtl28xxu.c
@@ -3,6 +3,7 @@
  *
  * Copyright (C) 2009 Antti Palosaari <crope@iki.fi>
  * Copyright (C) 2011 Antti Palosaari <crope@iki.fi>
+ * Copyright (C) 2012 Thomas Mair <thomas.mair86@googlemail.com>
  *
  *    This program is free software; you can redistribute it and/or modify
  *    it under the terms of the GNU General Public License as published by
@@ -22,10 +23,12 @@
 #include "rtl28xxu.h"
 
 #include "rtl2830.h"
+#include "rtl2832.h"
 
 #include "qt1010.h"
 #include "mt2060.h"
 #include "mxl5005s.h"
+#include "fc0012.h"
 
 /* debug */
 static int dvb_usb_rtl28xxu_debug;
@@ -378,34 +381,153 @@ err:
 	return ret;
 }
 
+static struct rtl2832_config rtl28xxu_rtl2832_fc0012_config = {
+	.i2c_addr = 0x10, /* 0x20 */
+	.xtal = 28800000,
+	.if_dvbt = 0,
+	.tuner = TUNER_RTL2832_FC0012
+};
+
+
+static int rtl2832u_fc0012_tuner_callback(struct dvb_usb_device *d,
+		int cmd, int arg)
+{
+	int ret;
+	u8 val;
+
+	deb_info("%s cmd=%d arg=%d\n", __func__, cmd, arg);
+	switch (cmd) {
+	case FC_FE_CALLBACK_VHF_ENABLE:
+		/* set output values */
+		ret = rtl2831_rd_reg(d, SYS_GPIO_OUT_VAL, &val);
+		if (ret)
+			goto err;
+
+		if (arg)
+			val &= 0xbf; /* set GPIO6 low */
+		else
+			val |= 0x40; /* set GPIO6 high */
+
+
+		ret = rtl2831_wr_reg(d, SYS_GPIO_OUT_VAL, val);
+		if (ret)
+			goto err;
+		break;
+	default:
+		ret = -EINVAL;
+		goto err;
+	}
+	return 0;
+
+err:
+	err("%s: failed=%d\n", __func__, ret);
+
+	return ret;
+}
+
+
+static int rtl2832u_fc0013_tuner_callback(struct dvb_usb_device *d,
+		int cmd, int arg)
+{
+	/* TODO implement*/
+	return 0;
+}
+
+static int rtl2832u_tuner_callback(struct dvb_usb_device *d, int cmd, int arg)
+{
+	struct rtl28xxu_priv *priv = d->priv;
+
+	switch (priv->tuner) {
+	case TUNER_RTL2832_FC0012:
+		return rtl2832u_fc0012_tuner_callback(d, cmd, arg);
+
+	case TUNER_RTL2832_FC0013:
+		return rtl2832u_fc0013_tuner_callback(d, cmd, arg);
+	default:
+		break;
+	}
+
+	return -ENODEV;
+}
+
+static int rtl2832u_frontend_callback(void *adapter_priv, int component,
+				    int cmd, int arg)
+{
+	struct i2c_adapter *adap = adapter_priv;
+	struct dvb_usb_device *d = i2c_get_adapdata(adap);
+
+	switch (component) {
+	case DVB_FRONTEND_COMPONENT_TUNER:
+		return rtl2832u_tuner_callback(d, cmd, arg);
+	default:
+		break;
+	}
+
+	return -EINVAL;
+}
+
+
+
+
 static int rtl2832u_frontend_attach(struct dvb_usb_adapter *adap)
 {
 	int ret;
 	struct rtl28xxu_priv *priv = adap->dev->priv;
-	u8 buf[1];
+	struct rtl2832_config *rtl2832_config;
+
+	u8 buf[2], val;
 	/* open RTL2832U/RTL2832 I2C gate */
 	struct rtl28xxu_req req_gate_open = {0x0120, 0x0011, 0x0001, "\x18"};
 	/* close RTL2832U/RTL2832 I2C gate */
 	struct rtl28xxu_req req_gate_close = {0x0120, 0x0011, 0x0001, "\x10"};
+	/* for FC0012 tuner probe */
+	struct rtl28xxu_req req_fc0012 = {0x00c6, CMD_I2C_RD, 1, buf};
+	/* for FC0013 tuner probe */
+	struct rtl28xxu_req req_fc0013 = {0x00c6, CMD_I2C_RD, 1, buf};
+	/* for MT2266 tuner probe */
+	struct rtl28xxu_req req_mt2266 = {0x00c0, CMD_I2C_RD, 1, buf};
 	/* for FC2580 tuner probe */
 	struct rtl28xxu_req req_fc2580 = {0x01ac, CMD_I2C_RD, 1, buf};
+	/* for MT2063 tuner probe */
+	struct rtl28xxu_req req_mt2063 = {0x00c0, CMD_I2C_RD, 1, buf};
+	/* for MAX3543 tuner probe */
+	struct rtl28xxu_req req_max3543 = {0x00c0, CMD_I2C_RD, 1, buf};
+	/* for TUA9001 tuner probe */
+	struct rtl28xxu_req req_tua9001 = {0x7ec0, CMD_I2C_RD, 2, buf};
+	/* for MXL5007T tuner probe */
+	struct rtl28xxu_req req_mxl5007t = {0xd9c0, CMD_I2C_RD, 1, buf};
+	/* for E4000 tuner probe */
+	struct rtl28xxu_req req_e4000 = {0x02c8, CMD_I2C_RD, 1, buf};
+	/* for TDA18272 tuner probe */
+	struct rtl28xxu_req req_tda18272 = {0x00c0, CMD_I2C_RD, 2, buf};
 
 	deb_info("%s:\n", __func__);
 
-	/* GPIO direction */
-	ret = rtl2831_wr_reg(adap->dev, SYS_GPIO_DIR, 0x0a);
+
+	ret = rtl2831_rd_reg(adap->dev, SYS_GPIO_DIR, &val);
 	if (ret)
 		goto err;
 
-	/* enable as output GPIO0, GPIO2, GPIO4 */
-	ret = rtl2831_wr_reg(adap->dev, SYS_GPIO_OUT_EN, 0x15);
+	val &= 0xbf;
+
+	ret = rtl2831_wr_reg(adap->dev, SYS_GPIO_DIR, val);
 	if (ret)
 		goto err;
 
-	ret = rtl2831_wr_reg(adap->dev, SYS_DEMOD_CTL, 0xe8);
+
+	/* enable as output GPIO3 and GPIO6*/
+	ret = rtl2831_rd_reg(adap->dev, SYS_GPIO_OUT_EN, &val);
 	if (ret)
 		goto err;
 
+	val |= 0x48;
+
+	ret = rtl2831_wr_reg(adap->dev, SYS_GPIO_OUT_EN, val);
+	if (ret)
+		goto err;
+
+
+
 	/*
 	 * Probe used tuner. We need to know used tuner before demod attach
 	 * since there is some demod params needed to set according to tuner.
@@ -416,15 +538,95 @@ static int rtl2832u_frontend_attach(struct dvb_usb_adapter *adap)
 	if (ret)
 		goto err;
 
+	priv->tuner = TUNER_NONE;
+
+	/* check FC0012 ID register; reg=00 val=a1 */
+	ret = rtl28xxu_ctrl_msg(adap->dev, &req_fc0012);
+	if (ret == 0 && buf[0] == 0xa1) {
+		priv->tuner = TUNER_RTL2832_FC0012;
+		rtl2832_config = &rtl28xxu_rtl2832_fc0012_config;
+		info("%s: FC0012 tuner found", __func__);
+		goto found;
+	}
+
+	/* check FC0013 ID register; reg=00 val=a3 */
+	ret = rtl28xxu_ctrl_msg(adap->dev, &req_fc0013);
+	if (ret == 0 && buf[0] == 0xa3) {
+		priv->tuner = TUNER_RTL2832_FC0013;
+		info("%s: FC0013 tuner found", __func__);
+		goto found;
+	}
+
+	/* check MT2266 ID register; reg=00 val=85 */
+	ret = rtl28xxu_ctrl_msg(adap->dev, &req_mt2266);
+	if (ret == 0 && buf[0] == 0x85) {
+		priv->tuner = TUNER_RTL2832_MT2266;
+		/* TODO implement tuner */
+		info("%s: MT2266 tuner found", __func__);
+		goto found;
+	}
+
 	/* check FC2580 ID register; reg=01 val=56 */
 	ret = rtl28xxu_ctrl_msg(adap->dev, &req_fc2580);
 	if (ret == 0 && buf[0] == 0x56) {
 		priv->tuner = TUNER_RTL2832_FC2580;
-		deb_info("%s: FC2580\n", __func__);
+		/* TODO implement tuner */
+		info("%s: FC2580 tuner found", __func__);
+		goto found;
+	}
+
+	/* check MT2063 ID register; reg=00 val=9e || 9c */
+	ret = rtl28xxu_ctrl_msg(adap->dev, &req_mt2063);
+	if (ret == 0 && (buf[0] == 0x9e || buf[0] == 0x9c)) {
+		priv->tuner = TUNER_RTL2832_MT2063;
+		/* TODO implement tuner */
+		info("%s: MT2063 tuner found", __func__);
+		goto found;
+	}
+
+	/* check MAX3543 ID register; reg=00 val=38 */
+	ret = rtl28xxu_ctrl_msg(adap->dev, &req_max3543);
+	if (ret == 0 && buf[0] == 0x38) {
+		priv->tuner = TUNER_RTL2832_MAX3543;
+		/* TODO implement tuner */
+		info("%s: MAX3534 tuner found", __func__);
+		goto found;
+	}
+
+	/* check TUA9001 ID register; reg=7e val=2328 */
+	ret = rtl28xxu_ctrl_msg(adap->dev, &req_tua9001);
+	if (ret == 0 && buf[0] == 0x23 && buf[1] == 0x28) {
+		priv->tuner = TUNER_RTL2832_TUA9001;
+		/* TODO implement tuner */
+		info("%s: TUA9001 tuner found", __func__);
+		goto found;
+	}
+
+	/* check MXL5007R ID register; reg=d9 val=14 */
+	ret = rtl28xxu_ctrl_msg(adap->dev, &req_mxl5007t);
+	if (ret == 0 && buf[0] == 0x14) {
+		priv->tuner = TUNER_RTL2832_MXL5007T;
+		/* TODO implement tuner */
+		info("%s: MXL5007T tuner found", __func__);
+		goto found;
+	}
+
+	/* check E4000 ID register; reg=02 val=40 */
+	ret = rtl28xxu_ctrl_msg(adap->dev, &req_e4000);
+	if (ret == 0 && buf[0] == 0x40) {
+		priv->tuner = TUNER_RTL2832_E4000;
+		/* TODO implement tuner */
+		info("%s: E4000 tuner found", __func__);
+		goto found;
+	}
+
+	/* check TDA18272 ID register; reg=00 val=c760  */
+	ret = rtl28xxu_ctrl_msg(adap->dev, &req_tda18272);
+	if (ret == 0 && (buf[0] == 0xc7 || buf[1] == 0x60)) {
+		priv->tuner = TUNER_RTL2832_TDA18272;
+		/* TODO implement tuner */
+		info("%s: TDA18272 tuner found", __func__);
 		goto found;
-	} else {
-		deb_info("%s: FC2580 probe failed=%d - %02x\n",
-			__func__, ret, buf[0]);
 	}
 
 	/* close demod I2C gate */
@@ -433,8 +635,9 @@ static int rtl2832u_frontend_attach(struct dvb_usb_adapter *adap)
 		goto err;
 
 	/* tuner not found */
+	deb_info("No compatible tuner found");
 	ret = -ENODEV;
-	goto err;
+	return ret;
 
 found:
 	/* close demod I2C gate */
@@ -443,9 +646,18 @@ found:
 		goto err;
 
 	/* attach demodulator */
-	/* TODO: */
+	adap->fe_adap[0].fe = dvb_attach(rtl2832_attach, rtl2832_config,
+		&adap->dev->i2c_adap);
+		if (adap->fe_adap[0].fe == NULL) {
+			ret = -ENODEV;
+			goto err;
+		}
+
+	/* set fe callbacks */
+	adap->fe_adap[0].fe->callback = rtl2832u_frontend_callback;
 
 	return ret;
+
 err:
 	deb_info("%s: failed=%d\n", __func__, ret);
 	return ret;
@@ -528,9 +740,15 @@ static int rtl2832u_tuner_attach(struct dvb_usb_adapter *adap)
 	deb_info("%s:\n", __func__);
 
 	switch (priv->tuner) {
-	case TUNER_RTL2832_FC2580:
-		/* TODO: */
-		fe = NULL;
+	case TUNER_RTL2832_FC0012:
+		fe = dvb_attach(fc0012_attach, adap->fe_adap[0].fe,
+			&adap->dev->i2c_adap, 0xc6>>1, 0, FC_XTAL_28_8_MHZ);
+
+		/* since fc0012 includs reading the signal strength delegate
+		 * that to the tuner driver */
+		adap->fe_adap[0].fe->ops.read_signal_strength = adap->fe_adap[0].
+				fe->ops.tuner_ops.get_rf_strength;
+		return 0;
 		break;
 	default:
 		fe = NULL;
@@ -548,7 +766,7 @@ err:
 	return ret;
 }
 
-static int rtl28xxu_streaming_ctrl(struct dvb_usb_adapter *adap , int onoff)
+static int rtl2831u_streaming_ctrl(struct dvb_usb_adapter *adap , int onoff)
 {
 	int ret;
 	u8 buf[2], gpio;
@@ -583,7 +801,33 @@ err:
 	return ret;
 }
 
-static int rtl28xxu_power_ctrl(struct dvb_usb_device *d, int onoff)
+static int rtl2832u_streaming_ctrl(struct dvb_usb_adapter *adap , int onoff)
+{
+	int ret;
+	u8 buf[2];
+
+	deb_info("%s: onoff=%d\n", __func__, onoff);
+
+
+	if (onoff) {
+		buf[0] = 0x00;
+		buf[1] = 0x00;
+	} else {
+		buf[0] = 0x10; /* stall EPA */
+		buf[1] = 0x02; /* reset EPA */
+	}
+
+	ret = rtl2831_wr_regs(adap->dev, USB_EPA_CTL, buf, 2);
+	if (ret)
+		goto err;
+
+	return ret;
+err:
+	deb_info("%s: failed=%d\n", __func__, ret);
+	return ret;
+}
+
+static int rtl2831u_power_ctrl(struct dvb_usb_device *d, int onoff)
 {
 	int ret;
 	u8 gpio, sys0;
@@ -631,6 +875,128 @@ err:
 	return ret;
 }
 
+static int rtl2832u_power_ctrl(struct dvb_usb_device *d, int onoff)
+{
+	int ret;
+	u8 val;
+
+	deb_info("%s: onoff=%d\n", __func__, onoff);
+
+	if (onoff) {
+		/* set output values */
+		ret = rtl2831_rd_reg(d, SYS_GPIO_OUT_VAL, &val);
+		if (ret)
+			goto err;
+
+		val |= 0x08;
+		val &= 0xef;
+
+		ret = rtl2831_wr_reg(d, SYS_GPIO_OUT_VAL, val);
+		if (ret)
+			goto err;
+
+		/* demod_ctl_1 */
+		ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL1, &val);
+		if (ret)
+			goto err;
+
+		val &= 0xef;
+
+		ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL1, val);
+		if (ret)
+			goto err;
+
+		/* demod control */
+		/* PLL enable */
+		ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL, &val);
+		if (ret)
+			goto err;
+
+		/* bit 7 to 1 */
+		val |= 0x80;
+
+		ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL, val);
+		if (ret)
+			goto err;
+
+		/* demod HW reset */
+		ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL, &val);
+		if (ret)
+			goto err;
+		/* bit 5 to 0 */
+		val &= 0xdf;
+
+		ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL, val);
+		if (ret)
+			goto err;
+
+		ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL, &val);
+		if (ret)
+			goto err;
+
+		val |= 0x20;
+
+		ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL, val);
+		if (ret)
+			goto err;
+
+		mdelay(5);
+
+		/*enable ADC_Q and ADC_I */
+		ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL, &val);
+		if (ret)
+			goto err;
+
+		val |= 0x48;
+
+		ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL, val);
+		if (ret)
+			goto err;
+
+
+	} else {
+		/* demod_ctl_1 */
+		ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL1, &val);
+		if (ret)
+			goto err;
+
+		val |= 0x0c;
+
+		ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL1, val);
+		if (ret)
+			goto err;
+
+		/* set output values */
+		ret = rtl2831_rd_reg(d, SYS_GPIO_OUT_VAL, &val);
+		if (ret)
+				goto err;
+
+		val |= 0x10;
+
+		ret = rtl2831_wr_reg(d, SYS_GPIO_OUT_VAL, val);
+		if (ret)
+			goto err;
+
+		/* demod control */
+		ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL, &val);
+		if (ret)
+			goto err;
+
+		val &= 0x37;
+
+		ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL, val);
+		if (ret)
+			goto err;
+
+	}
+
+	return ret;
+err:
+	deb_info("%s: failed=%d\n", __func__, ret);
+	return ret;
+}
+
+
 static int rtl2831u_rc_query(struct dvb_usb_device *d)
 {
 	int ret, i;
@@ -768,6 +1134,7 @@ enum rtl28xxu_usb_table_entry {
 	RTL2831U_0BDA_2831,
 	RTL2831U_14AA_0160,
 	RTL2831U_14AA_0161,
+	RTL2832U_0CCD_00A9,
 };
 
 static struct usb_device_id rtl28xxu_table[] = {
@@ -780,6 +1147,8 @@ static struct usb_device_id rtl28xxu_table[] = {
 		USB_DEVICE(USB_VID_WIDEVIEW, USB_PID_FREECOM_DVBT_2)},
 
 	/* RTL2832U */
+	[RTL2832U_0CCD_00A9] = {
+		USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_T_STICK_BLACK_REV1)},
 	{} /* terminating entry */
 };
 
@@ -802,7 +1171,7 @@ static struct dvb_usb_device_properties rtl28xxu_properties[] = {
 					{
 						.frontend_attach = rtl2831u_frontend_attach,
 						.tuner_attach    = rtl2831u_tuner_attach,
-						.streaming_ctrl  = rtl28xxu_streaming_ctrl,
+						.streaming_ctrl  = rtl2831u_streaming_ctrl,
 						.stream = {
 							.type = USB_BULK,
 							.count = 6,
@@ -818,7 +1187,7 @@ static struct dvb_usb_device_properties rtl28xxu_properties[] = {
 			}
 		},
 
-		.power_ctrl = rtl28xxu_power_ctrl,
+		.power_ctrl = rtl2831u_power_ctrl,
 
 		.rc.core = {
 			.protocol       = RC_TYPE_NEC,
@@ -864,7 +1233,7 @@ static struct dvb_usb_device_properties rtl28xxu_properties[] = {
 					{
 						.frontend_attach = rtl2832u_frontend_attach,
 						.tuner_attach    = rtl2832u_tuner_attach,
-						.streaming_ctrl  = rtl28xxu_streaming_ctrl,
+						.streaming_ctrl  = rtl2832u_streaming_ctrl,
 						.stream = {
 							.type = USB_BULK,
 							.count = 6,
@@ -880,7 +1249,7 @@ static struct dvb_usb_device_properties rtl28xxu_properties[] = {
 			}
 		},
 
-		.power_ctrl = rtl28xxu_power_ctrl,
+		.power_ctrl = rtl2832u_power_ctrl,
 
 		.rc.core = {
 			.protocol       = RC_TYPE_NEC,
@@ -893,10 +1262,13 @@ static struct dvb_usb_device_properties rtl28xxu_properties[] = {
 
 		.i2c_algo = &rtl28xxu_i2c_algo,
 
-		.num_device_descs = 0, /* disabled as no support for RTL2832 */
+		.num_device_descs = 1,
 		.devices = {
 			{
-				.name = "Realtek RTL2832U reference design",
+				.name = "Terratec Cinergy T Stick Black",
+				.warm_ids = {
+					&rtl28xxu_table[RTL2832U_0CCD_00A9],
+				},
 			},
 		}
 	},
@@ -907,6 +1279,7 @@ static int rtl28xxu_probe(struct usb_interface *intf,
 		const struct usb_device_id *id)
 {
 	int ret, i;
+	u8 val;
 	int properties_count = ARRAY_SIZE(rtl28xxu_properties);
 	struct dvb_usb_device *d;
 
@@ -926,15 +1299,24 @@ static int rtl28xxu_probe(struct usb_interface *intf,
 	if (ret)
 		goto err;
 
+
 	/* init USB endpoints */
-	ret = rtl2831_wr_reg(d, USB_SYSCTL_0, 0x09);
+	ret = rtl2831_rd_reg(d, USB_SYSCTL_0, &val);
+	if (ret)
+			goto err;
+
+	/* enable DMA and Full Packet Mode*/
+	val |= 0x09;
+	ret = rtl2831_wr_reg(d, USB_SYSCTL_0, val);
 	if (ret)
 		goto err;
 
+	/* set EPA maximum packet size to 0x0200 */
 	ret = rtl2831_wr_regs(d, USB_EPA_MAXPKT, "\x00\x02\x00\x00", 4);
 	if (ret)
 		goto err;
 
+	/* change EPA FIFO length */
 	ret = rtl2831_wr_regs(d, USB_EPA_FIFO_CFG, "\x14\x00\x00\x00", 4);
 	if (ret)
 		goto err;
@@ -979,4 +1361,5 @@ module_exit(rtl28xxu_module_exit);
 
 MODULE_DESCRIPTION("Realtek RTL28xxU DVB USB driver");
 MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");
+MODULE_AUTHOR("Thomas Mair <thomas.mair86@googlemail.com>");
 MODULE_LICENSE("GPL");
-- 
1.7.7.6


^ permalink raw reply related	[flat|nested] 104+ messages in thread

* [PATCH v4 3/5] rtl28xxu: renamed rtl2831_rd/rtl2831_wr to rtl28xx_rd/rtl28xx_wr
  2012-05-16 22:13 ` [PATCH v4 0/5] support for rtl2832 Thomas Mair
  2012-05-16 22:13   ` [PATCH v4 1/5] rtl2832 ver. 0.4: removed signal statistics Thomas Mair
  2012-05-16 22:13   ` [PATCH v4 2/5] rtl28xxu: support for the rtl2832 demod driver Thomas Mair
@ 2012-05-16 22:13   ` Thomas Mair
  2012-05-17 14:43     ` Antti Palosaari
  2012-05-16 22:13   ` [PATCH v4 4/5] rtl28xxu: support G-Tek Electronics Group Lifeview LV5TDLX DVB-T Thomas Mair
                     ` (2 subsequent siblings)
  5 siblings, 1 reply; 104+ messages in thread
From: Thomas Mair @ 2012-05-16 22:13 UTC (permalink / raw)
  To: linus-media
  Cc: crope, pomidorabelisima, Thomas Mair, Linux Media Mailing List

Signed-off-by: Thomas Mair <thomas.mair86@googlemail.com>
---
 drivers/media/dvb/dvb-usb/rtl28xxu.c |  102 +++++++++++++++++-----------------
 1 files changed, 51 insertions(+), 51 deletions(-)

diff --git a/drivers/media/dvb/dvb-usb/rtl28xxu.c b/drivers/media/dvb/dvb-usb/rtl28xxu.c
index bb66771..6817ef7 100644
--- a/drivers/media/dvb/dvb-usb/rtl28xxu.c
+++ b/drivers/media/dvb/dvb-usb/rtl28xxu.c
@@ -83,7 +83,7 @@ err:
 	return ret;
 }
 
-static int rtl2831_wr_regs(struct dvb_usb_device *d, u16 reg, u8 *val, int len)
+static int rtl28xx_wr_regs(struct dvb_usb_device *d, u16 reg, u8 *val, int len)
 {
 	struct rtl28xxu_req req;
 
@@ -119,12 +119,12 @@ static int rtl2831_rd_regs(struct dvb_usb_device *d, u16 reg, u8 *val, int len)
 	return rtl28xxu_ctrl_msg(d, &req);
 }
 
-static int rtl2831_wr_reg(struct dvb_usb_device *d, u16 reg, u8 val)
+static int rtl28xx_wr_reg(struct dvb_usb_device *d, u16 reg, u8 val)
 {
-	return rtl2831_wr_regs(d, reg, &val, 1);
+	return rtl28xx_wr_regs(d, reg, &val, 1);
 }
 
-static int rtl2831_rd_reg(struct dvb_usb_device *d, u16 reg, u8 *val)
+static int rtl28xx_rd_reg(struct dvb_usb_device *d, u16 reg, u8 *val)
 {
 	return rtl2831_rd_regs(d, reg, val, 1);
 }
@@ -311,12 +311,12 @@ static int rtl2831u_frontend_attach(struct dvb_usb_adapter *adap)
 	 */
 
 	/* GPIO direction */
-	ret = rtl2831_wr_reg(adap->dev, SYS_GPIO_DIR, 0x0a);
+	ret = rtl28xx_wr_reg(adap->dev, SYS_GPIO_DIR, 0x0a);
 	if (ret)
 		goto err;
 
 	/* enable as output GPIO0, GPIO2, GPIO4 */
-	ret = rtl2831_wr_reg(adap->dev, SYS_GPIO_OUT_EN, 0x15);
+	ret = rtl28xx_wr_reg(adap->dev, SYS_GPIO_OUT_EN, 0x15);
 	if (ret)
 		goto err;
 
@@ -399,7 +399,7 @@ static int rtl2832u_fc0012_tuner_callback(struct dvb_usb_device *d,
 	switch (cmd) {
 	case FC_FE_CALLBACK_VHF_ENABLE:
 		/* set output values */
-		ret = rtl2831_rd_reg(d, SYS_GPIO_OUT_VAL, &val);
+		ret = rtl28xx_rd_reg(d, SYS_GPIO_OUT_VAL, &val);
 		if (ret)
 			goto err;
 
@@ -409,7 +409,7 @@ static int rtl2832u_fc0012_tuner_callback(struct dvb_usb_device *d,
 			val |= 0x40; /* set GPIO6 high */
 
 
-		ret = rtl2831_wr_reg(d, SYS_GPIO_OUT_VAL, val);
+		ret = rtl28xx_wr_reg(d, SYS_GPIO_OUT_VAL, val);
 		if (ret)
 			goto err;
 		break;
@@ -504,25 +504,25 @@ static int rtl2832u_frontend_attach(struct dvb_usb_adapter *adap)
 	deb_info("%s:\n", __func__);
 
 
-	ret = rtl2831_rd_reg(adap->dev, SYS_GPIO_DIR, &val);
+	ret = rtl28xx_rd_reg(adap->dev, SYS_GPIO_DIR, &val);
 	if (ret)
 		goto err;
 
 	val &= 0xbf;
 
-	ret = rtl2831_wr_reg(adap->dev, SYS_GPIO_DIR, val);
+	ret = rtl28xx_wr_reg(adap->dev, SYS_GPIO_DIR, val);
 	if (ret)
 		goto err;
 
 
 	/* enable as output GPIO3 and GPIO6*/
-	ret = rtl2831_rd_reg(adap->dev, SYS_GPIO_OUT_EN, &val);
+	ret = rtl28xx_rd_reg(adap->dev, SYS_GPIO_OUT_EN, &val);
 	if (ret)
 		goto err;
 
 	val |= 0x48;
 
-	ret = rtl2831_wr_reg(adap->dev, SYS_GPIO_OUT_EN, val);
+	ret = rtl28xx_wr_reg(adap->dev, SYS_GPIO_OUT_EN, val);
 	if (ret)
 		goto err;
 
@@ -773,7 +773,7 @@ static int rtl2831u_streaming_ctrl(struct dvb_usb_adapter *adap , int onoff)
 
 	deb_info("%s: onoff=%d\n", __func__, onoff);
 
-	ret = rtl2831_rd_reg(adap->dev, SYS_GPIO_OUT_VAL, &gpio);
+	ret = rtl28xx_rd_reg(adap->dev, SYS_GPIO_OUT_VAL, &gpio);
 	if (ret)
 		goto err;
 
@@ -787,11 +787,11 @@ static int rtl2831u_streaming_ctrl(struct dvb_usb_adapter *adap , int onoff)
 		gpio &= (~0x04); /* LED off */
 	}
 
-	ret = rtl2831_wr_reg(adap->dev, SYS_GPIO_OUT_VAL, gpio);
+	ret = rtl28xx_wr_reg(adap->dev, SYS_GPIO_OUT_VAL, gpio);
 	if (ret)
 		goto err;
 
-	ret = rtl2831_wr_regs(adap->dev, USB_EPA_CTL, buf, 2);
+	ret = rtl28xx_wr_regs(adap->dev, USB_EPA_CTL, buf, 2);
 	if (ret)
 		goto err;
 
@@ -817,7 +817,7 @@ static int rtl2832u_streaming_ctrl(struct dvb_usb_adapter *adap , int onoff)
 		buf[1] = 0x02; /* reset EPA */
 	}
 
-	ret = rtl2831_wr_regs(adap->dev, USB_EPA_CTL, buf, 2);
+	ret = rtl28xx_wr_regs(adap->dev, USB_EPA_CTL, buf, 2);
 	if (ret)
 		goto err;
 
@@ -835,12 +835,12 @@ static int rtl2831u_power_ctrl(struct dvb_usb_device *d, int onoff)
 	deb_info("%s: onoff=%d\n", __func__, onoff);
 
 	/* demod adc */
-	ret = rtl2831_rd_reg(d, SYS_SYS0, &sys0);
+	ret = rtl28xx_rd_reg(d, SYS_SYS0, &sys0);
 	if (ret)
 		goto err;
 
 	/* tuner power, read GPIOs */
-	ret = rtl2831_rd_reg(d, SYS_GPIO_OUT_VAL, &gpio);
+	ret = rtl28xx_rd_reg(d, SYS_GPIO_OUT_VAL, &gpio);
 	if (ret)
 		goto err;
 
@@ -860,12 +860,12 @@ static int rtl2831u_power_ctrl(struct dvb_usb_device *d, int onoff)
 	deb_info("%s: WR SYS0=%02x GPIO_OUT_VAL=%02x\n", __func__, sys0, gpio);
 
 	/* demod adc */
-	ret = rtl2831_wr_reg(d, SYS_SYS0, sys0);
+	ret = rtl28xx_wr_reg(d, SYS_SYS0, sys0);
 	if (ret)
 		goto err;
 
 	/* tuner power, write GPIOs */
-	ret = rtl2831_wr_reg(d, SYS_GPIO_OUT_VAL, gpio);
+	ret = rtl28xx_wr_reg(d, SYS_GPIO_OUT_VAL, gpio);
 	if (ret)
 		goto err;
 
@@ -884,107 +884,107 @@ static int rtl2832u_power_ctrl(struct dvb_usb_device *d, int onoff)
 
 	if (onoff) {
 		/* set output values */
-		ret = rtl2831_rd_reg(d, SYS_GPIO_OUT_VAL, &val);
+		ret = rtl28xx_rd_reg(d, SYS_GPIO_OUT_VAL, &val);
 		if (ret)
 			goto err;
 
 		val |= 0x08;
 		val &= 0xef;
 
-		ret = rtl2831_wr_reg(d, SYS_GPIO_OUT_VAL, val);
+		ret = rtl28xx_wr_reg(d, SYS_GPIO_OUT_VAL, val);
 		if (ret)
 			goto err;
 
 		/* demod_ctl_1 */
-		ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL1, &val);
+		ret = rtl28xx_rd_reg(d, SYS_DEMOD_CTL1, &val);
 		if (ret)
 			goto err;
 
 		val &= 0xef;
 
-		ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL1, val);
+		ret = rtl28xx_wr_reg(d, SYS_DEMOD_CTL1, val);
 		if (ret)
 			goto err;
 
 		/* demod control */
 		/* PLL enable */
-		ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL, &val);
+		ret = rtl28xx_rd_reg(d, SYS_DEMOD_CTL, &val);
 		if (ret)
 			goto err;
 
 		/* bit 7 to 1 */
 		val |= 0x80;
 
-		ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL, val);
+		ret = rtl28xx_wr_reg(d, SYS_DEMOD_CTL, val);
 		if (ret)
 			goto err;
 
 		/* demod HW reset */
-		ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL, &val);
+		ret = rtl28xx_rd_reg(d, SYS_DEMOD_CTL, &val);
 		if (ret)
 			goto err;
 		/* bit 5 to 0 */
 		val &= 0xdf;
 
-		ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL, val);
+		ret = rtl28xx_wr_reg(d, SYS_DEMOD_CTL, val);
 		if (ret)
 			goto err;
 
-		ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL, &val);
+		ret = rtl28xx_rd_reg(d, SYS_DEMOD_CTL, &val);
 		if (ret)
 			goto err;
 
 		val |= 0x20;
 
-		ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL, val);
+		ret = rtl28xx_wr_reg(d, SYS_DEMOD_CTL, val);
 		if (ret)
 			goto err;
 
 		mdelay(5);
 
 		/*enable ADC_Q and ADC_I */
-		ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL, &val);
+		ret = rtl28xx_rd_reg(d, SYS_DEMOD_CTL, &val);
 		if (ret)
 			goto err;
 
 		val |= 0x48;
 
-		ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL, val);
+		ret = rtl28xx_wr_reg(d, SYS_DEMOD_CTL, val);
 		if (ret)
 			goto err;
 
 
 	} else {
 		/* demod_ctl_1 */
-		ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL1, &val);
+		ret = rtl28xx_rd_reg(d, SYS_DEMOD_CTL1, &val);
 		if (ret)
 			goto err;
 
 		val |= 0x0c;
 
-		ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL1, val);
+		ret = rtl28xx_wr_reg(d, SYS_DEMOD_CTL1, val);
 		if (ret)
 			goto err;
 
 		/* set output values */
-		ret = rtl2831_rd_reg(d, SYS_GPIO_OUT_VAL, &val);
+		ret = rtl28xx_rd_reg(d, SYS_GPIO_OUT_VAL, &val);
 		if (ret)
 				goto err;
 
 		val |= 0x10;
 
-		ret = rtl2831_wr_reg(d, SYS_GPIO_OUT_VAL, val);
+		ret = rtl28xx_wr_reg(d, SYS_GPIO_OUT_VAL, val);
 		if (ret)
 			goto err;
 
 		/* demod control */
-		ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL, &val);
+		ret = rtl28xx_rd_reg(d, SYS_DEMOD_CTL, &val);
 		if (ret)
 			goto err;
 
 		val &= 0x37;
 
-		ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL, val);
+		ret = rtl28xx_wr_reg(d, SYS_DEMOD_CTL, val);
 		if (ret)
 			goto err;
 
@@ -1023,7 +1023,7 @@ static int rtl2831u_rc_query(struct dvb_usb_device *d)
 	/* init remote controller */
 	if (!priv->rc_active) {
 		for (i = 0; i < ARRAY_SIZE(rc_nec_tab); i++) {
-			ret = rtl2831_wr_reg(d, rc_nec_tab[i].reg,
+			ret = rtl28xx_wr_reg(d, rc_nec_tab[i].reg,
 					rc_nec_tab[i].val);
 			if (ret)
 				goto err;
@@ -1053,12 +1053,12 @@ static int rtl2831u_rc_query(struct dvb_usb_device *d)
 
 		rc_keydown(d->rc_dev, rc_code, 0);
 
-		ret = rtl2831_wr_reg(d, SYS_IRRC_SR, 1);
+		ret = rtl28xx_wr_reg(d, SYS_IRRC_SR, 1);
 		if (ret)
 			goto err;
 
 		/* repeated intentionally to avoid extra keypress */
-		ret = rtl2831_wr_reg(d, SYS_IRRC_SR, 1);
+		ret = rtl28xx_wr_reg(d, SYS_IRRC_SR, 1);
 		if (ret)
 			goto err;
 	}
@@ -1095,7 +1095,7 @@ static int rtl2832u_rc_query(struct dvb_usb_device *d)
 	/* init remote controller */
 	if (!priv->rc_active) {
 		for (i = 0; i < ARRAY_SIZE(rc_nec_tab); i++) {
-			ret = rtl2831_wr_reg(d, rc_nec_tab[i].reg,
+			ret = rtl28xx_wr_reg(d, rc_nec_tab[i].reg,
 					rc_nec_tab[i].val);
 			if (ret)
 				goto err;
@@ -1103,14 +1103,14 @@ static int rtl2832u_rc_query(struct dvb_usb_device *d)
 		priv->rc_active = true;
 	}
 
-	ret = rtl2831_rd_reg(d, IR_RX_IF, &buf[0]);
+	ret = rtl28xx_rd_reg(d, IR_RX_IF, &buf[0]);
 	if (ret)
 		goto err;
 
 	if (buf[0] != 0x83)
 		goto exit;
 
-	ret = rtl2831_rd_reg(d, IR_RX_BC, &buf[0]);
+	ret = rtl28xx_rd_reg(d, IR_RX_BC, &buf[0]);
 	if (ret)
 		goto err;
 
@@ -1119,9 +1119,9 @@ static int rtl2832u_rc_query(struct dvb_usb_device *d)
 
 	/* TODO: pass raw IR to Kernel IR decoder */
 
-	ret = rtl2831_wr_reg(d, IR_RX_IF, 0x03);
-	ret = rtl2831_wr_reg(d, IR_RX_BUF_CTRL, 0x80);
-	ret = rtl2831_wr_reg(d, IR_RX_CTRL, 0x80);
+	ret = rtl28xx_wr_reg(d, IR_RX_IF, 0x03);
+	ret = rtl28xx_wr_reg(d, IR_RX_BUF_CTRL, 0x80);
+	ret = rtl28xx_wr_reg(d, IR_RX_CTRL, 0x80);
 
 exit:
 	return ret;
@@ -1301,23 +1301,23 @@ static int rtl28xxu_probe(struct usb_interface *intf,
 
 
 	/* init USB endpoints */
-	ret = rtl2831_rd_reg(d, USB_SYSCTL_0, &val);
+	ret = rtl28xx_rd_reg(d, USB_SYSCTL_0, &val);
 	if (ret)
 			goto err;
 
 	/* enable DMA and Full Packet Mode*/
 	val |= 0x09;
-	ret = rtl2831_wr_reg(d, USB_SYSCTL_0, val);
+	ret = rtl28xx_wr_reg(d, USB_SYSCTL_0, val);
 	if (ret)
 		goto err;
 
 	/* set EPA maximum packet size to 0x0200 */
-	ret = rtl2831_wr_regs(d, USB_EPA_MAXPKT, "\x00\x02\x00\x00", 4);
+	ret = rtl28xx_wr_regs(d, USB_EPA_MAXPKT, "\x00\x02\x00\x00", 4);
 	if (ret)
 		goto err;
 
 	/* change EPA FIFO length */
-	ret = rtl2831_wr_regs(d, USB_EPA_FIFO_CFG, "\x14\x00\x00\x00", 4);
+	ret = rtl28xx_wr_regs(d, USB_EPA_FIFO_CFG, "\x14\x00\x00\x00", 4);
 	if (ret)
 		goto err;
 
-- 
1.7.7.6


^ permalink raw reply related	[flat|nested] 104+ messages in thread

* [PATCH v4 4/5] rtl28xxu: support G-Tek Electronics Group Lifeview LV5TDLX DVB-T
  2012-05-16 22:13 ` [PATCH v4 0/5] support for rtl2832 Thomas Mair
                     ` (2 preceding siblings ...)
  2012-05-16 22:13   ` [PATCH v4 3/5] rtl28xxu: renamed rtl2831_rd/rtl2831_wr to rtl28xx_rd/rtl28xx_wr Thomas Mair
@ 2012-05-16 22:13   ` Thomas Mair
  2012-05-17 14:47     ` Antti Palosaari
  2012-05-16 22:13   ` [PATCH v4 5/5] rtl28xxu: support Terratec Noxon DAB/DAB+ stick Thomas Mair
  2012-05-17 14:53   ` [PATCH v4 0/5] support for rtl2832 Antti Palosaari
  5 siblings, 1 reply; 104+ messages in thread
From: Thomas Mair @ 2012-05-16 22:13 UTC (permalink / raw)
  To: linus-media
  Cc: crope, pomidorabelisima, Thomas Mair, Linux Media Mailing List

Signed-off-by: Thomas Mair <thomas.mair86@googlemail.com>
---
 drivers/media/dvb/dvb-usb/dvb-usb-ids.h |    1 +
 drivers/media/dvb/dvb-usb/rtl28xxu.c    |   11 ++++++++++-
 2 files changed, 11 insertions(+), 1 deletions(-)

diff --git a/drivers/media/dvb/dvb-usb/dvb-usb-ids.h b/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
index fd37be0..b0a86e9 100644
--- a/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
+++ b/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
@@ -135,6 +135,7 @@
 #define USB_PID_GENIUS_TVGO_DVB_T03			0x4012
 #define USB_PID_GRANDTEC_DVBT_USB_COLD			0x0fa0
 #define USB_PID_GRANDTEC_DVBT_USB_WARM			0x0fa1
+#define USB_PID_GTEK					0xb803
 #define USB_PID_INTEL_CE9500				0x9500
 #define USB_PID_ITETECH_IT9135				0x9135
 #define USB_PID_ITETECH_IT9135_9005			0x9005
diff --git a/drivers/media/dvb/dvb-usb/rtl28xxu.c b/drivers/media/dvb/dvb-usb/rtl28xxu.c
index 6817ef7..9056d28 100644
--- a/drivers/media/dvb/dvb-usb/rtl28xxu.c
+++ b/drivers/media/dvb/dvb-usb/rtl28xxu.c
@@ -1135,6 +1135,7 @@ enum rtl28xxu_usb_table_entry {
 	RTL2831U_14AA_0160,
 	RTL2831U_14AA_0161,
 	RTL2832U_0CCD_00A9,
+	RTL2832U_1F4D_B803,
 };
 
 static struct usb_device_id rtl28xxu_table[] = {
@@ -1149,6 +1150,8 @@ static struct usb_device_id rtl28xxu_table[] = {
 	/* RTL2832U */
 	[RTL2832U_0CCD_00A9] = {
 		USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_T_STICK_BLACK_REV1)},
+	[RTL2832U_1F4D_B803] = {
+		USB_DEVICE(USB_VID_GTEK, USB_PID_GTEK)},
 	{} /* terminating entry */
 };
 
@@ -1262,7 +1265,7 @@ static struct dvb_usb_device_properties rtl28xxu_properties[] = {
 
 		.i2c_algo = &rtl28xxu_i2c_algo,
 
-		.num_device_descs = 1,
+		.num_device_descs = 2,
 		.devices = {
 			{
 				.name = "Terratec Cinergy T Stick Black",
@@ -1270,6 +1273,12 @@ static struct dvb_usb_device_properties rtl28xxu_properties[] = {
 					&rtl28xxu_table[RTL2832U_0CCD_00A9],
 				},
 			},
+			{
+				.name = "G-Tek Electronics Group Lifeview LV5TDLX DVB-T [RTL2832U]",
+				.warm_ids = {
+					&rtl28xxu_table[RTL2832U_1F4D_B803],
+				},
+			},
 		}
 	},
 
-- 
1.7.7.6


^ permalink raw reply related	[flat|nested] 104+ messages in thread

* [PATCH v4 5/5] rtl28xxu: support Terratec Noxon DAB/DAB+ stick
  2012-05-16 22:13 ` [PATCH v4 0/5] support for rtl2832 Thomas Mair
                     ` (3 preceding siblings ...)
  2012-05-16 22:13   ` [PATCH v4 4/5] rtl28xxu: support G-Tek Electronics Group Lifeview LV5TDLX DVB-T Thomas Mair
@ 2012-05-16 22:13   ` Thomas Mair
  2012-05-17 14:50     ` Antti Palosaari
  2012-05-17 14:53   ` [PATCH v4 0/5] support for rtl2832 Antti Palosaari
  5 siblings, 1 reply; 104+ messages in thread
From: Thomas Mair @ 2012-05-16 22:13 UTC (permalink / raw)
  To: linus-media
  Cc: crope, pomidorabelisima, Thomas Mair, Linux Media Mailing List,
	Hans-Frieder Vogt

Signed-off-by: Hans-Frieder Vogt <hfvogt@gmx.net>
Signed-off-by: Thomas Mair <thomas.mair86@googlemail.com>
---
 drivers/media/dvb/dvb-usb/dvb-usb-ids.h |    1 +
 drivers/media/dvb/dvb-usb/rtl28xxu.c    |   27 ++++++++++++++++++++++++++-
 2 files changed, 27 insertions(+), 1 deletions(-)

diff --git a/drivers/media/dvb/dvb-usb/dvb-usb-ids.h b/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
index b0a86e9..95c9c14 100644
--- a/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
+++ b/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
@@ -244,6 +244,7 @@
 #define USB_PID_TERRATEC_H7_2				0x10a3
 #define USB_PID_TERRATEC_T3				0x10a0
 #define USB_PID_TERRATEC_T5				0x10a1
+#define USB_PID_NOXON_DAB_STICK				0x00b3
 #define USB_PID_PINNACLE_EXPRESSCARD_320CX		0x022e
 #define USB_PID_PINNACLE_PCTV2000E			0x022c
 #define USB_PID_PINNACLE_PCTV_DVB_T_FLASH		0x0228
diff --git a/drivers/media/dvb/dvb-usb/rtl28xxu.c b/drivers/media/dvb/dvb-usb/rtl28xxu.c
index 9056d28..f10cac2 100644
--- a/drivers/media/dvb/dvb-usb/rtl28xxu.c
+++ b/drivers/media/dvb/dvb-usb/rtl28xxu.c
@@ -29,6 +29,7 @@
 #include "mt2060.h"
 #include "mxl5005s.h"
 #include "fc0012.h"
+#include "fc0013.h"
 
 /* debug */
 static int dvb_usb_rtl28xxu_debug;
@@ -388,6 +389,12 @@ static struct rtl2832_config rtl28xxu_rtl2832_fc0012_config = {
 	.tuner = TUNER_RTL2832_FC0012
 };
 
+static struct rtl2832_config rtl28xxu_rtl2832_fc0013_config = {
+	.i2c_addr = 0x10, /* 0x20 */
+	.xtal = 28800000,
+	.if_dvbt = 0,
+	.tuner = TUNER_RTL2832_FC0013
+};
 
 static int rtl2832u_fc0012_tuner_callback(struct dvb_usb_device *d,
 		int cmd, int arg)
@@ -553,6 +560,7 @@ static int rtl2832u_frontend_attach(struct dvb_usb_adapter *adap)
 	ret = rtl28xxu_ctrl_msg(adap->dev, &req_fc0013);
 	if (ret == 0 && buf[0] == 0xa3) {
 		priv->tuner = TUNER_RTL2832_FC0013;
+		rtl2832_config = &rtl28xxu_rtl2832_fc0013_config;
 		info("%s: FC0013 tuner found", __func__);
 		goto found;
 	}
@@ -750,6 +758,14 @@ static int rtl2832u_tuner_attach(struct dvb_usb_adapter *adap)
 				fe->ops.tuner_ops.get_rf_strength;
 		return 0;
 		break;
+	case TUNER_RTL2832_FC0013:
+		fe = dvb_attach(fc0013_attach, adap->fe_adap[0].fe,
+			&adap->dev->i2c_adap, 0xc6>>1, 0, FC_XTAL_28_8_MHZ);
+
+		/* fc0013 also supports signal strength reading */
+		adap->fe_adap[0].fe->ops.read_signal_strength = adap->fe_adap[0]
+			.fe->ops.tuner_ops.get_rf_strength;
+		return 0;
 	default:
 		fe = NULL;
 		err("unknown tuner=%d", priv->tuner);
@@ -1136,6 +1152,7 @@ enum rtl28xxu_usb_table_entry {
 	RTL2831U_14AA_0161,
 	RTL2832U_0CCD_00A9,
 	RTL2832U_1F4D_B803,
+	RTL2832U_0CCD_00B3,
 };
 
 static struct usb_device_id rtl28xxu_table[] = {
@@ -1152,6 +1169,8 @@ static struct usb_device_id rtl28xxu_table[] = {
 		USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_T_STICK_BLACK_REV1)},
 	[RTL2832U_1F4D_B803] = {
 		USB_DEVICE(USB_VID_GTEK, USB_PID_GTEK)},
+	[RTL2832U_0CCD_00B3] = {
+		USB_DEVICE(USB_VID_TERRATEC, USB_PID_NOXON_DAB_STICK)},
 	{} /* terminating entry */
 };
 
@@ -1265,7 +1284,7 @@ static struct dvb_usb_device_properties rtl28xxu_properties[] = {
 
 		.i2c_algo = &rtl28xxu_i2c_algo,
 
-		.num_device_descs = 2,
+		.num_device_descs = 3,
 		.devices = {
 			{
 				.name = "Terratec Cinergy T Stick Black",
@@ -1279,6 +1298,12 @@ static struct dvb_usb_device_properties rtl28xxu_properties[] = {
 					&rtl28xxu_table[RTL2832U_1F4D_B803],
 				},
 			},
+			{
+				.name = "NOXON DAB/DAB+ USB dongle",
+				.warm_ids = {
+					&rtl28xxu_table[RTL2832U_0CCD_00B3],
+				},
+			},
 		}
 	},
 
-- 
1.7.7.6


^ permalink raw reply related	[flat|nested] 104+ messages in thread

* Re: [PATCH v4 1/5] rtl2832 ver. 0.4: removed signal statistics
  2012-05-16 22:13   ` [PATCH v4 1/5] rtl2832 ver. 0.4: removed signal statistics Thomas Mair
@ 2012-05-17  3:36     ` poma
  2012-05-17  3:40       ` poma
  2012-05-17 14:19     ` Antti Palosaari
  1 sibling, 1 reply; 104+ messages in thread
From: poma @ 2012-05-17  3:36 UTC (permalink / raw)
  To: Thomas Mair, linux-media

On 05/17/2012 12:13 AM, Thomas Mair wrote:
> Changelog for ver. 0.3:
> - removed statistics as their calculation was wrong
> - fixed bug in Makefile
> - indentation and code style improvements
> 
> Signed-off-by: Thomas Mair <thomas.mair86@googlemail.com>
> ---
>  drivers/media/dvb/frontends/Kconfig        |    7 +
>  drivers/media/dvb/frontends/Makefile       |    1 +
>  drivers/media/dvb/frontends/rtl2832.c      |  825 ++++++++++++++++++++++++++++
>  drivers/media/dvb/frontends/rtl2832.h      |   74 +++
>  drivers/media/dvb/frontends/rtl2832_priv.h |  258 +++++++++
>  5 files changed, 1165 insertions(+), 0 deletions(-)
>  create mode 100644 drivers/media/dvb/frontends/rtl2832.c
>  create mode 100644 drivers/media/dvb/frontends/rtl2832.h
>  create mode 100644 drivers/media/dvb/frontends/rtl2832_priv.h
> 
> diff --git a/drivers/media/dvb/frontends/Kconfig b/drivers/media/dvb/frontends/Kconfig
> index f479834..f7d67d7 100644
> --- a/drivers/media/dvb/frontends/Kconfig
> +++ b/drivers/media/dvb/frontends/Kconfig
> @@ -432,6 +432,13 @@ config DVB_RTL2830
>  	help
>  	  Say Y when you want to support this frontend.
>  
> +config DVB_RTL2832
> +	tristate "Realtek RTL2832 DVB-T"
> +	depends on DVB_CORE && I2C
> +	default m if DVB_FE_CUSTOMISE
> +	help
> +	  Say Y when you want to support this frontend.
> +
>  comment "DVB-C (cable) frontends"
>  	depends on DVB_CORE
>  
> diff --git a/drivers/media/dvb/frontends/Makefile b/drivers/media/dvb/frontends/Makefile
> index b0381dc..bbf2955 100644
> --- a/drivers/media/dvb/frontends/Makefile
> +++ b/drivers/media/dvb/frontends/Makefile
> @@ -98,6 +98,7 @@ obj-$(CONFIG_DVB_IT913X_FE) += it913x-fe.o
>  obj-$(CONFIG_DVB_A8293) += a8293.o
>  obj-$(CONFIG_DVB_TDA10071) += tda10071.o
>  obj-$(CONFIG_DVB_RTL2830) += rtl2830.o
> +obj-$(CONFIG_DVB_RTL2830) += rtl2832.o
>  obj-$(CONFIG_DVB_M88RS2000) += m88rs2000.o
>  obj-$(CONFIG_DVB_AF9033) += af9033.o
>  
> diff --git a/drivers/media/dvb/frontends/rtl2832.c b/drivers/media/dvb/frontends/rtl2832.c
> new file mode 100644
> index 0000000..51c7927
> --- /dev/null
> +++ b/drivers/media/dvb/frontends/rtl2832.c
> @@ -0,0 +1,825 @@
> +/*
> + * Realtek RTL2832 DVB-T demodulator driver
> + *
> + * Copyright (C) 2012 Thomas Mair <thomas.mair86@gmail.com>
> + *
> + *	This program is free software; you can redistribute it and/or modify
> + *	it under the terms of the GNU General Public License as published by
> + *	the Free Software Foundation; either version 2 of the License, or
> + *	(at your option) any later version.
> + *
> + *	This program is distributed in the hope that it will be useful,
> + *	but WITHOUT ANY WARRANTY; without even the implied warranty of
> + *	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + *	GNU General Public License for more details.
> + *
> + *	You should have received a copy of the GNU General Public License along
> + *	with this program; if not, write to the Free Software Foundation, Inc.,
> + *	51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
> + */
> +
> +#include "rtl2832_priv.h"
> +
> +
> +int rtl2832_debug;
> +module_param_named(debug, rtl2832_debug, int, 0644);
> +MODULE_PARM_DESC(debug, "Turn on/off frontend debugging (default:off).");
> +
> +
> +static int reg_mask[32] = {
> +	0x00000001,
> +	0x00000003,
> +	0x00000007,
> +	0x0000000f,
> +	0x0000001f,
> +	0x0000003f,
> +	0x0000007f,
> +	0x000000ff,
> +	0x000001ff,
> +	0x000003ff,
> +	0x000007ff,
> +	0x00000fff,
> +	0x00001fff,
> +	0x00003fff,
> +	0x00007fff,
> +	0x0000ffff,
> +	0x0001ffff,
> +	0x0003ffff,
> +	0x0007ffff,
> +	0x000fffff,
> +	0x001fffff,
> +	0x003fffff,
> +	0x007fffff,
> +	0x00ffffff,
> +	0x01ffffff,
> +	0x03ffffff,
> +	0x07ffffff,
> +	0x0fffffff,
> +	0x1fffffff,
> +	0x3fffffff,
> +	0x7fffffff,
> +	0xffffffff
> +};
> +
> +struct rtl2832_reg_entry registers[] = {
> +	[DVBT_SOFT_RST]		= {0x1, 0x1,   2, 2},
> +	[DVBT_IIC_REPEAT]	= {0x1, 0x1,   3, 3},
> +	[DVBT_TR_WAIT_MIN_8K]	= {0x1, 0x88, 11, 2},
> +	[DVBT_RSD_BER_FAIL_VAL]	= {0x1, 0x8f, 15, 0},
> +	[DVBT_EN_BK_TRK]	= {0x1, 0xa6,  7, 7},
> +	[DVBT_AD_EN_REG]	= {0x0, 0x8,   7, 7},
> +	[DVBT_AD_EN_REG1]	= {0x0, 0x8,   6, 6},
> +	[DVBT_EN_BBIN]		= {0x1, 0xb1,  0, 0},
> +	[DVBT_MGD_THD0]		= {0x1, 0x95,  7, 0},
> +	[DVBT_MGD_THD1]		= {0x1, 0x96,  7, 0},
> +	[DVBT_MGD_THD2]		= {0x1, 0x97,  7, 0},
> +	[DVBT_MGD_THD3]		= {0x1, 0x98,  7, 0},
> +	[DVBT_MGD_THD4]		= {0x1, 0x99,  7, 0},
> +	[DVBT_MGD_THD5]		= {0x1, 0x9a,  7, 0},
> +	[DVBT_MGD_THD6]		= {0x1, 0x9b,  7, 0},
> +	[DVBT_MGD_THD7]		= {0x1, 0x9c,  7, 0},
> +	[DVBT_EN_CACQ_NOTCH]	= {0x1, 0x61,  4, 4},
> +	[DVBT_AD_AV_REF]	= {0x0, 0x9,   6, 0},
> +	[DVBT_REG_PI]		= {0x0, 0xa,   2, 0},
> +	[DVBT_PIP_ON]		= {0x0, 0x21,  3, 3},
> +	[DVBT_SCALE1_B92]	= {0x2, 0x92,  7, 0},
> +	[DVBT_SCALE1_B93]	= {0x2, 0x93,  7, 0},
> +	[DVBT_SCALE1_BA7]	= {0x2, 0xa7,  7, 0},
> +	[DVBT_SCALE1_BA9]	= {0x2, 0xa9,  7, 0},
> +	[DVBT_SCALE1_BAA]	= {0x2, 0xaa,  7, 0},
> +	[DVBT_SCALE1_BAB]	= {0x2, 0xab,  7, 0},
> +	[DVBT_SCALE1_BAC]	= {0x2, 0xac,  7, 0},
> +	[DVBT_SCALE1_BB0]	= {0x2, 0xb0,  7, 0},
> +	[DVBT_SCALE1_BB1]	= {0x2, 0xb1,  7, 0},
> +	[DVBT_KB_P1]		= {0x1, 0x64,  3, 1},
> +	[DVBT_KB_P2]		= {0x1, 0x64,  6, 4},
> +	[DVBT_KB_P3]		= {0x1, 0x65,  2, 0},
> +	[DVBT_OPT_ADC_IQ]	= {0x0, 0x6,   5, 4},
> +	[DVBT_AD_AVI]		= {0x0, 0x9,   1, 0},
> +	[DVBT_AD_AVQ]		= {0x0, 0x9,   3, 2},
> +	[DVBT_K1_CR_STEP12]	= {0x2, 0xad,  9, 4},
> +	[DVBT_TRK_KS_P2]	= {0x1, 0x6f,  2, 0},
> +	[DVBT_TRK_KS_I2]	= {0x1, 0x70,  5, 3},
> +	[DVBT_TR_THD_SET2]	= {0x1, 0x72,  3, 0},
> +	[DVBT_TRK_KC_P2]	= {0x1, 0x73,  5, 3},
> +	[DVBT_TRK_KC_I2]	= {0x1, 0x75,  2, 0},
> +	[DVBT_CR_THD_SET2]	= {0x1, 0x76,  7, 6},
> +	[DVBT_PSET_IFFREQ]	= {0x1, 0x19, 21, 0},
> +	[DVBT_SPEC_INV]		= {0x1, 0x15,  0, 0},
> +	[DVBT_RSAMP_RATIO]	= {0x1, 0x9f, 27, 2},
> +	[DVBT_CFREQ_OFF_RATIO]	= {0x1, 0x9d, 23, 4},
> +	[DVBT_FSM_STAGE]	= {0x3, 0x51,  6, 3},
> +	[DVBT_RX_CONSTEL]	= {0x3, 0x3c,  3, 2},
> +	[DVBT_RX_HIER]		= {0x3, 0x3c,  6, 4},
> +	[DVBT_RX_C_RATE_LP]	= {0x3, 0x3d,  2, 0},
> +	[DVBT_RX_C_RATE_HP]	= {0x3, 0x3d,  5, 3},
> +	[DVBT_GI_IDX]		= {0x3, 0x51,  1, 0},
> +	[DVBT_FFT_MODE_IDX]	= {0x3, 0x51,  2, 2},
> +	[DVBT_RSD_BER_EST]	= {0x3, 0x4e, 15, 0},
> +	[DVBT_CE_EST_EVM]	= {0x4, 0xc,  15, 0},
> +	[DVBT_RF_AGC_VAL]	= {0x3, 0x5b, 13, 0},
> +	[DVBT_IF_AGC_VAL]	= {0x3, 0x59, 13, 0},
> +	[DVBT_DAGC_VAL]		= {0x3, 0x5,   7, 0},
> +	[DVBT_SFREQ_OFF]	= {0x3, 0x18, 13, 0},
> +	[DVBT_CFREQ_OFF]	= {0x3, 0x5f, 17, 0},
> +	[DVBT_POLAR_RF_AGC]	= {0x0, 0xe,   1, 1},
> +	[DVBT_POLAR_IF_AGC]	= {0x0, 0xe,   0, 0},
> +	[DVBT_AAGC_HOLD]	= {0x1, 0x4,   5, 5},
> +	[DVBT_EN_RF_AGC]	= {0x1, 0x4,   6, 6},
> +	[DVBT_EN_IF_AGC]	= {0x1, 0x4,   7, 7},
> +	[DVBT_IF_AGC_MIN]	= {0x1, 0x8,   7, 0},
> +	[DVBT_IF_AGC_MAX]	= {0x1, 0x9,   7, 0},
> +	[DVBT_RF_AGC_MIN]	= {0x1, 0xa,   7, 0},
> +	[DVBT_RF_AGC_MAX]	= {0x1, 0xb,   7, 0},
> +	[DVBT_IF_AGC_MAN]	= {0x1, 0xc,   6, 6},
> +	[DVBT_IF_AGC_MAN_VAL]	= {0x1, 0xc,  13, 0},
> +	[DVBT_RF_AGC_MAN]	= {0x1, 0xe,   6, 6},
> +	[DVBT_RF_AGC_MAN_VAL]	= {0x1, 0xe,  13, 0},
> +	[DVBT_DAGC_TRG_VAL]	= {0x1, 0x12,  7, 0},
> +	[DVBT_AGC_TARG_VAL_0]	= {0x1, 0x2,   0, 0},
> +	[DVBT_AGC_TARG_VAL_8_1]	= {0x1, 0x3,   7, 0},
> +	[DVBT_AAGC_LOOP_GAIN]	= {0x1, 0xc7,  5, 1},
> +	[DVBT_LOOP_GAIN2_3_0]	= {0x1, 0x4,   4, 1},
> +	[DVBT_LOOP_GAIN2_4]	= {0x1, 0x5,   7, 7},
> +	[DVBT_LOOP_GAIN3]	= {0x1, 0xc8,  4, 0},
> +	[DVBT_VTOP1]		= {0x1, 0x6,   5, 0},
> +	[DVBT_VTOP2]		= {0x1, 0xc9,  5, 0},
> +	[DVBT_VTOP3]		= {0x1, 0xca,  5, 0},
> +	[DVBT_KRF1]		= {0x1, 0xcb,  7, 0},
> +	[DVBT_KRF2]		= {0x1, 0x7,   7, 0},
> +	[DVBT_KRF3]		= {0x1, 0xcd,  7, 0},
> +	[DVBT_KRF4]		= {0x1, 0xce,  7, 0},
> +	[DVBT_EN_GI_PGA]	= {0x1, 0xe5,  0, 0},
> +	[DVBT_THD_LOCK_UP]	= {0x1, 0xd9,  8, 0},
> +	[DVBT_THD_LOCK_DW]	= {0x1, 0xdb,  8, 0},
> +	[DVBT_THD_UP1]		= {0x1, 0xdd,  7, 0},
> +	[DVBT_THD_DW1]		= {0x1, 0xde,  7, 0},
> +	[DVBT_INTER_CNT_LEN]	= {0x1, 0xd8,  3, 0},
> +	[DVBT_GI_PGA_STATE]	= {0x1, 0xe6,  3, 3},
> +	[DVBT_EN_AGC_PGA]	= {0x1, 0xd7,  0, 0},
> +	[DVBT_CKOUTPAR]		= {0x1, 0x7b,  5, 5},
> +	[DVBT_CKOUT_PWR]	= {0x1, 0x7b,  6, 6},
> +	[DVBT_SYNC_DUR]		= {0x1, 0x7b,  7, 7},
> +	[DVBT_ERR_DUR]		= {0x1, 0x7c,  0, 0},
> +	[DVBT_SYNC_LVL]		= {0x1, 0x7c,  1, 1},
> +	[DVBT_ERR_LVL]		= {0x1, 0x7c,  2, 2},
> +	[DVBT_VAL_LVL]		= {0x1, 0x7c,  3, 3},
> +	[DVBT_SERIAL]		= {0x1, 0x7c,  4, 4},
> +	[DVBT_SER_LSB]		= {0x1, 0x7c,  5, 5},
> +	[DVBT_CDIV_PH0]		= {0x1, 0x7d,  3, 0},
> +	[DVBT_CDIV_PH1]		= {0x1, 0x7d,  7, 4},
> +	[DVBT_MPEG_IO_OPT_2_2]	= {0x0, 0x6,   7, 7},
> +	[DVBT_MPEG_IO_OPT_1_0]	= {0x0, 0x7,   7, 6},
> +	[DVBT_CKOUTPAR_PIP]	= {0x0, 0xb7,  4, 4},
> +	[DVBT_CKOUT_PWR_PIP]	= {0x0, 0xb7,  3, 3},
> +	[DVBT_SYNC_LVL_PIP]	= {0x0, 0xb7,  2, 2},
> +	[DVBT_ERR_LVL_PIP]	= {0x0, 0xb7,  1, 1},
> +	[DVBT_VAL_LVL_PIP]	= {0x0, 0xb7,  0, 0},
> +	[DVBT_CKOUTPAR_PID]	= {0x0, 0xb9,  4, 4},
> +	[DVBT_CKOUT_PWR_PID]	= {0x0, 0xb9,  3, 3},
> +	[DVBT_SYNC_LVL_PID]	= {0x0, 0xb9,  2, 2},
> +	[DVBT_ERR_LVL_PID]	= {0x0, 0xb9,  1, 1},
> +	[DVBT_VAL_LVL_PID]	= {0x0, 0xb9,  0, 0},
> +	[DVBT_SM_PASS]		= {0x1, 0x93, 11, 0},
> +	[DVBT_AD7_SETTING]	= {0x0, 0x11, 15, 0},
> +	[DVBT_RSSI_R]		= {0x3, 0x1,   6, 0},
> +	[DVBT_ACI_DET_IND]	= {0x3, 0x12,  0, 0},
> +	[DVBT_REG_MON]		= {0x0, 0xd,   1, 0},
> +	[DVBT_REG_MONSEL]	= {0x0, 0xd,   2, 2},
> +	[DVBT_REG_GPE]		= {0x0, 0xd,   7, 7},
> +	[DVBT_REG_GPO]		= {0x0, 0x10,  0, 0},
> +	[DVBT_REG_4MSEL]	= {0x0, 0x13,  0, 0},
> +};
> +
> +/* write multiple hardware registers */
> +static int rtl2832_wr(struct rtl2832_priv *priv, u8 reg, u8 *val, int len)
> +{
> +	int ret;
> +	u8 buf[1+len];
> +	struct i2c_msg msg[1] = {
> +		{
> +			.addr = priv->cfg.i2c_addr,
> +			.flags = 0,
> +			.len = 1+len,
> +			.buf = buf,
> +		}
> +	};
> +
> +	buf[0] = reg;
> +	memcpy(&buf[1], val, len);
> +
> +	ret = i2c_transfer(priv->i2c, msg, 1);
> +	if (ret == 1) {
> +		ret = 0;
> +	} else {
> +		warn("i2c wr failed=%d reg=%02x len=%d", ret, reg, len);
> +		ret = -EREMOTEIO;
> +	}
> +	return ret;
> +}
> +
> +/* read multiple hardware registers */
> +static int rtl2832_rd(struct rtl2832_priv *priv, u8 reg, u8 *val, int len)
> +{
> +	int ret;
> +	struct i2c_msg msg[2] = {
> +		{
> +			.addr = priv->cfg.i2c_addr,
> +			.flags = 0,
> +			.len = 1,
> +			.buf = &reg,
> +		}, {
> +			.addr = priv->cfg.i2c_addr,
> +			.flags = I2C_M_RD,
> +			.len = len,
> +			.buf = val,
> +		}
> +	};
> +
> +	ret = i2c_transfer(priv->i2c, msg, 2);
> +	if (ret == 2) {
> +		ret = 0;
> +	} else {
> +		warn("i2c rd failed=%d reg=%02x len=%d", ret, reg, len);
> +		ret = -EREMOTEIO;
> +}
> +return ret;
> +}
> +
> +/* write multiple registers */
> +static int rtl2832_wr_regs(struct rtl2832_priv *priv, u8 reg, u8 page, u8 *val,
> +	int len)
> +{
> +	int ret;
> +
> +
> +	/* switch bank if needed */
> +	if (page != priv->page) {
> +		ret = rtl2832_wr(priv, 0x00, &page, 1);
> +		if (ret)
> +			return ret;
> +
> +		priv->page = page;
> +}
> +
> +return rtl2832_wr(priv, reg, val, len);
> +}
> +
> +/* read multiple registers */
> +static int rtl2832_rd_regs(struct rtl2832_priv *priv, u8 reg, u8 page, u8 *val,
> +	int len)
> +{
> +	int ret;
> +
> +	/* switch bank if needed */
> +	if (page != priv->page) {
> +		ret = rtl2832_wr(priv, 0x00, &page, 1);
> +		if (ret)
> +			return ret;
> +
> +		priv->page = page;
> +	}
> +
> +	return rtl2832_rd(priv, reg, val, len);
> +}
> +
> +#if 0 /* currently not used */
> +/* write single register */
> +static int rtl2832_wr_reg(struct rtl2832_priv *priv, u8 reg, u8 page, u8 val)
> +{
> +	return rtl2832_wr_regs(priv, reg, page, &val, 1);
> +}
> +#endif
> +
> +/* read single register */
> +static int rtl2832_rd_reg(struct rtl2832_priv *priv, u8 reg, u8 page, u8 *val)
> +{
> +	return rtl2832_rd_regs(priv, reg, page, val, 1);
> +}
> +
> +int rtl2832_rd_demod_reg(struct rtl2832_priv *priv, int reg, u32 *val)
> +{
> +	int ret;
> +
> +	u8 reg_start_addr;
> +	u8 msb, lsb;
> +	u8 page;
> +	u8 reading[4];
> +	u32 reading_tmp;
> +	int i;
> +
> +	u8 len;
> +	u32 mask;
> +
> +	reg_start_addr = registers[reg].start_address;
> +	msb = registers[reg].msb;
> +	lsb = registers[reg].lsb;
> +	page = registers[reg].page;
> +
> +	len = (msb >> 3) + 1;
> +	mask = reg_mask[msb-lsb];
> +
> +
> +	ret = rtl2832_rd_regs(priv, reg_start_addr, page, &reading[0], len);
> +	if (ret)
> +		goto err;
> +
> +	reading_tmp = 0;
> +	for (i = 0; i < len; i++)
> +		reading_tmp |= reading[i] << ((len-1-i)*8);
> +
> +	*val = (reading_tmp >> lsb) & mask;
> +
> +	return ret;
> +
> +err:
> +	dbg("%s: failed=%d", __func__, ret);
> +	return ret;
> +
> +}
> +
> +int rtl2832_wr_demod_reg(struct rtl2832_priv *priv, int reg, u32 val)
> +{
> +	int ret, i;
> +	u8 len;
> +	u8 reg_start_addr;
> +	u8 msb, lsb;
> +	u8 page;
> +	u32 mask;
> +
> +
> +	u8 reading[4];
> +	u8 writing[4];
> +	u32 reading_tmp;
> +	u32 writing_tmp;
> +
> +
> +	reg_start_addr = registers[reg].start_address;
> +	msb = registers[reg].msb;
> +	lsb = registers[reg].lsb;
> +	page = registers[reg].page;
> +
> +	len = (msb >> 3) + 1;
> +	mask = reg_mask[msb-lsb];
> +
> +
> +	ret = rtl2832_rd_regs(priv, reg_start_addr, page, &reading[0], len);
> +	if (ret)
> +		goto err;
> +
> +	reading_tmp = 0;
> +	for (i = 0; i < len; i++)
> +		reading_tmp |= reading[i] << ((len-1-i)*8);
> +
> +	writing_tmp = reading_tmp & ~(mask << lsb);
> +	writing_tmp |= ((val & mask) << lsb);
> +
> +
> +	for (i = 0; i < len; i++)
> +		writing[i] = (writing_tmp >> ((len-1-i)*8)) & 0xff;
> +
> +	ret = rtl2832_wr_regs(priv, reg_start_addr, page, &writing[0], len);
> +	if (ret)
> +		goto err;
> +
> +	return ret;
> +
> +err:
> +	dbg("%s: failed=%d", __func__, ret);
> +	return ret;
> +
> +}
> +
> +
> +static int rtl2832_i2c_gate_ctrl(struct dvb_frontend *fe, int enable)
> +{
> +	int ret;
> +	struct rtl2832_priv *priv = fe->demodulator_priv;
> +
> +	dbg("%s: enable=%d", __func__, enable);
> +
> +	/* gate already open or close */
> +	if (priv->i2c_gate_state == enable)
> +		return 0;
> +
> +	ret = rtl2832_wr_demod_reg(priv, DVBT_IIC_REPEAT, (enable ? 0x1 : 0x0));
> +
> +	if (ret)
> +		goto err;
> +
> +	priv->i2c_gate_state = enable;
> +
> +	return ret;
> +err:
> +	dbg("%s: failed=%d", __func__, ret);
> +	return ret;
> +}
> +
> +
> +
> +static int rtl2832_init(struct dvb_frontend *fe)
> +{
> +	struct rtl2832_priv *priv = fe->demodulator_priv;
> +	int i, ret;
> +
> +	u8 en_bbin;
> +	u64 pset_iffreq;
> +
> +	/* initialization values for the demodulator registers */
> +	struct rtl2832_reg_value rtl2832_initial_regs[] = {
> +		{DVBT_AD_EN_REG,		0x1},
> +		{DVBT_AD_EN_REG1,		0x1},
> +		{DVBT_RSD_BER_FAIL_VAL,		0x2800},
> +		{DVBT_MGD_THD0,			0x10},
> +		{DVBT_MGD_THD1,			0x20},
> +		{DVBT_MGD_THD2,			0x20},
> +		{DVBT_MGD_THD3,			0x40},
> +		{DVBT_MGD_THD4,			0x22},
> +		{DVBT_MGD_THD5,			0x32},
> +		{DVBT_MGD_THD6,			0x37},
> +		{DVBT_MGD_THD7,			0x39},
> +		{DVBT_EN_BK_TRK,		0x0},
> +		{DVBT_EN_CACQ_NOTCH,		0x0},
> +		{DVBT_AD_AV_REF,		0x2a},
> +		{DVBT_REG_PI,			0x6},
> +		{DVBT_PIP_ON,			0x0},
> +		{DVBT_CDIV_PH0,			0x8},
> +		{DVBT_CDIV_PH1,			0x8},
> +		{DVBT_SCALE1_B92,		0x4},
> +		{DVBT_SCALE1_B93,		0xb0},
> +		{DVBT_SCALE1_BA7,		0x78},
> +		{DVBT_SCALE1_BA9,		0x28},
> +		{DVBT_SCALE1_BAA,		0x59},
> +		{DVBT_SCALE1_BAB,		0x83},
> +		{DVBT_SCALE1_BAC,		0xd4},
> +		{DVBT_SCALE1_BB0,		0x65},
> +		{DVBT_SCALE1_BB1,		0x43},
> +		{DVBT_KB_P1,			0x1},
> +		{DVBT_KB_P2,			0x4},
> +		{DVBT_KB_P3,			0x7},
> +		{DVBT_K1_CR_STEP12,		0xa},
> +		{DVBT_REG_GPE,			0x1},
> +		{DVBT_SERIAL,			0x0},
> +		{DVBT_CDIV_PH0,			0x9},
> +		{DVBT_CDIV_PH1,			0x9},
> +		{DVBT_MPEG_IO_OPT_2_2,		0x0},
> +		{DVBT_MPEG_IO_OPT_1_0,		0x0},
> +		{DVBT_TRK_KS_P2,		0x4},
> +		{DVBT_TRK_KS_I2,		0x7},
> +		{DVBT_TR_THD_SET2,		0x6},
> +		{DVBT_TRK_KC_I2,		0x5},
> +		{DVBT_CR_THD_SET2,		0x1},
> +		{DVBT_SPEC_INV,			0x0},
> +		{DVBT_DAGC_TRG_VAL,		0x5a},
> +		{DVBT_AGC_TARG_VAL_0,		0x0},
> +		{DVBT_AGC_TARG_VAL_8_1,		0x5a},
> +		{DVBT_AAGC_LOOP_GAIN,		0x16},
> +		{DVBT_LOOP_GAIN2_3_0,		0x6},
> +		{DVBT_LOOP_GAIN2_4,		0x1},
> +		{DVBT_LOOP_GAIN3,		0x16},
> +		{DVBT_VTOP1,			0x35},
> +		{DVBT_VTOP2,			0x21},
> +		{DVBT_VTOP3,			0x21},
> +		{DVBT_KRF1,			0x0},
> +		{DVBT_KRF2,			0x40},
> +		{DVBT_KRF3,			0x10},
> +		{DVBT_KRF4,			0x10},
> +		{DVBT_IF_AGC_MIN,		0x80},
> +		{DVBT_IF_AGC_MAX,		0x7f},
> +		{DVBT_RF_AGC_MIN,		0x80},
> +		{DVBT_RF_AGC_MAX,		0x7f},
> +		{DVBT_POLAR_RF_AGC,		0x0},
> +		{DVBT_POLAR_IF_AGC,		0x0},
> +		{DVBT_AD7_SETTING,		0xe9bf},
> +		{DVBT_EN_GI_PGA,		0x0},
> +		{DVBT_THD_LOCK_UP,		0x0},
> +		{DVBT_THD_LOCK_DW,		0x0},
> +		{DVBT_THD_UP1,			0x11},
> +		{DVBT_THD_DW1,			0xef},
> +		{DVBT_INTER_CNT_LEN,		0xc},
> +		{DVBT_GI_PGA_STATE,		0x0},
> +		{DVBT_EN_AGC_PGA,		0x1},
> +		{DVBT_IF_AGC_MAN,		0x0},
> +	};
> +
> +
> +	dbg("%s", __func__);
> +
> +	en_bbin = (priv->cfg.if_dvbt == 0 ? 0x1 : 0x0);
> +
> +	/*
> +	* PSET_IFFREQ = - floor((IfFreqHz % CrystalFreqHz) * pow(2, 22)
> +	*		/ CrystalFreqHz)
> +	*/
> +	pset_iffreq = priv->cfg.if_dvbt % priv->cfg.xtal;
> +	pset_iffreq *= 0x400000;
> +	pset_iffreq = div_u64(pset_iffreq, priv->cfg.xtal);
> +	pset_iffreq = pset_iffreq & 0x3fffff;
> +
> +
> +
> +	for (i = 0; i < ARRAY_SIZE(rtl2832_initial_regs); i++) {
> +		ret = rtl2832_wr_demod_reg(priv, rtl2832_initial_regs[i].reg,
> +			rtl2832_initial_regs[i].value);
> +		if (ret)
> +			goto err;
> +	}
> +
> +	/* if frequency settings */
> +	ret = rtl2832_wr_demod_reg(priv, DVBT_EN_BBIN, en_bbin);
> +		if (ret)
> +			goto err;
> +
> +	ret = rtl2832_wr_demod_reg(priv, DVBT_PSET_IFFREQ, pset_iffreq);
> +		if (ret)
> +			goto err;
> +
> +	priv->sleeping = false;
> +
> +	return ret;
> +
> +err:
> +	dbg("%s: failed=%d", __func__, ret);
> +	return ret;
> +}
> +
> +static int rtl2832_sleep(struct dvb_frontend *fe)
> +{
> +	struct rtl2832_priv *priv = fe->demodulator_priv;
> +
> +	dbg("%s", __func__);
> +	priv->sleeping = true;
> +	return 0;
> +}
> +
> +int rtl2832_get_tune_settings(struct dvb_frontend *fe,
> +	struct dvb_frontend_tune_settings *s)
> +{
> +	dbg("%s", __func__);
> +	s->min_delay_ms = 1000;
> +	s->step_size = fe->ops.info.frequency_stepsize * 2;
> +	s->max_drift = (fe->ops.info.frequency_stepsize * 2) + 1;
> +	return 0;
> +}
> +
> +static int rtl2832_set_frontend(struct dvb_frontend *fe)
> +{
> +	struct rtl2832_priv *priv = fe->demodulator_priv;
> +	struct dtv_frontend_properties *c = &fe->dtv_property_cache;
> +	int ret, i, j;
> +	u64 bw_mode, num, num2;
> +	u32 resamp_ratio, cfreq_off_ratio;
> +
> +
> +	static u8 bw_params[3][32] = {
> +	/* 6 MHz bandwidth */
> +		{
> +		0xf5, 0xff, 0x15, 0x38, 0x5d, 0x6d, 0x52, 0x07, 0xfa, 0x2f,
> +		0x53, 0xf5, 0x3f, 0xca, 0x0b, 0x91, 0xea, 0x30, 0x63, 0xb2,
> +		0x13, 0xda, 0x0b, 0xc4, 0x18, 0x7e, 0x16, 0x66, 0x08, 0x67,
> +		0x19, 0xe0,
> +		},
> +
> +	/*  7 MHz bandwidth */
> +		{
> +		0xe7, 0xcc, 0xb5, 0xba, 0xe8, 0x2f, 0x67, 0x61, 0x00, 0xaf,
> +		0x86, 0xf2, 0xbf, 0x59, 0x04, 0x11, 0xb6, 0x33, 0xa4, 0x30,
> +		0x15, 0x10, 0x0a, 0x42, 0x18, 0xf8, 0x17, 0xd9, 0x07, 0x22,
> +		0x19, 0x10,
> +		},
> +
> +	/*  8 MHz bandwidth */
> +		{
> +		0x09, 0xf6, 0xd2, 0xa7, 0x9a, 0xc9, 0x27, 0x77, 0x06, 0xbf,
> +		0xec, 0xf4, 0x4f, 0x0b, 0xfc, 0x01, 0x63, 0x35, 0x54, 0xa7,
> +		0x16, 0x66, 0x08, 0xb4, 0x19, 0x6e, 0x19, 0x65, 0x05, 0xc8,
> +		0x19, 0xe0,
> +		},
> +	};
> +
> +
> +	dbg("%s: frequency=%d bandwidth_hz=%d inversion=%d", __func__,
> +		c->frequency, c->bandwidth_hz, c->inversion);
> +
> +
> +	/* program tuner */
> +	if (fe->ops.tuner_ops.set_params)
> +		fe->ops.tuner_ops.set_params(fe);
> +
> +
> +	switch (c->bandwidth_hz) {
> +	case 6000000:
> +		i = 0;
> +		bw_mode = 48000000;
> +		break;
> +	case 7000000:
> +		i = 1;
> +		bw_mode = 56000000;
> +		break;
> +	case 8000000:
> +		i = 2;
> +		bw_mode = 64000000;
> +		break;
> +	default:
> +		dbg("invalid bandwidth");
> +		return -EINVAL;
> +	}
> +
> +	for (j = 0; j < sizeof(bw_params[j]); j++) {
> +		ret = rtl2832_wr_regs(priv, 0x1c+j, 1, &bw_params[i][j], 1);
> +		if (ret)
> +			goto err;
> +	}
> +
> +	/* calculate and set resample ratio
> +	* RSAMP_RATIO = floor(CrystalFreqHz * 7 * pow(2, 22)
> +	*	/ ConstWithBandwidthMode)
> +	*/
> +	num = priv->cfg.xtal * 7;
> +	num *= 0x400000;
> +	num = div_u64(num, bw_mode);
> +	resamp_ratio =  num & 0x3ffffff;
> +	ret = rtl2832_wr_demod_reg(priv, DVBT_RSAMP_RATIO, resamp_ratio);
> +	if (ret)
> +		goto err;
> +
> +	/* calculate and set cfreq off ratio
> +	* CFREQ_OFF_RATIO = - floor(ConstWithBandwidthMode * pow(2, 20)
> +	*	/ (CrystalFreqHz * 7))
> +	*/
> +	num = bw_mode << 20;
> +	num2 = priv->cfg.xtal * 7;
> +	num = div_u64(num, num2);
> +	num = -num;
> +	cfreq_off_ratio = num & 0xfffff;
> +	ret = rtl2832_wr_demod_reg(priv, DVBT_CFREQ_OFF_RATIO, cfreq_off_ratio);
> +	if (ret)
> +		goto err;
> +
> +
> +	/* soft reset */
> +	ret = rtl2832_wr_demod_reg(priv, DVBT_SOFT_RST, 0x1);
> +	if (ret)
> +		goto err;
> +
> +	ret = rtl2832_wr_demod_reg(priv, DVBT_SOFT_RST, 0x0);
> +	if (ret)
> +		goto err;
> +
> +	return ret;
> +err:
> +	info("%s: failed=%d", __func__, ret);
> +	return ret;
> +}
> +
> +static int rtl2832_read_status(struct dvb_frontend *fe, fe_status_t *status)
> +{
> +	struct rtl2832_priv *priv = fe->demodulator_priv;
> +	int ret;
> +	u32 tmp;
> +	*status = 0;
> +
> +
> +	dbg("%s", __func__);
> +	if (priv->sleeping)
> +		return 0;
> +
> +	ret = rtl2832_rd_demod_reg(priv, DVBT_FSM_STAGE, &tmp);
> +	if (ret)
> +		goto err;
> +
> +	if (tmp == 11) {
> +		*status |= FE_HAS_SIGNAL | FE_HAS_CARRIER |
> +				FE_HAS_VITERBI | FE_HAS_SYNC | FE_HAS_LOCK;
> +	}
> +	/* TODO find out if this is also true for rtl2832? */
> +	/*else if (tmp == 10) {
> +		*status |= FE_HAS_SIGNAL | FE_HAS_CARRIER |
> +				FE_HAS_VITERBI;
> +	}*/
> +
> +	return ret;
> +err:
> +	info("%s: failed=%d", __func__, ret);
> +	return ret;
> +}
> +
> +static int rtl2832_read_snr(struct dvb_frontend *fe, u16 *snr)
> +{
> +	*snr = 0;
> +	return 0;
> +}
> +
> +static int rtl2832_read_ber(struct dvb_frontend *fe, u32 *ber)
> +{
> +	*ber = 0;
> +	return 0;
> +}
> +
> +static int rtl2832_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
> +{
> +	*ucblocks = 0;
> +	return 0;
> +}
> +
> +
> +static int rtl2832_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
> +{
> +	*strength = 0;
> +	return 0;
> +}
> +
> +static struct dvb_frontend_ops rtl2832_ops;
> +
> +static void rtl2832_release(struct dvb_frontend *fe)
> +{
> +	struct rtl2832_priv *priv = fe->demodulator_priv;
> +
> +	dbg("%s", __func__);
> +	kfree(priv);
> +}
> +
> +struct dvb_frontend *rtl2832_attach(const struct rtl2832_config *cfg,
> +	struct i2c_adapter *i2c)
> +{
> +	struct rtl2832_priv *priv = NULL;
> +	int ret = 0;
> +	u8 tmp;
> +
> +	dbg("%s", __func__);
> +
> +	/* allocate memory for the internal state */
> +	priv = kzalloc(sizeof(struct rtl2832_priv), GFP_KERNEL);
> +	if (priv == NULL)
> +		goto err;
> +
> +	/* setup the priv */
> +	priv->i2c = i2c;
> +	priv->tuner = cfg->tuner;
> +	memcpy(&priv->cfg, cfg, sizeof(struct rtl2832_config));
> +
> +	/* check if the demod is there */
> +	ret = rtl2832_rd_reg(priv, 0x00, 0x0, &tmp);
> +	if (ret)
> +		goto err;
> +
> +	/* create dvb_frontend */
> +	memcpy(&priv->fe.ops, &rtl2832_ops, sizeof(struct dvb_frontend_ops));
> +	priv->fe.demodulator_priv = priv;
> +
> +	/* TODO implement sleep mode */
> +	priv->sleeping = true;
> +
> +	return &priv->fe;
> +err:
> +	dbg("%s: failed=%d", __func__, ret);
> +	kfree(priv);
> +	return NULL;
> +}
> +EXPORT_SYMBOL(rtl2832_attach);
> +
> +static struct dvb_frontend_ops rtl2832_ops = {
> +	.delsys = { SYS_DVBT },
> +	.info = {
> +		.name = "Realtek RTL2832 (DVB-T)",
> +		.frequency_min	  = 174000000,
> +		.frequency_max	  = 862000000,
> +		.frequency_stepsize = 166667,
> +		.caps = FE_CAN_FEC_1_2 |
> +			FE_CAN_FEC_2_3 |
> +			FE_CAN_FEC_3_4 |
> +			FE_CAN_FEC_5_6 |
> +			FE_CAN_FEC_7_8 |
> +			FE_CAN_FEC_AUTO |
> +			FE_CAN_QPSK |
> +			FE_CAN_QAM_16 |
> +			FE_CAN_QAM_64 |
> +			FE_CAN_QAM_AUTO |
> +			FE_CAN_TRANSMISSION_MODE_AUTO |
> +			FE_CAN_GUARD_INTERVAL_AUTO |
> +			FE_CAN_HIERARCHY_AUTO |
> +			FE_CAN_RECOVER |
> +			FE_CAN_MUTE_TS
> +	 },
> +
> +	.release = rtl2832_release,
> +
> +	.init = rtl2832_init,
> +	.sleep = rtl2832_sleep,
> +
> +	.get_tune_settings = rtl2832_get_tune_settings,
> +
> +	.set_frontend = rtl2832_set_frontend,
> +
> +	.read_status = rtl2832_read_status,
> +	.read_snr = rtl2832_read_snr,
> +	.read_ber = rtl2832_read_ber,
> +	.read_ucblocks = rtl2832_read_ucblocks,
> +	.read_signal_strength = rtl2832_read_signal_strength,
> +	.i2c_gate_ctrl = rtl2832_i2c_gate_ctrl,
> +};
> +
> +MODULE_AUTHOR("Thomas Mair <mair.thomas86@gmail.com>");
> +MODULE_DESCRIPTION("Realtek RTL2832 DVB-T demodulator driver");
> +MODULE_LICENSE("GPL");
> +MODULE_VERSION("0.4");
> diff --git a/drivers/media/dvb/frontends/rtl2832.h b/drivers/media/dvb/frontends/rtl2832.h
> new file mode 100644
> index 0000000..d94dc9a
> --- /dev/null
> +++ b/drivers/media/dvb/frontends/rtl2832.h
> @@ -0,0 +1,74 @@
> +/*
> + * Realtek RTL2832 DVB-T demodulator driver
> + *
> + * Copyright (C) 2012 Thomas Mair <thomas.mair86@gmail.com>
> + *
> + *	This program is free software; you can redistribute it and/or modify
> + *	it under the terms of the GNU General Public License as published by
> + *	the Free Software Foundation; either version 2 of the License, or
> + *	(at your option) any later version.
> + *
> + *	This program is distributed in the hope that it will be useful,
> + *	but WITHOUT ANY WARRANTY; without even the implied warranty of
> + *	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + *	GNU General Public License for more details.
> + *
> + *	You should have received a copy of the GNU General Public License along
> + *	with this program; if not, write to the Free Software Foundation, Inc.,
> + *	51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
> + */
> +
> +#ifndef RTL2832_H
> +#define RTL2832_H
> +
> +#include <linux/dvb/frontend.h>
> +
> +struct rtl2832_config {
> +	/*
> +	 * Demodulator I2C address.
> +	 */
> +	u8 i2c_addr;
> +
> +	/*
> +	 * Xtal frequency.
> +	 * Hz
> +	 * 4000000, 16000000, 25000000, 28800000
> +	 */
> +	u32 xtal;
> +
> +	/*
> +	 * IFs for all used modes.
> +	 * Hz
> +	 * 4570000, 4571429, 36000000, 36125000, 36166667, 44000000
> +	 */
> +	u32 if_dvbt;
> +
> +	/*
> +	 */
> +	u8 tuner;
> +};
> +
> +
> +#if defined(CONFIG_DVB_RTL2832) || \
> +	(defined(CONFIG_DVB_RTL2832_MODULE) && defined(MODULE))
> +extern struct dvb_frontend *rtl2832_attach(
> +	const struct rtl2832_config *cfg,
> +	struct i2c_adapter *i2c
> +);
> +
> +extern struct i2c_adapter *rtl2832_get_tuner_i2c_adapter(
> +	struct dvb_frontend *fe
> +);
> +#else
> +static inline struct dvb_frontend *rtl2832_attach(
> +	const struct rtl2832_config *config,
> +	struct i2c_adapter *i2c
> +)
> +{
> +	printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
> +	return NULL;
> +}
> +#endif
> +
> +
> +#endif /* RTL2832_H */
> diff --git a/drivers/media/dvb/frontends/rtl2832_priv.h b/drivers/media/dvb/frontends/rtl2832_priv.h
> new file mode 100644
> index 0000000..3e52674
> --- /dev/null
> +++ b/drivers/media/dvb/frontends/rtl2832_priv.h
> @@ -0,0 +1,258 @@
> +/*
> + * Realtek RTL2832 DVB-T demodulator driver
> + *
> + * Copyright (C) 2012 Thomas Mair <thomas.mair86@gmail.com>
> + *
> + *	This program is free software; you can redistribute it and/or modify
> + *	it under the terms of the GNU General Public License as published by
> + *	the Free Software Foundation; either version 2 of the License, or
> + *	(at your option) any later version.
> + *
> + *	This program is distributed in the hope that it will be useful,
> + *	but WITHOUT ANY WARRANTY; without even the implied warranty of
> + *	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + *	GNU General Public License for more details.
> + *
> + *	You should have received a copy of the GNU General Public License along
> + *	with this program; if not, write to the Free Software Foundation, Inc.,
> + *	51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
> + */
> +
> +#ifndef RTL2832_PRIV_H
> +#define RTL2832_PRIV_H
> +
> +#include "dvb_frontend.h"
> +#include "rtl2832.h"
> +
> +#define LOG_PREFIX "rtl2832"
> +
> +#undef dbg
> +#define dbg(f, arg...) \
> +	if (rtl2832_debug) \
> +		printk(KERN_INFO LOG_PREFIX": " f "\n" , ## arg)
> +#undef err
> +#define err(f, arg...)  printk(KERN_ERR	LOG_PREFIX": " f "\n" , ## arg)
> +#undef info
> +#define info(f, arg...) printk(KERN_INFO LOG_PREFIX": " f "\n" , ## arg)
> +#undef warn
> +#define warn(f, arg...) printk(KERN_WARNING LOG_PREFIX": " f "\n" , ## arg)
> +
> +struct rtl2832_priv {
> +	struct i2c_adapter *i2c;
> +	struct dvb_frontend fe;
> +	struct rtl2832_config cfg;
> +
> +	bool i2c_gate_state;
> +	bool sleeping;
> +
> +	u8 tuner;
> +	u8 page; /* active register page */
> +};
> +
> +struct rtl2832_reg_entry {
> +	u8 page;
> +	u8 start_address;
> +	u8 msb;
> +	u8 lsb;
> +};
> +
> +struct rtl2832_reg_value {
> +	int reg;
> +	u32 value;
> +};
> +
> +
> +/* Demod register bit names */
> +enum DVBT_REG_BIT_NAME {
> +	DVBT_SOFT_RST,
> +	DVBT_IIC_REPEAT,
> +	DVBT_TR_WAIT_MIN_8K,
> +	DVBT_RSD_BER_FAIL_VAL,
> +	DVBT_EN_BK_TRK,
> +	DVBT_REG_PI,
> +	DVBT_REG_PFREQ_1_0,
> +	DVBT_PD_DA8,
> +	DVBT_LOCK_TH,
> +	DVBT_BER_PASS_SCAL,
> +	DVBT_CE_FFSM_BYPASS,
> +	DVBT_ALPHAIIR_N,
> +	DVBT_ALPHAIIR_DIF,
> +	DVBT_EN_TRK_SPAN,
> +	DVBT_LOCK_TH_LEN,
> +	DVBT_CCI_THRE,
> +	DVBT_CCI_MON_SCAL,
> +	DVBT_CCI_M0,
> +	DVBT_CCI_M1,
> +	DVBT_CCI_M2,
> +	DVBT_CCI_M3,
> +	DVBT_SPEC_INIT_0,
> +	DVBT_SPEC_INIT_1,
> +	DVBT_SPEC_INIT_2,
> +	DVBT_AD_EN_REG,
> +	DVBT_AD_EN_REG1,
> +	DVBT_EN_BBIN,
> +	DVBT_MGD_THD0,
> +	DVBT_MGD_THD1,
> +	DVBT_MGD_THD2,
> +	DVBT_MGD_THD3,
> +	DVBT_MGD_THD4,
> +	DVBT_MGD_THD5,
> +	DVBT_MGD_THD6,
> +	DVBT_MGD_THD7,
> +	DVBT_EN_CACQ_NOTCH,
> +	DVBT_AD_AV_REF,
> +	DVBT_PIP_ON,
> +	DVBT_SCALE1_B92,
> +	DVBT_SCALE1_B93,
> +	DVBT_SCALE1_BA7,
> +	DVBT_SCALE1_BA9,
> +	DVBT_SCALE1_BAA,
> +	DVBT_SCALE1_BAB,
> +	DVBT_SCALE1_BAC,
> +	DVBT_SCALE1_BB0,
> +	DVBT_SCALE1_BB1,
> +	DVBT_KB_P1,
> +	DVBT_KB_P2,
> +	DVBT_KB_P3,
> +	DVBT_OPT_ADC_IQ,
> +	DVBT_AD_AVI,
> +	DVBT_AD_AVQ,
> +	DVBT_K1_CR_STEP12,
> +	DVBT_TRK_KS_P2,
> +	DVBT_TRK_KS_I2,
> +	DVBT_TR_THD_SET2,
> +	DVBT_TRK_KC_P2,
> +	DVBT_TRK_KC_I2,
> +	DVBT_CR_THD_SET2,
> +	DVBT_PSET_IFFREQ,
> +	DVBT_SPEC_INV,
> +	DVBT_BW_INDEX,
> +	DVBT_RSAMP_RATIO,
> +	DVBT_CFREQ_OFF_RATIO,
> +	DVBT_FSM_STAGE,
> +	DVBT_RX_CONSTEL,
> +	DVBT_RX_HIER,
> +	DVBT_RX_C_RATE_LP,
> +	DVBT_RX_C_RATE_HP,
> +	DVBT_GI_IDX,
> +	DVBT_FFT_MODE_IDX,
> +	DVBT_RSD_BER_EST,
> +	DVBT_CE_EST_EVM,
> +	DVBT_RF_AGC_VAL,
> +	DVBT_IF_AGC_VAL,
> +	DVBT_DAGC_VAL,
> +	DVBT_SFREQ_OFF,
> +	DVBT_CFREQ_OFF,
> +	DVBT_POLAR_RF_AGC,
> +	DVBT_POLAR_IF_AGC,
> +	DVBT_AAGC_HOLD,
> +	DVBT_EN_RF_AGC,
> +	DVBT_EN_IF_AGC,
> +	DVBT_IF_AGC_MIN,
> +	DVBT_IF_AGC_MAX,
> +	DVBT_RF_AGC_MIN,
> +	DVBT_RF_AGC_MAX,
> +	DVBT_IF_AGC_MAN,
> +	DVBT_IF_AGC_MAN_VAL,
> +	DVBT_RF_AGC_MAN,
> +	DVBT_RF_AGC_MAN_VAL,
> +	DVBT_DAGC_TRG_VAL,
> +	DVBT_AGC_TARG_VAL,
> +	DVBT_LOOP_GAIN_3_0,
> +	DVBT_LOOP_GAIN_4,
> +	DVBT_VTOP,
> +	DVBT_KRF,
> +	DVBT_AGC_TARG_VAL_0,
> +	DVBT_AGC_TARG_VAL_8_1,
> +	DVBT_AAGC_LOOP_GAIN,
> +	DVBT_LOOP_GAIN2_3_0,
> +	DVBT_LOOP_GAIN2_4,
> +	DVBT_LOOP_GAIN3,
> +	DVBT_VTOP1,
> +	DVBT_VTOP2,
> +	DVBT_VTOP3,
> +	DVBT_KRF1,
> +	DVBT_KRF2,
> +	DVBT_KRF3,
> +	DVBT_KRF4,
> +	DVBT_EN_GI_PGA,
> +	DVBT_THD_LOCK_UP,
> +	DVBT_THD_LOCK_DW,
> +	DVBT_THD_UP1,
> +	DVBT_THD_DW1,
> +	DVBT_INTER_CNT_LEN,
> +	DVBT_GI_PGA_STATE,
> +	DVBT_EN_AGC_PGA,
> +	DVBT_CKOUTPAR,
> +	DVBT_CKOUT_PWR,
> +	DVBT_SYNC_DUR,
> +	DVBT_ERR_DUR,
> +	DVBT_SYNC_LVL,
> +	DVBT_ERR_LVL,
> +	DVBT_VAL_LVL,
> +	DVBT_SERIAL,
> +	DVBT_SER_LSB,
> +	DVBT_CDIV_PH0,
> +	DVBT_CDIV_PH1,
> +	DVBT_MPEG_IO_OPT_2_2,
> +	DVBT_MPEG_IO_OPT_1_0,
> +	DVBT_CKOUTPAR_PIP,
> +	DVBT_CKOUT_PWR_PIP,
> +	DVBT_SYNC_LVL_PIP,
> +	DVBT_ERR_LVL_PIP,
> +	DVBT_VAL_LVL_PIP,
> +	DVBT_CKOUTPAR_PID,
> +	DVBT_CKOUT_PWR_PID,
> +	DVBT_SYNC_LVL_PID,
> +	DVBT_ERR_LVL_PID,
> +	DVBT_VAL_LVL_PID,
> +	DVBT_SM_PASS,
> +	DVBT_UPDATE_REG_2,
> +	DVBT_BTHD_P3,
> +	DVBT_BTHD_D3,
> +	DVBT_FUNC4_REG0,
> +	DVBT_FUNC4_REG1,
> +	DVBT_FUNC4_REG2,
> +	DVBT_FUNC4_REG3,
> +	DVBT_FUNC4_REG4,
> +	DVBT_FUNC4_REG5,
> +	DVBT_FUNC4_REG6,
> +	DVBT_FUNC4_REG7,
> +	DVBT_FUNC4_REG8,
> +	DVBT_FUNC4_REG9,
> +	DVBT_FUNC4_REG10,
> +	DVBT_FUNC5_REG0,
> +	DVBT_FUNC5_REG1,
> +	DVBT_FUNC5_REG2,
> +	DVBT_FUNC5_REG3,
> +	DVBT_FUNC5_REG4,
> +	DVBT_FUNC5_REG5,
> +	DVBT_FUNC5_REG6,
> +	DVBT_FUNC5_REG7,
> +	DVBT_FUNC5_REG8,
> +	DVBT_FUNC5_REG9,
> +	DVBT_FUNC5_REG10,
> +	DVBT_FUNC5_REG11,
> +	DVBT_FUNC5_REG12,
> +	DVBT_FUNC5_REG13,
> +	DVBT_FUNC5_REG14,
> +	DVBT_FUNC5_REG15,
> +	DVBT_FUNC5_REG16,
> +	DVBT_FUNC5_REG17,
> +	DVBT_FUNC5_REG18,
> +	DVBT_AD7_SETTING,
> +	DVBT_RSSI_R,
> +	DVBT_ACI_DET_IND,
> +	DVBT_REG_MON,
> +	DVBT_REG_MONSEL,
> +	DVBT_REG_GPE,
> +	DVBT_REG_GPO,
> +	DVBT_REG_4MSEL,
> +	DVBT_TEST_REG_1,
> +	DVBT_TEST_REG_2,
> +	DVBT_TEST_REG_3,
> +	DVBT_TEST_REG_4,
> +	DVBT_REG_BIT_NAME_ITEM_TERMINATOR,
> +};
> +
> +#endif /* RTL2832_PRIV_H */

modinfo dvb_usb_rtl28xxu
filename:
/lib/modules/3.3.5-2.fc16.x86_64/kernel/drivers/media/dvb/dvb-usb/dvb-usb-rtl28xxu.ko
license:        GPL
author:         Thomas Mair <thomas.mair86@googlemail.com>
author:         Antti Palosaari <crope@iki.fi>
description:    Realtek RTL28xxU DVB USB driver
alias:          usb:v0CCDp00B3d*dc*dsc*dp*ic*isc*ip*
alias:          usb:v1F4DpB803d*dc*dsc*dp*ic*isc*ip*
alias:          usb:v0CCDp00A9d*dc*dsc*dp*ic*isc*ip*
alias:          usb:v14AAp0161d*dc*dsc*dp*ic*isc*ip*
alias:          usb:v14AAp0160d*dc*dsc*dp*ic*isc*ip*
alias:          usb:v0BDAp2831d*dc*dsc*dp*ic*isc*ip*
depends:        dvb-usb,rtl2830,rc-core
vermagic:       3.3.5-2.fc16.x86_64 SMP mod_unload
parm:           debug:set debugging level (int)
parm:           adapter_nr:DVB adapter numbers (array of short)

modinfo rtl2832
filename:
/lib/modules/3.3.5-2.fc16.x86_64/kernel/drivers/media/dvb/frontends/rtl2832.ko
version:        0.4
license:        GPL
description:    Realtek RTL2832 DVB-T demodulator driver
author:         Thomas Mair <mair.thomas86@gmail.com>
srcversion:     533BB7E5866E52F63B9ACCB
depends:        i2c-core
vermagic:       3.3.5-2.fc16.x86_64 SMP mod_unload
parm:           debug:Turn on/off frontend debugging (default:off). (int)

modinfo fc0012
filename:
/lib/modules/3.3.5-2.fc16.x86_64/kernel/drivers/media/common/tuners/fc0012.ko
version:        0.6
license:        GPL
author:         Hans-Frieder Vogt <hfvogt@gmx.net>
description:    Fitipower FC0012 silicon tuner driver
srcversion:     533BB7E5866E52F63B9ACCB
depends:        i2c-core
vermagic:       3.3.5-2.fc16.x86_64 SMP mod_unload

femon -H -a 2 -c 5
FE: Realtek RTL2832 (DVB-T) (DVBT)
status SCVYL | signal  23% | snr   0% | ber 0 | unc 0 | FE_HAS_LOCK
status SCVYL | signal  23% | snr   0% | ber 0 | unc 0 | FE_HAS_LOCK
status SCVYL | signal  23% | snr   0% | ber 0 | unc 0 | FE_HAS_LOCK
status SCVYL | signal  23% | snr   0% | ber 0 | unc 0 | FE_HAS_LOCK
status SCVYL | signal  23% | snr   0% | ber 0 | unc 0 | FE_HAS_LOCK

mini flip-flop:
-v4-1-5-rtl2832-ver.-0.4-v2.diff

All in all nice play ;)

regards,
poma

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [PATCH v4 1/5] rtl2832 ver. 0.4: removed signal statistics
  2012-05-17  3:36     ` poma
@ 2012-05-17  3:40       ` poma
  2012-05-17  8:04         ` Thomas Mair
  0 siblings, 1 reply; 104+ messages in thread
From: poma @ 2012-05-17  3:40 UTC (permalink / raw)
  To: Thomas Mair, linux-media

[-- Attachment #1: Type: text/plain, Size: 39 bytes --]

[…]
v4-1-5-rtl2832-ver.-0.4-v2.diff


[-- Attachment #2: v4-1-5-rtl2832-ver.-0.4-v2.diff --]
[-- Type: text/x-patch, Size: 505 bytes --]

--- v4-1-5-rtl2832-ver.-0.4-removed-signal-statistics.patch.orig	2012-05-17 05:17:16.732328539 +0200
+++ v4-1-5-rtl2832-ver.-0.4-removed-signal-statistics.patch	2012-05-17 05:17:35.999265106 +0200
@@ -24,7 +24,7 @@
  obj-$(CONFIG_DVB_A8293) += a8293.o
  obj-$(CONFIG_DVB_TDA10071) += tda10071.o
  obj-$(CONFIG_DVB_RTL2830) += rtl2830.o
-+obj-$(CONFIG_DVB_RTL2830) += rtl2832.o
++obj-$(CONFIG_DVB_RTL2832) += rtl2832.o
  obj-$(CONFIG_DVB_M88RS2000) += m88rs2000.o
  obj-$(CONFIG_DVB_AF9033) += af9033.o
  

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [PATCH v4 1/5] rtl2832 ver. 0.4: removed signal statistics
  2012-05-17  3:40       ` poma
@ 2012-05-17  8:04         ` Thomas Mair
  0 siblings, 0 replies; 104+ messages in thread
From: Thomas Mair @ 2012-05-17  8:04 UTC (permalink / raw)
  To: poma; +Cc: linux-media

On 17.05.2012 05:40, poma wrote:
> […]
> v4-1-5-rtl2832-ver.-0.4-v2.diff
> 

Oh thanks. That Makefile is haunting me badly ;)

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [PATCH v4 1/5] rtl2832 ver. 0.4: removed signal statistics
  2012-05-16 22:13   ` [PATCH v4 1/5] rtl2832 ver. 0.4: removed signal statistics Thomas Mair
  2012-05-17  3:36     ` poma
@ 2012-05-17 14:19     ` Antti Palosaari
  2012-05-17 20:27       ` poma
  2012-05-18  0:55       ` poma
  1 sibling, 2 replies; 104+ messages in thread
From: Antti Palosaari @ 2012-05-17 14:19 UTC (permalink / raw)
  To: Thomas Mair; +Cc: pomidorabelisima, Linux Media Mailing List

Moikka Thomas,

Here is the review. See comments below.

And conclusion is that it is ready for the Kernel merge. I did not see 
any big functiuonality problems - only some small issues that are likely 
considered as a coding style etc. Feel free to fix those and sent new 
patc serie or just new patch top of that.

Reviewed-by: Antti Palosaari <crope@iki.fi>


On 17.05.2012 01:13, Thomas Mair wrote:
> Changelog for ver. 0.3:
> - removed statistics as their calculation was wrong
> - fixed bug in Makefile
> - indentation and code style improvements
>
> Signed-off-by: Thomas Mair<thomas.mair86@googlemail.com>
> ---
>   drivers/media/dvb/frontends/Kconfig        |    7 +
>   drivers/media/dvb/frontends/Makefile       |    1 +
>   drivers/media/dvb/frontends/rtl2832.c      |  825 ++++++++++++++++++++++++++++
>   drivers/media/dvb/frontends/rtl2832.h      |   74 +++
>   drivers/media/dvb/frontends/rtl2832_priv.h |  258 +++++++++
>   5 files changed, 1165 insertions(+), 0 deletions(-)
>   create mode 100644 drivers/media/dvb/frontends/rtl2832.c
>   create mode 100644 drivers/media/dvb/frontends/rtl2832.h
>   create mode 100644 drivers/media/dvb/frontends/rtl2832_priv.h
>
> diff --git a/drivers/media/dvb/frontends/Kconfig b/drivers/media/dvb/frontends/Kconfig
> index f479834..f7d67d7 100644
> --- a/drivers/media/dvb/frontends/Kconfig
> +++ b/drivers/media/dvb/frontends/Kconfig
> @@ -432,6 +432,13 @@ config DVB_RTL2830
>   	help
>   	  Say Y when you want to support this frontend.
>
> +config DVB_RTL2832
> +	tristate "Realtek RTL2832 DVB-T"
> +	depends on DVB_CORE&&  I2C
> +	default m if DVB_FE_CUSTOMISE
> +	help
> +	  Say Y when you want to support this frontend.
> +

It is correct.

Just for the comment as you said in cover letter that you are unsure 
about that.

>   comment "DVB-C (cable) frontends"
>   	depends on DVB_CORE
>
> diff --git a/drivers/media/dvb/frontends/Makefile b/drivers/media/dvb/frontends/Makefile
> index b0381dc..bbf2955 100644
> --- a/drivers/media/dvb/frontends/Makefile
> +++ b/drivers/media/dvb/frontends/Makefile
> @@ -98,6 +98,7 @@ obj-$(CONFIG_DVB_IT913X_FE) += it913x-fe.o
>   obj-$(CONFIG_DVB_A8293) += a8293.o
>   obj-$(CONFIG_DVB_TDA10071) += tda10071.o
>   obj-$(CONFIG_DVB_RTL2830) += rtl2830.o
> +obj-$(CONFIG_DVB_RTL2830) += rtl2832.o
>   obj-$(CONFIG_DVB_M88RS2000) += m88rs2000.o
>   obj-$(CONFIG_DVB_AF9033) += af9033.o
>
> diff --git a/drivers/media/dvb/frontends/rtl2832.c b/drivers/media/dvb/frontends/rtl2832.c
> new file mode 100644
> index 0000000..51c7927
> --- /dev/null
> +++ b/drivers/media/dvb/frontends/rtl2832.c
> @@ -0,0 +1,825 @@
> +/*
> + * Realtek RTL2832 DVB-T demodulator driver
> + *
> + * Copyright (C) 2012 Thomas Mair<thomas.mair86@gmail.com>
> + *
> + *	This program is free software; you can redistribute it and/or modify
> + *	it under the terms of the GNU General Public License as published by
> + *	the Free Software Foundation; either version 2 of the License, or
> + *	(at your option) any later version.
> + *
> + *	This program is distributed in the hope that it will be useful,
> + *	but WITHOUT ANY WARRANTY; without even the implied warranty of
> + *	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + *	GNU General Public License for more details.
> + *
> + *	You should have received a copy of the GNU General Public License along
> + *	with this program; if not, write to the Free Software Foundation, Inc.,
> + *	51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
> + */
> +
> +#include "rtl2832_priv.h"
> +
> +
> +int rtl2832_debug;
> +module_param_named(debug, rtl2832_debug, int, 0644);
> +MODULE_PARM_DESC(debug, "Turn on/off frontend debugging (default:off).");
> +
> +
> +static int reg_mask[32] = {

This should be static const.

> +	0x00000001,
> +	0x00000003,
> +	0x00000007,
> +	0x0000000f,
> +	0x0000001f,
> +	0x0000003f,
> +	0x0000007f,
> +	0x000000ff,
> +	0x000001ff,
> +	0x000003ff,
> +	0x000007ff,
> +	0x00000fff,
> +	0x00001fff,
> +	0x00003fff,
> +	0x00007fff,
> +	0x0000ffff,
> +	0x0001ffff,
> +	0x0003ffff,
> +	0x0007ffff,
> +	0x000fffff,
> +	0x001fffff,
> +	0x003fffff,
> +	0x007fffff,
> +	0x00ffffff,
> +	0x01ffffff,
> +	0x03ffffff,
> +	0x07ffffff,
> +	0x0fffffff,
> +	0x1fffffff,
> +	0x3fffffff,
> +	0x7fffffff,
> +	0xffffffff
> +};
> +
> +struct rtl2832_reg_entry registers[] = {

static const struct

> +	[DVBT_SOFT_RST]		= {0x1, 0x1,   2, 2},
> +	[DVBT_IIC_REPEAT]	= {0x1, 0x1,   3, 3},
> +	[DVBT_TR_WAIT_MIN_8K]	= {0x1, 0x88, 11, 2},
> +	[DVBT_RSD_BER_FAIL_VAL]	= {0x1, 0x8f, 15, 0},
> +	[DVBT_EN_BK_TRK]	= {0x1, 0xa6,  7, 7},
> +	[DVBT_AD_EN_REG]	= {0x0, 0x8,   7, 7},
> +	[DVBT_AD_EN_REG1]	= {0x0, 0x8,   6, 6},
> +	[DVBT_EN_BBIN]		= {0x1, 0xb1,  0, 0},
> +	[DVBT_MGD_THD0]		= {0x1, 0x95,  7, 0},
> +	[DVBT_MGD_THD1]		= {0x1, 0x96,  7, 0},
> +	[DVBT_MGD_THD2]		= {0x1, 0x97,  7, 0},
> +	[DVBT_MGD_THD3]		= {0x1, 0x98,  7, 0},
> +	[DVBT_MGD_THD4]		= {0x1, 0x99,  7, 0},
> +	[DVBT_MGD_THD5]		= {0x1, 0x9a,  7, 0},
> +	[DVBT_MGD_THD6]		= {0x1, 0x9b,  7, 0},
> +	[DVBT_MGD_THD7]		= {0x1, 0x9c,  7, 0},
> +	[DVBT_EN_CACQ_NOTCH]	= {0x1, 0x61,  4, 4},
> +	[DVBT_AD_AV_REF]	= {0x0, 0x9,   6, 0},
> +	[DVBT_REG_PI]		= {0x0, 0xa,   2, 0},
> +	[DVBT_PIP_ON]		= {0x0, 0x21,  3, 3},
> +	[DVBT_SCALE1_B92]	= {0x2, 0x92,  7, 0},
> +	[DVBT_SCALE1_B93]	= {0x2, 0x93,  7, 0},
> +	[DVBT_SCALE1_BA7]	= {0x2, 0xa7,  7, 0},
> +	[DVBT_SCALE1_BA9]	= {0x2, 0xa9,  7, 0},
> +	[DVBT_SCALE1_BAA]	= {0x2, 0xaa,  7, 0},
> +	[DVBT_SCALE1_BAB]	= {0x2, 0xab,  7, 0},
> +	[DVBT_SCALE1_BAC]	= {0x2, 0xac,  7, 0},
> +	[DVBT_SCALE1_BB0]	= {0x2, 0xb0,  7, 0},
> +	[DVBT_SCALE1_BB1]	= {0x2, 0xb1,  7, 0},
> +	[DVBT_KB_P1]		= {0x1, 0x64,  3, 1},
> +	[DVBT_KB_P2]		= {0x1, 0x64,  6, 4},
> +	[DVBT_KB_P3]		= {0x1, 0x65,  2, 0},
> +	[DVBT_OPT_ADC_IQ]	= {0x0, 0x6,   5, 4},
> +	[DVBT_AD_AVI]		= {0x0, 0x9,   1, 0},
> +	[DVBT_AD_AVQ]		= {0x0, 0x9,   3, 2},
> +	[DVBT_K1_CR_STEP12]	= {0x2, 0xad,  9, 4},
> +	[DVBT_TRK_KS_P2]	= {0x1, 0x6f,  2, 0},
> +	[DVBT_TRK_KS_I2]	= {0x1, 0x70,  5, 3},
> +	[DVBT_TR_THD_SET2]	= {0x1, 0x72,  3, 0},
> +	[DVBT_TRK_KC_P2]	= {0x1, 0x73,  5, 3},
> +	[DVBT_TRK_KC_I2]	= {0x1, 0x75,  2, 0},
> +	[DVBT_CR_THD_SET2]	= {0x1, 0x76,  7, 6},
> +	[DVBT_PSET_IFFREQ]	= {0x1, 0x19, 21, 0},
> +	[DVBT_SPEC_INV]		= {0x1, 0x15,  0, 0},
> +	[DVBT_RSAMP_RATIO]	= {0x1, 0x9f, 27, 2},
> +	[DVBT_CFREQ_OFF_RATIO]	= {0x1, 0x9d, 23, 4},
> +	[DVBT_FSM_STAGE]	= {0x3, 0x51,  6, 3},
> +	[DVBT_RX_CONSTEL]	= {0x3, 0x3c,  3, 2},
> +	[DVBT_RX_HIER]		= {0x3, 0x3c,  6, 4},
> +	[DVBT_RX_C_RATE_LP]	= {0x3, 0x3d,  2, 0},
> +	[DVBT_RX_C_RATE_HP]	= {0x3, 0x3d,  5, 3},
> +	[DVBT_GI_IDX]		= {0x3, 0x51,  1, 0},
> +	[DVBT_FFT_MODE_IDX]	= {0x3, 0x51,  2, 2},
> +	[DVBT_RSD_BER_EST]	= {0x3, 0x4e, 15, 0},
> +	[DVBT_CE_EST_EVM]	= {0x4, 0xc,  15, 0},
> +	[DVBT_RF_AGC_VAL]	= {0x3, 0x5b, 13, 0},
> +	[DVBT_IF_AGC_VAL]	= {0x3, 0x59, 13, 0},
> +	[DVBT_DAGC_VAL]		= {0x3, 0x5,   7, 0},
> +	[DVBT_SFREQ_OFF]	= {0x3, 0x18, 13, 0},
> +	[DVBT_CFREQ_OFF]	= {0x3, 0x5f, 17, 0},
> +	[DVBT_POLAR_RF_AGC]	= {0x0, 0xe,   1, 1},
> +	[DVBT_POLAR_IF_AGC]	= {0x0, 0xe,   0, 0},
> +	[DVBT_AAGC_HOLD]	= {0x1, 0x4,   5, 5},
> +	[DVBT_EN_RF_AGC]	= {0x1, 0x4,   6, 6},
> +	[DVBT_EN_IF_AGC]	= {0x1, 0x4,   7, 7},
> +	[DVBT_IF_AGC_MIN]	= {0x1, 0x8,   7, 0},
> +	[DVBT_IF_AGC_MAX]	= {0x1, 0x9,   7, 0},
> +	[DVBT_RF_AGC_MIN]	= {0x1, 0xa,   7, 0},
> +	[DVBT_RF_AGC_MAX]	= {0x1, 0xb,   7, 0},
> +	[DVBT_IF_AGC_MAN]	= {0x1, 0xc,   6, 6},
> +	[DVBT_IF_AGC_MAN_VAL]	= {0x1, 0xc,  13, 0},
> +	[DVBT_RF_AGC_MAN]	= {0x1, 0xe,   6, 6},
> +	[DVBT_RF_AGC_MAN_VAL]	= {0x1, 0xe,  13, 0},
> +	[DVBT_DAGC_TRG_VAL]	= {0x1, 0x12,  7, 0},
> +	[DVBT_AGC_TARG_VAL_0]	= {0x1, 0x2,   0, 0},
> +	[DVBT_AGC_TARG_VAL_8_1]	= {0x1, 0x3,   7, 0},
> +	[DVBT_AAGC_LOOP_GAIN]	= {0x1, 0xc7,  5, 1},
> +	[DVBT_LOOP_GAIN2_3_0]	= {0x1, 0x4,   4, 1},
> +	[DVBT_LOOP_GAIN2_4]	= {0x1, 0x5,   7, 7},
> +	[DVBT_LOOP_GAIN3]	= {0x1, 0xc8,  4, 0},
> +	[DVBT_VTOP1]		= {0x1, 0x6,   5, 0},
> +	[DVBT_VTOP2]		= {0x1, 0xc9,  5, 0},
> +	[DVBT_VTOP3]		= {0x1, 0xca,  5, 0},
> +	[DVBT_KRF1]		= {0x1, 0xcb,  7, 0},
> +	[DVBT_KRF2]		= {0x1, 0x7,   7, 0},
> +	[DVBT_KRF3]		= {0x1, 0xcd,  7, 0},
> +	[DVBT_KRF4]		= {0x1, 0xce,  7, 0},
> +	[DVBT_EN_GI_PGA]	= {0x1, 0xe5,  0, 0},
> +	[DVBT_THD_LOCK_UP]	= {0x1, 0xd9,  8, 0},
> +	[DVBT_THD_LOCK_DW]	= {0x1, 0xdb,  8, 0},
> +	[DVBT_THD_UP1]		= {0x1, 0xdd,  7, 0},
> +	[DVBT_THD_DW1]		= {0x1, 0xde,  7, 0},
> +	[DVBT_INTER_CNT_LEN]	= {0x1, 0xd8,  3, 0},
> +	[DVBT_GI_PGA_STATE]	= {0x1, 0xe6,  3, 3},
> +	[DVBT_EN_AGC_PGA]	= {0x1, 0xd7,  0, 0},
> +	[DVBT_CKOUTPAR]		= {0x1, 0x7b,  5, 5},
> +	[DVBT_CKOUT_PWR]	= {0x1, 0x7b,  6, 6},
> +	[DVBT_SYNC_DUR]		= {0x1, 0x7b,  7, 7},
> +	[DVBT_ERR_DUR]		= {0x1, 0x7c,  0, 0},
> +	[DVBT_SYNC_LVL]		= {0x1, 0x7c,  1, 1},
> +	[DVBT_ERR_LVL]		= {0x1, 0x7c,  2, 2},
> +	[DVBT_VAL_LVL]		= {0x1, 0x7c,  3, 3},
> +	[DVBT_SERIAL]		= {0x1, 0x7c,  4, 4},
> +	[DVBT_SER_LSB]		= {0x1, 0x7c,  5, 5},
> +	[DVBT_CDIV_PH0]		= {0x1, 0x7d,  3, 0},
> +	[DVBT_CDIV_PH1]		= {0x1, 0x7d,  7, 4},
> +	[DVBT_MPEG_IO_OPT_2_2]	= {0x0, 0x6,   7, 7},
> +	[DVBT_MPEG_IO_OPT_1_0]	= {0x0, 0x7,   7, 6},
> +	[DVBT_CKOUTPAR_PIP]	= {0x0, 0xb7,  4, 4},
> +	[DVBT_CKOUT_PWR_PIP]	= {0x0, 0xb7,  3, 3},
> +	[DVBT_SYNC_LVL_PIP]	= {0x0, 0xb7,  2, 2},
> +	[DVBT_ERR_LVL_PIP]	= {0x0, 0xb7,  1, 1},
> +	[DVBT_VAL_LVL_PIP]	= {0x0, 0xb7,  0, 0},
> +	[DVBT_CKOUTPAR_PID]	= {0x0, 0xb9,  4, 4},
> +	[DVBT_CKOUT_PWR_PID]	= {0x0, 0xb9,  3, 3},
> +	[DVBT_SYNC_LVL_PID]	= {0x0, 0xb9,  2, 2},
> +	[DVBT_ERR_LVL_PID]	= {0x0, 0xb9,  1, 1},
> +	[DVBT_VAL_LVL_PID]	= {0x0, 0xb9,  0, 0},
> +	[DVBT_SM_PASS]		= {0x1, 0x93, 11, 0},
> +	[DVBT_AD7_SETTING]	= {0x0, 0x11, 15, 0},
> +	[DVBT_RSSI_R]		= {0x3, 0x1,   6, 0},
> +	[DVBT_ACI_DET_IND]	= {0x3, 0x12,  0, 0},
> +	[DVBT_REG_MON]		= {0x0, 0xd,   1, 0},
> +	[DVBT_REG_MONSEL]	= {0x0, 0xd,   2, 2},
> +	[DVBT_REG_GPE]		= {0x0, 0xd,   7, 7},
> +	[DVBT_REG_GPO]		= {0x0, 0x10,  0, 0},
> +	[DVBT_REG_4MSEL]	= {0x0, 0x13,  0, 0},
> +};
> +
> +/* write multiple hardware registers */
> +static int rtl2832_wr(struct rtl2832_priv *priv, u8 reg, u8 *val, int len)
> +{
> +	int ret;
> +	u8 buf[1+len];
> +	struct i2c_msg msg[1] = {
> +		{
> +			.addr = priv->cfg.i2c_addr,
> +			.flags = 0,
> +			.len = 1+len,
> +			.buf = buf,
> +		}
> +	};
> +
> +	buf[0] = reg;
> +	memcpy(&buf[1], val, len);
> +
> +	ret = i2c_transfer(priv->i2c, msg, 1);
> +	if (ret == 1) {
> +		ret = 0;
> +	} else {
> +		warn("i2c wr failed=%d reg=%02x len=%d", ret, reg, len);
> +		ret = -EREMOTEIO;
> +	}
> +	return ret;
> +}
> +
> +/* read multiple hardware registers */
> +static int rtl2832_rd(struct rtl2832_priv *priv, u8 reg, u8 *val, int len)
> +{
> +	int ret;
> +	struct i2c_msg msg[2] = {
> +		{
> +			.addr = priv->cfg.i2c_addr,
> +			.flags = 0,
> +			.len = 1,
> +			.buf =&reg,
> +		}, {
> +			.addr = priv->cfg.i2c_addr,
> +			.flags = I2C_M_RD,
> +			.len = len,
> +			.buf = val,
> +		}
> +	};
> +
> +	ret = i2c_transfer(priv->i2c, msg, 2);
> +	if (ret == 2) {
> +		ret = 0;
> +	} else {
> +		warn("i2c rd failed=%d reg=%02x len=%d", ret, reg, len);
> +		ret = -EREMOTEIO;
> +}
> +return ret;
> +}
> +
> +/* write multiple registers */
> +static int rtl2832_wr_regs(struct rtl2832_priv *priv, u8 reg, u8 page, u8 *val,
> +	int len)
> +{
> +	int ret;
> +
> +
> +	/* switch bank if needed */
> +	if (page != priv->page) {
> +		ret = rtl2832_wr(priv, 0x00,&page, 1);
> +		if (ret)
> +			return ret;
> +
> +		priv->page = page;
> +}
> +
> +return rtl2832_wr(priv, reg, val, len);
> +}
> +
> +/* read multiple registers */
> +static int rtl2832_rd_regs(struct rtl2832_priv *priv, u8 reg, u8 page, u8 *val,
> +	int len)
> +{
> +	int ret;
> +
> +	/* switch bank if needed */
> +	if (page != priv->page) {
> +		ret = rtl2832_wr(priv, 0x00,&page, 1);
> +		if (ret)
> +			return ret;
> +
> +		priv->page = page;
> +	}
> +
> +	return rtl2832_rd(priv, reg, val, len);
> +}
> +
> +#if 0 /* currently not used */
> +/* write single register */
> +static int rtl2832_wr_reg(struct rtl2832_priv *priv, u8 reg, u8 page, u8 val)
> +{
> +	return rtl2832_wr_regs(priv, reg, page,&val, 1);
> +}
> +#endif
> +
> +/* read single register */
> +static int rtl2832_rd_reg(struct rtl2832_priv *priv, u8 reg, u8 page, u8 *val)
> +{
> +	return rtl2832_rd_regs(priv, reg, page, val, 1);
> +}
> +
> +int rtl2832_rd_demod_reg(struct rtl2832_priv *priv, int reg, u32 *val)
> +{
> +	int ret;
> +
> +	u8 reg_start_addr;
> +	u8 msb, lsb;
> +	u8 page;
> +	u8 reading[4];
> +	u32 reading_tmp;
> +	int i;
> +
> +	u8 len;
> +	u32 mask;
> +
> +	reg_start_addr = registers[reg].start_address;
> +	msb = registers[reg].msb;
> +	lsb = registers[reg].lsb;
> +	page = registers[reg].page;
> +
> +	len = (msb>>  3) + 1;
> +	mask = reg_mask[msb-lsb];

You should use spaces here. See Documentation/CodingStyle line 206.

> +
> +
> +	ret = rtl2832_rd_regs(priv, reg_start_addr, page,&reading[0], len);
> +	if (ret)
> +		goto err;
> +
> +	reading_tmp = 0;
> +	for (i = 0; i<  len; i++)
> +		reading_tmp |= reading[i]<<  ((len-1-i)*8);

You should use spaces here. See Documentation/CodingStyle line 206.

> +
> +	*val = (reading_tmp>>  lsb)&  mask;
> +
> +	return ret;
> +
> +err:
> +	dbg("%s: failed=%d", __func__, ret);
> +	return ret;
> +
> +}
> +
> +int rtl2832_wr_demod_reg(struct rtl2832_priv *priv, int reg, u32 val)
> +{
> +	int ret, i;
> +	u8 len;
> +	u8 reg_start_addr;
> +	u8 msb, lsb;
> +	u8 page;
> +	u32 mask;
> +
> +
> +	u8 reading[4];
> +	u8 writing[4];
> +	u32 reading_tmp;
> +	u32 writing_tmp;
> +
> +
> +	reg_start_addr = registers[reg].start_address;
> +	msb = registers[reg].msb;
> +	lsb = registers[reg].lsb;
> +	page = registers[reg].page;
> +
> +	len = (msb>>  3) + 1;
> +	mask = reg_mask[msb-lsb];

You should use spaces here. See Documentation/CodingStyle line 206.

> +
> +
> +	ret = rtl2832_rd_regs(priv, reg_start_addr, page,&reading[0], len);
> +	if (ret)
> +		goto err;
> +
> +	reading_tmp = 0;
> +	for (i = 0; i<  len; i++)
> +		reading_tmp |= reading[i]<<  ((len-1-i)*8);

You should use spaces here. See Documentation/CodingStyle line 206.

> +
> +	writing_tmp = reading_tmp&  ~(mask<<  lsb);
> +	writing_tmp |= ((val&  mask)<<  lsb);
> +
> +
> +	for (i = 0; i<  len; i++)
> +		writing[i] = (writing_tmp>>  ((len-1-i)*8))&  0xff;

You should use spaces here. See Documentation/CodingStyle line 206.

> +
> +	ret = rtl2832_wr_regs(priv, reg_start_addr, page,&writing[0], len);
> +	if (ret)
> +		goto err;
> +
> +	return ret;
> +
> +err:
> +	dbg("%s: failed=%d", __func__, ret);
> +	return ret;
> +
> +}
> +
> +
> +static int rtl2832_i2c_gate_ctrl(struct dvb_frontend *fe, int enable)
> +{
> +	int ret;
> +	struct rtl2832_priv *priv = fe->demodulator_priv;
> +
> +	dbg("%s: enable=%d", __func__, enable);
> +
> +	/* gate already open or close */
> +	if (priv->i2c_gate_state == enable)
> +		return 0;
> +
> +	ret = rtl2832_wr_demod_reg(priv, DVBT_IIC_REPEAT, (enable ? 0x1 : 0x0));
> +
> +	if (ret)
> +		goto err;

Excessive newline between function call and error check.

> +
> +	priv->i2c_gate_state = enable;
> +
> +	return ret;
> +err:
> +	dbg("%s: failed=%d", __func__, ret);
> +	return ret;
> +}
> +
> +
> +
> +static int rtl2832_init(struct dvb_frontend *fe)
> +{
> +	struct rtl2832_priv *priv = fe->demodulator_priv;
> +	int i, ret;
> +
> +	u8 en_bbin;
> +	u64 pset_iffreq;
> +
> +	/* initialization values for the demodulator registers */
> +	struct rtl2832_reg_value rtl2832_initial_regs[] = {
> +		{DVBT_AD_EN_REG,		0x1},
> +		{DVBT_AD_EN_REG1,		0x1},
> +		{DVBT_RSD_BER_FAIL_VAL,		0x2800},
> +		{DVBT_MGD_THD0,			0x10},
> +		{DVBT_MGD_THD1,			0x20},
> +		{DVBT_MGD_THD2,			0x20},
> +		{DVBT_MGD_THD3,			0x40},
> +		{DVBT_MGD_THD4,			0x22},
> +		{DVBT_MGD_THD5,			0x32},
> +		{DVBT_MGD_THD6,			0x37},
> +		{DVBT_MGD_THD7,			0x39},
> +		{DVBT_EN_BK_TRK,		0x0},
> +		{DVBT_EN_CACQ_NOTCH,		0x0},
> +		{DVBT_AD_AV_REF,		0x2a},
> +		{DVBT_REG_PI,			0x6},
> +		{DVBT_PIP_ON,			0x0},
> +		{DVBT_CDIV_PH0,			0x8},
> +		{DVBT_CDIV_PH1,			0x8},
> +		{DVBT_SCALE1_B92,		0x4},
> +		{DVBT_SCALE1_B93,		0xb0},
> +		{DVBT_SCALE1_BA7,		0x78},
> +		{DVBT_SCALE1_BA9,		0x28},
> +		{DVBT_SCALE1_BAA,		0x59},
> +		{DVBT_SCALE1_BAB,		0x83},
> +		{DVBT_SCALE1_BAC,		0xd4},
> +		{DVBT_SCALE1_BB0,		0x65},
> +		{DVBT_SCALE1_BB1,		0x43},
> +		{DVBT_KB_P1,			0x1},
> +		{DVBT_KB_P2,			0x4},
> +		{DVBT_KB_P3,			0x7},
> +		{DVBT_K1_CR_STEP12,		0xa},
> +		{DVBT_REG_GPE,			0x1},
> +		{DVBT_SERIAL,			0x0},
> +		{DVBT_CDIV_PH0,			0x9},
> +		{DVBT_CDIV_PH1,			0x9},
> +		{DVBT_MPEG_IO_OPT_2_2,		0x0},
> +		{DVBT_MPEG_IO_OPT_1_0,		0x0},
> +		{DVBT_TRK_KS_P2,		0x4},
> +		{DVBT_TRK_KS_I2,		0x7},
> +		{DVBT_TR_THD_SET2,		0x6},
> +		{DVBT_TRK_KC_I2,		0x5},
> +		{DVBT_CR_THD_SET2,		0x1},
> +		{DVBT_SPEC_INV,			0x0},
> +		{DVBT_DAGC_TRG_VAL,		0x5a},
> +		{DVBT_AGC_TARG_VAL_0,		0x0},
> +		{DVBT_AGC_TARG_VAL_8_1,		0x5a},
> +		{DVBT_AAGC_LOOP_GAIN,		0x16},
> +		{DVBT_LOOP_GAIN2_3_0,		0x6},
> +		{DVBT_LOOP_GAIN2_4,		0x1},
> +		{DVBT_LOOP_GAIN3,		0x16},
> +		{DVBT_VTOP1,			0x35},
> +		{DVBT_VTOP2,			0x21},
> +		{DVBT_VTOP3,			0x21},
> +		{DVBT_KRF1,			0x0},
> +		{DVBT_KRF2,			0x40},
> +		{DVBT_KRF3,			0x10},
> +		{DVBT_KRF4,			0x10},
> +		{DVBT_IF_AGC_MIN,		0x80},
> +		{DVBT_IF_AGC_MAX,		0x7f},
> +		{DVBT_RF_AGC_MIN,		0x80},
> +		{DVBT_RF_AGC_MAX,		0x7f},
> +		{DVBT_POLAR_RF_AGC,		0x0},
> +		{DVBT_POLAR_IF_AGC,		0x0},
> +		{DVBT_AD7_SETTING,		0xe9bf},
> +		{DVBT_EN_GI_PGA,		0x0},
> +		{DVBT_THD_LOCK_UP,		0x0},
> +		{DVBT_THD_LOCK_DW,		0x0},
> +		{DVBT_THD_UP1,			0x11},
> +		{DVBT_THD_DW1,			0xef},
> +		{DVBT_INTER_CNT_LEN,		0xc},
> +		{DVBT_GI_PGA_STATE,		0x0},
> +		{DVBT_EN_AGC_PGA,		0x1},
> +		{DVBT_IF_AGC_MAN,		0x0},
> +	};
> +
> +
> +	dbg("%s", __func__);
> +
> +	en_bbin = (priv->cfg.if_dvbt == 0 ? 0x1 : 0x0);
> +
> +	/*
> +	* PSET_IFFREQ = - floor((IfFreqHz % CrystalFreqHz) * pow(2, 22)
> +	*		/ CrystalFreqHz)
> +	*/
> +	pset_iffreq = priv->cfg.if_dvbt % priv->cfg.xtal;
> +	pset_iffreq *= 0x400000;
> +	pset_iffreq = div_u64(pset_iffreq, priv->cfg.xtal);
> +	pset_iffreq = pset_iffreq&  0x3fffff;
> +
> +
> +
> +	for (i = 0; i<  ARRAY_SIZE(rtl2832_initial_regs); i++) {
> +		ret = rtl2832_wr_demod_reg(priv, rtl2832_initial_regs[i].reg,
> +			rtl2832_initial_regs[i].value);
> +		if (ret)
> +			goto err;
> +	}
> +
> +	/* if frequency settings */
> +	ret = rtl2832_wr_demod_reg(priv, DVBT_EN_BBIN, en_bbin);
> +		if (ret)
> +			goto err;
> +
> +	ret = rtl2832_wr_demod_reg(priv, DVBT_PSET_IFFREQ, pset_iffreq);
> +		if (ret)
> +			goto err;
> +
> +	priv->sleeping = false;
> +
> +	return ret;
> +
> +err:
> +	dbg("%s: failed=%d", __func__, ret);
> +	return ret;
> +}
> +
> +static int rtl2832_sleep(struct dvb_frontend *fe)
> +{
> +	struct rtl2832_priv *priv = fe->demodulator_priv;
> +
> +	dbg("%s", __func__);
> +	priv->sleeping = true;
> +	return 0;
> +}
> +
> +int rtl2832_get_tune_settings(struct dvb_frontend *fe,
> +	struct dvb_frontend_tune_settings *s)
> +{
> +	dbg("%s", __func__);
> +	s->min_delay_ms = 1000;
> +	s->step_size = fe->ops.info.frequency_stepsize * 2;
> +	s->max_drift = (fe->ops.info.frequency_stepsize * 2) + 1;
> +	return 0;
> +}
> +
> +static int rtl2832_set_frontend(struct dvb_frontend *fe)
> +{
> +	struct rtl2832_priv *priv = fe->demodulator_priv;
> +	struct dtv_frontend_properties *c =&fe->dtv_property_cache;
> +	int ret, i, j;
> +	u64 bw_mode, num, num2;
> +	u32 resamp_ratio, cfreq_off_ratio;
> +
> +
> +	static u8 bw_params[3][32] = {
> +	/* 6 MHz bandwidth */
> +		{
> +		0xf5, 0xff, 0x15, 0x38, 0x5d, 0x6d, 0x52, 0x07, 0xfa, 0x2f,
> +		0x53, 0xf5, 0x3f, 0xca, 0x0b, 0x91, 0xea, 0x30, 0x63, 0xb2,
> +		0x13, 0xda, 0x0b, 0xc4, 0x18, 0x7e, 0x16, 0x66, 0x08, 0x67,
> +		0x19, 0xe0,
> +		},
> +
> +	/*  7 MHz bandwidth */
> +		{
> +		0xe7, 0xcc, 0xb5, 0xba, 0xe8, 0x2f, 0x67, 0x61, 0x00, 0xaf,
> +		0x86, 0xf2, 0xbf, 0x59, 0x04, 0x11, 0xb6, 0x33, 0xa4, 0x30,
> +		0x15, 0x10, 0x0a, 0x42, 0x18, 0xf8, 0x17, 0xd9, 0x07, 0x22,
> +		0x19, 0x10,
> +		},
> +
> +	/*  8 MHz bandwidth */
> +		{
> +		0x09, 0xf6, 0xd2, 0xa7, 0x9a, 0xc9, 0x27, 0x77, 0x06, 0xbf,
> +		0xec, 0xf4, 0x4f, 0x0b, 0xfc, 0x01, 0x63, 0x35, 0x54, 0xa7,
> +		0x16, 0x66, 0x08, 0xb4, 0x19, 0x6e, 0x19, 0x65, 0x05, 0xc8,
> +		0x19, 0xe0,
> +		},
> +	};
> +
> +
> +	dbg("%s: frequency=%d bandwidth_hz=%d inversion=%d", __func__,
> +		c->frequency, c->bandwidth_hz, c->inversion);
> +
> +
> +	/* program tuner */
> +	if (fe->ops.tuner_ops.set_params)
> +		fe->ops.tuner_ops.set_params(fe);
> +
> +
> +	switch (c->bandwidth_hz) {
> +	case 6000000:
> +		i = 0;
> +		bw_mode = 48000000;
> +		break;
> +	case 7000000:
> +		i = 1;
> +		bw_mode = 56000000;
> +		break;
> +	case 8000000:
> +		i = 2;
> +		bw_mode = 64000000;
> +		break;
> +	default:
> +		dbg("invalid bandwidth");
> +		return -EINVAL;
> +	}
> +
> +	for (j = 0; j<  sizeof(bw_params[j]); j++) {
> +		ret = rtl2832_wr_regs(priv, 0x1c+j, 1,&bw_params[i][j], 1);
> +		if (ret)
> +			goto err;
> +	}
> +
> +	/* calculate and set resample ratio
> +	* RSAMP_RATIO = floor(CrystalFreqHz * 7 * pow(2, 22)
> +	*	/ ConstWithBandwidthMode)
> +	*/
> +	num = priv->cfg.xtal * 7;
> +	num *= 0x400000;
> +	num = div_u64(num, bw_mode);
> +	resamp_ratio =  num&  0x3ffffff;
> +	ret = rtl2832_wr_demod_reg(priv, DVBT_RSAMP_RATIO, resamp_ratio);
> +	if (ret)
> +		goto err;
> +
> +	/* calculate and set cfreq off ratio
> +	* CFREQ_OFF_RATIO = - floor(ConstWithBandwidthMode * pow(2, 20)
> +	*	/ (CrystalFreqHz * 7))
> +	*/
> +	num = bw_mode<<  20;
> +	num2 = priv->cfg.xtal * 7;
> +	num = div_u64(num, num2);
> +	num = -num;
> +	cfreq_off_ratio = num&  0xfffff;
> +	ret = rtl2832_wr_demod_reg(priv, DVBT_CFREQ_OFF_RATIO, cfreq_off_ratio);
> +	if (ret)
> +		goto err;
> +
> +
> +	/* soft reset */
> +	ret = rtl2832_wr_demod_reg(priv, DVBT_SOFT_RST, 0x1);
> +	if (ret)
> +		goto err;
> +
> +	ret = rtl2832_wr_demod_reg(priv, DVBT_SOFT_RST, 0x0);
> +	if (ret)
> +		goto err;
> +
> +	return ret;
> +err:
> +	info("%s: failed=%d", __func__, ret);
> +	return ret;
> +}
> +
> +static int rtl2832_read_status(struct dvb_frontend *fe, fe_status_t *status)
> +{
> +	struct rtl2832_priv *priv = fe->demodulator_priv;
> +	int ret;
> +	u32 tmp;
> +	*status = 0;
> +
> +
> +	dbg("%s", __func__);
> +	if (priv->sleeping)
> +		return 0;
> +
> +	ret = rtl2832_rd_demod_reg(priv, DVBT_FSM_STAGE,&tmp);
> +	if (ret)
> +		goto err;
> +
> +	if (tmp == 11) {
> +		*status |= FE_HAS_SIGNAL | FE_HAS_CARRIER |
> +				FE_HAS_VITERBI | FE_HAS_SYNC | FE_HAS_LOCK;
> +	}
> +	/* TODO find out if this is also true for rtl2832? */
> +	/*else if (tmp == 10) {
> +		*status |= FE_HAS_SIGNAL | FE_HAS_CARRIER |
> +				FE_HAS_VITERBI;
> +	}*/
> +
> +	return ret;
> +err:
> +	info("%s: failed=%d", __func__, ret);
> +	return ret;
> +}
> +
> +static int rtl2832_read_snr(struct dvb_frontend *fe, u16 *snr)
> +{
> +	*snr = 0;
> +	return 0;
> +}
> +
> +static int rtl2832_read_ber(struct dvb_frontend *fe, u32 *ber)
> +{
> +	*ber = 0;
> +	return 0;
> +}
> +
> +static int rtl2832_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
> +{
> +	*ucblocks = 0;
> +	return 0;
> +}
> +
> +
> +static int rtl2832_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
> +{
> +	*strength = 0;
> +	return 0;
> +}
> +
> +static struct dvb_frontend_ops rtl2832_ops;
> +
> +static void rtl2832_release(struct dvb_frontend *fe)
> +{
> +	struct rtl2832_priv *priv = fe->demodulator_priv;
> +
> +	dbg("%s", __func__);
> +	kfree(priv);
> +}
> +
> +struct dvb_frontend *rtl2832_attach(const struct rtl2832_config *cfg,
> +	struct i2c_adapter *i2c)
> +{
> +	struct rtl2832_priv *priv = NULL;
> +	int ret = 0;
> +	u8 tmp;
> +
> +	dbg("%s", __func__);
> +
> +	/* allocate memory for the internal state */
> +	priv = kzalloc(sizeof(struct rtl2832_priv), GFP_KERNEL);
> +	if (priv == NULL)
> +		goto err;
> +
> +	/* setup the priv */
> +	priv->i2c = i2c;
> +	priv->tuner = cfg->tuner;
> +	memcpy(&priv->cfg, cfg, sizeof(struct rtl2832_config));
> +
> +	/* check if the demod is there */
> +	ret = rtl2832_rd_reg(priv, 0x00, 0x0,&tmp);
> +	if (ret)
> +		goto err;
> +
> +	/* create dvb_frontend */
> +	memcpy(&priv->fe.ops,&rtl2832_ops, sizeof(struct dvb_frontend_ops));
> +	priv->fe.demodulator_priv = priv;
> +
> +	/* TODO implement sleep mode */
> +	priv->sleeping = true;
> +
> +	return&priv->fe;
> +err:
> +	dbg("%s: failed=%d", __func__, ret);
> +	kfree(priv);
> +	return NULL;
> +}
> +EXPORT_SYMBOL(rtl2832_attach);
> +
> +static struct dvb_frontend_ops rtl2832_ops = {
> +	.delsys = { SYS_DVBT },
> +	.info = {
> +		.name = "Realtek RTL2832 (DVB-T)",
> +		.frequency_min	  = 174000000,
> +		.frequency_max	  = 862000000,
> +		.frequency_stepsize = 166667,
> +		.caps = FE_CAN_FEC_1_2 |
> +			FE_CAN_FEC_2_3 |
> +			FE_CAN_FEC_3_4 |
> +			FE_CAN_FEC_5_6 |
> +			FE_CAN_FEC_7_8 |
> +			FE_CAN_FEC_AUTO |
> +			FE_CAN_QPSK |
> +			FE_CAN_QAM_16 |
> +			FE_CAN_QAM_64 |
> +			FE_CAN_QAM_AUTO |
> +			FE_CAN_TRANSMISSION_MODE_AUTO |
> +			FE_CAN_GUARD_INTERVAL_AUTO |
> +			FE_CAN_HIERARCHY_AUTO |
> +			FE_CAN_RECOVER |
> +			FE_CAN_MUTE_TS
> +	 },
> +
> +	.release = rtl2832_release,
> +
> +	.init = rtl2832_init,
> +	.sleep = rtl2832_sleep,
> +
> +	.get_tune_settings = rtl2832_get_tune_settings,
> +
> +	.set_frontend = rtl2832_set_frontend,
> +
> +	.read_status = rtl2832_read_status,
> +	.read_snr = rtl2832_read_snr,
> +	.read_ber = rtl2832_read_ber,
> +	.read_ucblocks = rtl2832_read_ucblocks,
> +	.read_signal_strength = rtl2832_read_signal_strength,
> +	.i2c_gate_ctrl = rtl2832_i2c_gate_ctrl,
> +};
> +
> +MODULE_AUTHOR("Thomas Mair<mair.thomas86@gmail.com>");
> +MODULE_DESCRIPTION("Realtek RTL2832 DVB-T demodulator driver");
> +MODULE_LICENSE("GPL");
> +MODULE_VERSION("0.4");
> diff --git a/drivers/media/dvb/frontends/rtl2832.h b/drivers/media/dvb/frontends/rtl2832.h
> new file mode 100644
> index 0000000..d94dc9a
> --- /dev/null
> +++ b/drivers/media/dvb/frontends/rtl2832.h
> @@ -0,0 +1,74 @@
> +/*
> + * Realtek RTL2832 DVB-T demodulator driver
> + *
> + * Copyright (C) 2012 Thomas Mair<thomas.mair86@gmail.com>
> + *
> + *	This program is free software; you can redistribute it and/or modify
> + *	it under the terms of the GNU General Public License as published by
> + *	the Free Software Foundation; either version 2 of the License, or
> + *	(at your option) any later version.
> + *
> + *	This program is distributed in the hope that it will be useful,
> + *	but WITHOUT ANY WARRANTY; without even the implied warranty of
> + *	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + *	GNU General Public License for more details.
> + *
> + *	You should have received a copy of the GNU General Public License along
> + *	with this program; if not, write to the Free Software Foundation, Inc.,
> + *	51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
> + */
> +
> +#ifndef RTL2832_H
> +#define RTL2832_H
> +
> +#include<linux/dvb/frontend.h>
> +
> +struct rtl2832_config {
> +	/*
> +	 * Demodulator I2C address.
> +	 */
> +	u8 i2c_addr;
> +
> +	/*
> +	 * Xtal frequency.
> +	 * Hz
> +	 * 4000000, 16000000, 25000000, 28800000
> +	 */
> +	u32 xtal;
> +
> +	/*
> +	 * IFs for all used modes.
> +	 * Hz
> +	 * 4570000, 4571429, 36000000, 36125000, 36166667, 44000000
> +	 */
> +	u32 if_dvbt;
> +
> +	/*
> +	 */
> +	u8 tuner;
> +};
> +
> +
> +#if defined(CONFIG_DVB_RTL2832) || \
> +	(defined(CONFIG_DVB_RTL2832_MODULE)&&  defined(MODULE))
> +extern struct dvb_frontend *rtl2832_attach(
> +	const struct rtl2832_config *cfg,
> +	struct i2c_adapter *i2c
> +);
> +
> +extern struct i2c_adapter *rtl2832_get_tuner_i2c_adapter(
> +	struct dvb_frontend *fe
> +);
> +#else
> +static inline struct dvb_frontend *rtl2832_attach(
> +	const struct rtl2832_config *config,
> +	struct i2c_adapter *i2c
> +)
> +{
> +	printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
> +	return NULL;
> +}
> +#endif
> +
> +
> +#endif /* RTL2832_H */
> diff --git a/drivers/media/dvb/frontends/rtl2832_priv.h b/drivers/media/dvb/frontends/rtl2832_priv.h
> new file mode 100644
> index 0000000..3e52674
> --- /dev/null
> +++ b/drivers/media/dvb/frontends/rtl2832_priv.h
> @@ -0,0 +1,258 @@
> +/*
> + * Realtek RTL2832 DVB-T demodulator driver
> + *
> + * Copyright (C) 2012 Thomas Mair<thomas.mair86@gmail.com>
> + *
> + *	This program is free software; you can redistribute it and/or modify
> + *	it under the terms of the GNU General Public License as published by
> + *	the Free Software Foundation; either version 2 of the License, or
> + *	(at your option) any later version.
> + *
> + *	This program is distributed in the hope that it will be useful,
> + *	but WITHOUT ANY WARRANTY; without even the implied warranty of
> + *	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + *	GNU General Public License for more details.
> + *
> + *	You should have received a copy of the GNU General Public License along
> + *	with this program; if not, write to the Free Software Foundation, Inc.,
> + *	51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
> + */
> +
> +#ifndef RTL2832_PRIV_H
> +#define RTL2832_PRIV_H
> +
> +#include "dvb_frontend.h"
> +#include "rtl2832.h"
> +
> +#define LOG_PREFIX "rtl2832"
> +
> +#undef dbg
> +#define dbg(f, arg...) \
> +	if (rtl2832_debug) \
> +		printk(KERN_INFO LOG_PREFIX": " f "\n" , ## arg)

ERROR: Macros with complex values should be enclosed in parenthesis
#30: FILE: media/dvb/frontends/rtl2832_priv.h:30:
+#define dbg(f, arg...) \
+	if (rtl2832_debug) \
+		printk(KERN_INFO LOG_PREFIX": " f "\n" , ## arg)

> +#undef err
> +#define err(f, arg...)  printk(KERN_ERR	LOG_PREFIX": " f "\n" , ## arg)
> +#undef info
> +#define info(f, arg...) printk(KERN_INFO LOG_PREFIX": " f "\n" , ## arg)
> +#undef warn
> +#define warn(f, arg...) printk(KERN_WARNING LOG_PREFIX": " f "\n" , ## arg)
> +
> +struct rtl2832_priv {
> +	struct i2c_adapter *i2c;
> +	struct dvb_frontend fe;
> +	struct rtl2832_config cfg;
> +
> +	bool i2c_gate_state;
> +	bool sleeping;
> +
> +	u8 tuner;
> +	u8 page; /* active register page */
> +};
> +
> +struct rtl2832_reg_entry {
> +	u8 page;
> +	u8 start_address;
> +	u8 msb;
> +	u8 lsb;
> +};
> +
> +struct rtl2832_reg_value {
> +	int reg;

As this reg is enum I wonder if it is possible to use enum as a type 
(enum reg)? Still I am not sure about it and I dont like to test it :)

> +	u32 value;
> +};
> +
> +
> +/* Demod register bit names */
> +enum DVBT_REG_BIT_NAME {
> +	DVBT_SOFT_RST,
> +	DVBT_IIC_REPEAT,
> +	DVBT_TR_WAIT_MIN_8K,
> +	DVBT_RSD_BER_FAIL_VAL,
> +	DVBT_EN_BK_TRK,
> +	DVBT_REG_PI,
> +	DVBT_REG_PFREQ_1_0,
> +	DVBT_PD_DA8,
> +	DVBT_LOCK_TH,
> +	DVBT_BER_PASS_SCAL,
> +	DVBT_CE_FFSM_BYPASS,
> +	DVBT_ALPHAIIR_N,
> +	DVBT_ALPHAIIR_DIF,
> +	DVBT_EN_TRK_SPAN,
> +	DVBT_LOCK_TH_LEN,
> +	DVBT_CCI_THRE,
> +	DVBT_CCI_MON_SCAL,
> +	DVBT_CCI_M0,
> +	DVBT_CCI_M1,
> +	DVBT_CCI_M2,
> +	DVBT_CCI_M3,
> +	DVBT_SPEC_INIT_0,
> +	DVBT_SPEC_INIT_1,
> +	DVBT_SPEC_INIT_2,
> +	DVBT_AD_EN_REG,
> +	DVBT_AD_EN_REG1,
> +	DVBT_EN_BBIN,
> +	DVBT_MGD_THD0,
> +	DVBT_MGD_THD1,
> +	DVBT_MGD_THD2,
> +	DVBT_MGD_THD3,
> +	DVBT_MGD_THD4,
> +	DVBT_MGD_THD5,
> +	DVBT_MGD_THD6,
> +	DVBT_MGD_THD7,
> +	DVBT_EN_CACQ_NOTCH,
> +	DVBT_AD_AV_REF,
> +	DVBT_PIP_ON,
> +	DVBT_SCALE1_B92,
> +	DVBT_SCALE1_B93,
> +	DVBT_SCALE1_BA7,
> +	DVBT_SCALE1_BA9,
> +	DVBT_SCALE1_BAA,
> +	DVBT_SCALE1_BAB,
> +	DVBT_SCALE1_BAC,
> +	DVBT_SCALE1_BB0,
> +	DVBT_SCALE1_BB1,
> +	DVBT_KB_P1,
> +	DVBT_KB_P2,
> +	DVBT_KB_P3,
> +	DVBT_OPT_ADC_IQ,
> +	DVBT_AD_AVI,
> +	DVBT_AD_AVQ,
> +	DVBT_K1_CR_STEP12,
> +	DVBT_TRK_KS_P2,
> +	DVBT_TRK_KS_I2,
> +	DVBT_TR_THD_SET2,
> +	DVBT_TRK_KC_P2,
> +	DVBT_TRK_KC_I2,
> +	DVBT_CR_THD_SET2,
> +	DVBT_PSET_IFFREQ,
> +	DVBT_SPEC_INV,
> +	DVBT_BW_INDEX,
> +	DVBT_RSAMP_RATIO,
> +	DVBT_CFREQ_OFF_RATIO,
> +	DVBT_FSM_STAGE,
> +	DVBT_RX_CONSTEL,
> +	DVBT_RX_HIER,
> +	DVBT_RX_C_RATE_LP,
> +	DVBT_RX_C_RATE_HP,
> +	DVBT_GI_IDX,
> +	DVBT_FFT_MODE_IDX,
> +	DVBT_RSD_BER_EST,
> +	DVBT_CE_EST_EVM,
> +	DVBT_RF_AGC_VAL,
> +	DVBT_IF_AGC_VAL,
> +	DVBT_DAGC_VAL,
> +	DVBT_SFREQ_OFF,
> +	DVBT_CFREQ_OFF,
> +	DVBT_POLAR_RF_AGC,
> +	DVBT_POLAR_IF_AGC,
> +	DVBT_AAGC_HOLD,
> +	DVBT_EN_RF_AGC,
> +	DVBT_EN_IF_AGC,
> +	DVBT_IF_AGC_MIN,
> +	DVBT_IF_AGC_MAX,
> +	DVBT_RF_AGC_MIN,
> +	DVBT_RF_AGC_MAX,
> +	DVBT_IF_AGC_MAN,
> +	DVBT_IF_AGC_MAN_VAL,
> +	DVBT_RF_AGC_MAN,
> +	DVBT_RF_AGC_MAN_VAL,
> +	DVBT_DAGC_TRG_VAL,
> +	DVBT_AGC_TARG_VAL,
> +	DVBT_LOOP_GAIN_3_0,
> +	DVBT_LOOP_GAIN_4,
> +	DVBT_VTOP,
> +	DVBT_KRF,
> +	DVBT_AGC_TARG_VAL_0,
> +	DVBT_AGC_TARG_VAL_8_1,
> +	DVBT_AAGC_LOOP_GAIN,
> +	DVBT_LOOP_GAIN2_3_0,
> +	DVBT_LOOP_GAIN2_4,
> +	DVBT_LOOP_GAIN3,
> +	DVBT_VTOP1,
> +	DVBT_VTOP2,
> +	DVBT_VTOP3,
> +	DVBT_KRF1,
> +	DVBT_KRF2,
> +	DVBT_KRF3,
> +	DVBT_KRF4,
> +	DVBT_EN_GI_PGA,
> +	DVBT_THD_LOCK_UP,
> +	DVBT_THD_LOCK_DW,
> +	DVBT_THD_UP1,
> +	DVBT_THD_DW1,
> +	DVBT_INTER_CNT_LEN,
> +	DVBT_GI_PGA_STATE,
> +	DVBT_EN_AGC_PGA,
> +	DVBT_CKOUTPAR,
> +	DVBT_CKOUT_PWR,
> +	DVBT_SYNC_DUR,
> +	DVBT_ERR_DUR,
> +	DVBT_SYNC_LVL,
> +	DVBT_ERR_LVL,
> +	DVBT_VAL_LVL,
> +	DVBT_SERIAL,
> +	DVBT_SER_LSB,
> +	DVBT_CDIV_PH0,
> +	DVBT_CDIV_PH1,
> +	DVBT_MPEG_IO_OPT_2_2,
> +	DVBT_MPEG_IO_OPT_1_0,
> +	DVBT_CKOUTPAR_PIP,
> +	DVBT_CKOUT_PWR_PIP,
> +	DVBT_SYNC_LVL_PIP,
> +	DVBT_ERR_LVL_PIP,
> +	DVBT_VAL_LVL_PIP,
> +	DVBT_CKOUTPAR_PID,
> +	DVBT_CKOUT_PWR_PID,
> +	DVBT_SYNC_LVL_PID,
> +	DVBT_ERR_LVL_PID,
> +	DVBT_VAL_LVL_PID,
> +	DVBT_SM_PASS,
> +	DVBT_UPDATE_REG_2,
> +	DVBT_BTHD_P3,
> +	DVBT_BTHD_D3,
> +	DVBT_FUNC4_REG0,
> +	DVBT_FUNC4_REG1,
> +	DVBT_FUNC4_REG2,
> +	DVBT_FUNC4_REG3,
> +	DVBT_FUNC4_REG4,
> +	DVBT_FUNC4_REG5,
> +	DVBT_FUNC4_REG6,
> +	DVBT_FUNC4_REG7,
> +	DVBT_FUNC4_REG8,
> +	DVBT_FUNC4_REG9,
> +	DVBT_FUNC4_REG10,
> +	DVBT_FUNC5_REG0,
> +	DVBT_FUNC5_REG1,
> +	DVBT_FUNC5_REG2,
> +	DVBT_FUNC5_REG3,
> +	DVBT_FUNC5_REG4,
> +	DVBT_FUNC5_REG5,
> +	DVBT_FUNC5_REG6,
> +	DVBT_FUNC5_REG7,
> +	DVBT_FUNC5_REG8,
> +	DVBT_FUNC5_REG9,
> +	DVBT_FUNC5_REG10,
> +	DVBT_FUNC5_REG11,
> +	DVBT_FUNC5_REG12,
> +	DVBT_FUNC5_REG13,
> +	DVBT_FUNC5_REG14,
> +	DVBT_FUNC5_REG15,
> +	DVBT_FUNC5_REG16,
> +	DVBT_FUNC5_REG17,
> +	DVBT_FUNC5_REG18,
> +	DVBT_AD7_SETTING,
> +	DVBT_RSSI_R,
> +	DVBT_ACI_DET_IND,
> +	DVBT_REG_MON,
> +	DVBT_REG_MONSEL,
> +	DVBT_REG_GPE,
> +	DVBT_REG_GPO,
> +	DVBT_REG_4MSEL,
> +	DVBT_TEST_REG_1,
> +	DVBT_TEST_REG_2,
> +	DVBT_TEST_REG_3,
> +	DVBT_TEST_REG_4,
> +	DVBT_REG_BIT_NAME_ITEM_TERMINATOR,
> +};
> +
> +#endif /* RTL2832_PRIV_H */


-- 
http://palosaari.fi/

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [PATCH v4 2/5] rtl28xxu: support for the rtl2832 demod driver
  2012-05-16 22:13   ` [PATCH v4 2/5] rtl28xxu: support for the rtl2832 demod driver Thomas Mair
@ 2012-05-17 14:41     ` Antti Palosaari
  0 siblings, 0 replies; 104+ messages in thread
From: Antti Palosaari @ 2012-05-17 14:41 UTC (permalink / raw)
  To: Thomas Mair; +Cc: pomidorabelisima, Linux Media Mailing List

Moikka

Comments below.

Reviewed-by: Antti Palosaari <crope@iki.fi>


On 17.05.2012 01:13, Thomas Mair wrote:
> This only adds support for the Terratec Cinergy T Stick Black device.
>
> Signed-off-by: Thomas Mair<thomas.mair86@googlemail.com>
> ---
>   drivers/media/dvb/dvb-usb/Kconfig       |    3 +
>   drivers/media/dvb/dvb-usb/dvb-usb-ids.h |    1 +
>   drivers/media/dvb/dvb-usb/rtl28xxu.c    |  431 +++++++++++++++++++++++++++++--
>   3 files changed, 411 insertions(+), 24 deletions(-)
>
> diff --git a/drivers/media/dvb/dvb-usb/Kconfig b/drivers/media/dvb/dvb-usb/Kconfig
> index be1db75..98dd0d8 100644
> --- a/drivers/media/dvb/dvb-usb/Kconfig
> +++ b/drivers/media/dvb/dvb-usb/Kconfig
> @@ -417,9 +417,12 @@ config DVB_USB_RTL28XXU
>   	tristate "Realtek RTL28xxU DVB USB support"
>   	depends on DVB_USB&&  EXPERIMENTAL
>   	select DVB_RTL2830
> +	select DVB_RTL2832
>   	select MEDIA_TUNER_QT1010 if !MEDIA_TUNER_CUSTOMISE
>   	select MEDIA_TUNER_MT2060 if !MEDIA_TUNER_CUSTOMISE
>   	select MEDIA_TUNER_MXL5005S if !MEDIA_TUNER_CUSTOMISE
> +	select MEDIA_TUNER_FC0012 if !MEDIA_TUNER_CUSTOMISE
> +	select MEDIA_TUNER_FC0013 if !MEDIA_TUNER_CUSTOMISE
>   	help
>   	  Say Y here to support the Realtek RTL28xxU DVB USB receiver.
>
> diff --git a/drivers/media/dvb/dvb-usb/dvb-usb-ids.h b/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
> index 2418e41..fd37be0 100644
> --- a/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
> +++ b/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
> @@ -157,6 +157,7 @@
>   #define USB_PID_TERRATEC_CINERGY_T_STICK		0x0093
>   #define USB_PID_TERRATEC_CINERGY_T_STICK_RC		0x0097
>   #define USB_PID_TERRATEC_CINERGY_T_STICK_DUAL_RC	0x0099
> +#define USB_PID_TERRATEC_CINERGY_T_STICK_BLACK_REV1	0x00a9
>   #define USB_PID_TWINHAN_VP7041_COLD			0x3201
>   #define USB_PID_TWINHAN_VP7041_WARM			0x3202
>   #define USB_PID_TWINHAN_VP7020_COLD			0x3203
> diff --git a/drivers/media/dvb/dvb-usb/rtl28xxu.c b/drivers/media/dvb/dvb-usb/rtl28xxu.c
> index 8f4736a..bb66771 100644
> --- a/drivers/media/dvb/dvb-usb/rtl28xxu.c
> +++ b/drivers/media/dvb/dvb-usb/rtl28xxu.c
> @@ -3,6 +3,7 @@
>    *
>    * Copyright (C) 2009 Antti Palosaari<crope@iki.fi>
>    * Copyright (C) 2011 Antti Palosaari<crope@iki.fi>
> + * Copyright (C) 2012 Thomas Mair<thomas.mair86@googlemail.com>
>    *
>    *    This program is free software; you can redistribute it and/or modify
>    *    it under the terms of the GNU General Public License as published by
> @@ -22,10 +23,12 @@
>   #include "rtl28xxu.h"
>
>   #include "rtl2830.h"
> +#include "rtl2832.h"
>
>   #include "qt1010.h"
>   #include "mt2060.h"
>   #include "mxl5005s.h"
> +#include "fc0012.h"

You have added both FC0012 and FC0013 as a Kconfig but only fc0012.h is 
used here. It is wrong. Unless you are not using FC0013 tuner you should 
not make Kconfig dependency for the driver.

>
>   /* debug */
>   static int dvb_usb_rtl28xxu_debug;
> @@ -378,34 +381,153 @@ err:
>   	return ret;
>   }
>
> +static struct rtl2832_config rtl28xxu_rtl2832_fc0012_config = {
> +	.i2c_addr = 0x10, /* 0x20 */
> +	.xtal = 28800000,
> +	.if_dvbt = 0,
> +	.tuner = TUNER_RTL2832_FC0012
> +};
> +
> +
> +static int rtl2832u_fc0012_tuner_callback(struct dvb_usb_device *d,
> +		int cmd, int arg)
> +{
> +	int ret;
> +	u8 val;
> +
> +	deb_info("%s cmd=%d arg=%d\n", __func__, cmd, arg);
> +	switch (cmd) {
> +	case FC_FE_CALLBACK_VHF_ENABLE:
> +		/* set output values */
> +		ret = rtl2831_rd_reg(d, SYS_GPIO_OUT_VAL,&val);
> +		if (ret)
> +			goto err;
> +
> +		if (arg)
> +			val&= 0xbf; /* set GPIO6 low */
> +		else
> +			val |= 0x40; /* set GPIO6 high */
> +
> +
> +		ret = rtl2831_wr_reg(d, SYS_GPIO_OUT_VAL, val);
> +		if (ret)
> +			goto err;
> +		break;
> +	default:
> +		ret = -EINVAL;
> +		goto err;
> +	}
> +	return 0;
> +
> +err:
> +	err("%s: failed=%d\n", __func__, ret);
> +
> +	return ret;
> +}
> +
> +
> +static int rtl2832u_fc0013_tuner_callback(struct dvb_usb_device *d,
> +		int cmd, int arg)
> +{
> +	/* TODO implement*/
> +	return 0;
> +}
> +
> +static int rtl2832u_tuner_callback(struct dvb_usb_device *d, int cmd, int arg)
> +{
> +	struct rtl28xxu_priv *priv = d->priv;
> +
> +	switch (priv->tuner) {
> +	case TUNER_RTL2832_FC0012:
> +		return rtl2832u_fc0012_tuner_callback(d, cmd, arg);
> +
> +	case TUNER_RTL2832_FC0013:
> +		return rtl2832u_fc0013_tuner_callback(d, cmd, arg);
> +	default:
> +		break;
> +	}
> +
> +	return -ENODEV;
> +}
> +
> +static int rtl2832u_frontend_callback(void *adapter_priv, int component,
> +				    int cmd, int arg)
> +{
> +	struct i2c_adapter *adap = adapter_priv;
> +	struct dvb_usb_device *d = i2c_get_adapdata(adap);
> +
> +	switch (component) {
> +	case DVB_FRONTEND_COMPONENT_TUNER:
> +		return rtl2832u_tuner_callback(d, cmd, arg);
> +	default:
> +		break;
> +	}
> +
> +	return -EINVAL;
> +}
> +
> +
> +
> +
>   static int rtl2832u_frontend_attach(struct dvb_usb_adapter *adap)
>   {
>   	int ret;
>   	struct rtl28xxu_priv *priv = adap->dev->priv;
> -	u8 buf[1];
> +	struct rtl2832_config *rtl2832_config;
> +
> +	u8 buf[2], val;
>   	/* open RTL2832U/RTL2832 I2C gate */
>   	struct rtl28xxu_req req_gate_open = {0x0120, 0x0011, 0x0001, "\x18"};
>   	/* close RTL2832U/RTL2832 I2C gate */
>   	struct rtl28xxu_req req_gate_close = {0x0120, 0x0011, 0x0001, "\x10"};
> +	/* for FC0012 tuner probe */
> +	struct rtl28xxu_req req_fc0012 = {0x00c6, CMD_I2C_RD, 1, buf};
> +	/* for FC0013 tuner probe */
> +	struct rtl28xxu_req req_fc0013 = {0x00c6, CMD_I2C_RD, 1, buf};
> +	/* for MT2266 tuner probe */
> +	struct rtl28xxu_req req_mt2266 = {0x00c0, CMD_I2C_RD, 1, buf};
>   	/* for FC2580 tuner probe */
>   	struct rtl28xxu_req req_fc2580 = {0x01ac, CMD_I2C_RD, 1, buf};
> +	/* for MT2063 tuner probe */
> +	struct rtl28xxu_req req_mt2063 = {0x00c0, CMD_I2C_RD, 1, buf};
> +	/* for MAX3543 tuner probe */
> +	struct rtl28xxu_req req_max3543 = {0x00c0, CMD_I2C_RD, 1, buf};
> +	/* for TUA9001 tuner probe */
> +	struct rtl28xxu_req req_tua9001 = {0x7ec0, CMD_I2C_RD, 2, buf};
> +	/* for MXL5007T tuner probe */
> +	struct rtl28xxu_req req_mxl5007t = {0xd9c0, CMD_I2C_RD, 1, buf};
> +	/* for E4000 tuner probe */
> +	struct rtl28xxu_req req_e4000 = {0x02c8, CMD_I2C_RD, 1, buf};
> +	/* for TDA18272 tuner probe */
> +	struct rtl28xxu_req req_tda18272 = {0x00c0, CMD_I2C_RD, 2, buf};
>
>   	deb_info("%s:\n", __func__);
>
> -	/* GPIO direction */
> -	ret = rtl2831_wr_reg(adap->dev, SYS_GPIO_DIR, 0x0a);
> +
> +	ret = rtl2831_rd_reg(adap->dev, SYS_GPIO_DIR,&val);
>   	if (ret)
>   		goto err;
>
> -	/* enable as output GPIO0, GPIO2, GPIO4 */
> -	ret = rtl2831_wr_reg(adap->dev, SYS_GPIO_OUT_EN, 0x15);
> +	val&= 0xbf;
> +
> +	ret = rtl2831_wr_reg(adap->dev, SYS_GPIO_DIR, val);
>   	if (ret)
>   		goto err;
>
> -	ret = rtl2831_wr_reg(adap->dev, SYS_DEMOD_CTL, 0xe8);
> +
> +	/* enable as output GPIO3 and GPIO6*/
> +	ret = rtl2831_rd_reg(adap->dev, SYS_GPIO_OUT_EN,&val);
>   	if (ret)
>   		goto err;
>
> +	val |= 0x48;
> +
> +	ret = rtl2831_wr_reg(adap->dev, SYS_GPIO_OUT_EN, val);
> +	if (ret)
> +		goto err;
> +
> +
> +
>   	/*
>   	 * Probe used tuner. We need to know used tuner before demod attach
>   	 * since there is some demod params needed to set according to tuner.
> @@ -416,15 +538,95 @@ static int rtl2832u_frontend_attach(struct dvb_usb_adapter *adap)
>   	if (ret)
>   		goto err;
>
> +	priv->tuner = TUNER_NONE;
> +
> +	/* check FC0012 ID register; reg=00 val=a1 */
> +	ret = rtl28xxu_ctrl_msg(adap->dev,&req_fc0012);
> +	if (ret == 0&&  buf[0] == 0xa1) {
> +		priv->tuner = TUNER_RTL2832_FC0012;
> +		rtl2832_config =&rtl28xxu_rtl2832_fc0012_config;
> +		info("%s: FC0012 tuner found", __func__);
> +		goto found;
> +	}
> +
> +	/* check FC0013 ID register; reg=00 val=a3 */
> +	ret = rtl28xxu_ctrl_msg(adap->dev,&req_fc0013);
> +	if (ret == 0&&  buf[0] == 0xa3) {
> +		priv->tuner = TUNER_RTL2832_FC0013;
> +		info("%s: FC0013 tuner found", __func__);
> +		goto found;
> +	}
> +
> +	/* check MT2266 ID register; reg=00 val=85 */
> +	ret = rtl28xxu_ctrl_msg(adap->dev,&req_mt2266);
> +	if (ret == 0&&  buf[0] == 0x85) {
> +		priv->tuner = TUNER_RTL2832_MT2266;
> +		/* TODO implement tuner */
> +		info("%s: MT2266 tuner found", __func__);
> +		goto found;
> +	}
> +
>   	/* check FC2580 ID register; reg=01 val=56 */
>   	ret = rtl28xxu_ctrl_msg(adap->dev,&req_fc2580);
>   	if (ret == 0&&  buf[0] == 0x56) {
>   		priv->tuner = TUNER_RTL2832_FC2580;
> -		deb_info("%s: FC2580\n", __func__);
> +		/* TODO implement tuner */
> +		info("%s: FC2580 tuner found", __func__);
> +		goto found;
> +	}
> +
> +	/* check MT2063 ID register; reg=00 val=9e || 9c */
> +	ret = rtl28xxu_ctrl_msg(adap->dev,&req_mt2063);
> +	if (ret == 0&&  (buf[0] == 0x9e || buf[0] == 0x9c)) {
> +		priv->tuner = TUNER_RTL2832_MT2063;
> +		/* TODO implement tuner */
> +		info("%s: MT2063 tuner found", __func__);
> +		goto found;
> +	}
> +
> +	/* check MAX3543 ID register; reg=00 val=38 */
> +	ret = rtl28xxu_ctrl_msg(adap->dev,&req_max3543);
> +	if (ret == 0&&  buf[0] == 0x38) {
> +		priv->tuner = TUNER_RTL2832_MAX3543;
> +		/* TODO implement tuner */
> +		info("%s: MAX3534 tuner found", __func__);
> +		goto found;
> +	}
> +
> +	/* check TUA9001 ID register; reg=7e val=2328 */
> +	ret = rtl28xxu_ctrl_msg(adap->dev,&req_tua9001);
> +	if (ret == 0&&  buf[0] == 0x23&&  buf[1] == 0x28) {
> +		priv->tuner = TUNER_RTL2832_TUA9001;
> +		/* TODO implement tuner */
> +		info("%s: TUA9001 tuner found", __func__);
> +		goto found;
> +	}
> +
> +	/* check MXL5007R ID register; reg=d9 val=14 */
> +	ret = rtl28xxu_ctrl_msg(adap->dev,&req_mxl5007t);
> +	if (ret == 0&&  buf[0] == 0x14) {
> +		priv->tuner = TUNER_RTL2832_MXL5007T;
> +		/* TODO implement tuner */
> +		info("%s: MXL5007T tuner found", __func__);
> +		goto found;
> +	}
> +
> +	/* check E4000 ID register; reg=02 val=40 */
> +	ret = rtl28xxu_ctrl_msg(adap->dev,&req_e4000);
> +	if (ret == 0&&  buf[0] == 0x40) {
> +		priv->tuner = TUNER_RTL2832_E4000;
> +		/* TODO implement tuner */
> +		info("%s: E4000 tuner found", __func__);
> +		goto found;
> +	}
> +
> +	/* check TDA18272 ID register; reg=00 val=c760  */
> +	ret = rtl28xxu_ctrl_msg(adap->dev,&req_tda18272);
> +	if (ret == 0&&  (buf[0] == 0xc7 || buf[1] == 0x60)) {
> +		priv->tuner = TUNER_RTL2832_TDA18272;
> +		/* TODO implement tuner */
> +		info("%s: TDA18272 tuner found", __func__);
>   		goto found;
> -	} else {
> -		deb_info("%s: FC2580 probe failed=%d - %02x\n",
> -			__func__, ret, buf[0]);
>   	}
>
>   	/* close demod I2C gate */
> @@ -433,8 +635,9 @@ static int rtl2832u_frontend_attach(struct dvb_usb_adapter *adap)
>   		goto err;
>
>   	/* tuner not found */
> +	deb_info("No compatible tuner found");
>   	ret = -ENODEV;
> -	goto err;
> +	return ret;
>
>   found:
>   	/* close demod I2C gate */
> @@ -443,9 +646,18 @@ found:
>   		goto err;
>
>   	/* attach demodulator */
> -	/* TODO: */
> +	adap->fe_adap[0].fe = dvb_attach(rtl2832_attach, rtl2832_config,
> +		&adap->dev->i2c_adap);
> +		if (adap->fe_adap[0].fe == NULL) {
> +			ret = -ENODEV;
> +			goto err;
> +		}
> +
> +	/* set fe callbacks */
> +	adap->fe_adap[0].fe->callback = rtl2832u_frontend_callback;
>
>   	return ret;
> +
>   err:
>   	deb_info("%s: failed=%d\n", __func__, ret);
>   	return ret;
> @@ -528,9 +740,15 @@ static int rtl2832u_tuner_attach(struct dvb_usb_adapter *adap)
>   	deb_info("%s:\n", __func__);
>
>   	switch (priv->tuner) {
> -	case TUNER_RTL2832_FC2580:
> -		/* TODO: */
> -		fe = NULL;
> +	case TUNER_RTL2832_FC0012:
> +		fe = dvb_attach(fc0012_attach, adap->fe_adap[0].fe,
> +			&adap->dev->i2c_adap, 0xc6>>1, 0, FC_XTAL_28_8_MHZ);
> +
> +		/* since fc0012 includs reading the signal strength delegate
> +		 * that to the tuner driver */
> +		adap->fe_adap[0].fe->ops.read_signal_strength = adap->fe_adap[0].
> +				fe->ops.tuner_ops.get_rf_strength;
> +		return 0;
>   		break;
>   	default:
>   		fe = NULL;
> @@ -548,7 +766,7 @@ err:
>   	return ret;
>   }
>
> -static int rtl28xxu_streaming_ctrl(struct dvb_usb_adapter *adap , int onoff)
> +static int rtl2831u_streaming_ctrl(struct dvb_usb_adapter *adap , int onoff)
>   {
>   	int ret;
>   	u8 buf[2], gpio;
> @@ -583,7 +801,33 @@ err:
>   	return ret;
>   }
>
> -static int rtl28xxu_power_ctrl(struct dvb_usb_device *d, int onoff)
> +static int rtl2832u_streaming_ctrl(struct dvb_usb_adapter *adap , int onoff)
> +{
> +	int ret;
> +	u8 buf[2];
> +
> +	deb_info("%s: onoff=%d\n", __func__, onoff);
> +
> +
> +	if (onoff) {
> +		buf[0] = 0x00;
> +		buf[1] = 0x00;
> +	} else {
> +		buf[0] = 0x10; /* stall EPA */
> +		buf[1] = 0x02; /* reset EPA */
> +	}
> +
> +	ret = rtl2831_wr_regs(adap->dev, USB_EPA_CTL, buf, 2);
> +	if (ret)
> +		goto err;
> +
> +	return ret;
> +err:
> +	deb_info("%s: failed=%d\n", __func__, ret);
> +	return ret;
> +}
> +
> +static int rtl2831u_power_ctrl(struct dvb_usb_device *d, int onoff)
>   {
>   	int ret;
>   	u8 gpio, sys0;
> @@ -631,6 +875,128 @@ err:
>   	return ret;
>   }
>
> +static int rtl2832u_power_ctrl(struct dvb_usb_device *d, int onoff)
> +{
> +	int ret;
> +	u8 val;
> +
> +	deb_info("%s: onoff=%d\n", __func__, onoff);
> +
> +	if (onoff) {
> +		/* set output values */
> +		ret = rtl2831_rd_reg(d, SYS_GPIO_OUT_VAL,&val);
> +		if (ret)
> +			goto err;
> +
> +		val |= 0x08;
> +		val&= 0xef;
> +
> +		ret = rtl2831_wr_reg(d, SYS_GPIO_OUT_VAL, val);
> +		if (ret)
> +			goto err;
> +
> +		/* demod_ctl_1 */
> +		ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL1,&val);
> +		if (ret)
> +			goto err;
> +
> +		val&= 0xef;
> +
> +		ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL1, val);
> +		if (ret)
> +			goto err;
> +
> +		/* demod control */
> +		/* PLL enable */
> +		ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL,&val);
> +		if (ret)
> +			goto err;
> +
> +		/* bit 7 to 1 */
> +		val |= 0x80;
> +
> +		ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL, val);
> +		if (ret)
> +			goto err;
> +
> +		/* demod HW reset */
> +		ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL,&val);
> +		if (ret)
> +			goto err;
> +		/* bit 5 to 0 */
> +		val&= 0xdf;
> +
> +		ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL, val);
> +		if (ret)
> +			goto err;
> +
> +		ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL,&val);
> +		if (ret)
> +			goto err;
> +
> +		val |= 0x20;
> +
> +		ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL, val);
> +		if (ret)
> +			goto err;
> +
> +		mdelay(5);
> +
> +		/*enable ADC_Q and ADC_I */
> +		ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL,&val);
> +		if (ret)
> +			goto err;
> +
> +		val |= 0x48;
> +
> +		ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL, val);
> +		if (ret)
> +			goto err;
> +
> +
> +	} else {
> +		/* demod_ctl_1 */
> +		ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL1,&val);
> +		if (ret)
> +			goto err;
> +
> +		val |= 0x0c;
> +
> +		ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL1, val);
> +		if (ret)
> +			goto err;
> +
> +		/* set output values */
> +		ret = rtl2831_rd_reg(d, SYS_GPIO_OUT_VAL,&val);
> +		if (ret)
> +				goto err;
> +
> +		val |= 0x10;
> +
> +		ret = rtl2831_wr_reg(d, SYS_GPIO_OUT_VAL, val);
> +		if (ret)
> +			goto err;
> +
> +		/* demod control */
> +		ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL,&val);
> +		if (ret)
> +			goto err;
> +
> +		val&= 0x37;
> +
> +		ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL, val);
> +		if (ret)
> +			goto err;
> +
> +	}
> +
> +	return ret;
> +err:
> +	deb_info("%s: failed=%d\n", __func__, ret);
> +	return ret;
> +}
> +
> +
>   static int rtl2831u_rc_query(struct dvb_usb_device *d)
>   {
>   	int ret, i;
> @@ -768,6 +1134,7 @@ enum rtl28xxu_usb_table_entry {
>   	RTL2831U_0BDA_2831,
>   	RTL2831U_14AA_0160,
>   	RTL2831U_14AA_0161,
> +	RTL2832U_0CCD_00A9,
>   };
>
>   static struct usb_device_id rtl28xxu_table[] = {
> @@ -780,6 +1147,8 @@ static struct usb_device_id rtl28xxu_table[] = {
>   		USB_DEVICE(USB_VID_WIDEVIEW, USB_PID_FREECOM_DVBT_2)},
>
>   	/* RTL2832U */
> +	[RTL2832U_0CCD_00A9] = {
> +		USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_T_STICK_BLACK_REV1)},
>   	{} /* terminating entry */
>   };
>
> @@ -802,7 +1171,7 @@ static struct dvb_usb_device_properties rtl28xxu_properties[] = {
>   					{
>   						.frontend_attach = rtl2831u_frontend_attach,
>   						.tuner_attach    = rtl2831u_tuner_attach,
> -						.streaming_ctrl  = rtl28xxu_streaming_ctrl,
> +						.streaming_ctrl  = rtl2831u_streaming_ctrl,
>   						.stream = {
>   							.type = USB_BULK,
>   							.count = 6,
> @@ -818,7 +1187,7 @@ static struct dvb_usb_device_properties rtl28xxu_properties[] = {
>   			}
>   		},
>
> -		.power_ctrl = rtl28xxu_power_ctrl,
> +		.power_ctrl = rtl2831u_power_ctrl,
>
>   		.rc.core = {
>   			.protocol       = RC_TYPE_NEC,
> @@ -864,7 +1233,7 @@ static struct dvb_usb_device_properties rtl28xxu_properties[] = {
>   					{
>   						.frontend_attach = rtl2832u_frontend_attach,
>   						.tuner_attach    = rtl2832u_tuner_attach,
> -						.streaming_ctrl  = rtl28xxu_streaming_ctrl,
> +						.streaming_ctrl  = rtl2832u_streaming_ctrl,
>   						.stream = {
>   							.type = USB_BULK,
>   							.count = 6,
> @@ -880,7 +1249,7 @@ static struct dvb_usb_device_properties rtl28xxu_properties[] = {
>   			}
>   		},
>
> -		.power_ctrl = rtl28xxu_power_ctrl,
> +		.power_ctrl = rtl2832u_power_ctrl,
>
>   		.rc.core = {
>   			.protocol       = RC_TYPE_NEC,
> @@ -893,10 +1262,13 @@ static struct dvb_usb_device_properties rtl28xxu_properties[] = {
>
>   		.i2c_algo =&rtl28xxu_i2c_algo,
>
> -		.num_device_descs = 0, /* disabled as no support for RTL2832 */
> +		.num_device_descs = 1,
>   		.devices = {
>   			{
> -				.name = "Realtek RTL2832U reference design",
> +				.name = "Terratec Cinergy T Stick Black",
> +				.warm_ids = {
> +					&rtl28xxu_table[RTL2832U_0CCD_00A9],
> +				},
>   			},
>   		}
>   	},
> @@ -907,6 +1279,7 @@ static int rtl28xxu_probe(struct usb_interface *intf,
>   		const struct usb_device_id *id)
>   {
>   	int ret, i;
> +	u8 val;
>   	int properties_count = ARRAY_SIZE(rtl28xxu_properties);
>   	struct dvb_usb_device *d;
>
> @@ -926,15 +1299,24 @@ static int rtl28xxu_probe(struct usb_interface *intf,
>   	if (ret)
>   		goto err;
>
> +
>   	/* init USB endpoints */
> -	ret = rtl2831_wr_reg(d, USB_SYSCTL_0, 0x09);
> +	ret = rtl2831_rd_reg(d, USB_SYSCTL_0,&val);
> +	if (ret)
> +			goto err;
> +
> +	/* enable DMA and Full Packet Mode*/
> +	val |= 0x09;
> +	ret = rtl2831_wr_reg(d, USB_SYSCTL_0, val);
>   	if (ret)
>   		goto err;
>
> +	/* set EPA maximum packet size to 0x0200 */
>   	ret = rtl2831_wr_regs(d, USB_EPA_MAXPKT, "\x00\x02\x00\x00", 4);
>   	if (ret)
>   		goto err;
>
> +	/* change EPA FIFO length */
>   	ret = rtl2831_wr_regs(d, USB_EPA_FIFO_CFG, "\x14\x00\x00\x00", 4);
>   	if (ret)
>   		goto err;
> @@ -979,4 +1361,5 @@ module_exit(rtl28xxu_module_exit);
>
>   MODULE_DESCRIPTION("Realtek RTL28xxU DVB USB driver");
>   MODULE_AUTHOR("Antti Palosaari<crope@iki.fi>");
> +MODULE_AUTHOR("Thomas Mair<thomas.mair86@googlemail.com>");
>   MODULE_LICENSE("GPL");


-- 
http://palosaari.fi/

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [PATCH v4 3/5] rtl28xxu: renamed rtl2831_rd/rtl2831_wr to rtl28xx_rd/rtl28xx_wr
  2012-05-16 22:13   ` [PATCH v4 3/5] rtl28xxu: renamed rtl2831_rd/rtl2831_wr to rtl28xx_rd/rtl28xx_wr Thomas Mair
@ 2012-05-17 14:43     ` Antti Palosaari
  0 siblings, 0 replies; 104+ messages in thread
From: Antti Palosaari @ 2012-05-17 14:43 UTC (permalink / raw)
  To: Thomas Mair; +Cc: pomidorabelisima, Linux Media Mailing List

On 17.05.2012 01:13, Thomas Mair wrote:
> Signed-off-by: Thomas Mair<thomas.mair86@googlemail.com>

Acked-by: Antti Palosaari <crope@iki.fi>


> ---
>   drivers/media/dvb/dvb-usb/rtl28xxu.c |  102 +++++++++++++++++-----------------
>   1 files changed, 51 insertions(+), 51 deletions(-)
>
> diff --git a/drivers/media/dvb/dvb-usb/rtl28xxu.c b/drivers/media/dvb/dvb-usb/rtl28xxu.c
> index bb66771..6817ef7 100644
> --- a/drivers/media/dvb/dvb-usb/rtl28xxu.c
> +++ b/drivers/media/dvb/dvb-usb/rtl28xxu.c
> @@ -83,7 +83,7 @@ err:
>   	return ret;
>   }
>
> -static int rtl2831_wr_regs(struct dvb_usb_device *d, u16 reg, u8 *val, int len)
> +static int rtl28xx_wr_regs(struct dvb_usb_device *d, u16 reg, u8 *val, int len)
>   {
>   	struct rtl28xxu_req req;
>
> @@ -119,12 +119,12 @@ static int rtl2831_rd_regs(struct dvb_usb_device *d, u16 reg, u8 *val, int len)
>   	return rtl28xxu_ctrl_msg(d,&req);
>   }
>
> -static int rtl2831_wr_reg(struct dvb_usb_device *d, u16 reg, u8 val)
> +static int rtl28xx_wr_reg(struct dvb_usb_device *d, u16 reg, u8 val)
>   {
> -	return rtl2831_wr_regs(d, reg,&val, 1);
> +	return rtl28xx_wr_regs(d, reg,&val, 1);
>   }
>
> -static int rtl2831_rd_reg(struct dvb_usb_device *d, u16 reg, u8 *val)
> +static int rtl28xx_rd_reg(struct dvb_usb_device *d, u16 reg, u8 *val)
>   {
>   	return rtl2831_rd_regs(d, reg, val, 1);
>   }
> @@ -311,12 +311,12 @@ static int rtl2831u_frontend_attach(struct dvb_usb_adapter *adap)
>   	 */
>
>   	/* GPIO direction */
> -	ret = rtl2831_wr_reg(adap->dev, SYS_GPIO_DIR, 0x0a);
> +	ret = rtl28xx_wr_reg(adap->dev, SYS_GPIO_DIR, 0x0a);
>   	if (ret)
>   		goto err;
>
>   	/* enable as output GPIO0, GPIO2, GPIO4 */
> -	ret = rtl2831_wr_reg(adap->dev, SYS_GPIO_OUT_EN, 0x15);
> +	ret = rtl28xx_wr_reg(adap->dev, SYS_GPIO_OUT_EN, 0x15);
>   	if (ret)
>   		goto err;
>
> @@ -399,7 +399,7 @@ static int rtl2832u_fc0012_tuner_callback(struct dvb_usb_device *d,
>   	switch (cmd) {
>   	case FC_FE_CALLBACK_VHF_ENABLE:
>   		/* set output values */
> -		ret = rtl2831_rd_reg(d, SYS_GPIO_OUT_VAL,&val);
> +		ret = rtl28xx_rd_reg(d, SYS_GPIO_OUT_VAL,&val);
>   		if (ret)
>   			goto err;
>
> @@ -409,7 +409,7 @@ static int rtl2832u_fc0012_tuner_callback(struct dvb_usb_device *d,
>   			val |= 0x40; /* set GPIO6 high */
>
>
> -		ret = rtl2831_wr_reg(d, SYS_GPIO_OUT_VAL, val);
> +		ret = rtl28xx_wr_reg(d, SYS_GPIO_OUT_VAL, val);
>   		if (ret)
>   			goto err;
>   		break;
> @@ -504,25 +504,25 @@ static int rtl2832u_frontend_attach(struct dvb_usb_adapter *adap)
>   	deb_info("%s:\n", __func__);
>
>
> -	ret = rtl2831_rd_reg(adap->dev, SYS_GPIO_DIR,&val);
> +	ret = rtl28xx_rd_reg(adap->dev, SYS_GPIO_DIR,&val);
>   	if (ret)
>   		goto err;
>
>   	val&= 0xbf;
>
> -	ret = rtl2831_wr_reg(adap->dev, SYS_GPIO_DIR, val);
> +	ret = rtl28xx_wr_reg(adap->dev, SYS_GPIO_DIR, val);
>   	if (ret)
>   		goto err;
>
>
>   	/* enable as output GPIO3 and GPIO6*/
> -	ret = rtl2831_rd_reg(adap->dev, SYS_GPIO_OUT_EN,&val);
> +	ret = rtl28xx_rd_reg(adap->dev, SYS_GPIO_OUT_EN,&val);
>   	if (ret)
>   		goto err;
>
>   	val |= 0x48;
>
> -	ret = rtl2831_wr_reg(adap->dev, SYS_GPIO_OUT_EN, val);
> +	ret = rtl28xx_wr_reg(adap->dev, SYS_GPIO_OUT_EN, val);
>   	if (ret)
>   		goto err;
>
> @@ -773,7 +773,7 @@ static int rtl2831u_streaming_ctrl(struct dvb_usb_adapter *adap , int onoff)
>
>   	deb_info("%s: onoff=%d\n", __func__, onoff);
>
> -	ret = rtl2831_rd_reg(adap->dev, SYS_GPIO_OUT_VAL,&gpio);
> +	ret = rtl28xx_rd_reg(adap->dev, SYS_GPIO_OUT_VAL,&gpio);
>   	if (ret)
>   		goto err;
>
> @@ -787,11 +787,11 @@ static int rtl2831u_streaming_ctrl(struct dvb_usb_adapter *adap , int onoff)
>   		gpio&= (~0x04); /* LED off */
>   	}
>
> -	ret = rtl2831_wr_reg(adap->dev, SYS_GPIO_OUT_VAL, gpio);
> +	ret = rtl28xx_wr_reg(adap->dev, SYS_GPIO_OUT_VAL, gpio);
>   	if (ret)
>   		goto err;
>
> -	ret = rtl2831_wr_regs(adap->dev, USB_EPA_CTL, buf, 2);
> +	ret = rtl28xx_wr_regs(adap->dev, USB_EPA_CTL, buf, 2);
>   	if (ret)
>   		goto err;
>
> @@ -817,7 +817,7 @@ static int rtl2832u_streaming_ctrl(struct dvb_usb_adapter *adap , int onoff)
>   		buf[1] = 0x02; /* reset EPA */
>   	}
>
> -	ret = rtl2831_wr_regs(adap->dev, USB_EPA_CTL, buf, 2);
> +	ret = rtl28xx_wr_regs(adap->dev, USB_EPA_CTL, buf, 2);
>   	if (ret)
>   		goto err;
>
> @@ -835,12 +835,12 @@ static int rtl2831u_power_ctrl(struct dvb_usb_device *d, int onoff)
>   	deb_info("%s: onoff=%d\n", __func__, onoff);
>
>   	/* demod adc */
> -	ret = rtl2831_rd_reg(d, SYS_SYS0,&sys0);
> +	ret = rtl28xx_rd_reg(d, SYS_SYS0,&sys0);
>   	if (ret)
>   		goto err;
>
>   	/* tuner power, read GPIOs */
> -	ret = rtl2831_rd_reg(d, SYS_GPIO_OUT_VAL,&gpio);
> +	ret = rtl28xx_rd_reg(d, SYS_GPIO_OUT_VAL,&gpio);
>   	if (ret)
>   		goto err;
>
> @@ -860,12 +860,12 @@ static int rtl2831u_power_ctrl(struct dvb_usb_device *d, int onoff)
>   	deb_info("%s: WR SYS0=%02x GPIO_OUT_VAL=%02x\n", __func__, sys0, gpio);
>
>   	/* demod adc */
> -	ret = rtl2831_wr_reg(d, SYS_SYS0, sys0);
> +	ret = rtl28xx_wr_reg(d, SYS_SYS0, sys0);
>   	if (ret)
>   		goto err;
>
>   	/* tuner power, write GPIOs */
> -	ret = rtl2831_wr_reg(d, SYS_GPIO_OUT_VAL, gpio);
> +	ret = rtl28xx_wr_reg(d, SYS_GPIO_OUT_VAL, gpio);
>   	if (ret)
>   		goto err;
>
> @@ -884,107 +884,107 @@ static int rtl2832u_power_ctrl(struct dvb_usb_device *d, int onoff)
>
>   	if (onoff) {
>   		/* set output values */
> -		ret = rtl2831_rd_reg(d, SYS_GPIO_OUT_VAL,&val);
> +		ret = rtl28xx_rd_reg(d, SYS_GPIO_OUT_VAL,&val);
>   		if (ret)
>   			goto err;
>
>   		val |= 0x08;
>   		val&= 0xef;
>
> -		ret = rtl2831_wr_reg(d, SYS_GPIO_OUT_VAL, val);
> +		ret = rtl28xx_wr_reg(d, SYS_GPIO_OUT_VAL, val);
>   		if (ret)
>   			goto err;
>
>   		/* demod_ctl_1 */
> -		ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL1,&val);
> +		ret = rtl28xx_rd_reg(d, SYS_DEMOD_CTL1,&val);
>   		if (ret)
>   			goto err;
>
>   		val&= 0xef;
>
> -		ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL1, val);
> +		ret = rtl28xx_wr_reg(d, SYS_DEMOD_CTL1, val);
>   		if (ret)
>   			goto err;
>
>   		/* demod control */
>   		/* PLL enable */
> -		ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL,&val);
> +		ret = rtl28xx_rd_reg(d, SYS_DEMOD_CTL,&val);
>   		if (ret)
>   			goto err;
>
>   		/* bit 7 to 1 */
>   		val |= 0x80;
>
> -		ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL, val);
> +		ret = rtl28xx_wr_reg(d, SYS_DEMOD_CTL, val);
>   		if (ret)
>   			goto err;
>
>   		/* demod HW reset */
> -		ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL,&val);
> +		ret = rtl28xx_rd_reg(d, SYS_DEMOD_CTL,&val);
>   		if (ret)
>   			goto err;
>   		/* bit 5 to 0 */
>   		val&= 0xdf;
>
> -		ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL, val);
> +		ret = rtl28xx_wr_reg(d, SYS_DEMOD_CTL, val);
>   		if (ret)
>   			goto err;
>
> -		ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL,&val);
> +		ret = rtl28xx_rd_reg(d, SYS_DEMOD_CTL,&val);
>   		if (ret)
>   			goto err;
>
>   		val |= 0x20;
>
> -		ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL, val);
> +		ret = rtl28xx_wr_reg(d, SYS_DEMOD_CTL, val);
>   		if (ret)
>   			goto err;
>
>   		mdelay(5);
>
>   		/*enable ADC_Q and ADC_I */
> -		ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL,&val);
> +		ret = rtl28xx_rd_reg(d, SYS_DEMOD_CTL,&val);
>   		if (ret)
>   			goto err;
>
>   		val |= 0x48;
>
> -		ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL, val);
> +		ret = rtl28xx_wr_reg(d, SYS_DEMOD_CTL, val);
>   		if (ret)
>   			goto err;
>
>
>   	} else {
>   		/* demod_ctl_1 */
> -		ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL1,&val);
> +		ret = rtl28xx_rd_reg(d, SYS_DEMOD_CTL1,&val);
>   		if (ret)
>   			goto err;
>
>   		val |= 0x0c;
>
> -		ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL1, val);
> +		ret = rtl28xx_wr_reg(d, SYS_DEMOD_CTL1, val);
>   		if (ret)
>   			goto err;
>
>   		/* set output values */
> -		ret = rtl2831_rd_reg(d, SYS_GPIO_OUT_VAL,&val);
> +		ret = rtl28xx_rd_reg(d, SYS_GPIO_OUT_VAL,&val);
>   		if (ret)
>   				goto err;
>
>   		val |= 0x10;
>
> -		ret = rtl2831_wr_reg(d, SYS_GPIO_OUT_VAL, val);
> +		ret = rtl28xx_wr_reg(d, SYS_GPIO_OUT_VAL, val);
>   		if (ret)
>   			goto err;
>
>   		/* demod control */
> -		ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL,&val);
> +		ret = rtl28xx_rd_reg(d, SYS_DEMOD_CTL,&val);
>   		if (ret)
>   			goto err;
>
>   		val&= 0x37;
>
> -		ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL, val);
> +		ret = rtl28xx_wr_reg(d, SYS_DEMOD_CTL, val);
>   		if (ret)
>   			goto err;
>
> @@ -1023,7 +1023,7 @@ static int rtl2831u_rc_query(struct dvb_usb_device *d)
>   	/* init remote controller */
>   	if (!priv->rc_active) {
>   		for (i = 0; i<  ARRAY_SIZE(rc_nec_tab); i++) {
> -			ret = rtl2831_wr_reg(d, rc_nec_tab[i].reg,
> +			ret = rtl28xx_wr_reg(d, rc_nec_tab[i].reg,
>   					rc_nec_tab[i].val);
>   			if (ret)
>   				goto err;
> @@ -1053,12 +1053,12 @@ static int rtl2831u_rc_query(struct dvb_usb_device *d)
>
>   		rc_keydown(d->rc_dev, rc_code, 0);
>
> -		ret = rtl2831_wr_reg(d, SYS_IRRC_SR, 1);
> +		ret = rtl28xx_wr_reg(d, SYS_IRRC_SR, 1);
>   		if (ret)
>   			goto err;
>
>   		/* repeated intentionally to avoid extra keypress */
> -		ret = rtl2831_wr_reg(d, SYS_IRRC_SR, 1);
> +		ret = rtl28xx_wr_reg(d, SYS_IRRC_SR, 1);
>   		if (ret)
>   			goto err;
>   	}
> @@ -1095,7 +1095,7 @@ static int rtl2832u_rc_query(struct dvb_usb_device *d)
>   	/* init remote controller */
>   	if (!priv->rc_active) {
>   		for (i = 0; i<  ARRAY_SIZE(rc_nec_tab); i++) {
> -			ret = rtl2831_wr_reg(d, rc_nec_tab[i].reg,
> +			ret = rtl28xx_wr_reg(d, rc_nec_tab[i].reg,
>   					rc_nec_tab[i].val);
>   			if (ret)
>   				goto err;
> @@ -1103,14 +1103,14 @@ static int rtl2832u_rc_query(struct dvb_usb_device *d)
>   		priv->rc_active = true;
>   	}
>
> -	ret = rtl2831_rd_reg(d, IR_RX_IF,&buf[0]);
> +	ret = rtl28xx_rd_reg(d, IR_RX_IF,&buf[0]);
>   	if (ret)
>   		goto err;
>
>   	if (buf[0] != 0x83)
>   		goto exit;
>
> -	ret = rtl2831_rd_reg(d, IR_RX_BC,&buf[0]);
> +	ret = rtl28xx_rd_reg(d, IR_RX_BC,&buf[0]);
>   	if (ret)
>   		goto err;
>
> @@ -1119,9 +1119,9 @@ static int rtl2832u_rc_query(struct dvb_usb_device *d)
>
>   	/* TODO: pass raw IR to Kernel IR decoder */
>
> -	ret = rtl2831_wr_reg(d, IR_RX_IF, 0x03);
> -	ret = rtl2831_wr_reg(d, IR_RX_BUF_CTRL, 0x80);
> -	ret = rtl2831_wr_reg(d, IR_RX_CTRL, 0x80);
> +	ret = rtl28xx_wr_reg(d, IR_RX_IF, 0x03);
> +	ret = rtl28xx_wr_reg(d, IR_RX_BUF_CTRL, 0x80);
> +	ret = rtl28xx_wr_reg(d, IR_RX_CTRL, 0x80);
>
>   exit:
>   	return ret;
> @@ -1301,23 +1301,23 @@ static int rtl28xxu_probe(struct usb_interface *intf,
>
>
>   	/* init USB endpoints */
> -	ret = rtl2831_rd_reg(d, USB_SYSCTL_0,&val);
> +	ret = rtl28xx_rd_reg(d, USB_SYSCTL_0,&val);
>   	if (ret)
>   			goto err;
>
>   	/* enable DMA and Full Packet Mode*/
>   	val |= 0x09;
> -	ret = rtl2831_wr_reg(d, USB_SYSCTL_0, val);
> +	ret = rtl28xx_wr_reg(d, USB_SYSCTL_0, val);
>   	if (ret)
>   		goto err;
>
>   	/* set EPA maximum packet size to 0x0200 */
> -	ret = rtl2831_wr_regs(d, USB_EPA_MAXPKT, "\x00\x02\x00\x00", 4);
> +	ret = rtl28xx_wr_regs(d, USB_EPA_MAXPKT, "\x00\x02\x00\x00", 4);
>   	if (ret)
>   		goto err;
>
>   	/* change EPA FIFO length */
> -	ret = rtl2831_wr_regs(d, USB_EPA_FIFO_CFG, "\x14\x00\x00\x00", 4);
> +	ret = rtl28xx_wr_regs(d, USB_EPA_FIFO_CFG, "\x14\x00\x00\x00", 4);
>   	if (ret)
>   		goto err;
>


-- 
http://palosaari.fi/

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [PATCH v4 4/5] rtl28xxu: support G-Tek Electronics Group Lifeview LV5TDLX DVB-T
  2012-05-16 22:13   ` [PATCH v4 4/5] rtl28xxu: support G-Tek Electronics Group Lifeview LV5TDLX DVB-T Thomas Mair
@ 2012-05-17 14:47     ` Antti Palosaari
  2012-05-17 20:43       ` poma
  0 siblings, 1 reply; 104+ messages in thread
From: Antti Palosaari @ 2012-05-17 14:47 UTC (permalink / raw)
  To: Thomas Mair; +Cc: pomidorabelisima, Linux Media Mailing List

On 17.05.2012 01:13, Thomas Mair wrote:
> Signed-off-by: Thomas Mair<thomas.mair86@googlemail.com>

Nacked.
Better PID definition is required.

> ---
>   drivers/media/dvb/dvb-usb/dvb-usb-ids.h |    1 +
>   drivers/media/dvb/dvb-usb/rtl28xxu.c    |   11 ++++++++++-
>   2 files changed, 11 insertions(+), 1 deletions(-)
>
> diff --git a/drivers/media/dvb/dvb-usb/dvb-usb-ids.h b/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
> index fd37be0..b0a86e9 100644
> --- a/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
> +++ b/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
> @@ -135,6 +135,7 @@
>   #define USB_PID_GENIUS_TVGO_DVB_T03			0x4012
>   #define USB_PID_GRANDTEC_DVBT_USB_COLD			0x0fa0
>   #define USB_PID_GRANDTEC_DVBT_USB_WARM			0x0fa1
> +#define USB_PID_GTEK					0xb803

You must give better name for the device. Vendor name is not enough as 
many vendors has surely more than one device model.

Correct PID is something like USB_PID_GTEK_LIFEVIEW_LV5TDLX

>   #define USB_PID_INTEL_CE9500				0x9500
>   #define USB_PID_ITETECH_IT9135				0x9135
>   #define USB_PID_ITETECH_IT9135_9005			0x9005
> diff --git a/drivers/media/dvb/dvb-usb/rtl28xxu.c b/drivers/media/dvb/dvb-usb/rtl28xxu.c
> index 6817ef7..9056d28 100644
> --- a/drivers/media/dvb/dvb-usb/rtl28xxu.c
> +++ b/drivers/media/dvb/dvb-usb/rtl28xxu.c
> @@ -1135,6 +1135,7 @@ enum rtl28xxu_usb_table_entry {
>   	RTL2831U_14AA_0160,
>   	RTL2831U_14AA_0161,
>   	RTL2832U_0CCD_00A9,
> +	RTL2832U_1F4D_B803,
>   };
>
>   static struct usb_device_id rtl28xxu_table[] = {
> @@ -1149,6 +1150,8 @@ static struct usb_device_id rtl28xxu_table[] = {
>   	/* RTL2832U */
>   	[RTL2832U_0CCD_00A9] = {
>   		USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_T_STICK_BLACK_REV1)},
> +	[RTL2832U_1F4D_B803] = {
> +		USB_DEVICE(USB_VID_GTEK, USB_PID_GTEK)},
>   	{} /* terminating entry */
>   };
>
> @@ -1262,7 +1265,7 @@ static struct dvb_usb_device_properties rtl28xxu_properties[] = {
>
>   		.i2c_algo =&rtl28xxu_i2c_algo,
>
> -		.num_device_descs = 1,
> +		.num_device_descs = 2,
>   		.devices = {
>   			{
>   				.name = "Terratec Cinergy T Stick Black",
> @@ -1270,6 +1273,12 @@ static struct dvb_usb_device_properties rtl28xxu_properties[] = {
>   					&rtl28xxu_table[RTL2832U_0CCD_00A9],
>   				},
>   			},
> +			{
> +				.name = "G-Tek Electronics Group Lifeview LV5TDLX DVB-T [RTL2832U]",
> +				.warm_ids = {
> +					&rtl28xxu_table[RTL2832U_1F4D_B803],
> +				},
> +			},
>   		}
>   	},
>


-- 
http://palosaari.fi/

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [PATCH v4 5/5] rtl28xxu: support Terratec Noxon DAB/DAB+ stick
  2012-05-16 22:13   ` [PATCH v4 5/5] rtl28xxu: support Terratec Noxon DAB/DAB+ stick Thomas Mair
@ 2012-05-17 14:50     ` Antti Palosaari
  0 siblings, 0 replies; 104+ messages in thread
From: Antti Palosaari @ 2012-05-17 14:50 UTC (permalink / raw)
  To: Thomas Mair; +Cc: pomidorabelisima, Linux Media Mailing List, Hans-Frieder Vogt

On 17.05.2012 01:13, Thomas Mair wrote:
> Signed-off-by: Hans-Frieder Vogt<hfvogt@gmx.net>
> Signed-off-by: Thomas Mair<thomas.mair86@googlemail.com>

Acked-by: Antti Palosaari <crope@iki.fi>


> ---
>   drivers/media/dvb/dvb-usb/dvb-usb-ids.h |    1 +
>   drivers/media/dvb/dvb-usb/rtl28xxu.c    |   27 ++++++++++++++++++++++++++-
>   2 files changed, 27 insertions(+), 1 deletions(-)
>
> diff --git a/drivers/media/dvb/dvb-usb/dvb-usb-ids.h b/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
> index b0a86e9..95c9c14 100644
> --- a/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
> +++ b/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
> @@ -244,6 +244,7 @@
>   #define USB_PID_TERRATEC_H7_2				0x10a3
>   #define USB_PID_TERRATEC_T3				0x10a0
>   #define USB_PID_TERRATEC_T5				0x10a1
> +#define USB_PID_NOXON_DAB_STICK				0x00b3
>   #define USB_PID_PINNACLE_EXPRESSCARD_320CX		0x022e
>   #define USB_PID_PINNACLE_PCTV2000E			0x022c
>   #define USB_PID_PINNACLE_PCTV_DVB_T_FLASH		0x0228
> diff --git a/drivers/media/dvb/dvb-usb/rtl28xxu.c b/drivers/media/dvb/dvb-usb/rtl28xxu.c
> index 9056d28..f10cac2 100644
> --- a/drivers/media/dvb/dvb-usb/rtl28xxu.c
> +++ b/drivers/media/dvb/dvb-usb/rtl28xxu.c
> @@ -29,6 +29,7 @@
>   #include "mt2060.h"
>   #include "mxl5005s.h"
>   #include "fc0012.h"
> +#include "fc0013.h"

Aaah, it is coming here. You were introducing some FC0013 earlier which 
I mentioned (that Kconfig dependency). Correct place for FC0013 stuff is 
that patch.

>
>   /* debug */
>   static int dvb_usb_rtl28xxu_debug;
> @@ -388,6 +389,12 @@ static struct rtl2832_config rtl28xxu_rtl2832_fc0012_config = {
>   	.tuner = TUNER_RTL2832_FC0012
>   };
>
> +static struct rtl2832_config rtl28xxu_rtl2832_fc0013_config = {
> +	.i2c_addr = 0x10, /* 0x20 */
> +	.xtal = 28800000,
> +	.if_dvbt = 0,
> +	.tuner = TUNER_RTL2832_FC0013
> +};
>
>   static int rtl2832u_fc0012_tuner_callback(struct dvb_usb_device *d,
>   		int cmd, int arg)
> @@ -553,6 +560,7 @@ static int rtl2832u_frontend_attach(struct dvb_usb_adapter *adap)
>   	ret = rtl28xxu_ctrl_msg(adap->dev,&req_fc0013);
>   	if (ret == 0&&  buf[0] == 0xa3) {
>   		priv->tuner = TUNER_RTL2832_FC0013;
> +		rtl2832_config =&rtl28xxu_rtl2832_fc0013_config;
>   		info("%s: FC0013 tuner found", __func__);
>   		goto found;
>   	}
> @@ -750,6 +758,14 @@ static int rtl2832u_tuner_attach(struct dvb_usb_adapter *adap)
>   				fe->ops.tuner_ops.get_rf_strength;
>   		return 0;
>   		break;
> +	case TUNER_RTL2832_FC0013:
> +		fe = dvb_attach(fc0013_attach, adap->fe_adap[0].fe,
> +			&adap->dev->i2c_adap, 0xc6>>1, 0, FC_XTAL_28_8_MHZ);
> +
> +		/* fc0013 also supports signal strength reading */
> +		adap->fe_adap[0].fe->ops.read_signal_strength = adap->fe_adap[0]
> +			.fe->ops.tuner_ops.get_rf_strength;
> +		return 0;
>   	default:
>   		fe = NULL;
>   		err("unknown tuner=%d", priv->tuner);
> @@ -1136,6 +1152,7 @@ enum rtl28xxu_usb_table_entry {
>   	RTL2831U_14AA_0161,
>   	RTL2832U_0CCD_00A9,
>   	RTL2832U_1F4D_B803,
> +	RTL2832U_0CCD_00B3,
>   };
>
>   static struct usb_device_id rtl28xxu_table[] = {
> @@ -1152,6 +1169,8 @@ static struct usb_device_id rtl28xxu_table[] = {
>   		USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_T_STICK_BLACK_REV1)},
>   	[RTL2832U_1F4D_B803] = {
>   		USB_DEVICE(USB_VID_GTEK, USB_PID_GTEK)},
> +	[RTL2832U_0CCD_00B3] = {
> +		USB_DEVICE(USB_VID_TERRATEC, USB_PID_NOXON_DAB_STICK)},
>   	{} /* terminating entry */
>   };
>
> @@ -1265,7 +1284,7 @@ static struct dvb_usb_device_properties rtl28xxu_properties[] = {
>
>   		.i2c_algo =&rtl28xxu_i2c_algo,
>
> -		.num_device_descs = 2,
> +		.num_device_descs = 3,
>   		.devices = {
>   			{
>   				.name = "Terratec Cinergy T Stick Black",
> @@ -1279,6 +1298,12 @@ static struct dvb_usb_device_properties rtl28xxu_properties[] = {
>   					&rtl28xxu_table[RTL2832U_1F4D_B803],
>   				},
>   			},
> +			{
> +				.name = "NOXON DAB/DAB+ USB dongle",
> +				.warm_ids = {
> +					&rtl28xxu_table[RTL2832U_0CCD_00B3],
> +				},
> +			},
>   		}
>   	},
>


-- 
http://palosaari.fi/

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [PATCH v4 0/5] support for rtl2832
  2012-05-16 22:13 ` [PATCH v4 0/5] support for rtl2832 Thomas Mair
                     ` (4 preceding siblings ...)
  2012-05-16 22:13   ` [PATCH v4 5/5] rtl28xxu: support Terratec Noxon DAB/DAB+ stick Thomas Mair
@ 2012-05-17 14:53   ` Antti Palosaari
  5 siblings, 0 replies; 104+ messages in thread
From: Antti Palosaari @ 2012-05-17 14:53 UTC (permalink / raw)
  To: Thomas Mair; +Cc: pomidorabelisima, Linux Media Mailing List

On 17.05.2012 01:13, Thomas Mair wrote:
> This is the new version of the patch series to add support for the
> rtl2832 demodulator driver. Before applying the patches you need to
> add the fc0012/fc0013 driver from Hans-Frider Vogt.

Who wants to review those tuner drivers?

> The changes from the privious version of the patches are manly in the
> rtl2832 demod driver to fix code style issues, a nasty bug in the
> frontends Makefile and the removal of the signal statistics functionality
> which was badly broken in version 0.3 of the driver.
>
> The one thing that I am not really confident with is the Kconfig file for
> the dvb frontend driver. Are the changes I made right? And if not what
> kind of changes need to be made?
>
> Thanks Antti and poma for your comments!


I have reviewed all patches and commented some issues. Those are after 
all relative small issues you can sent just new patch top of that to fix 
or rebase whole patch series and sent new. It is up to you.


regards
Antti

>
> Regards
> Thomas
>
> Thomas Mair (5):
>    rtl2832 ver. 0.4: removed signal statistics
>    rtl28xxu: support for the rtl2832 demod driver
>    rtl28xxu: renamed rtl2831_rd/rtl2831_wr to rtl28xx_rd/rtl28xx_wr
>    rtl28xxu: support G-Tek Electronics Group Lifeview LV5TDLX DVB-T
>    rtl28xxu: support Terratec Noxon DAB/DAB+ stick
>
>   drivers/media/dvb/dvb-usb/Kconfig          |    3 +
>   drivers/media/dvb/dvb-usb/dvb-usb-ids.h    |    3 +
>   drivers/media/dvb/dvb-usb/rtl28xxu.c       |  513 ++++++++++++++++--
>   drivers/media/dvb/frontends/Kconfig        |    7 +
>   drivers/media/dvb/frontends/Makefile       |    1 +
>   drivers/media/dvb/frontends/rtl2832.c      |  825 ++++++++++++++++++++++++++++
>   drivers/media/dvb/frontends/rtl2832.h      |   74 +++
>   drivers/media/dvb/frontends/rtl2832_priv.h |  258 +++++++++
>   8 files changed, 1636 insertions(+), 48 deletions(-)
>   create mode 100644 drivers/media/dvb/frontends/rtl2832.c
>   create mode 100644 drivers/media/dvb/frontends/rtl2832.h
>   create mode 100644 drivers/media/dvb/frontends/rtl2832_priv.h
>


-- 
http://palosaari.fi/

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [PATCH v4 1/5] rtl2832 ver. 0.4: removed signal statistics
  2012-05-17 14:19     ` Antti Palosaari
@ 2012-05-17 20:27       ` poma
  2012-05-17 20:41         ` Antti Palosaari
  2012-05-18  0:55       ` poma
  1 sibling, 1 reply; 104+ messages in thread
From: poma @ 2012-05-17 20:27 UTC (permalink / raw)
  To: Antti Palosaari, Thomas Mair, linux-media

[-- Attachment #1: Type: text/plain, Size: 41479 bytes --]

On 05/17/2012 04:19 PM, Antti Palosaari wrote:
> Moikka Thomas,
> 
> Here is the review. See comments below.
> 
> And conclusion is that it is ready for the Kernel merge. I did not see
> any big functiuonality problems - only some small issues that are likely
> considered as a coding style etc. Feel free to fix those and sent new
> patc serie or just new patch top of that.
> 
> Reviewed-by: Antti Palosaari <crope@iki.fi>
> 
> 
> On 17.05.2012 01:13, Thomas Mair wrote:
>> Changelog for ver. 0.3:
>> - removed statistics as their calculation was wrong
>> - fixed bug in Makefile
>> - indentation and code style improvements
>>
>> Signed-off-by: Thomas Mair<thomas.mair86@googlemail.com>
>> ---
>>   drivers/media/dvb/frontends/Kconfig        |    7 +
>>   drivers/media/dvb/frontends/Makefile       |    1 +
>>   drivers/media/dvb/frontends/rtl2832.c      |  825
>> ++++++++++++++++++++++++++++
>>   drivers/media/dvb/frontends/rtl2832.h      |   74 +++
>>   drivers/media/dvb/frontends/rtl2832_priv.h |  258 +++++++++
>>   5 files changed, 1165 insertions(+), 0 deletions(-)
>>   create mode 100644 drivers/media/dvb/frontends/rtl2832.c
>>   create mode 100644 drivers/media/dvb/frontends/rtl2832.h
>>   create mode 100644 drivers/media/dvb/frontends/rtl2832_priv.h
>>
>> diff --git a/drivers/media/dvb/frontends/Kconfig
>> b/drivers/media/dvb/frontends/Kconfig
>> index f479834..f7d67d7 100644
>> --- a/drivers/media/dvb/frontends/Kconfig
>> +++ b/drivers/media/dvb/frontends/Kconfig
>> @@ -432,6 +432,13 @@ config DVB_RTL2830
>>       help
>>         Say Y when you want to support this frontend.
>>
>> +config DVB_RTL2832
>> +    tristate "Realtek RTL2832 DVB-T"
>> +    depends on DVB_CORE&&  I2C
>> +    default m if DVB_FE_CUSTOMISE
>> +    help
>> +      Say Y when you want to support this frontend.
>> +
> 
> It is correct.
> 
> Just for the comment as you said in cover letter that you are unsure
> about that.
> 
>>   comment "DVB-C (cable) frontends"
>>       depends on DVB_CORE
>>
>> diff --git a/drivers/media/dvb/frontends/Makefile
>> b/drivers/media/dvb/frontends/Makefile
>> index b0381dc..bbf2955 100644
>> --- a/drivers/media/dvb/frontends/Makefile
>> +++ b/drivers/media/dvb/frontends/Makefile
>> @@ -98,6 +98,7 @@ obj-$(CONFIG_DVB_IT913X_FE) += it913x-fe.o
>>   obj-$(CONFIG_DVB_A8293) += a8293.o
>>   obj-$(CONFIG_DVB_TDA10071) += tda10071.o
>>   obj-$(CONFIG_DVB_RTL2830) += rtl2830.o
>> +obj-$(CONFIG_DVB_RTL2830) += rtl2832.o
>>   obj-$(CONFIG_DVB_M88RS2000) += m88rs2000.o
>>   obj-$(CONFIG_DVB_AF9033) += af9033.o
>>
>> diff --git a/drivers/media/dvb/frontends/rtl2832.c
>> b/drivers/media/dvb/frontends/rtl2832.c
>> new file mode 100644
>> index 0000000..51c7927
>> --- /dev/null
>> +++ b/drivers/media/dvb/frontends/rtl2832.c
>> @@ -0,0 +1,825 @@
>> +/*
>> + * Realtek RTL2832 DVB-T demodulator driver
>> + *
>> + * Copyright (C) 2012 Thomas Mair<thomas.mair86@gmail.com>
>> + *
>> + *    This program is free software; you can redistribute it and/or
>> modify
>> + *    it under the terms of the GNU General Public License as
>> published by
>> + *    the Free Software Foundation; either version 2 of the License, or
>> + *    (at your option) any later version.
>> + *
>> + *    This program is distributed in the hope that it will be useful,
>> + *    but WITHOUT ANY WARRANTY; without even the implied warranty of
>> + *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>> + *    GNU General Public License for more details.
>> + *
>> + *    You should have received a copy of the GNU General Public
>> License along
>> + *    with this program; if not, write to the Free Software
>> Foundation, Inc.,
>> + *    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
>> + */
>> +
>> +#include "rtl2832_priv.h"
>> +
>> +
>> +int rtl2832_debug;
>> +module_param_named(debug, rtl2832_debug, int, 0644);
>> +MODULE_PARM_DESC(debug, "Turn on/off frontend debugging
>> (default:off).");
>> +
>> +
>> +static int reg_mask[32] = {
> 
> This should be static const.
> 
>> +    0x00000001,
>> +    0x00000003,
>> +    0x00000007,
>> +    0x0000000f,
>> +    0x0000001f,
>> +    0x0000003f,
>> +    0x0000007f,
>> +    0x000000ff,
>> +    0x000001ff,
>> +    0x000003ff,
>> +    0x000007ff,
>> +    0x00000fff,
>> +    0x00001fff,
>> +    0x00003fff,
>> +    0x00007fff,
>> +    0x0000ffff,
>> +    0x0001ffff,
>> +    0x0003ffff,
>> +    0x0007ffff,
>> +    0x000fffff,
>> +    0x001fffff,
>> +    0x003fffff,
>> +    0x007fffff,
>> +    0x00ffffff,
>> +    0x01ffffff,
>> +    0x03ffffff,
>> +    0x07ffffff,
>> +    0x0fffffff,
>> +    0x1fffffff,
>> +    0x3fffffff,
>> +    0x7fffffff,
>> +    0xffffffff
>> +};
>> +
>> +struct rtl2832_reg_entry registers[] = {
> 
> static const struct
> 
>> +    [DVBT_SOFT_RST]        = {0x1, 0x1,   2, 2},
>> +    [DVBT_IIC_REPEAT]    = {0x1, 0x1,   3, 3},
>> +    [DVBT_TR_WAIT_MIN_8K]    = {0x1, 0x88, 11, 2},
>> +    [DVBT_RSD_BER_FAIL_VAL]    = {0x1, 0x8f, 15, 0},
>> +    [DVBT_EN_BK_TRK]    = {0x1, 0xa6,  7, 7},
>> +    [DVBT_AD_EN_REG]    = {0x0, 0x8,   7, 7},
>> +    [DVBT_AD_EN_REG1]    = {0x0, 0x8,   6, 6},
>> +    [DVBT_EN_BBIN]        = {0x1, 0xb1,  0, 0},
>> +    [DVBT_MGD_THD0]        = {0x1, 0x95,  7, 0},
>> +    [DVBT_MGD_THD1]        = {0x1, 0x96,  7, 0},
>> +    [DVBT_MGD_THD2]        = {0x1, 0x97,  7, 0},
>> +    [DVBT_MGD_THD3]        = {0x1, 0x98,  7, 0},
>> +    [DVBT_MGD_THD4]        = {0x1, 0x99,  7, 0},
>> +    [DVBT_MGD_THD5]        = {0x1, 0x9a,  7, 0},
>> +    [DVBT_MGD_THD6]        = {0x1, 0x9b,  7, 0},
>> +    [DVBT_MGD_THD7]        = {0x1, 0x9c,  7, 0},
>> +    [DVBT_EN_CACQ_NOTCH]    = {0x1, 0x61,  4, 4},
>> +    [DVBT_AD_AV_REF]    = {0x0, 0x9,   6, 0},
>> +    [DVBT_REG_PI]        = {0x0, 0xa,   2, 0},
>> +    [DVBT_PIP_ON]        = {0x0, 0x21,  3, 3},
>> +    [DVBT_SCALE1_B92]    = {0x2, 0x92,  7, 0},
>> +    [DVBT_SCALE1_B93]    = {0x2, 0x93,  7, 0},
>> +    [DVBT_SCALE1_BA7]    = {0x2, 0xa7,  7, 0},
>> +    [DVBT_SCALE1_BA9]    = {0x2, 0xa9,  7, 0},
>> +    [DVBT_SCALE1_BAA]    = {0x2, 0xaa,  7, 0},
>> +    [DVBT_SCALE1_BAB]    = {0x2, 0xab,  7, 0},
>> +    [DVBT_SCALE1_BAC]    = {0x2, 0xac,  7, 0},
>> +    [DVBT_SCALE1_BB0]    = {0x2, 0xb0,  7, 0},
>> +    [DVBT_SCALE1_BB1]    = {0x2, 0xb1,  7, 0},
>> +    [DVBT_KB_P1]        = {0x1, 0x64,  3, 1},
>> +    [DVBT_KB_P2]        = {0x1, 0x64,  6, 4},
>> +    [DVBT_KB_P3]        = {0x1, 0x65,  2, 0},
>> +    [DVBT_OPT_ADC_IQ]    = {0x0, 0x6,   5, 4},
>> +    [DVBT_AD_AVI]        = {0x0, 0x9,   1, 0},
>> +    [DVBT_AD_AVQ]        = {0x0, 0x9,   3, 2},
>> +    [DVBT_K1_CR_STEP12]    = {0x2, 0xad,  9, 4},
>> +    [DVBT_TRK_KS_P2]    = {0x1, 0x6f,  2, 0},
>> +    [DVBT_TRK_KS_I2]    = {0x1, 0x70,  5, 3},
>> +    [DVBT_TR_THD_SET2]    = {0x1, 0x72,  3, 0},
>> +    [DVBT_TRK_KC_P2]    = {0x1, 0x73,  5, 3},
>> +    [DVBT_TRK_KC_I2]    = {0x1, 0x75,  2, 0},
>> +    [DVBT_CR_THD_SET2]    = {0x1, 0x76,  7, 6},
>> +    [DVBT_PSET_IFFREQ]    = {0x1, 0x19, 21, 0},
>> +    [DVBT_SPEC_INV]        = {0x1, 0x15,  0, 0},
>> +    [DVBT_RSAMP_RATIO]    = {0x1, 0x9f, 27, 2},
>> +    [DVBT_CFREQ_OFF_RATIO]    = {0x1, 0x9d, 23, 4},
>> +    [DVBT_FSM_STAGE]    = {0x3, 0x51,  6, 3},
>> +    [DVBT_RX_CONSTEL]    = {0x3, 0x3c,  3, 2},
>> +    [DVBT_RX_HIER]        = {0x3, 0x3c,  6, 4},
>> +    [DVBT_RX_C_RATE_LP]    = {0x3, 0x3d,  2, 0},
>> +    [DVBT_RX_C_RATE_HP]    = {0x3, 0x3d,  5, 3},
>> +    [DVBT_GI_IDX]        = {0x3, 0x51,  1, 0},
>> +    [DVBT_FFT_MODE_IDX]    = {0x3, 0x51,  2, 2},
>> +    [DVBT_RSD_BER_EST]    = {0x3, 0x4e, 15, 0},
>> +    [DVBT_CE_EST_EVM]    = {0x4, 0xc,  15, 0},
>> +    [DVBT_RF_AGC_VAL]    = {0x3, 0x5b, 13, 0},
>> +    [DVBT_IF_AGC_VAL]    = {0x3, 0x59, 13, 0},
>> +    [DVBT_DAGC_VAL]        = {0x3, 0x5,   7, 0},
>> +    [DVBT_SFREQ_OFF]    = {0x3, 0x18, 13, 0},
>> +    [DVBT_CFREQ_OFF]    = {0x3, 0x5f, 17, 0},
>> +    [DVBT_POLAR_RF_AGC]    = {0x0, 0xe,   1, 1},
>> +    [DVBT_POLAR_IF_AGC]    = {0x0, 0xe,   0, 0},
>> +    [DVBT_AAGC_HOLD]    = {0x1, 0x4,   5, 5},
>> +    [DVBT_EN_RF_AGC]    = {0x1, 0x4,   6, 6},
>> +    [DVBT_EN_IF_AGC]    = {0x1, 0x4,   7, 7},
>> +    [DVBT_IF_AGC_MIN]    = {0x1, 0x8,   7, 0},
>> +    [DVBT_IF_AGC_MAX]    = {0x1, 0x9,   7, 0},
>> +    [DVBT_RF_AGC_MIN]    = {0x1, 0xa,   7, 0},
>> +    [DVBT_RF_AGC_MAX]    = {0x1, 0xb,   7, 0},
>> +    [DVBT_IF_AGC_MAN]    = {0x1, 0xc,   6, 6},
>> +    [DVBT_IF_AGC_MAN_VAL]    = {0x1, 0xc,  13, 0},
>> +    [DVBT_RF_AGC_MAN]    = {0x1, 0xe,   6, 6},
>> +    [DVBT_RF_AGC_MAN_VAL]    = {0x1, 0xe,  13, 0},
>> +    [DVBT_DAGC_TRG_VAL]    = {0x1, 0x12,  7, 0},
>> +    [DVBT_AGC_TARG_VAL_0]    = {0x1, 0x2,   0, 0},
>> +    [DVBT_AGC_TARG_VAL_8_1]    = {0x1, 0x3,   7, 0},
>> +    [DVBT_AAGC_LOOP_GAIN]    = {0x1, 0xc7,  5, 1},
>> +    [DVBT_LOOP_GAIN2_3_0]    = {0x1, 0x4,   4, 1},
>> +    [DVBT_LOOP_GAIN2_4]    = {0x1, 0x5,   7, 7},
>> +    [DVBT_LOOP_GAIN3]    = {0x1, 0xc8,  4, 0},
>> +    [DVBT_VTOP1]        = {0x1, 0x6,   5, 0},
>> +    [DVBT_VTOP2]        = {0x1, 0xc9,  5, 0},
>> +    [DVBT_VTOP3]        = {0x1, 0xca,  5, 0},
>> +    [DVBT_KRF1]        = {0x1, 0xcb,  7, 0},
>> +    [DVBT_KRF2]        = {0x1, 0x7,   7, 0},
>> +    [DVBT_KRF3]        = {0x1, 0xcd,  7, 0},
>> +    [DVBT_KRF4]        = {0x1, 0xce,  7, 0},
>> +    [DVBT_EN_GI_PGA]    = {0x1, 0xe5,  0, 0},
>> +    [DVBT_THD_LOCK_UP]    = {0x1, 0xd9,  8, 0},
>> +    [DVBT_THD_LOCK_DW]    = {0x1, 0xdb,  8, 0},
>> +    [DVBT_THD_UP1]        = {0x1, 0xdd,  7, 0},
>> +    [DVBT_THD_DW1]        = {0x1, 0xde,  7, 0},
>> +    [DVBT_INTER_CNT_LEN]    = {0x1, 0xd8,  3, 0},
>> +    [DVBT_GI_PGA_STATE]    = {0x1, 0xe6,  3, 3},
>> +    [DVBT_EN_AGC_PGA]    = {0x1, 0xd7,  0, 0},
>> +    [DVBT_CKOUTPAR]        = {0x1, 0x7b,  5, 5},
>> +    [DVBT_CKOUT_PWR]    = {0x1, 0x7b,  6, 6},
>> +    [DVBT_SYNC_DUR]        = {0x1, 0x7b,  7, 7},
>> +    [DVBT_ERR_DUR]        = {0x1, 0x7c,  0, 0},
>> +    [DVBT_SYNC_LVL]        = {0x1, 0x7c,  1, 1},
>> +    [DVBT_ERR_LVL]        = {0x1, 0x7c,  2, 2},
>> +    [DVBT_VAL_LVL]        = {0x1, 0x7c,  3, 3},
>> +    [DVBT_SERIAL]        = {0x1, 0x7c,  4, 4},
>> +    [DVBT_SER_LSB]        = {0x1, 0x7c,  5, 5},
>> +    [DVBT_CDIV_PH0]        = {0x1, 0x7d,  3, 0},
>> +    [DVBT_CDIV_PH1]        = {0x1, 0x7d,  7, 4},
>> +    [DVBT_MPEG_IO_OPT_2_2]    = {0x0, 0x6,   7, 7},
>> +    [DVBT_MPEG_IO_OPT_1_0]    = {0x0, 0x7,   7, 6},
>> +    [DVBT_CKOUTPAR_PIP]    = {0x0, 0xb7,  4, 4},
>> +    [DVBT_CKOUT_PWR_PIP]    = {0x0, 0xb7,  3, 3},
>> +    [DVBT_SYNC_LVL_PIP]    = {0x0, 0xb7,  2, 2},
>> +    [DVBT_ERR_LVL_PIP]    = {0x0, 0xb7,  1, 1},
>> +    [DVBT_VAL_LVL_PIP]    = {0x0, 0xb7,  0, 0},
>> +    [DVBT_CKOUTPAR_PID]    = {0x0, 0xb9,  4, 4},
>> +    [DVBT_CKOUT_PWR_PID]    = {0x0, 0xb9,  3, 3},
>> +    [DVBT_SYNC_LVL_PID]    = {0x0, 0xb9,  2, 2},
>> +    [DVBT_ERR_LVL_PID]    = {0x0, 0xb9,  1, 1},
>> +    [DVBT_VAL_LVL_PID]    = {0x0, 0xb9,  0, 0},
>> +    [DVBT_SM_PASS]        = {0x1, 0x93, 11, 0},
>> +    [DVBT_AD7_SETTING]    = {0x0, 0x11, 15, 0},
>> +    [DVBT_RSSI_R]        = {0x3, 0x1,   6, 0},
>> +    [DVBT_ACI_DET_IND]    = {0x3, 0x12,  0, 0},
>> +    [DVBT_REG_MON]        = {0x0, 0xd,   1, 0},
>> +    [DVBT_REG_MONSEL]    = {0x0, 0xd,   2, 2},
>> +    [DVBT_REG_GPE]        = {0x0, 0xd,   7, 7},
>> +    [DVBT_REG_GPO]        = {0x0, 0x10,  0, 0},
>> +    [DVBT_REG_4MSEL]    = {0x0, 0x13,  0, 0},
>> +};
>> +
>> +/* write multiple hardware registers */
>> +static int rtl2832_wr(struct rtl2832_priv *priv, u8 reg, u8 *val, int
>> len)
>> +{
>> +    int ret;
>> +    u8 buf[1+len];
>> +    struct i2c_msg msg[1] = {
>> +        {
>> +            .addr = priv->cfg.i2c_addr,
>> +            .flags = 0,
>> +            .len = 1+len,
>> +            .buf = buf,
>> +        }
>> +    };
>> +
>> +    buf[0] = reg;
>> +    memcpy(&buf[1], val, len);
>> +
>> +    ret = i2c_transfer(priv->i2c, msg, 1);
>> +    if (ret == 1) {
>> +        ret = 0;
>> +    } else {
>> +        warn("i2c wr failed=%d reg=%02x len=%d", ret, reg, len);
>> +        ret = -EREMOTEIO;
>> +    }
>> +    return ret;
>> +}
>> +
>> +/* read multiple hardware registers */
>> +static int rtl2832_rd(struct rtl2832_priv *priv, u8 reg, u8 *val, int
>> len)
>> +{
>> +    int ret;
>> +    struct i2c_msg msg[2] = {
>> +        {
>> +            .addr = priv->cfg.i2c_addr,
>> +            .flags = 0,
>> +            .len = 1,
>> +            .buf =&reg,
>> +        }, {
>> +            .addr = priv->cfg.i2c_addr,
>> +            .flags = I2C_M_RD,
>> +            .len = len,
>> +            .buf = val,
>> +        }
>> +    };
>> +
>> +    ret = i2c_transfer(priv->i2c, msg, 2);
>> +    if (ret == 2) {
>> +        ret = 0;
>> +    } else {
>> +        warn("i2c rd failed=%d reg=%02x len=%d", ret, reg, len);
>> +        ret = -EREMOTEIO;
>> +}
>> +return ret;
>> +}
>> +
>> +/* write multiple registers */
>> +static int rtl2832_wr_regs(struct rtl2832_priv *priv, u8 reg, u8
>> page, u8 *val,
>> +    int len)
>> +{
>> +    int ret;
>> +
>> +
>> +    /* switch bank if needed */
>> +    if (page != priv->page) {
>> +        ret = rtl2832_wr(priv, 0x00,&page, 1);
>> +        if (ret)
>> +            return ret;
>> +
>> +        priv->page = page;
>> +}
>> +
>> +return rtl2832_wr(priv, reg, val, len);
>> +}
>> +
>> +/* read multiple registers */
>> +static int rtl2832_rd_regs(struct rtl2832_priv *priv, u8 reg, u8
>> page, u8 *val,
>> +    int len)
>> +{
>> +    int ret;
>> +
>> +    /* switch bank if needed */
>> +    if (page != priv->page) {
>> +        ret = rtl2832_wr(priv, 0x00,&page, 1);
>> +        if (ret)
>> +            return ret;
>> +
>> +        priv->page = page;
>> +    }
>> +
>> +    return rtl2832_rd(priv, reg, val, len);
>> +}
>> +
>> +#if 0 /* currently not used */
>> +/* write single register */
>> +static int rtl2832_wr_reg(struct rtl2832_priv *priv, u8 reg, u8 page,
>> u8 val)
>> +{
>> +    return rtl2832_wr_regs(priv, reg, page,&val, 1);
>> +}
>> +#endif
>> +
>> +/* read single register */
>> +static int rtl2832_rd_reg(struct rtl2832_priv *priv, u8 reg, u8 page,
>> u8 *val)
>> +{
>> +    return rtl2832_rd_regs(priv, reg, page, val, 1);
>> +}
>> +
>> +int rtl2832_rd_demod_reg(struct rtl2832_priv *priv, int reg, u32 *val)
>> +{
>> +    int ret;
>> +
>> +    u8 reg_start_addr;
>> +    u8 msb, lsb;
>> +    u8 page;
>> +    u8 reading[4];
>> +    u32 reading_tmp;
>> +    int i;
>> +
>> +    u8 len;
>> +    u32 mask;
>> +
>> +    reg_start_addr = registers[reg].start_address;
>> +    msb = registers[reg].msb;
>> +    lsb = registers[reg].lsb;
>> +    page = registers[reg].page;
>> +
>> +    len = (msb>>  3) + 1;
>> +    mask = reg_mask[msb-lsb];
> 
> You should use spaces here. See Documentation/CodingStyle line 206.
> 
>> +
>> +
>> +    ret = rtl2832_rd_regs(priv, reg_start_addr, page,&reading[0], len);
>> +    if (ret)
>> +        goto err;
>> +
>> +    reading_tmp = 0;
>> +    for (i = 0; i<  len; i++)
>> +        reading_tmp |= reading[i]<<  ((len-1-i)*8);
> 
> You should use spaces here. See Documentation/CodingStyle line 206.
> 
>> +
>> +    *val = (reading_tmp>>  lsb)&  mask;
>> +
>> +    return ret;
>> +
>> +err:
>> +    dbg("%s: failed=%d", __func__, ret);
>> +    return ret;
>> +
>> +}
>> +
>> +int rtl2832_wr_demod_reg(struct rtl2832_priv *priv, int reg, u32 val)
>> +{
>> +    int ret, i;
>> +    u8 len;
>> +    u8 reg_start_addr;
>> +    u8 msb, lsb;
>> +    u8 page;
>> +    u32 mask;
>> +
>> +
>> +    u8 reading[4];
>> +    u8 writing[4];
>> +    u32 reading_tmp;
>> +    u32 writing_tmp;
>> +
>> +
>> +    reg_start_addr = registers[reg].start_address;
>> +    msb = registers[reg].msb;
>> +    lsb = registers[reg].lsb;
>> +    page = registers[reg].page;
>> +
>> +    len = (msb>>  3) + 1;
>> +    mask = reg_mask[msb-lsb];
> 
> You should use spaces here. See Documentation/CodingStyle line 206.
> 
>> +
>> +
>> +    ret = rtl2832_rd_regs(priv, reg_start_addr, page,&reading[0], len);
>> +    if (ret)
>> +        goto err;
>> +
>> +    reading_tmp = 0;
>> +    for (i = 0; i<  len; i++)
>> +        reading_tmp |= reading[i]<<  ((len-1-i)*8);
> 
> You should use spaces here. See Documentation/CodingStyle line 206.
> 
>> +
>> +    writing_tmp = reading_tmp&  ~(mask<<  lsb);
>> +    writing_tmp |= ((val&  mask)<<  lsb);
>> +
>> +
>> +    for (i = 0; i<  len; i++)
>> +        writing[i] = (writing_tmp>>  ((len-1-i)*8))&  0xff;
> 
> You should use spaces here. See Documentation/CodingStyle line 206.
> 
>> +
>> +    ret = rtl2832_wr_regs(priv, reg_start_addr, page,&writing[0], len);
>> +    if (ret)
>> +        goto err;
>> +
>> +    return ret;
>> +
>> +err:
>> +    dbg("%s: failed=%d", __func__, ret);
>> +    return ret;
>> +
>> +}
>> +
>> +
>> +static int rtl2832_i2c_gate_ctrl(struct dvb_frontend *fe, int enable)
>> +{
>> +    int ret;
>> +    struct rtl2832_priv *priv = fe->demodulator_priv;
>> +
>> +    dbg("%s: enable=%d", __func__, enable);
>> +
>> +    /* gate already open or close */
>> +    if (priv->i2c_gate_state == enable)
>> +        return 0;
>> +
>> +    ret = rtl2832_wr_demod_reg(priv, DVBT_IIC_REPEAT, (enable ? 0x1 :
>> 0x0));
>> +
>> +    if (ret)
>> +        goto err;
> 
> Excessive newline between function call and error check.
> 
>> +
>> +    priv->i2c_gate_state = enable;
>> +
>> +    return ret;
>> +err:
>> +    dbg("%s: failed=%d", __func__, ret);
>> +    return ret;
>> +}
>> +
>> +
>> +
>> +static int rtl2832_init(struct dvb_frontend *fe)
>> +{
>> +    struct rtl2832_priv *priv = fe->demodulator_priv;
>> +    int i, ret;
>> +
>> +    u8 en_bbin;
>> +    u64 pset_iffreq;
>> +
>> +    /* initialization values for the demodulator registers */
>> +    struct rtl2832_reg_value rtl2832_initial_regs[] = {
>> +        {DVBT_AD_EN_REG,        0x1},
>> +        {DVBT_AD_EN_REG1,        0x1},
>> +        {DVBT_RSD_BER_FAIL_VAL,        0x2800},
>> +        {DVBT_MGD_THD0,            0x10},
>> +        {DVBT_MGD_THD1,            0x20},
>> +        {DVBT_MGD_THD2,            0x20},
>> +        {DVBT_MGD_THD3,            0x40},
>> +        {DVBT_MGD_THD4,            0x22},
>> +        {DVBT_MGD_THD5,            0x32},
>> +        {DVBT_MGD_THD6,            0x37},
>> +        {DVBT_MGD_THD7,            0x39},
>> +        {DVBT_EN_BK_TRK,        0x0},
>> +        {DVBT_EN_CACQ_NOTCH,        0x0},
>> +        {DVBT_AD_AV_REF,        0x2a},
>> +        {DVBT_REG_PI,            0x6},
>> +        {DVBT_PIP_ON,            0x0},
>> +        {DVBT_CDIV_PH0,            0x8},
>> +        {DVBT_CDIV_PH1,            0x8},
>> +        {DVBT_SCALE1_B92,        0x4},
>> +        {DVBT_SCALE1_B93,        0xb0},
>> +        {DVBT_SCALE1_BA7,        0x78},
>> +        {DVBT_SCALE1_BA9,        0x28},
>> +        {DVBT_SCALE1_BAA,        0x59},
>> +        {DVBT_SCALE1_BAB,        0x83},
>> +        {DVBT_SCALE1_BAC,        0xd4},
>> +        {DVBT_SCALE1_BB0,        0x65},
>> +        {DVBT_SCALE1_BB1,        0x43},
>> +        {DVBT_KB_P1,            0x1},
>> +        {DVBT_KB_P2,            0x4},
>> +        {DVBT_KB_P3,            0x7},
>> +        {DVBT_K1_CR_STEP12,        0xa},
>> +        {DVBT_REG_GPE,            0x1},
>> +        {DVBT_SERIAL,            0x0},
>> +        {DVBT_CDIV_PH0,            0x9},
>> +        {DVBT_CDIV_PH1,            0x9},
>> +        {DVBT_MPEG_IO_OPT_2_2,        0x0},
>> +        {DVBT_MPEG_IO_OPT_1_0,        0x0},
>> +        {DVBT_TRK_KS_P2,        0x4},
>> +        {DVBT_TRK_KS_I2,        0x7},
>> +        {DVBT_TR_THD_SET2,        0x6},
>> +        {DVBT_TRK_KC_I2,        0x5},
>> +        {DVBT_CR_THD_SET2,        0x1},
>> +        {DVBT_SPEC_INV,            0x0},
>> +        {DVBT_DAGC_TRG_VAL,        0x5a},
>> +        {DVBT_AGC_TARG_VAL_0,        0x0},
>> +        {DVBT_AGC_TARG_VAL_8_1,        0x5a},
>> +        {DVBT_AAGC_LOOP_GAIN,        0x16},
>> +        {DVBT_LOOP_GAIN2_3_0,        0x6},
>> +        {DVBT_LOOP_GAIN2_4,        0x1},
>> +        {DVBT_LOOP_GAIN3,        0x16},
>> +        {DVBT_VTOP1,            0x35},
>> +        {DVBT_VTOP2,            0x21},
>> +        {DVBT_VTOP3,            0x21},
>> +        {DVBT_KRF1,            0x0},
>> +        {DVBT_KRF2,            0x40},
>> +        {DVBT_KRF3,            0x10},
>> +        {DVBT_KRF4,            0x10},
>> +        {DVBT_IF_AGC_MIN,        0x80},
>> +        {DVBT_IF_AGC_MAX,        0x7f},
>> +        {DVBT_RF_AGC_MIN,        0x80},
>> +        {DVBT_RF_AGC_MAX,        0x7f},
>> +        {DVBT_POLAR_RF_AGC,        0x0},
>> +        {DVBT_POLAR_IF_AGC,        0x0},
>> +        {DVBT_AD7_SETTING,        0xe9bf},
>> +        {DVBT_EN_GI_PGA,        0x0},
>> +        {DVBT_THD_LOCK_UP,        0x0},
>> +        {DVBT_THD_LOCK_DW,        0x0},
>> +        {DVBT_THD_UP1,            0x11},
>> +        {DVBT_THD_DW1,            0xef},
>> +        {DVBT_INTER_CNT_LEN,        0xc},
>> +        {DVBT_GI_PGA_STATE,        0x0},
>> +        {DVBT_EN_AGC_PGA,        0x1},
>> +        {DVBT_IF_AGC_MAN,        0x0},
>> +    };
>> +
>> +
>> +    dbg("%s", __func__);
>> +
>> +    en_bbin = (priv->cfg.if_dvbt == 0 ? 0x1 : 0x0);
>> +
>> +    /*
>> +    * PSET_IFFREQ = - floor((IfFreqHz % CrystalFreqHz) * pow(2, 22)
>> +    *        / CrystalFreqHz)
>> +    */
>> +    pset_iffreq = priv->cfg.if_dvbt % priv->cfg.xtal;
>> +    pset_iffreq *= 0x400000;
>> +    pset_iffreq = div_u64(pset_iffreq, priv->cfg.xtal);
>> +    pset_iffreq = pset_iffreq&  0x3fffff;
>> +
>> +
>> +
>> +    for (i = 0; i<  ARRAY_SIZE(rtl2832_initial_regs); i++) {
>> +        ret = rtl2832_wr_demod_reg(priv, rtl2832_initial_regs[i].reg,
>> +            rtl2832_initial_regs[i].value);
>> +        if (ret)
>> +            goto err;
>> +    }
>> +
>> +    /* if frequency settings */
>> +    ret = rtl2832_wr_demod_reg(priv, DVBT_EN_BBIN, en_bbin);
>> +        if (ret)
>> +            goto err;
>> +
>> +    ret = rtl2832_wr_demod_reg(priv, DVBT_PSET_IFFREQ, pset_iffreq);
>> +        if (ret)
>> +            goto err;
>> +
>> +    priv->sleeping = false;
>> +
>> +    return ret;
>> +
>> +err:
>> +    dbg("%s: failed=%d", __func__, ret);
>> +    return ret;
>> +}
>> +
>> +static int rtl2832_sleep(struct dvb_frontend *fe)
>> +{
>> +    struct rtl2832_priv *priv = fe->demodulator_priv;
>> +
>> +    dbg("%s", __func__);
>> +    priv->sleeping = true;
>> +    return 0;
>> +}
>> +
>> +int rtl2832_get_tune_settings(struct dvb_frontend *fe,
>> +    struct dvb_frontend_tune_settings *s)
>> +{
>> +    dbg("%s", __func__);
>> +    s->min_delay_ms = 1000;
>> +    s->step_size = fe->ops.info.frequency_stepsize * 2;
>> +    s->max_drift = (fe->ops.info.frequency_stepsize * 2) + 1;
>> +    return 0;
>> +}
>> +
>> +static int rtl2832_set_frontend(struct dvb_frontend *fe)
>> +{
>> +    struct rtl2832_priv *priv = fe->demodulator_priv;
>> +    struct dtv_frontend_properties *c =&fe->dtv_property_cache;
>> +    int ret, i, j;
>> +    u64 bw_mode, num, num2;
>> +    u32 resamp_ratio, cfreq_off_ratio;
>> +
>> +
>> +    static u8 bw_params[3][32] = {
>> +    /* 6 MHz bandwidth */
>> +        {
>> +        0xf5, 0xff, 0x15, 0x38, 0x5d, 0x6d, 0x52, 0x07, 0xfa, 0x2f,
>> +        0x53, 0xf5, 0x3f, 0xca, 0x0b, 0x91, 0xea, 0x30, 0x63, 0xb2,
>> +        0x13, 0xda, 0x0b, 0xc4, 0x18, 0x7e, 0x16, 0x66, 0x08, 0x67,
>> +        0x19, 0xe0,
>> +        },
>> +
>> +    /*  7 MHz bandwidth */
>> +        {
>> +        0xe7, 0xcc, 0xb5, 0xba, 0xe8, 0x2f, 0x67, 0x61, 0x00, 0xaf,
>> +        0x86, 0xf2, 0xbf, 0x59, 0x04, 0x11, 0xb6, 0x33, 0xa4, 0x30,
>> +        0x15, 0x10, 0x0a, 0x42, 0x18, 0xf8, 0x17, 0xd9, 0x07, 0x22,
>> +        0x19, 0x10,
>> +        },
>> +
>> +    /*  8 MHz bandwidth */
>> +        {
>> +        0x09, 0xf6, 0xd2, 0xa7, 0x9a, 0xc9, 0x27, 0x77, 0x06, 0xbf,
>> +        0xec, 0xf4, 0x4f, 0x0b, 0xfc, 0x01, 0x63, 0x35, 0x54, 0xa7,
>> +        0x16, 0x66, 0x08, 0xb4, 0x19, 0x6e, 0x19, 0x65, 0x05, 0xc8,
>> +        0x19, 0xe0,
>> +        },
>> +    };
>> +
>> +
>> +    dbg("%s: frequency=%d bandwidth_hz=%d inversion=%d", __func__,
>> +        c->frequency, c->bandwidth_hz, c->inversion);
>> +
>> +
>> +    /* program tuner */
>> +    if (fe->ops.tuner_ops.set_params)
>> +        fe->ops.tuner_ops.set_params(fe);
>> +
>> +
>> +    switch (c->bandwidth_hz) {
>> +    case 6000000:
>> +        i = 0;
>> +        bw_mode = 48000000;
>> +        break;
>> +    case 7000000:
>> +        i = 1;
>> +        bw_mode = 56000000;
>> +        break;
>> +    case 8000000:
>> +        i = 2;
>> +        bw_mode = 64000000;
>> +        break;
>> +    default:
>> +        dbg("invalid bandwidth");
>> +        return -EINVAL;
>> +    }
>> +
>> +    for (j = 0; j<  sizeof(bw_params[j]); j++) {
>> +        ret = rtl2832_wr_regs(priv, 0x1c+j, 1,&bw_params[i][j], 1);
>> +        if (ret)
>> +            goto err;
>> +    }
>> +
>> +    /* calculate and set resample ratio
>> +    * RSAMP_RATIO = floor(CrystalFreqHz * 7 * pow(2, 22)
>> +    *    / ConstWithBandwidthMode)
>> +    */
>> +    num = priv->cfg.xtal * 7;
>> +    num *= 0x400000;
>> +    num = div_u64(num, bw_mode);
>> +    resamp_ratio =  num&  0x3ffffff;
>> +    ret = rtl2832_wr_demod_reg(priv, DVBT_RSAMP_RATIO, resamp_ratio);
>> +    if (ret)
>> +        goto err;
>> +
>> +    /* calculate and set cfreq off ratio
>> +    * CFREQ_OFF_RATIO = - floor(ConstWithBandwidthMode * pow(2, 20)
>> +    *    / (CrystalFreqHz * 7))
>> +    */
>> +    num = bw_mode<<  20;
>> +    num2 = priv->cfg.xtal * 7;
>> +    num = div_u64(num, num2);
>> +    num = -num;
>> +    cfreq_off_ratio = num&  0xfffff;
>> +    ret = rtl2832_wr_demod_reg(priv, DVBT_CFREQ_OFF_RATIO,
>> cfreq_off_ratio);
>> +    if (ret)
>> +        goto err;
>> +
>> +
>> +    /* soft reset */
>> +    ret = rtl2832_wr_demod_reg(priv, DVBT_SOFT_RST, 0x1);
>> +    if (ret)
>> +        goto err;
>> +
>> +    ret = rtl2832_wr_demod_reg(priv, DVBT_SOFT_RST, 0x0);
>> +    if (ret)
>> +        goto err;
>> +
>> +    return ret;
>> +err:
>> +    info("%s: failed=%d", __func__, ret);
>> +    return ret;
>> +}
>> +
>> +static int rtl2832_read_status(struct dvb_frontend *fe, fe_status_t
>> *status)
>> +{
>> +    struct rtl2832_priv *priv = fe->demodulator_priv;
>> +    int ret;
>> +    u32 tmp;
>> +    *status = 0;
>> +
>> +
>> +    dbg("%s", __func__);
>> +    if (priv->sleeping)
>> +        return 0;
>> +
>> +    ret = rtl2832_rd_demod_reg(priv, DVBT_FSM_STAGE,&tmp);
>> +    if (ret)
>> +        goto err;
>> +
>> +    if (tmp == 11) {
>> +        *status |= FE_HAS_SIGNAL | FE_HAS_CARRIER |
>> +                FE_HAS_VITERBI | FE_HAS_SYNC | FE_HAS_LOCK;
>> +    }
>> +    /* TODO find out if this is also true for rtl2832? */
>> +    /*else if (tmp == 10) {
>> +        *status |= FE_HAS_SIGNAL | FE_HAS_CARRIER |
>> +                FE_HAS_VITERBI;
>> +    }*/
>> +
>> +    return ret;
>> +err:
>> +    info("%s: failed=%d", __func__, ret);
>> +    return ret;
>> +}
>> +
>> +static int rtl2832_read_snr(struct dvb_frontend *fe, u16 *snr)
>> +{
>> +    *snr = 0;
>> +    return 0;
>> +}
>> +
>> +static int rtl2832_read_ber(struct dvb_frontend *fe, u32 *ber)
>> +{
>> +    *ber = 0;
>> +    return 0;
>> +}
>> +
>> +static int rtl2832_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
>> +{
>> +    *ucblocks = 0;
>> +    return 0;
>> +}
>> +
>> +
>> +static int rtl2832_read_signal_strength(struct dvb_frontend *fe, u16
>> *strength)
>> +{
>> +    *strength = 0;
>> +    return 0;
>> +}
>> +
>> +static struct dvb_frontend_ops rtl2832_ops;
>> +
>> +static void rtl2832_release(struct dvb_frontend *fe)
>> +{
>> +    struct rtl2832_priv *priv = fe->demodulator_priv;
>> +
>> +    dbg("%s", __func__);
>> +    kfree(priv);
>> +}
>> +
>> +struct dvb_frontend *rtl2832_attach(const struct rtl2832_config *cfg,
>> +    struct i2c_adapter *i2c)
>> +{
>> +    struct rtl2832_priv *priv = NULL;
>> +    int ret = 0;
>> +    u8 tmp;
>> +
>> +    dbg("%s", __func__);
>> +
>> +    /* allocate memory for the internal state */
>> +    priv = kzalloc(sizeof(struct rtl2832_priv), GFP_KERNEL);
>> +    if (priv == NULL)
>> +        goto err;
>> +
>> +    /* setup the priv */
>> +    priv->i2c = i2c;
>> +    priv->tuner = cfg->tuner;
>> +    memcpy(&priv->cfg, cfg, sizeof(struct rtl2832_config));
>> +
>> +    /* check if the demod is there */
>> +    ret = rtl2832_rd_reg(priv, 0x00, 0x0,&tmp);
>> +    if (ret)
>> +        goto err;
>> +
>> +    /* create dvb_frontend */
>> +    memcpy(&priv->fe.ops,&rtl2832_ops, sizeof(struct dvb_frontend_ops));
>> +    priv->fe.demodulator_priv = priv;
>> +
>> +    /* TODO implement sleep mode */
>> +    priv->sleeping = true;
>> +
>> +    return&priv->fe;
>> +err:
>> +    dbg("%s: failed=%d", __func__, ret);
>> +    kfree(priv);
>> +    return NULL;
>> +}
>> +EXPORT_SYMBOL(rtl2832_attach);
>> +
>> +static struct dvb_frontend_ops rtl2832_ops = {
>> +    .delsys = { SYS_DVBT },
>> +    .info = {
>> +        .name = "Realtek RTL2832 (DVB-T)",
>> +        .frequency_min      = 174000000,
>> +        .frequency_max      = 862000000,
>> +        .frequency_stepsize = 166667,
>> +        .caps = FE_CAN_FEC_1_2 |
>> +            FE_CAN_FEC_2_3 |
>> +            FE_CAN_FEC_3_4 |
>> +            FE_CAN_FEC_5_6 |
>> +            FE_CAN_FEC_7_8 |
>> +            FE_CAN_FEC_AUTO |
>> +            FE_CAN_QPSK |
>> +            FE_CAN_QAM_16 |
>> +            FE_CAN_QAM_64 |
>> +            FE_CAN_QAM_AUTO |
>> +            FE_CAN_TRANSMISSION_MODE_AUTO |
>> +            FE_CAN_GUARD_INTERVAL_AUTO |
>> +            FE_CAN_HIERARCHY_AUTO |
>> +            FE_CAN_RECOVER |
>> +            FE_CAN_MUTE_TS
>> +     },
>> +
>> +    .release = rtl2832_release,
>> +
>> +    .init = rtl2832_init,
>> +    .sleep = rtl2832_sleep,
>> +
>> +    .get_tune_settings = rtl2832_get_tune_settings,
>> +
>> +    .set_frontend = rtl2832_set_frontend,
>> +
>> +    .read_status = rtl2832_read_status,
>> +    .read_snr = rtl2832_read_snr,
>> +    .read_ber = rtl2832_read_ber,
>> +    .read_ucblocks = rtl2832_read_ucblocks,
>> +    .read_signal_strength = rtl2832_read_signal_strength,
>> +    .i2c_gate_ctrl = rtl2832_i2c_gate_ctrl,
>> +};
>> +
>> +MODULE_AUTHOR("Thomas Mair<mair.thomas86@gmail.com>");
>> +MODULE_DESCRIPTION("Realtek RTL2832 DVB-T demodulator driver");
>> +MODULE_LICENSE("GPL");
>> +MODULE_VERSION("0.4");
>> diff --git a/drivers/media/dvb/frontends/rtl2832.h
>> b/drivers/media/dvb/frontends/rtl2832.h
>> new file mode 100644
>> index 0000000..d94dc9a
>> --- /dev/null
>> +++ b/drivers/media/dvb/frontends/rtl2832.h
>> @@ -0,0 +1,74 @@
>> +/*
>> + * Realtek RTL2832 DVB-T demodulator driver
>> + *
>> + * Copyright (C) 2012 Thomas Mair<thomas.mair86@gmail.com>
>> + *
>> + *    This program is free software; you can redistribute it and/or
>> modify
>> + *    it under the terms of the GNU General Public License as
>> published by
>> + *    the Free Software Foundation; either version 2 of the License, or
>> + *    (at your option) any later version.
>> + *
>> + *    This program is distributed in the hope that it will be useful,
>> + *    but WITHOUT ANY WARRANTY; without even the implied warranty of
>> + *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>> + *    GNU General Public License for more details.
>> + *
>> + *    You should have received a copy of the GNU General Public
>> License along
>> + *    with this program; if not, write to the Free Software
>> Foundation, Inc.,
>> + *    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
>> + */
>> +
>> +#ifndef RTL2832_H
>> +#define RTL2832_H
>> +
>> +#include<linux/dvb/frontend.h>
>> +
>> +struct rtl2832_config {
>> +    /*
>> +     * Demodulator I2C address.
>> +     */
>> +    u8 i2c_addr;
>> +
>> +    /*
>> +     * Xtal frequency.
>> +     * Hz
>> +     * 4000000, 16000000, 25000000, 28800000
>> +     */
>> +    u32 xtal;
>> +
>> +    /*
>> +     * IFs for all used modes.
>> +     * Hz
>> +     * 4570000, 4571429, 36000000, 36125000, 36166667, 44000000
>> +     */
>> +    u32 if_dvbt;
>> +
>> +    /*
>> +     */
>> +    u8 tuner;
>> +};
>> +
>> +
>> +#if defined(CONFIG_DVB_RTL2832) || \
>> +    (defined(CONFIG_DVB_RTL2832_MODULE)&&  defined(MODULE))
>> +extern struct dvb_frontend *rtl2832_attach(
>> +    const struct rtl2832_config *cfg,
>> +    struct i2c_adapter *i2c
>> +);
>> +
>> +extern struct i2c_adapter *rtl2832_get_tuner_i2c_adapter(
>> +    struct dvb_frontend *fe
>> +);
>> +#else
>> +static inline struct dvb_frontend *rtl2832_attach(
>> +    const struct rtl2832_config *config,
>> +    struct i2c_adapter *i2c
>> +)
>> +{
>> +    printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
>> +    return NULL;
>> +}
>> +#endif
>> +
>> +
>> +#endif /* RTL2832_H */
>> diff --git a/drivers/media/dvb/frontends/rtl2832_priv.h
>> b/drivers/media/dvb/frontends/rtl2832_priv.h
>> new file mode 100644
>> index 0000000..3e52674
>> --- /dev/null
>> +++ b/drivers/media/dvb/frontends/rtl2832_priv.h
>> @@ -0,0 +1,258 @@
>> +/*
>> + * Realtek RTL2832 DVB-T demodulator driver
>> + *
>> + * Copyright (C) 2012 Thomas Mair<thomas.mair86@gmail.com>
>> + *
>> + *    This program is free software; you can redistribute it and/or
>> modify
>> + *    it under the terms of the GNU General Public License as
>> published by
>> + *    the Free Software Foundation; either version 2 of the License, or
>> + *    (at your option) any later version.
>> + *
>> + *    This program is distributed in the hope that it will be useful,
>> + *    but WITHOUT ANY WARRANTY; without even the implied warranty of
>> + *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>> + *    GNU General Public License for more details.
>> + *
>> + *    You should have received a copy of the GNU General Public
>> License along
>> + *    with this program; if not, write to the Free Software
>> Foundation, Inc.,
>> + *    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
>> + */
>> +
>> +#ifndef RTL2832_PRIV_H
>> +#define RTL2832_PRIV_H
>> +
>> +#include "dvb_frontend.h"
>> +#include "rtl2832.h"
>> +
>> +#define LOG_PREFIX "rtl2832"
>> +
>> +#undef dbg
>> +#define dbg(f, arg...) \
>> +    if (rtl2832_debug) \
>> +        printk(KERN_INFO LOG_PREFIX": " f "\n" , ## arg)
> 
> ERROR: Macros with complex values should be enclosed in parenthesis
> #30: FILE: media/dvb/frontends/rtl2832_priv.h:30:
> +#define dbg(f, arg...) \
> +    if (rtl2832_debug) \
> +        printk(KERN_INFO LOG_PREFIX": " f "\n" , ## arg)
> 
>> +#undef err
>> +#define err(f, arg...)  printk(KERN_ERR    LOG_PREFIX": " f "\n" , ##
>> arg)
>> +#undef info
>> +#define info(f, arg...) printk(KERN_INFO LOG_PREFIX": " f "\n" , ## arg)
>> +#undef warn
>> +#define warn(f, arg...) printk(KERN_WARNING LOG_PREFIX": " f "\n" ,
>> ## arg)
>> +
>> +struct rtl2832_priv {
>> +    struct i2c_adapter *i2c;
>> +    struct dvb_frontend fe;
>> +    struct rtl2832_config cfg;
>> +
>> +    bool i2c_gate_state;
>> +    bool sleeping;
>> +
>> +    u8 tuner;
>> +    u8 page; /* active register page */
>> +};
>> +
>> +struct rtl2832_reg_entry {
>> +    u8 page;
>> +    u8 start_address;
>> +    u8 msb;
>> +    u8 lsb;
>> +};
>> +
>> +struct rtl2832_reg_value {
>> +    int reg;
> 
> As this reg is enum I wonder if it is possible to use enum as a type
> (enum reg)? Still I am not sure about it and I dont like to test it :)
> 
>> +    u32 value;
>> +};
>> +
>> +
>> +/* Demod register bit names */
>> +enum DVBT_REG_BIT_NAME {
>> +    DVBT_SOFT_RST,
>> +    DVBT_IIC_REPEAT,
>> +    DVBT_TR_WAIT_MIN_8K,
>> +    DVBT_RSD_BER_FAIL_VAL,
>> +    DVBT_EN_BK_TRK,
>> +    DVBT_REG_PI,
>> +    DVBT_REG_PFREQ_1_0,
>> +    DVBT_PD_DA8,
>> +    DVBT_LOCK_TH,
>> +    DVBT_BER_PASS_SCAL,
>> +    DVBT_CE_FFSM_BYPASS,
>> +    DVBT_ALPHAIIR_N,
>> +    DVBT_ALPHAIIR_DIF,
>> +    DVBT_EN_TRK_SPAN,
>> +    DVBT_LOCK_TH_LEN,
>> +    DVBT_CCI_THRE,
>> +    DVBT_CCI_MON_SCAL,
>> +    DVBT_CCI_M0,
>> +    DVBT_CCI_M1,
>> +    DVBT_CCI_M2,
>> +    DVBT_CCI_M3,
>> +    DVBT_SPEC_INIT_0,
>> +    DVBT_SPEC_INIT_1,
>> +    DVBT_SPEC_INIT_2,
>> +    DVBT_AD_EN_REG,
>> +    DVBT_AD_EN_REG1,
>> +    DVBT_EN_BBIN,
>> +    DVBT_MGD_THD0,
>> +    DVBT_MGD_THD1,
>> +    DVBT_MGD_THD2,
>> +    DVBT_MGD_THD3,
>> +    DVBT_MGD_THD4,
>> +    DVBT_MGD_THD5,
>> +    DVBT_MGD_THD6,
>> +    DVBT_MGD_THD7,
>> +    DVBT_EN_CACQ_NOTCH,
>> +    DVBT_AD_AV_REF,
>> +    DVBT_PIP_ON,
>> +    DVBT_SCALE1_B92,
>> +    DVBT_SCALE1_B93,
>> +    DVBT_SCALE1_BA7,
>> +    DVBT_SCALE1_BA9,
>> +    DVBT_SCALE1_BAA,
>> +    DVBT_SCALE1_BAB,
>> +    DVBT_SCALE1_BAC,
>> +    DVBT_SCALE1_BB0,
>> +    DVBT_SCALE1_BB1,
>> +    DVBT_KB_P1,
>> +    DVBT_KB_P2,
>> +    DVBT_KB_P3,
>> +    DVBT_OPT_ADC_IQ,
>> +    DVBT_AD_AVI,
>> +    DVBT_AD_AVQ,
>> +    DVBT_K1_CR_STEP12,
>> +    DVBT_TRK_KS_P2,
>> +    DVBT_TRK_KS_I2,
>> +    DVBT_TR_THD_SET2,
>> +    DVBT_TRK_KC_P2,
>> +    DVBT_TRK_KC_I2,
>> +    DVBT_CR_THD_SET2,
>> +    DVBT_PSET_IFFREQ,
>> +    DVBT_SPEC_INV,
>> +    DVBT_BW_INDEX,
>> +    DVBT_RSAMP_RATIO,
>> +    DVBT_CFREQ_OFF_RATIO,
>> +    DVBT_FSM_STAGE,
>> +    DVBT_RX_CONSTEL,
>> +    DVBT_RX_HIER,
>> +    DVBT_RX_C_RATE_LP,
>> +    DVBT_RX_C_RATE_HP,
>> +    DVBT_GI_IDX,
>> +    DVBT_FFT_MODE_IDX,
>> +    DVBT_RSD_BER_EST,
>> +    DVBT_CE_EST_EVM,
>> +    DVBT_RF_AGC_VAL,
>> +    DVBT_IF_AGC_VAL,
>> +    DVBT_DAGC_VAL,
>> +    DVBT_SFREQ_OFF,
>> +    DVBT_CFREQ_OFF,
>> +    DVBT_POLAR_RF_AGC,
>> +    DVBT_POLAR_IF_AGC,
>> +    DVBT_AAGC_HOLD,
>> +    DVBT_EN_RF_AGC,
>> +    DVBT_EN_IF_AGC,
>> +    DVBT_IF_AGC_MIN,
>> +    DVBT_IF_AGC_MAX,
>> +    DVBT_RF_AGC_MIN,
>> +    DVBT_RF_AGC_MAX,
>> +    DVBT_IF_AGC_MAN,
>> +    DVBT_IF_AGC_MAN_VAL,
>> +    DVBT_RF_AGC_MAN,
>> +    DVBT_RF_AGC_MAN_VAL,
>> +    DVBT_DAGC_TRG_VAL,
>> +    DVBT_AGC_TARG_VAL,
>> +    DVBT_LOOP_GAIN_3_0,
>> +    DVBT_LOOP_GAIN_4,
>> +    DVBT_VTOP,
>> +    DVBT_KRF,
>> +    DVBT_AGC_TARG_VAL_0,
>> +    DVBT_AGC_TARG_VAL_8_1,
>> +    DVBT_AAGC_LOOP_GAIN,
>> +    DVBT_LOOP_GAIN2_3_0,
>> +    DVBT_LOOP_GAIN2_4,
>> +    DVBT_LOOP_GAIN3,
>> +    DVBT_VTOP1,
>> +    DVBT_VTOP2,
>> +    DVBT_VTOP3,
>> +    DVBT_KRF1,
>> +    DVBT_KRF2,
>> +    DVBT_KRF3,
>> +    DVBT_KRF4,
>> +    DVBT_EN_GI_PGA,
>> +    DVBT_THD_LOCK_UP,
>> +    DVBT_THD_LOCK_DW,
>> +    DVBT_THD_UP1,
>> +    DVBT_THD_DW1,
>> +    DVBT_INTER_CNT_LEN,
>> +    DVBT_GI_PGA_STATE,
>> +    DVBT_EN_AGC_PGA,
>> +    DVBT_CKOUTPAR,
>> +    DVBT_CKOUT_PWR,
>> +    DVBT_SYNC_DUR,
>> +    DVBT_ERR_DUR,
>> +    DVBT_SYNC_LVL,
>> +    DVBT_ERR_LVL,
>> +    DVBT_VAL_LVL,
>> +    DVBT_SERIAL,
>> +    DVBT_SER_LSB,
>> +    DVBT_CDIV_PH0,
>> +    DVBT_CDIV_PH1,
>> +    DVBT_MPEG_IO_OPT_2_2,
>> +    DVBT_MPEG_IO_OPT_1_0,
>> +    DVBT_CKOUTPAR_PIP,
>> +    DVBT_CKOUT_PWR_PIP,
>> +    DVBT_SYNC_LVL_PIP,
>> +    DVBT_ERR_LVL_PIP,
>> +    DVBT_VAL_LVL_PIP,
>> +    DVBT_CKOUTPAR_PID,
>> +    DVBT_CKOUT_PWR_PID,
>> +    DVBT_SYNC_LVL_PID,
>> +    DVBT_ERR_LVL_PID,
>> +    DVBT_VAL_LVL_PID,
>> +    DVBT_SM_PASS,
>> +    DVBT_UPDATE_REG_2,
>> +    DVBT_BTHD_P3,
>> +    DVBT_BTHD_D3,
>> +    DVBT_FUNC4_REG0,
>> +    DVBT_FUNC4_REG1,
>> +    DVBT_FUNC4_REG2,
>> +    DVBT_FUNC4_REG3,
>> +    DVBT_FUNC4_REG4,
>> +    DVBT_FUNC4_REG5,
>> +    DVBT_FUNC4_REG6,
>> +    DVBT_FUNC4_REG7,
>> +    DVBT_FUNC4_REG8,
>> +    DVBT_FUNC4_REG9,
>> +    DVBT_FUNC4_REG10,
>> +    DVBT_FUNC5_REG0,
>> +    DVBT_FUNC5_REG1,
>> +    DVBT_FUNC5_REG2,
>> +    DVBT_FUNC5_REG3,
>> +    DVBT_FUNC5_REG4,
>> +    DVBT_FUNC5_REG5,
>> +    DVBT_FUNC5_REG6,
>> +    DVBT_FUNC5_REG7,
>> +    DVBT_FUNC5_REG8,
>> +    DVBT_FUNC5_REG9,
>> +    DVBT_FUNC5_REG10,
>> +    DVBT_FUNC5_REG11,
>> +    DVBT_FUNC5_REG12,
>> +    DVBT_FUNC5_REG13,
>> +    DVBT_FUNC5_REG14,
>> +    DVBT_FUNC5_REG15,
>> +    DVBT_FUNC5_REG16,
>> +    DVBT_FUNC5_REG17,
>> +    DVBT_FUNC5_REG18,
>> +    DVBT_AD7_SETTING,
>> +    DVBT_RSSI_R,
>> +    DVBT_ACI_DET_IND,
>> +    DVBT_REG_MON,
>> +    DVBT_REG_MONSEL,
>> +    DVBT_REG_GPE,
>> +    DVBT_REG_GPO,
>> +    DVBT_REG_4MSEL,
>> +    DVBT_TEST_REG_1,
>> +    DVBT_TEST_REG_2,
>> +    DVBT_TEST_REG_3,
>> +    DVBT_TEST_REG_4,
>> +    DVBT_REG_BIT_NAME_ITEM_TERMINATOR,
>> +};
>> +
>> +#endif /* RTL2832_PRIV_H */
> 
> 

rtl2832.c.diff:
- static int -> static const
- struct -> static const struct
- newline between function call and error check -> […]
- 5 indications apropos 'spaces' regarding 'CodingStyle'- line 206
(/usr/share/doc/kernel-doc-3.3.5/Documentation/CodingStyle)
[…]
Use one space around (on each side of) most binary and ternary operators,
such as any of these:

        =  +  -  <  >  *  /  %  |  &  ^  <=  >=  ==  !=  ?  :

[…]

grep '>>\|<<' v4-1-5-rtl2832-ver.-0.4-removed-signal-statistics.patch.orig
+	len = (msb >> 3) + 1;
+		reading_tmp |= reading[i] << ((len-1-i)*8);
+	*val = (reading_tmp >> lsb) & mask;
+	len = (msb >> 3) + 1;
+		reading_tmp |= reading[i] << ((len-1-i)*8);
+	writing_tmp = reading_tmp & ~(mask << lsb);
+	writing_tmp |= ((val & mask) << lsb);
+		writing[i] = (writing_tmp >> ((len-1-i)*8)) & 0xff;
+	num = bw_mode << 20;

Bitshift operators seems to be OK.
Something else?

- 1 indication apropos 'media/dvb/frontends/rtl2832_priv.h:30'
Compared to 'rtl2830_priv.h' seems to be OK.

./checkpatch.pl --no-tree
v4-1-5-rtl2832-ver.-0.4-removed-signal-statistics.patch.orig
ERROR: Missing Signed-off-by: line(s)

total: 1 errors, 0 warnings, 1177 lines checked

v4-1-5-rtl2832-ver.-0.4-removed-signal-statistics.patch.orig has style
problems, please review.  If any of these errors
are false positives report them to the maintainer, see
CHECKPATCH in MAINTAINERS.

How do you produce this error:
"ERROR: Macros with complex values should be enclosed in parenthesis…"?


regards,
poma

[-- Attachment #2: rtl2832.c.diff --]
[-- Type: text/x-patch, Size: 705 bytes --]

--- rtl2832.c.orig	2012-05-17 20:38:39.916496007 +0200
+++ rtl2832.c	2012-05-17 19:56:15.277706951 +0200
@@ -26,7 +26,7 @@
 MODULE_PARM_DESC(debug, "Turn on/off frontend debugging (default:off).");
 
 
-static int reg_mask[32] = {
+static const reg_mask[32] = {
 	0x00000001,
 	0x00000003,
 	0x00000007,
@@ -61,7 +61,7 @@
 	0xffffffff
 };
 
-struct rtl2832_reg_entry registers[] = {
+static const struct rtl2832_reg_entry registers[] = {
 	[DVBT_SOFT_RST]		= {0x1, 0x1,   2, 2},
 	[DVBT_IIC_REPEAT]	= {0x1, 0x1,   3, 3},
 	[DVBT_TR_WAIT_MIN_8K]	= {0x1, 0x88, 11, 2},
@@ -403,7 +403,6 @@
 		return 0;
 
 	ret = rtl2832_wr_demod_reg(priv, DVBT_IIC_REPEAT, (enable ? 0x1 : 0x0));
-
 	if (ret)
 		goto err;
 

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [PATCH v4 1/5] rtl2832 ver. 0.4: removed signal statistics
  2012-05-17 20:27       ` poma
@ 2012-05-17 20:41         ` Antti Palosaari
  2012-05-17 20:45           ` Thomas Mair
  0 siblings, 1 reply; 104+ messages in thread
From: Antti Palosaari @ 2012-05-17 20:41 UTC (permalink / raw)
  To: poma; +Cc: Thomas Mair, linux-media

On 17.05.2012 23:27, poma wrote:
> On 05/17/2012 04:19 PM, Antti Palosaari wrote:
>> Moikka Thomas,
>>
>> Here is the review. See comments below.
>>
>> And conclusion is that it is ready for the Kernel merge. I did not see
>> any big functiuonality problems - only some small issues that are likely
>> considered as a coding style etc. Feel free to fix those and sent new
>> patc serie or just new patch top of that.
>>
>> Reviewed-by: Antti Palosaari<crope@iki.fi>

[...]

> rtl2832.c.diff:
> - static int ->  static const
> - struct ->  static const struct
> - newline between function call and error check ->  […]
> - 5 indications apropos 'spaces' regarding 'CodingStyle'- line 206
> (/usr/share/doc/kernel-doc-3.3.5/Documentation/CodingStyle)
> […]
> Use one space around (on each side of) most binary and ternary operators,
> such as any of these:
>
>          =  +  -<   >   *  /  %  |&   ^<=>=  ==  !=  ?  :
>
> […]
>
> grep '>>\|<<' v4-1-5-rtl2832-ver.-0.4-removed-signal-statistics.patch.orig
> +	len = (msb>>  3) + 1;
> +		reading_tmp |= reading[i]<<  ((len-1-i)*8);
> +	*val = (reading_tmp>>  lsb)&  mask;
> +	len = (msb>>  3) + 1;
> +		reading_tmp |= reading[i]<<  ((len-1-i)*8);
> +	writing_tmp = reading_tmp&  ~(mask<<  lsb);
> +	writing_tmp |= ((val&  mask)<<  lsb);
> +		writing[i] = (writing_tmp>>  ((len-1-i)*8))&  0xff;
> +	num = bw_mode<<  20;
>
> Bitshift operators seems to be OK.
> Something else?

(len-1-i)*8

> - 1 indication apropos 'media/dvb/frontends/rtl2832_priv.h:30'
> Compared to 'rtl2830_priv.h' seems to be OK.
>
> ./checkpatch.pl --no-tree
> v4-1-5-rtl2832-ver.-0.4-removed-signal-statistics.patch.orig
> ERROR: Missing Signed-off-by: line(s)
>
> total: 1 errors, 0 warnings, 1177 lines checked
>
> v4-1-5-rtl2832-ver.-0.4-removed-signal-statistics.patch.orig has style
> problems, please review.  If any of these errors
> are false positives report them to the maintainer, see
> CHECKPATCH in MAINTAINERS.
>
> How do you produce this error:
> "ERROR: Macros with complex values should be enclosed in parenthesis…"?

Just running checkpatch.pl --file foo

And it is ERROR which means it *must* be corrected.

regards
Antti
-- 
http://palosaari.fi/

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [PATCH v4 4/5] rtl28xxu: support G-Tek Electronics Group Lifeview LV5TDLX DVB-T
  2012-05-17 14:47     ` Antti Palosaari
@ 2012-05-17 20:43       ` poma
  0 siblings, 0 replies; 104+ messages in thread
From: poma @ 2012-05-17 20:43 UTC (permalink / raw)
  To: Antti Palosaari, Thomas Mair, linux-media

On 05/17/2012 04:47 PM, Antti Palosaari wrote:
> On 17.05.2012 01:13, Thomas Mair wrote:
>> Signed-off-by: Thomas Mair<thomas.mair86@googlemail.com>
> 
> Nacked.
> Better PID definition is required.
> 
>> ---
>>   drivers/media/dvb/dvb-usb/dvb-usb-ids.h |    1 +
>>   drivers/media/dvb/dvb-usb/rtl28xxu.c    |   11 ++++++++++-
>>   2 files changed, 11 insertions(+), 1 deletions(-)
>>
>> diff --git a/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
>> b/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
>> index fd37be0..b0a86e9 100644
>> --- a/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
>> +++ b/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
>> @@ -135,6 +135,7 @@
>>   #define USB_PID_GENIUS_TVGO_DVB_T03            0x4012
>>   #define USB_PID_GRANDTEC_DVBT_USB_COLD            0x0fa0
>>   #define USB_PID_GRANDTEC_DVBT_USB_WARM            0x0fa1
>> +#define USB_PID_GTEK                    0xb803
> 
> You must give better name for the device. Vendor name is not enough as
> many vendors has surely more than one device model.
> 
> Correct PID is something like USB_PID_GTEK_LIFEVIEW_LV5TDLX
>

Precisely - USB_PID_DELOCK_USB2_DVBT according to the device:
http://www.delock.de/produkte/G_61744/merkmale.html
regardless of what's in '/usr/share/hwdata/usb.ids'
;)

>>   #define USB_PID_INTEL_CE9500                0x9500
>>   #define USB_PID_ITETECH_IT9135                0x9135
>>   #define USB_PID_ITETECH_IT9135_9005            0x9005
>> diff --git a/drivers/media/dvb/dvb-usb/rtl28xxu.c
>> b/drivers/media/dvb/dvb-usb/rtl28xxu.c
>> index 6817ef7..9056d28 100644
>> --- a/drivers/media/dvb/dvb-usb/rtl28xxu.c
>> +++ b/drivers/media/dvb/dvb-usb/rtl28xxu.c
>> @@ -1135,6 +1135,7 @@ enum rtl28xxu_usb_table_entry {
>>       RTL2831U_14AA_0160,
>>       RTL2831U_14AA_0161,
>>       RTL2832U_0CCD_00A9,
>> +    RTL2832U_1F4D_B803,
>>   };
>>
>>   static struct usb_device_id rtl28xxu_table[] = {
>> @@ -1149,6 +1150,8 @@ static struct usb_device_id rtl28xxu_table[] = {
>>       /* RTL2832U */
>>       [RTL2832U_0CCD_00A9] = {
>>           USB_DEVICE(USB_VID_TERRATEC,
>> USB_PID_TERRATEC_CINERGY_T_STICK_BLACK_REV1)},
>> +    [RTL2832U_1F4D_B803] = {
>> +        USB_DEVICE(USB_VID_GTEK, USB_PID_GTEK)},
>>       {} /* terminating entry */
>>   };
>>
>> @@ -1262,7 +1265,7 @@ static struct dvb_usb_device_properties
>> rtl28xxu_properties[] = {
>>
>>           .i2c_algo =&rtl28xxu_i2c_algo,
>>
>> -        .num_device_descs = 1,
>> +        .num_device_descs = 2,
>>           .devices = {
>>               {
>>                   .name = "Terratec Cinergy T Stick Black",
>> @@ -1270,6 +1273,12 @@ static struct dvb_usb_device_properties
>> rtl28xxu_properties[] = {
>>                       &rtl28xxu_table[RTL2832U_0CCD_00A9],
>>                   },
>>               },
>> +            {
>> +                .name = "G-Tek Electronics Group Lifeview LV5TDLX
>> DVB-T [RTL2832U]",
>> +                .warm_ids = {
>> +                    &rtl28xxu_table[RTL2832U_1F4D_B803],
>> +                },
>> +            },
>>           }
>>       },
>>
> 
> 

regards,
poma

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [PATCH v4 1/5] rtl2832 ver. 0.4: removed signal statistics
  2012-05-17 20:41         ` Antti Palosaari
@ 2012-05-17 20:45           ` Thomas Mair
  2012-05-17 20:49             ` Antti Palosaari
  2012-05-17 21:08             ` poma
  0 siblings, 2 replies; 104+ messages in thread
From: Thomas Mair @ 2012-05-17 20:45 UTC (permalink / raw)
  To: Antti Palosaari; +Cc: poma, linux-media

On 17.05.2012 22:41, Antti Palosaari wrote:
> On 17.05.2012 23:27, poma wrote:
>> On 05/17/2012 04:19 PM, Antti Palosaari wrote:
>>> Moikka Thomas,
>>>
>>> Here is the review. See comments below.
>>>
>>> And conclusion is that it is ready for the Kernel merge. I did not see
>>> any big functiuonality problems - only some small issues that are likely
>>> considered as a coding style etc. Feel free to fix those and sent new
>>> patc serie or just new patch top of that.
>>>
>>> Reviewed-by: Antti Palosaari<crope@iki.fi>
> 
> [...]
> 
>> rtl2832.c.diff:
>> - static int ->  static const
>> - struct ->  static const struct
>> - newline between function call and error check ->  […]
>> - 5 indications apropos 'spaces' regarding 'CodingStyle'- line 206
>> (/usr/share/doc/kernel-doc-3.3.5/Documentation/CodingStyle)
>> […]
>> Use one space around (on each side of) most binary and ternary operators,
>> such as any of these:
>>
>>          =  +  -<   >   *  /  %  |&   ^<=>=  ==  !=  ?  :
>>
>> […]
>>
>> grep '>>\|<<' v4-1-5-rtl2832-ver.-0.4-removed-signal-statistics.patch.orig
>> +    len = (msb>>  3) + 1;
>> +        reading_tmp |= reading[i]<<  ((len-1-i)*8);
>> +    *val = (reading_tmp>>  lsb)&  mask;
>> +    len = (msb>>  3) + 1;
>> +        reading_tmp |= reading[i]<<  ((len-1-i)*8);
>> +    writing_tmp = reading_tmp&  ~(mask<<  lsb);
>> +    writing_tmp |= ((val&  mask)<<  lsb);
>> +        writing[i] = (writing_tmp>>  ((len-1-i)*8))&  0xff;
>> +    num = bw_mode<<  20;
>>
>> Bitshift operators seems to be OK.
>> Something else?
> 
> (len-1-i)*8
I almost have a new corrected version of the patch series ready, fixing this issues and the 
other ones you mentioned. 
> 
>> - 1 indication apropos 'media/dvb/frontends/rtl2832_priv.h:30'
>> Compared to 'rtl2830_priv.h' seems to be OK.
>>
>> ./checkpatch.pl --no-tree
>> v4-1-5-rtl2832-ver.-0.4-removed-signal-statistics.patch.orig
>> ERROR: Missing Signed-off-by: line(s)
>>
>> total: 1 errors, 0 warnings, 1177 lines checked
>>
>> v4-1-5-rtl2832-ver.-0.4-removed-signal-statistics.patch.orig has style
>> problems, please review.  If any of these errors
>> are false positives report them to the maintainer, see
>> CHECKPATCH in MAINTAINERS.
>>
>> How do you produce this error:
>> "ERROR: Macros with complex values should be enclosed in parenthesis…"?
> 
> Just running checkpatch.pl --file foo
> 

For me checkpath.pl also does not report the error you reported. It does seem
strange to me, as the makros are the same as in rtl2830_priv.h

Regards 
Thomas

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [PATCH v4 1/5] rtl2832 ver. 0.4: removed signal statistics
  2012-05-17 20:45           ` Thomas Mair
@ 2012-05-17 20:49             ` Antti Palosaari
  2012-05-17 21:03               ` poma
  2012-05-17 21:08             ` poma
  1 sibling, 1 reply; 104+ messages in thread
From: Antti Palosaari @ 2012-05-17 20:49 UTC (permalink / raw)
  To: Thomas Mair; +Cc: poma, linux-media

On 17.05.2012 23:45, Thomas Mair wrote:
> On 17.05.2012 22:41, Antti Palosaari wrote:
>> On 17.05.2012 23:27, poma wrote:
>>> On 05/17/2012 04:19 PM, Antti Palosaari wrote:
>>>> Moikka Thomas,
>>>>
>>>> Here is the review. See comments below.
>>>>
>>>> And conclusion is that it is ready for the Kernel merge. I did not see
>>>> any big functiuonality problems - only some small issues that are likely
>>>> considered as a coding style etc. Feel free to fix those and sent new
>>>> patc serie or just new patch top of that.
>>>>
>>>> Reviewed-by: Antti Palosaari<crope@iki.fi>
>>
>> [...]
>>
>>> rtl2832.c.diff:
>>> - static int ->   static const
>>> - struct ->   static const struct
>>> - newline between function call and error check ->   […]
>>> - 5 indications apropos 'spaces' regarding 'CodingStyle'- line 206
>>> (/usr/share/doc/kernel-doc-3.3.5/Documentation/CodingStyle)
>>> […]
>>> Use one space around (on each side of) most binary and ternary operators,
>>> such as any of these:
>>>
>>>           =  +  -<    >    *  /  %  |&    ^<=>=  ==  !=  ?  :
>>>
>>> […]
>>>
>>> grep '>>\|<<' v4-1-5-rtl2832-ver.-0.4-removed-signal-statistics.patch.orig
>>> +    len = (msb>>   3) + 1;
>>> +        reading_tmp |= reading[i]<<   ((len-1-i)*8);
>>> +    *val = (reading_tmp>>   lsb)&   mask;
>>> +    len = (msb>>   3) + 1;
>>> +        reading_tmp |= reading[i]<<   ((len-1-i)*8);
>>> +    writing_tmp = reading_tmp&   ~(mask<<   lsb);
>>> +    writing_tmp |= ((val&   mask)<<   lsb);
>>> +        writing[i] = (writing_tmp>>   ((len-1-i)*8))&   0xff;
>>> +    num = bw_mode<<   20;
>>>
>>> Bitshift operators seems to be OK.
>>> Something else?
>>
>> (len-1-i)*8
> I almost have a new corrected version of the patch series ready, fixing this issues and the
> other ones you mentioned.
>>
>>> - 1 indication apropos 'media/dvb/frontends/rtl2832_priv.h:30'
>>> Compared to 'rtl2830_priv.h' seems to be OK.
>>>
>>> ./checkpatch.pl --no-tree
>>> v4-1-5-rtl2832-ver.-0.4-removed-signal-statistics.patch.orig
>>> ERROR: Missing Signed-off-by: line(s)
>>>
>>> total: 1 errors, 0 warnings, 1177 lines checked
>>>
>>> v4-1-5-rtl2832-ver.-0.4-removed-signal-statistics.patch.orig has style
>>> problems, please review.  If any of these errors
>>> are false positives report them to the maintainer, see
>>> CHECKPATCH in MAINTAINERS.
>>>
>>> How do you produce this error:
>>> "ERROR: Macros with complex values should be enclosed in parenthesis…"?
>>
>> Just running checkpatch.pl --file foo
>>
>
> For me checkpath.pl also does not report the error you reported. It does seem
> strange to me, as the makros are the same as in rtl2830_priv.h

Are you using some old version of checkpatch.pl ?
Mine is:
commit c06a9ebdb7a4f4823d4225fe789d8c20a1d534eb
Author: Joe Perches <joe@perches.com>
Date:   Mon Apr 16 13:35:11 2012 -0600

If you are using older version then upgrade. checkpatch.pl is developed 
very rapidly and there is all the time new checks.

regards
Antti
-- 
http://palosaari.fi/

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [PATCH v4 1/5] rtl2832 ver. 0.4: removed signal statistics
  2012-05-17 20:49             ` Antti Palosaari
@ 2012-05-17 21:03               ` poma
  0 siblings, 0 replies; 104+ messages in thread
From: poma @ 2012-05-17 21:03 UTC (permalink / raw)
  To: Antti Palosaari, Thomas Mair, linux-media

On 05/17/2012 10:49 PM, Antti Palosaari wrote:
> On 17.05.2012 23:45, Thomas Mair wrote:
>> On 17.05.2012 22:41, Antti Palosaari wrote:
>>> On 17.05.2012 23:27, poma wrote:
>>>> On 05/17/2012 04:19 PM, Antti Palosaari wrote:
>>>>> Moikka Thomas,
>>>>>
>>>>> Here is the review. See comments below.
>>>>>
>>>>> And conclusion is that it is ready for the Kernel merge. I did not see
>>>>> any big functiuonality problems - only some small issues that are
>>>>> likely
>>>>> considered as a coding style etc. Feel free to fix those and sent new
>>>>> patc serie or just new patch top of that.
>>>>>
>>>>> Reviewed-by: Antti Palosaari<crope@iki.fi>
>>>
>>> [...]
>>>
>>>> rtl2832.c.diff:
>>>> - static int ->   static const
>>>> - struct ->   static const struct
>>>> - newline between function call and error check ->   […]
>>>> - 5 indications apropos 'spaces' regarding 'CodingStyle'- line 206
>>>> (/usr/share/doc/kernel-doc-3.3.5/Documentation/CodingStyle)
>>>> […]
>>>> Use one space around (on each side of) most binary and ternary
>>>> operators,
>>>> such as any of these:
>>>>
>>>>           =  +  -<    >    *  /  %  |&    ^<=>=  ==  !=  ?  :
>>>>
>>>> […]
>>>>
>>>> grep '>>\|<<'
>>>> v4-1-5-rtl2832-ver.-0.4-removed-signal-statistics.patch.orig
>>>> +    len = (msb>>   3) + 1;
>>>> +        reading_tmp |= reading[i]<<   ((len-1-i)*8);
>>>> +    *val = (reading_tmp>>   lsb)&   mask;
>>>> +    len = (msb>>   3) + 1;
>>>> +        reading_tmp |= reading[i]<<   ((len-1-i)*8);
>>>> +    writing_tmp = reading_tmp&   ~(mask<<   lsb);
>>>> +    writing_tmp |= ((val&   mask)<<   lsb);
>>>> +        writing[i] = (writing_tmp>>   ((len-1-i)*8))&   0xff;
>>>> +    num = bw_mode<<   20;
>>>>
>>>> Bitshift operators seems to be OK.
>>>> Something else?
>>>
>>> (len-1-i)*8
>> I almost have a new corrected version of the patch series ready,
>> fixing this issues and the
>> other ones you mentioned.
>>>
>>>> - 1 indication apropos 'media/dvb/frontends/rtl2832_priv.h:30'
>>>> Compared to 'rtl2830_priv.h' seems to be OK.
>>>>
>>>> ./checkpatch.pl --no-tree
>>>> v4-1-5-rtl2832-ver.-0.4-removed-signal-statistics.patch.orig
>>>> ERROR: Missing Signed-off-by: line(s)
>>>>
>>>> total: 1 errors, 0 warnings, 1177 lines checked
>>>>
>>>> v4-1-5-rtl2832-ver.-0.4-removed-signal-statistics.patch.orig has style
>>>> problems, please review.  If any of these errors
>>>> are false positives report them to the maintainer, see
>>>> CHECKPATCH in MAINTAINERS.
>>>>
>>>> How do you produce this error:
>>>> "ERROR: Macros with complex values should be enclosed in parenthesis…"?
>>>
>>> Just running checkpatch.pl --file foo
>>>
>>
>> For me checkpath.pl also does not report the error you reported. It
>> does seem
>> strange to me, as the makros are the same as in rtl2830_priv.h
> 
> Are you using some old version of checkpatch.pl ?
> Mine is:
> commit c06a9ebdb7a4f4823d4225fe789d8c20a1d534eb
> Author: Joe Perches <joe@perches.com>
> Date:   Mon Apr 16 13:35:11 2012 -0600
> 
> If you are using older version then upgrade. checkpatch.pl is developed
> very rapidly and there is all the time new checks.
> 
> regards
> Antti

https://github.com/torvalds/linux/blob/master/scripts/checkpatch.pl

./checkpatch.pl --version
Usage: checkpatch.pl [OPTION]... [FILE]...
Version: 0.32

Options:
  -q, --quiet                quiet
  --no-tree                  run without a kernel tree
  --no-signoff               do not check for 'Signed-off-by' line
  --patch                    treat FILE as patchfile (default)
  --emacs                    emacs compile window format
  --terse                    one line per report
  -f, --file                 treat FILE as regular source file
  --subjective, --strict     enable more subjective tests
  --ignore TYPE(,TYPE2...)   ignore various comma separated message types
  --show-types               show the message "types" in the output
  --root=PATH                PATH to the kernel tree root
  --no-summary               suppress the per-file summary
  --mailback                 only produce a report in case of
warnings/errors
  --summary-file             include the filename in summary
  --debug KEY=[0|1]          turn on/off debugging of KEY, where KEY is
one of
                             'values', 'possible', 'type', and 'attr'
(default
                             is all off)
  --test-only=WORD           report only warnings/errors containing WORD
                             literally
  -h, --help, --version      display this help and exit

When FILE is - read standard input.

./checkpatch.pl --no-tree
v4-1-5-rtl2832-ver.-0.4-removed-signal-statistics.patch.orig
ERROR: Macros with complex values should be enclosed in parenthesis
#977: FILE: drivers/media/dvb/frontends/rtl2832_priv.h:30:
+#define dbg(f, arg...) \
+	if (rtl2832_debug) \
+		printk(KERN_INFO LOG_PREFIX": " f "\n" , ## arg)

ERROR: Missing Signed-off-by: line(s)

total: 2 errors, 0 warnings, 1177 lines checked

v4-1-5-rtl2832-ver.-0.4-removed-signal-statistics.patch.orig has style
problems, please review.

If any of these errors are false positives, please report
them to the maintainer, see CHECKPATCH in MAINTAINERS.

Bingo!

./checkpatch.pl --no-tree --file
v4-1-5-rtl2832-ver.-0.4-removed-signal-statistics.patch.orig
ERROR: trailing whitespace
#8: FILE: v4-1-5-rtl2832-ver.-0.4-removed-signal-statistics.patch.orig:8:
+ $

ERROR: trailing whitespace
#18: FILE: v4-1-5-rtl2832-ver.-0.4-removed-signal-statistics.patch.orig:18:
+ $

ERROR: trailing whitespace
#30: FILE: v4-1-5-rtl2832-ver.-0.4-removed-signal-statistics.patch.orig:30:
+ $

total: 3 errors, 0 warnings, 1205 lines checked

NOTE: whitespace errors detected, you may wish to use scripts/cleanpatch or
      scripts/cleanfile

v4-1-5-rtl2832-ver.-0.4-removed-signal-statistics.patch.orig has style
problems, please review.

If any of these errors are false positives, please report
them to the maintainer, see CHECKPATCH in MAINTAINERS.

regards,
poma

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [PATCH v4 1/5] rtl2832 ver. 0.4: removed signal statistics
  2012-05-17 20:45           ` Thomas Mair
  2012-05-17 20:49             ` Antti Palosaari
@ 2012-05-17 21:08             ` poma
  2012-05-17 21:19               ` Thomas Mair
  1 sibling, 1 reply; 104+ messages in thread
From: poma @ 2012-05-17 21:08 UTC (permalink / raw)
  To: Thomas Mair, linux-media

On 05/17/2012 10:45 PM, Thomas Mair wrote:
> On 17.05.2012 22:41, Antti Palosaari wrote:
>> On 17.05.2012 23:27, poma wrote:
>>> On 05/17/2012 04:19 PM, Antti Palosaari wrote:
>>>> Moikka Thomas,
>>>>
>>>> Here is the review. See comments below.
>>>>
>>>> And conclusion is that it is ready for the Kernel merge. I did not see
>>>> any big functiuonality problems - only some small issues that are likely
>>>> considered as a coding style etc. Feel free to fix those and sent new
>>>> patc serie or just new patch top of that.
>>>>
>>>> Reviewed-by: Antti Palosaari<crope@iki.fi>
>>
>> [...]
>>
>>> rtl2832.c.diff:
>>> - static int ->  static const
>>> - struct ->  static const struct
>>> - newline between function call and error check ->  […]
>>> - 5 indications apropos 'spaces' regarding 'CodingStyle'- line 206
>>> (/usr/share/doc/kernel-doc-3.3.5/Documentation/CodingStyle)
>>> […]
>>> Use one space around (on each side of) most binary and ternary operators,
>>> such as any of these:
>>>
>>>          =  +  -<   >   *  /  %  |&   ^<=>=  ==  !=  ?  :
>>>
>>> […]
>>>
>>> grep '>>\|<<' v4-1-5-rtl2832-ver.-0.4-removed-signal-statistics.patch.orig
>>> +    len = (msb>>  3) + 1;
>>> +        reading_tmp |= reading[i]<<  ((len-1-i)*8);
>>> +    *val = (reading_tmp>>  lsb)&  mask;
>>> +    len = (msb>>  3) + 1;
>>> +        reading_tmp |= reading[i]<<  ((len-1-i)*8);
>>> +    writing_tmp = reading_tmp&  ~(mask<<  lsb);
>>> +    writing_tmp |= ((val&  mask)<<  lsb);
>>> +        writing[i] = (writing_tmp>>  ((len-1-i)*8))&  0xff;
>>> +    num = bw_mode<<  20;
>>>
>>> Bitshift operators seems to be OK.
>>> Something else?
>>
>> (len-1-i)*8
> I almost have a new corrected version of the patch series ready, fixing this issues and the 
> other ones you mentioned. 
>>
>>> - 1 indication apropos 'media/dvb/frontends/rtl2832_priv.h:30'
>>> Compared to 'rtl2830_priv.h' seems to be OK.
>>>
>>> ./checkpatch.pl --no-tree
>>> v4-1-5-rtl2832-ver.-0.4-removed-signal-statistics.patch.orig
>>> ERROR: Missing Signed-off-by: line(s)
>>>
>>> total: 1 errors, 0 warnings, 1177 lines checked
>>>
>>> v4-1-5-rtl2832-ver.-0.4-removed-signal-statistics.patch.orig has style
>>> problems, please review.  If any of these errors
>>> are false positives report them to the maintainer, see
>>> CHECKPATCH in MAINTAINERS.
>>>
>>> How do you produce this error:
>>> "ERROR: Macros with complex values should be enclosed in parenthesis…"?
>>
>> Just running checkpatch.pl --file foo
>>
> 
> For me checkpath.pl also does not report the error you reported. It does seem
> strange to me, as the makros are the same as in rtl2830_priv.h
> 
> Regards 
> Thomas

Yeah, 'rtl2830_priv.h' is the same.
Fu… me, now I don't know too!
:)

cheers,
poma

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [PATCH v4 1/5] rtl2832 ver. 0.4: removed signal statistics
  2012-05-17 21:08             ` poma
@ 2012-05-17 21:19               ` Thomas Mair
  2012-05-17 21:30                 ` poma
  0 siblings, 1 reply; 104+ messages in thread
From: Thomas Mair @ 2012-05-17 21:19 UTC (permalink / raw)
  To: poma; +Cc: linux-media

On 17.05.2012 23:08, poma wrote:
> On 05/17/2012 10:45 PM, Thomas Mair wrote:
>> On 17.05.2012 22:41, Antti Palosaari wrote:
>>> On 17.05.2012 23:27, poma wrote:
>>>> On 05/17/2012 04:19 PM, Antti Palosaari wrote:
>>>>> Moikka Thomas,
>>>>>
>>>>> Here is the review. See comments below.
>>>>>
>>>>> And conclusion is that it is ready for the Kernel merge. I did not see
>>>>> any big functiuonality problems - only some small issues that are likely
>>>>> considered as a coding style etc. Feel free to fix those and sent new
>>>>> patc serie or just new patch top of that.
>>>>>
>>>>> Reviewed-by: Antti Palosaari<crope@iki.fi>
>>>
>>> [...]
>>>
>>>> rtl2832.c.diff:
>>>> - static int ->  static const
>>>> - struct ->  static const struct
>>>> - newline between function call and error check ->  […]
>>>> - 5 indications apropos 'spaces' regarding 'CodingStyle'- line 206
>>>> (/usr/share/doc/kernel-doc-3.3.5/Documentation/CodingStyle)
>>>> […]
>>>> Use one space around (on each side of) most binary and ternary operators,
>>>> such as any of these:
>>>>
>>>>          =  +  -<   >   *  /  %  |&   ^<=>=  ==  !=  ?  :
>>>>
>>>> […]
>>>>
>>>> grep '>>\|<<' v4-1-5-rtl2832-ver.-0.4-removed-signal-statistics.patch.orig
>>>> +    len = (msb>>  3) + 1;
>>>> +        reading_tmp |= reading[i]<<  ((len-1-i)*8);
>>>> +    *val = (reading_tmp>>  lsb)&  mask;
>>>> +    len = (msb>>  3) + 1;
>>>> +        reading_tmp |= reading[i]<<  ((len-1-i)*8);
>>>> +    writing_tmp = reading_tmp&  ~(mask<<  lsb);
>>>> +    writing_tmp |= ((val&  mask)<<  lsb);
>>>> +        writing[i] = (writing_tmp>>  ((len-1-i)*8))&  0xff;
>>>> +    num = bw_mode<<  20;
>>>>
>>>> Bitshift operators seems to be OK.
>>>> Something else?
>>>
>>> (len-1-i)*8
>> I almost have a new corrected version of the patch series ready, fixing this issues and the 
>> other ones you mentioned. 
>>>
>>>> - 1 indication apropos 'media/dvb/frontends/rtl2832_priv.h:30'
>>>> Compared to 'rtl2830_priv.h' seems to be OK.
>>>>
>>>> ./checkpatch.pl --no-tree
>>>> v4-1-5-rtl2832-ver.-0.4-removed-signal-statistics.patch.orig
>>>> ERROR: Missing Signed-off-by: line(s)
>>>>
>>>> total: 1 errors, 0 warnings, 1177 lines checked
>>>>
>>>> v4-1-5-rtl2832-ver.-0.4-removed-signal-statistics.patch.orig has style
>>>> problems, please review.  If any of these errors
>>>> are false positives report them to the maintainer, see
>>>> CHECKPATCH in MAINTAINERS.
>>>>
>>>> How do you produce this error:
>>>> "ERROR: Macros with complex values should be enclosed in parenthesis…"?
>>>
>>> Just running checkpatch.pl --file foo
>>>
>>
>> For me checkpath.pl also does not report the error you reported. It does seem
>> strange to me, as the makros are the same as in rtl2830_priv.h
>>
>> Regards 
>> Thomas
> 
> Yeah, 'rtl2830_priv.h' is the same.
> Fu… me, now I don't know too!
> :)
> 
> cheers,
> poma

Ok. I will then check the patches with the new checkpatch version tomorrow as I need some 
rest now ;) It should not be too difficult to remove the errors.

Regards 
Thomas

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [PATCH v4 1/5] rtl2832 ver. 0.4: removed signal statistics
  2012-05-17 21:19               ` Thomas Mair
@ 2012-05-17 21:30                 ` poma
  0 siblings, 0 replies; 104+ messages in thread
From: poma @ 2012-05-17 21:30 UTC (permalink / raw)
  To: Thomas Mair, linux-media

On 05/17/2012 11:19 PM, Thomas Mair wrote:
> On 17.05.2012 23:08, poma wrote:
>> On 05/17/2012 10:45 PM, Thomas Mair wrote:
>>> On 17.05.2012 22:41, Antti Palosaari wrote:
>>>> On 17.05.2012 23:27, poma wrote:
>>>>> On 05/17/2012 04:19 PM, Antti Palosaari wrote:
>>>>>> Moikka Thomas,
>>>>>>
>>>>>> Here is the review. See comments below.
>>>>>>
>>>>>> And conclusion is that it is ready for the Kernel merge. I did not see
>>>>>> any big functiuonality problems - only some small issues that are likely
>>>>>> considered as a coding style etc. Feel free to fix those and sent new
>>>>>> patc serie or just new patch top of that.
>>>>>>
>>>>>> Reviewed-by: Antti Palosaari<crope@iki.fi>
>>>>
>>>> [...]
>>>>
>>>>> rtl2832.c.diff:
>>>>> - static int ->  static const
>>>>> - struct ->  static const struct
>>>>> - newline between function call and error check ->  […]
>>>>> - 5 indications apropos 'spaces' regarding 'CodingStyle'- line 206
>>>>> (/usr/share/doc/kernel-doc-3.3.5/Documentation/CodingStyle)
>>>>> […]
>>>>> Use one space around (on each side of) most binary and ternary operators,
>>>>> such as any of these:
>>>>>
>>>>>          =  +  -<   >   *  /  %  |&   ^<=>=  ==  !=  ?  :
>>>>>
>>>>> […]
>>>>>
>>>>> grep '>>\|<<' v4-1-5-rtl2832-ver.-0.4-removed-signal-statistics.patch.orig
>>>>> +    len = (msb>>  3) + 1;
>>>>> +        reading_tmp |= reading[i]<<  ((len-1-i)*8);
>>>>> +    *val = (reading_tmp>>  lsb)&  mask;
>>>>> +    len = (msb>>  3) + 1;
>>>>> +        reading_tmp |= reading[i]<<  ((len-1-i)*8);
>>>>> +    writing_tmp = reading_tmp&  ~(mask<<  lsb);
>>>>> +    writing_tmp |= ((val&  mask)<<  lsb);
>>>>> +        writing[i] = (writing_tmp>>  ((len-1-i)*8))&  0xff;
>>>>> +    num = bw_mode<<  20;
>>>>>
>>>>> Bitshift operators seems to be OK.
>>>>> Something else?
>>>>
>>>> (len-1-i)*8
>>> I almost have a new corrected version of the patch series ready, fixing this issues and the 
>>> other ones you mentioned. 
>>>>
>>>>> - 1 indication apropos 'media/dvb/frontends/rtl2832_priv.h:30'
>>>>> Compared to 'rtl2830_priv.h' seems to be OK.
>>>>>
>>>>> ./checkpatch.pl --no-tree
>>>>> v4-1-5-rtl2832-ver.-0.4-removed-signal-statistics.patch.orig
>>>>> ERROR: Missing Signed-off-by: line(s)
>>>>>
>>>>> total: 1 errors, 0 warnings, 1177 lines checked
>>>>>
>>>>> v4-1-5-rtl2832-ver.-0.4-removed-signal-statistics.patch.orig has style
>>>>> problems, please review.  If any of these errors
>>>>> are false positives report them to the maintainer, see
>>>>> CHECKPATCH in MAINTAINERS.
>>>>>
>>>>> How do you produce this error:
>>>>> "ERROR: Macros with complex values should be enclosed in parenthesis…"?
>>>>
>>>> Just running checkpatch.pl --file foo
>>>>
>>>
>>> For me checkpath.pl also does not report the error you reported. It does seem
>>> strange to me, as the makros are the same as in rtl2830_priv.h
>>>
>>> Regards 
>>> Thomas
>>
>> Yeah, 'rtl2830_priv.h' is the same.
>> Fu… me, now I don't know too!
>> :)
>>
>> cheers,
>> poma
> 
> Ok. I will then check the patches with the new checkpatch version tomorrow as I need some 
> rest now ;) It should not be too difficult to remove the errors.
> 
> Regards 
> Thomas

Have a pleasant beauty sleep ;)

cheers,
poma

ps.
/usr/src/kernels/`uname -r`/scripts

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [PATCH v4 1/5] rtl2832 ver. 0.4: removed signal statistics
  2012-05-17 14:19     ` Antti Palosaari
  2012-05-17 20:27       ` poma
@ 2012-05-18  0:55       ` poma
       [not found]         ` <CAKZ=SG_mvvFae9ZE2H3ci_3HosLmQ1kihyGx6QCdyQGgQro52Q@mail.gmail.com>
  1 sibling, 1 reply; 104+ messages in thread
From: poma @ 2012-05-18  0:55 UTC (permalink / raw)
  To: Antti Palosaari, Thomas Mair, linux-media

[-- Attachment #1: Type: text/plain, Size: 43454 bytes --]

On 05/17/2012 04:19 PM, Antti Palosaari wrote:
> Moikka Thomas,
> 
> Here is the review. See comments below.
> 
> And conclusion is that it is ready for the Kernel merge. I did not see
> any big functiuonality problems - only some small issues that are likely
> considered as a coding style etc. Feel free to fix those and sent new
> patc serie or just new patch top of that.
> 
> Reviewed-by: Antti Palosaari <crope@iki.fi>
> 
> 
> On 17.05.2012 01:13, Thomas Mair wrote:
>> Changelog for ver. 0.3:
>> - removed statistics as their calculation was wrong
>> - fixed bug in Makefile
>> - indentation and code style improvements
>>
>> Signed-off-by: Thomas Mair<thomas.mair86@googlemail.com>
>> ---
>>   drivers/media/dvb/frontends/Kconfig        |    7 +
>>   drivers/media/dvb/frontends/Makefile       |    1 +
>>   drivers/media/dvb/frontends/rtl2832.c      |  825
>> ++++++++++++++++++++++++++++
>>   drivers/media/dvb/frontends/rtl2832.h      |   74 +++
>>   drivers/media/dvb/frontends/rtl2832_priv.h |  258 +++++++++
>>   5 files changed, 1165 insertions(+), 0 deletions(-)
>>   create mode 100644 drivers/media/dvb/frontends/rtl2832.c
>>   create mode 100644 drivers/media/dvb/frontends/rtl2832.h
>>   create mode 100644 drivers/media/dvb/frontends/rtl2832_priv.h
>>
>> diff --git a/drivers/media/dvb/frontends/Kconfig
>> b/drivers/media/dvb/frontends/Kconfig
>> index f479834..f7d67d7 100644
>> --- a/drivers/media/dvb/frontends/Kconfig
>> +++ b/drivers/media/dvb/frontends/Kconfig
>> @@ -432,6 +432,13 @@ config DVB_RTL2830
>>       help
>>         Say Y when you want to support this frontend.
>>
>> +config DVB_RTL2832
>> +    tristate "Realtek RTL2832 DVB-T"
>> +    depends on DVB_CORE&&  I2C
>> +    default m if DVB_FE_CUSTOMISE
>> +    help
>> +      Say Y when you want to support this frontend.
>> +
> 
> It is correct.
> 
> Just for the comment as you said in cover letter that you are unsure
> about that.
> 
>>   comment "DVB-C (cable) frontends"
>>       depends on DVB_CORE
>>
>> diff --git a/drivers/media/dvb/frontends/Makefile
>> b/drivers/media/dvb/frontends/Makefile
>> index b0381dc..bbf2955 100644
>> --- a/drivers/media/dvb/frontends/Makefile
>> +++ b/drivers/media/dvb/frontends/Makefile
>> @@ -98,6 +98,7 @@ obj-$(CONFIG_DVB_IT913X_FE) += it913x-fe.o
>>   obj-$(CONFIG_DVB_A8293) += a8293.o
>>   obj-$(CONFIG_DVB_TDA10071) += tda10071.o
>>   obj-$(CONFIG_DVB_RTL2830) += rtl2830.o
>> +obj-$(CONFIG_DVB_RTL2830) += rtl2832.o
>>   obj-$(CONFIG_DVB_M88RS2000) += m88rs2000.o
>>   obj-$(CONFIG_DVB_AF9033) += af9033.o
>>
>> diff --git a/drivers/media/dvb/frontends/rtl2832.c
>> b/drivers/media/dvb/frontends/rtl2832.c
>> new file mode 100644
>> index 0000000..51c7927
>> --- /dev/null
>> +++ b/drivers/media/dvb/frontends/rtl2832.c
>> @@ -0,0 +1,825 @@
>> +/*
>> + * Realtek RTL2832 DVB-T demodulator driver
>> + *
>> + * Copyright (C) 2012 Thomas Mair<thomas.mair86@gmail.com>
>> + *
>> + *    This program is free software; you can redistribute it and/or
>> modify
>> + *    it under the terms of the GNU General Public License as
>> published by
>> + *    the Free Software Foundation; either version 2 of the License, or
>> + *    (at your option) any later version.
>> + *
>> + *    This program is distributed in the hope that it will be useful,
>> + *    but WITHOUT ANY WARRANTY; without even the implied warranty of
>> + *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>> + *    GNU General Public License for more details.
>> + *
>> + *    You should have received a copy of the GNU General Public
>> License along
>> + *    with this program; if not, write to the Free Software
>> Foundation, Inc.,
>> + *    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
>> + */
>> +
>> +#include "rtl2832_priv.h"
>> +
>> +
>> +int rtl2832_debug;
>> +module_param_named(debug, rtl2832_debug, int, 0644);
>> +MODULE_PARM_DESC(debug, "Turn on/off frontend debugging
>> (default:off).");
>> +
>> +
>> +static int reg_mask[32] = {
> 
> This should be static const.
> 
>> +    0x00000001,
>> +    0x00000003,
>> +    0x00000007,
>> +    0x0000000f,
>> +    0x0000001f,
>> +    0x0000003f,
>> +    0x0000007f,
>> +    0x000000ff,
>> +    0x000001ff,
>> +    0x000003ff,
>> +    0x000007ff,
>> +    0x00000fff,
>> +    0x00001fff,
>> +    0x00003fff,
>> +    0x00007fff,
>> +    0x0000ffff,
>> +    0x0001ffff,
>> +    0x0003ffff,
>> +    0x0007ffff,
>> +    0x000fffff,
>> +    0x001fffff,
>> +    0x003fffff,
>> +    0x007fffff,
>> +    0x00ffffff,
>> +    0x01ffffff,
>> +    0x03ffffff,
>> +    0x07ffffff,
>> +    0x0fffffff,
>> +    0x1fffffff,
>> +    0x3fffffff,
>> +    0x7fffffff,
>> +    0xffffffff
>> +};
>> +
>> +struct rtl2832_reg_entry registers[] = {
> 
> static const struct
> 
>> +    [DVBT_SOFT_RST]        = {0x1, 0x1,   2, 2},
>> +    [DVBT_IIC_REPEAT]    = {0x1, 0x1,   3, 3},
>> +    [DVBT_TR_WAIT_MIN_8K]    = {0x1, 0x88, 11, 2},
>> +    [DVBT_RSD_BER_FAIL_VAL]    = {0x1, 0x8f, 15, 0},
>> +    [DVBT_EN_BK_TRK]    = {0x1, 0xa6,  7, 7},
>> +    [DVBT_AD_EN_REG]    = {0x0, 0x8,   7, 7},
>> +    [DVBT_AD_EN_REG1]    = {0x0, 0x8,   6, 6},
>> +    [DVBT_EN_BBIN]        = {0x1, 0xb1,  0, 0},
>> +    [DVBT_MGD_THD0]        = {0x1, 0x95,  7, 0},
>> +    [DVBT_MGD_THD1]        = {0x1, 0x96,  7, 0},
>> +    [DVBT_MGD_THD2]        = {0x1, 0x97,  7, 0},
>> +    [DVBT_MGD_THD3]        = {0x1, 0x98,  7, 0},
>> +    [DVBT_MGD_THD4]        = {0x1, 0x99,  7, 0},
>> +    [DVBT_MGD_THD5]        = {0x1, 0x9a,  7, 0},
>> +    [DVBT_MGD_THD6]        = {0x1, 0x9b,  7, 0},
>> +    [DVBT_MGD_THD7]        = {0x1, 0x9c,  7, 0},
>> +    [DVBT_EN_CACQ_NOTCH]    = {0x1, 0x61,  4, 4},
>> +    [DVBT_AD_AV_REF]    = {0x0, 0x9,   6, 0},
>> +    [DVBT_REG_PI]        = {0x0, 0xa,   2, 0},
>> +    [DVBT_PIP_ON]        = {0x0, 0x21,  3, 3},
>> +    [DVBT_SCALE1_B92]    = {0x2, 0x92,  7, 0},
>> +    [DVBT_SCALE1_B93]    = {0x2, 0x93,  7, 0},
>> +    [DVBT_SCALE1_BA7]    = {0x2, 0xa7,  7, 0},
>> +    [DVBT_SCALE1_BA9]    = {0x2, 0xa9,  7, 0},
>> +    [DVBT_SCALE1_BAA]    = {0x2, 0xaa,  7, 0},
>> +    [DVBT_SCALE1_BAB]    = {0x2, 0xab,  7, 0},
>> +    [DVBT_SCALE1_BAC]    = {0x2, 0xac,  7, 0},
>> +    [DVBT_SCALE1_BB0]    = {0x2, 0xb0,  7, 0},
>> +    [DVBT_SCALE1_BB1]    = {0x2, 0xb1,  7, 0},
>> +    [DVBT_KB_P1]        = {0x1, 0x64,  3, 1},
>> +    [DVBT_KB_P2]        = {0x1, 0x64,  6, 4},
>> +    [DVBT_KB_P3]        = {0x1, 0x65,  2, 0},
>> +    [DVBT_OPT_ADC_IQ]    = {0x0, 0x6,   5, 4},
>> +    [DVBT_AD_AVI]        = {0x0, 0x9,   1, 0},
>> +    [DVBT_AD_AVQ]        = {0x0, 0x9,   3, 2},
>> +    [DVBT_K1_CR_STEP12]    = {0x2, 0xad,  9, 4},
>> +    [DVBT_TRK_KS_P2]    = {0x1, 0x6f,  2, 0},
>> +    [DVBT_TRK_KS_I2]    = {0x1, 0x70,  5, 3},
>> +    [DVBT_TR_THD_SET2]    = {0x1, 0x72,  3, 0},
>> +    [DVBT_TRK_KC_P2]    = {0x1, 0x73,  5, 3},
>> +    [DVBT_TRK_KC_I2]    = {0x1, 0x75,  2, 0},
>> +    [DVBT_CR_THD_SET2]    = {0x1, 0x76,  7, 6},
>> +    [DVBT_PSET_IFFREQ]    = {0x1, 0x19, 21, 0},
>> +    [DVBT_SPEC_INV]        = {0x1, 0x15,  0, 0},
>> +    [DVBT_RSAMP_RATIO]    = {0x1, 0x9f, 27, 2},
>> +    [DVBT_CFREQ_OFF_RATIO]    = {0x1, 0x9d, 23, 4},
>> +    [DVBT_FSM_STAGE]    = {0x3, 0x51,  6, 3},
>> +    [DVBT_RX_CONSTEL]    = {0x3, 0x3c,  3, 2},
>> +    [DVBT_RX_HIER]        = {0x3, 0x3c,  6, 4},
>> +    [DVBT_RX_C_RATE_LP]    = {0x3, 0x3d,  2, 0},
>> +    [DVBT_RX_C_RATE_HP]    = {0x3, 0x3d,  5, 3},
>> +    [DVBT_GI_IDX]        = {0x3, 0x51,  1, 0},
>> +    [DVBT_FFT_MODE_IDX]    = {0x3, 0x51,  2, 2},
>> +    [DVBT_RSD_BER_EST]    = {0x3, 0x4e, 15, 0},
>> +    [DVBT_CE_EST_EVM]    = {0x4, 0xc,  15, 0},
>> +    [DVBT_RF_AGC_VAL]    = {0x3, 0x5b, 13, 0},
>> +    [DVBT_IF_AGC_VAL]    = {0x3, 0x59, 13, 0},
>> +    [DVBT_DAGC_VAL]        = {0x3, 0x5,   7, 0},
>> +    [DVBT_SFREQ_OFF]    = {0x3, 0x18, 13, 0},
>> +    [DVBT_CFREQ_OFF]    = {0x3, 0x5f, 17, 0},
>> +    [DVBT_POLAR_RF_AGC]    = {0x0, 0xe,   1, 1},
>> +    [DVBT_POLAR_IF_AGC]    = {0x0, 0xe,   0, 0},
>> +    [DVBT_AAGC_HOLD]    = {0x1, 0x4,   5, 5},
>> +    [DVBT_EN_RF_AGC]    = {0x1, 0x4,   6, 6},
>> +    [DVBT_EN_IF_AGC]    = {0x1, 0x4,   7, 7},
>> +    [DVBT_IF_AGC_MIN]    = {0x1, 0x8,   7, 0},
>> +    [DVBT_IF_AGC_MAX]    = {0x1, 0x9,   7, 0},
>> +    [DVBT_RF_AGC_MIN]    = {0x1, 0xa,   7, 0},
>> +    [DVBT_RF_AGC_MAX]    = {0x1, 0xb,   7, 0},
>> +    [DVBT_IF_AGC_MAN]    = {0x1, 0xc,   6, 6},
>> +    [DVBT_IF_AGC_MAN_VAL]    = {0x1, 0xc,  13, 0},
>> +    [DVBT_RF_AGC_MAN]    = {0x1, 0xe,   6, 6},
>> +    [DVBT_RF_AGC_MAN_VAL]    = {0x1, 0xe,  13, 0},
>> +    [DVBT_DAGC_TRG_VAL]    = {0x1, 0x12,  7, 0},
>> +    [DVBT_AGC_TARG_VAL_0]    = {0x1, 0x2,   0, 0},
>> +    [DVBT_AGC_TARG_VAL_8_1]    = {0x1, 0x3,   7, 0},
>> +    [DVBT_AAGC_LOOP_GAIN]    = {0x1, 0xc7,  5, 1},
>> +    [DVBT_LOOP_GAIN2_3_0]    = {0x1, 0x4,   4, 1},
>> +    [DVBT_LOOP_GAIN2_4]    = {0x1, 0x5,   7, 7},
>> +    [DVBT_LOOP_GAIN3]    = {0x1, 0xc8,  4, 0},
>> +    [DVBT_VTOP1]        = {0x1, 0x6,   5, 0},
>> +    [DVBT_VTOP2]        = {0x1, 0xc9,  5, 0},
>> +    [DVBT_VTOP3]        = {0x1, 0xca,  5, 0},
>> +    [DVBT_KRF1]        = {0x1, 0xcb,  7, 0},
>> +    [DVBT_KRF2]        = {0x1, 0x7,   7, 0},
>> +    [DVBT_KRF3]        = {0x1, 0xcd,  7, 0},
>> +    [DVBT_KRF4]        = {0x1, 0xce,  7, 0},
>> +    [DVBT_EN_GI_PGA]    = {0x1, 0xe5,  0, 0},
>> +    [DVBT_THD_LOCK_UP]    = {0x1, 0xd9,  8, 0},
>> +    [DVBT_THD_LOCK_DW]    = {0x1, 0xdb,  8, 0},
>> +    [DVBT_THD_UP1]        = {0x1, 0xdd,  7, 0},
>> +    [DVBT_THD_DW1]        = {0x1, 0xde,  7, 0},
>> +    [DVBT_INTER_CNT_LEN]    = {0x1, 0xd8,  3, 0},
>> +    [DVBT_GI_PGA_STATE]    = {0x1, 0xe6,  3, 3},
>> +    [DVBT_EN_AGC_PGA]    = {0x1, 0xd7,  0, 0},
>> +    [DVBT_CKOUTPAR]        = {0x1, 0x7b,  5, 5},
>> +    [DVBT_CKOUT_PWR]    = {0x1, 0x7b,  6, 6},
>> +    [DVBT_SYNC_DUR]        = {0x1, 0x7b,  7, 7},
>> +    [DVBT_ERR_DUR]        = {0x1, 0x7c,  0, 0},
>> +    [DVBT_SYNC_LVL]        = {0x1, 0x7c,  1, 1},
>> +    [DVBT_ERR_LVL]        = {0x1, 0x7c,  2, 2},
>> +    [DVBT_VAL_LVL]        = {0x1, 0x7c,  3, 3},
>> +    [DVBT_SERIAL]        = {0x1, 0x7c,  4, 4},
>> +    [DVBT_SER_LSB]        = {0x1, 0x7c,  5, 5},
>> +    [DVBT_CDIV_PH0]        = {0x1, 0x7d,  3, 0},
>> +    [DVBT_CDIV_PH1]        = {0x1, 0x7d,  7, 4},
>> +    [DVBT_MPEG_IO_OPT_2_2]    = {0x0, 0x6,   7, 7},
>> +    [DVBT_MPEG_IO_OPT_1_0]    = {0x0, 0x7,   7, 6},
>> +    [DVBT_CKOUTPAR_PIP]    = {0x0, 0xb7,  4, 4},
>> +    [DVBT_CKOUT_PWR_PIP]    = {0x0, 0xb7,  3, 3},
>> +    [DVBT_SYNC_LVL_PIP]    = {0x0, 0xb7,  2, 2},
>> +    [DVBT_ERR_LVL_PIP]    = {0x0, 0xb7,  1, 1},
>> +    [DVBT_VAL_LVL_PIP]    = {0x0, 0xb7,  0, 0},
>> +    [DVBT_CKOUTPAR_PID]    = {0x0, 0xb9,  4, 4},
>> +    [DVBT_CKOUT_PWR_PID]    = {0x0, 0xb9,  3, 3},
>> +    [DVBT_SYNC_LVL_PID]    = {0x0, 0xb9,  2, 2},
>> +    [DVBT_ERR_LVL_PID]    = {0x0, 0xb9,  1, 1},
>> +    [DVBT_VAL_LVL_PID]    = {0x0, 0xb9,  0, 0},
>> +    [DVBT_SM_PASS]        = {0x1, 0x93, 11, 0},
>> +    [DVBT_AD7_SETTING]    = {0x0, 0x11, 15, 0},
>> +    [DVBT_RSSI_R]        = {0x3, 0x1,   6, 0},
>> +    [DVBT_ACI_DET_IND]    = {0x3, 0x12,  0, 0},
>> +    [DVBT_REG_MON]        = {0x0, 0xd,   1, 0},
>> +    [DVBT_REG_MONSEL]    = {0x0, 0xd,   2, 2},
>> +    [DVBT_REG_GPE]        = {0x0, 0xd,   7, 7},
>> +    [DVBT_REG_GPO]        = {0x0, 0x10,  0, 0},
>> +    [DVBT_REG_4MSEL]    = {0x0, 0x13,  0, 0},
>> +};
>> +
>> +/* write multiple hardware registers */
>> +static int rtl2832_wr(struct rtl2832_priv *priv, u8 reg, u8 *val, int
>> len)
>> +{
>> +    int ret;
>> +    u8 buf[1+len];
>> +    struct i2c_msg msg[1] = {
>> +        {
>> +            .addr = priv->cfg.i2c_addr,
>> +            .flags = 0,
>> +            .len = 1+len,
>> +            .buf = buf,
>> +        }
>> +    };
>> +
>> +    buf[0] = reg;
>> +    memcpy(&buf[1], val, len);
>> +
>> +    ret = i2c_transfer(priv->i2c, msg, 1);
>> +    if (ret == 1) {
>> +        ret = 0;
>> +    } else {
>> +        warn("i2c wr failed=%d reg=%02x len=%d", ret, reg, len);
>> +        ret = -EREMOTEIO;
>> +    }
>> +    return ret;
>> +}
>> +
>> +/* read multiple hardware registers */
>> +static int rtl2832_rd(struct rtl2832_priv *priv, u8 reg, u8 *val, int
>> len)
>> +{
>> +    int ret;
>> +    struct i2c_msg msg[2] = {
>> +        {
>> +            .addr = priv->cfg.i2c_addr,
>> +            .flags = 0,
>> +            .len = 1,
>> +            .buf =&reg,
>> +        }, {
>> +            .addr = priv->cfg.i2c_addr,
>> +            .flags = I2C_M_RD,
>> +            .len = len,
>> +            .buf = val,
>> +        }
>> +    };
>> +
>> +    ret = i2c_transfer(priv->i2c, msg, 2);
>> +    if (ret == 2) {
>> +        ret = 0;
>> +    } else {
>> +        warn("i2c rd failed=%d reg=%02x len=%d", ret, reg, len);
>> +        ret = -EREMOTEIO;
>> +}
>> +return ret;
>> +}
>> +
>> +/* write multiple registers */
>> +static int rtl2832_wr_regs(struct rtl2832_priv *priv, u8 reg, u8
>> page, u8 *val,
>> +    int len)
>> +{
>> +    int ret;
>> +
>> +
>> +    /* switch bank if needed */
>> +    if (page != priv->page) {
>> +        ret = rtl2832_wr(priv, 0x00,&page, 1);
>> +        if (ret)
>> +            return ret;
>> +
>> +        priv->page = page;
>> +}
>> +
>> +return rtl2832_wr(priv, reg, val, len);
>> +}
>> +
>> +/* read multiple registers */
>> +static int rtl2832_rd_regs(struct rtl2832_priv *priv, u8 reg, u8
>> page, u8 *val,
>> +    int len)
>> +{
>> +    int ret;
>> +
>> +    /* switch bank if needed */
>> +    if (page != priv->page) {
>> +        ret = rtl2832_wr(priv, 0x00,&page, 1);
>> +        if (ret)
>> +            return ret;
>> +
>> +        priv->page = page;
>> +    }
>> +
>> +    return rtl2832_rd(priv, reg, val, len);
>> +}
>> +
>> +#if 0 /* currently not used */
>> +/* write single register */
>> +static int rtl2832_wr_reg(struct rtl2832_priv *priv, u8 reg, u8 page,
>> u8 val)
>> +{
>> +    return rtl2832_wr_regs(priv, reg, page,&val, 1);
>> +}
>> +#endif
>> +
>> +/* read single register */
>> +static int rtl2832_rd_reg(struct rtl2832_priv *priv, u8 reg, u8 page,
>> u8 *val)
>> +{
>> +    return rtl2832_rd_regs(priv, reg, page, val, 1);
>> +}
>> +
>> +int rtl2832_rd_demod_reg(struct rtl2832_priv *priv, int reg, u32 *val)
>> +{
>> +    int ret;
>> +
>> +    u8 reg_start_addr;
>> +    u8 msb, lsb;
>> +    u8 page;
>> +    u8 reading[4];
>> +    u32 reading_tmp;
>> +    int i;
>> +
>> +    u8 len;
>> +    u32 mask;
>> +
>> +    reg_start_addr = registers[reg].start_address;
>> +    msb = registers[reg].msb;
>> +    lsb = registers[reg].lsb;
>> +    page = registers[reg].page;
>> +
>> +    len = (msb>>  3) + 1;
>> +    mask = reg_mask[msb-lsb];
> 
> You should use spaces here. See Documentation/CodingStyle line 206.
> 
>> +
>> +
>> +    ret = rtl2832_rd_regs(priv, reg_start_addr, page,&reading[0], len);
>> +    if (ret)
>> +        goto err;
>> +
>> +    reading_tmp = 0;
>> +    for (i = 0; i<  len; i++)
>> +        reading_tmp |= reading[i]<<  ((len-1-i)*8);
> 
> You should use spaces here. See Documentation/CodingStyle line 206.
> 
>> +
>> +    *val = (reading_tmp>>  lsb)&  mask;
>> +
>> +    return ret;
>> +
>> +err:
>> +    dbg("%s: failed=%d", __func__, ret);
>> +    return ret;
>> +
>> +}
>> +
>> +int rtl2832_wr_demod_reg(struct rtl2832_priv *priv, int reg, u32 val)
>> +{
>> +    int ret, i;
>> +    u8 len;
>> +    u8 reg_start_addr;
>> +    u8 msb, lsb;
>> +    u8 page;
>> +    u32 mask;
>> +
>> +
>> +    u8 reading[4];
>> +    u8 writing[4];
>> +    u32 reading_tmp;
>> +    u32 writing_tmp;
>> +
>> +
>> +    reg_start_addr = registers[reg].start_address;
>> +    msb = registers[reg].msb;
>> +    lsb = registers[reg].lsb;
>> +    page = registers[reg].page;
>> +
>> +    len = (msb>>  3) + 1;
>> +    mask = reg_mask[msb-lsb];
> 
> You should use spaces here. See Documentation/CodingStyle line 206.
> 
>> +
>> +
>> +    ret = rtl2832_rd_regs(priv, reg_start_addr, page,&reading[0], len);
>> +    if (ret)
>> +        goto err;
>> +
>> +    reading_tmp = 0;
>> +    for (i = 0; i<  len; i++)
>> +        reading_tmp |= reading[i]<<  ((len-1-i)*8);
> 
> You should use spaces here. See Documentation/CodingStyle line 206.
> 
>> +
>> +    writing_tmp = reading_tmp&  ~(mask<<  lsb);
>> +    writing_tmp |= ((val&  mask)<<  lsb);
>> +
>> +
>> +    for (i = 0; i<  len; i++)
>> +        writing[i] = (writing_tmp>>  ((len-1-i)*8))&  0xff;
> 
> You should use spaces here. See Documentation/CodingStyle line 206.
> 
>> +
>> +    ret = rtl2832_wr_regs(priv, reg_start_addr, page,&writing[0], len);
>> +    if (ret)
>> +        goto err;
>> +
>> +    return ret;
>> +
>> +err:
>> +    dbg("%s: failed=%d", __func__, ret);
>> +    return ret;
>> +
>> +}
>> +
>> +
>> +static int rtl2832_i2c_gate_ctrl(struct dvb_frontend *fe, int enable)
>> +{
>> +    int ret;
>> +    struct rtl2832_priv *priv = fe->demodulator_priv;
>> +
>> +    dbg("%s: enable=%d", __func__, enable);
>> +
>> +    /* gate already open or close */
>> +    if (priv->i2c_gate_state == enable)
>> +        return 0;
>> +
>> +    ret = rtl2832_wr_demod_reg(priv, DVBT_IIC_REPEAT, (enable ? 0x1 :
>> 0x0));
>> +
>> +    if (ret)
>> +        goto err;
> 
> Excessive newline between function call and error check.
> 
>> +
>> +    priv->i2c_gate_state = enable;
>> +
>> +    return ret;
>> +err:
>> +    dbg("%s: failed=%d", __func__, ret);
>> +    return ret;
>> +}
>> +
>> +
>> +
>> +static int rtl2832_init(struct dvb_frontend *fe)
>> +{
>> +    struct rtl2832_priv *priv = fe->demodulator_priv;
>> +    int i, ret;
>> +
>> +    u8 en_bbin;
>> +    u64 pset_iffreq;
>> +
>> +    /* initialization values for the demodulator registers */
>> +    struct rtl2832_reg_value rtl2832_initial_regs[] = {
>> +        {DVBT_AD_EN_REG,        0x1},
>> +        {DVBT_AD_EN_REG1,        0x1},
>> +        {DVBT_RSD_BER_FAIL_VAL,        0x2800},
>> +        {DVBT_MGD_THD0,            0x10},
>> +        {DVBT_MGD_THD1,            0x20},
>> +        {DVBT_MGD_THD2,            0x20},
>> +        {DVBT_MGD_THD3,            0x40},
>> +        {DVBT_MGD_THD4,            0x22},
>> +        {DVBT_MGD_THD5,            0x32},
>> +        {DVBT_MGD_THD6,            0x37},
>> +        {DVBT_MGD_THD7,            0x39},
>> +        {DVBT_EN_BK_TRK,        0x0},
>> +        {DVBT_EN_CACQ_NOTCH,        0x0},
>> +        {DVBT_AD_AV_REF,        0x2a},
>> +        {DVBT_REG_PI,            0x6},
>> +        {DVBT_PIP_ON,            0x0},
>> +        {DVBT_CDIV_PH0,            0x8},
>> +        {DVBT_CDIV_PH1,            0x8},
>> +        {DVBT_SCALE1_B92,        0x4},
>> +        {DVBT_SCALE1_B93,        0xb0},
>> +        {DVBT_SCALE1_BA7,        0x78},
>> +        {DVBT_SCALE1_BA9,        0x28},
>> +        {DVBT_SCALE1_BAA,        0x59},
>> +        {DVBT_SCALE1_BAB,        0x83},
>> +        {DVBT_SCALE1_BAC,        0xd4},
>> +        {DVBT_SCALE1_BB0,        0x65},
>> +        {DVBT_SCALE1_BB1,        0x43},
>> +        {DVBT_KB_P1,            0x1},
>> +        {DVBT_KB_P2,            0x4},
>> +        {DVBT_KB_P3,            0x7},
>> +        {DVBT_K1_CR_STEP12,        0xa},
>> +        {DVBT_REG_GPE,            0x1},
>> +        {DVBT_SERIAL,            0x0},
>> +        {DVBT_CDIV_PH0,            0x9},
>> +        {DVBT_CDIV_PH1,            0x9},
>> +        {DVBT_MPEG_IO_OPT_2_2,        0x0},
>> +        {DVBT_MPEG_IO_OPT_1_0,        0x0},
>> +        {DVBT_TRK_KS_P2,        0x4},
>> +        {DVBT_TRK_KS_I2,        0x7},
>> +        {DVBT_TR_THD_SET2,        0x6},
>> +        {DVBT_TRK_KC_I2,        0x5},
>> +        {DVBT_CR_THD_SET2,        0x1},
>> +        {DVBT_SPEC_INV,            0x0},
>> +        {DVBT_DAGC_TRG_VAL,        0x5a},
>> +        {DVBT_AGC_TARG_VAL_0,        0x0},
>> +        {DVBT_AGC_TARG_VAL_8_1,        0x5a},
>> +        {DVBT_AAGC_LOOP_GAIN,        0x16},
>> +        {DVBT_LOOP_GAIN2_3_0,        0x6},
>> +        {DVBT_LOOP_GAIN2_4,        0x1},
>> +        {DVBT_LOOP_GAIN3,        0x16},
>> +        {DVBT_VTOP1,            0x35},
>> +        {DVBT_VTOP2,            0x21},
>> +        {DVBT_VTOP3,            0x21},
>> +        {DVBT_KRF1,            0x0},
>> +        {DVBT_KRF2,            0x40},
>> +        {DVBT_KRF3,            0x10},
>> +        {DVBT_KRF4,            0x10},
>> +        {DVBT_IF_AGC_MIN,        0x80},
>> +        {DVBT_IF_AGC_MAX,        0x7f},
>> +        {DVBT_RF_AGC_MIN,        0x80},
>> +        {DVBT_RF_AGC_MAX,        0x7f},
>> +        {DVBT_POLAR_RF_AGC,        0x0},
>> +        {DVBT_POLAR_IF_AGC,        0x0},
>> +        {DVBT_AD7_SETTING,        0xe9bf},
>> +        {DVBT_EN_GI_PGA,        0x0},
>> +        {DVBT_THD_LOCK_UP,        0x0},
>> +        {DVBT_THD_LOCK_DW,        0x0},
>> +        {DVBT_THD_UP1,            0x11},
>> +        {DVBT_THD_DW1,            0xef},
>> +        {DVBT_INTER_CNT_LEN,        0xc},
>> +        {DVBT_GI_PGA_STATE,        0x0},
>> +        {DVBT_EN_AGC_PGA,        0x1},
>> +        {DVBT_IF_AGC_MAN,        0x0},
>> +    };
>> +
>> +
>> +    dbg("%s", __func__);
>> +
>> +    en_bbin = (priv->cfg.if_dvbt == 0 ? 0x1 : 0x0);
>> +
>> +    /*
>> +    * PSET_IFFREQ = - floor((IfFreqHz % CrystalFreqHz) * pow(2, 22)
>> +    *        / CrystalFreqHz)
>> +    */
>> +    pset_iffreq = priv->cfg.if_dvbt % priv->cfg.xtal;
>> +    pset_iffreq *= 0x400000;
>> +    pset_iffreq = div_u64(pset_iffreq, priv->cfg.xtal);
>> +    pset_iffreq = pset_iffreq&  0x3fffff;
>> +
>> +
>> +
>> +    for (i = 0; i<  ARRAY_SIZE(rtl2832_initial_regs); i++) {
>> +        ret = rtl2832_wr_demod_reg(priv, rtl2832_initial_regs[i].reg,
>> +            rtl2832_initial_regs[i].value);
>> +        if (ret)
>> +            goto err;
>> +    }
>> +
>> +    /* if frequency settings */
>> +    ret = rtl2832_wr_demod_reg(priv, DVBT_EN_BBIN, en_bbin);
>> +        if (ret)
>> +            goto err;
>> +
>> +    ret = rtl2832_wr_demod_reg(priv, DVBT_PSET_IFFREQ, pset_iffreq);
>> +        if (ret)
>> +            goto err;
>> +
>> +    priv->sleeping = false;
>> +
>> +    return ret;
>> +
>> +err:
>> +    dbg("%s: failed=%d", __func__, ret);
>> +    return ret;
>> +}
>> +
>> +static int rtl2832_sleep(struct dvb_frontend *fe)
>> +{
>> +    struct rtl2832_priv *priv = fe->demodulator_priv;
>> +
>> +    dbg("%s", __func__);
>> +    priv->sleeping = true;
>> +    return 0;
>> +}
>> +
>> +int rtl2832_get_tune_settings(struct dvb_frontend *fe,
>> +    struct dvb_frontend_tune_settings *s)
>> +{
>> +    dbg("%s", __func__);
>> +    s->min_delay_ms = 1000;
>> +    s->step_size = fe->ops.info.frequency_stepsize * 2;
>> +    s->max_drift = (fe->ops.info.frequency_stepsize * 2) + 1;
>> +    return 0;
>> +}
>> +
>> +static int rtl2832_set_frontend(struct dvb_frontend *fe)
>> +{
>> +    struct rtl2832_priv *priv = fe->demodulator_priv;
>> +    struct dtv_frontend_properties *c =&fe->dtv_property_cache;
>> +    int ret, i, j;
>> +    u64 bw_mode, num, num2;
>> +    u32 resamp_ratio, cfreq_off_ratio;
>> +
>> +
>> +    static u8 bw_params[3][32] = {
>> +    /* 6 MHz bandwidth */
>> +        {
>> +        0xf5, 0xff, 0x15, 0x38, 0x5d, 0x6d, 0x52, 0x07, 0xfa, 0x2f,
>> +        0x53, 0xf5, 0x3f, 0xca, 0x0b, 0x91, 0xea, 0x30, 0x63, 0xb2,
>> +        0x13, 0xda, 0x0b, 0xc4, 0x18, 0x7e, 0x16, 0x66, 0x08, 0x67,
>> +        0x19, 0xe0,
>> +        },
>> +
>> +    /*  7 MHz bandwidth */
>> +        {
>> +        0xe7, 0xcc, 0xb5, 0xba, 0xe8, 0x2f, 0x67, 0x61, 0x00, 0xaf,
>> +        0x86, 0xf2, 0xbf, 0x59, 0x04, 0x11, 0xb6, 0x33, 0xa4, 0x30,
>> +        0x15, 0x10, 0x0a, 0x42, 0x18, 0xf8, 0x17, 0xd9, 0x07, 0x22,
>> +        0x19, 0x10,
>> +        },
>> +
>> +    /*  8 MHz bandwidth */
>> +        {
>> +        0x09, 0xf6, 0xd2, 0xa7, 0x9a, 0xc9, 0x27, 0x77, 0x06, 0xbf,
>> +        0xec, 0xf4, 0x4f, 0x0b, 0xfc, 0x01, 0x63, 0x35, 0x54, 0xa7,
>> +        0x16, 0x66, 0x08, 0xb4, 0x19, 0x6e, 0x19, 0x65, 0x05, 0xc8,
>> +        0x19, 0xe0,
>> +        },
>> +    };
>> +
>> +
>> +    dbg("%s: frequency=%d bandwidth_hz=%d inversion=%d", __func__,
>> +        c->frequency, c->bandwidth_hz, c->inversion);
>> +
>> +
>> +    /* program tuner */
>> +    if (fe->ops.tuner_ops.set_params)
>> +        fe->ops.tuner_ops.set_params(fe);
>> +
>> +
>> +    switch (c->bandwidth_hz) {
>> +    case 6000000:
>> +        i = 0;
>> +        bw_mode = 48000000;
>> +        break;
>> +    case 7000000:
>> +        i = 1;
>> +        bw_mode = 56000000;
>> +        break;
>> +    case 8000000:
>> +        i = 2;
>> +        bw_mode = 64000000;
>> +        break;
>> +    default:
>> +        dbg("invalid bandwidth");
>> +        return -EINVAL;
>> +    }
>> +
>> +    for (j = 0; j<  sizeof(bw_params[j]); j++) {
>> +        ret = rtl2832_wr_regs(priv, 0x1c+j, 1,&bw_params[i][j], 1);
>> +        if (ret)
>> +            goto err;
>> +    }
>> +
>> +    /* calculate and set resample ratio
>> +    * RSAMP_RATIO = floor(CrystalFreqHz * 7 * pow(2, 22)
>> +    *    / ConstWithBandwidthMode)
>> +    */
>> +    num = priv->cfg.xtal * 7;
>> +    num *= 0x400000;
>> +    num = div_u64(num, bw_mode);
>> +    resamp_ratio =  num&  0x3ffffff;
>> +    ret = rtl2832_wr_demod_reg(priv, DVBT_RSAMP_RATIO, resamp_ratio);
>> +    if (ret)
>> +        goto err;
>> +
>> +    /* calculate and set cfreq off ratio
>> +    * CFREQ_OFF_RATIO = - floor(ConstWithBandwidthMode * pow(2, 20)
>> +    *    / (CrystalFreqHz * 7))
>> +    */
>> +    num = bw_mode<<  20;
>> +    num2 = priv->cfg.xtal * 7;
>> +    num = div_u64(num, num2);
>> +    num = -num;
>> +    cfreq_off_ratio = num&  0xfffff;
>> +    ret = rtl2832_wr_demod_reg(priv, DVBT_CFREQ_OFF_RATIO,
>> cfreq_off_ratio);
>> +    if (ret)
>> +        goto err;
>> +
>> +
>> +    /* soft reset */
>> +    ret = rtl2832_wr_demod_reg(priv, DVBT_SOFT_RST, 0x1);
>> +    if (ret)
>> +        goto err;
>> +
>> +    ret = rtl2832_wr_demod_reg(priv, DVBT_SOFT_RST, 0x0);
>> +    if (ret)
>> +        goto err;
>> +
>> +    return ret;
>> +err:
>> +    info("%s: failed=%d", __func__, ret);
>> +    return ret;
>> +}
>> +
>> +static int rtl2832_read_status(struct dvb_frontend *fe, fe_status_t
>> *status)
>> +{
>> +    struct rtl2832_priv *priv = fe->demodulator_priv;
>> +    int ret;
>> +    u32 tmp;
>> +    *status = 0;
>> +
>> +
>> +    dbg("%s", __func__);
>> +    if (priv->sleeping)
>> +        return 0;
>> +
>> +    ret = rtl2832_rd_demod_reg(priv, DVBT_FSM_STAGE,&tmp);
>> +    if (ret)
>> +        goto err;
>> +
>> +    if (tmp == 11) {
>> +        *status |= FE_HAS_SIGNAL | FE_HAS_CARRIER |
>> +                FE_HAS_VITERBI | FE_HAS_SYNC | FE_HAS_LOCK;
>> +    }
>> +    /* TODO find out if this is also true for rtl2832? */
>> +    /*else if (tmp == 10) {
>> +        *status |= FE_HAS_SIGNAL | FE_HAS_CARRIER |
>> +                FE_HAS_VITERBI;
>> +    }*/
>> +
>> +    return ret;
>> +err:
>> +    info("%s: failed=%d", __func__, ret);
>> +    return ret;
>> +}
>> +
>> +static int rtl2832_read_snr(struct dvb_frontend *fe, u16 *snr)
>> +{
>> +    *snr = 0;
>> +    return 0;
>> +}
>> +
>> +static int rtl2832_read_ber(struct dvb_frontend *fe, u32 *ber)
>> +{
>> +    *ber = 0;
>> +    return 0;
>> +}
>> +
>> +static int rtl2832_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
>> +{
>> +    *ucblocks = 0;
>> +    return 0;
>> +}
>> +
>> +
>> +static int rtl2832_read_signal_strength(struct dvb_frontend *fe, u16
>> *strength)
>> +{
>> +    *strength = 0;
>> +    return 0;
>> +}
>> +
>> +static struct dvb_frontend_ops rtl2832_ops;
>> +
>> +static void rtl2832_release(struct dvb_frontend *fe)
>> +{
>> +    struct rtl2832_priv *priv = fe->demodulator_priv;
>> +
>> +    dbg("%s", __func__);
>> +    kfree(priv);
>> +}
>> +
>> +struct dvb_frontend *rtl2832_attach(const struct rtl2832_config *cfg,
>> +    struct i2c_adapter *i2c)
>> +{
>> +    struct rtl2832_priv *priv = NULL;
>> +    int ret = 0;
>> +    u8 tmp;
>> +
>> +    dbg("%s", __func__);
>> +
>> +    /* allocate memory for the internal state */
>> +    priv = kzalloc(sizeof(struct rtl2832_priv), GFP_KERNEL);
>> +    if (priv == NULL)
>> +        goto err;
>> +
>> +    /* setup the priv */
>> +    priv->i2c = i2c;
>> +    priv->tuner = cfg->tuner;
>> +    memcpy(&priv->cfg, cfg, sizeof(struct rtl2832_config));
>> +
>> +    /* check if the demod is there */
>> +    ret = rtl2832_rd_reg(priv, 0x00, 0x0,&tmp);
>> +    if (ret)
>> +        goto err;
>> +
>> +    /* create dvb_frontend */
>> +    memcpy(&priv->fe.ops,&rtl2832_ops, sizeof(struct dvb_frontend_ops));
>> +    priv->fe.demodulator_priv = priv;
>> +
>> +    /* TODO implement sleep mode */
>> +    priv->sleeping = true;
>> +
>> +    return&priv->fe;
>> +err:
>> +    dbg("%s: failed=%d", __func__, ret);
>> +    kfree(priv);
>> +    return NULL;
>> +}
>> +EXPORT_SYMBOL(rtl2832_attach);
>> +
>> +static struct dvb_frontend_ops rtl2832_ops = {
>> +    .delsys = { SYS_DVBT },
>> +    .info = {
>> +        .name = "Realtek RTL2832 (DVB-T)",
>> +        .frequency_min      = 174000000,
>> +        .frequency_max      = 862000000,
>> +        .frequency_stepsize = 166667,
>> +        .caps = FE_CAN_FEC_1_2 |
>> +            FE_CAN_FEC_2_3 |
>> +            FE_CAN_FEC_3_4 |
>> +            FE_CAN_FEC_5_6 |
>> +            FE_CAN_FEC_7_8 |
>> +            FE_CAN_FEC_AUTO |
>> +            FE_CAN_QPSK |
>> +            FE_CAN_QAM_16 |
>> +            FE_CAN_QAM_64 |
>> +            FE_CAN_QAM_AUTO |
>> +            FE_CAN_TRANSMISSION_MODE_AUTO |
>> +            FE_CAN_GUARD_INTERVAL_AUTO |
>> +            FE_CAN_HIERARCHY_AUTO |
>> +            FE_CAN_RECOVER |
>> +            FE_CAN_MUTE_TS
>> +     },
>> +
>> +    .release = rtl2832_release,
>> +
>> +    .init = rtl2832_init,
>> +    .sleep = rtl2832_sleep,
>> +
>> +    .get_tune_settings = rtl2832_get_tune_settings,
>> +
>> +    .set_frontend = rtl2832_set_frontend,
>> +
>> +    .read_status = rtl2832_read_status,
>> +    .read_snr = rtl2832_read_snr,
>> +    .read_ber = rtl2832_read_ber,
>> +    .read_ucblocks = rtl2832_read_ucblocks,
>> +    .read_signal_strength = rtl2832_read_signal_strength,
>> +    .i2c_gate_ctrl = rtl2832_i2c_gate_ctrl,
>> +};
>> +
>> +MODULE_AUTHOR("Thomas Mair<mair.thomas86@gmail.com>");
>> +MODULE_DESCRIPTION("Realtek RTL2832 DVB-T demodulator driver");
>> +MODULE_LICENSE("GPL");
>> +MODULE_VERSION("0.4");
>> diff --git a/drivers/media/dvb/frontends/rtl2832.h
>> b/drivers/media/dvb/frontends/rtl2832.h
>> new file mode 100644
>> index 0000000..d94dc9a
>> --- /dev/null
>> +++ b/drivers/media/dvb/frontends/rtl2832.h
>> @@ -0,0 +1,74 @@
>> +/*
>> + * Realtek RTL2832 DVB-T demodulator driver
>> + *
>> + * Copyright (C) 2012 Thomas Mair<thomas.mair86@gmail.com>
>> + *
>> + *    This program is free software; you can redistribute it and/or
>> modify
>> + *    it under the terms of the GNU General Public License as
>> published by
>> + *    the Free Software Foundation; either version 2 of the License, or
>> + *    (at your option) any later version.
>> + *
>> + *    This program is distributed in the hope that it will be useful,
>> + *    but WITHOUT ANY WARRANTY; without even the implied warranty of
>> + *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>> + *    GNU General Public License for more details.
>> + *
>> + *    You should have received a copy of the GNU General Public
>> License along
>> + *    with this program; if not, write to the Free Software
>> Foundation, Inc.,
>> + *    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
>> + */
>> +
>> +#ifndef RTL2832_H
>> +#define RTL2832_H
>> +
>> +#include<linux/dvb/frontend.h>
>> +
>> +struct rtl2832_config {
>> +    /*
>> +     * Demodulator I2C address.
>> +     */
>> +    u8 i2c_addr;
>> +
>> +    /*
>> +     * Xtal frequency.
>> +     * Hz
>> +     * 4000000, 16000000, 25000000, 28800000
>> +     */
>> +    u32 xtal;
>> +
>> +    /*
>> +     * IFs for all used modes.
>> +     * Hz
>> +     * 4570000, 4571429, 36000000, 36125000, 36166667, 44000000
>> +     */
>> +    u32 if_dvbt;
>> +
>> +    /*
>> +     */
>> +    u8 tuner;
>> +};
>> +
>> +
>> +#if defined(CONFIG_DVB_RTL2832) || \
>> +    (defined(CONFIG_DVB_RTL2832_MODULE)&&  defined(MODULE))
>> +extern struct dvb_frontend *rtl2832_attach(
>> +    const struct rtl2832_config *cfg,
>> +    struct i2c_adapter *i2c
>> +);
>> +
>> +extern struct i2c_adapter *rtl2832_get_tuner_i2c_adapter(
>> +    struct dvb_frontend *fe
>> +);
>> +#else
>> +static inline struct dvb_frontend *rtl2832_attach(
>> +    const struct rtl2832_config *config,
>> +    struct i2c_adapter *i2c
>> +)
>> +{
>> +    printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
>> +    return NULL;
>> +}
>> +#endif
>> +
>> +
>> +#endif /* RTL2832_H */
>> diff --git a/drivers/media/dvb/frontends/rtl2832_priv.h
>> b/drivers/media/dvb/frontends/rtl2832_priv.h
>> new file mode 100644
>> index 0000000..3e52674
>> --- /dev/null
>> +++ b/drivers/media/dvb/frontends/rtl2832_priv.h
>> @@ -0,0 +1,258 @@
>> +/*
>> + * Realtek RTL2832 DVB-T demodulator driver
>> + *
>> + * Copyright (C) 2012 Thomas Mair<thomas.mair86@gmail.com>
>> + *
>> + *    This program is free software; you can redistribute it and/or
>> modify
>> + *    it under the terms of the GNU General Public License as
>> published by
>> + *    the Free Software Foundation; either version 2 of the License, or
>> + *    (at your option) any later version.
>> + *
>> + *    This program is distributed in the hope that it will be useful,
>> + *    but WITHOUT ANY WARRANTY; without even the implied warranty of
>> + *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>> + *    GNU General Public License for more details.
>> + *
>> + *    You should have received a copy of the GNU General Public
>> License along
>> + *    with this program; if not, write to the Free Software
>> Foundation, Inc.,
>> + *    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
>> + */
>> +
>> +#ifndef RTL2832_PRIV_H
>> +#define RTL2832_PRIV_H
>> +
>> +#include "dvb_frontend.h"
>> +#include "rtl2832.h"
>> +
>> +#define LOG_PREFIX "rtl2832"
>> +
>> +#undef dbg
>> +#define dbg(f, arg...) \
>> +    if (rtl2832_debug) \
>> +        printk(KERN_INFO LOG_PREFIX": " f "\n" , ## arg)
> 
> ERROR: Macros with complex values should be enclosed in parenthesis
> #30: FILE: media/dvb/frontends/rtl2832_priv.h:30:
> +#define dbg(f, arg...) \
> +    if (rtl2832_debug) \
> +        printk(KERN_INFO LOG_PREFIX": " f "\n" , ## arg)
> 
>> +#undef err
>> +#define err(f, arg...)  printk(KERN_ERR    LOG_PREFIX": " f "\n" , ##
>> arg)
>> +#undef info
>> +#define info(f, arg...) printk(KERN_INFO LOG_PREFIX": " f "\n" , ## arg)
>> +#undef warn
>> +#define warn(f, arg...) printk(KERN_WARNING LOG_PREFIX": " f "\n" ,
>> ## arg)
>> +
>> +struct rtl2832_priv {
>> +    struct i2c_adapter *i2c;
>> +    struct dvb_frontend fe;
>> +    struct rtl2832_config cfg;
>> +
>> +    bool i2c_gate_state;
>> +    bool sleeping;
>> +
>> +    u8 tuner;
>> +    u8 page; /* active register page */
>> +};
>> +
>> +struct rtl2832_reg_entry {
>> +    u8 page;
>> +    u8 start_address;
>> +    u8 msb;
>> +    u8 lsb;
>> +};
>> +
>> +struct rtl2832_reg_value {
>> +    int reg;
> 
> As this reg is enum I wonder if it is possible to use enum as a type
> (enum reg)? Still I am not sure about it and I dont like to test it :)
> 
>> +    u32 value;
>> +};
>> +
>> +
>> +/* Demod register bit names */
>> +enum DVBT_REG_BIT_NAME {
>> +    DVBT_SOFT_RST,
>> +    DVBT_IIC_REPEAT,
>> +    DVBT_TR_WAIT_MIN_8K,
>> +    DVBT_RSD_BER_FAIL_VAL,
>> +    DVBT_EN_BK_TRK,
>> +    DVBT_REG_PI,
>> +    DVBT_REG_PFREQ_1_0,
>> +    DVBT_PD_DA8,
>> +    DVBT_LOCK_TH,
>> +    DVBT_BER_PASS_SCAL,
>> +    DVBT_CE_FFSM_BYPASS,
>> +    DVBT_ALPHAIIR_N,
>> +    DVBT_ALPHAIIR_DIF,
>> +    DVBT_EN_TRK_SPAN,
>> +    DVBT_LOCK_TH_LEN,
>> +    DVBT_CCI_THRE,
>> +    DVBT_CCI_MON_SCAL,
>> +    DVBT_CCI_M0,
>> +    DVBT_CCI_M1,
>> +    DVBT_CCI_M2,
>> +    DVBT_CCI_M3,
>> +    DVBT_SPEC_INIT_0,
>> +    DVBT_SPEC_INIT_1,
>> +    DVBT_SPEC_INIT_2,
>> +    DVBT_AD_EN_REG,
>> +    DVBT_AD_EN_REG1,
>> +    DVBT_EN_BBIN,
>> +    DVBT_MGD_THD0,
>> +    DVBT_MGD_THD1,
>> +    DVBT_MGD_THD2,
>> +    DVBT_MGD_THD3,
>> +    DVBT_MGD_THD4,
>> +    DVBT_MGD_THD5,
>> +    DVBT_MGD_THD6,
>> +    DVBT_MGD_THD7,
>> +    DVBT_EN_CACQ_NOTCH,
>> +    DVBT_AD_AV_REF,
>> +    DVBT_PIP_ON,
>> +    DVBT_SCALE1_B92,
>> +    DVBT_SCALE1_B93,
>> +    DVBT_SCALE1_BA7,
>> +    DVBT_SCALE1_BA9,
>> +    DVBT_SCALE1_BAA,
>> +    DVBT_SCALE1_BAB,
>> +    DVBT_SCALE1_BAC,
>> +    DVBT_SCALE1_BB0,
>> +    DVBT_SCALE1_BB1,
>> +    DVBT_KB_P1,
>> +    DVBT_KB_P2,
>> +    DVBT_KB_P3,
>> +    DVBT_OPT_ADC_IQ,
>> +    DVBT_AD_AVI,
>> +    DVBT_AD_AVQ,
>> +    DVBT_K1_CR_STEP12,
>> +    DVBT_TRK_KS_P2,
>> +    DVBT_TRK_KS_I2,
>> +    DVBT_TR_THD_SET2,
>> +    DVBT_TRK_KC_P2,
>> +    DVBT_TRK_KC_I2,
>> +    DVBT_CR_THD_SET2,
>> +    DVBT_PSET_IFFREQ,
>> +    DVBT_SPEC_INV,
>> +    DVBT_BW_INDEX,
>> +    DVBT_RSAMP_RATIO,
>> +    DVBT_CFREQ_OFF_RATIO,
>> +    DVBT_FSM_STAGE,
>> +    DVBT_RX_CONSTEL,
>> +    DVBT_RX_HIER,
>> +    DVBT_RX_C_RATE_LP,
>> +    DVBT_RX_C_RATE_HP,
>> +    DVBT_GI_IDX,
>> +    DVBT_FFT_MODE_IDX,
>> +    DVBT_RSD_BER_EST,
>> +    DVBT_CE_EST_EVM,
>> +    DVBT_RF_AGC_VAL,
>> +    DVBT_IF_AGC_VAL,
>> +    DVBT_DAGC_VAL,
>> +    DVBT_SFREQ_OFF,
>> +    DVBT_CFREQ_OFF,
>> +    DVBT_POLAR_RF_AGC,
>> +    DVBT_POLAR_IF_AGC,
>> +    DVBT_AAGC_HOLD,
>> +    DVBT_EN_RF_AGC,
>> +    DVBT_EN_IF_AGC,
>> +    DVBT_IF_AGC_MIN,
>> +    DVBT_IF_AGC_MAX,
>> +    DVBT_RF_AGC_MIN,
>> +    DVBT_RF_AGC_MAX,
>> +    DVBT_IF_AGC_MAN,
>> +    DVBT_IF_AGC_MAN_VAL,
>> +    DVBT_RF_AGC_MAN,
>> +    DVBT_RF_AGC_MAN_VAL,
>> +    DVBT_DAGC_TRG_VAL,
>> +    DVBT_AGC_TARG_VAL,
>> +    DVBT_LOOP_GAIN_3_0,
>> +    DVBT_LOOP_GAIN_4,
>> +    DVBT_VTOP,
>> +    DVBT_KRF,
>> +    DVBT_AGC_TARG_VAL_0,
>> +    DVBT_AGC_TARG_VAL_8_1,
>> +    DVBT_AAGC_LOOP_GAIN,
>> +    DVBT_LOOP_GAIN2_3_0,
>> +    DVBT_LOOP_GAIN2_4,
>> +    DVBT_LOOP_GAIN3,
>> +    DVBT_VTOP1,
>> +    DVBT_VTOP2,
>> +    DVBT_VTOP3,
>> +    DVBT_KRF1,
>> +    DVBT_KRF2,
>> +    DVBT_KRF3,
>> +    DVBT_KRF4,
>> +    DVBT_EN_GI_PGA,
>> +    DVBT_THD_LOCK_UP,
>> +    DVBT_THD_LOCK_DW,
>> +    DVBT_THD_UP1,
>> +    DVBT_THD_DW1,
>> +    DVBT_INTER_CNT_LEN,
>> +    DVBT_GI_PGA_STATE,
>> +    DVBT_EN_AGC_PGA,
>> +    DVBT_CKOUTPAR,
>> +    DVBT_CKOUT_PWR,
>> +    DVBT_SYNC_DUR,
>> +    DVBT_ERR_DUR,
>> +    DVBT_SYNC_LVL,
>> +    DVBT_ERR_LVL,
>> +    DVBT_VAL_LVL,
>> +    DVBT_SERIAL,
>> +    DVBT_SER_LSB,
>> +    DVBT_CDIV_PH0,
>> +    DVBT_CDIV_PH1,
>> +    DVBT_MPEG_IO_OPT_2_2,
>> +    DVBT_MPEG_IO_OPT_1_0,
>> +    DVBT_CKOUTPAR_PIP,
>> +    DVBT_CKOUT_PWR_PIP,
>> +    DVBT_SYNC_LVL_PIP,
>> +    DVBT_ERR_LVL_PIP,
>> +    DVBT_VAL_LVL_PIP,
>> +    DVBT_CKOUTPAR_PID,
>> +    DVBT_CKOUT_PWR_PID,
>> +    DVBT_SYNC_LVL_PID,
>> +    DVBT_ERR_LVL_PID,
>> +    DVBT_VAL_LVL_PID,
>> +    DVBT_SM_PASS,
>> +    DVBT_UPDATE_REG_2,
>> +    DVBT_BTHD_P3,
>> +    DVBT_BTHD_D3,
>> +    DVBT_FUNC4_REG0,
>> +    DVBT_FUNC4_REG1,
>> +    DVBT_FUNC4_REG2,
>> +    DVBT_FUNC4_REG3,
>> +    DVBT_FUNC4_REG4,
>> +    DVBT_FUNC4_REG5,
>> +    DVBT_FUNC4_REG6,
>> +    DVBT_FUNC4_REG7,
>> +    DVBT_FUNC4_REG8,
>> +    DVBT_FUNC4_REG9,
>> +    DVBT_FUNC4_REG10,
>> +    DVBT_FUNC5_REG0,
>> +    DVBT_FUNC5_REG1,
>> +    DVBT_FUNC5_REG2,
>> +    DVBT_FUNC5_REG3,
>> +    DVBT_FUNC5_REG4,
>> +    DVBT_FUNC5_REG5,
>> +    DVBT_FUNC5_REG6,
>> +    DVBT_FUNC5_REG7,
>> +    DVBT_FUNC5_REG8,
>> +    DVBT_FUNC5_REG9,
>> +    DVBT_FUNC5_REG10,
>> +    DVBT_FUNC5_REG11,
>> +    DVBT_FUNC5_REG12,
>> +    DVBT_FUNC5_REG13,
>> +    DVBT_FUNC5_REG14,
>> +    DVBT_FUNC5_REG15,
>> +    DVBT_FUNC5_REG16,
>> +    DVBT_FUNC5_REG17,
>> +    DVBT_FUNC5_REG18,
>> +    DVBT_AD7_SETTING,
>> +    DVBT_RSSI_R,
>> +    DVBT_ACI_DET_IND,
>> +    DVBT_REG_MON,
>> +    DVBT_REG_MONSEL,
>> +    DVBT_REG_GPE,
>> +    DVBT_REG_GPO,
>> +    DVBT_REG_4MSEL,
>> +    DVBT_TEST_REG_1,
>> +    DVBT_TEST_REG_2,
>> +    DVBT_TEST_REG_3,
>> +    DVBT_TEST_REG_4,
>> +    DVBT_REG_BIT_NAME_ITEM_TERMINATOR,
>> +};
>> +
>> +#endif /* RTL2832_PRIV_H */
> 
> 

checkpatch.pl:
author	Joe Perches <joe@perches.com>	
	Fri, 11 May 2012 00:59:25 +0000 (10:59 +1000)
committer	Stephen Rothwell <sfr@canb.auug.org.au>	
	Thu, 17 May 2012 07:18:17 +0000 (17:18 +1000)

http://git.kernel.org/?p=linux/kernel/git/next/linux-next.git;a=commit;h=2a7561d6bbf29c631ad05a8fabe313142ba3d7d0

./checkpatch.pl --no-tree --no-signoff rtl2832.c-v2.diff
total: 0 errors, 0 warnings, 63 lines checked

rtl2832.c-v2.diff has no obvious style problems and is ready for submission.

./checkpatch.pl --no-tree --no-signoff rtl2832.h.diff
total: 0 errors, 0 warnings, 8 lines checked

rtl2832.h.diff has no obvious style problems and is ready for submission.

./checkpatch.pl --no-tree --no-signoff rtl2832_priv.h.diff
total: 0 errors, 0 warnings, 17 lines checked

rtl2832_priv.h.diff has no obvious style problems and is ready for
submission.

./checkpatch.pl --no-tree --file rtl2832.c
total: 0 errors, 0 warnings, 824 lines checked

rtl2832.c has no obvious style problems and is ready for submission.

./checkpatch.pl --no-tree --file rtl2832.h
total: 0 errors, 0 warnings, 74 lines checked

rtl2832.h has no obvious style problems and is ready for submission.

 ./checkpatch.pl --no-tree --file rtl2832_priv.h
ERROR: Macros with complex values should be enclosed in parenthesis
#30: FILE: rtl2832_priv.h:30:
+#define dbg(f, arg...) \
+	if (rtl2832_debug) \
+		pr_info(KERN_INFO LOG_PREFIX": " f "\n" , ## arg)

total: 1 errors, 0 warnings, 258 lines checked

rtl2832_priv.h has style problems, please review.

If any of these errors are false positives, please report
them to the maintainer, see CHECKPATCH in MAINTAINERS.


Regarding "ERROR: Macros with complex values should be enclosed in
parenthesis":

./checkpatch.pl --no-tree --file *_priv.h | grep -A 1 "ERROR: Macros
with complex values"
ERROR: Macros with complex values should be enclosed in parenthesis
#35: FILE: af9013_priv.h:35:
--
ERROR: Macros with complex values should be enclosed in parenthesis
#241: FILE: bcm3510_priv.h:241:
--
ERROR: Macros with complex values should be enclosed in parenthesis
#242: FILE: bcm3510_priv.h:242:
--
ERROR: Macros with complex values should be enclosed in parenthesis
#243: FILE: bcm3510_priv.h:243:
--
ERROR: Macros with complex values should be enclosed in parenthesis
#244: FILE: bcm3510_priv.h:244:
--
ERROR: Macros with complex values should be enclosed in parenthesis
#245: FILE: bcm3510_priv.h:245:
--
ERROR: Macros with complex values should be enclosed in parenthesis
#246: FILE: bcm3510_priv.h:246:
--
ERROR: Macros with complex values should be enclosed in parenthesis
#247: FILE: bcm3510_priv.h:247:
--
ERROR: Macros with complex values should be enclosed in parenthesis
#33: FILE: cxd2820r_priv.h:33:
--
ERROR: Macros with complex values should be enclosed in parenthesis
#24: FILE: dib3000mb_priv.h:24:
--
ERROR: Macros with complex values should be enclosed in parenthesis
#34: FILE: hd29l2_priv.h:34:
--
ERROR: Macros with complex values should be enclosed in parenthesis
#30: FILE: rtl2830_priv.h:30:
--
ERROR: Macros with complex values should be enclosed in parenthesis
#30: FILE: rtl2832_priv.h:30:
[…]
--
ERROR: Macros with complex values should be enclosed in parenthesis
#69: FILE: stb0899_priv.h:69:
[…]
--
ERROR: Macros with complex values should be enclosed in parenthesis
#31: FILE: tda10071_priv.h:31:

E voilà!

cheers,
poma

ps.
CHECKPATCH
M:      Andy Whitcroft <apw@canonical.com>
S:      Supported
F:      scripts/checkpatch.pl

[-- Attachment #2: rtl2832.c-v2.diff --]
[-- Type: text/x-patch, Size: 1881 bytes --]

--- drivers/media/dvb/frontends/rtl2832.c.orig	2012-05-17 20:38:39.916496007 +0200
+++ drivers/media/dvb/frontends/rtl2832.c	2012-05-18 00:27:02.571804702 +0200
@@ -26,7 +26,7 @@
 MODULE_PARM_DESC(debug, "Turn on/off frontend debugging (default:off).");
 
 
-static int reg_mask[32] = {
+static const reg_mask[32] = {
 	0x00000001,
 	0x00000003,
 	0x00000007,
@@ -61,7 +61,7 @@
 	0xffffffff
 };
 
-struct rtl2832_reg_entry registers[] = {
+static const struct rtl2832_reg_entry registers[] = {
 	[DVBT_SOFT_RST]		= {0x1, 0x1,   2, 2},
 	[DVBT_IIC_REPEAT]	= {0x1, 0x1,   3, 3},
 	[DVBT_TR_WAIT_MIN_8K]	= {0x1, 0x88, 11, 2},
@@ -317,7 +317,7 @@
 	page = registers[reg].page;
 
 	len = (msb >> 3) + 1;
-	mask = reg_mask[msb-lsb];
+	mask = reg_mask[msb - lsb];
 
 
 	ret = rtl2832_rd_regs(priv, reg_start_addr, page, &reading[0], len);
@@ -326,7 +326,7 @@
 
 	reading_tmp = 0;
 	for (i = 0; i < len; i++)
-		reading_tmp |= reading[i] << ((len-1-i)*8);
+		reading_tmp |= reading[i] << ((len - 1 - i) * 8);
 
 	*val = (reading_tmp >> lsb) & mask;
 
@@ -360,7 +360,7 @@
 	page = registers[reg].page;
 
 	len = (msb >> 3) + 1;
-	mask = reg_mask[msb-lsb];
+	mask = reg_mask[msb - lsb];
 
 
 	ret = rtl2832_rd_regs(priv, reg_start_addr, page, &reading[0], len);
@@ -369,14 +369,14 @@
 
 	reading_tmp = 0;
 	for (i = 0; i < len; i++)
-		reading_tmp |= reading[i] << ((len-1-i)*8);
+		reading_tmp |= reading[i] << ((len - 1 - i) * 8);
 
 	writing_tmp = reading_tmp & ~(mask << lsb);
 	writing_tmp |= ((val & mask) << lsb);
 
 
 	for (i = 0; i < len; i++)
-		writing[i] = (writing_tmp >> ((len-1-i)*8)) & 0xff;
+		writing[i] = (writing_tmp >> ((len - 1 - i) * 8)) & 0xff;
 
 	ret = rtl2832_wr_regs(priv, reg_start_addr, page, &writing[0], len);
 	if (ret)
@@ -403,7 +403,6 @@
 		return 0;
 
 	ret = rtl2832_wr_demod_reg(priv, DVBT_IIC_REPEAT, (enable ? 0x1 : 0x0));
-
 	if (ret)
 		goto err;
 

[-- Attachment #3: rtl2832.h.diff --]
[-- Type: text/x-patch, Size: 376 bytes --]

--- drivers/media/dvb/frontends/rtl2832.h.orig	2012-05-18 02:03:57.137957914 +0200
+++ drivers/media/dvb/frontends/rtl2832.h	2012-05-18 02:01:59.724073740 +0200
@@ -65,7 +65,7 @@
 	struct i2c_adapter *i2c
 )
 {
-	printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
+	pr_warn(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
 	return NULL;
 }
 #endif

[-- Attachment #4: rtl2832_priv.h.diff --]
[-- Type: text/x-patch, Size: 896 bytes --]

--- drivers/media/dvb/frontends/rtl2832_priv.h.orig	2012-05-18 02:02:48.561114101 +0200
+++ drivers/media/dvb/frontends/rtl2832_priv.h	2012-05-18 01:59:41.200467665 +0200
@@ -29,13 +29,13 @@
 #undef dbg
 #define dbg(f, arg...) \
 	if (rtl2832_debug) \
-		printk(KERN_INFO LOG_PREFIX": " f "\n" , ## arg)
+		pr_info(KERN_INFO LOG_PREFIX": " f "\n" , ## arg)
 #undef err
-#define err(f, arg...)  printk(KERN_ERR	LOG_PREFIX": " f "\n" , ## arg)
+#define err(f, arg...) pr_err(KERN_ERR LOG_PREFIX": " f "\n" , ## arg)
 #undef info
-#define info(f, arg...) printk(KERN_INFO LOG_PREFIX": " f "\n" , ## arg)
+#define info(f, arg...) pr_info(KERN_INFO LOG_PREFIX": " f "\n" , ## arg)
 #undef warn
-#define warn(f, arg...) printk(KERN_WARNING LOG_PREFIX": " f "\n" , ## arg)
+#define warn(f, arg...) pr_warn(KERN_WARNING LOG_PREFIX": " f "\n" , ## arg)
 
 struct rtl2832_priv {
 	struct i2c_adapter *i2c;

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [PATCH v4 1/5] rtl2832 ver. 0.4: removed signal statistics
       [not found]         ` <CAKZ=SG_mvvFae9ZE2H3ci_3HosLmQ1kihyGx6QCdyQGgQro52Q@mail.gmail.com>
@ 2012-05-18  9:15           ` poma
  2012-05-18 10:38             ` poma
  0 siblings, 1 reply; 104+ messages in thread
From: poma @ 2012-05-18  9:15 UTC (permalink / raw)
  To: Thomas Mair; +Cc: Antti Palosaari, linux-media

[-- Attachment #1: Type: text/plain, Size: 46894 bytes --]

On 05/18/2012 08:20 AM, Thomas Mair wrote:
> Am 18.05.2012 02:55 schrieb "poma" <pomidorabelisima@gmail.com>:
>>
>> On 05/17/2012 04:19 PM, Antti Palosaari wrote:
>>> Moikka Thomas,
>>>
>>> Here is the review. See comments below.
>>>
>>> And conclusion is that it is ready for the Kernel merge. I did not see
>>> any big functiuonality problems - only some small issues that are likely
>>> considered as a coding style etc. Feel free to fix those and sent new
>>> patc serie or just new patch top of that.
>>>
>>> Reviewed-by: Antti Palosaari <crope@iki.fi>
>>>
>>>
>>> On 17.05.2012 01:13, Thomas Mair wrote:
>>>> Changelog for ver. 0.3:
>>>> - removed statistics as their calculation was wrong
>>>> - fixed bug in Makefile
>>>> - indentation and code style improvements
>>>>
>>>> Signed-off-by: Thomas Mair<thomas.mair86@googlemail.com>
>>>> ---
>>>>   drivers/media/dvb/frontends/Kconfig        |    7 +
>>>>   drivers/media/dvb/frontends/Makefile       |    1 +
>>>>   drivers/media/dvb/frontends/rtl2832.c      |  825
>>>> ++++++++++++++++++++++++++++
>>>>   drivers/media/dvb/frontends/rtl2832.h      |   74 +++
>>>>   drivers/media/dvb/frontends/rtl2832_priv.h |  258 +++++++++
>>>>   5 files changed, 1165 insertions(+), 0 deletions(-)
>>>>   create mode 100644 drivers/media/dvb/frontends/rtl2832.c
>>>>   create mode 100644 drivers/media/dvb/frontends/rtl2832.h
>>>>   create mode 100644 drivers/media/dvb/frontends/rtl2832_priv.h
>>>>
>>>> diff --git a/drivers/media/dvb/frontends/Kconfig
>>>> b/drivers/media/dvb/frontends/Kconfig
>>>> index f479834..f7d67d7 100644
>>>> --- a/drivers/media/dvb/frontends/Kconfig
>>>> +++ b/drivers/media/dvb/frontends/Kconfig
>>>> @@ -432,6 +432,13 @@ config DVB_RTL2830
>>>>       help
>>>>         Say Y when you want to support this frontend.
>>>>
>>>> +config DVB_RTL2832
>>>> +    tristate "Realtek RTL2832 DVB-T"
>>>> +    depends on DVB_CORE&&  I2C
>>>> +    default m if DVB_FE_CUSTOMISE
>>>> +    help
>>>> +      Say Y when you want to support this frontend.
>>>> +
>>>
>>> It is correct.
>>>
>>> Just for the comment as you said in cover letter that you are unsure
>>> about that.
>>>
>>>>   comment "DVB-C (cable) frontends"
>>>>       depends on DVB_CORE
>>>>
>>>> diff --git a/drivers/media/dvb/frontends/Makefile
>>>> b/drivers/media/dvb/frontends/Makefile
>>>> index b0381dc..bbf2955 100644
>>>> --- a/drivers/media/dvb/frontends/Makefile
>>>> +++ b/drivers/media/dvb/frontends/Makefile
>>>> @@ -98,6 +98,7 @@ obj-$(CONFIG_DVB_IT913X_FE) += it913x-fe.o
>>>>   obj-$(CONFIG_DVB_A8293) += a8293.o
>>>>   obj-$(CONFIG_DVB_TDA10071) += tda10071.o
>>>>   obj-$(CONFIG_DVB_RTL2830) += rtl2830.o
>>>> +obj-$(CONFIG_DVB_RTL2830) += rtl2832.o
>>>>   obj-$(CONFIG_DVB_M88RS2000) += m88rs2000.o
>>>>   obj-$(CONFIG_DVB_AF9033) += af9033.o
>>>>
>>>> diff --git a/drivers/media/dvb/frontends/rtl2832.c
>>>> b/drivers/media/dvb/frontends/rtl2832.c
>>>> new file mode 100644
>>>> index 0000000..51c7927
>>>> --- /dev/null
>>>> +++ b/drivers/media/dvb/frontends/rtl2832.c
>>>> @@ -0,0 +1,825 @@
>>>> +/*
>>>> + * Realtek RTL2832 DVB-T demodulator driver
>>>> + *
>>>> + * Copyright (C) 2012 Thomas Mair<thomas.mair86@gmail.com>
>>>> + *
>>>> + *    This program is free software; you can redistribute it and/or
>>>> modify
>>>> + *    it under the terms of the GNU General Public License as
>>>> published by
>>>> + *    the Free Software Foundation; either version 2 of the License,
> or
>>>> + *    (at your option) any later version.
>>>> + *
>>>> + *    This program is distributed in the hope that it will be useful,
>>>> + *    but WITHOUT ANY WARRANTY; without even the implied warranty of
>>>> + *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>>>> + *    GNU General Public License for more details.
>>>> + *
>>>> + *    You should have received a copy of the GNU General Public
>>>> License along
>>>> + *    with this program; if not, write to the Free Software
>>>> Foundation, Inc.,
>>>> + *    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
>>>> + */
>>>> +
>>>> +#include "rtl2832_priv.h"
>>>> +
>>>> +
>>>> +int rtl2832_debug;
>>>> +module_param_named(debug, rtl2832_debug, int, 0644);
>>>> +MODULE_PARM_DESC(debug, "Turn on/off frontend debugging
>>>> (default:off).");
>>>> +
>>>> +
>>>> +static int reg_mask[32] = {
>>>
>>> This should be static const.
>>>
>>>> +    0x00000001,
>>>> +    0x00000003,
>>>> +    0x00000007,
>>>> +    0x0000000f,
>>>> +    0x0000001f,
>>>> +    0x0000003f,
>>>> +    0x0000007f,
>>>> +    0x000000ff,
>>>> +    0x000001ff,
>>>> +    0x000003ff,
>>>> +    0x000007ff,
>>>> +    0x00000fff,
>>>> +    0x00001fff,
>>>> +    0x00003fff,
>>>> +    0x00007fff,
>>>> +    0x0000ffff,
>>>> +    0x0001ffff,
>>>> +    0x0003ffff,
>>>> +    0x0007ffff,
>>>> +    0x000fffff,
>>>> +    0x001fffff,
>>>> +    0x003fffff,
>>>> +    0x007fffff,
>>>> +    0x00ffffff,
>>>> +    0x01ffffff,
>>>> +    0x03ffffff,
>>>> +    0x07ffffff,
>>>> +    0x0fffffff,
>>>> +    0x1fffffff,
>>>> +    0x3fffffff,
>>>> +    0x7fffffff,
>>>> +    0xffffffff
>>>> +};
>>>> +
>>>> +struct rtl2832_reg_entry registers[] = {
>>>
>>> static const struct
>>>
>>>> +    [DVBT_SOFT_RST]        = {0x1, 0x1,   2, 2},
>>>> +    [DVBT_IIC_REPEAT]    = {0x1, 0x1,   3, 3},
>>>> +    [DVBT_TR_WAIT_MIN_8K]    = {0x1, 0x88, 11, 2},
>>>> +    [DVBT_RSD_BER_FAIL_VAL]    = {0x1, 0x8f, 15, 0},
>>>> +    [DVBT_EN_BK_TRK]    = {0x1, 0xa6,  7, 7},
>>>> +    [DVBT_AD_EN_REG]    = {0x0, 0x8,   7, 7},
>>>> +    [DVBT_AD_EN_REG1]    = {0x0, 0x8,   6, 6},
>>>> +    [DVBT_EN_BBIN]        = {0x1, 0xb1,  0, 0},
>>>> +    [DVBT_MGD_THD0]        = {0x1, 0x95,  7, 0},
>>>> +    [DVBT_MGD_THD1]        = {0x1, 0x96,  7, 0},
>>>> +    [DVBT_MGD_THD2]        = {0x1, 0x97,  7, 0},
>>>> +    [DVBT_MGD_THD3]        = {0x1, 0x98,  7, 0},
>>>> +    [DVBT_MGD_THD4]        = {0x1, 0x99,  7, 0},
>>>> +    [DVBT_MGD_THD5]        = {0x1, 0x9a,  7, 0},
>>>> +    [DVBT_MGD_THD6]        = {0x1, 0x9b,  7, 0},
>>>> +    [DVBT_MGD_THD7]        = {0x1, 0x9c,  7, 0},
>>>> +    [DVBT_EN_CACQ_NOTCH]    = {0x1, 0x61,  4, 4},
>>>> +    [DVBT_AD_AV_REF]    = {0x0, 0x9,   6, 0},
>>>> +    [DVBT_REG_PI]        = {0x0, 0xa,   2, 0},
>>>> +    [DVBT_PIP_ON]        = {0x0, 0x21,  3, 3},
>>>> +    [DVBT_SCALE1_B92]    = {0x2, 0x92,  7, 0},
>>>> +    [DVBT_SCALE1_B93]    = {0x2, 0x93,  7, 0},
>>>> +    [DVBT_SCALE1_BA7]    = {0x2, 0xa7,  7, 0},
>>>> +    [DVBT_SCALE1_BA9]    = {0x2, 0xa9,  7, 0},
>>>> +    [DVBT_SCALE1_BAA]    = {0x2, 0xaa,  7, 0},
>>>> +    [DVBT_SCALE1_BAB]    = {0x2, 0xab,  7, 0},
>>>> +    [DVBT_SCALE1_BAC]    = {0x2, 0xac,  7, 0},
>>>> +    [DVBT_SCALE1_BB0]    = {0x2, 0xb0,  7, 0},
>>>> +    [DVBT_SCALE1_BB1]    = {0x2, 0xb1,  7, 0},
>>>> +    [DVBT_KB_P1]        = {0x1, 0x64,  3, 1},
>>>> +    [DVBT_KB_P2]        = {0x1, 0x64,  6, 4},
>>>> +    [DVBT_KB_P3]        = {0x1, 0x65,  2, 0},
>>>> +    [DVBT_OPT_ADC_IQ]    = {0x0, 0x6,   5, 4},
>>>> +    [DVBT_AD_AVI]        = {0x0, 0x9,   1, 0},
>>>> +    [DVBT_AD_AVQ]        = {0x0, 0x9,   3, 2},
>>>> +    [DVBT_K1_CR_STEP12]    = {0x2, 0xad,  9, 4},
>>>> +    [DVBT_TRK_KS_P2]    = {0x1, 0x6f,  2, 0},
>>>> +    [DVBT_TRK_KS_I2]    = {0x1, 0x70,  5, 3},
>>>> +    [DVBT_TR_THD_SET2]    = {0x1, 0x72,  3, 0},
>>>> +    [DVBT_TRK_KC_P2]    = {0x1, 0x73,  5, 3},
>>>> +    [DVBT_TRK_KC_I2]    = {0x1, 0x75,  2, 0},
>>>> +    [DVBT_CR_THD_SET2]    = {0x1, 0x76,  7, 6},
>>>> +    [DVBT_PSET_IFFREQ]    = {0x1, 0x19, 21, 0},
>>>> +    [DVBT_SPEC_INV]        = {0x1, 0x15,  0, 0},
>>>> +    [DVBT_RSAMP_RATIO]    = {0x1, 0x9f, 27, 2},
>>>> +    [DVBT_CFREQ_OFF_RATIO]    = {0x1, 0x9d, 23, 4},
>>>> +    [DVBT_FSM_STAGE]    = {0x3, 0x51,  6, 3},
>>>> +    [DVBT_RX_CONSTEL]    = {0x3, 0x3c,  3, 2},
>>>> +    [DVBT_RX_HIER]        = {0x3, 0x3c,  6, 4},
>>>> +    [DVBT_RX_C_RATE_LP]    = {0x3, 0x3d,  2, 0},
>>>> +    [DVBT_RX_C_RATE_HP]    = {0x3, 0x3d,  5, 3},
>>>> +    [DVBT_GI_IDX]        = {0x3, 0x51,  1, 0},
>>>> +    [DVBT_FFT_MODE_IDX]    = {0x3, 0x51,  2, 2},
>>>> +    [DVBT_RSD_BER_EST]    = {0x3, 0x4e, 15, 0},
>>>> +    [DVBT_CE_EST_EVM]    = {0x4, 0xc,  15, 0},
>>>> +    [DVBT_RF_AGC_VAL]    = {0x3, 0x5b, 13, 0},
>>>> +    [DVBT_IF_AGC_VAL]    = {0x3, 0x59, 13, 0},
>>>> +    [DVBT_DAGC_VAL]        = {0x3, 0x5,   7, 0},
>>>> +    [DVBT_SFREQ_OFF]    = {0x3, 0x18, 13, 0},
>>>> +    [DVBT_CFREQ_OFF]    = {0x3, 0x5f, 17, 0},
>>>> +    [DVBT_POLAR_RF_AGC]    = {0x0, 0xe,   1, 1},
>>>> +    [DVBT_POLAR_IF_AGC]    = {0x0, 0xe,   0, 0},
>>>> +    [DVBT_AAGC_HOLD]    = {0x1, 0x4,   5, 5},
>>>> +    [DVBT_EN_RF_AGC]    = {0x1, 0x4,   6, 6},
>>>> +    [DVBT_EN_IF_AGC]    = {0x1, 0x4,   7, 7},
>>>> +    [DVBT_IF_AGC_MIN]    = {0x1, 0x8,   7, 0},
>>>> +    [DVBT_IF_AGC_MAX]    = {0x1, 0x9,   7, 0},
>>>> +    [DVBT_RF_AGC_MIN]    = {0x1, 0xa,   7, 0},
>>>> +    [DVBT_RF_AGC_MAX]    = {0x1, 0xb,   7, 0},
>>>> +    [DVBT_IF_AGC_MAN]    = {0x1, 0xc,   6, 6},
>>>> +    [DVBT_IF_AGC_MAN_VAL]    = {0x1, 0xc,  13, 0},
>>>> +    [DVBT_RF_AGC_MAN]    = {0x1, 0xe,   6, 6},
>>>> +    [DVBT_RF_AGC_MAN_VAL]    = {0x1, 0xe,  13, 0},
>>>> +    [DVBT_DAGC_TRG_VAL]    = {0x1, 0x12,  7, 0},
>>>> +    [DVBT_AGC_TARG_VAL_0]    = {0x1, 0x2,   0, 0},
>>>> +    [DVBT_AGC_TARG_VAL_8_1]    = {0x1, 0x3,   7, 0},
>>>> +    [DVBT_AAGC_LOOP_GAIN]    = {0x1, 0xc7,  5, 1},
>>>> +    [DVBT_LOOP_GAIN2_3_0]    = {0x1, 0x4,   4, 1},
>>>> +    [DVBT_LOOP_GAIN2_4]    = {0x1, 0x5,   7, 7},
>>>> +    [DVBT_LOOP_GAIN3]    = {0x1, 0xc8,  4, 0},
>>>> +    [DVBT_VTOP1]        = {0x1, 0x6,   5, 0},
>>>> +    [DVBT_VTOP2]        = {0x1, 0xc9,  5, 0},
>>>> +    [DVBT_VTOP3]        = {0x1, 0xca,  5, 0},
>>>> +    [DVBT_KRF1]        = {0x1, 0xcb,  7, 0},
>>>> +    [DVBT_KRF2]        = {0x1, 0x7,   7, 0},
>>>> +    [DVBT_KRF3]        = {0x1, 0xcd,  7, 0},
>>>> +    [DVBT_KRF4]        = {0x1, 0xce,  7, 0},
>>>> +    [DVBT_EN_GI_PGA]    = {0x1, 0xe5,  0, 0},
>>>> +    [DVBT_THD_LOCK_UP]    = {0x1, 0xd9,  8, 0},
>>>> +    [DVBT_THD_LOCK_DW]    = {0x1, 0xdb,  8, 0},
>>>> +    [DVBT_THD_UP1]        = {0x1, 0xdd,  7, 0},
>>>> +    [DVBT_THD_DW1]        = {0x1, 0xde,  7, 0},
>>>> +    [DVBT_INTER_CNT_LEN]    = {0x1, 0xd8,  3, 0},
>>>> +    [DVBT_GI_PGA_STATE]    = {0x1, 0xe6,  3, 3},
>>>> +    [DVBT_EN_AGC_PGA]    = {0x1, 0xd7,  0, 0},
>>>> +    [DVBT_CKOUTPAR]        = {0x1, 0x7b,  5, 5},
>>>> +    [DVBT_CKOUT_PWR]    = {0x1, 0x7b,  6, 6},
>>>> +    [DVBT_SYNC_DUR]        = {0x1, 0x7b,  7, 7},
>>>> +    [DVBT_ERR_DUR]        = {0x1, 0x7c,  0, 0},
>>>> +    [DVBT_SYNC_LVL]        = {0x1, 0x7c,  1, 1},
>>>> +    [DVBT_ERR_LVL]        = {0x1, 0x7c,  2, 2},
>>>> +    [DVBT_VAL_LVL]        = {0x1, 0x7c,  3, 3},
>>>> +    [DVBT_SERIAL]        = {0x1, 0x7c,  4, 4},
>>>> +    [DVBT_SER_LSB]        = {0x1, 0x7c,  5, 5},
>>>> +    [DVBT_CDIV_PH0]        = {0x1, 0x7d,  3, 0},
>>>> +    [DVBT_CDIV_PH1]        = {0x1, 0x7d,  7, 4},
>>>> +    [DVBT_MPEG_IO_OPT_2_2]    = {0x0, 0x6,   7, 7},
>>>> +    [DVBT_MPEG_IO_OPT_1_0]    = {0x0, 0x7,   7, 6},
>>>> +    [DVBT_CKOUTPAR_PIP]    = {0x0, 0xb7,  4, 4},
>>>> +    [DVBT_CKOUT_PWR_PIP]    = {0x0, 0xb7,  3, 3},
>>>> +    [DVBT_SYNC_LVL_PIP]    = {0x0, 0xb7,  2, 2},
>>>> +    [DVBT_ERR_LVL_PIP]    = {0x0, 0xb7,  1, 1},
>>>> +    [DVBT_VAL_LVL_PIP]    = {0x0, 0xb7,  0, 0},
>>>> +    [DVBT_CKOUTPAR_PID]    = {0x0, 0xb9,  4, 4},
>>>> +    [DVBT_CKOUT_PWR_PID]    = {0x0, 0xb9,  3, 3},
>>>> +    [DVBT_SYNC_LVL_PID]    = {0x0, 0xb9,  2, 2},
>>>> +    [DVBT_ERR_LVL_PID]    = {0x0, 0xb9,  1, 1},
>>>> +    [DVBT_VAL_LVL_PID]    = {0x0, 0xb9,  0, 0},
>>>> +    [DVBT_SM_PASS]        = {0x1, 0x93, 11, 0},
>>>> +    [DVBT_AD7_SETTING]    = {0x0, 0x11, 15, 0},
>>>> +    [DVBT_RSSI_R]        = {0x3, 0x1,   6, 0},
>>>> +    [DVBT_ACI_DET_IND]    = {0x3, 0x12,  0, 0},
>>>> +    [DVBT_REG_MON]        = {0x0, 0xd,   1, 0},
>>>> +    [DVBT_REG_MONSEL]    = {0x0, 0xd,   2, 2},
>>>> +    [DVBT_REG_GPE]        = {0x0, 0xd,   7, 7},
>>>> +    [DVBT_REG_GPO]        = {0x0, 0x10,  0, 0},
>>>> +    [DVBT_REG_4MSEL]    = {0x0, 0x13,  0, 0},
>>>> +};
>>>> +
>>>> +/* write multiple hardware registers */
>>>> +static int rtl2832_wr(struct rtl2832_priv *priv, u8 reg, u8 *val, int
>>>> len)
>>>> +{
>>>> +    int ret;
>>>> +    u8 buf[1+len];
>>>> +    struct i2c_msg msg[1] = {
>>>> +        {
>>>> +            .addr = priv->cfg.i2c_addr,
>>>> +            .flags = 0,
>>>> +            .len = 1+len,
>>>> +            .buf = buf,
>>>> +        }
>>>> +    };
>>>> +
>>>> +    buf[0] = reg;
>>>> +    memcpy(&buf[1], val, len);
>>>> +
>>>> +    ret = i2c_transfer(priv->i2c, msg, 1);
>>>> +    if (ret == 1) {
>>>> +        ret = 0;
>>>> +    } else {
>>>> +        warn("i2c wr failed=%d reg=%02x len=%d", ret, reg, len);
>>>> +        ret = -EREMOTEIO;
>>>> +    }
>>>> +    return ret;
>>>> +}
>>>> +
>>>> +/* read multiple hardware registers */
>>>> +static int rtl2832_rd(struct rtl2832_priv *priv, u8 reg, u8 *val, int
>>>> len)
>>>> +{
>>>> +    int ret;
>>>> +    struct i2c_msg msg[2] = {
>>>> +        {
>>>> +            .addr = priv->cfg.i2c_addr,
>>>> +            .flags = 0,
>>>> +            .len = 1,
>>>> +            .buf =&reg,
>>>> +        }, {
>>>> +            .addr = priv->cfg.i2c_addr,
>>>> +            .flags = I2C_M_RD,
>>>> +            .len = len,
>>>> +            .buf = val,
>>>> +        }
>>>> +    };
>>>> +
>>>> +    ret = i2c_transfer(priv->i2c, msg, 2);
>>>> +    if (ret == 2) {
>>>> +        ret = 0;
>>>> +    } else {
>>>> +        warn("i2c rd failed=%d reg=%02x len=%d", ret, reg, len);
>>>> +        ret = -EREMOTEIO;
>>>> +}
>>>> +return ret;
>>>> +}
>>>> +
>>>> +/* write multiple registers */
>>>> +static int rtl2832_wr_regs(struct rtl2832_priv *priv, u8 reg, u8
>>>> page, u8 *val,
>>>> +    int len)
>>>> +{
>>>> +    int ret;
>>>> +
>>>> +
>>>> +    /* switch bank if needed */
>>>> +    if (page != priv->page) {
>>>> +        ret = rtl2832_wr(priv, 0x00,&page, 1);
>>>> +        if (ret)
>>>> +            return ret;
>>>> +
>>>> +        priv->page = page;
>>>> +}
>>>> +
>>>> +return rtl2832_wr(priv, reg, val, len);
>>>> +}
>>>> +
>>>> +/* read multiple registers */
>>>> +static int rtl2832_rd_regs(struct rtl2832_priv *priv, u8 reg, u8
>>>> page, u8 *val,
>>>> +    int len)
>>>> +{
>>>> +    int ret;
>>>> +
>>>> +    /* switch bank if needed */
>>>> +    if (page != priv->page) {
>>>> +        ret = rtl2832_wr(priv, 0x00,&page, 1);
>>>> +        if (ret)
>>>> +            return ret;
>>>> +
>>>> +        priv->page = page;
>>>> +    }
>>>> +
>>>> +    return rtl2832_rd(priv, reg, val, len);
>>>> +}
>>>> +
>>>> +#if 0 /* currently not used */
>>>> +/* write single register */
>>>> +static int rtl2832_wr_reg(struct rtl2832_priv *priv, u8 reg, u8 page,
>>>> u8 val)
>>>> +{
>>>> +    return rtl2832_wr_regs(priv, reg, page,&val, 1);
>>>> +}
>>>> +#endif
>>>> +
>>>> +/* read single register */
>>>> +static int rtl2832_rd_reg(struct rtl2832_priv *priv, u8 reg, u8 page,
>>>> u8 *val)
>>>> +{
>>>> +    return rtl2832_rd_regs(priv, reg, page, val, 1);
>>>> +}
>>>> +
>>>> +int rtl2832_rd_demod_reg(struct rtl2832_priv *priv, int reg, u32 *val)
>>>> +{
>>>> +    int ret;
>>>> +
>>>> +    u8 reg_start_addr;
>>>> +    u8 msb, lsb;
>>>> +    u8 page;
>>>> +    u8 reading[4];
>>>> +    u32 reading_tmp;
>>>> +    int i;
>>>> +
>>>> +    u8 len;
>>>> +    u32 mask;
>>>> +
>>>> +    reg_start_addr = registers[reg].start_address;
>>>> +    msb = registers[reg].msb;
>>>> +    lsb = registers[reg].lsb;
>>>> +    page = registers[reg].page;
>>>> +
>>>> +    len = (msb>>  3) + 1;
>>>> +    mask = reg_mask[msb-lsb];
>>>
>>> You should use spaces here. See Documentation/CodingStyle line 206.
>>>
>>>> +
>>>> +
>>>> +    ret = rtl2832_rd_regs(priv, reg_start_addr, page,&reading[0],
> len);
>>>> +    if (ret)
>>>> +        goto err;
>>>> +
>>>> +    reading_tmp = 0;
>>>> +    for (i = 0; i<  len; i++)
>>>> +        reading_tmp |= reading[i]<<  ((len-1-i)*8);
>>>
>>> You should use spaces here. See Documentation/CodingStyle line 206.
>>>
>>>> +
>>>> +    *val = (reading_tmp>>  lsb)&  mask;
>>>> +
>>>> +    return ret;
>>>> +
>>>> +err:
>>>> +    dbg("%s: failed=%d", __func__, ret);
>>>> +    return ret;
>>>> +
>>>> +}
>>>> +
>>>> +int rtl2832_wr_demod_reg(struct rtl2832_priv *priv, int reg, u32 val)
>>>> +{
>>>> +    int ret, i;
>>>> +    u8 len;
>>>> +    u8 reg_start_addr;
>>>> +    u8 msb, lsb;
>>>> +    u8 page;
>>>> +    u32 mask;
>>>> +
>>>> +
>>>> +    u8 reading[4];
>>>> +    u8 writing[4];
>>>> +    u32 reading_tmp;
>>>> +    u32 writing_tmp;
>>>> +
>>>> +
>>>> +    reg_start_addr = registers[reg].start_address;
>>>> +    msb = registers[reg].msb;
>>>> +    lsb = registers[reg].lsb;
>>>> +    page = registers[reg].page;
>>>> +
>>>> +    len = (msb>>  3) + 1;
>>>> +    mask = reg_mask[msb-lsb];
>>>
>>> You should use spaces here. See Documentation/CodingStyle line 206.
>>>
>>>> +
>>>> +
>>>> +    ret = rtl2832_rd_regs(priv, reg_start_addr, page,&reading[0],
> len);
>>>> +    if (ret)
>>>> +        goto err;
>>>> +
>>>> +    reading_tmp = 0;
>>>> +    for (i = 0; i<  len; i++)
>>>> +        reading_tmp |= reading[i]<<  ((len-1-i)*8);
>>>
>>> You should use spaces here. See Documentation/CodingStyle line 206.
>>>
>>>> +
>>>> +    writing_tmp = reading_tmp&  ~(mask<<  lsb);
>>>> +    writing_tmp |= ((val&  mask)<<  lsb);
>>>> +
>>>> +
>>>> +    for (i = 0; i<  len; i++)
>>>> +        writing[i] = (writing_tmp>>  ((len-1-i)*8))&  0xff;
>>>
>>> You should use spaces here. See Documentation/CodingStyle line 206.
>>>
>>>> +
>>>> +    ret = rtl2832_wr_regs(priv, reg_start_addr, page,&writing[0],
> len);
>>>> +    if (ret)
>>>> +        goto err;
>>>> +
>>>> +    return ret;
>>>> +
>>>> +err:
>>>> +    dbg("%s: failed=%d", __func__, ret);
>>>> +    return ret;
>>>> +
>>>> +}
>>>> +
>>>> +
>>>> +static int rtl2832_i2c_gate_ctrl(struct dvb_frontend *fe, int enable)
>>>> +{
>>>> +    int ret;
>>>> +    struct rtl2832_priv *priv = fe->demodulator_priv;
>>>> +
>>>> +    dbg("%s: enable=%d", __func__, enable);
>>>> +
>>>> +    /* gate already open or close */
>>>> +    if (priv->i2c_gate_state == enable)
>>>> +        return 0;
>>>> +
>>>> +    ret = rtl2832_wr_demod_reg(priv, DVBT_IIC_REPEAT, (enable ? 0x1 :
>>>> 0x0));
>>>> +
>>>> +    if (ret)
>>>> +        goto err;
>>>
>>> Excessive newline between function call and error check.
>>>
>>>> +
>>>> +    priv->i2c_gate_state = enable;
>>>> +
>>>> +    return ret;
>>>> +err:
>>>> +    dbg("%s: failed=%d", __func__, ret);
>>>> +    return ret;
>>>> +}
>>>> +
>>>> +
>>>> +
>>>> +static int rtl2832_init(struct dvb_frontend *fe)
>>>> +{
>>>> +    struct rtl2832_priv *priv = fe->demodulator_priv;
>>>> +    int i, ret;
>>>> +
>>>> +    u8 en_bbin;
>>>> +    u64 pset_iffreq;
>>>> +
>>>> +    /* initialization values for the demodulator registers */
>>>> +    struct rtl2832_reg_value rtl2832_initial_regs[] = {
>>>> +        {DVBT_AD_EN_REG,        0x1},
>>>> +        {DVBT_AD_EN_REG1,        0x1},
>>>> +        {DVBT_RSD_BER_FAIL_VAL,        0x2800},
>>>> +        {DVBT_MGD_THD0,            0x10},
>>>> +        {DVBT_MGD_THD1,            0x20},
>>>> +        {DVBT_MGD_THD2,            0x20},
>>>> +        {DVBT_MGD_THD3,            0x40},
>>>> +        {DVBT_MGD_THD4,            0x22},
>>>> +        {DVBT_MGD_THD5,            0x32},
>>>> +        {DVBT_MGD_THD6,            0x37},
>>>> +        {DVBT_MGD_THD7,            0x39},
>>>> +        {DVBT_EN_BK_TRK,        0x0},
>>>> +        {DVBT_EN_CACQ_NOTCH,        0x0},
>>>> +        {DVBT_AD_AV_REF,        0x2a},
>>>> +        {DVBT_REG_PI,            0x6},
>>>> +        {DVBT_PIP_ON,            0x0},
>>>> +        {DVBT_CDIV_PH0,            0x8},
>>>> +        {DVBT_CDIV_PH1,            0x8},
>>>> +        {DVBT_SCALE1_B92,        0x4},
>>>> +        {DVBT_SCALE1_B93,        0xb0},
>>>> +        {DVBT_SCALE1_BA7,        0x78},
>>>> +        {DVBT_SCALE1_BA9,        0x28},
>>>> +        {DVBT_SCALE1_BAA,        0x59},
>>>> +        {DVBT_SCALE1_BAB,        0x83},
>>>> +        {DVBT_SCALE1_BAC,        0xd4},
>>>> +        {DVBT_SCALE1_BB0,        0x65},
>>>> +        {DVBT_SCALE1_BB1,        0x43},
>>>> +        {DVBT_KB_P1,            0x1},
>>>> +        {DVBT_KB_P2,            0x4},
>>>> +        {DVBT_KB_P3,            0x7},
>>>> +        {DVBT_K1_CR_STEP12,        0xa},
>>>> +        {DVBT_REG_GPE,            0x1},
>>>> +        {DVBT_SERIAL,            0x0},
>>>> +        {DVBT_CDIV_PH0,            0x9},
>>>> +        {DVBT_CDIV_PH1,            0x9},
>>>> +        {DVBT_MPEG_IO_OPT_2_2,        0x0},
>>>> +        {DVBT_MPEG_IO_OPT_1_0,        0x0},
>>>> +        {DVBT_TRK_KS_P2,        0x4},
>>>> +        {DVBT_TRK_KS_I2,        0x7},
>>>> +        {DVBT_TR_THD_SET2,        0x6},
>>>> +        {DVBT_TRK_KC_I2,        0x5},
>>>> +        {DVBT_CR_THD_SET2,        0x1},
>>>> +        {DVBT_SPEC_INV,            0x0},
>>>> +        {DVBT_DAGC_TRG_VAL,        0x5a},
>>>> +        {DVBT_AGC_TARG_VAL_0,        0x0},
>>>> +        {DVBT_AGC_TARG_VAL_8_1,        0x5a},
>>>> +        {DVBT_AAGC_LOOP_GAIN,        0x16},
>>>> +        {DVBT_LOOP_GAIN2_3_0,        0x6},
>>>> +        {DVBT_LOOP_GAIN2_4,        0x1},
>>>> +        {DVBT_LOOP_GAIN3,        0x16},
>>>> +        {DVBT_VTOP1,            0x35},
>>>> +        {DVBT_VTOP2,            0x21},
>>>> +        {DVBT_VTOP3,            0x21},
>>>> +        {DVBT_KRF1,            0x0},
>>>> +        {DVBT_KRF2,            0x40},
>>>> +        {DVBT_KRF3,            0x10},
>>>> +        {DVBT_KRF4,            0x10},
>>>> +        {DVBT_IF_AGC_MIN,        0x80},
>>>> +        {DVBT_IF_AGC_MAX,        0x7f},
>>>> +        {DVBT_RF_AGC_MIN,        0x80},
>>>> +        {DVBT_RF_AGC_MAX,        0x7f},
>>>> +        {DVBT_POLAR_RF_AGC,        0x0},
>>>> +        {DVBT_POLAR_IF_AGC,        0x0},
>>>> +        {DVBT_AD7_SETTING,        0xe9bf},
>>>> +        {DVBT_EN_GI_PGA,        0x0},
>>>> +        {DVBT_THD_LOCK_UP,        0x0},
>>>> +        {DVBT_THD_LOCK_DW,        0x0},
>>>> +        {DVBT_THD_UP1,            0x11},
>>>> +        {DVBT_THD_DW1,            0xef},
>>>> +        {DVBT_INTER_CNT_LEN,        0xc},
>>>> +        {DVBT_GI_PGA_STATE,        0x0},
>>>> +        {DVBT_EN_AGC_PGA,        0x1},
>>>> +        {DVBT_IF_AGC_MAN,        0x0},
>>>> +    };
>>>> +
>>>> +
>>>> +    dbg("%s", __func__);
>>>> +
>>>> +    en_bbin = (priv->cfg.if_dvbt == 0 ? 0x1 : 0x0);
>>>> +
>>>> +    /*
>>>> +    * PSET_IFFREQ = - floor((IfFreqHz % CrystalFreqHz) * pow(2, 22)
>>>> +    *        / CrystalFreqHz)
>>>> +    */
>>>> +    pset_iffreq = priv->cfg.if_dvbt % priv->cfg.xtal;
>>>> +    pset_iffreq *= 0x400000;
>>>> +    pset_iffreq = div_u64(pset_iffreq, priv->cfg.xtal);
>>>> +    pset_iffreq = pset_iffreq&  0x3fffff;
>>>> +
>>>> +
>>>> +
>>>> +    for (i = 0; i<  ARRAY_SIZE(rtl2832_initial_regs); i++) {
>>>> +        ret = rtl2832_wr_demod_reg(priv, rtl2832_initial_regs[i].reg,
>>>> +            rtl2832_initial_regs[i].value);
>>>> +        if (ret)
>>>> +            goto err;
>>>> +    }
>>>> +
>>>> +    /* if frequency settings */
>>>> +    ret = rtl2832_wr_demod_reg(priv, DVBT_EN_BBIN, en_bbin);
>>>> +        if (ret)
>>>> +            goto err;
>>>> +
>>>> +    ret = rtl2832_wr_demod_reg(priv, DVBT_PSET_IFFREQ, pset_iffreq);
>>>> +        if (ret)
>>>> +            goto err;
>>>> +
>>>> +    priv->sleeping = false;
>>>> +
>>>> +    return ret;
>>>> +
>>>> +err:
>>>> +    dbg("%s: failed=%d", __func__, ret);
>>>> +    return ret;
>>>> +}
>>>> +
>>>> +static int rtl2832_sleep(struct dvb_frontend *fe)
>>>> +{
>>>> +    struct rtl2832_priv *priv = fe->demodulator_priv;
>>>> +
>>>> +    dbg("%s", __func__);
>>>> +    priv->sleeping = true;
>>>> +    return 0;
>>>> +}
>>>> +
>>>> +int rtl2832_get_tune_settings(struct dvb_frontend *fe,
>>>> +    struct dvb_frontend_tune_settings *s)
>>>> +{
>>>> +    dbg("%s", __func__);
>>>> +    s->min_delay_ms = 1000;
>>>> +    s->step_size = fe->ops.info.frequency_stepsize * 2;
>>>> +    s->max_drift = (fe->ops.info.frequency_stepsize * 2) + 1;
>>>> +    return 0;
>>>> +}
>>>> +
>>>> +static int rtl2832_set_frontend(struct dvb_frontend *fe)
>>>> +{
>>>> +    struct rtl2832_priv *priv = fe->demodulator_priv;
>>>> +    struct dtv_frontend_properties *c =&fe->dtv_property_cache;
>>>> +    int ret, i, j;
>>>> +    u64 bw_mode, num, num2;
>>>> +    u32 resamp_ratio, cfreq_off_ratio;
>>>> +
>>>> +
>>>> +    static u8 bw_params[3][32] = {
>>>> +    /* 6 MHz bandwidth */
>>>> +        {
>>>> +        0xf5, 0xff, 0x15, 0x38, 0x5d, 0x6d, 0x52, 0x07, 0xfa, 0x2f,
>>>> +        0x53, 0xf5, 0x3f, 0xca, 0x0b, 0x91, 0xea, 0x30, 0x63, 0xb2,
>>>> +        0x13, 0xda, 0x0b, 0xc4, 0x18, 0x7e, 0x16, 0x66, 0x08, 0x67,
>>>> +        0x19, 0xe0,
>>>> +        },
>>>> +
>>>> +    /*  7 MHz bandwidth */
>>>> +        {
>>>> +        0xe7, 0xcc, 0xb5, 0xba, 0xe8, 0x2f, 0x67, 0x61, 0x00, 0xaf,
>>>> +        0x86, 0xf2, 0xbf, 0x59, 0x04, 0x11, 0xb6, 0x33, 0xa4, 0x30,
>>>> +        0x15, 0x10, 0x0a, 0x42, 0x18, 0xf8, 0x17, 0xd9, 0x07, 0x22,
>>>> +        0x19, 0x10,
>>>> +        },
>>>> +
>>>> +    /*  8 MHz bandwidth */
>>>> +        {
>>>> +        0x09, 0xf6, 0xd2, 0xa7, 0x9a, 0xc9, 0x27, 0x77, 0x06, 0xbf,
>>>> +        0xec, 0xf4, 0x4f, 0x0b, 0xfc, 0x01, 0x63, 0x35, 0x54, 0xa7,
>>>> +        0x16, 0x66, 0x08, 0xb4, 0x19, 0x6e, 0x19, 0x65, 0x05, 0xc8,
>>>> +        0x19, 0xe0,
>>>> +        },
>>>> +    };
>>>> +
>>>> +
>>>> +    dbg("%s: frequency=%d bandwidth_hz=%d inversion=%d", __func__,
>>>> +        c->frequency, c->bandwidth_hz, c->inversion);
>>>> +
>>>> +
>>>> +    /* program tuner */
>>>> +    if (fe->ops.tuner_ops.set_params)
>>>> +        fe->ops.tuner_ops.set_params(fe);
>>>> +
>>>> +
>>>> +    switch (c->bandwidth_hz) {
>>>> +    case 6000000:
>>>> +        i = 0;
>>>> +        bw_mode = 48000000;
>>>> +        break;
>>>> +    case 7000000:
>>>> +        i = 1;
>>>> +        bw_mode = 56000000;
>>>> +        break;
>>>> +    case 8000000:
>>>> +        i = 2;
>>>> +        bw_mode = 64000000;
>>>> +        break;
>>>> +    default:
>>>> +        dbg("invalid bandwidth");
>>>> +        return -EINVAL;
>>>> +    }
>>>> +
>>>> +    for (j = 0; j<  sizeof(bw_params[j]); j++) {
>>>> +        ret = rtl2832_wr_regs(priv, 0x1c+j, 1,&bw_params[i][j], 1);
>>>> +        if (ret)
>>>> +            goto err;
>>>> +    }
>>>> +
>>>> +    /* calculate and set resample ratio
>>>> +    * RSAMP_RATIO = floor(CrystalFreqHz * 7 * pow(2, 22)
>>>> +    *    / ConstWithBandwidthMode)
>>>> +    */
>>>> +    num = priv->cfg.xtal * 7;
>>>> +    num *= 0x400000;
>>>> +    num = div_u64(num, bw_mode);
>>>> +    resamp_ratio =  num&  0x3ffffff;
>>>> +    ret = rtl2832_wr_demod_reg(priv, DVBT_RSAMP_RATIO, resamp_ratio);
>>>> +    if (ret)
>>>> +        goto err;
>>>> +
>>>> +    /* calculate and set cfreq off ratio
>>>> +    * CFREQ_OFF_RATIO = - floor(ConstWithBandwidthMode * pow(2, 20)
>>>> +    *    / (CrystalFreqHz * 7))
>>>> +    */
>>>> +    num = bw_mode<<  20;
>>>> +    num2 = priv->cfg.xtal * 7;
>>>> +    num = div_u64(num, num2);
>>>> +    num = -num;
>>>> +    cfreq_off_ratio = num&  0xfffff;
>>>> +    ret = rtl2832_wr_demod_reg(priv, DVBT_CFREQ_OFF_RATIO,
>>>> cfreq_off_ratio);
>>>> +    if (ret)
>>>> +        goto err;
>>>> +
>>>> +
>>>> +    /* soft reset */
>>>> +    ret = rtl2832_wr_demod_reg(priv, DVBT_SOFT_RST, 0x1);
>>>> +    if (ret)
>>>> +        goto err;
>>>> +
>>>> +    ret = rtl2832_wr_demod_reg(priv, DVBT_SOFT_RST, 0x0);
>>>> +    if (ret)
>>>> +        goto err;
>>>> +
>>>> +    return ret;
>>>> +err:
>>>> +    info("%s: failed=%d", __func__, ret);
>>>> +    return ret;
>>>> +}
>>>> +
>>>> +static int rtl2832_read_status(struct dvb_frontend *fe, fe_status_t
>>>> *status)
>>>> +{
>>>> +    struct rtl2832_priv *priv = fe->demodulator_priv;
>>>> +    int ret;
>>>> +    u32 tmp;
>>>> +    *status = 0;
>>>> +
>>>> +
>>>> +    dbg("%s", __func__);
>>>> +    if (priv->sleeping)
>>>> +        return 0;
>>>> +
>>>> +    ret = rtl2832_rd_demod_reg(priv, DVBT_FSM_STAGE,&tmp);
>>>> +    if (ret)
>>>> +        goto err;
>>>> +
>>>> +    if (tmp == 11) {
>>>> +        *status |= FE_HAS_SIGNAL | FE_HAS_CARRIER |
>>>> +                FE_HAS_VITERBI | FE_HAS_SYNC | FE_HAS_LOCK;
>>>> +    }
>>>> +    /* TODO find out if this is also true for rtl2832? */
>>>> +    /*else if (tmp == 10) {
>>>> +        *status |= FE_HAS_SIGNAL | FE_HAS_CARRIER |
>>>> +                FE_HAS_VITERBI;
>>>> +    }*/
>>>> +
>>>> +    return ret;
>>>> +err:
>>>> +    info("%s: failed=%d", __func__, ret);
>>>> +    return ret;
>>>> +}
>>>> +
>>>> +static int rtl2832_read_snr(struct dvb_frontend *fe, u16 *snr)
>>>> +{
>>>> +    *snr = 0;
>>>> +    return 0;
>>>> +}
>>>> +
>>>> +static int rtl2832_read_ber(struct dvb_frontend *fe, u32 *ber)
>>>> +{
>>>> +    *ber = 0;
>>>> +    return 0;
>>>> +}
>>>> +
>>>> +static int rtl2832_read_ucblocks(struct dvb_frontend *fe, u32
> *ucblocks)
>>>> +{
>>>> +    *ucblocks = 0;
>>>> +    return 0;
>>>> +}
>>>> +
>>>> +
>>>> +static int rtl2832_read_signal_strength(struct dvb_frontend *fe, u16
>>>> *strength)
>>>> +{
>>>> +    *strength = 0;
>>>> +    return 0;
>>>> +}
>>>> +
>>>> +static struct dvb_frontend_ops rtl2832_ops;
>>>> +
>>>> +static void rtl2832_release(struct dvb_frontend *fe)
>>>> +{
>>>> +    struct rtl2832_priv *priv = fe->demodulator_priv;
>>>> +
>>>> +    dbg("%s", __func__);
>>>> +    kfree(priv);
>>>> +}
>>>> +
>>>> +struct dvb_frontend *rtl2832_attach(const struct rtl2832_config *cfg,
>>>> +    struct i2c_adapter *i2c)
>>>> +{
>>>> +    struct rtl2832_priv *priv = NULL;
>>>> +    int ret = 0;
>>>> +    u8 tmp;
>>>> +
>>>> +    dbg("%s", __func__);
>>>> +
>>>> +    /* allocate memory for the internal state */
>>>> +    priv = kzalloc(sizeof(struct rtl2832_priv), GFP_KERNEL);
>>>> +    if (priv == NULL)
>>>> +        goto err;
>>>> +
>>>> +    /* setup the priv */
>>>> +    priv->i2c = i2c;
>>>> +    priv->tuner = cfg->tuner;
>>>> +    memcpy(&priv->cfg, cfg, sizeof(struct rtl2832_config));
>>>> +
>>>> +    /* check if the demod is there */
>>>> +    ret = rtl2832_rd_reg(priv, 0x00, 0x0,&tmp);
>>>> +    if (ret)
>>>> +        goto err;
>>>> +
>>>> +    /* create dvb_frontend */
>>>> +    memcpy(&priv->fe.ops,&rtl2832_ops, sizeof(struct
> dvb_frontend_ops));
>>>> +    priv->fe.demodulator_priv = priv;
>>>> +
>>>> +    /* TODO implement sleep mode */
>>>> +    priv->sleeping = true;
>>>> +
>>>> +    return&priv->fe;
>>>> +err:
>>>> +    dbg("%s: failed=%d", __func__, ret);
>>>> +    kfree(priv);
>>>> +    return NULL;
>>>> +}
>>>> +EXPORT_SYMBOL(rtl2832_attach);
>>>> +
>>>> +static struct dvb_frontend_ops rtl2832_ops = {
>>>> +    .delsys = { SYS_DVBT },
>>>> +    .info = {
>>>> +        .name = "Realtek RTL2832 (DVB-T)",
>>>> +        .frequency_min      = 174000000,
>>>> +        .frequency_max      = 862000000,
>>>> +        .frequency_stepsize = 166667,
>>>> +        .caps = FE_CAN_FEC_1_2 |
>>>> +            FE_CAN_FEC_2_3 |
>>>> +            FE_CAN_FEC_3_4 |
>>>> +            FE_CAN_FEC_5_6 |
>>>> +            FE_CAN_FEC_7_8 |
>>>> +            FE_CAN_FEC_AUTO |
>>>> +            FE_CAN_QPSK |
>>>> +            FE_CAN_QAM_16 |
>>>> +            FE_CAN_QAM_64 |
>>>> +            FE_CAN_QAM_AUTO |
>>>> +            FE_CAN_TRANSMISSION_MODE_AUTO |
>>>> +            FE_CAN_GUARD_INTERVAL_AUTO |
>>>> +            FE_CAN_HIERARCHY_AUTO |
>>>> +            FE_CAN_RECOVER |
>>>> +            FE_CAN_MUTE_TS
>>>> +     },
>>>> +
>>>> +    .release = rtl2832_release,
>>>> +
>>>> +    .init = rtl2832_init,
>>>> +    .sleep = rtl2832_sleep,
>>>> +
>>>> +    .get_tune_settings = rtl2832_get_tune_settings,
>>>> +
>>>> +    .set_frontend = rtl2832_set_frontend,
>>>> +
>>>> +    .read_status = rtl2832_read_status,
>>>> +    .read_snr = rtl2832_read_snr,
>>>> +    .read_ber = rtl2832_read_ber,
>>>> +    .read_ucblocks = rtl2832_read_ucblocks,
>>>> +    .read_signal_strength = rtl2832_read_signal_strength,
>>>> +    .i2c_gate_ctrl = rtl2832_i2c_gate_ctrl,
>>>> +};
>>>> +
>>>> +MODULE_AUTHOR("Thomas Mair<mair.thomas86@gmail.com>");
>>>> +MODULE_DESCRIPTION("Realtek RTL2832 DVB-T demodulator driver");
>>>> +MODULE_LICENSE("GPL");
>>>> +MODULE_VERSION("0.4");
>>>> diff --git a/drivers/media/dvb/frontends/rtl2832.h
>>>> b/drivers/media/dvb/frontends/rtl2832.h
>>>> new file mode 100644
>>>> index 0000000..d94dc9a
>>>> --- /dev/null
>>>> +++ b/drivers/media/dvb/frontends/rtl2832.h
>>>> @@ -0,0 +1,74 @@
>>>> +/*
>>>> + * Realtek RTL2832 DVB-T demodulator driver
>>>> + *
>>>> + * Copyright (C) 2012 Thomas Mair<thomas.mair86@gmail.com>
>>>> + *
>>>> + *    This program is free software; you can redistribute it and/or
>>>> modify
>>>> + *    it under the terms of the GNU General Public License as
>>>> published by
>>>> + *    the Free Software Foundation; either version 2 of the License,
> or
>>>> + *    (at your option) any later version.
>>>> + *
>>>> + *    This program is distributed in the hope that it will be useful,
>>>> + *    but WITHOUT ANY WARRANTY; without even the implied warranty of
>>>> + *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>>>> + *    GNU General Public License for more details.
>>>> + *
>>>> + *    You should have received a copy of the GNU General Public
>>>> License along
>>>> + *    with this program; if not, write to the Free Software
>>>> Foundation, Inc.,
>>>> + *    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
>>>> + */
>>>> +
>>>> +#ifndef RTL2832_H
>>>> +#define RTL2832_H
>>>> +
>>>> +#include<linux/dvb/frontend.h>
>>>> +
>>>> +struct rtl2832_config {
>>>> +    /*
>>>> +     * Demodulator I2C address.
>>>> +     */
>>>> +    u8 i2c_addr;
>>>> +
>>>> +    /*
>>>> +     * Xtal frequency.
>>>> +     * Hz
>>>> +     * 4000000, 16000000, 25000000, 28800000
>>>> +     */
>>>> +    u32 xtal;
>>>> +
>>>> +    /*
>>>> +     * IFs for all used modes.
>>>> +     * Hz
>>>> +     * 4570000, 4571429, 36000000, 36125000, 36166667, 44000000
>>>> +     */
>>>> +    u32 if_dvbt;
>>>> +
>>>> +    /*
>>>> +     */
>>>> +    u8 tuner;
>>>> +};
>>>> +
>>>> +
>>>> +#if defined(CONFIG_DVB_RTL2832) || \
>>>> +    (defined(CONFIG_DVB_RTL2832_MODULE)&&  defined(MODULE))
>>>> +extern struct dvb_frontend *rtl2832_attach(
>>>> +    const struct rtl2832_config *cfg,
>>>> +    struct i2c_adapter *i2c
>>>> +);
>>>> +
>>>> +extern struct i2c_adapter *rtl2832_get_tuner_i2c_adapter(
>>>> +    struct dvb_frontend *fe
>>>> +);
>>>> +#else
>>>> +static inline struct dvb_frontend *rtl2832_attach(
>>>> +    const struct rtl2832_config *config,
>>>> +    struct i2c_adapter *i2c
>>>> +)
>>>> +{
>>>> +    printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
>>>> +    return NULL;
>>>> +}
>>>> +#endif
>>>> +
>>>> +
>>>> +#endif /* RTL2832_H */
>>>> diff --git a/drivers/media/dvb/frontends/rtl2832_priv.h
>>>> b/drivers/media/dvb/frontends/rtl2832_priv.h
>>>> new file mode 100644
>>>> index 0000000..3e52674
>>>> --- /dev/null
>>>> +++ b/drivers/media/dvb/frontends/rtl2832_priv.h
>>>> @@ -0,0 +1,258 @@
>>>> +/*
>>>> + * Realtek RTL2832 DVB-T demodulator driver
>>>> + *
>>>> + * Copyright (C) 2012 Thomas Mair<thomas.mair86@gmail.com>
>>>> + *
>>>> + *    This program is free software; you can redistribute it and/or
>>>> modify
>>>> + *    it under the terms of the GNU General Public License as
>>>> published by
>>>> + *    the Free Software Foundation; either version 2 of the License,
> or
>>>> + *    (at your option) any later version.
>>>> + *
>>>> + *    This program is distributed in the hope that it will be useful,
>>>> + *    but WITHOUT ANY WARRANTY; without even the implied warranty of
>>>> + *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>>>> + *    GNU General Public License for more details.
>>>> + *
>>>> + *    You should have received a copy of the GNU General Public
>>>> License along
>>>> + *    with this program; if not, write to the Free Software
>>>> Foundation, Inc.,
>>>> + *    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
>>>> + */
>>>> +
>>>> +#ifndef RTL2832_PRIV_H
>>>> +#define RTL2832_PRIV_H
>>>> +
>>>> +#include "dvb_frontend.h"
>>>> +#include "rtl2832.h"
>>>> +
>>>> +#define LOG_PREFIX "rtl2832"
>>>> +
>>>> +#undef dbg
>>>> +#define dbg(f, arg...) \
>>>> +    if (rtl2832_debug) \
>>>> +        printk(KERN_INFO LOG_PREFIX": " f "\n" , ## arg)
>>>
>>> ERROR: Macros with complex values should be enclosed in parenthesis
>>> #30: FILE: media/dvb/frontends/rtl2832_priv.h:30:
>>> +#define dbg(f, arg...) \
>>> +    if (rtl2832_debug) \
>>> +        printk(KERN_INFO LOG_PREFIX": " f "\n" , ## arg)
>>>
>>>> +#undef err
>>>> +#define err(f, arg...)  printk(KERN_ERR    LOG_PREFIX": " f "\n" , ##
>>>> arg)
>>>> +#undef info
>>>> +#define info(f, arg...) printk(KERN_INFO LOG_PREFIX": " f "\n" , ##
> arg)
>>>> +#undef warn
>>>> +#define warn(f, arg...) printk(KERN_WARNING LOG_PREFIX": " f "\n" ,
>>>> ## arg)
>>>> +
>>>> +struct rtl2832_priv {
>>>> +    struct i2c_adapter *i2c;
>>>> +    struct dvb_frontend fe;
>>>> +    struct rtl2832_config cfg;
>>>> +
>>>> +    bool i2c_gate_state;
>>>> +    bool sleeping;
>>>> +
>>>> +    u8 tuner;
>>>> +    u8 page; /* active register page */
>>>> +};
>>>> +
>>>> +struct rtl2832_reg_entry {
>>>> +    u8 page;
>>>> +    u8 start_address;
>>>> +    u8 msb;
>>>> +    u8 lsb;
>>>> +};
>>>> +
>>>> +struct rtl2832_reg_value {
>>>> +    int reg;
>>>
>>> As this reg is enum I wonder if it is possible to use enum as a type
>>> (enum reg)? Still I am not sure about it and I dont like to test it :)
>>>
>>>> +    u32 value;
>>>> +};
>>>> +
>>>> +
>>>> +/* Demod register bit names */
>>>> +enum DVBT_REG_BIT_NAME {
>>>> +    DVBT_SOFT_RST,
>>>> +    DVBT_IIC_REPEAT,
>>>> +    DVBT_TR_WAIT_MIN_8K,
>>>> +    DVBT_RSD_BER_FAIL_VAL,
>>>> +    DVBT_EN_BK_TRK,
>>>> +    DVBT_REG_PI,
>>>> +    DVBT_REG_PFREQ_1_0,
>>>> +    DVBT_PD_DA8,
>>>> +    DVBT_LOCK_TH,
>>>> +    DVBT_BER_PASS_SCAL,
>>>> +    DVBT_CE_FFSM_BYPASS,
>>>> +    DVBT_ALPHAIIR_N,
>>>> +    DVBT_ALPHAIIR_DIF,
>>>> +    DVBT_EN_TRK_SPAN,
>>>> +    DVBT_LOCK_TH_LEN,
>>>> +    DVBT_CCI_THRE,
>>>> +    DVBT_CCI_MON_SCAL,
>>>> +    DVBT_CCI_M0,
>>>> +    DVBT_CCI_M1,
>>>> +    DVBT_CCI_M2,
>>>> +    DVBT_CCI_M3,
>>>> +    DVBT_SPEC_INIT_0,
>>>> +    DVBT_SPEC_INIT_1,
>>>> +    DVBT_SPEC_INIT_2,
>>>> +    DVBT_AD_EN_REG,
>>>> +    DVBT_AD_EN_REG1,
>>>> +    DVBT_EN_BBIN,
>>>> +    DVBT_MGD_THD0,
>>>> +    DVBT_MGD_THD1,
>>>> +    DVBT_MGD_THD2,
>>>> +    DVBT_MGD_THD3,
>>>> +    DVBT_MGD_THD4,
>>>> +    DVBT_MGD_THD5,
>>>> +    DVBT_MGD_THD6,
>>>> +    DVBT_MGD_THD7,
>>>> +    DVBT_EN_CACQ_NOTCH,
>>>> +    DVBT_AD_AV_REF,
>>>> +    DVBT_PIP_ON,
>>>> +    DVBT_SCALE1_B92,
>>>> +    DVBT_SCALE1_B93,
>>>> +    DVBT_SCALE1_BA7,
>>>> +    DVBT_SCALE1_BA9,
>>>> +    DVBT_SCALE1_BAA,
>>>> +    DVBT_SCALE1_BAB,
>>>> +    DVBT_SCALE1_BAC,
>>>> +    DVBT_SCALE1_BB0,
>>>> +    DVBT_SCALE1_BB1,
>>>> +    DVBT_KB_P1,
>>>> +    DVBT_KB_P2,
>>>> +    DVBT_KB_P3,
>>>> +    DVBT_OPT_ADC_IQ,
>>>> +    DVBT_AD_AVI,
>>>> +    DVBT_AD_AVQ,
>>>> +    DVBT_K1_CR_STEP12,
>>>> +    DVBT_TRK_KS_P2,
>>>> +    DVBT_TRK_KS_I2,
>>>> +    DVBT_TR_THD_SET2,
>>>> +    DVBT_TRK_KC_P2,
>>>> +    DVBT_TRK_KC_I2,
>>>> +    DVBT_CR_THD_SET2,
>>>> +    DVBT_PSET_IFFREQ,
>>>> +    DVBT_SPEC_INV,
>>>> +    DVBT_BW_INDEX,
>>>> +    DVBT_RSAMP_RATIO,
>>>> +    DVBT_CFREQ_OFF_RATIO,
>>>> +    DVBT_FSM_STAGE,
>>>> +    DVBT_RX_CONSTEL,
>>>> +    DVBT_RX_HIER,
>>>> +    DVBT_RX_C_RATE_LP,
>>>> +    DVBT_RX_C_RATE_HP,
>>>> +    DVBT_GI_IDX,
>>>> +    DVBT_FFT_MODE_IDX,
>>>> +    DVBT_RSD_BER_EST,
>>>> +    DVBT_CE_EST_EVM,
>>>> +    DVBT_RF_AGC_VAL,
>>>> +    DVBT_IF_AGC_VAL,
>>>> +    DVBT_DAGC_VAL,
>>>> +    DVBT_SFREQ_OFF,
>>>> +    DVBT_CFREQ_OFF,
>>>> +    DVBT_POLAR_RF_AGC,
>>>> +    DVBT_POLAR_IF_AGC,
>>>> +    DVBT_AAGC_HOLD,
>>>> +    DVBT_EN_RF_AGC,
>>>> +    DVBT_EN_IF_AGC,
>>>> +    DVBT_IF_AGC_MIN,
>>>> +    DVBT_IF_AGC_MAX,
>>>> +    DVBT_RF_AGC_MIN,
>>>> +    DVBT_RF_AGC_MAX,
>>>> +    DVBT_IF_AGC_MAN,
>>>> +    DVBT_IF_AGC_MAN_VAL,
>>>> +    DVBT_RF_AGC_MAN,
>>>> +    DVBT_RF_AGC_MAN_VAL,
>>>> +    DVBT_DAGC_TRG_VAL,
>>>> +    DVBT_AGC_TARG_VAL,
>>>> +    DVBT_LOOP_GAIN_3_0,
>>>> +    DVBT_LOOP_GAIN_4,
>>>> +    DVBT_VTOP,
>>>> +    DVBT_KRF,
>>>> +    DVBT_AGC_TARG_VAL_0,
>>>> +    DVBT_AGC_TARG_VAL_8_1,
>>>> +    DVBT_AAGC_LOOP_GAIN,
>>>> +    DVBT_LOOP_GAIN2_3_0,
>>>> +    DVBT_LOOP_GAIN2_4,
>>>> +    DVBT_LOOP_GAIN3,
>>>> +    DVBT_VTOP1,
>>>> +    DVBT_VTOP2,
>>>> +    DVBT_VTOP3,
>>>> +    DVBT_KRF1,
>>>> +    DVBT_KRF2,
>>>> +    DVBT_KRF3,
>>>> +    DVBT_KRF4,
>>>> +    DVBT_EN_GI_PGA,
>>>> +    DVBT_THD_LOCK_UP,
>>>> +    DVBT_THD_LOCK_DW,
>>>> +    DVBT_THD_UP1,
>>>> +    DVBT_THD_DW1,
>>>> +    DVBT_INTER_CNT_LEN,
>>>> +    DVBT_GI_PGA_STATE,
>>>> +    DVBT_EN_AGC_PGA,
>>>> +    DVBT_CKOUTPAR,
>>>> +    DVBT_CKOUT_PWR,
>>>> +    DVBT_SYNC_DUR,
>>>> +    DVBT_ERR_DUR,
>>>> +    DVBT_SYNC_LVL,
>>>> +    DVBT_ERR_LVL,
>>>> +    DVBT_VAL_LVL,
>>>> +    DVBT_SERIAL,
>>>> +    DVBT_SER_LSB,
>>>> +    DVBT_CDIV_PH0,
>>>> +    DVBT_CDIV_PH1,
>>>> +    DVBT_MPEG_IO_OPT_2_2,
>>>> +    DVBT_MPEG_IO_OPT_1_0,
>>>> +    DVBT_CKOUTPAR_PIP,
>>>> +    DVBT_CKOUT_PWR_PIP,
>>>> +    DVBT_SYNC_LVL_PIP,
>>>> +    DVBT_ERR_LVL_PIP,
>>>> +    DVBT_VAL_LVL_PIP,
>>>> +    DVBT_CKOUTPAR_PID,
>>>> +    DVBT_CKOUT_PWR_PID,
>>>> +    DVBT_SYNC_LVL_PID,
>>>> +    DVBT_ERR_LVL_PID,
>>>> +    DVBT_VAL_LVL_PID,
>>>> +    DVBT_SM_PASS,
>>>> +    DVBT_UPDATE_REG_2,
>>>> +    DVBT_BTHD_P3,
>>>> +    DVBT_BTHD_D3,
>>>> +    DVBT_FUNC4_REG0,
>>>> +    DVBT_FUNC4_REG1,
>>>> +    DVBT_FUNC4_REG2,
>>>> +    DVBT_FUNC4_REG3,
>>>> +    DVBT_FUNC4_REG4,
>>>> +    DVBT_FUNC4_REG5,
>>>> +    DVBT_FUNC4_REG6,
>>>> +    DVBT_FUNC4_REG7,
>>>> +    DVBT_FUNC4_REG8,
>>>> +    DVBT_FUNC4_REG9,
>>>> +    DVBT_FUNC4_REG10,
>>>> +    DVBT_FUNC5_REG0,
>>>> +    DVBT_FUNC5_REG1,
>>>> +    DVBT_FUNC5_REG2,
>>>> +    DVBT_FUNC5_REG3,
>>>> +    DVBT_FUNC5_REG4,
>>>> +    DVBT_FUNC5_REG5,
>>>> +    DVBT_FUNC5_REG6,
>>>> +    DVBT_FUNC5_REG7,
>>>> +    DVBT_FUNC5_REG8,
>>>> +    DVBT_FUNC5_REG9,
>>>> +    DVBT_FUNC5_REG10,
>>>> +    DVBT_FUNC5_REG11,
>>>> +    DVBT_FUNC5_REG12,
>>>> +    DVBT_FUNC5_REG13,
>>>> +    DVBT_FUNC5_REG14,
>>>> +    DVBT_FUNC5_REG15,
>>>> +    DVBT_FUNC5_REG16,
>>>> +    DVBT_FUNC5_REG17,
>>>> +    DVBT_FUNC5_REG18,
>>>> +    DVBT_AD7_SETTING,
>>>> +    DVBT_RSSI_R,
>>>> +    DVBT_ACI_DET_IND,
>>>> +    DVBT_REG_MON,
>>>> +    DVBT_REG_MONSEL,
>>>> +    DVBT_REG_GPE,
>>>> +    DVBT_REG_GPO,
>>>> +    DVBT_REG_4MSEL,
>>>> +    DVBT_TEST_REG_1,
>>>> +    DVBT_TEST_REG_2,
>>>> +    DVBT_TEST_REG_3,
>>>> +    DVBT_TEST_REG_4,
>>>> +    DVBT_REG_BIT_NAME_ITEM_TERMINATOR,
>>>> +};
>>>> +
>>>> +#endif /* RTL2832_PRIV_H */
>>>
>>>
>>
>> checkpatch.pl:
>> author  Joe Perches <joe@perches.com>
>>        Fri, 11 May 2012 00:59:25 +0000 (10:59 +1000)
>> committer       Stephen Rothwell <sfr@canb.auug.org.au>
>>        Thu, 17 May 2012 07:18:17 +0000 (17:18 +1000)
>>
>>
> http://git.kernel.org/?p=linux/kernel/git/next/linux-next.git;a=commit;h=2a7561d6bbf29c631ad05a8fabe313142ba3d7d0
>>
>> ./checkpatch.pl --no-tree --no-signoff rtl2832.c-v2.diff
>> total: 0 errors, 0 warnings, 63 lines checked
>>
>> rtl2832.c-v2.diff has no obvious style problems and is ready for
> submission.
>>
>> ./checkpatch.pl --no-tree --no-signoff rtl2832.h.diff
>> total: 0 errors, 0 warnings, 8 lines checked
>>
>> rtl2832.h.diff has no obvious style problems and is ready for submission.
>>
>> ./checkpatch.pl --no-tree --no-signoff rtl2832_priv.h.diff
>> total: 0 errors, 0 warnings, 17 lines checked
>>
>> rtl2832_priv.h.diff has no obvious style problems and is ready for
>> submission.
>>
>> ./checkpatch.pl --no-tree --file rtl2832.c
>> total: 0 errors, 0 warnings, 824 lines checked
>>
>> rtl2832.c has no obvious style problems and is ready for submission.
>>
>> ./checkpatch.pl --no-tree --file rtl2832.h
>> total: 0 errors, 0 warnings, 74 lines checked
>>
>> rtl2832.h has no obvious style problems and is ready for submission.
>>
>>  ./checkpatch.pl --no-tree --file rtl2832_priv.h
>> ERROR: Macros with complex values should be enclosed in parenthesis
>> #30: FILE: rtl2832_priv.h:30:
>> +#define dbg(f, arg...) \
>> +       if (rtl2832_debug) \
>> +               pr_info(KERN_INFO LOG_PREFIX": " f "\n" , ## arg)
>>
>> total: 1 errors, 0 warnings, 258 lines checked
>>
>> rtl2832_priv.h has style problems, please review.
>>
>> If any of these errors are false positives, please report
>> them to the maintainer, see CHECKPATCH in MAINTAINERS.
>>
>>
>> Regarding "ERROR: Macros with complex values should be enclosed in
>> parenthesis":
>>
>> ./checkpatch.pl --no-tree --file *_priv.h | grep -A 1 "ERROR: Macros
>> with complex values"
>> ERROR: Macros with complex values should be enclosed in parenthesis
>> #35: FILE: af9013_priv.h:35:
>> --
>> ERROR: Macros with complex values should be enclosed in parenthesis
>> #241: FILE: bcm3510_priv.h:241:
>> --
>> ERROR: Macros with complex values should be enclosed in parenthesis
>> #242: FILE: bcm3510_priv.h:242:
>> --
>> ERROR: Macros with complex values should be enclosed in parenthesis
>> #243: FILE: bcm3510_priv.h:243:
>> --
>> ERROR: Macros with complex values should be enclosed in parenthesis
>> #244: FILE: bcm3510_priv.h:244:
>> --
>> ERROR: Macros with complex values should be enclosed in parenthesis
>> #245: FILE: bcm3510_priv.h:245:
>> --
>> ERROR: Macros with complex values should be enclosed in parenthesis
>> #246: FILE: bcm3510_priv.h:246:
>> --
>> ERROR: Macros with complex values should be enclosed in parenthesis
>> #247: FILE: bcm3510_priv.h:247:
>> --
>> ERROR: Macros with complex values should be enclosed in parenthesis
>> #33: FILE: cxd2820r_priv.h:33:
>> --
>> ERROR: Macros with complex values should be enclosed in parenthesis
>> #24: FILE: dib3000mb_priv.h:24:
>> --
>> ERROR: Macros with complex values should be enclosed in parenthesis
>> #34: FILE: hd29l2_priv.h:34:
>> --
>> ERROR: Macros with complex values should be enclosed in parenthesis
>> #30: FILE: rtl2830_priv.h:30:
>> --
>> ERROR: Macros with complex values should be enclosed in parenthesis
>> #30: FILE: rtl2832_priv.h:30:
>> […]
>> --
>> ERROR: Macros with complex values should be enclosed in parenthesis
>> #69: FILE: stb0899_priv.h:69:
>> […]
>> --
>> ERROR: Macros with complex values should be enclosed in parenthesis
>> #31: FILE: tda10071_priv.h:31:
>>
>> E voilà!
>>
>> cheers,
>> poma
>>
>> ps.
>> CHECKPATCH
>> M:      Andy Whitcroft <apw@canonical.com>
>> S:      Supported
>> F:      scripts/checkpatch.pl
> Thanks.
> What about your changes of printk to pr_*? Is that the right way to go for
> error messages and debuging?
> 
> Regards
> Thomas
> 

grep -R 'pr_info\|pr_warn\|pr_err' * > suggest-pr_level.txt
It's latest suggestion from 'checkpatch' and as you can see in
'suggest-pr_level.txt' already present. So far as I am concerned, give
it a go!
;)

cheers,
poma

[-- Attachment #2: suggest-pr_level.txt --]
[-- Type: text/plain, Size: 61968 bytes --]

media/dvb/bt8xx/dvb-bt8xx.c:			pr_err("No memory\n");
media/dvb/bt8xx/dvb-bt8xx.c:			pr_err("%s: Could not find a Twinhan DST\n", __func__);
media/dvb/bt8xx/dvb-bt8xx.c:		pr_err("A frontend driver was not found for device [%04x:%04x] subsystem [%04x:%04x]\n",
media/dvb/bt8xx/dvb-bt8xx.c:			pr_err("Frontend registration failed!\n");
media/dvb/bt8xx/dvb-bt8xx.c:		pr_err("dvb_register_adapter failed (errno = %d)\n", result);
media/dvb/bt8xx/dvb-bt8xx.c:		pr_err("dvb_dmx_init failed (errno = %d)\n", result);
media/dvb/bt8xx/dvb-bt8xx.c:		pr_err("dvb_dmxdev_init failed (errno = %d)\n", result);
media/dvb/bt8xx/dvb-bt8xx.c:		pr_err("dvb_dmx_init failed (errno = %d)\n", result);
media/dvb/bt8xx/dvb-bt8xx.c:		pr_err("dvb_dmx_init failed (errno = %d)\n", result);
media/dvb/bt8xx/dvb-bt8xx.c:		pr_err("dvb_dmx_init failed (errno = %d)\n", result);
media/dvb/bt8xx/dvb-bt8xx.c:		pr_err("dvb_net_init failed (errno = %d)\n", result);
media/dvb/bt8xx/dvb-bt8xx.c:		pr_err("Unknown bttv card type: %d\n", sub->core->type);
media/dvb/bt8xx/dvb-bt8xx.c:		pr_err("no pci device for card %d\n", card->bttv_nr);
media/dvb/bt8xx/dvb-bt8xx.c:		pr_err("unable to determine DMA core of card %d,\n", card->bttv_nr);
media/dvb/bt8xx/dvb-bt8xx.c:		pr_err("if you have the ALSA bt87x audio driver installed, try removing it.\n");
media/dvb/ttpci/av7110_v4l.c:		pr_info("DVB-C analog module @ card %d detected, initializing MSP3400\n",
media/dvb/ttpci/av7110_v4l.c:		pr_info("DVB-C analog module @ card %d detected, initializing MSP3415\n",
media/dvb/ttpci/av7110_v4l.c:		pr_info("saa7113 not accessible\n");
media/dvb/ttpci/budget-av.c:		pr_info("cam ejected 1\n");
media/dvb/ttpci/budget-av.c:		pr_info("cam ejected 2\n");
media/dvb/ttpci/budget-av.c:		pr_info("cam ejected 3\n");
media/dvb/ttpci/budget-av.c:		pr_info("cam ejected 5\n");
media/dvb/ttpci/budget-av.c:				pr_info("cam inserted A\n");
media/dvb/ttpci/budget-av.c:			pr_info("cam inserted B\n");
media/dvb/ttpci/budget-av.c:				pr_info("cam ejected 5\n");
media/dvb/ttpci/budget-av.c:		pr_err("ci initialisation failed\n");
media/dvb/ttpci/budget-av.c:	pr_info("ci interface initialised\n");
media/dvb/ttpci/budget-av.c:		pr_err("A frontend driver was not found for device [%04x:%04x] subsystem [%04x:%04x]\n",
media/dvb/ttpci/budget-av.c:		pr_err("Frontend registration failed!\n");
media/dvb/ttpci/budget-av.c:		pr_err("KNC1-%d: Could not read MAC from KNC1 card\n",
media/dvb/ttpci/budget-av.c:		pr_info("KNC1-%d: MAC addr = %pM\n",
media/dvb/ttusb-dec/ttusbdecfe.c:			pr_info("%s: returned unknown value: %d\n",
media/dvb/frontends/rtl2832.h:	pr_warn(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
media/dvb/frontends/rtl2830.h:	pr_warn(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
media/dvb/frontends/rtl2832_priv.h:		pr_info(KERN_INFO LOG_PREFIX": " f "\n" , ## arg)
media/dvb/frontends/rtl2832_priv.h:#define err(f, arg...) pr_err(KERN_ERR LOG_PREFIX": " f "\n" , ## arg)
media/dvb/frontends/rtl2832_priv.h:#define info(f, arg...) pr_info(KERN_INFO LOG_PREFIX": " f "\n" , ## arg)
media/dvb/frontends/rtl2832_priv.h:#define warn(f, arg...) pr_warn(KERN_WARNING LOG_PREFIX": " f "\n" , ## arg)
media/rc/redrat3.c:	pr_info("%s:\n", __func__);
media/rc/redrat3.c:	pr_info(" * length: %u, transfer_type: 0x%02x\n",
media/rc/redrat3.c:	pr_info(" * pause: %u, freq_count: %u, no_periods: %u\n",
media/rc/redrat3.c:	pr_info(" * lengths: %u (max: %u)\n",
media/rc/redrat3.c:	pr_info(" * sig_size: %u (max: %u)\n",
media/rc/redrat3.c:	pr_info(" * repeats: %u\n", header->no_repeats);
media/rc/redrat3.c:	pr_info("%s:", __func__);
media/rc/redrat3.c:		pr_err("%s called with no context!\n", __func__);
media/rc/redrat3.c:		pr_err("%s called with invalid context!\n", __func__);
media/rc/imon.c:		pr_err("could not find interface for minor %d\n", subminor);
media/rc/imon.c:		pr_err("no context found for minor %d\n", subminor);
media/rc/imon.c:		pr_err("display not supported by device\n");
media/rc/imon.c:		pr_err("display port is already open\n");
media/rc/imon.c:		pr_err("no context for device\n");
media/rc/imon.c:		pr_err("display not supported by device\n");
media/rc/imon.c:		pr_err("display is not open\n");
media/rc/imon.c:		pr_err_ratelimited("error submitting urb(%d)\n", retval);
media/rc/imon.c:			pr_err_ratelimited("task interrupted\n");
media/rc/imon.c:			pr_err_ratelimited("packet tx failed (%d)\n", retval);
media/rc/imon.c:		pr_err("no context for device\n");
media/rc/imon.c:		pr_err("no iMON device present\n");
media/rc/imon.c:		pr_err("no context for device\n");
media/rc/imon.c:			pr_err("send_packet failed for packet %d\n", i);
media/rc/imon.c:		pr_err_ratelimited("no context for device\n");
media/rc/imon.c:		pr_err_ratelimited("no iMON device present\n");
media/rc/imon.c:		pr_err_ratelimited("invalid payload size\n");
media/rc/imon.c:			pr_err_ratelimited("send packet #%d failed\n", seq / 2);
media/rc/imon.c:		pr_err_ratelimited("send packet #%d failed\n", seq / 2);
media/rc/imon.c:		pr_err_ratelimited("no context for device\n");
media/rc/imon.c:		pr_err_ratelimited("no iMON display present\n");
media/rc/imon.c:		pr_err_ratelimited("invalid payload size: %d (expected 8)\n",
media/rc/imon.c:		pr_err_ratelimited("send packet failed!\n");
media/rc/imon.c:		pr_err("no valid input (IR) endpoint found\n");
media/rc/imon.c:		pr_err("usb_submit_urb failed for intf0 (%d)\n", ret);
media/rc/imon.c:		pr_err("usb_alloc_urb failed for IR urb\n");
media/rc/imon.c:		pr_err("usb_submit_urb failed for intf1 (%d)\n", ret);
media/rc/imon.c:			pr_err("failed to initialize context!\n");
media/rc/imon.c:			pr_err("failed to attach to context!\n");
media/rc/imon.c:				pr_err("Could not create RF sysfs entries(%d)\n",
media/rc/winbond-cir.c:		pr_err("Invalid power-on protocol\n");
media/rc/winbond-cir.c:		pr_err("Unable to register driver\n");
media/rc/ene_ir.c:		pr_warn("device seems to be disabled\n");
media/rc/ene_ir.c:		pr_warn("send a mail to lirc-list@lists.sourceforge.net\n");
media/rc/ene_ir.c:		pr_warn("please attach output of acpidump and dmidecode\n");
media/rc/ene_ir.c:		pr_warn("chips 0x33xx aren't supported\n");
media/rc/ene_ir.c:	pr_warn("Error validating extra buffers, device probably won't work\n");
media/rc/ene_ir.c:		pr_warn("TX: transmitter cable isn't connected!\n");
media/rc/ene_ir.c:		pr_warn("TX: BUG: attempt to transmit NULL buffer\n");
media/rc/ene_ir.c:		pr_warn("Simulation of TX activated\n");
media/common/saa7146_i2c.c:			pr_warn("%s %s [irq]: timed out waiting for end of xfer\n",
media/common/saa7146_i2c.c:				pr_warn("%s %s: timed out waiting for MC2\n",
media/common/saa7146_i2c.c:				pr_warn("%s %s [poll]: timed out waiting for end of xfer\n",
media/common/saa7146_i2c.c:			pr_info("revision 0 error. this should never happen\n");
media/common/saa7146_fops.c:	pr_info("%s: registered device %s [v4l2]\n",
media/common/tuners/tda18212.c:		pr_info("%s: " fmt, __func__, ##arg);		\
media/common/tuners/tda18212.c:		pr_warn("i2c wr failed ret:%d reg:%02x len:%d\n",
media/common/tuners/tda18212.c:		pr_warn("i2c rd failed ret:%d reg:%02x len:%d\n",
media/common/tuners/tda18212.c:	pr_info("NXP TDA18212HN successfully identified\n");
media/common/tuners/tda18271-priv.h:#define tda_info(fmt, arg...)	pr_info(fmt, ##arg)
media/common/saa7146_core.c:	pr_info(" @ %li jiffies:\n", jiffies);
media/common/saa7146_core.c:		pr_info("0x%03x: 0x%08x\n", i, saa7146_read(dev, i));
media/common/saa7146_core.c:			pr_err("%s: %s timed out while waiting for registers getting programmed\n",
media/common/saa7146_core.c:			pr_err("%s: %s timed out while waiting for registers getting programmed\n",
media/common/saa7146_core.c:			pr_warn("%s: unexpected i2c irq: isr %08x psr %08x ssr %08x\n",
media/common/saa7146_core.c:	pr_info("found saa7146 @ mem %p (revision %d, irq %d) (0x%04x,0x%04x)\n",
media/common/saa7146_core.c:	pr_info("register extension '%s'\n", ext->name);
media/common/saa7146_core.c:	pr_info("unregister extension '%s'\n", ext->name);
media/radio/radio-wl1273.c:		pr_err("Cannot allocate memory for RDS buffer.\n");
media/radio/wl128x/fmdrv_rx.c:		pr_info("Frequency is set to (%d) but "
media/radio/radio-keene.c:		pr_err(KBUILD_MODNAME
media/video/usbvision/usbvision-video.c:		pr_err("%s: usb_get_intfdata() failed\n", __func__);
media/video/v4l2-subdev.c:		pr_info("%s: =================  START STATUS  =================\n",
media/video/v4l2-subdev.c:		pr_info("%s: ==================  END STATUS  ==================\n",
media/video/bt8xx/bttv-gpio.c:	pr_info("%d: add subdevice \"%s\"\n", core->nr, dev_name(&sub->dev));
media/video/bt8xx/bttv-i2c.c:		pr_info("%d: i2c: checking for %s @ 0x%02x... ",
media/video/bt8xx/bttv-i2c.c:			pr_warn("%d: i2c read 0x%x: error\n",
media/video/bt8xx/bttv-i2c.c:		pr_info("%s: i2c scan: found device @ 0x%x  [%s]\n",
media/video/bt8xx/bttv-driver.c:		pr_err("BUG! (btres)\n");
media/video/bt8xx/bttv-driver.c:			pr_info("%d: PLL can sleep, using XTAL (%d)\n",
media/video/bt8xx/bttv-driver.c:		pr_info("%d: Setting PLL: %d => %d (needs up to 100ms)\n",
media/video/bt8xx/bttv-driver.c:				pr_info("PLL set ok\n");
media/video/bt8xx/bttv-driver.c:		pr_info("Setting PLL failed\n");
media/video/bt8xx/bttv-driver.c:		pr_info("%d: reset, reinitialize\n", btv->c.nr);
media/video/bt8xx/bttv-driver.c:		pr_err("V4L2_BUF_TYPE_VIDEO_OVERLAY: no_overlay\n");
media/video/bt8xx/bttv-driver.c:		pr_err("V4L2_BUF_TYPE_VIDEO_OVERLAY: no_overlay\n");
media/video/bt8xx/bttv-driver.c:	pr_info("%s: risc disasm: %p [dma=0x%08lx]\n",
media/video/bt8xx/bttv-driver.c:		pr_info("%s:   0x%lx: ",
media/video/bt8xx/bttv-driver.c:			pr_info("%s:   0x%lx: 0x%08x [ arg #%d ]\n",
media/video/bt8xx/bttv-driver.c:	pr_info("  main: %08llx\n", (unsigned long long)btv->main.dma);
media/video/bt8xx/bttv-driver.c:	pr_info("  vbi : o=%08llx e=%08llx\n",
media/video/bt8xx/bttv-driver.c:	pr_info("  cap : o=%08llx e=%08llx\n",
media/video/bt8xx/bttv-driver.c:	pr_info("  scr : o=%08llx e=%08llx\n",
media/video/bt8xx/bttv-driver.c:	pr_warn("%d: irq: skipped frame [main=%lx,o_vbi=%lx,o_field=%lx,rc=%lx]\n",
media/video/bt8xx/bttv-driver.c:		pr_info("%d: timeout: drop=%d irq=%d/%d, risc=%08x, ",
media/video/bt8xx/bttv-driver.c:			pr_info("%d: %s%s @ %08x,",
media/video/bt8xx/bttv-driver.c:			pr_info("%d: FDSR @ %08x\n",
media/video/bt8xx/bttv-driver.c:				pr_err("%d: IRQ lockup, cleared int mask [",
media/video/bt8xx/bttv-driver.c:				pr_err("%d: IRQ lockup, clearing GPINT from int mask [",
media/video/bt8xx/bttv-driver.c:	pr_info("%d: registered device %s\n",
media/video/bt8xx/bttv-driver.c:		pr_err("%d: device_create_file 'card' failed\n", btv->c.nr);
media/video/bt8xx/bttv-driver.c:	pr_info("%d: registered device %s\n",
media/video/bt8xx/bttv-driver.c:	pr_info("%d: registered device %s\n",
media/video/bt8xx/bttv-driver.c:	pr_info("Bt8xx card found (%d)\n", bttv_num);
media/video/bt8xx/bttv-driver.c:		pr_err("out of memory\n");
media/video/bt8xx/bttv-driver.c:		pr_warn("%d: Can't enable device\n", btv->c.nr);
media/video/bt8xx/bttv-driver.c:		pr_warn("%d: No suitable DMA available\n", btv->c.nr);
media/video/bt8xx/bttv-driver.c:		pr_warn("%d: can't request iomem (0x%llx)\n",
media/video/bt8xx/bttv-driver.c:		pr_warn("%d: v4l2_device_register() failed\n", btv->c.nr);
media/video/bt8xx/bttv-driver.c:	pr_info("%d: Bt%d (rev %d) at %s, irq: %d, latency: %d, mmio: 0x%llx\n",
media/video/bt8xx/bttv-driver.c:		pr_err("%d: ioremap() failed\n", btv->c.nr);
media/video/bt8xx/bttv-driver.c:		pr_err("%d: can't get IRQ %d\n",
media/video/bt8xx/bttv-driver.c:		pr_info("%d: unloading\n", btv->c.nr);
media/video/bt8xx/bttv-driver.c:			pr_warn("%d: Can't enable device\n", btv->c.nr);
media/video/bt8xx/bttv-driver.c:		pr_warn("%d: Can't enable device\n", btv->c.nr);
media/video/bt8xx/bttv-driver.c:	pr_info("driver version %s loaded\n", BTTV_VERSION);
media/video/bt8xx/bttv-driver.c:		pr_info("using %d buffers with %dk (%d pages) each for capture\n",
media/video/bt8xx/bttv-driver.c:		pr_warn("bus_register error: %d\n", ret);
media/video/bt8xx/bttv-cards.c:			pr_info("%d: detected: %s [card=%d], PCI subsystem ID is %04x:%04x\n",
media/video/bt8xx/bttv-cards.c:			pr_info("%d: subsystem: %04x:%04x (UNKNOWN)\n",
media/video/bt8xx/bttv-cards.c:	pr_info("%d: using: %s [card=%d,%s]\n",
media/video/bt8xx/bttv-cards.c:	pr_info("%d: gpio config override: mask=0x%x, mux=",
media/video/bt8xx/bttv-cards.c:		pr_info("%d: detected by eeprom: %s [card=%d]\n",
media/video/bt8xx/bttv-cards.c:		pr_info("%d: FlyVideo_gpio: unknown tuner type\n", btv->c.nr);
media/video/bt8xx/bttv-cards.c:	pr_info("%d: FlyVideo Radio=%s RemoteControl=%s Tuner=%d gpio=0x%06x\n",
media/video/bt8xx/bttv-cards.c:	pr_info("%d: FlyVideo  LR90=%s tda9821/tda9820=%s capture_only=%s\n",
media/video/bt8xx/bttv-cards.c:		pr_info("%d: miro: id=%d tuner=%d radio=%s stereo=%s\n",
media/video/bt8xx/bttv-cards.c:		pr_info("%d: pinnacle/mt: id=%d info=\"%s\" radio=%s\n",
media/video/bt8xx/bttv-cards.c:			pr_info("%d: radio detected by subsystem id (CPH05x)\n",
media/video/bt8xx/bttv-cards.c:		pr_info("%d: tuner absent\n", btv->c.nr);
media/video/bt8xx/bttv-cards.c:		pr_warn("%d: tuner type unset\n", btv->c.nr);
media/video/bt8xx/bttv-cards.c:		pr_info("%d: tuner type=%d\n", btv->c.nr, btv->tuner_type);
media/video/bt8xx/bttv-cards.c:		pr_warn("%d: the autoload option is obsolete\n", btv->c.nr);
media/video/bt8xx/bttv-cards.c:		pr_warn("%d: use option msp3400, tda7432 or tvaudio to override which audio module should be used\n",
media/video/bt8xx/bttv-cards.c:		pr_warn("%d: unknown audiodev value!\n", btv->c.nr);
media/video/bt8xx/bttv-cards.c:	pr_warn("%d: audio absent, no audio device found!\n", btv->c.nr);
media/video/bt8xx/bttv-cards.c:		pr_info("%d: Modtec: Tuner autodetected by eeprom: %s\n",
media/video/bt8xx/bttv-cards.c:		pr_info("%d: Modtec: Tuner autodetected by eeprom: %s\n",
media/video/bt8xx/bttv-cards.c:		pr_info("%d: Modtec: Tuner autodetected by eeprom: %s\n",
media/video/bt8xx/bttv-cards.c:		pr_info("%d: Modtec: Unknown TunerString: %s\n",
media/video/bt8xx/bttv-cards.c:	pr_info("%d: Hauppauge eeprom indicates model#%d\n",
media/video/bt8xx/bttv-cards.c:		pr_info("%d: Switching board type from %s to %s\n",
media/video/bt8xx/bttv-cards.c:		pr_info("%d: Terratec Active Radio Upgrade found\n", btv->c.nr);
media/video/bt8xx/bttv-cards.c:		pr_warn("%d: no altera firmware [via hotplug]\n", btv->c.nr);
media/video/bt8xx/bttv-cards.c:	pr_info("%d: altera firmware upload %s\n",
media/video/bt8xx/bttv-cards.c:			pr_info("%d: osprey eeprom: unknown card type 0x%04x\n",
media/video/bt8xx/bttv-cards.c:	pr_info("%d: osprey eeprom: card=%d '%s' serial=%u\n",
media/video/bt8xx/bttv-cards.c:		pr_warn("%d: osprey eeprom: Not overriding user specified card type\n",
media/video/bt8xx/bttv-cards.c:		pr_info("%d: osprey eeprom: Changing card type from %d to %d\n",
media/video/bt8xx/bttv-cards.c:	pr_info("%d: Avermedia eeprom[0x%02x%02x]: tuner=",
media/video/bt8xx/bttv-cards.c:		pr_info("%d: Hauppauge/Voodoo msp34xx: reset line init [%d]\n",
media/video/bt8xx/bttv-cards.c:	pr_info("Setting DAC reference voltage level ...\n");
media/video/bt8xx/bttv-cards.c:	pr_info("Initialising 12C508 PIC chip ...\n");
media/video/bt8xx/bttv-cards.c:			pr_info("I2C Write(%2.2x) = %i\nI2C Read () = %2.2x\n\n",
media/video/bt8xx/bttv-cards.c:	pr_info("PXC200 Initialised\n");
media/video/bt8xx/bttv-cards.c:	pr_info("%d: Adlink RTV-24 initialisation in progress ...\n",
media/video/bt8xx/bttv-cards.c:		pr_info("%d: Adlink RTV-24 initialisation(1) ERROR_CPLD_Check_Failed (read %d)\n",
media/video/bt8xx/bttv-cards.c:		pr_info("%d: Adlink RTV-24 initialisation(2) ERROR_CPLD_Check_Failed (read %d)\n",
media/video/bt8xx/bttv-cards.c:	pr_info("%d: Adlink RTV-24 initialisation complete\n", btv->c.nr);
media/video/bt8xx/bttv-cards.c:		pr_warn("%d: tea5757: read timeout\n", btv->c.nr);
media/video/bt8xx/bttv-cards.c:		pr_info("Host bridge needs ETBF enabled\n");
media/video/bt8xx/bttv-cards.c:		pr_info("Host bridge needs VSFX enabled\n");
media/video/bt8xx/bttv-cards.c:		pr_info("bttv and your chipset may not work together\n");
media/video/bt8xx/bttv-cards.c:			pr_info("overlay will be disabled\n");
media/video/bt8xx/bttv-cards.c:			pr_info("overlay forced. Use this option at your own risk.\n");
media/video/bt8xx/bttv-cards.c:		pr_info("pci latency fixup [%d]\n", latency);
media/video/bt8xx/bttv-cards.c:			pr_info("Host bridge: 82441FX Natoma, bufcon=0x%02x\n",
media/video/bt8xx/bttv-cards.c:			pr_info("%d: enabling ETBF (430FX/VP3 compatibility)\n",
media/video/bt8xx/bttv-cards.c:			pr_info("%d: enabling VSFX\n", btv->c.nr);
media/video/bt8xx/bttv-cards.c:			pr_info("%d: setting pci timer to %d\n",
media/video/bt8xx/bttv-input.c:		pr_info(fmt, ##__VA_ARGS__);	\
media/video/bt8xx/bttv-input.c:			pr_info(DEVNAME ":"
media/video/cx25821/cx25821-audio-upstream.c:		pr_err("%s(): ERROR opening file(%s) with errno = %d!\n",
media/video/cx25821/cx25821-audio-upstream.c:			pr_err("%s(): File has no file operations registered!\n",
media/video/cx25821/cx25821-audio-upstream.c:			pr_err("%s(): File has no READ operations registered!\n",
media/video/cx25821/cx25821-audio-upstream.c:				pr_info("Done: exit %s() since no more bytes to read from Audio file\n",
media/video/cx25821/cx25821-audio-upstream.c:		pr_err("ERROR %s(): since container_of(work_struct) FAILED!\n",
media/video/cx25821/cx25821-audio-upstream.c:		pr_err("%s(): ERROR opening file(%s) with errno = %d!\n",
media/video/cx25821/cx25821-audio-upstream.c:			pr_err("%s(): File has no file operations registered!\n",
media/video/cx25821/cx25821-audio-upstream.c:			pr_err("%s(): File has no READ operations registered!\n",
media/video/cx25821/cx25821-audio-upstream.c:					pr_info("Done: exit %s() since no more bytes to read from Audio file\n",
media/video/cx25821/cx25821-audio-upstream.c:			pr_warn("%s(): Audio Received Overflow Error Interrupt!\n",
media/video/cx25821/cx25821-audio-upstream.c:			pr_warn("%s(): Audio Received Sync Error Interrupt!\n",
media/video/cx25821/cx25821-audio-upstream.c:			pr_warn("%s(): Audio Received OpCode Error Interrupt!\n",
media/video/cx25821/cx25821-audio-upstream.c:		pr_warn("EOF Channel Audio Framecount = %d\n",
media/video/cx25821/cx25821-audio-upstream.c:			pr_err("ERROR: %s() fifo is NOT turned on. Timeout!\n",
media/video/cx25821/cx25821-audio-upstream.c:		pr_err("%s: can't get upstream IRQ %d\n", dev->name,
media/video/cx25821/cx25821-audio-upstream.c:		pr_warn("Audio Channel is still running so return!\n");
media/video/cx25821/cx25821-audio-upstream.c:		pr_err("%s: Failed to set up Audio upstream buffers!\n",
media/video/cx25821/cx25821-video-upstream-ch2.c:		pr_info("No video file is currently running so return!\n");
media/video/cx25821/cx25821-video-upstream-ch2.c:		pr_err("%s(): ERROR opening file(%s) with errno = %d!\n",
media/video/cx25821/cx25821-video-upstream-ch2.c:			pr_err("%s(): File has no file operations registered!\n",
media/video/cx25821/cx25821-video-upstream-ch2.c:			pr_err("%s(): File has no READ operations registered!\n",
media/video/cx25821/cx25821-video-upstream-ch2.c:				pr_info("Done: exit %s() since no more bytes to read from Video file\n",
media/video/cx25821/cx25821-video-upstream-ch2.c:		pr_err("ERROR %s(): since container_of(work_struct) FAILED!\n",
media/video/cx25821/cx25821-video-upstream-ch2.c:		pr_err("%s(): ERROR opening file(%s) with errno = %d!\n",
media/video/cx25821/cx25821-video-upstream-ch2.c:			pr_err("%s(): File has no file operations registered!\n",
media/video/cx25821/cx25821-video-upstream-ch2.c:			pr_err("%s(): File has no READ operations registered!  Returning\n",
media/video/cx25821/cx25821-video-upstream-ch2.c:					pr_info("Done: exit %s() since no more bytes to read from Video file\n",
media/video/cx25821/cx25821-video-upstream-ch2.c:		pr_err("FAILED to allocate memory for Risc buffer! Returning\n");
media/video/cx25821/cx25821-video-upstream-ch2.c:		pr_err("FAILED to allocate memory for data buffer! Returning\n");
media/video/cx25821/cx25821-video-upstream-ch2.c:		pr_info("Failed creating Video Upstream Risc programs!\n");
media/video/cx25821/cx25821-video-upstream-ch2.c:		pr_info("EOF Channel 2 Framecount = %d\n",
media/video/cx25821/cx25821-video-upstream-ch2.c:		pr_err("%s: can't get upstream IRQ %d\n",
media/video/cx25821/cx25821-video-upstream-ch2.c:		pr_info("Video Channel is still running so return!\n");
media/video/cx25821/cx25821-video-upstream-ch2.c:		pr_err("create_singlethread_workqueue() for Video FAILED!\n");
media/video/cx25821/cx25821-video-upstream-ch2.c:		pr_err("%s: Failed to set up Video upstream buffers!\n",
media/video/cx25821/cx25821-video-upstream.c:		pr_info("No video file is currently running so return!\n");
media/video/cx25821/cx25821-video-upstream.c:		pr_err("%s(): ERROR opening file(%s) with errno = %d!\n",
media/video/cx25821/cx25821-video-upstream.c:			pr_err("%s(): File has no file operations registered!\n",
media/video/cx25821/cx25821-video-upstream.c:			pr_err("%s(): File has no READ operations registered!\n",
media/video/cx25821/cx25821-video-upstream.c:				pr_info("Done: exit %s() since no more bytes to read from Video file\n",
media/video/cx25821/cx25821-video-upstream.c:		pr_err("ERROR %s(): since container_of(work_struct) FAILED!\n",
media/video/cx25821/cx25821-video-upstream.c:		pr_err("%s(): ERROR opening file(%s) with errno = %d!\n",
media/video/cx25821/cx25821-video-upstream.c:			pr_err("%s(): File has no file operations registered!\n",
media/video/cx25821/cx25821-video-upstream.c:			pr_err("%s(): File has no READ operations registered!  Returning\n",
media/video/cx25821/cx25821-video-upstream.c:					pr_info("Done: exit %s() since no more bytes to read from Video file\n",
media/video/cx25821/cx25821-video-upstream.c:		pr_err("FAILED to allocate memory for Risc buffer! Returning\n");
media/video/cx25821/cx25821-video-upstream.c:		pr_err("FAILED to allocate memory for data buffer! Returning\n");
media/video/cx25821/cx25821-video-upstream.c:		pr_info("Failed creating Video Upstream Risc programs!\n");
media/video/cx25821/cx25821-video-upstream.c:			pr_err("%s(): Video Received Underflow Error Interrupt!\n",
media/video/cx25821/cx25821-video-upstream.c:			pr_err("%s(): Video Received Sync Error Interrupt!\n",
media/video/cx25821/cx25821-video-upstream.c:			pr_err("%s(): Video Received OpCode Error Interrupt!\n",
media/video/cx25821/cx25821-video-upstream.c:		pr_err("EOF Channel 1 Framecount = %d\n", dev->_frame_count);
media/video/cx25821/cx25821-video-upstream.c:		pr_err("%s: can't get upstream IRQ %d\n",
media/video/cx25821/cx25821-video-upstream.c:		pr_info("Video Channel is still running so return!\n");
media/video/cx25821/cx25821-video-upstream.c:		pr_err("create_singlethread_workqueue() for Video FAILED!\n");
media/video/cx25821/cx25821-video-upstream.c:		pr_err("%s: Failed to set up Video upstream buffers!\n",
media/video/cx25821/cx25821.h:	pr_err("(%d): " fmt, dev->board, ##args)
media/video/cx25821/cx25821.h:	pr_warn("(%d): " fmt, dev->board, ##args)
media/video/cx25821/cx25821.h:	pr_info("(%d): " fmt, dev->board, ##args)
media/video/cx25821/cx25821-alsa.c:		pr_info("%s/1: " fmt, chip->dev->name, ##arg);	\
media/video/cx25821/cx25821-alsa.c:	pr_info("DEBUG: Start audio DMA, %d B/line, cmds_start(0x%x)= %d lines/FIFO, %d periods, %d byte buffer\n",
media/video/cx25821/cx25821-alsa.c:		pr_warn("WARNING %s/1: Audio risc op code error\n", dev->name);
media/video/cx25821/cx25821-alsa.c:		pr_warn("WARNING %s: Downstream sync error!\n", dev->name);
media/video/cx25821/cx25821-alsa.c:		pr_err("DEBUG: cx25821 can't find device struct. Can't proceed with open\n");
media/video/cx25821/cx25821-alsa.c:		pr_info("DEBUG: ERROR after cx25821_risc_databuffer_audio()\n");
media/video/cx25821/cx25821-alsa.c:		pr_info("ERROR: FAILED snd_pcm_new() in %s\n", __func__);
media/video/cx25821/cx25821-alsa.c:		pr_info("DEBUG ERROR: devno >= SNDRV_CARDS %s\n", __func__);
media/video/cx25821/cx25821-alsa.c:		pr_info("DEBUG ERROR: !enable[devno] %s\n", __func__);
media/video/cx25821/cx25821-alsa.c:		pr_info("DEBUG ERROR: cannot create snd_card_new in %s\n",
media/video/cx25821/cx25821-alsa.c:		pr_err("ERROR %s: can't get IRQ %d for ALSA\n", chip->dev->name,
media/video/cx25821/cx25821-alsa.c:		pr_info("DEBUG ERROR: cannot create snd_cx25821_pcm %s\n",
media/video/cx25821/cx25821-alsa.c:	pr_info("%s/%i: ALSA support for cx25821 boards\n", card->driver,
media/video/cx25821/cx25821-alsa.c:		pr_info("DEBUG ERROR: cannot register sound card %s\n",
media/video/cx25821/cx25821-alsa.c:		pr_info("ERROR ALSA: no cx25821 cards found\n");
media/video/cx25821/cx25821-medusa-video.c:		pr_info("%s(): width %d > MAX_WIDTH %d ! resetting to MAX_WIDTH\n",
media/video/cx25821/cx25821-i2c.c:		pr_err(" ERR: %d\n", retval);
media/video/cx25821/cx25821-i2c.c:		pr_err(" ERR: %d\n", retval);
media/video/cx25821/cx25821-video.c:	pr_err("%s(0x%08x) NOT FOUND\n", __func__, fourcc);
media/video/cx25821/cx25821-video.c:		pr_err("%s: %d buffers handled (should be 1)\n", __func__, bc);
media/video/cx25821/cx25821-video.c:		pr_warn("%s, %s: video risc op code error\n",
media/video/cx25821/cx25821-video.c:		pr_warn("device %d released!\n", chan_num);
media/video/cx25821/cx25821-video.c:	pr_info("%s/2: ============  START LOG STATUS  ============\n",
media/video/cx25821/cx25821-video.c:	pr_info("Video input 0 is %s\n",
media/video/cx25821/cx25821-video.c:	pr_info("%s/2: =============  END LOG STATUS  =============\n",
media/video/cx25821/cx25821-video.c:		pr_err("Invalid fh pointer!\n");
media/video/cx25821/cx25821-video.c:		pr_err("%s(): Upstream data is INVALID. Returning\n", __func__);
media/video/cx25821/cx25821-video.c:		pr_err("%s(): Upstream data is INVALID. Returning\n", __func__);
media/video/cx25821/cx25821-video.c:		pr_err("%s(): Upstream data is INVALID. Returning\n", __func__);
media/video/cx25821/cx25821-video.c:		pr_err("%s(): User data is INVALID. Returning\n", __func__);
media/video/cx25821/cx25821-core.c:	pr_warn("%s: %s - dma channel status dump\n", dev->name, ch->name);
media/video/cx25821/cx25821-core.c:		pr_warn("cmds + 0x%2x:   %-15s: 0x%08x\n",
media/video/cx25821/cx25821-core.c:		pr_warn("cmds + 0x%2x:   risc%d: ", j + i * 4, i);
media/video/cx25821/cx25821-core.c:		pr_warn("ctrl + 0x%2x (0x%08x): iq %x: ",
media/video/cx25821/cx25821-core.c:			pr_warn("ctrl + 0x%2x :   iq %x: 0x%08x [ arg #%d ]\n",
media/video/cx25821/cx25821-core.c:	pr_warn("        :   fifo: 0x%08x -> 0x%x\n",
media/video/cx25821/cx25821-core.c:	pr_warn("        :   ctrl: 0x%08x -> 0x%x\n",
media/video/cx25821/cx25821-core.c:	pr_warn("        :   ptr1_reg: 0x%08x\n",
media/video/cx25821/cx25821-core.c:	pr_warn("        :   ptr2_reg: 0x%08x\n",
media/video/cx25821/cx25821-core.c:	pr_warn("        :   cnt1_reg: 0x%08x\n",
media/video/cx25821/cx25821-core.c:	pr_warn("        :   cnt2_reg: 0x%08x\n",
media/video/cx25821/cx25821-core.c:	pr_info("\n%s: %s - dma Audio channel status dump\n",
media/video/cx25821/cx25821-core.c:		pr_info("%s: cmds + 0x%2x:   %-15s: 0x%08x\n",
media/video/cx25821/cx25821-core.c:		pr_warn("cmds + 0x%2x:   risc%d: ", j + i * 4, i);
media/video/cx25821/cx25821-core.c:		pr_warn("ctrl + 0x%2x (0x%08x): iq %x: ",
media/video/cx25821/cx25821-core.c:			pr_warn("ctrl + 0x%2x :   iq %x: 0x%08x [ arg #%d ]\n",
media/video/cx25821/cx25821-core.c:	pr_warn("        :   fifo: 0x%08x -> 0x%x\n",
media/video/cx25821/cx25821-core.c:	pr_warn("        :   ctrl: 0x%08x -> 0x%x\n",
media/video/cx25821/cx25821-core.c:	pr_warn("        :   ptr1_reg: 0x%08x\n",
media/video/cx25821/cx25821-core.c:	pr_warn("        :   ptr2_reg: 0x%08x\n",
media/video/cx25821/cx25821-core.c:	pr_warn("        :   cnt1_reg: 0x%08x\n",
media/video/cx25821/cx25821-core.c:	pr_warn("        :   cnt2_reg: 0x%08x\n",
media/video/cx25821/cx25821-core.c:		pr_warn("instruction %d = 0x%x\n", i, risc);
media/video/cx25821/cx25821-core.c:	pr_warn("\nread cdt loc=0x%x\n", risc);
media/video/cx25821/cx25821-core.c:	pr_err("%s: can't get MMIO memory @ 0x%llx\n",
media/video/cx25821/cx25821-core.c:	pr_info("%s(): Hardware revision = 0x%02x\n",
media/video/cx25821/cx25821-core.c:	pr_info("\n***********************************\n");
media/video/cx25821/cx25821-core.c:	pr_info("cx25821 set up\n");
media/video/cx25821/cx25821-core.c:	pr_info("***********************************\n\n");
media/video/cx25821/cx25821-core.c:		pr_info("%s(): Exiting. Incorrect Hardware device = 0x%02x\n",
media/video/cx25821/cx25821-core.c:		pr_info("Athena Hardware device = 0x%02x\n", dev->pci->device);
media/video/cx25821/cx25821-core.c:		pr_err("%s: No more PCIe resources for subsystem: %04x:%04x\n",
media/video/cx25821/cx25821-core.c:	pr_info("%s: subsystem: %04x:%04x, board: %s [card=%d,%s]\n",
media/video/cx25821/cx25821-core.c:		pr_err("%s(): Failed to register video adapter for IOCTL, so unregistering videoioctl device\n",
media/video/cx25821/cx25821-core.c:		pr_info("pci enable failed!\n");
media/video/cx25821/cx25821-core.c:	pr_info("Athena pci enable !\n");
media/video/cx25821/cx25821-core.c:	pr_info("%s/0: found at %s, rev: %d, irq: %d, latency: %d, mmio: 0x%llx\n",
media/video/cx25821/cx25821-core.c:		pr_err("%s/0: Oops: no 32bit PCI DMA ???\n", dev->name);
media/video/cx25821/cx25821-core.c:		pr_err("%s: can't get IRQ %d\n", dev->name, pci_dev->irq);
media/video/cx25821/cx25821-core.c:	pr_info("cx25821_initdev() can't get IRQ !\n");
media/video/cx25821/cx25821-core.c:	pr_info("driver version %d.%d.%d loaded\n",
media/video/sh_vou.c:		pr_warning("%s(): Invalid bus-format code %d, using default 8-bit\n",
media/video/v4l2-ioctl.c.orig:			pr_info("%s: =================  START STATUS  =================\n",
media/video/v4l2-ioctl.c.orig:			pr_info("%s: ==================  END STATUS  ==================\n",
media/video/blackfin/ppi.c:		pr_err("Unable to allocate DMA channel for PPI\n");
media/video/blackfin/ppi.c:			pr_err("Unable to allocate IRQ for PPI\n");
media/video/blackfin/ppi.c:		pr_err("request peripheral failed\n");
media/video/blackfin/ppi.c:		pr_err("unable to allocate memory for ppi handle\n");
media/video/blackfin/ppi.c:	pr_info("ppi probe success\n");
media/video/gspca/sn9c20x.c:		pr_err("Read register %02x failed %d\n", reg, result);
media/video/gspca/sn9c20x.c:		pr_err("Write register %02x failed %d\n", reg, result);
media/video/gspca/sn9c20x.c:				pr_err("i2c_w error\n");
media/video/gspca/sn9c20x.c:	pr_err("i2c_w reg %02x no response\n", buffer[2]);
media/video/gspca/sn9c20x.c:		pr_err("sensor id for ov9650 doesn't match (0x%04x)\n", id);
media/video/gspca/sn9c20x.c:		pr_err("OV9650 sensor initialization failed\n");
media/video/gspca/sn9c20x.c:		pr_err("OV9655 sensor initialization failed\n");
media/video/gspca/sn9c20x.c:		pr_err("SOI968 sensor initialization failed\n");
media/video/gspca/sn9c20x.c:		pr_err("OV7660 sensor initialization failed\n");
media/video/gspca/sn9c20x.c:		pr_err("OV7670 sensor initialization failed\n");
media/video/gspca/sn9c20x.c:			pr_err("MT9V011 sensor initialization failed\n");
media/video/gspca/sn9c20x.c:		pr_info("MT9V011 sensor detected\n");
media/video/gspca/sn9c20x.c:			pr_err("MT9V111 sensor initialization failed\n");
media/video/gspca/sn9c20x.c:		pr_info("MT9V111 sensor detected\n");
media/video/gspca/sn9c20x.c:			pr_err("MT9V112 sensor initialization failed\n");
media/video/gspca/sn9c20x.c:		pr_info("MT9V112 sensor detected\n");
media/video/gspca/sn9c20x.c:		pr_err("MT9M112 sensor initialization failed\n");
media/video/gspca/sn9c20x.c:		pr_err("MT9M111 sensor initialization failed\n");
media/video/gspca/sn9c20x.c:		pr_info("MT9M001 color sensor detected\n");
media/video/gspca/sn9c20x.c:		pr_info("MT9M001 mono sensor detected\n");
media/video/gspca/sn9c20x.c:		pr_err("No MT9M001 chip detected, ID = %x\n\n", id);
media/video/gspca/sn9c20x.c:		pr_err("MT9M001 sensor initialization failed\n");
media/video/gspca/sn9c20x.c:		pr_err("HV7131R Sensor initialization failed\n");
media/video/gspca/sn9c20x.c:		pr_err("Could not initialize controls\n");
media/video/gspca/sn9c20x.c:			pr_err("Device initialization failed\n");
media/video/gspca/sn9c20x.c:		pr_err("Device initialization failed\n");
media/video/gspca/sn9c20x.c:		pr_info("OV9650 sensor detected\n");
media/video/gspca/sn9c20x.c:		pr_info("OV9655 sensor detected\n");
media/video/gspca/sn9c20x.c:		pr_info("SOI968 sensor detected\n");
media/video/gspca/sn9c20x.c:		pr_info("OV7660 sensor detected\n");
media/video/gspca/sn9c20x.c:		pr_info("OV7670 sensor detected\n");
media/video/gspca/sn9c20x.c:		pr_info("MT9VPRB sensor detected\n");
media/video/gspca/sn9c20x.c:		pr_info("MT9M111 sensor detected\n");
media/video/gspca/sn9c20x.c:		pr_info("MT9M112 sensor detected\n");
media/video/gspca/sn9c20x.c:		pr_info("HV7131R sensor detected\n");
media/video/gspca/sn9c20x.c:		pr_err("Unsupported sensor\n");
media/video/gspca/sn9c20x.c:			pr_warn("sn9c20x camera with unknown number of alt "
media/video/gspca/sn9c20x.c:		pr_info("Set 1280x1024\n");
media/video/gspca/sn9c20x.c:		pr_info("Set 640x480\n");
media/video/gspca/sn9c20x.c:		pr_info("Set 320x240\n");
media/video/gspca/sn9c20x.c:		pr_info("Set 160x120\n");
media/video/gspca/sq905.c:		pr_err("%s: usb_control_msg failed (%d)\n", __func__, ret);
media/video/gspca/sq905.c:		pr_err("%s: usb_control_msg failed 2 (%d)\n", __func__, ret);
media/video/gspca/sq905.c:		pr_err("%s: usb_control_msg failed (%d)\n", __func__, ret);
media/video/gspca/sq905.c:		pr_err("%s: usb_control_msg failed (%d)\n", __func__, ret);
media/video/gspca/sq905.c:		pr_err("bulk read fail (%d) len %d/%d\n", ret, act_len, size);
media/video/gspca/sq905.c:		pr_err("Couldn't allocate USB buffer\n");
media/video/gspca/vicam.c:		pr_err("control msg req %02X error %d\n", request, ret);
media/video/gspca/vicam.c:		pr_err("bulk read fail (%d) len %d/%d\n",
media/video/gspca/vicam.c:		pr_err("Couldn't allocate USB buffer\n");
media/video/gspca/vicam.c:		pr_err("Failed to load \"vicam/firmware.fw\": %d\n", ret);
media/video/gspca/sn9c2028.c:		pr_err("command write [%02x] error %d\n",
media/video/gspca/sn9c2028.c:		pr_err("read1 error %d\n", rc);
media/video/gspca/sn9c2028.c:		pr_err("read4 error %d\n", rc);
media/video/gspca/sn9c2028.c:		pr_err("long command status read error %d\n", status);
media/video/gspca/sn9c2028.c:		pr_err("Starting unknown camera, please report this\n");
media/video/gspca/jl2005bcd.c:		pr_err("command write [%02x] error %d\n",
media/video/gspca/jl2005bcd.c:		pr_err("read command [0x%02x] error %d\n",
media/video/gspca/jl2005bcd.c:		pr_err("Couldn't allocate USB buffer\n");
media/video/gspca/jl2005bcd.c:				pr_err("First block is not the first block\n");
media/video/gspca/jl2005bcd.c:		pr_err("Unknown resolution specified\n");
media/video/gspca/spca508.c:		pr_err("reg write: error %d\n", ret);
media/video/gspca/spca508.c:		pr_err("reg_read err %d\n", ret);
media/video/gspca/ov519.c:		pr_err("reg_w %02x failed %d\n", index, ret);
media/video/gspca/ov519.c:		pr_err("reg_r %02x failed %d\n", index, ret);
media/video/gspca/ov519.c:		pr_err("reg_r8 %02x failed %d\n", index, ret);
media/video/gspca/ov519.c:		pr_err("reg_w32 %02x failed %d\n", index, ret);
media/video/gspca/ov519.c:		pr_err("ovfx2_i2c_w %02x failed %d\n", reg, ret);
media/video/gspca/ov519.c:		pr_err("ovfx2_i2c_r %02x failed %d\n", reg, ret);
media/video/gspca/ov519.c:		pr_err("error hires sensors only supported with ovfx2\n");
media/video/gspca/ov519.c:	pr_err("Error unknown sensor type: %02x%02x\n", high, low);
media/video/gspca/ov519.c:		pr_err("Unknown image sensor version: %d\n", rc & 3);
media/video/gspca/ov519.c:		pr_err("Error detecting sensor type\n");
media/video/gspca/ov519.c:			pr_err("Error detecting camera chip PID\n");
media/video/gspca/ov519.c:			pr_err("Error detecting camera chip VER\n");
media/video/gspca/ov519.c:				pr_err("Sensor is an OV7630/OV7635\n");
media/video/gspca/ov519.c:				pr_err("7630 is not supported by this driver\n");
media/video/gspca/ov519.c:				pr_err("Unknown sensor: 0x76%02x\n", low);
media/video/gspca/ov519.c:		pr_err("Unknown image sensor version: %d\n", rc & 3);
media/video/gspca/ov519.c:		pr_err("Error detecting sensor type\n");
media/video/gspca/ov519.c:		pr_warn("WARNING: Sensor is an OV66308. Your camera may have been misdetected in previous driver versions.\n");
media/video/gspca/ov519.c:		pr_warn("WARNING: Sensor is an OV66307. Your camera may have been misdetected in previous driver versions.\n");
media/video/gspca/ov519.c:		pr_err("FATAL: Unknown sensor version: 0x%02x\n", rc);
media/video/gspca/ov519.c:		pr_err("Can't determine sensor slave IDs\n");
media/video/gspca/ov519.c:		pr_err("Couldn't get altsetting\n");
media/video/gspca/ov519.c:		pr_err("Couldn't get altsetting\n");
media/video/gspca/finepix.c:		pr_err("init failed %d\n", ret);
media/video/gspca/finepix.c:		pr_err("usb_bulk_msg failed %d\n", ret);
media/video/gspca/finepix.c:		pr_err("frame request failed %d\n", ret);
media/video/gspca/sq905c.c:		pr_err("%s: usb_control_msg failed (%d)\n", __func__, ret);
media/video/gspca/sq905c.c:		pr_err("%s: usb_control_msg failed (%d)\n", __func__, ret);
media/video/gspca/sq905c.c:		pr_err("Couldn't allocate USB buffer\n");
media/video/gspca/spca501.c:		pr_err("reg write: error %d\n", ret);
media/video/gspca/mr97310a.c:		pr_err("reg write [%02x] error %d\n",
media/video/gspca/mr97310a.c:		pr_err("reg read [%02x] error %d\n",
media/video/gspca/mr97310a.c:			pr_err("Unknown CIF Sensor id : %02x\n",
media/video/gspca/mr97310a.c:			pr_err("Unknown VGA Sensor id Byte 0: %02x\n",
media/video/gspca/mr97310a.c:			pr_err("Defaults assumed, may not work\n");
media/video/gspca/mr97310a.c:			pr_err("Please report this\n");
media/video/gspca/mr97310a.c:				pr_err("Unknown VGA Sensor id Byte 1: %02x\n",
media/video/gspca/mr97310a.c:				pr_err("Defaults assumed, may not work\n");
media/video/gspca/mr97310a.c:				pr_err("Please report this\n");
media/video/gspca/conex.c:		pr_err("reg_r: buffer overflow\n");
media/video/gspca/conex.c:		pr_err("reg_w: buffer overflow\n");
media/video/gspca/t613.c:			pr_err("Out of memory\n");
media/video/gspca/t613.c:			pr_err("Out of memory\n");
media/video/gspca/t613.c:		pr_err("Bad sensor reset %02x\n", byte);
media/video/gspca/t613.c:		pr_err("unknown sensor %04x\n", sensor_id);
media/video/gspca/t613.c:			pr_err("Bad sensor reset %02x\n", test_byte);
media/video/gspca/spca561.c:		pr_err("reg write: error %d\n", ret);
media/video/gspca/gspca.c:			pr_err("Resubmit URB failed with error %i\n", ret);
media/video/gspca/gspca.c:			pr_err("Input device registration failed with error %i\n",
media/video/gspca/gspca.c:			pr_err("ISOC data error: [%d] len=%d, status=%d\n",
media/video/gspca/gspca.c:		pr_err("usb_submit_urb() ret %d\n", st);
media/video/gspca/gspca.c:			pr_err("usb_submit_urb() ret %d\n", st);
media/video/gspca/gspca.c:				pr_err("gspca_frame_add() image == NULL\n");
media/video/gspca/gspca.c:		pr_err("frame alloc failed\n");
media/video/gspca/gspca.c:		pr_err("set alt 0 err %d\n", ret);
media/video/gspca/gspca.c:				pr_err("alt %d iso endp with 0 interval\n", j);
media/video/gspca/gspca.c:			pr_err("usb_alloc_urb failed\n");
media/video/gspca/gspca.c:			pr_err("usb_alloc_coherent failed\n");
media/video/gspca/gspca.c:			pr_err("bad altsetting %d\n", gspca_dev->alt);
media/video/gspca/gspca.c:			pr_err("no transfer endpoint found\n");
media/video/gspca/gspca.c:					pr_err("set alt %d err %d\n", alt, ret);
media/video/gspca/gspca.c:			pr_err("usb_submit_urb alt %d err %d\n",
media/video/gspca/gspca.c:				pr_err("no transfer endpoint found\n");
media/video/gspca/gspca.c:	pr_info("%s-" GSPCA_VERSION " probing %04x:%04x\n",
media/video/gspca/gspca.c:		pr_err("couldn't kzalloc gspca struct\n");
media/video/gspca/gspca.c:		pr_err("out of memory\n");
media/video/gspca/gspca.c:		pr_err("video_register_device err %d\n", ret);
media/video/gspca/gspca.c:		pr_err("%04x:%04x too many config\n",
media/video/gspca/gspca.c:	pr_info("v" GSPCA_VERSION " registered\n");
media/video/gspca/spca505.c:		pr_err("reg write: error %d\n", ret);
media/video/gspca/spca505.c:		pr_err("After vector read returns 0x%04x should be 0x0101\n",
media/video/gspca/kinect.c:		pr_err("send_cmd: Invalid command length (0x%x)\n", cmd_len);
media/video/gspca/kinect.c:		pr_err("send_cmd: Output control transfer failed (%d)\n", res);
media/video/gspca/kinect.c:		pr_err("send_cmd: Input control transfer failed (%d)\n", res);
media/video/gspca/kinect.c:		pr_err("send_cmd: Bad magic %02x %02x\n",
media/video/gspca/kinect.c:		pr_err("send_cmd: Bad cmd %02x != %02x\n",
media/video/gspca/kinect.c:		pr_err("send_cmd: Bad tag %04x != %04x\n",
media/video/gspca/kinect.c:		pr_err("send_cmd: Bad len %04x != %04x\n",
media/video/gspca/kinect.c:		pr_warn("send_cmd: Data buffer is %d bytes long, but got %d bytes\n",
media/video/gspca/kinect.c:		pr_warn("send_cmd returned %d [%04x %04x], 0000 expected\n",
media/video/gspca/kinect.c:		pr_warn("[Stream %02x] Invalid magic %02x%02x\n",
media/video/gspca/kinect.c:		pr_warn("Packet type not recognized...\n");
media/video/gspca/nw80x.c:		pr_err("reg_w err %d\n", ret);
media/video/gspca/nw80x.c:		pr_err("reg_r err %d\n", ret);
media/video/gspca/nw80x.c:		pr_err("Bad webcam type %d for NW80%d\n",
media/video/gspca/konica.c:		pr_err("reg_w err %d\n", ret);
media/video/gspca/konica.c:		pr_err("reg_w err %d\n", ret);
media/video/gspca/konica.c:		pr_err("Couldn't get altsetting\n");
media/video/gspca/konica.c:			pr_err("usb_alloc_urb failed\n");
media/video/gspca/konica.c:			pr_err("usb_buffer_alloc failed\n");
media/video/gspca/konica.c:			pr_err("resubmit urb error %d\n", st);
media/video/gspca/konica.c:		pr_err("usb_submit_urb(status_urb) ret %d\n", st);
media/video/gspca/ov534.c:		pr_err("write failed %d\n", ret);
media/video/gspca/ov534.c:		pr_err("read failed %d\n", ret);
media/video/gspca/ov534.c:		pr_err("sccb_reg_write failed\n");
media/video/gspca/ov534.c:		pr_err("sccb_reg_read failed 1\n");
media/video/gspca/ov534.c:		pr_err("sccb_reg_read failed 2\n");
media/video/gspca/pac207.c:		pr_err("Failed to write registers to index 0x%04X, error %d\n",
media/video/gspca/pac207.c:		pr_err("Failed to write a register (index 0x%04X, value 0x%02X, error %d)\n",
media/video/gspca/pac207.c:		pr_err("Failed to read a register (index 0x%04X, error %d)\n",
media/video/gspca/pac207.c:		pr_err("Could not initialize controls\n");
media/video/gspca/pac7302.c:		pr_err("reg_w_buf failed i: %02x error %d\n",
media/video/gspca/pac7302.c:		pr_err("reg_w() failed i: %02x v: %02x error %d\n",
media/video/gspca/pac7302.c:			pr_err("reg_w_page() failed i: %02x v: %02x error %d\n",
media/video/gspca/pac7311.c.orig:		pr_err("reg_w_buf() failed index 0x%02x, error %d\n",
media/video/gspca/pac7311.c.orig:		pr_err("reg_w() failed index 0x%02x, value 0x%02x, error %d\n",
media/video/gspca/pac7311.c.orig:			pr_err("reg_w_page() failed index 0x%02x, value 0x%02x, error %d\n",
media/video/gspca/pac7311.c.orig:		pr_err("Could not initialize controls\n");
media/video/gspca/ov534_9.c:		pr_err("reg_w failed %d\n", ret);
media/video/gspca/ov534_9.c:		pr_err("reg_r err %d\n", ret);
media/video/gspca/ov534_9.c:		pr_err("sccb_write failed\n");
media/video/gspca/ov534_9.c:		pr_err("sccb_read failed 1\n");
media/video/gspca/ov534_9.c:		pr_err("sccb_read failed 2\n");
media/video/gspca/spca500.c:		pr_err("reg write: error %d\n", ret);
media/video/gspca/spca500.c:		pr_err("reg_r_12 err %d\n", ret);
media/video/gspca/jeilinj.c:		pr_err("command write [%02x] error %d\n",
media/video/gspca/jeilinj.c:		pr_err("read command [%02x] error %d\n",
media/video/gspca/cpia1.c:		pr_err("usb_control_msg %02x, error %d\n", command[1], ret);
media/video/gspca/cpia1.c:		pr_err("ReadVPRegs(30,4,9,8) - failed: %d\n", ret);
media/video/gspca/m5602/m5602_core.c:		pr_info("ALi m5602 address 0x%x contains 0x%x\n", i, val);
media/video/gspca/m5602/m5602_core.c:	pr_info("Warning: The ALi m5602 webcam probably won't work until it's power cycled\n");
media/video/gspca/m5602/m5602_core.c:	pr_info("Failed to find a sensor\n");
media/video/gspca/m5602/m5602_po1030.c:			pr_info("Forcing a %s sensor\n", po1030.name);
media/video/gspca/m5602/m5602_po1030.c:		pr_info("Detected a po1030 sensor\n");
media/video/gspca/m5602/m5602_po1030.c:			pr_info("Invalid stream command, exiting init\n");
media/video/gspca/m5602/m5602_po1030.c:	pr_info("Dumping the po1030 sensor core registers\n");
media/video/gspca/m5602/m5602_po1030.c:		pr_info("register 0x%x contains 0x%x\n", address, value);
media/video/gspca/m5602/m5602_po1030.c:	pr_info("po1030 register state dump complete\n");
media/video/gspca/m5602/m5602_po1030.c:	pr_info("Probing for which registers that are read/write\n");
media/video/gspca/m5602/m5602_po1030.c:			pr_info("register 0x%x is writeable\n", address);
media/video/gspca/m5602/m5602_po1030.c:			pr_info("register 0x%x is read only\n", address);
media/video/gspca/m5602/m5602_ov7660.c:			pr_info("Forcing an %s sensor\n", ov7660.name);
media/video/gspca/m5602/m5602_ov7660.c:	pr_info("Sensor reported 0x%x%x\n", prod_id, ver_id);
media/video/gspca/m5602/m5602_ov7660.c:		pr_info("Detected a ov7660 sensor\n");
media/video/gspca/m5602/m5602_ov7660.c:	pr_info("Dumping the ov7660 register state\n");
media/video/gspca/m5602/m5602_ov7660.c:		pr_info("register 0x%x contains 0x%x\n", address, value);
media/video/gspca/m5602/m5602_ov7660.c:	pr_info("ov7660 register state dump complete\n");
media/video/gspca/m5602/m5602_ov7660.c:	pr_info("Probing for which registers that are read/write\n");
media/video/gspca/m5602/m5602_ov7660.c:			pr_info("register 0x%x is writeable\n", address);
media/video/gspca/m5602/m5602_ov7660.c:			pr_info("register 0x%x is read only\n", address);
media/video/gspca/m5602/m5602_s5k4aa.c:			pr_info("Forcing a %s sensor\n", s5k4aa.name);
media/video/gspca/m5602/m5602_s5k4aa.c:			pr_info("Invalid stream command, exiting init\n");
media/video/gspca/m5602/m5602_s5k4aa.c:		pr_info("Detected a s5k4aa sensor\n");
media/video/gspca/m5602/m5602_s5k4aa.c:				pr_err("Invalid stream command, exiting init\n");
media/video/gspca/m5602/m5602_s5k4aa.c:				pr_err("Invalid stream command, exiting init\n");
media/video/gspca/m5602/m5602_s5k4aa.c:			pr_info("Invalid stream command, exiting init\n");
media/video/gspca/m5602/m5602_s5k4aa.c:		pr_info("Dumping the s5k4aa register state for page 0x%x\n",
media/video/gspca/m5602/m5602_s5k4aa.c:			pr_info("register 0x%x contains 0x%x\n",
media/video/gspca/m5602/m5602_s5k4aa.c:	pr_info("s5k4aa register state dump complete\n");
media/video/gspca/m5602/m5602_s5k4aa.c:		pr_info("Probing for which registers that are read/write for page 0x%x\n",
media/video/gspca/m5602/m5602_s5k4aa.c:				pr_info("register 0x%x is writeable\n",
media/video/gspca/m5602/m5602_s5k4aa.c:				pr_info("register 0x%x is read only\n",
media/video/gspca/m5602/m5602_s5k4aa.c:	pr_info("Read/write register probing complete\n");
media/video/gspca/m5602/m5602_mt9m111.c:			pr_info("Forcing a %s sensor\n", mt9m111.name);
media/video/gspca/m5602/m5602_mt9m111.c:		pr_info("Detected a mt9m111 sensor\n");
media/video/gspca/m5602/m5602_mt9m111.c:	pr_info("Dumping the mt9m111 register state\n");
media/video/gspca/m5602/m5602_mt9m111.c:	pr_info("Dumping the mt9m111 sensor core registers\n");
media/video/gspca/m5602/m5602_mt9m111.c:		pr_info("register 0x%x contains 0x%x%x\n",
media/video/gspca/m5602/m5602_mt9m111.c:	pr_info("Dumping the mt9m111 color pipeline registers\n");
media/video/gspca/m5602/m5602_mt9m111.c:		pr_info("register 0x%x contains 0x%x%x\n",
media/video/gspca/m5602/m5602_mt9m111.c:	pr_info("Dumping the mt9m111 camera control registers\n");
media/video/gspca/m5602/m5602_mt9m111.c:		pr_info("register 0x%x contains 0x%x%x\n",
media/video/gspca/m5602/m5602_mt9m111.c:	pr_info("mt9m111 register state dump complete\n");
media/video/gspca/m5602/m5602_ov9650.c:			pr_info("Forcing an %s sensor\n", ov9650.name);
media/video/gspca/m5602/m5602_ov9650.c:		pr_info("Detected an ov9650 sensor\n");
media/video/gspca/m5602/m5602_ov9650.c:	pr_info("Dumping the ov9650 register state\n");
media/video/gspca/m5602/m5602_ov9650.c:		pr_info("register 0x%x contains 0x%x\n", address, value);
media/video/gspca/m5602/m5602_ov9650.c:	pr_info("ov9650 register state dump complete\n");
media/video/gspca/m5602/m5602_ov9650.c:	pr_info("Probing for which registers that are read/write\n");
media/video/gspca/m5602/m5602_ov9650.c:			pr_info("register 0x%x is writeable\n", address);
media/video/gspca/m5602/m5602_ov9650.c:			pr_info("register 0x%x is read only\n", address);
media/video/gspca/m5602/m5602_s5k83a.c:			pr_info("Forcing a %s sensor\n", s5k83a.name);
media/video/gspca/m5602/m5602_s5k83a.c:		pr_info("Detected a s5k83a sensor\n");
media/video/gspca/m5602/m5602_s5k83a.c:			pr_info("Invalid stream command, exiting init\n");
media/video/gspca/m5602/m5602_s5k83a.c:			pr_info("Camera was flipped\n");
media/video/gspca/m5602/m5602_s5k83a.c:		pr_info("Dumping the s5k83a register state for page 0x%x\n",
media/video/gspca/m5602/m5602_s5k83a.c:			pr_info("register 0x%x contains 0x%x\n", address, val);
media/video/gspca/m5602/m5602_s5k83a.c:	pr_info("s5k83a register state dump complete\n");
media/video/gspca/m5602/m5602_s5k83a.c:		pr_info("Probing for which registers that are read/write for page 0x%x\n",
media/video/gspca/m5602/m5602_s5k83a.c:				pr_info("register 0x%x is writeable\n",
media/video/gspca/m5602/m5602_s5k83a.c:				pr_info("register 0x%x is read only\n",
media/video/gspca/m5602/m5602_s5k83a.c:	pr_info("Read/write register probing complete\n");
media/video/gspca/pac7302.c.orig:		pr_err("reg_w_buf failed i: %02x error %d\n",
media/video/gspca/pac7302.c.orig:		pr_err("reg_w() failed i: %02x v: %02x error %d\n",
media/video/gspca/pac7302.c.orig:			pr_err("reg_w_page() failed i: %02x v: %02x error %d\n",
media/video/gspca/vc032x.c:		pr_err("reg_r err %d\n", ret);
media/video/gspca/vc032x.c:		pr_err("reg_w err %d\n", ret);
media/video/gspca/vc032x.c:		pr_err("I2c Bus Busy Wait %02x\n", gspca_dev->usb_buf[0]);
media/video/gspca/vc032x.c:		pr_err("i2c_write timeout\n");
media/video/gspca/vc032x.c:		pr_err("Unknown sensor...\n");
media/video/gspca/se401.c:			pr_err("write req failed req %#04x val %#04x error %d\n",
media/video/gspca/se401.c:		pr_err("USB_BUF_SZ too small!!\n");
media/video/gspca/se401.c:			pr_err("read req failed req %#04x error %d\n",
media/video/gspca/se401.c:		pr_err("set feature failed sel %#04x param %#04x error %d\n",
media/video/gspca/se401.c:		pr_err("USB_BUF_SZ too small!!\n");
media/video/gspca/se401.c:		pr_err("get feature failed sel %#04x error %d\n",
media/video/gspca/se401.c:		pr_err("Wrong descriptor type\n");
media/video/gspca/se401.c:		pr_err("Bayer format not supported!\n");
media/video/gspca/se401.c:		pr_info("ExtraFeatures: %d\n", cd[3]);
media/video/gspca/se401.c:		pr_err("Too many frame sizes\n");
media/video/gspca/se401.c:			pr_info("Frame size: %dx%d bayer\n",
media/video/gspca/se401.c:			pr_info("Frame size: %dx%d 1/%dth janggu\n",
media/video/gspca/se401.c:			pr_err("invalid packet len %d restarting stream\n",
media/video/gspca/se401.c:			pr_err("unknown frame info value restarting stream\n");
media/video/gspca/se401.c:				pr_err("frame size %d expected %d\n",
media/video/gspca/etoms.c:		pr_err("reg_r: buffer overflow\n");
media/video/gspca/etoms.c:		pr_err("reg_w: buffer overflow\n");
media/video/gspca/spca1528.c:		pr_err("reg_r err %d\n", ret);
media/video/gspca/spca1528.c:		pr_err("reg_w err %d\n", ret);
media/video/gspca/spca1528.c:		pr_err("reg_w err %d\n", ret);
media/video/gspca/mars.c:		pr_err("reg write [%02x] error %d\n",
media/video/gspca/mars.c:		pr_err("Could not initialize controls\n");
media/video/gspca/gl860/gl860.c:		pr_err("ctrl transfer failed %4d [p%02x r%d v%04x i%04x len%d]\n",
media/video/gspca/gspca.h:		pr_info(fmt, ##__VA_ARGS__);			\
media/video/gspca/benq.c:		pr_err("reg_w err %d\n", ret);
media/video/gspca/benq.c:			pr_err("usb_alloc_urb failed\n");
media/video/gspca/benq.c:			pr_err("usb_alloc_coherent failed\n");
media/video/gspca/benq.c:		pr_err("urb status: %d\n", urb->status);
media/video/gspca/benq.c:			pr_err("ISOC data error: [%d] status=%d\n",
media/video/gspca/benq.c:		pr_err("usb_submit_urb(0) ret %d\n", st);
media/video/gspca/benq.c:		pr_err("usb_submit_urb() ret %d\n", st);
media/video/gspca/sq930x.c:		pr_err("reg_r %04x failed %d\n", value, ret);
media/video/gspca/sq930x.c:		pr_err("reg_w %04x %04x failed %d\n", value, index, ret);
media/video/gspca/sq930x.c:		pr_err("reg_wb %04x %04x failed %d\n", value, index, ret);
media/video/gspca/sq930x.c:		pr_err("i2c_write failed %d\n", ret);
media/video/gspca/sq930x.c:		pr_err("Bug: usb_buf overflow\n");
media/video/gspca/sq930x.c:			pr_err("ucbus_write failed %d\n", ret);
media/video/gspca/sq930x.c:		pr_err("Unknown sensor\n");
media/video/gspca/sq930x.c:		pr_err("Sensor %s not yet treated\n",
media/video/gspca/sq930x.c:		pr_err("sd_dq_callback() err %d\n", ret);
media/video/gspca/zc3xx.c:		pr_err("reg_r err %d\n", ret);
media/video/gspca/zc3xx.c:		pr_err("reg_w_i err %d\n", ret);
media/video/gspca/zc3xx.c:		pr_err("i2c_r status error %02x\n", retbyte);
media/video/gspca/zc3xx.c:		pr_err("i2c_w status error %02x\n", retbyte);
media/video/gspca/zc3xx.c:		pr_err("Could not initialize controls\n");
media/video/gspca/zc3xx.c:				pr_warn("Unknown sensor - set to TAS5130C\n");
media/video/gspca/zc3xx.c:			pr_err("Unknown sensor %04x\n", sensor);
media/video/gspca/stv06xx/stv06xx_st6422.c:	pr_info("st6422 sensor detected\n");
media/video/gspca/stv06xx/stv06xx_pb0100.c:	pr_info("Photobit pb0100 sensor detected\n");
media/video/gspca/stv06xx/stv06xx.c:		pr_err("I2C: Read error writing address: %d\n", err);
media/video/gspca/stv06xx/stv06xx.c:	pr_info("Dumping all stv06xx bridge registers\n");
media/video/gspca/stv06xx/stv06xx.c:		pr_info("Read 0x%x from address 0x%x\n", data, i);
media/video/gspca/stv06xx/stv06xx.c:	pr_info("Testing stv06xx bridge registers for writability\n");
media/video/gspca/stv06xx/stv06xx.c:			pr_info("Register 0x%x is read/write\n", i);
media/video/gspca/stv06xx/stv06xx.c:			pr_info("Register 0x%x is read/write, but only partially\n",
media/video/gspca/stv06xx/stv06xx.c:			pr_info("Register 0x%x is read-only\n", i);
media/video/gspca/stv06xx/stv06xx_vv6410.c:	pr_info("vv6410 sensor detected\n");
media/video/gspca/stv06xx/stv06xx_vv6410.c:	pr_info("Dumping all vv6410 sensor registers\n");
media/video/gspca/stv06xx/stv06xx_vv6410.c:		pr_info("Register 0x%x contained 0x%x\n", i, data);
media/video/gspca/stv06xx/stv06xx_hdcs.c:	pr_info("HDCS-1000/1100 sensor detected\n");
media/video/gspca/stv06xx/stv06xx_hdcs.c:	pr_info("HDCS-1020 sensor detected\n");
media/video/gspca/stv06xx/stv06xx_hdcs.c:	pr_info("Dumping sensor registers:\n");
media/video/gspca/stv06xx/stv06xx_hdcs.c:		pr_info("reg 0x%02x = 0x%02x\n", reg, val);
media/video/gspca/pac7311.c:		pr_err("reg_w_buf() failed index 0x%02x, error %d\n",
media/video/gspca/pac7311.c:		pr_err("reg_w() failed index 0x%02x, value 0x%02x, error %d\n",
media/video/gspca/pac7311.c:			pr_err("reg_w_page() failed index 0x%02x, value 0x%02x, error %d\n",
media/video/gspca/pac7311.c:		pr_err("Could not initialize controls\n");
media/video/gspca/stk014.c:		pr_err("reg_r err %d\n", ret);
media/video/gspca/stk014.c:		pr_err("reg_w err %d\n", ret);
media/video/gspca/stk014.c:		pr_err("rcv_val err %d\n", ret);
media/video/gspca/stk014.c:		pr_err("snd_val err %d\n", ret);
media/video/gspca/stk014.c:			pr_err("init reg: 0x%02x\n", ret);
media/video/gspca/stk014.c:		pr_err("set intf %d %d failed\n",
media/video/gspca/sonixj.c:		pr_err("reg_r: buffer overflow\n");
media/video/gspca/sonixj.c:		pr_err("reg_r err %d\n", ret);
media/video/gspca/sonixj.c:		pr_err("reg_w1 err %d\n", ret);
media/video/gspca/sonixj.c:		pr_err("reg_w: buffer overflow\n");
media/video/gspca/sonixj.c:		pr_err("reg_w err %d\n", ret);
media/video/gspca/sonixj.c:		pr_err("i2c_w1 err %d\n", ret);
media/video/gspca/sonixj.c:		pr_err("i2c_w8 err %d\n", ret);
media/video/gspca/sonixj.c:	pr_warn("Erroneous HV7131R ID 0x%02x 0x%02x 0x%02x\n",
media/video/gspca/sonixj.c:	pr_err("Unknown sensor %04x\n", val);
media/video/gspca/sonixj.c:		pr_err("Unknown sensor ID %04x\n", val);
media/video/gspca/xirlink_cit.c:		pr_err("Failed to write a register (index 0x%04X, value 0x%02X, error %d)\n",
media/video/gspca/xirlink_cit.c:		pr_err("Failed to read a register (index 0x%04X, error %d)\n",
media/video/gspca/xirlink_cit.c:		pr_err("Couldn't get altsetting\n");
media/video/gspca/xirlink_cit.c:		pr_err("set alt 1 err %d\n", ret);
media/video/gspca/w996Xcf.c:		pr_err("Write FSB registers failed (%d)\n", ret);
media/video/gspca/w996Xcf.c:		pr_err("Write SB reg [01] %04x failed\n", value);
media/video/gspca/w996Xcf.c:		pr_err("Read SB reg [01] failed\n");
media/video/gspca/sunplus.c:		pr_err("reg_r: buffer overflow\n");
media/video/gspca/sunplus.c:		pr_err("reg_r err %d\n", ret);
media/video/gspca/sunplus.c:		pr_err("reg_w_1 err %d\n", ret);
media/video/gspca/sunplus.c:		pr_err("reg_w_riv err %d\n", ret);
media/video/gspca/topro.c:		pr_err("reg_w err %d\n", ret);
media/video/gspca/topro.c:		pr_err("reg_r err %d\n", ret);
media/video/gspca/topro.c:			pr_err("bulk write error %d tag=%02x\n",
media/video/gspca/topro.c:				pr_warn("Unknown sensor %d - forced to soi763a\n",
media/video/gspca/topro.c:		pr_info("Sensor soi763a\n");
media/video/gspca/topro.c:		pr_info("Sensor cx0342\n");
media/video/gspca/topro.c:			pr_err("bulk err %d\n", ret);
media/video/gspca/topro.c:			pr_err("bulk err %d\n", ret);
media/video/gspca/stv0680.c:		pr_err("usb_control_msg error %i, request = 0x%x, error = %i\n",
media/video/gspca/stv0680.c:		pr_err("Could not get descriptor 0100\n");
media/video/hdpvr/hdpvr-video.c:		pr_err("open failing with with ENODEV\n");
media/video/mx2_emmaprp.c:		pr_err("Instance released before the end of transaction\n");
media/video/mx2_emmaprp.c:			pr_err("PrP bus error ocurred, this transfer is probably corrupted\n");
media/video/mxb.c:		pr_err("did not find all i2c devices. aborting\n");
media/video/mxb.c:		pr_info("'sound arena module' detected\n");
media/video/mxb.c:		pr_err("VIDIOC_S_INPUT: could not address saa7111a\n");
media/video/mxb.c:	pr_info("found Multimedia eXtension Board #%d\n", mxb_num);
media/video/pvrusb2/pvrusb2-v4l2.c.orig:			pr_err(KBUILD_MODNAME
media/video/pvrusb2/pvrusb2-v4l2.c.orig:		pr_err(KBUILD_MODNAME ": Failed to set up pvrusb2 v4l dev"
media/video/pvrusb2/pvrusb2-v4l2.c.orig:		pr_err(KBUILD_MODNAME
media/video/pvrusb2/pvrusb2-v4l2.c:			pr_err(KBUILD_MODNAME
media/video/pvrusb2/pvrusb2-v4l2.c:		pr_err(KBUILD_MODNAME ": Failed to set up pvrusb2 v4l dev"
media/video/pvrusb2/pvrusb2-v4l2.c:		pr_err(KBUILD_MODNAME
media/video/v4l2-ioctl.c:			pr_info("%s: =================  START STATUS  =================\n",
media/video/v4l2-ioctl.c:			pr_info("%s: ==================  END STATUS  ==================\n",
media/video/hexium_orion.c:		pr_err("hexium_probe: not enough kernel memory\n");
media/video/hexium_orion.c:		pr_info("device is a Hexium Orion w/ 1 SVHS + 3 BNC inputs\n");
media/video/hexium_orion.c:		pr_info("device is a Hexium Orion w/ 4 BNC inputs\n");
media/video/hexium_orion.c:		pr_info("device is a Hexium HV-PCI6/Orion (old)\n");
media/video/hexium_orion.c:			pr_err("failed for address 0x%02x\n", i);
media/video/hexium_orion.c:		pr_err("cannot register capture v4l2 device. skipping.\n");
media/video/hexium_orion.c:	pr_err("found 'hexium orion' frame grabber-%d\n", hexium_num);
media/video/mx3_camera.c:		pr_err("Couldn't map %x@%x\n", resource_size(res), res->start);
media/video/videobuf-dma-contig.c:		pr_err("magic mismatch: %x expected %x\n", (is), (should)); \
media/video/videobuf2-vmalloc.c:		pr_err("Address of an unallocated plane requested "
media/video/videobuf2-vmalloc.c:		pr_err("No memory to map\n");
media/video/videobuf2-vmalloc.c:		pr_err("Remapping vmalloc memory, error: %d\n", ret);
media/video/hexium_gemini.c:			pr_err("hexium_init_done() failed for address 0x%02x\n",
media/video/hexium_gemini.c:			pr_err("hexium_init_done: hexium_set_standard() failed for address 0x%02x\n",
media/video/hexium_gemini.c:		pr_err("not enough kernel memory in hexium_attach()\n");
media/video/hexium_gemini.c:		pr_err("cannot register capture v4l2 device. skipping.\n");
media/video/hexium_gemini.c:	pr_info("found 'hexium gemini' frame grabber-%d\n", hexium_num);
media/video/pms.c:		pr_err("PMS: not enabled, use pms.enable=1 to probe\n");
media/video/s5p-jpeg/jpeg-core.c:		pr_err("%s data will not fit into plane (%lu < %lu)\n",
media/video/s5p-jpeg/jpeg-core.c:	pr_info("S5P JPEG V4L2 Driver, (c) 2011 Samsung Electronics\n");
media/video/s5p-jpeg/jpeg-core.c:		pr_err("%s: failed to register jpeg driver\n", __func__);
media/video/sn9c102/sn9c102.h:			pr_info("sn9c102: " fmt "\n", ## args);               \
staging/media/as102/as102_drv.c:	pr_info("Registered device %s", as102_dev->name);
staging/media/as102/as102_drv.c:	pr_info("Unregistered device %s", as102_dev->name);
staging/media/as102/as102_usb_drv.c:	pr_info("%s: device has been disconnected\n", DRIVER_NAME);
staging/media/as102/as102_usb_drv.c:		pr_err("Device names table invalid size");
staging/media/as102/as102_usb_drv.c:	pr_info("%s: device has been detected\n", DRIVER_NAME);
staging/media/as102/as102_usb_drv.c:		pr_err("%s: can't find device for minor %d\n",
staging/media/as102/as102_fw.c:		pr_err("invalid firmware file\n");
staging/media/as102/as102_fw.c:		pr_err("%s: unable to locate firmware file: %s\n",
staging/media/as102/as102_fw.c:		pr_err("%s: error during firmware upload part1\n",
staging/media/as102/as102_fw.c:	pr_info("%s: firmware: %s loaded with success\n",
staging/media/as102/as102_fw.c:		pr_err("%s: unable to locate firmware file: %s\n",
staging/media/as102/as102_fw.c:		pr_err("%s: error during firmware upload part2\n",
staging/media/as102/as102_fw.c:	pr_info("%s: firmware: %s loaded with success\n",

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [PATCH v4 1/5] rtl2832 ver. 0.4: removed signal statistics
  2012-05-18  9:15           ` poma
@ 2012-05-18 10:38             ` poma
  2012-05-18 12:38               ` Antti Palosaari
  0 siblings, 1 reply; 104+ messages in thread
From: poma @ 2012-05-18 10:38 UTC (permalink / raw)
  To: Antti Palosaari; +Cc: Thomas Mair, linux-media

[-- Attachment #1: Type: text/plain, Size: 372 bytes --]

[…]

printk(KERN_ERR LOG_PREFIX": " f "\n" , ## arg)
pr_err(LOG_PREFIX": " f "\n" , ## arg)

printk(KERN_INFO LOG_PREFIX": " f "\n" , ## arg)
pr_info(LOG_PREFIX": " f "\n" , ## arg)

printk(KERN_WARNING LOG_PREFIX": " f "\n" , ## arg)
pr_warn(LOG_PREFIX": " f "\n" , ## arg)

Besides what 'checkpatch' suggest/output - Antti, is it a correct
conversions?

cheers,
poma


[-- Attachment #2: rtl2832_priv.h-v2.diff --]
[-- Type: text/x-patch, Size: 798 bytes --]

--- rtl2832_priv.h.orig	2012-05-18 02:02:48.561114101 +0200
+++ rtl2832_priv.h	2012-05-18 12:20:45.000000000 +0200
@@ -29,13 +29,13 @@
 #undef dbg
 #define dbg(f, arg...) \
 	if (rtl2832_debug) \
-		printk(KERN_INFO LOG_PREFIX": " f "\n" , ## arg)
+		pr_info(LOG_PREFIX": " f "\n" , ## arg)
 #undef err
-#define err(f, arg...)  printk(KERN_ERR	LOG_PREFIX": " f "\n" , ## arg)
+#define err(f, arg...) pr_err(LOG_PREFIX": " f "\n" , ## arg)
 #undef info
-#define info(f, arg...) printk(KERN_INFO LOG_PREFIX": " f "\n" , ## arg)
+#define info(f, arg...) pr_info(LOG_PREFIX": " f "\n" , ## arg)
 #undef warn
-#define warn(f, arg...) printk(KERN_WARNING LOG_PREFIX": " f "\n" , ## arg)
+#define warn(f, arg...) pr_warn(LOG_PREFIX": " f "\n" , ## arg)
 
 struct rtl2832_priv {
 	struct i2c_adapter *i2c;

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [PATCH v4 1/5] rtl2832 ver. 0.4: removed signal statistics
  2012-05-18 10:38             ` poma
@ 2012-05-18 12:38               ` Antti Palosaari
  2012-05-18 13:26                 ` poma
  0 siblings, 1 reply; 104+ messages in thread
From: Antti Palosaari @ 2012-05-18 12:38 UTC (permalink / raw)
  To: poma; +Cc: Thomas Mair, linux-media

On 18.05.2012 13:38, poma wrote:
> […]
>
> printk(KERN_ERR LOG_PREFIX": " f "\n" , ## arg)
> pr_err(LOG_PREFIX": " f "\n" , ## arg)
>
> printk(KERN_INFO LOG_PREFIX": " f "\n" , ## arg)
> pr_info(LOG_PREFIX": " f "\n" , ## arg)
>
> printk(KERN_WARNING LOG_PREFIX": " f "\n" , ## arg)
> pr_warn(LOG_PREFIX": " f "\n" , ## arg)
>
> Besides what 'checkpatch' suggest/output - Antti, is it a correct
> conversions?


I haven't looked those pr_err/pr_info/pr_warn, but what I did for 
af9035/af9033 was I used pr_debug as a debug writings since it seems to 
be choice of today.

I still suspect those pr_* functions should be used instead own macros. 
Currently documentation mentions only pr_debug and pr_info.

regards
Antit
-- 
http://palosaari.fi/

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [PATCH v4 1/5] rtl2832 ver. 0.4: removed signal statistics
  2012-05-18 12:38               ` Antti Palosaari
@ 2012-05-18 13:26                 ` poma
  2012-05-18 17:46                   ` Thomas Mair
  0 siblings, 1 reply; 104+ messages in thread
From: poma @ 2012-05-18 13:26 UTC (permalink / raw)
  To: Antti Palosaari, Thomas Mair, linux-media

On 05/18/2012 02:38 PM, Antti Palosaari wrote:
> On 18.05.2012 13:38, poma wrote:
>> […]
>>
>> printk(KERN_ERR LOG_PREFIX": " f "\n" , ## arg)
>> pr_err(LOG_PREFIX": " f "\n" , ## arg)
>>
>> printk(KERN_INFO LOG_PREFIX": " f "\n" , ## arg)
>> pr_info(LOG_PREFIX": " f "\n" , ## arg)
>>
>> printk(KERN_WARNING LOG_PREFIX": " f "\n" , ## arg)
>> pr_warn(LOG_PREFIX": " f "\n" , ## arg)
>>
>> Besides what 'checkpatch' suggest/output - Antti, is it a correct
>> conversions?
> 
> 
> I haven't looked those pr_err/pr_info/pr_warn, but what I did for
> af9035/af9033 was I used pr_debug as a debug writings since it seems to
> be choice of today.
> 
> I still suspect those pr_* functions should be used instead own macros.
> Currently documentation mentions only pr_debug and pr_info.
> 
> regards
> Antit

OK, thanks Antti!
Thomas, dropping 'rtl2832_priv.h.diff' & 'rtl2832_priv.h-v2.diff'
Please leave 'rtl2832_priv.h' as it is.
And there you go…

cheers,
poma

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [PATCH v4 1/5] rtl2832 ver. 0.4: removed signal statistics
  2012-05-18 13:26                 ` poma
@ 2012-05-18 17:46                   ` Thomas Mair
  2012-05-18 17:51                     ` Antti Palosaari
  0 siblings, 1 reply; 104+ messages in thread
From: Thomas Mair @ 2012-05-18 17:46 UTC (permalink / raw)
  To: poma; +Cc: Antti Palosaari, linux-media

On 18.05.2012 15:26, poma wrote:
> On 05/18/2012 02:38 PM, Antti Palosaari wrote:
>> On 18.05.2012 13:38, poma wrote:
>>> […]
>>>
>>> printk(KERN_ERR LOG_PREFIX": " f "\n" , ## arg)
>>> pr_err(LOG_PREFIX": " f "\n" , ## arg)
>>>
>>> printk(KERN_INFO LOG_PREFIX": " f "\n" , ## arg)
>>> pr_info(LOG_PREFIX": " f "\n" , ## arg)
>>>
>>> printk(KERN_WARNING LOG_PREFIX": " f "\n" , ## arg)
>>> pr_warn(LOG_PREFIX": " f "\n" , ## arg)
>>>
>>> Besides what 'checkpatch' suggest/output - Antti, is it a correct
>>> conversions?
>>
>>
>> I haven't looked those pr_err/pr_info/pr_warn, but what I did for
>> af9035/af9033 was I used pr_debug as a debug writings since it seems to
>> be choice of today.
>>
>> I still suspect those pr_* functions should be used instead own macros.
>> Currently documentation mentions only pr_debug and pr_info.
>>
>> regards
>> Antit
> 
> OK, thanks Antti!
> Thomas, dropping 'rtl2832_priv.h.diff' & 'rtl2832_priv.h-v2.diff'
> Please leave 'rtl2832_priv.h' as it is.
> And there you go…
> 
> cheers,
> poma

Alright. One last question though.

I seem incapable of removing the checkpatch error with the parentheses.
How should that be done properly? Should do something like do { ... } while(0)
or is there a more elegant solution?

Regrads
Thomas

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [PATCH v4 1/5] rtl2832 ver. 0.4: removed signal statistics
  2012-05-18 17:46                   ` Thomas Mair
@ 2012-05-18 17:51                     ` Antti Palosaari
  0 siblings, 0 replies; 104+ messages in thread
From: Antti Palosaari @ 2012-05-18 17:51 UTC (permalink / raw)
  To: Thomas Mair; +Cc: poma, linux-media

On 18.05.2012 20:46, Thomas Mair wrote:
> On 18.05.2012 15:26, poma wrote:
>> On 05/18/2012 02:38 PM, Antti Palosaari wrote:
>>> On 18.05.2012 13:38, poma wrote:
>>>> […]
>>>>
>>>> printk(KERN_ERR LOG_PREFIX": " f "\n" , ## arg)
>>>> pr_err(LOG_PREFIX": " f "\n" , ## arg)
>>>>
>>>> printk(KERN_INFO LOG_PREFIX": " f "\n" , ## arg)
>>>> pr_info(LOG_PREFIX": " f "\n" , ## arg)
>>>>
>>>> printk(KERN_WARNING LOG_PREFIX": " f "\n" , ## arg)
>>>> pr_warn(LOG_PREFIX": " f "\n" , ## arg)
>>>>
>>>> Besides what 'checkpatch' suggest/output - Antti, is it a correct
>>>> conversions?
>>>
>>>
>>> I haven't looked those pr_err/pr_info/pr_warn, but what I did for
>>> af9035/af9033 was I used pr_debug as a debug writings since it seems to
>>> be choice of today.
>>>
>>> I still suspect those pr_* functions should be used instead own macros.
>>> Currently documentation mentions only pr_debug and pr_info.
>>>
>>> regards
>>> Antit
>>
>> OK, thanks Antti!
>> Thomas, dropping 'rtl2832_priv.h.diff'&  'rtl2832_priv.h-v2.diff'
>> Please leave 'rtl2832_priv.h' as it is.
>> And there you go…
>>
>> cheers,
>> poma
>
> Alright. One last question though.
>
> I seem incapable of removing the checkpatch error with the parentheses.
> How should that be done properly? Should do something like do { ... } while(0)
> or is there a more elegant solution?

I have seen that do { ... } while(0) many times in Kernel sources so it 
is likely the proper solution.

regards
Antti
-- 
http://palosaari.fi/

^ permalink raw reply	[flat|nested] 104+ messages in thread

* [PATCH v5 0/5] support for rtl2832
  2012-03-14 20:05 [Qemu-devel] 5 euros offerts sur votre première commande Claire de Libeedo
                   ` (11 preceding siblings ...)
  2012-05-16 22:13 ` [PATCH v4 0/5] support for rtl2832 Thomas Mair
@ 2012-05-18 18:47 ` Thomas Mair
  2012-05-18 18:47   ` [PATCH v5 1/5] rtl2832 ver. 0.5: support for RTL2832 demod Thomas Mair
                     ` (6 more replies)
  2015-08-24 11:39 ` [PATCH] IGMP: Inhibit reports for local multicast groups Philip Downey
                   ` (2 subsequent siblings)
  15 siblings, 7 replies; 104+ messages in thread
From: Thomas Mair @ 2012-05-18 18:47 UTC (permalink / raw)
  To: linux-media; +Cc: crope, pomidorabelisima, Thomas Mair

Good Evening!

This is the corrected version of the patch series to support the 
RTL2832 demodulator. There where no major changes. The majority of
the changes consist in fixing style issues and adhering to proper
naming conventions.

The next question for me is how to proceed when including new
devices. Poma already sent an extensive list a little while 
ago (http://patchwork.linuxtv.org/patch/10982/). Should they
all be included at once, or should I wait until somone confirms 
they are working correctly and include them one by one?

Regards 
Thomas

Thomas Mair (5):
  rtl2832 ver. 0.5: support for RTL2832 demod
  rtl28xxu: support for the rtl2832 demod driver
  rtl28xxu: renamed rtl2831_rd/rtl2831_wr to rtl28xx_rd/rtl28xx_wr
  rtl28xxu: support Delock USB 2.0 DVB-T
  rtl28xxu: support Terratec Noxon DAB/DAB+ stick

 drivers/media/dvb/dvb-usb/Kconfig          |    3 +
 drivers/media/dvb/dvb-usb/dvb-usb-ids.h    |    3 +
 drivers/media/dvb/dvb-usb/rtl28xxu.c       |  516 ++++++++++++++++--
 drivers/media/dvb/frontends/Kconfig        |    7 +
 drivers/media/dvb/frontends/Makefile       |    1 +
 drivers/media/dvb/frontends/rtl2832.c      |  823 ++++++++++++++++++++++++++++
 drivers/media/dvb/frontends/rtl2832.h      |   74 +++
 drivers/media/dvb/frontends/rtl2832_priv.h |  260 +++++++++
 8 files changed, 1638 insertions(+), 49 deletions(-)
 create mode 100644 drivers/media/dvb/frontends/rtl2832.c
 create mode 100644 drivers/media/dvb/frontends/rtl2832.h
 create mode 100644 drivers/media/dvb/frontends/rtl2832_priv.h

-- 
1.7.7.6


^ permalink raw reply	[flat|nested] 104+ messages in thread

* [PATCH v5 1/5] rtl2832 ver. 0.5: support for RTL2832 demod
  2012-05-18 18:47 ` [PATCH v5 " Thomas Mair
@ 2012-05-18 18:47   ` Thomas Mair
  2012-05-18 20:21     ` Antti Palosaari
  2012-07-05 14:32     ` Mauro Carvalho Chehab
  2012-05-18 18:47   ` [PATCH v5 2/5] rtl28xxu: support for the rtl2832 demod driver Thomas Mair
                     ` (5 subsequent siblings)
  6 siblings, 2 replies; 104+ messages in thread
From: Thomas Mair @ 2012-05-18 18:47 UTC (permalink / raw)
  To: linux-media; +Cc: crope, pomidorabelisima, Thomas Mair

Changelog for ver. 0.5:
- fixed code style and naming errors

Changelog for ver. 0.4:
- removed statistics as their calculation was wrong
- fixed bug in Makefile
- indentation and code style improvements

Signed-off-by: Thomas Mair <thomas.mair86@googlemail.com>
---
 drivers/media/dvb/frontends/Kconfig        |    7 +
 drivers/media/dvb/frontends/Makefile       |    1 +
 drivers/media/dvb/frontends/rtl2832.c      |  823 ++++++++++++++++++++++++++++
 drivers/media/dvb/frontends/rtl2832.h      |   74 +++
 drivers/media/dvb/frontends/rtl2832_priv.h |  260 +++++++++
 5 files changed, 1165 insertions(+), 0 deletions(-)
 create mode 100644 drivers/media/dvb/frontends/rtl2832.c
 create mode 100644 drivers/media/dvb/frontends/rtl2832.h
 create mode 100644 drivers/media/dvb/frontends/rtl2832_priv.h

diff --git a/drivers/media/dvb/frontends/Kconfig b/drivers/media/dvb/frontends/Kconfig
index f479834..f7d67d7 100644
--- a/drivers/media/dvb/frontends/Kconfig
+++ b/drivers/media/dvb/frontends/Kconfig
@@ -432,6 +432,13 @@ config DVB_RTL2830
 	help
 	  Say Y when you want to support this frontend.
 
+config DVB_RTL2832
+	tristate "Realtek RTL2832 DVB-T"
+	depends on DVB_CORE && I2C
+	default m if DVB_FE_CUSTOMISE
+	help
+	  Say Y when you want to support this frontend.
+
 comment "DVB-C (cable) frontends"
 	depends on DVB_CORE
 
diff --git a/drivers/media/dvb/frontends/Makefile b/drivers/media/dvb/frontends/Makefile
index b0381dc..2279c5d 100644
--- a/drivers/media/dvb/frontends/Makefile
+++ b/drivers/media/dvb/frontends/Makefile
@@ -98,6 +98,7 @@ obj-$(CONFIG_DVB_IT913X_FE) += it913x-fe.o
 obj-$(CONFIG_DVB_A8293) += a8293.o
 obj-$(CONFIG_DVB_TDA10071) += tda10071.o
 obj-$(CONFIG_DVB_RTL2830) += rtl2830.o
+obj-$(CONFIG_DVB_RTL2832) += rtl2832.o
 obj-$(CONFIG_DVB_M88RS2000) += m88rs2000.o
 obj-$(CONFIG_DVB_AF9033) += af9033.o
 
diff --git a/drivers/media/dvb/frontends/rtl2832.c b/drivers/media/dvb/frontends/rtl2832.c
new file mode 100644
index 0000000..d0cbe27
--- /dev/null
+++ b/drivers/media/dvb/frontends/rtl2832.c
@@ -0,0 +1,823 @@
+/*
+ * Realtek RTL2832 DVB-T demodulator driver
+ *
+ * Copyright (C) 2012 Thomas Mair <thomas.mair86@gmail.com>
+ *
+ *	This program is free software; you can redistribute it and/or modify
+ *	it under the terms of the GNU General Public License as published by
+ *	the Free Software Foundation; either version 2 of the License, or
+ *	(at your option) any later version.
+ *
+ *	This program is distributed in the hope that it will be useful,
+ *	but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *	GNU General Public License for more details.
+ *
+ *	You should have received a copy of the GNU General Public License along
+ *	with this program; if not, write to the Free Software Foundation, Inc.,
+ *	51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#include "rtl2832_priv.h"
+
+
+int rtl2832_debug;
+module_param_named(debug, rtl2832_debug, int, 0644);
+MODULE_PARM_DESC(debug, "Turn on/off frontend debugging (default:off).");
+
+
+static const int reg_mask[32] = {
+	0x00000001,
+	0x00000003,
+	0x00000007,
+	0x0000000f,
+	0x0000001f,
+	0x0000003f,
+	0x0000007f,
+	0x000000ff,
+	0x000001ff,
+	0x000003ff,
+	0x000007ff,
+	0x00000fff,
+	0x00001fff,
+	0x00003fff,
+	0x00007fff,
+	0x0000ffff,
+	0x0001ffff,
+	0x0003ffff,
+	0x0007ffff,
+	0x000fffff,
+	0x001fffff,
+	0x003fffff,
+	0x007fffff,
+	0x00ffffff,
+	0x01ffffff,
+	0x03ffffff,
+	0x07ffffff,
+	0x0fffffff,
+	0x1fffffff,
+	0x3fffffff,
+	0x7fffffff,
+	0xffffffff
+};
+
+static const struct rtl2832_reg_entry registers[] = {
+	[DVBT_SOFT_RST]		= {0x1, 0x1,   2, 2},
+	[DVBT_IIC_REPEAT]	= {0x1, 0x1,   3, 3},
+	[DVBT_TR_WAIT_MIN_8K]	= {0x1, 0x88, 11, 2},
+	[DVBT_RSD_BER_FAIL_VAL]	= {0x1, 0x8f, 15, 0},
+	[DVBT_EN_BK_TRK]	= {0x1, 0xa6,  7, 7},
+	[DVBT_AD_EN_REG]	= {0x0, 0x8,   7, 7},
+	[DVBT_AD_EN_REG1]	= {0x0, 0x8,   6, 6},
+	[DVBT_EN_BBIN]		= {0x1, 0xb1,  0, 0},
+	[DVBT_MGD_THD0]		= {0x1, 0x95,  7, 0},
+	[DVBT_MGD_THD1]		= {0x1, 0x96,  7, 0},
+	[DVBT_MGD_THD2]		= {0x1, 0x97,  7, 0},
+	[DVBT_MGD_THD3]		= {0x1, 0x98,  7, 0},
+	[DVBT_MGD_THD4]		= {0x1, 0x99,  7, 0},
+	[DVBT_MGD_THD5]		= {0x1, 0x9a,  7, 0},
+	[DVBT_MGD_THD6]		= {0x1, 0x9b,  7, 0},
+	[DVBT_MGD_THD7]		= {0x1, 0x9c,  7, 0},
+	[DVBT_EN_CACQ_NOTCH]	= {0x1, 0x61,  4, 4},
+	[DVBT_AD_AV_REF]	= {0x0, 0x9,   6, 0},
+	[DVBT_REG_PI]		= {0x0, 0xa,   2, 0},
+	[DVBT_PIP_ON]		= {0x0, 0x21,  3, 3},
+	[DVBT_SCALE1_B92]	= {0x2, 0x92,  7, 0},
+	[DVBT_SCALE1_B93]	= {0x2, 0x93,  7, 0},
+	[DVBT_SCALE1_BA7]	= {0x2, 0xa7,  7, 0},
+	[DVBT_SCALE1_BA9]	= {0x2, 0xa9,  7, 0},
+	[DVBT_SCALE1_BAA]	= {0x2, 0xaa,  7, 0},
+	[DVBT_SCALE1_BAB]	= {0x2, 0xab,  7, 0},
+	[DVBT_SCALE1_BAC]	= {0x2, 0xac,  7, 0},
+	[DVBT_SCALE1_BB0]	= {0x2, 0xb0,  7, 0},
+	[DVBT_SCALE1_BB1]	= {0x2, 0xb1,  7, 0},
+	[DVBT_KB_P1]		= {0x1, 0x64,  3, 1},
+	[DVBT_KB_P2]		= {0x1, 0x64,  6, 4},
+	[DVBT_KB_P3]		= {0x1, 0x65,  2, 0},
+	[DVBT_OPT_ADC_IQ]	= {0x0, 0x6,   5, 4},
+	[DVBT_AD_AVI]		= {0x0, 0x9,   1, 0},
+	[DVBT_AD_AVQ]		= {0x0, 0x9,   3, 2},
+	[DVBT_K1_CR_STEP12]	= {0x2, 0xad,  9, 4},
+	[DVBT_TRK_KS_P2]	= {0x1, 0x6f,  2, 0},
+	[DVBT_TRK_KS_I2]	= {0x1, 0x70,  5, 3},
+	[DVBT_TR_THD_SET2]	= {0x1, 0x72,  3, 0},
+	[DVBT_TRK_KC_P2]	= {0x1, 0x73,  5, 3},
+	[DVBT_TRK_KC_I2]	= {0x1, 0x75,  2, 0},
+	[DVBT_CR_THD_SET2]	= {0x1, 0x76,  7, 6},
+	[DVBT_PSET_IFFREQ]	= {0x1, 0x19, 21, 0},
+	[DVBT_SPEC_INV]		= {0x1, 0x15,  0, 0},
+	[DVBT_RSAMP_RATIO]	= {0x1, 0x9f, 27, 2},
+	[DVBT_CFREQ_OFF_RATIO]	= {0x1, 0x9d, 23, 4},
+	[DVBT_FSM_STAGE]	= {0x3, 0x51,  6, 3},
+	[DVBT_RX_CONSTEL]	= {0x3, 0x3c,  3, 2},
+	[DVBT_RX_HIER]		= {0x3, 0x3c,  6, 4},
+	[DVBT_RX_C_RATE_LP]	= {0x3, 0x3d,  2, 0},
+	[DVBT_RX_C_RATE_HP]	= {0x3, 0x3d,  5, 3},
+	[DVBT_GI_IDX]		= {0x3, 0x51,  1, 0},
+	[DVBT_FFT_MODE_IDX]	= {0x3, 0x51,  2, 2},
+	[DVBT_RSD_BER_EST]	= {0x3, 0x4e, 15, 0},
+	[DVBT_CE_EST_EVM]	= {0x4, 0xc,  15, 0},
+	[DVBT_RF_AGC_VAL]	= {0x3, 0x5b, 13, 0},
+	[DVBT_IF_AGC_VAL]	= {0x3, 0x59, 13, 0},
+	[DVBT_DAGC_VAL]		= {0x3, 0x5,   7, 0},
+	[DVBT_SFREQ_OFF]	= {0x3, 0x18, 13, 0},
+	[DVBT_CFREQ_OFF]	= {0x3, 0x5f, 17, 0},
+	[DVBT_POLAR_RF_AGC]	= {0x0, 0xe,   1, 1},
+	[DVBT_POLAR_IF_AGC]	= {0x0, 0xe,   0, 0},
+	[DVBT_AAGC_HOLD]	= {0x1, 0x4,   5, 5},
+	[DVBT_EN_RF_AGC]	= {0x1, 0x4,   6, 6},
+	[DVBT_EN_IF_AGC]	= {0x1, 0x4,   7, 7},
+	[DVBT_IF_AGC_MIN]	= {0x1, 0x8,   7, 0},
+	[DVBT_IF_AGC_MAX]	= {0x1, 0x9,   7, 0},
+	[DVBT_RF_AGC_MIN]	= {0x1, 0xa,   7, 0},
+	[DVBT_RF_AGC_MAX]	= {0x1, 0xb,   7, 0},
+	[DVBT_IF_AGC_MAN]	= {0x1, 0xc,   6, 6},
+	[DVBT_IF_AGC_MAN_VAL]	= {0x1, 0xc,  13, 0},
+	[DVBT_RF_AGC_MAN]	= {0x1, 0xe,   6, 6},
+	[DVBT_RF_AGC_MAN_VAL]	= {0x1, 0xe,  13, 0},
+	[DVBT_DAGC_TRG_VAL]	= {0x1, 0x12,  7, 0},
+	[DVBT_AGC_TARG_VAL_0]	= {0x1, 0x2,   0, 0},
+	[DVBT_AGC_TARG_VAL_8_1]	= {0x1, 0x3,   7, 0},
+	[DVBT_AAGC_LOOP_GAIN]	= {0x1, 0xc7,  5, 1},
+	[DVBT_LOOP_GAIN2_3_0]	= {0x1, 0x4,   4, 1},
+	[DVBT_LOOP_GAIN2_4]	= {0x1, 0x5,   7, 7},
+	[DVBT_LOOP_GAIN3]	= {0x1, 0xc8,  4, 0},
+	[DVBT_VTOP1]		= {0x1, 0x6,   5, 0},
+	[DVBT_VTOP2]		= {0x1, 0xc9,  5, 0},
+	[DVBT_VTOP3]		= {0x1, 0xca,  5, 0},
+	[DVBT_KRF1]		= {0x1, 0xcb,  7, 0},
+	[DVBT_KRF2]		= {0x1, 0x7,   7, 0},
+	[DVBT_KRF3]		= {0x1, 0xcd,  7, 0},
+	[DVBT_KRF4]		= {0x1, 0xce,  7, 0},
+	[DVBT_EN_GI_PGA]	= {0x1, 0xe5,  0, 0},
+	[DVBT_THD_LOCK_UP]	= {0x1, 0xd9,  8, 0},
+	[DVBT_THD_LOCK_DW]	= {0x1, 0xdb,  8, 0},
+	[DVBT_THD_UP1]		= {0x1, 0xdd,  7, 0},
+	[DVBT_THD_DW1]		= {0x1, 0xde,  7, 0},
+	[DVBT_INTER_CNT_LEN]	= {0x1, 0xd8,  3, 0},
+	[DVBT_GI_PGA_STATE]	= {0x1, 0xe6,  3, 3},
+	[DVBT_EN_AGC_PGA]	= {0x1, 0xd7,  0, 0},
+	[DVBT_CKOUTPAR]		= {0x1, 0x7b,  5, 5},
+	[DVBT_CKOUT_PWR]	= {0x1, 0x7b,  6, 6},
+	[DVBT_SYNC_DUR]		= {0x1, 0x7b,  7, 7},
+	[DVBT_ERR_DUR]		= {0x1, 0x7c,  0, 0},
+	[DVBT_SYNC_LVL]		= {0x1, 0x7c,  1, 1},
+	[DVBT_ERR_LVL]		= {0x1, 0x7c,  2, 2},
+	[DVBT_VAL_LVL]		= {0x1, 0x7c,  3, 3},
+	[DVBT_SERIAL]		= {0x1, 0x7c,  4, 4},
+	[DVBT_SER_LSB]		= {0x1, 0x7c,  5, 5},
+	[DVBT_CDIV_PH0]		= {0x1, 0x7d,  3, 0},
+	[DVBT_CDIV_PH1]		= {0x1, 0x7d,  7, 4},
+	[DVBT_MPEG_IO_OPT_2_2]	= {0x0, 0x6,   7, 7},
+	[DVBT_MPEG_IO_OPT_1_0]	= {0x0, 0x7,   7, 6},
+	[DVBT_CKOUTPAR_PIP]	= {0x0, 0xb7,  4, 4},
+	[DVBT_CKOUT_PWR_PIP]	= {0x0, 0xb7,  3, 3},
+	[DVBT_SYNC_LVL_PIP]	= {0x0, 0xb7,  2, 2},
+	[DVBT_ERR_LVL_PIP]	= {0x0, 0xb7,  1, 1},
+	[DVBT_VAL_LVL_PIP]	= {0x0, 0xb7,  0, 0},
+	[DVBT_CKOUTPAR_PID]	= {0x0, 0xb9,  4, 4},
+	[DVBT_CKOUT_PWR_PID]	= {0x0, 0xb9,  3, 3},
+	[DVBT_SYNC_LVL_PID]	= {0x0, 0xb9,  2, 2},
+	[DVBT_ERR_LVL_PID]	= {0x0, 0xb9,  1, 1},
+	[DVBT_VAL_LVL_PID]	= {0x0, 0xb9,  0, 0},
+	[DVBT_SM_PASS]		= {0x1, 0x93, 11, 0},
+	[DVBT_AD7_SETTING]	= {0x0, 0x11, 15, 0},
+	[DVBT_RSSI_R]		= {0x3, 0x1,   6, 0},
+	[DVBT_ACI_DET_IND]	= {0x3, 0x12,  0, 0},
+	[DVBT_REG_MON]		= {0x0, 0xd,   1, 0},
+	[DVBT_REG_MONSEL]	= {0x0, 0xd,   2, 2},
+	[DVBT_REG_GPE]		= {0x0, 0xd,   7, 7},
+	[DVBT_REG_GPO]		= {0x0, 0x10,  0, 0},
+	[DVBT_REG_4MSEL]	= {0x0, 0x13,  0, 0},
+};
+
+/* write multiple hardware registers */
+static int rtl2832_wr(struct rtl2832_priv *priv, u8 reg, u8 *val, int len)
+{
+	int ret;
+	u8 buf[1+len];
+	struct i2c_msg msg[1] = {
+		{
+			.addr = priv->cfg.i2c_addr,
+			.flags = 0,
+			.len = 1+len,
+			.buf = buf,
+		}
+	};
+
+	buf[0] = reg;
+	memcpy(&buf[1], val, len);
+
+	ret = i2c_transfer(priv->i2c, msg, 1);
+	if (ret == 1) {
+		ret = 0;
+	} else {
+		warn("i2c wr failed=%d reg=%02x len=%d", ret, reg, len);
+		ret = -EREMOTEIO;
+	}
+	return ret;
+}
+
+/* read multiple hardware registers */
+static int rtl2832_rd(struct rtl2832_priv *priv, u8 reg, u8 *val, int len)
+{
+	int ret;
+	struct i2c_msg msg[2] = {
+		{
+			.addr = priv->cfg.i2c_addr,
+			.flags = 0,
+			.len = 1,
+			.buf = &reg,
+		}, {
+			.addr = priv->cfg.i2c_addr,
+			.flags = I2C_M_RD,
+			.len = len,
+			.buf = val,
+		}
+	};
+
+	ret = i2c_transfer(priv->i2c, msg, 2);
+	if (ret == 2) {
+		ret = 0;
+	} else {
+		warn("i2c rd failed=%d reg=%02x len=%d", ret, reg, len);
+		ret = -EREMOTEIO;
+}
+return ret;
+}
+
+/* write multiple registers */
+static int rtl2832_wr_regs(struct rtl2832_priv *priv, u8 reg, u8 page, u8 *val,
+	int len)
+{
+	int ret;
+
+
+	/* switch bank if needed */
+	if (page != priv->page) {
+		ret = rtl2832_wr(priv, 0x00, &page, 1);
+		if (ret)
+			return ret;
+
+		priv->page = page;
+}
+
+return rtl2832_wr(priv, reg, val, len);
+}
+
+/* read multiple registers */
+static int rtl2832_rd_regs(struct rtl2832_priv *priv, u8 reg, u8 page, u8 *val,
+	int len)
+{
+	int ret;
+
+	/* switch bank if needed */
+	if (page != priv->page) {
+		ret = rtl2832_wr(priv, 0x00, &page, 1);
+		if (ret)
+			return ret;
+
+		priv->page = page;
+	}
+
+	return rtl2832_rd(priv, reg, val, len);
+}
+
+#if 0 /* currently not used */
+/* write single register */
+static int rtl2832_wr_reg(struct rtl2832_priv *priv, u8 reg, u8 page, u8 val)
+{
+	return rtl2832_wr_regs(priv, reg, page, &val, 1);
+}
+#endif
+
+/* read single register */
+static int rtl2832_rd_reg(struct rtl2832_priv *priv, u8 reg, u8 page, u8 *val)
+{
+	return rtl2832_rd_regs(priv, reg, page, val, 1);
+}
+
+int rtl2832_rd_demod_reg(struct rtl2832_priv *priv, int reg, u32 *val)
+{
+	int ret;
+
+	u8 reg_start_addr;
+	u8 msb, lsb;
+	u8 page;
+	u8 reading[4];
+	u32 reading_tmp;
+	int i;
+
+	u8 len;
+	u32 mask;
+
+	reg_start_addr = registers[reg].start_address;
+	msb = registers[reg].msb;
+	lsb = registers[reg].lsb;
+	page = registers[reg].page;
+
+	len = (msb >> 3) + 1;
+	mask = reg_mask[msb - lsb];
+
+	ret = rtl2832_rd_regs(priv, reg_start_addr, page, &reading[0], len);
+	if (ret)
+		goto err;
+
+	reading_tmp = 0;
+	for (i = 0; i < len; i++)
+		reading_tmp |= reading[i] << ((len - 1 - i) * 8);
+
+	*val = (reading_tmp >> lsb) & mask;
+
+	return ret;
+
+err:
+	dbg("%s: failed=%d", __func__, ret);
+	return ret;
+
+}
+
+int rtl2832_wr_demod_reg(struct rtl2832_priv *priv, int reg, u32 val)
+{
+	int ret, i;
+	u8 len;
+	u8 reg_start_addr;
+	u8 msb, lsb;
+	u8 page;
+	u32 mask;
+
+
+	u8 reading[4];
+	u8 writing[4];
+	u32 reading_tmp;
+	u32 writing_tmp;
+
+
+	reg_start_addr = registers[reg].start_address;
+	msb = registers[reg].msb;
+	lsb = registers[reg].lsb;
+	page = registers[reg].page;
+
+	len = (msb >> 3) + 1;
+	mask = reg_mask[msb - lsb];
+
+
+	ret = rtl2832_rd_regs(priv, reg_start_addr, page, &reading[0], len);
+	if (ret)
+		goto err;
+
+	reading_tmp = 0;
+	for (i = 0; i < len; i++)
+		reading_tmp |= reading[i] << ((len - 1 - i) * 8);
+
+	writing_tmp = reading_tmp & ~(mask << lsb);
+	writing_tmp |= ((val & mask) << lsb);
+
+
+	for (i = 0; i < len; i++)
+		writing[i] = (writing_tmp >> ((len - 1 - i) * 8)) & 0xff;
+
+	ret = rtl2832_wr_regs(priv, reg_start_addr, page, &writing[0], len);
+	if (ret)
+		goto err;
+
+	return ret;
+
+err:
+	dbg("%s: failed=%d", __func__, ret);
+	return ret;
+
+}
+
+
+static int rtl2832_i2c_gate_ctrl(struct dvb_frontend *fe, int enable)
+{
+	int ret;
+	struct rtl2832_priv *priv = fe->demodulator_priv;
+
+	dbg("%s: enable=%d", __func__, enable);
+
+	/* gate already open or close */
+	if (priv->i2c_gate_state == enable)
+		return 0;
+
+	ret = rtl2832_wr_demod_reg(priv, DVBT_IIC_REPEAT, (enable ? 0x1 : 0x0));
+	if (ret)
+		goto err;
+
+	priv->i2c_gate_state = enable;
+
+	return ret;
+err:
+	dbg("%s: failed=%d", __func__, ret);
+	return ret;
+}
+
+
+
+static int rtl2832_init(struct dvb_frontend *fe)
+{
+	struct rtl2832_priv *priv = fe->demodulator_priv;
+	int i, ret;
+
+	u8 en_bbin;
+	u64 pset_iffreq;
+
+	/* initialization values for the demodulator registers */
+	struct rtl2832_reg_value rtl2832_initial_regs[] = {
+		{DVBT_AD_EN_REG,		0x1},
+		{DVBT_AD_EN_REG1,		0x1},
+		{DVBT_RSD_BER_FAIL_VAL,		0x2800},
+		{DVBT_MGD_THD0,			0x10},
+		{DVBT_MGD_THD1,			0x20},
+		{DVBT_MGD_THD2,			0x20},
+		{DVBT_MGD_THD3,			0x40},
+		{DVBT_MGD_THD4,			0x22},
+		{DVBT_MGD_THD5,			0x32},
+		{DVBT_MGD_THD6,			0x37},
+		{DVBT_MGD_THD7,			0x39},
+		{DVBT_EN_BK_TRK,		0x0},
+		{DVBT_EN_CACQ_NOTCH,		0x0},
+		{DVBT_AD_AV_REF,		0x2a},
+		{DVBT_REG_PI,			0x6},
+		{DVBT_PIP_ON,			0x0},
+		{DVBT_CDIV_PH0,			0x8},
+		{DVBT_CDIV_PH1,			0x8},
+		{DVBT_SCALE1_B92,		0x4},
+		{DVBT_SCALE1_B93,		0xb0},
+		{DVBT_SCALE1_BA7,		0x78},
+		{DVBT_SCALE1_BA9,		0x28},
+		{DVBT_SCALE1_BAA,		0x59},
+		{DVBT_SCALE1_BAB,		0x83},
+		{DVBT_SCALE1_BAC,		0xd4},
+		{DVBT_SCALE1_BB0,		0x65},
+		{DVBT_SCALE1_BB1,		0x43},
+		{DVBT_KB_P1,			0x1},
+		{DVBT_KB_P2,			0x4},
+		{DVBT_KB_P3,			0x7},
+		{DVBT_K1_CR_STEP12,		0xa},
+		{DVBT_REG_GPE,			0x1},
+		{DVBT_SERIAL,			0x0},
+		{DVBT_CDIV_PH0,			0x9},
+		{DVBT_CDIV_PH1,			0x9},
+		{DVBT_MPEG_IO_OPT_2_2,		0x0},
+		{DVBT_MPEG_IO_OPT_1_0,		0x0},
+		{DVBT_TRK_KS_P2,		0x4},
+		{DVBT_TRK_KS_I2,		0x7},
+		{DVBT_TR_THD_SET2,		0x6},
+		{DVBT_TRK_KC_I2,		0x5},
+		{DVBT_CR_THD_SET2,		0x1},
+		{DVBT_SPEC_INV,			0x0},
+		{DVBT_DAGC_TRG_VAL,		0x5a},
+		{DVBT_AGC_TARG_VAL_0,		0x0},
+		{DVBT_AGC_TARG_VAL_8_1,		0x5a},
+		{DVBT_AAGC_LOOP_GAIN,		0x16},
+		{DVBT_LOOP_GAIN2_3_0,		0x6},
+		{DVBT_LOOP_GAIN2_4,		0x1},
+		{DVBT_LOOP_GAIN3,		0x16},
+		{DVBT_VTOP1,			0x35},
+		{DVBT_VTOP2,			0x21},
+		{DVBT_VTOP3,			0x21},
+		{DVBT_KRF1,			0x0},
+		{DVBT_KRF2,			0x40},
+		{DVBT_KRF3,			0x10},
+		{DVBT_KRF4,			0x10},
+		{DVBT_IF_AGC_MIN,		0x80},
+		{DVBT_IF_AGC_MAX,		0x7f},
+		{DVBT_RF_AGC_MIN,		0x80},
+		{DVBT_RF_AGC_MAX,		0x7f},
+		{DVBT_POLAR_RF_AGC,		0x0},
+		{DVBT_POLAR_IF_AGC,		0x0},
+		{DVBT_AD7_SETTING,		0xe9bf},
+		{DVBT_EN_GI_PGA,		0x0},
+		{DVBT_THD_LOCK_UP,		0x0},
+		{DVBT_THD_LOCK_DW,		0x0},
+		{DVBT_THD_UP1,			0x11},
+		{DVBT_THD_DW1,			0xef},
+		{DVBT_INTER_CNT_LEN,		0xc},
+		{DVBT_GI_PGA_STATE,		0x0},
+		{DVBT_EN_AGC_PGA,		0x1},
+		{DVBT_IF_AGC_MAN,		0x0},
+	};
+
+
+	dbg("%s", __func__);
+
+	en_bbin = (priv->cfg.if_dvbt == 0 ? 0x1 : 0x0);
+
+	/*
+	* PSET_IFFREQ = - floor((IfFreqHz % CrystalFreqHz) * pow(2, 22)
+	*		/ CrystalFreqHz)
+	*/
+	pset_iffreq = priv->cfg.if_dvbt % priv->cfg.xtal;
+	pset_iffreq *= 0x400000;
+	pset_iffreq = div_u64(pset_iffreq, priv->cfg.xtal);
+	pset_iffreq = pset_iffreq & 0x3fffff;
+
+
+
+	for (i = 0; i < ARRAY_SIZE(rtl2832_initial_regs); i++) {
+		ret = rtl2832_wr_demod_reg(priv, rtl2832_initial_regs[i].reg,
+			rtl2832_initial_regs[i].value);
+		if (ret)
+			goto err;
+	}
+
+	/* if frequency settings */
+	ret = rtl2832_wr_demod_reg(priv, DVBT_EN_BBIN, en_bbin);
+		if (ret)
+			goto err;
+
+	ret = rtl2832_wr_demod_reg(priv, DVBT_PSET_IFFREQ, pset_iffreq);
+		if (ret)
+			goto err;
+
+	priv->sleeping = false;
+
+	return ret;
+
+err:
+	dbg("%s: failed=%d", __func__, ret);
+	return ret;
+}
+
+static int rtl2832_sleep(struct dvb_frontend *fe)
+{
+	struct rtl2832_priv *priv = fe->demodulator_priv;
+
+	dbg("%s", __func__);
+	priv->sleeping = true;
+	return 0;
+}
+
+int rtl2832_get_tune_settings(struct dvb_frontend *fe,
+	struct dvb_frontend_tune_settings *s)
+{
+	dbg("%s", __func__);
+	s->min_delay_ms = 1000;
+	s->step_size = fe->ops.info.frequency_stepsize * 2;
+	s->max_drift = (fe->ops.info.frequency_stepsize * 2) + 1;
+	return 0;
+}
+
+static int rtl2832_set_frontend(struct dvb_frontend *fe)
+{
+	struct rtl2832_priv *priv = fe->demodulator_priv;
+	struct dtv_frontend_properties *c = &fe->dtv_property_cache;
+	int ret, i, j;
+	u64 bw_mode, num, num2;
+	u32 resamp_ratio, cfreq_off_ratio;
+
+
+	static u8 bw_params[3][32] = {
+	/* 6 MHz bandwidth */
+		{
+		0xf5, 0xff, 0x15, 0x38, 0x5d, 0x6d, 0x52, 0x07, 0xfa, 0x2f,
+		0x53, 0xf5, 0x3f, 0xca, 0x0b, 0x91, 0xea, 0x30, 0x63, 0xb2,
+		0x13, 0xda, 0x0b, 0xc4, 0x18, 0x7e, 0x16, 0x66, 0x08, 0x67,
+		0x19, 0xe0,
+		},
+
+	/*  7 MHz bandwidth */
+		{
+		0xe7, 0xcc, 0xb5, 0xba, 0xe8, 0x2f, 0x67, 0x61, 0x00, 0xaf,
+		0x86, 0xf2, 0xbf, 0x59, 0x04, 0x11, 0xb6, 0x33, 0xa4, 0x30,
+		0x15, 0x10, 0x0a, 0x42, 0x18, 0xf8, 0x17, 0xd9, 0x07, 0x22,
+		0x19, 0x10,
+		},
+
+	/*  8 MHz bandwidth */
+		{
+		0x09, 0xf6, 0xd2, 0xa7, 0x9a, 0xc9, 0x27, 0x77, 0x06, 0xbf,
+		0xec, 0xf4, 0x4f, 0x0b, 0xfc, 0x01, 0x63, 0x35, 0x54, 0xa7,
+		0x16, 0x66, 0x08, 0xb4, 0x19, 0x6e, 0x19, 0x65, 0x05, 0xc8,
+		0x19, 0xe0,
+		},
+	};
+
+
+	dbg("%s: frequency=%d bandwidth_hz=%d inversion=%d", __func__,
+		c->frequency, c->bandwidth_hz, c->inversion);
+
+
+	/* program tuner */
+	if (fe->ops.tuner_ops.set_params)
+		fe->ops.tuner_ops.set_params(fe);
+
+
+	switch (c->bandwidth_hz) {
+	case 6000000:
+		i = 0;
+		bw_mode = 48000000;
+		break;
+	case 7000000:
+		i = 1;
+		bw_mode = 56000000;
+		break;
+	case 8000000:
+		i = 2;
+		bw_mode = 64000000;
+		break;
+	default:
+		dbg("invalid bandwidth");
+		return -EINVAL;
+	}
+
+	for (j = 0; j < sizeof(bw_params[j]); j++) {
+		ret = rtl2832_wr_regs(priv, 0x1c+j, 1, &bw_params[i][j], 1);
+		if (ret)
+			goto err;
+	}
+
+	/* calculate and set resample ratio
+	* RSAMP_RATIO = floor(CrystalFreqHz * 7 * pow(2, 22)
+	*	/ ConstWithBandwidthMode)
+	*/
+	num = priv->cfg.xtal * 7;
+	num *= 0x400000;
+	num = div_u64(num, bw_mode);
+	resamp_ratio =  num & 0x3ffffff;
+	ret = rtl2832_wr_demod_reg(priv, DVBT_RSAMP_RATIO, resamp_ratio);
+	if (ret)
+		goto err;
+
+	/* calculate and set cfreq off ratio
+	* CFREQ_OFF_RATIO = - floor(ConstWithBandwidthMode * pow(2, 20)
+	*	/ (CrystalFreqHz * 7))
+	*/
+	num = bw_mode << 20;
+	num2 = priv->cfg.xtal * 7;
+	num = div_u64(num, num2);
+	num = -num;
+	cfreq_off_ratio = num & 0xfffff;
+	ret = rtl2832_wr_demod_reg(priv, DVBT_CFREQ_OFF_RATIO, cfreq_off_ratio);
+	if (ret)
+		goto err;
+
+
+	/* soft reset */
+	ret = rtl2832_wr_demod_reg(priv, DVBT_SOFT_RST, 0x1);
+	if (ret)
+		goto err;
+
+	ret = rtl2832_wr_demod_reg(priv, DVBT_SOFT_RST, 0x0);
+	if (ret)
+		goto err;
+
+	return ret;
+err:
+	info("%s: failed=%d", __func__, ret);
+	return ret;
+}
+
+static int rtl2832_read_status(struct dvb_frontend *fe, fe_status_t *status)
+{
+	struct rtl2832_priv *priv = fe->demodulator_priv;
+	int ret;
+	u32 tmp;
+	*status = 0;
+
+
+	dbg("%s", __func__);
+	if (priv->sleeping)
+		return 0;
+
+	ret = rtl2832_rd_demod_reg(priv, DVBT_FSM_STAGE, &tmp);
+	if (ret)
+		goto err;
+
+	if (tmp == 11) {
+		*status |= FE_HAS_SIGNAL | FE_HAS_CARRIER |
+				FE_HAS_VITERBI | FE_HAS_SYNC | FE_HAS_LOCK;
+	}
+	/* TODO find out if this is also true for rtl2832? */
+	/*else if (tmp == 10) {
+		*status |= FE_HAS_SIGNAL | FE_HAS_CARRIER |
+				FE_HAS_VITERBI;
+	}*/
+
+	return ret;
+err:
+	info("%s: failed=%d", __func__, ret);
+	return ret;
+}
+
+static int rtl2832_read_snr(struct dvb_frontend *fe, u16 *snr)
+{
+	*snr = 0;
+	return 0;
+}
+
+static int rtl2832_read_ber(struct dvb_frontend *fe, u32 *ber)
+{
+	*ber = 0;
+	return 0;
+}
+
+static int rtl2832_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
+{
+	*ucblocks = 0;
+	return 0;
+}
+
+
+static int rtl2832_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
+{
+	*strength = 0;
+	return 0;
+}
+
+static struct dvb_frontend_ops rtl2832_ops;
+
+static void rtl2832_release(struct dvb_frontend *fe)
+{
+	struct rtl2832_priv *priv = fe->demodulator_priv;
+
+	dbg("%s", __func__);
+	kfree(priv);
+}
+
+struct dvb_frontend *rtl2832_attach(const struct rtl2832_config *cfg,
+	struct i2c_adapter *i2c)
+{
+	struct rtl2832_priv *priv = NULL;
+	int ret = 0;
+	u8 tmp;
+
+	dbg("%s", __func__);
+
+	/* allocate memory for the internal state */
+	priv = kzalloc(sizeof(struct rtl2832_priv), GFP_KERNEL);
+	if (priv == NULL)
+		goto err;
+
+	/* setup the priv */
+	priv->i2c = i2c;
+	priv->tuner = cfg->tuner;
+	memcpy(&priv->cfg, cfg, sizeof(struct rtl2832_config));
+
+	/* check if the demod is there */
+	ret = rtl2832_rd_reg(priv, 0x00, 0x0, &tmp);
+	if (ret)
+		goto err;
+
+	/* create dvb_frontend */
+	memcpy(&priv->fe.ops, &rtl2832_ops, sizeof(struct dvb_frontend_ops));
+	priv->fe.demodulator_priv = priv;
+
+	/* TODO implement sleep mode */
+	priv->sleeping = true;
+
+	return &priv->fe;
+err:
+	dbg("%s: failed=%d", __func__, ret);
+	kfree(priv);
+	return NULL;
+}
+EXPORT_SYMBOL(rtl2832_attach);
+
+static struct dvb_frontend_ops rtl2832_ops = {
+	.delsys = { SYS_DVBT },
+	.info = {
+		.name = "Realtek RTL2832 (DVB-T)",
+		.frequency_min	  = 174000000,
+		.frequency_max	  = 862000000,
+		.frequency_stepsize = 166667,
+		.caps = FE_CAN_FEC_1_2 |
+			FE_CAN_FEC_2_3 |
+			FE_CAN_FEC_3_4 |
+			FE_CAN_FEC_5_6 |
+			FE_CAN_FEC_7_8 |
+			FE_CAN_FEC_AUTO |
+			FE_CAN_QPSK |
+			FE_CAN_QAM_16 |
+			FE_CAN_QAM_64 |
+			FE_CAN_QAM_AUTO |
+			FE_CAN_TRANSMISSION_MODE_AUTO |
+			FE_CAN_GUARD_INTERVAL_AUTO |
+			FE_CAN_HIERARCHY_AUTO |
+			FE_CAN_RECOVER |
+			FE_CAN_MUTE_TS
+	 },
+
+	.release = rtl2832_release,
+
+	.init = rtl2832_init,
+	.sleep = rtl2832_sleep,
+
+	.get_tune_settings = rtl2832_get_tune_settings,
+
+	.set_frontend = rtl2832_set_frontend,
+
+	.read_status = rtl2832_read_status,
+	.read_snr = rtl2832_read_snr,
+	.read_ber = rtl2832_read_ber,
+	.read_ucblocks = rtl2832_read_ucblocks,
+	.read_signal_strength = rtl2832_read_signal_strength,
+	.i2c_gate_ctrl = rtl2832_i2c_gate_ctrl,
+};
+
+MODULE_AUTHOR("Thomas Mair <mair.thomas86@gmail.com>");
+MODULE_DESCRIPTION("Realtek RTL2832 DVB-T demodulator driver");
+MODULE_LICENSE("GPL");
+MODULE_VERSION("0.5");
diff --git a/drivers/media/dvb/frontends/rtl2832.h b/drivers/media/dvb/frontends/rtl2832.h
new file mode 100644
index 0000000..d94dc9a
--- /dev/null
+++ b/drivers/media/dvb/frontends/rtl2832.h
@@ -0,0 +1,74 @@
+/*
+ * Realtek RTL2832 DVB-T demodulator driver
+ *
+ * Copyright (C) 2012 Thomas Mair <thomas.mair86@gmail.com>
+ *
+ *	This program is free software; you can redistribute it and/or modify
+ *	it under the terms of the GNU General Public License as published by
+ *	the Free Software Foundation; either version 2 of the License, or
+ *	(at your option) any later version.
+ *
+ *	This program is distributed in the hope that it will be useful,
+ *	but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *	GNU General Public License for more details.
+ *
+ *	You should have received a copy of the GNU General Public License along
+ *	with this program; if not, write to the Free Software Foundation, Inc.,
+ *	51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#ifndef RTL2832_H
+#define RTL2832_H
+
+#include <linux/dvb/frontend.h>
+
+struct rtl2832_config {
+	/*
+	 * Demodulator I2C address.
+	 */
+	u8 i2c_addr;
+
+	/*
+	 * Xtal frequency.
+	 * Hz
+	 * 4000000, 16000000, 25000000, 28800000
+	 */
+	u32 xtal;
+
+	/*
+	 * IFs for all used modes.
+	 * Hz
+	 * 4570000, 4571429, 36000000, 36125000, 36166667, 44000000
+	 */
+	u32 if_dvbt;
+
+	/*
+	 */
+	u8 tuner;
+};
+
+
+#if defined(CONFIG_DVB_RTL2832) || \
+	(defined(CONFIG_DVB_RTL2832_MODULE) && defined(MODULE))
+extern struct dvb_frontend *rtl2832_attach(
+	const struct rtl2832_config *cfg,
+	struct i2c_adapter *i2c
+);
+
+extern struct i2c_adapter *rtl2832_get_tuner_i2c_adapter(
+	struct dvb_frontend *fe
+);
+#else
+static inline struct dvb_frontend *rtl2832_attach(
+	const struct rtl2832_config *config,
+	struct i2c_adapter *i2c
+)
+{
+	printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
+	return NULL;
+}
+#endif
+
+
+#endif /* RTL2832_H */
diff --git a/drivers/media/dvb/frontends/rtl2832_priv.h b/drivers/media/dvb/frontends/rtl2832_priv.h
new file mode 100644
index 0000000..cd01a8a
--- /dev/null
+++ b/drivers/media/dvb/frontends/rtl2832_priv.h
@@ -0,0 +1,260 @@
+/*
+ * Realtek RTL2832 DVB-T demodulator driver
+ *
+ * Copyright (C) 2012 Thomas Mair <thomas.mair86@gmail.com>
+ *
+ *	This program is free software; you can redistribute it and/or modify
+ *	it under the terms of the GNU General Public License as published by
+ *	the Free Software Foundation; either version 2 of the License, or
+ *	(at your option) any later version.
+ *
+ *	This program is distributed in the hope that it will be useful,
+ *	but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *	GNU General Public License for more details.
+ *
+ *	You should have received a copy of the GNU General Public License along
+ *	with this program; if not, write to the Free Software Foundation, Inc.,
+ *	51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#ifndef RTL2832_PRIV_H
+#define RTL2832_PRIV_H
+
+#include "dvb_frontend.h"
+#include "rtl2832.h"
+
+#define LOG_PREFIX "rtl2832"
+
+#undef dbg
+#define dbg(f, arg...) \
+do { \
+	if (rtl2832_debug)  \
+		printk(KERN_INFO     LOG_PREFIX": " f "\n" , ## arg); \
+} while (0)
+#undef err
+#define err(f, arg...)  printk(KERN_ERR     LOG_PREFIX": " f "\n" , ## arg)
+#undef info
+#define info(f, arg...) printk(KERN_INFO    LOG_PREFIX": " f "\n" , ## arg)
+#undef warn
+#define warn(f, arg...) printk(KERN_WARNING LOG_PREFIX": " f "\n" , ## arg)
+
+struct rtl2832_priv {
+	struct i2c_adapter *i2c;
+	struct dvb_frontend fe;
+	struct rtl2832_config cfg;
+
+	bool i2c_gate_state;
+	bool sleeping;
+
+	u8 tuner;
+	u8 page; /* active register page */
+};
+
+struct rtl2832_reg_entry {
+	u8 page;
+	u8 start_address;
+	u8 msb;
+	u8 lsb;
+};
+
+struct rtl2832_reg_value {
+	int reg;
+	u32 value;
+};
+
+
+/* Demod register bit names */
+enum DVBT_REG_BIT_NAME {
+	DVBT_SOFT_RST,
+	DVBT_IIC_REPEAT,
+	DVBT_TR_WAIT_MIN_8K,
+	DVBT_RSD_BER_FAIL_VAL,
+	DVBT_EN_BK_TRK,
+	DVBT_REG_PI,
+	DVBT_REG_PFREQ_1_0,
+	DVBT_PD_DA8,
+	DVBT_LOCK_TH,
+	DVBT_BER_PASS_SCAL,
+	DVBT_CE_FFSM_BYPASS,
+	DVBT_ALPHAIIR_N,
+	DVBT_ALPHAIIR_DIF,
+	DVBT_EN_TRK_SPAN,
+	DVBT_LOCK_TH_LEN,
+	DVBT_CCI_THRE,
+	DVBT_CCI_MON_SCAL,
+	DVBT_CCI_M0,
+	DVBT_CCI_M1,
+	DVBT_CCI_M2,
+	DVBT_CCI_M3,
+	DVBT_SPEC_INIT_0,
+	DVBT_SPEC_INIT_1,
+	DVBT_SPEC_INIT_2,
+	DVBT_AD_EN_REG,
+	DVBT_AD_EN_REG1,
+	DVBT_EN_BBIN,
+	DVBT_MGD_THD0,
+	DVBT_MGD_THD1,
+	DVBT_MGD_THD2,
+	DVBT_MGD_THD3,
+	DVBT_MGD_THD4,
+	DVBT_MGD_THD5,
+	DVBT_MGD_THD6,
+	DVBT_MGD_THD7,
+	DVBT_EN_CACQ_NOTCH,
+	DVBT_AD_AV_REF,
+	DVBT_PIP_ON,
+	DVBT_SCALE1_B92,
+	DVBT_SCALE1_B93,
+	DVBT_SCALE1_BA7,
+	DVBT_SCALE1_BA9,
+	DVBT_SCALE1_BAA,
+	DVBT_SCALE1_BAB,
+	DVBT_SCALE1_BAC,
+	DVBT_SCALE1_BB0,
+	DVBT_SCALE1_BB1,
+	DVBT_KB_P1,
+	DVBT_KB_P2,
+	DVBT_KB_P3,
+	DVBT_OPT_ADC_IQ,
+	DVBT_AD_AVI,
+	DVBT_AD_AVQ,
+	DVBT_K1_CR_STEP12,
+	DVBT_TRK_KS_P2,
+	DVBT_TRK_KS_I2,
+	DVBT_TR_THD_SET2,
+	DVBT_TRK_KC_P2,
+	DVBT_TRK_KC_I2,
+	DVBT_CR_THD_SET2,
+	DVBT_PSET_IFFREQ,
+	DVBT_SPEC_INV,
+	DVBT_BW_INDEX,
+	DVBT_RSAMP_RATIO,
+	DVBT_CFREQ_OFF_RATIO,
+	DVBT_FSM_STAGE,
+	DVBT_RX_CONSTEL,
+	DVBT_RX_HIER,
+	DVBT_RX_C_RATE_LP,
+	DVBT_RX_C_RATE_HP,
+	DVBT_GI_IDX,
+	DVBT_FFT_MODE_IDX,
+	DVBT_RSD_BER_EST,
+	DVBT_CE_EST_EVM,
+	DVBT_RF_AGC_VAL,
+	DVBT_IF_AGC_VAL,
+	DVBT_DAGC_VAL,
+	DVBT_SFREQ_OFF,
+	DVBT_CFREQ_OFF,
+	DVBT_POLAR_RF_AGC,
+	DVBT_POLAR_IF_AGC,
+	DVBT_AAGC_HOLD,
+	DVBT_EN_RF_AGC,
+	DVBT_EN_IF_AGC,
+	DVBT_IF_AGC_MIN,
+	DVBT_IF_AGC_MAX,
+	DVBT_RF_AGC_MIN,
+	DVBT_RF_AGC_MAX,
+	DVBT_IF_AGC_MAN,
+	DVBT_IF_AGC_MAN_VAL,
+	DVBT_RF_AGC_MAN,
+	DVBT_RF_AGC_MAN_VAL,
+	DVBT_DAGC_TRG_VAL,
+	DVBT_AGC_TARG_VAL,
+	DVBT_LOOP_GAIN_3_0,
+	DVBT_LOOP_GAIN_4,
+	DVBT_VTOP,
+	DVBT_KRF,
+	DVBT_AGC_TARG_VAL_0,
+	DVBT_AGC_TARG_VAL_8_1,
+	DVBT_AAGC_LOOP_GAIN,
+	DVBT_LOOP_GAIN2_3_0,
+	DVBT_LOOP_GAIN2_4,
+	DVBT_LOOP_GAIN3,
+	DVBT_VTOP1,
+	DVBT_VTOP2,
+	DVBT_VTOP3,
+	DVBT_KRF1,
+	DVBT_KRF2,
+	DVBT_KRF3,
+	DVBT_KRF4,
+	DVBT_EN_GI_PGA,
+	DVBT_THD_LOCK_UP,
+	DVBT_THD_LOCK_DW,
+	DVBT_THD_UP1,
+	DVBT_THD_DW1,
+	DVBT_INTER_CNT_LEN,
+	DVBT_GI_PGA_STATE,
+	DVBT_EN_AGC_PGA,
+	DVBT_CKOUTPAR,
+	DVBT_CKOUT_PWR,
+	DVBT_SYNC_DUR,
+	DVBT_ERR_DUR,
+	DVBT_SYNC_LVL,
+	DVBT_ERR_LVL,
+	DVBT_VAL_LVL,
+	DVBT_SERIAL,
+	DVBT_SER_LSB,
+	DVBT_CDIV_PH0,
+	DVBT_CDIV_PH1,
+	DVBT_MPEG_IO_OPT_2_2,
+	DVBT_MPEG_IO_OPT_1_0,
+	DVBT_CKOUTPAR_PIP,
+	DVBT_CKOUT_PWR_PIP,
+	DVBT_SYNC_LVL_PIP,
+	DVBT_ERR_LVL_PIP,
+	DVBT_VAL_LVL_PIP,
+	DVBT_CKOUTPAR_PID,
+	DVBT_CKOUT_PWR_PID,
+	DVBT_SYNC_LVL_PID,
+	DVBT_ERR_LVL_PID,
+	DVBT_VAL_LVL_PID,
+	DVBT_SM_PASS,
+	DVBT_UPDATE_REG_2,
+	DVBT_BTHD_P3,
+	DVBT_BTHD_D3,
+	DVBT_FUNC4_REG0,
+	DVBT_FUNC4_REG1,
+	DVBT_FUNC4_REG2,
+	DVBT_FUNC4_REG3,
+	DVBT_FUNC4_REG4,
+	DVBT_FUNC4_REG5,
+	DVBT_FUNC4_REG6,
+	DVBT_FUNC4_REG7,
+	DVBT_FUNC4_REG8,
+	DVBT_FUNC4_REG9,
+	DVBT_FUNC4_REG10,
+	DVBT_FUNC5_REG0,
+	DVBT_FUNC5_REG1,
+	DVBT_FUNC5_REG2,
+	DVBT_FUNC5_REG3,
+	DVBT_FUNC5_REG4,
+	DVBT_FUNC5_REG5,
+	DVBT_FUNC5_REG6,
+	DVBT_FUNC5_REG7,
+	DVBT_FUNC5_REG8,
+	DVBT_FUNC5_REG9,
+	DVBT_FUNC5_REG10,
+	DVBT_FUNC5_REG11,
+	DVBT_FUNC5_REG12,
+	DVBT_FUNC5_REG13,
+	DVBT_FUNC5_REG14,
+	DVBT_FUNC5_REG15,
+	DVBT_FUNC5_REG16,
+	DVBT_FUNC5_REG17,
+	DVBT_FUNC5_REG18,
+	DVBT_AD7_SETTING,
+	DVBT_RSSI_R,
+	DVBT_ACI_DET_IND,
+	DVBT_REG_MON,
+	DVBT_REG_MONSEL,
+	DVBT_REG_GPE,
+	DVBT_REG_GPO,
+	DVBT_REG_4MSEL,
+	DVBT_TEST_REG_1,
+	DVBT_TEST_REG_2,
+	DVBT_TEST_REG_3,
+	DVBT_TEST_REG_4,
+	DVBT_REG_BIT_NAME_ITEM_TERMINATOR,
+};
+
+#endif /* RTL2832_PRIV_H */
-- 
1.7.7.6


^ permalink raw reply related	[flat|nested] 104+ messages in thread

* [PATCH v5 2/5] rtl28xxu: support for the rtl2832 demod driver
  2012-05-18 18:47 ` [PATCH v5 " Thomas Mair
  2012-05-18 18:47   ` [PATCH v5 1/5] rtl2832 ver. 0.5: support for RTL2832 demod Thomas Mair
@ 2012-05-18 18:47   ` Thomas Mair
  2012-05-18 20:28     ` Antti Palosaari
  2012-05-18 18:47   ` [PATCH v5 3/5] rtl28xxu: renamed rtl2831_rd/rtl2831_wr to rtl28xx_rd/rtl28xx_wr Thomas Mair
                     ` (4 subsequent siblings)
  6 siblings, 1 reply; 104+ messages in thread
From: Thomas Mair @ 2012-05-18 18:47 UTC (permalink / raw)
  To: linux-media; +Cc: crope, pomidorabelisima, Thomas Mair

This only adds support for the Terratec Cinergy T Stick Black device.

Changes from previous patches:
- fixed compiler warnings
- added fc0013 tuner handling to this patch

Signed-off-by: Thomas Mair <thomas.mair86@googlemail.com>
---
 drivers/media/dvb/dvb-usb/Kconfig       |    3 +
 drivers/media/dvb/dvb-usb/dvb-usb-ids.h |    1 +
 drivers/media/dvb/dvb-usb/rtl28xxu.c    |  450 +++++++++++++++++++++++++++++--
 3 files changed, 429 insertions(+), 25 deletions(-)

diff --git a/drivers/media/dvb/dvb-usb/Kconfig b/drivers/media/dvb/dvb-usb/Kconfig
index be1db75..98dd0d8 100644
--- a/drivers/media/dvb/dvb-usb/Kconfig
+++ b/drivers/media/dvb/dvb-usb/Kconfig
@@ -417,9 +417,12 @@ config DVB_USB_RTL28XXU
 	tristate "Realtek RTL28xxU DVB USB support"
 	depends on DVB_USB && EXPERIMENTAL
 	select DVB_RTL2830
+	select DVB_RTL2832
 	select MEDIA_TUNER_QT1010 if !MEDIA_TUNER_CUSTOMISE
 	select MEDIA_TUNER_MT2060 if !MEDIA_TUNER_CUSTOMISE
 	select MEDIA_TUNER_MXL5005S if !MEDIA_TUNER_CUSTOMISE
+	select MEDIA_TUNER_FC0012 if !MEDIA_TUNER_CUSTOMISE
+	select MEDIA_TUNER_FC0013 if !MEDIA_TUNER_CUSTOMISE
 	help
 	  Say Y here to support the Realtek RTL28xxU DVB USB receiver.
 
diff --git a/drivers/media/dvb/dvb-usb/dvb-usb-ids.h b/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
index 7a6160b..cd9254c 100644
--- a/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
+++ b/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
@@ -160,6 +160,7 @@
 #define USB_PID_TERRATEC_CINERGY_T_STICK		0x0093
 #define USB_PID_TERRATEC_CINERGY_T_STICK_RC		0x0097
 #define USB_PID_TERRATEC_CINERGY_T_STICK_DUAL_RC	0x0099
+#define USB_PID_TERRATEC_CINERGY_T_STICK_BLACK_REV1	0x00a9
 #define USB_PID_TWINHAN_VP7041_COLD			0x3201
 #define USB_PID_TWINHAN_VP7041_WARM			0x3202
 #define USB_PID_TWINHAN_VP7020_COLD			0x3203
diff --git a/drivers/media/dvb/dvb-usb/rtl28xxu.c b/drivers/media/dvb/dvb-usb/rtl28xxu.c
index 4e69e9d..5285f3d 100644
--- a/drivers/media/dvb/dvb-usb/rtl28xxu.c
+++ b/drivers/media/dvb/dvb-usb/rtl28xxu.c
@@ -3,6 +3,7 @@
  *
  * Copyright (C) 2009 Antti Palosaari <crope@iki.fi>
  * Copyright (C) 2011 Antti Palosaari <crope@iki.fi>
+ * Copyright (C) 2012 Thomas Mair <thomas.mair86@googlemail.com>
  *
  *    This program is free software; you can redistribute it and/or modify
  *    it under the terms of the GNU General Public License as published by
@@ -22,10 +23,13 @@
 #include "rtl28xxu.h"
 
 #include "rtl2830.h"
+#include "rtl2832.h"
 
 #include "qt1010.h"
 #include "mt2060.h"
 #include "mxl5005s.h"
+#include "fc0012.h"
+#include "fc0013.h"
 
 /* debug */
 static int dvb_usb_rtl28xxu_debug;
@@ -378,34 +382,159 @@ err:
 	return ret;
 }
 
+static struct rtl2832_config rtl28xxu_rtl2832_fc0012_config = {
+	.i2c_addr = 0x10, /* 0x20 */
+	.xtal = 28800000,
+	.if_dvbt = 0,
+	.tuner = TUNER_RTL2832_FC0012
+};
+
+static struct rtl2832_config rtl28xxu_rtl2832_fc0013_config = {
+	.i2c_addr = 0x10, /* 0x20 */
+	.xtal = 28800000,
+	.if_dvbt = 0,
+	.tuner = TUNER_RTL2832_FC0013
+};
+
+static int rtl2832u_fc0012_tuner_callback(struct dvb_usb_device *d,
+		int cmd, int arg)
+{
+	int ret;
+	u8 val;
+
+	deb_info("%s cmd=%d arg=%d\n", __func__, cmd, arg);
+	switch (cmd) {
+	case FC_FE_CALLBACK_VHF_ENABLE:
+		/* set output values */
+		ret = rtl2831_rd_reg(d, SYS_GPIO_OUT_VAL, &val);
+		if (ret)
+			goto err;
+
+		if (arg)
+			val &= 0xbf; /* set GPIO6 low */
+		else
+			val |= 0x40; /* set GPIO6 high */
+
+
+		ret = rtl2831_wr_reg(d, SYS_GPIO_OUT_VAL, val);
+		if (ret)
+			goto err;
+		break;
+	default:
+		ret = -EINVAL;
+		goto err;
+	}
+	return 0;
+
+err:
+	err("%s: failed=%d\n", __func__, ret);
+
+	return ret;
+}
+
+
+static int rtl2832u_fc0013_tuner_callback(struct dvb_usb_device *d,
+		int cmd, int arg)
+{
+	/* TODO implement*/
+	return 0;
+}
+
+static int rtl2832u_tuner_callback(struct dvb_usb_device *d, int cmd, int arg)
+{
+	struct rtl28xxu_priv *priv = d->priv;
+
+	switch (priv->tuner) {
+	case TUNER_RTL2832_FC0012:
+		return rtl2832u_fc0012_tuner_callback(d, cmd, arg);
+
+	case TUNER_RTL2832_FC0013:
+		return rtl2832u_fc0013_tuner_callback(d, cmd, arg);
+	default:
+		break;
+	}
+
+	return -ENODEV;
+}
+
+static int rtl2832u_frontend_callback(void *adapter_priv, int component,
+				    int cmd, int arg)
+{
+	struct i2c_adapter *adap = adapter_priv;
+	struct dvb_usb_device *d = i2c_get_adapdata(adap);
+
+	switch (component) {
+	case DVB_FRONTEND_COMPONENT_TUNER:
+		return rtl2832u_tuner_callback(d, cmd, arg);
+	default:
+		break;
+	}
+
+	return -EINVAL;
+}
+
+
+
+
 static int rtl2832u_frontend_attach(struct dvb_usb_adapter *adap)
 {
 	int ret;
 	struct rtl28xxu_priv *priv = adap->dev->priv;
-	u8 buf[1];
+	struct rtl2832_config *rtl2832_config;
+
+	u8 buf[2], val;
 	/* open RTL2832U/RTL2832 I2C gate */
 	struct rtl28xxu_req req_gate_open = {0x0120, 0x0011, 0x0001, "\x18"};
 	/* close RTL2832U/RTL2832 I2C gate */
 	struct rtl28xxu_req req_gate_close = {0x0120, 0x0011, 0x0001, "\x10"};
+	/* for FC0012 tuner probe */
+	struct rtl28xxu_req req_fc0012 = {0x00c6, CMD_I2C_RD, 1, buf};
+	/* for FC0013 tuner probe */
+	struct rtl28xxu_req req_fc0013 = {0x00c6, CMD_I2C_RD, 1, buf};
+	/* for MT2266 tuner probe */
+	struct rtl28xxu_req req_mt2266 = {0x00c0, CMD_I2C_RD, 1, buf};
 	/* for FC2580 tuner probe */
 	struct rtl28xxu_req req_fc2580 = {0x01ac, CMD_I2C_RD, 1, buf};
+	/* for MT2063 tuner probe */
+	struct rtl28xxu_req req_mt2063 = {0x00c0, CMD_I2C_RD, 1, buf};
+	/* for MAX3543 tuner probe */
+	struct rtl28xxu_req req_max3543 = {0x00c0, CMD_I2C_RD, 1, buf};
+	/* for TUA9001 tuner probe */
+	struct rtl28xxu_req req_tua9001 = {0x7ec0, CMD_I2C_RD, 2, buf};
+	/* for MXL5007T tuner probe */
+	struct rtl28xxu_req req_mxl5007t = {0xd9c0, CMD_I2C_RD, 1, buf};
+	/* for E4000 tuner probe */
+	struct rtl28xxu_req req_e4000 = {0x02c8, CMD_I2C_RD, 1, buf};
+	/* for TDA18272 tuner probe */
+	struct rtl28xxu_req req_tda18272 = {0x00c0, CMD_I2C_RD, 2, buf};
 
 	deb_info("%s:\n", __func__);
 
-	/* GPIO direction */
-	ret = rtl2831_wr_reg(adap->dev, SYS_GPIO_DIR, 0x0a);
+
+	ret = rtl2831_rd_reg(adap->dev, SYS_GPIO_DIR, &val);
 	if (ret)
 		goto err;
 
-	/* enable as output GPIO0, GPIO2, GPIO4 */
-	ret = rtl2831_wr_reg(adap->dev, SYS_GPIO_OUT_EN, 0x15);
+	val &= 0xbf;
+
+	ret = rtl2831_wr_reg(adap->dev, SYS_GPIO_DIR, val);
 	if (ret)
 		goto err;
 
-	ret = rtl2831_wr_reg(adap->dev, SYS_DEMOD_CTL, 0xe8);
+
+	/* enable as output GPIO3 and GPIO6*/
+	ret = rtl2831_rd_reg(adap->dev, SYS_GPIO_OUT_EN, &val);
 	if (ret)
 		goto err;
 
+	val |= 0x48;
+
+	ret = rtl2831_wr_reg(adap->dev, SYS_GPIO_OUT_EN, val);
+	if (ret)
+		goto err;
+
+
+
 	/*
 	 * Probe used tuner. We need to know used tuner before demod attach
 	 * since there is some demod params needed to set according to tuner.
@@ -416,25 +545,108 @@ static int rtl2832u_frontend_attach(struct dvb_usb_adapter *adap)
 	if (ret)
 		goto err;
 
+	priv->tuner = TUNER_NONE;
+
+	/* check FC0012 ID register; reg=00 val=a1 */
+	ret = rtl28xxu_ctrl_msg(adap->dev, &req_fc0012);
+	if (ret == 0 && buf[0] == 0xa1) {
+		priv->tuner = TUNER_RTL2832_FC0012;
+		rtl2832_config = &rtl28xxu_rtl2832_fc0012_config;
+		info("%s: FC0012 tuner found", __func__);
+		goto found;
+	}
+
+	/* check FC0013 ID register; reg=00 val=a3 */
+	ret = rtl28xxu_ctrl_msg(adap->dev, &req_fc0013);
+	if (ret == 0 && buf[0] == 0xa3) {
+		priv->tuner = TUNER_RTL2832_FC0013;
+		rtl2832_config = &rtl28xxu_rtl2832_fc0013_config;
+		info("%s: FC0013 tuner found", __func__);
+		goto found;
+	}
+
+	/* check MT2266 ID register; reg=00 val=85 */
+	ret = rtl28xxu_ctrl_msg(adap->dev, &req_mt2266);
+	if (ret == 0 && buf[0] == 0x85) {
+		priv->tuner = TUNER_RTL2832_MT2266;
+		/* TODO implement tuner */
+		info("%s: MT2266 tuner found", __func__);
+		goto unsupported;
+	}
+
 	/* check FC2580 ID register; reg=01 val=56 */
 	ret = rtl28xxu_ctrl_msg(adap->dev, &req_fc2580);
 	if (ret == 0 && buf[0] == 0x56) {
 		priv->tuner = TUNER_RTL2832_FC2580;
-		deb_info("%s: FC2580\n", __func__);
-		goto found;
-	} else {
-		deb_info("%s: FC2580 probe failed=%d - %02x\n",
-			__func__, ret, buf[0]);
+		/* TODO implement tuner */
+		info("%s: FC2580 tuner found", __func__);
+		goto unsupported;
+	}
+
+	/* check MT2063 ID register; reg=00 val=9e || 9c */
+	ret = rtl28xxu_ctrl_msg(adap->dev, &req_mt2063);
+	if (ret == 0 && (buf[0] == 0x9e || buf[0] == 0x9c)) {
+		priv->tuner = TUNER_RTL2832_MT2063;
+		/* TODO implement tuner */
+		info("%s: MT2063 tuner found", __func__);
+		goto unsupported;
+	}
+
+	/* check MAX3543 ID register; reg=00 val=38 */
+	ret = rtl28xxu_ctrl_msg(adap->dev, &req_max3543);
+	if (ret == 0 && buf[0] == 0x38) {
+		priv->tuner = TUNER_RTL2832_MAX3543;
+		/* TODO implement tuner */
+		info("%s: MAX3534 tuner found", __func__);
+		goto unsupported;
 	}
 
+	/* check TUA9001 ID register; reg=7e val=2328 */
+	ret = rtl28xxu_ctrl_msg(adap->dev, &req_tua9001);
+	if (ret == 0 && buf[0] == 0x23 && buf[1] == 0x28) {
+		priv->tuner = TUNER_RTL2832_TUA9001;
+		/* TODO implement tuner */
+		info("%s: TUA9001 tuner found", __func__);
+		goto unsupported;
+	}
+
+	/* check MXL5007R ID register; reg=d9 val=14 */
+	ret = rtl28xxu_ctrl_msg(adap->dev, &req_mxl5007t);
+	if (ret == 0 && buf[0] == 0x14) {
+		priv->tuner = TUNER_RTL2832_MXL5007T;
+		/* TODO implement tuner */
+		info("%s: MXL5007T tuner found", __func__);
+		goto unsupported;
+	}
+
+	/* check E4000 ID register; reg=02 val=40 */
+	ret = rtl28xxu_ctrl_msg(adap->dev, &req_e4000);
+	if (ret == 0 && buf[0] == 0x40) {
+		priv->tuner = TUNER_RTL2832_E4000;
+		/* TODO implement tuner */
+		info("%s: E4000 tuner found", __func__);
+		goto unsupported;
+	}
+
+	/* check TDA18272 ID register; reg=00 val=c760  */
+	ret = rtl28xxu_ctrl_msg(adap->dev, &req_tda18272);
+	if (ret == 0 && (buf[0] == 0xc7 || buf[1] == 0x60)) {
+		priv->tuner = TUNER_RTL2832_TDA18272;
+		/* TODO implement tuner */
+		info("%s: TDA18272 tuner found", __func__);
+		goto unsupported;
+	}
+
+unsupported:
 	/* close demod I2C gate */
 	ret = rtl28xxu_ctrl_msg(adap->dev, &req_gate_close);
 	if (ret)
 		goto err;
 
 	/* tuner not found */
+	deb_info("No compatible tuner found");
 	ret = -ENODEV;
-	goto err;
+	return ret;
 
 found:
 	/* close demod I2C gate */
@@ -443,9 +655,18 @@ found:
 		goto err;
 
 	/* attach demodulator */
-	/* TODO: */
+	adap->fe_adap[0].fe = dvb_attach(rtl2832_attach, rtl2832_config,
+		&adap->dev->i2c_adap);
+		if (adap->fe_adap[0].fe == NULL) {
+			ret = -ENODEV;
+			goto err;
+		}
+
+	/* set fe callbacks */
+	adap->fe_adap[0].fe->callback = rtl2832u_frontend_callback;
 
 	return ret;
+
 err:
 	deb_info("%s: failed=%d\n", __func__, ret);
 	return ret;
@@ -528,10 +749,24 @@ static int rtl2832u_tuner_attach(struct dvb_usb_adapter *adap)
 	deb_info("%s:\n", __func__);
 
 	switch (priv->tuner) {
-	case TUNER_RTL2832_FC2580:
-		/* TODO: */
-		fe = NULL;
+	case TUNER_RTL2832_FC0012:
+		fe = dvb_attach(fc0012_attach, adap->fe_adap[0].fe,
+			&adap->dev->i2c_adap, 0xc6>>1, 0, FC_XTAL_28_8_MHZ);
+
+		/* since fc0012 includs reading the signal strength delegate
+		 * that to the tuner driver */
+		adap->fe_adap[0].fe->ops.read_signal_strength = adap->fe_adap[0].
+				fe->ops.tuner_ops.get_rf_strength;
+		return 0;
 		break;
+	case TUNER_RTL2832_FC0013:
+		fe = dvb_attach(fc0013_attach, adap->fe_adap[0].fe,
+			&adap->dev->i2c_adap, 0xc6>>1, 0, FC_XTAL_28_8_MHZ);
+
+		/* fc0013 also supports signal strength reading */
+		adap->fe_adap[0].fe->ops.read_signal_strength = adap->fe_adap[0]
+			.fe->ops.tuner_ops.get_rf_strength;
+		return 0;
 	default:
 		fe = NULL;
 		err("unknown tuner=%d", priv->tuner);
@@ -548,7 +783,7 @@ err:
 	return ret;
 }
 
-static int rtl28xxu_streaming_ctrl(struct dvb_usb_adapter *adap , int onoff)
+static int rtl2831u_streaming_ctrl(struct dvb_usb_adapter *adap , int onoff)
 {
 	int ret;
 	u8 buf[2], gpio;
@@ -583,7 +818,33 @@ err:
 	return ret;
 }
 
-static int rtl28xxu_power_ctrl(struct dvb_usb_device *d, int onoff)
+static int rtl2832u_streaming_ctrl(struct dvb_usb_adapter *adap , int onoff)
+{
+	int ret;
+	u8 buf[2];
+
+	deb_info("%s: onoff=%d\n", __func__, onoff);
+
+
+	if (onoff) {
+		buf[0] = 0x00;
+		buf[1] = 0x00;
+	} else {
+		buf[0] = 0x10; /* stall EPA */
+		buf[1] = 0x02; /* reset EPA */
+	}
+
+	ret = rtl2831_wr_regs(adap->dev, USB_EPA_CTL, buf, 2);
+	if (ret)
+		goto err;
+
+	return ret;
+err:
+	deb_info("%s: failed=%d\n", __func__, ret);
+	return ret;
+}
+
+static int rtl2831u_power_ctrl(struct dvb_usb_device *d, int onoff)
 {
 	int ret;
 	u8 gpio, sys0;
@@ -631,6 +892,128 @@ err:
 	return ret;
 }
 
+static int rtl2832u_power_ctrl(struct dvb_usb_device *d, int onoff)
+{
+	int ret;
+	u8 val;
+
+	deb_info("%s: onoff=%d\n", __func__, onoff);
+
+	if (onoff) {
+		/* set output values */
+		ret = rtl2831_rd_reg(d, SYS_GPIO_OUT_VAL, &val);
+		if (ret)
+			goto err;
+
+		val |= 0x08;
+		val &= 0xef;
+
+		ret = rtl2831_wr_reg(d, SYS_GPIO_OUT_VAL, val);
+		if (ret)
+			goto err;
+
+		/* demod_ctl_1 */
+		ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL1, &val);
+		if (ret)
+			goto err;
+
+		val &= 0xef;
+
+		ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL1, val);
+		if (ret)
+			goto err;
+
+		/* demod control */
+		/* PLL enable */
+		ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL, &val);
+		if (ret)
+			goto err;
+
+		/* bit 7 to 1 */
+		val |= 0x80;
+
+		ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL, val);
+		if (ret)
+			goto err;
+
+		/* demod HW reset */
+		ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL, &val);
+		if (ret)
+			goto err;
+		/* bit 5 to 0 */
+		val &= 0xdf;
+
+		ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL, val);
+		if (ret)
+			goto err;
+
+		ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL, &val);
+		if (ret)
+			goto err;
+
+		val |= 0x20;
+
+		ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL, val);
+		if (ret)
+			goto err;
+
+		mdelay(5);
+
+		/*enable ADC_Q and ADC_I */
+		ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL, &val);
+		if (ret)
+			goto err;
+
+		val |= 0x48;
+
+		ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL, val);
+		if (ret)
+			goto err;
+
+
+	} else {
+		/* demod_ctl_1 */
+		ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL1, &val);
+		if (ret)
+			goto err;
+
+		val |= 0x0c;
+
+		ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL1, val);
+		if (ret)
+			goto err;
+
+		/* set output values */
+		ret = rtl2831_rd_reg(d, SYS_GPIO_OUT_VAL, &val);
+		if (ret)
+				goto err;
+
+		val |= 0x10;
+
+		ret = rtl2831_wr_reg(d, SYS_GPIO_OUT_VAL, val);
+		if (ret)
+			goto err;
+
+		/* demod control */
+		ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL, &val);
+		if (ret)
+			goto err;
+
+		val &= 0x37;
+
+		ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL, val);
+		if (ret)
+			goto err;
+
+	}
+
+	return ret;
+err:
+	deb_info("%s: failed=%d\n", __func__, ret);
+	return ret;
+}
+
+
 static int rtl2831u_rc_query(struct dvb_usb_device *d)
 {
 	int ret, i;
@@ -768,6 +1151,7 @@ enum rtl28xxu_usb_table_entry {
 	RTL2831U_0BDA_2831,
 	RTL2831U_14AA_0160,
 	RTL2831U_14AA_0161,
+	RTL2832U_0CCD_00A9,
 };
 
 static struct usb_device_id rtl28xxu_table[] = {
@@ -780,6 +1164,8 @@ static struct usb_device_id rtl28xxu_table[] = {
 		USB_DEVICE(USB_VID_WIDEVIEW, USB_PID_FREECOM_DVBT_2)},
 
 	/* RTL2832U */
+	[RTL2832U_0CCD_00A9] = {
+		USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_T_STICK_BLACK_REV1)},
 	{} /* terminating entry */
 };
 
@@ -802,7 +1188,7 @@ static struct dvb_usb_device_properties rtl28xxu_properties[] = {
 					{
 						.frontend_attach = rtl2831u_frontend_attach,
 						.tuner_attach    = rtl2831u_tuner_attach,
-						.streaming_ctrl  = rtl28xxu_streaming_ctrl,
+						.streaming_ctrl  = rtl2831u_streaming_ctrl,
 						.stream = {
 							.type = USB_BULK,
 							.count = 6,
@@ -818,7 +1204,7 @@ static struct dvb_usb_device_properties rtl28xxu_properties[] = {
 			}
 		},
 
-		.power_ctrl = rtl28xxu_power_ctrl,
+		.power_ctrl = rtl2831u_power_ctrl,
 
 		.rc.core = {
 			.protocol       = RC_TYPE_NEC,
@@ -864,7 +1250,7 @@ static struct dvb_usb_device_properties rtl28xxu_properties[] = {
 					{
 						.frontend_attach = rtl2832u_frontend_attach,
 						.tuner_attach    = rtl2832u_tuner_attach,
-						.streaming_ctrl  = rtl28xxu_streaming_ctrl,
+						.streaming_ctrl  = rtl2832u_streaming_ctrl,
 						.stream = {
 							.type = USB_BULK,
 							.count = 6,
@@ -880,7 +1266,7 @@ static struct dvb_usb_device_properties rtl28xxu_properties[] = {
 			}
 		},
 
-		.power_ctrl = rtl28xxu_power_ctrl,
+		.power_ctrl = rtl2832u_power_ctrl,
 
 		.rc.core = {
 			.protocol       = RC_TYPE_NEC,
@@ -893,10 +1279,13 @@ static struct dvb_usb_device_properties rtl28xxu_properties[] = {
 
 		.i2c_algo = &rtl28xxu_i2c_algo,
 
-		.num_device_descs = 0, /* disabled as no support for RTL2832 */
+		.num_device_descs = 1,
 		.devices = {
 			{
-				.name = "Realtek RTL2832U reference design",
+				.name = "Terratec Cinergy T Stick Black",
+				.warm_ids = {
+					&rtl28xxu_table[RTL2832U_0CCD_00A9],
+				},
 			},
 		}
 	},
@@ -907,6 +1296,7 @@ static int rtl28xxu_probe(struct usb_interface *intf,
 		const struct usb_device_id *id)
 {
 	int ret, i;
+	u8 val;
 	int properties_count = ARRAY_SIZE(rtl28xxu_properties);
 	struct dvb_usb_device *d;
 	struct usb_device *udev;
@@ -951,15 +1341,24 @@ static int rtl28xxu_probe(struct usb_interface *intf,
 	if (ret)
 		goto err;
 
+
 	/* init USB endpoints */
-	ret = rtl2831_wr_reg(d, USB_SYSCTL_0, 0x09);
+	ret = rtl2831_rd_reg(d, USB_SYSCTL_0, &val);
+	if (ret)
+			goto err;
+
+	/* enable DMA and Full Packet Mode*/
+	val |= 0x09;
+	ret = rtl2831_wr_reg(d, USB_SYSCTL_0, val);
 	if (ret)
 		goto err;
 
+	/* set EPA maximum packet size to 0x0200 */
 	ret = rtl2831_wr_regs(d, USB_EPA_MAXPKT, "\x00\x02\x00\x00", 4);
 	if (ret)
 		goto err;
 
+	/* change EPA FIFO length */
 	ret = rtl2831_wr_regs(d, USB_EPA_FIFO_CFG, "\x14\x00\x00\x00", 4);
 	if (ret)
 		goto err;
@@ -1004,4 +1403,5 @@ module_exit(rtl28xxu_module_exit);
 
 MODULE_DESCRIPTION("Realtek RTL28xxU DVB USB driver");
 MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");
+MODULE_AUTHOR("Thomas Mair <thomas.mair86@googlemail.com>");
 MODULE_LICENSE("GPL");
-- 
1.7.7.6


^ permalink raw reply related	[flat|nested] 104+ messages in thread

* [PATCH v5 3/5] rtl28xxu: renamed rtl2831_rd/rtl2831_wr to rtl28xx_rd/rtl28xx_wr
  2012-05-18 18:47 ` [PATCH v5 " Thomas Mair
  2012-05-18 18:47   ` [PATCH v5 1/5] rtl2832 ver. 0.5: support for RTL2832 demod Thomas Mair
  2012-05-18 18:47   ` [PATCH v5 2/5] rtl28xxu: support for the rtl2832 demod driver Thomas Mair
@ 2012-05-18 18:47   ` Thomas Mair
  2012-05-18 20:30     ` Antti Palosaari
  2012-05-18 18:47   ` [PATCH v5 4/5] rtl28xxu: support Delock USB 2.0 DVB-T Thomas Mair
                     ` (3 subsequent siblings)
  6 siblings, 1 reply; 104+ messages in thread
From: Thomas Mair @ 2012-05-18 18:47 UTC (permalink / raw)
  To: linux-media; +Cc: crope, pomidorabelisima, Thomas Mair

Signed-off-by: Thomas Mair <thomas.mair86@googlemail.com>
---
 drivers/media/dvb/dvb-usb/rtl28xxu.c |  102 +++++++++++++++++-----------------
 1 files changed, 51 insertions(+), 51 deletions(-)

diff --git a/drivers/media/dvb/dvb-usb/rtl28xxu.c b/drivers/media/dvb/dvb-usb/rtl28xxu.c
index 5285f3d..5586715 100644
--- a/drivers/media/dvb/dvb-usb/rtl28xxu.c
+++ b/drivers/media/dvb/dvb-usb/rtl28xxu.c
@@ -84,7 +84,7 @@ err:
 	return ret;
 }
 
-static int rtl2831_wr_regs(struct dvb_usb_device *d, u16 reg, u8 *val, int len)
+static int rtl28xx_wr_regs(struct dvb_usb_device *d, u16 reg, u8 *val, int len)
 {
 	struct rtl28xxu_req req;
 
@@ -120,12 +120,12 @@ static int rtl2831_rd_regs(struct dvb_usb_device *d, u16 reg, u8 *val, int len)
 	return rtl28xxu_ctrl_msg(d, &req);
 }
 
-static int rtl2831_wr_reg(struct dvb_usb_device *d, u16 reg, u8 val)
+static int rtl28xx_wr_reg(struct dvb_usb_device *d, u16 reg, u8 val)
 {
-	return rtl2831_wr_regs(d, reg, &val, 1);
+	return rtl28xx_wr_regs(d, reg, &val, 1);
 }
 
-static int rtl2831_rd_reg(struct dvb_usb_device *d, u16 reg, u8 *val)
+static int rtl28xx_rd_reg(struct dvb_usb_device *d, u16 reg, u8 *val)
 {
 	return rtl2831_rd_regs(d, reg, val, 1);
 }
@@ -312,12 +312,12 @@ static int rtl2831u_frontend_attach(struct dvb_usb_adapter *adap)
 	 */
 
 	/* GPIO direction */
-	ret = rtl2831_wr_reg(adap->dev, SYS_GPIO_DIR, 0x0a);
+	ret = rtl28xx_wr_reg(adap->dev, SYS_GPIO_DIR, 0x0a);
 	if (ret)
 		goto err;
 
 	/* enable as output GPIO0, GPIO2, GPIO4 */
-	ret = rtl2831_wr_reg(adap->dev, SYS_GPIO_OUT_EN, 0x15);
+	ret = rtl28xx_wr_reg(adap->dev, SYS_GPIO_OUT_EN, 0x15);
 	if (ret)
 		goto err;
 
@@ -406,7 +406,7 @@ static int rtl2832u_fc0012_tuner_callback(struct dvb_usb_device *d,
 	switch (cmd) {
 	case FC_FE_CALLBACK_VHF_ENABLE:
 		/* set output values */
-		ret = rtl2831_rd_reg(d, SYS_GPIO_OUT_VAL, &val);
+		ret = rtl28xx_rd_reg(d, SYS_GPIO_OUT_VAL, &val);
 		if (ret)
 			goto err;
 
@@ -416,7 +416,7 @@ static int rtl2832u_fc0012_tuner_callback(struct dvb_usb_device *d,
 			val |= 0x40; /* set GPIO6 high */
 
 
-		ret = rtl2831_wr_reg(d, SYS_GPIO_OUT_VAL, val);
+		ret = rtl28xx_wr_reg(d, SYS_GPIO_OUT_VAL, val);
 		if (ret)
 			goto err;
 		break;
@@ -511,25 +511,25 @@ static int rtl2832u_frontend_attach(struct dvb_usb_adapter *adap)
 	deb_info("%s:\n", __func__);
 
 
-	ret = rtl2831_rd_reg(adap->dev, SYS_GPIO_DIR, &val);
+	ret = rtl28xx_rd_reg(adap->dev, SYS_GPIO_DIR, &val);
 	if (ret)
 		goto err;
 
 	val &= 0xbf;
 
-	ret = rtl2831_wr_reg(adap->dev, SYS_GPIO_DIR, val);
+	ret = rtl28xx_wr_reg(adap->dev, SYS_GPIO_DIR, val);
 	if (ret)
 		goto err;
 
 
 	/* enable as output GPIO3 and GPIO6*/
-	ret = rtl2831_rd_reg(adap->dev, SYS_GPIO_OUT_EN, &val);
+	ret = rtl28xx_rd_reg(adap->dev, SYS_GPIO_OUT_EN, &val);
 	if (ret)
 		goto err;
 
 	val |= 0x48;
 
-	ret = rtl2831_wr_reg(adap->dev, SYS_GPIO_OUT_EN, val);
+	ret = rtl28xx_wr_reg(adap->dev, SYS_GPIO_OUT_EN, val);
 	if (ret)
 		goto err;
 
@@ -790,7 +790,7 @@ static int rtl2831u_streaming_ctrl(struct dvb_usb_adapter *adap , int onoff)
 
 	deb_info("%s: onoff=%d\n", __func__, onoff);
 
-	ret = rtl2831_rd_reg(adap->dev, SYS_GPIO_OUT_VAL, &gpio);
+	ret = rtl28xx_rd_reg(adap->dev, SYS_GPIO_OUT_VAL, &gpio);
 	if (ret)
 		goto err;
 
@@ -804,11 +804,11 @@ static int rtl2831u_streaming_ctrl(struct dvb_usb_adapter *adap , int onoff)
 		gpio &= (~0x04); /* LED off */
 	}
 
-	ret = rtl2831_wr_reg(adap->dev, SYS_GPIO_OUT_VAL, gpio);
+	ret = rtl28xx_wr_reg(adap->dev, SYS_GPIO_OUT_VAL, gpio);
 	if (ret)
 		goto err;
 
-	ret = rtl2831_wr_regs(adap->dev, USB_EPA_CTL, buf, 2);
+	ret = rtl28xx_wr_regs(adap->dev, USB_EPA_CTL, buf, 2);
 	if (ret)
 		goto err;
 
@@ -834,7 +834,7 @@ static int rtl2832u_streaming_ctrl(struct dvb_usb_adapter *adap , int onoff)
 		buf[1] = 0x02; /* reset EPA */
 	}
 
-	ret = rtl2831_wr_regs(adap->dev, USB_EPA_CTL, buf, 2);
+	ret = rtl28xx_wr_regs(adap->dev, USB_EPA_CTL, buf, 2);
 	if (ret)
 		goto err;
 
@@ -852,12 +852,12 @@ static int rtl2831u_power_ctrl(struct dvb_usb_device *d, int onoff)
 	deb_info("%s: onoff=%d\n", __func__, onoff);
 
 	/* demod adc */
-	ret = rtl2831_rd_reg(d, SYS_SYS0, &sys0);
+	ret = rtl28xx_rd_reg(d, SYS_SYS0, &sys0);
 	if (ret)
 		goto err;
 
 	/* tuner power, read GPIOs */
-	ret = rtl2831_rd_reg(d, SYS_GPIO_OUT_VAL, &gpio);
+	ret = rtl28xx_rd_reg(d, SYS_GPIO_OUT_VAL, &gpio);
 	if (ret)
 		goto err;
 
@@ -877,12 +877,12 @@ static int rtl2831u_power_ctrl(struct dvb_usb_device *d, int onoff)
 	deb_info("%s: WR SYS0=%02x GPIO_OUT_VAL=%02x\n", __func__, sys0, gpio);
 
 	/* demod adc */
-	ret = rtl2831_wr_reg(d, SYS_SYS0, sys0);
+	ret = rtl28xx_wr_reg(d, SYS_SYS0, sys0);
 	if (ret)
 		goto err;
 
 	/* tuner power, write GPIOs */
-	ret = rtl2831_wr_reg(d, SYS_GPIO_OUT_VAL, gpio);
+	ret = rtl28xx_wr_reg(d, SYS_GPIO_OUT_VAL, gpio);
 	if (ret)
 		goto err;
 
@@ -901,107 +901,107 @@ static int rtl2832u_power_ctrl(struct dvb_usb_device *d, int onoff)
 
 	if (onoff) {
 		/* set output values */
-		ret = rtl2831_rd_reg(d, SYS_GPIO_OUT_VAL, &val);
+		ret = rtl28xx_rd_reg(d, SYS_GPIO_OUT_VAL, &val);
 		if (ret)
 			goto err;
 
 		val |= 0x08;
 		val &= 0xef;
 
-		ret = rtl2831_wr_reg(d, SYS_GPIO_OUT_VAL, val);
+		ret = rtl28xx_wr_reg(d, SYS_GPIO_OUT_VAL, val);
 		if (ret)
 			goto err;
 
 		/* demod_ctl_1 */
-		ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL1, &val);
+		ret = rtl28xx_rd_reg(d, SYS_DEMOD_CTL1, &val);
 		if (ret)
 			goto err;
 
 		val &= 0xef;
 
-		ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL1, val);
+		ret = rtl28xx_wr_reg(d, SYS_DEMOD_CTL1, val);
 		if (ret)
 			goto err;
 
 		/* demod control */
 		/* PLL enable */
-		ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL, &val);
+		ret = rtl28xx_rd_reg(d, SYS_DEMOD_CTL, &val);
 		if (ret)
 			goto err;
 
 		/* bit 7 to 1 */
 		val |= 0x80;
 
-		ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL, val);
+		ret = rtl28xx_wr_reg(d, SYS_DEMOD_CTL, val);
 		if (ret)
 			goto err;
 
 		/* demod HW reset */
-		ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL, &val);
+		ret = rtl28xx_rd_reg(d, SYS_DEMOD_CTL, &val);
 		if (ret)
 			goto err;
 		/* bit 5 to 0 */
 		val &= 0xdf;
 
-		ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL, val);
+		ret = rtl28xx_wr_reg(d, SYS_DEMOD_CTL, val);
 		if (ret)
 			goto err;
 
-		ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL, &val);
+		ret = rtl28xx_rd_reg(d, SYS_DEMOD_CTL, &val);
 		if (ret)
 			goto err;
 
 		val |= 0x20;
 
-		ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL, val);
+		ret = rtl28xx_wr_reg(d, SYS_DEMOD_CTL, val);
 		if (ret)
 			goto err;
 
 		mdelay(5);
 
 		/*enable ADC_Q and ADC_I */
-		ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL, &val);
+		ret = rtl28xx_rd_reg(d, SYS_DEMOD_CTL, &val);
 		if (ret)
 			goto err;
 
 		val |= 0x48;
 
-		ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL, val);
+		ret = rtl28xx_wr_reg(d, SYS_DEMOD_CTL, val);
 		if (ret)
 			goto err;
 
 
 	} else {
 		/* demod_ctl_1 */
-		ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL1, &val);
+		ret = rtl28xx_rd_reg(d, SYS_DEMOD_CTL1, &val);
 		if (ret)
 			goto err;
 
 		val |= 0x0c;
 
-		ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL1, val);
+		ret = rtl28xx_wr_reg(d, SYS_DEMOD_CTL1, val);
 		if (ret)
 			goto err;
 
 		/* set output values */
-		ret = rtl2831_rd_reg(d, SYS_GPIO_OUT_VAL, &val);
+		ret = rtl28xx_rd_reg(d, SYS_GPIO_OUT_VAL, &val);
 		if (ret)
 				goto err;
 
 		val |= 0x10;
 
-		ret = rtl2831_wr_reg(d, SYS_GPIO_OUT_VAL, val);
+		ret = rtl28xx_wr_reg(d, SYS_GPIO_OUT_VAL, val);
 		if (ret)
 			goto err;
 
 		/* demod control */
-		ret = rtl2831_rd_reg(d, SYS_DEMOD_CTL, &val);
+		ret = rtl28xx_rd_reg(d, SYS_DEMOD_CTL, &val);
 		if (ret)
 			goto err;
 
 		val &= 0x37;
 
-		ret = rtl2831_wr_reg(d, SYS_DEMOD_CTL, val);
+		ret = rtl28xx_wr_reg(d, SYS_DEMOD_CTL, val);
 		if (ret)
 			goto err;
 
@@ -1040,7 +1040,7 @@ static int rtl2831u_rc_query(struct dvb_usb_device *d)
 	/* init remote controller */
 	if (!priv->rc_active) {
 		for (i = 0; i < ARRAY_SIZE(rc_nec_tab); i++) {
-			ret = rtl2831_wr_reg(d, rc_nec_tab[i].reg,
+			ret = rtl28xx_wr_reg(d, rc_nec_tab[i].reg,
 					rc_nec_tab[i].val);
 			if (ret)
 				goto err;
@@ -1070,12 +1070,12 @@ static int rtl2831u_rc_query(struct dvb_usb_device *d)
 
 		rc_keydown(d->rc_dev, rc_code, 0);
 
-		ret = rtl2831_wr_reg(d, SYS_IRRC_SR, 1);
+		ret = rtl28xx_wr_reg(d, SYS_IRRC_SR, 1);
 		if (ret)
 			goto err;
 
 		/* repeated intentionally to avoid extra keypress */
-		ret = rtl2831_wr_reg(d, SYS_IRRC_SR, 1);
+		ret = rtl28xx_wr_reg(d, SYS_IRRC_SR, 1);
 		if (ret)
 			goto err;
 	}
@@ -1112,7 +1112,7 @@ static int rtl2832u_rc_query(struct dvb_usb_device *d)
 	/* init remote controller */
 	if (!priv->rc_active) {
 		for (i = 0; i < ARRAY_SIZE(rc_nec_tab); i++) {
-			ret = rtl2831_wr_reg(d, rc_nec_tab[i].reg,
+			ret = rtl28xx_wr_reg(d, rc_nec_tab[i].reg,
 					rc_nec_tab[i].val);
 			if (ret)
 				goto err;
@@ -1120,14 +1120,14 @@ static int rtl2832u_rc_query(struct dvb_usb_device *d)
 		priv->rc_active = true;
 	}
 
-	ret = rtl2831_rd_reg(d, IR_RX_IF, &buf[0]);
+	ret = rtl28xx_rd_reg(d, IR_RX_IF, &buf[0]);
 	if (ret)
 		goto err;
 
 	if (buf[0] != 0x83)
 		goto exit;
 
-	ret = rtl2831_rd_reg(d, IR_RX_BC, &buf[0]);
+	ret = rtl28xx_rd_reg(d, IR_RX_BC, &buf[0]);
 	if (ret)
 		goto err;
 
@@ -1136,9 +1136,9 @@ static int rtl2832u_rc_query(struct dvb_usb_device *d)
 
 	/* TODO: pass raw IR to Kernel IR decoder */
 
-	ret = rtl2831_wr_reg(d, IR_RX_IF, 0x03);
-	ret = rtl2831_wr_reg(d, IR_RX_BUF_CTRL, 0x80);
-	ret = rtl2831_wr_reg(d, IR_RX_CTRL, 0x80);
+	ret = rtl28xx_wr_reg(d, IR_RX_IF, 0x03);
+	ret = rtl28xx_wr_reg(d, IR_RX_BUF_CTRL, 0x80);
+	ret = rtl28xx_wr_reg(d, IR_RX_CTRL, 0x80);
 
 exit:
 	return ret;
@@ -1343,23 +1343,23 @@ static int rtl28xxu_probe(struct usb_interface *intf,
 
 
 	/* init USB endpoints */
-	ret = rtl2831_rd_reg(d, USB_SYSCTL_0, &val);
+	ret = rtl28xx_rd_reg(d, USB_SYSCTL_0, &val);
 	if (ret)
 			goto err;
 
 	/* enable DMA and Full Packet Mode*/
 	val |= 0x09;
-	ret = rtl2831_wr_reg(d, USB_SYSCTL_0, val);
+	ret = rtl28xx_wr_reg(d, USB_SYSCTL_0, val);
 	if (ret)
 		goto err;
 
 	/* set EPA maximum packet size to 0x0200 */
-	ret = rtl2831_wr_regs(d, USB_EPA_MAXPKT, "\x00\x02\x00\x00", 4);
+	ret = rtl28xx_wr_regs(d, USB_EPA_MAXPKT, "\x00\x02\x00\x00", 4);
 	if (ret)
 		goto err;
 
 	/* change EPA FIFO length */
-	ret = rtl2831_wr_regs(d, USB_EPA_FIFO_CFG, "\x14\x00\x00\x00", 4);
+	ret = rtl28xx_wr_regs(d, USB_EPA_FIFO_CFG, "\x14\x00\x00\x00", 4);
 	if (ret)
 		goto err;
 
-- 
1.7.7.6


^ permalink raw reply related	[flat|nested] 104+ messages in thread

* [PATCH v5 4/5] rtl28xxu: support Delock USB 2.0 DVB-T
  2012-05-18 18:47 ` [PATCH v5 " Thomas Mair
                     ` (2 preceding siblings ...)
  2012-05-18 18:47   ` [PATCH v5 3/5] rtl28xxu: renamed rtl2831_rd/rtl2831_wr to rtl28xx_rd/rtl28xx_wr Thomas Mair
@ 2012-05-18 18:47   ` Thomas Mair
  2012-05-18 20:31     ` Antti Palosaari
  2012-05-18 18:47   ` [PATCH v5 5/5] rtl28xxu: support Terratec Noxon DAB/DAB+ stick Thomas Mair
                     ` (2 subsequent siblings)
  6 siblings, 1 reply; 104+ messages in thread
From: Thomas Mair @ 2012-05-18 18:47 UTC (permalink / raw)
  To: linux-media; +Cc: crope, pomidorabelisima, Thomas Mair

Signed-off-by: Thomas Mair <thomas.mair86@googlemail.com>
---
 drivers/media/dvb/dvb-usb/dvb-usb-ids.h |    1 +
 drivers/media/dvb/dvb-usb/rtl28xxu.c    |   11 ++++++++++-
 2 files changed, 11 insertions(+), 1 deletions(-)

diff --git a/drivers/media/dvb/dvb-usb/dvb-usb-ids.h b/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
index cd9254c..360f6b7 100644
--- a/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
+++ b/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
@@ -100,6 +100,7 @@
 #define USB_PID_CONCEPTRONIC_CTVDIGRCU			0xe397
 #define USB_PID_CONEXANT_D680_DMB			0x86d6
 #define USB_PID_CREATIX_CTX1921				0x1921
+#define USB_PID_DELOCK_USB2_DVBT			0xb803
 #define USB_PID_DIBCOM_HOOK_DEFAULT			0x0064
 #define USB_PID_DIBCOM_HOOK_DEFAULT_REENUM		0x0065
 #define USB_PID_DIBCOM_MOD3000_COLD			0x0bb8
diff --git a/drivers/media/dvb/dvb-usb/rtl28xxu.c b/drivers/media/dvb/dvb-usb/rtl28xxu.c
index 5586715..b2c8f67 100644
--- a/drivers/media/dvb/dvb-usb/rtl28xxu.c
+++ b/drivers/media/dvb/dvb-usb/rtl28xxu.c
@@ -1152,6 +1152,7 @@ enum rtl28xxu_usb_table_entry {
 	RTL2831U_14AA_0160,
 	RTL2831U_14AA_0161,
 	RTL2832U_0CCD_00A9,
+	RTL2832U_1F4D_B803,
 };
 
 static struct usb_device_id rtl28xxu_table[] = {
@@ -1166,6 +1167,8 @@ static struct usb_device_id rtl28xxu_table[] = {
 	/* RTL2832U */
 	[RTL2832U_0CCD_00A9] = {
 		USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_T_STICK_BLACK_REV1)},
+	[RTL2832U_1F4D_B803] = {
+		USB_DEVICE(USB_VID_GTEK, USB_PID_DELOCK_USB2_DVBT)},
 	{} /* terminating entry */
 };
 
@@ -1279,7 +1282,7 @@ static struct dvb_usb_device_properties rtl28xxu_properties[] = {
 
 		.i2c_algo = &rtl28xxu_i2c_algo,
 
-		.num_device_descs = 1,
+		.num_device_descs = 2,
 		.devices = {
 			{
 				.name = "Terratec Cinergy T Stick Black",
@@ -1287,6 +1290,12 @@ static struct dvb_usb_device_properties rtl28xxu_properties[] = {
 					&rtl28xxu_table[RTL2832U_0CCD_00A9],
 				},
 			},
+			{
+				.name = "G-Tek Electronics Group Lifeview LV5TDLX DVB-T",
+				.warm_ids = {
+					&rtl28xxu_table[RTL2832U_1F4D_B803],
+				},
+			},
 		}
 	},
 
-- 
1.7.7.6


^ permalink raw reply related	[flat|nested] 104+ messages in thread

* [PATCH v5 5/5] rtl28xxu: support Terratec Noxon DAB/DAB+ stick
  2012-05-18 18:47 ` [PATCH v5 " Thomas Mair
                     ` (3 preceding siblings ...)
  2012-05-18 18:47   ` [PATCH v5 4/5] rtl28xxu: support Delock USB 2.0 DVB-T Thomas Mair
@ 2012-05-18 18:47   ` Thomas Mair
  2012-05-18 20:32     ` Antti Palosaari
  2012-05-18 20:47   ` [PATCH v5 0/5] support for rtl2832 Antti Palosaari
  2012-05-18 23:39   ` poma
  6 siblings, 1 reply; 104+ messages in thread
From: Thomas Mair @ 2012-05-18 18:47 UTC (permalink / raw)
  To: linux-media; +Cc: crope, pomidorabelisima, Thomas Mair, Hans-Frieder Vogt

Signed-off-by: Hans-Frieder Vogt <hfvogt@gmx.net>
Signed-off-by: Thomas Mair <thomas.mair86@googlemail.com>
---
 drivers/media/dvb/dvb-usb/dvb-usb-ids.h |    1 +
 drivers/media/dvb/dvb-usb/rtl28xxu.c    |   11 ++++++++++-
 2 files changed, 11 insertions(+), 1 deletions(-)

diff --git a/drivers/media/dvb/dvb-usb/dvb-usb-ids.h b/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
index 360f6b7..26c4481 100644
--- a/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
+++ b/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
@@ -247,6 +247,7 @@
 #define USB_PID_TERRATEC_H7_2				0x10a3
 #define USB_PID_TERRATEC_T3				0x10a0
 #define USB_PID_TERRATEC_T5				0x10a1
+#define USB_PID_NOXON_DAB_STICK				0x00b3
 #define USB_PID_PINNACLE_EXPRESSCARD_320CX		0x022e
 #define USB_PID_PINNACLE_PCTV2000E			0x022c
 #define USB_PID_PINNACLE_PCTV_DVB_T_FLASH		0x0228
diff --git a/drivers/media/dvb/dvb-usb/rtl28xxu.c b/drivers/media/dvb/dvb-usb/rtl28xxu.c
index b2c8f67..0cac6fb 100644
--- a/drivers/media/dvb/dvb-usb/rtl28xxu.c
+++ b/drivers/media/dvb/dvb-usb/rtl28xxu.c
@@ -1153,6 +1153,7 @@ enum rtl28xxu_usb_table_entry {
 	RTL2831U_14AA_0161,
 	RTL2832U_0CCD_00A9,
 	RTL2832U_1F4D_B803,
+	RTL2832U_0CCD_00B3,
 };
 
 static struct usb_device_id rtl28xxu_table[] = {
@@ -1169,6 +1170,8 @@ static struct usb_device_id rtl28xxu_table[] = {
 		USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_T_STICK_BLACK_REV1)},
 	[RTL2832U_1F4D_B803] = {
 		USB_DEVICE(USB_VID_GTEK, USB_PID_DELOCK_USB2_DVBT)},
+	[RTL2832U_0CCD_00B3] = {
+		USB_DEVICE(USB_VID_TERRATEC, USB_PID_NOXON_DAB_STICK)},
 	{} /* terminating entry */
 };
 
@@ -1282,7 +1285,7 @@ static struct dvb_usb_device_properties rtl28xxu_properties[] = {
 
 		.i2c_algo = &rtl28xxu_i2c_algo,
 
-		.num_device_descs = 2,
+		.num_device_descs = 3,
 		.devices = {
 			{
 				.name = "Terratec Cinergy T Stick Black",
@@ -1296,6 +1299,12 @@ static struct dvb_usb_device_properties rtl28xxu_properties[] = {
 					&rtl28xxu_table[RTL2832U_1F4D_B803],
 				},
 			},
+			{
+				.name = "NOXON DAB/DAB+ USB dongle",
+				.warm_ids = {
+					&rtl28xxu_table[RTL2832U_0CCD_00B3],
+				},
+			},
 		}
 	},
 
-- 
1.7.7.6


^ permalink raw reply related	[flat|nested] 104+ messages in thread

* Re: [PATCH v5 1/5] rtl2832 ver. 0.5: support for RTL2832 demod
  2012-05-18 18:47   ` [PATCH v5 1/5] rtl2832 ver. 0.5: support for RTL2832 demod Thomas Mair
@ 2012-05-18 20:21     ` Antti Palosaari
  2012-07-05 14:32     ` Mauro Carvalho Chehab
  1 sibling, 0 replies; 104+ messages in thread
From: Antti Palosaari @ 2012-05-18 20:21 UTC (permalink / raw)
  To: Thomas Mair; +Cc: linux-media, pomidorabelisima

On 18.05.2012 21:47, Thomas Mair wrote:
> Changelog for ver. 0.5:
> - fixed code style and naming errors
>
> Changelog for ver. 0.4:
> - removed statistics as their calculation was wrong
> - fixed bug in Makefile
> - indentation and code style improvements
>
> Signed-off-by: Thomas Mair<thomas.mair86@googlemail.com>

Reviewed-by: Antti Palosaari <crope@iki.fi>

Seems to be correct!

regards
Antti
-- 
http://palosaari.fi/

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [PATCH v5 2/5] rtl28xxu: support for the rtl2832 demod driver
  2012-05-18 18:47   ` [PATCH v5 2/5] rtl28xxu: support for the rtl2832 demod driver Thomas Mair
@ 2012-05-18 20:28     ` Antti Palosaari
  0 siblings, 0 replies; 104+ messages in thread
From: Antti Palosaari @ 2012-05-18 20:28 UTC (permalink / raw)
  To: Thomas Mair; +Cc: linux-media, pomidorabelisima

On 18.05.2012 21:47, Thomas Mair wrote:
> This only adds support for the Terratec Cinergy T Stick Black device.
>
> Changes from previous patches:
> - fixed compiler warnings
> - added fc0013 tuner handling to this patch
>
> Signed-off-by: Thomas Mair<thomas.mair86@googlemail.com>


Acked-by: Antti Palosaari <crope@iki.fi>
Reviewed-by: Antti Palosaari <crope@iki.fi>


Antti
-- 
http://palosaari.fi/

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [PATCH v5 3/5] rtl28xxu: renamed rtl2831_rd/rtl2831_wr to rtl28xx_rd/rtl28xx_wr
  2012-05-18 18:47   ` [PATCH v5 3/5] rtl28xxu: renamed rtl2831_rd/rtl2831_wr to rtl28xx_rd/rtl28xx_wr Thomas Mair
@ 2012-05-18 20:30     ` Antti Palosaari
  0 siblings, 0 replies; 104+ messages in thread
From: Antti Palosaari @ 2012-05-18 20:30 UTC (permalink / raw)
  To: Thomas Mair; +Cc: linux-media, pomidorabelisima

On 18.05.2012 21:47, Thomas Mair wrote:
> Signed-off-by: Thomas Mair<thomas.mair86@googlemail.com>


Acked-by: Antti Palosaari <crope@iki.fi>
Reviewed-by: Antti Palosaari <crope@iki.fi>

Antti
-- 
http://palosaari.fi/

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [PATCH v5 4/5] rtl28xxu: support Delock USB 2.0 DVB-T
  2012-05-18 18:47   ` [PATCH v5 4/5] rtl28xxu: support Delock USB 2.0 DVB-T Thomas Mair
@ 2012-05-18 20:31     ` Antti Palosaari
  0 siblings, 0 replies; 104+ messages in thread
From: Antti Palosaari @ 2012-05-18 20:31 UTC (permalink / raw)
  To: Thomas Mair; +Cc: linux-media, pomidorabelisima

On 18.05.2012 21:47, Thomas Mair wrote:
> Signed-off-by: Thomas Mair<thomas.mair86@googlemail.com>

Acked-by: Antti Palosaari <crope@iki.fi>
Reviewed-by: Antti Palosaari <crope@iki.fi>

Antti
-- 
http://palosaari.fi/

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [PATCH v5 5/5] rtl28xxu: support Terratec Noxon DAB/DAB+ stick
  2012-05-18 18:47   ` [PATCH v5 5/5] rtl28xxu: support Terratec Noxon DAB/DAB+ stick Thomas Mair
@ 2012-05-18 20:32     ` Antti Palosaari
  0 siblings, 0 replies; 104+ messages in thread
From: Antti Palosaari @ 2012-05-18 20:32 UTC (permalink / raw)
  To: Thomas Mair; +Cc: linux-media, pomidorabelisima, Hans-Frieder Vogt

On 18.05.2012 21:47, Thomas Mair wrote:
> Signed-off-by: Hans-Frieder Vogt<hfvogt@gmx.net>
> Signed-off-by: Thomas Mair<thomas.mair86@googlemail.com>

Acked-by: Antti Palosaari <crope@iki.fi>
Reviewed-by: Antti Palosaari <crope@iki.fi>


Antti
-- 
http://palosaari.fi/

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [PATCH v5 0/5] support for rtl2832
  2012-05-18 18:47 ` [PATCH v5 " Thomas Mair
                     ` (4 preceding siblings ...)
  2012-05-18 18:47   ` [PATCH v5 5/5] rtl28xxu: support Terratec Noxon DAB/DAB+ stick Thomas Mair
@ 2012-05-18 20:47   ` Antti Palosaari
  2012-05-18 23:35     ` poma
  2012-05-20  9:56     ` Thomas Mair
  2012-05-18 23:39   ` poma
  6 siblings, 2 replies; 104+ messages in thread
From: Antti Palosaari @ 2012-05-18 20:47 UTC (permalink / raw)
  To: Thomas Mair; +Cc: linux-media, pomidorabelisima

Good evening!

On 18.05.2012 21:47, Thomas Mair wrote:
> Good Evening!
>
> This is the corrected version of the patch series to support the
> RTL2832 demodulator. There where no major changes. The majority of
> the changes consist in fixing style issues and adhering to proper
> naming conventions.

Review done and seems to be OK for my eyes.

> The next question for me is how to proceed when including new
> devices. Poma already sent an extensive list a little while
> ago (http://patchwork.linuxtv.org/patch/10982/). Should they
> all be included at once, or should I wait until somone confirms
> they are working correctly and include them one by one?

It has been rule that device is added after known to work.

Unfortunately DVB USB do not support dynamic USB ID. In order to 
workaround that I have done some small hackish solution for the 
dvb_usb_rtl28xxu driver. Currently it works for RTL2831U based devices, 
but I see it could be easily extended for RTL2832U too by adding module 
parameter.

regards
Antti
-- 
http://palosaari.fi/

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [PATCH v5 0/5] support for rtl2832
  2012-05-18 20:47   ` [PATCH v5 0/5] support for rtl2832 Antti Palosaari
@ 2012-05-18 23:35     ` poma
  2012-05-20  9:56     ` Thomas Mair
  1 sibling, 0 replies; 104+ messages in thread
From: poma @ 2012-05-18 23:35 UTC (permalink / raw)
  To: Antti Palosaari, Thomas Mair, linux-media

On 05/18/2012 10:47 PM, Antti Palosaari wrote:
> Good evening!
> 
> On 18.05.2012 21:47, Thomas Mair wrote:
>> Good Evening!
>>
>> This is the corrected version of the patch series to support the
>> RTL2832 demodulator. There where no major changes. The majority of
>> the changes consist in fixing style issues and adhering to proper
>> naming conventions.
> 
> Review done and seems to be OK for my eyes.
> 
>> The next question for me is how to proceed when including new
>> devices. Poma already sent an extensive list a little while
>> ago (http://patchwork.linuxtv.org/patch/10982/). Should they
>> all be included at once, or should I wait until somone confirms
>> they are working correctly and include them one by one?
> 
> It has been rule that device is added after known to work.
> 
I second that.
'rtl28xxu-v2-rtl2832-fc0012.patch' is reference&template.

> Unfortunately DVB USB do not support dynamic USB ID. In order to
> workaround that I have done some small hackish solution for the
> dvb_usb_rtl28xxu driver. Currently it works for RTL2831U based devices,
> but I see it could be easily extended for RTL2832U too by adding module
> parameter.
> 
> regards
> Antti

regards,
poma

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [PATCH v5 0/5] support for rtl2832
  2012-05-18 18:47 ` [PATCH v5 " Thomas Mair
                     ` (5 preceding siblings ...)
  2012-05-18 20:47   ` [PATCH v5 0/5] support for rtl2832 Antti Palosaari
@ 2012-05-18 23:39   ` poma
  6 siblings, 0 replies; 104+ messages in thread
From: poma @ 2012-05-18 23:39 UTC (permalink / raw)
  To: Thomas Mair, linux-media

On 05/18/2012 08:47 PM, Thomas Mair wrote:
> Good Evening!
> 
> This is the corrected version of the patch series to support the 
> RTL2832 demodulator. There where no major changes. The majority of
> the changes consist in fixing style issues and adhering to proper
> naming conventions.
> 
> The next question for me is how to proceed when including new
> devices. Poma already sent an extensive list a little while 
> ago (http://patchwork.linuxtv.org/patch/10982/). Should they
> all be included at once, or should I wait until somone confirms 
> they are working correctly and include them one by one?
> 
> Regards 
> Thomas
> 
> Thomas Mair (5):
>   rtl2832 ver. 0.5: support for RTL2832 demod
>   rtl28xxu: support for the rtl2832 demod driver
>   rtl28xxu: renamed rtl2831_rd/rtl2831_wr to rtl28xx_rd/rtl28xx_wr
>   rtl28xxu: support Delock USB 2.0 DVB-T
>   rtl28xxu: support Terratec Noxon DAB/DAB+ stick
> 
>  drivers/media/dvb/dvb-usb/Kconfig          |    3 +
>  drivers/media/dvb/dvb-usb/dvb-usb-ids.h    |    3 +
>  drivers/media/dvb/dvb-usb/rtl28xxu.c       |  516 ++++++++++++++++--
>  drivers/media/dvb/frontends/Kconfig        |    7 +
>  drivers/media/dvb/frontends/Makefile       |    1 +
>  drivers/media/dvb/frontends/rtl2832.c      |  823 ++++++++++++++++++++++++++++
>  drivers/media/dvb/frontends/rtl2832.h      |   74 +++
>  drivers/media/dvb/frontends/rtl2832_priv.h |  260 +++++++++
>  8 files changed, 1638 insertions(+), 49 deletions(-)
>  create mode 100644 drivers/media/dvb/frontends/rtl2832.c
>  create mode 100644 drivers/media/dvb/frontends/rtl2832.h
>  create mode 100644 drivers/media/dvb/frontends/rtl2832_priv.h
> 

Compliment!

regards,
poma

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [PATCH v5 0/5] support for rtl2832
  2012-05-18 20:47   ` [PATCH v5 0/5] support for rtl2832 Antti Palosaari
  2012-05-18 23:35     ` poma
@ 2012-05-20  9:56     ` Thomas Mair
  2012-05-20 10:14       ` Antti Palosaari
  1 sibling, 1 reply; 104+ messages in thread
From: Thomas Mair @ 2012-05-20  9:56 UTC (permalink / raw)
  To: Antti Palosaari; +Cc: linux-media, pomidorabelisima

On 18.05.2012 22:47, Antti Palosaari wrote:
> Good evening!
> 
> On 18.05.2012 21:47, Thomas Mair wrote:
>> Good Evening!
>>
>> This is the corrected version of the patch series to support the
>> RTL2832 demodulator. There where no major changes. The majority of
>> the changes consist in fixing style issues and adhering to proper
>> naming conventions.
> 
> Review done and seems to be OK for my eyes.

Thanks Antti! You have been a big help for developing the driver.
What are the next steps? I think the fc0012 and fc0013 driver 
need to be reviewed before the patch may be included in 
staging. Is that the way it works?
 
>> The next question for me is how to proceed when including new
>> devices. Poma already sent an extensive list a little while
>> ago (http://patchwork.linuxtv.org/patch/10982/). Should they
>> all be included at once, or should I wait until somone confirms
>> they are working correctly and include them one by one?
> 
> It has been rule that device is added after known to work.
> 

That sounds good to me. In the meantime I will try to set up a 
page for the driver on the linuxtv.org wiki to keep information
about the driver and the devices in one place.

> Unfortunately DVB USB do not support dynamic USB ID. In order to workaround that I have done some small hackish solution for the dvb_usb_rtl28xxu driver. Currently it works for RTL2831U based devices, but I see it could be easily extended for RTL2832U too by adding module parameter.
> 

If I understand it right, the problem is that the tuner/demod 
combination is also hard coded in the dvb_usb_rtl28xxu driver?

> regards
> Antti

Regards
Thomas


^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [PATCH v5 0/5] support for rtl2832
  2012-05-20  9:56     ` Thomas Mair
@ 2012-05-20 10:14       ` Antti Palosaari
  0 siblings, 0 replies; 104+ messages in thread
From: Antti Palosaari @ 2012-05-20 10:14 UTC (permalink / raw)
  To: Thomas Mair; +Cc: linux-media, pomidorabelisima

On 20.05.2012 12:56, Thomas Mair wrote:
> On 18.05.2012 22:47, Antti Palosaari wrote:
>> Good evening!
>>
>> On 18.05.2012 21:47, Thomas Mair wrote:
>>> Good Evening!
>>>
>>> This is the corrected version of the patch series to support the
>>> RTL2832 demodulator. There where no major changes. The majority of
>>> the changes consist in fixing style issues and adhering to proper
>>> naming conventions.
>>
>> Review done and seems to be OK for my eyes.
>
> Thanks Antti! You have been a big help for developing the driver.
> What are the next steps? I think the fc0012 and fc0013 driver
> need to be reviewed before the patch may be included in
> staging. Is that the way it works?

Yes those should be reviewed. At least Mauro will review those when 
merging drivers to master but it is always better if there is some other 
reviewers before that as he has million patches to review.

>>> The next question for me is how to proceed when including new
>>> devices. Poma already sent an extensive list a little while
>>> ago (http://patchwork.linuxtv.org/patch/10982/). Should they
>>> all be included at once, or should I wait until somone confirms
>>> they are working correctly and include them one by one?
>>
>> It has been rule that device is added after known to work.
>>
>
> That sounds good to me. In the meantime I will try to set up a
> page for the driver on the linuxtv.org wiki to keep information
> about the driver and the devices in one place.
>
>> Unfortunately DVB USB do not support dynamic USB ID. In order to workaround that I have done some small hackish solution for the dvb_usb_rtl28xxu driver. Currently it works for RTL2831U based devices, but I see it could be easily extended for RTL2832U too by adding module parameter.
>>
>
> If I understand it right, the problem is that the tuner/demod
> combination is also hard coded in the dvb_usb_rtl28xxu driver?

Device USB IDs are hard coded to (static struct 
dvb_usb_device_properties) and that structure is passed to the DVB USB 
framework by calling dvb_usb_device_init(). DVB USB framework just 
refuses to register device if USB ID is not found. So I added that 
hackish solution to replace one USB ID by USB ID got as a dynamic USB 
ID. Dynamic ID is USB core features. It will load and call some USB 
driver even given USB ID is not advertised by the driver.

regards
Antti
-- 
http://palosaari.fi/

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [PATCH v5 1/5] rtl2832 ver. 0.5: support for RTL2832 demod
  2012-05-18 18:47   ` [PATCH v5 1/5] rtl2832 ver. 0.5: support for RTL2832 demod Thomas Mair
  2012-05-18 20:21     ` Antti Palosaari
@ 2012-07-05 14:32     ` Mauro Carvalho Chehab
  2012-07-05 14:35       ` Antti Palosaari
  2012-07-05 14:41       ` Antti Palosaari
  1 sibling, 2 replies; 104+ messages in thread
From: Mauro Carvalho Chehab @ 2012-07-05 14:32 UTC (permalink / raw)
  To: Thomas Mair; +Cc: linux-media, crope, pomidorabelisima

Em 18-05-2012 15:47, Thomas Mair escreveu:
> Changelog for ver. 0.5:
> - fixed code style and naming errors
> 
> Changelog for ver. 0.4:
> - removed statistics as their calculation was wrong
> - fixed bug in Makefile
> - indentation and code style improvements
> 
> Signed-off-by: Thomas Mair <thomas.mair86@googlemail.com>
> ---
>   drivers/media/dvb/frontends/Kconfig        |    7 +
>   drivers/media/dvb/frontends/Makefile       |    1 +
>   drivers/media/dvb/frontends/rtl2832.c      |  823 ++++++++++++++++++++++++++++
>   drivers/media/dvb/frontends/rtl2832.h      |   74 +++
>   drivers/media/dvb/frontends/rtl2832_priv.h |  260 +++++++++
>   5 files changed, 1165 insertions(+), 0 deletions(-)
>   create mode 100644 drivers/media/dvb/frontends/rtl2832.c
>   create mode 100644 drivers/media/dvb/frontends/rtl2832.h
>   create mode 100644 drivers/media/dvb/frontends/rtl2832_priv.h
> 
> diff --git a/drivers/media/dvb/frontends/Kconfig b/drivers/media/dvb/frontends/Kconfig
> index f479834..f7d67d7 100644
> --- a/drivers/media/dvb/frontends/Kconfig
> +++ b/drivers/media/dvb/frontends/Kconfig
> @@ -432,6 +432,13 @@ config DVB_RTL2830
>   	help
>   	  Say Y when you want to support this frontend.
>   
> +config DVB_RTL2832
> +	tristate "Realtek RTL2832 DVB-T"
> +	depends on DVB_CORE && I2C
> +	default m if DVB_FE_CUSTOMISE
> +	help
> +	  Say Y when you want to support this frontend.
> +
>   comment "DVB-C (cable) frontends"
>   	depends on DVB_CORE
>   
> diff --git a/drivers/media/dvb/frontends/Makefile b/drivers/media/dvb/frontends/Makefile
> index b0381dc..2279c5d 100644
> --- a/drivers/media/dvb/frontends/Makefile
> +++ b/drivers/media/dvb/frontends/Makefile
> @@ -98,6 +98,7 @@ obj-$(CONFIG_DVB_IT913X_FE) += it913x-fe.o
>   obj-$(CONFIG_DVB_A8293) += a8293.o
>   obj-$(CONFIG_DVB_TDA10071) += tda10071.o
>   obj-$(CONFIG_DVB_RTL2830) += rtl2830.o
> +obj-$(CONFIG_DVB_RTL2832) += rtl2832.o
>   obj-$(CONFIG_DVB_M88RS2000) += m88rs2000.o
>   obj-$(CONFIG_DVB_AF9033) += af9033.o
>   
> diff --git a/drivers/media/dvb/frontends/rtl2832.c b/drivers/media/dvb/frontends/rtl2832.c
> new file mode 100644
> index 0000000..d0cbe27
> --- /dev/null
> +++ b/drivers/media/dvb/frontends/rtl2832.c
> @@ -0,0 +1,823 @@
> +/*
> + * Realtek RTL2832 DVB-T demodulator driver
> + *
> + * Copyright (C) 2012 Thomas Mair <thomas.mair86@gmail.com>
> + *
> + *	This program is free software; you can redistribute it and/or modify
> + *	it under the terms of the GNU General Public License as published by
> + *	the Free Software Foundation; either version 2 of the License, or
> + *	(at your option) any later version.
> + *
> + *	This program is distributed in the hope that it will be useful,
> + *	but WITHOUT ANY WARRANTY; without even the implied warranty of
> + *	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + *	GNU General Public License for more details.
> + *
> + *	You should have received a copy of the GNU General Public License along
> + *	with this program; if not, write to the Free Software Foundation, Inc.,
> + *	51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
> + */
> +
> +#include "rtl2832_priv.h"
> +
> +
> +int rtl2832_debug;
> +module_param_named(debug, rtl2832_debug, int, 0644);
> +MODULE_PARM_DESC(debug, "Turn on/off frontend debugging (default:off).");
> +
> +
> +static const int reg_mask[32] = {
> +	0x00000001,
> +	0x00000003,
> +	0x00000007,
> +	0x0000000f,
> +	0x0000001f,
> +	0x0000003f,
> +	0x0000007f,
> +	0x000000ff,
> +	0x000001ff,
> +	0x000003ff,
> +	0x000007ff,
> +	0x00000fff,
> +	0x00001fff,
> +	0x00003fff,
> +	0x00007fff,
> +	0x0000ffff,
> +	0x0001ffff,
> +	0x0003ffff,
> +	0x0007ffff,
> +	0x000fffff,
> +	0x001fffff,
> +	0x003fffff,
> +	0x007fffff,
> +	0x00ffffff,
> +	0x01ffffff,
> +	0x03ffffff,
> +	0x07ffffff,
> +	0x0fffffff,
> +	0x1fffffff,
> +	0x3fffffff,
> +	0x7fffffff,
> +	0xffffffff
> +};

It would be better to use a macro here like:

#define REG_MASK(b)	((1 << ((b) + 1)) -1)

Even better, you could use the bitops.h BIT() macro:

#define REG_MASK(b)	(BIT(b + 1) - 1)

> +
> +static const struct rtl2832_reg_entry registers[] = {
> +	[DVBT_SOFT_RST]		= {0x1, 0x1,   2, 2},
> +	[DVBT_IIC_REPEAT]	= {0x1, 0x1,   3, 3},
> +	[DVBT_TR_WAIT_MIN_8K]	= {0x1, 0x88, 11, 2},
> +	[DVBT_RSD_BER_FAIL_VAL]	= {0x1, 0x8f, 15, 0},
> +	[DVBT_EN_BK_TRK]	= {0x1, 0xa6,  7, 7},
> +	[DVBT_AD_EN_REG]	= {0x0, 0x8,   7, 7},
> +	[DVBT_AD_EN_REG1]	= {0x0, 0x8,   6, 6},
> +	[DVBT_EN_BBIN]		= {0x1, 0xb1,  0, 0},
> +	[DVBT_MGD_THD0]		= {0x1, 0x95,  7, 0},
> +	[DVBT_MGD_THD1]		= {0x1, 0x96,  7, 0},
> +	[DVBT_MGD_THD2]		= {0x1, 0x97,  7, 0},
> +	[DVBT_MGD_THD3]		= {0x1, 0x98,  7, 0},
> +	[DVBT_MGD_THD4]		= {0x1, 0x99,  7, 0},
> +	[DVBT_MGD_THD5]		= {0x1, 0x9a,  7, 0},
> +	[DVBT_MGD_THD6]		= {0x1, 0x9b,  7, 0},
> +	[DVBT_MGD_THD7]		= {0x1, 0x9c,  7, 0},
> +	[DVBT_EN_CACQ_NOTCH]	= {0x1, 0x61,  4, 4},
> +	[DVBT_AD_AV_REF]	= {0x0, 0x9,   6, 0},
> +	[DVBT_REG_PI]		= {0x0, 0xa,   2, 0},
> +	[DVBT_PIP_ON]		= {0x0, 0x21,  3, 3},
> +	[DVBT_SCALE1_B92]	= {0x2, 0x92,  7, 0},
> +	[DVBT_SCALE1_B93]	= {0x2, 0x93,  7, 0},
> +	[DVBT_SCALE1_BA7]	= {0x2, 0xa7,  7, 0},
> +	[DVBT_SCALE1_BA9]	= {0x2, 0xa9,  7, 0},
> +	[DVBT_SCALE1_BAA]	= {0x2, 0xaa,  7, 0},
> +	[DVBT_SCALE1_BAB]	= {0x2, 0xab,  7, 0},
> +	[DVBT_SCALE1_BAC]	= {0x2, 0xac,  7, 0},
> +	[DVBT_SCALE1_BB0]	= {0x2, 0xb0,  7, 0},
> +	[DVBT_SCALE1_BB1]	= {0x2, 0xb1,  7, 0},
> +	[DVBT_KB_P1]		= {0x1, 0x64,  3, 1},
> +	[DVBT_KB_P2]		= {0x1, 0x64,  6, 4},
> +	[DVBT_KB_P3]		= {0x1, 0x65,  2, 0},
> +	[DVBT_OPT_ADC_IQ]	= {0x0, 0x6,   5, 4},
> +	[DVBT_AD_AVI]		= {0x0, 0x9,   1, 0},
> +	[DVBT_AD_AVQ]		= {0x0, 0x9,   3, 2},
> +	[DVBT_K1_CR_STEP12]	= {0x2, 0xad,  9, 4},
> +	[DVBT_TRK_KS_P2]	= {0x1, 0x6f,  2, 0},
> +	[DVBT_TRK_KS_I2]	= {0x1, 0x70,  5, 3},
> +	[DVBT_TR_THD_SET2]	= {0x1, 0x72,  3, 0},
> +	[DVBT_TRK_KC_P2]	= {0x1, 0x73,  5, 3},
> +	[DVBT_TRK_KC_I2]	= {0x1, 0x75,  2, 0},
> +	[DVBT_CR_THD_SET2]	= {0x1, 0x76,  7, 6},
> +	[DVBT_PSET_IFFREQ]	= {0x1, 0x19, 21, 0},
> +	[DVBT_SPEC_INV]		= {0x1, 0x15,  0, 0},
> +	[DVBT_RSAMP_RATIO]	= {0x1, 0x9f, 27, 2},
> +	[DVBT_CFREQ_OFF_RATIO]	= {0x1, 0x9d, 23, 4},
> +	[DVBT_FSM_STAGE]	= {0x3, 0x51,  6, 3},
> +	[DVBT_RX_CONSTEL]	= {0x3, 0x3c,  3, 2},
> +	[DVBT_RX_HIER]		= {0x3, 0x3c,  6, 4},
> +	[DVBT_RX_C_RATE_LP]	= {0x3, 0x3d,  2, 0},
> +	[DVBT_RX_C_RATE_HP]	= {0x3, 0x3d,  5, 3},
> +	[DVBT_GI_IDX]		= {0x3, 0x51,  1, 0},
> +	[DVBT_FFT_MODE_IDX]	= {0x3, 0x51,  2, 2},
> +	[DVBT_RSD_BER_EST]	= {0x3, 0x4e, 15, 0},
> +	[DVBT_CE_EST_EVM]	= {0x4, 0xc,  15, 0},
> +	[DVBT_RF_AGC_VAL]	= {0x3, 0x5b, 13, 0},
> +	[DVBT_IF_AGC_VAL]	= {0x3, 0x59, 13, 0},
> +	[DVBT_DAGC_VAL]		= {0x3, 0x5,   7, 0},
> +	[DVBT_SFREQ_OFF]	= {0x3, 0x18, 13, 0},
> +	[DVBT_CFREQ_OFF]	= {0x3, 0x5f, 17, 0},
> +	[DVBT_POLAR_RF_AGC]	= {0x0, 0xe,   1, 1},
> +	[DVBT_POLAR_IF_AGC]	= {0x0, 0xe,   0, 0},
> +	[DVBT_AAGC_HOLD]	= {0x1, 0x4,   5, 5},
> +	[DVBT_EN_RF_AGC]	= {0x1, 0x4,   6, 6},
> +	[DVBT_EN_IF_AGC]	= {0x1, 0x4,   7, 7},
> +	[DVBT_IF_AGC_MIN]	= {0x1, 0x8,   7, 0},
> +	[DVBT_IF_AGC_MAX]	= {0x1, 0x9,   7, 0},
> +	[DVBT_RF_AGC_MIN]	= {0x1, 0xa,   7, 0},
> +	[DVBT_RF_AGC_MAX]	= {0x1, 0xb,   7, 0},
> +	[DVBT_IF_AGC_MAN]	= {0x1, 0xc,   6, 6},
> +	[DVBT_IF_AGC_MAN_VAL]	= {0x1, 0xc,  13, 0},
> +	[DVBT_RF_AGC_MAN]	= {0x1, 0xe,   6, 6},
> +	[DVBT_RF_AGC_MAN_VAL]	= {0x1, 0xe,  13, 0},
> +	[DVBT_DAGC_TRG_VAL]	= {0x1, 0x12,  7, 0},
> +	[DVBT_AGC_TARG_VAL_0]	= {0x1, 0x2,   0, 0},
> +	[DVBT_AGC_TARG_VAL_8_1]	= {0x1, 0x3,   7, 0},
> +	[DVBT_AAGC_LOOP_GAIN]	= {0x1, 0xc7,  5, 1},
> +	[DVBT_LOOP_GAIN2_3_0]	= {0x1, 0x4,   4, 1},
> +	[DVBT_LOOP_GAIN2_4]	= {0x1, 0x5,   7, 7},
> +	[DVBT_LOOP_GAIN3]	= {0x1, 0xc8,  4, 0},
> +	[DVBT_VTOP1]		= {0x1, 0x6,   5, 0},
> +	[DVBT_VTOP2]		= {0x1, 0xc9,  5, 0},
> +	[DVBT_VTOP3]		= {0x1, 0xca,  5, 0},
> +	[DVBT_KRF1]		= {0x1, 0xcb,  7, 0},
> +	[DVBT_KRF2]		= {0x1, 0x7,   7, 0},
> +	[DVBT_KRF3]		= {0x1, 0xcd,  7, 0},
> +	[DVBT_KRF4]		= {0x1, 0xce,  7, 0},
> +	[DVBT_EN_GI_PGA]	= {0x1, 0xe5,  0, 0},
> +	[DVBT_THD_LOCK_UP]	= {0x1, 0xd9,  8, 0},
> +	[DVBT_THD_LOCK_DW]	= {0x1, 0xdb,  8, 0},
> +	[DVBT_THD_UP1]		= {0x1, 0xdd,  7, 0},
> +	[DVBT_THD_DW1]		= {0x1, 0xde,  7, 0},
> +	[DVBT_INTER_CNT_LEN]	= {0x1, 0xd8,  3, 0},
> +	[DVBT_GI_PGA_STATE]	= {0x1, 0xe6,  3, 3},
> +	[DVBT_EN_AGC_PGA]	= {0x1, 0xd7,  0, 0},
> +	[DVBT_CKOUTPAR]		= {0x1, 0x7b,  5, 5},
> +	[DVBT_CKOUT_PWR]	= {0x1, 0x7b,  6, 6},
> +	[DVBT_SYNC_DUR]		= {0x1, 0x7b,  7, 7},
> +	[DVBT_ERR_DUR]		= {0x1, 0x7c,  0, 0},
> +	[DVBT_SYNC_LVL]		= {0x1, 0x7c,  1, 1},
> +	[DVBT_ERR_LVL]		= {0x1, 0x7c,  2, 2},
> +	[DVBT_VAL_LVL]		= {0x1, 0x7c,  3, 3},
> +	[DVBT_SERIAL]		= {0x1, 0x7c,  4, 4},
> +	[DVBT_SER_LSB]		= {0x1, 0x7c,  5, 5},
> +	[DVBT_CDIV_PH0]		= {0x1, 0x7d,  3, 0},
> +	[DVBT_CDIV_PH1]		= {0x1, 0x7d,  7, 4},
> +	[DVBT_MPEG_IO_OPT_2_2]	= {0x0, 0x6,   7, 7},
> +	[DVBT_MPEG_IO_OPT_1_0]	= {0x0, 0x7,   7, 6},
> +	[DVBT_CKOUTPAR_PIP]	= {0x0, 0xb7,  4, 4},
> +	[DVBT_CKOUT_PWR_PIP]	= {0x0, 0xb7,  3, 3},
> +	[DVBT_SYNC_LVL_PIP]	= {0x0, 0xb7,  2, 2},
> +	[DVBT_ERR_LVL_PIP]	= {0x0, 0xb7,  1, 1},
> +	[DVBT_VAL_LVL_PIP]	= {0x0, 0xb7,  0, 0},
> +	[DVBT_CKOUTPAR_PID]	= {0x0, 0xb9,  4, 4},
> +	[DVBT_CKOUT_PWR_PID]	= {0x0, 0xb9,  3, 3},
> +	[DVBT_SYNC_LVL_PID]	= {0x0, 0xb9,  2, 2},
> +	[DVBT_ERR_LVL_PID]	= {0x0, 0xb9,  1, 1},
> +	[DVBT_VAL_LVL_PID]	= {0x0, 0xb9,  0, 0},
> +	[DVBT_SM_PASS]		= {0x1, 0x93, 11, 0},
> +	[DVBT_AD7_SETTING]	= {0x0, 0x11, 15, 0},
> +	[DVBT_RSSI_R]		= {0x3, 0x1,   6, 0},
> +	[DVBT_ACI_DET_IND]	= {0x3, 0x12,  0, 0},
> +	[DVBT_REG_MON]		= {0x0, 0xd,   1, 0},
> +	[DVBT_REG_MONSEL]	= {0x0, 0xd,   2, 2},
> +	[DVBT_REG_GPE]		= {0x0, 0xd,   7, 7},
> +	[DVBT_REG_GPO]		= {0x0, 0x10,  0, 0},
> +	[DVBT_REG_4MSEL]	= {0x0, 0x13,  0, 0},
> +};
> +
> +/* write multiple hardware registers */
> +static int rtl2832_wr(struct rtl2832_priv *priv, u8 reg, u8 *val, int len)
> +{
> +	int ret;
> +	u8 buf[1+len];
> +	struct i2c_msg msg[1] = {
> +		{
> +			.addr = priv->cfg.i2c_addr,
> +			.flags = 0,
> +			.len = 1+len,
> +			.buf = buf,
> +		}
> +	};
> +
> +	buf[0] = reg;
> +	memcpy(&buf[1], val, len);
> +
> +	ret = i2c_transfer(priv->i2c, msg, 1);
> +	if (ret == 1) {
> +		ret = 0;
> +	} else {
> +		warn("i2c wr failed=%d reg=%02x len=%d", ret, reg, len);
> +		ret = -EREMOTEIO;
> +	}
> +	return ret;
> +}
> +
> +/* read multiple hardware registers */
> +static int rtl2832_rd(struct rtl2832_priv *priv, u8 reg, u8 *val, int len)
> +{
> +	int ret;
> +	struct i2c_msg msg[2] = {
> +		{
> +			.addr = priv->cfg.i2c_addr,
> +			.flags = 0,
> +			.len = 1,
> +			.buf = &reg,
> +		}, {
> +			.addr = priv->cfg.i2c_addr,
> +			.flags = I2C_M_RD,
> +			.len = len,
> +			.buf = val,
> +		}
> +	};
> +
> +	ret = i2c_transfer(priv->i2c, msg, 2);
> +	if (ret == 2) {
> +		ret = 0;
> +	} else {
> +		warn("i2c rd failed=%d reg=%02x len=%d", ret, reg, len);
> +		ret = -EREMOTEIO;
> +}
> +return ret;
> +}
> +
> +/* write multiple registers */
> +static int rtl2832_wr_regs(struct rtl2832_priv *priv, u8 reg, u8 page, u8 *val,
> +	int len)
> +{
> +	int ret;
> +
> +
> +	/* switch bank if needed */
> +	if (page != priv->page) {
> +		ret = rtl2832_wr(priv, 0x00, &page, 1);
> +		if (ret)
> +			return ret;
> +
> +		priv->page = page;
> +}
> +
> +return rtl2832_wr(priv, reg, val, len);
> +}
> +
> +/* read multiple registers */
> +static int rtl2832_rd_regs(struct rtl2832_priv *priv, u8 reg, u8 page, u8 *val,
> +	int len)
> +{
> +	int ret;
> +
> +	/* switch bank if needed */
> +	if (page != priv->page) {
> +		ret = rtl2832_wr(priv, 0x00, &page, 1);
> +		if (ret)
> +			return ret;
> +
> +		priv->page = page;
> +	}
> +
> +	return rtl2832_rd(priv, reg, val, len);
> +}
> +
> +#if 0 /* currently not used */
> +/* write single register */
> +static int rtl2832_wr_reg(struct rtl2832_priv *priv, u8 reg, u8 page, u8 val)
> +{
> +	return rtl2832_wr_regs(priv, reg, page, &val, 1);
> +}
> +#endif
> +
> +/* read single register */
> +static int rtl2832_rd_reg(struct rtl2832_priv *priv, u8 reg, u8 page, u8 *val)
> +{
> +	return rtl2832_rd_regs(priv, reg, page, val, 1);
> +}
> +
> +int rtl2832_rd_demod_reg(struct rtl2832_priv *priv, int reg, u32 *val)
> +{
> +	int ret;
> +
> +	u8 reg_start_addr;
> +	u8 msb, lsb;
> +	u8 page;
> +	u8 reading[4];
> +	u32 reading_tmp;
> +	int i;
> +
> +	u8 len;
> +	u32 mask;
> +
> +	reg_start_addr = registers[reg].start_address;
> +	msb = registers[reg].msb;
> +	lsb = registers[reg].lsb;
> +	page = registers[reg].page;
> +
> +	len = (msb >> 3) + 1;
> +	mask = reg_mask[msb - lsb];
> +
> +	ret = rtl2832_rd_regs(priv, reg_start_addr, page, &reading[0], len);
> +	if (ret)
> +		goto err;
> +
> +	reading_tmp = 0;
> +	for (i = 0; i < len; i++)
> +		reading_tmp |= reading[i] << ((len - 1 - i) * 8);
> +
> +	*val = (reading_tmp >> lsb) & mask;
> +
> +	return ret;
> +
> +err:
> +	dbg("%s: failed=%d", __func__, ret);
> +	return ret;
> +
> +}
> +
> +int rtl2832_wr_demod_reg(struct rtl2832_priv *priv, int reg, u32 val)
> +{
> +	int ret, i;
> +	u8 len;
> +	u8 reg_start_addr;
> +	u8 msb, lsb;
> +	u8 page;
> +	u32 mask;
> +
> +
> +	u8 reading[4];
> +	u8 writing[4];
> +	u32 reading_tmp;
> +	u32 writing_tmp;
> +
> +
> +	reg_start_addr = registers[reg].start_address;
> +	msb = registers[reg].msb;
> +	lsb = registers[reg].lsb;
> +	page = registers[reg].page;
> +
> +	len = (msb >> 3) + 1;
> +	mask = reg_mask[msb - lsb];
> +
> +
> +	ret = rtl2832_rd_regs(priv, reg_start_addr, page, &reading[0], len);
> +	if (ret)
> +		goto err;
> +
> +	reading_tmp = 0;
> +	for (i = 0; i < len; i++)
> +		reading_tmp |= reading[i] << ((len - 1 - i) * 8);
> +
> +	writing_tmp = reading_tmp & ~(mask << lsb);
> +	writing_tmp |= ((val & mask) << lsb);
> +
> +
> +	for (i = 0; i < len; i++)
> +		writing[i] = (writing_tmp >> ((len - 1 - i) * 8)) & 0xff;
> +
> +	ret = rtl2832_wr_regs(priv, reg_start_addr, page, &writing[0], len);
> +	if (ret)
> +		goto err;
> +
> +	return ret;
> +
> +err:
> +	dbg("%s: failed=%d", __func__, ret);
> +	return ret;
> +
> +}
> +
> +
> +static int rtl2832_i2c_gate_ctrl(struct dvb_frontend *fe, int enable)
> +{
> +	int ret;
> +	struct rtl2832_priv *priv = fe->demodulator_priv;
> +
> +	dbg("%s: enable=%d", __func__, enable);
> +
> +	/* gate already open or close */
> +	if (priv->i2c_gate_state == enable)
> +		return 0;
> +
> +	ret = rtl2832_wr_demod_reg(priv, DVBT_IIC_REPEAT, (enable ? 0x1 : 0x0));
> +	if (ret)
> +		goto err;
> +
> +	priv->i2c_gate_state = enable;
> +
> +	return ret;
> +err:
> +	dbg("%s: failed=%d", __func__, ret);
> +	return ret;
> +}
> +
> +
> +
> +static int rtl2832_init(struct dvb_frontend *fe)
> +{
> +	struct rtl2832_priv *priv = fe->demodulator_priv;
> +	int i, ret;
> +
> +	u8 en_bbin;
> +	u64 pset_iffreq;
> +
> +	/* initialization values for the demodulator registers */
> +	struct rtl2832_reg_value rtl2832_initial_regs[] = {

Please, declare it with const.

> +		{DVBT_AD_EN_REG,		0x1},
> +		{DVBT_AD_EN_REG1,		0x1},
> +		{DVBT_RSD_BER_FAIL_VAL,		0x2800},
> +		{DVBT_MGD_THD0,			0x10},
> +		{DVBT_MGD_THD1,			0x20},
> +		{DVBT_MGD_THD2,			0x20},
> +		{DVBT_MGD_THD3,			0x40},
> +		{DVBT_MGD_THD4,			0x22},
> +		{DVBT_MGD_THD5,			0x32},
> +		{DVBT_MGD_THD6,			0x37},
> +		{DVBT_MGD_THD7,			0x39},
> +		{DVBT_EN_BK_TRK,		0x0},
> +		{DVBT_EN_CACQ_NOTCH,		0x0},
> +		{DVBT_AD_AV_REF,		0x2a},
> +		{DVBT_REG_PI,			0x6},
> +		{DVBT_PIP_ON,			0x0},
> +		{DVBT_CDIV_PH0,			0x8},
> +		{DVBT_CDIV_PH1,			0x8},
> +		{DVBT_SCALE1_B92,		0x4},
> +		{DVBT_SCALE1_B93,		0xb0},
> +		{DVBT_SCALE1_BA7,		0x78},
> +		{DVBT_SCALE1_BA9,		0x28},
> +		{DVBT_SCALE1_BAA,		0x59},
> +		{DVBT_SCALE1_BAB,		0x83},
> +		{DVBT_SCALE1_BAC,		0xd4},
> +		{DVBT_SCALE1_BB0,		0x65},
> +		{DVBT_SCALE1_BB1,		0x43},
> +		{DVBT_KB_P1,			0x1},
> +		{DVBT_KB_P2,			0x4},
> +		{DVBT_KB_P3,			0x7},
> +		{DVBT_K1_CR_STEP12,		0xa},
> +		{DVBT_REG_GPE,			0x1},
> +		{DVBT_SERIAL,			0x0},
> +		{DVBT_CDIV_PH0,			0x9},
> +		{DVBT_CDIV_PH1,			0x9},
> +		{DVBT_MPEG_IO_OPT_2_2,		0x0},
> +		{DVBT_MPEG_IO_OPT_1_0,		0x0},
> +		{DVBT_TRK_KS_P2,		0x4},
> +		{DVBT_TRK_KS_I2,		0x7},
> +		{DVBT_TR_THD_SET2,		0x6},
> +		{DVBT_TRK_KC_I2,		0x5},
> +		{DVBT_CR_THD_SET2,		0x1},
> +		{DVBT_SPEC_INV,			0x0},
> +		{DVBT_DAGC_TRG_VAL,		0x5a},
> +		{DVBT_AGC_TARG_VAL_0,		0x0},
> +		{DVBT_AGC_TARG_VAL_8_1,		0x5a},
> +		{DVBT_AAGC_LOOP_GAIN,		0x16},
> +		{DVBT_LOOP_GAIN2_3_0,		0x6},
> +		{DVBT_LOOP_GAIN2_4,		0x1},
> +		{DVBT_LOOP_GAIN3,		0x16},
> +		{DVBT_VTOP1,			0x35},
> +		{DVBT_VTOP2,			0x21},
> +		{DVBT_VTOP3,			0x21},
> +		{DVBT_KRF1,			0x0},
> +		{DVBT_KRF2,			0x40},
> +		{DVBT_KRF3,			0x10},
> +		{DVBT_KRF4,			0x10},
> +		{DVBT_IF_AGC_MIN,		0x80},
> +		{DVBT_IF_AGC_MAX,		0x7f},
> +		{DVBT_RF_AGC_MIN,		0x80},
> +		{DVBT_RF_AGC_MAX,		0x7f},
> +		{DVBT_POLAR_RF_AGC,		0x0},
> +		{DVBT_POLAR_IF_AGC,		0x0},
> +		{DVBT_AD7_SETTING,		0xe9bf},
> +		{DVBT_EN_GI_PGA,		0x0},
> +		{DVBT_THD_LOCK_UP,		0x0},
> +		{DVBT_THD_LOCK_DW,		0x0},
> +		{DVBT_THD_UP1,			0x11},
> +		{DVBT_THD_DW1,			0xef},
> +		{DVBT_INTER_CNT_LEN,		0xc},
> +		{DVBT_GI_PGA_STATE,		0x0},
> +		{DVBT_EN_AGC_PGA,		0x1},
> +		{DVBT_IF_AGC_MAN,		0x0},
> +	};
> +
> +
> +	dbg("%s", __func__);
> +
> +	en_bbin = (priv->cfg.if_dvbt == 0 ? 0x1 : 0x0);
> +
> +	/*
> +	* PSET_IFFREQ = - floor((IfFreqHz % CrystalFreqHz) * pow(2, 22)
> +	*		/ CrystalFreqHz)
> +	*/
> +	pset_iffreq = priv->cfg.if_dvbt % priv->cfg.xtal;
> +	pset_iffreq *= 0x400000;
> +	pset_iffreq = div_u64(pset_iffreq, priv->cfg.xtal);
> +	pset_iffreq = pset_iffreq & 0x3fffff;
> +
> +
> +
> +	for (i = 0; i < ARRAY_SIZE(rtl2832_initial_regs); i++) {
> +		ret = rtl2832_wr_demod_reg(priv, rtl2832_initial_regs[i].reg,
> +			rtl2832_initial_regs[i].value);
> +		if (ret)
> +			goto err;
> +	}
> +
> +	/* if frequency settings */
> +	ret = rtl2832_wr_demod_reg(priv, DVBT_EN_BBIN, en_bbin);
> +		if (ret)
> +			goto err;
> +
> +	ret = rtl2832_wr_demod_reg(priv, DVBT_PSET_IFFREQ, pset_iffreq);
> +		if (ret)
> +			goto err;
> +
> +	priv->sleeping = false;
> +
> +	return ret;
> +
> +err:
> +	dbg("%s: failed=%d", __func__, ret);
> +	return ret;
> +}
> +
> +static int rtl2832_sleep(struct dvb_frontend *fe)
> +{
> +	struct rtl2832_priv *priv = fe->demodulator_priv;
> +
> +	dbg("%s", __func__);
> +	priv->sleeping = true;
> +	return 0;
> +}
> +
> +int rtl2832_get_tune_settings(struct dvb_frontend *fe,
> +	struct dvb_frontend_tune_settings *s)
> +{
> +	dbg("%s", __func__);
> +	s->min_delay_ms = 1000;
> +	s->step_size = fe->ops.info.frequency_stepsize * 2;
> +	s->max_drift = (fe->ops.info.frequency_stepsize * 2) + 1;
> +	return 0;
> +}
> +
> +static int rtl2832_set_frontend(struct dvb_frontend *fe)
> +{
> +	struct rtl2832_priv *priv = fe->demodulator_priv;
> +	struct dtv_frontend_properties *c = &fe->dtv_property_cache;
> +	int ret, i, j;
> +	u64 bw_mode, num, num2;
> +	u32 resamp_ratio, cfreq_off_ratio;
> +
> +
> +	static u8 bw_params[3][32] = {
> +	/* 6 MHz bandwidth */
> +		{
> +		0xf5, 0xff, 0x15, 0x38, 0x5d, 0x6d, 0x52, 0x07, 0xfa, 0x2f,
> +		0x53, 0xf5, 0x3f, 0xca, 0x0b, 0x91, 0xea, 0x30, 0x63, 0xb2,
> +		0x13, 0xda, 0x0b, 0xc4, 0x18, 0x7e, 0x16, 0x66, 0x08, 0x67,
> +		0x19, 0xe0,
> +		},
> +
> +	/*  7 MHz bandwidth */
> +		{
> +		0xe7, 0xcc, 0xb5, 0xba, 0xe8, 0x2f, 0x67, 0x61, 0x00, 0xaf,
> +		0x86, 0xf2, 0xbf, 0x59, 0x04, 0x11, 0xb6, 0x33, 0xa4, 0x30,
> +		0x15, 0x10, 0x0a, 0x42, 0x18, 0xf8, 0x17, 0xd9, 0x07, 0x22,
> +		0x19, 0x10,
> +		},
> +
> +	/*  8 MHz bandwidth */
> +		{
> +		0x09, 0xf6, 0xd2, 0xa7, 0x9a, 0xc9, 0x27, 0x77, 0x06, 0xbf,
> +		0xec, 0xf4, 0x4f, 0x0b, 0xfc, 0x01, 0x63, 0x35, 0x54, 0xa7,
> +		0x16, 0x66, 0x08, 0xb4, 0x19, 0x6e, 0x19, 0x65, 0x05, 0xc8,
> +		0x19, 0xe0,
> +		},
> +	};
> +
> +
> +	dbg("%s: frequency=%d bandwidth_hz=%d inversion=%d", __func__,
> +		c->frequency, c->bandwidth_hz, c->inversion);
> +
> +
> +	/* program tuner */
> +	if (fe->ops.tuner_ops.set_params)
> +		fe->ops.tuner_ops.set_params(fe);
> +
> +
> +	switch (c->bandwidth_hz) {
> +	case 6000000:
> +		i = 0;
> +		bw_mode = 48000000;
> +		break;
> +	case 7000000:
> +		i = 1;
> +		bw_mode = 56000000;
> +		break;
> +	case 8000000:
> +		i = 2;
> +		bw_mode = 64000000;
> +		break;
> +	default:
> +		dbg("invalid bandwidth");
> +		return -EINVAL;
> +	}
> +
> +	for (j = 0; j < sizeof(bw_params[j]); j++) {
> +		ret = rtl2832_wr_regs(priv, 0x1c+j, 1, &bw_params[i][j], 1);
> +		if (ret)
> +			goto err;
> +	}
> +
> +	/* calculate and set resample ratio
> +	* RSAMP_RATIO = floor(CrystalFreqHz * 7 * pow(2, 22)
> +	*	/ ConstWithBandwidthMode)
> +	*/
> +	num = priv->cfg.xtal * 7;
> +	num *= 0x400000;
> +	num = div_u64(num, bw_mode);
> +	resamp_ratio =  num & 0x3ffffff;
> +	ret = rtl2832_wr_demod_reg(priv, DVBT_RSAMP_RATIO, resamp_ratio);
> +	if (ret)
> +		goto err;
> +
> +	/* calculate and set cfreq off ratio
> +	* CFREQ_OFF_RATIO = - floor(ConstWithBandwidthMode * pow(2, 20)
> +	*	/ (CrystalFreqHz * 7))
> +	*/
> +	num = bw_mode << 20;
> +	num2 = priv->cfg.xtal * 7;
> +	num = div_u64(num, num2);
> +	num = -num;
> +	cfreq_off_ratio = num & 0xfffff;
> +	ret = rtl2832_wr_demod_reg(priv, DVBT_CFREQ_OFF_RATIO, cfreq_off_ratio);
> +	if (ret)
> +		goto err;
> +
> +
> +	/* soft reset */
> +	ret = rtl2832_wr_demod_reg(priv, DVBT_SOFT_RST, 0x1);
> +	if (ret)
> +		goto err;
> +
> +	ret = rtl2832_wr_demod_reg(priv, DVBT_SOFT_RST, 0x0);
> +	if (ret)
> +		goto err;
> +
> +	return ret;
> +err:
> +	info("%s: failed=%d", __func__, ret);
> +	return ret;
> +}
> +
> +static int rtl2832_read_status(struct dvb_frontend *fe, fe_status_t *status)
> +{
> +	struct rtl2832_priv *priv = fe->demodulator_priv;
> +	int ret;
> +	u32 tmp;
> +	*status = 0;
> +
> +
> +	dbg("%s", __func__);
> +	if (priv->sleeping)
> +		return 0;
> +
> +	ret = rtl2832_rd_demod_reg(priv, DVBT_FSM_STAGE, &tmp);
> +	if (ret)
> +		goto err;
> +
> +	if (tmp == 11) {
> +		*status |= FE_HAS_SIGNAL | FE_HAS_CARRIER |
> +				FE_HAS_VITERBI | FE_HAS_SYNC | FE_HAS_LOCK;
> +	}
> +	/* TODO find out if this is also true for rtl2832? */
> +	/*else if (tmp == 10) {
> +		*status |= FE_HAS_SIGNAL | FE_HAS_CARRIER |
> +				FE_HAS_VITERBI;
> +	}*/
> +
> +	return ret;
> +err:
> +	info("%s: failed=%d", __func__, ret);
> +	return ret;
> +}
> +


> +static int rtl2832_read_snr(struct dvb_frontend *fe, u16 *snr)
> +{
> +	*snr = 0;
> +	return 0;
> +}
> +
> +static int rtl2832_read_ber(struct dvb_frontend *fe, u32 *ber)
> +{
> +	*ber = 0;
> +	return 0;
> +}
> +
> +static int rtl2832_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
> +{
> +	*ucblocks = 0;
> +	return 0;
> +}
> +
> +
> +static int rtl2832_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
> +{
> +	*strength = 0;
> +	return 0;
> +}

Why to implement the above, if they're doing nothing?

> +
> +static struct dvb_frontend_ops rtl2832_ops;
> +
> +static void rtl2832_release(struct dvb_frontend *fe)
> +{
> +	struct rtl2832_priv *priv = fe->demodulator_priv;
> +
> +	dbg("%s", __func__);
> +	kfree(priv);
> +}
> +
> +struct dvb_frontend *rtl2832_attach(const struct rtl2832_config *cfg,
> +	struct i2c_adapter *i2c)
> +{
> +	struct rtl2832_priv *priv = NULL;
> +	int ret = 0;
> +	u8 tmp;
> +
> +	dbg("%s", __func__);
> +
> +	/* allocate memory for the internal state */
> +	priv = kzalloc(sizeof(struct rtl2832_priv), GFP_KERNEL);
> +	if (priv == NULL)
> +		goto err;
> +
> +	/* setup the priv */
> +	priv->i2c = i2c;
> +	priv->tuner = cfg->tuner;
> +	memcpy(&priv->cfg, cfg, sizeof(struct rtl2832_config));
> +
> +	/* check if the demod is there */
> +	ret = rtl2832_rd_reg(priv, 0x00, 0x0, &tmp);
> +	if (ret)
> +		goto err;
> +
> +	/* create dvb_frontend */
> +	memcpy(&priv->fe.ops, &rtl2832_ops, sizeof(struct dvb_frontend_ops));
> +	priv->fe.demodulator_priv = priv;
> +
> +	/* TODO implement sleep mode */
> +	priv->sleeping = true;
> +
> +	return &priv->fe;
> +err:
> +	dbg("%s: failed=%d", __func__, ret);
> +	kfree(priv);
> +	return NULL;
> +}
> +EXPORT_SYMBOL(rtl2832_attach);

EXPORT_SYMBOL_GPL() if preferred.

> +
> +static struct dvb_frontend_ops rtl2832_ops = {
> +	.delsys = { SYS_DVBT },
> +	.info = {
> +		.name = "Realtek RTL2832 (DVB-T)",
> +		.frequency_min	  = 174000000,
> +		.frequency_max	  = 862000000,
> +		.frequency_stepsize = 166667,
> +		.caps = FE_CAN_FEC_1_2 |
> +			FE_CAN_FEC_2_3 |
> +			FE_CAN_FEC_3_4 |
> +			FE_CAN_FEC_5_6 |
> +			FE_CAN_FEC_7_8 |
> +			FE_CAN_FEC_AUTO |
> +			FE_CAN_QPSK |
> +			FE_CAN_QAM_16 |
> +			FE_CAN_QAM_64 |
> +			FE_CAN_QAM_AUTO |
> +			FE_CAN_TRANSMISSION_MODE_AUTO |
> +			FE_CAN_GUARD_INTERVAL_AUTO |
> +			FE_CAN_HIERARCHY_AUTO |
> +			FE_CAN_RECOVER |
> +			FE_CAN_MUTE_TS
> +	 },
> +
> +	.release = rtl2832_release,
> +
> +	.init = rtl2832_init,
> +	.sleep = rtl2832_sleep,
> +
> +	.get_tune_settings = rtl2832_get_tune_settings,
> +
> +	.set_frontend = rtl2832_set_frontend,
> +
> +	.read_status = rtl2832_read_status,
> +	.read_snr = rtl2832_read_snr,
> +	.read_ber = rtl2832_read_ber,
> +	.read_ucblocks = rtl2832_read_ucblocks,
> +	.read_signal_strength = rtl2832_read_signal_strength,
> +	.i2c_gate_ctrl = rtl2832_i2c_gate_ctrl,
> +};
> +
> +MODULE_AUTHOR("Thomas Mair <mair.thomas86@gmail.com>");
> +MODULE_DESCRIPTION("Realtek RTL2832 DVB-T demodulator driver");
> +MODULE_LICENSE("GPL");
> +MODULE_VERSION("0.5");
> diff --git a/drivers/media/dvb/frontends/rtl2832.h b/drivers/media/dvb/frontends/rtl2832.h
> new file mode 100644
> index 0000000..d94dc9a
> --- /dev/null
> +++ b/drivers/media/dvb/frontends/rtl2832.h
> @@ -0,0 +1,74 @@
> +/*
> + * Realtek RTL2832 DVB-T demodulator driver
> + *
> + * Copyright (C) 2012 Thomas Mair <thomas.mair86@gmail.com>
> + *
> + *	This program is free software; you can redistribute it and/or modify
> + *	it under the terms of the GNU General Public License as published by
> + *	the Free Software Foundation; either version 2 of the License, or
> + *	(at your option) any later version.
> + *
> + *	This program is distributed in the hope that it will be useful,
> + *	but WITHOUT ANY WARRANTY; without even the implied warranty of
> + *	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + *	GNU General Public License for more details.
> + *
> + *	You should have received a copy of the GNU General Public License along
> + *	with this program; if not, write to the Free Software Foundation, Inc.,
> + *	51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
> + */
> +
> +#ifndef RTL2832_H
> +#define RTL2832_H
> +
> +#include <linux/dvb/frontend.h>
> +
> +struct rtl2832_config {
> +	/*
> +	 * Demodulator I2C address.
> +	 */
> +	u8 i2c_addr;
> +
> +	/*
> +	 * Xtal frequency.
> +	 * Hz
> +	 * 4000000, 16000000, 25000000, 28800000
> +	 */
> +	u32 xtal;
> +
> +	/*
> +	 * IFs for all used modes.
> +	 * Hz
> +	 * 4570000, 4571429, 36000000, 36125000, 36166667, 44000000
> +	 */
> +	u32 if_dvbt;
> +
> +	/*
> +	 */
> +	u8 tuner;
> +};
> +
> +
> +#if defined(CONFIG_DVB_RTL2832) || \
> +	(defined(CONFIG_DVB_RTL2832_MODULE) && defined(MODULE))
> +extern struct dvb_frontend *rtl2832_attach(
> +	const struct rtl2832_config *cfg,
> +	struct i2c_adapter *i2c
> +);
> +
> +extern struct i2c_adapter *rtl2832_get_tuner_i2c_adapter(
> +	struct dvb_frontend *fe
> +);
> +#else
> +static inline struct dvb_frontend *rtl2832_attach(
> +	const struct rtl2832_config *config,
> +	struct i2c_adapter *i2c
> +)
> +{
> +	printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
> +	return NULL;
> +}
> +#endif
> +
> +
> +#endif /* RTL2832_H */
> diff --git a/drivers/media/dvb/frontends/rtl2832_priv.h b/drivers/media/dvb/frontends/rtl2832_priv.h
> new file mode 100644
> index 0000000..cd01a8a
> --- /dev/null
> +++ b/drivers/media/dvb/frontends/rtl2832_priv.h
> @@ -0,0 +1,260 @@
> +/*
> + * Realtek RTL2832 DVB-T demodulator driver
> + *
> + * Copyright (C) 2012 Thomas Mair <thomas.mair86@gmail.com>
> + *
> + *	This program is free software; you can redistribute it and/or modify
> + *	it under the terms of the GNU General Public License as published by
> + *	the Free Software Foundation; either version 2 of the License, or
> + *	(at your option) any later version.
> + *
> + *	This program is distributed in the hope that it will be useful,
> + *	but WITHOUT ANY WARRANTY; without even the implied warranty of
> + *	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + *	GNU General Public License for more details.
> + *
> + *	You should have received a copy of the GNU General Public License along
> + *	with this program; if not, write to the Free Software Foundation, Inc.,
> + *	51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
> + */
> +
> +#ifndef RTL2832_PRIV_H
> +#define RTL2832_PRIV_H
> +
> +#include "dvb_frontend.h"
> +#include "rtl2832.h"
> +
> +#define LOG_PREFIX "rtl2832"
> +
> +#undef dbg
> +#define dbg(f, arg...) \
> +do { \
> +	if (rtl2832_debug)  \
> +		printk(KERN_INFO     LOG_PREFIX": " f "\n" , ## arg); \
> +} while (0)
> +#undef err
> +#define err(f, arg...)  printk(KERN_ERR     LOG_PREFIX": " f "\n" , ## arg)
> +#undef info
> +#define info(f, arg...) printk(KERN_INFO    LOG_PREFIX": " f "\n" , ## arg)
> +#undef warn
> +#define warn(f, arg...) printk(KERN_WARNING LOG_PREFIX": " f "\n" , ## arg)
> +
> +struct rtl2832_priv {
> +	struct i2c_adapter *i2c;
> +	struct dvb_frontend fe;
> +	struct rtl2832_config cfg;
> +
> +	bool i2c_gate_state;
> +	bool sleeping;
> +
> +	u8 tuner;
> +	u8 page; /* active register page */
> +};
> +
> +struct rtl2832_reg_entry {
> +	u8 page;
> +	u8 start_address;
> +	u8 msb;
> +	u8 lsb;
> +};
> +
> +struct rtl2832_reg_value {
> +	int reg;
> +	u32 value;
> +};
> +
> +
> +/* Demod register bit names */
> +enum DVBT_REG_BIT_NAME {
> +	DVBT_SOFT_RST,
> +	DVBT_IIC_REPEAT,
> +	DVBT_TR_WAIT_MIN_8K,
> +	DVBT_RSD_BER_FAIL_VAL,
> +	DVBT_EN_BK_TRK,
> +	DVBT_REG_PI,
> +	DVBT_REG_PFREQ_1_0,
> +	DVBT_PD_DA8,
> +	DVBT_LOCK_TH,
> +	DVBT_BER_PASS_SCAL,
> +	DVBT_CE_FFSM_BYPASS,
> +	DVBT_ALPHAIIR_N,
> +	DVBT_ALPHAIIR_DIF,
> +	DVBT_EN_TRK_SPAN,
> +	DVBT_LOCK_TH_LEN,
> +	DVBT_CCI_THRE,
> +	DVBT_CCI_MON_SCAL,
> +	DVBT_CCI_M0,
> +	DVBT_CCI_M1,
> +	DVBT_CCI_M2,
> +	DVBT_CCI_M3,
> +	DVBT_SPEC_INIT_0,
> +	DVBT_SPEC_INIT_1,
> +	DVBT_SPEC_INIT_2,
> +	DVBT_AD_EN_REG,
> +	DVBT_AD_EN_REG1,
> +	DVBT_EN_BBIN,
> +	DVBT_MGD_THD0,
> +	DVBT_MGD_THD1,
> +	DVBT_MGD_THD2,
> +	DVBT_MGD_THD3,
> +	DVBT_MGD_THD4,
> +	DVBT_MGD_THD5,
> +	DVBT_MGD_THD6,
> +	DVBT_MGD_THD7,
> +	DVBT_EN_CACQ_NOTCH,
> +	DVBT_AD_AV_REF,
> +	DVBT_PIP_ON,
> +	DVBT_SCALE1_B92,
> +	DVBT_SCALE1_B93,
> +	DVBT_SCALE1_BA7,
> +	DVBT_SCALE1_BA9,
> +	DVBT_SCALE1_BAA,
> +	DVBT_SCALE1_BAB,
> +	DVBT_SCALE1_BAC,
> +	DVBT_SCALE1_BB0,
> +	DVBT_SCALE1_BB1,
> +	DVBT_KB_P1,
> +	DVBT_KB_P2,
> +	DVBT_KB_P3,
> +	DVBT_OPT_ADC_IQ,
> +	DVBT_AD_AVI,
> +	DVBT_AD_AVQ,
> +	DVBT_K1_CR_STEP12,
> +	DVBT_TRK_KS_P2,
> +	DVBT_TRK_KS_I2,
> +	DVBT_TR_THD_SET2,
> +	DVBT_TRK_KC_P2,
> +	DVBT_TRK_KC_I2,
> +	DVBT_CR_THD_SET2,
> +	DVBT_PSET_IFFREQ,
> +	DVBT_SPEC_INV,
> +	DVBT_BW_INDEX,
> +	DVBT_RSAMP_RATIO,
> +	DVBT_CFREQ_OFF_RATIO,
> +	DVBT_FSM_STAGE,
> +	DVBT_RX_CONSTEL,
> +	DVBT_RX_HIER,
> +	DVBT_RX_C_RATE_LP,
> +	DVBT_RX_C_RATE_HP,
> +	DVBT_GI_IDX,
> +	DVBT_FFT_MODE_IDX,
> +	DVBT_RSD_BER_EST,
> +	DVBT_CE_EST_EVM,
> +	DVBT_RF_AGC_VAL,
> +	DVBT_IF_AGC_VAL,
> +	DVBT_DAGC_VAL,
> +	DVBT_SFREQ_OFF,
> +	DVBT_CFREQ_OFF,
> +	DVBT_POLAR_RF_AGC,
> +	DVBT_POLAR_IF_AGC,
> +	DVBT_AAGC_HOLD,
> +	DVBT_EN_RF_AGC,
> +	DVBT_EN_IF_AGC,
> +	DVBT_IF_AGC_MIN,
> +	DVBT_IF_AGC_MAX,
> +	DVBT_RF_AGC_MIN,
> +	DVBT_RF_AGC_MAX,
> +	DVBT_IF_AGC_MAN,
> +	DVBT_IF_AGC_MAN_VAL,
> +	DVBT_RF_AGC_MAN,
> +	DVBT_RF_AGC_MAN_VAL,
> +	DVBT_DAGC_TRG_VAL,
> +	DVBT_AGC_TARG_VAL,
> +	DVBT_LOOP_GAIN_3_0,
> +	DVBT_LOOP_GAIN_4,
> +	DVBT_VTOP,
> +	DVBT_KRF,
> +	DVBT_AGC_TARG_VAL_0,
> +	DVBT_AGC_TARG_VAL_8_1,
> +	DVBT_AAGC_LOOP_GAIN,
> +	DVBT_LOOP_GAIN2_3_0,
> +	DVBT_LOOP_GAIN2_4,
> +	DVBT_LOOP_GAIN3,
> +	DVBT_VTOP1,
> +	DVBT_VTOP2,
> +	DVBT_VTOP3,
> +	DVBT_KRF1,
> +	DVBT_KRF2,
> +	DVBT_KRF3,
> +	DVBT_KRF4,
> +	DVBT_EN_GI_PGA,
> +	DVBT_THD_LOCK_UP,
> +	DVBT_THD_LOCK_DW,
> +	DVBT_THD_UP1,
> +	DVBT_THD_DW1,
> +	DVBT_INTER_CNT_LEN,
> +	DVBT_GI_PGA_STATE,
> +	DVBT_EN_AGC_PGA,
> +	DVBT_CKOUTPAR,
> +	DVBT_CKOUT_PWR,
> +	DVBT_SYNC_DUR,
> +	DVBT_ERR_DUR,
> +	DVBT_SYNC_LVL,
> +	DVBT_ERR_LVL,
> +	DVBT_VAL_LVL,
> +	DVBT_SERIAL,
> +	DVBT_SER_LSB,
> +	DVBT_CDIV_PH0,
> +	DVBT_CDIV_PH1,
> +	DVBT_MPEG_IO_OPT_2_2,
> +	DVBT_MPEG_IO_OPT_1_0,
> +	DVBT_CKOUTPAR_PIP,
> +	DVBT_CKOUT_PWR_PIP,
> +	DVBT_SYNC_LVL_PIP,
> +	DVBT_ERR_LVL_PIP,
> +	DVBT_VAL_LVL_PIP,
> +	DVBT_CKOUTPAR_PID,
> +	DVBT_CKOUT_PWR_PID,
> +	DVBT_SYNC_LVL_PID,
> +	DVBT_ERR_LVL_PID,
> +	DVBT_VAL_LVL_PID,
> +	DVBT_SM_PASS,
> +	DVBT_UPDATE_REG_2,
> +	DVBT_BTHD_P3,
> +	DVBT_BTHD_D3,
> +	DVBT_FUNC4_REG0,
> +	DVBT_FUNC4_REG1,
> +	DVBT_FUNC4_REG2,
> +	DVBT_FUNC4_REG3,
> +	DVBT_FUNC4_REG4,
> +	DVBT_FUNC4_REG5,
> +	DVBT_FUNC4_REG6,
> +	DVBT_FUNC4_REG7,
> +	DVBT_FUNC4_REG8,
> +	DVBT_FUNC4_REG9,
> +	DVBT_FUNC4_REG10,
> +	DVBT_FUNC5_REG0,
> +	DVBT_FUNC5_REG1,
> +	DVBT_FUNC5_REG2,
> +	DVBT_FUNC5_REG3,
> +	DVBT_FUNC5_REG4,
> +	DVBT_FUNC5_REG5,
> +	DVBT_FUNC5_REG6,
> +	DVBT_FUNC5_REG7,
> +	DVBT_FUNC5_REG8,
> +	DVBT_FUNC5_REG9,
> +	DVBT_FUNC5_REG10,
> +	DVBT_FUNC5_REG11,
> +	DVBT_FUNC5_REG12,
> +	DVBT_FUNC5_REG13,
> +	DVBT_FUNC5_REG14,
> +	DVBT_FUNC5_REG15,
> +	DVBT_FUNC5_REG16,
> +	DVBT_FUNC5_REG17,
> +	DVBT_FUNC5_REG18,
> +	DVBT_AD7_SETTING,
> +	DVBT_RSSI_R,
> +	DVBT_ACI_DET_IND,
> +	DVBT_REG_MON,
> +	DVBT_REG_MONSEL,
> +	DVBT_REG_GPE,
> +	DVBT_REG_GPO,
> +	DVBT_REG_4MSEL,
> +	DVBT_TEST_REG_1,
> +	DVBT_TEST_REG_2,
> +	DVBT_TEST_REG_3,
> +	DVBT_TEST_REG_4,
> +	DVBT_REG_BIT_NAME_ITEM_TERMINATOR,
> +};
> +
> +#endif /* RTL2832_PRIV_H */
> 



^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [PATCH v5 1/5] rtl2832 ver. 0.5: support for RTL2832 demod
  2012-07-05 14:32     ` Mauro Carvalho Chehab
@ 2012-07-05 14:35       ` Antti Palosaari
  2012-07-05 15:54         ` Mauro Carvalho Chehab
  2012-07-05 14:41       ` Antti Palosaari
  1 sibling, 1 reply; 104+ messages in thread
From: Antti Palosaari @ 2012-07-05 14:35 UTC (permalink / raw)
  To: Mauro Carvalho Chehab; +Cc: Thomas Mair, linux-media, pomidorabelisima

On 07/05/2012 05:32 PM, Mauro Carvalho Chehab wrote:
> Em 18-05-2012 15:47, Thomas Mair escreveu:
>> Changelog for ver. 0.5:
>> - fixed code style and naming errors
>>
>> Changelog for ver. 0.4:
>> - removed statistics as their calculation was wrong
>> - fixed bug in Makefile
>> - indentation and code style improvements
>>
>> Signed-off-by: Thomas Mair <thomas.mair86@googlemail.com>
>> ---
>>    drivers/media/dvb/frontends/Kconfig        |    7 +
>>    drivers/media/dvb/frontends/Makefile       |    1 +
>>    drivers/media/dvb/frontends/rtl2832.c      |  823 ++++++++++++++++++++++++++++
>>    drivers/media/dvb/frontends/rtl2832.h      |   74 +++
>>    drivers/media/dvb/frontends/rtl2832_priv.h |  260 +++++++++
>>    5 files changed, 1165 insertions(+), 0 deletions(-)
>>    create mode 100644 drivers/media/dvb/frontends/rtl2832.c
>>    create mode 100644 drivers/media/dvb/frontends/rtl2832.h
>>    create mode 100644 drivers/media/dvb/frontends/rtl2832_priv.h
>>
>> diff --git a/drivers/media/dvb/frontends/Kconfig b/drivers/media/dvb/frontends/Kconfig
>> index f479834..f7d67d7 100644
>> --- a/drivers/media/dvb/frontends/Kconfig
>> +++ b/drivers/media/dvb/frontends/Kconfig
>> @@ -432,6 +432,13 @@ config DVB_RTL2830
>>    	help
>>    	  Say Y when you want to support this frontend.
>>
>> +config DVB_RTL2832
>> +	tristate "Realtek RTL2832 DVB-T"
>> +	depends on DVB_CORE && I2C
>> +	default m if DVB_FE_CUSTOMISE
>> +	help
>> +	  Say Y when you want to support this frontend.
>> +
>>    comment "DVB-C (cable) frontends"
>>    	depends on DVB_CORE
>>
>> diff --git a/drivers/media/dvb/frontends/Makefile b/drivers/media/dvb/frontends/Makefile
>> index b0381dc..2279c5d 100644
>> --- a/drivers/media/dvb/frontends/Makefile
>> +++ b/drivers/media/dvb/frontends/Makefile
>> @@ -98,6 +98,7 @@ obj-$(CONFIG_DVB_IT913X_FE) += it913x-fe.o
>>    obj-$(CONFIG_DVB_A8293) += a8293.o
>>    obj-$(CONFIG_DVB_TDA10071) += tda10071.o
>>    obj-$(CONFIG_DVB_RTL2830) += rtl2830.o
>> +obj-$(CONFIG_DVB_RTL2832) += rtl2832.o
>>    obj-$(CONFIG_DVB_M88RS2000) += m88rs2000.o
>>    obj-$(CONFIG_DVB_AF9033) += af9033.o
>>
>> diff --git a/drivers/media/dvb/frontends/rtl2832.c b/drivers/media/dvb/frontends/rtl2832.c
>> new file mode 100644
>> index 0000000..d0cbe27
>> --- /dev/null
>> +++ b/drivers/media/dvb/frontends/rtl2832.c
>> @@ -0,0 +1,823 @@
>> +/*
>> + * Realtek RTL2832 DVB-T demodulator driver
>> + *
>> + * Copyright (C) 2012 Thomas Mair <thomas.mair86@gmail.com>
>> + *
>> + *	This program is free software; you can redistribute it and/or modify
>> + *	it under the terms of the GNU General Public License as published by
>> + *	the Free Software Foundation; either version 2 of the License, or
>> + *	(at your option) any later version.
>> + *
>> + *	This program is distributed in the hope that it will be useful,
>> + *	but WITHOUT ANY WARRANTY; without even the implied warranty of
>> + *	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>> + *	GNU General Public License for more details.
>> + *
>> + *	You should have received a copy of the GNU General Public License along
>> + *	with this program; if not, write to the Free Software Foundation, Inc.,
>> + *	51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
>> + */
>> +
>> +#include "rtl2832_priv.h"
>> +
>> +
>> +int rtl2832_debug;
>> +module_param_named(debug, rtl2832_debug, int, 0644);
>> +MODULE_PARM_DESC(debug, "Turn on/off frontend debugging (default:off).");
>> +
>> +
>> +static const int reg_mask[32] = {
>> +	0x00000001,
>> +	0x00000003,
>> +	0x00000007,
>> +	0x0000000f,
>> +	0x0000001f,
>> +	0x0000003f,
>> +	0x0000007f,
>> +	0x000000ff,
>> +	0x000001ff,
>> +	0x000003ff,
>> +	0x000007ff,
>> +	0x00000fff,
>> +	0x00001fff,
>> +	0x00003fff,
>> +	0x00007fff,
>> +	0x0000ffff,
>> +	0x0001ffff,
>> +	0x0003ffff,
>> +	0x0007ffff,
>> +	0x000fffff,
>> +	0x001fffff,
>> +	0x003fffff,
>> +	0x007fffff,
>> +	0x00ffffff,
>> +	0x01ffffff,
>> +	0x03ffffff,
>> +	0x07ffffff,
>> +	0x0fffffff,
>> +	0x1fffffff,
>> +	0x3fffffff,
>> +	0x7fffffff,
>> +	0xffffffff
>> +};
>
> It would be better to use a macro here like:
>
> #define REG_MASK(b)	((1 << ((b) + 1)) -1)
>
> Even better, you could use the bitops.h BIT() macro:
>
> #define REG_MASK(b)	(BIT(b + 1) - 1)

I said also that once for Thomas during review but he didn't changed it :)

>
>> +
>> +static const struct rtl2832_reg_entry registers[] = {
>> +	[DVBT_SOFT_RST]		= {0x1, 0x1,   2, 2},
>> +	[DVBT_IIC_REPEAT]	= {0x1, 0x1,   3, 3},
>> +	[DVBT_TR_WAIT_MIN_8K]	= {0x1, 0x88, 11, 2},
>> +	[DVBT_RSD_BER_FAIL_VAL]	= {0x1, 0x8f, 15, 0},
>> +	[DVBT_EN_BK_TRK]	= {0x1, 0xa6,  7, 7},
>> +	[DVBT_AD_EN_REG]	= {0x0, 0x8,   7, 7},
>> +	[DVBT_AD_EN_REG1]	= {0x0, 0x8,   6, 6},
>> +	[DVBT_EN_BBIN]		= {0x1, 0xb1,  0, 0},
>> +	[DVBT_MGD_THD0]		= {0x1, 0x95,  7, 0},
>> +	[DVBT_MGD_THD1]		= {0x1, 0x96,  7, 0},
>> +	[DVBT_MGD_THD2]		= {0x1, 0x97,  7, 0},
>> +	[DVBT_MGD_THD3]		= {0x1, 0x98,  7, 0},
>> +	[DVBT_MGD_THD4]		= {0x1, 0x99,  7, 0},
>> +	[DVBT_MGD_THD5]		= {0x1, 0x9a,  7, 0},
>> +	[DVBT_MGD_THD6]		= {0x1, 0x9b,  7, 0},
>> +	[DVBT_MGD_THD7]		= {0x1, 0x9c,  7, 0},
>> +	[DVBT_EN_CACQ_NOTCH]	= {0x1, 0x61,  4, 4},
>> +	[DVBT_AD_AV_REF]	= {0x0, 0x9,   6, 0},
>> +	[DVBT_REG_PI]		= {0x0, 0xa,   2, 0},
>> +	[DVBT_PIP_ON]		= {0x0, 0x21,  3, 3},
>> +	[DVBT_SCALE1_B92]	= {0x2, 0x92,  7, 0},
>> +	[DVBT_SCALE1_B93]	= {0x2, 0x93,  7, 0},
>> +	[DVBT_SCALE1_BA7]	= {0x2, 0xa7,  7, 0},
>> +	[DVBT_SCALE1_BA9]	= {0x2, 0xa9,  7, 0},
>> +	[DVBT_SCALE1_BAA]	= {0x2, 0xaa,  7, 0},
>> +	[DVBT_SCALE1_BAB]	= {0x2, 0xab,  7, 0},
>> +	[DVBT_SCALE1_BAC]	= {0x2, 0xac,  7, 0},
>> +	[DVBT_SCALE1_BB0]	= {0x2, 0xb0,  7, 0},
>> +	[DVBT_SCALE1_BB1]	= {0x2, 0xb1,  7, 0},
>> +	[DVBT_KB_P1]		= {0x1, 0x64,  3, 1},
>> +	[DVBT_KB_P2]		= {0x1, 0x64,  6, 4},
>> +	[DVBT_KB_P3]		= {0x1, 0x65,  2, 0},
>> +	[DVBT_OPT_ADC_IQ]	= {0x0, 0x6,   5, 4},
>> +	[DVBT_AD_AVI]		= {0x0, 0x9,   1, 0},
>> +	[DVBT_AD_AVQ]		= {0x0, 0x9,   3, 2},
>> +	[DVBT_K1_CR_STEP12]	= {0x2, 0xad,  9, 4},
>> +	[DVBT_TRK_KS_P2]	= {0x1, 0x6f,  2, 0},
>> +	[DVBT_TRK_KS_I2]	= {0x1, 0x70,  5, 3},
>> +	[DVBT_TR_THD_SET2]	= {0x1, 0x72,  3, 0},
>> +	[DVBT_TRK_KC_P2]	= {0x1, 0x73,  5, 3},
>> +	[DVBT_TRK_KC_I2]	= {0x1, 0x75,  2, 0},
>> +	[DVBT_CR_THD_SET2]	= {0x1, 0x76,  7, 6},
>> +	[DVBT_PSET_IFFREQ]	= {0x1, 0x19, 21, 0},
>> +	[DVBT_SPEC_INV]		= {0x1, 0x15,  0, 0},
>> +	[DVBT_RSAMP_RATIO]	= {0x1, 0x9f, 27, 2},
>> +	[DVBT_CFREQ_OFF_RATIO]	= {0x1, 0x9d, 23, 4},
>> +	[DVBT_FSM_STAGE]	= {0x3, 0x51,  6, 3},
>> +	[DVBT_RX_CONSTEL]	= {0x3, 0x3c,  3, 2},
>> +	[DVBT_RX_HIER]		= {0x3, 0x3c,  6, 4},
>> +	[DVBT_RX_C_RATE_LP]	= {0x3, 0x3d,  2, 0},
>> +	[DVBT_RX_C_RATE_HP]	= {0x3, 0x3d,  5, 3},
>> +	[DVBT_GI_IDX]		= {0x3, 0x51,  1, 0},
>> +	[DVBT_FFT_MODE_IDX]	= {0x3, 0x51,  2, 2},
>> +	[DVBT_RSD_BER_EST]	= {0x3, 0x4e, 15, 0},
>> +	[DVBT_CE_EST_EVM]	= {0x4, 0xc,  15, 0},
>> +	[DVBT_RF_AGC_VAL]	= {0x3, 0x5b, 13, 0},
>> +	[DVBT_IF_AGC_VAL]	= {0x3, 0x59, 13, 0},
>> +	[DVBT_DAGC_VAL]		= {0x3, 0x5,   7, 0},
>> +	[DVBT_SFREQ_OFF]	= {0x3, 0x18, 13, 0},
>> +	[DVBT_CFREQ_OFF]	= {0x3, 0x5f, 17, 0},
>> +	[DVBT_POLAR_RF_AGC]	= {0x0, 0xe,   1, 1},
>> +	[DVBT_POLAR_IF_AGC]	= {0x0, 0xe,   0, 0},
>> +	[DVBT_AAGC_HOLD]	= {0x1, 0x4,   5, 5},
>> +	[DVBT_EN_RF_AGC]	= {0x1, 0x4,   6, 6},
>> +	[DVBT_EN_IF_AGC]	= {0x1, 0x4,   7, 7},
>> +	[DVBT_IF_AGC_MIN]	= {0x1, 0x8,   7, 0},
>> +	[DVBT_IF_AGC_MAX]	= {0x1, 0x9,   7, 0},
>> +	[DVBT_RF_AGC_MIN]	= {0x1, 0xa,   7, 0},
>> +	[DVBT_RF_AGC_MAX]	= {0x1, 0xb,   7, 0},
>> +	[DVBT_IF_AGC_MAN]	= {0x1, 0xc,   6, 6},
>> +	[DVBT_IF_AGC_MAN_VAL]	= {0x1, 0xc,  13, 0},
>> +	[DVBT_RF_AGC_MAN]	= {0x1, 0xe,   6, 6},
>> +	[DVBT_RF_AGC_MAN_VAL]	= {0x1, 0xe,  13, 0},
>> +	[DVBT_DAGC_TRG_VAL]	= {0x1, 0x12,  7, 0},
>> +	[DVBT_AGC_TARG_VAL_0]	= {0x1, 0x2,   0, 0},
>> +	[DVBT_AGC_TARG_VAL_8_1]	= {0x1, 0x3,   7, 0},
>> +	[DVBT_AAGC_LOOP_GAIN]	= {0x1, 0xc7,  5, 1},
>> +	[DVBT_LOOP_GAIN2_3_0]	= {0x1, 0x4,   4, 1},
>> +	[DVBT_LOOP_GAIN2_4]	= {0x1, 0x5,   7, 7},
>> +	[DVBT_LOOP_GAIN3]	= {0x1, 0xc8,  4, 0},
>> +	[DVBT_VTOP1]		= {0x1, 0x6,   5, 0},
>> +	[DVBT_VTOP2]		= {0x1, 0xc9,  5, 0},
>> +	[DVBT_VTOP3]		= {0x1, 0xca,  5, 0},
>> +	[DVBT_KRF1]		= {0x1, 0xcb,  7, 0},
>> +	[DVBT_KRF2]		= {0x1, 0x7,   7, 0},
>> +	[DVBT_KRF3]		= {0x1, 0xcd,  7, 0},
>> +	[DVBT_KRF4]		= {0x1, 0xce,  7, 0},
>> +	[DVBT_EN_GI_PGA]	= {0x1, 0xe5,  0, 0},
>> +	[DVBT_THD_LOCK_UP]	= {0x1, 0xd9,  8, 0},
>> +	[DVBT_THD_LOCK_DW]	= {0x1, 0xdb,  8, 0},
>> +	[DVBT_THD_UP1]		= {0x1, 0xdd,  7, 0},
>> +	[DVBT_THD_DW1]		= {0x1, 0xde,  7, 0},
>> +	[DVBT_INTER_CNT_LEN]	= {0x1, 0xd8,  3, 0},
>> +	[DVBT_GI_PGA_STATE]	= {0x1, 0xe6,  3, 3},
>> +	[DVBT_EN_AGC_PGA]	= {0x1, 0xd7,  0, 0},
>> +	[DVBT_CKOUTPAR]		= {0x1, 0x7b,  5, 5},
>> +	[DVBT_CKOUT_PWR]	= {0x1, 0x7b,  6, 6},
>> +	[DVBT_SYNC_DUR]		= {0x1, 0x7b,  7, 7},
>> +	[DVBT_ERR_DUR]		= {0x1, 0x7c,  0, 0},
>> +	[DVBT_SYNC_LVL]		= {0x1, 0x7c,  1, 1},
>> +	[DVBT_ERR_LVL]		= {0x1, 0x7c,  2, 2},
>> +	[DVBT_VAL_LVL]		= {0x1, 0x7c,  3, 3},
>> +	[DVBT_SERIAL]		= {0x1, 0x7c,  4, 4},
>> +	[DVBT_SER_LSB]		= {0x1, 0x7c,  5, 5},
>> +	[DVBT_CDIV_PH0]		= {0x1, 0x7d,  3, 0},
>> +	[DVBT_CDIV_PH1]		= {0x1, 0x7d,  7, 4},
>> +	[DVBT_MPEG_IO_OPT_2_2]	= {0x0, 0x6,   7, 7},
>> +	[DVBT_MPEG_IO_OPT_1_0]	= {0x0, 0x7,   7, 6},
>> +	[DVBT_CKOUTPAR_PIP]	= {0x0, 0xb7,  4, 4},
>> +	[DVBT_CKOUT_PWR_PIP]	= {0x0, 0xb7,  3, 3},
>> +	[DVBT_SYNC_LVL_PIP]	= {0x0, 0xb7,  2, 2},
>> +	[DVBT_ERR_LVL_PIP]	= {0x0, 0xb7,  1, 1},
>> +	[DVBT_VAL_LVL_PIP]	= {0x0, 0xb7,  0, 0},
>> +	[DVBT_CKOUTPAR_PID]	= {0x0, 0xb9,  4, 4},
>> +	[DVBT_CKOUT_PWR_PID]	= {0x0, 0xb9,  3, 3},
>> +	[DVBT_SYNC_LVL_PID]	= {0x0, 0xb9,  2, 2},
>> +	[DVBT_ERR_LVL_PID]	= {0x0, 0xb9,  1, 1},
>> +	[DVBT_VAL_LVL_PID]	= {0x0, 0xb9,  0, 0},
>> +	[DVBT_SM_PASS]		= {0x1, 0x93, 11, 0},
>> +	[DVBT_AD7_SETTING]	= {0x0, 0x11, 15, 0},
>> +	[DVBT_RSSI_R]		= {0x3, 0x1,   6, 0},
>> +	[DVBT_ACI_DET_IND]	= {0x3, 0x12,  0, 0},
>> +	[DVBT_REG_MON]		= {0x0, 0xd,   1, 0},
>> +	[DVBT_REG_MONSEL]	= {0x0, 0xd,   2, 2},
>> +	[DVBT_REG_GPE]		= {0x0, 0xd,   7, 7},
>> +	[DVBT_REG_GPO]		= {0x0, 0x10,  0, 0},
>> +	[DVBT_REG_4MSEL]	= {0x0, 0x13,  0, 0},
>> +};
>> +
>> +/* write multiple hardware registers */
>> +static int rtl2832_wr(struct rtl2832_priv *priv, u8 reg, u8 *val, int len)
>> +{
>> +	int ret;
>> +	u8 buf[1+len];
>> +	struct i2c_msg msg[1] = {
>> +		{
>> +			.addr = priv->cfg.i2c_addr,
>> +			.flags = 0,
>> +			.len = 1+len,
>> +			.buf = buf,
>> +		}
>> +	};
>> +
>> +	buf[0] = reg;
>> +	memcpy(&buf[1], val, len);
>> +
>> +	ret = i2c_transfer(priv->i2c, msg, 1);
>> +	if (ret == 1) {
>> +		ret = 0;
>> +	} else {
>> +		warn("i2c wr failed=%d reg=%02x len=%d", ret, reg, len);
>> +		ret = -EREMOTEIO;
>> +	}
>> +	return ret;
>> +}
>> +
>> +/* read multiple hardware registers */
>> +static int rtl2832_rd(struct rtl2832_priv *priv, u8 reg, u8 *val, int len)
>> +{
>> +	int ret;
>> +	struct i2c_msg msg[2] = {
>> +		{
>> +			.addr = priv->cfg.i2c_addr,
>> +			.flags = 0,
>> +			.len = 1,
>> +			.buf = &reg,
>> +		}, {
>> +			.addr = priv->cfg.i2c_addr,
>> +			.flags = I2C_M_RD,
>> +			.len = len,
>> +			.buf = val,
>> +		}
>> +	};
>> +
>> +	ret = i2c_transfer(priv->i2c, msg, 2);
>> +	if (ret == 2) {
>> +		ret = 0;
>> +	} else {
>> +		warn("i2c rd failed=%d reg=%02x len=%d", ret, reg, len);
>> +		ret = -EREMOTEIO;
>> +}
>> +return ret;
>> +}
>> +
>> +/* write multiple registers */
>> +static int rtl2832_wr_regs(struct rtl2832_priv *priv, u8 reg, u8 page, u8 *val,
>> +	int len)
>> +{
>> +	int ret;
>> +
>> +
>> +	/* switch bank if needed */
>> +	if (page != priv->page) {
>> +		ret = rtl2832_wr(priv, 0x00, &page, 1);
>> +		if (ret)
>> +			return ret;
>> +
>> +		priv->page = page;
>> +}
>> +
>> +return rtl2832_wr(priv, reg, val, len);
>> +}
>> +
>> +/* read multiple registers */
>> +static int rtl2832_rd_regs(struct rtl2832_priv *priv, u8 reg, u8 page, u8 *val,
>> +	int len)
>> +{
>> +	int ret;
>> +
>> +	/* switch bank if needed */
>> +	if (page != priv->page) {
>> +		ret = rtl2832_wr(priv, 0x00, &page, 1);
>> +		if (ret)
>> +			return ret;
>> +
>> +		priv->page = page;
>> +	}
>> +
>> +	return rtl2832_rd(priv, reg, val, len);
>> +}
>> +
>> +#if 0 /* currently not used */
>> +/* write single register */
>> +static int rtl2832_wr_reg(struct rtl2832_priv *priv, u8 reg, u8 page, u8 val)
>> +{
>> +	return rtl2832_wr_regs(priv, reg, page, &val, 1);
>> +}
>> +#endif
>> +
>> +/* read single register */
>> +static int rtl2832_rd_reg(struct rtl2832_priv *priv, u8 reg, u8 page, u8 *val)
>> +{
>> +	return rtl2832_rd_regs(priv, reg, page, val, 1);
>> +}
>> +
>> +int rtl2832_rd_demod_reg(struct rtl2832_priv *priv, int reg, u32 *val)
>> +{
>> +	int ret;
>> +
>> +	u8 reg_start_addr;
>> +	u8 msb, lsb;
>> +	u8 page;
>> +	u8 reading[4];
>> +	u32 reading_tmp;
>> +	int i;
>> +
>> +	u8 len;
>> +	u32 mask;
>> +
>> +	reg_start_addr = registers[reg].start_address;
>> +	msb = registers[reg].msb;
>> +	lsb = registers[reg].lsb;
>> +	page = registers[reg].page;
>> +
>> +	len = (msb >> 3) + 1;
>> +	mask = reg_mask[msb - lsb];
>> +
>> +	ret = rtl2832_rd_regs(priv, reg_start_addr, page, &reading[0], len);
>> +	if (ret)
>> +		goto err;
>> +
>> +	reading_tmp = 0;
>> +	for (i = 0; i < len; i++)
>> +		reading_tmp |= reading[i] << ((len - 1 - i) * 8);
>> +
>> +	*val = (reading_tmp >> lsb) & mask;
>> +
>> +	return ret;
>> +
>> +err:
>> +	dbg("%s: failed=%d", __func__, ret);
>> +	return ret;
>> +
>> +}
>> +
>> +int rtl2832_wr_demod_reg(struct rtl2832_priv *priv, int reg, u32 val)
>> +{
>> +	int ret, i;
>> +	u8 len;
>> +	u8 reg_start_addr;
>> +	u8 msb, lsb;
>> +	u8 page;
>> +	u32 mask;
>> +
>> +
>> +	u8 reading[4];
>> +	u8 writing[4];
>> +	u32 reading_tmp;
>> +	u32 writing_tmp;
>> +
>> +
>> +	reg_start_addr = registers[reg].start_address;
>> +	msb = registers[reg].msb;
>> +	lsb = registers[reg].lsb;
>> +	page = registers[reg].page;
>> +
>> +	len = (msb >> 3) + 1;
>> +	mask = reg_mask[msb - lsb];
>> +
>> +
>> +	ret = rtl2832_rd_regs(priv, reg_start_addr, page, &reading[0], len);
>> +	if (ret)
>> +		goto err;
>> +
>> +	reading_tmp = 0;
>> +	for (i = 0; i < len; i++)
>> +		reading_tmp |= reading[i] << ((len - 1 - i) * 8);
>> +
>> +	writing_tmp = reading_tmp & ~(mask << lsb);
>> +	writing_tmp |= ((val & mask) << lsb);
>> +
>> +
>> +	for (i = 0; i < len; i++)
>> +		writing[i] = (writing_tmp >> ((len - 1 - i) * 8)) & 0xff;
>> +
>> +	ret = rtl2832_wr_regs(priv, reg_start_addr, page, &writing[0], len);
>> +	if (ret)
>> +		goto err;
>> +
>> +	return ret;
>> +
>> +err:
>> +	dbg("%s: failed=%d", __func__, ret);
>> +	return ret;
>> +
>> +}
>> +
>> +
>> +static int rtl2832_i2c_gate_ctrl(struct dvb_frontend *fe, int enable)
>> +{
>> +	int ret;
>> +	struct rtl2832_priv *priv = fe->demodulator_priv;
>> +
>> +	dbg("%s: enable=%d", __func__, enable);
>> +
>> +	/* gate already open or close */
>> +	if (priv->i2c_gate_state == enable)
>> +		return 0;
>> +
>> +	ret = rtl2832_wr_demod_reg(priv, DVBT_IIC_REPEAT, (enable ? 0x1 : 0x0));
>> +	if (ret)
>> +		goto err;
>> +
>> +	priv->i2c_gate_state = enable;
>> +
>> +	return ret;
>> +err:
>> +	dbg("%s: failed=%d", __func__, ret);
>> +	return ret;
>> +}
>> +
>> +
>> +
>> +static int rtl2832_init(struct dvb_frontend *fe)
>> +{
>> +	struct rtl2832_priv *priv = fe->demodulator_priv;
>> +	int i, ret;
>> +
>> +	u8 en_bbin;
>> +	u64 pset_iffreq;
>> +
>> +	/* initialization values for the demodulator registers */
>> +	struct rtl2832_reg_value rtl2832_initial_regs[] = {
>
> Please, declare it with const.
>
>> +		{DVBT_AD_EN_REG,		0x1},
>> +		{DVBT_AD_EN_REG1,		0x1},
>> +		{DVBT_RSD_BER_FAIL_VAL,		0x2800},
>> +		{DVBT_MGD_THD0,			0x10},
>> +		{DVBT_MGD_THD1,			0x20},
>> +		{DVBT_MGD_THD2,			0x20},
>> +		{DVBT_MGD_THD3,			0x40},
>> +		{DVBT_MGD_THD4,			0x22},
>> +		{DVBT_MGD_THD5,			0x32},
>> +		{DVBT_MGD_THD6,			0x37},
>> +		{DVBT_MGD_THD7,			0x39},
>> +		{DVBT_EN_BK_TRK,		0x0},
>> +		{DVBT_EN_CACQ_NOTCH,		0x0},
>> +		{DVBT_AD_AV_REF,		0x2a},
>> +		{DVBT_REG_PI,			0x6},
>> +		{DVBT_PIP_ON,			0x0},
>> +		{DVBT_CDIV_PH0,			0x8},
>> +		{DVBT_CDIV_PH1,			0x8},
>> +		{DVBT_SCALE1_B92,		0x4},
>> +		{DVBT_SCALE1_B93,		0xb0},
>> +		{DVBT_SCALE1_BA7,		0x78},
>> +		{DVBT_SCALE1_BA9,		0x28},
>> +		{DVBT_SCALE1_BAA,		0x59},
>> +		{DVBT_SCALE1_BAB,		0x83},
>> +		{DVBT_SCALE1_BAC,		0xd4},
>> +		{DVBT_SCALE1_BB0,		0x65},
>> +		{DVBT_SCALE1_BB1,		0x43},
>> +		{DVBT_KB_P1,			0x1},
>> +		{DVBT_KB_P2,			0x4},
>> +		{DVBT_KB_P3,			0x7},
>> +		{DVBT_K1_CR_STEP12,		0xa},
>> +		{DVBT_REG_GPE,			0x1},
>> +		{DVBT_SERIAL,			0x0},
>> +		{DVBT_CDIV_PH0,			0x9},
>> +		{DVBT_CDIV_PH1,			0x9},
>> +		{DVBT_MPEG_IO_OPT_2_2,		0x0},
>> +		{DVBT_MPEG_IO_OPT_1_0,		0x0},
>> +		{DVBT_TRK_KS_P2,		0x4},
>> +		{DVBT_TRK_KS_I2,		0x7},
>> +		{DVBT_TR_THD_SET2,		0x6},
>> +		{DVBT_TRK_KC_I2,		0x5},
>> +		{DVBT_CR_THD_SET2,		0x1},
>> +		{DVBT_SPEC_INV,			0x0},
>> +		{DVBT_DAGC_TRG_VAL,		0x5a},
>> +		{DVBT_AGC_TARG_VAL_0,		0x0},
>> +		{DVBT_AGC_TARG_VAL_8_1,		0x5a},
>> +		{DVBT_AAGC_LOOP_GAIN,		0x16},
>> +		{DVBT_LOOP_GAIN2_3_0,		0x6},
>> +		{DVBT_LOOP_GAIN2_4,		0x1},
>> +		{DVBT_LOOP_GAIN3,		0x16},
>> +		{DVBT_VTOP1,			0x35},
>> +		{DVBT_VTOP2,			0x21},
>> +		{DVBT_VTOP3,			0x21},
>> +		{DVBT_KRF1,			0x0},
>> +		{DVBT_KRF2,			0x40},
>> +		{DVBT_KRF3,			0x10},
>> +		{DVBT_KRF4,			0x10},
>> +		{DVBT_IF_AGC_MIN,		0x80},
>> +		{DVBT_IF_AGC_MAX,		0x7f},
>> +		{DVBT_RF_AGC_MIN,		0x80},
>> +		{DVBT_RF_AGC_MAX,		0x7f},
>> +		{DVBT_POLAR_RF_AGC,		0x0},
>> +		{DVBT_POLAR_IF_AGC,		0x0},
>> +		{DVBT_AD7_SETTING,		0xe9bf},
>> +		{DVBT_EN_GI_PGA,		0x0},
>> +		{DVBT_THD_LOCK_UP,		0x0},
>> +		{DVBT_THD_LOCK_DW,		0x0},
>> +		{DVBT_THD_UP1,			0x11},
>> +		{DVBT_THD_DW1,			0xef},
>> +		{DVBT_INTER_CNT_LEN,		0xc},
>> +		{DVBT_GI_PGA_STATE,		0x0},
>> +		{DVBT_EN_AGC_PGA,		0x1},
>> +		{DVBT_IF_AGC_MAN,		0x0},
>> +	};
>> +
>> +
>> +	dbg("%s", __func__);
>> +
>> +	en_bbin = (priv->cfg.if_dvbt == 0 ? 0x1 : 0x0);
>> +
>> +	/*
>> +	* PSET_IFFREQ = - floor((IfFreqHz % CrystalFreqHz) * pow(2, 22)
>> +	*		/ CrystalFreqHz)
>> +	*/
>> +	pset_iffreq = priv->cfg.if_dvbt % priv->cfg.xtal;
>> +	pset_iffreq *= 0x400000;
>> +	pset_iffreq = div_u64(pset_iffreq, priv->cfg.xtal);
>> +	pset_iffreq = pset_iffreq & 0x3fffff;
>> +
>> +
>> +
>> +	for (i = 0; i < ARRAY_SIZE(rtl2832_initial_regs); i++) {
>> +		ret = rtl2832_wr_demod_reg(priv, rtl2832_initial_regs[i].reg,
>> +			rtl2832_initial_regs[i].value);
>> +		if (ret)
>> +			goto err;
>> +	}
>> +
>> +	/* if frequency settings */
>> +	ret = rtl2832_wr_demod_reg(priv, DVBT_EN_BBIN, en_bbin);
>> +		if (ret)
>> +			goto err;
>> +
>> +	ret = rtl2832_wr_demod_reg(priv, DVBT_PSET_IFFREQ, pset_iffreq);
>> +		if (ret)
>> +			goto err;
>> +
>> +	priv->sleeping = false;
>> +
>> +	return ret;
>> +
>> +err:
>> +	dbg("%s: failed=%d", __func__, ret);
>> +	return ret;
>> +}
>> +
>> +static int rtl2832_sleep(struct dvb_frontend *fe)
>> +{
>> +	struct rtl2832_priv *priv = fe->demodulator_priv;
>> +
>> +	dbg("%s", __func__);
>> +	priv->sleeping = true;
>> +	return 0;
>> +}
>> +
>> +int rtl2832_get_tune_settings(struct dvb_frontend *fe,
>> +	struct dvb_frontend_tune_settings *s)
>> +{
>> +	dbg("%s", __func__);
>> +	s->min_delay_ms = 1000;
>> +	s->step_size = fe->ops.info.frequency_stepsize * 2;
>> +	s->max_drift = (fe->ops.info.frequency_stepsize * 2) + 1;
>> +	return 0;
>> +}
>> +
>> +static int rtl2832_set_frontend(struct dvb_frontend *fe)
>> +{
>> +	struct rtl2832_priv *priv = fe->demodulator_priv;
>> +	struct dtv_frontend_properties *c = &fe->dtv_property_cache;
>> +	int ret, i, j;
>> +	u64 bw_mode, num, num2;
>> +	u32 resamp_ratio, cfreq_off_ratio;
>> +
>> +
>> +	static u8 bw_params[3][32] = {
>> +	/* 6 MHz bandwidth */
>> +		{
>> +		0xf5, 0xff, 0x15, 0x38, 0x5d, 0x6d, 0x52, 0x07, 0xfa, 0x2f,
>> +		0x53, 0xf5, 0x3f, 0xca, 0x0b, 0x91, 0xea, 0x30, 0x63, 0xb2,
>> +		0x13, 0xda, 0x0b, 0xc4, 0x18, 0x7e, 0x16, 0x66, 0x08, 0x67,
>> +		0x19, 0xe0,
>> +		},
>> +
>> +	/*  7 MHz bandwidth */
>> +		{
>> +		0xe7, 0xcc, 0xb5, 0xba, 0xe8, 0x2f, 0x67, 0x61, 0x00, 0xaf,
>> +		0x86, 0xf2, 0xbf, 0x59, 0x04, 0x11, 0xb6, 0x33, 0xa4, 0x30,
>> +		0x15, 0x10, 0x0a, 0x42, 0x18, 0xf8, 0x17, 0xd9, 0x07, 0x22,
>> +		0x19, 0x10,
>> +		},
>> +
>> +	/*  8 MHz bandwidth */
>> +		{
>> +		0x09, 0xf6, 0xd2, 0xa7, 0x9a, 0xc9, 0x27, 0x77, 0x06, 0xbf,
>> +		0xec, 0xf4, 0x4f, 0x0b, 0xfc, 0x01, 0x63, 0x35, 0x54, 0xa7,
>> +		0x16, 0x66, 0x08, 0xb4, 0x19, 0x6e, 0x19, 0x65, 0x05, 0xc8,
>> +		0x19, 0xe0,
>> +		},
>> +	};
>> +
>> +
>> +	dbg("%s: frequency=%d bandwidth_hz=%d inversion=%d", __func__,
>> +		c->frequency, c->bandwidth_hz, c->inversion);
>> +
>> +
>> +	/* program tuner */
>> +	if (fe->ops.tuner_ops.set_params)
>> +		fe->ops.tuner_ops.set_params(fe);
>> +
>> +
>> +	switch (c->bandwidth_hz) {
>> +	case 6000000:
>> +		i = 0;
>> +		bw_mode = 48000000;
>> +		break;
>> +	case 7000000:
>> +		i = 1;
>> +		bw_mode = 56000000;
>> +		break;
>> +	case 8000000:
>> +		i = 2;
>> +		bw_mode = 64000000;
>> +		break;
>> +	default:
>> +		dbg("invalid bandwidth");
>> +		return -EINVAL;
>> +	}
>> +
>> +	for (j = 0; j < sizeof(bw_params[j]); j++) {
>> +		ret = rtl2832_wr_regs(priv, 0x1c+j, 1, &bw_params[i][j], 1);
>> +		if (ret)
>> +			goto err;
>> +	}
>> +
>> +	/* calculate and set resample ratio
>> +	* RSAMP_RATIO = floor(CrystalFreqHz * 7 * pow(2, 22)
>> +	*	/ ConstWithBandwidthMode)
>> +	*/
>> +	num = priv->cfg.xtal * 7;
>> +	num *= 0x400000;
>> +	num = div_u64(num, bw_mode);
>> +	resamp_ratio =  num & 0x3ffffff;
>> +	ret = rtl2832_wr_demod_reg(priv, DVBT_RSAMP_RATIO, resamp_ratio);
>> +	if (ret)
>> +		goto err;
>> +
>> +	/* calculate and set cfreq off ratio
>> +	* CFREQ_OFF_RATIO = - floor(ConstWithBandwidthMode * pow(2, 20)
>> +	*	/ (CrystalFreqHz * 7))
>> +	*/
>> +	num = bw_mode << 20;
>> +	num2 = priv->cfg.xtal * 7;
>> +	num = div_u64(num, num2);
>> +	num = -num;
>> +	cfreq_off_ratio = num & 0xfffff;
>> +	ret = rtl2832_wr_demod_reg(priv, DVBT_CFREQ_OFF_RATIO, cfreq_off_ratio);
>> +	if (ret)
>> +		goto err;
>> +
>> +
>> +	/* soft reset */
>> +	ret = rtl2832_wr_demod_reg(priv, DVBT_SOFT_RST, 0x1);
>> +	if (ret)
>> +		goto err;
>> +
>> +	ret = rtl2832_wr_demod_reg(priv, DVBT_SOFT_RST, 0x0);
>> +	if (ret)
>> +		goto err;
>> +
>> +	return ret;
>> +err:
>> +	info("%s: failed=%d", __func__, ret);
>> +	return ret;
>> +}
>> +
>> +static int rtl2832_read_status(struct dvb_frontend *fe, fe_status_t *status)
>> +{
>> +	struct rtl2832_priv *priv = fe->demodulator_priv;
>> +	int ret;
>> +	u32 tmp;
>> +	*status = 0;
>> +
>> +
>> +	dbg("%s", __func__);
>> +	if (priv->sleeping)
>> +		return 0;
>> +
>> +	ret = rtl2832_rd_demod_reg(priv, DVBT_FSM_STAGE, &tmp);
>> +	if (ret)
>> +		goto err;
>> +
>> +	if (tmp == 11) {
>> +		*status |= FE_HAS_SIGNAL | FE_HAS_CARRIER |
>> +				FE_HAS_VITERBI | FE_HAS_SYNC | FE_HAS_LOCK;
>> +	}
>> +	/* TODO find out if this is also true for rtl2832? */
>> +	/*else if (tmp == 10) {
>> +		*status |= FE_HAS_SIGNAL | FE_HAS_CARRIER |
>> +				FE_HAS_VITERBI;
>> +	}*/
>> +
>> +	return ret;
>> +err:
>> +	info("%s: failed=%d", __func__, ret);
>> +	return ret;
>> +}
>> +
>
>
>> +static int rtl2832_read_snr(struct dvb_frontend *fe, u16 *snr)
>> +{
>> +	*snr = 0;
>> +	return 0;
>> +}
>> +
>> +static int rtl2832_read_ber(struct dvb_frontend *fe, u32 *ber)
>> +{
>> +	*ber = 0;
>> +	return 0;
>> +}
>> +
>> +static int rtl2832_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
>> +{
>> +	*ucblocks = 0;
>> +	return 0;
>> +}
>> +
>> +
>> +static int rtl2832_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
>> +{
>> +	*strength = 0;
>> +	return 0;
>> +}
>
> Why to implement the above, if they're doing nothing?
>
>> +
>> +static struct dvb_frontend_ops rtl2832_ops;
>> +
>> +static void rtl2832_release(struct dvb_frontend *fe)
>> +{
>> +	struct rtl2832_priv *priv = fe->demodulator_priv;
>> +
>> +	dbg("%s", __func__);
>> +	kfree(priv);
>> +}
>> +
>> +struct dvb_frontend *rtl2832_attach(const struct rtl2832_config *cfg,
>> +	struct i2c_adapter *i2c)
>> +{
>> +	struct rtl2832_priv *priv = NULL;
>> +	int ret = 0;
>> +	u8 tmp;
>> +
>> +	dbg("%s", __func__);
>> +
>> +	/* allocate memory for the internal state */
>> +	priv = kzalloc(sizeof(struct rtl2832_priv), GFP_KERNEL);
>> +	if (priv == NULL)
>> +		goto err;
>> +
>> +	/* setup the priv */
>> +	priv->i2c = i2c;
>> +	priv->tuner = cfg->tuner;
>> +	memcpy(&priv->cfg, cfg, sizeof(struct rtl2832_config));
>> +
>> +	/* check if the demod is there */
>> +	ret = rtl2832_rd_reg(priv, 0x00, 0x0, &tmp);
>> +	if (ret)
>> +		goto err;
>> +
>> +	/* create dvb_frontend */
>> +	memcpy(&priv->fe.ops, &rtl2832_ops, sizeof(struct dvb_frontend_ops));
>> +	priv->fe.demodulator_priv = priv;
>> +
>> +	/* TODO implement sleep mode */
>> +	priv->sleeping = true;
>> +
>> +	return &priv->fe;
>> +err:
>> +	dbg("%s: failed=%d", __func__, ret);
>> +	kfree(priv);
>> +	return NULL;
>> +}
>> +EXPORT_SYMBOL(rtl2832_attach);
>
> EXPORT_SYMBOL_GPL() if preferred.
>
>> +
>> +static struct dvb_frontend_ops rtl2832_ops = {
>> +	.delsys = { SYS_DVBT },
>> +	.info = {
>> +		.name = "Realtek RTL2832 (DVB-T)",
>> +		.frequency_min	  = 174000000,
>> +		.frequency_max	  = 862000000,
>> +		.frequency_stepsize = 166667,
>> +		.caps = FE_CAN_FEC_1_2 |
>> +			FE_CAN_FEC_2_3 |
>> +			FE_CAN_FEC_3_4 |
>> +			FE_CAN_FEC_5_6 |
>> +			FE_CAN_FEC_7_8 |
>> +			FE_CAN_FEC_AUTO |
>> +			FE_CAN_QPSK |
>> +			FE_CAN_QAM_16 |
>> +			FE_CAN_QAM_64 |
>> +			FE_CAN_QAM_AUTO |
>> +			FE_CAN_TRANSMISSION_MODE_AUTO |
>> +			FE_CAN_GUARD_INTERVAL_AUTO |
>> +			FE_CAN_HIERARCHY_AUTO |
>> +			FE_CAN_RECOVER |
>> +			FE_CAN_MUTE_TS
>> +	 },
>> +
>> +	.release = rtl2832_release,
>> +
>> +	.init = rtl2832_init,
>> +	.sleep = rtl2832_sleep,
>> +
>> +	.get_tune_settings = rtl2832_get_tune_settings,
>> +
>> +	.set_frontend = rtl2832_set_frontend,
>> +
>> +	.read_status = rtl2832_read_status,
>> +	.read_snr = rtl2832_read_snr,
>> +	.read_ber = rtl2832_read_ber,
>> +	.read_ucblocks = rtl2832_read_ucblocks,
>> +	.read_signal_strength = rtl2832_read_signal_strength,
>> +	.i2c_gate_ctrl = rtl2832_i2c_gate_ctrl,
>> +};
>> +
>> +MODULE_AUTHOR("Thomas Mair <mair.thomas86@gmail.com>");
>> +MODULE_DESCRIPTION("Realtek RTL2832 DVB-T demodulator driver");
>> +MODULE_LICENSE("GPL");
>> +MODULE_VERSION("0.5");
>> diff --git a/drivers/media/dvb/frontends/rtl2832.h b/drivers/media/dvb/frontends/rtl2832.h
>> new file mode 100644
>> index 0000000..d94dc9a
>> --- /dev/null
>> +++ b/drivers/media/dvb/frontends/rtl2832.h
>> @@ -0,0 +1,74 @@
>> +/*
>> + * Realtek RTL2832 DVB-T demodulator driver
>> + *
>> + * Copyright (C) 2012 Thomas Mair <thomas.mair86@gmail.com>
>> + *
>> + *	This program is free software; you can redistribute it and/or modify
>> + *	it under the terms of the GNU General Public License as published by
>> + *	the Free Software Foundation; either version 2 of the License, or
>> + *	(at your option) any later version.
>> + *
>> + *	This program is distributed in the hope that it will be useful,
>> + *	but WITHOUT ANY WARRANTY; without even the implied warranty of
>> + *	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>> + *	GNU General Public License for more details.
>> + *
>> + *	You should have received a copy of the GNU General Public License along
>> + *	with this program; if not, write to the Free Software Foundation, Inc.,
>> + *	51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
>> + */
>> +
>> +#ifndef RTL2832_H
>> +#define RTL2832_H
>> +
>> +#include <linux/dvb/frontend.h>
>> +
>> +struct rtl2832_config {
>> +	/*
>> +	 * Demodulator I2C address.
>> +	 */
>> +	u8 i2c_addr;
>> +
>> +	/*
>> +	 * Xtal frequency.
>> +	 * Hz
>> +	 * 4000000, 16000000, 25000000, 28800000
>> +	 */
>> +	u32 xtal;
>> +
>> +	/*
>> +	 * IFs for all used modes.
>> +	 * Hz
>> +	 * 4570000, 4571429, 36000000, 36125000, 36166667, 44000000
>> +	 */
>> +	u32 if_dvbt;
>> +
>> +	/*
>> +	 */
>> +	u8 tuner;
>> +};
>> +
>> +
>> +#if defined(CONFIG_DVB_RTL2832) || \
>> +	(defined(CONFIG_DVB_RTL2832_MODULE) && defined(MODULE))
>> +extern struct dvb_frontend *rtl2832_attach(
>> +	const struct rtl2832_config *cfg,
>> +	struct i2c_adapter *i2c
>> +);
>> +
>> +extern struct i2c_adapter *rtl2832_get_tuner_i2c_adapter(
>> +	struct dvb_frontend *fe
>> +);
>> +#else
>> +static inline struct dvb_frontend *rtl2832_attach(
>> +	const struct rtl2832_config *config,
>> +	struct i2c_adapter *i2c
>> +)
>> +{
>> +	printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
>> +	return NULL;
>> +}
>> +#endif
>> +
>> +
>> +#endif /* RTL2832_H */
>> diff --git a/drivers/media/dvb/frontends/rtl2832_priv.h b/drivers/media/dvb/frontends/rtl2832_priv.h
>> new file mode 100644
>> index 0000000..cd01a8a
>> --- /dev/null
>> +++ b/drivers/media/dvb/frontends/rtl2832_priv.h
>> @@ -0,0 +1,260 @@
>> +/*
>> + * Realtek RTL2832 DVB-T demodulator driver
>> + *
>> + * Copyright (C) 2012 Thomas Mair <thomas.mair86@gmail.com>
>> + *
>> + *	This program is free software; you can redistribute it and/or modify
>> + *	it under the terms of the GNU General Public License as published by
>> + *	the Free Software Foundation; either version 2 of the License, or
>> + *	(at your option) any later version.
>> + *
>> + *	This program is distributed in the hope that it will be useful,
>> + *	but WITHOUT ANY WARRANTY; without even the implied warranty of
>> + *	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>> + *	GNU General Public License for more details.
>> + *
>> + *	You should have received a copy of the GNU General Public License along
>> + *	with this program; if not, write to the Free Software Foundation, Inc.,
>> + *	51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
>> + */
>> +
>> +#ifndef RTL2832_PRIV_H
>> +#define RTL2832_PRIV_H
>> +
>> +#include "dvb_frontend.h"
>> +#include "rtl2832.h"
>> +
>> +#define LOG_PREFIX "rtl2832"
>> +
>> +#undef dbg
>> +#define dbg(f, arg...) \
>> +do { \
>> +	if (rtl2832_debug)  \
>> +		printk(KERN_INFO     LOG_PREFIX": " f "\n" , ## arg); \
>> +} while (0)
>> +#undef err
>> +#define err(f, arg...)  printk(KERN_ERR     LOG_PREFIX": " f "\n" , ## arg)
>> +#undef info
>> +#define info(f, arg...) printk(KERN_INFO    LOG_PREFIX": " f "\n" , ## arg)
>> +#undef warn
>> +#define warn(f, arg...) printk(KERN_WARNING LOG_PREFIX": " f "\n" , ## arg)
>> +
>> +struct rtl2832_priv {
>> +	struct i2c_adapter *i2c;
>> +	struct dvb_frontend fe;
>> +	struct rtl2832_config cfg;
>> +
>> +	bool i2c_gate_state;
>> +	bool sleeping;
>> +
>> +	u8 tuner;
>> +	u8 page; /* active register page */
>> +};
>> +
>> +struct rtl2832_reg_entry {
>> +	u8 page;
>> +	u8 start_address;
>> +	u8 msb;
>> +	u8 lsb;
>> +};
>> +
>> +struct rtl2832_reg_value {
>> +	int reg;
>> +	u32 value;
>> +};
>> +
>> +
>> +/* Demod register bit names */
>> +enum DVBT_REG_BIT_NAME {
>> +	DVBT_SOFT_RST,
>> +	DVBT_IIC_REPEAT,
>> +	DVBT_TR_WAIT_MIN_8K,
>> +	DVBT_RSD_BER_FAIL_VAL,
>> +	DVBT_EN_BK_TRK,
>> +	DVBT_REG_PI,
>> +	DVBT_REG_PFREQ_1_0,
>> +	DVBT_PD_DA8,
>> +	DVBT_LOCK_TH,
>> +	DVBT_BER_PASS_SCAL,
>> +	DVBT_CE_FFSM_BYPASS,
>> +	DVBT_ALPHAIIR_N,
>> +	DVBT_ALPHAIIR_DIF,
>> +	DVBT_EN_TRK_SPAN,
>> +	DVBT_LOCK_TH_LEN,
>> +	DVBT_CCI_THRE,
>> +	DVBT_CCI_MON_SCAL,
>> +	DVBT_CCI_M0,
>> +	DVBT_CCI_M1,
>> +	DVBT_CCI_M2,
>> +	DVBT_CCI_M3,
>> +	DVBT_SPEC_INIT_0,
>> +	DVBT_SPEC_INIT_1,
>> +	DVBT_SPEC_INIT_2,
>> +	DVBT_AD_EN_REG,
>> +	DVBT_AD_EN_REG1,
>> +	DVBT_EN_BBIN,
>> +	DVBT_MGD_THD0,
>> +	DVBT_MGD_THD1,
>> +	DVBT_MGD_THD2,
>> +	DVBT_MGD_THD3,
>> +	DVBT_MGD_THD4,
>> +	DVBT_MGD_THD5,
>> +	DVBT_MGD_THD6,
>> +	DVBT_MGD_THD7,
>> +	DVBT_EN_CACQ_NOTCH,
>> +	DVBT_AD_AV_REF,
>> +	DVBT_PIP_ON,
>> +	DVBT_SCALE1_B92,
>> +	DVBT_SCALE1_B93,
>> +	DVBT_SCALE1_BA7,
>> +	DVBT_SCALE1_BA9,
>> +	DVBT_SCALE1_BAA,
>> +	DVBT_SCALE1_BAB,
>> +	DVBT_SCALE1_BAC,
>> +	DVBT_SCALE1_BB0,
>> +	DVBT_SCALE1_BB1,
>> +	DVBT_KB_P1,
>> +	DVBT_KB_P2,
>> +	DVBT_KB_P3,
>> +	DVBT_OPT_ADC_IQ,
>> +	DVBT_AD_AVI,
>> +	DVBT_AD_AVQ,
>> +	DVBT_K1_CR_STEP12,
>> +	DVBT_TRK_KS_P2,
>> +	DVBT_TRK_KS_I2,
>> +	DVBT_TR_THD_SET2,
>> +	DVBT_TRK_KC_P2,
>> +	DVBT_TRK_KC_I2,
>> +	DVBT_CR_THD_SET2,
>> +	DVBT_PSET_IFFREQ,
>> +	DVBT_SPEC_INV,
>> +	DVBT_BW_INDEX,
>> +	DVBT_RSAMP_RATIO,
>> +	DVBT_CFREQ_OFF_RATIO,
>> +	DVBT_FSM_STAGE,
>> +	DVBT_RX_CONSTEL,
>> +	DVBT_RX_HIER,
>> +	DVBT_RX_C_RATE_LP,
>> +	DVBT_RX_C_RATE_HP,
>> +	DVBT_GI_IDX,
>> +	DVBT_FFT_MODE_IDX,
>> +	DVBT_RSD_BER_EST,
>> +	DVBT_CE_EST_EVM,
>> +	DVBT_RF_AGC_VAL,
>> +	DVBT_IF_AGC_VAL,
>> +	DVBT_DAGC_VAL,
>> +	DVBT_SFREQ_OFF,
>> +	DVBT_CFREQ_OFF,
>> +	DVBT_POLAR_RF_AGC,
>> +	DVBT_POLAR_IF_AGC,
>> +	DVBT_AAGC_HOLD,
>> +	DVBT_EN_RF_AGC,
>> +	DVBT_EN_IF_AGC,
>> +	DVBT_IF_AGC_MIN,
>> +	DVBT_IF_AGC_MAX,
>> +	DVBT_RF_AGC_MIN,
>> +	DVBT_RF_AGC_MAX,
>> +	DVBT_IF_AGC_MAN,
>> +	DVBT_IF_AGC_MAN_VAL,
>> +	DVBT_RF_AGC_MAN,
>> +	DVBT_RF_AGC_MAN_VAL,
>> +	DVBT_DAGC_TRG_VAL,
>> +	DVBT_AGC_TARG_VAL,
>> +	DVBT_LOOP_GAIN_3_0,
>> +	DVBT_LOOP_GAIN_4,
>> +	DVBT_VTOP,
>> +	DVBT_KRF,
>> +	DVBT_AGC_TARG_VAL_0,
>> +	DVBT_AGC_TARG_VAL_8_1,
>> +	DVBT_AAGC_LOOP_GAIN,
>> +	DVBT_LOOP_GAIN2_3_0,
>> +	DVBT_LOOP_GAIN2_4,
>> +	DVBT_LOOP_GAIN3,
>> +	DVBT_VTOP1,
>> +	DVBT_VTOP2,
>> +	DVBT_VTOP3,
>> +	DVBT_KRF1,
>> +	DVBT_KRF2,
>> +	DVBT_KRF3,
>> +	DVBT_KRF4,
>> +	DVBT_EN_GI_PGA,
>> +	DVBT_THD_LOCK_UP,
>> +	DVBT_THD_LOCK_DW,
>> +	DVBT_THD_UP1,
>> +	DVBT_THD_DW1,
>> +	DVBT_INTER_CNT_LEN,
>> +	DVBT_GI_PGA_STATE,
>> +	DVBT_EN_AGC_PGA,
>> +	DVBT_CKOUTPAR,
>> +	DVBT_CKOUT_PWR,
>> +	DVBT_SYNC_DUR,
>> +	DVBT_ERR_DUR,
>> +	DVBT_SYNC_LVL,
>> +	DVBT_ERR_LVL,
>> +	DVBT_VAL_LVL,
>> +	DVBT_SERIAL,
>> +	DVBT_SER_LSB,
>> +	DVBT_CDIV_PH0,
>> +	DVBT_CDIV_PH1,
>> +	DVBT_MPEG_IO_OPT_2_2,
>> +	DVBT_MPEG_IO_OPT_1_0,
>> +	DVBT_CKOUTPAR_PIP,
>> +	DVBT_CKOUT_PWR_PIP,
>> +	DVBT_SYNC_LVL_PIP,
>> +	DVBT_ERR_LVL_PIP,
>> +	DVBT_VAL_LVL_PIP,
>> +	DVBT_CKOUTPAR_PID,
>> +	DVBT_CKOUT_PWR_PID,
>> +	DVBT_SYNC_LVL_PID,
>> +	DVBT_ERR_LVL_PID,
>> +	DVBT_VAL_LVL_PID,
>> +	DVBT_SM_PASS,
>> +	DVBT_UPDATE_REG_2,
>> +	DVBT_BTHD_P3,
>> +	DVBT_BTHD_D3,
>> +	DVBT_FUNC4_REG0,
>> +	DVBT_FUNC4_REG1,
>> +	DVBT_FUNC4_REG2,
>> +	DVBT_FUNC4_REG3,
>> +	DVBT_FUNC4_REG4,
>> +	DVBT_FUNC4_REG5,
>> +	DVBT_FUNC4_REG6,
>> +	DVBT_FUNC4_REG7,
>> +	DVBT_FUNC4_REG8,
>> +	DVBT_FUNC4_REG9,
>> +	DVBT_FUNC4_REG10,
>> +	DVBT_FUNC5_REG0,
>> +	DVBT_FUNC5_REG1,
>> +	DVBT_FUNC5_REG2,
>> +	DVBT_FUNC5_REG3,
>> +	DVBT_FUNC5_REG4,
>> +	DVBT_FUNC5_REG5,
>> +	DVBT_FUNC5_REG6,
>> +	DVBT_FUNC5_REG7,
>> +	DVBT_FUNC5_REG8,
>> +	DVBT_FUNC5_REG9,
>> +	DVBT_FUNC5_REG10,
>> +	DVBT_FUNC5_REG11,
>> +	DVBT_FUNC5_REG12,
>> +	DVBT_FUNC5_REG13,
>> +	DVBT_FUNC5_REG14,
>> +	DVBT_FUNC5_REG15,
>> +	DVBT_FUNC5_REG16,
>> +	DVBT_FUNC5_REG17,
>> +	DVBT_FUNC5_REG18,
>> +	DVBT_AD7_SETTING,
>> +	DVBT_RSSI_R,
>> +	DVBT_ACI_DET_IND,
>> +	DVBT_REG_MON,
>> +	DVBT_REG_MONSEL,
>> +	DVBT_REG_GPE,
>> +	DVBT_REG_GPO,
>> +	DVBT_REG_4MSEL,
>> +	DVBT_TEST_REG_1,
>> +	DVBT_TEST_REG_2,
>> +	DVBT_TEST_REG_3,
>> +	DVBT_TEST_REG_4,
>> +	DVBT_REG_BIT_NAME_ITEM_TERMINATOR,
>> +};
>> +
>> +#endif /* RTL2832_PRIV_H */
>>
>
>


-- 
http://palosaari.fi/



^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [PATCH v5 1/5] rtl2832 ver. 0.5: support for RTL2832 demod
  2012-07-05 14:32     ` Mauro Carvalho Chehab
  2012-07-05 14:35       ` Antti Palosaari
@ 2012-07-05 14:41       ` Antti Palosaari
  2012-07-05 15:53         ` Mauro Carvalho Chehab
  1 sibling, 1 reply; 104+ messages in thread
From: Antti Palosaari @ 2012-07-05 14:41 UTC (permalink / raw)
  To: Mauro Carvalho Chehab; +Cc: Thomas Mair, linux-media, pomidorabelisima

On 07/05/2012 05:32 PM, Mauro Carvalho Chehab wrote:
> Em 18-05-2012 15:47, Thomas Mair escreveu:

>> +static int rtl2832_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
>> +{
>> +	*strength = 0;
>> +	return 0;
>> +}
>
> Why to implement the above, if they're doing nothing?

Other your findings were correct but for that I would like to comment.

Have you ever tested what happens you lest those without stub 
implementation? IIRC ugly errors are seen for example zap and femon 
outputs. Some kind of DVB-core changes are needed. And IIRC there was 
some error code defined too for API - but such code does not exists.

regards
Antti

-- 
http://palosaari.fi/



^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [PATCH v5 1/5] rtl2832 ver. 0.5: support for RTL2832 demod
  2012-07-05 14:41       ` Antti Palosaari
@ 2012-07-05 15:53         ` Mauro Carvalho Chehab
  0 siblings, 0 replies; 104+ messages in thread
From: Mauro Carvalho Chehab @ 2012-07-05 15:53 UTC (permalink / raw)
  To: Antti Palosaari; +Cc: Thomas Mair, linux-media, pomidorabelisima

Em 05-07-2012 11:41, Antti Palosaari escreveu:
> On 07/05/2012 05:32 PM, Mauro Carvalho Chehab wrote:
>> Em 18-05-2012 15:47, Thomas Mair escreveu:
> 
>>> +static int rtl2832_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
>>> +{
>>> +    *strength = 0;
>>> +    return 0;
>>> +}
>>
>> Why to implement the above, if they're doing nothing?
> 
> Other your findings were correct but for that I would like to comment.
> 
> Have you ever tested what happens you lest those without stub implementation?
> IIRC ugly errors are seen for example zap and femon outputs. Some kind of DVB-core
> changes are needed. And IIRC there was some error code defined too for API - but such 
> code does not exists.

So, let's fix the dvb_core, and not fill drivers with stubs. With regards to userspace
tools, they should be patched to accept the error code that signalizes that an ioctl
was not implemented, and not try to fix an userpace issue in Kernel.

Regards,
Mauro

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [PATCH v5 1/5] rtl2832 ver. 0.5: support for RTL2832 demod
  2012-07-05 14:35       ` Antti Palosaari
@ 2012-07-05 15:54         ` Mauro Carvalho Chehab
  2012-07-07 15:45           ` poma
  0 siblings, 1 reply; 104+ messages in thread
From: Mauro Carvalho Chehab @ 2012-07-05 15:54 UTC (permalink / raw)
  To: Antti Palosaari; +Cc: Thomas Mair, linux-media, pomidorabelisima

Em 05-07-2012 11:35, Antti Palosaari escreveu:
> On 07/05/2012 05:32 PM, Mauro Carvalho Chehab wrote:
>> Em 18-05-2012 15:47, Thomas Mair escreveu:

>>> +static const int reg_mask[32] = {
>>> +    0x00000001,
>>> +    0x00000003,
>>> +    0x00000007,
>>> +    0x0000000f,
>>> +    0x0000001f,
>>> +    0x0000003f,
>>> +    0x0000007f,
>>> +    0x000000ff,
>>> +    0x000001ff,
>>> +    0x000003ff,
>>> +    0x000007ff,
>>> +    0x00000fff,
>>> +    0x00001fff,
>>> +    0x00003fff,
>>> +    0x00007fff,
>>> +    0x0000ffff,
>>> +    0x0001ffff,
>>> +    0x0003ffff,
>>> +    0x0007ffff,
>>> +    0x000fffff,
>>> +    0x001fffff,
>>> +    0x003fffff,
>>> +    0x007fffff,
>>> +    0x00ffffff,
>>> +    0x01ffffff,
>>> +    0x03ffffff,
>>> +    0x07ffffff,
>>> +    0x0fffffff,
>>> +    0x1fffffff,
>>> +    0x3fffffff,
>>> +    0x7fffffff,
>>> +    0xffffffff
>>> +};
>>
>> It would be better to use a macro here like:
>>
>> #define REG_MASK(b)    ((1 << ((b) + 1)) -1)
>>
>> Even better, you could use the bitops.h BIT() macro:
>>
>> #define REG_MASK(b)    (BIT(b + 1) - 1)
> 
> I said also that once for Thomas during review but he didn't changed it :)

As those findings are minor ones, I'll just apply the patch series
and add a patch replacing reg_mask table by a macro like above.

>>> +static int rtl2832_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
>>> +{
>>> +    *strength = 0;
>>> +    return 0;
>>> +}
>>
>> Why to implement the above, if they're doing nothing?
> 
> Other your findings were correct but for that I would like to comment.
> 
> Have you ever tested what happens you lest those without stub implementation? IIRC ugly errors are seen for example zap and femon outputs. Some kind of DVB-core changes are needed. And IIRC there was some error code defined too for API - but such code does not exists.
> 

I'll keep those stubs for now, but we should really fix the core and not allow/add
crap things like that.

Regards,
Mauro

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [PATCH v5 1/5] rtl2832 ver. 0.5: support for RTL2832 demod
  2012-07-05 15:54         ` Mauro Carvalho Chehab
@ 2012-07-07 15:45           ` poma
  0 siblings, 0 replies; 104+ messages in thread
From: poma @ 2012-07-07 15:45 UTC (permalink / raw)
  To: Mauro Carvalho Chehab, linux-media

On 07/05/2012 05:54 PM, Mauro Carvalho Chehab wrote:
> Em 05-07-2012 11:35, Antti Palosaari escreveu:
>> On 07/05/2012 05:32 PM, Mauro Carvalho Chehab wrote:
>>> Em 18-05-2012 15:47, Thomas Mair escreveu:
> 
>>>> +static const int reg_mask[32] = {
>>>> +    0x00000001,
>>>> +    0x00000003,
>>>> +    0x00000007,
>>>> +    0x0000000f,
>>>> +    0x0000001f,
>>>> +    0x0000003f,
>>>> +    0x0000007f,
>>>> +    0x000000ff,
>>>> +    0x000001ff,
>>>> +    0x000003ff,
>>>> +    0x000007ff,
>>>> +    0x00000fff,
>>>> +    0x00001fff,
>>>> +    0x00003fff,
>>>> +    0x00007fff,
>>>> +    0x0000ffff,
>>>> +    0x0001ffff,
>>>> +    0x0003ffff,
>>>> +    0x0007ffff,
>>>> +    0x000fffff,
>>>> +    0x001fffff,
>>>> +    0x003fffff,
>>>> +    0x007fffff,
>>>> +    0x00ffffff,
>>>> +    0x01ffffff,
>>>> +    0x03ffffff,
>>>> +    0x07ffffff,
>>>> +    0x0fffffff,
>>>> +    0x1fffffff,
>>>> +    0x3fffffff,
>>>> +    0x7fffffff,
>>>> +    0xffffffff
>>>> +};
>>>
>>> It would be better to use a macro here like:
>>>
>>> #define REG_MASK(b)    ((1 << ((b) + 1)) -1)
>>>
>>> Even better, you could use the bitops.h BIT() macro:
>>>
>>> #define REG_MASK(b)    (BIT(b + 1) - 1)
>>
>> I said also that once for Thomas during review but he didn't changed it :)
> 
> As those findings are minor ones, I'll just apply the patch series
> and add a patch replacing reg_mask table by a macro like above.
>

Thank you!
Have a nice vacation.

cheers,
poma

^ permalink raw reply	[flat|nested] 104+ messages in thread

* [PATCH] IGMP: Inhibit reports for local multicast groups
  2012-03-14 20:05 [Qemu-devel] 5 euros offerts sur votre première commande Claire de Libeedo
                   ` (12 preceding siblings ...)
  2012-05-18 18:47 ` [PATCH v5 " Thomas Mair
@ 2015-08-24 11:39 ` Philip Downey
  2015-08-25 21:20   ` David Miller
  2015-08-27 15:46 ` Philip Downey
  2016-10-22  4:54   ` Geetha sowjanya
  15 siblings, 1 reply; 104+ messages in thread
From: Philip Downey @ 2015-08-24 11:39 UTC (permalink / raw)
  Cc: kuznet, jmorris, yoshfuji, kaber, linux-kernel, netdev, Philip Downey

The range of addresses between 224.0.0.0 and 224.0.0.255 inclusive, is
reserved for the use of routing protocols and other low-level topology
discovery or maintenance protocols, such as gateway discovery and
group membership reporting.  Multicast routers should not forward any
multicast datagram with destination addresses in this range,
regardless of its TTL.

Currently, IGMP reports are generated for this reserved range of
addresses even though a router will ignore this information since it
has no purpose.  However, the presence of reserved group addresses in
an IGMP membership report uses up network bandwidth and can also
obscure addresses of interest when inspecting membership reports using
packet inspection or debug messages.

Although the RFCs for the various version of IGMP (e.g.RFC 3376 for
v3) do not specify that the reserved addresses be excluded from
membership reports, it should do no harm in doing so.  In particular
there should be no adverse effect in any IGMP snooping functionality
since 224.0.0.x is specifically excluded as per RFC 4541 (IGMP and MLD
Snooping Switches Considerations) section 2.1.2. Data Forwarding
Rules:

    2) Packets with a destination IP (DIP) address in the 224.0.0.X
       range which are not IGMP must be forwarded on all ports.

IGMP reports for local multicast groups can now be optionally
inhibited by means of a system control variable (by setting the value
to zero) e.g.:
    echo 0 > /proc/sys/net/ipv4/igmp_link_local_reports

To retain backwards compatibility the previous behaviour is retained
by default on system boot or reverted by setting the value back to
non-zero e.g.:
    echo 1 >  /proc/sys/net/ipv4/igmp_link_local_reports

Signed-off-by: Philip Downey <pdowney@brocade.com>
---
 include/linux/igmp.h       |    1 +
 net/ipv4/igmp.c            |   29 ++++++++++++++++++++++++++++-
 net/ipv4/sysctl_net_ipv4.c |    7 +++++++
 3 files changed, 36 insertions(+), 1 deletion(-)

diff --git a/include/linux/igmp.h b/include/linux/igmp.h
index 193ad48..e3e0dae 100644
--- a/include/linux/igmp.h
+++ b/include/linux/igmp.h
@@ -37,6 +37,7 @@ static inline struct igmpv3_query *
 	return (struct igmpv3_query *)skb_transport_header(skb);
 }
 
+extern int sysctl_igmp_link_local_reports;
 extern int sysctl_igmp_max_memberships;
 extern int sysctl_igmp_max_msf;
 extern int sysctl_igmp_qrv;
diff --git a/net/ipv4/igmp.c b/net/ipv4/igmp.c
index 9fdfd9d..a3df89d 100644
--- a/net/ipv4/igmp.c
+++ b/net/ipv4/igmp.c
@@ -110,6 +110,15 @@
 #define IP_MAX_MEMBERSHIPS	20
 #define IP_MAX_MSF		10
 
+/* IGMP reports for link-local multicast groups are enabled by default */
+#define IGMP_ENABLE_LLM         1
+
+int sysctl_igmp_link_local_reports __read_mostly = IGMP_ENABLE_LLM;
+
+#define IGMP_INHIBIT_LINK_LOCAL_REPORTS(_ipaddr) \
+	(ipv4_is_local_multicast(_ipaddr) && \
+	 (sysctl_igmp_link_local_reports == 0))
+
 #ifdef CONFIG_IP_MULTICAST
 /* Parameter names and values are taken from igmp-v2-06 draft */
 
@@ -437,6 +446,8 @@ static struct sk_buff *add_grec(struct sk_buff *skb, struct ip_mc_list *pmc,
 
 	if (pmc->multiaddr == IGMP_ALL_HOSTS)
 		return skb;
+	if (IGMP_INHIBIT_LINK_LOCAL_REPORTS(pmc->multiaddr))
+		return skb;
 
 	isquery = type == IGMPV3_MODE_IS_INCLUDE ||
 		  type == IGMPV3_MODE_IS_EXCLUDE;
@@ -545,6 +556,8 @@ static int igmpv3_send_report(struct in_device *in_dev, struct ip_mc_list *pmc)
 		for_each_pmc_rcu(in_dev, pmc) {
 			if (pmc->multiaddr == IGMP_ALL_HOSTS)
 				continue;
+			if (IGMP_INHIBIT_LINK_LOCAL_REPORTS(pmc->multiaddr))
+				continue;
 			spin_lock_bh(&pmc->lock);
 			if (pmc->sfcount[MCAST_EXCLUDE])
 				type = IGMPV3_MODE_IS_EXCLUDE;
@@ -678,7 +691,11 @@ static int igmp_send_report(struct in_device *in_dev, struct ip_mc_list *pmc,
 
 	if (type == IGMPV3_HOST_MEMBERSHIP_REPORT)
 		return igmpv3_send_report(in_dev, pmc);
-	else if (type == IGMP_HOST_LEAVE_MESSAGE)
+
+	if (IGMP_INHIBIT_LINK_LOCAL_REPORTS(group))
+		return 0;
+
+	if (type == IGMP_HOST_LEAVE_MESSAGE)
 		dst = IGMP_ALL_ROUTER;
 	else
 		dst = group;
@@ -851,6 +868,8 @@ static bool igmp_heard_report(struct in_device *in_dev, __be32 group)
 
 	if (group == IGMP_ALL_HOSTS)
 		return false;
+	if (IGMP_INHIBIT_LINK_LOCAL_REPORTS(group))
+		return false;
 
 	rcu_read_lock();
 	for_each_pmc_rcu(in_dev, im) {
@@ -957,6 +976,8 @@ static bool igmp_heard_query(struct in_device *in_dev, struct sk_buff *skb,
 			continue;
 		if (im->multiaddr == IGMP_ALL_HOSTS)
 			continue;
+		if (IGMP_INHIBIT_LINK_LOCAL_REPORTS(im->multiaddr))
+			continue;
 		spin_lock_bh(&im->lock);
 		if (im->tm_running)
 			im->gsquery = im->gsquery && mark;
@@ -1181,6 +1202,8 @@ static void igmp_group_dropped(struct ip_mc_list *im)
 #ifdef CONFIG_IP_MULTICAST
 	if (im->multiaddr == IGMP_ALL_HOSTS)
 		return;
+	if (IGMP_INHIBIT_LINK_LOCAL_REPORTS(im->multiaddr))
+		return;
 
 	reporter = im->reporter;
 	igmp_stop_timer(im);
@@ -1213,6 +1236,8 @@ static void igmp_group_added(struct ip_mc_list *im)
 #ifdef CONFIG_IP_MULTICAST
 	if (im->multiaddr == IGMP_ALL_HOSTS)
 		return;
+	if (IGMP_INHIBIT_LINK_LOCAL_REPORTS(im->multiaddr))
+		return;
 
 	if (in_dev->dead)
 		return;
@@ -1518,6 +1543,8 @@ static void ip_mc_rejoin_groups(struct in_device *in_dev)
 	for_each_pmc_rtnl(in_dev, im) {
 		if (im->multiaddr == IGMP_ALL_HOSTS)
 			continue;
+		if (IGMP_INHIBIT_LINK_LOCAL_REPORTS(im->multiaddr))
+			continue;
 
 		/* a failover is happening and switches
 		 * must be notified immediately
diff --git a/net/ipv4/sysctl_net_ipv4.c b/net/ipv4/sysctl_net_ipv4.c
index 0330ab2..157c25a 100644
--- a/net/ipv4/sysctl_net_ipv4.c
+++ b/net/ipv4/sysctl_net_ipv4.c
@@ -910,6 +910,13 @@ static struct ctl_table ipv4_net_table[] = {
 		.mode		= 0644,
 		.proc_handler	= proc_dointvec,
 	},
+	{
+		.procname	= "igmp_link_local_reports",
+		.data		= &sysctl_igmp_link_local_reports,
+		.maxlen		= sizeof(int),
+		.mode		= 0644,
+		.proc_handler	= proc_dointvec
+	},
 	{ }
 };
 
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 104+ messages in thread

* Re: [PATCH] IGMP: Inhibit reports for local multicast groups
  2015-08-24 11:39 ` [PATCH] IGMP: Inhibit reports for local multicast groups Philip Downey
@ 2015-08-25 21:20   ` David Miller
  2015-08-26  9:23     ` Philip Downey
  0 siblings, 1 reply; 104+ messages in thread
From: David Miller @ 2015-08-25 21:20 UTC (permalink / raw)
  To: pdowney; +Cc: kuznet, jmorris, yoshfuji, kaber, linux-kernel, netdev

From: Philip Downey <pdowney@brocade.com>
Date: Mon, 24 Aug 2015 12:39:17 +0100

> +extern int sysctl_igmp_link_local_reports;
 ...
> +/* IGMP reports for link-local multicast groups are enabled by default */
> +#define IGMP_ENABLE_LLM         1
> +
> +int sysctl_igmp_link_local_reports __read_mostly = IGMP_ENABLE_LLM;
> +
> +#define IGMP_INHIBIT_LINK_LOCAL_REPORTS(_ipaddr) \
> +	(ipv4_is_local_multicast(_ipaddr) && \
> +	 (sysctl_igmp_link_local_reports == 0))
> +

People know that "1" and "0" means enable and disable respectively, so this
macros is pretty excessive.  Just remove it.

Also, simplify the name of the sysctl to something like
"sysctl_igmp_llm_reports" or similar, and simplify the test against 0
to be in the canonical "!x" format.  Then the test can fit on one
line:

	(ipv4_is_local_multicast(_ipaddr) && !sysctl_igmp_llm_reports)


^ permalink raw reply	[flat|nested] 104+ messages in thread

* RE: [PATCH] IGMP: Inhibit reports for local multicast groups
  2015-08-25 21:20   ` David Miller
@ 2015-08-26  9:23     ` Philip Downey
  0 siblings, 0 replies; 104+ messages in thread
From: Philip Downey @ 2015-08-26  9:23 UTC (permalink / raw)
  To: David Miller; +Cc: kuznet, jmorris, yoshfuji, kaber, linux-kernel, netdev



> -----Original Message-----
> From: David Miller [mailto:davem@davemloft.net]
> Sent: Tuesday, August 25, 2015 10:20 PM
> To: Philip Downey
> Cc: kuznet@ms2.inr.ac.ru; jmorris@namei.org; yoshfuji@linux-ipv6.org;
> kaber@trash.net; linux-kernel@vger.kernel.org; netdev@vger.kernel.org
> Subject: Re: [PATCH] IGMP: Inhibit reports for local multicast groups
> 
> From: Philip Downey <pdowney@brocade.com>
> Date: Mon, 24 Aug 2015 12:39:17 +0100
> 
> > +extern int sysctl_igmp_link_local_reports;
>  ...
> > +/* IGMP reports for link-local multicast groups are enabled by default */
> > +#define IGMP_ENABLE_LLM         1
> > +
> > +int sysctl_igmp_link_local_reports __read_mostly = IGMP_ENABLE_LLM;
> > +
> > +#define IGMP_INHIBIT_LINK_LOCAL_REPORTS(_ipaddr) \
> > +	(ipv4_is_local_multicast(_ipaddr) && \
> > +	 (sysctl_igmp_link_local_reports == 0))
> > +
> 
> People know that "1" and "0" means enable and disable respectively, so this
> macros is pretty excessive.  Just remove it.
> 
> Also, simplify the name of the sysctl to something like
> "sysctl_igmp_llm_reports" or similar, and simplify the test against 0 to be in
> the canonical "!x" format.  Then the test can fit on one
> line:
> 
> 	(ipv4_is_local_multicast(_ipaddr) && !sysctl_igmp_llm_reports).

Thanks for reviewing David.
I will make the requested changes  (fitting the test on a single line was my main reason for introducing the macro - that and making it patently obvious what the test was doing.  Your suggestion would seem to meet that aim).

Will amend and resubmit.

Regards

Philip

^ permalink raw reply	[flat|nested] 104+ messages in thread

* [PATCH] IGMP: Inhibit reports for local multicast groups
  2012-03-14 20:05 [Qemu-devel] 5 euros offerts sur votre première commande Claire de Libeedo
                   ` (13 preceding siblings ...)
  2015-08-24 11:39 ` [PATCH] IGMP: Inhibit reports for local multicast groups Philip Downey
@ 2015-08-27 15:46 ` Philip Downey
  2015-08-28 20:29   ` David Miller
  2015-08-28 21:19   ` Cong Wang
  2016-10-22  4:54   ` Geetha sowjanya
  15 siblings, 2 replies; 104+ messages in thread
From: Philip Downey @ 2015-08-27 15:46 UTC (permalink / raw)
  To: davem
  Cc: kuznet, jmorris, yoshfuji, kaber, linux-kernel, netdev, Philip Downey

The range of addresses between 224.0.0.0 and 224.0.0.255 inclusive, is
reserved for the use of routing protocols and other low-level topology
discovery or maintenance protocols, such as gateway discovery and
group membership reporting.  Multicast routers should not forward any
multicast datagram with destination addresses in this range,
regardless of its TTL.

Currently, IGMP reports are generated for this reserved range of
addresses even though a router will ignore this information since it
has no purpose.  However, the presence of reserved group addresses in
an IGMP membership report uses up network bandwidth and can also
obscure addresses of interest when inspecting membership reports using
packet inspection or debug messages.

Although the RFCs for the various version of IGMP (e.g.RFC 3376 for
v3) do not specify that the reserved addresses be excluded from
membership reports, it should do no harm in doing so.  In particular
there should be no adverse effect in any IGMP snooping functionality
since 224.0.0.x is specifically excluded as per RFC 4541 (IGMP and MLD
Snooping Switches Considerations) section 2.1.2. Data Forwarding
Rules:

    2) Packets with a destination IP (DIP) address in the 224.0.0.X
       range which are not IGMP must be forwarded on all ports.

IGMP reports for local multicast groups can now be optionally
inhibited by means of a system control variable (by setting the value
to zero) e.g.:
    echo 0 > /proc/sys/net/ipv4/igmp_link_local_mcast_reports

To retain backwards compatibility the previous behaviour is retained
by default on system boot or reverted by setting the value back to
non-zero e.g.:
    echo 1 >  /proc/sys/net/ipv4/igmp_link_local_mcast_reports

Signed-off-by: Philip Downey <pdowney@brocade.com>
---
 include/linux/igmp.h       |    1 +
 net/ipv4/igmp.c            |   26 +++++++++++++++++++++++++-
 net/ipv4/sysctl_net_ipv4.c |    7 +++++++
 3 files changed, 33 insertions(+), 1 deletion(-)

diff --git a/include/linux/igmp.h b/include/linux/igmp.h
index 193ad48..9084292 100644
--- a/include/linux/igmp.h
+++ b/include/linux/igmp.h
@@ -37,6 +37,7 @@ static inline struct igmpv3_query *
 	return (struct igmpv3_query *)skb_transport_header(skb);
 }
 
+extern int sysctl_igmp_llm_reports;
 extern int sysctl_igmp_max_memberships;
 extern int sysctl_igmp_max_msf;
 extern int sysctl_igmp_qrv;
diff --git a/net/ipv4/igmp.c b/net/ipv4/igmp.c
index 9fdfd9d..d38b8b6 100644
--- a/net/ipv4/igmp.c
+++ b/net/ipv4/igmp.c
@@ -110,6 +110,9 @@
 #define IP_MAX_MEMBERSHIPS	20
 #define IP_MAX_MSF		10
 
+/* IGMP reports for link-local multicast groups are enabled by default */
+int sysctl_igmp_llm_reports __read_mostly = 1;
+
 #ifdef CONFIG_IP_MULTICAST
 /* Parameter names and values are taken from igmp-v2-06 draft */
 
@@ -437,6 +440,8 @@ static struct sk_buff *add_grec(struct sk_buff *skb, struct ip_mc_list *pmc,
 
 	if (pmc->multiaddr == IGMP_ALL_HOSTS)
 		return skb;
+	if (ipv4_is_local_multicast(pmc->multiaddr) && !sysctl_igmp_llm_reports)
+		return skb;
 
 	isquery = type == IGMPV3_MODE_IS_INCLUDE ||
 		  type == IGMPV3_MODE_IS_EXCLUDE;
@@ -545,6 +550,9 @@ static int igmpv3_send_report(struct in_device *in_dev, struct ip_mc_list *pmc)
 		for_each_pmc_rcu(in_dev, pmc) {
 			if (pmc->multiaddr == IGMP_ALL_HOSTS)
 				continue;
+			if (ipv4_is_local_multicast(pmc->multiaddr) &&
+			     !sysctl_igmp_llm_reports)
+				continue;
 			spin_lock_bh(&pmc->lock);
 			if (pmc->sfcount[MCAST_EXCLUDE])
 				type = IGMPV3_MODE_IS_EXCLUDE;
@@ -678,7 +686,11 @@ static int igmp_send_report(struct in_device *in_dev, struct ip_mc_list *pmc,
 
 	if (type == IGMPV3_HOST_MEMBERSHIP_REPORT)
 		return igmpv3_send_report(in_dev, pmc);
-	else if (type == IGMP_HOST_LEAVE_MESSAGE)
+
+	if (ipv4_is_local_multicast(group) && !sysctl_igmp_llm_reports)
+		return 0;
+
+	if (type == IGMP_HOST_LEAVE_MESSAGE)
 		dst = IGMP_ALL_ROUTER;
 	else
 		dst = group;
@@ -851,6 +863,8 @@ static bool igmp_heard_report(struct in_device *in_dev, __be32 group)
 
 	if (group == IGMP_ALL_HOSTS)
 		return false;
+	if (ipv4_is_local_multicast(group) && !sysctl_igmp_llm_reports)
+		return false;
 
 	rcu_read_lock();
 	for_each_pmc_rcu(in_dev, im) {
@@ -957,6 +971,9 @@ static bool igmp_heard_query(struct in_device *in_dev, struct sk_buff *skb,
 			continue;
 		if (im->multiaddr == IGMP_ALL_HOSTS)
 			continue;
+		if (ipv4_is_local_multicast(im->multiaddr) &&
+		    !sysctl_igmp_llm_reports)
+			continue;
 		spin_lock_bh(&im->lock);
 		if (im->tm_running)
 			im->gsquery = im->gsquery && mark;
@@ -1181,6 +1198,8 @@ static void igmp_group_dropped(struct ip_mc_list *im)
 #ifdef CONFIG_IP_MULTICAST
 	if (im->multiaddr == IGMP_ALL_HOSTS)
 		return;
+	if (ipv4_is_local_multicast(im->multiaddr) && !sysctl_igmp_llm_reports)
+		return;
 
 	reporter = im->reporter;
 	igmp_stop_timer(im);
@@ -1213,6 +1232,8 @@ static void igmp_group_added(struct ip_mc_list *im)
 #ifdef CONFIG_IP_MULTICAST
 	if (im->multiaddr == IGMP_ALL_HOSTS)
 		return;
+	if (ipv4_is_local_multicast(im->multiaddr) && !sysctl_igmp_llm_reports)
+		return;
 
 	if (in_dev->dead)
 		return;
@@ -1518,6 +1539,9 @@ static void ip_mc_rejoin_groups(struct in_device *in_dev)
 	for_each_pmc_rtnl(in_dev, im) {
 		if (im->multiaddr == IGMP_ALL_HOSTS)
 			continue;
+		if (ipv4_is_local_multicast(im->multiaddr) &&
+		    !sysctl_igmp_llm_reports)
+			continue;
 
 		/* a failover is happening and switches
 		 * must be notified immediately
diff --git a/net/ipv4/sysctl_net_ipv4.c b/net/ipv4/sysctl_net_ipv4.c
index 0330ab2..74eede2 100644
--- a/net/ipv4/sysctl_net_ipv4.c
+++ b/net/ipv4/sysctl_net_ipv4.c
@@ -910,6 +910,13 @@ static struct ctl_table ipv4_net_table[] = {
 		.mode		= 0644,
 		.proc_handler	= proc_dointvec,
 	},
+	{
+		.procname	= "igmp_link_local_mcast_reports",
+		.data		= &sysctl_igmp_llm_reports,
+		.maxlen		= sizeof(int),
+		.mode		= 0644,
+		.proc_handler	= proc_dointvec
+	},
 	{ }
 };
 
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 104+ messages in thread

* Re: [PATCH] IGMP: Inhibit reports for local multicast groups
  2015-08-27 15:46 ` Philip Downey
@ 2015-08-28 20:29   ` David Miller
  2015-08-28 21:19   ` Cong Wang
  1 sibling, 0 replies; 104+ messages in thread
From: David Miller @ 2015-08-28 20:29 UTC (permalink / raw)
  To: pdowney; +Cc: kuznet, jmorris, yoshfuji, kaber, linux-kernel, netdev

From: Philip Downey <pdowney@brocade.com>
Date: Thu, 27 Aug 2015 16:46:26 +0100

> The range of addresses between 224.0.0.0 and 224.0.0.255 inclusive, is
> reserved for the use of routing protocols and other low-level topology
> discovery or maintenance protocols, such as gateway discovery and
> group membership reporting.  Multicast routers should not forward any
> multicast datagram with destination addresses in this range,
> regardless of its TTL.
> 
> Currently, IGMP reports are generated for this reserved range of
> addresses even though a router will ignore this information since it
> has no purpose.  However, the presence of reserved group addresses in
> an IGMP membership report uses up network bandwidth and can also
> obscure addresses of interest when inspecting membership reports using
> packet inspection or debug messages.
> 
> Although the RFCs for the various version of IGMP (e.g.RFC 3376 for
> v3) do not specify that the reserved addresses be excluded from
> membership reports, it should do no harm in doing so.  In particular
> there should be no adverse effect in any IGMP snooping functionality
> since 224.0.0.x is specifically excluded as per RFC 4541 (IGMP and MLD
> Snooping Switches Considerations) section 2.1.2. Data Forwarding
> Rules:
> 
>     2) Packets with a destination IP (DIP) address in the 224.0.0.X
>        range which are not IGMP must be forwarded on all ports.
> 
> IGMP reports for local multicast groups can now be optionally
> inhibited by means of a system control variable (by setting the value
> to zero) e.g.:
>     echo 0 > /proc/sys/net/ipv4/igmp_link_local_mcast_reports
> 
> To retain backwards compatibility the previous behaviour is retained
> by default on system boot or reverted by setting the value back to
> non-zero e.g.:
>     echo 1 >  /proc/sys/net/ipv4/igmp_link_local_mcast_reports
> 
> Signed-off-by: Philip Downey <pdowney@brocade.com>

Applied to net-next, thanks.

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [PATCH] IGMP: Inhibit reports for local multicast groups
  2015-08-27 15:46 ` Philip Downey
  2015-08-28 20:29   ` David Miller
@ 2015-08-28 21:19   ` Cong Wang
  2015-08-31 10:33       ` Philip Downey
  1 sibling, 1 reply; 104+ messages in thread
From: Cong Wang @ 2015-08-28 21:19 UTC (permalink / raw)
  To: Philip Downey
  Cc: David Miller, Alexey Kuznetsov, James Morris, Hideaki YOSHIFUJI,
	Patrick McHardy, linux-kernel, netdev

On Thu, Aug 27, 2015 at 8:46 AM, Philip Downey <pdowney@brocade.com> wrote:
> IGMP reports for local multicast groups can now be optionally
> inhibited by means of a system control variable (by setting the value
> to zero) e.g.:
>     echo 0 > /proc/sys/net/ipv4/igmp_link_local_mcast_reports
>
> To retain backwards compatibility the previous behaviour is retained
> by default on system boot or reverted by setting the value back to
> non-zero e.g.:
>     echo 1 >  /proc/sys/net/ipv4/igmp_link_local_mcast_reports
>

Please document it in Documentation/networking/ip-sysctl.txt.

^ permalink raw reply	[flat|nested] 104+ messages in thread

* RE: [PATCH] IGMP: Inhibit reports for local multicast groups
  2015-08-28 21:19   ` Cong Wang
@ 2015-08-31 10:33       ` Philip Downey
  0 siblings, 0 replies; 104+ messages in thread
From: Philip Downey @ 2015-08-31 10:33 UTC (permalink / raw)
  To: Cong Wang
  Cc: David Miller, Alexey Kuznetsov, James Morris, Hideaki YOSHIFUJI,
	Patrick McHardy, linux-kernel, netdev

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain; charset="utf-8", Size: 1261 bytes --]



> -----Original Message-----
> From: Cong Wang [mailto:cwang@twopensource.com]
> Sent: Friday, August 28, 2015 10:20 PM
> To: Philip Downey
> Cc: David Miller; Alexey Kuznetsov; James Morris; Hideaki YOSHIFUJI; Patrick
> McHardy; linux-kernel@vger.kernel.org; netdev
> Subject: Re: [PATCH] IGMP: Inhibit reports for local multicast groups
> 
> On Thu, Aug 27, 2015 at 8:46 AM, Philip Downey <pdowney@brocade.com>
> wrote:
> > IGMP reports for local multicast groups can now be optionally
> > inhibited by means of a system control variable (by setting the value
> > to zero) e.g.:
> >     echo 0 > /proc/sys/net/ipv4/igmp_link_local_mcast_reports
> >
> > To retain backwards compatibility the previous behaviour is retained
> > by default on system boot or reverted by setting the value back to
> > non-zero e.g.:
> >     echo 1 >  /proc/sys/net/ipv4/igmp_link_local_mcast_reports
> >
> 
> Please document it in Documentation/networking/ip-sysctl.txt.
Thanks for the comment.
I have generated a new patch for the proposed documentation change.
Hope this is the correct thing to do.

Regards

Philip
ÿôèº{.nÇ+‰·Ÿ®‰­†+%ŠËÿ±éݶ\x17¥Šwÿº{.nÇ+‰·¥Š{±þG«éÿŠ{ayº\x1dʇڙë,j\a­¢f£¢·hšïêÿ‘êçz_è®\x03(­éšŽŠÝ¢j"ú\x1a¶^[m§ÿÿ¾\a«þG«éÿ¢¸?™¨è­Ú&£ø§~á¶iO•æ¬z·švØ^\x14\x04\x1a¶^[m§ÿÿÃ\fÿ¶ìÿ¢¸?–I¥

^ permalink raw reply	[flat|nested] 104+ messages in thread

* RE: [PATCH] IGMP: Inhibit reports for local multicast groups
@ 2015-08-31 10:33       ` Philip Downey
  0 siblings, 0 replies; 104+ messages in thread
From: Philip Downey @ 2015-08-31 10:33 UTC (permalink / raw)
  To: Cong Wang
  Cc: David Miller, Alexey Kuznetsov, James Morris, Hideaki YOSHIFUJI,
	Patrick McHardy, linux-kernel, netdev



> -----Original Message-----
> From: Cong Wang [mailto:cwang@twopensource.com]
> Sent: Friday, August 28, 2015 10:20 PM
> To: Philip Downey
> Cc: David Miller; Alexey Kuznetsov; James Morris; Hideaki YOSHIFUJI; Patrick
> McHardy; linux-kernel@vger.kernel.org; netdev
> Subject: Re: [PATCH] IGMP: Inhibit reports for local multicast groups
> 
> On Thu, Aug 27, 2015 at 8:46 AM, Philip Downey <pdowney@brocade.com>
> wrote:
> > IGMP reports for local multicast groups can now be optionally
> > inhibited by means of a system control variable (by setting the value
> > to zero) e.g.:
> >     echo 0 > /proc/sys/net/ipv4/igmp_link_local_mcast_reports
> >
> > To retain backwards compatibility the previous behaviour is retained
> > by default on system boot or reverted by setting the value back to
> > non-zero e.g.:
> >     echo 1 >  /proc/sys/net/ipv4/igmp_link_local_mcast_reports
> >
> 
> Please document it in Documentation/networking/ip-sysctl.txt.
Thanks for the comment.
I have generated a new patch for the proposed documentation change.
Hope this is the correct thing to do.

Regards

Philip

^ permalink raw reply	[flat|nested] 104+ messages in thread

* [PATCH] arm64: SMMU-v2: Workaround for Cavium ThunderX erratum 28168
  2012-03-14 20:05 [Qemu-devel] 5 euros offerts sur votre première commande Claire de Libeedo
@ 2016-10-22  4:54   ` Geetha sowjanya
  2007-05-18  0:33 ` [PATCH 1/3] [TIPC]: Improved support for Ethernet traffic filtering Jon Paul Maloy
                     ` (14 subsequent siblings)
  15 siblings, 0 replies; 104+ messages in thread
From: Geetha sowjanya @ 2016-10-22  4:54 UTC (permalink / raw)
  To: robin.murphy, will.deacon, mark.rutland
  Cc: Prasun.Kapoor, iommu, Geetha sowjanya, Tirumalesh Chalamarla,
	linux-arm-kernel

From: Tirumalesh Chalamarla <Tirumalesh.Chalamarla@cavium.com>

  This patch implements Cavium ThunderX erratum 28168.

  PCI requires stores complete in order. Due to erratum #28168
  PCI-inbound MSI-X store to the interrupt controller are delivered
  to the interrupt controller before older PCI-inbound memory stores
  are committed.
  Doing a sync on SMMU will make sure all prior transactions are
  completed.

Signed-off-by: Tirumalesh Chalamarla <Tirumalesh.Chalamarla@cavium.com>
Signed-off-by: Geetha sowjanya <gakula@caviumnetworks.com>
---
 arch/arm64/Kconfig               |   11 +++++++++++
 drivers/iommu/arm-smmu.c         |   38 ++++++++++++++++++++++++++++++++++++++
 drivers/irqchip/irq-gic-common.h |    1 +
 drivers/irqchip/irq-gic-v3-its.c |   22 ++++++++++++++++++++++
 kernel/irq/chip.c                |    4 ++++
 5 files changed, 76 insertions(+), 0 deletions(-)

diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig
index 30398db..57f5c9b 100644
--- a/arch/arm64/Kconfig
+++ b/arch/arm64/Kconfig
@@ -474,6 +474,17 @@ config CAVIUM_ERRATUM_27456
 
 	  If unsure, say Y.
 
+config CAVIUM_ERRATUM_28168
+	bool "Cavium erratum 28168: Make sure ITS and SMMU TLB are in sync"
+	default y
+	help
+	 Due to erratum #28168 PCI-inbound MSI-X store to the interrupt
+	 controller are delivered to the interrupt controller before older
+	 PCI-inbound memory stores are committed. Doing a sync on SMMU
+	 will make sure all prior transactions are completed.
+
+	 If unsure, say Y.
+
 endmenu
 
 
diff --git a/drivers/iommu/arm-smmu.c b/drivers/iommu/arm-smmu.c
index 9740846..20a61c6 100644
--- a/drivers/iommu/arm-smmu.c
+++ b/drivers/iommu/arm-smmu.c
@@ -378,6 +378,7 @@ struct arm_smmu_device {
 	unsigned int			*irqs;
 
 	u32				cavium_id_base; /* Specific to Cavium */
+	spinlock_t			tlb_lock;
 };
 
 enum arm_smmu_context_fmt {
@@ -576,9 +577,39 @@ static void __arm_smmu_tlb_sync(struct arm_smmu_device *smmu)
 static void arm_smmu_tlb_sync(void *cookie)
 {
 	struct arm_smmu_domain *smmu_domain = cookie;
+	struct arm_smmu_device *smmu = smmu_domain->smmu;
+	unsigned long flags;
+
+	spin_lock_irqsave(&smmu->tlb_lock, flags);
 	__arm_smmu_tlb_sync(smmu_domain->smmu);
+	spin_unlock_irqrestore(&smmu->tlb_lock, flags)
 }
 
+/*
+ * Cavium ThunderX erratum 28168
+ *
+ * Due to erratum #28168 PCI-inbound MSI-X store to the interrupt
+ * controller are delivered to the interrupt controller before older
+ * PCI-inbound memory stores are committed. Doing a sync on SMMU
+ * will make sure all prior transactions are completed.
+ *
+ */
+void cavium_smmu_tlb_sync(struct device *dev)
+{
+	struct arm_smmu_device *smmu;
+	struct arm_smmu_master_cfg *cfg;
+	unsigned long flags;
+
+	smmu = find_smmu_for_device(dev);
+	if (!smmu)
+		return;
+
+	spin_lock_irqsave(&smmu->tlb_lock, flags);
+	 __arm_smmu_tlb_sync(smmu);
+	spin_unlock_irqrestore(&smmu->tlb_lock, flags)
+}
+EXPORT_SYMBOL(cavium_smmu_tlb_sync);
+
 static void arm_smmu_tlb_inv_context(void *cookie)
 {
 	struct arm_smmu_domain *smmu_domain = cookie;
@@ -586,6 +617,7 @@ static void arm_smmu_tlb_inv_context(void *cookie)
 	struct arm_smmu_device *smmu = smmu_domain->smmu;
 	bool stage1 = cfg->cbar != CBAR_TYPE_S2_TRANS;
 	void __iomem *base;
+	unsigned long flags;
 
 	if (stage1) {
 		base = ARM_SMMU_CB_BASE(smmu) + ARM_SMMU_CB(smmu, cfg->cbndx);
@@ -597,7 +629,9 @@ static void arm_smmu_tlb_inv_context(void *cookie)
 			       base + ARM_SMMU_GR0_TLBIVMID);
 	}
 
+	spin_lock_irqsave(&smmu->tlb_lock, flags);
 	__arm_smmu_tlb_sync(smmu);
+	spin_unlock_irqrestore(&smmu->tlb_lock, flags)
 }
 
 static void arm_smmu_tlb_inv_range_nosync(unsigned long iova, size_t size,
@@ -1562,6 +1596,7 @@ static void arm_smmu_device_reset(struct arm_smmu_device *smmu)
 	void __iomem *gr0_base = ARM_SMMU_GR0(smmu);
 	void __iomem *cb_base;
 	int i;
+	unsigned long flags;
 	u32 reg, major;
 
 	/* clear global FSR */
@@ -1633,7 +1668,9 @@ static void arm_smmu_device_reset(struct arm_smmu_device *smmu)
 		reg |= sCR0_VMID16EN;
 
 	/* Push the button */
+	spin_lock_irqsave(&smmu->tlb_lock, flags)
 	__arm_smmu_tlb_sync(smmu);
+	spin_unlock_irqrestore(&smmu->tlb_lock, flags)
 	writel(reg, ARM_SMMU_GR0_NS(smmu) + ARM_SMMU_GR0_sCR0);
 }
 
@@ -2001,6 +2038,7 @@ static int arm_smmu_device_dt_probe(struct platform_device *pdev)
 		}
 	}
 
+	spin_lock_init(&smmu->tlb_lock);
 	of_iommu_set_ops(dev->of_node, &arm_smmu_ops);
 	platform_set_drvdata(pdev, smmu);
 	arm_smmu_device_reset(smmu);
diff --git a/drivers/irqchip/irq-gic-common.h b/drivers/irqchip/irq-gic-common.h
index 205e5fd..0228ba0 100644
--- a/drivers/irqchip/irq-gic-common.h
+++ b/drivers/irqchip/irq-gic-common.h
@@ -38,4 +38,5 @@ void gic_enable_quirks(u32 iidr, const struct gic_quirk *quirks,
 
 void gic_set_kvm_info(const struct gic_kvm_info *info);
 
+void cavium_smmu_tlb_sync(void *iommu);
 #endif /* _IRQ_GIC_COMMON_H */
diff --git a/drivers/irqchip/irq-gic-v3-its.c b/drivers/irqchip/irq-gic-v3-its.c
index 003495d..88e9958 100644
--- a/drivers/irqchip/irq-gic-v3-its.c
+++ b/drivers/irqchip/irq-gic-v3-its.c
@@ -112,6 +112,7 @@ struct its_device {
 	struct its_node		*its;
 	struct event_lpi_map	event_map;
 	void			*itt;
+	struct device           *dev;
 	u32			nr_ites;
 	u32			device_id;
 };
@@ -664,10 +665,29 @@ static void its_irq_compose_msi_msg(struct irq_data *d, struct msi_msg *msg)
 	iommu_dma_map_msi_msg(d->irq, msg);
 }
 
+/**
+ * Due to erratum in ThunderX,
+ * we need to make sure SMMU is in sync with ITS translations.
+ **/
+static void its_ack_irq(struct irq_data *d)
+{
+	struct its_device *its_dev = irq_data_get_irq_chip_data(d);
+	struct pci_dev *pdev;
+
+		if (!dev_is_pci(its_dev->dev))
+			return;
+
+		pdev = to_pci_dev(its_dev->dev);
+		if (pdev->vendor != 0x177d)
+			cavium_smmu_tlb_sync(its_dev->dev);
+
+}
+
 static struct irq_chip its_irq_chip = {
 	.name			= "ITS",
 	.irq_mask		= its_mask_irq,
 	.irq_unmask		= its_unmask_irq,
+	.irq_ack                = its_ack_irq,
 	.irq_eoi		= irq_chip_eoi_parent,
 	.irq_set_affinity	= its_set_affinity,
 	.irq_compose_msi_msg	= its_irq_compose_msi_msg,
@@ -1422,6 +1442,8 @@ static int its_msi_prepare(struct irq_domain *domain, struct device *dev,
 	if (!its_dev)
 		return -ENOMEM;
 
+	its_dev->dev = dev;
+
 	pr_debug("ITT %d entries, %d bits\n", nvec, ilog2(nvec));
 out:
 	info->scratchpad[0].ptr = its_dev;
diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c
index be3c34e..6add8da 100644
--- a/kernel/irq/chip.c
+++ b/kernel/irq/chip.c
@@ -585,6 +585,10 @@ void handle_fasteoi_irq(struct irq_desc *desc)
 		goto out;
 	}
 
+#ifdef CONFIG_CAVIUM_ERRATUM_28168
+	if (chip->irq_ack)
+		chip->irq_ack(&desc->irq_data);
+#endif
 	kstat_incr_irqs_this_cpu(desc);
 	if (desc->istate & IRQS_ONESHOT)
 		mask_irq(desc);
-- 
1.7.1

^ permalink raw reply related	[flat|nested] 104+ messages in thread

* [PATCH] arm64: SMMU-v2: Workaround for Cavium ThunderX erratum 28168
@ 2016-10-22  4:54   ` Geetha sowjanya
  0 siblings, 0 replies; 104+ messages in thread
From: Geetha sowjanya @ 2016-10-22  4:54 UTC (permalink / raw)
  To: linux-arm-kernel

From: Tirumalesh Chalamarla <Tirumalesh.Chalamarla@cavium.com>

  This patch implements Cavium ThunderX erratum 28168.

  PCI requires stores complete in order. Due to erratum #28168
  PCI-inbound MSI-X store to the interrupt controller are delivered
  to the interrupt controller before older PCI-inbound memory stores
  are committed.
  Doing a sync on SMMU will make sure all prior transactions are
  completed.

Signed-off-by: Tirumalesh Chalamarla <Tirumalesh.Chalamarla@cavium.com>
Signed-off-by: Geetha sowjanya <gakula@caviumnetworks.com>
---
 arch/arm64/Kconfig               |   11 +++++++++++
 drivers/iommu/arm-smmu.c         |   38 ++++++++++++++++++++++++++++++++++++++
 drivers/irqchip/irq-gic-common.h |    1 +
 drivers/irqchip/irq-gic-v3-its.c |   22 ++++++++++++++++++++++
 kernel/irq/chip.c                |    4 ++++
 5 files changed, 76 insertions(+), 0 deletions(-)

diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig
index 30398db..57f5c9b 100644
--- a/arch/arm64/Kconfig
+++ b/arch/arm64/Kconfig
@@ -474,6 +474,17 @@ config CAVIUM_ERRATUM_27456
 
 	  If unsure, say Y.
 
+config CAVIUM_ERRATUM_28168
+	bool "Cavium erratum 28168: Make sure ITS and SMMU TLB are in sync"
+	default y
+	help
+	 Due to erratum #28168 PCI-inbound MSI-X store to the interrupt
+	 controller are delivered to the interrupt controller before older
+	 PCI-inbound memory stores are committed. Doing a sync on SMMU
+	 will make sure all prior transactions are completed.
+
+	 If unsure, say Y.
+
 endmenu
 
 
diff --git a/drivers/iommu/arm-smmu.c b/drivers/iommu/arm-smmu.c
index 9740846..20a61c6 100644
--- a/drivers/iommu/arm-smmu.c
+++ b/drivers/iommu/arm-smmu.c
@@ -378,6 +378,7 @@ struct arm_smmu_device {
 	unsigned int			*irqs;
 
 	u32				cavium_id_base; /* Specific to Cavium */
+	spinlock_t			tlb_lock;
 };
 
 enum arm_smmu_context_fmt {
@@ -576,9 +577,39 @@ static void __arm_smmu_tlb_sync(struct arm_smmu_device *smmu)
 static void arm_smmu_tlb_sync(void *cookie)
 {
 	struct arm_smmu_domain *smmu_domain = cookie;
+	struct arm_smmu_device *smmu = smmu_domain->smmu;
+	unsigned long flags;
+
+	spin_lock_irqsave(&smmu->tlb_lock, flags);
 	__arm_smmu_tlb_sync(smmu_domain->smmu);
+	spin_unlock_irqrestore(&smmu->tlb_lock, flags)
 }
 
+/*
+ * Cavium ThunderX erratum 28168
+ *
+ * Due to erratum #28168 PCI-inbound MSI-X store to the interrupt
+ * controller are delivered to the interrupt controller before older
+ * PCI-inbound memory stores are committed. Doing a sync on SMMU
+ * will make sure all prior transactions are completed.
+ *
+ */
+void cavium_smmu_tlb_sync(struct device *dev)
+{
+	struct arm_smmu_device *smmu;
+	struct arm_smmu_master_cfg *cfg;
+	unsigned long flags;
+
+	smmu = find_smmu_for_device(dev);
+	if (!smmu)
+		return;
+
+	spin_lock_irqsave(&smmu->tlb_lock, flags);
+	 __arm_smmu_tlb_sync(smmu);
+	spin_unlock_irqrestore(&smmu->tlb_lock, flags)
+}
+EXPORT_SYMBOL(cavium_smmu_tlb_sync);
+
 static void arm_smmu_tlb_inv_context(void *cookie)
 {
 	struct arm_smmu_domain *smmu_domain = cookie;
@@ -586,6 +617,7 @@ static void arm_smmu_tlb_inv_context(void *cookie)
 	struct arm_smmu_device *smmu = smmu_domain->smmu;
 	bool stage1 = cfg->cbar != CBAR_TYPE_S2_TRANS;
 	void __iomem *base;
+	unsigned long flags;
 
 	if (stage1) {
 		base = ARM_SMMU_CB_BASE(smmu) + ARM_SMMU_CB(smmu, cfg->cbndx);
@@ -597,7 +629,9 @@ static void arm_smmu_tlb_inv_context(void *cookie)
 			       base + ARM_SMMU_GR0_TLBIVMID);
 	}
 
+	spin_lock_irqsave(&smmu->tlb_lock, flags);
 	__arm_smmu_tlb_sync(smmu);
+	spin_unlock_irqrestore(&smmu->tlb_lock, flags)
 }
 
 static void arm_smmu_tlb_inv_range_nosync(unsigned long iova, size_t size,
@@ -1562,6 +1596,7 @@ static void arm_smmu_device_reset(struct arm_smmu_device *smmu)
 	void __iomem *gr0_base = ARM_SMMU_GR0(smmu);
 	void __iomem *cb_base;
 	int i;
+	unsigned long flags;
 	u32 reg, major;
 
 	/* clear global FSR */
@@ -1633,7 +1668,9 @@ static void arm_smmu_device_reset(struct arm_smmu_device *smmu)
 		reg |= sCR0_VMID16EN;
 
 	/* Push the button */
+	spin_lock_irqsave(&smmu->tlb_lock, flags)
 	__arm_smmu_tlb_sync(smmu);
+	spin_unlock_irqrestore(&smmu->tlb_lock, flags)
 	writel(reg, ARM_SMMU_GR0_NS(smmu) + ARM_SMMU_GR0_sCR0);
 }
 
@@ -2001,6 +2038,7 @@ static int arm_smmu_device_dt_probe(struct platform_device *pdev)
 		}
 	}
 
+	spin_lock_init(&smmu->tlb_lock);
 	of_iommu_set_ops(dev->of_node, &arm_smmu_ops);
 	platform_set_drvdata(pdev, smmu);
 	arm_smmu_device_reset(smmu);
diff --git a/drivers/irqchip/irq-gic-common.h b/drivers/irqchip/irq-gic-common.h
index 205e5fd..0228ba0 100644
--- a/drivers/irqchip/irq-gic-common.h
+++ b/drivers/irqchip/irq-gic-common.h
@@ -38,4 +38,5 @@ void gic_enable_quirks(u32 iidr, const struct gic_quirk *quirks,
 
 void gic_set_kvm_info(const struct gic_kvm_info *info);
 
+void cavium_smmu_tlb_sync(void *iommu);
 #endif /* _IRQ_GIC_COMMON_H */
diff --git a/drivers/irqchip/irq-gic-v3-its.c b/drivers/irqchip/irq-gic-v3-its.c
index 003495d..88e9958 100644
--- a/drivers/irqchip/irq-gic-v3-its.c
+++ b/drivers/irqchip/irq-gic-v3-its.c
@@ -112,6 +112,7 @@ struct its_device {
 	struct its_node		*its;
 	struct event_lpi_map	event_map;
 	void			*itt;
+	struct device           *dev;
 	u32			nr_ites;
 	u32			device_id;
 };
@@ -664,10 +665,29 @@ static void its_irq_compose_msi_msg(struct irq_data *d, struct msi_msg *msg)
 	iommu_dma_map_msi_msg(d->irq, msg);
 }
 
+/**
+ * Due to erratum in ThunderX,
+ * we need to make sure SMMU is in sync with ITS translations.
+ **/
+static void its_ack_irq(struct irq_data *d)
+{
+	struct its_device *its_dev = irq_data_get_irq_chip_data(d);
+	struct pci_dev *pdev;
+
+		if (!dev_is_pci(its_dev->dev))
+			return;
+
+		pdev = to_pci_dev(its_dev->dev);
+		if (pdev->vendor != 0x177d)
+			cavium_smmu_tlb_sync(its_dev->dev);
+
+}
+
 static struct irq_chip its_irq_chip = {
 	.name			= "ITS",
 	.irq_mask		= its_mask_irq,
 	.irq_unmask		= its_unmask_irq,
+	.irq_ack                = its_ack_irq,
 	.irq_eoi		= irq_chip_eoi_parent,
 	.irq_set_affinity	= its_set_affinity,
 	.irq_compose_msi_msg	= its_irq_compose_msi_msg,
@@ -1422,6 +1442,8 @@ static int its_msi_prepare(struct irq_domain *domain, struct device *dev,
 	if (!its_dev)
 		return -ENOMEM;
 
+	its_dev->dev = dev;
+
 	pr_debug("ITT %d entries, %d bits\n", nvec, ilog2(nvec));
 out:
 	info->scratchpad[0].ptr = its_dev;
diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c
index be3c34e..6add8da 100644
--- a/kernel/irq/chip.c
+++ b/kernel/irq/chip.c
@@ -585,6 +585,10 @@ void handle_fasteoi_irq(struct irq_desc *desc)
 		goto out;
 	}
 
+#ifdef CONFIG_CAVIUM_ERRATUM_28168
+	if (chip->irq_ack)
+		chip->irq_ack(&desc->irq_data);
+#endif
 	kstat_incr_irqs_this_cpu(desc);
 	if (desc->istate & IRQS_ONESHOT)
 		mask_irq(desc);
-- 
1.7.1

^ permalink raw reply related	[flat|nested] 104+ messages in thread

* Re: [PATCH] arm64: SMMU-v2: Workaround for Cavium ThunderX erratum 28168
  2016-10-22  4:54   ` Geetha sowjanya
@ 2016-10-24 11:28       ` Robin Murphy
  -1 siblings, 0 replies; 104+ messages in thread
From: Robin Murphy @ 2016-10-24 11:28 UTC (permalink / raw)
  To: Geetha sowjanya, will.deacon-5wv7dgnIgG8, mark.rutland-5wv7dgnIgG8
  Cc: Prasun.Kapoor-YGCgFSpz5w/QT0dZR+AlfA, Jason Cooper, Marc Zyngier,
	Tirumalesh Chalamarla,
	iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA,
	Thomas Gleixner,
	linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r

[+Thomas, Jason, Marc]

On 22/10/16 05:54, Geetha sowjanya wrote:
> From: Tirumalesh Chalamarla <Tirumalesh.Chalamarla-YGCgFSpz5w/QT0dZR+AlfA@public.gmane.org>
> 
>   This patch implements Cavium ThunderX erratum 28168.
> 
>   PCI requires stores complete in order. Due to erratum #28168
>   PCI-inbound MSI-X store to the interrupt controller are delivered
>   to the interrupt controller before older PCI-inbound memory stores
>   are committed.
>   Doing a sync on SMMU will make sure all prior transactions are
>   completed.
> 
> Signed-off-by: Tirumalesh Chalamarla <Tirumalesh.Chalamarla-YGCgFSpz5w/QT0dZR+AlfA@public.gmane.org>
> Signed-off-by: Geetha sowjanya <gakula-M3mlKVOIwJVv6pq1l3V1OdBPR1lH4CV8@public.gmane.org>
> ---
>  arch/arm64/Kconfig               |   11 +++++++++++
>  drivers/iommu/arm-smmu.c         |   38 ++++++++++++++++++++++++++++++++++++++
>  drivers/irqchip/irq-gic-common.h |    1 +
>  drivers/irqchip/irq-gic-v3-its.c |   22 ++++++++++++++++++++++
>  kernel/irq/chip.c                |    4 ++++

The irqchip maintainers should absolutely be CC'ed on this. Please use
get_maintainer.pl to check.

>  5 files changed, 76 insertions(+), 0 deletions(-)
> 
> diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig
> index 30398db..57f5c9b 100644
> --- a/arch/arm64/Kconfig
> +++ b/arch/arm64/Kconfig
> @@ -474,6 +474,17 @@ config CAVIUM_ERRATUM_27456
>  
>  	  If unsure, say Y.
>  
> +config CAVIUM_ERRATUM_28168
> +	bool "Cavium erratum 28168: Make sure ITS and SMMU TLB are in sync"
> +	default y
> +	help
> +	 Due to erratum #28168 PCI-inbound MSI-X store to the interrupt
> +	 controller are delivered to the interrupt controller before older
> +	 PCI-inbound memory stores are committed. Doing a sync on SMMU
> +	 will make sure all prior transactions are completed.

Ouch! Is there definitely no other possible workaround, like overriding
transaction attributes, disabling hit-under-miss handling, or somesuch?
Does it have to be a global sync, or is syncing the relevant context
bank sufficient? (I have some half-finished patches to split up the TLB
maintenance ops, including finer-grained syncs wherever possible, which
I can resurrect).

> +
> +	 If unsure, say Y.
> +
>  endmenu
>  
>  
> diff --git a/drivers/iommu/arm-smmu.c b/drivers/iommu/arm-smmu.c
> index 9740846..20a61c6 100644
> --- a/drivers/iommu/arm-smmu.c
> +++ b/drivers/iommu/arm-smmu.c
> @@ -378,6 +378,7 @@ struct arm_smmu_device {
>  	unsigned int			*irqs;
>  
>  	u32				cavium_id_base; /* Specific to Cavium */
> +	spinlock_t			tlb_lock;
>  };
>  
>  enum arm_smmu_context_fmt {
> @@ -576,9 +577,39 @@ static void __arm_smmu_tlb_sync(struct arm_smmu_device *smmu)
>  static void arm_smmu_tlb_sync(void *cookie)
>  {
>  	struct arm_smmu_domain *smmu_domain = cookie;
> +	struct arm_smmu_device *smmu = smmu_domain->smmu;
> +	unsigned long flags;
> +
> +	spin_lock_irqsave(&smmu->tlb_lock, flags);

So *every* unmap operation on any SMMU ever now has to poll some slow
hardware for up to a second with IRQs disabled unconditionally? I don't
think that's acceptable for the general case.

>  	__arm_smmu_tlb_sync(smmu_domain->smmu);
> +	spin_unlock_irqrestore(&smmu->tlb_lock, flags)
>  }
>  
> +/*
> + * Cavium ThunderX erratum 28168
> + *
> + * Due to erratum #28168 PCI-inbound MSI-X store to the interrupt
> + * controller are delivered to the interrupt controller before older
> + * PCI-inbound memory stores are committed. Doing a sync on SMMU
> + * will make sure all prior transactions are completed.
> + *
> + */
> +void cavium_smmu_tlb_sync(struct device *dev)
> +{
> +	struct arm_smmu_device *smmu;
> +	struct arm_smmu_master_cfg *cfg;
> +	unsigned long flags;
> +
> +	smmu = find_smmu_for_device(dev);

Won't compile - that function no longer exists.

> +	if (!smmu)
> +		return;
> +
> +	spin_lock_irqsave(&smmu->tlb_lock, flags);
> +	 __arm_smmu_tlb_sync(smmu);
> +	spin_unlock_irqrestore(&smmu->tlb_lock, flags)
> +}
> +EXPORT_SYMBOL(cavium_smmu_tlb_sync);
> +
>  static void arm_smmu_tlb_inv_context(void *cookie)
>  {
>  	struct arm_smmu_domain *smmu_domain = cookie;
> @@ -586,6 +617,7 @@ static void arm_smmu_tlb_inv_context(void *cookie)
>  	struct arm_smmu_device *smmu = smmu_domain->smmu;
>  	bool stage1 = cfg->cbar != CBAR_TYPE_S2_TRANS;
>  	void __iomem *base;
> +	unsigned long flags;
>  
>  	if (stage1) {
>  		base = ARM_SMMU_CB_BASE(smmu) + ARM_SMMU_CB(smmu, cfg->cbndx);
> @@ -597,7 +629,9 @@ static void arm_smmu_tlb_inv_context(void *cookie)
>  			       base + ARM_SMMU_GR0_TLBIVMID);
>  	}
>  
> +	spin_lock_irqsave(&smmu->tlb_lock, flags);
>  	__arm_smmu_tlb_sync(smmu);
> +	spin_unlock_irqrestore(&smmu->tlb_lock, flags)
>  }
>  
>  static void arm_smmu_tlb_inv_range_nosync(unsigned long iova, size_t size,
> @@ -1562,6 +1596,7 @@ static void arm_smmu_device_reset(struct arm_smmu_device *smmu)
>  	void __iomem *gr0_base = ARM_SMMU_GR0(smmu);
>  	void __iomem *cb_base;
>  	int i;
> +	unsigned long flags;
>  	u32 reg, major;
>  
>  	/* clear global FSR */
> @@ -1633,7 +1668,9 @@ static void arm_smmu_device_reset(struct arm_smmu_device *smmu)
>  		reg |= sCR0_VMID16EN;
>  
>  	/* Push the button */
> +	spin_lock_irqsave(&smmu->tlb_lock, flags)
>  	__arm_smmu_tlb_sync(smmu);
> +	spin_unlock_irqrestore(&smmu->tlb_lock, flags)

After the fourth identical wrapping of the same function call, does it
not start to seem a better idea to implement a workaround *inside*
__arm_smmu_tlb_sync()?

>  	writel(reg, ARM_SMMU_GR0_NS(smmu) + ARM_SMMU_GR0_sCR0);
>  }
>  
> @@ -2001,6 +2038,7 @@ static int arm_smmu_device_dt_probe(struct platform_device *pdev)
>  		}
>  	}
>  
> +	spin_lock_init(&smmu->tlb_lock);
>  	of_iommu_set_ops(dev->of_node, &arm_smmu_ops);
>  	platform_set_drvdata(pdev, smmu);
>  	arm_smmu_device_reset(smmu);
> diff --git a/drivers/irqchip/irq-gic-common.h b/drivers/irqchip/irq-gic-common.h
> index 205e5fd..0228ba0 100644
> --- a/drivers/irqchip/irq-gic-common.h
> +++ b/drivers/irqchip/irq-gic-common.h
> @@ -38,4 +38,5 @@ void gic_enable_quirks(u32 iidr, const struct gic_quirk *quirks,
>  
>  void gic_set_kvm_info(const struct gic_kvm_info *info);
>  
> +void cavium_smmu_tlb_sync(void *iommu);
>  #endif /* _IRQ_GIC_COMMON_H */
> diff --git a/drivers/irqchip/irq-gic-v3-its.c b/drivers/irqchip/irq-gic-v3-its.c
> index 003495d..88e9958 100644
> --- a/drivers/irqchip/irq-gic-v3-its.c
> +++ b/drivers/irqchip/irq-gic-v3-its.c
> @@ -112,6 +112,7 @@ struct its_device {
>  	struct its_node		*its;
>  	struct event_lpi_map	event_map;
>  	void			*itt;
> +	struct device           *dev;
>  	u32			nr_ites;
>  	u32			device_id;
>  };
> @@ -664,10 +665,29 @@ static void its_irq_compose_msi_msg(struct irq_data *d, struct msi_msg *msg)
>  	iommu_dma_map_msi_msg(d->irq, msg);
>  }
>  
> +/**
> + * Due to erratum in ThunderX,
> + * we need to make sure SMMU is in sync with ITS translations.
> + **/
> +static void its_ack_irq(struct irq_data *d)
> +{
> +	struct its_device *its_dev = irq_data_get_irq_chip_data(d);
> +	struct pci_dev *pdev;
> +
> +		if (!dev_is_pci(its_dev->dev))
> +			return;
> +
> +		pdev = to_pci_dev(its_dev->dev);
> +		if (pdev->vendor != 0x177d)
> +			cavium_smmu_tlb_sync(its_dev->dev);

I'm pretty sure that makes any kernel built without CONFIG_ARM_SMMU fail
to link.

Robin.

> +
> +}
> +
>  static struct irq_chip its_irq_chip = {
>  	.name			= "ITS",
>  	.irq_mask		= its_mask_irq,
>  	.irq_unmask		= its_unmask_irq,
> +	.irq_ack                = its_ack_irq,
>  	.irq_eoi		= irq_chip_eoi_parent,
>  	.irq_set_affinity	= its_set_affinity,
>  	.irq_compose_msi_msg	= its_irq_compose_msi_msg,
> @@ -1422,6 +1442,8 @@ static int its_msi_prepare(struct irq_domain *domain, struct device *dev,
>  	if (!its_dev)
>  		return -ENOMEM;
>  
> +	its_dev->dev = dev;
> +
>  	pr_debug("ITT %d entries, %d bits\n", nvec, ilog2(nvec));
>  out:
>  	info->scratchpad[0].ptr = its_dev;
> diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c
> index be3c34e..6add8da 100644
> --- a/kernel/irq/chip.c
> +++ b/kernel/irq/chip.c
> @@ -585,6 +585,10 @@ void handle_fasteoi_irq(struct irq_desc *desc)
>  		goto out;
>  	}
>  
> +#ifdef CONFIG_CAVIUM_ERRATUM_28168
> +	if (chip->irq_ack)
> +		chip->irq_ack(&desc->irq_data);
> +#endif
>  	kstat_incr_irqs_this_cpu(desc);
>  	if (desc->istate & IRQS_ONESHOT)
>  		mask_irq(desc);
> 

^ permalink raw reply	[flat|nested] 104+ messages in thread

* [PATCH] arm64: SMMU-v2: Workaround for Cavium ThunderX erratum 28168
@ 2016-10-24 11:28       ` Robin Murphy
  0 siblings, 0 replies; 104+ messages in thread
From: Robin Murphy @ 2016-10-24 11:28 UTC (permalink / raw)
  To: linux-arm-kernel

[+Thomas, Jason, Marc]

On 22/10/16 05:54, Geetha sowjanya wrote:
> From: Tirumalesh Chalamarla <Tirumalesh.Chalamarla@cavium.com>
> 
>   This patch implements Cavium ThunderX erratum 28168.
> 
>   PCI requires stores complete in order. Due to erratum #28168
>   PCI-inbound MSI-X store to the interrupt controller are delivered
>   to the interrupt controller before older PCI-inbound memory stores
>   are committed.
>   Doing a sync on SMMU will make sure all prior transactions are
>   completed.
> 
> Signed-off-by: Tirumalesh Chalamarla <Tirumalesh.Chalamarla@cavium.com>
> Signed-off-by: Geetha sowjanya <gakula@caviumnetworks.com>
> ---
>  arch/arm64/Kconfig               |   11 +++++++++++
>  drivers/iommu/arm-smmu.c         |   38 ++++++++++++++++++++++++++++++++++++++
>  drivers/irqchip/irq-gic-common.h |    1 +
>  drivers/irqchip/irq-gic-v3-its.c |   22 ++++++++++++++++++++++
>  kernel/irq/chip.c                |    4 ++++

The irqchip maintainers should absolutely be CC'ed on this. Please use
get_maintainer.pl to check.

>  5 files changed, 76 insertions(+), 0 deletions(-)
> 
> diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig
> index 30398db..57f5c9b 100644
> --- a/arch/arm64/Kconfig
> +++ b/arch/arm64/Kconfig
> @@ -474,6 +474,17 @@ config CAVIUM_ERRATUM_27456
>  
>  	  If unsure, say Y.
>  
> +config CAVIUM_ERRATUM_28168
> +	bool "Cavium erratum 28168: Make sure ITS and SMMU TLB are in sync"
> +	default y
> +	help
> +	 Due to erratum #28168 PCI-inbound MSI-X store to the interrupt
> +	 controller are delivered to the interrupt controller before older
> +	 PCI-inbound memory stores are committed. Doing a sync on SMMU
> +	 will make sure all prior transactions are completed.

Ouch! Is there definitely no other possible workaround, like overriding
transaction attributes, disabling hit-under-miss handling, or somesuch?
Does it have to be a global sync, or is syncing the relevant context
bank sufficient? (I have some half-finished patches to split up the TLB
maintenance ops, including finer-grained syncs wherever possible, which
I can resurrect).

> +
> +	 If unsure, say Y.
> +
>  endmenu
>  
>  
> diff --git a/drivers/iommu/arm-smmu.c b/drivers/iommu/arm-smmu.c
> index 9740846..20a61c6 100644
> --- a/drivers/iommu/arm-smmu.c
> +++ b/drivers/iommu/arm-smmu.c
> @@ -378,6 +378,7 @@ struct arm_smmu_device {
>  	unsigned int			*irqs;
>  
>  	u32				cavium_id_base; /* Specific to Cavium */
> +	spinlock_t			tlb_lock;
>  };
>  
>  enum arm_smmu_context_fmt {
> @@ -576,9 +577,39 @@ static void __arm_smmu_tlb_sync(struct arm_smmu_device *smmu)
>  static void arm_smmu_tlb_sync(void *cookie)
>  {
>  	struct arm_smmu_domain *smmu_domain = cookie;
> +	struct arm_smmu_device *smmu = smmu_domain->smmu;
> +	unsigned long flags;
> +
> +	spin_lock_irqsave(&smmu->tlb_lock, flags);

So *every* unmap operation on any SMMU ever now has to poll some slow
hardware for up to a second with IRQs disabled unconditionally? I don't
think that's acceptable for the general case.

>  	__arm_smmu_tlb_sync(smmu_domain->smmu);
> +	spin_unlock_irqrestore(&smmu->tlb_lock, flags)
>  }
>  
> +/*
> + * Cavium ThunderX erratum 28168
> + *
> + * Due to erratum #28168 PCI-inbound MSI-X store to the interrupt
> + * controller are delivered to the interrupt controller before older
> + * PCI-inbound memory stores are committed. Doing a sync on SMMU
> + * will make sure all prior transactions are completed.
> + *
> + */
> +void cavium_smmu_tlb_sync(struct device *dev)
> +{
> +	struct arm_smmu_device *smmu;
> +	struct arm_smmu_master_cfg *cfg;
> +	unsigned long flags;
> +
> +	smmu = find_smmu_for_device(dev);

Won't compile - that function no longer exists.

> +	if (!smmu)
> +		return;
> +
> +	spin_lock_irqsave(&smmu->tlb_lock, flags);
> +	 __arm_smmu_tlb_sync(smmu);
> +	spin_unlock_irqrestore(&smmu->tlb_lock, flags)
> +}
> +EXPORT_SYMBOL(cavium_smmu_tlb_sync);
> +
>  static void arm_smmu_tlb_inv_context(void *cookie)
>  {
>  	struct arm_smmu_domain *smmu_domain = cookie;
> @@ -586,6 +617,7 @@ static void arm_smmu_tlb_inv_context(void *cookie)
>  	struct arm_smmu_device *smmu = smmu_domain->smmu;
>  	bool stage1 = cfg->cbar != CBAR_TYPE_S2_TRANS;
>  	void __iomem *base;
> +	unsigned long flags;
>  
>  	if (stage1) {
>  		base = ARM_SMMU_CB_BASE(smmu) + ARM_SMMU_CB(smmu, cfg->cbndx);
> @@ -597,7 +629,9 @@ static void arm_smmu_tlb_inv_context(void *cookie)
>  			       base + ARM_SMMU_GR0_TLBIVMID);
>  	}
>  
> +	spin_lock_irqsave(&smmu->tlb_lock, flags);
>  	__arm_smmu_tlb_sync(smmu);
> +	spin_unlock_irqrestore(&smmu->tlb_lock, flags)
>  }
>  
>  static void arm_smmu_tlb_inv_range_nosync(unsigned long iova, size_t size,
> @@ -1562,6 +1596,7 @@ static void arm_smmu_device_reset(struct arm_smmu_device *smmu)
>  	void __iomem *gr0_base = ARM_SMMU_GR0(smmu);
>  	void __iomem *cb_base;
>  	int i;
> +	unsigned long flags;
>  	u32 reg, major;
>  
>  	/* clear global FSR */
> @@ -1633,7 +1668,9 @@ static void arm_smmu_device_reset(struct arm_smmu_device *smmu)
>  		reg |= sCR0_VMID16EN;
>  
>  	/* Push the button */
> +	spin_lock_irqsave(&smmu->tlb_lock, flags)
>  	__arm_smmu_tlb_sync(smmu);
> +	spin_unlock_irqrestore(&smmu->tlb_lock, flags)

After the fourth identical wrapping of the same function call, does it
not start to seem a better idea to implement a workaround *inside*
__arm_smmu_tlb_sync()?

>  	writel(reg, ARM_SMMU_GR0_NS(smmu) + ARM_SMMU_GR0_sCR0);
>  }
>  
> @@ -2001,6 +2038,7 @@ static int arm_smmu_device_dt_probe(struct platform_device *pdev)
>  		}
>  	}
>  
> +	spin_lock_init(&smmu->tlb_lock);
>  	of_iommu_set_ops(dev->of_node, &arm_smmu_ops);
>  	platform_set_drvdata(pdev, smmu);
>  	arm_smmu_device_reset(smmu);
> diff --git a/drivers/irqchip/irq-gic-common.h b/drivers/irqchip/irq-gic-common.h
> index 205e5fd..0228ba0 100644
> --- a/drivers/irqchip/irq-gic-common.h
> +++ b/drivers/irqchip/irq-gic-common.h
> @@ -38,4 +38,5 @@ void gic_enable_quirks(u32 iidr, const struct gic_quirk *quirks,
>  
>  void gic_set_kvm_info(const struct gic_kvm_info *info);
>  
> +void cavium_smmu_tlb_sync(void *iommu);
>  #endif /* _IRQ_GIC_COMMON_H */
> diff --git a/drivers/irqchip/irq-gic-v3-its.c b/drivers/irqchip/irq-gic-v3-its.c
> index 003495d..88e9958 100644
> --- a/drivers/irqchip/irq-gic-v3-its.c
> +++ b/drivers/irqchip/irq-gic-v3-its.c
> @@ -112,6 +112,7 @@ struct its_device {
>  	struct its_node		*its;
>  	struct event_lpi_map	event_map;
>  	void			*itt;
> +	struct device           *dev;
>  	u32			nr_ites;
>  	u32			device_id;
>  };
> @@ -664,10 +665,29 @@ static void its_irq_compose_msi_msg(struct irq_data *d, struct msi_msg *msg)
>  	iommu_dma_map_msi_msg(d->irq, msg);
>  }
>  
> +/**
> + * Due to erratum in ThunderX,
> + * we need to make sure SMMU is in sync with ITS translations.
> + **/
> +static void its_ack_irq(struct irq_data *d)
> +{
> +	struct its_device *its_dev = irq_data_get_irq_chip_data(d);
> +	struct pci_dev *pdev;
> +
> +		if (!dev_is_pci(its_dev->dev))
> +			return;
> +
> +		pdev = to_pci_dev(its_dev->dev);
> +		if (pdev->vendor != 0x177d)
> +			cavium_smmu_tlb_sync(its_dev->dev);

I'm pretty sure that makes any kernel built without CONFIG_ARM_SMMU fail
to link.

Robin.

> +
> +}
> +
>  static struct irq_chip its_irq_chip = {
>  	.name			= "ITS",
>  	.irq_mask		= its_mask_irq,
>  	.irq_unmask		= its_unmask_irq,
> +	.irq_ack                = its_ack_irq,
>  	.irq_eoi		= irq_chip_eoi_parent,
>  	.irq_set_affinity	= its_set_affinity,
>  	.irq_compose_msi_msg	= its_irq_compose_msi_msg,
> @@ -1422,6 +1442,8 @@ static int its_msi_prepare(struct irq_domain *domain, struct device *dev,
>  	if (!its_dev)
>  		return -ENOMEM;
>  
> +	its_dev->dev = dev;
> +
>  	pr_debug("ITT %d entries, %d bits\n", nvec, ilog2(nvec));
>  out:
>  	info->scratchpad[0].ptr = its_dev;
> diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c
> index be3c34e..6add8da 100644
> --- a/kernel/irq/chip.c
> +++ b/kernel/irq/chip.c
> @@ -585,6 +585,10 @@ void handle_fasteoi_irq(struct irq_desc *desc)
>  		goto out;
>  	}
>  
> +#ifdef CONFIG_CAVIUM_ERRATUM_28168
> +	if (chip->irq_ack)
> +		chip->irq_ack(&desc->irq_data);
> +#endif
>  	kstat_incr_irqs_this_cpu(desc);
>  	if (desc->istate & IRQS_ONESHOT)
>  		mask_irq(desc);
> 

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [PATCH] arm64: SMMU-v2: Workaround for Cavium ThunderX erratum 28168
       [not found]   ` <1477112061-12868-1-git-send-email-gakula-M3mlKVOIwJVv6pq1l3V1OdBPR1lH4CV8@public.gmane.org>
  2016-10-24 11:28       ` Robin Murphy
@ 2016-10-24 13:44     ` Marc Zyngier
  0 siblings, 0 replies; 104+ messages in thread
From: Marc Zyngier @ 2016-10-24 13:44 UTC (permalink / raw)
  To: Geetha sowjanya, robin.murphy, will.deacon, mark.rutland
  Cc: Prasun.Kapoor, iommu, Tirumalesh Chalamarla, linux-arm-kernel,
	Thomas Gleixner, Jason Cooper, linux-kernel

Geetha,

On 22/10/16 05:54, Geetha sowjanya wrote:
> From: Tirumalesh Chalamarla <Tirumalesh.Chalamarla@cavium.com>
> 
>   This patch implements Cavium ThunderX erratum 28168.
> 
>   PCI requires stores complete in order. Due to erratum #28168
>   PCI-inbound MSI-X store to the interrupt controller are delivered
>   to the interrupt controller before older PCI-inbound memory stores
>   are committed.
>   Doing a sync on SMMU will make sure all prior transactions are
>   completed.
> 
> Signed-off-by: Tirumalesh Chalamarla <Tirumalesh.Chalamarla@cavium.com>
> Signed-off-by: Geetha sowjanya <gakula@caviumnetworks.com>
> ---
>  arch/arm64/Kconfig               |   11 +++++++++++
>  drivers/iommu/arm-smmu.c         |   38 ++++++++++++++++++++++++++++++++++++++
>  drivers/irqchip/irq-gic-common.h |    1 +
>  drivers/irqchip/irq-gic-v3-its.c |   22 ++++++++++++++++++++++
>  kernel/irq/chip.c                |    4 ++++

Thanks Robin for looping me in. Geetha, please use get_maintainers.pl to
keep the relevant people on CC, specially as you're touching some of the
core infrastructure.

>  5 files changed, 76 insertions(+), 0 deletions(-)
> 
> diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig
> index 30398db..57f5c9b 100644
> --- a/arch/arm64/Kconfig
> +++ b/arch/arm64/Kconfig
> @@ -474,6 +474,17 @@ config CAVIUM_ERRATUM_27456
>  
>  	  If unsure, say Y.
>  
> +config CAVIUM_ERRATUM_28168
> +	bool "Cavium erratum 28168: Make sure ITS and SMMU TLB are in sync"
> +	default y
> +	help
> +	 Due to erratum #28168 PCI-inbound MSI-X store to the interrupt
> +	 controller are delivered to the interrupt controller before older
> +	 PCI-inbound memory stores are committed. Doing a sync on SMMU
> +	 will make sure all prior transactions are completed.
> +
> +	 If unsure, say Y.

Please add an entry to Documentation/arm64/silicon-errata.txt.

> +
>  endmenu
>  
>  
> diff --git a/drivers/iommu/arm-smmu.c b/drivers/iommu/arm-smmu.c
> index 9740846..20a61c6 100644
> --- a/drivers/iommu/arm-smmu.c
> +++ b/drivers/iommu/arm-smmu.c

I'll skip the SMMU code on which Robin has commented already, and move
to the irq part, which is equally entertaining.

[...]

> diff --git a/drivers/irqchip/irq-gic-common.h b/drivers/irqchip/irq-gic-common.h
> index 205e5fd..0228ba0 100644
> --- a/drivers/irqchip/irq-gic-common.h
> +++ b/drivers/irqchip/irq-gic-common.h
> @@ -38,4 +38,5 @@ void gic_enable_quirks(u32 iidr, const struct gic_quirk *quirks,
>  
>  void gic_set_kvm_info(const struct gic_kvm_info *info);
>  
> +void cavium_smmu_tlb_sync(void *iommu);
>  #endif /* _IRQ_GIC_COMMON_H */
> diff --git a/drivers/irqchip/irq-gic-v3-its.c b/drivers/irqchip/irq-gic-v3-its.c
> index 003495d..88e9958 100644
> --- a/drivers/irqchip/irq-gic-v3-its.c
> +++ b/drivers/irqchip/irq-gic-v3-its.c
> @@ -112,6 +112,7 @@ struct its_device {
>  	struct its_node		*its;
>  	struct event_lpi_map	event_map;
>  	void			*itt;
> +	struct device           *dev;

This doesn't work in the presence of anything that will multiplex
multiple RequesterIDs onto a single DeviceID (non transparent PCI
bridge, for example).

>  	u32			nr_ites;
>  	u32			device_id;
>  };
> @@ -664,10 +665,29 @@ static void its_irq_compose_msi_msg(struct irq_data *d, struct msi_msg *msg)
>  	iommu_dma_map_msi_msg(d->irq, msg);
>  }
>  
> +/**
> + * Due to erratum in ThunderX,
> + * we need to make sure SMMU is in sync with ITS translations.
> + **/
> +static void its_ack_irq(struct irq_data *d)
> +{
> +	struct its_device *its_dev = irq_data_get_irq_chip_data(d);
> +	struct pci_dev *pdev;
> +
> +		if (!dev_is_pci(its_dev->dev))
> +			return;

How about non PCI devices?

> +
> +		pdev = to_pci_dev(its_dev->dev);
> +		if (pdev->vendor != 0x177d)
> +			cavium_smmu_tlb_sync(its_dev->dev);

What makes Cavium devices so special that they do not need to respect
the PCI memory ordering with respect to MSI delivery?

> +
> +}
> +
>  static struct irq_chip its_irq_chip = {
>  	.name			= "ITS",
>  	.irq_mask		= its_mask_irq,
>  	.irq_unmask		= its_unmask_irq,
> +	.irq_ack                = its_ack_irq,

Nice try, but no, thank you. If you really want to go down that road,
have a look at CONFIG_IRQ_PREFLOW_FASTEOI, and make this workaround a
per interrupt thing. At least, you won't pollute the core code with
another hack.

Also, it would be good to find a way for that hack to be confined to the
SMMU driver, since that's where the oddity is being handled. Something
that would occur when the device is mapping memory is probably on good spot.

>  	.irq_eoi		= irq_chip_eoi_parent,
>  	.irq_set_affinity	= its_set_affinity,
>  	.irq_compose_msi_msg	= its_irq_compose_msi_msg,
> @@ -1422,6 +1442,8 @@ static int its_msi_prepare(struct irq_domain *domain, struct device *dev,
>  	if (!its_dev)
>  		return -ENOMEM;
>  
> +	its_dev->dev = dev;
> +
>  	pr_debug("ITT %d entries, %d bits\n", nvec, ilog2(nvec));
>  out:
>  	info->scratchpad[0].ptr = its_dev;
> diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c
> index be3c34e..6add8da 100644
> --- a/kernel/irq/chip.c
> +++ b/kernel/irq/chip.c
> @@ -585,6 +585,10 @@ void handle_fasteoi_irq(struct irq_desc *desc)
>  		goto out;
>  	}
>  
> +#ifdef CONFIG_CAVIUM_ERRATUM_28168
> +	if (chip->irq_ack)
> +		chip->irq_ack(&desc->irq_data);
> +#endif
>  	kstat_incr_irqs_this_cpu(desc);
>  	if (desc->istate & IRQS_ONESHOT)
>  		mask_irq(desc);
> 

Overall, this workaround is not acceptable as it is. You need to find
ways to make it less invasive, and hopefully the above pointers will
help. Please keep the current distribution list posted once you update
this patch.

Thanks,

	M.
-- 
Jazz is not dead. It just smells funny...

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [PATCH] arm64: SMMU-v2: Workaround for Cavium ThunderX erratum 28168
@ 2016-10-24 13:44     ` Marc Zyngier
  0 siblings, 0 replies; 104+ messages in thread
From: Marc Zyngier @ 2016-10-24 13:44 UTC (permalink / raw)
  To: Geetha sowjanya, robin.murphy-5wv7dgnIgG8,
	will.deacon-5wv7dgnIgG8, mark.rutland-5wv7dgnIgG8
  Cc: Prasun.Kapoor-YGCgFSpz5w/QT0dZR+AlfA, Jason Cooper,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA, Tirumalesh Chalamarla,
	iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA,
	Thomas Gleixner,
	linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r

Geetha,

On 22/10/16 05:54, Geetha sowjanya wrote:
> From: Tirumalesh Chalamarla <Tirumalesh.Chalamarla-YGCgFSpz5w/QT0dZR+AlfA@public.gmane.org>
> 
>   This patch implements Cavium ThunderX erratum 28168.
> 
>   PCI requires stores complete in order. Due to erratum #28168
>   PCI-inbound MSI-X store to the interrupt controller are delivered
>   to the interrupt controller before older PCI-inbound memory stores
>   are committed.
>   Doing a sync on SMMU will make sure all prior transactions are
>   completed.
> 
> Signed-off-by: Tirumalesh Chalamarla <Tirumalesh.Chalamarla-YGCgFSpz5w/QT0dZR+AlfA@public.gmane.org>
> Signed-off-by: Geetha sowjanya <gakula-M3mlKVOIwJVv6pq1l3V1OdBPR1lH4CV8@public.gmane.org>
> ---
>  arch/arm64/Kconfig               |   11 +++++++++++
>  drivers/iommu/arm-smmu.c         |   38 ++++++++++++++++++++++++++++++++++++++
>  drivers/irqchip/irq-gic-common.h |    1 +
>  drivers/irqchip/irq-gic-v3-its.c |   22 ++++++++++++++++++++++
>  kernel/irq/chip.c                |    4 ++++

Thanks Robin for looping me in. Geetha, please use get_maintainers.pl to
keep the relevant people on CC, specially as you're touching some of the
core infrastructure.

>  5 files changed, 76 insertions(+), 0 deletions(-)
> 
> diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig
> index 30398db..57f5c9b 100644
> --- a/arch/arm64/Kconfig
> +++ b/arch/arm64/Kconfig
> @@ -474,6 +474,17 @@ config CAVIUM_ERRATUM_27456
>  
>  	  If unsure, say Y.
>  
> +config CAVIUM_ERRATUM_28168
> +	bool "Cavium erratum 28168: Make sure ITS and SMMU TLB are in sync"
> +	default y
> +	help
> +	 Due to erratum #28168 PCI-inbound MSI-X store to the interrupt
> +	 controller are delivered to the interrupt controller before older
> +	 PCI-inbound memory stores are committed. Doing a sync on SMMU
> +	 will make sure all prior transactions are completed.
> +
> +	 If unsure, say Y.

Please add an entry to Documentation/arm64/silicon-errata.txt.

> +
>  endmenu
>  
>  
> diff --git a/drivers/iommu/arm-smmu.c b/drivers/iommu/arm-smmu.c
> index 9740846..20a61c6 100644
> --- a/drivers/iommu/arm-smmu.c
> +++ b/drivers/iommu/arm-smmu.c

I'll skip the SMMU code on which Robin has commented already, and move
to the irq part, which is equally entertaining.

[...]

> diff --git a/drivers/irqchip/irq-gic-common.h b/drivers/irqchip/irq-gic-common.h
> index 205e5fd..0228ba0 100644
> --- a/drivers/irqchip/irq-gic-common.h
> +++ b/drivers/irqchip/irq-gic-common.h
> @@ -38,4 +38,5 @@ void gic_enable_quirks(u32 iidr, const struct gic_quirk *quirks,
>  
>  void gic_set_kvm_info(const struct gic_kvm_info *info);
>  
> +void cavium_smmu_tlb_sync(void *iommu);
>  #endif /* _IRQ_GIC_COMMON_H */
> diff --git a/drivers/irqchip/irq-gic-v3-its.c b/drivers/irqchip/irq-gic-v3-its.c
> index 003495d..88e9958 100644
> --- a/drivers/irqchip/irq-gic-v3-its.c
> +++ b/drivers/irqchip/irq-gic-v3-its.c
> @@ -112,6 +112,7 @@ struct its_device {
>  	struct its_node		*its;
>  	struct event_lpi_map	event_map;
>  	void			*itt;
> +	struct device           *dev;

This doesn't work in the presence of anything that will multiplex
multiple RequesterIDs onto a single DeviceID (non transparent PCI
bridge, for example).

>  	u32			nr_ites;
>  	u32			device_id;
>  };
> @@ -664,10 +665,29 @@ static void its_irq_compose_msi_msg(struct irq_data *d, struct msi_msg *msg)
>  	iommu_dma_map_msi_msg(d->irq, msg);
>  }
>  
> +/**
> + * Due to erratum in ThunderX,
> + * we need to make sure SMMU is in sync with ITS translations.
> + **/
> +static void its_ack_irq(struct irq_data *d)
> +{
> +	struct its_device *its_dev = irq_data_get_irq_chip_data(d);
> +	struct pci_dev *pdev;
> +
> +		if (!dev_is_pci(its_dev->dev))
> +			return;

How about non PCI devices?

> +
> +		pdev = to_pci_dev(its_dev->dev);
> +		if (pdev->vendor != 0x177d)
> +			cavium_smmu_tlb_sync(its_dev->dev);

What makes Cavium devices so special that they do not need to respect
the PCI memory ordering with respect to MSI delivery?

> +
> +}
> +
>  static struct irq_chip its_irq_chip = {
>  	.name			= "ITS",
>  	.irq_mask		= its_mask_irq,
>  	.irq_unmask		= its_unmask_irq,
> +	.irq_ack                = its_ack_irq,

Nice try, but no, thank you. If you really want to go down that road,
have a look at CONFIG_IRQ_PREFLOW_FASTEOI, and make this workaround a
per interrupt thing. At least, you won't pollute the core code with
another hack.

Also, it would be good to find a way for that hack to be confined to the
SMMU driver, since that's where the oddity is being handled. Something
that would occur when the device is mapping memory is probably on good spot.

>  	.irq_eoi		= irq_chip_eoi_parent,
>  	.irq_set_affinity	= its_set_affinity,
>  	.irq_compose_msi_msg	= its_irq_compose_msi_msg,
> @@ -1422,6 +1442,8 @@ static int its_msi_prepare(struct irq_domain *domain, struct device *dev,
>  	if (!its_dev)
>  		return -ENOMEM;
>  
> +	its_dev->dev = dev;
> +
>  	pr_debug("ITT %d entries, %d bits\n", nvec, ilog2(nvec));
>  out:
>  	info->scratchpad[0].ptr = its_dev;
> diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c
> index be3c34e..6add8da 100644
> --- a/kernel/irq/chip.c
> +++ b/kernel/irq/chip.c
> @@ -585,6 +585,10 @@ void handle_fasteoi_irq(struct irq_desc *desc)
>  		goto out;
>  	}
>  
> +#ifdef CONFIG_CAVIUM_ERRATUM_28168
> +	if (chip->irq_ack)
> +		chip->irq_ack(&desc->irq_data);
> +#endif
>  	kstat_incr_irqs_this_cpu(desc);
>  	if (desc->istate & IRQS_ONESHOT)
>  		mask_irq(desc);
> 

Overall, this workaround is not acceptable as it is. You need to find
ways to make it less invasive, and hopefully the above pointers will
help. Please keep the current distribution list posted once you update
this patch.

Thanks,

	M.
-- 
Jazz is not dead. It just smells funny...

^ permalink raw reply	[flat|nested] 104+ messages in thread

* [PATCH] arm64: SMMU-v2: Workaround for Cavium ThunderX erratum 28168
@ 2016-10-24 13:44     ` Marc Zyngier
  0 siblings, 0 replies; 104+ messages in thread
From: Marc Zyngier @ 2016-10-24 13:44 UTC (permalink / raw)
  To: linux-arm-kernel

Geetha,

On 22/10/16 05:54, Geetha sowjanya wrote:
> From: Tirumalesh Chalamarla <Tirumalesh.Chalamarla@cavium.com>
> 
>   This patch implements Cavium ThunderX erratum 28168.
> 
>   PCI requires stores complete in order. Due to erratum #28168
>   PCI-inbound MSI-X store to the interrupt controller are delivered
>   to the interrupt controller before older PCI-inbound memory stores
>   are committed.
>   Doing a sync on SMMU will make sure all prior transactions are
>   completed.
> 
> Signed-off-by: Tirumalesh Chalamarla <Tirumalesh.Chalamarla@cavium.com>
> Signed-off-by: Geetha sowjanya <gakula@caviumnetworks.com>
> ---
>  arch/arm64/Kconfig               |   11 +++++++++++
>  drivers/iommu/arm-smmu.c         |   38 ++++++++++++++++++++++++++++++++++++++
>  drivers/irqchip/irq-gic-common.h |    1 +
>  drivers/irqchip/irq-gic-v3-its.c |   22 ++++++++++++++++++++++
>  kernel/irq/chip.c                |    4 ++++

Thanks Robin for looping me in. Geetha, please use get_maintainers.pl to
keep the relevant people on CC, specially as you're touching some of the
core infrastructure.

>  5 files changed, 76 insertions(+), 0 deletions(-)
> 
> diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig
> index 30398db..57f5c9b 100644
> --- a/arch/arm64/Kconfig
> +++ b/arch/arm64/Kconfig
> @@ -474,6 +474,17 @@ config CAVIUM_ERRATUM_27456
>  
>  	  If unsure, say Y.
>  
> +config CAVIUM_ERRATUM_28168
> +	bool "Cavium erratum 28168: Make sure ITS and SMMU TLB are in sync"
> +	default y
> +	help
> +	 Due to erratum #28168 PCI-inbound MSI-X store to the interrupt
> +	 controller are delivered to the interrupt controller before older
> +	 PCI-inbound memory stores are committed. Doing a sync on SMMU
> +	 will make sure all prior transactions are completed.
> +
> +	 If unsure, say Y.

Please add an entry to Documentation/arm64/silicon-errata.txt.

> +
>  endmenu
>  
>  
> diff --git a/drivers/iommu/arm-smmu.c b/drivers/iommu/arm-smmu.c
> index 9740846..20a61c6 100644
> --- a/drivers/iommu/arm-smmu.c
> +++ b/drivers/iommu/arm-smmu.c

I'll skip the SMMU code on which Robin has commented already, and move
to the irq part, which is equally entertaining.

[...]

> diff --git a/drivers/irqchip/irq-gic-common.h b/drivers/irqchip/irq-gic-common.h
> index 205e5fd..0228ba0 100644
> --- a/drivers/irqchip/irq-gic-common.h
> +++ b/drivers/irqchip/irq-gic-common.h
> @@ -38,4 +38,5 @@ void gic_enable_quirks(u32 iidr, const struct gic_quirk *quirks,
>  
>  void gic_set_kvm_info(const struct gic_kvm_info *info);
>  
> +void cavium_smmu_tlb_sync(void *iommu);
>  #endif /* _IRQ_GIC_COMMON_H */
> diff --git a/drivers/irqchip/irq-gic-v3-its.c b/drivers/irqchip/irq-gic-v3-its.c
> index 003495d..88e9958 100644
> --- a/drivers/irqchip/irq-gic-v3-its.c
> +++ b/drivers/irqchip/irq-gic-v3-its.c
> @@ -112,6 +112,7 @@ struct its_device {
>  	struct its_node		*its;
>  	struct event_lpi_map	event_map;
>  	void			*itt;
> +	struct device           *dev;

This doesn't work in the presence of anything that will multiplex
multiple RequesterIDs onto a single DeviceID (non transparent PCI
bridge, for example).

>  	u32			nr_ites;
>  	u32			device_id;
>  };
> @@ -664,10 +665,29 @@ static void its_irq_compose_msi_msg(struct irq_data *d, struct msi_msg *msg)
>  	iommu_dma_map_msi_msg(d->irq, msg);
>  }
>  
> +/**
> + * Due to erratum in ThunderX,
> + * we need to make sure SMMU is in sync with ITS translations.
> + **/
> +static void its_ack_irq(struct irq_data *d)
> +{
> +	struct its_device *its_dev = irq_data_get_irq_chip_data(d);
> +	struct pci_dev *pdev;
> +
> +		if (!dev_is_pci(its_dev->dev))
> +			return;

How about non PCI devices?

> +
> +		pdev = to_pci_dev(its_dev->dev);
> +		if (pdev->vendor != 0x177d)
> +			cavium_smmu_tlb_sync(its_dev->dev);

What makes Cavium devices so special that they do not need to respect
the PCI memory ordering with respect to MSI delivery?

> +
> +}
> +
>  static struct irq_chip its_irq_chip = {
>  	.name			= "ITS",
>  	.irq_mask		= its_mask_irq,
>  	.irq_unmask		= its_unmask_irq,
> +	.irq_ack                = its_ack_irq,

Nice try, but no, thank you. If you really want to go down that road,
have a look at CONFIG_IRQ_PREFLOW_FASTEOI, and make this workaround a
per interrupt thing. At least, you won't pollute the core code with
another hack.

Also, it would be good to find a way for that hack to be confined to the
SMMU driver, since that's where the oddity is being handled. Something
that would occur when the device is mapping memory is probably on good spot.

>  	.irq_eoi		= irq_chip_eoi_parent,
>  	.irq_set_affinity	= its_set_affinity,
>  	.irq_compose_msi_msg	= its_irq_compose_msi_msg,
> @@ -1422,6 +1442,8 @@ static int its_msi_prepare(struct irq_domain *domain, struct device *dev,
>  	if (!its_dev)
>  		return -ENOMEM;
>  
> +	its_dev->dev = dev;
> +
>  	pr_debug("ITT %d entries, %d bits\n", nvec, ilog2(nvec));
>  out:
>  	info->scratchpad[0].ptr = its_dev;
> diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c
> index be3c34e..6add8da 100644
> --- a/kernel/irq/chip.c
> +++ b/kernel/irq/chip.c
> @@ -585,6 +585,10 @@ void handle_fasteoi_irq(struct irq_desc *desc)
>  		goto out;
>  	}
>  
> +#ifdef CONFIG_CAVIUM_ERRATUM_28168
> +	if (chip->irq_ack)
> +		chip->irq_ack(&desc->irq_data);
> +#endif
>  	kstat_incr_irqs_this_cpu(desc);
>  	if (desc->istate & IRQS_ONESHOT)
>  		mask_irq(desc);
> 

Overall, this workaround is not acceptable as it is. You need to find
ways to make it less invasive, and hopefully the above pointers will
help. Please keep the current distribution list posted once you update
this patch.

Thanks,

	M.
-- 
Jazz is not dead. It just smells funny...

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [PATCH] arm64: SMMU-v2: Workaround for Cavium ThunderX erratum 28168
       [not found]     ` <fbc51a32-aaba-0ee6-c0bd-07a02fb2a6b4-5wv7dgnIgG8@public.gmane.org>
@ 2016-10-24 15:29       ` Akula, Geethasowjanya
  0 siblings, 0 replies; 104+ messages in thread
From: Akula, Geethasowjanya @ 2016-10-24 15:29 UTC (permalink / raw)
  To: Marc Zyngier, robin.murphy-5wv7dgnIgG8, will.deacon-5wv7dgnIgG8,
	mark.rutland-5wv7dgnIgG8
  Cc: Kapoor, Prasun, Jason Cooper,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA, Chalamarla, Tirumalesh,
	iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA,
	Thomas Gleixner,
	linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r


[-- Attachment #1.1: Type: text/plain, Size: 7054 bytes --]

Hi Marc, Robin.


Thanks for your feedback. I will resend the updated patch soon.




Thank you,

Geetha.


________________________________
From: Marc Zyngier <marc.zyngier-5wv7dgnIgG8@public.gmane.org>
Sent: Monday, October 24, 2016 7:14:35 PM
To: Akula, Geethasowjanya; robin.murphy-5wv7dgnIgG8@public.gmane.org; will.deacon-5wv7dgnIgG8@public.gmane.org; mark.rutland-5wv7dgnIgG8@public.gmane.org
Cc: Kapoor, Prasun; iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org; Chalamarla, Tirumalesh; linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org; Thomas Gleixner; Jason Cooper; linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
Subject: Re: [PATCH] arm64: SMMU-v2: Workaround for Cavium ThunderX erratum 28168

Geetha,

On 22/10/16 05:54, Geetha sowjanya wrote:
> From: Tirumalesh Chalamarla <Tirumalesh.Chalamarla-YGCgFSpz5w/QT0dZR+AlfA@public.gmane.org>
>
>   This patch implements Cavium ThunderX erratum 28168.
>
>   PCI requires stores complete in order. Due to erratum #28168
>   PCI-inbound MSI-X store to the interrupt controller are delivered
>   to the interrupt controller before older PCI-inbound memory stores
>   are committed.
>   Doing a sync on SMMU will make sure all prior transactions are
>   completed.
>
> Signed-off-by: Tirumalesh Chalamarla <Tirumalesh.Chalamarla-YGCgFSpz5w/QT0dZR+AlfA@public.gmane.org>
> Signed-off-by: Geetha sowjanya <gakula-M3mlKVOIwJVv6pq1l3V1OdBPR1lH4CV8@public.gmane.org>
> ---
>  arch/arm64/Kconfig               |   11 +++++++++++
>  drivers/iommu/arm-smmu.c         |   38 ++++++++++++++++++++++++++++++++++++++
>  drivers/irqchip/irq-gic-common.h |    1 +
>  drivers/irqchip/irq-gic-v3-its.c |   22 ++++++++++++++++++++++
>  kernel/irq/chip.c                |    4 ++++

Thanks Robin for looping me in. Geetha, please use get_maintainers.pl to
keep the relevant people on CC, specially as you're touching some of the
core infrastructure.

>  5 files changed, 76 insertions(+), 0 deletions(-)
>
> diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig
> index 30398db..57f5c9b 100644
> --- a/arch/arm64/Kconfig
> +++ b/arch/arm64/Kconfig
> @@ -474,6 +474,17 @@ config CAVIUM_ERRATUM_27456
>
>          If unsure, say Y.
>
> +config CAVIUM_ERRATUM_28168
> +     bool "Cavium erratum 28168: Make sure ITS and SMMU TLB are in sync"
> +     default y
> +     help
> +      Due to erratum #28168 PCI-inbound MSI-X store to the interrupt
> +      controller are delivered to the interrupt controller before older
> +      PCI-inbound memory stores are committed. Doing a sync on SMMU
> +      will make sure all prior transactions are completed.
> +
> +      If unsure, say Y.

Please add an entry to Documentation/arm64/silicon-errata.txt.

> +
>  endmenu
>
>
> diff --git a/drivers/iommu/arm-smmu.c b/drivers/iommu/arm-smmu.c
> index 9740846..20a61c6 100644
> --- a/drivers/iommu/arm-smmu.c
> +++ b/drivers/iommu/arm-smmu.c

I'll skip the SMMU code on which Robin has commented already, and move
to the irq part, which is equally entertaining.

[...]

> diff --git a/drivers/irqchip/irq-gic-common.h b/drivers/irqchip/irq-gic-common.h
> index 205e5fd..0228ba0 100644
> --- a/drivers/irqchip/irq-gic-common.h
> +++ b/drivers/irqchip/irq-gic-common.h
> @@ -38,4 +38,5 @@ void gic_enable_quirks(u32 iidr, const struct gic_quirk *quirks,
>
>  void gic_set_kvm_info(const struct gic_kvm_info *info);
>
> +void cavium_smmu_tlb_sync(void *iommu);
>  #endif /* _IRQ_GIC_COMMON_H */
> diff --git a/drivers/irqchip/irq-gic-v3-its.c b/drivers/irqchip/irq-gic-v3-its.c
> index 003495d..88e9958 100644
> --- a/drivers/irqchip/irq-gic-v3-its.c
> +++ b/drivers/irqchip/irq-gic-v3-its.c
> @@ -112,6 +112,7 @@ struct its_device {
>        struct its_node         *its;
>        struct event_lpi_map    event_map;
>        void                    *itt;
> +     struct device           *dev;

This doesn't work in the presence of anything that will multiplex
multiple RequesterIDs onto a single DeviceID (non transparent PCI
bridge, for example).

>        u32                     nr_ites;
>        u32                     device_id;
>  };
> @@ -664,10 +665,29 @@ static void its_irq_compose_msi_msg(struct irq_data *d, struct msi_msg *msg)
>        iommu_dma_map_msi_msg(d->irq, msg);
>  }
>
> +/**
> + * Due to erratum in ThunderX,
> + * we need to make sure SMMU is in sync with ITS translations.
> + **/
> +static void its_ack_irq(struct irq_data *d)
> +{
> +     struct its_device *its_dev = irq_data_get_irq_chip_data(d);
> +     struct pci_dev *pdev;
> +
> +             if (!dev_is_pci(its_dev->dev))
> +                     return;

How about non PCI devices?

> +
> +             pdev = to_pci_dev(its_dev->dev);
> +             if (pdev->vendor != 0x177d)
> +                     cavium_smmu_tlb_sync(its_dev->dev);

What makes Cavium devices so special that they do not need to respect
the PCI memory ordering with respect to MSI delivery?

> +
> +}
> +
>  static struct irq_chip its_irq_chip = {
>        .name                   = "ITS",
>        .irq_mask               = its_mask_irq,
>        .irq_unmask             = its_unmask_irq,
> +     .irq_ack                = its_ack_irq,

Nice try, but no, thank you. If you really want to go down that road,
have a look at CONFIG_IRQ_PREFLOW_FASTEOI, and make this workaround a
per interrupt thing. At least, you won't pollute the core code with
another hack.

Also, it would be good to find a way for that hack to be confined to the
SMMU driver, since that's where the oddity is being handled. Something
that would occur when the device is mapping memory is probably on good spot.

>        .irq_eoi                = irq_chip_eoi_parent,
>        .irq_set_affinity       = its_set_affinity,
>        .irq_compose_msi_msg    = its_irq_compose_msi_msg,
> @@ -1422,6 +1442,8 @@ static int its_msi_prepare(struct irq_domain *domain, struct device *dev,
>        if (!its_dev)
>                return -ENOMEM;
>
> +     its_dev->dev = dev;
> +
>        pr_debug("ITT %d entries, %d bits\n", nvec, ilog2(nvec));
>  out:
>        info->scratchpad[0].ptr = its_dev;
> diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c
> index be3c34e..6add8da 100644
> --- a/kernel/irq/chip.c
> +++ b/kernel/irq/chip.c
> @@ -585,6 +585,10 @@ void handle_fasteoi_irq(struct irq_desc *desc)
>                goto out;
>        }
>
> +#ifdef CONFIG_CAVIUM_ERRATUM_28168
> +     if (chip->irq_ack)
> +             chip->irq_ack(&desc->irq_data);
> +#endif
>        kstat_incr_irqs_this_cpu(desc);
>        if (desc->istate & IRQS_ONESHOT)
>                mask_irq(desc);
>

Overall, this workaround is not acceptable as it is. You need to find
ways to make it less invasive, and hopefully the above pointers will
help. Please keep the current distribution list posted once you update
this patch.

Thanks,

        M.
--
Jazz is not dead. It just smells funny...

[-- Attachment #1.2: Type: text/html, Size: 12702 bytes --]

[-- Attachment #2: Type: text/plain, Size: 0 bytes --]



^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [PATCH] arm64: SMMU-v2: Workaround for Cavium ThunderX erratum 28168
       [not found]     ` <fbc51a32-aaba-0ee6-c0bd-07a02fb2a6b4-5wv7dgnIgG8@public.gmane.org>
  2016-10-24 15:29       ` Akula, Geethasowjanya
@ 2016-10-24 20:54       ` Thomas Gleixner
  0 siblings, 0 replies; 104+ messages in thread
From: Thomas Gleixner @ 2016-10-24 20:54 UTC (permalink / raw)
  To: Marc Zyngier
  Cc: Geetha sowjanya, robin.murphy, will.deacon, mark.rutland,
	Prasun.Kapoor, iommu, Tirumalesh Chalamarla, linux-arm-kernel,
	Jason Cooper, linux-kernel

On Mon, 24 Oct 2016, Marc Zyngier wrote:
> On 22/10/16 05:54, Geetha sowjanya wrote:
> > diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c
> > index be3c34e..6add8da 100644
> > --- a/kernel/irq/chip.c
> > +++ b/kernel/irq/chip.c
> > @@ -585,6 +585,10 @@ void handle_fasteoi_irq(struct irq_desc *desc)
> >  		goto out;
> >  	}
> >  
> > +#ifdef CONFIG_CAVIUM_ERRATUM_28168
> > +	if (chip->irq_ack)
> > +		chip->irq_ack(&desc->irq_data);
> > +#endif
> >  	kstat_incr_irqs_this_cpu(desc);
> >  	if (desc->istate & IRQS_ONESHOT)
> >  		mask_irq(desc);
> > 
> 
> Overall, this workaround is not acceptable as it is.

Aside of being not acceptable this thing is completely broken. 

If that erratum is enabled then a interrupt chip which implements both EOI
and ACK callbacks will issue irq_ack when using the fasteoi handler. While
this might work on that cavium trainwreck, it will just make other
platforms pretty unhappy.

Platform specific hacks have no place in the core code at all. We have
enough options to handle oddball hardware, you just have to use them.

Thanks,

	tglx

^ permalink raw reply	[flat|nested] 104+ messages in thread

* Re: [PATCH] arm64: SMMU-v2: Workaround for Cavium ThunderX erratum 28168
@ 2016-10-24 20:54       ` Thomas Gleixner
  0 siblings, 0 replies; 104+ messages in thread
From: Thomas Gleixner @ 2016-10-24 20:54 UTC (permalink / raw)
  To: Marc Zyngier
  Cc: mark.rutland-5wv7dgnIgG8, Prasun.Kapoor-YGCgFSpz5w/QT0dZR+AlfA,
	Jason Cooper, Geetha sowjanya, will.deacon-5wv7dgnIgG8,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA, Tirumalesh Chalamarla,
	iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA,
	linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r

On Mon, 24 Oct 2016, Marc Zyngier wrote:
> On 22/10/16 05:54, Geetha sowjanya wrote:
> > diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c
> > index be3c34e..6add8da 100644
> > --- a/kernel/irq/chip.c
> > +++ b/kernel/irq/chip.c
> > @@ -585,6 +585,10 @@ void handle_fasteoi_irq(struct irq_desc *desc)
> >  		goto out;
> >  	}
> >  
> > +#ifdef CONFIG_CAVIUM_ERRATUM_28168
> > +	if (chip->irq_ack)
> > +		chip->irq_ack(&desc->irq_data);
> > +#endif
> >  	kstat_incr_irqs_this_cpu(desc);
> >  	if (desc->istate & IRQS_ONESHOT)
> >  		mask_irq(desc);
> > 
> 
> Overall, this workaround is not acceptable as it is.

Aside of being not acceptable this thing is completely broken. 

If that erratum is enabled then a interrupt chip which implements both EOI
and ACK callbacks will issue irq_ack when using the fasteoi handler. While
this might work on that cavium trainwreck, it will just make other
platforms pretty unhappy.

Platform specific hacks have no place in the core code at all. We have
enough options to handle oddball hardware, you just have to use them.

Thanks,

	tglx

^ permalink raw reply	[flat|nested] 104+ messages in thread

* [PATCH] arm64: SMMU-v2: Workaround for Cavium ThunderX erratum 28168
@ 2016-10-24 20:54       ` Thomas Gleixner
  0 siblings, 0 replies; 104+ messages in thread
From: Thomas Gleixner @ 2016-10-24 20:54 UTC (permalink / raw)
  To: linux-arm-kernel

On Mon, 24 Oct 2016, Marc Zyngier wrote:
> On 22/10/16 05:54, Geetha sowjanya wrote:
> > diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c
> > index be3c34e..6add8da 100644
> > --- a/kernel/irq/chip.c
> > +++ b/kernel/irq/chip.c
> > @@ -585,6 +585,10 @@ void handle_fasteoi_irq(struct irq_desc *desc)
> >  		goto out;
> >  	}
> >  
> > +#ifdef CONFIG_CAVIUM_ERRATUM_28168
> > +	if (chip->irq_ack)
> > +		chip->irq_ack(&desc->irq_data);
> > +#endif
> >  	kstat_incr_irqs_this_cpu(desc);
> >  	if (desc->istate & IRQS_ONESHOT)
> >  		mask_irq(desc);
> > 
> 
> Overall, this workaround is not acceptable as it is.

Aside of being not acceptable this thing is completely broken. 

If that erratum is enabled then a interrupt chip which implements both EOI
and ACK callbacks will issue irq_ack when using the fasteoi handler. While
this might work on that cavium trainwreck, it will just make other
platforms pretty unhappy.

Platform specific hacks have no place in the core code at all. We have
enough options to handle oddball hardware, you just have to use them.

Thanks,

	tglx

^ permalink raw reply	[flat|nested] 104+ messages in thread

end of thread, other threads:[~2016-10-24 20:57 UTC | newest]

Thread overview: 104+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-03-14 20:05 [Qemu-devel] 5 euros offerts sur votre première commande Claire de Libeedo
2007-05-16  0:21 ` [PATCH 1/1] [TIPC]: Fixed erroneous introduction of for_each_netdev Jon Paul Maloy
2007-05-16  0:25   ` David Miller
2007-05-23 22:12   ` David Miller
2007-05-18  0:33 ` [PATCH 1/3] [TIPC]: Improved support for Ethernet traffic filtering Jon Paul Maloy
2007-05-18  0:33 ` [PATCH 2/3] [TIPC]: Use standard socket "not implemented" routines Jon Paul Maloy
2007-05-18  0:33 ` [PATCH 3/3] [TIPC]: Optimize stream send routine to avoid fragmentation Jon Paul Maloy
2009-03-07 22:10 ` [PATCH 1/2] Propagata hci_register_sysfs() error Erik Andrén
2009-03-07 22:10   ` [PATCH 2/2] Defer btaddconn and btdelconn workqueues until a device has actually connected Erik Andrén
2009-03-09 19:55 ` Checkpatch fixes against bluetooth-testing Erik Andrén
2009-03-09 19:55   ` [PATCH 1/3] Checkpatch.pl: Fixup hci_conn.c Erik Andrén
2009-03-09 19:55     ` [PATCH 2/3] Checkpatch.pl: Fixup hci_core.c Erik Andrén
2009-03-09 19:55       ` [PATCH 3/3] Checkpatch.pl: Fixup hci_event.c Erik Andrén
2009-03-14 21:39 ` [PATCH 00/09][Staging] Checkpatch.pl fixes for the agnx driver Erik Andrén
2009-03-14 21:39   ` [PATCH 01/09] Checkpatch.pl: Fixup agnx.h Erik Andrén
2009-03-14 21:39     ` [PATCH 02/09] Checkpatch.pl: Fixup debug.h Erik Andrén
2009-03-14 21:39       ` [PATCH 03/09] Checkpatch.pl: Fixup pci.c Erik Andrén
2009-03-14 21:39         ` [PATCH 04/09] Checkpatch.pl: Fixup phy.c Erik Andrén
2009-03-14 21:39           ` [PATCH 05/09] Checkpatch.pl: Fixup rf.c Erik Andrén
2009-03-14 21:39             ` [PATCH 06/09] Checkpatch.pl: Fixup sta.c Erik Andrén
2009-03-14 21:39               ` [PATCH 07/09] Checkpatch.pl: Fixup sta.h Erik Andrén
2009-03-14 21:39                 ` [PATCH 08/09] Checkpatch.pl: Fixup table.c Erik Andrén
2009-03-14 21:39                   ` [PATCH 09/09] Checkpatch.pl: Fixup xmit.c Erik Andrén
2009-03-19 20:47 ` [Staging] Checkpatch fixes for altpciechdma Erik Andrén
2009-03-19 20:47   ` [PATCH 1/1] Checkpatch.pl: Fixup altpciechdma.c Erik Andrén
2009-03-19 20:57 ` [Staging] Fixup asus_oled Erik Andrén
2009-03-19 20:57   ` [PATCH 1/1] Fixup asus_oled.c Erik Andrén
2009-03-19 21:05     ` Erik Andrén
2012-04-18 16:51 ` [PATCH 2/2] staging:android:fix line over 80 characters issue in binders.c this patch fixes line over 80 characters warning that was found using checkpatch.pl tool Signed-off-by:Anirudh Bhat <abhat38@gmail.com> anirudh bhat
2012-04-18 23:50   ` Greg KH
2012-04-19  8:22 ` David Howells
2012-04-25  1:11   ` Calvin Walton
2012-05-16 22:13 ` [PATCH v4 0/5] support for rtl2832 Thomas Mair
2012-05-16 22:13   ` [PATCH v4 1/5] rtl2832 ver. 0.4: removed signal statistics Thomas Mair
2012-05-17  3:36     ` poma
2012-05-17  3:40       ` poma
2012-05-17  8:04         ` Thomas Mair
2012-05-17 14:19     ` Antti Palosaari
2012-05-17 20:27       ` poma
2012-05-17 20:41         ` Antti Palosaari
2012-05-17 20:45           ` Thomas Mair
2012-05-17 20:49             ` Antti Palosaari
2012-05-17 21:03               ` poma
2012-05-17 21:08             ` poma
2012-05-17 21:19               ` Thomas Mair
2012-05-17 21:30                 ` poma
2012-05-18  0:55       ` poma
     [not found]         ` <CAKZ=SG_mvvFae9ZE2H3ci_3HosLmQ1kihyGx6QCdyQGgQro52Q@mail.gmail.com>
2012-05-18  9:15           ` poma
2012-05-18 10:38             ` poma
2012-05-18 12:38               ` Antti Palosaari
2012-05-18 13:26                 ` poma
2012-05-18 17:46                   ` Thomas Mair
2012-05-18 17:51                     ` Antti Palosaari
2012-05-16 22:13   ` [PATCH v4 2/5] rtl28xxu: support for the rtl2832 demod driver Thomas Mair
2012-05-17 14:41     ` Antti Palosaari
2012-05-16 22:13   ` [PATCH v4 3/5] rtl28xxu: renamed rtl2831_rd/rtl2831_wr to rtl28xx_rd/rtl28xx_wr Thomas Mair
2012-05-17 14:43     ` Antti Palosaari
2012-05-16 22:13   ` [PATCH v4 4/5] rtl28xxu: support G-Tek Electronics Group Lifeview LV5TDLX DVB-T Thomas Mair
2012-05-17 14:47     ` Antti Palosaari
2012-05-17 20:43       ` poma
2012-05-16 22:13   ` [PATCH v4 5/5] rtl28xxu: support Terratec Noxon DAB/DAB+ stick Thomas Mair
2012-05-17 14:50     ` Antti Palosaari
2012-05-17 14:53   ` [PATCH v4 0/5] support for rtl2832 Antti Palosaari
2012-05-18 18:47 ` [PATCH v5 " Thomas Mair
2012-05-18 18:47   ` [PATCH v5 1/5] rtl2832 ver. 0.5: support for RTL2832 demod Thomas Mair
2012-05-18 20:21     ` Antti Palosaari
2012-07-05 14:32     ` Mauro Carvalho Chehab
2012-07-05 14:35       ` Antti Palosaari
2012-07-05 15:54         ` Mauro Carvalho Chehab
2012-07-07 15:45           ` poma
2012-07-05 14:41       ` Antti Palosaari
2012-07-05 15:53         ` Mauro Carvalho Chehab
2012-05-18 18:47   ` [PATCH v5 2/5] rtl28xxu: support for the rtl2832 demod driver Thomas Mair
2012-05-18 20:28     ` Antti Palosaari
2012-05-18 18:47   ` [PATCH v5 3/5] rtl28xxu: renamed rtl2831_rd/rtl2831_wr to rtl28xx_rd/rtl28xx_wr Thomas Mair
2012-05-18 20:30     ` Antti Palosaari
2012-05-18 18:47   ` [PATCH v5 4/5] rtl28xxu: support Delock USB 2.0 DVB-T Thomas Mair
2012-05-18 20:31     ` Antti Palosaari
2012-05-18 18:47   ` [PATCH v5 5/5] rtl28xxu: support Terratec Noxon DAB/DAB+ stick Thomas Mair
2012-05-18 20:32     ` Antti Palosaari
2012-05-18 20:47   ` [PATCH v5 0/5] support for rtl2832 Antti Palosaari
2012-05-18 23:35     ` poma
2012-05-20  9:56     ` Thomas Mair
2012-05-20 10:14       ` Antti Palosaari
2012-05-18 23:39   ` poma
2015-08-24 11:39 ` [PATCH] IGMP: Inhibit reports for local multicast groups Philip Downey
2015-08-25 21:20   ` David Miller
2015-08-26  9:23     ` Philip Downey
2015-08-27 15:46 ` Philip Downey
2015-08-28 20:29   ` David Miller
2015-08-28 21:19   ` Cong Wang
2015-08-31 10:33     ` Philip Downey
2015-08-31 10:33       ` Philip Downey
2016-10-22  4:54 ` [PATCH] arm64: SMMU-v2: Workaround for Cavium ThunderX erratum 28168 Geetha sowjanya
2016-10-22  4:54   ` Geetha sowjanya
     [not found]   ` <1477112061-12868-1-git-send-email-gakula-M3mlKVOIwJVv6pq1l3V1OdBPR1lH4CV8@public.gmane.org>
2016-10-24 11:28     ` Robin Murphy
2016-10-24 11:28       ` Robin Murphy
2016-10-24 13:44   ` Marc Zyngier
2016-10-24 13:44     ` Marc Zyngier
2016-10-24 13:44     ` Marc Zyngier
     [not found]     ` <fbc51a32-aaba-0ee6-c0bd-07a02fb2a6b4-5wv7dgnIgG8@public.gmane.org>
2016-10-24 15:29       ` Akula, Geethasowjanya
2016-10-24 20:54     ` Thomas Gleixner
2016-10-24 20:54       ` Thomas Gleixner
2016-10-24 20:54       ` Thomas Gleixner

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.