Skip to content

Commit

Permalink
libata: implement and use ata_noop_irq_clear()
Browse files Browse the repository at this point in the history
->irq_clear() is used to clear IRQ bit of a SFF controller and isn't
useful for drivers which don't use libata SFF HSM implementation.
However, it's a required callback and many drivers implement their own
noop version as placeholder.  This patch implements ata_noop_irq_clear
and use it to replace those custom placeholders.

Also, SFF drivers which don't support BMDMA don't need to use
ata_bmdma_irq_clear().  It becomes noop if BMDMA address isn't
initialized.  Convert them to use ata_noop_irq_clear().

Signed-off-by: Tejun Heo <htejun@gmail.com>
  • Loading branch information
htejun authored and Jeff Garzik committed Apr 17, 2008
1 parent c1bc899 commit 358f9a7
Show file tree
Hide file tree
Showing 24 changed files with 47 additions and 90 deletions.
12 changes: 3 additions & 9 deletions drivers/ata/ahci.c
Original file line number Diff line number Diff line change
Expand Up @@ -244,7 +244,6 @@ static int ahci_scr_read(struct ata_port *ap, unsigned int sc_reg, u32 *val);
static int ahci_scr_write(struct ata_port *ap, unsigned int sc_reg, u32 val);
static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent);
static unsigned int ahci_qc_issue(struct ata_queued_cmd *qc);
static void ahci_irq_clear(struct ata_port *ap);
static int ahci_port_start(struct ata_port *ap);
static void ahci_port_stop(struct ata_port *ap);
static void ahci_tf_read(struct ata_port *ap, struct ata_taskfile *tf);
Expand Down Expand Up @@ -307,7 +306,7 @@ static const struct ata_port_operations ahci_ops = {
.qc_prep = ahci_qc_prep,
.qc_issue = ahci_qc_issue,

.irq_clear = ahci_irq_clear,
.irq_clear = ata_noop_irq_clear,

.scr_read = ahci_scr_read,
.scr_write = ahci_scr_write,
Expand Down Expand Up @@ -343,7 +342,7 @@ static const struct ata_port_operations ahci_vt8251_ops = {
.qc_prep = ahci_qc_prep,
.qc_issue = ahci_qc_issue,

.irq_clear = ahci_irq_clear,
.irq_clear = ata_noop_irq_clear,

.scr_read = ahci_scr_read,
.scr_write = ahci_scr_write,
Expand Down Expand Up @@ -377,7 +376,7 @@ static const struct ata_port_operations ahci_p5wdh_ops = {
.qc_prep = ahci_qc_prep,
.qc_issue = ahci_qc_issue,

.irq_clear = ahci_irq_clear,
.irq_clear = ata_noop_irq_clear,

.scr_read = ahci_scr_read,
.scr_write = ahci_scr_write,
Expand Down Expand Up @@ -1769,11 +1768,6 @@ static void ahci_port_intr(struct ata_port *ap)
}
}

static void ahci_irq_clear(struct ata_port *ap)
{
/* TODO */
}

static irqreturn_t ahci_interrupt(int irq, void *dev_instance)
{
struct ata_host *host = dev_instance;
Expand Down
1 change: 1 addition & 0 deletions drivers/ata/libata-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -7824,6 +7824,7 @@ EXPORT_SYMBOL_GPL(ata_noop_qc_prep);
EXPORT_SYMBOL_GPL(ata_bmdma_setup);
EXPORT_SYMBOL_GPL(ata_bmdma_start);
EXPORT_SYMBOL_GPL(ata_bmdma_irq_clear);
EXPORT_SYMBOL_GPL(ata_noop_irq_clear);
EXPORT_SYMBOL_GPL(ata_bmdma_status);
EXPORT_SYMBOL_GPL(ata_bmdma_stop);
EXPORT_SYMBOL_GPL(ata_bmdma_freeze);
Expand Down
8 changes: 8 additions & 0 deletions drivers/ata/libata-sff.c
Original file line number Diff line number Diff line change
Expand Up @@ -302,6 +302,14 @@ void ata_bmdma_irq_clear(struct ata_port *ap)
iowrite8(ioread8(mmio + ATA_DMA_STATUS), mmio + ATA_DMA_STATUS);
}

/**
* ata_noop_irq_clear - Noop placeholder for irq_clear
* @ap: Port associated with this ATA transaction.
*/
void ata_noop_irq_clear(struct ata_port *ap)
{
}

/**
* ata_bmdma_status - Read PCI IDE BMDMA status
* @ap: Port associated with this ATA transaction.
Expand Down
2 changes: 1 addition & 1 deletion drivers/ata/pata_ali.c
Original file line number Diff line number Diff line change
Expand Up @@ -380,7 +380,7 @@ static struct ata_port_operations ali_early_port_ops = {
.data_xfer = ata_data_xfer,

.irq_handler = ata_interrupt,
.irq_clear = ata_bmdma_irq_clear,
.irq_clear = ata_noop_irq_clear,
.irq_on = ata_irq_on,

.port_start = ata_sff_port_start,
Expand Down
7 changes: 1 addition & 6 deletions drivers/ata/pata_at32.c
Original file line number Diff line number Diff line change
Expand Up @@ -166,11 +166,6 @@ static void pata_at32_set_piomode(struct ata_port *ap, struct ata_device *adev)
}
}

static void pata_at32_irq_clear(struct ata_port *ap)
{
/* No DMA controller yet */
}

static struct scsi_host_template at32_sht = {
.module = THIS_MODULE,
.name = DRV_NAME,
Expand Down Expand Up @@ -208,7 +203,7 @@ static struct ata_port_operations at32_port_ops = {

.data_xfer = ata_data_xfer,

.irq_clear = pata_at32_irq_clear,
.irq_clear = ata_noop_irq_clear,
.irq_on = ata_irq_on,

.port_start = ata_sff_port_start,
Expand Down
7 changes: 1 addition & 6 deletions drivers/ata/pata_icside.c
Original file line number Diff line number Diff line change
Expand Up @@ -322,11 +322,6 @@ static struct scsi_host_template pata_icside_sht = {
.bios_param = ata_std_bios_param,
};

/* wish this was exported from libata-core */
static void ata_dummy_noret(struct ata_port *port)
{
}

static void pata_icside_postreset(struct ata_link *link, unsigned int *classes)
{
struct ata_port *ap = link->ap;
Expand Down Expand Up @@ -380,7 +375,7 @@ static struct ata_port_operations pata_icside_port_ops = {
.error_handler = pata_icside_error_handler,
.post_internal_cmd = pata_icside_bmdma_stop,

.irq_clear = ata_dummy_noret,
.irq_clear = ata_noop_irq_clear,
.irq_on = ata_irq_on,

.bmdma_stop = pata_icside_bmdma_stop,
Expand Down
2 changes: 1 addition & 1 deletion drivers/ata/pata_isapnp.c
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ static struct ata_port_operations isapnp_port_ops = {

.data_xfer = ata_data_xfer,

.irq_clear = ata_bmdma_irq_clear,
.irq_clear = ata_noop_irq_clear,
.irq_on = ata_irq_on,

.port_start = ata_sff_port_start,
Expand Down
2 changes: 1 addition & 1 deletion drivers/ata/pata_ixp4xx_cf.c
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ static struct ata_port_operations ixp4xx_port_ops = {
.cable_detect = ata_cable_40wire,

.irq_handler = ata_interrupt,
.irq_clear = ata_bmdma_irq_clear,
.irq_clear = ata_noop_irq_clear,
.irq_on = ata_irq_on,

.port_start = ata_port_start,
Expand Down
22 changes: 11 additions & 11 deletions drivers/ata/pata_legacy.c
Original file line number Diff line number Diff line change
Expand Up @@ -252,7 +252,7 @@ static struct ata_port_operations simple_port_ops = {
.data_xfer = ata_data_xfer_noirq,

.irq_handler = ata_interrupt,
.irq_clear = ata_bmdma_irq_clear,
.irq_clear = ata_noop_irq_clear,
.irq_on = ata_irq_on,

.port_start = ata_sff_port_start,
Expand All @@ -279,7 +279,7 @@ static struct ata_port_operations legacy_port_ops = {
.data_xfer = ata_data_xfer_noirq,

.irq_handler = ata_interrupt,
.irq_clear = ata_bmdma_irq_clear,
.irq_clear = ata_noop_irq_clear,
.irq_on = ata_irq_on,

.port_start = ata_sff_port_start,
Expand Down Expand Up @@ -393,7 +393,7 @@ static struct ata_port_operations pdc20230_port_ops = {
.data_xfer = pdc_data_xfer_vlb,

.irq_handler = ata_interrupt,
.irq_clear = ata_bmdma_irq_clear,
.irq_clear = ata_noop_irq_clear,
.irq_on = ata_irq_on,

.port_start = ata_sff_port_start,
Expand Down Expand Up @@ -447,7 +447,7 @@ static struct ata_port_operations ht6560a_port_ops = {
.data_xfer = ata_data_xfer, /* Check vlb/noirq */

.irq_handler = ata_interrupt,
.irq_clear = ata_bmdma_irq_clear,
.irq_clear = ata_noop_irq_clear,
.irq_on = ata_irq_on,

.port_start = ata_sff_port_start,
Expand Down Expand Up @@ -512,7 +512,7 @@ static struct ata_port_operations ht6560b_port_ops = {
.data_xfer = ata_data_xfer, /* FIXME: Check 32bit and noirq */

.irq_handler = ata_interrupt,
.irq_clear = ata_bmdma_irq_clear,
.irq_clear = ata_noop_irq_clear,
.irq_on = ata_irq_on,

.port_start = ata_sff_port_start,
Expand Down Expand Up @@ -633,7 +633,7 @@ static struct ata_port_operations opti82c611a_port_ops = {
.data_xfer = ata_data_xfer,

.irq_handler = ata_interrupt,
.irq_clear = ata_bmdma_irq_clear,
.irq_clear = ata_noop_irq_clear,
.irq_on = ata_irq_on,

.port_start = ata_sff_port_start,
Expand Down Expand Up @@ -765,7 +765,7 @@ static struct ata_port_operations opti82c46x_port_ops = {
.data_xfer = ata_data_xfer,

.irq_handler = ata_interrupt,
.irq_clear = ata_bmdma_irq_clear,
.irq_clear = ata_noop_irq_clear,
.irq_on = ata_irq_on,

.port_start = ata_sff_port_start,
Expand Down Expand Up @@ -950,7 +950,7 @@ static struct ata_port_operations qdi6500_port_ops = {
.data_xfer = vlb32_data_xfer,

.irq_handler = ata_interrupt,
.irq_clear = ata_bmdma_irq_clear,
.irq_clear = ata_noop_irq_clear,
.irq_on = ata_irq_on,

.port_start = ata_sff_port_start,
Expand All @@ -977,7 +977,7 @@ static struct ata_port_operations qdi6580_port_ops = {
.data_xfer = vlb32_data_xfer,

.irq_handler = ata_interrupt,
.irq_clear = ata_bmdma_irq_clear,
.irq_clear = ata_noop_irq_clear,
.irq_on = ata_irq_on,

.port_start = ata_sff_port_start,
Expand All @@ -1004,7 +1004,7 @@ static struct ata_port_operations qdi6580dp_port_ops = {
.data_xfer = vlb32_data_xfer,

.irq_handler = ata_interrupt,
.irq_clear = ata_bmdma_irq_clear,
.irq_clear = ata_noop_irq_clear,
.irq_on = ata_irq_on,

.port_start = ata_sff_port_start,
Expand Down Expand Up @@ -1095,7 +1095,7 @@ static struct ata_port_operations winbond_port_ops = {

.data_xfer = vlb32_data_xfer,

.irq_clear = ata_bmdma_irq_clear,
.irq_clear = ata_noop_irq_clear,
.irq_on = ata_irq_on,

.port_start = ata_sff_port_start,
Expand Down
2 changes: 1 addition & 1 deletion drivers/ata/pata_mpc52xx.c
Original file line number Diff line number Diff line change
Expand Up @@ -296,7 +296,7 @@ static struct ata_port_operations mpc52xx_ata_port_ops = {
.qc_prep = ata_qc_prep,
.qc_issue = ata_qc_issue_prot,
.data_xfer = ata_data_xfer,
.irq_clear = ata_bmdma_irq_clear,
.irq_clear = ata_noop_irq_clear,
.irq_on = ata_irq_on,
.port_start = ata_port_start,
};
Expand Down
2 changes: 1 addition & 1 deletion drivers/ata/pata_mpiix.c
Original file line number Diff line number Diff line change
Expand Up @@ -187,7 +187,7 @@ static struct ata_port_operations mpiix_port_ops = {
.qc_issue = mpiix_qc_issue_prot,
.data_xfer = ata_data_xfer,

.irq_clear = ata_bmdma_irq_clear,
.irq_clear = ata_noop_irq_clear,
.irq_on = ata_irq_on,

.port_start = ata_sff_port_start,
Expand Down
2 changes: 1 addition & 1 deletion drivers/ata/pata_ns87410.c
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,7 @@ static struct ata_port_operations ns87410_port_ops = {
.data_xfer = ata_data_xfer,

.irq_handler = ata_interrupt,
.irq_clear = ata_bmdma_irq_clear,
.irq_clear = ata_noop_irq_clear,
.irq_on = ata_irq_on,

.port_start = ata_sff_port_start,
Expand Down
4 changes: 2 additions & 2 deletions drivers/ata/pata_pcmcia.c
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,7 @@ static struct ata_port_operations pcmcia_port_ops = {

.data_xfer = ata_data_xfer_noirq,

.irq_clear = ata_bmdma_irq_clear,
.irq_clear = ata_noop_irq_clear,
.irq_on = ata_irq_on,

.port_start = ata_sff_port_start,
Expand All @@ -189,7 +189,7 @@ static struct ata_port_operations pcmcia_8bit_port_ops = {

.data_xfer = ata_data_xfer_8bit,

.irq_clear = ata_bmdma_irq_clear,
.irq_clear = ata_noop_irq_clear,
.irq_on = ata_irq_on,

.port_start = ata_sff_port_start,
Expand Down
2 changes: 1 addition & 1 deletion drivers/ata/pata_platform.c
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ static struct ata_port_operations pata_platform_port_ops = {

.data_xfer = ata_data_xfer_noirq,

.irq_clear = ata_bmdma_irq_clear,
.irq_clear = ata_noop_irq_clear,
.irq_on = ata_irq_on,

.port_start = ata_dummy_ret0,
Expand Down
4 changes: 2 additions & 2 deletions drivers/ata/pata_qdi.c
Original file line number Diff line number Diff line change
Expand Up @@ -191,7 +191,7 @@ static struct ata_port_operations qdi6500_port_ops = {

.data_xfer = qdi_data_xfer,

.irq_clear = ata_bmdma_irq_clear,
.irq_clear = ata_noop_irq_clear,
.irq_on = ata_irq_on,

.port_start = ata_sff_port_start,
Expand All @@ -217,7 +217,7 @@ static struct ata_port_operations qdi6580_port_ops = {

.data_xfer = qdi_data_xfer,

.irq_clear = ata_bmdma_irq_clear,
.irq_clear = ata_noop_irq_clear,
.irq_on = ata_irq_on,

.port_start = ata_sff_port_start,
Expand Down
6 changes: 1 addition & 5 deletions drivers/ata/pata_rb500_cf.c
Original file line number Diff line number Diff line change
Expand Up @@ -117,10 +117,6 @@ static irqreturn_t rb500_pata_irq_handler(int irq, void *dev_instance)
return IRQ_HANDLED;
}

static void rb500_pata_irq_clear(struct ata_port *ap)
{
}

static int rb500_pata_port_start(struct ata_port *ap)
{
return 0;
Expand All @@ -144,7 +140,7 @@ static struct ata_port_operations rb500_pata_port_ops = {
.error_handler = ata_bmdma_error_handler,

.irq_handler = rb500_pata_irq_handler,
.irq_clear = rb500_pata_irq_clear,
.irq_clear = ata_noop_irq_clear,
.irq_on = ata_irq_on,

.port_start = rb500_pata_port_start,
Expand Down
2 changes: 1 addition & 1 deletion drivers/ata/pata_winbond.c
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,7 @@ static struct ata_port_operations winbond_port_ops = {

.data_xfer = winbond_data_xfer,

.irq_clear = ata_bmdma_irq_clear,
.irq_clear = ata_noop_irq_clear,
.irq_on = ata_irq_on,

.port_start = ata_sff_port_start,
Expand Down
8 changes: 1 addition & 7 deletions drivers/ata/pdc_adma.c
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,6 @@ static unsigned int adma_qc_issue(struct ata_queued_cmd *qc);
static int adma_check_atapi_dma(struct ata_queued_cmd *qc);
static void adma_bmdma_stop(struct ata_queued_cmd *qc);
static u8 adma_bmdma_status(struct ata_port *ap);
static void adma_irq_clear(struct ata_port *ap);
static void adma_freeze(struct ata_port *ap);
static void adma_thaw(struct ata_port *ap);
static void adma_error_handler(struct ata_port *ap);
Expand Down Expand Up @@ -174,7 +173,7 @@ static const struct ata_port_operations adma_ata_ops = {
.freeze = adma_freeze,
.thaw = adma_thaw,
.error_handler = adma_error_handler,
.irq_clear = adma_irq_clear,
.irq_clear = ata_noop_irq_clear,
.irq_on = ata_irq_on,
.port_start = adma_port_start,
.port_stop = adma_port_stop,
Expand Down Expand Up @@ -223,11 +222,6 @@ static u8 adma_bmdma_status(struct ata_port *ap)
return 0;
}

static void adma_irq_clear(struct ata_port *ap)
{
/* nothing */
}

static void adma_reset_engine(struct ata_port *ap)
{
void __iomem *chan = ADMA_PORT_REGS(ap);
Expand Down
7 changes: 1 addition & 6 deletions drivers/ata/sata_fsl.c
Original file line number Diff line number Diff line change
Expand Up @@ -933,11 +933,6 @@ static void sata_fsl_post_internal_cmd(struct ata_queued_cmd *qc)
}
}

static void sata_fsl_irq_clear(struct ata_port *ap)
{
/* unused */
}

static void sata_fsl_error_intr(struct ata_port *ap)
{
struct ata_link *link = &ap->link;
Expand Down Expand Up @@ -1223,7 +1218,7 @@ static const struct ata_port_operations sata_fsl_ops = {

.qc_prep = sata_fsl_qc_prep,
.qc_issue = sata_fsl_qc_issue,
.irq_clear = sata_fsl_irq_clear,
.irq_clear = ata_noop_irq_clear,

.scr_read = sata_fsl_scr_read,
.scr_write = sata_fsl_scr_write,
Expand Down
Loading

0 comments on commit 358f9a7

Please sign in to comment.