aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/media/IR/mceusb.c37
1 files changed, 27 insertions, 10 deletions
diff --git a/drivers/media/IR/mceusb.c b/drivers/media/IR/mceusb.c
index 9dce684fd231..e453c6bc0c68 100644
--- a/drivers/media/IR/mceusb.c
+++ b/drivers/media/IR/mceusb.c
@@ -146,6 +146,7 @@ enum mceusb_model_type {
146 MCE_GEN3, 146 MCE_GEN3,
147 MCE_GEN2_TX_INV, 147 MCE_GEN2_TX_INV,
148 POLARIS_EVK, 148 POLARIS_EVK,
149 CX_HYBRID_TV,
149}; 150};
150 151
151struct mceusb_model { 152struct mceusb_model {
@@ -154,6 +155,7 @@ struct mceusb_model {
154 u32 mce_gen3:1; 155 u32 mce_gen3:1;
155 u32 tx_mask_inverted:1; 156 u32 tx_mask_inverted:1;
156 u32 is_polaris:1; 157 u32 is_polaris:1;
158 u32 no_tx:1;
157 159
158 const char *rc_map; /* Allow specify a per-board map */ 160 const char *rc_map; /* Allow specify a per-board map */
159 const char *name; /* per-board name */ 161 const char *name; /* per-board name */
@@ -183,7 +185,12 @@ static const struct mceusb_model mceusb_model[] = {
183 * to allow testing it 185 * to allow testing it
184 */ 186 */
185 .rc_map = RC_MAP_RC5_HAUPPAUGE_NEW, 187 .rc_map = RC_MAP_RC5_HAUPPAUGE_NEW,
186 .name = "cx231xx MCE IR", 188 .name = "Conexant Hybrid TV (cx231xx) MCE IR",
189 },
190 [CX_HYBRID_TV] = {
191 .is_polaris = 1,
192 .no_tx = 1, /* tx isn't wired up at all */
193 .name = "Conexant Hybrid TV (cx231xx) MCE IR",
187 }, 194 },
188}; 195};
189 196
@@ -292,9 +299,12 @@ static struct usb_device_id mceusb_dev_table[] = {
292 { USB_DEVICE(VENDOR_NORTHSTAR, 0xe004) }, 299 { USB_DEVICE(VENDOR_NORTHSTAR, 0xe004) },
293 /* TiVo PC IR Receiver */ 300 /* TiVo PC IR Receiver */
294 { USB_DEVICE(VENDOR_TIVO, 0x2000) }, 301 { USB_DEVICE(VENDOR_TIVO, 0x2000) },
295 /* Conexant SDK */ 302 /* Conexant Hybrid TV "Shelby" Polaris SDK */
296 { USB_DEVICE(VENDOR_CONEXANT, 0x58a1), 303 { USB_DEVICE(VENDOR_CONEXANT, 0x58a1),
297 .driver_info = POLARIS_EVK }, 304 .driver_info = POLARIS_EVK },
305 /* Conexant Hybrid TV RDU253S Polaris */
306 { USB_DEVICE(VENDOR_CONEXANT, 0x58a5),
307 .driver_info = CX_HYBRID_TV },
298 /* Terminating entry */ 308 /* Terminating entry */
299 { } 309 { }
300}; 310};
@@ -334,6 +344,7 @@ struct mceusb_dev {
334 u32 connected:1; 344 u32 connected:1;
335 u32 tx_mask_inverted:1; 345 u32 tx_mask_inverted:1;
336 u32 microsoft_gen1:1; 346 u32 microsoft_gen1:1;
347 u32 no_tx:1;
337 } flags; 348 } flags;
338 349
339 /* transmit support */ 350 /* transmit support */
@@ -724,7 +735,7 @@ out:
724 return ret ? ret : n; 735 return ret ? ret : n;
725} 736}
726 737
727/* Sets active IR outputs -- mce devices typically (all?) have two */ 738/* Sets active IR outputs -- mce devices typically have two */
728static int mceusb_set_tx_mask(void *priv, u32 mask) 739static int mceusb_set_tx_mask(void *priv, u32 mask)
729{ 740{
730 struct mceusb_dev *ir = priv; 741 struct mceusb_dev *ir = priv;
@@ -984,9 +995,11 @@ static void mceusb_get_parameters(struct mceusb_dev *ir)
984 mce_async_out(ir, GET_CARRIER_FREQ, sizeof(GET_CARRIER_FREQ)); 995 mce_async_out(ir, GET_CARRIER_FREQ, sizeof(GET_CARRIER_FREQ));
985 mce_sync_in(ir, NULL, maxp); 996 mce_sync_in(ir, NULL, maxp);
986 997
987 /* get the transmitter bitmask */ 998 if (!ir->flags.no_tx) {
988 mce_async_out(ir, GET_TX_BITMASK, sizeof(GET_TX_BITMASK)); 999 /* get the transmitter bitmask */
989 mce_sync_in(ir, NULL, maxp); 1000 mce_async_out(ir, GET_TX_BITMASK, sizeof(GET_TX_BITMASK));
1001 mce_sync_in(ir, NULL, maxp);
1002 }
990 1003
991 /* get receiver timeout value */ 1004 /* get receiver timeout value */
992 mce_async_out(ir, GET_RX_TIMEOUT, sizeof(GET_RX_TIMEOUT)); 1005 mce_async_out(ir, GET_RX_TIMEOUT, sizeof(GET_RX_TIMEOUT));
@@ -1035,9 +1048,11 @@ static struct input_dev *mceusb_init_input_dev(struct mceusb_dev *ir)
1035 props->priv = ir; 1048 props->priv = ir;
1036 props->driver_type = RC_DRIVER_IR_RAW; 1049 props->driver_type = RC_DRIVER_IR_RAW;
1037 props->allowed_protos = IR_TYPE_ALL; 1050 props->allowed_protos = IR_TYPE_ALL;
1038 props->s_tx_mask = mceusb_set_tx_mask; 1051 if (!ir->flags.no_tx) {
1039 props->s_tx_carrier = mceusb_set_tx_carrier; 1052 props->s_tx_mask = mceusb_set_tx_mask;
1040 props->tx_ir = mceusb_tx_ir; 1053 props->s_tx_carrier = mceusb_set_tx_carrier;
1054 props->tx_ir = mceusb_tx_ir;
1055 }
1041 1056
1042 ir->props = props; 1057 ir->props = props;
1043 1058
@@ -1151,6 +1166,7 @@ static int __devinit mceusb_dev_probe(struct usb_interface *intf,
1151 ir->len_in = maxp; 1166 ir->len_in = maxp;
1152 ir->flags.microsoft_gen1 = is_microsoft_gen1; 1167 ir->flags.microsoft_gen1 = is_microsoft_gen1;
1153 ir->flags.tx_mask_inverted = tx_mask_inverted; 1168 ir->flags.tx_mask_inverted = tx_mask_inverted;
1169 ir->flags.no_tx = mceusb_model[model].no_tx;
1154 ir->model = model; 1170 ir->model = model;
1155 1171
1156 init_ir_raw_event(&ir->rawir); 1172 init_ir_raw_event(&ir->rawir);
@@ -1191,7 +1207,8 @@ static int __devinit mceusb_dev_probe(struct usb_interface *intf,
1191 1207
1192 mceusb_get_parameters(ir); 1208 mceusb_get_parameters(ir);
1193 1209
1194 mceusb_set_tx_mask(ir, MCE_DEFAULT_TX_MASK); 1210 if (!ir->flags.no_tx)
1211 mceusb_set_tx_mask(ir, MCE_DEFAULT_TX_MASK);
1195 1212
1196 usb_set_intfdata(intf, ir); 1213 usb_set_intfdata(intf, ir);
1197 1214