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 rapide_probe(struct expansion_card *ec, const struct ecard_id *id) 33{ 34 void __iomem *base; 35 struct ide_host *host; 36 int ret; 37 struct ide_hw hw, *hws[] = { &hw }; 38 39 ret = ecard_request_resources(ec); 40 if (ret) 41 goto out; 42 43 base = ecardm_iomap(ec, ECARD_RES_MEMC, 0, 0); 44 if (!base) { 45 ret = -ENOMEM; 46 goto release; 47 } 48 49 memset(&hw, 0, sizeof(hw)); 50 rapide_setup_ports(&hw, base, base + 0x818, 1 << 6, ec->irq); 51 hw.dev = &ec->dev; 52 53 ret = ide_host_add(&rapide_port_info, hws, 1, &host); 54 if (ret) 55 goto release; 56 57 ecard_set_drvdata(ec, host); 58 goto out; 59 60 release: 61 ecard_release_resources(ec); 62 out: 63 return ret; 64} 65 66static void rapide_remove(struct expansion_card *ec) 67{ 68 struct ide_host *host = ecard_get_drvdata(ec); 69 70 ecard_set_drvdata(ec, NULL); 71 72 ide_host_remove(host); 73 74 ecard_release_resources(ec); 75} 76 77static struct ecard_id rapide_ids[] = { 78 { MANU_YELLOWSTONE, PROD_YELLOWSTONE_RAPIDE32 }, 79 { 0xffff, 0xffff } 80}; 81 82static struct ecard_driver rapide_driver = { 83 .probe = rapide_probe, 84 .remove = rapide_remove, 85 .id_table = rapide_ids, 86 .drv = { 87 .name = "rapide", 88 }, 89}; 90 91static int __init rapide_init(void) 92{ 93 return ecard_register_driver(&rapide_driver); 94} 95 96static void __exit rapide_exit(void) 97{ 98 ecard_remove_driver(&rapide_driver); 99} 100 101MODULE_LICENSE("GPL"); 102MODULE_DESCRIPTION("Yellowstone RAPIDE driver"); 103 104module_init(rapide_init); 105module_exit(rapide_exit); 106