Merge "dvbsky_m88rs6000: Make i2c transactions in tuner_read/writereg() atomic"
diff --git a/drivers/media/dvb/frontends/dvbsky_m88rs6000.c b/drivers/media/dvb/frontends/dvbsky_m88rs6000.c
index 377d53e..13b17b1 100644
--- a/drivers/media/dvb/frontends/dvbsky_m88rs6000.c
+++ b/drivers/media/dvb/frontends/dvbsky_m88rs6000.c
@@ -28,7 +28,7 @@
} while (0)
/*demod register operations.*/
-static int m88rs6000_writereg(struct m88rs6000_state *state, int reg, int data)
+static int __m88rs6000_writereg(struct m88rs6000_state *state, int reg, int data)
{
u8 buf[] = { reg, data };
struct i2c_msg msg = { .addr = state->config->demod_address,
@@ -39,7 +39,7 @@
printk("m88rs6000: %s: write reg 0x%02x, value 0x%02x\n",
__func__, reg, data);
- ret = i2c_transfer(state->i2c, &msg, 1);
+ ret = __i2c_transfer(state->i2c, &msg, 1);
if (ret != 1) {
printk(KERN_ERR "%s: writereg error(err == %i, reg == 0x%02x,"
" value == 0x%02x)\n", __func__, ret, reg, data);
@@ -48,7 +48,16 @@
return 0;
}
-static int m88rs6000_readreg(struct m88rs6000_state *state, u8 reg)
+static int m88rs6000_writereg(struct m88rs6000_state *state, int reg, int data)
+{
+ int ret;
+ i2c_lock_adapter(state->i2c);
+ ret = __m88rs6000_writereg(state, reg, data);
+ i2c_unlock_adapter(state->i2c);
+ return ret;
+}
+
+static int __m88rs6000_readreg(struct m88rs6000_state *state, u8 reg)
{
int ret;
u8 b0[] = { reg };
@@ -59,7 +68,7 @@
{ .addr = state->config->demod_address, .flags = I2C_M_RD,
.buf = b1, .len = 1 }
};
- ret = i2c_transfer(state->i2c, msg, 2);
+ ret = __i2c_transfer(state->i2c, msg, 2);
if (ret != 2) {
printk(KERN_ERR "%s: reg=0x%x (error=%d)\n",
@@ -74,6 +83,15 @@
return b1[0];
}
+static int m88rs6000_readreg(struct m88rs6000_state *state, u8 reg)
+{
+ int ret;
+ i2c_lock_adapter(state->i2c);
+ ret = __m88rs6000_readreg(state, reg);
+ i2c_unlock_adapter(state->i2c);
+ return ret;
+}
+
/*tuner register operations.*/
static int m88rs6000_tuner_writereg(struct m88rs6000_state *state, int reg, int data)
{
@@ -82,9 +100,11 @@
.flags = 0, .buf = buf, .len = 2 };
int ret;
- m88rs6000_writereg(state, 0x03, 0x11);
- ret = i2c_transfer(state->i2c, &msg, 1);
-
+ i2c_lock_adapter(state->i2c);
+ __m88rs6000_writereg(state, 0x03, 0x11);
+ ret = __i2c_transfer(state->i2c, &msg, 1);
+ i2c_unlock_adapter(state->i2c);
+
if (ret != 1) {
printk("%s: writereg error(err == %i, reg == 0x%02x,"
" value == 0x%02x)\n", __func__, ret, reg, data);
@@ -106,8 +126,10 @@
.buf = b1, .len = 1 }
};
- m88rs6000_writereg(state, 0x03, (0x11 + state->config->tuner_readstops));
- ret = i2c_transfer(state->i2c, msg, 2);
+ i2c_lock_adapter(state->i2c);
+ __m88rs6000_writereg(state, 0x03, (0x11 + state->config->tuner_readstops));
+ ret = __i2c_transfer(state->i2c, msg, 2);
+ i2c_unlock_adapter(state->i2c);
if (ret != 2) {
printk(KERN_ERR "%s: reg=0x%x(error=%d)\n", __func__, reg, ret);