Linux kernel & device driver programming

Cross-Referenced Linux and Device Driver Code

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