ide: drop 'initializing' argument from ide_register_hw()

* Rename init_hwif_data() to ide_init_port_data() and export it.

* For all users of ide_register_hw() with 'initializing' argument set
  hwif->present and hwif->hold are always zero so convert these host
  drivers to use ide_find_port()+ide_init_port_data()+ide_init_port_hw()
  instead (also no need for init_hwif_default() call since the setup
  done by it gets over-ridden by ide_init_port_hw() call).

* Drop 'initializing' argument from ide_register_hw().

Cc: Geert Uytterhoeven <geert@linux-m68k.org>
Cc: Roman Zippel <zippel@linux-m68k.org>
Acked-by: default avatarSergei Shtylyov <sshtylyov@ru.mvista.com>
Signed-off-by: default avatarBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
parent 57c802e8
...@@ -45,7 +45,7 @@ bastide_register(unsigned int base, unsigned int aux, int irq, ...@@ -45,7 +45,7 @@ bastide_register(unsigned int base, unsigned int aux, int irq,
hw.io_ports[IDE_CONTROL_OFFSET] = aux + (6 * 0x20); hw.io_ports[IDE_CONTROL_OFFSET] = aux + (6 * 0x20);
hw.irq = irq; hw.irq = irq;
ide_register_hw(&hw, NULL, 0, hwif); ide_register_hw(&hw, NULL, hwif);
return 0; return 0;
} }
......
...@@ -26,10 +26,16 @@ ...@@ -26,10 +26,16 @@
void __init ide_arm_init(void) void __init ide_arm_init(void)
{ {
ide_hwif_t *hwif;
hw_regs_t hw; hw_regs_t hw;
memset(&hw, 0, sizeof(hw)); memset(&hw, 0, sizeof(hw));
ide_std_init_ports(&hw, IDE_ARM_IO, IDE_ARM_IO + 0x206); ide_std_init_ports(&hw, IDE_ARM_IO, IDE_ARM_IO + 0x206);
hw.irq = IDE_ARM_IRQ; hw.irq = IDE_ARM_IRQ;
ide_register_hw(&hw, NULL, 1, NULL);
hwif = ide_find_port(hw.io_ports[IDE_DATA_OFFSET]);
if (hwif) {
ide_init_port_data(hwif, hwif->index);
ide_init_port_hw(hwif, &hw);
}
} }
...@@ -777,9 +777,11 @@ init_e100_ide (void) ...@@ -777,9 +777,11 @@ init_e100_ide (void)
ide_offsets, ide_offsets,
0, 0, cris_ide_ack_intr, 0, 0, cris_ide_ack_intr,
ide_default_irq(0)); ide_default_irq(0));
ide_register_hw(&hw, NULL, 1, &hwif); hwif = ide_find_port(hw.io_ports[IDE_DATA_OFFSET]);
if (hwif == NULL) if (hwif == NULL)
continue; continue;
ide_init_port_data(hwif, hwif->index);
ide_init_port_hw(hwif, &hw);
hwif->mmio = 1; hwif->mmio = 1;
hwif->chipset = ide_etrax100; hwif->chipset = ide_etrax100;
hwif->set_pio_mode = &cris_set_pio_mode; hwif->set_pio_mode = &cris_set_pio_mode;
......
...@@ -88,7 +88,7 @@ void __init h8300_ide_init(void) ...@@ -88,7 +88,7 @@ void __init h8300_ide_init(void)
{ {
hw_regs_t hw; hw_regs_t hw;
ide_hwif_t *hwif; ide_hwif_t *hwif;
int idx; int index;
if (!request_region(CONFIG_H8300_IDE_BASE, H8300_IDE_GAP*8, "ide-h8300")) if (!request_region(CONFIG_H8300_IDE_BASE, H8300_IDE_GAP*8, "ide-h8300"))
goto out_busy; goto out_busy;
...@@ -100,14 +100,17 @@ void __init h8300_ide_init(void) ...@@ -100,14 +100,17 @@ void __init h8300_ide_init(void)
hw_setup(&hw); hw_setup(&hw);
/* register if */ /* register if */
idx = ide_register_hw(&hw, NULL, 1, &hwif); hwif = ide_find_port(hw.io_ports[IDE_DATA_OFFSET]);
if (idx == -1) { if (hwif == NULL) {
printk(KERN_ERR "ide-h8300: IDE I/F register failed\n"); printk(KERN_ERR "ide-h8300: IDE I/F register failed\n");
return; return;
} }
index = hwif->index;
ide_init_port_data(hwif, index);
ide_init_port_hw(hwif, &hw);
hwif_setup(hwif); hwif_setup(hwif);
printk(KERN_INFO "ide%d: H8/300 generic IDE interface\n", idx); printk(KERN_INFO "ide%d: H8/300 generic IDE interface\n", index);
return; return;
out_busy: out_busy:
......
...@@ -31,7 +31,6 @@ static int idepnp_probe(struct pnp_dev * dev, const struct pnp_device_id *dev_id ...@@ -31,7 +31,6 @@ static int idepnp_probe(struct pnp_dev * dev, const struct pnp_device_id *dev_id
{ {
hw_regs_t hw; hw_regs_t hw;
ide_hwif_t *hwif; ide_hwif_t *hwif;
int index;
if (!(pnp_port_valid(dev, 0) && pnp_port_valid(dev, 1) && pnp_irq_valid(dev, 0))) if (!(pnp_port_valid(dev, 0) && pnp_port_valid(dev, 1) && pnp_irq_valid(dev, 0)))
return -1; return -1;
...@@ -41,9 +40,13 @@ static int idepnp_probe(struct pnp_dev * dev, const struct pnp_device_id *dev_id ...@@ -41,9 +40,13 @@ static int idepnp_probe(struct pnp_dev * dev, const struct pnp_device_id *dev_id
pnp_port_start(dev, 1)); pnp_port_start(dev, 1));
hw.irq = pnp_irq(dev, 0); hw.irq = pnp_irq(dev, 0);
index = ide_register_hw(&hw, NULL, 1, &hwif); hwif = ide_find_port(hw.io_ports[IDE_DATA_OFFSET]);
if (hwif) {
u8 index = hwif->index;
ide_init_port_data(hwif, index);
ide_init_port_hw(hwif, &hw);
if (index != -1) {
printk(KERN_INFO "ide%d: generic PnP IDE interface\n", index); printk(KERN_INFO "ide%d: generic PnP IDE interface\n", index);
pnp_set_drvdata(dev,hwif); pnp_set_drvdata(dev,hwif);
return 0; return 0;
......
...@@ -116,7 +116,7 @@ EXPORT_SYMBOL(ide_hwifs); ...@@ -116,7 +116,7 @@ EXPORT_SYMBOL(ide_hwifs);
/* /*
* Do not even *think* about calling this! * Do not even *think* about calling this!
*/ */
static void init_hwif_data(ide_hwif_t *hwif, unsigned int index) void ide_init_port_data(ide_hwif_t *hwif, unsigned int index)
{ {
unsigned int unit; unsigned int unit;
...@@ -159,6 +159,7 @@ static void init_hwif_data(ide_hwif_t *hwif, unsigned int index) ...@@ -159,6 +159,7 @@ static void init_hwif_data(ide_hwif_t *hwif, unsigned int index)
init_completion(&drive->gendev_rel_comp); init_completion(&drive->gendev_rel_comp);
} }
} }
EXPORT_SYMBOL_GPL(ide_init_port_data);
static void init_hwif_default(ide_hwif_t *hwif, unsigned int index) static void init_hwif_default(ide_hwif_t *hwif, unsigned int index)
{ {
...@@ -210,7 +211,7 @@ static void __init init_ide_data (void) ...@@ -210,7 +211,7 @@ static void __init init_ide_data (void)
/* Initialise all interface structures */ /* Initialise all interface structures */
for (index = 0; index < MAX_HWIFS; ++index) { for (index = 0; index < MAX_HWIFS; ++index) {
hwif = &ide_hwifs[index]; hwif = &ide_hwifs[index];
init_hwif_data(hwif, index); ide_init_port_data(hwif, index);
init_hwif_default(hwif, index); init_hwif_default(hwif, index);
#if !defined(CONFIG_PPC32) || !defined(CONFIG_PCI) #if !defined(CONFIG_PPC32) || !defined(CONFIG_PCI)
hwif->irq = hwif->irq =
...@@ -609,7 +610,7 @@ void ide_unregister(unsigned int index) ...@@ -609,7 +610,7 @@ void ide_unregister(unsigned int index)
tmp_hwif = *hwif; tmp_hwif = *hwif;
/* restore hwif data to pristine status */ /* restore hwif data to pristine status */
init_hwif_data(hwif, index); ide_init_port_data(hwif, index);
init_hwif_default(hwif, index); init_hwif_default(hwif, index);
ide_hwif_restore(hwif, &tmp_hwif); ide_hwif_restore(hwif, &tmp_hwif);
...@@ -690,29 +691,19 @@ EXPORT_SYMBOL_GPL(ide_init_port_hw); ...@@ -690,29 +691,19 @@ EXPORT_SYMBOL_GPL(ide_init_port_hw);
* ide_register_hw - register IDE interface * ide_register_hw - register IDE interface
* @hw: hardware registers * @hw: hardware registers
* @quirkproc: quirkproc function * @quirkproc: quirkproc function
* @initializing: set while initializing built-in drivers
* @hwifp: pointer to returned hwif * @hwifp: pointer to returned hwif
* *
* Register an IDE interface, specifying exactly the registers etc. * Register an IDE interface, specifying exactly the registers etc.
* Set init=1 iff calling before probes have taken place.
* *
* Returns -1 on error. * Returns -1 on error.
*/ */
int ide_register_hw(hw_regs_t *hw, void (*quirkproc)(ide_drive_t *), int ide_register_hw(hw_regs_t *hw, void (*quirkproc)(ide_drive_t *),
int initializing, ide_hwif_t **hwifp) ide_hwif_t **hwifp)
{ {
int index, retry = 1; int index, retry = 1;
ide_hwif_t *hwif; ide_hwif_t *hwif;
u8 idx[4] = { 0xff, 0xff, 0xff, 0xff };
if (initializing) {
hwif = ide_find_port(hw->io_ports[IDE_DATA_OFFSET]);
if (hwif) {
index = hwif->index;
goto found;
}
return -1;
}
do { do {
for (index = 0; index < MAX_HWIFS; ++index) { for (index = 0; index < MAX_HWIFS; ++index) {
...@@ -735,7 +726,7 @@ int ide_register_hw(hw_regs_t *hw, void (*quirkproc)(ide_drive_t *), ...@@ -735,7 +726,7 @@ int ide_register_hw(hw_regs_t *hw, void (*quirkproc)(ide_drive_t *),
if (hwif->present) if (hwif->present)
ide_unregister(index); ide_unregister(index);
else if (!hwif->hold) { else if (!hwif->hold) {
init_hwif_data(hwif, index); ide_init_port_data(hwif, index);
init_hwif_default(hwif, index); init_hwif_default(hwif, index);
} }
if (hwif->present) if (hwif->present)
...@@ -744,16 +735,14 @@ int ide_register_hw(hw_regs_t *hw, void (*quirkproc)(ide_drive_t *), ...@@ -744,16 +735,14 @@ int ide_register_hw(hw_regs_t *hw, void (*quirkproc)(ide_drive_t *),
ide_init_port_hw(hwif, hw); ide_init_port_hw(hwif, hw);
hwif->quirkproc = quirkproc; hwif->quirkproc = quirkproc;
if (initializing == 0) { idx[0] = index;
u8 idx[4] = { index, 0xff, 0xff, 0xff };
ide_device_add(idx); ide_device_add(idx);
}
if (hwifp) if (hwifp)
*hwifp = hwif; *hwifp = hwif;
return (initializing || hwif->present) ? index : -1; return hwif->present ? index : -1;
} }
EXPORT_SYMBOL(ide_register_hw); EXPORT_SYMBOL(ide_register_hw);
...@@ -1076,7 +1065,7 @@ int generic_ide_ioctl(ide_drive_t *drive, struct file *file, struct block_device ...@@ -1076,7 +1065,7 @@ int generic_ide_ioctl(ide_drive_t *drive, struct file *file, struct block_device
ide_init_hwif_ports(&hw, (unsigned long) args[0], ide_init_hwif_ports(&hw, (unsigned long) args[0],
(unsigned long) args[1], NULL); (unsigned long) args[1], NULL);
hw.irq = args[2]; hw.irq = args[2];
if (ide_register_hw(&hw, NULL, 0, NULL) == -1) if (ide_register_hw(&hw, NULL, NULL) == -1)
return -EIO; return -EIO;
return 0; return 0;
} }
......
...@@ -147,7 +147,7 @@ void __init buddha_init(void) ...@@ -147,7 +147,7 @@ void __init buddha_init(void)
{ {
hw_regs_t hw; hw_regs_t hw;
ide_hwif_t *hwif; ide_hwif_t *hwif;
int i, index; int i;
struct zorro_dev *z = NULL; struct zorro_dev *z = NULL;
u_long buddha_board = 0; u_long buddha_board = 0;
...@@ -213,8 +213,13 @@ void __init buddha_init(void) ...@@ -213,8 +213,13 @@ void __init buddha_init(void)
IRQ_AMIGA_PORTS); IRQ_AMIGA_PORTS);
} }
index = ide_register_hw(&hw, NULL, 1, &hwif); hwif = ide_find_port(hw.io_ports[IDE_DATA_OFFSET]);
if (index != -1) { if (hwif) {
u8 index = hwif->index;
ide_init_port_data(hwif, index);
ide_init_port_hw(hwif, &hw);
hwif->mmio = 1; hwif->mmio = 1;
printk("ide%d: ", index); printk("ide%d: ", index);
switch(type) { switch(type) {
......
...@@ -66,15 +66,19 @@ void __init falconide_init(void) ...@@ -66,15 +66,19 @@ void __init falconide_init(void)
{ {
if (MACH_IS_ATARI && ATARIHW_PRESENT(IDE)) { if (MACH_IS_ATARI && ATARIHW_PRESENT(IDE)) {
hw_regs_t hw; hw_regs_t hw;
int index;
ide_setup_ports(&hw, ATA_HD_BASE, falconide_offsets, ide_setup_ports(&hw, ATA_HD_BASE, falconide_offsets,
0, 0, NULL, 0, 0, NULL,
// falconide_iops, // falconide_iops,
IRQ_MFP_IDE); IRQ_MFP_IDE);
index = ide_register_hw(&hw, NULL, 1, NULL);
if (index != -1) hwif = ide_find_port(hw.io_ports[IDE_DATA_OFFSET]);
if (hwif) {
u8 index = hwif->index;
ide_init_port_data(hwif, index);
ide_init_port_hw(hwif, &hw);
printk("ide%d: Falcon IDE interface\n", index); printk("ide%d: Falcon IDE interface\n", index);
} }
} }
...@@ -133,7 +133,6 @@ void __init gayle_init(void) ...@@ -133,7 +133,6 @@ void __init gayle_init(void)
ide_ack_intr_t *ack_intr; ide_ack_intr_t *ack_intr;
hw_regs_t hw; hw_regs_t hw;
ide_hwif_t *hwif; ide_hwif_t *hwif;
int index;
unsigned long phys_base, res_start, res_n; unsigned long phys_base, res_start, res_n;
if (a4000) { if (a4000) {
...@@ -165,8 +164,13 @@ void __init gayle_init(void) ...@@ -165,8 +164,13 @@ void __init gayle_init(void)
// &gayle_iops, // &gayle_iops,
IRQ_AMIGA_PORTS); IRQ_AMIGA_PORTS);
index = ide_register_hw(&hw, NULL, 1, &hwif); hwif = ide_find_port(base);
if (index != -1) { if (hwif) {
u8 index = hwif->index;
ide_init_port_data(hwif, index);
ide_init_port_hw(hwif, &hw);
hwif->mmio = 1; hwif->mmio = 1;
switch (i) { switch (i) {
case 0: case 0:
......
...@@ -153,7 +153,7 @@ static int idecs_register(unsigned long io, unsigned long ctl, unsigned long irq ...@@ -153,7 +153,7 @@ static int idecs_register(unsigned long io, unsigned long ctl, unsigned long irq
hw.irq = irq; hw.irq = irq;
hw.chipset = ide_pci; hw.chipset = ide_pci;
hw.dev = &handle->dev; hw.dev = &handle->dev;
return ide_register_hw(&hw, &ide_undecoded_slave, 0, NULL); return ide_register_hw(&hw, &ide_undecoded_slave, NULL);
} }
/*====================================================================== /*======================================================================
......
...@@ -85,7 +85,6 @@ void __init macide_init(void) ...@@ -85,7 +85,6 @@ void __init macide_init(void)
{ {
hw_regs_t hw; hw_regs_t hw;
ide_hwif_t *hwif; ide_hwif_t *hwif;
int index = -1;
switch (macintosh_config->ide_type) { switch (macintosh_config->ide_type) {
case MAC_IDE_QUADRA: case MAC_IDE_QUADRA:
...@@ -93,40 +92,40 @@ void __init macide_init(void) ...@@ -93,40 +92,40 @@ void __init macide_init(void)
0, 0, macide_ack_intr, 0, 0, macide_ack_intr,
// quadra_ide_iops, // quadra_ide_iops,
IRQ_NUBUS_F); IRQ_NUBUS_F);
index = ide_register_hw(&hw, NULL, 1, &hwif);
break; break;
case MAC_IDE_PB: case MAC_IDE_PB:
ide_setup_ports(&hw, IDE_BASE, macide_offsets, ide_setup_ports(&hw, IDE_BASE, macide_offsets,
0, 0, macide_ack_intr, 0, 0, macide_ack_intr,
// macide_pb_iops, // macide_pb_iops,
IRQ_NUBUS_C); IRQ_NUBUS_C);
index = ide_register_hw(&hw, NULL, 1, &hwif);
break; break;
case MAC_IDE_BABOON: case MAC_IDE_BABOON:
ide_setup_ports(&hw, BABOON_BASE, macide_offsets, ide_setup_ports(&hw, BABOON_BASE, macide_offsets,
0, 0, NULL, 0, 0, NULL,
// macide_baboon_iops, // macide_baboon_iops,
IRQ_BABOON_1); IRQ_BABOON_1);
index = ide_register_hw(&hw, NULL, 1, &hwif); break;
if (index == -1) break; default:
if (macintosh_config->ident == MAC_MODEL_PB190) { return;
}
hwif = ide_find_port(hw.io_ports[IDE_DATA_OFFSET]);
if (hwif) {
u8 index = hwif->index;
ide_init_port_data(hwif, index);
ide_init_port_hw(hwif, &hw);
if (macintosh_config->ide_type == MAC_IDE_BABOON &&
macintosh_config->ident == MAC_MODEL_PB190) {
/* Fix breakage in ide-disk.c: drive capacity */ /* Fix breakage in ide-disk.c: drive capacity */
/* is not initialized for drives without a */ /* is not initialized for drives without a */
/* hardware ID, and we can't get that without */ /* hardware ID, and we can't get that without */
/* probing the drive which freezes a 190. */ /* probing the drive which freezes a 190. */
ide_drive_t *drive = &hwif->drives[0];
ide_drive_t *drive = &ide_hwifs[index].drives[0];
drive->capacity64 = drive->cyl*drive->head*drive->sect; drive->capacity64 = drive->cyl*drive->head*drive->sect;
}
break;
default:
return;
} }
if (index != -1) {
hwif->mmio = 1; hwif->mmio = 1;
if (macintosh_config->ide_type == MAC_IDE_QUADRA) if (macintosh_config->ide_type == MAC_IDE_QUADRA)
printk(KERN_INFO "ide%d: Macintosh Quadra IDE interface\n", index); printk(KERN_INFO "ide%d: Macintosh Quadra IDE interface\n", index);
......
...@@ -115,7 +115,6 @@ void __init q40ide_init(void) ...@@ -115,7 +115,6 @@ void __init q40ide_init(void)
{ {
int i; int i;
ide_hwif_t *hwif; ide_hwif_t *hwif;
int index;
const char *name; const char *name;
if (!MACH_IS_Q40) if (!MACH_IS_Q40)
...@@ -141,10 +140,13 @@ void __init q40ide_init(void) ...@@ -141,10 +140,13 @@ void __init q40ide_init(void)
0, NULL, 0, NULL,
// m68kide_iops, // m68kide_iops,
q40ide_default_irq(pcide_bases[i])); q40ide_default_irq(pcide_bases[i]));
index = ide_register_hw(&hw, NULL, 1, &hwif);
// **FIXME** hwif = ide_find_port(hw.io_ports[IDE_DATA_OFFSET]);
if (index != -1) if (hwif) {
ide_init_port_data(hwif, hwif->index);
ide_init_port_hw(hwif, &hw);
hwif->mmio = 1; hwif->mmio = 1;
} }
}
} }
...@@ -80,7 +80,7 @@ delkin_cb_probe (struct pci_dev *dev, const struct pci_device_id *id) ...@@ -80,7 +80,7 @@ delkin_cb_probe (struct pci_dev *dev, const struct pci_device_id *id)
hw.irq = dev->irq; hw.irq = dev->irq;
hw.chipset = ide_pci; /* this enables IRQ sharing */ hw.chipset = ide_pci; /* this enables IRQ sharing */
rc = ide_register_hw(&hw, &ide_undecoded_slave, 0, &hwif); rc = ide_register_hw(&hw, &ide_undecoded_slave, &hwif);
if (rc < 0) { if (rc < 0) {
printk(KERN_ERR "delkin_cb: ide_register_hw failed (%d)\n", rc); printk(KERN_ERR "delkin_cb: ide_register_hw failed (%d)\n", rc);
pci_disable_device(dev); pci_disable_device(dev);
......
...@@ -563,7 +563,8 @@ static void media_bay_step(int i) ...@@ -563,7 +563,8 @@ static void media_bay_step(int i)
ide_init_hwif_ports(&hw, (unsigned long) bay->cd_base, (unsigned long) 0, NULL); ide_init_hwif_ports(&hw, (unsigned long) bay->cd_base, (unsigned long) 0, NULL);
hw.irq = bay->cd_irq; hw.irq = bay->cd_irq;
hw.chipset = ide_pmac; hw.chipset = ide_pmac;
bay->cd_index = ide_register_hw(&hw, NULL, 0, NULL); bay->cd_index =
ide_register_hw(&hw, NULL, NULL);
pmu_resume(); pmu_resume();
} }
if (bay->cd_index == -1) { if (bay->cd_index == -1) {
......
...@@ -198,10 +198,11 @@ typedef struct hw_regs_s { ...@@ -198,10 +198,11 @@ typedef struct hw_regs_s {
} hw_regs_t; } hw_regs_t;
struct hwif_s * ide_find_port(unsigned long); struct hwif_s * ide_find_port(unsigned long);
void ide_init_port_data(struct hwif_s *, unsigned int);
void ide_init_port_hw(struct hwif_s *, hw_regs_t *); void ide_init_port_hw(struct hwif_s *, hw_regs_t *);
struct ide_drive_s; struct ide_drive_s;
int ide_register_hw(hw_regs_t *, void (*)(struct ide_drive_s *), int, int ide_register_hw(hw_regs_t *, void (*)(struct ide_drive_s *),
struct hwif_s **); struct hwif_s **);
void ide_setup_ports( hw_regs_t *hw, void ide_setup_ports( hw_regs_t *hw,
......
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