Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[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>

authored by

Peter Rosin and committed by
Wolfram Sang
1cf79db2 e6d7ffcd

+37 -182
+1 -1
Documentation/i2c/i2c-topology
··· 55 55 In drivers/media/ 56 56 dvb-frontends/m88ds3103 Parent-locked 57 57 dvb-frontends/rtl2830 Parent-locked 58 - dvb-frontends/rtl2832 Parent-locked 58 + dvb-frontends/rtl2832 Mux-locked 59 59 dvb-frontends/si2168 Mux-locked 60 60 usb/cx231xx/ Parent-locked 61 61
+26 -164
drivers/media/dvb-frontends/rtl2832.c
··· 153 153 [DVBT_REG_4MSEL] = {0x013, 0, 0}, 154 154 }; 155 155 156 - /* Our regmap is bypassing I2C adapter lock, thus we do it! */ 157 - static 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 - 169 - static 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 - 181 - static 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 - 193 156 static int rtl2832_rd_demod_reg(struct rtl2832_dev *dev, int reg, u32 *val) 194 157 { 195 158 struct i2c_client *client = dev->client; ··· 167 204 len = (msb >> 3) + 1; 168 205 mask = REG_MASK(msb - lsb); 169 206 170 - ret = rtl2832_bulk_read(client, reg_start_addr, reading, len); 207 + ret = regmap_bulk_read(dev->regmap, reg_start_addr, reading, len); 171 208 if (ret) 172 209 goto err; 173 210 ··· 197 234 len = (msb >> 3) + 1; 198 235 mask = REG_MASK(msb - lsb); 199 236 200 - ret = rtl2832_bulk_read(client, reg_start_addr, reading, len); 237 + ret = regmap_bulk_read(dev->regmap, reg_start_addr, reading, len); 201 238 if (ret) 202 239 goto err; 203 240 ··· 211 248 for (i = 0; i < len; i++) 212 249 writing[i] = (writing_tmp >> ((len - 1 - i) * 8)) & 0xff; 213 250 214 - ret = rtl2832_bulk_write(client, reg_start_addr, writing, len); 251 + ret = regmap_bulk_write(dev->regmap, reg_start_addr, writing, len); 215 252 if (ret) 216 253 goto err; 217 254 ··· 488 525 } 489 526 490 527 for (j = 0; j < sizeof(bw_params[0]); j++) { 491 - ret = rtl2832_bulk_write(client, 0x11c + j, &bw_params[i][j], 1); 528 + ret = regmap_bulk_write(dev->regmap, 529 + 0x11c + j, &bw_params[i][j], 1); 492 530 if (ret) 493 531 goto err; 494 532 } ··· 545 581 if (dev->sleeping) 546 582 return 0; 547 583 548 - ret = rtl2832_bulk_read(client, 0x33c, buf, 2); 584 + ret = regmap_bulk_read(dev->regmap, 0x33c, buf, 2); 549 585 if (ret) 550 586 goto err; 551 587 552 - ret = rtl2832_bulk_read(client, 0x351, &buf[2], 1); 588 + ret = regmap_bulk_read(dev->regmap, 0x351, &buf[2], 1); 553 589 if (ret) 554 590 goto err; 555 591 ··· 680 716 /* signal strength */ 681 717 if (dev->fe_status & FE_HAS_SIGNAL) { 682 718 /* read digital AGC */ 683 - ret = rtl2832_bulk_read(client, 0x305, &u8tmp, 1); 719 + ret = regmap_bulk_read(dev->regmap, 0x305, &u8tmp, 1); 684 720 if (ret) 685 721 goto err; 686 722 ··· 706 742 {87659938, 87659938, 87885178, 88241743}, 707 743 }; 708 744 709 - ret = rtl2832_bulk_read(client, 0x33c, &u8tmp, 1); 745 + ret = regmap_bulk_read(dev->regmap, 0x33c, &u8tmp, 1); 710 746 if (ret) 711 747 goto err; 712 748 ··· 718 754 if (hierarchy > HIERARCHY_NUM - 1) 719 755 goto err; 720 756 721 - ret = rtl2832_bulk_read(client, 0x40c, buf, 2); 757 + ret = regmap_bulk_read(dev->regmap, 0x40c, buf, 2); 722 758 if (ret) 723 759 goto err; 724 760 ··· 739 775 740 776 /* BER */ 741 777 if (dev->fe_status & FE_HAS_LOCK) { 742 - ret = rtl2832_bulk_read(client, 0x34e, buf, 2); 778 + ret = regmap_bulk_read(dev->regmap, 0x34e, buf, 2); 743 779 if (ret) 744 780 goto err; 745 781 ··· 789 825 790 826 /* 791 827 * I2C gate/mux/repeater logic 792 - * We must use unlocked __i2c_transfer() here (through regmap) because of I2C 793 - * adapter lock is already taken by tuner driver. 794 828 * There is delay mechanism to avoid unneeded I2C gate open / close. Gate close 795 829 * is delayed here a little bit in order to see if there is sequence of I2C 796 830 * messages sent to same I2C bus. ··· 800 838 int ret; 801 839 802 840 /* close gate */ 803 - ret = rtl2832_update_bits(dev->client, 0x101, 0x08, 0x00); 841 + ret = regmap_update_bits(dev->regmap, 0x101, 0x08, 0x00); 804 842 if (ret) 805 843 goto err; 806 844 ··· 818 856 /* terminate possible gate closing */ 819 857 cancel_delayed_work(&dev->i2c_gate_work); 820 858 821 - /* 822 - * I2C adapter lock is already taken and due to that we will use 823 - * regmap_update_bits() which does not lock again I2C adapter. 824 - */ 859 + /* open gate */ 825 860 ret = regmap_update_bits(dev->regmap, 0x101, 0x08, 0x08); 826 861 if (ret) 827 862 goto err; ··· 891 932 } 892 933 893 934 /* 894 - * We implement own I2C access routines for regmap in order to get manual access 895 - * to I2C adapter lock, which is needed for I2C mux adapter. 896 - */ 897 - static int rtl2832_regmap_read(void *context, const void *reg_buf, 898 - size_t reg_size, void *val_buf, size_t val_size) 899 - { 900 - struct i2c_client *client = context; 901 - int ret; 902 - struct i2c_msg msg[2] = { 903 - { 904 - .addr = client->addr, 905 - .flags = 0, 906 - .len = reg_size, 907 - .buf = (u8 *)reg_buf, 908 - }, { 909 - .addr = client->addr, 910 - .flags = I2C_M_RD, 911 - .len = val_size, 912 - .buf = val_buf, 913 - } 914 - }; 915 - 916 - ret = __i2c_transfer(client->adapter, msg, 2); 917 - if (ret != 2) { 918 - dev_warn(&client->dev, "i2c reg read failed %d reg %02x\n", 919 - ret, *(u8 *)reg_buf); 920 - if (ret >= 0) 921 - ret = -EREMOTEIO; 922 - return ret; 923 - } 924 - return 0; 925 - } 926 - 927 - static int rtl2832_regmap_write(void *context, const void *data, size_t count) 928 - { 929 - struct i2c_client *client = context; 930 - int ret; 931 - struct i2c_msg msg[1] = { 932 - { 933 - .addr = client->addr, 934 - .flags = 0, 935 - .len = count, 936 - .buf = (u8 *)data, 937 - } 938 - }; 939 - 940 - ret = __i2c_transfer(client->adapter, msg, 1); 941 - if (ret != 1) { 942 - dev_warn(&client->dev, "i2c reg write failed %d reg %02x\n", 943 - ret, *(u8 *)data); 944 - if (ret >= 0) 945 - ret = -EREMOTEIO; 946 - return ret; 947 - } 948 - return 0; 949 - } 950 - 951 - static int rtl2832_regmap_gather_write(void *context, const void *reg, 952 - size_t reg_len, const void *val, 953 - size_t val_len) 954 - { 955 - struct i2c_client *client = context; 956 - int ret; 957 - u8 buf[256]; 958 - struct i2c_msg msg[1] = { 959 - { 960 - .addr = client->addr, 961 - .flags = 0, 962 - .len = 1 + val_len, 963 - .buf = buf, 964 - } 965 - }; 966 - 967 - buf[0] = *(u8 const *)reg; 968 - memcpy(&buf[1], val, val_len); 969 - 970 - ret = __i2c_transfer(client->adapter, msg, 1); 971 - if (ret != 1) { 972 - dev_warn(&client->dev, "i2c reg write failed %d reg %02x\n", 973 - ret, *(u8 const *)reg); 974 - if (ret >= 0) 975 - ret = -EREMOTEIO; 976 - return ret; 977 - } 978 - return 0; 979 - } 980 - 981 - /* 982 935 * FIXME: Hack. Implement own regmap locking in order to silence lockdep 983 936 * recursive lock warning. That happens when regmap I2C client calls I2C mux 984 937 * adapter, which leads demod I2C repeater enable via demod regmap. Operation ··· 943 1072 ret = rtl2832_wr_demod_reg(dev, DVBT_SOFT_RST, 0x0); 944 1073 if (ret) 945 1074 goto err; 946 - ret = rtl2832_bulk_write(client, 0x10c, "\x5f\xff", 2); 1075 + ret = regmap_bulk_write(dev->regmap, 0x10c, "\x5f\xff", 2); 947 1076 if (ret) 948 1077 goto err; 949 1078 ret = rtl2832_wr_demod_reg(dev, DVBT_PIP_ON, 0x1); 950 1079 if (ret) 951 1080 goto err; 952 - ret = rtl2832_bulk_write(client, 0x0bc, "\x18", 1); 1081 + ret = regmap_bulk_write(dev->regmap, 0x0bc, "\x18", 1); 953 1082 if (ret) 954 1083 goto err; 955 - ret = rtl2832_bulk_write(client, 0x192, "\x7f\xf7\xff", 3); 1084 + ret = regmap_bulk_write(dev->regmap, 0x192, "\x7f\xf7\xff", 3); 956 1085 if (ret) 957 1086 goto err; 958 1087 } else { 959 - ret = rtl2832_bulk_write(client, 0x192, "\x00\x0f\xff", 3); 1088 + ret = regmap_bulk_write(dev->regmap, 0x192, "\x00\x0f\xff", 3); 960 1089 if (ret) 961 1090 goto err; 962 - ret = rtl2832_bulk_write(client, 0x0bc, "\x08", 1); 1091 + ret = regmap_bulk_write(dev->regmap, 0x0bc, "\x08", 1); 963 1092 if (ret) 964 1093 goto err; 965 1094 ret = rtl2832_wr_demod_reg(dev, DVBT_PIP_ON, 0x0); 966 1095 if (ret) 967 1096 goto err; 968 - ret = rtl2832_bulk_write(client, 0x10c, "\x00\x00", 2); 1097 + ret = regmap_bulk_write(dev->regmap, 0x10c, "\x00\x00", 2); 969 1098 if (ret) 970 1099 goto err; 971 1100 ret = rtl2832_wr_demod_reg(dev, DVBT_SOFT_RST, 0x1); ··· 994 1123 else 995 1124 u8tmp = 0x00; 996 1125 997 - ret = rtl2832_update_bits(client, 0x061, 0xc0, u8tmp); 1126 + ret = regmap_update_bits(dev->regmap, 0x061, 0xc0, u8tmp); 998 1127 if (ret) 999 1128 goto err; 1000 1129 ··· 1029 1158 buf[1] = (dev->filters >> 8) & 0xff; 1030 1159 buf[2] = (dev->filters >> 16) & 0xff; 1031 1160 buf[3] = (dev->filters >> 24) & 0xff; 1032 - ret = rtl2832_bulk_write(client, 0x062, buf, 4); 1161 + ret = regmap_bulk_write(dev->regmap, 0x062, buf, 4); 1033 1162 if (ret) 1034 1163 goto err; 1035 1164 1036 1165 /* add PID */ 1037 1166 buf[0] = (pid >> 8) & 0xff; 1038 1167 buf[1] = (pid >> 0) & 0xff; 1039 - ret = rtl2832_bulk_write(client, 0x066 + 2 * index, buf, 2); 1168 + ret = regmap_bulk_write(dev->regmap, 0x066 + 2 * index, buf, 2); 1040 1169 if (ret) 1041 1170 goto err; 1042 1171 ··· 1054 1183 struct rtl2832_dev *dev; 1055 1184 int ret; 1056 1185 u8 tmp; 1057 - static const struct regmap_bus regmap_bus = { 1058 - .read = rtl2832_regmap_read, 1059 - .write = rtl2832_regmap_write, 1060 - .gather_write = rtl2832_regmap_gather_write, 1061 - .val_format_endian_default = REGMAP_ENDIAN_NATIVE, 1062 - }; 1063 1186 static const struct regmap_range_cfg regmap_range_cfg[] = { 1064 1187 { 1065 1188 .selector_reg = 0x00, ··· 1093 1228 dev->regmap_config.ranges = regmap_range_cfg, 1094 1229 dev->regmap_config.num_ranges = ARRAY_SIZE(regmap_range_cfg), 1095 1230 dev->regmap_config.cache_type = REGCACHE_NONE, 1096 - dev->regmap = regmap_init(&client->dev, &regmap_bus, client, 1097 - &dev->regmap_config); 1231 + dev->regmap = regmap_init_i2c(client, &dev->regmap_config); 1098 1232 if (IS_ERR(dev->regmap)) { 1099 1233 ret = PTR_ERR(dev->regmap); 1100 1234 goto err_kfree; 1101 1235 } 1102 1236 1103 1237 /* check if the demod is there */ 1104 - ret = rtl2832_bulk_read(client, 0x000, &tmp, 1); 1238 + ret = regmap_bulk_read(dev->regmap, 0x000, &tmp, 1); 1105 1239 if (ret) 1106 1240 goto err_regmap_exit; 1107 1241 1108 1242 /* create muxed i2c adapter for demod tuner bus */ 1109 - dev->muxc = i2c_mux_alloc(i2c, &i2c->dev, 1, 0, 0, 1243 + dev->muxc = i2c_mux_alloc(i2c, &i2c->dev, 1, 0, I2C_MUX_LOCKED, 1110 1244 rtl2832_select, rtl2832_deselect); 1111 1245 if (!dev->muxc) { 1112 1246 ret = -ENOMEM; ··· 1126 1262 pdata->slave_ts_ctrl = rtl2832_slave_ts_ctrl; 1127 1263 pdata->pid_filter = rtl2832_pid_filter; 1128 1264 pdata->pid_filter_ctrl = rtl2832_pid_filter_ctrl; 1129 - pdata->bulk_read = rtl2832_bulk_read; 1130 - pdata->bulk_write = rtl2832_bulk_write; 1131 - pdata->update_bits = rtl2832_update_bits; 1265 + pdata->regmap = dev->regmap; 1132 1266 1133 1267 dev_info(&client->dev, "Realtek RTL2832 successfully attached\n"); 1134 1268 return 0;
+1 -3
drivers/media/dvb-frontends/rtl2832.h
··· 57 57 int (*pid_filter)(struct dvb_frontend *, u8, u16, int); 58 58 int (*pid_filter_ctrl)(struct dvb_frontend *, int); 59 59 /* private: Register access for SDR module use only */ 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); 60 + struct regmap *regmap; 63 61 }; 64 62 65 63 #endif /* RTL2832_H */
+7 -6
drivers/media/dvb-frontends/rtl2832_sdr.c
··· 35 35 #include <linux/platform_device.h> 36 36 #include <linux/jiffies.h> 37 37 #include <linux/math64.h> 38 + #include <linux/regmap.h> 38 39 39 40 static bool rtl2832_sdr_emulated_fmt; 40 41 module_param_named(emulated_formats, rtl2832_sdr_emulated_fmt, bool, 0644); ··· 170 169 { 171 170 struct platform_device *pdev = dev->pdev; 172 171 struct rtl2832_sdr_platform_data *pdata = pdev->dev.platform_data; 173 - struct i2c_client *client = pdata->i2c_client; 172 + struct regmap *regmap = pdata->regmap; 174 173 175 - return pdata->bulk_write(client, reg, val, len); 174 + return regmap_bulk_write(regmap, reg, val, len); 176 175 } 177 176 178 177 #if 0 ··· 182 181 { 183 182 struct platform_device *pdev = dev->pdev; 184 183 struct rtl2832_sdr_platform_data *pdata = pdev->dev.platform_data; 185 - struct i2c_client *client = pdata->i2c_client; 184 + struct regmap *regmap = pdata->regmap; 186 185 187 - return pdata->bulk_read(client, reg, val, len); 186 + return regmap_bulk_read(regmap, reg, val, len); 188 187 } 189 188 #endif 190 189 ··· 200 199 { 201 200 struct platform_device *pdev = dev->pdev; 202 201 struct rtl2832_sdr_platform_data *pdata = pdev->dev.platform_data; 203 - struct i2c_client *client = pdata->i2c_client; 202 + struct regmap *regmap = pdata->regmap; 204 203 205 - return pdata->update_bits(client, reg, mask, val); 204 + return regmap_update_bits(regmap, reg, mask, val); 206 205 } 207 206 208 207 /* Private functions */
+1 -4
drivers/media/dvb-frontends/rtl2832_sdr.h
··· 56 56 #define RTL2832_SDR_TUNER_R828D 0x2b 57 57 u8 tuner; 58 58 59 - struct i2c_client *i2c_client; 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); 59 + struct regmap *regmap; 63 60 struct dvb_frontend *dvb_frontend; 64 61 struct v4l2_subdev *v4l2_subdev; 65 62 struct dvb_usb_device *dvb_usb_device;
+1 -4
drivers/media/usb/dvb-usb-v2/rtl28xxu.c
··· 1333 1333 case TUNER_RTL2832_R828D: 1334 1334 pdata.clk = dev->rtl2832_platform_data.clk; 1335 1335 pdata.tuner = dev->tuner; 1336 - pdata.i2c_client = dev->i2c_client_demod; 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; 1336 + pdata.regmap = dev->rtl2832_platform_data.regmap; 1340 1337 pdata.dvb_frontend = adap->fe[0]; 1341 1338 pdata.dvb_usb_device = d; 1342 1339 pdata.v4l2_subdev = subdev;