aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPeter Rosin <peda@axentia.se>2016-05-04 16:15:33 -0400
committerWolfram Sang <wsa@the-dreams.de>2016-05-04 16:40:02 -0400
commit1cf79db28ef53aeaa66a825e8f788d19fdd8648f (patch)
tree4305291ca3e397db16543db6ae61f94f976ab603
parente6d7ffcdf15f40fc1cff7a3c2fd2720ce3d53e49 (diff)
[media] rtl2832: change the i2c gate to be mux-locked
The root i2c adapter lock is then no longer held by the i2c mux during accesses behind the i2c gate, and such accesses need to take that lock just like any other ordinary i2c accesses do. So, declare the i2c gate mux-locked, and zap the regmap overrides that makes the i2c accesses unlocked and use plain old regmap accesses. This also removes the need for the regmap wrappers used by rtl2832_sdr, so deconvolute the code further and provide the regmap handle directly instead of the wrapper functions. Tested-by: Antti Palosaari <crope@iki.fi> Signed-off-by: Peter Rosin <peda@axentia.se> Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
-rw-r--r--Documentation/i2c/i2c-topology2
-rw-r--r--drivers/media/dvb-frontends/rtl2832.c190
-rw-r--r--drivers/media/dvb-frontends/rtl2832.h4
-rw-r--r--drivers/media/dvb-frontends/rtl2832_sdr.c13
-rw-r--r--drivers/media/dvb-frontends/rtl2832_sdr.h5
-rw-r--r--drivers/media/usb/dvb-usb-v2/rtl28xxu.c5
6 files changed, 37 insertions, 182 deletions
diff --git a/Documentation/i2c/i2c-topology b/Documentation/i2c/i2c-topology
index 5e40802f0be2..e0aefeece551 100644
--- a/Documentation/i2c/i2c-topology
+++ b/Documentation/i2c/i2c-topology
@@ -55,7 +55,7 @@ imu/inv_mpu6050/ Mux-locked
55In drivers/media/ 55In drivers/media/
56dvb-frontends/m88ds3103 Parent-locked 56dvb-frontends/m88ds3103 Parent-locked
57dvb-frontends/rtl2830 Parent-locked 57dvb-frontends/rtl2830 Parent-locked
58dvb-frontends/rtl2832 Parent-locked 58dvb-frontends/rtl2832 Mux-locked
59dvb-frontends/si2168 Mux-locked 59dvb-frontends/si2168 Mux-locked
60usb/cx231xx/ Parent-locked 60usb/cx231xx/ Parent-locked
61 61
diff --git a/drivers/media/dvb-frontends/rtl2832.c b/drivers/media/dvb-frontends/rtl2832.c
index 1b23788797b5..957523f07f61 100644
--- a/drivers/media/dvb-frontends/rtl2832.c
+++ b/drivers/media/dvb-frontends/rtl2832.c
@@ -153,43 +153,6 @@ static const struct rtl2832_reg_entry registers[] = {
153 [DVBT_REG_4MSEL] = {0x013, 0, 0}, 153 [DVBT_REG_4MSEL] = {0x013, 0, 0},
154}; 154};
155 155
156/* Our regmap is bypassing I2C adapter lock, thus we do it! */
157static int rtl2832_bulk_write(struct i2c_client *client, unsigned int reg,
158 const void *val, size_t val_count)
159{
160 struct rtl2832_dev *dev = i2c_get_clientdata(client);
161 int ret;
162
163 i2c_lock_adapter(client->adapter);
164 ret = regmap_bulk_write(dev->regmap, reg, val, val_count);
165 i2c_unlock_adapter(client->adapter);
166 return ret;
167}
168
169static int rtl2832_update_bits(struct i2c_client *client, unsigned int reg,
170 unsigned int mask, unsigned int val)
171{
172 struct rtl2832_dev *dev = i2c_get_clientdata(client);
173 int ret;
174
175 i2c_lock_adapter(client->adapter);
176 ret = regmap_update_bits(dev->regmap, reg, mask, val);
177 i2c_unlock_adapter(client->adapter);
178 return ret;
179}
180
181static int rtl2832_bulk_read(struct i2c_client *client, unsigned int reg,
182 void *val, size_t val_count)
183{
184 struct rtl2832_dev *dev = i2c_get_clientdata(client);
185 int ret;
186
187 i2c_lock_adapter(client->adapter);
188 ret = regmap_bulk_read(dev->regmap, reg, val, val_count);
189 i2c_unlock_adapter(client->adapter);
190 return ret;
191}
192
193static int rtl2832_rd_demod_reg(struct rtl2832_dev *dev, int reg, u32 *val) 156static int rtl2832_rd_demod_reg(struct rtl2832_dev *dev, int reg, u32 *val)
194{ 157{
195 struct i2c_client *client = dev->client; 158 struct i2c_client *client = dev->client;
@@ -204,7 +167,7 @@ static int rtl2832_rd_demod_reg(struct rtl2832_dev *dev, int reg, u32 *val)
204 len = (msb >> 3) + 1; 167 len = (msb >> 3) + 1;
205 mask = REG_MASK(msb - lsb); 168 mask = REG_MASK(msb - lsb);
206 169
207 ret = rtl2832_bulk_read(client, reg_start_addr, reading, len); 170 ret = regmap_bulk_read(dev->regmap, reg_start_addr, reading, len);
208 if (ret) 171 if (ret)
209 goto err; 172 goto err;
210 173
@@ -234,7 +197,7 @@ static int rtl2832_wr_demod_reg(struct rtl2832_dev *dev, int reg, u32 val)
234 len = (msb >> 3) + 1; 197 len = (msb >> 3) + 1;
235 mask = REG_MASK(msb - lsb); 198 mask = REG_MASK(msb - lsb);
236 199
237 ret = rtl2832_bulk_read(client, reg_start_addr, reading, len); 200 ret = regmap_bulk_read(dev->regmap, reg_start_addr, reading, len);
238 if (ret) 201 if (ret)
239 goto err; 202 goto err;
240 203
@@ -248,7 +211,7 @@ static int rtl2832_wr_demod_reg(struct rtl2832_dev *dev, int reg, u32 val)
248 for (i = 0; i < len; i++) 211 for (i = 0; i < len; i++)
249 writing[i] = (writing_tmp >> ((len - 1 - i) * 8)) & 0xff; 212 writing[i] = (writing_tmp >> ((len - 1 - i) * 8)) & 0xff;
250 213
251 ret = rtl2832_bulk_write(client, reg_start_addr, writing, len); 214 ret = regmap_bulk_write(dev->regmap, reg_start_addr, writing, len);
252 if (ret) 215 if (ret)
253 goto err; 216 goto err;
254 217
@@ -525,7 +488,8 @@ static int rtl2832_set_frontend(struct dvb_frontend *fe)
525 } 488 }
526 489
527 for (j = 0; j < sizeof(bw_params[0]); j++) { 490 for (j = 0; j < sizeof(bw_params[0]); j++) {
528 ret = rtl2832_bulk_write(client, 0x11c + j, &bw_params[i][j], 1); 491 ret = regmap_bulk_write(dev->regmap,
492 0x11c + j, &bw_params[i][j], 1);
529 if (ret) 493 if (ret)
530 goto err; 494 goto err;
531 } 495 }
@@ -581,11 +545,11 @@ static int rtl2832_get_frontend(struct dvb_frontend *fe,
581 if (dev->sleeping) 545 if (dev->sleeping)
582 return 0; 546 return 0;
583 547
584 ret = rtl2832_bulk_read(client, 0x33c, buf, 2); 548 ret = regmap_bulk_read(dev->regmap, 0x33c, buf, 2);
585 if (ret) 549 if (ret)
586 goto err; 550 goto err;
587 551
588 ret = rtl2832_bulk_read(client, 0x351, &buf[2], 1); 552 ret = regmap_bulk_read(dev->regmap, 0x351, &buf[2], 1);
589 if (ret) 553 if (ret)
590 goto err; 554 goto err;
591 555
@@ -716,7 +680,7 @@ static int rtl2832_read_status(struct dvb_frontend *fe, enum fe_status *status)
716 /* signal strength */ 680 /* signal strength */
717 if (dev->fe_status & FE_HAS_SIGNAL) { 681 if (dev->fe_status & FE_HAS_SIGNAL) {
718 /* read digital AGC */ 682 /* read digital AGC */
719 ret = rtl2832_bulk_read(client, 0x305, &u8tmp, 1); 683 ret = regmap_bulk_read(dev->regmap, 0x305, &u8tmp, 1);
720 if (ret) 684 if (ret)
721 goto err; 685 goto err;
722 686
@@ -742,7 +706,7 @@ static int rtl2832_read_status(struct dvb_frontend *fe, enum fe_status *status)
742 {87659938, 87659938, 87885178, 88241743}, 706 {87659938, 87659938, 87885178, 88241743},
743 }; 707 };
744 708
745 ret = rtl2832_bulk_read(client, 0x33c, &u8tmp, 1); 709 ret = regmap_bulk_read(dev->regmap, 0x33c, &u8tmp, 1);
746 if (ret) 710 if (ret)
747 goto err; 711 goto err;
748 712
@@ -754,7 +718,7 @@ static int rtl2832_read_status(struct dvb_frontend *fe, enum fe_status *status)
754 if (hierarchy > HIERARCHY_NUM - 1) 718 if (hierarchy > HIERARCHY_NUM - 1)
755 goto err; 719 goto err;
756 720
757 ret = rtl2832_bulk_read(client, 0x40c, buf, 2); 721 ret = regmap_bulk_read(dev->regmap, 0x40c, buf, 2);
758 if (ret) 722 if (ret)
759 goto err; 723 goto err;
760 724
@@ -775,7 +739,7 @@ static int rtl2832_read_status(struct dvb_frontend *fe, enum fe_status *status)
775 739
776 /* BER */ 740 /* BER */
777 if (dev->fe_status & FE_HAS_LOCK) { 741 if (dev->fe_status & FE_HAS_LOCK) {
778 ret = rtl2832_bulk_read(client, 0x34e, buf, 2); 742 ret = regmap_bulk_read(dev->regmap, 0x34e, buf, 2);
779 if (ret) 743 if (ret)
780 goto err; 744 goto err;
781 745
@@ -825,8 +789,6 @@ static int rtl2832_read_ber(struct dvb_frontend *fe, u32 *ber)
825 789
826/* 790/*
827 * I2C gate/mux/repeater logic 791 * I2C gate/mux/repeater logic
828 * We must use unlocked __i2c_transfer() here (through regmap) because of I2C
829 * adapter lock is already taken by tuner driver.
830 * There is delay mechanism to avoid unneeded I2C gate open / close. Gate close 792 * There is delay mechanism to avoid unneeded I2C gate open / close. Gate close
831 * is delayed here a little bit in order to see if there is sequence of I2C 793 * is delayed here a little bit in order to see if there is sequence of I2C
832 * messages sent to same I2C bus. 794 * messages sent to same I2C bus.
@@ -838,7 +800,7 @@ static void rtl2832_i2c_gate_work(struct work_struct *work)
838 int ret; 800 int ret;
839 801
840 /* close gate */ 802 /* close gate */
841 ret = rtl2832_update_bits(dev->client, 0x101, 0x08, 0x00); 803 ret = regmap_update_bits(dev->regmap, 0x101, 0x08, 0x00);
842 if (ret) 804 if (ret)
843 goto err; 805 goto err;
844 806
@@ -856,10 +818,7 @@ static int rtl2832_select(struct i2c_mux_core *muxc, u32 chan_id)
856 /* terminate possible gate closing */ 818 /* terminate possible gate closing */
857 cancel_delayed_work(&dev->i2c_gate_work); 819 cancel_delayed_work(&dev->i2c_gate_work);
858 820
859 /* 821 /* open gate */
860 * I2C adapter lock is already taken and due to that we will use
861 * regmap_update_bits() which does not lock again I2C adapter.
862 */
863 ret = regmap_update_bits(dev->regmap, 0x101, 0x08, 0x08); 822 ret = regmap_update_bits(dev->regmap, 0x101, 0x08, 0x08);
864 if (ret) 823 if (ret)
865 goto err; 824 goto err;
@@ -932,94 +891,6 @@ static bool rtl2832_volatile_reg(struct device *dev, unsigned int reg)
932} 891}
933 892
934/* 893/*
935 * We implement own I2C access routines for regmap in order to get manual access
936 * to I2C adapter lock, which is needed for I2C mux adapter.
937 */
938static int rtl2832_regmap_read(void *context, const void *reg_buf,
939 size_t reg_size, void *val_buf, size_t val_size)
940{
941 struct i2c_client *client = context;
942 int ret;
943 struct i2c_msg msg[2] = {
944 {
945 .addr = client->addr,
946 .flags = 0,
947 .len = reg_size,
948 .buf = (u8 *)reg_buf,
949 }, {
950 .addr = client->addr,
951 .flags = I2C_M_RD,
952 .len = val_size,
953 .buf = val_buf,
954 }
955 };
956
957 ret = __i2c_transfer(client->adapter, msg, 2);
958 if (ret != 2) {
959 dev_warn(&client->dev, "i2c reg read failed %d reg %02x\n",
960 ret, *(u8 *)reg_buf);
961 if (ret >= 0)
962 ret = -EREMOTEIO;
963 return ret;
964 }
965 return 0;
966}
967
968static int rtl2832_regmap_write(void *context, const void *data, size_t count)
969{
970 struct i2c_client *client = context;
971 int ret;
972 struct i2c_msg msg[1] = {
973 {
974 .addr = client->addr,
975 .flags = 0,
976 .len = count,
977 .buf = (u8 *)data,
978 }
979 };
980
981 ret = __i2c_transfer(client->adapter, msg, 1);
982 if (ret != 1) {
983 dev_warn(&client->dev, "i2c reg write failed %d reg %02x\n",
984 ret, *(u8 *)data);
985 if (ret >= 0)
986 ret = -EREMOTEIO;
987 return ret;
988 }
989 return 0;
990}
991
992static int rtl2832_regmap_gather_write(void *context, const void *reg,
993 size_t reg_len, const void *val,
994 size_t val_len)
995{
996 struct i2c_client *client = context;
997 int ret;
998 u8 buf[256];
999 struct i2c_msg msg[1] = {
1000 {
1001 .addr = client->addr,
1002 .flags = 0,
1003 .len = 1 + val_len,
1004 .buf = buf,
1005 }
1006 };
1007
1008 buf[0] = *(u8 const *)reg;
1009 memcpy(&buf[1], val, val_len);
1010
1011 ret = __i2c_transfer(client->adapter, msg, 1);
1012 if (ret != 1) {
1013 dev_warn(&client->dev, "i2c reg write failed %d reg %02x\n",
1014 ret, *(u8 const *)reg);
1015 if (ret >= 0)
1016 ret = -EREMOTEIO;
1017 return ret;
1018 }
1019 return 0;
1020}
1021
1022/*
1023 * FIXME: Hack. Implement own regmap locking in order to silence lockdep 894 * FIXME: Hack. Implement own regmap locking in order to silence lockdep
1024 * recursive lock warning. That happens when regmap I2C client calls I2C mux 895 * recursive lock warning. That happens when regmap I2C client calls I2C mux
1025 * adapter, which leads demod I2C repeater enable via demod regmap. Operation 896 * adapter, which leads demod I2C repeater enable via demod regmap. Operation
@@ -1072,29 +943,29 @@ static int rtl2832_slave_ts_ctrl(struct i2c_client *client, bool enable)
1072 ret = rtl2832_wr_demod_reg(dev, DVBT_SOFT_RST, 0x0); 943 ret = rtl2832_wr_demod_reg(dev, DVBT_SOFT_RST, 0x0);
1073 if (ret) 944 if (ret)
1074 goto err; 945 goto err;
1075 ret = rtl2832_bulk_write(client, 0x10c, "\x5f\xff", 2); 946 ret = regmap_bulk_write(dev->regmap, 0x10c, "\x5f\xff", 2);
1076 if (ret) 947 if (ret)
1077 goto err; 948 goto err;
1078 ret = rtl2832_wr_demod_reg(dev, DVBT_PIP_ON, 0x1); 949 ret = rtl2832_wr_demod_reg(dev, DVBT_PIP_ON, 0x1);
1079 if (ret) 950 if (ret)
1080 goto err; 951 goto err;
1081 ret = rtl2832_bulk_write(client, 0x0bc, "\x18", 1); 952 ret = regmap_bulk_write(dev->regmap, 0x0bc, "\x18", 1);
1082 if (ret) 953 if (ret)
1083 goto err; 954 goto err;
1084 ret = rtl2832_bulk_write(client, 0x192, "\x7f\xf7\xff", 3); 955 ret = regmap_bulk_write(dev->regmap, 0x192, "\x7f\xf7\xff", 3);
1085 if (ret) 956 if (ret)
1086 goto err; 957 goto err;
1087 } else { 958 } else {
1088 ret = rtl2832_bulk_write(client, 0x192, "\x00\x0f\xff", 3); 959 ret = regmap_bulk_write(dev->regmap, 0x192, "\x00\x0f\xff", 3);
1089 if (ret) 960 if (ret)
1090 goto err; 961 goto err;
1091 ret = rtl2832_bulk_write(client, 0x0bc, "\x08", 1); 962 ret = regmap_bulk_write(dev->regmap, 0x0bc, "\x08", 1);
1092 if (ret) 963 if (ret)
1093 goto err; 964 goto err;
1094 ret = rtl2832_wr_demod_reg(dev, DVBT_PIP_ON, 0x0); 965 ret = rtl2832_wr_demod_reg(dev, DVBT_PIP_ON, 0x0);
1095 if (ret) 966 if (ret)
1096 goto err; 967 goto err;
1097 ret = rtl2832_bulk_write(client, 0x10c, "\x00\x00", 2); 968 ret = regmap_bulk_write(dev->regmap, 0x10c, "\x00\x00", 2);
1098 if (ret) 969 if (ret)
1099 goto err; 970 goto err;
1100 ret = rtl2832_wr_demod_reg(dev, DVBT_SOFT_RST, 0x1); 971 ret = rtl2832_wr_demod_reg(dev, DVBT_SOFT_RST, 0x1);
@@ -1123,7 +994,7 @@ static int rtl2832_pid_filter_ctrl(struct dvb_frontend *fe, int onoff)
1123 else 994 else
1124 u8tmp = 0x00; 995 u8tmp = 0x00;
1125 996
1126 ret = rtl2832_update_bits(client, 0x061, 0xc0, u8tmp); 997 ret = regmap_update_bits(dev->regmap, 0x061, 0xc0, u8tmp);
1127 if (ret) 998 if (ret)
1128 goto err; 999 goto err;
1129 1000
@@ -1158,14 +1029,14 @@ static int rtl2832_pid_filter(struct dvb_frontend *fe, u8 index, u16 pid,
1158 buf[1] = (dev->filters >> 8) & 0xff; 1029 buf[1] = (dev->filters >> 8) & 0xff;
1159 buf[2] = (dev->filters >> 16) & 0xff; 1030 buf[2] = (dev->filters >> 16) & 0xff;
1160 buf[3] = (dev->filters >> 24) & 0xff; 1031 buf[3] = (dev->filters >> 24) & 0xff;
1161 ret = rtl2832_bulk_write(client, 0x062, buf, 4); 1032 ret = regmap_bulk_write(dev->regmap, 0x062, buf, 4);
1162 if (ret) 1033 if (ret)
1163 goto err; 1034 goto err;
1164 1035
1165 /* add PID */ 1036 /* add PID */
1166 buf[0] = (pid >> 8) & 0xff; 1037 buf[0] = (pid >> 8) & 0xff;
1167 buf[1] = (pid >> 0) & 0xff; 1038 buf[1] = (pid >> 0) & 0xff;
1168 ret = rtl2832_bulk_write(client, 0x066 + 2 * index, buf, 2); 1039 ret = regmap_bulk_write(dev->regmap, 0x066 + 2 * index, buf, 2);
1169 if (ret) 1040 if (ret)
1170 goto err; 1041 goto err;
1171 1042
@@ -1183,12 +1054,6 @@ static int rtl2832_probe(struct i2c_client *client,
1183 struct rtl2832_dev *dev; 1054 struct rtl2832_dev *dev;
1184 int ret; 1055 int ret;
1185 u8 tmp; 1056 u8 tmp;
1186 static const struct regmap_bus regmap_bus = {
1187 .read = rtl2832_regmap_read,
1188 .write = rtl2832_regmap_write,
1189 .gather_write = rtl2832_regmap_gather_write,
1190 .val_format_endian_default = REGMAP_ENDIAN_NATIVE,
1191 };
1192 static const struct regmap_range_cfg regmap_range_cfg[] = { 1057 static const struct regmap_range_cfg regmap_range_cfg[] = {
1193 { 1058 {
1194 .selector_reg = 0x00, 1059 .selector_reg = 0x00,
@@ -1228,20 +1093,19 @@ static int rtl2832_probe(struct i2c_client *client,
1228 dev->regmap_config.ranges = regmap_range_cfg, 1093 dev->regmap_config.ranges = regmap_range_cfg,
1229 dev->regmap_config.num_ranges = ARRAY_SIZE(regmap_range_cfg), 1094 dev->regmap_config.num_ranges = ARRAY_SIZE(regmap_range_cfg),
1230 dev->regmap_config.cache_type = REGCACHE_NONE, 1095 dev->regmap_config.cache_type = REGCACHE_NONE,
1231 dev->regmap = regmap_init(&client->dev, &regmap_bus, client, 1096 dev->regmap = regmap_init_i2c(client, &dev->regmap_config);
1232 &dev->regmap_config);
1233 if (IS_ERR(dev->regmap)) { 1097 if (IS_ERR(dev->regmap)) {
1234 ret = PTR_ERR(dev->regmap); 1098 ret = PTR_ERR(dev->regmap);
1235 goto err_kfree; 1099 goto err_kfree;
1236 } 1100 }
1237 1101
1238 /* check if the demod is there */ 1102 /* check if the demod is there */
1239 ret = rtl2832_bulk_read(client, 0x000, &tmp, 1); 1103 ret = regmap_bulk_read(dev->regmap, 0x000, &tmp, 1);
1240 if (ret) 1104 if (ret)
1241 goto err_regmap_exit; 1105 goto err_regmap_exit;
1242 1106
1243 /* create muxed i2c adapter for demod tuner bus */ 1107 /* create muxed i2c adapter for demod tuner bus */
1244 dev->muxc = i2c_mux_alloc(i2c, &i2c->dev, 1, 0, 0, 1108 dev->muxc = i2c_mux_alloc(i2c, &i2c->dev, 1, 0, I2C_MUX_LOCKED,
1245 rtl2832_select, rtl2832_deselect); 1109 rtl2832_select, rtl2832_deselect);
1246 if (!dev->muxc) { 1110 if (!dev->muxc) {
1247 ret = -ENOMEM; 1111 ret = -ENOMEM;
@@ -1262,9 +1126,7 @@ static int rtl2832_probe(struct i2c_client *client,
1262 pdata->slave_ts_ctrl = rtl2832_slave_ts_ctrl; 1126 pdata->slave_ts_ctrl = rtl2832_slave_ts_ctrl;
1263 pdata->pid_filter = rtl2832_pid_filter; 1127 pdata->pid_filter = rtl2832_pid_filter;
1264 pdata->pid_filter_ctrl = rtl2832_pid_filter_ctrl; 1128 pdata->pid_filter_ctrl = rtl2832_pid_filter_ctrl;
1265 pdata->bulk_read = rtl2832_bulk_read; 1129 pdata->regmap = dev->regmap;
1266 pdata->bulk_write = rtl2832_bulk_write;
1267 pdata->update_bits = rtl2832_update_bits;
1268 1130
1269 dev_info(&client->dev, "Realtek RTL2832 successfully attached\n"); 1131 dev_info(&client->dev, "Realtek RTL2832 successfully attached\n");
1270 return 0; 1132 return 0;
diff --git a/drivers/media/dvb-frontends/rtl2832.h b/drivers/media/dvb-frontends/rtl2832.h
index 6390af64cf45..03c0de039fa9 100644
--- a/drivers/media/dvb-frontends/rtl2832.h
+++ b/drivers/media/dvb-frontends/rtl2832.h
@@ -57,9 +57,7 @@ struct rtl2832_platform_data {
57 int (*pid_filter)(struct dvb_frontend *, u8, u16, int); 57 int (*pid_filter)(struct dvb_frontend *, u8, u16, int);
58 int (*pid_filter_ctrl)(struct dvb_frontend *, int); 58 int (*pid_filter_ctrl)(struct dvb_frontend *, int);
59/* private: Register access for SDR module use only */ 59/* private: Register access for SDR module use only */
60 int (*bulk_read)(struct i2c_client *, unsigned int, void *, size_t); 60 struct regmap *regmap;
61 int (*bulk_write)(struct i2c_client *, unsigned int, const void *, size_t);
62 int (*update_bits)(struct i2c_client *, unsigned int, unsigned int, unsigned int);
63}; 61};
64 62
65#endif /* RTL2832_H */ 63#endif /* RTL2832_H */
diff --git a/drivers/media/dvb-frontends/rtl2832_sdr.c b/drivers/media/dvb-frontends/rtl2832_sdr.c
index b860f02a4e55..6a6b1debe277 100644
--- a/drivers/media/dvb-frontends/rtl2832_sdr.c
+++ b/drivers/media/dvb-frontends/rtl2832_sdr.c
@@ -35,6 +35,7 @@
35#include <linux/platform_device.h> 35#include <linux/platform_device.h>
36#include <linux/jiffies.h> 36#include <linux/jiffies.h>
37#include <linux/math64.h> 37#include <linux/math64.h>
38#include <linux/regmap.h>
38 39
39static bool rtl2832_sdr_emulated_fmt; 40static bool rtl2832_sdr_emulated_fmt;
40module_param_named(emulated_formats, rtl2832_sdr_emulated_fmt, bool, 0644); 41module_param_named(emulated_formats, rtl2832_sdr_emulated_fmt, bool, 0644);
@@ -169,9 +170,9 @@ static int rtl2832_sdr_wr_regs(struct rtl2832_sdr_dev *dev, u16 reg,
169{ 170{
170 struct platform_device *pdev = dev->pdev; 171 struct platform_device *pdev = dev->pdev;
171 struct rtl2832_sdr_platform_data *pdata = pdev->dev.platform_data; 172 struct rtl2832_sdr_platform_data *pdata = pdev->dev.platform_data;
172 struct i2c_client *client = pdata->i2c_client; 173 struct regmap *regmap = pdata->regmap;
173 174
174 return pdata->bulk_write(client, reg, val, len); 175 return regmap_bulk_write(regmap, reg, val, len);
175} 176}
176 177
177#if 0 178#if 0
@@ -181,9 +182,9 @@ static int rtl2832_sdr_rd_regs(struct rtl2832_sdr_dev *dev, u16 reg, u8 *val,
181{ 182{
182 struct platform_device *pdev = dev->pdev; 183 struct platform_device *pdev = dev->pdev;
183 struct rtl2832_sdr_platform_data *pdata = pdev->dev.platform_data; 184 struct rtl2832_sdr_platform_data *pdata = pdev->dev.platform_data;
184 struct i2c_client *client = pdata->i2c_client; 185 struct regmap *regmap = pdata->regmap;
185 186
186 return pdata->bulk_read(client, reg, val, len); 187 return regmap_bulk_read(regmap, reg, val, len);
187} 188}
188#endif 189#endif
189 190
@@ -199,9 +200,9 @@ static int rtl2832_sdr_wr_reg_mask(struct rtl2832_sdr_dev *dev, u16 reg,
199{ 200{
200 struct platform_device *pdev = dev->pdev; 201 struct platform_device *pdev = dev->pdev;
201 struct rtl2832_sdr_platform_data *pdata = pdev->dev.platform_data; 202 struct rtl2832_sdr_platform_data *pdata = pdev->dev.platform_data;
202 struct i2c_client *client = pdata->i2c_client; 203 struct regmap *regmap = pdata->regmap;
203 204
204 return pdata->update_bits(client, reg, mask, val); 205 return regmap_update_bits(regmap, reg, mask, val);
205} 206}
206 207
207/* Private functions */ 208/* Private functions */
diff --git a/drivers/media/dvb-frontends/rtl2832_sdr.h b/drivers/media/dvb-frontends/rtl2832_sdr.h
index 342ea84860df..d8fc7e7212e3 100644
--- a/drivers/media/dvb-frontends/rtl2832_sdr.h
+++ b/drivers/media/dvb-frontends/rtl2832_sdr.h
@@ -56,10 +56,7 @@ struct rtl2832_sdr_platform_data {
56#define RTL2832_SDR_TUNER_R828D 0x2b 56#define RTL2832_SDR_TUNER_R828D 0x2b
57 u8 tuner; 57 u8 tuner;
58 58
59 struct i2c_client *i2c_client; 59 struct regmap *regmap;
60 int (*bulk_read)(struct i2c_client *, unsigned int, void *, size_t);
61 int (*bulk_write)(struct i2c_client *, unsigned int, const void *, size_t);
62 int (*update_bits)(struct i2c_client *, unsigned int, unsigned int, unsigned int);
63 struct dvb_frontend *dvb_frontend; 60 struct dvb_frontend *dvb_frontend;
64 struct v4l2_subdev *v4l2_subdev; 61 struct v4l2_subdev *v4l2_subdev;
65 struct dvb_usb_device *dvb_usb_device; 62 struct dvb_usb_device *dvb_usb_device;
diff --git a/drivers/media/usb/dvb-usb-v2/rtl28xxu.c b/drivers/media/usb/dvb-usb-v2/rtl28xxu.c
index fa72642d41f3..eb7af8cb8aca 100644
--- a/drivers/media/usb/dvb-usb-v2/rtl28xxu.c
+++ b/drivers/media/usb/dvb-usb-v2/rtl28xxu.c
@@ -1333,10 +1333,7 @@ static int rtl2832u_tuner_attach(struct dvb_usb_adapter *adap)
1333 case TUNER_RTL2832_R828D: 1333 case TUNER_RTL2832_R828D:
1334 pdata.clk = dev->rtl2832_platform_data.clk; 1334 pdata.clk = dev->rtl2832_platform_data.clk;
1335 pdata.tuner = dev->tuner; 1335 pdata.tuner = dev->tuner;
1336 pdata.i2c_client = dev->i2c_client_demod; 1336 pdata.regmap = dev->rtl2832_platform_data.regmap;
1337 pdata.bulk_read = dev->rtl2832_platform_data.bulk_read;
1338 pdata.bulk_write = dev->rtl2832_platform_data.bulk_write;
1339 pdata.update_bits = dev->rtl2832_platform_data.update_bits;
1340 pdata.dvb_frontend = adap->fe[0]; 1337 pdata.dvb_frontend = adap->fe[0];
1341 pdata.dvb_usb_device = d; 1338 pdata.dvb_usb_device = d;
1342 pdata.v4l2_subdev = subdev; 1339 pdata.v4l2_subdev = subdev;