aboutsummaryrefslogtreecommitdiff
path: root/drivers/media/dvb/mantis/mantis_i2c.c
diff options
context:
space:
mode:
authorManu Abraham <abraham.manu@gmail.com>2009-12-04 05:41:11 -0300
committerMauro Carvalho Chehab <mchehab@redhat.com>2010-01-17 11:55:42 -0200
commitb3b961448f702339444036f94252ff2ba7a99feb (patch)
treef31007bb892091072fa97f43f5666105b1ea8f33 /drivers/media/dvb/mantis/mantis_i2c.c
parentadd206368462434ba97e8fe4de98e5d47ffdb0a0 (diff)
V4L/DVB (13795): [Mantis/Hopper] Code overhaul, add Hopper devices into the PCI ID list
Signed-off-by: Manu Abraham <manu@linuxtv.org> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/dvb/mantis/mantis_i2c.c')
-rw-r--r--drivers/media/dvb/mantis/mantis_i2c.c75
1 files changed, 42 insertions, 33 deletions
diff --git a/drivers/media/dvb/mantis/mantis_i2c.c b/drivers/media/dvb/mantis/mantis_i2c.c
index 45d9e6bd962..ba55f0a9a10 100644
--- a/drivers/media/dvb/mantis/mantis_i2c.c
+++ b/drivers/media/dvb/mantis/mantis_i2c.c
@@ -18,15 +18,20 @@
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
-#include <linux/module.h>
-#include <linux/moduleparam.h>
-#include <linux/init.h>
-#include <linux/delay.h>
#include <asm/io.h>
#include <linux/ioport.h>
-#include <asm/pgtable.h>
-#include <asm/page.h>
+#include <linux/pci.h>
+#include <linux/i2c.h>
+
+#include "dmxdev.h"
+#include "dvbdev.h"
+#include "dvb_demux.h"
+#include "dvb_frontend.h"
+#include "dvb_net.h"
+
#include "mantis_common.h"
+#include "mantis_reg.h"
+#include "mantis_i2c.h"
#define I2C_HW_B_MANTIS 0x1c
@@ -35,20 +40,21 @@ static int mantis_ack_wait(struct mantis_pci *mantis)
int rc = 0;
u32 timeout = 0;
- if (wait_event_interruptible_timeout(mantis->i2c_wq,
- mantis->mantis_int_stat & MANTIS_INT_I2CDONE,
- msecs_to_jiffies(50)) == -ERESTARTSYS) {
+ if (wait_event_timeout(mantis->i2c_wq,
+ mantis->mantis_int_stat & MANTIS_INT_I2CDONE,
+ msecs_to_jiffies(50)) == -ERESTARTSYS) {
- dprintk(verbose, MANTIS_DEBUG, 1, "Master !I2CDONE");
+ dprintk(MANTIS_DEBUG, 1, "Master !I2CDONE");
rc = -EREMOTEIO;
}
+
while (!(mantis->mantis_int_stat & MANTIS_INT_I2CRACK)) {
- dprintk(verbose, MANTIS_DEBUG, 1, "Waiting for Slave RACK");
+ dprintk(MANTIS_DEBUG, 1, "Waiting for Slave RACK");
mantis->mantis_int_stat = mmread(MANTIS_INT_STAT);
msleep(5);
timeout++;
if (timeout > 500) {
- dprintk(verbose, MANTIS_ERROR, 1, "Slave RACK Fail !");
+ dprintk(MANTIS_ERROR, 1, "Slave RACK Fail !");
rc = -EREMOTEIO;
break;
}
@@ -62,7 +68,7 @@ static int mantis_i2c_read(struct mantis_pci *mantis, const struct i2c_msg *msg)
{
u32 rxd, i;
- dprintk(verbose, MANTIS_INFO, 0, " %s: Address=[0x%02x] <R>[ ",
+ dprintk(MANTIS_INFO, 0, " %s: Address=[0x%02x] <R>[ ",
__func__, msg->addr);
for (i = 0; i < msg->len; i++) {
@@ -77,14 +83,14 @@ static int mantis_i2c_read(struct mantis_pci *mantis, const struct i2c_msg *msg)
mmwrite(MANTIS_INT_I2CDONE, MANTIS_INT_STAT);
mmwrite(rxd, MANTIS_I2CDATA_CTL);
if (mantis_ack_wait(mantis) != 0) {
- dprintk(verbose, MANTIS_DEBUG, 1, "ACK failed<R>");
+ dprintk(MANTIS_DEBUG, 1, "ACK failed<R>");
return -EREMOTEIO;
}
rxd = mmread(MANTIS_I2CDATA_CTL);
msg->buf[i] = (u8)((rxd >> 8) & 0xFF);
- dprintk(verbose, MANTIS_INFO, 0, "%02x ", msg->buf[i]);
+ dprintk(MANTIS_INFO, 0, "%02x ", msg->buf[i]);
}
- dprintk(verbose, MANTIS_INFO, 0, "]\n");
+ dprintk(MANTIS_INFO, 0, "]\n");
return 0;
}
@@ -94,11 +100,11 @@ static int mantis_i2c_write(struct mantis_pci *mantis, const struct i2c_msg *msg
int i;
u32 txd = 0;
- dprintk(verbose, MANTIS_INFO, 0, " %s: Address=[0x%02x] <W>[ ",
+ dprintk(MANTIS_INFO, 0, " %s: Address=[0x%02x] <W>[ ",
__func__, msg->addr);
for (i = 0; i < msg->len; i++) {
- dprintk(verbose, MANTIS_INFO, 0, "%02x ", msg->buf[i]);
+ dprintk(MANTIS_INFO, 0, "%02x ", msg->buf[i]);
txd = (msg->addr << 25) | (msg->buf[i] << 8)
| MANTIS_I2C_RATE_3
| MANTIS_I2C_STOP
@@ -110,11 +116,11 @@ static int mantis_i2c_write(struct mantis_pci *mantis, const struct i2c_msg *msg
mmwrite(MANTIS_INT_I2CDONE, MANTIS_INT_STAT);
mmwrite(txd, MANTIS_I2CDATA_CTL);
if (mantis_ack_wait(mantis) != 0) {
- dprintk(verbose, MANTIS_DEBUG, 1, "ACK failed<W>");
+ dprintk(MANTIS_DEBUG, 1, "ACK failed<W>");
return -EREMOTEIO;
}
}
- dprintk(verbose, MANTIS_INFO, 0, "]\n");
+ dprintk(MANTIS_INFO, 0, "]\n");
return 0;
}
@@ -154,43 +160,46 @@ static struct i2c_algorithm mantis_algo = {
.functionality = mantis_i2c_func,
};
-static struct i2c_adapter mantis_i2c_adapter = {
- .owner = THIS_MODULE,
- .name = "Mantis I2C",
- .id = I2C_HW_B_MANTIS,
- .class = I2C_CLASS_TV_DIGITAL,
- .algo = &mantis_algo,
-};
-
int __devinit mantis_i2c_init(struct mantis_pci *mantis)
{
u32 intstat, intmask;
struct i2c_adapter *i2c_adapter = &mantis->adapter;
struct pci_dev *pdev = mantis->pdev;
+ init_waitqueue_head(&mantis->i2c_wq);
mutex_init(&mantis->i2c_lock);
- memcpy(i2c_adapter, &mantis_i2c_adapter, sizeof (mantis_i2c_adapter));
+ strncpy(i2c_adapter->name, "Mantis I2C", sizeof (i2c_adapter->name));
i2c_set_adapdata(i2c_adapter, mantis);
- i2c_adapter->dev.parent = &pdev->dev;
+ i2c_adapter->owner = THIS_MODULE;
+ i2c_adapter->class = I2C_CLASS_TV_DIGITAL;
+ i2c_adapter->algo = &mantis_algo;
+ i2c_adapter->algo_data = NULL;
+ i2c_adapter->id = I2C_HW_B_MANTIS;
+ i2c_adapter->timeout = 500;
+ i2c_adapter->retries = 3;
+ i2c_adapter->dev.parent = &pdev->dev;
+
mantis->i2c_rc = i2c_add_adapter(i2c_adapter);
if (mantis->i2c_rc < 0)
return mantis->i2c_rc;
- dprintk(verbose, MANTIS_DEBUG, 1, "Initializing I2C ..");
+ dprintk(MANTIS_DEBUG, 1, "Initializing I2C ..");
intstat = mmread(MANTIS_INT_STAT);
intmask = mmread(MANTIS_INT_MASK);
mmwrite(intstat, MANTIS_INT_STAT);
mmwrite(intmask | MANTIS_INT_I2CDONE, MANTIS_INT_MASK);
- dprintk(verbose, MANTIS_DEBUG, 1, "[0x%08x/%08x]", intstat, intmask);
+ dprintk(MANTIS_DEBUG, 1, "Status=<%02x> Mask=<%02x>", intstat, intmask);
return 0;
}
+EXPORT_SYMBOL_GPL(mantis_i2c_init);
int __devexit mantis_i2c_exit(struct mantis_pci *mantis)
{
- dprintk(verbose, MANTIS_DEBUG, 1, "Removing I2C adapter");
+ dprintk(MANTIS_DEBUG, 1, "Removing I2C adapter");
return i2c_del_adapter(&mantis->adapter);
}
+EXPORT_SYMBOL_GPL(mantis_i2c_exit);