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);