From 7db83cc15dde71ec288c7b7424b2dbad12b18ecd Mon Sep 17 00:00:00 2001 From: Thanh Tran Date: Fri, 30 Sep 2011 09:19:58 -0500 Subject: 1. Used strncmp() to compare only the product name portion of product_ID. 2. GPOx logic levels were wrong, corrections were made to match the stand-alone CDP box. 3. Configured GPIO11 and GPIO12 to be open-drain. 4. Set driver version to v0.5.1 --- io-module/mts_io.c | 70 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 36 insertions(+), 34 deletions(-) diff --git a/io-module/mts_io.c b/io-module/mts_io.c index a6add6c..427c464 100644 --- a/io-module/mts_io.c +++ b/io-module/mts_io.c @@ -41,7 +41,7 @@ #include "mts_io.h" -#define DRIVER_VERSION "v0.4.2" +#define DRIVER_VERSION "v0.5.1" #define DRIVER_AUTHOR "James Maki " #define DRIVER_DESC "MTCDP IO Controller" #define DRIVER_NAME "mts-io" @@ -210,6 +210,7 @@ static struct gpio_pin gpio_pins_mtcdp_1_0[] = { #endif .output_value = 1, .use_pullup = 0, + }, #if LED_STATUS_CONTROLLABLE { @@ -340,14 +341,14 @@ static struct gpio_pin gpio_pins_mt100eocg_0_0[] = { .pin = AT91_PIN_PB19, .direction = GPIO_DIR_OUTPUT, .output_value = 1, - .use_pullup = 0, + .use_pullup = 1, }, { .name = "GPIO12", .pin = AT91_PIN_PB20, .direction = GPIO_DIR_OUTPUT, .output_value = 1, - .use_pullup = 0, + .use_pullup = 1, }, { }, }; @@ -386,7 +387,7 @@ static int mts_id_eeprom_load(void) DEVICE_CAPA_SET(id_eeprom.capa, CAPA_GPS); gpio_pins = gpio_pins_mtcdp_0_0; - } else if (!strcmp(id_eeprom.product_id, PRODUCT_ID_MT100EOCG)) { + } else if (strncmp(id_eeprom.product_id, PRODUCT_ID_MT100EOCG, strlen(PRODUCT_ID_MT100EOCG)) == 0) { gpio_pins = gpio_pins_mt100eocg_0_0; } else { gpio_pins = gpio_pins_mtcdp_1_0; @@ -1005,20 +1006,12 @@ static ssize_t mts_attr_store_dout(struct device *dev, mutex_lock(&spi_dout_mutex); - if (!strcmp(id_eeprom.product_id, PRODUCT_ID_MT100EOCG)) { - if (!value) { - spi_dout_value &= ~bit; - } else { - spi_dout_value |= bit; - } - } - else { - if (value) { - spi_dout_value &= ~bit; - } else { - spi_dout_value |= bit; - } + if (value) { + spi_dout_value &= ~bit; + } else { + spi_dout_value |= bit; } + spi_writen(spi_dout_dev, &spi_dout_value, 1); mutex_unlock(&spi_dout_mutex); @@ -1061,12 +1054,7 @@ static ssize_t mts_attr_show_dout(struct device *dev, mutex_lock(&spi_dout_mutex); - if (!strcmp(id_eeprom.product_id, PRODUCT_ID_MT100EOCG)) { - value = spi_dout_value & bit ? 1 : 0; - } - else { - value = spi_dout_value & bit ? 0 : 1; - } + value = spi_dout_value & bit ? 0 : 1; mutex_unlock(&spi_dout_mutex); @@ -1366,7 +1354,7 @@ static ssize_t mts_attr_show_led_ls(struct device *dev, int value; struct gpio_pin *pin; - if (!strcmp(id_eeprom.product_id, PRODUCT_ID_MT100EOCG)) { + if (strcmp(id_eeprom.product_id, PRODUCT_ID_MT100EOCG) == 0) { pin = gpio_pin_by_name("LED3"); } else { @@ -1397,7 +1385,7 @@ static ssize_t mts_attr_store_led_ls(struct device *dev, int err; struct gpio_pin *pin; - if (!strcmp(id_eeprom.product_id, PRODUCT_ID_MT100EOCG)) { + if (strcmp(id_eeprom.product_id, PRODUCT_ID_MT100EOCG) == 0) { pin = gpio_pin_by_name("LED3"); } else { @@ -2440,7 +2428,7 @@ static int __init mts_io_init(void) goto error2; } - if (!strcmp(id_eeprom.product_id, PRODUCT_ID_MT100EOCG)) { + if (strcmp(id_eeprom.product_id, PRODUCT_ID_MT100EOCG) == 0) { ret = sysfs_create_group(&mts_io_platform_device->dev.kobj, &mt100eocg_platform_attribute_group); if (ret) { @@ -2456,7 +2444,7 @@ static int __init mts_io_init(void) } // No sout driver for MT100EOCG - if (strcmp(id_eeprom.product_id, PRODUCT_ID_MT100EOCG)) { + if (strcmp(id_eeprom.product_id, PRODUCT_ID_MT100EOCG) != 0) { ret = spi_register_driver(&mts_spi_sout_driver); if (ret) { goto error4; @@ -2502,19 +2490,33 @@ static int __init mts_io_init(void) gpio_request(pin->pin, pin->name); if (pin->direction == GPIO_DIR_OUTPUT) { - at91_set_gpio_output(pin->pin, pin->output_value); + at91_set_gpio_output_with_pullup(pin->pin, pin->output_value, pin->use_pullup); } else { at91_set_gpio_input(pin->pin, pin->use_pullup); } } + if (strcmp(id_eeprom.product_id, PRODUCT_ID_MT100EOCG) == 0) { + //Set open drain for GPIO11 and GPIO12 using multi drive + pin = gpio_pin_by_name("GPIO11"); + if (pin) { + log_info("Set open drain for GPIO11"); + at91_set_multi_drive(pin->pin, true); + } + pin = gpio_pin_by_name("GPIO12"); + if (pin) { + log_info("Set open drain for GPIO12"); + at91_set_multi_drive(pin->pin, true); + } + } + pin = gpio_pin_by_name("ENIO"); if (pin) { at91_set_gpio_value(pin->pin, 0); } - // No blinking for MT100EOCG - if (strcmp(id_eeprom.product_id, PRODUCT_ID_MT100EOCG)) { + // No blink_callback for MT100EOCG + if (strcmp(id_eeprom.product_id, PRODUCT_ID_MT100EOCG) != 0) { blink_callback(NULL); } @@ -2529,11 +2531,11 @@ error7: error6: spi_unregister_driver(&mts_spi_dout_driver); error5: - if (strcmp(id_eeprom.product_id, PRODUCT_ID_MT100EOCG)) { + if (strcmp(id_eeprom.product_id, PRODUCT_ID_MT100EOCG) != 0) { spi_unregister_driver(&mts_spi_sout_driver); } error4: - if (!strcmp(id_eeprom.product_id, PRODUCT_ID_MT100EOCG)) { + if (strcmp(id_eeprom.product_id, PRODUCT_ID_MT100EOCG) == 0) { sysfs_remove_group(&mts_io_platform_device->dev.kobj, &mt100eocg_platform_attribute_group); } @@ -2553,7 +2555,7 @@ error1: static void __exit mts_io_exit(void) { - if (strcmp(id_eeprom.product_id, PRODUCT_ID_MT100EOCG)) { + if (strcmp(id_eeprom.product_id, PRODUCT_ID_MT100EOCG) != 0) { cancel_delayed_work_sync(&blink_work); } @@ -2565,7 +2567,7 @@ static void __exit mts_io_exit(void) spi_unregister_driver(&mts_spi_dout_driver); spi_unregister_driver(&mts_spi_board_temp_driver); - if (!strcmp(id_eeprom.product_id, PRODUCT_ID_MT100EOCG)) { + if (strcmp(id_eeprom.product_id, PRODUCT_ID_MT100EOCG) == 0) { sysfs_remove_group(&mts_io_platform_device->dev.kobj, &mt100eocg_platform_attribute_group); } -- cgit v1.2.3