diff options
Diffstat (limited to 'arch/mips/txx9/rbtx4939/setup.c')
| -rw-r--r-- | arch/mips/txx9/rbtx4939/setup.c | 88 |
1 files changed, 84 insertions, 4 deletions
diff --git a/arch/mips/txx9/rbtx4939/setup.c b/arch/mips/txx9/rbtx4939/setup.c index 9855d7bccc2..98fbd9391bf 100644 --- a/arch/mips/txx9/rbtx4939/setup.c +++ b/arch/mips/txx9/rbtx4939/setup.c | |||
| @@ -14,6 +14,8 @@ | |||
| 14 | #include <linux/types.h> | 14 | #include <linux/types.h> |
| 15 | #include <linux/platform_device.h> | 15 | #include <linux/platform_device.h> |
| 16 | #include <linux/leds.h> | 16 | #include <linux/leds.h> |
| 17 | #include <linux/interrupt.h> | ||
| 18 | #include <linux/smc91x.h> | ||
| 17 | #include <asm/reboot.h> | 19 | #include <asm/reboot.h> |
| 18 | #include <asm/txx9/generic.h> | 20 | #include <asm/txx9/generic.h> |
| 19 | #include <asm/txx9/pci.h> | 21 | #include <asm/txx9/pci.h> |
| @@ -33,6 +35,21 @@ static void __init rbtx4939_time_init(void) | |||
| 33 | tx4939_time_init(0); | 35 | tx4939_time_init(0); |
| 34 | } | 36 | } |
| 35 | 37 | ||
| 38 | #if defined(__BIG_ENDIAN) && \ | ||
| 39 | (defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE)) | ||
| 40 | #define HAVE_RBTX4939_IOSWAB | ||
| 41 | #define IS_CE1_ADDR(addr) \ | ||
| 42 | ((((unsigned long)(addr) - IO_BASE) & 0xfff00000) == TXX9_CE(1)) | ||
| 43 | static u16 rbtx4939_ioswabw(volatile u16 *a, u16 x) | ||
| 44 | { | ||
| 45 | return IS_CE1_ADDR(a) ? x : le16_to_cpu(x); | ||
| 46 | } | ||
| 47 | static u16 rbtx4939_mem_ioswabw(volatile u16 *a, u16 x) | ||
| 48 | { | ||
| 49 | return !IS_CE1_ADDR(a) ? x : le16_to_cpu(x); | ||
| 50 | } | ||
| 51 | #endif /* __BIG_ENDIAN && CONFIG_SMC91X */ | ||
| 52 | |||
| 36 | static void __init rbtx4939_pci_setup(void) | 53 | static void __init rbtx4939_pci_setup(void) |
| 37 | { | 54 | { |
| 38 | #ifdef CONFIG_PCI | 55 | #ifdef CONFIG_PCI |
| @@ -239,6 +256,32 @@ static inline void rbtx4939_led_setup(void) | |||
| 239 | } | 256 | } |
| 240 | #endif | 257 | #endif |
| 241 | 258 | ||
| 259 | static void __rbtx4939_7segled_putc(unsigned int pos, unsigned char val) | ||
| 260 | { | ||
| 261 | #if defined(CONFIG_LEDS_CLASS) || defined(CONFIG_LEDS_CLASS_MODULE) | ||
| 262 | unsigned long flags; | ||
| 263 | local_irq_save(flags); | ||
| 264 | /* bit7: reserved for LED class */ | ||
| 265 | led_val[pos] = (led_val[pos] & 0x80) | (val & 0x7f); | ||
| 266 | val = led_val[pos]; | ||
| 267 | local_irq_restore(flags); | ||
| 268 | #endif | ||
| 269 | writeb(val, rbtx4939_7seg_addr(pos / 4, pos % 4)); | ||
| 270 | } | ||
| 271 | |||
| 272 | static void rbtx4939_7segled_putc(unsigned int pos, unsigned char val) | ||
| 273 | { | ||
| 274 | /* convert from map_to_seg7() notation */ | ||
| 275 | val = (val & 0x88) | | ||
| 276 | ((val & 0x40) >> 6) | | ||
| 277 | ((val & 0x20) >> 4) | | ||
| 278 | ((val & 0x10) >> 2) | | ||
| 279 | ((val & 0x04) << 2) | | ||
| 280 | ((val & 0x02) << 4) | | ||
| 281 | ((val & 0x01) << 6); | ||
| 282 | __rbtx4939_7segled_putc(pos, val); | ||
| 283 | } | ||
| 284 | |||
| 242 | static void __init rbtx4939_arch_init(void) | 285 | static void __init rbtx4939_arch_init(void) |
| 243 | { | 286 | { |
| 244 | rbtx4939_pci_setup(); | 287 | rbtx4939_pci_setup(); |
| @@ -246,22 +289,50 @@ static void __init rbtx4939_arch_init(void) | |||
| 246 | 289 | ||
| 247 | static void __init rbtx4939_device_init(void) | 290 | static void __init rbtx4939_device_init(void) |
| 248 | { | 291 | { |
| 292 | unsigned long smc_addr = RBTX4939_ETHER_ADDR - IO_BASE; | ||
| 293 | struct resource smc_res[] = { | ||
| 294 | { | ||
| 295 | .start = smc_addr, | ||
| 296 | .end = smc_addr + 0x10 - 1, | ||
| 297 | .flags = IORESOURCE_MEM, | ||
| 298 | }, { | ||
| 299 | .start = RBTX4939_IRQ_ETHER, | ||
| 300 | /* override default irq flag defined in smc91x.h */ | ||
| 301 | .flags = IORESOURCE_IRQ | IRQF_TRIGGER_LOW, | ||
| 302 | }, | ||
| 303 | }; | ||
| 304 | struct smc91x_platdata smc_pdata = { | ||
| 305 | .flags = SMC91X_USE_16BIT, | ||
| 306 | }; | ||
| 307 | struct platform_device *pdev; | ||
| 249 | #if defined(CONFIG_TC35815) || defined(CONFIG_TC35815_MODULE) | 308 | #if defined(CONFIG_TC35815) || defined(CONFIG_TC35815_MODULE) |
| 250 | int i, j; | 309 | int i, j; |
| 251 | unsigned char ethaddr[2][6]; | 310 | unsigned char ethaddr[2][6]; |
| 311 | u8 bdipsw = readb(rbtx4939_bdipsw_addr) & 0x0f; | ||
| 312 | |||
| 252 | for (i = 0; i < 2; i++) { | 313 | for (i = 0; i < 2; i++) { |
| 253 | unsigned long area = CKSEG1 + 0x1fff0000 + (i * 0x10); | 314 | unsigned long area = CKSEG1 + 0x1fff0000 + (i * 0x10); |
| 254 | if (readb(rbtx4939_bdipsw_addr) & 8) { | 315 | if (bdipsw == 0) |
| 316 | memcpy(ethaddr[i], (void *)area, 6); | ||
| 317 | else { | ||
| 255 | u16 buf[3]; | 318 | u16 buf[3]; |
| 256 | area -= 0x03000000; | 319 | if (bdipsw & 8) |
| 320 | area -= 0x03000000; | ||
| 321 | else | ||
| 322 | area -= 0x01000000; | ||
| 257 | for (j = 0; j < 3; j++) | 323 | for (j = 0; j < 3; j++) |
| 258 | buf[j] = le16_to_cpup((u16 *)(area + j * 2)); | 324 | buf[j] = le16_to_cpup((u16 *)(area + j * 2)); |
| 259 | memcpy(ethaddr[i], buf, 6); | 325 | memcpy(ethaddr[i], buf, 6); |
| 260 | } else | 326 | } |
| 261 | memcpy(ethaddr[i], (void *)area, 6); | ||
| 262 | } | 327 | } |
| 263 | tx4939_ethaddr_init(ethaddr[0], ethaddr[1]); | 328 | tx4939_ethaddr_init(ethaddr[0], ethaddr[1]); |
| 264 | #endif | 329 | #endif |
| 330 | pdev = platform_device_alloc("smc91x", -1); | ||
| 331 | if (!pdev || | ||
| 332 | platform_device_add_resources(pdev, smc_res, ARRAY_SIZE(smc_res)) || | ||
| 333 | platform_device_add_data(pdev, &smc_pdata, sizeof(smc_pdata)) || | ||
| 334 | platform_device_add(pdev)) | ||
| 335 | platform_device_put(pdev); | ||
| 265 | rbtx4939_led_setup(); | 336 | rbtx4939_led_setup(); |
| 266 | tx4939_wdt_init(); | 337 | tx4939_wdt_init(); |
| 267 | tx4939_ata_init(); | 338 | tx4939_ata_init(); |
| @@ -269,6 +340,8 @@ static void __init rbtx4939_device_init(void) | |||
| 269 | 340 | ||
| 270 | static void __init rbtx4939_setup(void) | 341 | static void __init rbtx4939_setup(void) |
| 271 | { | 342 | { |
| 343 | int i; | ||
| 344 | |||
| 272 | rbtx4939_ebusc_setup(); | 345 | rbtx4939_ebusc_setup(); |
| 273 | /* always enable ATA0 */ | 346 | /* always enable ATA0 */ |
| 274 | txx9_set64(&tx4939_ccfgptr->pcfg, TX4939_PCFG_ATA0MODE); | 347 | txx9_set64(&tx4939_ccfgptr->pcfg, TX4939_PCFG_ATA0MODE); |
| @@ -276,9 +349,16 @@ static void __init rbtx4939_setup(void) | |||
| 276 | if (txx9_master_clock == 0) | 349 | if (txx9_master_clock == 0) |
| 277 | txx9_master_clock = 20000000; | 350 | txx9_master_clock = 20000000; |
| 278 | tx4939_setup(); | 351 | tx4939_setup(); |
| 352 | #ifdef HAVE_RBTX4939_IOSWAB | ||
| 353 | ioswabw = rbtx4939_ioswabw; | ||
| 354 | __mem_ioswabw = rbtx4939_mem_ioswabw; | ||
| 355 | #endif | ||
| 279 | 356 | ||
| 280 | _machine_restart = rbtx4939_machine_restart; | 357 | _machine_restart = rbtx4939_machine_restart; |
| 281 | 358 | ||
| 359 | txx9_7segled_init(RBTX4939_MAX_7SEGLEDS, rbtx4939_7segled_putc); | ||
| 360 | for (i = 0; i < RBTX4939_MAX_7SEGLEDS; i++) | ||
| 361 | txx9_7segled_putc(i, '-'); | ||
| 282 | pr_info("RBTX4939 (Rev %02x) --- FPGA(Rev %02x) DIPSW:%02x,%02x\n", | 362 | pr_info("RBTX4939 (Rev %02x) --- FPGA(Rev %02x) DIPSW:%02x,%02x\n", |
| 283 | readb(rbtx4939_board_rev_addr), readb(rbtx4939_ioc_rev_addr), | 363 | readb(rbtx4939_board_rev_addr), readb(rbtx4939_ioc_rev_addr), |
| 284 | readb(rbtx4939_udipsw_addr), readb(rbtx4939_bdipsw_addr)); | 364 | readb(rbtx4939_udipsw_addr), readb(rbtx4939_bdipsw_addr)); |
