summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThanh Tran <ttran@multitech.com>2011-08-22 10:30:26 -0500
committerThanh Tran <ttran@multitech.com>2011-08-22 10:30:26 -0500
commit4afeacb37962034c35249d18b56716c8ea04a7ad (patch)
tree17f6586e6c462265d18e810525a2cdaf2c1cd468
parentd8e343f7782255a37e84953a3723c78f6a71c211 (diff)
downloadcdp-io-controller-4afeacb37962034c35249d18b56716c8ea04a7ad.tar.gz
cdp-io-controller-4afeacb37962034c35249d18b56716c8ea04a7ad.tar.bz2
cdp-io-controller-4afeacb37962034c35249d18b56716c8ea04a7ad.zip
Added control of external DTR and external DCD signals for MT100ECDP.
-rw-r--r--io-module/mts_io.c131
1 files changed, 131 insertions, 0 deletions
diff --git a/io-module/mts_io.c b/io-module/mts_io.c
index 4697209..8c1251b 100644
--- a/io-module/mts_io.c
+++ b/io-module/mts_io.c
@@ -329,6 +329,13 @@ static struct gpio_pin gpio_pins_mt100ecdp_0_0[] = {
.use_pullup = 0,
},
{
+ .name = "DCD1",
+ .pin = AT91_PIN_PB3,
+ .direction = GPIO_DIR_OUTPUT,
+ .output_value = 1,
+ .use_pullup = 0,
+ },
+ {
.name = "GPIO11",
.pin = AT91_PIN_PB19,
.direction = GPIO_DIR_OUTPUT,
@@ -1840,6 +1847,109 @@ static ssize_t mts_attr_store_gpio12(struct device *dev,
return count;
}
+static ssize_t mts_attr_show_rsersrc(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ int value;
+ struct gpio_pin *pin = gpio_pin_by_name("RSERSRC");
+
+ if (!pin) {
+ return -ENODEV;
+ }
+
+ mutex_lock(&mts_io_mutex);
+
+ value = at91_get_gpio_value(pin->pin);
+
+ mutex_unlock(&mts_io_mutex);
+
+ if (value < 0) {
+ return value;
+ }
+
+ return sprintf(buf, "%d\n", !value);
+}
+
+static ssize_t mts_attr_store_rsersrc(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count)
+{
+ int value;
+ int err;
+ struct gpio_pin *pin = gpio_pin_by_name("RSERSRC");
+
+ if (!pin) {
+ return -ENODEV;
+ }
+
+ if (sscanf(buf, "%i", &value) != 1) {
+ return -EINVAL;
+ }
+
+ mutex_lock(&mts_io_mutex);
+
+ err = at91_set_gpio_value(pin->pin, !value);
+
+ mutex_unlock(&mts_io_mutex);
+
+ if (err) {
+ return err;
+ }
+
+ return count;
+}
+
+static ssize_t mts_attr_show_cd(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ int value;
+ struct gpio_pin *pin = gpio_pin_by_name("DCD1");
+
+ if (!pin) {
+ return -ENODEV;
+ }
+
+ mutex_lock(&mts_io_mutex);
+
+ value = at91_get_gpio_value(pin->pin);
+
+ mutex_unlock(&mts_io_mutex);
+
+ if (value < 0) {
+ return value;
+ }
+
+ return sprintf(buf, "%d\n", !value);
+}
+
+static ssize_t mts_attr_store_cd(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count)
+{
+ int value;
+ int err;
+ struct gpio_pin *pin = gpio_pin_by_name("DCD1");
+
+ if (!pin) {
+ return -ENODEV;
+ }
+
+ if (sscanf(buf, "%i", &value) != 1) {
+ return -EINVAL;
+ }
+
+ mutex_lock(&mts_io_mutex);
+
+ err = at91_set_gpio_value(pin->pin, !value);
+
+ mutex_unlock(&mts_io_mutex);
+
+ if (err) {
+ return err;
+ }
+
+ return count;
+}
+
+
static struct device_attribute dev_attr_gpo1 = {
.attr = {
.name = "gpo1",
@@ -2000,8 +2110,29 @@ static struct device_attribute dev_attr_gpio12 = {
.store = mts_attr_store_gpio12,
};
+static struct device_attribute dev_attr_rsersrc = {
+ .attr = {
+ .name = "rsersrc",
+ .mode = MTS_ATTR_MODE_RW,
+ },
+ .show = mts_attr_show_rsersrc,
+ .store = mts_attr_store_rsersrc,
+};
+
+static struct device_attribute dev_attr_extserial_cd = {
+ .attr = {
+ .name = "extserial-dcd",
+ .mode = MTS_ATTR_MODE_RW,
+ },
+ .show = mts_attr_show_cd,
+ .store = mts_attr_store_cd,
+};
+
static struct attribute *mt100ecdp_platform_attributes[] = {
+ &dev_attr_extserial_dtr.attr,
+ &dev_attr_extserial_cd.attr,
+ &dev_attr_rsersrc.attr,
&dev_attr_radio_reset.attr,
&dev_attr_eth0_enabled.attr,
&dev_attr_gpio11.attr,