From mboxrd@z Thu Jan 1 00:00:00 1970 From: Phil Sutter Subject: [PATCH] pata-rb532-cf: read and write data in 4-byte blocks Date: Mon, 3 Nov 2008 14:29:14 +0100 Message-ID: <1225718954-8307-1-git-send-email-n0-1@freewrt.org> References: <490E1A63.3040507@ru.mvista.com> Return-path: Received: from orbit.nwl.cc ([81.169.176.177]:59201 "EHLO mail.ifyouseekate.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755179AbYKCN3X (ORCPT ); Mon, 3 Nov 2008 08:29:23 -0500 In-Reply-To: <490E1A63.3040507@ru.mvista.com> Sender: linux-ide-owner@vger.kernel.org List-Id: linux-ide@vger.kernel.org To: Bartlomiej Zolnierkiewicz Cc: linux-ide@vger.kernel.org * rename the offset definition to avoid abiguity with the standard ATA IO address * read and write four bytes at once * use writesl() and readsl() which implicitly iterate over the data * fix the signature of rb532_pata_data_xfer() to match the function pointer definition and return the number of bytes consumed Signed-off-by: Phil Sutter Acked-by: Sergei Shtyltov --- drivers/ata/pata_rb532_cf.c | 21 ++++++++++----------- 1 files changed, 10 insertions(+), 11 deletions(-) diff --git a/drivers/ata/pata_rb532_cf.c b/drivers/ata/pata_rb532_cf.c index 7b11f40..a220992 100644 --- a/drivers/ata/pata_rb532_cf.c +++ b/drivers/ata/pata_rb532_cf.c @@ -43,7 +43,8 @@ #define RB500_CF_REG_BASE 0x0800 #define RB500_CF_REG_ERR 0x080D #define RB500_CF_REG_CTRL 0x080E -#define RB500_CF_REG_DATA 0x0C00 +/* 32bit buffered data register offset */ +#define RB500_CF_REG_DBUF32 0x0C00 struct rb532_cf_info { void __iomem *iobase; @@ -74,21 +75,19 @@ static void rb532_pata_exec_command(struct ata_port *ap, rb532_pata_finish_io(ap); } -static void rb532_pata_data_xfer(struct ata_device *adev, unsigned char *buf, - unsigned int buflen, int write_data) +static unsigned int rb532_pata_data_xfer(struct ata_device *adev, + unsigned char *buf, unsigned int buflen, int write_data) { struct ata_port *ap = adev->link->ap; void __iomem *ioaddr = ap->ioaddr.data_addr; - if (write_data) { - for (; buflen > 0; buflen--, buf++) - writeb(*buf, ioaddr); - } else { - for (; buflen > 0; buflen--, buf++) - *buf = readb(ioaddr); - } + if (write_data) + writesl(ioaddr, buf, buflen / sizeof(u32)); + else + readsl(ioaddr, buf, buflen / sizeof(u32)); rb532_pata_finish_io(adev->link->ap); + return buflen; } static void rb532_pata_freeze(struct ata_port *ap) @@ -156,7 +155,7 @@ static void rb532_pata_setup_ports(struct ata_host *ah) ata_sff_std_ports(&ap->ioaddr); - ap->ioaddr.data_addr = info->iobase + RB500_CF_REG_DATA; + ap->ioaddr.data_addr = info->iobase + RB500_CF_REG_DBUF32; ap->ioaddr.error_addr = info->iobase + RB500_CF_REG_ERR; } -- 1.5.6.4