diff options
| author | Jesse Gilles <jgilles@multitech.com> | 2012-07-25 15:38:46 -0500 | 
|---|---|---|
| committer | Jesse Gilles <jgilles@multitech.com> | 2012-07-25 15:38:46 -0500 | 
| commit | 05246c7da0d7ea68d4542328301241f362401f9e (patch) | |
| tree | bab2f1cda86254e5ed9684b5d2ec1e6fc546c0ed | |
| parent | 93d44fef447dbf0a6cb44c002123ae3e99638792 (diff) | |
| download | mts-io-05246c7da0d7ea68d4542328301241f362401f9e.tar.gz mts-io-05246c7da0d7ea68d4542328301241f362401f9e.tar.bz2 mts-io-05246c7da0d7ea68d4542328301241f362401f9e.zip | |
add mtr board support
| -rw-r--r-- | io-module/mts_io.c | 223 | ||||
| -rw-r--r-- | io-module/mts_io.h | 5 | 
2 files changed, 221 insertions, 7 deletions
| diff --git a/io-module/mts_io.c b/io-module/mts_io.c index 528b754..e96360f 100644 --- a/io-module/mts_io.c +++ b/io-module/mts_io.c @@ -106,6 +106,7 @@ static uint8_t mts_product_id;  static uint8_t has_spi_sout;  static uint8_t has_spi_din;  static uint8_t has_spi_dout; +static uint8_t has_spi_temp;  static struct gpio_pin *gpio_pins; @@ -572,6 +573,142 @@ static struct gpio_pin gpio_pins_en4_0_0[] = {  	{ },  }; +static struct gpio_pin gpio_pins_mtr_0_0[] = { +	{ +		.name = "NETH_RST", +		.attr_name = "eth0-enabled", +		.pin = AT91_PIN_PC6, +		.direction = GPIO_DIR_OUTPUT, +		.output_value = 1, +		.use_pullup = 0, +	}, +	{ +		.name = "3G_RST", +		.attr_name = "radio-reset", +		.pin = AT91_PIN_PA22, +		.direction = GPIO_DIR_OUTPUT, +		.output_value = 1, +		.use_pullup = 0, +	}, +	{ +		.name = "3G_ONOFF", +		.attr_name = "radio-enabled", +		.pin = AT91_PIN_PA21, +		.direction = GPIO_DIR_OUTPUT, +		.output_value = 1, +		.use_pullup = 0, +	}, +	{ +		.name = "DEVICE_RESET", +		.attr_name = "reset", +		.pin = AT91_PIN_PC4, +		.direction = GPIO_DIR_INPUT, +		.output_value = 0, +		.use_pullup = 0, +	}, +	{ +		.name = "LS_LED", +		.attr_name = "led-ls", +		.pin = AT91_PIN_PC16, +#if LED_LS_CONTROLLABLE +		.direction = GPIO_DIR_OUTPUT, +#else +		.direction = GPIO_DIR_INPUT, +#endif +		.output_value = 1, +		.use_pullup = 0, +	}, +	{ +		.name = "STATUS_LED", +		.attr_name = "led-status", +		.pin = AT91_PIN_PC21, +		.direction = GPIO_DIR_OUTPUT, +		.output_value = 1, +		.use_pullup = 0, +	}, +	{ +		.name = "LED3", +		.attr_name = "led-wifi", +		.pin = AT91_PIN_PC15, +		.direction = GPIO_DIR_OUTPUT, +		.output_value = 1, +		.use_pullup = 0, +	}, +	{ +		.name = "LED4", +		.attr_name = "led-cd", +		.pin = AT91_PIN_PC20, +		.direction = GPIO_DIR_OUTPUT, +		.output_value = 1, +		.use_pullup = 0, +	}, +	{ +		.name = "LED6", +		.attr_name = "led-sig1", +		.pin = AT91_PIN_PC19, +		.direction = GPIO_DIR_OUTPUT, +		.output_value = 1, +		.use_pullup = 0, +	}, +	{ +		.name = "LED7", +		.attr_name = "led-sig2", +		.pin = AT91_PIN_PC18, +		.direction = GPIO_DIR_OUTPUT, +		.output_value = 1, +		.use_pullup = 0, +	}, +	{ +		.name = "LED8", +		.attr_name = "led-sig3", +		.pin = AT91_PIN_PC17, +		.direction = GPIO_DIR_OUTPUT, +		.output_value = 1, +		.use_pullup = 0, +	}, +	{ +		.name = "DTR3", +		.attr_name = "extserial-dtr", +		.pin = AT91_PIN_PC26, +		.direction = GPIO_DIR_INPUT, +		.output_value = 0, +		.use_pullup = 0, +	}, +	{ +		.name = "DSR3", +		.attr_name = "extserial-dsr", +		.pin = AT91_PIN_PC27, +		.direction = GPIO_DIR_OUTPUT, +		.output_value = 1, +		.use_pullup = 0, +	}, +	{ +		.name = "DCD3", +		.attr_name = "extserial-dcd", +		.pin = AT91_PIN_PC28, +		.direction = GPIO_DIR_OUTPUT, +		.output_value = 1, +		.use_pullup = 0, +	}, +	{ +		.name = "BT_EN", +		.attr_name = "bt-enabled", +		.pin = AT91_PIN_PA28, +		.direction = GPIO_DIR_OUTPUT, +		.output_value = 0, +		.use_pullup = 0, +	}, +	{ +		.name = "WLAN_EN", +		.attr_name = "wlan-enabled", +		.pin = AT91_PIN_PA27, +		.direction = GPIO_DIR_OUTPUT, +		.output_value = 0, +		.use_pullup = 0, +	}, +	{ }, +}; +  struct gpio_pin *gpio_pin_by_name(const char *name) {  	struct gpio_pin *pin; @@ -612,6 +749,7 @@ static int mts_id_eeprom_load(void)  	has_spi_sout = 1;  	has_spi_din = 1;  	has_spi_dout = 1; +	has_spi_temp = 1;  	if (mts_id_eeprom[0] == 0xFF) {  		log_error("uninitialized eeprom"); @@ -632,18 +770,28 @@ static int mts_id_eeprom_load(void)  		has_spi_sout = 0;  		has_spi_din = 1;  		has_spi_dout = 1; +		has_spi_temp = 1;  	} else if (strncmp(id_eeprom.product_id, PRODUCT_ID_EN4, strlen(PRODUCT_ID_EN4)) == 0) {  		gpio_pins = gpio_pins_en4_0_0;  		mts_product_id = EN4_0_0;  		has_spi_sout = 0;  		has_spi_din = 0;  		has_spi_dout = 0; +		has_spi_temp = 1; +	} else if (strncmp(id_eeprom.product_id, PRODUCT_ID_MTR, strlen(PRODUCT_ID_MTR)) == 0) { +		gpio_pins = gpio_pins_mtr_0_0; +		mts_product_id = MTR_0_0; +		has_spi_sout = 0; +		has_spi_din = 0; +		has_spi_dout = 0; +		has_spi_temp = 0;  	} else {  		gpio_pins = gpio_pins_mtcdp_1_0;  		mts_product_id = MTCDP_E1_DK_1_0;  		has_spi_sout = 1;  		has_spi_din = 1;  		has_spi_dout = 1; +		has_spi_temp = 1;  	}  	log_info("sizeof: %lu", (unsigned long) sizeof(struct mts_id_eeprom_layout)); @@ -1085,6 +1233,15 @@ static struct device_attribute dev_attr_wlan_enabled = {  	.store = mts_attr_store_gpio_pin,  }; +static struct device_attribute dev_attr_radio_enabled = { +	.attr = { +		.name = "radio-enabled", +		.mode = MTS_ATTR_MODE_RW, +	}, +	.show = mts_attr_show_gpio_pin, +	.store = mts_attr_store_gpio_pin, +}; +  static ssize_t mts_attr_store_sout(struct device *dev,  		struct device_attribute *attr, const char *buf, size_t count)  { @@ -1793,6 +1950,15 @@ static struct device_attribute dev_attr_led_cd_gpio = {  	.store = mts_attr_store_gpio_pin_inverted,  }; +static struct device_attribute dev_attr_led_wifi = { +	.attr = { +		.name = "led-wifi", +		.mode = MTS_ATTR_MODE_RW, +	}, +	.show = mts_attr_show_gpio_pin_inverted, +	.store = mts_attr_store_gpio_pin_inverted, +}; +  static struct device_attribute dev_attr_reset = {  	.attr = {  		.name = "reset", @@ -2435,6 +2601,32 @@ static struct attribute_group platform_attribute_group = {  	.attrs = platform_attributes  }; +static struct attribute *mtr_platform_attributes[] = { +	&dev_attr_reset.attr, +	&dev_attr_reset_monitor.attr, +	&dev_attr_radio_reset.attr, +	&dev_attr_radio_enabled.attr, +	&dev_attr_extserial_dtr.attr, +	&dev_attr_extserial_dsr_gpio.attr, +	&dev_attr_extserial_cd.attr, +	&dev_attr_eth0_enabled.attr, +	&dev_attr_bt_enabled.attr, +	&dev_attr_wlan_enabled.attr, + +	&dev_attr_led_status.attr, +	&dev_attr_led_sig1_gpio.attr, +	&dev_attr_led_sig2_gpio.attr, +	&dev_attr_led_sig3_gpio.attr, +	&dev_attr_led_cd_gpio.attr, +	&dev_attr_led_wifi.attr, + +	NULL, +}; + +static struct attribute_group mtr_platform_attribute_group = { +	.attrs = mtr_platform_attributes +}; +  static struct platform_device *mts_io_platform_device;  static int __devinit mts_spi_sout_probe(struct spi_device *spi) @@ -2642,6 +2834,13 @@ static int __init mts_io_init(void)  			goto error3;  		}  	} +	else if ( mts_product_id == MTR_0_0 ) { +		ret = sysfs_create_group(&mts_io_platform_device->dev.kobj, +						&mtr_platform_attribute_group); +		if (ret) { +			goto error3; +		} +	}  	else {  		ret = sysfs_create_group(&mts_io_platform_device->dev.kobj,  						&platform_attribute_group); @@ -2657,10 +2856,11 @@ static int __init mts_io_init(void)  		}  	} - -	ret = spi_register_driver(&mts_spi_board_temp_driver); -	if (ret) { -		goto error7; +	if ( has_spi_temp ) { +		ret = spi_register_driver(&mts_spi_board_temp_driver); +		if (ret) { +			goto error7; +		}  	}  	if ( has_spi_dout ) { @@ -2739,7 +2939,9 @@ static int __init mts_io_init(void)  error9:  	iounmap(adc_base);  error8: -	spi_unregister_driver(&mts_spi_board_temp_driver); +	if ( has_spi_temp ) { +		spi_unregister_driver(&mts_spi_board_temp_driver); +	}  error7:  	if ( has_spi_din ) {  		spi_unregister_driver(&mts_spi_din_driver); @@ -2761,6 +2963,10 @@ error4:  		sysfs_remove_group(&mts_io_platform_device->dev.kobj,  					&en4_platform_attribute_group);  	} +	else if ( mts_product_id == MTR_0_0 ) { +		sysfs_remove_group(&mts_io_platform_device->dev.kobj, +					&mtr_platform_attribute_group); +	}  	else {  		sysfs_remove_group(&mts_io_platform_device->dev.kobj,  					&platform_attribute_group); @@ -2785,7 +2991,8 @@ static void __exit mts_io_exit(void)  	clk_disable(adc_clk);  	clk_put(adc_clk); -	spi_unregister_driver(&mts_spi_board_temp_driver); +	if (has_spi_temp) +		spi_unregister_driver(&mts_spi_board_temp_driver);  	if (has_spi_din)  		spi_unregister_driver(&mts_spi_din_driver); @@ -2804,6 +3011,10 @@ static void __exit mts_io_exit(void)  		sysfs_remove_group(&mts_io_platform_device->dev.kobj,  					&en4_platform_attribute_group);  	} +	else if ( mts_product_id == MTR_0_0 ) { +		sysfs_remove_group(&mts_io_platform_device->dev.kobj, +					&mtr_platform_attribute_group); +	}  	else {  		sysfs_remove_group(&mts_io_platform_device->dev.kobj,  					&platform_attribute_group); diff --git a/io-module/mts_io.h b/io-module/mts_io.h index 633a194..a9e6191 100644 --- a/io-module/mts_io.h +++ b/io-module/mts_io.h @@ -14,18 +14,21 @@  #define PRODUCT_ID_MTCDP_E1_DK			"MTCDP-E1-DK"  #define PRODUCT_ID_MT100EOCG			"MT100EOCG"  #define PRODUCT_ID_EN4					"EN4" +#define PRODUCT_ID_MTR					"MTR"  #define HW_VERSION_MTCBA2_2_0			"MTCBA2-2.0"  #define HW_VERSION_MTCDP_0_0			"MTCDP-0.0"  #define HW_VERSION_MTCDP_1_0			"MTCDP-1.0"  #define HW_VERSION_MT100EOCG_0_0		"MT100EOCG-0.0"  #define HW_VERSION_EN4					"EN4-0.0" +#define HW_VERSION_MTR					"MTR-0.0"  enum {  	MTCDP_E1_DK_0_0,  	MTCDP_E1_DK_1_0,  	MT100EOCG_0_0, -	EN4_0_0 +	EN4_0_0, +	MTR_0_0,  };  #define DEVICE_CAPA_INDEX(c)			(((c) & 0xFF) >> 3) | 
