ide: merge ide_arm and ide_generic host drivers

There is no need for a separate ide_arm host driver nowadays
so merge it into ide_generic one.

While at it:
- return -EBUSY from ide_generic_init() if I/O resources are busy
- scale down ide_generic_check_pci_legacy_iobases() for CONFIG_PCI=n

Cc: Russell King <rmk@arm.linux.org.uk>
Cc: Alexander Schulz <alex@shark-linux.de>
Signed-off-by: default avatarBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
parent 52913ab2
...@@ -222,7 +222,8 @@ comment "IDE chipset support/bugfixes" ...@@ -222,7 +222,8 @@ comment "IDE chipset support/bugfixes"
config IDE_GENERIC config IDE_GENERIC
tristate "generic/default IDE chipset support" tristate "generic/default IDE chipset support"
depends on ALPHA || X86 || IA64 || M32R || MIPS depends on ALPHA || X86 || IA64 || M32R || MIPS || ARCH_RPC || ARCH_SHARK
default ARM && (ARCH_RPC || ARCH_SHARK)
help help
This is the generic IDE driver. This driver attaches to the This is the generic IDE driver. This driver attaches to the
fixed legacy ports (e.g. on PCs 0x1f0/0x170, 0x1e8/0x168 and fixed legacy ports (e.g. on PCs 0x1f0/0x170, 0x1e8/0x168 and
...@@ -731,11 +732,6 @@ config BLK_DEV_IDE_AT91 ...@@ -731,11 +732,6 @@ config BLK_DEV_IDE_AT91
depends on ARM && ARCH_AT91 && !ARCH_AT91RM9200 && !ARCH_AT91X40 depends on ARM && ARCH_AT91 && !ARCH_AT91RM9200 && !ARCH_AT91X40
select IDE_TIMINGS select IDE_TIMINGS
config IDE_ARM
tristate "ARM IDE support"
depends on ARM && (ARCH_RPC || ARCH_SHARK)
default y
config BLK_DEV_IDE_ICSIDE config BLK_DEV_IDE_ICSIDE
tristate "ICS IDE interface support" tristate "ICS IDE interface support"
depends on ARM && ARCH_ACORN depends on ARM && ARCH_ACORN
......
...@@ -21,8 +21,6 @@ ide-core-$(CONFIG_IDE_LEGACY) += ide-legacy.o ...@@ -21,8 +21,6 @@ ide-core-$(CONFIG_IDE_LEGACY) += ide-legacy.o
obj-$(CONFIG_IDE) += ide-core.o obj-$(CONFIG_IDE) += ide-core.o
obj-$(CONFIG_IDE_ARM) += ide_arm.o
obj-$(CONFIG_BLK_DEV_ALI14XX) += ali14xx.o obj-$(CONFIG_BLK_DEV_ALI14XX) += ali14xx.o
obj-$(CONFIG_BLK_DEV_UMC8672) += umc8672.o obj-$(CONFIG_BLK_DEV_UMC8672) += umc8672.o
obj-$(CONFIG_BLK_DEV_DTC2278) += dtc2278.o obj-$(CONFIG_BLK_DEV_DTC2278) += dtc2278.o
......
...@@ -13,7 +13,10 @@ ...@@ -13,7 +13,10 @@
#include <linux/ide.h> #include <linux/ide.h>
#include <linux/pci_ids.h> #include <linux/pci_ids.h>
/* FIXME: convert m32r to use ide_platform host driver */ /* FIXME: convert arm and m32r to use ide_platform host driver */
#ifdef CONFIG_ARM
#include <asm/irq.h>
#endif
#ifdef CONFIG_M32R #ifdef CONFIG_M32R
#include <asm/m32r.h> #include <asm/m32r.h>
#endif #endif
...@@ -28,8 +31,11 @@ static const struct ide_port_info ide_generic_port_info = { ...@@ -28,8 +31,11 @@ static const struct ide_port_info ide_generic_port_info = {
.host_flags = IDE_HFLAG_NO_DMA, .host_flags = IDE_HFLAG_NO_DMA,
}; };
#if defined(CONFIG_PLAT_M32700UT) || defined(CONFIG_PLAT_MAPPI2) \ #ifdef CONFIG_ARM
|| defined(CONFIG_PLAT_OPSPUT) static const u16 legacy_bases[] = { 0x1f0 };
static const int legacy_irqs[] = { IRQ_HARDDISK };
#elif defined(CONFIG_PLAT_M32700UT) || defined(CONFIG_PLAT_MAPPI2) || \
defined(CONFIG_PLAT_OPSPUT)
static const u16 legacy_bases[] = { 0x1f0 }; static const u16 legacy_bases[] = { 0x1f0 };
static const int legacy_irqs[] = { PLD_IRQ_CFIREQ }; static const int legacy_irqs[] = { PLD_IRQ_CFIREQ };
#elif defined(CONFIG_PLAT_MAPPI3) #elif defined(CONFIG_PLAT_MAPPI3)
...@@ -45,11 +51,11 @@ static const int legacy_irqs[] = { 14, 15, 11, 10, 8, 12 }; ...@@ -45,11 +51,11 @@ static const int legacy_irqs[] = { 14, 15, 11, 10, 8, 12 };
static void ide_generic_check_pci_legacy_iobases(int *primary, int *secondary) static void ide_generic_check_pci_legacy_iobases(int *primary, int *secondary)
{ {
#ifdef CONFIG_PCI
struct pci_dev *p = NULL; struct pci_dev *p = NULL;
u16 val; u16 val;
for_each_pci_dev(p) { for_each_pci_dev(p) {
if (pci_resource_start(p, 0) == 0x1f0) if (pci_resource_start(p, 0) == 0x1f0)
*primary = 1; *primary = 1;
if (pci_resource_start(p, 2) == 0x170) if (pci_resource_start(p, 2) == 0x170)
...@@ -64,7 +70,6 @@ static void ide_generic_check_pci_legacy_iobases(int *primary, int *secondary) ...@@ -64,7 +70,6 @@ static void ide_generic_check_pci_legacy_iobases(int *primary, int *secondary)
/* Intel MPIIX - PIO ATA on non PCI side of bridge */ /* Intel MPIIX - PIO ATA on non PCI side of bridge */
if (p->vendor == PCI_VENDOR_ID_INTEL && if (p->vendor == PCI_VENDOR_ID_INTEL &&
p->device == PCI_DEVICE_ID_INTEL_82371MX) { p->device == PCI_DEVICE_ID_INTEL_82371MX) {
pci_read_config_word(p, 0x6C, &val); pci_read_config_word(p, 0x6C, &val);
if (val & 0x8000) { if (val & 0x8000) {
/* ATA port enabled */ /* ATA port enabled */
...@@ -75,6 +80,7 @@ static void ide_generic_check_pci_legacy_iobases(int *primary, int *secondary) ...@@ -75,6 +80,7 @@ static void ide_generic_check_pci_legacy_iobases(int *primary, int *secondary)
} }
} }
} }
#endif
} }
static int __init ide_generic_init(void) static int __init ide_generic_init(void)
...@@ -106,6 +112,7 @@ static int __init ide_generic_init(void) ...@@ -106,6 +112,7 @@ static int __init ide_generic_init(void)
printk(KERN_ERR "%s: I/O resource 0x%lX-0x%lX " printk(KERN_ERR "%s: I/O resource 0x%lX-0x%lX "
"not free.\n", "not free.\n",
DRV_NAME, io_addr, io_addr + 7); DRV_NAME, io_addr, io_addr + 7);
rc = -EBUSY;
continue; continue;
} }
...@@ -114,6 +121,7 @@ static int __init ide_generic_init(void) ...@@ -114,6 +121,7 @@ static int __init ide_generic_init(void)
"not free.\n", "not free.\n",
DRV_NAME, io_addr + 0x206); DRV_NAME, io_addr + 0x206);
release_region(io_addr, 8); release_region(io_addr, 8);
rc = -EBUSY;
continue; continue;
} }
......
/*
* ARM default IDE host driver
*
* Copyright (C) 2004 Bartlomiej Zolnierkiewicz
* Based on code by: Russell King, Ian Molton and Alexander Schulz.
*
* May be copied or modified under the terms of the GNU General Public License.
*/
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/ide.h>
#include <asm/irq.h>
#define DRV_NAME "ide_arm"
#define IDE_ARM_IO 0x1f0
#define IDE_ARM_IRQ IRQ_HARDDISK
static const struct ide_port_info ide_arm_port_info = {
.host_flags = IDE_HFLAG_NO_DMA,
};
static int __init ide_arm_init(void)
{
unsigned long base = IDE_ARM_IO, ctl = IDE_ARM_IO + 0x206;
hw_regs_t hw, *hws[] = { &hw, NULL, NULL, NULL };
if (!request_region(base, 8, DRV_NAME)) {
printk(KERN_ERR "%s: I/O resource 0x%lX-0x%lX not free.\n",
DRV_NAME, base, base + 7);
return -EBUSY;
}
if (!request_region(ctl, 1, DRV_NAME)) {
printk(KERN_ERR "%s: I/O resource 0x%lX not free.\n",
DRV_NAME, ctl);
release_region(base, 8);
return -EBUSY;
}
memset(&hw, 0, sizeof(hw));
ide_std_init_ports(&hw, base, ctl);
hw.irq = IDE_ARM_IRQ;
hw.chipset = ide_generic;
return ide_host_add(&ide_arm_port_info, hws, NULL);
}
module_init(ide_arm_init);
MODULE_LICENSE("GPL");
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment