You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							196 lines
						
					
					
						
							5.9 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							196 lines
						
					
					
						
							5.9 KiB
						
					
					
				| diff --git a/drivers/media/dvb-core/dvb-usb-ids.h b/drivers/media/dvb-core/dvb-usb-ids.h | |
| index e07a84e..80ab8d0 100644 | |
| --- a/drivers/media/dvb-core/dvb-usb-ids.h | |
| +++ b/drivers/media/dvb-core/dvb-usb-ids.h | |
| @@ -348,6 +348,8 @@ | |
|  #define USB_PID_MSI_DIGI_VOX_MINI_III                   0x8807 | |
|  #define USB_PID_SONY_PLAYTV				0x0003 | |
|  #define USB_PID_MYGICA_D689				0xd811 | |
| +#define USB_PID_MYGICA_T230				0xc688 | |
| +#define USB_PID_GOTVIEW_CA42				0xca42  | |
|  #define USB_PID_ELGATO_EYETV_DIVERSITY			0x0011 | |
|  #define USB_PID_ELGATO_EYETV_DTT			0x0021 | |
|  #define USB_PID_ELGATO_EYETV_DTT_2			0x003f | |
| diff --git a/drivers/media/usb/dvb-usb/cxusb.c b/drivers/media/usb/dvb-usb/cxusb.c | |
| index 356abb3..083714b 100644 | |
| --- a/drivers/media/usb/dvb-usb/cxusb.c | |
| +++ b/drivers/media/usb/dvb-usb/cxusb.c | |
| @@ -40,8 +40,10 @@ | |
|  #include "max2165.h" | |
|  #include "dib7000p.h" | |
|  #include "dib0070.h" | |
|  #include "lgs8gxx.h" | |
|  #include "atbm8830.h" | |
| +#include "si2168.h" | |
| +#include "si2157.h" | |
|  | |
|  /* Max transfer size done by I2C transfer functions */ | |
|  #define MAX_XFER_SIZE  64 | |
| --- a/drivers/media/usb/dvb-usb/cxusb.c | |
| +++ b/drivers/media/usb/dvb-usb/cxusb.c | |
| @@ -1270,4 +1270,74 @@ static int cxusb_mygica_d689_frontend_attach(struct dvb_usb_adapter *adap) | |
|  	return 0; | |
|  } | |
|   | |
| +static int cxusb_mygica_t230_frontend_attach(struct dvb_usb_adapter *adap) | |
| +{ | |
| +	struct dvb_usb_device *d = adap->dev; | |
| +	struct cxusb_state *st = d->priv; | |
| +	struct i2c_adapter *adapter; | |
| +	struct i2c_client *client_demod; | |
| +	struct i2c_client *client_tuner; | |
| +	struct i2c_board_info info; | |
| +	struct si2168_config si2168_config; | |
| +	struct si2157_config si2157_config; | |
| + | |
| +	/* Select required USB configuration */ | |
| +	if (usb_set_interface(d->udev, 0, 0) < 0) | |
| +		err("set interface failed"); | |
| + | |
| +	/* Unblock all USB pipes */ | |
| +	usb_clear_halt(d->udev, | |
| +		usb_sndbulkpipe(d->udev, d->props.generic_bulk_ctrl_endpoint)); | |
| +	usb_clear_halt(d->udev, | |
| +		usb_rcvbulkpipe(d->udev, d->props.generic_bulk_ctrl_endpoint)); | |
| +	usb_clear_halt(d->udev, | |
| +		usb_rcvbulkpipe(d->udev, d->props.adapter[0].fe[0].stream.endpoint)); | |
| + | |
| +	/* attach frontend */ | |
| +	si2168_config.i2c_adapter = &adapter; | |
| +	si2168_config.fe = &adap->fe_adap[0].fe; | |
| +	si2168_config.ts_mode = SI2168_TS_PARALLEL; | |
| +	si2168_config.ts_clock_inv = 1; | |
| +	memset(&info, 0, sizeof(struct i2c_board_info)); | |
| +	strlcpy(info.type, "si2168", I2C_NAME_SIZE); | |
| +	info.addr = 0x64; | |
| +	info.platform_data = &si2168_config; | |
| +	request_module(info.type); | |
| +	client_demod = i2c_new_device(&d->i2c_adap, &info); | |
| +	if (client_demod == NULL || client_demod->dev.driver == NULL) | |
| +		return -ENODEV; | |
| + | |
| +	if (!try_module_get(client_demod->dev.driver->owner)) { | |
| +		i2c_unregister_device(client_demod); | |
| +		return -ENODEV; | |
| +	} | |
| + | |
| +	st->i2c_client_demod = client_demod; | |
| + | |
| +	/* attach tuner */ | |
| +	memset(&si2157_config, 0, sizeof(si2157_config)); | |
| +	si2157_config.fe = adap->fe_adap[0].fe; | |
| +	memset(&info, 0, sizeof(struct i2c_board_info)); | |
| +	strlcpy(info.type, "si2157", I2C_NAME_SIZE); | |
| +	info.addr = 0x60; | |
| +	info.platform_data = &si2157_config; | |
| +	request_module(info.type); | |
| +	client_tuner = i2c_new_device(adapter, &info); | |
| +	if (client_tuner == NULL || client_tuner->dev.driver == NULL) { | |
| +		module_put(client_demod->dev.driver->owner); | |
| +		i2c_unregister_device(client_demod); | |
| +		return -ENODEV; | |
| +	} | |
| +	if (!try_module_get(client_tuner->dev.driver->owner)) { | |
| +		i2c_unregister_device(client_tuner); | |
| +		module_put(client_demod->dev.driver->owner); | |
| +		i2c_unregister_device(client_demod); | |
| +		return -ENODEV; | |
| +	} | |
| + | |
| +	st->i2c_client_tuner = client_tuner; | |
| + | |
| +	return 0; | |
| +} | |
| + | |
|  /* | |
| @@ -1356,5 +1356,6 @@ | |
|  static struct dvb_usb_device_properties cxusb_aver_a868r_properties; | |
|  static struct dvb_usb_device_properties cxusb_d680_dmb_properties; | |
|  static struct dvb_usb_device_properties cxusb_mygica_d689_properties; | |
| +static struct dvb_usb_device_properties cxusb_mygica_t230_properties; | |
|   | |
|  static int cxusb_probe(struct usb_interface *intf, | |
| @@ -1386,4 +1386,6 @@ static int cxusb_probe(struct usb_interface *intf, | |
|  				     THIS_MODULE, NULL, adapter_nr) || | |
|  	    0 == dvb_usb_device_init(intf, &cxusb_mygica_d689_properties, | |
|  				     THIS_MODULE, NULL, adapter_nr) || | |
| +	    0 == dvb_usb_device_init(intf, &cxusb_mygica_t230_properties, | |
| +				     THIS_MODULE, NULL, adapter_nr) || | |
|  	    0) | |
| @@ -1415,4 +1415,5 @@ static struct usb_device_id cxusb_table [] = { | |
|  	{ USB_DEVICE(USB_VID_CONEXANT, USB_PID_MYGICA_D689) }, | |
| +	{ USB_DEVICE(USB_VID_CONEXANT, USB_PID_MYGICA_T230) }, | |
|  	{}		/* Terminating entry */ | |
|  }; | |
|  MODULE_DEVICE_TABLE (usb, cxusb_table); | |
| @@ -2059,6 +2059,59 @@ static struct dvb_usb_device_properties cxusb_mygica_d689_properties = { | |
|  	} | |
|  }; | |
|   | |
| +static struct dvb_usb_device_properties cxusb_mygica_t230_properties = { | |
| +	.caps = DVB_USB_IS_AN_I2C_ADAPTER, | |
| + | |
| +	.usb_ctrl         = CYPRESS_FX2, | |
| + | |
| +	.size_of_priv     = sizeof(struct cxusb_state), | |
| + | |
| +	.num_adapters = 1, | |
| +	.adapter = { | |
| +		{ | |
| +		.num_frontends = 1, | |
| +		.fe = {{ | |
| +			.streaming_ctrl   = cxusb_streaming_ctrl, | |
| +			.frontend_attach  = cxusb_mygica_t230_frontend_attach, | |
| + | |
| +			/* parameter for the MPEG2-data transfer */ | |
| +			.stream = { | |
| +				.type = USB_BULK, | |
| +				.count = 5, | |
| +				.endpoint = 0x02, | |
| +				.u = { | |
| +					.bulk = { | |
| +						.buffersize = 8192, | |
| +					} | |
| +				} | |
| +			}, | |
| +		} }, | |
| +		}, | |
| +	}, | |
| + | |
| +	.power_ctrl       = cxusb_d680_dmb_power_ctrl, | |
| + | |
| +	.i2c_algo         = &cxusb_i2c_algo, | |
| + | |
| +	.generic_bulk_ctrl_endpoint = 0x01, | |
| + | |
| +	.rc.legacy = { | |
| +		.rc_interval      = 100, | |
| +		.rc_map_table     = rc_map_d680_dmb_table, | |
| +		.rc_map_size      = ARRAY_SIZE(rc_map_d680_dmb_table), | |
| +		.rc_query         = cxusb_d680_dmb_rc_query, | |
| +	}, | |
| + | |
| +	.num_device_descs = 1, | |
| +	.devices = { | |
| +		{ | |
| +			"Mygica T230 DVB-T/T2/C", | |
| +			{ NULL }, | |
| +			{ &cxusb_table[20], NULL }, | |
| +		}, | |
| +	} | |
| +}; | |
| + | |
|  static struct usb_driver cxusb_driver = { | |
|  	.name		= "dvb_usb_cxusb", | |
|  	.probe		= cxusb_probe, | |
| --- a/drivers/media/usb/dvb-usb/cxusb.h | |
| +++ b/drivers/media/usb/dvb-usb/cxusb.h | |
| @@ -30,6 +30,8 @@ | |
|   | |
|  struct cxusb_state { | |
|  	u8 gpio_write_state[3]; | |
| +	struct i2c_client *i2c_client_demod; | |
| +	struct i2c_client *i2c_client_tuner; | |
|  }; | |
|   | |
|  #endif
 | |
| 
 |