summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--io-module/mtac_eth.c3
-rw-r--r--io-module/mts_capab.c63
-rw-r--r--io-module/mts_eeprom.h1
-rw-r--r--io-module/mts_io.c26
-rw-r--r--io-module/mts_io.mod.c23
5 files changed, 90 insertions, 26 deletions
diff --git a/io-module/mtac_eth.c b/io-module/mtac_eth.c
index 09b52ee..6738080 100644
--- a/io-module/mtac_eth.c
+++ b/io-module/mtac_eth.c
@@ -7,8 +7,9 @@ static char* eth_gpio_pin_name_by_attr_name(const char* name, int port) {
// 1 product-id
// 1 device-id
// 1 hw-version
+// 1 mac-addr or eui
// NULL
-static size_t ap_eth_attrs_size = 5;
+static size_t ap_eth_attrs_size = 6;
static bool eth_setup(enum ap port) {
int i;
diff --git a/io-module/mts_capab.c b/io-module/mts_capab.c
new file mode 100644
index 0000000..646f707
--- /dev/null
+++ b/io-module/mts_capab.c
@@ -0,0 +1,63 @@
+/*
+ * capab.c
+ *
+ * Created on: Dec 1, 2016
+ * Author: jklug
+ *
+ * capabilities from EE-PROM, enumerated in /sys/devices/platform/mts-io/capability
+ * an associative array, written the hard way in C.
+ */
+
+/* This array is not in any order. */
+struct capab_map_s {
+ unsigned int bitvalue;
+ const char *name;
+};
+
+/*
+ * Should match mts_eeprom.h capabilities
+ */
+static struct capab_map_s capabilities_map[] = {
+ { CAPA_GPS, "gps"},
+ { CAPA_DIN, "din"},
+ { CAPA_DOUT, "dout"},
+ { CAPA_ADC, "adc"},
+ { CAPA_BLUETOOTH, "bluetooth"},
+ { CAPA_WIFI, "wifi"},
+ { CAPA_WIFI_BT, "wifi_bt"},
+ { CAPA_GNSS, "gnss"},
+ { CAPA_LORA, "lora"},
+};
+static const unsigned capabilities_count = sizeof(capabilities_map)/sizeof(capabilities_map[0]);
+
+static ssize_t capab_show_value(struct kobject *kobj, struct kobj_attribute *attr, char *buf) {
+ int i;
+ const int count = sizeof(capabilities_map)/sizeof(capabilities_map[0]);
+
+ for(i=0;i<count;i++) {
+ if (! strcmp(capabilities_map[i].name, attr->attr.name)) {
+ return snprintf(buf, 32, "%u\n", DEVICE_CAPA(id_eeprom.capa, capabilities_map[i].bitvalue) != 0);
+ }
+ }
+
+ return (ssize_t)-1;
+}
+
+static bool capab_add_attributes(struct attribute** attrs) {
+ struct kobj_attribute* kobj_attr;
+ int i;
+ int count = capabilities_count;
+
+ // We must keep the number of attributes in sync
+ BUG_ON(CAPA_COUNT != count);
+ for(i=0;i<count;i++) {
+ kobj_attr = create_attribute(capabilities_map[i].name, MTS_ATTR_MODE_RO);
+ if (! kobj_attr) {
+ log_error("failed to create attribute [%s]", capabilities_map[i].name);
+ return false;
+ }
+ kobj_attr->show = capab_show_value;
+ attrs[i] = &kobj_attr->attr;
+ }
+ return true;
+}
diff --git a/io-module/mts_eeprom.h b/io-module/mts_eeprom.h
index 89f2439..f616e83 100644
--- a/io-module/mts_eeprom.h
+++ b/io-module/mts_eeprom.h
@@ -55,6 +55,7 @@ do { \
#define DEVICE_CAPA_VALUE(index, bit) ((((index) & 0x1F) << 3) | ((bit) & 0x07))
+#define CAPA_COUNT 9 // See also attribute_names in capab.c
#define CAPA_GPS DEVICE_CAPA_VALUE(0, 7)
#define CAPA_DIN DEVICE_CAPA_VALUE(0, 6)
#define CAPA_DOUT DEVICE_CAPA_VALUE(0, 5)
diff --git a/io-module/mts_io.c b/io-module/mts_io.c
index b71eabb..85f9474 100644
--- a/io-module/mts_io.c
+++ b/io-module/mts_io.c
@@ -47,7 +47,7 @@
#include "mts_io.h"
-#define DRIVER_VERSION "v1.5.4"
+#define DRIVER_VERSION "v1.5.5"
#define DRIVER_AUTHOR "James Maki <jmaki@multitech.com>"
#define DRIVER_DESC "MTS-IO Controller"
#define DRIVER_NAME "mts-io"
@@ -653,6 +653,8 @@ static struct kobject *ap_subdirs[NUM_AP];
static struct attribute_group ap_attr_groups[NUM_AP];
/* info for accessory port (contains function pointers for setup and teardown and and useful info) */
static struct ap_info* port_info[NUM_AP];
+static struct kobject *capab;
+static struct attribute_group capab_group;
/* accessory card support */
#include "mtac.c"
@@ -660,6 +662,7 @@ static struct ap_info* port_info[NUM_AP];
#include "mtac_mfser.c"
#include "mtac_eth.c"
#include "mtac_lora.c"
+#include "mts_capab.c"
static bool load_port(int port) {
int port_index = port - 1;
@@ -934,7 +937,9 @@ static void cleanup(void)
kfree(freelater);
freelater = NULL;
}
- log_info("done cleaning up....");
+
+ if(capab_group.attrs)
+ kfree((struct kobject *)capab_group.attrs);
}
static int __init mts_io_init(void)
@@ -965,6 +970,23 @@ static int __init mts_io_init(void)
init_ports();
+ capab = kobject_create_and_add("capability", &mts_io_platform_device->dev.kobj);
+ if (capab == NULL) {
+ log_error("kobject_create_and_add for capability directory failed");
+ return false;
+ }
+
+ capab_group.attrs = kzalloc(sizeof(struct attribute*) * (capabilities_count+1), GFP_KERNEL);
+ if (! capab_add_attributes(capab_group.attrs)) {
+ return false;
+ }
+
+ if (sysfs_create_group(capab, &capab_group)) {
+ cleanup();
+ log_error("sysfs_create_group failed to create capability group");
+ return false;
+ }
+
ret = sysfs_create_group(&mts_io_platform_device->dev.kobj, attr_group);
if (ret) {
cleanup();
diff --git a/io-module/mts_io.mod.c b/io-module/mts_io.mod.c
deleted file mode 100644
index 3a3ab0a..0000000
--- a/io-module/mts_io.mod.c
+++ /dev/null
@@ -1,23 +0,0 @@
-#include <linux/module.h>
-#include <linux/vermagic.h>
-#include <linux/compiler.h>
-
-MODULE_INFO(vermagic, VERMAGIC_STRING);
-
-struct module __this_module
-__attribute__((section(".gnu.linkonce.this_module"))) = {
- .name = KBUILD_MODNAME,
- .init = init_module,
-#ifdef CONFIG_MODULE_UNLOAD
- .exit = cleanup_module,
-#endif
- .arch = MODULE_ARCH_INIT,
-};
-
-static const char __module_depends[]
-__used
-__attribute__((section(".modinfo"))) =
-"depends=";
-
-
-MODULE_INFO(srcversion, "D7BC1A1F207E0D4DA8EBD43");