From 935ba9982e7afb39489f5a52e4a671ebbfed6fe7 Mon Sep 17 00:00:00 2001 From: Mike Fiore Date: Fri, 31 Jan 2014 14:59:20 -0600 Subject: set up handling of different daughter card types add GPIO daughter card attributes to sysfs if card is installed --- io-module/mts_io.c | 119 ++++++++++++++++++++++++++++++++++++++++++++++++++++- io-module/mts_io.h | 24 +++++++---- 2 files changed, 132 insertions(+), 11 deletions(-) diff --git a/io-module/mts_io.c b/io-module/mts_io.c index a8e85e3..a7a5d75 100644 --- a/io-module/mts_io.c +++ b/io-module/mts_io.c @@ -95,6 +95,7 @@ bool daughter_card_capable = false; bool has_daughter_card = false; static uint8_t mts_product_id; +static uint8_t mts_dc_product_id; static uint8_t has_spi_sout; static uint8_t has_spi_din; static uint8_t has_spi_dout; @@ -2497,6 +2498,43 @@ static DEVICE_ATTR_RO_MTS(dev_attr_wifi_mac, "mac-wifi", static DEVICE_ATTR_RO_MTS(dev_attr_eth_mac, "mac-eth", mts_attr_show_product_info); +static ssize_t mts_attr_show_dc_din(struct device *dev, struct device_attribute *attr, char *buf) +{ + /* TODO: actually write this function */ + return sprintf(buf, "%d\n", 0); +} + +static ssize_t mts_attr_store_dc_dout(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + /* TODO: actually write this function */ + return 0; +} + +static ssize_t mts_attr_show_dc_dout(struct device *dev, struct device_attribute *attr, char *buf) +{ + /* TODO: actually write this function */ + return sprintf(buf, "%d\n", 0); +} + +static ssize_t mts_attr_show_dc_adc(struct device *dev, struct device_attribute *attr, char *buf) +{ + /* TODO: actually write this function */ + return sprintf(buf, "%lu\n", (unsigned long) 0); +} + +/* daughter card gpio */ +static DEVICE_ATTR_RO_MTS(dev_attr_dc_din0, "dc-din0", mts_attr_show_dc_din); +static DEVICE_ATTR_RO_MTS(dev_attr_dc_din1, "dc-din1", mts_attr_show_dc_din); +static DEVICE_ATTR_RO_MTS(dev_attr_dc_din2, "dc-din2", mts_attr_show_dc_din); +static DEVICE_ATTR_RO_MTS(dev_attr_dc_din3, "dc-din3", mts_attr_show_dc_din); +static DEVICE_ATTR_MTS(dev_attr_dc_dout0, "dc-dout0", mts_attr_show_dc_dout, mts_attr_store_dc_dout); +static DEVICE_ATTR_MTS(dev_attr_dc_dout1, "dc-dout1", mts_attr_show_dc_dout, mts_attr_store_dc_dout); +static DEVICE_ATTR_MTS(dev_attr_dc_dout2, "dc-dout2", mts_attr_show_dc_dout, mts_attr_store_dc_dout); +static DEVICE_ATTR_MTS(dev_attr_dc_dout3, "dc-dout3", mts_attr_show_dc_dout, mts_attr_store_dc_dout); +static DEVICE_ATTR_RO_MTS(dev_attr_dc_adc0, "dc-adc0", mts_attr_show_dc_adc); +static DEVICE_ATTR_RO_MTS(dev_attr_dc_adc1, "dc-adc1", mts_attr_show_dc_adc); +static DEVICE_ATTR_RO_MTS(dev_attr_dc_adc2, "dc-adc2", mts_attr_show_dc_adc); + static struct attribute *mt100eocg_platform_attributes[] = { &dev_attr_vendor_id.attr, &dev_attr_product_id.attr, @@ -2544,7 +2582,7 @@ static struct attribute_group mt100eocg_platform_attribute_group = { .attrs = mt100eocg_platform_attributes }; -static struct attribute *mtr2_platform_attributes[] = { +struct attribute *mtr2_platform_attributes[] = { &dev_attr_vendor_id.attr, &dev_attr_product_id.attr, &dev_attr_device_id.attr, @@ -2584,6 +2622,38 @@ static struct attribute *mtr2_platform_attributes[] = { &dev_attr_board_temperature.attr, + /* extra space for the daughter card attributes */ + NULL, // index 34 + NULL, // index 35 + NULL, // index 36 + NULL, // index 37 + NULL, // index 38 + NULL, // index 39 + NULL, // index 40 + NULL, // index 41 + NULL, // index 42 + NULL, // index 43 + NULL, // index 44 + NULL, // index 45 + NULL, // index 46 + NULL, +}; + +static struct attribute *mtr2_daughter_card_attributes[] = { + &dev_attr_dc_din0.attr, + &dev_attr_dc_din1.attr, + &dev_attr_dc_din2.attr, + &dev_attr_dc_din3.attr, + + &dev_attr_dc_dout0.attr, + &dev_attr_dc_dout1.attr, + &dev_attr_dc_dout2.attr, + &dev_attr_dc_dout3.attr, + + &dev_attr_dc_adc0.attr, + &dev_attr_dc_adc1.attr, + &dev_attr_dc_adc2.attr, + NULL, }; @@ -2591,6 +2661,32 @@ static struct attribute_group mtr2_platform_attribute_group = { .attrs = mtr2_platform_attributes }; +bool mtr2_add_daughter_card_attributes() +{ + size_t platform_attrs_size = sizeof(mtr2_platform_attributes) / sizeof(struct attribute *); + size_t daughter_card_attrs_size = sizeof(mtr2_daughter_card_attributes) / sizeof(struct attribute *); + size_t platform_attrs_index; + size_t daughter_card_attrs_index; + size_t copy_length = daughter_card_attrs_size - 1; /* don't need to copy the NULL at the end */ + + for (platform_attrs_index = 0; platform_attrs_index < platform_attrs_size; platform_attrs_index++) { + if (! mtr2_platform_attributes[platform_attrs_index]) { + break; + } + } + + if (platform_attrs_size < platform_attrs_index + daughter_card_attrs_size) { + log_error("not enough room for MTR2 daughter card attributes!"); + return false; + } + + for (daughter_card_attrs_index = 0; daughter_card_attrs_index < copy_length; daughter_card_attrs_index++, platform_attrs_index++) { + mtr2_platform_attributes[platform_attrs_index] = mtr2_daughter_card_attributes[daughter_card_attrs_index]; + } + + return true; +} + static struct attribute *mtcdp_platform_attributes[] = { &dev_attr_vendor_id.attr, &dev_attr_product_id.attr, @@ -3052,6 +3148,7 @@ static int __init mts_io_init(void) } if (daughter_card_capable) { + mts_dc_product_id = MTDC_NONE; ret = mts_dc_eeprom_load(); if (ret) { /* error reading the EEPROM from the daughter card */ @@ -3062,7 +3159,25 @@ static int __init mts_io_init(void) /* boolean flag wasn't set, no card */ log_info("no daughter card is inserted"); } else { - /* TODO: handle daughter card specific configuration here */ + /* no error and we have a daughter card */ + if (strstr(dc_eeprom.product_id, PRODUCT_ID_MTDC_GPIOB)) { + mts_dc_product_id = MTDC_GPIOB_0_0; + } + + switch(mts_dc_product_id) { + case MTDC_GPIOB_0_0: + log_info("adding GPIO daughter card attributes"); + if (! mtr2_add_daughter_card_attributes()) { + log_error("failed to add GPIO daughter card attributes"); + goto error1; + } else { + log_info("successfully added GPIO daughter card attributes"); + } + break; + + default: + log_info("daughter card '%s' currently unsupported", dc_eeprom.product_id); + } } } diff --git a/io-module/mts_io.h b/io-module/mts_io.h index b7b53e0..efbd8f8 100644 --- a/io-module/mts_io.h +++ b/io-module/mts_io.h @@ -28,18 +28,21 @@ struct device_attribute _dev_name = { \ #define VENDOR_ID_MULTITECH "Multi-Tech Systems" #define PRODUCT_ID_MTCDP_E1_DK "MTCDP-E1-DK" #define PRODUCT_ID_MT100EOCG "MT100EOCG" -#define PRODUCT_ID_MTR2 "MTR2" -#define PRODUCT_ID_MTR "MTR" -#define PRODUCT_ID_MTOCGD3 "MTOCGD3" -#define PRODUCT_ID_MTOCGD "MTOCGD" +#define PRODUCT_ID_MTR2 "MTR2" +#define PRODUCT_ID_MTR "MTR" +#define PRODUCT_ID_MTOCGD3 "MTOCGD3" +#define PRODUCT_ID_MTOCGD "MTOCGD" + +#define PRODUCT_ID_MTDC_GPIOB "MTDC-GPIOB" + #define HW_VERSION_MTCBA2_2_0 "MTCBA2-2.0" #define HW_VERSION_MTCDP_0_0 "MTCDP-0.0" #define HW_VERSION_MTCDP_1_0 "MTCDP-1.0" #define HW_VERSION_MT100EOCG_0_0 "MT100EOCG-0.0" -#define HW_VERSION_MTR2_0_0 "MTR2-0.0" -#define HW_VERSION_MTR_0_0 "MTR-0.0" -#define HW_VERSION_MTR_0_1 "MTR-0.1" +#define HW_VERSION_MTR2_0_0 "MTR2-0.0" +#define HW_VERSION_MTR_0_0 "MTR-0.0" +#define HW_VERSION_MTR_0_1 "MTR-0.1" #define HW_VERSION_MTOCGD3_0_0 "MTOCGD3-0.0" #define HW_VERSION_MTOCGD_0_0 "MTOCGD-0.0" #define HW_VERSION_MTOCGD_0_1 "MTOCGD-0.1" @@ -56,6 +59,11 @@ enum { MTOCGD_0_1, }; +enum { + MTDC_NONE, + MTDC_GPIOB_0_0, +}; + #define DEVICE_CAPA_INDEX(c) (((c) & 0xFF) >> 3) #define DEVICE_CAPA_MASK(c) BIT((c) & 0x07) @@ -81,8 +89,6 @@ do { \ #define CAPA_BLUETOOTH DEVICE_CAPA_VALUE(1, 7) #define CAPA_WIFI DEVICE_CAPA_VALUE(1, 6) -#define DAUGHTER_CARD_GPIO "MTDC-GPIOB" - /* on-board EEPROM */ struct mts_id_eeprom_layout { char vendor_id[32]; -- cgit v1.2.3