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

[media] cx23885: move CI/MAC registration to a separate function

As reported by smatch:
drivers/media/pci/cx23885/cx23885-dvb.c:2080 dvb_register() Function too hairy. Giving up.

This is indeed a too complex function, with lots of stuff inside.
Breaking this into two functions makes it a little bit less hairy.

Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>

+137 -139
+137 -139
drivers/media/pci/cx23885/cx23885-dvb.c
··· 1069 1069 .hostbus_diversity = 1, 1070 1070 }; 1071 1071 1072 + static int dvb_register_ci_mac(struct cx23885_tsport *port) 1073 + { 1074 + struct cx23885_dev *dev = port->dev; 1075 + struct i2c_client *client_ci = NULL; 1076 + struct vb2_dvb_frontend *fe0; 1077 + 1078 + fe0 = vb2_dvb_get_frontend(&port->frontends, 1); 1079 + if (!fe0) 1080 + return -EINVAL; 1081 + 1082 + switch (dev->board) { 1083 + case CX23885_BOARD_NETUP_DUAL_DVBS2_CI: { 1084 + static struct netup_card_info cinfo; 1085 + 1086 + netup_get_card_info(&dev->i2c_bus[0].i2c_adap, &cinfo); 1087 + memcpy(port->frontends.adapter.proposed_mac, 1088 + cinfo.port[port->nr - 1].mac, 6); 1089 + printk(KERN_INFO "NetUP Dual DVB-S2 CI card port%d MAC=%pM\n", 1090 + port->nr, port->frontends.adapter.proposed_mac); 1091 + 1092 + netup_ci_init(port); 1093 + return 0; 1094 + } 1095 + case CX23885_BOARD_NETUP_DUAL_DVB_T_C_CI_RF: { 1096 + struct altera_ci_config netup_ci_cfg = { 1097 + .dev = dev,/* magic number to identify*/ 1098 + .adapter = &port->frontends.adapter,/* for CI */ 1099 + .demux = &fe0->dvb.demux,/* for hw pid filter */ 1100 + .fpga_rw = netup_altera_fpga_rw, 1101 + }; 1102 + 1103 + altera_ci_init(&netup_ci_cfg, port->nr); 1104 + return 0; 1105 + } 1106 + case CX23885_BOARD_TEVII_S470: { 1107 + u8 eeprom[256]; /* 24C02 i2c eeprom */ 1108 + 1109 + if (port->nr != 1) 1110 + return 0; 1111 + 1112 + /* Read entire EEPROM */ 1113 + dev->i2c_bus[0].i2c_client.addr = 0xa0 >> 1; 1114 + tveeprom_read(&dev->i2c_bus[0].i2c_client, eeprom, sizeof(eeprom)); 1115 + printk(KERN_INFO "TeVii S470 MAC= %pM\n", eeprom + 0xa0); 1116 + memcpy(port->frontends.adapter.proposed_mac, eeprom + 0xa0, 6); 1117 + return 0; 1118 + } 1119 + case CX23885_BOARD_DVBSKY_T9580: 1120 + case CX23885_BOARD_DVBSKY_S950: 1121 + case CX23885_BOARD_DVBSKY_S952: 1122 + case CX23885_BOARD_DVBSKY_T982: { 1123 + u8 eeprom[256]; /* 24C02 i2c eeprom */ 1124 + 1125 + if (port->nr > 2) 1126 + return 0; 1127 + 1128 + /* Read entire EEPROM */ 1129 + dev->i2c_bus[0].i2c_client.addr = 0xa0 >> 1; 1130 + tveeprom_read(&dev->i2c_bus[0].i2c_client, eeprom, 1131 + sizeof(eeprom)); 1132 + printk(KERN_INFO "%s port %d MAC address: %pM\n", 1133 + cx23885_boards[dev->board].name, port->nr, 1134 + eeprom + 0xc0 + (port->nr-1) * 8); 1135 + memcpy(port->frontends.adapter.proposed_mac, eeprom + 0xc0 + 1136 + (port->nr-1) * 8, 6); 1137 + return 0; 1138 + } 1139 + case CX23885_BOARD_DVBSKY_S950C: 1140 + case CX23885_BOARD_DVBSKY_T980C: 1141 + case CX23885_BOARD_TT_CT2_4500_CI: { 1142 + u8 eeprom[256]; /* 24C02 i2c eeprom */ 1143 + struct sp2_config sp2_config; 1144 + struct i2c_board_info info; 1145 + struct cx23885_i2c *i2c_bus2 = &dev->i2c_bus[1]; 1146 + 1147 + /* attach CI */ 1148 + memset(&sp2_config, 0, sizeof(sp2_config)); 1149 + sp2_config.dvb_adap = &port->frontends.adapter; 1150 + sp2_config.priv = port; 1151 + sp2_config.ci_control = cx23885_sp2_ci_ctrl; 1152 + memset(&info, 0, sizeof(struct i2c_board_info)); 1153 + strlcpy(info.type, "sp2", I2C_NAME_SIZE); 1154 + info.addr = 0x40; 1155 + info.platform_data = &sp2_config; 1156 + request_module(info.type); 1157 + client_ci = i2c_new_device(&i2c_bus2->i2c_adap, &info); 1158 + if (client_ci == NULL || client_ci->dev.driver == NULL) 1159 + return -ENODEV; 1160 + if (!try_module_get(client_ci->dev.driver->owner)) { 1161 + i2c_unregister_device(client_ci); 1162 + return -ENODEV; 1163 + } 1164 + port->i2c_client_ci = client_ci; 1165 + 1166 + if (port->nr != 1) 1167 + return 0; 1168 + 1169 + /* Read entire EEPROM */ 1170 + dev->i2c_bus[0].i2c_client.addr = 0xa0 >> 1; 1171 + tveeprom_read(&dev->i2c_bus[0].i2c_client, eeprom, 1172 + sizeof(eeprom)); 1173 + printk(KERN_INFO "%s MAC address: %pM\n", 1174 + cx23885_boards[dev->board].name, eeprom + 0xc0); 1175 + memcpy(port->frontends.adapter.proposed_mac, eeprom + 0xc0, 6); 1176 + return 0; 1177 + } 1178 + } 1179 + return 0; 1180 + } 1181 + 1072 1182 static int dvb_register(struct cx23885_tsport *port) 1073 1183 { 1074 1184 struct dib7000p_ops dib7000p_ops; ··· 1187 1077 struct vb2_dvb_frontend *fe0, *fe1 = NULL; 1188 1078 struct si2168_config si2168_config; 1189 1079 struct si2157_config si2157_config; 1190 - struct sp2_config sp2_config; 1191 1080 struct m88ts2022_config m88ts2022_config; 1192 1081 struct i2c_board_info info; 1193 1082 struct i2c_adapter *adapter; 1194 - struct i2c_client *client_demod = NULL, *client_tuner = NULL, *client_ci = NULL; 1083 + struct i2c_client *client_demod = NULL, *client_tuner = NULL; 1195 1084 const struct m88ds3103_config *p_m88ds3103_config = NULL; 1196 1085 int (*p_set_voltage)(struct dvb_frontend *fe, fe_sec_voltage_t voltage) = NULL; 1197 1086 int mfe_shared = 0; /* bus not shared by default */ ··· 1921 1812 request_module(info.type); 1922 1813 client_tuner = i2c_new_device(adapter, &info); 1923 1814 if (client_tuner == NULL || 1924 - client_tuner->dev.driver == NULL) { 1925 - module_put(client_demod->dev.driver->owner); 1926 - i2c_unregister_device(client_demod); 1927 - port->i2c_client_demod = NULL; 1815 + client_tuner->dev.driver == NULL) 1928 1816 goto frontend_detach; 1929 - } 1817 + 1930 1818 if (!try_module_get(client_tuner->dev.driver->owner)) { 1931 1819 i2c_unregister_device(client_tuner); 1932 - module_put(client_demod->dev.driver->owner); 1933 - i2c_unregister_device(client_demod); 1934 - port->i2c_client_demod = NULL; 1935 1820 goto frontend_detach; 1936 1821 } 1937 1822 port->i2c_client_tuner = client_tuner; ··· 1965 1862 info.platform_data = &si2157_config; 1966 1863 request_module(info.type); 1967 1864 client_tuner = i2c_new_device(adapter, &info); 1968 - if (client_tuner == NULL || client_tuner->dev.driver == NULL) { 1969 - module_put(client_demod->dev.driver->owner); 1970 - i2c_unregister_device(client_demod); 1971 - port->i2c_client_demod = NULL; 1865 + if (client_tuner == NULL || 1866 + client_tuner->dev.driver == NULL) 1972 1867 goto frontend_detach; 1973 - } 1974 1868 if (!try_module_get(client_tuner->dev.driver->owner)) { 1975 1869 i2c_unregister_device(client_tuner); 1976 - module_put(client_demod->dev.driver->owner); 1977 - i2c_unregister_device(client_demod); 1978 - port->i2c_client_demod = NULL; 1979 1870 goto frontend_detach; 1980 1871 } 1981 1872 port->i2c_client_tuner = client_tuner; ··· 2103 2006 info.platform_data = &si2157_config; 2104 2007 request_module(info.type); 2105 2008 client_tuner = i2c_new_device(adapter, &info); 2106 - if (client_tuner == NULL || client_tuner->dev.driver == NULL) { 2107 - module_put(client_demod->dev.driver->owner); 2108 - i2c_unregister_device(client_demod); 2109 - port->i2c_client_demod = NULL; 2009 + if (client_tuner == NULL || 2010 + client_tuner->dev.driver == NULL) 2110 2011 goto frontend_detach; 2111 - } 2112 2012 if (!try_module_get(client_tuner->dev.driver->owner)) { 2113 2013 i2c_unregister_device(client_tuner); 2114 - module_put(client_demod->dev.driver->owner); 2115 - i2c_unregister_device(client_demod); 2116 - port->i2c_client_demod = NULL; 2117 2014 goto frontend_detach; 2118 2015 } 2119 2016 port->i2c_client_tuner = client_tuner; ··· 2235 2144 if (ret) 2236 2145 goto frontend_detach; 2237 2146 2238 - /* init CI & MAC */ 2239 - switch (dev->board) { 2240 - case CX23885_BOARD_NETUP_DUAL_DVBS2_CI: { 2241 - static struct netup_card_info cinfo; 2147 + ret = dvb_register_ci_mac(port); 2148 + if (ret) 2149 + goto frontend_detach; 2242 2150 2243 - netup_get_card_info(&dev->i2c_bus[0].i2c_adap, &cinfo); 2244 - memcpy(port->frontends.adapter.proposed_mac, 2245 - cinfo.port[port->nr - 1].mac, 6); 2246 - printk(KERN_INFO "NetUP Dual DVB-S2 CI card port%d MAC=%pM\n", 2247 - port->nr, port->frontends.adapter.proposed_mac); 2248 - 2249 - netup_ci_init(port); 2250 - break; 2251 - } 2252 - case CX23885_BOARD_NETUP_DUAL_DVB_T_C_CI_RF: { 2253 - struct altera_ci_config netup_ci_cfg = { 2254 - .dev = dev,/* magic number to identify*/ 2255 - .adapter = &port->frontends.adapter,/* for CI */ 2256 - .demux = &fe0->dvb.demux,/* for hw pid filter */ 2257 - .fpga_rw = netup_altera_fpga_rw, 2258 - }; 2259 - 2260 - altera_ci_init(&netup_ci_cfg, port->nr); 2261 - break; 2262 - } 2263 - case CX23885_BOARD_TEVII_S470: { 2264 - u8 eeprom[256]; /* 24C02 i2c eeprom */ 2265 - 2266 - if (port->nr != 1) 2267 - break; 2268 - 2269 - /* Read entire EEPROM */ 2270 - dev->i2c_bus[0].i2c_client.addr = 0xa0 >> 1; 2271 - tveeprom_read(&dev->i2c_bus[0].i2c_client, eeprom, sizeof(eeprom)); 2272 - printk(KERN_INFO "TeVii S470 MAC= %pM\n", eeprom + 0xa0); 2273 - memcpy(port->frontends.adapter.proposed_mac, eeprom + 0xa0, 6); 2274 - break; 2275 - } 2276 - case CX23885_BOARD_DVBSKY_T9580: 2277 - case CX23885_BOARD_DVBSKY_S950: 2278 - case CX23885_BOARD_DVBSKY_S952: 2279 - case CX23885_BOARD_DVBSKY_T982: { 2280 - u8 eeprom[256]; /* 24C02 i2c eeprom */ 2281 - 2282 - if (port->nr > 2) 2283 - break; 2284 - 2285 - /* Read entire EEPROM */ 2286 - dev->i2c_bus[0].i2c_client.addr = 0xa0 >> 1; 2287 - tveeprom_read(&dev->i2c_bus[0].i2c_client, eeprom, 2288 - sizeof(eeprom)); 2289 - printk(KERN_INFO "%s port %d MAC address: %pM\n", 2290 - cx23885_boards[dev->board].name, port->nr, 2291 - eeprom + 0xc0 + (port->nr-1) * 8); 2292 - memcpy(port->frontends.adapter.proposed_mac, eeprom + 0xc0 + 2293 - (port->nr-1) * 8, 6); 2294 - break; 2295 - } 2296 - case CX23885_BOARD_DVBSKY_S950C: 2297 - case CX23885_BOARD_DVBSKY_T980C: 2298 - case CX23885_BOARD_TT_CT2_4500_CI: { 2299 - u8 eeprom[256]; /* 24C02 i2c eeprom */ 2300 - 2301 - /* attach CI */ 2302 - memset(&sp2_config, 0, sizeof(sp2_config)); 2303 - sp2_config.dvb_adap = &port->frontends.adapter; 2304 - sp2_config.priv = port; 2305 - sp2_config.ci_control = cx23885_sp2_ci_ctrl; 2306 - memset(&info, 0, sizeof(struct i2c_board_info)); 2307 - strlcpy(info.type, "sp2", I2C_NAME_SIZE); 2308 - info.addr = 0x40; 2309 - info.platform_data = &sp2_config; 2310 - request_module(info.type); 2311 - client_ci = i2c_new_device(&i2c_bus2->i2c_adap, &info); 2312 - if (client_ci == NULL || client_ci->dev.driver == NULL) { 2313 - if (client_tuner) { 2314 - module_put(client_tuner->dev.driver->owner); 2315 - i2c_unregister_device(client_tuner); 2316 - } 2317 - if (client_demod) { 2318 - module_put(client_demod->dev.driver->owner); 2319 - i2c_unregister_device(client_demod); 2320 - } 2321 - goto frontend_detach; 2322 - } 2323 - if (!try_module_get(client_ci->dev.driver->owner)) { 2324 - i2c_unregister_device(client_ci); 2325 - if (client_tuner) { 2326 - module_put(client_tuner->dev.driver->owner); 2327 - i2c_unregister_device(client_tuner); 2328 - } 2329 - if (client_demod) { 2330 - module_put(client_demod->dev.driver->owner); 2331 - i2c_unregister_device(client_demod); 2332 - } 2333 - goto frontend_detach; 2334 - } 2335 - port->i2c_client_ci = client_ci; 2336 - 2337 - if (port->nr != 1) 2338 - break; 2339 - 2340 - /* Read entire EEPROM */ 2341 - dev->i2c_bus[0].i2c_client.addr = 0xa0 >> 1; 2342 - tveeprom_read(&dev->i2c_bus[0].i2c_client, eeprom, 2343 - sizeof(eeprom)); 2344 - printk(KERN_INFO "%s MAC address: %pM\n", 2345 - cx23885_boards[dev->board].name, eeprom + 0xc0); 2346 - memcpy(port->frontends.adapter.proposed_mac, eeprom + 0xc0, 6); 2347 - break; 2348 - } 2349 - } 2350 - 2351 - return ret; 2151 + return 0; 2352 2152 2353 2153 frontend_detach: 2154 + /* remove I2C client for tuner */ 2155 + client_tuner = port->i2c_client_tuner; 2156 + if (client_tuner) { 2157 + module_put(client_tuner->dev.driver->owner); 2158 + i2c_unregister_device(client_tuner); 2159 + port->i2c_client_tuner = NULL; 2160 + } 2161 + 2162 + /* remove I2C client for demodulator */ 2163 + client_demod = port->i2c_client_demod; 2164 + if (client_demod) { 2165 + module_put(client_demod->dev.driver->owner); 2166 + i2c_unregister_device(client_demod); 2167 + port->i2c_client_demod = NULL; 2168 + } 2169 + 2354 2170 port->gate_ctrl = NULL; 2355 2171 vb2_dvb_dealloc_frontends(&port->frontends); 2356 2172 return -EINVAL;