1/* 2 * Copyright (c) 1996-2002 Russell King. 3 */ 4 5#include <linux/module.h> 6#include <linux/blkdev.h> 7#include <linux/errno.h> 8#include <linux/ide.h> 9#include <linux/init.h> 10 11#include <asm/ecard.h> 12 13static const struct ide_port_info rapide_port_info = { 14 .host_flags = IDE_HFLAG_MMIO | IDE_HFLAG_NO_DMA, 15 .chipset = ide_generic, 16}; 17 18static void rapide_setup_ports(struct ide_hw *hw, void __iomem *base, 19 void __iomem *ctrl, unsigned int sz, int irq) 20{ 21 unsigned long port = (unsigned long)base; 22 int i; 23 24 for (i = 0; i <= 7; i++) { 25 hw->io_ports_array[i] = port; 26 port += sz; 27 } 28 hw->io_ports.ctl_addr = (unsigned long)ctrl; 29 hw->irq = irq; 30} 31 32static int __devinit 33rapide_probe(struct expansion_card *ec, const struct ecard_id *id) 34{ 35 void __iomem *base; 36 struct ide_host *host; 37 int ret; 38 struct ide_hw hw, *hws[] = { &hw }; 39 40 ret = ecard_request_resources(ec); 41 if (ret) 42 goto out; 43 44 base = ecardm_iomap(ec, ECARD_RES_MEMC, 0, 0); 45 if (!base) { 46 ret = -ENOMEM; 47 goto release; 48 } 49 50 memset(&hw, 0, sizeof(hw)); 51 rapide_setup_ports(&hw, base, base + 0x818, 1 << 6, ec->irq); 52 hw.dev = &ec->dev; 53 54 ret = ide_host_add(&rapide_port_info, hws, 1, &host); 55 if (ret) 56 goto release; 57 58 ecard_set_drvdata(ec, host); 59 goto out; 60 61 release: 62 ecard_release_resources(ec); 63 out: 64 return ret; 65} 66 67static void __devexit rapide_remove(struct expansion_card *ec) 68{ 69 struct ide_host *host = ecard_get_drvdata(ec); 70 71 ecard_set_drvdata(ec, NULL); 72 73 ide_host_remove(host); 74 75 ecard_release_resources(ec); 76} 77 78static struct ecard_id rapide_ids[] = { 79 { MANU_YELLOWSTONE, PROD_YELLOWSTONE_RAPIDE32 }, 80 { 0xffff, 0xffff } 81}; 82 83static struct ecard_driver rapide_driver = { 84 .probe = rapide_probe, 85 .remove = __devexit_p(rapide_remove), 86 .id_table = rapide_ids, 87 .drv = { 88 .name = "rapide", 89 }, 90}; 91 92static int __init rapide_init(void) 93{ 94 return ecard_register_driver(&rapide_driver); 95} 96 97static void __exit rapide_exit(void) 98{ 99 ecard_remove_driver(&rapide_driver); 100} 101 102MODULE_LICENSE("GPL"); 103MODULE_DESCRIPTION("Yellowstone RAPIDE driver"); 104 105module_init(rapide_init); 106module_exit(rapide_exit); 107