126a940e21752e0de8f068f77dad606a7d1986937Pete Popov/*
226a940e21752e0de8f068f77dad606a7d1986937Pete Popov * BRIEF MODULE DESCRIPTION
326a940e21752e0de8f068f77dad606a7d1986937Pete Popov * AMD Alchemy Au1xxx IDE interface routines over the Static Bus
426a940e21752e0de8f068f77dad606a7d1986937Pete Popov *
526a940e21752e0de8f068f77dad606a7d1986937Pete Popov * Copyright (c) 2003-2005 AMD, Personal Connectivity Solutions
626a940e21752e0de8f068f77dad606a7d1986937Pete Popov *
726a940e21752e0de8f068f77dad606a7d1986937Pete Popov * This program is free software; you can redistribute it and/or modify it under
826a940e21752e0de8f068f77dad606a7d1986937Pete Popov * the terms of the GNU General Public License as published by the Free Software
926a940e21752e0de8f068f77dad606a7d1986937Pete Popov * Foundation; either version 2 of the License, or (at your option) any later
1026a940e21752e0de8f068f77dad606a7d1986937Pete Popov * version.
1126a940e21752e0de8f068f77dad606a7d1986937Pete Popov *
1226a940e21752e0de8f068f77dad606a7d1986937Pete Popov * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
1326a940e21752e0de8f068f77dad606a7d1986937Pete Popov * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
1426a940e21752e0de8f068f77dad606a7d1986937Pete Popov * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR
1526a940e21752e0de8f068f77dad606a7d1986937Pete Popov * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
1626a940e21752e0de8f068f77dad606a7d1986937Pete Popov * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
1726a940e21752e0de8f068f77dad606a7d1986937Pete Popov * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
1826a940e21752e0de8f068f77dad606a7d1986937Pete Popov * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
1926a940e21752e0de8f068f77dad606a7d1986937Pete Popov * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2026a940e21752e0de8f068f77dad606a7d1986937Pete Popov * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
2126a940e21752e0de8f068f77dad606a7d1986937Pete Popov * POSSIBILITY OF SUCH DAMAGE.
2226a940e21752e0de8f068f77dad606a7d1986937Pete Popov *
2326a940e21752e0de8f068f77dad606a7d1986937Pete Popov * You should have received a copy of the GNU General Public License along with
2426a940e21752e0de8f068f77dad606a7d1986937Pete Popov * this program; if not, write to the Free Software Foundation, Inc.,
2526a940e21752e0de8f068f77dad606a7d1986937Pete Popov * 675 Mass Ave, Cambridge, MA 02139, USA.
2626a940e21752e0de8f068f77dad606a7d1986937Pete Popov *
2726a940e21752e0de8f068f77dad606a7d1986937Pete Popov * Note: for more information, please refer "AMD Alchemy Au1200/Au1550 IDE
2826a940e21752e0de8f068f77dad606a7d1986937Pete Popov *       Interface and Linux Device Driver" Application Note.
2926a940e21752e0de8f068f77dad606a7d1986937Pete Popov */
3026a940e21752e0de8f068f77dad606a7d1986937Pete Popov#include <linux/types.h>
3126a940e21752e0de8f068f77dad606a7d1986937Pete Popov#include <linux/module.h>
3226a940e21752e0de8f068f77dad606a7d1986937Pete Popov#include <linux/kernel.h>
3326a940e21752e0de8f068f77dad606a7d1986937Pete Popov#include <linux/delay.h>
348f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse#include <linux/platform_device.h>
3526a940e21752e0de8f068f77dad606a7d1986937Pete Popov#include <linux/init.h>
3626a940e21752e0de8f068f77dad606a7d1986937Pete Popov#include <linux/ide.h>
37fabd3a223a96de1a91b2148655f2ed09ca9d1c20Sergei Shtylyov#include <linux/scatterlist.h>
3826a940e21752e0de8f068f77dad606a7d1986937Pete Popov
3950d5676ebac57c187ac347bae24290f0dc16fdbeManuel Lauss#include <asm/mach-au1x00/au1000.h>
4026a940e21752e0de8f068f77dad606a7d1986937Pete Popov#include <asm/mach-au1x00/au1xxx_dbdma.h>
4126a940e21752e0de8f068f77dad606a7d1986937Pete Popov#include <asm/mach-au1x00/au1xxx_ide.h>
4226a940e21752e0de8f068f77dad606a7d1986937Pete Popov
4326a940e21752e0de8f068f77dad606a7d1986937Pete Popov#define DRV_NAME	"au1200-ide"
448f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse#define DRV_AUTHOR	"Enrico Walther <enrico.walther@amd.com> / Pete Popov <ppopov@embeddedalley.com>"
4526a940e21752e0de8f068f77dad606a7d1986937Pete Popov
46d4f07ae748539d792162a9aa56f192c3992cb3fbManuel Lauss#ifndef IDE_REG_SHIFT
47d4f07ae748539d792162a9aa56f192c3992cb3fbManuel Lauss#define IDE_REG_SHIFT 5
48d4f07ae748539d792162a9aa56f192c3992cb3fbManuel Lauss#endif
49d4f07ae748539d792162a9aa56f192c3992cb3fbManuel Lauss
508f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse/* enable the burstmode in the dbdma */
518f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse#define IDE_AU1XXX_BURSTMODE	1
5226a940e21752e0de8f068f77dad606a7d1986937Pete Popov
538f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crousestatic _auide_hwif auide_hwif;
5426a940e21752e0de8f068f77dad606a7d1986937Pete Popov
5526a940e21752e0de8f068f77dad606a7d1986937Pete Popov#if defined(CONFIG_BLK_DEV_IDE_AU1XXX_PIO_DBDMA)
5626a940e21752e0de8f068f77dad606a7d1986937Pete Popov
57985232e388714d4a9e94b4d96ee69b6ff8c9dc31Sergei Shtylyovstatic inline void auide_insw(unsigned long port, void *addr, u32 count)
5826a940e21752e0de8f068f77dad606a7d1986937Pete Popov{
598f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	_auide_hwif *ahwif = &auide_hwif;
608f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	chan_tab_t *ctp;
618f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	au1x_ddma_desc_t *dp;
6226a940e21752e0de8f068f77dad606a7d1986937Pete Popov
63963accbc82a0912b39de39d59e2fd6741db3aa4bManuel Lauss	if (!au1xxx_dbdma_put_dest(ahwif->rx_chan, virt_to_phys(addr),
64ea071cc705e8bfba0c8bf84be8d4f9f4e9da6962Manuel Lauss				   count << 1, DDMA_FLAGS_NOIE)) {
65eb63963a55f039f049d0dd1121f91f332af6ecc9Harvey Harrison		printk(KERN_ERR "%s failed %d\n", __func__, __LINE__);
668f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse		return;
678f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	}
688f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	ctp = *((chan_tab_t **)ahwif->rx_chan);
698f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	dp = ctp->cur_ptr;
708f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	while (dp->dscr_cmd0 & DSCR_CMD0_V)
718f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse		;
728f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	ctp->cur_ptr = au1xxx_ddma_get_nextptr_virt(dp);
7326a940e21752e0de8f068f77dad606a7d1986937Pete Popov}
7426a940e21752e0de8f068f77dad606a7d1986937Pete Popov
75985232e388714d4a9e94b4d96ee69b6ff8c9dc31Sergei Shtylyovstatic inline void auide_outsw(unsigned long port, void *addr, u32 count)
7626a940e21752e0de8f068f77dad606a7d1986937Pete Popov{
778f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	_auide_hwif *ahwif = &auide_hwif;
788f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	chan_tab_t *ctp;
798f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	au1x_ddma_desc_t *dp;
8026a940e21752e0de8f068f77dad606a7d1986937Pete Popov
81963accbc82a0912b39de39d59e2fd6741db3aa4bManuel Lauss	if (!au1xxx_dbdma_put_source(ahwif->tx_chan, virt_to_phys(addr),
82ea071cc705e8bfba0c8bf84be8d4f9f4e9da6962Manuel Lauss				     count << 1, DDMA_FLAGS_NOIE)) {
83eb63963a55f039f049d0dd1121f91f332af6ecc9Harvey Harrison		printk(KERN_ERR "%s failed %d\n", __func__, __LINE__);
848f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse		return;
858f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	}
868f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	ctp = *((chan_tab_t **)ahwif->tx_chan);
878f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	dp = ctp->cur_ptr;
888f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	while (dp->dscr_cmd0 & DSCR_CMD0_V)
898f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse		;
908f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	ctp->cur_ptr = au1xxx_ddma_get_nextptr_virt(dp);
9126a940e21752e0de8f068f77dad606a7d1986937Pete Popov}
9226a940e21752e0de8f068f77dad606a7d1986937Pete Popov
93adb1af9803d167091c2cb4de14014185054bfe2cBartlomiej Zolnierkiewiczstatic void au1xxx_input_data(ide_drive_t *drive, struct ide_cmd *cmd,
9470f91e0d1410f77e0a22aa78fa2d591f1fd691a5Bartlomiej Zolnierkiewicz			      void *buf, unsigned int len)
9570f91e0d1410f77e0a22aa78fa2d591f1fd691a5Bartlomiej Zolnierkiewicz{
9670f91e0d1410f77e0a22aa78fa2d591f1fd691a5Bartlomiej Zolnierkiewicz	auide_insw(drive->hwif->io_ports.data_addr, buf, (len + 1) / 2);
9770f91e0d1410f77e0a22aa78fa2d591f1fd691a5Bartlomiej Zolnierkiewicz}
9870f91e0d1410f77e0a22aa78fa2d591f1fd691a5Bartlomiej Zolnierkiewicz
99adb1af9803d167091c2cb4de14014185054bfe2cBartlomiej Zolnierkiewiczstatic void au1xxx_output_data(ide_drive_t *drive, struct ide_cmd *cmd,
10070f91e0d1410f77e0a22aa78fa2d591f1fd691a5Bartlomiej Zolnierkiewicz			       void *buf, unsigned int len)
10170f91e0d1410f77e0a22aa78fa2d591f1fd691a5Bartlomiej Zolnierkiewicz{
10270f91e0d1410f77e0a22aa78fa2d591f1fd691a5Bartlomiej Zolnierkiewicz	auide_outsw(drive->hwif->io_ports.data_addr, buf, (len + 1) / 2);
10370f91e0d1410f77e0a22aa78fa2d591f1fd691a5Bartlomiej Zolnierkiewicz}
10426a940e21752e0de8f068f77dad606a7d1986937Pete Popov#endif
10526a940e21752e0de8f068f77dad606a7d1986937Pete Popov
106e085b3cae85af47eb0a3eda3186bd898310fb322Bartlomiej Zolnierkiewiczstatic void au1xxx_set_pio_mode(ide_hwif_t *hwif, ide_drive_t *drive)
10726a940e21752e0de8f068f77dad606a7d1986937Pete Popov{
10888b2b32babd46cd54d2de4d17eb869aea3383e11Bartlomiej Zolnierkiewicz	int mem_sttime = 0, mem_stcfg = au_readl(MEM_STCFG2);
1098f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse
110e085b3cae85af47eb0a3eda3186bd898310fb322Bartlomiej Zolnierkiewicz	switch (drive->pio_mode - XFER_PIO_0) {
1118f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	case 0:
1128f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse		mem_sttime = SBC_IDE_TIMING(PIO0);
1138f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse
1148f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse		/* set configuration for RCS2# */
1158f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse		mem_stcfg |= TS_MASK;
1168f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse		mem_stcfg &= ~TCSOE_MASK;
1178f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse		mem_stcfg &= ~TOECS_MASK;
1188f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse		mem_stcfg |= SBC_IDE_PIO0_TCSOE | SBC_IDE_PIO0_TOECS;
1198f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse		break;
1208f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse
1218f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	case 1:
1228f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse		mem_sttime = SBC_IDE_TIMING(PIO1);
1238f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse
1248f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse		/* set configuration for RCS2# */
1258f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse		mem_stcfg |= TS_MASK;
1268f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse		mem_stcfg &= ~TCSOE_MASK;
1278f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse		mem_stcfg &= ~TOECS_MASK;
1288f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse		mem_stcfg |= SBC_IDE_PIO1_TCSOE | SBC_IDE_PIO1_TOECS;
1298f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse		break;
1308f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse
1318f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	case 2:
1328f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse		mem_sttime = SBC_IDE_TIMING(PIO2);
1338f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse
1348f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse		/* set configuration for RCS2# */
1358f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse		mem_stcfg &= ~TS_MASK;
1368f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse		mem_stcfg &= ~TCSOE_MASK;
1378f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse		mem_stcfg &= ~TOECS_MASK;
1388f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse		mem_stcfg |= SBC_IDE_PIO2_TCSOE | SBC_IDE_PIO2_TOECS;
1398f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse		break;
1408f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse
1418f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	case 3:
1428f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse		mem_sttime = SBC_IDE_TIMING(PIO3);
1438f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse
1448f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse		/* set configuration for RCS2# */
1458f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse		mem_stcfg &= ~TS_MASK;
1468f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse		mem_stcfg &= ~TCSOE_MASK;
1478f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse		mem_stcfg &= ~TOECS_MASK;
1488f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse		mem_stcfg |= SBC_IDE_PIO3_TCSOE | SBC_IDE_PIO3_TOECS;
1498f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse
1508f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse		break;
1518f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse
1528f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	case 4:
1538f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse		mem_sttime = SBC_IDE_TIMING(PIO4);
1548f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse
1558f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse		/* set configuration for RCS2# */
1568f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse		mem_stcfg &= ~TS_MASK;
1578f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse		mem_stcfg &= ~TCSOE_MASK;
1588f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse		mem_stcfg &= ~TOECS_MASK;
1598f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse		mem_stcfg |= SBC_IDE_PIO4_TCSOE | SBC_IDE_PIO4_TOECS;
1608f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse		break;
1618f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	}
1628f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse
1638f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	au_writel(mem_sttime,MEM_STTIME2);
1648f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	au_writel(mem_stcfg,MEM_STCFG2);
16526a940e21752e0de8f068f77dad606a7d1986937Pete Popov}
16626a940e21752e0de8f068f77dad606a7d1986937Pete Popov
1678776168ca2151850164af1de5565d01f7b8b2c53Bartlomiej Zolnierkiewiczstatic void auide_set_dma_mode(ide_hwif_t *hwif, ide_drive_t *drive)
16826a940e21752e0de8f068f77dad606a7d1986937Pete Popov{
16988b2b32babd46cd54d2de4d17eb869aea3383e11Bartlomiej Zolnierkiewicz	int mem_sttime = 0, mem_stcfg = au_readl(MEM_STCFG2);
17026a940e21752e0de8f068f77dad606a7d1986937Pete Popov
1718776168ca2151850164af1de5565d01f7b8b2c53Bartlomiej Zolnierkiewicz	switch (drive->dma_mode) {
17226a940e21752e0de8f068f77dad606a7d1986937Pete Popov#ifdef CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA
1738f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	case XFER_MW_DMA_2:
1748f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse		mem_sttime = SBC_IDE_TIMING(MDMA2);
1758f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse
1768f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse		/* set configuration for RCS2# */
1778f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse		mem_stcfg &= ~TS_MASK;
1788f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse		mem_stcfg &= ~TCSOE_MASK;
1798f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse		mem_stcfg &= ~TOECS_MASK;
1808f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse		mem_stcfg |= SBC_IDE_MDMA2_TCSOE | SBC_IDE_MDMA2_TOECS;
1818f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse
1828f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse		break;
1838f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	case XFER_MW_DMA_1:
1848f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse		mem_sttime = SBC_IDE_TIMING(MDMA1);
1858f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse
1868f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse		/* set configuration for RCS2# */
1878f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse		mem_stcfg &= ~TS_MASK;
1888f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse		mem_stcfg &= ~TCSOE_MASK;
1898f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse		mem_stcfg &= ~TOECS_MASK;
1908f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse		mem_stcfg |= SBC_IDE_MDMA1_TCSOE | SBC_IDE_MDMA1_TOECS;
1918f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse
1928f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse		break;
1938f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	case XFER_MW_DMA_0:
1948f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse		mem_sttime = SBC_IDE_TIMING(MDMA0);
1958f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse
1968f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse		/* set configuration for RCS2# */
1978f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse		mem_stcfg |= TS_MASK;
1988f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse		mem_stcfg &= ~TCSOE_MASK;
1998f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse		mem_stcfg &= ~TOECS_MASK;
2008f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse		mem_stcfg |= SBC_IDE_MDMA0_TCSOE | SBC_IDE_MDMA0_TOECS;
2018f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse
2028f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse		break;
20326a940e21752e0de8f068f77dad606a7d1986937Pete Popov#endif
2048f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	}
205a523a1759a8b864ea3a7aff9ea4949dcdc4bc3b6Bartlomiej Zolnierkiewicz
2068f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	au_writel(mem_sttime,MEM_STTIME2);
2078f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	au_writel(mem_stcfg,MEM_STCFG2);
20826a940e21752e0de8f068f77dad606a7d1986937Pete Popov}
20926a940e21752e0de8f068f77dad606a7d1986937Pete Popov
21026a940e21752e0de8f068f77dad606a7d1986937Pete Popov/*
21126a940e21752e0de8f068f77dad606a7d1986937Pete Popov * Multi-Word DMA + DbDMA functions
21226a940e21752e0de8f068f77dad606a7d1986937Pete Popov */
21326a940e21752e0de8f068f77dad606a7d1986937Pete Popov
2148f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse#ifdef CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA
2152298169418f43ba5e0919762a4bab95a1227872aBartlomiej Zolnierkiewiczstatic int auide_build_dmatable(ide_drive_t *drive, struct ide_cmd *cmd)
21626a940e21752e0de8f068f77dad606a7d1986937Pete Popov{
217898ec223fea2a2df88035e58dbf50f493577e225Bartlomiej Zolnierkiewicz	ide_hwif_t *hwif = drive->hwif;
218a536f326a2223c951818e199e23847c2ac5e483bBartlomiej Zolnierkiewicz	_auide_hwif *ahwif = &auide_hwif;
2198f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	struct scatterlist *sg;
2202298169418f43ba5e0919762a4bab95a1227872aBartlomiej Zolnierkiewicz	int i = cmd->sg_nents, count = 0;
2212298169418f43ba5e0919762a4bab95a1227872aBartlomiej Zolnierkiewicz	int iswrite = !!(cmd->tf_flags & IDE_TFLAG_WRITE);
2228f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse
2238f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	/* Save for interrupt context */
2248f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	ahwif->drive = drive;
2258f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse
2268f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	/* fill the descriptors */
2278f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	sg = hwif->sg_table;
2288f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	while (i && sg_dma_len(sg)) {
2298f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse		u32 cur_addr;
2308f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse		u32 cur_len;
2318f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse
2328f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse		cur_addr = sg_dma_address(sg);
2338f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse		cur_len = sg_dma_len(sg);
2348f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse
2358f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse		while (cur_len) {
2368f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse			u32 flags = DDMA_FLAGS_NOIE;
2378f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse			unsigned int tc = (cur_len < 0xfe00)? cur_len: 0xfe00;
2388f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse
2398f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse			if (++count >= PRD_ENTRIES) {
2408f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse				printk(KERN_WARNING "%s: DMA table too small\n",
2418f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse				       drive->name);
24211998b316173f814698f9037ce9179d634d1f423Bartlomiej Zolnierkiewicz				return 0;
2438f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse			}
2448f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse
2458f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse			/* Lets enable intr for the last descriptor only */
2468f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse			if (1==i)
2478f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse				flags = DDMA_FLAGS_IE;
2488f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse			else
2498f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse				flags = DDMA_FLAGS_NOIE;
2508f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse
2518f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse			if (iswrite) {
252ea071cc705e8bfba0c8bf84be8d4f9f4e9da6962Manuel Lauss				if (!au1xxx_dbdma_put_source(ahwif->tx_chan,
253963accbc82a0912b39de39d59e2fd6741db3aa4bManuel Lauss					sg_phys(sg), tc, flags)) {
2548f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse					printk(KERN_ERR "%s failed %d\n",
255eb63963a55f039f049d0dd1121f91f332af6ecc9Harvey Harrison					       __func__, __LINE__);
25626a940e21752e0de8f068f77dad606a7d1986937Pete Popov				}
257ea071cc705e8bfba0c8bf84be8d4f9f4e9da6962Manuel Lauss			} else  {
258ea071cc705e8bfba0c8bf84be8d4f9f4e9da6962Manuel Lauss				if (!au1xxx_dbdma_put_dest(ahwif->rx_chan,
259963accbc82a0912b39de39d59e2fd6741db3aa4bManuel Lauss					sg_phys(sg), tc, flags)) {
2608f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse					printk(KERN_ERR "%s failed %d\n",
261eb63963a55f039f049d0dd1121f91f332af6ecc9Harvey Harrison					       __func__, __LINE__);
26226a940e21752e0de8f068f77dad606a7d1986937Pete Popov				}
2638f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse			}
26426a940e21752e0de8f068f77dad606a7d1986937Pete Popov
2658f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse			cur_addr += tc;
2668f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse			cur_len -= tc;
2678f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse		}
26855c16a70041ba55e235c5944dccb9c1de0dd3ca6Jens Axboe		sg = sg_next(sg);
2698f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse		i--;
2708f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	}
27126a940e21752e0de8f068f77dad606a7d1986937Pete Popov
2728f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	if (count)
2738f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse		return 1;
27426a940e21752e0de8f068f77dad606a7d1986937Pete Popov
2758f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	return 0; /* revert to PIO for this request */
27626a940e21752e0de8f068f77dad606a7d1986937Pete Popov}
27726a940e21752e0de8f068f77dad606a7d1986937Pete Popov
27826a940e21752e0de8f068f77dad606a7d1986937Pete Popovstatic int auide_dma_end(ide_drive_t *drive)
27926a940e21752e0de8f068f77dad606a7d1986937Pete Popov{
2808f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	return 0;
28126a940e21752e0de8f068f77dad606a7d1986937Pete Popov}
28226a940e21752e0de8f068f77dad606a7d1986937Pete Popov
28326a940e21752e0de8f068f77dad606a7d1986937Pete Popovstatic void auide_dma_start(ide_drive_t *drive )
28426a940e21752e0de8f068f77dad606a7d1986937Pete Popov{
28526a940e21752e0de8f068f77dad606a7d1986937Pete Popov}
28626a940e21752e0de8f068f77dad606a7d1986937Pete Popov
28726a940e21752e0de8f068f77dad606a7d1986937Pete Popov
2882298169418f43ba5e0919762a4bab95a1227872aBartlomiej Zolnierkiewiczstatic int auide_dma_setup(ide_drive_t *drive, struct ide_cmd *cmd)
289b65fac32cfe3b2f98cd472fef400bd1c1340de23Bartlomiej Zolnierkiewicz{
29011998b316173f814698f9037ce9179d634d1f423Bartlomiej Zolnierkiewicz	if (auide_build_dmatable(drive, cmd) == 0)
2918f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse		return 1;
29226a940e21752e0de8f068f77dad606a7d1986937Pete Popov
2938f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	return 0;
29426a940e21752e0de8f068f77dad606a7d1986937Pete Popov}
29526a940e21752e0de8f068f77dad606a7d1986937Pete Popov
29626a940e21752e0de8f068f77dad606a7d1986937Pete Popovstatic int auide_dma_test_irq(ide_drive_t *drive)
297c67c216d810a05fffdbdbdf1b81048f0d4759287Bartlomiej Zolnierkiewicz{
2988f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	/* If dbdma didn't execute the STOP command yet, the
2998f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	 * active bit is still set
30026a940e21752e0de8f068f77dad606a7d1986937Pete Popov	 */
3018f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	drive->waiting_for_dma++;
3028f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	if (drive->waiting_for_dma >= DMA_WAIT_TIMEOUT) {
303b1681c56f5b6bf551bed2617a395855055836571Joe Perches		printk(KERN_WARNING "%s: timeout waiting for ddma to complete\n",
304b1681c56f5b6bf551bed2617a395855055836571Joe Perches		       drive->name);
3058f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse		return 1;
3068f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	}
3078f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	udelay(10);
3088f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	return 0;
30926a940e21752e0de8f068f77dad606a7d1986937Pete Popov}
31026a940e21752e0de8f068f77dad606a7d1986937Pete Popov
31115ce926ada545cb078711bd9a18c083c93fa01d7Bartlomiej Zolnierkiewiczstatic void auide_dma_host_set(ide_drive_t *drive, int on)
31226a940e21752e0de8f068f77dad606a7d1986937Pete Popov{
31326a940e21752e0de8f068f77dad606a7d1986937Pete Popov}
31426a940e21752e0de8f068f77dad606a7d1986937Pete Popov
31553e62d3aaa60590d4a69b4e07c29f448b5151047Ralf Baechlestatic void auide_ddma_tx_callback(int irq, void *param)
31626a940e21752e0de8f068f77dad606a7d1986937Pete Popov{
31726a940e21752e0de8f068f77dad606a7d1986937Pete Popov}
31826a940e21752e0de8f068f77dad606a7d1986937Pete Popov
31953e62d3aaa60590d4a69b4e07c29f448b5151047Ralf Baechlestatic void auide_ddma_rx_callback(int irq, void *param)
32026a940e21752e0de8f068f77dad606a7d1986937Pete Popov{
3218f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse}
3228f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse#endif /* end CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA */
32326a940e21752e0de8f068f77dad606a7d1986937Pete Popov
324d4f07ae748539d792162a9aa56f192c3992cb3fbManuel Laussstatic void auide_init_dbdma_dev(dbdev_tab_t *dev, u32 dev_id, u32 tsize,
325d4f07ae748539d792162a9aa56f192c3992cb3fbManuel Lauss				 u32 devwidth, u32 flags, u32 regbase)
3268f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse{
3278f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	dev->dev_id          = dev_id;
328d4f07ae748539d792162a9aa56f192c3992cb3fbManuel Lauss	dev->dev_physaddr    = CPHYSADDR(regbase);
3298f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	dev->dev_intlevel    = 0;
3308f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	dev->dev_intpolarity = 0;
3318f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	dev->dev_tsize       = tsize;
3328f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	dev->dev_devwidth    = devwidth;
3338f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	dev->dev_flags       = flags;
33426a940e21752e0de8f068f77dad606a7d1986937Pete Popov}
33526a940e21752e0de8f068f77dad606a7d1986937Pete Popov
3365e37bdc081a980dd0d669e6387bcf15ca9666f81Bartlomiej Zolnierkiewicz#ifdef CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA
337f37afdaca711838b50ecd89b9c15fc745270d77cBartlomiej Zolnierkiewiczstatic const struct ide_dma_ops au1xxx_dma_ops = {
3385e37bdc081a980dd0d669e6387bcf15ca9666f81Bartlomiej Zolnierkiewicz	.dma_host_set		= auide_dma_host_set,
3395e37bdc081a980dd0d669e6387bcf15ca9666f81Bartlomiej Zolnierkiewicz	.dma_setup		= auide_dma_setup,
3405e37bdc081a980dd0d669e6387bcf15ca9666f81Bartlomiej Zolnierkiewicz	.dma_start		= auide_dma_start,
3415e37bdc081a980dd0d669e6387bcf15ca9666f81Bartlomiej Zolnierkiewicz	.dma_end		= auide_dma_end,
3425e37bdc081a980dd0d669e6387bcf15ca9666f81Bartlomiej Zolnierkiewicz	.dma_test_irq		= auide_dma_test_irq,
343de23ec9ca82357e6d337a2263befb1a65cf19c83Bartlomiej Zolnierkiewicz	.dma_lost_irq		= ide_dma_lost_irq,
3445e37bdc081a980dd0d669e6387bcf15ca9666f81Bartlomiej Zolnierkiewicz};
3455e37bdc081a980dd0d669e6387bcf15ca9666f81Bartlomiej Zolnierkiewicz
3468552865935538127d2603110b3d36dba2b4e8effBartlomiej Zolnierkiewiczstatic int auide_ddma_init(ide_hwif_t *hwif, const struct ide_port_info *d)
3478552865935538127d2603110b3d36dba2b4e8effBartlomiej Zolnierkiewicz{
348a536f326a2223c951818e199e23847c2ac5e483bBartlomiej Zolnierkiewicz	_auide_hwif *auide = &auide_hwif;
3498f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	dbdev_tab_t source_dev_tab, target_dev_tab;
3508f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	u32 dev_id, tsize, devwidth, flags;
35126a940e21752e0de8f068f77dad606a7d1986937Pete Popov
352d4f07ae748539d792162a9aa56f192c3992cb3fbManuel Lauss	dev_id	 = hwif->ddma_id;
35326a940e21752e0de8f068f77dad606a7d1986937Pete Popov
354f629b38beddf2ff8bc3fda1754bbd6cc7d3acc03Bartlomiej Zolnierkiewicz	tsize    =  8; /*  1 */
355f629b38beddf2ff8bc3fda1754bbd6cc7d3acc03Bartlomiej Zolnierkiewicz	devwidth = 32; /* 16 */
35626a940e21752e0de8f068f77dad606a7d1986937Pete Popov
3578f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse#ifdef IDE_AU1XXX_BURSTMODE
3588f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	flags = DEV_FLAGS_SYNC | DEV_FLAGS_BURSTABLE;
35926a940e21752e0de8f068f77dad606a7d1986937Pete Popov#else
3608f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	flags = DEV_FLAGS_SYNC;
36126a940e21752e0de8f068f77dad606a7d1986937Pete Popov#endif
36226a940e21752e0de8f068f77dad606a7d1986937Pete Popov
3638f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	/* setup dev_tab for tx channel */
364d4f07ae748539d792162a9aa56f192c3992cb3fbManuel Lauss	auide_init_dbdma_dev(&source_dev_tab, dev_id, tsize, devwidth,
365d4f07ae748539d792162a9aa56f192c3992cb3fbManuel Lauss			     DEV_FLAGS_OUT | flags, auide->regbase);
3668f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse 	auide->tx_dev_id = au1xxx_ddma_add_device( &source_dev_tab );
3678f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse
368d4f07ae748539d792162a9aa56f192c3992cb3fbManuel Lauss	auide_init_dbdma_dev(&source_dev_tab, dev_id, tsize, devwidth,
369d4f07ae748539d792162a9aa56f192c3992cb3fbManuel Lauss			     DEV_FLAGS_IN | flags, auide->regbase);
3708f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse 	auide->rx_dev_id = au1xxx_ddma_add_device( &source_dev_tab );
3718f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse
3728f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	/* We also need to add a target device for the DMA */
373d4f07ae748539d792162a9aa56f192c3992cb3fbManuel Lauss	auide_init_dbdma_dev(&target_dev_tab, (u32)DSCR_CMD0_ALWAYS, tsize,
374d4f07ae748539d792162a9aa56f192c3992cb3fbManuel Lauss			     devwidth, DEV_FLAGS_ANYUSE, auide->regbase);
3758f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	auide->target_dev_id = au1xxx_ddma_add_device(&target_dev_tab);
3768f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse
3778f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	/* Get a channel for TX */
3788f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	auide->tx_chan = au1xxx_dbdma_chan_alloc(auide->target_dev_id,
3798f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse						 auide->tx_dev_id,
3808f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse						 auide_ddma_tx_callback,
3818f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse						 (void*)auide);
3828f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse
3838f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	/* Get a channel for RX */
3848f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	auide->rx_chan = au1xxx_dbdma_chan_alloc(auide->rx_dev_id,
3858f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse						 auide->target_dev_id,
3868f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse						 auide_ddma_rx_callback,
3878f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse						 (void*)auide);
3888f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse
3898f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	auide->tx_desc_head = (void*)au1xxx_dbdma_ring_alloc(auide->tx_chan,
3908f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse							     NUM_DESCRIPTORS);
3918f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	auide->rx_desc_head = (void*)au1xxx_dbdma_ring_alloc(auide->rx_chan,
3928f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse							     NUM_DESCRIPTORS);
3932bbd57cad3d72334c9fcc4e229a5a5b04dc6aebcBartlomiej Zolnierkiewicz
3942bbd57cad3d72334c9fcc4e229a5a5b04dc6aebcBartlomiej Zolnierkiewicz	/* FIXME: check return value */
3952bbd57cad3d72334c9fcc4e229a5a5b04dc6aebcBartlomiej Zolnierkiewicz	(void)ide_allocate_dma_engine(hwif);
3968f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse
3978f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	au1xxx_dbdma_start( auide->tx_chan );
3988f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	au1xxx_dbdma_start( auide->rx_chan );
3998f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse
4008f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	return 0;
4018f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse}
40226a940e21752e0de8f068f77dad606a7d1986937Pete Popov#else
4038552865935538127d2603110b3d36dba2b4e8effBartlomiej Zolnierkiewiczstatic int auide_ddma_init(ide_hwif_t *hwif, const struct ide_port_info *d)
4048f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse{
405a536f326a2223c951818e199e23847c2ac5e483bBartlomiej Zolnierkiewicz	_auide_hwif *auide = &auide_hwif;
4068f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	dbdev_tab_t source_dev_tab;
4078f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	int flags;
40826a940e21752e0de8f068f77dad606a7d1986937Pete Popov
4098f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse#ifdef IDE_AU1XXX_BURSTMODE
4108f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	flags = DEV_FLAGS_SYNC | DEV_FLAGS_BURSTABLE;
4118f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse#else
4128f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	flags = DEV_FLAGS_SYNC;
41326a940e21752e0de8f068f77dad606a7d1986937Pete Popov#endif
41426a940e21752e0de8f068f77dad606a7d1986937Pete Popov
4158f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	/* setup dev_tab for tx channel */
416d4f07ae748539d792162a9aa56f192c3992cb3fbManuel Lauss	auide_init_dbdma_dev(&source_dev_tab, (u32)DSCR_CMD0_ALWAYS, 8, 32,
417d4f07ae748539d792162a9aa56f192c3992cb3fbManuel Lauss			     DEV_FLAGS_OUT | flags, auide->regbase);
4188f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse 	auide->tx_dev_id = au1xxx_ddma_add_device( &source_dev_tab );
4198f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse
420d4f07ae748539d792162a9aa56f192c3992cb3fbManuel Lauss	auide_init_dbdma_dev(&source_dev_tab, (u32)DSCR_CMD0_ALWAYS, 8, 32,
421d4f07ae748539d792162a9aa56f192c3992cb3fbManuel Lauss			     DEV_FLAGS_IN | flags, auide->regbase);
4228f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse 	auide->rx_dev_id = au1xxx_ddma_add_device( &source_dev_tab );
4238f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse
4248f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	/* Get a channel for TX */
4258f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	auide->tx_chan = au1xxx_dbdma_chan_alloc(DSCR_CMD0_ALWAYS,
4268f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse						 auide->tx_dev_id,
4278f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse						 NULL,
4288f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse						 (void*)auide);
4298f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse
4308f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	/* Get a channel for RX */
4318f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	auide->rx_chan = au1xxx_dbdma_chan_alloc(auide->rx_dev_id,
4328f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse						 DSCR_CMD0_ALWAYS,
4338f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse						 NULL,
4348f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse						 (void*)auide);
4358f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse
4368f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	auide->tx_desc_head = (void*)au1xxx_dbdma_ring_alloc(auide->tx_chan,
4378f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse							     NUM_DESCRIPTORS);
4388f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	auide->rx_desc_head = (void*)au1xxx_dbdma_ring_alloc(auide->rx_chan,
4398f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse							     NUM_DESCRIPTORS);
4408f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse
4418f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	au1xxx_dbdma_start( auide->tx_chan );
4428f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	au1xxx_dbdma_start( auide->rx_chan );
4438f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse
4448f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	return 0;
44526a940e21752e0de8f068f77dad606a7d1986937Pete Popov}
4468f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse#endif
44726a940e21752e0de8f068f77dad606a7d1986937Pete Popov
4489f36d31437922354d104a2db407f397e79e4027eBartlomiej Zolnierkiewiczstatic void auide_setup_ports(struct ide_hw *hw, _auide_hwif *ahwif)
44926a940e21752e0de8f068f77dad606a7d1986937Pete Popov{
4508f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	int i;
4514c3032d8a4d6c97bd6e02bcab524ef2428d89561Bartlomiej Zolnierkiewicz	unsigned long *ata_regs = hw->io_ports_array;
4528f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse
4538f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	/* FIXME? */
4544c3032d8a4d6c97bd6e02bcab524ef2428d89561Bartlomiej Zolnierkiewicz	for (i = 0; i < 8; i++)
455fcbd3b4b92efe29b59df16b910138cf43683be88Sergei Shtylyov		*ata_regs++ = ahwif->regbase + (i << IDE_REG_SHIFT);
4568f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse
4578f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	/* set the Alternative Status register */
458fcbd3b4b92efe29b59df16b910138cf43683be88Sergei Shtylyov	*ata_regs = ahwif->regbase + (14 << IDE_REG_SHIFT);
45926a940e21752e0de8f068f77dad606a7d1986937Pete Popov}
46026a940e21752e0de8f068f77dad606a7d1986937Pete Popov
461374e042c3e767ac2e5a40b78529220e0b3de793cBartlomiej Zolnierkiewicz#ifdef CONFIG_BLK_DEV_IDE_AU1XXX_PIO_DBDMA
462374e042c3e767ac2e5a40b78529220e0b3de793cBartlomiej Zolnierkiewiczstatic const struct ide_tp_ops au1xxx_tp_ops = {
463374e042c3e767ac2e5a40b78529220e0b3de793cBartlomiej Zolnierkiewicz	.exec_command		= ide_exec_command,
464374e042c3e767ac2e5a40b78529220e0b3de793cBartlomiej Zolnierkiewicz	.read_status		= ide_read_status,
465374e042c3e767ac2e5a40b78529220e0b3de793cBartlomiej Zolnierkiewicz	.read_altstatus		= ide_read_altstatus,
466ecf3a31d2a08a419bdf919456f1724f5b72bde2cSergei Shtylyov	.write_devctl		= ide_write_devctl,
467374e042c3e767ac2e5a40b78529220e0b3de793cBartlomiej Zolnierkiewicz
468abb596b25edac1ec1acc4ef53df190771661c3d2Sergei Shtylyov	.dev_select		= ide_dev_select,
469374e042c3e767ac2e5a40b78529220e0b3de793cBartlomiej Zolnierkiewicz	.tf_load		= ide_tf_load,
470374e042c3e767ac2e5a40b78529220e0b3de793cBartlomiej Zolnierkiewicz	.tf_read		= ide_tf_read,
471374e042c3e767ac2e5a40b78529220e0b3de793cBartlomiej Zolnierkiewicz
472374e042c3e767ac2e5a40b78529220e0b3de793cBartlomiej Zolnierkiewicz	.input_data		= au1xxx_input_data,
473374e042c3e767ac2e5a40b78529220e0b3de793cBartlomiej Zolnierkiewicz	.output_data		= au1xxx_output_data,
474374e042c3e767ac2e5a40b78529220e0b3de793cBartlomiej Zolnierkiewicz};
475374e042c3e767ac2e5a40b78529220e0b3de793cBartlomiej Zolnierkiewicz#endif
476374e042c3e767ac2e5a40b78529220e0b3de793cBartlomiej Zolnierkiewicz
477ac95beedf8bc97b24f9540d4da9952f07221c023Bartlomiej Zolnierkiewiczstatic const struct ide_port_ops au1xxx_port_ops = {
478ac95beedf8bc97b24f9540d4da9952f07221c023Bartlomiej Zolnierkiewicz	.set_pio_mode		= au1xxx_set_pio_mode,
479ac95beedf8bc97b24f9540d4da9952f07221c023Bartlomiej Zolnierkiewicz	.set_dma_mode		= auide_set_dma_mode,
480ac95beedf8bc97b24f9540d4da9952f07221c023Bartlomiej Zolnierkiewicz};
481ac95beedf8bc97b24f9540d4da9952f07221c023Bartlomiej Zolnierkiewicz
482c413b9b94d9a8e7548cc4b2e04b7df0439ce76fdBartlomiej Zolnierkiewiczstatic const struct ide_port_info au1xxx_port_info = {
4838552865935538127d2603110b3d36dba2b4e8effBartlomiej Zolnierkiewicz	.init_dma		= auide_ddma_init,
484374e042c3e767ac2e5a40b78529220e0b3de793cBartlomiej Zolnierkiewicz#ifdef CONFIG_BLK_DEV_IDE_AU1XXX_PIO_DBDMA
485374e042c3e767ac2e5a40b78529220e0b3de793cBartlomiej Zolnierkiewicz	.tp_ops			= &au1xxx_tp_ops,
486374e042c3e767ac2e5a40b78529220e0b3de793cBartlomiej Zolnierkiewicz#endif
487ac95beedf8bc97b24f9540d4da9952f07221c023Bartlomiej Zolnierkiewicz	.port_ops		= &au1xxx_port_ops,
4885e37bdc081a980dd0d669e6387bcf15ca9666f81Bartlomiej Zolnierkiewicz#ifdef CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA
4895e37bdc081a980dd0d669e6387bcf15ca9666f81Bartlomiej Zolnierkiewicz	.dma_ops		= &au1xxx_dma_ops,
4905e37bdc081a980dd0d669e6387bcf15ca9666f81Bartlomiej Zolnierkiewicz#endif
491c413b9b94d9a8e7548cc4b2e04b7df0439ce76fdBartlomiej Zolnierkiewicz	.host_flags		= IDE_HFLAG_POST_SET_MODE |
492807b90d0be23b8d088d4369b02539dada70f03f4Bartlomiej Zolnierkiewicz				  IDE_HFLAG_NO_IO_32BIT |
493c413b9b94d9a8e7548cc4b2e04b7df0439ce76fdBartlomiej Zolnierkiewicz				  IDE_HFLAG_UNMASK_IRQS,
494c413b9b94d9a8e7548cc4b2e04b7df0439ce76fdBartlomiej Zolnierkiewicz	.pio_mask		= ATA_PIO4,
495c413b9b94d9a8e7548cc4b2e04b7df0439ce76fdBartlomiej Zolnierkiewicz#ifdef CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA
496c413b9b94d9a8e7548cc4b2e04b7df0439ce76fdBartlomiej Zolnierkiewicz	.mwdma_mask		= ATA_MWDMA2,
497c413b9b94d9a8e7548cc4b2e04b7df0439ce76fdBartlomiej Zolnierkiewicz#endif
49829e52cf793ded6bece50de50e738596f94f07d9fBartlomiej Zolnierkiewicz	.chipset		= ide_au1xxx,
499c413b9b94d9a8e7548cc4b2e04b7df0439ce76fdBartlomiej Zolnierkiewicz};
500c413b9b94d9a8e7548cc4b2e04b7df0439ce76fdBartlomiej Zolnierkiewicz
5017a192ec334cab9fafe3a8665a65af398b0e24730Ming Leistatic int au_ide_probe(struct platform_device *dev)
50226a940e21752e0de8f068f77dad606a7d1986937Pete Popov{
5038f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	_auide_hwif *ahwif = &auide_hwif;
50426a940e21752e0de8f068f77dad606a7d1986937Pete Popov	struct resource *res;
50548c3c1072651922ed153bcf0a33ea82cf20df390Bartlomiej Zolnierkiewicz	struct ide_host *host;
50626a940e21752e0de8f068f77dad606a7d1986937Pete Popov	int ret = 0;
5079f36d31437922354d104a2db407f397e79e4027eBartlomiej Zolnierkiewicz	struct ide_hw hw, *hws[] = { &hw };
50826a940e21752e0de8f068f77dad606a7d1986937Pete Popov
50926a940e21752e0de8f068f77dad606a7d1986937Pete Popov#if defined(CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA)
5108f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	char *mode = "MWDMA2";
51126a940e21752e0de8f068f77dad606a7d1986937Pete Popov#elif defined(CONFIG_BLK_DEV_IDE_AU1XXX_PIO_DBDMA)
5128f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	char *mode = "PIO+DDMA(offload)";
51326a940e21752e0de8f068f77dad606a7d1986937Pete Popov#endif
51426a940e21752e0de8f068f77dad606a7d1986937Pete Popov
5158f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	memset(&auide_hwif, 0, sizeof(_auide_hwif));
5167a192ec334cab9fafe3a8665a65af398b0e24730Ming Lei	ahwif->irq = platform_get_irq(dev, 0);
51726a940e21752e0de8f068f77dad606a7d1986937Pete Popov
5187a192ec334cab9fafe3a8665a65af398b0e24730Ming Lei	res = platform_get_resource(dev, IORESOURCE_MEM, 0);
51926a940e21752e0de8f068f77dad606a7d1986937Pete Popov
52026a940e21752e0de8f068f77dad606a7d1986937Pete Popov	if (res == NULL) {
5217a192ec334cab9fafe3a8665a65af398b0e24730Ming Lei		pr_debug("%s %d: no base address\n", DRV_NAME, dev->id);
52226a940e21752e0de8f068f77dad606a7d1986937Pete Popov		ret = -ENODEV;
523489447380a2921ec0e9154f773c44ab3167ede4bDavid Vrabel		goto out;
524489447380a2921ec0e9154f773c44ab3167ede4bDavid Vrabel	}
525489447380a2921ec0e9154f773c44ab3167ede4bDavid Vrabel	if (ahwif->irq < 0) {
5267a192ec334cab9fafe3a8665a65af398b0e24730Ming Lei		pr_debug("%s %d: no IRQ\n", DRV_NAME, dev->id);
527489447380a2921ec0e9154f773c44ab3167ede4bDavid Vrabel		ret = -ENODEV;
52826a940e21752e0de8f068f77dad606a7d1986937Pete Popov		goto out;
52926a940e21752e0de8f068f77dad606a7d1986937Pete Popov	}
53026a940e21752e0de8f068f77dad606a7d1986937Pete Popov
5314b7c7237c0826417059d2e60ffe6ed43202dc087H Hartley Sweeten	if (!request_mem_region(res->start, resource_size(res), dev->name)) {
53226a940e21752e0de8f068f77dad606a7d1986937Pete Popov		pr_debug("%s: request_mem_region failed\n", DRV_NAME);
5338f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse		ret =  -EBUSY;
53426a940e21752e0de8f068f77dad606a7d1986937Pete Popov		goto out;
5358f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	}
53626a940e21752e0de8f068f77dad606a7d1986937Pete Popov
5374b7c7237c0826417059d2e60ffe6ed43202dc087H Hartley Sweeten	ahwif->regbase = (u32)ioremap(res->start, resource_size(res));
53826a940e21752e0de8f068f77dad606a7d1986937Pete Popov	if (ahwif->regbase == 0) {
53926a940e21752e0de8f068f77dad606a7d1986937Pete Popov		ret = -ENOMEM;
54026a940e21752e0de8f068f77dad606a7d1986937Pete Popov		goto out;
54126a940e21752e0de8f068f77dad606a7d1986937Pete Popov	}
54226a940e21752e0de8f068f77dad606a7d1986937Pete Popov
543d4f07ae748539d792162a9aa56f192c3992cb3fbManuel Lauss	res = platform_get_resource(dev, IORESOURCE_DMA, 0);
544d4f07ae748539d792162a9aa56f192c3992cb3fbManuel Lauss	if (!res) {
545d4f07ae748539d792162a9aa56f192c3992cb3fbManuel Lauss		pr_debug("%s: no DDMA ID resource\n", DRV_NAME);
546d4f07ae748539d792162a9aa56f192c3992cb3fbManuel Lauss		ret = -ENODEV;
547d4f07ae748539d792162a9aa56f192c3992cb3fbManuel Lauss		goto out;
548d4f07ae748539d792162a9aa56f192c3992cb3fbManuel Lauss	}
549d4f07ae748539d792162a9aa56f192c3992cb3fbManuel Lauss	ahwif->ddma_id = res->start;
550d4f07ae748539d792162a9aa56f192c3992cb3fbManuel Lauss
5519239b333939dd1e5b1a9f033a1c136273d58efe8Bartlomiej Zolnierkiewicz	memset(&hw, 0, sizeof(hw));
5529239b333939dd1e5b1a9f033a1c136273d58efe8Bartlomiej Zolnierkiewicz	auide_setup_ports(&hw, ahwif);
553aa79a2faa01ded0a6a4929dd37c059bef4890838Bartlomiej Zolnierkiewicz	hw.irq = ahwif->irq;
5547a192ec334cab9fafe3a8665a65af398b0e24730Ming Lei	hw.dev = &dev->dev;
555aa79a2faa01ded0a6a4929dd37c059bef4890838Bartlomiej Zolnierkiewicz
556dca3983059a4481e4ae97bbf0ac4b4c21429e1a5Bartlomiej Zolnierkiewicz	ret = ide_host_add(&au1xxx_port_info, hws, 1, &host);
5576f904d015262dfa43eb1cecc00b0998b4c3543f2Bartlomiej Zolnierkiewicz	if (ret)
55848c3c1072651922ed153bcf0a33ea82cf20df390Bartlomiej Zolnierkiewicz		goto out;
5595cbf79cdb37be2aa2a1b4fa94144526b14557060Bartlomiej Zolnierkiewicz
56048c3c1072651922ed153bcf0a33ea82cf20df390Bartlomiej Zolnierkiewicz	auide_hwif.hwif = host->ports[0];
5615cbf79cdb37be2aa2a1b4fa94144526b14557060Bartlomiej Zolnierkiewicz
5627a192ec334cab9fafe3a8665a65af398b0e24730Ming Lei	platform_set_drvdata(dev, host);
56326a940e21752e0de8f068f77dad606a7d1986937Pete Popov
5648f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	printk(KERN_INFO "Au1xxx IDE(builtin) configured for %s\n", mode );
56526a940e21752e0de8f068f77dad606a7d1986937Pete Popov
5668f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse out:
5678f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	return ret;
56826a940e21752e0de8f068f77dad606a7d1986937Pete Popov}
56926a940e21752e0de8f068f77dad606a7d1986937Pete Popov
5707a192ec334cab9fafe3a8665a65af398b0e24730Ming Leistatic int au_ide_remove(struct platform_device *dev)
57126a940e21752e0de8f068f77dad606a7d1986937Pete Popov{
57226a940e21752e0de8f068f77dad606a7d1986937Pete Popov	struct resource *res;
5737a192ec334cab9fafe3a8665a65af398b0e24730Ming Lei	struct ide_host *host = platform_get_drvdata(dev);
5748f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crouse	_auide_hwif *ahwif = &auide_hwif;
57526a940e21752e0de8f068f77dad606a7d1986937Pete Popov
57648c3c1072651922ed153bcf0a33ea82cf20df390Bartlomiej Zolnierkiewicz	ide_host_remove(host);
57726a940e21752e0de8f068f77dad606a7d1986937Pete Popov
57826a940e21752e0de8f068f77dad606a7d1986937Pete Popov	iounmap((void *)ahwif->regbase);
57926a940e21752e0de8f068f77dad606a7d1986937Pete Popov
5807a192ec334cab9fafe3a8665a65af398b0e24730Ming Lei	res = platform_get_resource(dev, IORESOURCE_MEM, 0);
5814b7c7237c0826417059d2e60ffe6ed43202dc087H Hartley Sweeten	release_mem_region(res->start, resource_size(res));
58226a940e21752e0de8f068f77dad606a7d1986937Pete Popov
58326a940e21752e0de8f068f77dad606a7d1986937Pete Popov	return 0;
58426a940e21752e0de8f068f77dad606a7d1986937Pete Popov}
58526a940e21752e0de8f068f77dad606a7d1986937Pete Popov
5867a192ec334cab9fafe3a8665a65af398b0e24730Ming Leistatic struct platform_driver au1200_ide_driver = {
5877a192ec334cab9fafe3a8665a65af398b0e24730Ming Lei	.driver = {
5887a192ec334cab9fafe3a8665a65af398b0e24730Ming Lei		.name		= "au1200-ide",
5897a192ec334cab9fafe3a8665a65af398b0e24730Ming Lei		.owner		= THIS_MODULE,
5907a192ec334cab9fafe3a8665a65af398b0e24730Ming Lei	},
59126a940e21752e0de8f068f77dad606a7d1986937Pete Popov	.probe 		= au_ide_probe,
59226a940e21752e0de8f068f77dad606a7d1986937Pete Popov	.remove		= au_ide_remove,
59326a940e21752e0de8f068f77dad606a7d1986937Pete Popov};
59426a940e21752e0de8f068f77dad606a7d1986937Pete Popov
59526a940e21752e0de8f068f77dad606a7d1986937Pete Popovstatic int __init au_ide_init(void)
59626a940e21752e0de8f068f77dad606a7d1986937Pete Popov{
5977a192ec334cab9fafe3a8665a65af398b0e24730Ming Lei	return platform_driver_register(&au1200_ide_driver);
59826a940e21752e0de8f068f77dad606a7d1986937Pete Popov}
59926a940e21752e0de8f068f77dad606a7d1986937Pete Popov
6008f29e650bffc1e22ed6b2d0b321bc77627f3bb7aJordan Crousestatic void __exit au_ide_exit(void)
60126a940e21752e0de8f068f77dad606a7d1986937Pete Popov{
6027a192ec334cab9fafe3a8665a65af398b0e24730Ming Lei	platform_driver_unregister(&au1200_ide_driver);
60326a940e21752e0de8f068f77dad606a7d1986937Pete Popov}
60426a940e21752e0de8f068f77dad606a7d1986937Pete Popov
60526a940e21752e0de8f068f77dad606a7d1986937Pete PopovMODULE_LICENSE("GPL");
60626a940e21752e0de8f068f77dad606a7d1986937Pete PopovMODULE_DESCRIPTION("AU1200 IDE driver");
60726a940e21752e0de8f068f77dad606a7d1986937Pete Popov
60826a940e21752e0de8f068f77dad606a7d1986937Pete Popovmodule_init(au_ide_init);
60926a940e21752e0de8f068f77dad606a7d1986937Pete Popovmodule_exit(au_ide_exit);
610