forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-05-10 cde9070d9970eef1f7ec2360586c802a16230ad8
kernel/drivers/media/pci/cx23885/cx23885-dvb.c
....@@ -1,18 +1,8 @@
1
+// SPDX-License-Identifier: GPL-2.0-or-later
12 /*
23 * Driver for the Conexant CX23885 PCIe bridge
34 *
45 * Copyright (c) 2006 Steven Toth <stoth@linuxtv.org>
5
- *
6
- * This program is free software; you can redistribute it and/or modify
7
- * it under the terms of the GNU General Public License as published by
8
- * the Free Software Foundation; either version 2 of the License, or
9
- * (at your option) any later version.
10
- *
11
- * This program is distributed in the hope that it will be useful,
12
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
- *
15
- * GNU General Public License for more details.
166 */
177
188 #include "cx23885.h"
....@@ -1165,12 +1155,12 @@
11651155 sp2_config.priv = port;
11661156 sp2_config.ci_control = cx23885_sp2_ci_ctrl;
11671157 memset(&info, 0, sizeof(struct i2c_board_info));
1168
- strlcpy(info.type, "sp2", I2C_NAME_SIZE);
1158
+ strscpy(info.type, "sp2", I2C_NAME_SIZE);
11691159 info.addr = 0x40;
11701160 info.platform_data = &sp2_config;
11711161 request_module(info.type);
1172
- client_ci = i2c_new_device(&i2c_bus->i2c_adap, &info);
1173
- if (client_ci == NULL || client_ci->dev.driver == NULL)
1162
+ client_ci = i2c_new_client_device(&i2c_bus->i2c_adap, &info);
1163
+ if (!i2c_client_has_driver(client_ci))
11741164 return -ENODEV;
11751165 if (!try_module_get(client_ci->dev.driver->owner)) {
11761166 i2c_unregister_device(client_ci);
....@@ -1832,12 +1822,12 @@
18321822 case 1:
18331823 /* attach demod + tuner combo */
18341824 memset(&info, 0, sizeof(info));
1835
- strlcpy(info.type, "tda10071_cx24118", I2C_NAME_SIZE);
1825
+ strscpy(info.type, "tda10071_cx24118", I2C_NAME_SIZE);
18361826 info.addr = 0x05;
18371827 info.platform_data = &tda10071_pdata;
18381828 request_module("tda10071");
1839
- client_demod = i2c_new_device(&i2c_bus->i2c_adap, &info);
1840
- if (!client_demod || !client_demod->dev.driver)
1829
+ client_demod = i2c_new_client_device(&i2c_bus->i2c_adap, &info);
1830
+ if (!i2c_client_has_driver(client_demod))
18411831 goto frontend_detach;
18421832 if (!try_module_get(client_demod->dev.driver->owner)) {
18431833 i2c_unregister_device(client_demod);
....@@ -1849,12 +1839,12 @@
18491839 /* attach SEC */
18501840 a8293_pdata.dvb_frontend = fe0->dvb.frontend;
18511841 memset(&info, 0, sizeof(info));
1852
- strlcpy(info.type, "a8293", I2C_NAME_SIZE);
1842
+ strscpy(info.type, "a8293", I2C_NAME_SIZE);
18531843 info.addr = 0x0b;
18541844 info.platform_data = &a8293_pdata;
18551845 request_module("a8293");
1856
- client_sec = i2c_new_device(&i2c_bus->i2c_adap, &info);
1857
- if (!client_sec || !client_sec->dev.driver)
1846
+ client_sec = i2c_new_client_device(&i2c_bus->i2c_adap, &info);
1847
+ if (!i2c_client_has_driver(client_sec))
18581848 goto frontend_detach;
18591849 if (!try_module_get(client_sec->dev.driver->owner)) {
18601850 i2c_unregister_device(client_sec);
....@@ -1870,13 +1860,12 @@
18701860 si2165_pdata.chip_mode = SI2165_MODE_PLL_XTAL;
18711861 si2165_pdata.ref_freq_hz = 16000000;
18721862 memset(&info, 0, sizeof(struct i2c_board_info));
1873
- strlcpy(info.type, "si2165", I2C_NAME_SIZE);
1863
+ strscpy(info.type, "si2165", I2C_NAME_SIZE);
18741864 info.addr = 0x64;
18751865 info.platform_data = &si2165_pdata;
18761866 request_module(info.type);
1877
- client_demod = i2c_new_device(&i2c_bus->i2c_adap, &info);
1878
- if (client_demod == NULL ||
1879
- client_demod->dev.driver == NULL)
1867
+ client_demod = i2c_new_client_device(&i2c_bus->i2c_adap, &info);
1868
+ if (!i2c_client_has_driver(client_demod))
18801869 goto frontend_detach;
18811870 if (!try_module_get(client_demod->dev.driver->owner)) {
18821871 i2c_unregister_device(client_demod);
....@@ -1904,12 +1893,12 @@
19041893
19051894 /* attach demod + tuner combo */
19061895 memset(&info, 0, sizeof(info));
1907
- strlcpy(info.type, "tda10071_cx24118", I2C_NAME_SIZE);
1896
+ strscpy(info.type, "tda10071_cx24118", I2C_NAME_SIZE);
19081897 info.addr = 0x05;
19091898 info.platform_data = &tda10071_pdata;
19101899 request_module("tda10071");
1911
- client_demod = i2c_new_device(&i2c_bus->i2c_adap, &info);
1912
- if (!client_demod || !client_demod->dev.driver)
1900
+ client_demod = i2c_new_client_device(&i2c_bus->i2c_adap, &info);
1901
+ if (!i2c_client_has_driver(client_demod))
19131902 goto frontend_detach;
19141903 if (!try_module_get(client_demod->dev.driver->owner)) {
19151904 i2c_unregister_device(client_demod);
....@@ -1921,12 +1910,12 @@
19211910 /* attach SEC */
19221911 a8293_pdata.dvb_frontend = fe0->dvb.frontend;
19231912 memset(&info, 0, sizeof(info));
1924
- strlcpy(info.type, "a8293", I2C_NAME_SIZE);
1913
+ strscpy(info.type, "a8293", I2C_NAME_SIZE);
19251914 info.addr = 0x0b;
19261915 info.platform_data = &a8293_pdata;
19271916 request_module("a8293");
1928
- client_sec = i2c_new_device(&i2c_bus->i2c_adap, &info);
1929
- if (!client_sec || !client_sec->dev.driver)
1917
+ client_sec = i2c_new_client_device(&i2c_bus->i2c_adap, &info);
1918
+ if (!i2c_client_has_driver(client_sec))
19301919 goto frontend_detach;
19311920 if (!try_module_get(client_sec->dev.driver->owner)) {
19321921 i2c_unregister_device(client_sec);
....@@ -1954,13 +1943,12 @@
19541943 ts2020_config.fe = fe0->dvb.frontend;
19551944 ts2020_config.get_agc_pwm = m88ds3103_get_agc_pwm;
19561945 memset(&info, 0, sizeof(struct i2c_board_info));
1957
- strlcpy(info.type, "ts2020", I2C_NAME_SIZE);
1946
+ strscpy(info.type, "ts2020", I2C_NAME_SIZE);
19581947 info.addr = 0x60;
19591948 info.platform_data = &ts2020_config;
19601949 request_module(info.type);
1961
- client_tuner = i2c_new_device(adapter, &info);
1962
- if (client_tuner == NULL ||
1963
- client_tuner->dev.driver == NULL)
1950
+ client_tuner = i2c_new_client_device(adapter, &info);
1951
+ if (!i2c_client_has_driver(client_tuner))
19641952 goto frontend_detach;
19651953 if (!try_module_get(client_tuner->dev.driver->owner)) {
19661954 i2c_unregister_device(client_tuner);
....@@ -1991,13 +1979,12 @@
19911979 si2168_config.fe = &fe0->dvb.frontend;
19921980 si2168_config.ts_mode = SI2168_TS_SERIAL;
19931981 memset(&info, 0, sizeof(struct i2c_board_info));
1994
- strlcpy(info.type, "si2168", I2C_NAME_SIZE);
1982
+ strscpy(info.type, "si2168", I2C_NAME_SIZE);
19951983 info.addr = 0x64;
19961984 info.platform_data = &si2168_config;
19971985 request_module(info.type);
1998
- client_demod = i2c_new_device(&i2c_bus->i2c_adap, &info);
1999
- if (client_demod == NULL ||
2000
- client_demod->dev.driver == NULL)
1986
+ client_demod = i2c_new_client_device(&i2c_bus->i2c_adap, &info);
1987
+ if (!i2c_client_has_driver(client_demod))
20011988 goto frontend_detach;
20021989 if (!try_module_get(client_demod->dev.driver->owner)) {
20031990 i2c_unregister_device(client_demod);
....@@ -2010,13 +1997,12 @@
20101997 si2157_config.fe = fe0->dvb.frontend;
20111998 si2157_config.if_port = 1;
20121999 memset(&info, 0, sizeof(struct i2c_board_info));
2013
- strlcpy(info.type, "si2157", I2C_NAME_SIZE);
2000
+ strscpy(info.type, "si2157", I2C_NAME_SIZE);
20142001 info.addr = 0x60;
20152002 info.platform_data = &si2157_config;
20162003 request_module(info.type);
2017
- client_tuner = i2c_new_device(adapter, &info);
2018
- if (client_tuner == NULL ||
2019
- client_tuner->dev.driver == NULL)
2004
+ client_tuner = i2c_new_client_device(adapter, &info);
2005
+ if (!i2c_client_has_driver(client_tuner))
20202006 goto frontend_detach;
20212007
20222008 if (!try_module_get(client_tuner->dev.driver->owner)) {
....@@ -2038,12 +2024,12 @@
20382024 si2168_config.fe = &fe0->dvb.frontend;
20392025 si2168_config.ts_mode = SI2168_TS_PARALLEL;
20402026 memset(&info, 0, sizeof(struct i2c_board_info));
2041
- strlcpy(info.type, "si2168", I2C_NAME_SIZE);
2027
+ strscpy(info.type, "si2168", I2C_NAME_SIZE);
20422028 info.addr = 0x64;
20432029 info.platform_data = &si2168_config;
20442030 request_module(info.type);
2045
- client_demod = i2c_new_device(&i2c_bus2->i2c_adap, &info);
2046
- if (client_demod == NULL || client_demod->dev.driver == NULL)
2031
+ client_demod = i2c_new_client_device(&i2c_bus2->i2c_adap, &info);
2032
+ if (!i2c_client_has_driver(client_demod))
20472033 goto frontend_detach;
20482034 if (!try_module_get(client_demod->dev.driver->owner)) {
20492035 i2c_unregister_device(client_demod);
....@@ -2056,13 +2042,12 @@
20562042 si2157_config.fe = fe0->dvb.frontend;
20572043 si2157_config.if_port = 1;
20582044 memset(&info, 0, sizeof(struct i2c_board_info));
2059
- strlcpy(info.type, "si2157", I2C_NAME_SIZE);
2045
+ strscpy(info.type, "si2157", I2C_NAME_SIZE);
20602046 info.addr = 0x60;
20612047 info.platform_data = &si2157_config;
20622048 request_module(info.type);
2063
- client_tuner = i2c_new_device(adapter, &info);
2064
- if (client_tuner == NULL ||
2065
- client_tuner->dev.driver == NULL)
2049
+ client_tuner = i2c_new_client_device(adapter, &info);
2050
+ if (!i2c_client_has_driver(client_tuner))
20662051 goto frontend_detach;
20672052 if (!try_module_get(client_tuner->dev.driver->owner)) {
20682053 i2c_unregister_device(client_tuner);
....@@ -2086,12 +2071,12 @@
20862071 ts2020_config.fe = fe0->dvb.frontend;
20872072 ts2020_config.get_agc_pwm = m88ds3103_get_agc_pwm;
20882073 memset(&info, 0, sizeof(struct i2c_board_info));
2089
- strlcpy(info.type, "ts2020", I2C_NAME_SIZE);
2074
+ strscpy(info.type, "ts2020", I2C_NAME_SIZE);
20902075 info.addr = 0x60;
20912076 info.platform_data = &ts2020_config;
20922077 request_module(info.type);
2093
- client_tuner = i2c_new_device(adapter, &info);
2094
- if (client_tuner == NULL || client_tuner->dev.driver == NULL)
2078
+ client_tuner = i2c_new_client_device(adapter, &info);
2079
+ if (!i2c_client_has_driver(client_tuner))
20952080 goto frontend_detach;
20962081 if (!try_module_get(client_tuner->dev.driver->owner)) {
20972082 i2c_unregister_device(client_tuner);
....@@ -2135,12 +2120,12 @@
21352120 }
21362121
21372122 memset(&info, 0, sizeof(info));
2138
- strlcpy(info.type, "m88ds3103", I2C_NAME_SIZE);
2123
+ strscpy(info.type, "m88ds3103", I2C_NAME_SIZE);
21392124 info.addr = 0x68;
21402125 info.platform_data = &m88ds3103_pdata;
21412126 request_module(info.type);
2142
- client_demod = i2c_new_device(&i2c_bus->i2c_adap, &info);
2143
- if (client_demod == NULL || client_demod->dev.driver == NULL)
2127
+ client_demod = i2c_new_client_device(&i2c_bus->i2c_adap, &info);
2128
+ if (!i2c_client_has_driver(client_demod))
21442129 goto frontend_detach;
21452130 if (!try_module_get(client_demod->dev.driver->owner)) {
21462131 i2c_unregister_device(client_demod);
....@@ -2155,12 +2140,12 @@
21552140 ts2020_config.fe = fe0->dvb.frontend;
21562141 ts2020_config.get_agc_pwm = m88ds3103_get_agc_pwm;
21572142 memset(&info, 0, sizeof(struct i2c_board_info));
2158
- strlcpy(info.type, "ts2020", I2C_NAME_SIZE);
2143
+ strscpy(info.type, "ts2020", I2C_NAME_SIZE);
21592144 info.addr = 0x60;
21602145 info.platform_data = &ts2020_config;
21612146 request_module(info.type);
2162
- client_tuner = i2c_new_device(adapter, &info);
2163
- if (client_tuner == NULL || client_tuner->dev.driver == NULL)
2147
+ client_tuner = i2c_new_client_device(adapter, &info);
2148
+ if (!i2c_client_has_driver(client_tuner))
21642149 goto frontend_detach;
21652150 if (!try_module_get(client_tuner->dev.driver->owner)) {
21662151 i2c_unregister_device(client_tuner);
....@@ -2200,12 +2185,12 @@
22002185 si2168_config.i2c_adapter = &adapter;
22012186 si2168_config.fe = &fe0->dvb.frontend;
22022187 memset(&info, 0, sizeof(struct i2c_board_info));
2203
- strlcpy(info.type, "si2168", I2C_NAME_SIZE);
2188
+ strscpy(info.type, "si2168", I2C_NAME_SIZE);
22042189 info.addr = 0x64;
22052190 info.platform_data = &si2168_config;
22062191 request_module(info.type);
2207
- client_demod = i2c_new_device(&i2c_bus->i2c_adap, &info);
2208
- if (client_demod == NULL || client_demod->dev.driver == NULL)
2192
+ client_demod = i2c_new_client_device(&i2c_bus->i2c_adap, &info);
2193
+ if (!i2c_client_has_driver(client_demod))
22092194 goto frontend_detach;
22102195 if (!try_module_get(client_demod->dev.driver->owner)) {
22112196 i2c_unregister_device(client_demod);
....@@ -2218,13 +2203,12 @@
22182203 si2157_config.fe = fe0->dvb.frontend;
22192204 si2157_config.if_port = 1;
22202205 memset(&info, 0, sizeof(struct i2c_board_info));
2221
- strlcpy(info.type, "si2157", I2C_NAME_SIZE);
2206
+ strscpy(info.type, "si2157", I2C_NAME_SIZE);
22222207 info.addr = 0x60;
22232208 info.platform_data = &si2157_config;
22242209 request_module(info.type);
2225
- client_tuner = i2c_new_device(adapter, &info);
2226
- if (client_tuner == NULL ||
2227
- client_tuner->dev.driver == NULL)
2210
+ client_tuner = i2c_new_client_device(adapter, &info);
2211
+ if (!i2c_client_has_driver(client_tuner))
22282212 goto frontend_detach;
22292213 if (!try_module_get(client_tuner->dev.driver->owner)) {
22302214 i2c_unregister_device(client_tuner);
....@@ -2251,12 +2235,12 @@
22512235 /* attach SEC */
22522236 a8293_pdata.dvb_frontend = fe0->dvb.frontend;
22532237 memset(&info, 0, sizeof(info));
2254
- strlcpy(info.type, "a8293", I2C_NAME_SIZE);
2238
+ strscpy(info.type, "a8293", I2C_NAME_SIZE);
22552239 info.addr = 0x0b;
22562240 info.platform_data = &a8293_pdata;
22572241 request_module("a8293");
2258
- client_sec = i2c_new_device(&i2c_bus->i2c_adap, &info);
2259
- if (!client_sec || !client_sec->dev.driver)
2242
+ client_sec = i2c_new_client_device(&i2c_bus->i2c_adap, &info);
2243
+ if (!i2c_client_has_driver(client_sec))
22602244 goto frontend_detach;
22612245 if (!try_module_get(client_sec->dev.driver->owner)) {
22622246 i2c_unregister_device(client_sec);
....@@ -2268,12 +2252,12 @@
22682252 memset(&m88rs6000t_config, 0, sizeof(m88rs6000t_config));
22692253 m88rs6000t_config.fe = fe0->dvb.frontend;
22702254 memset(&info, 0, sizeof(struct i2c_board_info));
2271
- strlcpy(info.type, "m88rs6000t", I2C_NAME_SIZE);
2255
+ strscpy(info.type, "m88rs6000t", I2C_NAME_SIZE);
22722256 info.addr = 0x21;
22732257 info.platform_data = &m88rs6000t_config;
22742258 request_module("%s", info.type);
2275
- client_tuner = i2c_new_device(adapter, &info);
2276
- if (!client_tuner || !client_tuner->dev.driver)
2259
+ client_tuner = i2c_new_client_device(adapter, &info);
2260
+ if (!i2c_client_has_driver(client_tuner))
22772261 goto frontend_detach;
22782262 if (!try_module_get(client_tuner->dev.driver->owner)) {
22792263 i2c_unregister_device(client_tuner);
....@@ -2293,12 +2277,12 @@
22932277 si2168_config.fe = &fe0->dvb.frontend;
22942278 si2168_config.ts_mode = SI2168_TS_SERIAL;
22952279 memset(&info, 0, sizeof(struct i2c_board_info));
2296
- strlcpy(info.type, "si2168", I2C_NAME_SIZE);
2280
+ strscpy(info.type, "si2168", I2C_NAME_SIZE);
22972281 info.addr = 0x64;
22982282 info.platform_data = &si2168_config;
22992283 request_module("%s", info.type);
2300
- client_demod = i2c_new_device(&i2c_bus->i2c_adap, &info);
2301
- if (!client_demod || !client_demod->dev.driver)
2284
+ client_demod = i2c_new_client_device(&i2c_bus->i2c_adap, &info);
2285
+ if (!i2c_client_has_driver(client_demod))
23022286 goto frontend_detach;
23032287 if (!try_module_get(client_demod->dev.driver->owner)) {
23042288 i2c_unregister_device(client_demod);
....@@ -2311,12 +2295,12 @@
23112295 si2157_config.fe = fe0->dvb.frontend;
23122296 si2157_config.if_port = 1;
23132297 memset(&info, 0, sizeof(struct i2c_board_info));
2314
- strlcpy(info.type, "si2157", I2C_NAME_SIZE);
2298
+ strscpy(info.type, "si2157", I2C_NAME_SIZE);
23152299 info.addr = 0x60;
23162300 info.platform_data = &si2157_config;
23172301 request_module("%s", info.type);
2318
- client_tuner = i2c_new_device(&i2c_bus2->i2c_adap, &info);
2319
- if (!client_tuner || !client_tuner->dev.driver) {
2302
+ client_tuner = i2c_new_client_device(&i2c_bus2->i2c_adap, &info);
2303
+ if (!i2c_client_has_driver(client_tuner)) {
23202304 module_put(client_demod->dev.driver->owner);
23212305 i2c_unregister_device(client_demod);
23222306 port->i2c_client_demod = NULL;
....@@ -2330,6 +2314,12 @@
23302314 goto frontend_detach;
23312315 }
23322316 port->i2c_client_tuner = client_tuner;
2317
+
2318
+ dev->ts1.analog_fe.tuner_priv = client_tuner;
2319
+ memcpy(&dev->ts1.analog_fe.ops.tuner_ops,
2320
+ &fe0->dvb.frontend->ops.tuner_ops,
2321
+ sizeof(struct dvb_tuner_ops));
2322
+
23332323 break;
23342324 }
23352325 break;
....@@ -2346,12 +2336,12 @@
23462336 si2168_config.fe = &fe0->dvb.frontend;
23472337 si2168_config.ts_mode = SI2168_TS_SERIAL;
23482338 memset(&info, 0, sizeof(struct i2c_board_info));
2349
- strlcpy(info.type, "si2168", I2C_NAME_SIZE);
2339
+ strscpy(info.type, "si2168", I2C_NAME_SIZE);
23502340 info.addr = 0x64;
23512341 info.platform_data = &si2168_config;
23522342 request_module("%s", info.type);
2353
- client_demod = i2c_new_device(&dev->i2c_bus[0].i2c_adap, &info);
2354
- if (!client_demod || !client_demod->dev.driver)
2343
+ client_demod = i2c_new_client_device(&dev->i2c_bus[0].i2c_adap, &info);
2344
+ if (!i2c_client_has_driver(client_demod))
23552345 goto frontend_detach;
23562346 if (!try_module_get(client_demod->dev.driver->owner)) {
23572347 i2c_unregister_device(client_demod);
....@@ -2364,12 +2354,12 @@
23642354 si2157_config.fe = fe0->dvb.frontend;
23652355 si2157_config.if_port = 1;
23662356 memset(&info, 0, sizeof(struct i2c_board_info));
2367
- strlcpy(info.type, "si2157", I2C_NAME_SIZE);
2357
+ strscpy(info.type, "si2157", I2C_NAME_SIZE);
23682358 info.addr = 0x60;
23692359 info.platform_data = &si2157_config;
23702360 request_module("%s", info.type);
2371
- client_tuner = i2c_new_device(&dev->i2c_bus[1].i2c_adap, &info);
2372
- if (!client_tuner || !client_tuner->dev.driver) {
2361
+ client_tuner = i2c_new_client_device(&dev->i2c_bus[1].i2c_adap, &info);
2362
+ if (!i2c_client_has_driver(client_tuner)) {
23732363 module_put(client_demod->dev.driver->owner);
23742364 i2c_unregister_device(client_demod);
23752365 port->i2c_client_demod = NULL;
....@@ -2383,6 +2373,16 @@
23832373 goto frontend_detach;
23842374 }
23852375 port->i2c_client_tuner = client_tuner;
2376
+
2377
+ /* we only attach tuner for analog on the 888 version */
2378
+ if (dev->board == CX23885_BOARD_HAUPPAUGE_QUADHD_DVB) {
2379
+ pr_info("%s(): QUADHD_DVB analog setup\n",
2380
+ __func__);
2381
+ dev->ts1.analog_fe.tuner_priv = client_tuner;
2382
+ memcpy(&dev->ts1.analog_fe.ops.tuner_ops,
2383
+ &fe0->dvb.frontend->ops.tuner_ops,
2384
+ sizeof(struct dvb_tuner_ops));
2385
+ }
23862386 break;
23872387
23882388 /* port c - terrestrial/cable */
....@@ -2393,12 +2393,12 @@
23932393 si2168_config.fe = &fe0->dvb.frontend;
23942394 si2168_config.ts_mode = SI2168_TS_SERIAL;
23952395 memset(&info, 0, sizeof(struct i2c_board_info));
2396
- strlcpy(info.type, "si2168", I2C_NAME_SIZE);
2396
+ strscpy(info.type, "si2168", I2C_NAME_SIZE);
23972397 info.addr = 0x66;
23982398 info.platform_data = &si2168_config;
23992399 request_module("%s", info.type);
2400
- client_demod = i2c_new_device(&dev->i2c_bus[0].i2c_adap, &info);
2401
- if (!client_demod || !client_demod->dev.driver)
2400
+ client_demod = i2c_new_client_device(&dev->i2c_bus[0].i2c_adap, &info);
2401
+ if (!i2c_client_has_driver(client_demod))
24022402 goto frontend_detach;
24032403 if (!try_module_get(client_demod->dev.driver->owner)) {
24042404 i2c_unregister_device(client_demod);
....@@ -2411,12 +2411,12 @@
24112411 si2157_config.fe = fe0->dvb.frontend;
24122412 si2157_config.if_port = 1;
24132413 memset(&info, 0, sizeof(struct i2c_board_info));
2414
- strlcpy(info.type, "si2157", I2C_NAME_SIZE);
2414
+ strscpy(info.type, "si2157", I2C_NAME_SIZE);
24152415 info.addr = 0x62;
24162416 info.platform_data = &si2157_config;
24172417 request_module("%s", info.type);
2418
- client_tuner = i2c_new_device(&dev->i2c_bus[1].i2c_adap, &info);
2419
- if (!client_tuner || !client_tuner->dev.driver) {
2418
+ client_tuner = i2c_new_client_device(&dev->i2c_bus[1].i2c_adap, &info);
2419
+ if (!i2c_client_has_driver(client_tuner)) {
24202420 module_put(client_demod->dev.driver->owner);
24212421 i2c_unregister_device(client_demod);
24222422 port->i2c_client_demod = NULL;
....@@ -2453,25 +2453,29 @@
24532453 si2157_config.if_port = 1;
24542454 si2157_config.inversion = 1;
24552455 memset(&info, 0, sizeof(struct i2c_board_info));
2456
- strlcpy(info.type, "si2157", I2C_NAME_SIZE);
2456
+ strscpy(info.type, "si2157", I2C_NAME_SIZE);
24572457 info.addr = 0x60;
24582458 info.platform_data = &si2157_config;
24592459 request_module("%s", info.type);
2460
- client_tuner = i2c_new_device(&dev->i2c_bus[1].i2c_adap, &info);
2461
- if (!client_tuner || !client_tuner->dev.driver) {
2462
- module_put(client_demod->dev.driver->owner);
2463
- i2c_unregister_device(client_demod);
2464
- port->i2c_client_demod = NULL;
2460
+ client_tuner = i2c_new_client_device(&dev->i2c_bus[1].i2c_adap, &info);
2461
+ if (!i2c_client_has_driver(client_tuner)) {
24652462 goto frontend_detach;
24662463 }
24672464 if (!try_module_get(client_tuner->dev.driver->owner)) {
24682465 i2c_unregister_device(client_tuner);
2469
- module_put(client_demod->dev.driver->owner);
2470
- i2c_unregister_device(client_demod);
2471
- port->i2c_client_demod = NULL;
24722466 goto frontend_detach;
24732467 }
24742468 port->i2c_client_tuner = client_tuner;
2469
+
2470
+ /* we only attach tuner for analog on the 888 version */
2471
+ if (dev->board == CX23885_BOARD_HAUPPAUGE_QUADHD_ATSC) {
2472
+ pr_info("%s(): QUADHD_ATSC analog setup\n",
2473
+ __func__);
2474
+ dev->ts1.analog_fe.tuner_priv = client_tuner;
2475
+ memcpy(&dev->ts1.analog_fe.ops.tuner_ops,
2476
+ &fe0->dvb.frontend->ops.tuner_ops,
2477
+ sizeof(struct dvb_tuner_ops));
2478
+ }
24752479 break;
24762480
24772481 /* port c - terrestrial/cable */
....@@ -2489,22 +2493,16 @@
24892493 si2157_config.if_port = 1;
24902494 si2157_config.inversion = 1;
24912495 memset(&info, 0, sizeof(struct i2c_board_info));
2492
- strlcpy(info.type, "si2157", I2C_NAME_SIZE);
2496
+ strscpy(info.type, "si2157", I2C_NAME_SIZE);
24932497 info.addr = 0x62;
24942498 info.platform_data = &si2157_config;
24952499 request_module("%s", info.type);
2496
- client_tuner = i2c_new_device(&dev->i2c_bus[1].i2c_adap, &info);
2497
- if (!client_tuner || !client_tuner->dev.driver) {
2498
- module_put(client_demod->dev.driver->owner);
2499
- i2c_unregister_device(client_demod);
2500
- port->i2c_client_demod = NULL;
2500
+ client_tuner = i2c_new_client_device(&dev->i2c_bus[1].i2c_adap, &info);
2501
+ if (!i2c_client_has_driver(client_tuner)) {
25012502 goto frontend_detach;
25022503 }
25032504 if (!try_module_get(client_tuner->dev.driver->owner)) {
25042505 i2c_unregister_device(client_tuner);
2505
- module_put(client_demod->dev.driver->owner);
2506
- i2c_unregister_device(client_demod);
2507
- port->i2c_client_demod = NULL;
25082506 goto frontend_detach;
25092507 }
25102508 port->i2c_client_tuner = client_tuner;
....@@ -2529,12 +2527,12 @@
25292527 si2157_config.if_port = 1;
25302528 si2157_config.inversion = 1;
25312529 memset(&info, 0, sizeof(struct i2c_board_info));
2532
- strlcpy(info.type, "si2157", I2C_NAME_SIZE);
2530
+ strscpy(info.type, "si2157", I2C_NAME_SIZE);
25332531 info.addr = 0x60;
25342532 info.platform_data = &si2157_config;
25352533 request_module("%s", info.type);
2536
- client_tuner = i2c_new_device(&dev->i2c_bus[1].i2c_adap, &info);
2537
- if (!client_tuner || !client_tuner->dev.driver)
2534
+ client_tuner = i2c_new_client_device(&dev->i2c_bus[1].i2c_adap, &info);
2535
+ if (!i2c_client_has_driver(client_tuner))
25382536 goto frontend_detach;
25392537
25402538 if (!try_module_get(client_tuner->dev.driver->owner)) {
....@@ -2543,6 +2541,11 @@
25432541 goto frontend_detach;
25442542 }
25452543 port->i2c_client_tuner = client_tuner;
2544
+
2545
+ dev->ts1.analog_fe.tuner_priv = client_tuner;
2546
+ memcpy(&dev->ts1.analog_fe.ops.tuner_ops,
2547
+ &fe0->dvb.frontend->ops.tuner_ops,
2548
+ sizeof(struct dvb_tuner_ops));
25462549 break;
25472550 }
25482551 break;
....@@ -2656,8 +2659,6 @@
26562659 dev->name,
26572660 dev->pci_bus,
26582661 dev->pci_slot);
2659
-
2660
- err = -ENODEV;
26612662
26622663 /* dvb stuff */
26632664 /* We have to init the queue for each frontend on a port. */