diff options
Diffstat (limited to 'io-module')
-rw-r--r-- | io-module/mts_capab.c | 80 | ||||
-rw-r--r-- | io-module/mts_eeprom.h | 1 | ||||
-rw-r--r-- | io-module/mts_io.c | 28 |
3 files changed, 62 insertions, 47 deletions
diff --git a/io-module/mts_capab.c b/io-module/mts_capab.c index e8e4a27..e4ddb6f 100644 --- a/io-module/mts_capab.c +++ b/io-module/mts_capab.c @@ -18,22 +18,21 @@ struct capab_map_s { * 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_LORA, "lora"}, + { CAPA_GPS, "gps"}, + { CAPA_DIN, "din"}, + { CAPA_DOUT, "dout"}, + { CAPA_ADC, "adc"}, + { CAPA_BLUETOOTH, "bluetooth"}, + { CAPA_WIFI, "wifi"}, + { 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)) { + for (i = 0; i < count; i++) { + if (strcmp(capabilities_map[i].name, attr->attr.name) == 0) { return snprintf(buf, 32, "%u\n", DEVICE_CAPA(id_eeprom.capa, capabilities_map[i].bitvalue) != 0); } } @@ -41,21 +40,50 @@ static ssize_t capab_show_value(struct kobject *kobj, struct kobj_attribute *att 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; +static DEVICE_ATTR_RO_MTS(capa_attr_gps, "gps", capab_show_value); +static DEVICE_ATTR_RO_MTS(capa_attr_din, "din", capab_show_value); +static DEVICE_ATTR_RO_MTS(capa_attr_dout, "dout", capab_show_value); +static DEVICE_ATTR_RO_MTS(capa_attr_adc, "adc", capab_show_value); +static DEVICE_ATTR_RO_MTS(capa_attr_bt, "bluetooth", capab_show_value); +static DEVICE_ATTR_RO_MTS(capa_attr_wifi, "wifi", capab_show_value); +static DEVICE_ATTR_RO_MTS(capa_attr_lora, "lora", capab_show_value); + +static struct attribute *mts_capa_attributes[] = { + &capa_attr_gps.attr, + &capa_attr_din.attr, + &capa_attr_dout.attr, + &capa_attr_adc.attr, + &capa_attr_bt.attr, + &capa_attr_wifi.attr, + &capa_attr_lora.attr, + NULL, +}; + +static struct attribute_group mts_capa_attr_group = { + .attrs = mts_capa_attributes +}; + +static struct kobject *mts_capa_kobject = NULL; + +static int mts_capab_dir_create(void) +{ + mts_capa_kobject = kobject_create_and_add("capability", &mts_io_platform_device->dev.kobj); + if (!mts_capa_kobject) { + log_error("kobject_create_and_add for capability directory failed"); + return -ENOMEM; + } + + if (sysfs_create_group(mts_capa_kobject, &mts_capa_attr_group)) { + log_error("sysfs_create_group failed to create capability group"); + return -ENOMEM; + } + + return 0; +} + +static void mts_capab_dir_delete(void) +{ + if (mts_capa_kobject) { + kobject_put(mts_capa_kobject); } - return true; } diff --git a/io-module/mts_eeprom.h b/io-module/mts_eeprom.h index ec82e0d..4e15f8c 100644 --- a/io-module/mts_eeprom.h +++ b/io-module/mts_eeprom.h @@ -55,7 +55,6 @@ do { \ #define DEVICE_CAPA_VALUE(index, bit) ((((index) & 0x1F) << 3) | ((bit) & 0x07)) -#define CAPA_COUNT 7 // 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 33fee4f..284ab7e 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.6" +#define DRIVER_VERSION "v1.5.7" #define DRIVER_AUTHOR "James Maki <jmaki@multitech.com>" #define DRIVER_DESC "MTS-IO Controller" #define DRIVER_NAME "mts-io" @@ -641,6 +641,9 @@ static DEVICE_ATTR_RO_MTS(dev_attr_eth_mac, "mac-eth", #include "mtcdt.c" #include "mtcap.c" +/* include capabilities sub-directory support */ +#include "mts_capab.c" + #if NUM_AP > 0 @@ -653,8 +656,6 @@ 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" @@ -662,7 +663,6 @@ static struct attribute_group capab_group; #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; @@ -936,8 +936,7 @@ static void cleanup(void) freelater = NULL; } - if(capab_group.attrs) - kfree((struct kobject *)capab_group.attrs); + mts_capab_dir_delete(); } static int __init mts_io_init(void) @@ -968,21 +967,10 @@ 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)) { + ret = mts_capab_dir_create(); + if (ret) { cleanup(); - log_error("sysfs_create_group failed to create capability group"); - return false; + return ret; } ret = sysfs_create_group(&mts_io_platform_device->dev.kobj, attr_group); |