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