Blame view

drivers/telephony/ixj_pcmcia.c 3.49 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
  #include "ixj-ver.h"
  
  #include <linux/module.h>
  
  #include <linux/init.h>
1da177e4c   Linus Torvalds   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   Linus Torvalds   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   Linus Torvalds   Linux-2.6.12-rc2
19
20
21
  
  typedef struct ixj_info_t {
  	int ndev;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
22
23
  	struct ixj *port;
  } ixj_info_t;
cc3b4866b   Dominik Brodowski   [PATCH] pcmcia: u...
24
  static void ixj_detach(struct pcmcia_device *p_dev);
15b99ac17   Dominik Brodowski   [PATCH] pcmcia: a...
25
  static int ixj_config(struct pcmcia_device * link);
fba395eee   Dominik Brodowski   [PATCH] pcmcia: r...
26
  static void ixj_cs_release(struct pcmcia_device * link);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
27

15b99ac17   Dominik Brodowski   [PATCH] pcmcia: a...
28
  static int ixj_probe(struct pcmcia_device *p_dev)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
29
  {
9b44de201   Dominik Brodowski   pcmcia: use dynam...
30
31
  	dev_dbg(&p_dev->dev, "ixj_attach()
  ");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
32
  	/* Create new ixj device */
dd00cc486   Yoann Padioleau   some kmalloc/mems...
33
  	p_dev->priv = kzalloc(sizeof(struct ixj_info_t), GFP_KERNEL);
fd238232c   Dominik Brodowski   [PATCH] pcmcia: e...
34
  	if (!p_dev->priv) {
f8cfa618d   Dominik Brodowski   [PATCH] pcmcia: u...
35
  		return -ENOMEM;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
36
  	}
f8cfa618d   Dominik Brodowski   [PATCH] pcmcia: u...
37

15b99ac17   Dominik Brodowski   [PATCH] pcmcia: a...
38
  	return ixj_config(p_dev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
39
  }
fba395eee   Dominik Brodowski   [PATCH] pcmcia: r...
40
  static void ixj_detach(struct pcmcia_device *link)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
41
  {
9b44de201   Dominik Brodowski   pcmcia: use dynam...
42
43
  	dev_dbg(&link->dev, "ixj_detach
  ");
b46358115   Dominik Brodowski   [PATCH] pcmcia: r...
44

e2d409636   Dominik Brodowski   [PATCH] pcmcia: u...
45
  	ixj_cs_release(link);
cc3b4866b   Dominik Brodowski   [PATCH] pcmcia: u...
46

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
47
          kfree(link->priv);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
48
  }
fba395eee   Dominik Brodowski   [PATCH] pcmcia: r...
49
  static void ixj_get_serial(struct pcmcia_device * link, IXJ * j)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
50
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
51
  	char *str;
a9606fd39   Dominik Brodowski   [PATCH] pcmcia: r...
52
  	int i, place;
9b44de201   Dominik Brodowski   pcmcia: use dynam...
53
54
  	dev_dbg(&link->dev, "ixj_get_serial
  ");
a9606fd39   Dominik Brodowski   [PATCH] pcmcia: r...
55
56
57
  
  	str = link->prod_id[0];
  	if (!str)
9b44de201   Dominik Brodowski   pcmcia: use dynam...
58
  		goto failed;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
59
  	printk("%s", str);
a9606fd39   Dominik Brodowski   [PATCH] pcmcia: r...
60
61
  	str = link->prod_id[1];
  	if (!str)
9b44de201   Dominik Brodowski   pcmcia: use dynam...
62
  		goto failed;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
63
  	printk(" %s", str);
a9606fd39   Dominik Brodowski   [PATCH] pcmcia: r...
64
65
  	str = link->prod_id[2];
  	if (!str)
9b44de201   Dominik Brodowski   pcmcia: use dynam...
66
  		goto failed;
1da177e4c   Linus Torvalds   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   Dominik Brodowski   [PATCH] pcmcia: r...
101
102
  	str = link->prod_id[3];
  	if (!str)
9b44de201   Dominik Brodowski   pcmcia: use dynam...
103
  		goto failed;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
104
105
  	printk(" version %s
  ", str);
9b44de201   Dominik Brodowski   pcmcia: use dynam...
106
  failed:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
107
108
  	return;
  }
00990e7ce   Dominik Brodowski   pcmcia: use autoc...
109
  static int ixj_config_check(struct pcmcia_device *p_dev, void *priv_data)
84e2d3400   Dominik Brodowski   pcmcia: use pcmci...
110
  {
00990e7ce   Dominik Brodowski   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   Dominik Brodowski   pcmcia: use pcmci...
118
  }
15b99ac17   Dominik Brodowski   [PATCH] pcmcia: a...
119
  static int ixj_config(struct pcmcia_device * link)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
120
121
  {
  	IXJ *j;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
122
  	ixj_info_t *info;
84e2d3400   Dominik Brodowski   pcmcia: use pcmci...
123

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
124
  	info = link->priv;
9b44de201   Dominik Brodowski   pcmcia: use dynam...
125
126
  	dev_dbg(&link->dev, "ixj_config
  ");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
127

00990e7ce   Dominik Brodowski   pcmcia: use autoc...
128
129
130
  	link->config_flags = CONF_AUTO_SET_IO;
  
  	if (pcmcia_loop_config(link, ixj_config_check, NULL))
9b44de201   Dominik Brodowski   pcmcia: use dynam...
131
  		goto failed;
84e2d3400   Dominik Brodowski   pcmcia: use pcmci...
132

1ac71e5a3   Dominik Brodowski   pcmcia: convert p...
133
  	if (pcmcia_enable_device(link))
9b44de201   Dominik Brodowski   pcmcia: use dynam...
134
  		goto failed;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
135
136
137
  
  	/*
   	 *	Register the card with the core.
84e2d3400   Dominik Brodowski   pcmcia: use pcmci...
138
  	 */
9a017a910   Dominik Brodowski   pcmcia: do not us...
139
140
  	j = ixj_pcmcia_probe(link->resource[0]->start,
  			     link->resource[0]->start + 0x10);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
141
142
  
  	info->ndev = 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
143
  	ixj_get_serial(link, j);
15b99ac17   Dominik Brodowski   [PATCH] pcmcia: a...
144
  	return 0;
84e2d3400   Dominik Brodowski   pcmcia: use pcmci...
145

9b44de201   Dominik Brodowski   pcmcia: use dynam...
146
  failed:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
147
  	ixj_cs_release(link);
15b99ac17   Dominik Brodowski   [PATCH] pcmcia: a...
148
  	return -ENODEV;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
149
  }
fba395eee   Dominik Brodowski   [PATCH] pcmcia: r...
150
  static void ixj_cs_release(struct pcmcia_device *link)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
151
152
  {
  	ixj_info_t *info = link->priv;
9b44de201   Dominik Brodowski   pcmcia: use dynam...
153
154
  	dev_dbg(&link->dev, "ixj_cs_release
  ");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
155
  	info->ndev = 0;
fba395eee   Dominik Brodowski   [PATCH] pcmcia: r...
156
  	pcmcia_disable_device(link);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
157
  }
25f8f54f6   Joe Perches   pcmcia: Convert p...
158
  static const struct pcmcia_device_id ixj_ids[] = {
070812734   Dominik Brodowski   [PATCH] pcmcia: i...
159
160
161
162
  	PCMCIA_DEVICE_MANF_CARD(0x0257, 0x0600),
  	PCMCIA_DEVICE_NULL
  };
  MODULE_DEVICE_TABLE(pcmcia, ixj_ids);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
163
164
  static struct pcmcia_driver ixj_driver = {
  	.owner		= THIS_MODULE,
2e9b981a7   Dominik Brodowski   pcmcia: move driv...
165
  	.name		= "ixj_cs",
15b99ac17   Dominik Brodowski   [PATCH] pcmcia: a...
166
  	.probe		= ixj_probe,
cc3b4866b   Dominik Brodowski   [PATCH] pcmcia: u...
167
  	.remove		= ixj_detach,
070812734   Dominik Brodowski   [PATCH] pcmcia: i...
168
  	.id_table	= ixj_ids,
1da177e4c   Linus Torvalds   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   Linus Torvalds   Linux-2.6.12-rc2
179
180
181
182
183
184
  }
  
  module_init(ixj_pcmcia_init);
  module_exit(ixj_pcmcia_exit);
  
  MODULE_LICENSE("GPL");