diff options
author | Igor M. Liplianin <liplianin@me.by> | 2009-11-24 18:16:04 -0500 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2009-12-05 15:42:08 -0500 |
commit | 09ea33e5c696958e8b1ae6d5ab184476b16592f1 (patch) | |
tree | 2543aefab407abd23e1070e626c6f7a1333f83b5 /drivers/media/video/cx23885 | |
parent | 6afd2aa856eba0706176cecea1f989b1081c96dc (diff) |
V4L/DVB (13493): TeVii S470 and TBS 6920 fixes
The new hardware design applied for this cards.
Silicon Labs C8051F300 microcontroller is used for LNB power control.
It connected to cx23885 GPIO pins:
GPIO0 - P0.3 data
GPIO1 - P0.2 reset
GPIO2 - P0.1 clk
GPIO3 - P0.0 busy
Tevii S470 based on Montage Technology M88TS2020 digital satellite tuner
and M88DS3000 advanced DVB-S/S2 demodulator.
Signed-off-by: Igor M. Liplianin <liplianin@me.by>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/video/cx23885')
-rw-r--r-- | drivers/media/video/cx23885/Kconfig | 2 | ||||
-rw-r--r-- | drivers/media/video/cx23885/Makefile | 2 | ||||
-rw-r--r-- | drivers/media/video/cx23885/cx23885-cards.c | 14 | ||||
-rw-r--r-- | drivers/media/video/cx23885/cx23885-core.c | 20 | ||||
-rw-r--r-- | drivers/media/video/cx23885/cx23885-dvb.c | 38 | ||||
-rw-r--r-- | drivers/media/video/cx23885/cx23885-f300.c | 177 | ||||
-rw-r--r-- | drivers/media/video/cx23885/cx23885-f300.h | 2 | ||||
-rw-r--r-- | drivers/media/video/cx23885/cx23885.h | 1 |
8 files changed, 227 insertions, 29 deletions
diff --git a/drivers/media/video/cx23885/Kconfig b/drivers/media/video/cx23885/Kconfig index fd3fc3e3198a..bcdda9a9aa96 100644 --- a/drivers/media/video/cx23885/Kconfig +++ b/drivers/media/video/cx23885/Kconfig | |||
@@ -18,7 +18,9 @@ config VIDEO_CX23885 | |||
18 | select DVB_TDA10048 if !DVB_FE_CUSTOMISE | 18 | select DVB_TDA10048 if !DVB_FE_CUSTOMISE |
19 | select DVB_LNBP21 if !DVB_FE_CUSTOMISE | 19 | select DVB_LNBP21 if !DVB_FE_CUSTOMISE |
20 | select DVB_STV6110 if !DVB_FE_CUSTOMISE | 20 | select DVB_STV6110 if !DVB_FE_CUSTOMISE |
21 | select DVB_CX24116 if !DVB_FE_CUSTOMISE | ||
21 | select DVB_STV0900 if !DVB_FE_CUSTOMISE | 22 | select DVB_STV0900 if !DVB_FE_CUSTOMISE |
23 | select DVB_DS3000 if !DVB_FE_CUSTOMISE | ||
22 | select MEDIA_TUNER_MT2131 if !MEDIA_TUNER_CUSTOMISE | 24 | select MEDIA_TUNER_MT2131 if !MEDIA_TUNER_CUSTOMISE |
23 | select MEDIA_TUNER_XC2028 if !MEDIA_TUNER_CUSTOMISE | 25 | select MEDIA_TUNER_XC2028 if !MEDIA_TUNER_CUSTOMISE |
24 | select MEDIA_TUNER_TDA8290 if !MEDIA_TUNER_CUSTOMISE | 26 | select MEDIA_TUNER_TDA8290 if !MEDIA_TUNER_CUSTOMISE |
diff --git a/drivers/media/video/cx23885/Makefile b/drivers/media/video/cx23885/Makefile index bb462589b53b..5787ae243631 100644 --- a/drivers/media/video/cx23885/Makefile +++ b/drivers/media/video/cx23885/Makefile | |||
@@ -1,7 +1,7 @@ | |||
1 | cx23885-objs := cx23885-cards.o cx23885-video.o cx23885-vbi.o \ | 1 | cx23885-objs := cx23885-cards.o cx23885-video.o cx23885-vbi.o \ |
2 | cx23885-core.o cx23885-i2c.o cx23885-dvb.o cx23885-417.o \ | 2 | cx23885-core.o cx23885-i2c.o cx23885-dvb.o cx23885-417.o \ |
3 | cx23885-ioctl.o cx23885-ir.o cx23885-input.o cx23888-ir.o \ | 3 | cx23885-ioctl.o cx23885-ir.o cx23885-input.o cx23888-ir.o \ |
4 | netup-init.o cimax2.o netup-eeprom.o | 4 | netup-init.o cimax2.o netup-eeprom.o cx23885-f300.o |
5 | 5 | ||
6 | obj-$(CONFIG_VIDEO_CX23885) += cx23885.o | 6 | obj-$(CONFIG_VIDEO_CX23885) += cx23885.o |
7 | 7 | ||
diff --git a/drivers/media/video/cx23885/cx23885-cards.c b/drivers/media/video/cx23885/cx23885-cards.c index 23302ddf4187..1ec48169277d 100644 --- a/drivers/media/video/cx23885/cx23885-cards.c +++ b/drivers/media/video/cx23885/cx23885-cards.c | |||
@@ -782,10 +782,14 @@ void cx23885_gpio_setup(struct cx23885_dev *dev) | |||
782 | cx_set(GP0_IO, 0x00040004); | 782 | cx_set(GP0_IO, 0x00040004); |
783 | break; | 783 | break; |
784 | case CX23885_BOARD_TBS_6920: | 784 | case CX23885_BOARD_TBS_6920: |
785 | case CX23885_BOARD_TEVII_S470: | ||
786 | cx_write(MC417_CTL, 0x00000036); | 785 | cx_write(MC417_CTL, 0x00000036); |
787 | cx_write(MC417_OEN, 0x00001000); | 786 | cx_write(MC417_OEN, 0x00001000); |
788 | cx_write(MC417_RWD, 0x00001800); | 787 | cx_set(MC417_RWD, 0x00000002); |
788 | mdelay(200); | ||
789 | cx_clear(MC417_RWD, 0x00000800); | ||
790 | mdelay(200); | ||
791 | cx_set(MC417_RWD, 0x00000800); | ||
792 | mdelay(200); | ||
789 | break; | 793 | break; |
790 | case CX23885_BOARD_NETUP_DUAL_DVBS2_CI: | 794 | case CX23885_BOARD_NETUP_DUAL_DVBS2_CI: |
791 | /* GPIO-0 INTA from CiMax1 | 795 | /* GPIO-0 INTA from CiMax1 |
@@ -1002,8 +1006,12 @@ void cx23885_card_setup(struct cx23885_dev *dev) | |||
1002 | ts2->ts_clk_en_val = 0x1; /* Enable TS_CLK */ | 1006 | ts2->ts_clk_en_val = 0x1; /* Enable TS_CLK */ |
1003 | ts2->src_sel_val = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO; | 1007 | ts2->src_sel_val = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO; |
1004 | break; | 1008 | break; |
1005 | case CX23885_BOARD_TEVII_S470: | ||
1006 | case CX23885_BOARD_TBS_6920: | 1009 | case CX23885_BOARD_TBS_6920: |
1010 | ts1->gen_ctrl_val = 0x4; /* Parallel */ | ||
1011 | ts1->ts_clk_en_val = 0x1; /* Enable TS_CLK */ | ||
1012 | ts1->src_sel_val = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO; | ||
1013 | break; | ||
1014 | case CX23885_BOARD_TEVII_S470: | ||
1007 | case CX23885_BOARD_DVBWORLD_2005: | 1015 | case CX23885_BOARD_DVBWORLD_2005: |
1008 | ts1->gen_ctrl_val = 0x5; /* Parallel */ | 1016 | ts1->gen_ctrl_val = 0x5; /* Parallel */ |
1009 | ts1->ts_clk_en_val = 0x1; /* Enable TS_CLK */ | 1017 | ts1->ts_clk_en_val = 0x1; /* Enable TS_CLK */ |
diff --git a/drivers/media/video/cx23885/cx23885-core.c b/drivers/media/video/cx23885/cx23885-core.c index e8eb4ec0c30a..04b12d27bc13 100644 --- a/drivers/media/video/cx23885/cx23885-core.c +++ b/drivers/media/video/cx23885/cx23885-core.c | |||
@@ -1871,6 +1871,26 @@ void cx23885_gpio_clear(struct cx23885_dev *dev, u32 mask) | |||
1871 | printk(KERN_INFO "%s: Unsupported\n", dev->name); | 1871 | printk(KERN_INFO "%s: Unsupported\n", dev->name); |
1872 | } | 1872 | } |
1873 | 1873 | ||
1874 | u32 cx23885_gpio_get(struct cx23885_dev *dev, u32 mask) | ||
1875 | { | ||
1876 | if (mask & 0x00000007) | ||
1877 | return (cx_read(GP0_IO) >> 8) & mask & 0x7; | ||
1878 | |||
1879 | if (mask & 0x0007fff8) { | ||
1880 | if (encoder_on_portb(dev) || encoder_on_portc(dev)) | ||
1881 | printk(KERN_ERR | ||
1882 | "%s: Reading GPIO moving on encoder ports\n", | ||
1883 | dev->name); | ||
1884 | return (cx_read(MC417_RWD) & ((mask & 0x7fff8) >> 3)) << 3; | ||
1885 | } | ||
1886 | |||
1887 | /* TODO: 23-19 */ | ||
1888 | if (mask & 0x00f80000) | ||
1889 | printk(KERN_INFO "%s: Unsupported\n", dev->name); | ||
1890 | |||
1891 | return 0; | ||
1892 | } | ||
1893 | |||
1874 | void cx23885_gpio_enable(struct cx23885_dev *dev, u32 mask, int asoutput) | 1894 | void cx23885_gpio_enable(struct cx23885_dev *dev, u32 mask, int asoutput) |
1875 | { | 1895 | { |
1876 | if ((mask & 0x00000007) && asoutput) | 1896 | if ((mask & 0x00000007) && asoutput) |
diff --git a/drivers/media/video/cx23885/cx23885-dvb.c b/drivers/media/video/cx23885/cx23885-dvb.c index bf24e86293c6..2607de134fa6 100644 --- a/drivers/media/video/cx23885/cx23885-dvb.c +++ b/drivers/media/video/cx23885/cx23885-dvb.c | |||
@@ -56,6 +56,8 @@ | |||
56 | #include "netup-init.h" | 56 | #include "netup-init.h" |
57 | #include "lgdt3305.h" | 57 | #include "lgdt3305.h" |
58 | #include "atbm8830.h" | 58 | #include "atbm8830.h" |
59 | #include "ds3000.h" | ||
60 | #include "cx23885-f300.h" | ||
59 | 61 | ||
60 | static unsigned int debug; | 62 | static unsigned int debug; |
61 | 63 | ||
@@ -427,26 +429,12 @@ static struct stv6110_config netup_stv6110_tunerconfig_b = { | |||
427 | .gain = 8, /* +16 dB - maximum gain */ | 429 | .gain = 8, /* +16 dB - maximum gain */ |
428 | }; | 430 | }; |
429 | 431 | ||
430 | static int tbs_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t voltage) | ||
431 | { | ||
432 | struct cx23885_tsport *port = fe->dvb->priv; | ||
433 | struct cx23885_dev *dev = port->dev; | ||
434 | |||
435 | if (voltage == SEC_VOLTAGE_18) | ||
436 | cx_write(MC417_RWD, 0x00001e00);/* GPIO-13 high */ | ||
437 | else if (voltage == SEC_VOLTAGE_13) | ||
438 | cx_write(MC417_RWD, 0x00001a00);/* GPIO-13 low */ | ||
439 | else | ||
440 | cx_write(MC417_RWD, 0x00001800);/* GPIO-12 low */ | ||
441 | return 0; | ||
442 | } | ||
443 | |||
444 | static struct cx24116_config tbs_cx24116_config = { | 432 | static struct cx24116_config tbs_cx24116_config = { |
445 | .demod_address = 0x05, | 433 | .demod_address = 0x55, |
446 | }; | 434 | }; |
447 | 435 | ||
448 | static struct cx24116_config tevii_cx24116_config = { | 436 | static struct ds3000_config tevii_ds3000_config = { |
449 | .demod_address = 0x55, | 437 | .demod_address = 0x68, |
450 | }; | 438 | }; |
451 | 439 | ||
452 | static struct cx24116_config dvbworld_cx24116_config = { | 440 | static struct cx24116_config dvbworld_cx24116_config = { |
@@ -832,23 +820,23 @@ static int dvb_register(struct cx23885_tsport *port) | |||
832 | } | 820 | } |
833 | break; | 821 | break; |
834 | case CX23885_BOARD_TBS_6920: | 822 | case CX23885_BOARD_TBS_6920: |
835 | i2c_bus = &dev->i2c_bus[0]; | 823 | i2c_bus = &dev->i2c_bus[1]; |
836 | 824 | ||
837 | fe0->dvb.frontend = dvb_attach(cx24116_attach, | 825 | fe0->dvb.frontend = dvb_attach(cx24116_attach, |
838 | &tbs_cx24116_config, | 826 | &tbs_cx24116_config, |
839 | &i2c_bus->i2c_adap); | 827 | &i2c_bus->i2c_adap); |
840 | if (fe0->dvb.frontend != NULL) | 828 | if (fe0->dvb.frontend != NULL) |
841 | fe0->dvb.frontend->ops.set_voltage = tbs_set_voltage; | 829 | fe0->dvb.frontend->ops.set_voltage = f300_set_voltage; |
842 | 830 | ||
843 | break; | 831 | break; |
844 | case CX23885_BOARD_TEVII_S470: | 832 | case CX23885_BOARD_TEVII_S470: |
845 | i2c_bus = &dev->i2c_bus[1]; | 833 | i2c_bus = &dev->i2c_bus[1]; |
846 | 834 | ||
847 | fe0->dvb.frontend = dvb_attach(cx24116_attach, | 835 | fe0->dvb.frontend = dvb_attach(ds3000_attach, |
848 | &tevii_cx24116_config, | 836 | &tevii_ds3000_config, |
849 | &i2c_bus->i2c_adap); | 837 | &i2c_bus->i2c_adap); |
850 | if (fe0->dvb.frontend != NULL) | 838 | if (fe0->dvb.frontend != NULL) |
851 | fe0->dvb.frontend->ops.set_voltage = tbs_set_voltage; | 839 | fe0->dvb.frontend->ops.set_voltage = f300_set_voltage; |
852 | 840 | ||
853 | break; | 841 | break; |
854 | case CX23885_BOARD_DVBWORLD_2005: | 842 | case CX23885_BOARD_DVBWORLD_2005: |
diff --git a/drivers/media/video/cx23885/cx23885-f300.c b/drivers/media/video/cx23885/cx23885-f300.c new file mode 100644 index 000000000000..93998f220986 --- /dev/null +++ b/drivers/media/video/cx23885/cx23885-f300.c | |||
@@ -0,0 +1,177 @@ | |||
1 | /* | ||
2 | * Driver for Silicon Labs C8051F300 microcontroller. | ||
3 | * | ||
4 | * It is used for LNB power control in TeVii S470, | ||
5 | * TBS 6920 PCIe DVB-S2 cards. | ||
6 | * | ||
7 | * Microcontroller connected to cx23885 GPIO pins: | ||
8 | * GPIO0 - data - P0.3 F300 | ||
9 | * GPIO1 - reset - P0.2 F300 | ||
10 | * GPIO2 - clk - P0.1 F300 | ||
11 | * GPIO3 - busy - P0.0 F300 | ||
12 | * | ||
13 | * Copyright (C) 2009 Igor M. Liplianin <liplianin@me.by> | ||
14 | * | ||
15 | * This program is free software; you can redistribute it and/or modify | ||
16 | * it under the terms of the GNU General Public License as published by | ||
17 | * the Free Software Foundation; either version 2 of the License, or | ||
18 | * (at your option) any later version. | ||
19 | * | ||
20 | * This program is distributed in the hope that it will be useful, | ||
21 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
22 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
23 | * | ||
24 | * GNU General Public License for more details. | ||
25 | * | ||
26 | * You should have received a copy of the GNU General Public License | ||
27 | * along with this program; if not, write to the Free Software | ||
28 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
29 | */ | ||
30 | |||
31 | #include "cx23885.h" | ||
32 | |||
33 | #define F300_DATA GPIO_0 | ||
34 | #define F300_RESET GPIO_1 | ||
35 | #define F300_CLK GPIO_2 | ||
36 | #define F300_BUSY GPIO_3 | ||
37 | |||
38 | static void f300_set_line(struct cx23885_dev *dev, u32 line, u8 lvl) | ||
39 | { | ||
40 | cx23885_gpio_enable(dev, line, 1); | ||
41 | if (lvl == 1) | ||
42 | cx23885_gpio_set(dev, line); | ||
43 | else | ||
44 | cx23885_gpio_clear(dev, line); | ||
45 | } | ||
46 | |||
47 | static u8 f300_get_line(struct cx23885_dev *dev, u32 line) | ||
48 | { | ||
49 | cx23885_gpio_enable(dev, line, 0); | ||
50 | |||
51 | return cx23885_gpio_get(dev, line); | ||
52 | } | ||
53 | |||
54 | static void f300_send_byte(struct cx23885_dev *dev, u8 dta) | ||
55 | { | ||
56 | u8 i; | ||
57 | |||
58 | for (i = 0; i < 8; i++) { | ||
59 | f300_set_line(dev, F300_CLK, 0); | ||
60 | udelay(30); | ||
61 | f300_set_line(dev, F300_DATA, (dta & 0x80) >> 7);/* msb first */ | ||
62 | udelay(30); | ||
63 | dta <<= 1; | ||
64 | f300_set_line(dev, F300_CLK, 1); | ||
65 | udelay(30); | ||
66 | } | ||
67 | } | ||
68 | |||
69 | static u8 f300_get_byte(struct cx23885_dev *dev) | ||
70 | { | ||
71 | u8 i, dta = 0; | ||
72 | |||
73 | for (i = 0; i < 8; i++) { | ||
74 | f300_set_line(dev, F300_CLK, 0); | ||
75 | udelay(30); | ||
76 | dta <<= 1; | ||
77 | f300_set_line(dev, F300_CLK, 1); | ||
78 | udelay(30); | ||
79 | dta |= f300_get_line(dev, F300_DATA);/* msb first */ | ||
80 | |||
81 | } | ||
82 | |||
83 | return dta; | ||
84 | } | ||
85 | |||
86 | static u8 f300_xfer(struct dvb_frontend *fe, u8 *buf) | ||
87 | { | ||
88 | struct cx23885_tsport *port = fe->dvb->priv; | ||
89 | struct cx23885_dev *dev = port->dev; | ||
90 | u8 i, temp, ret = 0; | ||
91 | |||
92 | temp = buf[0]; | ||
93 | for (i = 0; i < buf[0]; i++) | ||
94 | temp += buf[i + 1]; | ||
95 | temp = (~temp + 1);/* get check sum */ | ||
96 | buf[1 + buf[0]] = temp; | ||
97 | |||
98 | f300_set_line(dev, F300_RESET, 1); | ||
99 | f300_set_line(dev, F300_CLK, 1); | ||
100 | udelay(30); | ||
101 | f300_set_line(dev, F300_DATA, 1); | ||
102 | msleep(1); | ||
103 | |||
104 | /* question: */ | ||
105 | f300_set_line(dev, F300_RESET, 0);/* begin to send data */ | ||
106 | msleep(1); | ||
107 | |||
108 | f300_send_byte(dev, 0xe0);/* the slave address is 0xe0, write */ | ||
109 | msleep(1); | ||
110 | |||
111 | temp = buf[0]; | ||
112 | temp += 2; | ||
113 | for (i = 0; i < temp; i++) | ||
114 | f300_send_byte(dev, buf[i]); | ||
115 | |||
116 | f300_set_line(dev, F300_RESET, 1);/* sent data over */ | ||
117 | f300_set_line(dev, F300_DATA, 1); | ||
118 | |||
119 | /* answer: */ | ||
120 | temp = 0; | ||
121 | for (i = 0; ((i < 8) & (temp == 0)); i++) { | ||
122 | msleep(1); | ||
123 | if (f300_get_line(dev, F300_BUSY) == 0) | ||
124 | temp = 1; | ||
125 | } | ||
126 | |||
127 | if (i > 7) { | ||
128 | printk(KERN_ERR "%s: timeout, the slave no response\n", | ||
129 | __func__); | ||
130 | ret = 1; /* timeout, the slave no response */ | ||
131 | } else { /* the slave not busy, prepare for getting data */ | ||
132 | f300_set_line(dev, F300_RESET, 0);/*ready...*/ | ||
133 | msleep(1); | ||
134 | f300_send_byte(dev, 0xe1);/* 0xe1 is Read */ | ||
135 | msleep(1); | ||
136 | temp = f300_get_byte(dev);/*get the data length */ | ||
137 | if (temp > 14) | ||
138 | temp = 14; | ||
139 | |||
140 | for (i = 0; i < (temp + 1); i++) | ||
141 | f300_get_byte(dev);/* get data to empty buffer */ | ||
142 | |||
143 | f300_set_line(dev, F300_RESET, 1);/* received data over */ | ||
144 | f300_set_line(dev, F300_DATA, 1); | ||
145 | } | ||
146 | |||
147 | return ret; | ||
148 | } | ||
149 | |||
150 | int f300_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t voltage) | ||
151 | { | ||
152 | u8 buf[16]; | ||
153 | |||
154 | buf[0] = 0x05; | ||
155 | buf[1] = 0x38;/* write port */ | ||
156 | buf[2] = 0x01;/* A port, lnb power */ | ||
157 | |||
158 | switch (voltage) { | ||
159 | case SEC_VOLTAGE_13: | ||
160 | buf[3] = 0x01;/* power on */ | ||
161 | buf[4] = 0x02;/* B port, H/V */ | ||
162 | buf[5] = 0x00;/*13V v*/ | ||
163 | break; | ||
164 | case SEC_VOLTAGE_18: | ||
165 | buf[3] = 0x01; | ||
166 | buf[4] = 0x02; | ||
167 | buf[5] = 0x01;/* 18V h*/ | ||
168 | break; | ||
169 | case SEC_VOLTAGE_OFF: | ||
170 | buf[3] = 0x00;/* power off */ | ||
171 | buf[4] = 0x00; | ||
172 | buf[5] = 0x00; | ||
173 | break; | ||
174 | } | ||
175 | |||
176 | return f300_xfer(fe, buf); | ||
177 | } | ||
diff --git a/drivers/media/video/cx23885/cx23885-f300.h b/drivers/media/video/cx23885/cx23885-f300.h new file mode 100644 index 000000000000..e73344c94963 --- /dev/null +++ b/drivers/media/video/cx23885/cx23885-f300.h | |||
@@ -0,0 +1,2 @@ | |||
1 | extern int f300_set_voltage(struct dvb_frontend *fe, | ||
2 | fe_sec_voltage_t voltage); | ||
diff --git a/drivers/media/video/cx23885/cx23885.h b/drivers/media/video/cx23885/cx23885.h index 338320025529..fa744764dc8b 100644 --- a/drivers/media/video/cx23885/cx23885.h +++ b/drivers/media/video/cx23885/cx23885.h | |||
@@ -471,6 +471,7 @@ extern void cx23885_wakeup(struct cx23885_tsport *port, | |||
471 | 471 | ||
472 | extern void cx23885_gpio_set(struct cx23885_dev *dev, u32 mask); | 472 | extern void cx23885_gpio_set(struct cx23885_dev *dev, u32 mask); |
473 | extern void cx23885_gpio_clear(struct cx23885_dev *dev, u32 mask); | 473 | extern void cx23885_gpio_clear(struct cx23885_dev *dev, u32 mask); |
474 | extern u32 cx23885_gpio_get(struct cx23885_dev *dev, u32 mask); | ||
474 | extern void cx23885_gpio_enable(struct cx23885_dev *dev, u32 mask, | 475 | extern void cx23885_gpio_enable(struct cx23885_dev *dev, u32 mask, |
475 | int asoutput); | 476 | int asoutput); |
476 | 477 | ||