From 510acd057785ff52bfdfed6360a44a42f44e078f Mon Sep 17 00:00:00 2001 From: Vivien Didelot Date: Mon, 7 Jul 2014 15:56:11 -0400 Subject: [PATCH] x86: (ts5500) add board support for TS-5400 This patch extends the TS-5500 board support to identify the compatible TS-5400 Single Board Computer (ID 0x40). It also adds a new "name" sysfs attribute for more human readable identification, actually printing "TS-5500" or "TS-5400". Signed-off-by: Vivien Didelot --- arch/x86/platform/ts5500/ts5500.c | 34 +++++++++++++++++++++++++++------- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/arch/x86/platform/ts5500/ts5500.c b/arch/x86/platform/ts5500/ts5500.c index 9471b94..127fce2 100644 --- a/arch/x86/platform/ts5500/ts5500.c +++ b/arch/x86/platform/ts5500/ts5500.c @@ -31,7 +31,6 @@ /* Product code register */ #define TS5500_PRODUCT_CODE_ADDR 0x74 -#define TS5500_PRODUCT_CODE 0x60 /* TS-5500 product code */ /* SRAM/RS-485/ADC options, and RS-485 RTS/Automatic RS-485 flags register */ #define TS5500_SRAM_RS485_ADC_ADDR 0x75 @@ -64,9 +63,17 @@ #define TS5500_ADC_CONV_MSB_ADDR 0x197 /* MSB register */ #define TS5500_ADC_CONV_DELAY 12 /* usec */ +static const struct ts5x00_info { + const int id; + const char * const name; +} ts5x00_info[] = { + { 0x40, "TS-5400" }, + { 0x60, "TS-5500" }, +}; + /** * struct ts5500_sbc - TS-5500 board description - * @id: Board product ID. + * @info: Board identification. * @sram: Flag for SRAM option. * @rs485: Flag for RS-485 option. * @adc: Flag for Analog/Digital converter option. @@ -75,7 +82,7 @@ * @jumpers: Bitfield for jumpers' state. */ struct ts5500_sbc { - int id; + const struct ts5x00_info *info; bool sram; bool rs485; bool adc; @@ -117,18 +124,21 @@ static int __init ts5500_check_signature(void) static int __init ts5500_detect_config(struct ts5500_sbc *sbc) { u8 tmp; + int i; int ret = 0; if (!request_region(TS5500_PRODUCT_CODE_ADDR, 4, "ts5500")) return -EBUSY; tmp = inb(TS5500_PRODUCT_CODE_ADDR); - if (tmp != TS5500_PRODUCT_CODE) { - pr_err("This platform is not a TS-5500 (found ID 0x%x)\n", tmp); + for (i = 0; i < ARRAY_SIZE(ts5x00_info) && !sbc->info; ++i) + if (tmp == ts5x00_info[i].id) + sbc->info = &ts5x00_info[i]; + if (!sbc->info) { + pr_err("Not a known TS-5x00 platform (found ID 0x%x)\n", tmp); ret = -ENODEV; goto cleanup; } - sbc->id = tmp; tmp = inb(TS5500_SRAM_RS485_ADC_ADDR); sbc->sram = tmp & TS5500_SRAM; @@ -152,7 +162,15 @@ static ssize_t ts5500_show_id(struct device *dev, { struct ts5500_sbc *sbc = dev_get_drvdata(dev); - return sprintf(buf, "0x%.2x\n", sbc->id); + return sprintf(buf, "0x%.2x\n", sbc->info->id); +} + +static ssize_t ts5500_show_name(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct ts5500_sbc *sbc = dev_get_drvdata(dev); + + return sprintf(buf, "%s\n", sbc->info->name); } static ssize_t ts5500_show_jumpers(struct device *dev, @@ -180,6 +198,7 @@ TS5500_SHOW(ereset) TS5500_SHOW(itr) static DEVICE_ATTR(id, S_IRUGO, ts5500_show_id, NULL); +static DEVICE_ATTR(name, S_IRUGO, ts5500_show_name, NULL); static DEVICE_ATTR(jumpers, S_IRUGO, ts5500_show_jumpers, NULL); static DEVICE_ATTR(sram, S_IRUGO, ts5500_show_sram, NULL); static DEVICE_ATTR(rs485, S_IRUGO, ts5500_show_rs485, NULL); @@ -189,6 +208,7 @@ static DEVICE_ATTR(itr, S_IRUGO, ts5500_show_itr, NULL); static struct attribute *ts5500_attributes[] = { &dev_attr_id.attr, + &dev_attr_name.attr, &dev_attr_jumpers.attr, &dev_attr_sram.attr, &dev_attr_rs485.attr, -- 1.9.1