Blame view
drivers/telephony/ixj_pcmcia.c
3.49 KB
1da177e4c Linux-2.6.12-rc2 |
1 2 3 4 5 |
#include "ixj-ver.h" #include <linux/module.h> #include <linux/init.h> |
1da177e4c Linux-2.6.12-rc2 |
6 7 8 9 |
#include <linux/kernel.h> /* printk() */ #include <linux/fs.h> /* everything... */ #include <linux/errno.h> /* error codes */ #include <linux/slab.h> |
1da177e4c Linux-2.6.12-rc2 |
10 11 12 13 14 15 16 17 18 |
#include <pcmcia/cistpl.h> #include <pcmcia/ds.h> #include "ixj.h" /* * PCMCIA service support for Quicknet cards */ |
1da177e4c Linux-2.6.12-rc2 |
19 20 21 |
typedef struct ixj_info_t { int ndev; |
1da177e4c Linux-2.6.12-rc2 |
22 23 |
struct ixj *port; } ixj_info_t; |
cc3b4866b [PATCH] pcmcia: u... |
24 |
static void ixj_detach(struct pcmcia_device *p_dev); |
15b99ac17 [PATCH] pcmcia: a... |
25 |
static int ixj_config(struct pcmcia_device * link); |
fba395eee [PATCH] pcmcia: r... |
26 |
static void ixj_cs_release(struct pcmcia_device * link); |
1da177e4c Linux-2.6.12-rc2 |
27 |
|
15b99ac17 [PATCH] pcmcia: a... |
28 |
static int ixj_probe(struct pcmcia_device *p_dev) |
1da177e4c Linux-2.6.12-rc2 |
29 |
{ |
9b44de201 pcmcia: use dynam... |
30 31 |
dev_dbg(&p_dev->dev, "ixj_attach() "); |
1da177e4c Linux-2.6.12-rc2 |
32 |
/* Create new ixj device */ |
dd00cc486 some kmalloc/mems... |
33 |
p_dev->priv = kzalloc(sizeof(struct ixj_info_t), GFP_KERNEL); |
fd238232c [PATCH] pcmcia: e... |
34 |
if (!p_dev->priv) { |
f8cfa618d [PATCH] pcmcia: u... |
35 |
return -ENOMEM; |
1da177e4c Linux-2.6.12-rc2 |
36 |
} |
f8cfa618d [PATCH] pcmcia: u... |
37 |
|
15b99ac17 [PATCH] pcmcia: a... |
38 |
return ixj_config(p_dev); |
1da177e4c Linux-2.6.12-rc2 |
39 |
} |
fba395eee [PATCH] pcmcia: r... |
40 |
static void ixj_detach(struct pcmcia_device *link) |
1da177e4c Linux-2.6.12-rc2 |
41 |
{ |
9b44de201 pcmcia: use dynam... |
42 43 |
dev_dbg(&link->dev, "ixj_detach "); |
b46358115 [PATCH] pcmcia: r... |
44 |
|
e2d409636 [PATCH] pcmcia: u... |
45 |
ixj_cs_release(link); |
cc3b4866b [PATCH] pcmcia: u... |
46 |
|
1da177e4c Linux-2.6.12-rc2 |
47 |
kfree(link->priv); |
1da177e4c Linux-2.6.12-rc2 |
48 |
} |
fba395eee [PATCH] pcmcia: r... |
49 |
static void ixj_get_serial(struct pcmcia_device * link, IXJ * j) |
1da177e4c Linux-2.6.12-rc2 |
50 |
{ |
1da177e4c Linux-2.6.12-rc2 |
51 |
char *str; |
a9606fd39 [PATCH] pcmcia: r... |
52 |
int i, place; |
9b44de201 pcmcia: use dynam... |
53 54 |
dev_dbg(&link->dev, "ixj_get_serial "); |
a9606fd39 [PATCH] pcmcia: r... |
55 56 57 |
str = link->prod_id[0]; if (!str) |
9b44de201 pcmcia: use dynam... |
58 |
goto failed; |
1da177e4c Linux-2.6.12-rc2 |
59 |
printk("%s", str); |
a9606fd39 [PATCH] pcmcia: r... |
60 61 |
str = link->prod_id[1]; if (!str) |
9b44de201 pcmcia: use dynam... |
62 |
goto failed; |
1da177e4c Linux-2.6.12-rc2 |
63 |
printk(" %s", str); |
a9606fd39 [PATCH] pcmcia: r... |
64 65 |
str = link->prod_id[2]; if (!str) |
9b44de201 pcmcia: use dynam... |
66 |
goto failed; |
1da177e4c Linux-2.6.12-rc2 |
67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 |
place = 1; for (i = strlen(str) - 1; i >= 0; i--) { switch (str[i]) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': j->serial += (str[i] - 48) * place; break; case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': j->serial += (str[i] - 55) * place; break; case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': j->serial += (str[i] - 87) * place; break; } place = place * 0x10; } |
a9606fd39 [PATCH] pcmcia: r... |
101 102 |
str = link->prod_id[3]; if (!str) |
9b44de201 pcmcia: use dynam... |
103 |
goto failed; |
1da177e4c Linux-2.6.12-rc2 |
104 105 |
printk(" version %s ", str); |
9b44de201 pcmcia: use dynam... |
106 |
failed: |
1da177e4c Linux-2.6.12-rc2 |
107 108 |
return; } |
00990e7ce pcmcia: use autoc... |
109 |
static int ixj_config_check(struct pcmcia_device *p_dev, void *priv_data) |
84e2d3400 pcmcia: use pcmci... |
110 |
{ |
00990e7ce pcmcia: use autoc... |
111 112 113 114 115 116 117 |
p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH; p_dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_8; p_dev->resource[1]->flags &= ~IO_DATA_PATH_WIDTH; p_dev->resource[1]->flags |= IO_DATA_PATH_WIDTH_8; p_dev->io_lines = 3; return pcmcia_request_io(p_dev); |
84e2d3400 pcmcia: use pcmci... |
118 |
} |
15b99ac17 [PATCH] pcmcia: a... |
119 |
static int ixj_config(struct pcmcia_device * link) |
1da177e4c Linux-2.6.12-rc2 |
120 121 |
{ IXJ *j; |
1da177e4c Linux-2.6.12-rc2 |
122 |
ixj_info_t *info; |
84e2d3400 pcmcia: use pcmci... |
123 |
|
1da177e4c Linux-2.6.12-rc2 |
124 |
info = link->priv; |
9b44de201 pcmcia: use dynam... |
125 126 |
dev_dbg(&link->dev, "ixj_config "); |
1da177e4c Linux-2.6.12-rc2 |
127 |
|
00990e7ce pcmcia: use autoc... |
128 129 130 |
link->config_flags = CONF_AUTO_SET_IO; if (pcmcia_loop_config(link, ixj_config_check, NULL)) |
9b44de201 pcmcia: use dynam... |
131 |
goto failed; |
84e2d3400 pcmcia: use pcmci... |
132 |
|
1ac71e5a3 pcmcia: convert p... |
133 |
if (pcmcia_enable_device(link)) |
9b44de201 pcmcia: use dynam... |
134 |
goto failed; |
1da177e4c Linux-2.6.12-rc2 |
135 136 137 |
/* * Register the card with the core. |
84e2d3400 pcmcia: use pcmci... |
138 |
*/ |
9a017a910 pcmcia: do not us... |
139 140 |
j = ixj_pcmcia_probe(link->resource[0]->start, link->resource[0]->start + 0x10); |
1da177e4c Linux-2.6.12-rc2 |
141 142 |
info->ndev = 1; |
1da177e4c Linux-2.6.12-rc2 |
143 |
ixj_get_serial(link, j); |
15b99ac17 [PATCH] pcmcia: a... |
144 |
return 0; |
84e2d3400 pcmcia: use pcmci... |
145 |
|
9b44de201 pcmcia: use dynam... |
146 |
failed: |
1da177e4c Linux-2.6.12-rc2 |
147 |
ixj_cs_release(link); |
15b99ac17 [PATCH] pcmcia: a... |
148 |
return -ENODEV; |
1da177e4c Linux-2.6.12-rc2 |
149 |
} |
fba395eee [PATCH] pcmcia: r... |
150 |
static void ixj_cs_release(struct pcmcia_device *link) |
1da177e4c Linux-2.6.12-rc2 |
151 152 |
{ ixj_info_t *info = link->priv; |
9b44de201 pcmcia: use dynam... |
153 154 |
dev_dbg(&link->dev, "ixj_cs_release "); |
1da177e4c Linux-2.6.12-rc2 |
155 |
info->ndev = 0; |
fba395eee [PATCH] pcmcia: r... |
156 |
pcmcia_disable_device(link); |
1da177e4c Linux-2.6.12-rc2 |
157 |
} |
25f8f54f6 pcmcia: Convert p... |
158 |
static const struct pcmcia_device_id ixj_ids[] = { |
070812734 [PATCH] pcmcia: i... |
159 160 161 162 |
PCMCIA_DEVICE_MANF_CARD(0x0257, 0x0600), PCMCIA_DEVICE_NULL }; MODULE_DEVICE_TABLE(pcmcia, ixj_ids); |
1da177e4c Linux-2.6.12-rc2 |
163 164 |
static struct pcmcia_driver ixj_driver = { .owner = THIS_MODULE, |
2e9b981a7 pcmcia: move driv... |
165 |
.name = "ixj_cs", |
15b99ac17 [PATCH] pcmcia: a... |
166 |
.probe = ixj_probe, |
cc3b4866b [PATCH] pcmcia: u... |
167 |
.remove = ixj_detach, |
070812734 [PATCH] pcmcia: i... |
168 |
.id_table = ixj_ids, |
1da177e4c Linux-2.6.12-rc2 |
169 170 171 172 173 174 175 176 177 178 |
}; static int __init ixj_pcmcia_init(void) { return pcmcia_register_driver(&ixj_driver); } static void ixj_pcmcia_exit(void) { pcmcia_unregister_driver(&ixj_driver); |
1da177e4c Linux-2.6.12-rc2 |
179 180 181 182 183 184 |
} module_init(ixj_pcmcia_init); module_exit(ixj_pcmcia_exit); MODULE_LICENSE("GPL"); |