linux/drivers/telephony/ixj_pcmcia.c
<<
>>
Prefs
   1#include "ixj-ver.h"
   2
   3#include <linux/module.h>
   4
   5#include <linux/init.h>
   6#include <linux/kernel.h>       /* printk() */
   7#include <linux/fs.h>           /* everything... */
   8#include <linux/errno.h>        /* error codes */
   9#include <linux/slab.h>
  10
  11#include <pcmcia/cs_types.h>
  12#include <pcmcia/cs.h>
  13#include <pcmcia/cistpl.h>
  14#include <pcmcia/ds.h>
  15
  16#include "ixj.h"
  17
  18/*
  19 *      PCMCIA service support for Quicknet cards
  20 */
  21 
  22
  23typedef struct ixj_info_t {
  24        int ndev;
  25        struct ixj *port;
  26} ixj_info_t;
  27
  28static void ixj_detach(struct pcmcia_device *p_dev);
  29static int ixj_config(struct pcmcia_device * link);
  30static void ixj_cs_release(struct pcmcia_device * link);
  31
  32static int ixj_probe(struct pcmcia_device *p_dev)
  33{
  34        dev_dbg(&p_dev->dev, "ixj_attach()\n");
  35        /* Create new ixj device */
  36        p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
  37        p_dev->io.Attributes2 = IO_DATA_PATH_WIDTH_8;
  38        p_dev->io.IOAddrLines = 3;
  39        p_dev->conf.IntType = INT_MEMORY_AND_IO;
  40        p_dev->priv = kzalloc(sizeof(struct ixj_info_t), GFP_KERNEL);
  41        if (!p_dev->priv) {
  42                return -ENOMEM;
  43        }
  44
  45        return ixj_config(p_dev);
  46}
  47
  48static void ixj_detach(struct pcmcia_device *link)
  49{
  50        dev_dbg(&link->dev, "ixj_detach\n");
  51
  52        ixj_cs_release(link);
  53
  54        kfree(link->priv);
  55}
  56
  57static void ixj_get_serial(struct pcmcia_device * link, IXJ * j)
  58{
  59        char *str;
  60        int i, place;
  61        dev_dbg(&link->dev, "ixj_get_serial\n");
  62
  63        str = link->prod_id[0];
  64        if (!str)
  65                goto failed;
  66        printk("%s", str);
  67        str = link->prod_id[1];
  68        if (!str)
  69                goto failed;
  70        printk(" %s", str);
  71        str = link->prod_id[2];
  72        if (!str)
  73                goto failed;
  74        place = 1;
  75        for (i = strlen(str) - 1; i >= 0; i--) {
  76                switch (str[i]) {
  77                case '0':
  78                case '1':
  79                case '2':
  80                case '3':
  81                case '4':
  82                case '5':
  83                case '6':
  84                case '7':
  85                case '8':
  86                case '9':
  87                        j->serial += (str[i] - 48) * place;
  88                        break;
  89                case 'A':
  90                case 'B':
  91                case 'C':
  92                case 'D':
  93                case 'E':
  94                case 'F':
  95                        j->serial += (str[i] - 55) * place;
  96                        break;
  97                case 'a':
  98                case 'b':
  99                case 'c':
 100                case 'd':
 101                case 'e':
 102                case 'f':
 103                        j->serial += (str[i] - 87) * place;
 104                        break;
 105                }
 106                place = place * 0x10;
 107        }
 108        str = link->prod_id[3];
 109        if (!str)
 110                goto failed;
 111        printk(" version %s\n", str);
 112failed:
 113        return;
 114}
 115
 116static int ixj_config_check(struct pcmcia_device *p_dev,
 117                            cistpl_cftable_entry_t *cfg,
 118                            cistpl_cftable_entry_t *dflt,
 119                            unsigned int vcc,
 120                            void *priv_data)
 121{
 122        if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) {
 123                cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io;
 124                p_dev->io.BasePort1 = io->win[0].base;
 125                p_dev->io.NumPorts1 = io->win[0].len;
 126                if (io->nwin == 2) {
 127                        p_dev->io.BasePort2 = io->win[1].base;
 128                        p_dev->io.NumPorts2 = io->win[1].len;
 129                }
 130                if (!pcmcia_request_io(p_dev, &p_dev->io))
 131                        return 0;
 132        }
 133        return -ENODEV;
 134}
 135
 136static int ixj_config(struct pcmcia_device * link)
 137{
 138        IXJ *j;
 139        ixj_info_t *info;
 140        cistpl_cftable_entry_t dflt = { 0 };
 141
 142        info = link->priv;
 143        dev_dbg(&link->dev, "ixj_config\n");
 144
 145        if (pcmcia_loop_config(link, ixj_config_check, &dflt))
 146                goto failed;
 147
 148        if (pcmcia_request_configuration(link, &link->conf))
 149                goto failed;
 150
 151        /*
 152         *      Register the card with the core.
 153         */
 154        j = ixj_pcmcia_probe(link->io.BasePort1, link->io.BasePort1 + 0x10);
 155
 156        info->ndev = 1;
 157        ixj_get_serial(link, j);
 158        return 0;
 159
 160failed:
 161        ixj_cs_release(link);
 162        return -ENODEV;
 163}
 164
 165static void ixj_cs_release(struct pcmcia_device *link)
 166{
 167        ixj_info_t *info = link->priv;
 168        dev_dbg(&link->dev, "ixj_cs_release\n");
 169        info->ndev = 0;
 170        pcmcia_disable_device(link);
 171}
 172
 173static struct pcmcia_device_id ixj_ids[] = {
 174        PCMCIA_DEVICE_MANF_CARD(0x0257, 0x0600),
 175        PCMCIA_DEVICE_NULL
 176};
 177MODULE_DEVICE_TABLE(pcmcia, ixj_ids);
 178
 179static struct pcmcia_driver ixj_driver = {
 180        .owner          = THIS_MODULE,
 181        .drv            = {
 182                .name   = "ixj_cs",
 183        },
 184        .probe          = ixj_probe,
 185        .remove         = ixj_detach,
 186        .id_table       = ixj_ids,
 187};
 188
 189static int __init ixj_pcmcia_init(void)
 190{
 191        return pcmcia_register_driver(&ixj_driver);
 192}
 193
 194static void ixj_pcmcia_exit(void)
 195{
 196        pcmcia_unregister_driver(&ixj_driver);
 197}
 198
 199module_init(ixj_pcmcia_init);
 200module_exit(ixj_pcmcia_exit);
 201
 202MODULE_LICENSE("GPL");
 203
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.