diff options
author | nibble.max <nibble.max@gmail.com> | 2014-10-23 06:01:44 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@osg.samsung.com> | 2014-11-03 08:51:28 -0500 |
commit | 0e6c7b0117214295c8abe05985a146faa914fcc4 (patch) | |
tree | 59d0c5018681531b5fd9a533262aa988512cc598 /drivers/media/pci | |
parent | 24d333f387e457a98d1551dd43d716700218f6b5 (diff) |
[media] cx23885: add DVBSky S950C dvb-s/s2 ci PCIe card support(no RC)
DVBSky s950ci dvb-s/s2 ci PCIe card:
1>dvb frontend: M88TS2022(tuner),M88DS3103(demod)
2>ci controller: CIMAX SP2 or its clone.
3>PCIe bridge: CX23885
The patchs are based on the following patchs.
Olli Salonen submit:
https://patchwork.linuxtv.org/patch/26180/
https://patchwork.linuxtv.org/patch/26183/
https://patchwork.linuxtv.org/patch/26324/
Nibble Max submit:
https://patchwork.linuxtv.org/patch/26207/
Signed-off-by: Nibble Max <nibble.max@gmail.com>
Reviewed-by: Olli Salonen <olli.salonen@iki.fi>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
Diffstat (limited to 'drivers/media/pci')
-rw-r--r-- | drivers/media/pci/cx23885/cx23885-cards.c | 11 | ||||
-rw-r--r-- | drivers/media/pci/cx23885/cx23885-dvb.c | 79 | ||||
-rw-r--r-- | drivers/media/pci/cx23885/cx23885.h | 1 |
3 files changed, 80 insertions, 11 deletions
diff --git a/drivers/media/pci/cx23885/cx23885-cards.c b/drivers/media/pci/cx23885/cx23885-cards.c index c4a69e404c3b..ac34c27c8205 100644 --- a/drivers/media/pci/cx23885/cx23885-cards.c +++ b/drivers/media/pci/cx23885/cx23885-cards.c | |||
@@ -684,6 +684,10 @@ struct cx23885_board cx23885_boards[] = { | |||
684 | .name = "DVBSky T980C", | 684 | .name = "DVBSky T980C", |
685 | .portb = CX23885_MPEG_DVB, | 685 | .portb = CX23885_MPEG_DVB, |
686 | }, | 686 | }, |
687 | [CX23885_BOARD_DVBSKY_S950C] = { | ||
688 | .name = "DVBSky S950C", | ||
689 | .portb = CX23885_MPEG_DVB, | ||
690 | }, | ||
687 | }; | 691 | }; |
688 | const unsigned int cx23885_bcount = ARRAY_SIZE(cx23885_boards); | 692 | const unsigned int cx23885_bcount = ARRAY_SIZE(cx23885_boards); |
689 | 693 | ||
@@ -947,6 +951,10 @@ struct cx23885_subid cx23885_subids[] = { | |||
947 | .subvendor = 0x4254, | 951 | .subvendor = 0x4254, |
948 | .subdevice = 0x980c, | 952 | .subdevice = 0x980c, |
949 | .card = CX23885_BOARD_DVBSKY_T980C, | 953 | .card = CX23885_BOARD_DVBSKY_T980C, |
954 | }, { | ||
955 | .subvendor = 0x4254, | ||
956 | .subdevice = 0x950c, | ||
957 | .card = CX23885_BOARD_DVBSKY_S950C, | ||
950 | }, | 958 | }, |
951 | }; | 959 | }; |
952 | const unsigned int cx23885_idcount = ARRAY_SIZE(cx23885_subids); | 960 | const unsigned int cx23885_idcount = ARRAY_SIZE(cx23885_subids); |
@@ -1550,6 +1558,7 @@ void cx23885_gpio_setup(struct cx23885_dev *dev) | |||
1550 | cx23885_gpio_set(dev, GPIO_2 | GPIO_11); | 1558 | cx23885_gpio_set(dev, GPIO_2 | GPIO_11); |
1551 | break; | 1559 | break; |
1552 | case CX23885_BOARD_DVBSKY_T980C: | 1560 | case CX23885_BOARD_DVBSKY_T980C: |
1561 | case CX23885_BOARD_DVBSKY_S950C: | ||
1553 | /* | 1562 | /* |
1554 | * GPIO-0 INTA from CiMax, input | 1563 | * GPIO-0 INTA from CiMax, input |
1555 | * GPIO-1 reset CiMax, output, high active | 1564 | * GPIO-1 reset CiMax, output, high active |
@@ -1859,6 +1868,7 @@ void cx23885_card_setup(struct cx23885_dev *dev) | |||
1859 | case CX23885_BOARD_DVBWORLD_2005: | 1868 | case CX23885_BOARD_DVBWORLD_2005: |
1860 | case CX23885_BOARD_PROF_8000: | 1869 | case CX23885_BOARD_PROF_8000: |
1861 | case CX23885_BOARD_DVBSKY_T980C: | 1870 | case CX23885_BOARD_DVBSKY_T980C: |
1871 | case CX23885_BOARD_DVBSKY_S950C: | ||
1862 | ts1->gen_ctrl_val = 0x5; /* Parallel */ | 1872 | ts1->gen_ctrl_val = 0x5; /* Parallel */ |
1863 | ts1->ts_clk_en_val = 0x1; /* Enable TS_CLK */ | 1873 | ts1->ts_clk_en_val = 0x1; /* Enable TS_CLK */ |
1864 | ts1->src_sel_val = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO; | 1874 | ts1->src_sel_val = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO; |
@@ -1978,6 +1988,7 @@ void cx23885_card_setup(struct cx23885_dev *dev) | |||
1978 | case CX23885_BOARD_TBS_6981: | 1988 | case CX23885_BOARD_TBS_6981: |
1979 | case CX23885_BOARD_DVBSKY_T9580: | 1989 | case CX23885_BOARD_DVBSKY_T9580: |
1980 | case CX23885_BOARD_DVBSKY_T980C: | 1990 | case CX23885_BOARD_DVBSKY_T980C: |
1991 | case CX23885_BOARD_DVBSKY_S950C: | ||
1981 | dev->sd_cx25840 = v4l2_i2c_new_subdev(&dev->v4l2_dev, | 1992 | dev->sd_cx25840 = v4l2_i2c_new_subdev(&dev->v4l2_dev, |
1982 | &dev->i2c_bus[2].i2c_adap, | 1993 | &dev->i2c_bus[2].i2c_adap, |
1983 | "cx25840", 0x88 >> 1, NULL); | 1994 | "cx25840", 0x88 >> 1, NULL); |
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; |
diff --git a/drivers/media/pci/cx23885/cx23885.h b/drivers/media/pci/cx23885/cx23885.h index 27ea249d07cf..f6f6974ee824 100644 --- a/drivers/media/pci/cx23885/cx23885.h +++ b/drivers/media/pci/cx23885/cx23885.h | |||
@@ -94,6 +94,7 @@ | |||
94 | #define CX23885_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL_EXP2 44 | 94 | #define CX23885_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL_EXP2 44 |
95 | #define CX23885_BOARD_DVBSKY_T9580 45 | 95 | #define CX23885_BOARD_DVBSKY_T9580 45 |
96 | #define CX23885_BOARD_DVBSKY_T980C 46 | 96 | #define CX23885_BOARD_DVBSKY_T980C 46 |
97 | #define CX23885_BOARD_DVBSKY_S950C 47 | ||
97 | 98 | ||
98 | #define GPIO_0 0x00000001 | 99 | #define GPIO_0 0x00000001 |
99 | #define GPIO_1 0x00000002 | 100 | #define GPIO_1 0x00000002 |