Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 37f65b8b authored by Tejun Heo's avatar Tejun Heo Committed by Jeff Garzik
Browse files

libata-sff: ata_sff_irq_clear() is BMDMA specific



ata_sff_irq_clear() is BMDMA specific.  Rename it to
ata_bmdma_irq_clear(), move it to ata_bmdma_port_ops and make
->sff_irq_clear() optional.

Note: ata_bmdma_irq_clear() is actually only needed by ata_piix and
      possibly by sata_sil.  This should be moved to respective low
      level drivers later.

Signed-off-by: default avatarTejun Heo <tj@kernel.org>
Signed-off-by: default avatarJeff Garzik <jgarzik@redhat.com>
parent 2f20ccf8
Loading
Loading
Loading
Loading
+37 −30
Original line number Original line Diff line number Diff line
@@ -63,7 +63,6 @@ const struct ata_port_operations ata_sff_port_ops = {
	.sff_tf_read		= ata_sff_tf_read,
	.sff_tf_read		= ata_sff_tf_read,
	.sff_exec_command	= ata_sff_exec_command,
	.sff_exec_command	= ata_sff_exec_command,
	.sff_data_xfer		= ata_sff_data_xfer,
	.sff_data_xfer		= ata_sff_data_xfer,
	.sff_irq_clear		= ata_sff_irq_clear,
	.sff_drain_fifo		= ata_sff_drain_fifo,
	.sff_drain_fifo		= ata_sff_drain_fifo,


	.lost_interrupt		= ata_sff_lost_interrupt,
	.lost_interrupt		= ata_sff_lost_interrupt,
@@ -395,32 +394,11 @@ void ata_sff_irq_on(struct ata_port *ap)
		ata_sff_set_devctl(ap, ap->ctl);
		ata_sff_set_devctl(ap, ap->ctl);
	ata_wait_idle(ap);
	ata_wait_idle(ap);


	if (ap->ops->sff_irq_clear)
		ap->ops->sff_irq_clear(ap);
		ap->ops->sff_irq_clear(ap);
}
}
EXPORT_SYMBOL_GPL(ata_sff_irq_on);
EXPORT_SYMBOL_GPL(ata_sff_irq_on);


/**
 *	ata_sff_irq_clear - Clear PCI IDE BMDMA interrupt.
 *	@ap: Port associated with this ATA transaction.
 *
 *	Clear interrupt and error flags in DMA status register.
 *
 *	May be used as the irq_clear() entry in ata_port_operations.
 *
 *	LOCKING:
 *	spin_lock_irqsave(host lock)
 */
void ata_sff_irq_clear(struct ata_port *ap)
{
	void __iomem *mmio = ap->ioaddr.bmdma_addr;

	if (!mmio)
		return;

	iowrite8(ioread8(mmio + ATA_DMA_STATUS), mmio + ATA_DMA_STATUS);
}
EXPORT_SYMBOL_GPL(ata_sff_irq_clear);

/**
/**
 *	ata_sff_tf_load - send taskfile registers to host controller
 *	ata_sff_tf_load - send taskfile registers to host controller
 *	@ap: Port to which output is sent
 *	@ap: Port to which output is sent
@@ -1572,6 +1550,7 @@ unsigned int ata_sff_host_intr(struct ata_port *ap,
	}
	}


	/* clear irq events */
	/* clear irq events */
	if (ap->ops->sff_irq_clear)
		ap->ops->sff_irq_clear(ap);
		ap->ops->sff_irq_clear(ap);


	ata_sff_hsm_move(ap, qc, status, 0);
	ata_sff_hsm_move(ap, qc, status, 0);
@@ -1588,6 +1567,7 @@ unsigned int ata_sff_host_intr(struct ata_port *ap,
#ifdef ATA_IRQ_TRAP
#ifdef ATA_IRQ_TRAP
	if ((ap->stats.idle_irq % 1000) == 0) {
	if ((ap->stats.idle_irq % 1000) == 0) {
		ap->ops->sff_check_status(ap);
		ap->ops->sff_check_status(ap);
		if (ap->ops->sff_irq_clear)
			ap->ops->sff_irq_clear(ap);
			ap->ops->sff_irq_clear(ap);
		ata_port_printk(ap, KERN_WARNING, "irq trap\n");
		ata_port_printk(ap, KERN_WARNING, "irq trap\n");
		return 1;
		return 1;
@@ -1658,6 +1638,7 @@ irqreturn_t ata_sff_interrupt(int irq, void *dev_instance)


			if (idle & (1 << i)) {
			if (idle & (1 << i)) {
				ap->ops->sff_check_status(ap);
				ap->ops->sff_check_status(ap);
				if (ap->ops->sff_irq_clear)
					ap->ops->sff_irq_clear(ap);
					ap->ops->sff_irq_clear(ap);
			} else {
			} else {
				/* clear INTRQ and check if BUSY cleared */
				/* clear INTRQ and check if BUSY cleared */
@@ -1744,6 +1725,7 @@ void ata_sff_freeze(struct ata_port *ap)
	 */
	 */
	ap->ops->sff_check_status(ap);
	ap->ops->sff_check_status(ap);


	if (ap->ops->sff_irq_clear)
		ap->ops->sff_irq_clear(ap);
		ap->ops->sff_irq_clear(ap);
}
}
EXPORT_SYMBOL_GPL(ata_sff_freeze);
EXPORT_SYMBOL_GPL(ata_sff_freeze);
@@ -1761,6 +1743,7 @@ void ata_sff_thaw(struct ata_port *ap)
{
{
	/* clear & re-enable interrupts */
	/* clear & re-enable interrupts */
	ap->ops->sff_check_status(ap);
	ap->ops->sff_check_status(ap);
	if (ap->ops->sff_irq_clear)
		ap->ops->sff_irq_clear(ap);
		ap->ops->sff_irq_clear(ap);
	ata_sff_irq_on(ap);
	ata_sff_irq_on(ap);
}
}
@@ -2580,6 +2563,7 @@ const struct ata_port_operations ata_bmdma_port_ops = {
	.qc_prep		= ata_bmdma_qc_prep,
	.qc_prep		= ata_bmdma_qc_prep,
	.qc_issue		= ata_bmdma_qc_issue,
	.qc_issue		= ata_bmdma_qc_issue,


	.sff_irq_clear		= ata_bmdma_irq_clear,
	.bmdma_setup		= ata_bmdma_setup,
	.bmdma_setup		= ata_bmdma_setup,
	.bmdma_start		= ata_bmdma_start,
	.bmdma_start		= ata_bmdma_start,
	.bmdma_stop		= ata_bmdma_stop,
	.bmdma_stop		= ata_bmdma_stop,
@@ -2848,6 +2832,7 @@ void ata_bmdma_error_handler(struct ata_port *ap)
		/* if we're gonna thaw, make sure IRQ is clear */
		/* if we're gonna thaw, make sure IRQ is clear */
		if (thaw) {
		if (thaw) {
			ap->ops->sff_check_status(ap);
			ap->ops->sff_check_status(ap);
			if (ap->ops->sff_irq_clear)
				ap->ops->sff_irq_clear(ap);
				ap->ops->sff_irq_clear(ap);
		}
		}
	}
	}
@@ -2881,6 +2866,28 @@ void ata_bmdma_post_internal_cmd(struct ata_queued_cmd *qc)
}
}
EXPORT_SYMBOL_GPL(ata_bmdma_post_internal_cmd);
EXPORT_SYMBOL_GPL(ata_bmdma_post_internal_cmd);


/**
 *	ata_bmdma_irq_clear - Clear PCI IDE BMDMA interrupt.
 *	@ap: Port associated with this ATA transaction.
 *
 *	Clear interrupt and error flags in DMA status register.
 *
 *	May be used as the irq_clear() entry in ata_port_operations.
 *
 *	LOCKING:
 *	spin_lock_irqsave(host lock)
 */
void ata_bmdma_irq_clear(struct ata_port *ap)
{
	void __iomem *mmio = ap->ioaddr.bmdma_addr;

	if (!mmio)
		return;

	iowrite8(ioread8(mmio + ATA_DMA_STATUS), mmio + ATA_DMA_STATUS);
}
EXPORT_SYMBOL_GPL(ata_bmdma_irq_clear);

/**
/**
 *	ata_bmdma_setup - Set up PCI IDE BMDMA transaction
 *	ata_bmdma_setup - Set up PCI IDE BMDMA transaction
 *	@qc: Info associated with this ATA transaction.
 *	@qc: Info associated with this ATA transaction.
+1 −1
Original line number Original line Diff line number Diff line
@@ -1214,7 +1214,7 @@ static unsigned int bfin_data_xfer(struct ata_device *dev, unsigned char *buf,
 *	bfin_irq_clear - Clear ATAPI interrupt.
 *	bfin_irq_clear - Clear ATAPI interrupt.
 *	@ap: Port associated with this ATA transaction.
 *	@ap: Port associated with this ATA transaction.
 *
 *
 *	Note: Original code is ata_sff_irq_clear().
 *	Note: Original code is ata_bmdma_irq_clear().
 */
 */


static void bfin_irq_clear(struct ata_port *ap)
static void bfin_irq_clear(struct ata_port *ap)
+1 −1
Original line number Original line Diff line number Diff line
@@ -875,7 +875,7 @@ static void scc_postreset(struct ata_link *link, unsigned int *classes)
 *	scc_irq_clear - Clear PCI IDE BMDMA interrupt.
 *	scc_irq_clear - Clear PCI IDE BMDMA interrupt.
 *	@ap: Port associated with this ATA transaction.
 *	@ap: Port associated with this ATA transaction.
 *
 *
 *	Note: Original code is ata_sff_irq_clear().
 *	Note: Original code is ata_bmdma_irq_clear().
 */
 */


static void scc_irq_clear (struct ata_port *ap)
static void scc_irq_clear (struct ata_port *ap)
+1 −1
Original line number Original line Diff line number Diff line
@@ -1100,7 +1100,7 @@ static void nv_adma_irq_clear(struct ata_port *ap)
	u32 notifier_clears[2];
	u32 notifier_clears[2];


	if (pp->flags & NV_ADMA_ATAPI_SETUP_COMPLETE) {
	if (pp->flags & NV_ADMA_ATAPI_SETUP_COMPLETE) {
		ata_sff_irq_clear(ap);
		ata_bmdma_irq_clear(ap);
		return;
		return;
	}
	}


+2 −2
Original line number Original line Diff line number Diff line
@@ -503,7 +503,7 @@ static void sil_host_intr(struct ata_port *ap, u32 bmdma2)
		goto err_hsm;
		goto err_hsm;


	/* ack bmdma irq events */
	/* ack bmdma irq events */
	ata_sff_irq_clear(ap);
	ata_bmdma_irq_clear(ap);


	/* kick HSM in the ass */
	/* kick HSM in the ass */
	ata_sff_hsm_move(ap, qc, status, 0);
	ata_sff_hsm_move(ap, qc, status, 0);
@@ -584,7 +584,7 @@ static void sil_thaw(struct ata_port *ap)


	/* clear IRQ */
	/* clear IRQ */
	ap->ops->sff_check_status(ap);
	ap->ops->sff_check_status(ap);
	ata_sff_irq_clear(ap);
	ata_bmdma_irq_clear(ap);


	/* turn on SATA IRQ if supported */
	/* turn on SATA IRQ if supported */
	if (!(ap->flags & SIL_FLAG_NO_SATA_IRQ))
	if (!(ap->flags & SIL_FLAG_NO_SATA_IRQ))
Loading