summaryrefslogtreecommitdiff
path: root/io-module/mtac_mfser.c
diff options
context:
space:
mode:
authorMike Fiore <mfiore@multitech.com>2014-09-23 10:35:11 -0500
committerMike Fiore <mfiore@multitech.com>2014-09-23 10:35:11 -0500
commita21c24fa2486e4d4a3b25d0dcbf873ae62fdbcec (patch)
tree6d78da220c6235cd33408acbd22adf9b4038bbc1 /io-module/mtac_mfser.c
parent24c012065ca7a764e1e51a9cfc4422d649cd2851 (diff)
downloadmts-io-a21c24fa2486e4d4a3b25d0dcbf873ae62fdbcec.tar.gz
mts-io-a21c24fa2486e4d4a3b25d0dcbf873ae62fdbcec.tar.bz2
mts-io-a21c24fa2486e4d4a3b25d0dcbf873ae62fdbcec.zip
mts-io: clean up accessory card support
use custom kernel config option MTS_NUM_ACCESSORY_PORTS to find out how many slots exist (mostly) dynamically handle any number of accessory cards streamline code to make it easier to add accessory cards in the future
Diffstat (limited to 'io-module/mtac_mfser.c')
-rw-r--r--io-module/mtac_mfser.c106
1 files changed, 68 insertions, 38 deletions
diff --git a/io-module/mtac_mfser.c b/io-module/mtac_mfser.c
index 14eddd1..5871bfe 100644
--- a/io-module/mtac_mfser.c
+++ b/io-module/mtac_mfser.c
@@ -2,13 +2,13 @@ struct gpio_pin *ap_mfser_pin_by_attr_name(const char *name) {
struct gpio_pin *pin;
char *pin_attr_name;
- if (!strcmp(name, "rs4xx-term-res:0")) {
+ if (!strcmp(name, "rs4xx-term-res:1")) {
pin_attr_name = "ap1-gpio3";
- } else if (!strcmp(name, "rts-override:0")) {
+ } else if (!strcmp(name, "rts-override:1")) {
pin_attr_name = "ap1-gpio4";
- } else if (!strcmp(name, "rs4xx-term-res:1")) {
+ } else if (!strcmp(name, "rs4xx-term-res:2")) {
pin_attr_name = "ap2-gpio3";
- } else if (!strcmp(name, "rts-override:1")) {
+ } else if (!strcmp(name, "rts-override:2")) {
pin_attr_name = "ap2-gpio4";
} else {
log_error("accessory card attribute %s not available", name);
@@ -27,8 +27,8 @@ struct gpio_pin *ap_mfser_pin_by_attr_name(const char *name) {
}
-static ssize_t mts_attr_show_ap_mfser_pin(struct device *dev,
- struct device_attribute *attr,
+static ssize_t mts_attr_show_ap_mfser_pin(struct kobject *kobj,
+ struct kobj_attribute *attr,
char *buf)
{
int value;
@@ -55,8 +55,8 @@ static ssize_t mts_attr_show_ap_mfser_pin(struct device *dev,
return sprintf(buf, "%d\n", value);
}
-static ssize_t mts_attr_store_ap_mfser_pin(struct device *dev,
- struct device_attribute *attr, const char *buf, size_t count)
+static ssize_t mts_attr_store_ap_mfser_pin(struct kobject *kobj,
+ struct kobj_attribute *attr, const char *buf, size_t count)
{
int value;
struct gpio_pin *pin = ap_mfser_pin_by_attr_name(attr->attr.name);
@@ -82,8 +82,8 @@ static ssize_t mts_attr_store_ap_mfser_pin(struct device *dev,
return count;
}
-static ssize_t mts_attr_show_mfser_mode(struct device *dev,
- struct device_attribute *attr,
+static ssize_t mts_attr_show_mfser_mode(struct kobject *kobj,
+ struct kobj_attribute *attr,
char *buf)
{
int ret;
@@ -93,11 +93,11 @@ static ssize_t mts_attr_show_mfser_mode(struct device *dev,
struct gpio_pin *pin_modesel0;
struct gpio_pin *pin_modesel1;
- if (strstr(attr->attr.name, ":0")) {
+ if (strstr(attr->attr.name, ":1")) {
pin_modesel0 = gpio_pin_by_name("AP1_GPIO1");
pin_modesel1 = gpio_pin_by_name("AP1_GPIO2");
}
- else if (strstr(attr->attr.name, ":1")) {
+ else if (strstr(attr->attr.name, ":2")) {
pin_modesel0 = gpio_pin_by_name("AP2_GPIO1");
pin_modesel1 = gpio_pin_by_name("AP2_GPIO2");
}
@@ -130,19 +130,19 @@ static ssize_t mts_attr_show_mfser_mode(struct device *dev,
return ret;
}
-static ssize_t mts_attr_store_mfser_mode(struct device *dev,
- struct device_attribute *attr, const char *buf, size_t count)
+static ssize_t mts_attr_store_mfser_mode(struct kobject *kobj,
+ struct kobj_attribute *attr, const char *buf, size_t count)
{
int modesel0;
int modesel1;
struct gpio_pin *pin_modesel0;
struct gpio_pin *pin_modesel1;
- if (strstr(attr->attr.name, ":0")) {
+ if (strstr(attr->attr.name, ":1")) {
pin_modesel0 = gpio_pin_by_name("AP1_GPIO1");
pin_modesel1 = gpio_pin_by_name("AP1_GPIO2");
}
- else if (strstr(attr->attr.name, ":1")) {
+ else if (strstr(attr->attr.name, ":2")) {
pin_modesel0 = gpio_pin_by_name("AP2_GPIO1");
pin_modesel1 = gpio_pin_by_name("AP2_GPIO2");
}
@@ -184,32 +184,62 @@ static ssize_t mts_attr_store_mfser_mode(struct device *dev,
return count;
}
-/* accessory port 1 serial attributes */
-static DEVICE_ATTR_MTS(dev_attr_ap1_serial_mode, "serial-mode:0", mts_attr_show_mfser_mode, mts_attr_store_mfser_mode);
-static DEVICE_ATTR_MTS(dev_attr_ap1_rs4xx_term_res, "rs4xx-term-res:0", mts_attr_show_ap_mfser_pin, mts_attr_store_ap_mfser_pin);
-static DEVICE_ATTR_MTS(dev_attr_ap1_rts_override, "rts-override:0", mts_attr_show_ap_mfser_pin, mts_attr_store_ap_mfser_pin);
+// 1 serial mode
+// 1 rs4xx term resistor
+// 1 rts override
+static int ap_mfser_attrs_size = 3;
-static int ap1_mfser_attributes_size = 3; // not including NULL at end
+static bool mfser_setup(enum ap port) {
+ struct kobj_attribute *attr;
+ char buf[32];
-static struct attribute *ap1_mfser_attributes[] = {
- &dev_attr_ap1_serial_mode.attr,
- &dev_attr_ap1_rs4xx_term_res.attr, // gpio3
- &dev_attr_ap1_rts_override.attr, // gpio4
- NULL,
-};
+ log_info("loading MFSER accessory card in port %d", port);
-/* accessory port 2 serial attributes */
-static DEVICE_ATTR_MTS(dev_attr_ap2_serial_mode, "serial-mode:1", mts_attr_show_mfser_mode, mts_attr_store_mfser_mode);
-static DEVICE_ATTR_MTS(dev_attr_ap2_rs4xx_term_res, "rs4xx-term-res:1", mts_attr_show_ap_mfser_pin, mts_attr_store_ap_mfser_pin);
-static DEVICE_ATTR_MTS(dev_attr_ap2_rts_override, "rts-override:1", mts_attr_show_ap_mfser_pin, mts_attr_store_ap_mfser_pin);
+ if (device_attrs_size + ap_mfser_attrs_size >= device_attrs_max_size) {
+ log_error("can't load MFSER accessory card in port %d - not enough room for attributes", port);
+ return false;
+ }
-static int ap2_mfser_attributes_size = 3; // not including NULL at end
+ sprintf(buf, "serial-mode:%d", port);
+ attr = create_attribute(buf, MTS_ATTR_MODE_RW);
+ if (! attr) {
+ log_error("failed to create attribute[%s]", buf);
+ return false;
+ }
+ attr->show = mts_attr_show_mfser_mode;
+ attr->store = mts_attr_store_mfser_mode;
+ device_attrs[device_attrs_size++] = &attr->attr;
-static struct attribute *ap2_mfser_attributes[] = {
- &dev_attr_ap2_serial_mode.attr,
- &dev_attr_ap2_rs4xx_term_res.attr, // gpio3
- &dev_attr_ap2_rts_override.attr, // gpio4
- NULL,
-};
+ sprintf(buf, "rs4xx-term-res:%d", port);
+ attr = create_attribute(buf, MTS_ATTR_MODE_RW);
+ if (! attr) {
+ log_error("failed to create attribute[%s]", buf);
+ return false;
+ }
+ attr->show = mts_attr_show_ap_mfser_pin;
+ attr->store = mts_attr_store_ap_mfser_pin;
+ device_attrs[device_attrs_size++] = &attr->attr;
+ sprintf(buf, "rts-override:%d", port);
+ attr = create_attribute(buf, MTS_ATTR_MODE_RW);
+ if (! attr) {
+ log_error("failed to create attribute[%s]", buf);
+ return false;
+ }
+ attr->show = mts_attr_show_ap_mfser_pin;
+ attr->store = mts_attr_store_ap_mfser_pin;
+ device_attrs[device_attrs_size++] = &attr->attr;
+
+ return true;
+}
+static bool mfser_teardown(enum ap port) {
+ log_info("unloading MFSER accessory card in port %d", port);
+ return true;
+}
+
+static struct ap_info mfser_info = {
+ .product_id = MTAC_MFSER_0_0,
+ .setup = &mfser_setup,
+ .teardown = &mfser_teardown
+};