summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--io-module/mts_io.c48
1 files changed, 30 insertions, 18 deletions
diff --git a/io-module/mts_io.c b/io-module/mts_io.c
index e96360f..0220817 100644
--- a/io-module/mts_io.c
+++ b/io-module/mts_io.c
@@ -88,9 +88,11 @@ static int led_mode_status = LED_OFF;
#define SOUT_LED_SIG3_BIT BIT(6)
#define SOUT_EXTSERIAL_DCD_BIT BIT(7)
+// GPIO pin types:input, output, open collector (1 = input (high Z), 0 = output low)
enum {
GPIO_DIR_INPUT,
GPIO_DIR_OUTPUT,
+ GPIO_DIR_OC,
};
struct gpio_pin {
@@ -402,7 +404,7 @@ static struct gpio_pin gpio_pins_en4_0_0[] = {
.name = "NETH_RST",
.attr_name = "eth-switch-enabled",
.pin = AT91_PIN_PC6,
- .direction = GPIO_DIR_INPUT,
+ .direction = GPIO_DIR_OC,
.output_value = 1,
.use_pullup = 0,
},
@@ -586,7 +588,7 @@ static struct gpio_pin gpio_pins_mtr_0_0[] = {
.name = "3G_RST",
.attr_name = "radio-reset",
.pin = AT91_PIN_PA22,
- .direction = GPIO_DIR_OUTPUT,
+ .direction = GPIO_DIR_OC,
.output_value = 1,
.use_pullup = 0,
},
@@ -594,7 +596,7 @@ static struct gpio_pin gpio_pins_mtr_0_0[] = {
.name = "3G_ONOFF",
.attr_name = "radio-enabled",
.pin = AT91_PIN_PA21,
- .direction = GPIO_DIR_OUTPUT,
+ .direction = GPIO_DIR_OC,
.output_value = 1,
.use_pullup = 0,
},
@@ -727,7 +729,7 @@ struct gpio_pin *gpio_pin_by_name(const char *name) {
struct gpio_pin *gpio_pin_by_attr_name(const char *name) {
struct gpio_pin *pin;
- for (pin = gpio_pins; pin->attr_name; pin++) {
+ for (pin = gpio_pins; *pin->attr_name; pin++) {
if (!strcmp(pin->attr_name, name)) {
return pin;
}
@@ -1233,15 +1235,6 @@ 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)
{
@@ -2422,7 +2415,7 @@ static struct device_attribute dev_attr_serial_mode = {
.store = mts_attr_store_serial_mode,
};
-static ssize_t mts_attr_store_eth_switch_en(struct device *dev,
+static ssize_t mts_attr_store_gpio_open_collector(struct device *dev,
struct device_attribute *attr, const char *buf, size_t count)
{
int value;
@@ -2462,7 +2455,25 @@ static struct device_attribute dev_attr_eth_switch_enabled = {
.mode = MTS_ATTR_MODE_RW,
},
.show = mts_attr_show_gpio_pin,
- .store = mts_attr_store_eth_switch_en,
+ .store = mts_attr_store_gpio_open_collector,
+};
+
+static struct device_attribute dev_attr_radio_reset_oc = {
+ .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,
};
static struct attribute *mt100eocg_platform_attributes[] = {
@@ -2604,8 +2615,8 @@ 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.attr,
- &dev_attr_radio_enabled.attr,
+ &dev_attr_radio_reset_oc.attr,
+ &dev_attr_radio_enabled_oc.attr,
&dev_attr_extserial_dtr.attr,
&dev_attr_extserial_dsr_gpio.attr,
&dev_attr_extserial_cd.attr,
@@ -2901,7 +2912,8 @@ static int __init mts_io_init(void)
for (pin = gpio_pins; *pin->name; pin++) {
gpio_request(pin->pin, pin->name);
- if (pin->direction == GPIO_DIR_OUTPUT) {
+ if (pin->direction == GPIO_DIR_OUTPUT ||
+ (pin->direction == GPIO_DIR_OC && pin->output_value == 0) ) {
at91_set_gpio_output_with_pullup(pin->pin, pin->output_value, pin->use_pullup);
} else {
at91_set_gpio_input(pin->pin, pin->use_pullup);