This source file includes following definitions.
- parport_probe
 
- parport_detach
 
- parport_config_check
 
- parport_config
 
- parport_cs_release
 
   1 
   2 
   3 
   4 
   5 
   6 
   7 
   8 
   9 
  10 
  11 
  12 
  13 
  14 
  15 
  16 
  17 
  18 
  19 
  20 
  21 
  22 
  23 
  24 
  25 
  26 
  27 
  28 
  29 
  30 
  31 
  32 
  33 
  34 
  35 
  36 
  37 #include <linux/kernel.h>
  38 #include <linux/module.h>
  39 #include <linux/init.h>
  40 #include <linux/ptrace.h>
  41 #include <linux/slab.h>
  42 #include <linux/string.h>
  43 #include <linux/timer.h>
  44 #include <linux/ioport.h>
  45 #include <linux/major.h>
  46 #include <linux/interrupt.h>
  47 
  48 #include <linux/parport.h>
  49 #include <linux/parport_pc.h>
  50 
  51 #include <pcmcia/cistpl.h>
  52 #include <pcmcia/ds.h>
  53 #include <pcmcia/cisreg.h>
  54 #include <pcmcia/ciscode.h>
  55 
  56 
  57 
  58 
  59 
  60 MODULE_AUTHOR("David Hinds <dahinds@users.sourceforge.net>");
  61 MODULE_DESCRIPTION("PCMCIA parallel port card driver");
  62 MODULE_LICENSE("Dual MPL/GPL");
  63 
  64 #define INT_MODULE_PARM(n, v) static int n = v; module_param(n, int, 0)
  65 
  66 INT_MODULE_PARM(epp_mode, 1);
  67 
  68 
  69 
  70 
  71 #define FORCE_EPP_MODE  0x08
  72 
  73 typedef struct parport_info_t {
  74         struct pcmcia_device    *p_dev;
  75     int                 ndev;
  76     struct parport      *port;
  77 } parport_info_t;
  78 
  79 static void parport_detach(struct pcmcia_device *p_dev);
  80 static int parport_config(struct pcmcia_device *link);
  81 static void parport_cs_release(struct pcmcia_device *);
  82 
  83 static int parport_probe(struct pcmcia_device *link)
  84 {
  85     parport_info_t *info;
  86 
  87     dev_dbg(&link->dev, "parport_attach()\n");
  88 
  89     
  90     info = kzalloc(sizeof(*info), GFP_KERNEL);
  91     if (!info) return -ENOMEM;
  92     link->priv = info;
  93     info->p_dev = link;
  94 
  95     link->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_SET_IO;
  96 
  97     return parport_config(link);
  98 } 
  99 
 100 static void parport_detach(struct pcmcia_device *link)
 101 {
 102     dev_dbg(&link->dev, "parport_detach\n");
 103 
 104     parport_cs_release(link);
 105 
 106     kfree(link->priv);
 107 } 
 108 
 109 static int parport_config_check(struct pcmcia_device *p_dev, void *priv_data)
 110 {
 111         p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH;
 112         p_dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_8;
 113         p_dev->resource[1]->flags &= ~IO_DATA_PATH_WIDTH;
 114         p_dev->resource[1]->flags |= IO_DATA_PATH_WIDTH_8;
 115 
 116         return pcmcia_request_io(p_dev);
 117 }
 118 
 119 static int parport_config(struct pcmcia_device *link)
 120 {
 121     parport_info_t *info = link->priv;
 122     struct parport *p;
 123     int ret;
 124 
 125     dev_dbg(&link->dev, "parport_config\n");
 126 
 127     if (epp_mode)
 128             link->config_index |= FORCE_EPP_MODE;
 129 
 130     ret = pcmcia_loop_config(link, parport_config_check, NULL);
 131     if (ret)
 132             goto failed;
 133 
 134     if (!link->irq)
 135             goto failed;
 136     ret = pcmcia_enable_device(link);
 137     if (ret)
 138             goto failed;
 139 
 140     p = parport_pc_probe_port(link->resource[0]->start,
 141                               link->resource[1]->start,
 142                               link->irq, PARPORT_DMA_NONE,
 143                               &link->dev, IRQF_SHARED);
 144     if (p == NULL) {
 145         printk(KERN_NOTICE "parport_cs: parport_pc_probe_port() at "
 146                "0x%3x, irq %u failed\n",
 147                (unsigned int) link->resource[0]->start,
 148                link->irq);
 149         goto failed;
 150     }
 151 
 152     p->modes |= PARPORT_MODE_PCSPP;
 153     if (epp_mode)
 154         p->modes |= PARPORT_MODE_TRISTATE | PARPORT_MODE_EPP;
 155     info->ndev = 1;
 156     info->port = p;
 157 
 158     return 0;
 159 
 160 failed:
 161         parport_cs_release(link);
 162         kfree(link->priv);
 163         return -ENODEV;
 164 } 
 165 
 166 static void parport_cs_release(struct pcmcia_device *link)
 167 {
 168         parport_info_t *info = link->priv;
 169 
 170         dev_dbg(&link->dev, "parport_release\n");
 171 
 172         if (info->ndev) {
 173                 struct parport *p = info->port;
 174                 parport_pc_unregister_port(p);
 175         }
 176         info->ndev = 0;
 177 
 178         pcmcia_disable_device(link);
 179 } 
 180 
 181 
 182 static const struct pcmcia_device_id parport_ids[] = {
 183         PCMCIA_DEVICE_FUNC_ID(3),
 184         PCMCIA_MFC_DEVICE_PROD_ID12(1,"Elan","Serial+Parallel Port: SP230",0x3beb8cf2,0xdb9e58bc),
 185         PCMCIA_DEVICE_MANF_CARD(0x0137, 0x0003),
 186         PCMCIA_DEVICE_NULL
 187 };
 188 MODULE_DEVICE_TABLE(pcmcia, parport_ids);
 189 
 190 static struct pcmcia_driver parport_cs_driver = {
 191         .owner          = THIS_MODULE,
 192         .name           = "parport_cs",
 193         .probe          = parport_probe,
 194         .remove         = parport_detach,
 195         .id_table       = parport_ids,
 196 };
 197 module_pcmcia_driver(parport_cs_driver);