Skip to content

Commit

Permalink
ide: turn selectproc() method into dev_select() method (take 5)
Browse files Browse the repository at this point in the history
Turn selectproc() method into dev_select() method by teaching it to write to the
device register and moving it from 'struct ide_port_ops' to 'struct ide_tp_ops'.

Signed-off-by: Sergei Shtylyov <sshtylyov@ru.mvista.com>
Cc: benh@kernel.crashing.org
Cc: petkovbb@gmail.com
[bart: add ->dev_select to at91_ide.c and tx4939.c (__BIG_ENDIAN case)]
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
  • Loading branch information
Sergei Shtylyov authored and Bartlomiej Zolnierkiewicz committed Mar 31, 2009
1 parent 0f861e8 commit abb596b
Show file tree
Hide file tree
Showing 17 changed files with 139 additions and 48 deletions.
1 change: 1 addition & 0 deletions drivers/ide/at91_ide.c
Original file line number Diff line number Diff line change
Expand Up @@ -283,6 +283,7 @@ static const struct ide_tp_ops at91_ide_tp_ops = {
.read_altstatus = ide_read_altstatus,
.write_devctl = ide_write_devctl,

.dev_select = ide_dev_select,
.tf_load = at91_ide_tf_load,
.tf_read = at91_ide_tf_read,

Expand Down
1 change: 1 addition & 0 deletions drivers/ide/au1xxx-ide.c
Original file line number Diff line number Diff line change
Expand Up @@ -469,6 +469,7 @@ static const struct ide_tp_ops au1xxx_tp_ops = {
.read_altstatus = ide_read_altstatus,
.write_devctl = ide_write_devctl,

.dev_select = ide_dev_select,
.tf_load = ide_tf_load,
.tf_read = ide_tf_read,

Expand Down
1 change: 1 addition & 0 deletions drivers/ide/falconide.c
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,7 @@ static const struct ide_tp_ops falconide_tp_ops = {
.read_altstatus = ide_read_altstatus,
.write_devctl = ide_write_devctl,

.dev_select = ide_dev_select,
.tf_load = ide_tf_load,
.tf_read = ide_tf_read,

Expand Down
20 changes: 18 additions & 2 deletions drivers/ide/ht6560b.c
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@
/*
* This routine is invoked from ide.c to prepare for access to a given drive.
*/
static void ht6560b_selectproc (ide_drive_t *drive)
static void ht6560b_dev_select(ide_drive_t *drive)
{
ide_hwif_t *hwif = drive->hwif;
unsigned long flags;
Expand Down Expand Up @@ -143,6 +143,8 @@ static void ht6560b_selectproc (ide_drive_t *drive)
#endif
}
local_irq_restore(flags);

outb(drive->select | ATA_DEVICE_OBS, hwif->io_ports.device_addr);
}

/*
Expand Down Expand Up @@ -305,15 +307,29 @@ static int probe_ht6560b;
module_param_named(probe, probe_ht6560b, bool, 0);
MODULE_PARM_DESC(probe, "probe for HT6560B chipset");

static const struct ide_tp_ops ht6560b_tp_ops = {
.exec_command = ide_exec_command,
.read_status = ide_read_status,
.read_altstatus = ide_read_altstatus,
.write_devctl = ide_write_devctl,

.dev_select = ht6560b_dev_select,
.tf_load = ide_tf_load,
.tf_read = ide_tf_read,

.input_data = ide_input_data,
.output_data = ide_output_data,
};

static const struct ide_port_ops ht6560b_port_ops = {
.init_dev = ht6560b_init_dev,
.set_pio_mode = ht6560b_set_pio_mode,
.selectproc = ht6560b_selectproc,
};

static const struct ide_port_info ht6560b_port_info __initdata = {
.name = DRV_NAME,
.chipset = ide_ht6560b,
.tp_ops = &ht6560b_tp_ops,
.port_ops = &ht6560b_port_ops,
.host_flags = IDE_HFLAG_SERIALIZE | /* is this needed? */
IDE_HFLAG_NO_DMA |
Expand Down
1 change: 1 addition & 0 deletions drivers/ide/ide-h8300.c
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,7 @@ static const struct ide_tp_ops h8300_tp_ops = {
.read_altstatus = ide_read_altstatus,
.write_devctl = ide_write_devctl,

.dev_select = ide_dev_select,
.tf_load = h8300_tf_load,
.tf_read = h8300_tf_read,

Expand Down
13 changes: 13 additions & 0 deletions drivers/ide/ide-io-std.c
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,18 @@ void ide_write_devctl(ide_hwif_t *hwif, u8 ctl)
}
EXPORT_SYMBOL_GPL(ide_write_devctl);

void ide_dev_select(ide_drive_t *drive)
{
ide_hwif_t *hwif = drive->hwif;
u8 select = drive->select | ATA_DEVICE_OBS;

if (hwif->host_flags & IDE_HFLAG_MMIO)
writeb(select, (void __iomem *)hwif->io_ports.device_addr);
else
outb(select, hwif->io_ports.device_addr);
}
EXPORT_SYMBOL_GPL(ide_dev_select);

void ide_tf_load(ide_drive_t *drive, struct ide_cmd *cmd)
{
ide_hwif_t *hwif = drive->hwif;
Expand Down Expand Up @@ -280,6 +292,7 @@ const struct ide_tp_ops default_tp_ops = {
.read_altstatus = ide_read_altstatus,
.write_devctl = ide_write_devctl,

.dev_select = ide_dev_select,
.tf_load = ide_tf_load,
.tf_read = ide_tf_read,

Expand Down
12 changes: 1 addition & 11 deletions drivers/ide/ide-iops.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,17 +29,7 @@

void SELECT_DRIVE(ide_drive_t *drive)
{
ide_hwif_t *hwif = drive->hwif;
const struct ide_port_ops *port_ops = hwif->port_ops;
struct ide_cmd cmd;

if (port_ops && port_ops->selectproc)
port_ops->selectproc(drive);

memset(&cmd, 0, sizeof(cmd));
cmd.tf_flags = IDE_TFLAG_OUT_DEVICE;

drive->hwif->tp_ops->tf_load(drive, &cmd);
drive->hwif->tp_ops->dev_select(drive);
}

void SELECT_MASK(ide_drive_t *drive, int mask)
Expand Down
25 changes: 20 additions & 5 deletions drivers/ide/ns87415.c
Original file line number Diff line number Diff line change
Expand Up @@ -98,12 +98,15 @@ static void superio_tf_read(ide_drive_t *drive, struct ide_cmd *cmd)
}
}

static void ns87415_dev_select(ide_drive_t *drive);

static const struct ide_tp_ops superio_tp_ops = {
.exec_command = ide_exec_command,
.read_status = superio_read_status,
.read_altstatus = ide_read_altstatus,
.write_devctl = ide_write_devctl,

.dev_select = ns87415_dev_select,
.tf_load = ide_tf_load,
.tf_read = superio_tf_read,

Expand Down Expand Up @@ -182,10 +185,12 @@ static void ns87415_prepare_drive (ide_drive_t *drive, unsigned int use_dma)
local_irq_restore(flags);
}

static void ns87415_selectproc (ide_drive_t *drive)
static void ns87415_dev_select(ide_drive_t *drive)
{
ns87415_prepare_drive(drive,
!!(drive->dev_flags & IDE_DFLAG_USING_DMA));

outb(drive->select | ATA_DEVICE_OBS, drive->hwif->io_ports.device_addr);
}

static void ns87415_dma_start(ide_drive_t *drive)
Expand Down Expand Up @@ -229,7 +234,7 @@ static void __devinit init_hwif_ns87415 (ide_hwif_t *hwif)
* Also, leave IRQ masked during drive probing, to prevent infinite
* interrupts from a potentially floating INTA..
*
* IRQs get unmasked in selectproc when drive is first used.
* IRQs get unmasked in dev_select() when drive is first used.
*/
(void) pci_read_config_dword(dev, 0x40, &ctrl);
(void) pci_read_config_byte(dev, 0x09, &progif);
Expand Down Expand Up @@ -281,8 +286,18 @@ static void __devinit init_hwif_ns87415 (ide_hwif_t *hwif)
outb(0x60, hwif->dma_base + ATA_DMA_STATUS);
}

static const struct ide_port_ops ns87415_port_ops = {
.selectproc = ns87415_selectproc,
static const struct ide_tp_ops ns87415_tp_ops = {
.exec_command = ide_exec_command,
.read_status = ide_read_status,
.read_altstatus = ide_read_altstatus,
.write_devctl = ide_write_devctl,

.dev_select = ns87415_dev_select,
.tf_load = ide_tf_load,
.tf_read = ide_tf_read,

.input_data = ide_input_data,
.output_data = ide_output_data,
};

static const struct ide_dma_ops ns87415_dma_ops = {
Expand All @@ -299,7 +314,7 @@ static const struct ide_dma_ops ns87415_dma_ops = {
static const struct ide_port_info ns87415_chipset __devinitdata = {
.name = DRV_NAME,
.init_hwif = init_hwif_ns87415,
.port_ops = &ns87415_port_ops,
.tp_ops = &ns87415_tp_ops,
.dma_ops = &ns87415_dma_ops,
.host_flags = IDE_HFLAG_TRUST_BIOS_FOR_DMA |
IDE_HFLAG_NO_ATAPI_DMA,
Expand Down
58 changes: 39 additions & 19 deletions drivers/ide/pmac.c
Original file line number Diff line number Diff line change
Expand Up @@ -404,8 +404,6 @@ kauai_lookup_timing(struct kauai_timing* table, int cycle_time)
#define IDE_WAKEUP_DELAY (1*HZ)

static int pmac_ide_init_dma(ide_hwif_t *, const struct ide_port_info *);
static void pmac_ide_selectproc(ide_drive_t *drive);
static void pmac_ide_kauai_selectproc(ide_drive_t *drive);

#define PMAC_IDE_REG(x) \
((void __iomem *)((drive)->hwif->io_ports.data_addr + (x)))
Expand All @@ -415,8 +413,7 @@ static void pmac_ide_kauai_selectproc(ide_drive_t *drive);
* timing register when selecting that unit. This version is for
* ASICs with a single timing register
*/
static void
pmac_ide_selectproc(ide_drive_t *drive)
static void pmac_ide_apply_timings(ide_drive_t *drive)
{
ide_hwif_t *hwif = drive->hwif;
pmac_ide_hwif_t *pmif =
Expand All @@ -434,8 +431,7 @@ pmac_ide_selectproc(ide_drive_t *drive)
* timing register when selecting that unit. This version is for
* ASICs with a dual timing register (Kauai)
*/
static void
pmac_ide_kauai_selectproc(ide_drive_t *drive)
static void pmac_ide_kauai_apply_timings(ide_drive_t *drive)
{
ide_hwif_t *hwif = drive->hwif;
pmac_ide_hwif_t *pmif =
Expand Down Expand Up @@ -464,9 +460,25 @@ pmac_ide_do_update_timings(ide_drive_t *drive)
if (pmif->kind == controller_sh_ata6 ||
pmif->kind == controller_un_ata6 ||
pmif->kind == controller_k2_ata6)
pmac_ide_kauai_selectproc(drive);
pmac_ide_kauai_apply_timings(drive);
else
pmac_ide_selectproc(drive);
pmac_ide_apply_timings(drive);
}

static void pmac_dev_select(ide_drive_t *drive)
{
pmac_ide_apply_timings(drive);

writeb(drive->select | ATA_DEVICE_OBS,
(void __iomem *)drive->hwif->io_ports.device_addr);
}

static void pmac_kauai_dev_select(ide_drive_t *drive)
{
pmac_ide_kauai_apply_timings(drive);

writeb(drive->select | ATA_DEVICE_OBS,
(void __iomem *)drive->hwif->io_ports.device_addr);
}

static void pmac_exec_command(ide_hwif_t *hwif, u8 cmd)
Expand Down Expand Up @@ -947,34 +959,39 @@ static const struct ide_tp_ops pmac_tp_ops = {
.read_altstatus = ide_read_altstatus,
.write_devctl = pmac_write_devctl,

.dev_select = pmac_dev_select,
.tf_load = ide_tf_load,
.tf_read = ide_tf_read,

.input_data = ide_input_data,
.output_data = ide_output_data,
};

static const struct ide_port_ops pmac_ide_ata6_port_ops = {
.init_dev = pmac_ide_init_dev,
.set_pio_mode = pmac_ide_set_pio_mode,
.set_dma_mode = pmac_ide_set_dma_mode,
.selectproc = pmac_ide_kauai_selectproc,
.cable_detect = pmac_ide_cable_detect,
static const struct ide_tp_ops pmac_ata6_tp_ops = {
.exec_command = pmac_exec_command,
.read_status = ide_read_status,
.read_altstatus = ide_read_altstatus,
.write_devctl = pmac_write_devctl,

.dev_select = pmac_kauai_dev_select,
.tf_load = ide_tf_load,
.tf_read = ide_tf_read,

.input_data = ide_input_data,
.output_data = ide_output_data,
};

static const struct ide_port_ops pmac_ide_ata4_port_ops = {
.init_dev = pmac_ide_init_dev,
.set_pio_mode = pmac_ide_set_pio_mode,
.set_dma_mode = pmac_ide_set_dma_mode,
.selectproc = pmac_ide_selectproc,
.cable_detect = pmac_ide_cable_detect,
};

static const struct ide_port_ops pmac_ide_port_ops = {
.init_dev = pmac_ide_init_dev,
.set_pio_mode = pmac_ide_set_pio_mode,
.set_dma_mode = pmac_ide_set_dma_mode,
.selectproc = pmac_ide_selectproc,
};

static const struct ide_dma_ops pmac_dma_ops;
Expand Down Expand Up @@ -1011,15 +1028,18 @@ static int __devinit pmac_ide_setup_device(pmac_ide_hwif_t *pmif, hw_regs_t *hw)
pmif->broken_dma = pmif->broken_dma_warn = 0;
if (of_device_is_compatible(np, "shasta-ata")) {
pmif->kind = controller_sh_ata6;
d.port_ops = &pmac_ide_ata6_port_ops;
d.tp_ops = &pmac_ata6_tp_ops;
d.port_ops = &pmac_ide_ata4_port_ops;
d.udma_mask = ATA_UDMA6;
} else if (of_device_is_compatible(np, "kauai-ata")) {
pmif->kind = controller_un_ata6;
d.port_ops = &pmac_ide_ata6_port_ops;
d.tp_ops = &pmac_ata6_tp_ops;
d.port_ops = &pmac_ide_ata4_port_ops;
d.udma_mask = ATA_UDMA5;
} else if (of_device_is_compatible(np, "K2-UATA")) {
pmif->kind = controller_k2_ata6;
d.port_ops = &pmac_ide_ata6_port_ops;
d.tp_ops = &pmac_ata6_tp_ops;
d.port_ops = &pmac_ide_ata4_port_ops;
d.udma_mask = ATA_UDMA5;
} else if (of_device_is_compatible(np, "keylargo-ata")) {
if (strcmp(np->name, "ata-4") == 0) {
Expand Down
1 change: 1 addition & 0 deletions drivers/ide/q40ide.c
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@ static const struct ide_tp_ops q40ide_tp_ops = {
.read_altstatus = ide_read_altstatus,
.write_devctl = ide_write_devctl,

.dev_select = ide_dev_select,
.tf_load = ide_tf_load,
.tf_read = ide_tf_read,

Expand Down
21 changes: 18 additions & 3 deletions drivers/ide/qd65xx.c
Original file line number Diff line number Diff line change
Expand Up @@ -90,13 +90,15 @@ static int timings[4]={-1,-1,-1,-1}; /* stores current timing for each timer */
* This routine is invoked to prepare for access to a given drive.
*/

static void qd65xx_select(ide_drive_t *drive)
static void qd65xx_dev_select(ide_drive_t *drive)
{
u8 index = (( (QD_TIMREG(drive)) & 0x80 ) >> 7) |
(QD_TIMREG(drive) & 0x02);

if (timings[index] != QD_TIMING(drive))
outb(timings[index] = QD_TIMING(drive), QD_TIMREG(drive));

outb(drive->select | ATA_DEVICE_OBS, drive->hwif->io_ports.device_addr);
}

/*
Expand Down Expand Up @@ -309,20 +311,33 @@ static void __init qd6580_init_dev(ide_drive_t *drive)
drive->drive_data = (drive->dn & 1) ? t2 : t1;
}

static const struct ide_tp_ops qd65xx_tp_ops = {
.exec_command = ide_exec_command,
.read_status = ide_read_status,
.read_altstatus = ide_read_altstatus,
.write_devctl = ide_write_devctl,

.dev_select = qd65xx_dev_select,
.tf_load = ide_tf_load,
.tf_read = ide_tf_read,

.input_data = ide_input_data,
.output_data = ide_output_data,
};

static const struct ide_port_ops qd6500_port_ops = {
.init_dev = qd6500_init_dev,
.set_pio_mode = qd6500_set_pio_mode,
.selectproc = qd65xx_select,
};

static const struct ide_port_ops qd6580_port_ops = {
.init_dev = qd6580_init_dev,
.set_pio_mode = qd6580_set_pio_mode,
.selectproc = qd65xx_select,
};

static const struct ide_port_info qd65xx_port_info __initdata = {
.name = DRV_NAME,
.tp_ops = &qd65xx_tp_ops,
.chipset = ide_qd65xx,
.host_flags = IDE_HFLAG_IO_32BIT |
IDE_HFLAG_NO_DMA,
Expand Down
1 change: 1 addition & 0 deletions drivers/ide/scc_pata.c
Original file line number Diff line number Diff line change
Expand Up @@ -825,6 +825,7 @@ static const struct ide_tp_ops scc_tp_ops = {
.read_altstatus = scc_read_altstatus,
.write_devctl = scc_write_devctl,

.dev_select = ide_dev_select,
.tf_load = scc_tf_load,
.tf_read = scc_tf_read,

Expand Down
1 change: 1 addition & 0 deletions drivers/ide/sgiioc4.c
Original file line number Diff line number Diff line change
Expand Up @@ -505,6 +505,7 @@ static const struct ide_tp_ops sgiioc4_tp_ops = {
.read_altstatus = ide_read_altstatus,
.write_devctl = ide_write_devctl,

.dev_select = ide_dev_select,
.tf_load = ide_tf_load,
.tf_read = ide_tf_read,

Expand Down
Loading

0 comments on commit abb596b

Please sign in to comment.