diff options
| -rw-r--r-- | io-module/mts_io.c | 86 | 
1 files changed, 73 insertions, 13 deletions
| diff --git a/io-module/mts_io.c b/io-module/mts_io.c index 0220817..434e179 100644 --- a/io-module/mts_io.c +++ b/io-module/mts_io.c @@ -977,6 +977,50 @@ static void blink_callback(struct work_struct *ignored)  	schedule_delayed_work(&blink_work, BLINK_INTERVAL);  } +static int radio_reset_telit(void) +{ +	int ret; +	struct gpio_pin *rst_pin = gpio_pin_by_name("3G_RST"); +	struct gpio_pin *onoff_pin = gpio_pin_by_name("3G_ONOFF"); + +	if (!rst_pin || !onoff_pin) { +		return -ENODEV; +	} + +	// drive reset pin low for 500ms +	ret = at91_set_gpio_output_with_pullup(rst_pin->pin, 0, rst_pin->use_pullup); +	if (ret) { +		return ret; +	} + +	msleep(500); + +	// set pin as input (high Z) +	ret = at91_set_gpio_input(rst_pin->pin, rst_pin->use_pullup); +	if (ret) { +		return ret; +	} + +	// wait for 2 sec before toggling on/off pin +	msleep(2000); + +	// drive on/off pin low for 6 sec +	ret = at91_set_gpio_output_with_pullup(onoff_pin->pin, 0, onoff_pin->use_pullup); +	if (ret) { +		return ret; +	} + +	msleep(6000); + +	// set on/off pin as input (high Z) +	ret = at91_set_gpio_input(onoff_pin->pin, onoff_pin->use_pullup); +	if (ret) { +		return ret; +	} + +	return ret; +} +  static int radio_reset(void)  {  	int ret; @@ -1164,6 +1208,32 @@ static ssize_t mts_attr_store_radio_reset(struct device *dev,  	return count;  } +static ssize_t mts_attr_store_radio_reset_telit(struct device *dev, +		struct device_attribute *attr, const char *buf, size_t count) +{ +	int value; +	int err; + +	if (sscanf(buf, "%i", &value) != 1) { +		return -EINVAL; +	} +	if (value != 0) { +		return -EINVAL; +	} + +	mutex_lock(&mts_io_mutex); + +	err = radio_reset_telit(); + +	mutex_unlock(&mts_io_mutex); + +	if (err) { +		return err; +	} + +	return count; +} +  static struct device_attribute dev_attr_radio_reset = {  	.attr = {  		.name = "radio-reset", @@ -2458,22 +2528,13 @@ static struct device_attribute dev_attr_eth_switch_enabled = {  	.store = mts_attr_store_gpio_open_collector,  }; -static struct device_attribute dev_attr_radio_reset_oc = { +static struct device_attribute dev_attr_radio_reset_telit = {  	.attr = {  		.name = "radio-reset",  		.mode = MTS_ATTR_MODE_RW,  	},  	.show = mts_attr_show_gpio_pin, -	.store = mts_attr_store_gpio_open_collector, -}; - -static struct device_attribute dev_attr_radio_enabled_oc = { -	.attr = { -		.name = "radio-enabled", -		.mode = MTS_ATTR_MODE_RW, -	}, -	.show = mts_attr_show_gpio_pin, -	.store = mts_attr_store_gpio_open_collector, +	.store = mts_attr_store_radio_reset_telit,  };  static struct attribute *mt100eocg_platform_attributes[] = { @@ -2615,8 +2676,7 @@ static struct attribute_group platform_attribute_group = {  static struct attribute *mtr_platform_attributes[] = {  	&dev_attr_reset.attr,  	&dev_attr_reset_monitor.attr, -	&dev_attr_radio_reset_oc.attr, -	&dev_attr_radio_enabled_oc.attr, +	&dev_attr_radio_reset_telit.attr,  	&dev_attr_extserial_dtr.attr,  	&dev_attr_extserial_dsr_gpio.attr,  	&dev_attr_extserial_cd.attr, | 
