From b8d251412bc4c420f33920c2d9492076fc7b9624 Mon Sep 17 00:00:00 2001 From: Andy Green Date: Sun, 13 Apr 2008 07:25:52 +0100 Subject: [PATCH] add-gta02-pcb-revision-detect.patch Add function int gta02_get_pcb_revision(void) which returns state of GTA02 PCB revision pins. It is also called and logged during boot with KERN_INFO. The results look like: b9 b8 b2 b1 b0 GPD4 GPD3 GPD0 GPC15 GPC13 GTA02 A5 and before: 0x000 GTA02 A6 : 0x001 Signed-off-by: Andy Green --- arch/arm/mach-s3c2440/mach-gta02.c | 55 +++++++++++++++++++++++++++++++++- include/asm-arm/arch-s3c2410/gta02.h | 9 +++++ 2 files changed, 63 insertions(+), 1 deletions(-) diff --git a/arch/arm/mach-s3c2440/mach-gta02.c b/arch/arm/mach-s3c2440/mach-gta02.c index 99206ee..a2a63fe 100644 --- a/arch/arm/mach-s3c2440/mach-gta02.c +++ b/arch/arm/mach-s3c2440/mach-gta02.c @@ -320,6 +320,59 @@ FIQ_HANDLER_ENTRY(256, 512) FIQ_HANDLER_END() +/** + * returns PCB revision information in b9,b8 and b2,b1,b0 + * Pre-GTA02 A6 returns 0x000 + * GTA02 A6 returns 0x101 + * ... + */ + +int gta02_get_pcb_revision(void) +{ + int n; + int u = 0; + static unsigned long pinlist[] = { + GTA02_PCB_ID1_0, + GTA02_PCB_ID1_1, + GTA02_PCB_ID1_2, + GTA02_PCB_ID2_0, + GTA02_PCB_ID2_1, + }; + static int pin_offset[] = { + 0, 1, 2, 8, 9 + }; + + for (n = 0 ; n < ARRAY_SIZE(pinlist); n++) { + /* + * set the PCB version GPIO to be pulled-down input + * force low briefly first + */ + s3c2410_gpio_cfgpin(pinlist[n], S3C2410_GPIO_OUTPUT); + s3c2410_gpio_setpin(pinlist[n], 0); + /* misnomer: it is a pullDOWN in 2442 */ + s3c2410_gpio_pullup(pinlist[n], 1); + s3c2410_gpio_cfgpin(pinlist[n], S3C2410_GPIO_INPUT); + + udelay(10); + + if (s3c2410_gpio_getpin(pinlist[n])) + u |= 1 << pin_offset[n]; + + /* + * when not being interrogated, all of the revision GPIO + * are set to output HIGH without pulldown so no current flows + * if they are NC or pulled up. + */ + s3c2410_gpio_setpin(pinlist[n], 1); + s3c2410_gpio_cfgpin(pinlist[n], S3C2410_GPIO_OUTPUT); + /* misnomer: it is a pullDOWN in 2442 */ + s3c2410_gpio_pullup(pinlist[n], 0); + } + + return u; +} + + static struct map_desc gta02_iodesc[] __initdata = { { .virtual = 0xe0000000, @@ -911,7 +964,7 @@ void gat02_lis302dl_suspend_io(struct lis302dl_info *lis, int resume) s3c2410_gpio_pullup(pdata->pin_miso, 0); } -const struct lis302dl_platform_data lis302_pdata[] = { +struct lis302dl_platform_data lis302_pdata[] = { { .name = "lis302-1 (top)", .pin_chip_select= S3C2410_GPD12, diff --git a/include/asm-arm/arch-s3c2410/gta02.h b/include/asm-arm/arch-s3c2410/gta02.h index f686a7a..791ea4f 100644 --- a/include/asm-arm/arch-s3c2410/gta02.h +++ b/include/asm-arm/arch-s3c2410/gta02.h @@ -97,4 +97,13 @@ #define GTA02v3_IRQ_nUSB_FLT IRQ_EINT18 /* v3 + v4 only */ #define GTA02v3_IRQ_nGSM_OC IRQ_EINT19 /* v3 + v4 only */ +/* returns 00 000 on GTA02 A5 and earlier, A6 returns 01 001 */ +#define GTA02_PCB_ID1_0 S3C2410_GPC13 +#define GTA02_PCB_ID1_1 S3C2410_GPC15 +#define GTA02_PCB_ID1_2 S3C2410_GPD0 +#define GTA02_PCB_ID2_0 S3C2410_GPD3 +#define GTA02_PCB_ID2_1 S3C2410_GPD4 + +int gta02_get_pcb_revision(void); + #endif /* _GTA02_H */ -- 1.5.6.5