Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ARM: OMAP: abstract debug card setup (smc, leds)

Additional cleanup for debug boards on H2/P2/H3/H4: move the init
code that's not board-specific into a new file where it can be easily
shared between all the different boards (avoiding code duplication,
and making it easier to support more devices). Make H4 use that.

This should be easy to drop in to the OMAP1 boards using these debug
cards; the only difference seems to be that the p2 does an extra reset
of the smc using the fpga (probably all boards could do that, if it's
necessary) and doesn't use the gpio mux or request APIs.

Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
Signed-off-by: Tony Lindgren <tony@atomide.com>

authored by

David Brownell and committed by
Tony Lindgren
f6049312 1c22cc13

+102 -46
+1 -1
arch/arm/mach-omap2/Kconfig
··· 21 21 config MACH_OMAP_H4 22 22 bool "OMAP 2420 H4 board" 23 23 depends on ARCH_OMAP2 && ARCH_OMAP24XX 24 - select OMAP_DEBUG_LEDS if LEDS || LEDS_OMAP_DEBUG 24 + select OMAP_DEBUG_DEVICES 25 25 26 26 config MACH_OMAP_APOLLON 27 27 bool "OMAP 2420 Apollon board"
+3 -43
arch/arm/mach-omap2/board-h4.c
··· 131 131 .resource = &h4_flash_resource, 132 132 }; 133 133 134 - static struct resource h4_smc91x_resources[] = { 135 - [0] = { 136 - .start = OMAP24XX_ETHR_START, /* Physical */ 137 - .end = OMAP24XX_ETHR_START + 0xf, 138 - .flags = IORESOURCE_MEM, 139 - }, 140 - [1] = { 141 - .start = OMAP_GPIO_IRQ(OMAP24XX_ETHR_GPIO_IRQ), 142 - .end = OMAP_GPIO_IRQ(OMAP24XX_ETHR_GPIO_IRQ), 143 - .flags = IORESOURCE_IRQ, 144 - }, 145 - }; 146 - 147 - static struct platform_device h4_smc91x_device = { 148 - .name = "smc91x", 149 - .id = -1, 150 - .num_resources = ARRAY_SIZE(h4_smc91x_resources), 151 - .resource = h4_smc91x_resources, 152 - }; 153 - 154 134 /* Select between the IrDA and aGPS module 155 135 */ 156 136 static int h4_select_irda(struct device *dev, int state) ··· 246 266 .id = -1, 247 267 }; 248 268 249 - static struct resource h4_led_resources[] = { 250 - [0] = { 251 - .flags = IORESOURCE_MEM, 252 - }, 253 - }; 254 - 255 - static struct platform_device h4_led_device = { 256 - .name = "omap_dbg_led", 257 - .id = -1, 258 - .num_resources = ARRAY_SIZE(h4_led_resources), 259 - .resource = h4_led_resources, 260 - }; 261 - 262 269 static struct platform_device *h4_devices[] __initdata = { 263 - &h4_smc91x_device, 264 270 &h4_flash_device, 265 271 &h4_irda_device, 266 272 &h4_kp_device, 267 273 &h4_lcd_device, 268 - &h4_led_device, 269 274 }; 270 275 271 - static inline void __init h4_init_smc91x(void) 276 + static inline void __init h4_init_debug(void) 272 277 { 273 278 /* Make sure CS1 timings are correct */ 274 279 GPMC_CONFIG1_1 = 0x00011200; ··· 266 301 udelay(100); 267 302 268 303 omap_cfg_reg(M15_24XX_GPIO92); 269 - if (omap_request_gpio(OMAP24XX_ETHR_GPIO_IRQ) < 0) { 270 - printk(KERN_ERR "Failed to request GPIO%d for smc91x IRQ\n", 271 - OMAP24XX_ETHR_GPIO_IRQ); 272 - return; 273 - } 274 - omap_set_gpio_direction(OMAP24XX_ETHR_GPIO_IRQ, 1); 304 + if (debug_card_init(cs_mem_base, OMAP24XX_ETHR_GPIO_IRQ) < 0) 305 + gpmc_cs_free(eth_cs); 275 306 } 276 307 277 308 static void __init omap_h4_init_irq(void) ··· 275 314 omap2_init_common_hw(); 276 315 omap_init_irq(); 277 316 omap_gpio_init(); 278 - h4_init_smc91x(); 279 317 } 280 318 281 319 static struct omap_uart_config h4_uart_config __initdata = {
+7 -2
arch/arm/plat-omap/Kconfig
··· 20 20 21 21 comment "OMAP Feature Selections" 22 22 23 - config OMAP_DEBUG_LEDS 23 + config OMAP_DEBUG_DEVICES 24 24 bool 25 25 help 26 - For debug card leds on TI reference boards. 26 + For debug cards on TI reference boards. 27 + 28 + config OMAP_DEBUG_LEDS 29 + bool 30 + depends on OMAP_DEBUG_DEVICES 31 + default y if LEDS || LEDS_OMAP_DEBUG 27 32 28 33 config OMAP_RESET_CLOCKS 29 34 bool "Reset unused clocks during boot"
+1
arch/arm/plat-omap/Makefile
··· 17 17 18 18 obj-$(CONFIG_CPU_FREQ) += cpu-omap.o 19 19 obj-$(CONFIG_OMAP_DM_TIMER) += dmtimer.o 20 + obj-$(CONFIG_OMAP_DEBUG_DEVICES) += debug-devices.o 20 21 obj-$(CONFIG_OMAP_DEBUG_LEDS) += debug-leds.o
+86
arch/arm/plat-omap/debug-devices.c
··· 1 + /* 2 + * linux/arch/arm/plat-omap/debug-devices.c 3 + * 4 + * Copyright (C) 2005 Nokia Corporation 5 + * Modified from mach-omap2/board-h4.c 6 + * 7 + * This program is free software; you can redistribute it and/or modify 8 + * it under the terms of the GNU General Public License version 2 as 9 + * published by the Free Software Foundation. 10 + */ 11 + 12 + #include <linux/kernel.h> 13 + #include <linux/init.h> 14 + #include <linux/platform_device.h> 15 + 16 + #include <asm/hardware.h> 17 + #include <asm/io.h> 18 + 19 + #include <asm/arch/board.h> 20 + #include <asm/arch/gpio.h> 21 + 22 + 23 + /* Many OMAP development platforms reuse the same "debug board"; these 24 + * platforms include H2, H3, H4, and Perseus2. 25 + */ 26 + 27 + static struct resource smc91x_resources[] = { 28 + [0] = { 29 + .flags = IORESOURCE_MEM, 30 + }, 31 + [1] = { 32 + .flags = IORESOURCE_IRQ, 33 + }, 34 + }; 35 + 36 + static struct platform_device smc91x_device = { 37 + .name = "smc91x", 38 + .id = -1, 39 + .num_resources = ARRAY_SIZE(smc91x_resources), 40 + .resource = smc91x_resources, 41 + }; 42 + 43 + static struct resource led_resources[] = { 44 + [0] = { 45 + .flags = IORESOURCE_MEM, 46 + }, 47 + }; 48 + 49 + static struct platform_device led_device = { 50 + .name = "omap_dbg_led", 51 + .id = -1, 52 + .num_resources = ARRAY_SIZE(led_resources), 53 + .resource = led_resources, 54 + }; 55 + 56 + static struct platform_device *debug_devices[] __initdata = { 57 + &smc91x_device, 58 + &led_device, 59 + /* ps2 kbd + mouse ports */ 60 + /* 4 extra uarts */ 61 + /* 6 input dip switches */ 62 + /* 8 output pins */ 63 + }; 64 + 65 + int __init debug_card_init(u32 addr, unsigned gpio) 66 + { 67 + int status; 68 + 69 + smc91x_resources[0].start = addr + 0x300; 70 + smc91x_resources[0].end = addr + 0x30f; 71 + 72 + smc91x_resources[1].start = OMAP_GPIO_IRQ(gpio); 73 + smc91x_resources[1].end = OMAP_GPIO_IRQ(gpio); 74 + 75 + status = omap_request_gpio(gpio); 76 + if (status < 0) { 77 + printk(KERN_ERR "GPIO%d unavailable for smc91x IRQ\n", gpio); 78 + return status; 79 + } 80 + omap_set_gpio_direction(gpio, 1); 81 + 82 + led_resources[0].start = addr; 83 + led_resources[0].end = addr + SZ_4K - 1; 84 + 85 + return platform_add_devices(debug_devices, ARRAY_SIZE(debug_devices)); 86 + }
+4
include/asm-arm/arch-omap/board.h
··· 179 179 extern struct omap_board_config_kernel *omap_board_config; 180 180 extern int omap_board_config_size; 181 181 182 + 183 + /* for TI reference platforms sharing the same debug card */ 184 + extern int debug_card_init(u32 addr, unsigned gpio); 185 + 182 186 #endif