diff options
Diffstat (limited to 'drivers/media/pci/cx23885/cx23885-dvb.c')
-rw-r--r-- | drivers/media/pci/cx23885/cx23885-dvb.c | 79 |
1 files changed, 68 insertions, 11 deletions
diff --git a/drivers/media/pci/cx23885/cx23885-dvb.c b/drivers/media/pci/cx23885/cx23885-dvb.c index 757854914781..f82eb1881ac2 100644 --- a/drivers/media/pci/cx23885/cx23885-dvb.c +++ b/drivers/media/pci/cx23885/cx23885-dvb.c | |||
@@ -635,7 +635,7 @@ static int cx23885_sp2_ci_ctrl(void *priv, u8 read, int addr, | |||
635 | struct cx23885_tsport *port = priv; | 635 | struct cx23885_tsport *port = priv; |
636 | struct cx23885_dev *dev = port->dev; | 636 | struct cx23885_dev *dev = port->dev; |
637 | int ret; | 637 | int ret; |
638 | int tmp; | 638 | int tmp = 0; |
639 | unsigned long timeout; | 639 | unsigned long timeout; |
640 | 640 | ||
641 | mutex_lock(&dev->gpio_lock); | 641 | mutex_lock(&dev->gpio_lock); |
@@ -865,6 +865,19 @@ static const struct m88ds3103_config dvbsky_t9580_m88ds3103_config = { | |||
865 | .agc = 0x99, | 865 | .agc = 0x99, |
866 | }; | 866 | }; |
867 | 867 | ||
868 | static const struct m88ds3103_config dvbsky_s950c_m88ds3103_config = { | ||
869 | .i2c_addr = 0x68, | ||
870 | .clock = 27000000, | ||
871 | .i2c_wr_max = 33, | ||
872 | .clock_out = 0, | ||
873 | .ts_mode = M88DS3103_TS_CI, | ||
874 | .ts_clk = 10000, | ||
875 | .ts_clk_pol = 1, | ||
876 | .lnb_en_pol = 1, | ||
877 | .lnb_hv_pol = 0, | ||
878 | .agc = 0x99, | ||
879 | }; | ||
880 | |||
868 | static int netup_altera_fpga_rw(void *device, int flag, int data, int read) | 881 | static int netup_altera_fpga_rw(void *device, int flag, int data, int read) |
869 | { | 882 | { |
870 | struct cx23885_dev *dev = (struct cx23885_dev *)device; | 883 | struct cx23885_dev *dev = (struct cx23885_dev *)device; |
@@ -1020,7 +1033,7 @@ static int dvb_register(struct cx23885_tsport *port) | |||
1020 | struct m88ts2022_config m88ts2022_config; | 1033 | struct m88ts2022_config m88ts2022_config; |
1021 | struct i2c_board_info info; | 1034 | struct i2c_board_info info; |
1022 | struct i2c_adapter *adapter; | 1035 | struct i2c_adapter *adapter; |
1023 | struct i2c_client *client_demod, *client_tuner, *client_ci; | 1036 | struct i2c_client *client_demod = NULL, *client_tuner = NULL, *client_ci = NULL; |
1024 | int mfe_shared = 0; /* bus not shared by default */ | 1037 | int mfe_shared = 0; /* bus not shared by default */ |
1025 | int ret; | 1038 | int ret; |
1026 | 1039 | ||
@@ -1799,6 +1812,41 @@ static int dvb_register(struct cx23885_tsport *port) | |||
1799 | } | 1812 | } |
1800 | port->i2c_client_tuner = client_tuner; | 1813 | port->i2c_client_tuner = client_tuner; |
1801 | break; | 1814 | break; |
1815 | case CX23885_BOARD_DVBSKY_S950C: | ||
1816 | i2c_bus = &dev->i2c_bus[1]; | ||
1817 | i2c_bus2 = &dev->i2c_bus[0]; | ||
1818 | |||
1819 | /* attach frontend */ | ||
1820 | fe0->dvb.frontend = dvb_attach(m88ds3103_attach, | ||
1821 | &dvbsky_s950c_m88ds3103_config, | ||
1822 | &i2c_bus->i2c_adap, &adapter); | ||
1823 | if (fe0->dvb.frontend == NULL) | ||
1824 | break; | ||
1825 | |||
1826 | /* attach tuner */ | ||
1827 | memset(&m88ts2022_config, 0, sizeof(m88ts2022_config)); | ||
1828 | m88ts2022_config.fe = fe0->dvb.frontend; | ||
1829 | m88ts2022_config.clock = 27000000; | ||
1830 | memset(&info, 0, sizeof(struct i2c_board_info)); | ||
1831 | strlcpy(info.type, "m88ts2022", I2C_NAME_SIZE); | ||
1832 | info.addr = 0x60; | ||
1833 | info.platform_data = &m88ts2022_config; | ||
1834 | request_module(info.type); | ||
1835 | client_tuner = i2c_new_device(adapter, &info); | ||
1836 | if (client_tuner == NULL || | ||
1837 | client_tuner->dev.driver == NULL) | ||
1838 | goto frontend_detach; | ||
1839 | if (!try_module_get(client_tuner->dev.driver->owner)) { | ||
1840 | i2c_unregister_device(client_tuner); | ||
1841 | goto frontend_detach; | ||
1842 | } | ||
1843 | |||
1844 | /* delegate signal strength measurement to tuner */ | ||
1845 | fe0->dvb.frontend->ops.read_signal_strength = | ||
1846 | fe0->dvb.frontend->ops.tuner_ops.get_rf_strength; | ||
1847 | |||
1848 | port->i2c_client_tuner = client_tuner; | ||
1849 | break; | ||
1802 | default: | 1850 | default: |
1803 | printk(KERN_INFO "%s: The frontend of your DVB/ATSC card " | 1851 | printk(KERN_INFO "%s: The frontend of your DVB/ATSC card " |
1804 | " isn't supported yet\n", | 1852 | " isn't supported yet\n", |
@@ -1889,6 +1937,7 @@ static int dvb_register(struct cx23885_tsport *port) | |||
1889 | (port->nr-1) * 8, 6); | 1937 | (port->nr-1) * 8, 6); |
1890 | break; | 1938 | break; |
1891 | } | 1939 | } |
1940 | case CX23885_BOARD_DVBSKY_S950C: | ||
1892 | case CX23885_BOARD_DVBSKY_T980C: { | 1941 | case CX23885_BOARD_DVBSKY_T980C: { |
1893 | u8 eeprom[256]; /* 24C02 i2c eeprom */ | 1942 | u8 eeprom[256]; /* 24C02 i2c eeprom */ |
1894 | 1943 | ||
@@ -1905,18 +1954,26 @@ static int dvb_register(struct cx23885_tsport *port) | |||
1905 | client_ci = i2c_new_device(&i2c_bus2->i2c_adap, &info); | 1954 | client_ci = i2c_new_device(&i2c_bus2->i2c_adap, &info); |
1906 | if (client_ci == NULL || | 1955 | if (client_ci == NULL || |
1907 | client_ci->dev.driver == NULL) { | 1956 | client_ci->dev.driver == NULL) { |
1908 | module_put(client_tuner->dev.driver->owner); | 1957 | if (client_tuner) { |
1909 | i2c_unregister_device(client_tuner); | 1958 | module_put(client_tuner->dev.driver->owner); |
1910 | module_put(client_demod->dev.driver->owner); | 1959 | i2c_unregister_device(client_tuner); |
1911 | i2c_unregister_device(client_demod); | 1960 | } |
1961 | if (client_demod) { | ||
1962 | module_put(client_demod->dev.driver->owner); | ||
1963 | i2c_unregister_device(client_demod); | ||
1964 | } | ||
1912 | goto frontend_detach; | 1965 | goto frontend_detach; |
1913 | } | 1966 | } |
1914 | if (!try_module_get(client_ci->dev.driver->owner)) { | 1967 | if (!try_module_get(client_ci->dev.driver->owner)) { |
1915 | i2c_unregister_device(client_ci); | 1968 | i2c_unregister_device(client_ci); |
1916 | module_put(client_tuner->dev.driver->owner); | 1969 | if (client_tuner) { |
1917 | i2c_unregister_device(client_tuner); | 1970 | module_put(client_tuner->dev.driver->owner); |
1918 | module_put(client_demod->dev.driver->owner); | 1971 | i2c_unregister_device(client_tuner); |
1919 | i2c_unregister_device(client_demod); | 1972 | } |
1973 | if (client_demod) { | ||
1974 | module_put(client_demod->dev.driver->owner); | ||
1975 | i2c_unregister_device(client_demod); | ||
1976 | } | ||
1920 | goto frontend_detach; | 1977 | goto frontend_detach; |
1921 | } | 1978 | } |
1922 | port->i2c_client_ci = client_ci; | 1979 | port->i2c_client_ci = client_ci; |
@@ -1928,7 +1985,7 @@ static int dvb_register(struct cx23885_tsport *port) | |||
1928 | dev->i2c_bus[0].i2c_client.addr = 0xa0 >> 1; | 1985 | dev->i2c_bus[0].i2c_client.addr = 0xa0 >> 1; |
1929 | tveeprom_read(&dev->i2c_bus[0].i2c_client, eeprom, | 1986 | tveeprom_read(&dev->i2c_bus[0].i2c_client, eeprom, |
1930 | sizeof(eeprom)); | 1987 | sizeof(eeprom)); |
1931 | printk(KERN_INFO "DVBSky T980C MAC address: %pM\n", | 1988 | printk(KERN_INFO "DVBSky T980C/S950C MAC address: %pM\n", |
1932 | eeprom + 0xc0); | 1989 | eeprom + 0xc0); |
1933 | memcpy(port->frontends.adapter.proposed_mac, eeprom + 0xc0, 6); | 1990 | memcpy(port->frontends.adapter.proposed_mac, eeprom + 0xc0, 6); |
1934 | break; | 1991 | break; |