mirror of
				https://github.com/AetherDroid/android_kernel_samsung_on5xelte.git
				synced 2025-10-31 08:08:51 +01:00 
			
		
		
		
	Fixed MTP to work with TWRP
This commit is contained in:
		
						commit
						f6dfaef42e
					
				
					 50820 changed files with 20846062 additions and 0 deletions
				
			
		
							
								
								
									
										32
									
								
								drivers/media/common/siano/Kconfig
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								drivers/media/common/siano/Kconfig
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,32 @@ | |||
| # | ||||
| # Siano Mobile Silicon Digital TV device configuration | ||||
| # | ||||
| 
 | ||||
| config SMS_SIANO_MDTV | ||||
| 	tristate | ||||
| 	depends on DVB_CORE && HAS_DMA | ||||
| 	depends on !RC_CORE || RC_CORE | ||||
| 	depends on SMS_USB_DRV || SMS_SDIO_DRV | ||||
| 	default y | ||||
| 
 | ||||
| config SMS_SIANO_RC | ||||
| 	bool "Enable Remote Controller support for Siano devices" | ||||
| 	depends on SMS_SIANO_MDTV && RC_CORE | ||||
| 	depends on SMS_USB_DRV || SMS_SDIO_DRV | ||||
| 	depends on MEDIA_COMMON_OPTIONS | ||||
| 	default y | ||||
| 	---help--- | ||||
| 	  Choose Y to select Remote Controller support for Siano driver. | ||||
| 
 | ||||
| config SMS_SIANO_DEBUGFS | ||||
| 	bool "Enable debugfs for smsdvb" | ||||
| 	depends on SMS_SIANO_MDTV | ||||
| 	depends on DEBUG_FS | ||||
| 	depends on SMS_USB_DRV = SMS_SDIO_DRV | ||||
| 
 | ||||
| 	---help--- | ||||
| 	  Choose Y to enable visualizing a dump of the frontend | ||||
| 	  statistics response packets via debugfs. Currently, works | ||||
| 	  only with Siano USB devices. | ||||
| 
 | ||||
| 	  Useful only for developers. In doubt, say N. | ||||
							
								
								
									
										16
									
								
								drivers/media/common/siano/Makefile
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								drivers/media/common/siano/Makefile
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,16 @@ | |||
| smsmdtv-objs := smscoreapi.o sms-cards.o smsendian.o | ||||
| smsdvb-objs := smsdvb-main.o | ||||
| 
 | ||||
| obj-$(CONFIG_SMS_SIANO_MDTV) += smsmdtv.o smsdvb.o | ||||
| 
 | ||||
| ifeq ($(CONFIG_SMS_SIANO_RC),y) | ||||
|   smsmdtv-objs += smsir.o | ||||
| endif | ||||
| 
 | ||||
| ifeq ($(CONFIG_SMS_SIANO_DEBUGFS),y) | ||||
|   smsdvb-objs += smsdvb-debugfs.o | ||||
| endif | ||||
| 
 | ||||
| ccflags-y += -Idrivers/media/dvb-core | ||||
| ccflags-y += $(extra-cflags-y) $(extra-cflags-m) | ||||
| 
 | ||||
							
								
								
									
										364
									
								
								drivers/media/common/siano/sms-cards.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										364
									
								
								drivers/media/common/siano/sms-cards.c
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,364 @@ | |||
| /*
 | ||||
|  *  Card-specific functions for the Siano SMS1xxx USB dongle | ||||
|  * | ||||
|  *  Copyright (c) 2008 Michael Krufky <mkrufky@linuxtv.org> | ||||
|  * | ||||
|  *  This program is free software; you can redistribute it and/or modify | ||||
|  *  it under the terms of the GNU General Public License version 2 as | ||||
|  *  published by the Free Software Foundation; | ||||
|  * | ||||
|  *  Software distributed under the License is distributed on an "AS IS" | ||||
|  *  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. | ||||
|  * | ||||
|  *  See the GNU General Public License for more details. | ||||
|  * | ||||
|  *  You should have received a copy of the GNU General Public License | ||||
|  *  along with this program; if not, write to the Free Software | ||||
|  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||||
|  */ | ||||
| 
 | ||||
| #include "sms-cards.h" | ||||
| #include "smsir.h" | ||||
| #include <linux/module.h> | ||||
| 
 | ||||
| static int sms_dbg; | ||||
| module_param_named(cards_dbg, sms_dbg, int, 0644); | ||||
| MODULE_PARM_DESC(cards_dbg, "set debug level (info=1, adv=2 (or-able))"); | ||||
| 
 | ||||
| static struct sms_board sms_boards[] = { | ||||
| 	[SMS_BOARD_UNKNOWN] = { | ||||
| 		.name	= "Unknown board", | ||||
| 		.type = SMS_UNKNOWN_TYPE, | ||||
| 		.default_mode = DEVICE_MODE_NONE, | ||||
| 	}, | ||||
| 	[SMS1XXX_BOARD_SIANO_STELLAR] = { | ||||
| 		.name	= "Siano Stellar Digital Receiver", | ||||
| 		.type	= SMS_STELLAR, | ||||
| 		.default_mode = DEVICE_MODE_DVBT_BDA, | ||||
| 	}, | ||||
| 	[SMS1XXX_BOARD_SIANO_NOVA_A] = { | ||||
| 		.name	= "Siano Nova A Digital Receiver", | ||||
| 		.type	= SMS_NOVA_A0, | ||||
| 		.default_mode = DEVICE_MODE_DVBT_BDA, | ||||
| 	}, | ||||
| 	[SMS1XXX_BOARD_SIANO_NOVA_B] = { | ||||
| 		.name	= "Siano Nova B Digital Receiver", | ||||
| 		.type	= SMS_NOVA_B0, | ||||
| 		.default_mode = DEVICE_MODE_DVBT_BDA, | ||||
| 	}, | ||||
| 	[SMS1XXX_BOARD_SIANO_VEGA] = { | ||||
| 		.name	= "Siano Vega Digital Receiver", | ||||
| 		.type	= SMS_VEGA, | ||||
| 		.default_mode = DEVICE_MODE_CMMB, | ||||
| 	}, | ||||
| 	[SMS1XXX_BOARD_HAUPPAUGE_CATAMOUNT] = { | ||||
| 		.name	= "Hauppauge Catamount", | ||||
| 		.type	= SMS_STELLAR, | ||||
| 		.fw[DEVICE_MODE_DVBT_BDA] = SMS_FW_DVBT_STELLAR, | ||||
| 		.default_mode = DEVICE_MODE_DVBT_BDA, | ||||
| 	}, | ||||
| 	[SMS1XXX_BOARD_HAUPPAUGE_OKEMO_A] = { | ||||
| 		.name	= "Hauppauge Okemo-A", | ||||
| 		.type	= SMS_NOVA_A0, | ||||
| 		.fw[DEVICE_MODE_DVBT_BDA] = SMS_FW_DVBT_NOVA_A, | ||||
| 		.default_mode = DEVICE_MODE_DVBT_BDA, | ||||
| 	}, | ||||
| 	[SMS1XXX_BOARD_HAUPPAUGE_OKEMO_B] = { | ||||
| 		.name	= "Hauppauge Okemo-B", | ||||
| 		.type	= SMS_NOVA_B0, | ||||
| 		.fw[DEVICE_MODE_DVBT_BDA] = SMS_FW_DVBT_NOVA_B, | ||||
| 		.default_mode = DEVICE_MODE_DVBT_BDA, | ||||
| 	}, | ||||
| 	[SMS1XXX_BOARD_HAUPPAUGE_WINDHAM] = { | ||||
| 		.name	= "Hauppauge WinTV MiniStick", | ||||
| 		.type	= SMS_NOVA_B0, | ||||
| 		.fw[DEVICE_MODE_ISDBT_BDA] = SMS_FW_ISDBT_HCW_55XXX, | ||||
| 		.fw[DEVICE_MODE_DVBT_BDA]  = SMS_FW_DVBT_HCW_55XXX, | ||||
| 		.default_mode = DEVICE_MODE_DVBT_BDA, | ||||
| 		.rc_codes = RC_MAP_HAUPPAUGE, | ||||
| 		.board_cfg.leds_power = 26, | ||||
| 		.board_cfg.led0 = 27, | ||||
| 		.board_cfg.led1 = 28, | ||||
| 		.board_cfg.ir = 9, | ||||
| 		.led_power = 26, | ||||
| 		.led_lo    = 27, | ||||
| 		.led_hi    = 28, | ||||
| 	}, | ||||
| 	[SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD] = { | ||||
| 		.name	= "Hauppauge WinTV MiniCard", | ||||
| 		.type	= SMS_NOVA_B0, | ||||
| 		.fw[DEVICE_MODE_DVBT_BDA] = SMS_FW_DVBT_HCW_55XXX, | ||||
| 		.default_mode = DEVICE_MODE_DVBT_BDA, | ||||
| 		.lna_ctrl  = 29, | ||||
| 		.board_cfg.foreign_lna0_ctrl = 29, | ||||
| 		.rf_switch = 17, | ||||
| 		.board_cfg.rf_switch_uhf = 17, | ||||
| 	}, | ||||
| 	[SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD_R2] = { | ||||
| 		.name	= "Hauppauge WinTV MiniCard", | ||||
| 		.type	= SMS_NOVA_B0, | ||||
| 		.fw[DEVICE_MODE_DVBT_BDA] = SMS_FW_DVBT_HCW_55XXX, | ||||
| 		.default_mode = DEVICE_MODE_DVBT_BDA, | ||||
| 		.lna_ctrl  = -1, | ||||
| 	}, | ||||
| 	[SMS1XXX_BOARD_SIANO_NICE] = { | ||||
| 		.name = "Siano Nice Digital Receiver", | ||||
| 		.type = SMS_NOVA_B0, | ||||
| 		.default_mode = DEVICE_MODE_DVBT_BDA, | ||||
| 	}, | ||||
| 	[SMS1XXX_BOARD_SIANO_VENICE] = { | ||||
| 		.name = "Siano Venice Digital Receiver", | ||||
| 		.type = SMS_VEGA, | ||||
| 		.default_mode = DEVICE_MODE_CMMB, | ||||
| 	}, | ||||
| 	[SMS1XXX_BOARD_SIANO_STELLAR_ROM] = { | ||||
| 		.name = "Siano Stellar Digital Receiver ROM", | ||||
| 		.type = SMS_STELLAR, | ||||
| 		.default_mode = DEVICE_MODE_DVBT_BDA, | ||||
| 		.intf_num = 1, | ||||
| 	}, | ||||
| 	[SMS1XXX_BOARD_ZTE_DVB_DATA_CARD] = { | ||||
| 		.name = "ZTE Data Card Digital Receiver", | ||||
| 		.type = SMS_NOVA_B0, | ||||
| 		.default_mode = DEVICE_MODE_DVBT_BDA, | ||||
| 		.intf_num = 5, | ||||
| 		.mtu = 15792, | ||||
| 	}, | ||||
| 	[SMS1XXX_BOARD_ONDA_MDTV_DATA_CARD] = { | ||||
| 		.name = "ONDA Data Card Digital Receiver", | ||||
| 		.type = SMS_NOVA_B0, | ||||
| 		.default_mode = DEVICE_MODE_DVBT_BDA, | ||||
| 		.intf_num = 6, | ||||
| 		.mtu = 15792, | ||||
| 	}, | ||||
| 	[SMS1XXX_BOARD_SIANO_MING] = { | ||||
| 		.name = "Siano Ming Digital Receiver", | ||||
| 		.type = SMS_MING, | ||||
| 		.default_mode = DEVICE_MODE_CMMB, | ||||
| 	}, | ||||
| 	[SMS1XXX_BOARD_SIANO_PELE] = { | ||||
| 		.name = "Siano Pele Digital Receiver", | ||||
| 		.type = SMS_PELE, | ||||
| 		.default_mode = DEVICE_MODE_ISDBT_BDA, | ||||
| 	}, | ||||
| 	[SMS1XXX_BOARD_SIANO_RIO] = { | ||||
| 		.name = "Siano Rio Digital Receiver", | ||||
| 		.type = SMS_RIO, | ||||
| 		.default_mode = DEVICE_MODE_ISDBT_BDA, | ||||
| 	}, | ||||
| 	[SMS1XXX_BOARD_SIANO_DENVER_1530] = { | ||||
| 		.name = "Siano Denver (ATSC-M/H) Digital Receiver", | ||||
| 		.type = SMS_DENVER_1530, | ||||
| 		.default_mode = DEVICE_MODE_ATSC, | ||||
| 		.crystal = 2400, | ||||
| 	}, | ||||
| 	[SMS1XXX_BOARD_SIANO_DENVER_2160] = { | ||||
| 		.name = "Siano Denver (TDMB) Digital Receiver", | ||||
| 		.type = SMS_DENVER_2160, | ||||
| 		.default_mode = DEVICE_MODE_DAB_TDMB, | ||||
| 	}, | ||||
| 	[SMS1XXX_BOARD_PCTV_77E] = { | ||||
| 		.name	= "Hauppauge microStick 77e", | ||||
| 		.type	= SMS_NOVA_B0, | ||||
| 		.fw[DEVICE_MODE_DVBT_BDA] = SMS_FW_DVB_NOVA_12MHZ_B0, | ||||
| 		.default_mode = DEVICE_MODE_DVBT_BDA, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| struct sms_board *sms_get_board(unsigned id) | ||||
| { | ||||
| 	BUG_ON(id >= ARRAY_SIZE(sms_boards)); | ||||
| 
 | ||||
| 	return &sms_boards[id]; | ||||
| } | ||||
| EXPORT_SYMBOL_GPL(sms_get_board); | ||||
| static inline void sms_gpio_assign_11xx_default_led_config( | ||||
| 		struct smscore_config_gpio *p_gpio_config) { | ||||
| 	p_gpio_config->direction = SMS_GPIO_DIRECTION_OUTPUT; | ||||
| 	p_gpio_config->inputcharacteristics = | ||||
| 		SMS_GPIO_INPUTCHARACTERISTICS_NORMAL; | ||||
| 	p_gpio_config->outputdriving = SMS_GPIO_OUTPUTDRIVING_4mA; | ||||
| 	p_gpio_config->outputslewrate = SMS_GPIO_OUTPUT_SLEW_RATE_0_45_V_NS; | ||||
| 	p_gpio_config->pullupdown = SMS_GPIO_PULLUPDOWN_NONE; | ||||
| } | ||||
| 
 | ||||
| int sms_board_event(struct smscore_device_t *coredev, | ||||
| 		    enum SMS_BOARD_EVENTS gevent) | ||||
| { | ||||
| 	struct smscore_config_gpio my_gpio_config; | ||||
| 
 | ||||
| 	sms_gpio_assign_11xx_default_led_config(&my_gpio_config); | ||||
| 
 | ||||
| 	switch (gevent) { | ||||
| 	case BOARD_EVENT_POWER_INIT: /* including hotplug */ | ||||
| 		break; /* BOARD_EVENT_BIND */ | ||||
| 
 | ||||
| 	case BOARD_EVENT_POWER_SUSPEND: | ||||
| 		break; /* BOARD_EVENT_POWER_SUSPEND */ | ||||
| 
 | ||||
| 	case BOARD_EVENT_POWER_RESUME: | ||||
| 		break; /* BOARD_EVENT_POWER_RESUME */ | ||||
| 
 | ||||
| 	case BOARD_EVENT_BIND: | ||||
| 		break; /* BOARD_EVENT_BIND */ | ||||
| 
 | ||||
| 	case BOARD_EVENT_SCAN_PROG: | ||||
| 		break; /* BOARD_EVENT_SCAN_PROG */ | ||||
| 	case BOARD_EVENT_SCAN_COMP: | ||||
| 		break; /* BOARD_EVENT_SCAN_COMP */ | ||||
| 	case BOARD_EVENT_EMERGENCY_WARNING_SIGNAL: | ||||
| 		break; /* BOARD_EVENT_EMERGENCY_WARNING_SIGNAL */ | ||||
| 	case BOARD_EVENT_FE_LOCK: | ||||
| 		break; /* BOARD_EVENT_FE_LOCK */ | ||||
| 	case BOARD_EVENT_FE_UNLOCK: | ||||
| 		break; /* BOARD_EVENT_FE_UNLOCK */ | ||||
| 	case BOARD_EVENT_DEMOD_LOCK: | ||||
| 		break; /* BOARD_EVENT_DEMOD_LOCK */ | ||||
| 	case BOARD_EVENT_DEMOD_UNLOCK: | ||||
| 		break; /* BOARD_EVENT_DEMOD_UNLOCK */ | ||||
| 	case BOARD_EVENT_RECEPTION_MAX_4: | ||||
| 		break; /* BOARD_EVENT_RECEPTION_MAX_4 */ | ||||
| 	case BOARD_EVENT_RECEPTION_3: | ||||
| 		break; /* BOARD_EVENT_RECEPTION_3 */ | ||||
| 	case BOARD_EVENT_RECEPTION_2: | ||||
| 		break; /* BOARD_EVENT_RECEPTION_2 */ | ||||
| 	case BOARD_EVENT_RECEPTION_1: | ||||
| 		break; /* BOARD_EVENT_RECEPTION_1 */ | ||||
| 	case BOARD_EVENT_RECEPTION_LOST_0: | ||||
| 		break; /* BOARD_EVENT_RECEPTION_LOST_0 */ | ||||
| 	case BOARD_EVENT_MULTIPLEX_OK: | ||||
| 		break; /* BOARD_EVENT_MULTIPLEX_OK */ | ||||
| 	case BOARD_EVENT_MULTIPLEX_ERRORS: | ||||
| 		break; /* BOARD_EVENT_MULTIPLEX_ERRORS */ | ||||
| 
 | ||||
| 	default: | ||||
| 		sms_err("Unknown SMS board event"); | ||||
| 		break; | ||||
| 	} | ||||
| 	return 0; | ||||
| } | ||||
| EXPORT_SYMBOL_GPL(sms_board_event); | ||||
| 
 | ||||
| static int sms_set_gpio(struct smscore_device_t *coredev, int pin, int enable) | ||||
| { | ||||
| 	int lvl, ret; | ||||
| 	u32 gpio; | ||||
| 	struct smscore_config_gpio gpioconfig = { | ||||
| 		.direction            = SMS_GPIO_DIRECTION_OUTPUT, | ||||
| 		.pullupdown           = SMS_GPIO_PULLUPDOWN_NONE, | ||||
| 		.inputcharacteristics = SMS_GPIO_INPUTCHARACTERISTICS_NORMAL, | ||||
| 		.outputslewrate       = SMS_GPIO_OUTPUT_SLEW_RATE_FAST, | ||||
| 		.outputdriving        = SMS_GPIO_OUTPUTDRIVING_S_4mA, | ||||
| 	}; | ||||
| 
 | ||||
| 	if (pin == 0) | ||||
| 		return -EINVAL; | ||||
| 
 | ||||
| 	if (pin < 0) { | ||||
| 		/* inverted gpio */ | ||||
| 		gpio = pin * -1; | ||||
| 		lvl = enable ? 0 : 1; | ||||
| 	} else { | ||||
| 		gpio = pin; | ||||
| 		lvl = enable ? 1 : 0; | ||||
| 	} | ||||
| 
 | ||||
| 	ret = smscore_configure_gpio(coredev, gpio, &gpioconfig); | ||||
| 	if (ret < 0) | ||||
| 		return ret; | ||||
| 
 | ||||
| 	return smscore_set_gpio(coredev, gpio, lvl); | ||||
| } | ||||
| 
 | ||||
| int sms_board_setup(struct smscore_device_t *coredev) | ||||
| { | ||||
| 	int board_id = smscore_get_board_id(coredev); | ||||
| 	struct sms_board *board = sms_get_board(board_id); | ||||
| 
 | ||||
| 	switch (board_id) { | ||||
| 	case SMS1XXX_BOARD_HAUPPAUGE_WINDHAM: | ||||
| 		/* turn off all LEDs */ | ||||
| 		sms_set_gpio(coredev, board->led_power, 0); | ||||
| 		sms_set_gpio(coredev, board->led_hi, 0); | ||||
| 		sms_set_gpio(coredev, board->led_lo, 0); | ||||
| 		break; | ||||
| 	case SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD_R2: | ||||
| 	case SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD: | ||||
| 		/* turn off LNA */ | ||||
| 		sms_set_gpio(coredev, board->lna_ctrl, 0); | ||||
| 		break; | ||||
| 	} | ||||
| 	return 0; | ||||
| } | ||||
| EXPORT_SYMBOL_GPL(sms_board_setup); | ||||
| 
 | ||||
| int sms_board_power(struct smscore_device_t *coredev, int onoff) | ||||
| { | ||||
| 	int board_id = smscore_get_board_id(coredev); | ||||
| 	struct sms_board *board = sms_get_board(board_id); | ||||
| 
 | ||||
| 	switch (board_id) { | ||||
| 	case SMS1XXX_BOARD_HAUPPAUGE_WINDHAM: | ||||
| 		/* power LED */ | ||||
| 		sms_set_gpio(coredev, | ||||
| 			     board->led_power, onoff ? 1 : 0); | ||||
| 		break; | ||||
| 	case SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD_R2: | ||||
| 	case SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD: | ||||
| 		/* LNA */ | ||||
| 		if (!onoff) | ||||
| 			sms_set_gpio(coredev, board->lna_ctrl, 0); | ||||
| 		break; | ||||
| 	} | ||||
| 	return 0; | ||||
| } | ||||
| EXPORT_SYMBOL_GPL(sms_board_power); | ||||
| 
 | ||||
| int sms_board_led_feedback(struct smscore_device_t *coredev, int led) | ||||
| { | ||||
| 	int board_id = smscore_get_board_id(coredev); | ||||
| 	struct sms_board *board = sms_get_board(board_id); | ||||
| 
 | ||||
| 	/* dont touch GPIO if LEDs are already set */ | ||||
| 	if (smscore_led_state(coredev, -1) == led) | ||||
| 		return 0; | ||||
| 
 | ||||
| 	switch (board_id) { | ||||
| 	case SMS1XXX_BOARD_HAUPPAUGE_WINDHAM: | ||||
| 		sms_set_gpio(coredev, | ||||
| 			     board->led_lo, (led & SMS_LED_LO) ? 1 : 0); | ||||
| 		sms_set_gpio(coredev, | ||||
| 			     board->led_hi, (led & SMS_LED_HI) ? 1 : 0); | ||||
| 
 | ||||
| 		smscore_led_state(coredev, led); | ||||
| 		break; | ||||
| 	} | ||||
| 	return 0; | ||||
| } | ||||
| EXPORT_SYMBOL_GPL(sms_board_led_feedback); | ||||
| 
 | ||||
| int sms_board_lna_control(struct smscore_device_t *coredev, int onoff) | ||||
| { | ||||
| 	int board_id = smscore_get_board_id(coredev); | ||||
| 	struct sms_board *board = sms_get_board(board_id); | ||||
| 
 | ||||
| 	sms_debug("%s: LNA %s", __func__, onoff ? "enabled" : "disabled"); | ||||
| 
 | ||||
| 	switch (board_id) { | ||||
| 	case SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD_R2: | ||||
| 	case SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD: | ||||
| 		sms_set_gpio(coredev, | ||||
| 			     board->rf_switch, onoff ? 1 : 0); | ||||
| 		return sms_set_gpio(coredev, | ||||
| 				    board->lna_ctrl, onoff ? 1 : 0); | ||||
| 	} | ||||
| 	return -EINVAL; | ||||
| } | ||||
| EXPORT_SYMBOL_GPL(sms_board_lna_control); | ||||
| 
 | ||||
| int sms_board_load_modules(int id) | ||||
| { | ||||
| 	request_module("smsdvb"); | ||||
| 	return 0; | ||||
| } | ||||
| EXPORT_SYMBOL_GPL(sms_board_load_modules); | ||||
							
								
								
									
										138
									
								
								drivers/media/common/siano/sms-cards.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										138
									
								
								drivers/media/common/siano/sms-cards.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,138 @@ | |||
| /*
 | ||||
|  *  Card-specific functions for the Siano SMS1xxx USB dongle | ||||
|  * | ||||
|  *  Copyright (c) 2008 Michael Krufky <mkrufky@linuxtv.org> | ||||
|  * | ||||
|  *  This program is free software; you can redistribute it and/or modify | ||||
|  *  it under the terms of the GNU General Public License version 2 as | ||||
|  *  published by the Free Software Foundation; | ||||
|  * | ||||
|  *  Software distributed under the License is distributed on an "AS IS" | ||||
|  *  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. | ||||
|  * | ||||
|  *  See the GNU General Public License for more details. | ||||
|  * | ||||
|  *  You should have received a copy of the GNU General Public License | ||||
|  *  along with this program; if not, write to the Free Software | ||||
|  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||||
|  */ | ||||
| 
 | ||||
| #ifndef __SMS_CARDS_H__ | ||||
| #define __SMS_CARDS_H__ | ||||
| 
 | ||||
| #include <linux/usb.h> | ||||
| #include "smscoreapi.h" | ||||
| #include "smsir.h" | ||||
| 
 | ||||
| #define SMS_BOARD_UNKNOWN 0 | ||||
| #define SMS1XXX_BOARD_SIANO_STELLAR 1 | ||||
| #define SMS1XXX_BOARD_SIANO_NOVA_A  2 | ||||
| #define SMS1XXX_BOARD_SIANO_NOVA_B  3 | ||||
| #define SMS1XXX_BOARD_SIANO_VEGA    4 | ||||
| #define SMS1XXX_BOARD_HAUPPAUGE_CATAMOUNT 5 | ||||
| #define SMS1XXX_BOARD_HAUPPAUGE_OKEMO_A 6 | ||||
| #define SMS1XXX_BOARD_HAUPPAUGE_OKEMO_B 7 | ||||
| #define SMS1XXX_BOARD_HAUPPAUGE_WINDHAM 8 | ||||
| #define SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD 9 | ||||
| #define SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD_R2 10 | ||||
| #define SMS1XXX_BOARD_SIANO_NICE	11 | ||||
| #define SMS1XXX_BOARD_SIANO_VENICE	12 | ||||
| #define SMS1XXX_BOARD_SIANO_STELLAR_ROM 13 | ||||
| #define SMS1XXX_BOARD_ZTE_DVB_DATA_CARD	14 | ||||
| #define SMS1XXX_BOARD_ONDA_MDTV_DATA_CARD 15 | ||||
| #define SMS1XXX_BOARD_SIANO_MING	16 | ||||
| #define SMS1XXX_BOARD_SIANO_PELE	17 | ||||
| #define SMS1XXX_BOARD_SIANO_RIO		18 | ||||
| #define SMS1XXX_BOARD_SIANO_DENVER_1530	19 | ||||
| #define SMS1XXX_BOARD_SIANO_DENVER_2160 20 | ||||
| #define SMS1XXX_BOARD_PCTV_77E		21 | ||||
| 
 | ||||
| struct sms_board_gpio_cfg { | ||||
| 	int lna_vhf_exist; | ||||
| 	int lna_vhf_ctrl; | ||||
| 	int lna_uhf_exist; | ||||
| 	int lna_uhf_ctrl; | ||||
| 	int lna_uhf_d_ctrl; | ||||
| 	int lna_sband_exist; | ||||
| 	int lna_sband_ctrl; | ||||
| 	int lna_sband_d_ctrl; | ||||
| 	int foreign_lna0_ctrl; | ||||
| 	int foreign_lna1_ctrl; | ||||
| 	int foreign_lna2_ctrl; | ||||
| 	int rf_switch_vhf; | ||||
| 	int rf_switch_uhf; | ||||
| 	int rf_switch_sband; | ||||
| 	int leds_power; | ||||
| 	int led0; | ||||
| 	int led1; | ||||
| 	int led2; | ||||
| 	int led3; | ||||
| 	int led4; | ||||
| 	int ir; | ||||
| 	int eeprom_wp; | ||||
| 	int mrc_sense; | ||||
| 	int mrc_pdn_resetn; | ||||
| 	int mrc_gp0; /* mrcs spi int */ | ||||
| 	int mrc_gp1; | ||||
| 	int mrc_gp2; | ||||
| 	int mrc_gp3; | ||||
| 	int mrc_gp4; | ||||
| 	int host_spi_gsp_ts_int; | ||||
| }; | ||||
| 
 | ||||
| struct sms_board { | ||||
| 	enum sms_device_type_st type; | ||||
| 	char *name, *fw[DEVICE_MODE_MAX]; | ||||
| 	struct sms_board_gpio_cfg board_cfg; | ||||
| 	char *rc_codes;				/* Name of IR codes table */ | ||||
| 
 | ||||
| 	/* gpios */ | ||||
| 	int led_power, led_hi, led_lo, lna_ctrl, rf_switch; | ||||
| 
 | ||||
| 	char intf_num; | ||||
| 	int default_mode; | ||||
| 	unsigned int mtu; | ||||
| 	unsigned int crystal; | ||||
| 	struct sms_antenna_config_ST *antenna_config; | ||||
| }; | ||||
| 
 | ||||
| struct sms_board *sms_get_board(unsigned id); | ||||
| 
 | ||||
| extern struct smscore_device_t *coredev; | ||||
| 
 | ||||
| enum SMS_BOARD_EVENTS { | ||||
| 	BOARD_EVENT_POWER_INIT, | ||||
| 	BOARD_EVENT_POWER_SUSPEND, | ||||
| 	BOARD_EVENT_POWER_RESUME, | ||||
| 	BOARD_EVENT_BIND, | ||||
| 	BOARD_EVENT_SCAN_PROG, | ||||
| 	BOARD_EVENT_SCAN_COMP, | ||||
| 	BOARD_EVENT_EMERGENCY_WARNING_SIGNAL, | ||||
| 	BOARD_EVENT_FE_LOCK, | ||||
| 	BOARD_EVENT_FE_UNLOCK, | ||||
| 	BOARD_EVENT_DEMOD_LOCK, | ||||
| 	BOARD_EVENT_DEMOD_UNLOCK, | ||||
| 	BOARD_EVENT_RECEPTION_MAX_4, | ||||
| 	BOARD_EVENT_RECEPTION_3, | ||||
| 	BOARD_EVENT_RECEPTION_2, | ||||
| 	BOARD_EVENT_RECEPTION_1, | ||||
| 	BOARD_EVENT_RECEPTION_LOST_0, | ||||
| 	BOARD_EVENT_MULTIPLEX_OK, | ||||
| 	BOARD_EVENT_MULTIPLEX_ERRORS | ||||
| }; | ||||
| 
 | ||||
| int sms_board_event(struct smscore_device_t *coredev, | ||||
| 		enum SMS_BOARD_EVENTS gevent); | ||||
| 
 | ||||
| int sms_board_setup(struct smscore_device_t *coredev); | ||||
| 
 | ||||
| #define SMS_LED_OFF 0 | ||||
| #define SMS_LED_LO  1 | ||||
| #define SMS_LED_HI  2 | ||||
| int sms_board_led_feedback(struct smscore_device_t *coredev, int led); | ||||
| int sms_board_power(struct smscore_device_t *coredev, int onoff); | ||||
| int sms_board_lna_control(struct smscore_device_t *coredev, int onoff); | ||||
| 
 | ||||
| extern int sms_board_load_modules(int id); | ||||
| 
 | ||||
| #endif /* __SMS_CARDS_H__ */ | ||||
							
								
								
									
										2198
									
								
								drivers/media/common/siano/smscoreapi.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										2198
									
								
								drivers/media/common/siano/smscoreapi.c
									
										
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										1192
									
								
								drivers/media/common/siano/smscoreapi.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										1192
									
								
								drivers/media/common/siano/smscoreapi.h
									
										
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										551
									
								
								drivers/media/common/siano/smsdvb-debugfs.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										551
									
								
								drivers/media/common/siano/smsdvb-debugfs.c
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,551 @@ | |||
| /***********************************************************************
 | ||||
|  * | ||||
|  * Copyright(c) 2013 Mauro Carvalho Chehab | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 2 of the License, or | ||||
|  * (at your option) any later version. | ||||
| 
 | ||||
|  *  This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | ||||
|  * | ||||
|  ***********************************************************************/ | ||||
| 
 | ||||
| #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt | ||||
| 
 | ||||
| #include <linux/module.h> | ||||
| #include <linux/slab.h> | ||||
| #include <linux/init.h> | ||||
| #include <linux/debugfs.h> | ||||
| #include <linux/spinlock.h> | ||||
| #include <linux/usb.h> | ||||
| 
 | ||||
| #include "dmxdev.h" | ||||
| #include "dvbdev.h" | ||||
| #include "dvb_demux.h" | ||||
| #include "dvb_frontend.h" | ||||
| 
 | ||||
| #include "smscoreapi.h" | ||||
| 
 | ||||
| #include "smsdvb.h" | ||||
| 
 | ||||
| static struct dentry *smsdvb_debugfs_usb_root; | ||||
| 
 | ||||
| struct smsdvb_debugfs { | ||||
| 	struct kref		refcount; | ||||
| 	spinlock_t		lock; | ||||
| 
 | ||||
| 	char			stats_data[PAGE_SIZE]; | ||||
| 	unsigned		stats_count; | ||||
| 	bool			stats_was_read; | ||||
| 
 | ||||
| 	wait_queue_head_t	stats_queue; | ||||
| }; | ||||
| 
 | ||||
| static void smsdvb_print_dvb_stats(struct smsdvb_debugfs *debug_data, | ||||
| 			    struct sms_stats *p) | ||||
| { | ||||
| 	int n = 0; | ||||
| 	char *buf; | ||||
| 
 | ||||
| 	spin_lock(&debug_data->lock); | ||||
| 	if (debug_data->stats_count) { | ||||
| 		spin_unlock(&debug_data->lock); | ||||
| 		return; | ||||
| 	} | ||||
| 
 | ||||
| 	buf = debug_data->stats_data; | ||||
| 
 | ||||
| 	n += snprintf(&buf[n], PAGE_SIZE - n, | ||||
| 		      "is_rf_locked = %d\n", p->is_rf_locked); | ||||
| 	n += snprintf(&buf[n], PAGE_SIZE - n, | ||||
| 		      "is_demod_locked = %d\n", p->is_demod_locked); | ||||
| 	n += snprintf(&buf[n], PAGE_SIZE - n, | ||||
| 		      "is_external_lna_on = %d\n", p->is_external_lna_on); | ||||
| 	n += snprintf(&buf[n], PAGE_SIZE - n, | ||||
| 		      "SNR = %d\n", p->SNR); | ||||
| 	n += snprintf(&buf[n], PAGE_SIZE - n, | ||||
| 		      "ber = %d\n", p->ber); | ||||
| 	n += snprintf(&buf[n], PAGE_SIZE - n, | ||||
| 		      "FIB_CRC = %d\n", p->FIB_CRC); | ||||
| 	n += snprintf(&buf[n], PAGE_SIZE - n, | ||||
| 		      "ts_per = %d\n", p->ts_per); | ||||
| 	n += snprintf(&buf[n], PAGE_SIZE - n, | ||||
| 		      "MFER = %d\n", p->MFER); | ||||
| 	n += snprintf(&buf[n], PAGE_SIZE - n, | ||||
| 		      "RSSI = %d\n", p->RSSI); | ||||
| 	n += snprintf(&buf[n], PAGE_SIZE - n, | ||||
| 		      "in_band_pwr = %d\n", p->in_band_pwr); | ||||
| 	n += snprintf(&buf[n], PAGE_SIZE - n, | ||||
| 		      "carrier_offset = %d\n", p->carrier_offset); | ||||
| 	n += snprintf(&buf[n], PAGE_SIZE - n, | ||||
| 		      "modem_state = %d\n", p->modem_state); | ||||
| 	n += snprintf(&buf[n], PAGE_SIZE - n, | ||||
| 		      "frequency = %d\n", p->frequency); | ||||
| 	n += snprintf(&buf[n], PAGE_SIZE - n, | ||||
| 		      "bandwidth = %d\n", p->bandwidth); | ||||
| 	n += snprintf(&buf[n], PAGE_SIZE - n, | ||||
| 		      "transmission_mode = %d\n", p->transmission_mode); | ||||
| 	n += snprintf(&buf[n], PAGE_SIZE - n, | ||||
| 		      "modem_state = %d\n", p->modem_state); | ||||
| 	n += snprintf(&buf[n], PAGE_SIZE - n, | ||||
| 		      "guard_interval = %d\n", p->guard_interval); | ||||
| 	n += snprintf(&buf[n], PAGE_SIZE - n, | ||||
| 		      "code_rate = %d\n", p->code_rate); | ||||
| 	n += snprintf(&buf[n], PAGE_SIZE - n, | ||||
| 		      "lp_code_rate = %d\n", p->lp_code_rate); | ||||
| 	n += snprintf(&buf[n], PAGE_SIZE - n, | ||||
| 		      "hierarchy = %d\n", p->hierarchy); | ||||
| 	n += snprintf(&buf[n], PAGE_SIZE - n, | ||||
| 		      "constellation = %d\n", p->constellation); | ||||
| 	n += snprintf(&buf[n], PAGE_SIZE - n, | ||||
| 		      "burst_size = %d\n", p->burst_size); | ||||
| 	n += snprintf(&buf[n], PAGE_SIZE - n, | ||||
| 		      "burst_duration = %d\n", p->burst_duration); | ||||
| 	n += snprintf(&buf[n], PAGE_SIZE - n, | ||||
| 		      "burst_cycle_time = %d\n", p->burst_cycle_time); | ||||
| 	n += snprintf(&buf[n], PAGE_SIZE - n, | ||||
| 		      "calc_burst_cycle_time = %d\n", | ||||
| 		      p->calc_burst_cycle_time); | ||||
| 	n += snprintf(&buf[n], PAGE_SIZE - n, | ||||
| 		      "num_of_rows = %d\n", p->num_of_rows); | ||||
| 	n += snprintf(&buf[n], PAGE_SIZE - n, | ||||
| 		      "num_of_padd_cols = %d\n", p->num_of_padd_cols); | ||||
| 	n += snprintf(&buf[n], PAGE_SIZE - n, | ||||
| 		      "num_of_punct_cols = %d\n", p->num_of_punct_cols); | ||||
| 	n += snprintf(&buf[n], PAGE_SIZE - n, | ||||
| 		      "error_ts_packets = %d\n", p->error_ts_packets); | ||||
| 	n += snprintf(&buf[n], PAGE_SIZE - n, | ||||
| 		      "total_ts_packets = %d\n", p->total_ts_packets); | ||||
| 	n += snprintf(&buf[n], PAGE_SIZE - n, | ||||
| 		      "num_of_valid_mpe_tlbs = %d\n", p->num_of_valid_mpe_tlbs); | ||||
| 	n += snprintf(&buf[n], PAGE_SIZE - n, | ||||
| 		      "num_of_invalid_mpe_tlbs = %d\n", p->num_of_invalid_mpe_tlbs); | ||||
| 	n += snprintf(&buf[n], PAGE_SIZE - n, | ||||
| 		      "num_of_corrected_mpe_tlbs = %d\n", p->num_of_corrected_mpe_tlbs); | ||||
| 	n += snprintf(&buf[n], PAGE_SIZE - n, | ||||
| 		      "ber_error_count = %d\n", p->ber_error_count); | ||||
| 	n += snprintf(&buf[n], PAGE_SIZE - n, | ||||
| 		      "ber_bit_count = %d\n", p->ber_bit_count); | ||||
| 	n += snprintf(&buf[n], PAGE_SIZE - n, | ||||
| 		      "sms_to_host_tx_errors = %d\n", p->sms_to_host_tx_errors); | ||||
| 	n += snprintf(&buf[n], PAGE_SIZE - n, | ||||
| 		      "pre_ber = %d\n", p->pre_ber); | ||||
| 	n += snprintf(&buf[n], PAGE_SIZE - n, | ||||
| 		      "cell_id = %d\n", p->cell_id); | ||||
| 	n += snprintf(&buf[n], PAGE_SIZE - n, | ||||
| 		      "dvbh_srv_ind_hp = %d\n", p->dvbh_srv_ind_hp); | ||||
| 	n += snprintf(&buf[n], PAGE_SIZE - n, | ||||
| 		      "dvbh_srv_ind_lp = %d\n", p->dvbh_srv_ind_lp); | ||||
| 	n += snprintf(&buf[n], PAGE_SIZE - n, | ||||
| 		      "num_mpe_received = %d\n", p->num_mpe_received); | ||||
| 
 | ||||
| 	debug_data->stats_count = n; | ||||
| 	spin_unlock(&debug_data->lock); | ||||
| 	wake_up(&debug_data->stats_queue); | ||||
| } | ||||
| 
 | ||||
| static void smsdvb_print_isdb_stats(struct smsdvb_debugfs *debug_data, | ||||
| 			     struct sms_isdbt_stats *p) | ||||
| { | ||||
| 	int i, n = 0; | ||||
| 	char *buf; | ||||
| 
 | ||||
| 	spin_lock(&debug_data->lock); | ||||
| 	if (debug_data->stats_count) { | ||||
| 		spin_unlock(&debug_data->lock); | ||||
| 		return; | ||||
| 	} | ||||
| 
 | ||||
| 	buf = debug_data->stats_data; | ||||
| 
 | ||||
| 	n += snprintf(&buf[n], PAGE_SIZE - n, | ||||
| 		      "statistics_type = %d\t", p->statistics_type); | ||||
| 	n += snprintf(&buf[n], PAGE_SIZE - n, | ||||
| 		      "full_size = %d\n", p->full_size); | ||||
| 
 | ||||
| 	n += snprintf(&buf[n], PAGE_SIZE - n, | ||||
| 		      "is_rf_locked = %d\t\t", p->is_rf_locked); | ||||
| 	n += snprintf(&buf[n], PAGE_SIZE - n, | ||||
| 		      "is_demod_locked = %d\t", p->is_demod_locked); | ||||
| 	n += snprintf(&buf[n], PAGE_SIZE - n, | ||||
| 		      "is_external_lna_on = %d\n", p->is_external_lna_on); | ||||
| 	n += snprintf(&buf[n], PAGE_SIZE - n, | ||||
| 		      "SNR = %d dB\t\t", p->SNR); | ||||
| 	n += snprintf(&buf[n], PAGE_SIZE - n, | ||||
| 		      "RSSI = %d dBm\t\t", p->RSSI); | ||||
| 	n += snprintf(&buf[n], PAGE_SIZE - n, | ||||
| 		      "in_band_pwr = %d dBm\n", p->in_band_pwr); | ||||
| 	n += snprintf(&buf[n], PAGE_SIZE - n, | ||||
| 		      "carrier_offset = %d\t", p->carrier_offset); | ||||
| 	n += snprintf(&buf[n], PAGE_SIZE - n, | ||||
| 		      "bandwidth = %d\t\t", p->bandwidth); | ||||
| 	n += snprintf(&buf[n], PAGE_SIZE - n, | ||||
| 		      "frequency = %d Hz\n", p->frequency); | ||||
| 	n += snprintf(&buf[n], PAGE_SIZE - n, | ||||
| 		      "transmission_mode = %d\t", p->transmission_mode); | ||||
| 	n += snprintf(&buf[n], PAGE_SIZE - n, | ||||
| 		      "modem_state = %d\t\t", p->modem_state); | ||||
| 	n += snprintf(&buf[n], PAGE_SIZE - n, | ||||
| 		      "guard_interval = %d\n", p->guard_interval); | ||||
| 	n += snprintf(&buf[n], PAGE_SIZE - n, | ||||
| 		      "system_type = %d\t\t", p->system_type); | ||||
| 	n += snprintf(&buf[n], PAGE_SIZE - n, | ||||
| 		      "partial_reception = %d\t", p->partial_reception); | ||||
| 	n += snprintf(&buf[n], PAGE_SIZE - n, | ||||
| 		      "num_of_layers = %d\n", p->num_of_layers); | ||||
| 	n += snprintf(&buf[n], PAGE_SIZE - n, | ||||
| 		      "sms_to_host_tx_errors = %d\n", p->sms_to_host_tx_errors); | ||||
| 
 | ||||
| 	for (i = 0; i < 3; i++) { | ||||
| 		if (p->layer_info[i].number_of_segments < 1 || | ||||
| 		    p->layer_info[i].number_of_segments > 13) | ||||
| 			continue; | ||||
| 
 | ||||
| 		n += snprintf(&buf[n], PAGE_SIZE - n, "\nLayer %d\n", i); | ||||
| 		n += snprintf(&buf[n], PAGE_SIZE - n, "\tcode_rate = %d\t", | ||||
| 			      p->layer_info[i].code_rate); | ||||
| 		n += snprintf(&buf[n], PAGE_SIZE - n, "constellation = %d\n", | ||||
| 			      p->layer_info[i].constellation); | ||||
| 		n += snprintf(&buf[n], PAGE_SIZE - n, "\tber = %-5d\t", | ||||
| 			      p->layer_info[i].ber); | ||||
| 		n += snprintf(&buf[n], PAGE_SIZE - n, "\tber_error_count = %-5d\t", | ||||
| 			      p->layer_info[i].ber_error_count); | ||||
| 		n += snprintf(&buf[n], PAGE_SIZE - n, "ber_bit_count = %-5d\n", | ||||
| 			      p->layer_info[i].ber_bit_count); | ||||
| 		n += snprintf(&buf[n], PAGE_SIZE - n, "\tpre_ber = %-5d\t", | ||||
| 			      p->layer_info[i].pre_ber); | ||||
| 		n += snprintf(&buf[n], PAGE_SIZE - n, "\tts_per = %-5d\n", | ||||
| 			      p->layer_info[i].ts_per); | ||||
| 		n += snprintf(&buf[n], PAGE_SIZE - n, "\terror_ts_packets = %-5d\t", | ||||
| 			      p->layer_info[i].error_ts_packets); | ||||
| 		n += snprintf(&buf[n], PAGE_SIZE - n, "total_ts_packets = %-5d\t", | ||||
| 			      p->layer_info[i].total_ts_packets); | ||||
| 		n += snprintf(&buf[n], PAGE_SIZE - n, "ti_ldepth_i = %d\n", | ||||
| 			      p->layer_info[i].ti_ldepth_i); | ||||
| 		n += snprintf(&buf[n], PAGE_SIZE - n, | ||||
| 			      "\tnumber_of_segments = %d\t", | ||||
| 			      p->layer_info[i].number_of_segments); | ||||
| 		n += snprintf(&buf[n], PAGE_SIZE - n, "tmcc_errors = %d\n", | ||||
| 			      p->layer_info[i].tmcc_errors); | ||||
| 	} | ||||
| 
 | ||||
| 	debug_data->stats_count = n; | ||||
| 	spin_unlock(&debug_data->lock); | ||||
| 	wake_up(&debug_data->stats_queue); | ||||
| } | ||||
| 
 | ||||
| static void smsdvb_print_isdb_stats_ex(struct smsdvb_debugfs *debug_data, | ||||
| 				struct sms_isdbt_stats_ex *p) | ||||
| { | ||||
| 	int i, n = 0; | ||||
| 	char *buf; | ||||
| 
 | ||||
| 	spin_lock(&debug_data->lock); | ||||
| 	if (debug_data->stats_count) { | ||||
| 		spin_unlock(&debug_data->lock); | ||||
| 		return; | ||||
| 	} | ||||
| 
 | ||||
| 	buf = debug_data->stats_data; | ||||
| 
 | ||||
| 	n += snprintf(&buf[n], PAGE_SIZE - n, | ||||
| 		      "statistics_type = %d\t", p->statistics_type); | ||||
| 	n += snprintf(&buf[n], PAGE_SIZE - n, | ||||
| 		      "full_size = %d\n", p->full_size); | ||||
| 
 | ||||
| 	n += snprintf(&buf[n], PAGE_SIZE - n, | ||||
| 		      "is_rf_locked = %d\t\t", p->is_rf_locked); | ||||
| 	n += snprintf(&buf[n], PAGE_SIZE - n, | ||||
| 		      "is_demod_locked = %d\t", p->is_demod_locked); | ||||
| 	n += snprintf(&buf[n], PAGE_SIZE - n, | ||||
| 		      "is_external_lna_on = %d\n", p->is_external_lna_on); | ||||
| 	n += snprintf(&buf[n], PAGE_SIZE - n, | ||||
| 		      "SNR = %d dB\t\t", p->SNR); | ||||
| 	n += snprintf(&buf[n], PAGE_SIZE - n, | ||||
| 		      "RSSI = %d dBm\t\t", p->RSSI); | ||||
| 	n += snprintf(&buf[n], PAGE_SIZE - n, | ||||
| 		      "in_band_pwr = %d dBm\n", p->in_band_pwr); | ||||
| 	n += snprintf(&buf[n], PAGE_SIZE - n, | ||||
| 		      "carrier_offset = %d\t", p->carrier_offset); | ||||
| 	n += snprintf(&buf[n], PAGE_SIZE - n, | ||||
| 		      "bandwidth = %d\t\t", p->bandwidth); | ||||
| 	n += snprintf(&buf[n], PAGE_SIZE - n, | ||||
| 		      "frequency = %d Hz\n", p->frequency); | ||||
| 	n += snprintf(&buf[n], PAGE_SIZE - n, | ||||
| 		      "transmission_mode = %d\t", p->transmission_mode); | ||||
| 	n += snprintf(&buf[n], PAGE_SIZE - n, | ||||
| 		      "modem_state = %d\t\t", p->modem_state); | ||||
| 	n += snprintf(&buf[n], PAGE_SIZE - n, | ||||
| 		      "guard_interval = %d\n", p->guard_interval); | ||||
| 	n += snprintf(&buf[n], PAGE_SIZE - n, | ||||
| 		      "system_type = %d\t\t", p->system_type); | ||||
| 	n += snprintf(&buf[n], PAGE_SIZE - n, | ||||
| 		      "partial_reception = %d\t", p->partial_reception); | ||||
| 	n += snprintf(&buf[n], PAGE_SIZE - n, | ||||
| 		      "num_of_layers = %d\n", p->num_of_layers); | ||||
| 	n += snprintf(&buf[n], PAGE_SIZE - n, "segment_number = %d\t", | ||||
| 		      p->segment_number); | ||||
| 	n += snprintf(&buf[n], PAGE_SIZE - n, "tune_bw = %d\n", | ||||
| 		      p->tune_bw); | ||||
| 
 | ||||
| 	for (i = 0; i < 3; i++) { | ||||
| 		if (p->layer_info[i].number_of_segments < 1 || | ||||
| 		    p->layer_info[i].number_of_segments > 13) | ||||
| 			continue; | ||||
| 
 | ||||
| 		n += snprintf(&buf[n], PAGE_SIZE - n, "\nLayer %d\n", i); | ||||
| 		n += snprintf(&buf[n], PAGE_SIZE - n, "\tcode_rate = %d\t", | ||||
| 			      p->layer_info[i].code_rate); | ||||
| 		n += snprintf(&buf[n], PAGE_SIZE - n, "constellation = %d\n", | ||||
| 			      p->layer_info[i].constellation); | ||||
| 		n += snprintf(&buf[n], PAGE_SIZE - n, "\tber = %-5d\t", | ||||
| 			      p->layer_info[i].ber); | ||||
| 		n += snprintf(&buf[n], PAGE_SIZE - n, "\tber_error_count = %-5d\t", | ||||
| 			      p->layer_info[i].ber_error_count); | ||||
| 		n += snprintf(&buf[n], PAGE_SIZE - n, "ber_bit_count = %-5d\n", | ||||
| 			      p->layer_info[i].ber_bit_count); | ||||
| 		n += snprintf(&buf[n], PAGE_SIZE - n, "\tpre_ber = %-5d\t", | ||||
| 			      p->layer_info[i].pre_ber); | ||||
| 		n += snprintf(&buf[n], PAGE_SIZE - n, "\tts_per = %-5d\n", | ||||
| 			      p->layer_info[i].ts_per); | ||||
| 		n += snprintf(&buf[n], PAGE_SIZE - n, "\terror_ts_packets = %-5d\t", | ||||
| 			      p->layer_info[i].error_ts_packets); | ||||
| 		n += snprintf(&buf[n], PAGE_SIZE - n, "total_ts_packets = %-5d\t", | ||||
| 			      p->layer_info[i].total_ts_packets); | ||||
| 		n += snprintf(&buf[n], PAGE_SIZE - n, "ti_ldepth_i = %d\n", | ||||
| 			      p->layer_info[i].ti_ldepth_i); | ||||
| 		n += snprintf(&buf[n], PAGE_SIZE - n, | ||||
| 			      "\tnumber_of_segments = %d\t", | ||||
| 			      p->layer_info[i].number_of_segments); | ||||
| 		n += snprintf(&buf[n], PAGE_SIZE - n, "tmcc_errors = %d\n", | ||||
| 			      p->layer_info[i].tmcc_errors); | ||||
| 	} | ||||
| 
 | ||||
| 
 | ||||
| 	debug_data->stats_count = n; | ||||
| 	spin_unlock(&debug_data->lock); | ||||
| 
 | ||||
| 	wake_up(&debug_data->stats_queue); | ||||
| } | ||||
| 
 | ||||
| static int smsdvb_stats_open(struct inode *inode, struct file *file) | ||||
| { | ||||
| 	struct smsdvb_client_t *client = inode->i_private; | ||||
| 	struct smsdvb_debugfs *debug_data = client->debug_data; | ||||
| 
 | ||||
| 	kref_get(&debug_data->refcount); | ||||
| 
 | ||||
| 	spin_lock(&debug_data->lock); | ||||
| 	debug_data->stats_count = 0; | ||||
| 	debug_data->stats_was_read = false; | ||||
| 	spin_unlock(&debug_data->lock); | ||||
| 
 | ||||
| 	file->private_data = debug_data; | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static void smsdvb_debugfs_data_release(struct kref *ref) | ||||
| { | ||||
| 	struct smsdvb_debugfs *debug_data; | ||||
| 
 | ||||
| 	debug_data = container_of(ref, struct smsdvb_debugfs, refcount); | ||||
| 	kfree(debug_data); | ||||
| } | ||||
| 
 | ||||
| static int smsdvb_stats_wait_read(struct smsdvb_debugfs *debug_data) | ||||
| { | ||||
| 	int rc = 1; | ||||
| 
 | ||||
| 	spin_lock(&debug_data->lock); | ||||
| 
 | ||||
| 	if (debug_data->stats_was_read) | ||||
| 		goto exit; | ||||
| 
 | ||||
| 	rc = debug_data->stats_count; | ||||
| 
 | ||||
| exit: | ||||
| 	spin_unlock(&debug_data->lock); | ||||
| 	return rc; | ||||
| } | ||||
| 
 | ||||
| static unsigned int smsdvb_stats_poll(struct file *file, poll_table *wait) | ||||
| { | ||||
| 	struct smsdvb_debugfs *debug_data = file->private_data; | ||||
| 	int rc; | ||||
| 
 | ||||
| 	kref_get(&debug_data->refcount); | ||||
| 
 | ||||
| 	poll_wait(file, &debug_data->stats_queue, wait); | ||||
| 
 | ||||
| 	rc = smsdvb_stats_wait_read(debug_data); | ||||
| 	if (rc > 0) | ||||
| 		rc = POLLIN | POLLRDNORM; | ||||
| 
 | ||||
| 	kref_put(&debug_data->refcount, smsdvb_debugfs_data_release); | ||||
| 
 | ||||
| 	return rc; | ||||
| } | ||||
| 
 | ||||
| static ssize_t smsdvb_stats_read(struct file *file, char __user *user_buf, | ||||
| 				      size_t nbytes, loff_t *ppos) | ||||
| { | ||||
| 	int rc = 0, len; | ||||
| 	struct smsdvb_debugfs *debug_data = file->private_data; | ||||
| 
 | ||||
| 	kref_get(&debug_data->refcount); | ||||
| 
 | ||||
| 	if (file->f_flags & O_NONBLOCK) { | ||||
| 		rc = smsdvb_stats_wait_read(debug_data); | ||||
| 		if (!rc) { | ||||
| 			rc = -EWOULDBLOCK; | ||||
| 			goto ret; | ||||
| 		} | ||||
| 	} else { | ||||
| 		rc = wait_event_interruptible(debug_data->stats_queue, | ||||
| 				      smsdvb_stats_wait_read(debug_data)); | ||||
| 		if (rc < 0) | ||||
| 			goto ret; | ||||
| 	} | ||||
| 
 | ||||
| 	if (debug_data->stats_was_read) { | ||||
| 		rc = 0;	/* EOF */ | ||||
| 		goto ret; | ||||
| 	} | ||||
| 
 | ||||
| 	len = debug_data->stats_count - *ppos; | ||||
| 	if (len >= 0) | ||||
| 		rc = simple_read_from_buffer(user_buf, nbytes, ppos, | ||||
| 					     debug_data->stats_data, len); | ||||
| 	else | ||||
| 		rc = 0; | ||||
| 
 | ||||
| 	if (*ppos >= debug_data->stats_count) { | ||||
| 		spin_lock(&debug_data->lock); | ||||
| 		debug_data->stats_was_read = true; | ||||
| 		spin_unlock(&debug_data->lock); | ||||
| 	} | ||||
| ret: | ||||
| 	kref_put(&debug_data->refcount, smsdvb_debugfs_data_release); | ||||
| 	return rc; | ||||
| } | ||||
| 
 | ||||
| static int smsdvb_stats_release(struct inode *inode, struct file *file) | ||||
| { | ||||
| 	struct smsdvb_debugfs *debug_data = file->private_data; | ||||
| 
 | ||||
| 	spin_lock(&debug_data->lock); | ||||
| 	debug_data->stats_was_read = true;	/* return EOF to read() */ | ||||
| 	spin_unlock(&debug_data->lock); | ||||
| 	wake_up_interruptible_sync(&debug_data->stats_queue); | ||||
| 
 | ||||
| 	kref_put(&debug_data->refcount, smsdvb_debugfs_data_release); | ||||
| 	file->private_data = NULL; | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static const struct file_operations debugfs_stats_ops = { | ||||
| 	.open = smsdvb_stats_open, | ||||
| 	.poll = smsdvb_stats_poll, | ||||
| 	.read = smsdvb_stats_read, | ||||
| 	.release = smsdvb_stats_release, | ||||
| 	.llseek = generic_file_llseek, | ||||
| }; | ||||
| 
 | ||||
| /*
 | ||||
|  * Functions used by smsdvb, in order to create the interfaces | ||||
|  */ | ||||
| 
 | ||||
| int smsdvb_debugfs_create(struct smsdvb_client_t *client) | ||||
| { | ||||
| 	struct smscore_device_t *coredev = client->coredev; | ||||
| 	struct dentry *d; | ||||
| 	struct smsdvb_debugfs *debug_data; | ||||
| 
 | ||||
| 	if (!smsdvb_debugfs_usb_root || !coredev->is_usb_device) | ||||
| 		return -ENODEV; | ||||
| 
 | ||||
| 	client->debugfs = debugfs_create_dir(coredev->devpath, | ||||
| 					     smsdvb_debugfs_usb_root); | ||||
| 	if (IS_ERR_OR_NULL(client->debugfs)) { | ||||
| 		pr_info("Unable to create debugfs %s directory.\n", | ||||
| 			coredev->devpath); | ||||
| 		return -ENODEV; | ||||
| 	} | ||||
| 
 | ||||
| 	d = debugfs_create_file("stats", S_IRUGO | S_IWUSR, client->debugfs, | ||||
| 				client, &debugfs_stats_ops); | ||||
| 	if (!d) { | ||||
| 		debugfs_remove(client->debugfs); | ||||
| 		return -ENOMEM; | ||||
| 	} | ||||
| 
 | ||||
| 	debug_data = kzalloc(sizeof(*client->debug_data), GFP_KERNEL); | ||||
| 	if (!debug_data) | ||||
| 		return -ENOMEM; | ||||
| 
 | ||||
| 	client->debug_data        = debug_data; | ||||
| 	client->prt_dvb_stats     = smsdvb_print_dvb_stats; | ||||
| 	client->prt_isdb_stats    = smsdvb_print_isdb_stats; | ||||
| 	client->prt_isdb_stats_ex = smsdvb_print_isdb_stats_ex; | ||||
| 
 | ||||
| 	init_waitqueue_head(&debug_data->stats_queue); | ||||
| 	spin_lock_init(&debug_data->lock); | ||||
| 	kref_init(&debug_data->refcount); | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| void smsdvb_debugfs_release(struct smsdvb_client_t *client) | ||||
| { | ||||
| 	if (!client->debugfs) | ||||
| 		return; | ||||
| 
 | ||||
| 	client->prt_dvb_stats     = NULL; | ||||
| 	client->prt_isdb_stats    = NULL; | ||||
| 	client->prt_isdb_stats_ex = NULL; | ||||
| 
 | ||||
| 	debugfs_remove_recursive(client->debugfs); | ||||
| 	kref_put(&client->debug_data->refcount, smsdvb_debugfs_data_release); | ||||
| 
 | ||||
| 	client->debug_data = NULL; | ||||
| 	client->debugfs = NULL; | ||||
| } | ||||
| 
 | ||||
| int smsdvb_debugfs_register(void) | ||||
| { | ||||
| 	struct dentry *d; | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * FIXME: This was written to debug Siano USB devices. So, it creates | ||||
| 	 * the debugfs node under <debugfs>/usb. | ||||
| 	 * A similar logic would be needed for Siano sdio devices, but, in that | ||||
| 	 * case, usb_debug_root is not a good choice. | ||||
| 	 * | ||||
| 	 * Perhaps the right fix here would be to create another sysfs root | ||||
| 	 * node for sdio-based boards, but this may need some logic at sdio | ||||
| 	 * subsystem. | ||||
| 	 */ | ||||
| 	d = debugfs_create_dir("smsdvb", usb_debug_root); | ||||
| 	if (IS_ERR_OR_NULL(d)) { | ||||
| 		sms_err("Couldn't create sysfs node for smsdvb"); | ||||
| 		return PTR_ERR(d); | ||||
| 	} else { | ||||
| 		smsdvb_debugfs_usb_root = d; | ||||
| 	} | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| void smsdvb_debugfs_unregister(void) | ||||
| { | ||||
| 	debugfs_remove_recursive(smsdvb_debugfs_usb_root); | ||||
| 	smsdvb_debugfs_usb_root = NULL; | ||||
| } | ||||
							
								
								
									
										1232
									
								
								drivers/media/common/siano/smsdvb-main.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										1232
									
								
								drivers/media/common/siano/smsdvb-main.c
									
										
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										130
									
								
								drivers/media/common/siano/smsdvb.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										130
									
								
								drivers/media/common/siano/smsdvb.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,130 @@ | |||
| /***********************************************************************
 | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 2 of the License, or | ||||
|  * (at your option) any later version. | ||||
| 
 | ||||
|  *  This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | ||||
|  * | ||||
|  ***********************************************************************/ | ||||
| 
 | ||||
| struct smsdvb_debugfs; | ||||
| struct smsdvb_client_t; | ||||
| 
 | ||||
| typedef void (*sms_prt_dvb_stats_t)(struct smsdvb_debugfs *debug_data, | ||||
| 				    struct sms_stats *p); | ||||
| 
 | ||||
| typedef void (*sms_prt_isdb_stats_t)(struct smsdvb_debugfs *debug_data, | ||||
| 				     struct sms_isdbt_stats *p); | ||||
| 
 | ||||
| typedef void (*sms_prt_isdb_stats_ex_t) | ||||
| 			(struct smsdvb_debugfs *debug_data, | ||||
| 			 struct sms_isdbt_stats_ex *p); | ||||
| 
 | ||||
| 
 | ||||
| struct smsdvb_client_t { | ||||
| 	struct list_head entry; | ||||
| 
 | ||||
| 	struct smscore_device_t *coredev; | ||||
| 	struct smscore_client_t *smsclient; | ||||
| 
 | ||||
| 	struct dvb_adapter      adapter; | ||||
| 	struct dvb_demux        demux; | ||||
| 	struct dmxdev           dmxdev; | ||||
| 	struct dvb_frontend     frontend; | ||||
| 
 | ||||
| 	fe_status_t             fe_status; | ||||
| 
 | ||||
| 	struct completion       tune_done; | ||||
| 	struct completion       stats_done; | ||||
| 
 | ||||
| 	int last_per; | ||||
| 
 | ||||
| 	int legacy_ber, legacy_per; | ||||
| 
 | ||||
| 	int event_fe_state; | ||||
| 	int event_unc_state; | ||||
| 
 | ||||
| 	unsigned long		get_stats_jiffies; | ||||
| 
 | ||||
| 	int			feed_users; | ||||
| 	bool			has_tuned; | ||||
| 
 | ||||
| 	/* stats debugfs data */ | ||||
| 	struct dentry		*debugfs; | ||||
| 
 | ||||
| 	struct smsdvb_debugfs	*debug_data; | ||||
| 
 | ||||
| 	sms_prt_dvb_stats_t	prt_dvb_stats; | ||||
| 	sms_prt_isdb_stats_t	prt_isdb_stats; | ||||
| 	sms_prt_isdb_stats_ex_t	prt_isdb_stats_ex; | ||||
| }; | ||||
| 
 | ||||
| /*
 | ||||
|  * This struct is a mix of struct sms_rx_stats_ex and | ||||
|  * struct sms_srvm_signal_status. | ||||
|  * It was obtained by comparing the way it was filled by the original code | ||||
|  */ | ||||
| struct RECEPTION_STATISTICS_PER_SLICES_S { | ||||
| 	u32 result; | ||||
| 	u32 snr; | ||||
| 	s32 in_band_power; | ||||
| 	u32 ts_packets; | ||||
| 	u32 ets_packets; | ||||
| 	u32 constellation; | ||||
| 	u32 hp_code; | ||||
| 	u32 tps_srv_ind_lp; | ||||
| 	u32 tps_srv_ind_hp; | ||||
| 	u32 cell_id; | ||||
| 	u32 reason; | ||||
| 	u32 request_id; | ||||
| 	u32 modem_state;		/* from SMSHOSTLIB_DVB_MODEM_STATE_ET */ | ||||
| 
 | ||||
| 	u32 ber;		/* Post Viterbi BER [1E-5] */ | ||||
| 	s32 RSSI;		/* dBm */ | ||||
| 	s32 carrier_offset;	/* Carrier Offset in bin/1024 */ | ||||
| 
 | ||||
| 	u32 is_rf_locked;		/* 0 - not locked, 1 - locked */ | ||||
| 	u32 is_demod_locked;	/* 0 - not locked, 1 - locked */ | ||||
| 
 | ||||
| 	u32 ber_bit_count;	/* Total number of SYNC bits. */ | ||||
| 	u32 ber_error_count;	/* Number of erroneous SYNC bits. */ | ||||
| 
 | ||||
| 	s32 MRC_SNR;		/* dB */ | ||||
| 	s32 mrc_in_band_pwr;	/* In band power in dBM */ | ||||
| 	s32 MRC_RSSI;		/* dBm */ | ||||
| }; | ||||
| 
 | ||||
| /* From smsdvb-debugfs.c */ | ||||
| #ifdef CONFIG_SMS_SIANO_DEBUGFS | ||||
| 
 | ||||
| int smsdvb_debugfs_create(struct smsdvb_client_t *client); | ||||
| void smsdvb_debugfs_release(struct smsdvb_client_t *client); | ||||
| int smsdvb_debugfs_register(void); | ||||
| void smsdvb_debugfs_unregister(void); | ||||
| 
 | ||||
| #else | ||||
| 
 | ||||
| static inline int smsdvb_debugfs_create(struct smsdvb_client_t *client) | ||||
| { | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static inline void smsdvb_debugfs_release(struct smsdvb_client_t *client) {} | ||||
| 
 | ||||
| static inline int smsdvb_debugfs_register(void) | ||||
| { | ||||
| 	return 0; | ||||
| }; | ||||
| 
 | ||||
| static inline void smsdvb_debugfs_unregister(void) {}; | ||||
| 
 | ||||
| #endif | ||||
| 
 | ||||
							
								
								
									
										103
									
								
								drivers/media/common/siano/smsendian.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										103
									
								
								drivers/media/common/siano/smsendian.c
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,103 @@ | |||
| /****************************************************************
 | ||||
| 
 | ||||
|  Siano Mobile Silicon, Inc. | ||||
|  MDTV receiver kernel modules. | ||||
|  Copyright (C) 2006-2009, Uri Shkolnik | ||||
| 
 | ||||
|  This program is free software: you can redistribute it and/or modify | ||||
|  it under the terms of the GNU General Public License as published by | ||||
|  the Free Software Foundation, either version 2 of the License, or | ||||
|  (at your option) any later version. | ||||
| 
 | ||||
|  This program is distributed in the hope that it will be useful, | ||||
|  but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  GNU General Public License for more details. | ||||
| 
 | ||||
|  You should have received a copy of the GNU General Public License | ||||
|  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | ||||
| 
 | ||||
|  ****************************************************************/ | ||||
| 
 | ||||
| #include <linux/export.h> | ||||
| #include <asm/byteorder.h> | ||||
| 
 | ||||
| #include "smsendian.h" | ||||
| #include "smscoreapi.h" | ||||
| 
 | ||||
| void smsendian_handle_tx_message(void *buffer) | ||||
| { | ||||
| #ifdef __BIG_ENDIAN | ||||
| 	struct sms_msg_data *msg = (struct sms_msg_data *)buffer; | ||||
| 	int i; | ||||
| 	int msg_words; | ||||
| 
 | ||||
| 	switch (msg->x_msg_header.msg_type) { | ||||
| 	case MSG_SMS_DATA_DOWNLOAD_REQ: | ||||
| 	{ | ||||
| 		msg->msg_data[0] = le32_to_cpu(msg->msg_data[0]); | ||||
| 		break; | ||||
| 	} | ||||
| 
 | ||||
| 	default: | ||||
| 		msg_words = (msg->x_msg_header.msg_length - | ||||
| 				sizeof(struct sms_msg_hdr))/4; | ||||
| 
 | ||||
| 		for (i = 0; i < msg_words; i++) | ||||
| 			msg->msg_data[i] = le32_to_cpu(msg->msg_data[i]); | ||||
| 
 | ||||
| 		break; | ||||
| 	} | ||||
| #endif /* __BIG_ENDIAN */ | ||||
| } | ||||
| EXPORT_SYMBOL_GPL(smsendian_handle_tx_message); | ||||
| 
 | ||||
| void smsendian_handle_rx_message(void *buffer) | ||||
| { | ||||
| #ifdef __BIG_ENDIAN | ||||
| 	struct sms_msg_data *msg = (struct sms_msg_data *)buffer; | ||||
| 	int i; | ||||
| 	int msg_words; | ||||
| 
 | ||||
| 	switch (msg->x_msg_header.msg_type) { | ||||
| 	case MSG_SMS_GET_VERSION_EX_RES: | ||||
| 	{ | ||||
| 		struct sms_version_res *ver = | ||||
| 			(struct sms_version_res *) msg; | ||||
| 		ver->chip_model = le16_to_cpu(ver->chip_model); | ||||
| 		break; | ||||
| 	} | ||||
| 
 | ||||
| 	case MSG_SMS_DVBT_BDA_DATA: | ||||
| 	case MSG_SMS_DAB_CHANNEL: | ||||
| 	case MSG_SMS_DATA_MSG: | ||||
| 	{ | ||||
| 		break; | ||||
| 	} | ||||
| 
 | ||||
| 	default: | ||||
| 	{ | ||||
| 		msg_words = (msg->x_msg_header.msg_length - | ||||
| 				sizeof(struct sms_msg_hdr))/4; | ||||
| 
 | ||||
| 		for (i = 0; i < msg_words; i++) | ||||
| 			msg->msg_data[i] = le32_to_cpu(msg->msg_data[i]); | ||||
| 
 | ||||
| 		break; | ||||
| 	} | ||||
| 	} | ||||
| #endif /* __BIG_ENDIAN */ | ||||
| } | ||||
| EXPORT_SYMBOL_GPL(smsendian_handle_rx_message); | ||||
| 
 | ||||
| void smsendian_handle_message_header(void *msg) | ||||
| { | ||||
| #ifdef __BIG_ENDIAN | ||||
| 	struct sms_msg_hdr *phdr = (struct sms_msg_hdr *)msg; | ||||
| 
 | ||||
| 	phdr->msg_type = le16_to_cpu(phdr->msg_type); | ||||
| 	phdr->msg_length = le16_to_cpu(phdr->msg_length); | ||||
| 	phdr->msg_flags = le16_to_cpu(phdr->msg_flags); | ||||
| #endif /* __BIG_ENDIAN */ | ||||
| } | ||||
| EXPORT_SYMBOL_GPL(smsendian_handle_message_header); | ||||
							
								
								
									
										32
									
								
								drivers/media/common/siano/smsendian.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								drivers/media/common/siano/smsendian.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,32 @@ | |||
| /****************************************************************
 | ||||
| 
 | ||||
| Siano Mobile Silicon, Inc. | ||||
| MDTV receiver kernel modules. | ||||
| Copyright (C) 2006-2009, Uri Shkolnik | ||||
| 
 | ||||
| This program is free software: you can redistribute it and/or modify | ||||
| it under the terms of the GNU General Public License as published by | ||||
| the Free Software Foundation, either version 2 of the License, or | ||||
| (at your option) any later version. | ||||
| 
 | ||||
|  This program is distributed in the hope that it will be useful, | ||||
| but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| GNU General Public License for more details. | ||||
| 
 | ||||
| You should have received a copy of the GNU General Public License | ||||
| along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | ||||
| 
 | ||||
| ****************************************************************/ | ||||
| 
 | ||||
| #ifndef __SMS_ENDIAN_H__ | ||||
| #define __SMS_ENDIAN_H__ | ||||
| 
 | ||||
| #include <asm/byteorder.h> | ||||
| 
 | ||||
| extern void smsendian_handle_tx_message(void *buffer); | ||||
| extern void smsendian_handle_rx_message(void *buffer); | ||||
| extern void smsendian_handle_message_header(void *msg); | ||||
| 
 | ||||
| #endif /* __SMS_ENDIAN_H__ */ | ||||
| 
 | ||||
							
								
								
									
										114
									
								
								drivers/media/common/siano/smsir.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										114
									
								
								drivers/media/common/siano/smsir.c
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,114 @@ | |||
| /****************************************************************
 | ||||
| 
 | ||||
|  Siano Mobile Silicon, Inc. | ||||
|  MDTV receiver kernel modules. | ||||
|  Copyright (C) 2006-2009, Uri Shkolnik | ||||
| 
 | ||||
|  Copyright (c) 2010 - Mauro Carvalho Chehab | ||||
| 	- Ported the driver to use rc-core | ||||
| 	- IR raw event decoding is now done at rc-core | ||||
| 	- Code almost re-written | ||||
| 
 | ||||
|  This program is free software: you can redistribute it and/or modify | ||||
|  it under the terms of the GNU General Public License as published by | ||||
|  the Free Software Foundation, either version 2 of the License, or | ||||
|  (at your option) any later version. | ||||
| 
 | ||||
|  This program is distributed in the hope that it will be useful, | ||||
|  but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  GNU General Public License for more details. | ||||
| 
 | ||||
|  You should have received a copy of the GNU General Public License | ||||
|  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | ||||
| 
 | ||||
|  ****************************************************************/ | ||||
| 
 | ||||
| 
 | ||||
| #include <linux/types.h> | ||||
| #include <linux/input.h> | ||||
| 
 | ||||
| #include "smscoreapi.h" | ||||
| #include "smsir.h" | ||||
| #include "sms-cards.h" | ||||
| 
 | ||||
| #define MODULE_NAME "smsmdtv" | ||||
| 
 | ||||
| void sms_ir_event(struct smscore_device_t *coredev, const char *buf, int len) | ||||
| { | ||||
| 	int i; | ||||
| 	const s32 *samples = (const void *)buf; | ||||
| 
 | ||||
| 	for (i = 0; i < len >> 2; i++) { | ||||
| 		DEFINE_IR_RAW_EVENT(ev); | ||||
| 
 | ||||
| 		ev.duration = abs(samples[i]) * 1000; /* Convert to ns */ | ||||
| 		ev.pulse = (samples[i] > 0) ? false : true; | ||||
| 
 | ||||
| 		ir_raw_event_store(coredev->ir.dev, &ev); | ||||
| 	} | ||||
| 	ir_raw_event_handle(coredev->ir.dev); | ||||
| } | ||||
| 
 | ||||
| int sms_ir_init(struct smscore_device_t *coredev) | ||||
| { | ||||
| 	int err; | ||||
| 	int board_id = smscore_get_board_id(coredev); | ||||
| 	struct rc_dev *dev; | ||||
| 
 | ||||
| 	sms_log("Allocating rc device"); | ||||
| 	dev = rc_allocate_device(); | ||||
| 	if (!dev) { | ||||
| 		sms_err("Not enough memory"); | ||||
| 		return -ENOMEM; | ||||
| 	} | ||||
| 
 | ||||
| 	coredev->ir.controller = 0;	/* Todo: vega/nova SPI number */ | ||||
| 	coredev->ir.timeout = IR_DEFAULT_TIMEOUT; | ||||
| 	sms_log("IR port %d, timeout %d ms", | ||||
| 			coredev->ir.controller, coredev->ir.timeout); | ||||
| 
 | ||||
| 	snprintf(coredev->ir.name, sizeof(coredev->ir.name), | ||||
| 		 "SMS IR (%s)", sms_get_board(board_id)->name); | ||||
| 
 | ||||
| 	strlcpy(coredev->ir.phys, coredev->devpath, sizeof(coredev->ir.phys)); | ||||
| 	strlcat(coredev->ir.phys, "/ir0", sizeof(coredev->ir.phys)); | ||||
| 
 | ||||
| 	dev->input_name = coredev->ir.name; | ||||
| 	dev->input_phys = coredev->ir.phys; | ||||
| 	dev->dev.parent = coredev->device; | ||||
| 
 | ||||
| #if 0 | ||||
| 	/* TODO: properly initialize the parameters bellow */ | ||||
| 	dev->input_id.bustype = BUS_USB; | ||||
| 	dev->input_id.version = 1; | ||||
| 	dev->input_id.vendor = le16_to_cpu(dev->udev->descriptor.idVendor); | ||||
| 	dev->input_id.product = le16_to_cpu(dev->udev->descriptor.idProduct); | ||||
| #endif | ||||
| 
 | ||||
| 	dev->priv = coredev; | ||||
| 	dev->driver_type = RC_DRIVER_IR_RAW; | ||||
| 	dev->allowed_protocols = RC_BIT_ALL; | ||||
| 	dev->map_name = sms_get_board(board_id)->rc_codes; | ||||
| 	dev->driver_name = MODULE_NAME; | ||||
| 
 | ||||
| 	sms_log("Input device (IR) %s is set for key events", dev->input_name); | ||||
| 
 | ||||
| 	err = rc_register_device(dev); | ||||
| 	if (err < 0) { | ||||
| 		sms_err("Failed to register device"); | ||||
| 		rc_free_device(dev); | ||||
| 		return err; | ||||
| 	} | ||||
| 
 | ||||
| 	coredev->ir.dev = dev; | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| void sms_ir_exit(struct smscore_device_t *coredev) | ||||
| { | ||||
| 	if (coredev->ir.dev) | ||||
| 		rc_unregister_device(coredev->ir.dev); | ||||
| 
 | ||||
| 	sms_log(""); | ||||
| } | ||||
							
								
								
									
										63
									
								
								drivers/media/common/siano/smsir.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								drivers/media/common/siano/smsir.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,63 @@ | |||
| /****************************************************************
 | ||||
| 
 | ||||
| Siano Mobile Silicon, Inc. | ||||
| MDTV receiver kernel modules. | ||||
| Copyright (C) 2006-2009, Uri Shkolnik | ||||
| 
 | ||||
|  Copyright (c) 2010 - Mauro Carvalho Chehab | ||||
| 	- Ported the driver to use rc-core | ||||
| 	- IR raw event decoding is now done at rc-core | ||||
| 	- Code almost re-written | ||||
| 
 | ||||
| This program is free software: you can redistribute it and/or modify | ||||
| it under the terms of the GNU General Public License as published by | ||||
| the Free Software Foundation, either version 2 of the License, or | ||||
| (at your option) any later version. | ||||
| 
 | ||||
|  This program is distributed in the hope that it will be useful, | ||||
| but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| GNU General Public License for more details. | ||||
| 
 | ||||
| You should have received a copy of the GNU General Public License | ||||
| along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | ||||
| 
 | ||||
| ****************************************************************/ | ||||
| 
 | ||||
| #ifndef __SMS_IR_H__ | ||||
| #define __SMS_IR_H__ | ||||
| 
 | ||||
| #include <linux/input.h> | ||||
| #include <media/rc-core.h> | ||||
| 
 | ||||
| #define IR_DEFAULT_TIMEOUT		100 | ||||
| 
 | ||||
| struct smscore_device_t; | ||||
| 
 | ||||
| struct ir_t { | ||||
| 	struct rc_dev *dev; | ||||
| 	char name[40]; | ||||
| 	char phys[32]; | ||||
| 
 | ||||
| 	char *rc_codes; | ||||
| 
 | ||||
| 	u32 timeout; | ||||
| 	u32 controller; | ||||
| }; | ||||
| 
 | ||||
| #ifdef CONFIG_SMS_SIANO_RC | ||||
| int sms_ir_init(struct smscore_device_t *coredev); | ||||
| void sms_ir_exit(struct smscore_device_t *coredev); | ||||
| void sms_ir_event(struct smscore_device_t *coredev, | ||||
| 			const char *buf, int len); | ||||
| #else | ||||
| inline static int sms_ir_init(struct smscore_device_t *coredev) { | ||||
| 	return 0; | ||||
| } | ||||
| inline static void sms_ir_exit(struct smscore_device_t *coredev) {}; | ||||
| inline static void sms_ir_event(struct smscore_device_t *coredev, | ||||
| 			const char *buf, int len) {}; | ||||
| #endif | ||||
| 
 | ||||
| #endif /* __SMS_IR_H__ */ | ||||
| 
 | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 awab228
						awab228