From: Paul Mundt This fixes up a few minor IDE issues on sh64. We also enable cayman on-board IDE in the SuperIO. Signed-off-by: Richard Curnow Signed-off-by: Paul Mundt Signed-off-by: Andrew Morton --- 25-akpm/arch/sh64/mach-cayman/setup.c | 51 +++++++++++++++++++++++++++++----- 25-akpm/include/asm-sh64/ide.h | 5 +++ 25-akpm/include/asm-sh64/irq.h | 5 ++- 3 files changed, 52 insertions(+), 9 deletions(-) diff -puN arch/sh64/mach-cayman/setup.c~sh64-ide-updates arch/sh64/mach-cayman/setup.c --- 25/arch/sh64/mach-cayman/setup.c~sh64-ide-updates 2005-03-07 20:41:27.000000000 -0800 +++ 25-akpm/arch/sh64/mach-cayman/setup.c 2005-03-07 20:41:27.000000000 -0800 @@ -33,8 +33,6 @@ #include #include -#define RES_COUNT(res) ((sizeof((res))/sizeof(struct resource))) - /* * Platform Dependent Interrupt Priorities. */ @@ -86,10 +84,14 @@ #define SMSC_DEVICE_ID_INDEX 0x20 #define SMSC_DEVICE_REV_INDEX 0x21 #define SMSC_ACTIVATE_INDEX 0x30 +#define SMSC_PRIMARY_BASE_INDEX 0x60 +#define SMSC_SECONDARY_BASE_INDEX 0x62 #define SMSC_PRIMARY_INT_INDEX 0x70 #define SMSC_SECONDARY_INT_INDEX 0x72 -#define SMSC_KEYBOARD_DEVICE 7 +#define SMSC_IDE1_DEVICE 1 +#define SMSC_KEYBOARD_DEVICE 7 +#define SMSC_CONFIG_REGISTERS 8 #define SMSC_SUPERIO_READ_INDEXED(index) ({ \ outb((index), SMSC_INDEX_PORT_ADDR); \ @@ -98,6 +100,9 @@ outb((index), SMSC_INDEX_PORT_ADDR); \ outb((val), SMSC_DATA_PORT_ADDR); }) +#define IDE1_PRIMARY_BASE 0x01f0 +#define IDE1_SECONDARY_BASE 0x03f6 + unsigned long smsc_superio_virt; /* @@ -125,13 +130,13 @@ struct sh64_platform platform_parms = { .initial_root_dev = 0x0100, .loader_type = 1, .io_res_p = io_resources, - .io_res_count = RES_COUNT(io_resources), + .io_res_count = ARRAY_SIZE(io_resources), .kram_res_p = kram_resources, - .kram_res_count = RES_COUNT(kram_resources), + .kram_res_count = ARRAY_SIZE(kram_resources), .xram_res_p = xram_resources, - .xram_res_count = RES_COUNT(xram_resources), + .xram_res_count = ARRAY_SIZE(xram_resources), .rom_res_p = rom_resources, - .rom_res_count = RES_COUNT(rom_resources), + .rom_res_count = ARRAY_SIZE(rom_resources), }; int platform_int_priority[NR_INTC_IRQS] = { @@ -175,6 +180,38 @@ static int __init smsc_superio_setup(voi SMSC_SUPERIO_WRITE_INDEXED(1, SMSC_PRIMARY_INT_INDEX); SMSC_SUPERIO_WRITE_INDEXED(12, SMSC_SECONDARY_INT_INDEX); +#ifdef CONFIG_IDE + /* + * Only IDE1 exists on the Cayman + */ + + /* Power it on */ + SMSC_SUPERIO_WRITE_INDEXED(1 << SMSC_IDE1_DEVICE, 0x22); + + SMSC_SUPERIO_WRITE_INDEXED(SMSC_IDE1_DEVICE, SMCS_LOGICAL_DEV_INDEX); + SMSC_SUPERIO_WRITE_INDEXED(1, SMSC_ACTIVATE_INDEX); + + SMSC_SUPERIO_WRITE_INDEXED(IDE1_PRIMARY_BASE >> 8, + SMSC_PRIMARY_BASE_INDEX + 0); + SMSC_SUPERIO_WRITE_INDEXED(IDE1_PRIMARY_BASE & 0xff, + SMSC_PRIMARY_BASE_INDEX + 1); + + SMSC_SUPERIO_WRITE_INDEXED(IDE1_SECONDARY_BASE >> 8, + SMSC_SECONDARY_BASE_INDEX + 0); + SMSC_SUPERIO_WRITE_INDEXED(IDE1_SECONDARY_BASE & 0xff, + SMSC_SECONDARY_BASE_INDEX + 1); + + SMSC_SUPERIO_WRITE_INDEXED(14, SMSC_PRIMARY_INT_INDEX); + + SMSC_SUPERIO_WRITE_INDEXED(SMSC_CONFIG_REGISTERS, + SMCS_LOGICAL_DEV_INDEX); + + SMSC_SUPERIO_WRITE_INDEXED(0x00, 0xc2); /* GP42 = nIDE1_OE */ + SMSC_SUPERIO_WRITE_INDEXED(0x01, 0xc5); /* GP45 = IDE1_IRQ */ + SMSC_SUPERIO_WRITE_INDEXED(0x00, 0xc6); /* GP46 = nIOROP */ + SMSC_SUPERIO_WRITE_INDEXED(0x00, 0xc7); /* GP47 = nIOWOP */ +#endif + /* Exit the configuraton state */ outb(SMSC_EXIT_CONFIG_KEY, SMSC_CONFIG_PORT_ADDR); diff -puN include/asm-sh64/ide.h~sh64-ide-updates include/asm-sh64/ide.h --- 25/include/asm-sh64/ide.h~sh64-ide-updates 2005-03-07 20:41:27.000000000 -0800 +++ 25-akpm/include/asm-sh64/ide.h 2005-03-07 20:41:27.000000000 -0800 @@ -21,7 +21,12 @@ #define MAX_HWIFS CONFIG_IDE_MAX_HWIFS #endif +/* Without this, the initialisation of PCI IDE cards end up calling + * ide_init_hwif_ports, which won't work. */ +#ifdef CONFIG_BLK_DEV_IDEPCI +#define IDE_ARCH_OBSOLETE_INIT 1 #define ide_default_io_ctl(base) (0) +#endif #include diff -puN include/asm-sh64/irq.h~sh64-ide-updates include/asm-sh64/irq.h --- 25/include/asm-sh64/irq.h~sh64-ide-updates 2005-03-07 20:41:27.000000000 -0800 +++ 25-akpm/include/asm-sh64/irq.h 2005-03-07 20:41:27.000000000 -0800 @@ -83,11 +83,12 @@ #define IRQ_P2INTC (START_EXT_IRQS + (3*8) + 2) #define IRQ_P2INTD (START_EXT_IRQS + (3*8) + 3) -#define START_EXT_IRQS 64 - #define I8042_KBD_IRQ (START_EXT_IRQS + 2) #define I8042_AUX_IRQ (START_EXT_IRQS + 6) +#define IRQ_CFCARD (START_EXT_IRQS + 7) +#define IRQ_PCMCIA (0) + #else #define NR_EXT_IRQS 0 #endif _