jr3_pci.c revision c3744138715045adb316284ee7a1e608f0278f6c
1/*
2  comedi/drivers/jr3_pci.c
3  hardware driver for JR3/PCI force sensor board
4
5  COMEDI - Linux Control and Measurement Device Interface
6  Copyright (C) 2007 Anders Blomdell <anders.blomdell@control.lth.se>
7
8  This program is free software; you can redistribute it and/or modify
9  it under the terms of the GNU General Public License as published by
10  the Free Software Foundation; either version 2 of the License, or
11  (at your option) any later version.
12
13  This program is distributed in the hope that it will be useful,
14  but WITHOUT ANY WARRANTY; without even the implied warranty of
15  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  GNU General Public License for more details.
17
18  You should have received a copy of the GNU General Public License
19  along with this program; if not, write to the Free Software
20  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21
22*/
23/*
24Driver: jr3_pci
25Description: JR3/PCI force sensor board
26Author: Anders Blomdell <anders.blomdell@control.lth.se>
27Status: works
28Devices: [JR3] PCI force sensor board (jr3_pci)
29
30  The DSP on the board requires initialization code, which can
31  be loaded by placing it in /lib/firmware/comedi.
32  The initialization code should be somewhere on the media you got
33  with your card. One version is available from http://www.comedi.org
34  in the comedi_nonfree_firmware tarball.
35
36  Configuration options:
37  [0] - PCI bus number - if bus number and slot number are 0,
38                         then driver search for first unused card
39  [1] - PCI slot number
40
41*/
42
43#include "../comedidev.h"
44
45#include <linux/delay.h>
46#include <linux/ctype.h>
47#include <linux/firmware.h>
48#include "comedi_pci.h"
49#include "jr3_pci.h"
50
51#define PCI_VENDOR_ID_JR3 0x1762
52#define PCI_DEVICE_ID_JR3_1_CHANNEL 0x3111
53#define PCI_DEVICE_ID_JR3_2_CHANNEL 0x3112
54#define PCI_DEVICE_ID_JR3_3_CHANNEL 0x3113
55#define PCI_DEVICE_ID_JR3_4_CHANNEL 0x3114
56
57static int jr3_pci_attach(struct comedi_device *dev, struct comedi_devconfig *it);
58static int jr3_pci_detach(struct comedi_device *dev);
59
60static struct comedi_driver driver_jr3_pci = {
61      driver_name:"jr3_pci",
62      module:THIS_MODULE,
63      attach:jr3_pci_attach,
64      detach:jr3_pci_detach,
65};
66
67static DEFINE_PCI_DEVICE_TABLE(jr3_pci_pci_table) = {
68	{PCI_VENDOR_ID_JR3, PCI_DEVICE_ID_JR3_1_CHANNEL,
69		PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
70	{PCI_VENDOR_ID_JR3, PCI_DEVICE_ID_JR3_2_CHANNEL,
71		PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
72	{PCI_VENDOR_ID_JR3, PCI_DEVICE_ID_JR3_3_CHANNEL,
73		PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
74	{PCI_VENDOR_ID_JR3, PCI_DEVICE_ID_JR3_4_CHANNEL,
75		PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
76	{0}
77};
78
79MODULE_DEVICE_TABLE(pci, jr3_pci_pci_table);
80
81struct jr3_pci_dev_private {
82
83	struct pci_dev *pci_dev;
84	int pci_enabled;
85	volatile struct jr3_t *iobase;
86	int n_channels;
87	struct timer_list timer;
88};
89
90
91struct poll_delay_t {
92
93	int min;
94	int max;
95};
96
97
98struct jr3_pci_subdev_private {
99	volatile struct jr3_channel *channel;
100	unsigned long next_time_min;
101	unsigned long next_time_max;
102	enum { state_jr3_poll,
103		state_jr3_init_wait_for_offset,
104		state_jr3_init_transform_complete,
105		state_jr3_init_set_full_scale_complete,
106		state_jr3_init_use_offset_complete,
107		state_jr3_done
108	} state;
109	int channel_no;
110	int serial_no;
111	int model_no;
112	struct {
113		int length;
114		struct comedi_krange range;
115	} range[9];
116	const struct comedi_lrange *range_table_list[8 * 7 + 2];
117	unsigned int maxdata_list[8 * 7 + 2];
118	u16 errors;
119	int retries;
120};
121
122/* Hotplug firmware loading stuff */
123
124typedef int comedi_firmware_callback(struct comedi_device *dev,
125				     const u8 *data, size_t size);
126
127static int comedi_load_firmware(struct comedi_device *dev, char *name,
128				comedi_firmware_callback cb)
129{
130	int result = 0;
131	const struct firmware *fw;
132	char *firmware_path;
133	static const char *prefix = "comedi/";
134	struct jr3_pci_dev_private *devpriv = dev->private;
135
136	firmware_path = kmalloc(strlen(prefix) + strlen(name) + 1, GFP_KERNEL);
137	if (!firmware_path) {
138		result = -ENOMEM;
139	} else {
140		firmware_path[0] = '\0';
141		strcat(firmware_path, prefix);
142		strcat(firmware_path, name);
143		result = request_firmware(&fw, firmware_path,
144			&devpriv->pci_dev->dev);
145		if (result == 0) {
146			if (!cb)
147				result = -EINVAL;
148			else
149				result = cb(dev, fw->data, fw->size);
150			release_firmware(fw);
151		}
152		kfree(firmware_path);
153	}
154	return result;
155}
156
157static struct poll_delay_t poll_delay_min_max(int min, int max)
158{
159	struct poll_delay_t result;
160
161	result.min = min;
162	result.max = max;
163	return result;
164}
165
166static int is_complete(volatile struct jr3_channel *channel)
167{
168	return get_s16(&channel->command_word0) == 0;
169}
170
171struct transform_t {
172	struct {
173		u16 link_type;
174		s16 link_amount;
175	} link[8];
176};
177
178static void set_transforms(volatile struct jr3_channel *channel,
179	struct transform_t transf, short num)
180{
181	int i;
182
183	num &= 0x000f;		/*  Make sure that 0 <= num <= 15 */
184	for (i = 0; i < 8; i++) {
185
186		set_u16(&channel->transforms[num].link[i].link_type,
187			transf.link[i].link_type);
188		comedi_udelay(1);
189		set_s16(&channel->transforms[num].link[i].link_amount,
190			transf.link[i].link_amount);
191		comedi_udelay(1);
192		if (transf.link[i].link_type == end_x_form) {
193			break;
194		}
195	}
196}
197
198static void use_transform(volatile struct jr3_channel *channel, short transf_num)
199{
200	set_s16(&channel->command_word0, 0x0500 + (transf_num & 0x000f));
201}
202
203static void use_offset(volatile struct jr3_channel *channel, short offset_num)
204{
205	set_s16(&channel->command_word0, 0x0600 + (offset_num & 0x000f));
206}
207
208static void set_offset(volatile struct jr3_channel *channel)
209{
210	set_s16(&channel->command_word0, 0x0700);
211}
212
213struct six_axis_t {
214	s16 fx;
215	s16 fy;
216	s16 fz;
217	s16 mx;
218	s16 my;
219	s16 mz;
220};
221
222static void set_full_scales(volatile struct jr3_channel *channel,
223	struct six_axis_t full_scale)
224{
225	printk("%d %d %d %d %d %d\n",
226		full_scale.fx,
227		full_scale.fy,
228		full_scale.fz, full_scale.mx, full_scale.my, full_scale.mz);
229	set_s16(&channel->full_scale.fx, full_scale.fx);
230	set_s16(&channel->full_scale.fy, full_scale.fy);
231	set_s16(&channel->full_scale.fz, full_scale.fz);
232	set_s16(&channel->full_scale.mx, full_scale.mx);
233	set_s16(&channel->full_scale.my, full_scale.my);
234	set_s16(&channel->full_scale.mz, full_scale.mz);
235	set_s16(&channel->command_word0, 0x0a00);
236}
237
238static struct six_axis_t get_min_full_scales(volatile struct jr3_channel *channel)
239{
240	struct six_axis_t result;
241	result.fx = get_s16(&channel->min_full_scale.fx);
242	result.fy = get_s16(&channel->min_full_scale.fy);
243	result.fz = get_s16(&channel->min_full_scale.fz);
244	result.mx = get_s16(&channel->min_full_scale.mx);
245	result.my = get_s16(&channel->min_full_scale.my);
246	result.mz = get_s16(&channel->min_full_scale.mz);
247	return result;
248}
249
250static struct six_axis_t get_max_full_scales(volatile struct jr3_channel *channel)
251{
252	struct six_axis_t result;
253	result.fx = get_s16(&channel->max_full_scale.fx);
254	result.fy = get_s16(&channel->max_full_scale.fy);
255	result.fz = get_s16(&channel->max_full_scale.fz);
256	result.mx = get_s16(&channel->max_full_scale.mx);
257	result.my = get_s16(&channel->max_full_scale.my);
258	result.mz = get_s16(&channel->max_full_scale.mz);
259	return result;
260}
261
262static int jr3_pci_ai_insn_read(struct comedi_device *dev, struct comedi_subdevice *s,
263	struct comedi_insn *insn, unsigned int *data)
264{
265	int result;
266	struct jr3_pci_subdev_private *p;
267	int channel;
268
269	p = s->private;
270	channel = CR_CHAN(insn->chanspec);
271	if (p == NULL || channel > 57) {
272		result = -EINVAL;
273	} else {
274		int i;
275
276		result = insn->n;
277		if (p->state != state_jr3_done ||
278			(get_u16(&p->channel->
279					errors) & (watch_dog | watch_dog2 |
280					sensor_change))) {
281			/* No sensor or sensor changed */
282			if (p->state == state_jr3_done) {
283				/* Restart polling */
284				p->state = state_jr3_poll;
285			}
286			result = -EAGAIN;
287		}
288		for (i = 0; i < insn->n; i++) {
289			if (channel < 56) {
290				int axis, filter;
291
292				axis = channel % 8;
293				filter = channel / 8;
294				if (p->state != state_jr3_done) {
295					data[i] = 0;
296				} else {
297					int F = 0;
298					switch (axis) {
299					case 0:{
300							F = get_s16(&p->
301								channel->
302								filter[filter].
303								fx);
304						}
305						break;
306					case 1:{
307							F = get_s16(&p->
308								channel->
309								filter[filter].
310								fy);
311						}
312						break;
313					case 2:{
314							F = get_s16(&p->
315								channel->
316								filter[filter].
317								fz);
318						}
319						break;
320					case 3:{
321							F = get_s16(&p->
322								channel->
323								filter[filter].
324								mx);
325						}
326						break;
327					case 4:{
328							F = get_s16(&p->
329								channel->
330								filter[filter].
331								my);
332						}
333						break;
334					case 5:{
335							F = get_s16(&p->
336								channel->
337								filter[filter].
338								mz);
339						}
340						break;
341					case 6:{
342							F = get_s16(&p->
343								channel->
344								filter[filter].
345								v1);
346						}
347						break;
348					case 7:{
349							F = get_s16(&p->
350								channel->
351								filter[filter].
352								v2);
353						}
354						break;
355					}
356					data[i] = F + 0x4000;
357				}
358			} else if (channel == 56) {
359				if (p->state != state_jr3_done) {
360					data[i] = 0;
361				} else {
362					data[i] =
363						get_u16(&p->channel->model_no);
364				}
365			} else if (channel == 57) {
366				if (p->state != state_jr3_done) {
367					data[i] = 0;
368				} else {
369					data[i] =
370						get_u16(&p->channel->serial_no);
371				}
372			}
373		}
374	}
375	return result;
376}
377
378static void jr3_pci_open(struct comedi_device *dev)
379{
380	int i;
381	struct jr3_pci_dev_private *devpriv = dev->private;
382
383	printk("jr3_pci_open\n");
384	for (i = 0; i < devpriv->n_channels; i++) {
385		struct jr3_pci_subdev_private *p;
386
387		p = dev->subdevices[i].private;
388		if (p) {
389			printk("serial: %p %d (%d)\n", p, p->serial_no,
390				p->channel_no);
391		}
392	}
393}
394
395int read_idm_word(const u8 *data, size_t size, int *pos, unsigned int *val)
396{
397	int result = 0;
398	if (pos != 0 && val != 0) {
399		/*  Skip over non hex */
400		for (; *pos < size && !isxdigit(data[*pos]); (*pos)++) {
401		}
402		/*  Collect value */
403		*val = 0;
404		for (; *pos < size && isxdigit(data[*pos]); (*pos)++) {
405			char ch = tolower(data[*pos]);
406			result = 1;
407			if ('0' <= ch && ch <= '9') {
408				*val = (*val << 4) + (ch - '0');
409			} else if ('a' <= ch && ch <= 'f') {
410				*val = (*val << 4) + (ch - 'a' + 10);
411			}
412		}
413	}
414	return result;
415}
416
417static int jr3_download_firmware(struct comedi_device *dev, const u8 *data,
418	size_t size)
419{
420	/*
421	 * IDM file format is:
422	 *   { count, address, data <count> } *
423	 *   ffff
424	 */
425	int result, more, pos, OK;
426
427	result = 0;
428	more = 1;
429	pos = 0;
430	OK = 0;
431	while (more) {
432		unsigned int count, addr;
433
434		more = more && read_idm_word(data, size, &pos, &count);
435		if (more && count == 0xffff) {
436			OK = 1;
437			break;
438		}
439		more = more && read_idm_word(data, size, &pos, &addr);
440		while (more && count > 0) {
441			unsigned int dummy;
442			more = more && read_idm_word(data, size, &pos, &dummy);
443			count--;
444		}
445	}
446
447	if (!OK) {
448		result = -ENODATA;
449	} else {
450		int i;
451		struct jr3_pci_dev_private *p = dev->private;
452
453		for (i = 0; i < p->n_channels; i++) {
454			struct jr3_pci_subdev_private *sp;
455
456			sp = dev->subdevices[i].private;
457			more = 1;
458			pos = 0;
459			while (more) {
460				unsigned int count, addr;
461				more = more
462					&& read_idm_word(data, size, &pos,
463					&count);
464				if (more && count == 0xffff) {
465					break;
466				}
467				more = more
468					&& read_idm_word(data, size, &pos,
469					&addr);
470				printk("Loading#%d %4.4x bytes at %4.4x\n", i,
471					count, addr);
472				while (more && count > 0) {
473					if (addr & 0x4000) {
474						/*  16 bit data, never seen in real life!! */
475						unsigned int data1;
476
477						more = more
478							&& read_idm_word(data,
479							size, &pos, &data1);
480						count--;
481						/* printk("jr3_data, not tested\n"); */
482						/* jr3[addr + 0x20000 * pnum] = data1; */
483					} else {
484						/*   Download 24 bit program */
485						unsigned int data1, data2;
486
487						more = more
488							&& read_idm_word(data,
489							size, &pos, &data1);
490						more = more
491							&& read_idm_word(data,
492							size, &pos, &data2);
493						count -= 2;
494						if (more) {
495							set_u16(&p->iobase->
496								channel[i].
497								program_low
498								[addr], data1);
499							comedi_udelay(1);
500							set_u16(&p->iobase->
501								channel[i].
502								program_high
503								[addr], data2);
504							comedi_udelay(1);
505
506						}
507					}
508					addr++;
509				}
510			}
511		}
512	}
513	return result;
514}
515
516static struct poll_delay_t jr3_pci_poll_subdevice(struct comedi_subdevice *s)
517{
518	struct poll_delay_t result = poll_delay_min_max(1000, 2000);
519	struct jr3_pci_subdev_private *p = s->private;
520
521	if (p) {
522		volatile struct jr3_channel *channel = p->channel;
523		int errors = get_u16(&channel->errors);
524
525		if (errors != p->errors) {
526			printk("Errors: %x -> %x\n", p->errors, errors);
527			p->errors = errors;
528		}
529		if (errors & (watch_dog | watch_dog2 | sensor_change)) {
530			/*  Sensor communication lost, force poll mode */
531			p->state = state_jr3_poll;
532
533		}
534		switch (p->state) {
535		case state_jr3_poll:{
536				u16 model_no = get_u16(&channel->model_no);
537				u16 serial_no = get_u16(&channel->serial_no);
538				if ((errors & (watch_dog | watch_dog2)) ||
539					model_no == 0 || serial_no == 0) {
540/*
541 * Still no sensor, keep on polling. Since it takes up to 10 seconds
542 * for offsets to stabilize, polling each second should suffice.
543 */
544					result = poll_delay_min_max(1000, 2000);
545				} else {
546					p->retries = 0;
547					p->state =
548						state_jr3_init_wait_for_offset;
549					result = poll_delay_min_max(1000, 2000);
550				}
551			}
552			break;
553		case state_jr3_init_wait_for_offset:{
554				p->retries++;
555				if (p->retries < 10) {
556					/*  Wait for offeset to stabilize (< 10 s according to manual) */
557					result = poll_delay_min_max(1000, 2000);
558				} else {
559					struct transform_t transf;
560
561					p->model_no =
562						get_u16(&channel->model_no);
563					p->serial_no =
564						get_u16(&channel->serial_no);
565
566					printk("Setting transform for channel %d\n", p->channel_no);
567					printk("Sensor Model     = %i\n",
568						p->model_no);
569					printk("Sensor Serial    = %i\n",
570						p->serial_no);
571
572					/*  Transformation all zeros */
573					transf.link[0].link_type =
574						(enum link_types)0;
575					transf.link[0].link_amount = 0;
576					transf.link[1].link_type =
577						(enum link_types)0;
578					transf.link[1].link_amount = 0;
579					transf.link[2].link_type =
580						(enum link_types)0;
581					transf.link[2].link_amount = 0;
582					transf.link[3].link_type =
583						(enum link_types)0;
584					transf.link[3].link_amount = 0;
585
586					set_transforms(channel, transf, 0);
587					use_transform(channel, 0);
588					p->state =
589						state_jr3_init_transform_complete;
590					result = poll_delay_min_max(20, 100);	/*  Allow 20 ms for completion */
591				}
592			} break;
593		case state_jr3_init_transform_complete:{
594				if (!is_complete(channel)) {
595					printk("state_jr3_init_transform_complete complete = %d\n", is_complete(channel));
596					result = poll_delay_min_max(20, 100);
597				} else {
598					/*  Set full scale */
599					struct six_axis_t min_full_scale;
600					struct six_axis_t max_full_scale;
601
602					min_full_scale =
603						get_min_full_scales(channel);
604					printk("Obtained Min. Full Scales:\n");
605					printk("%i   ", (min_full_scale).fx);
606					printk("%i   ", (min_full_scale).fy);
607					printk("%i   ", (min_full_scale).fz);
608					printk("%i   ", (min_full_scale).mx);
609					printk("%i   ", (min_full_scale).my);
610					printk("%i   ", (min_full_scale).mz);
611					printk("\n");
612
613					max_full_scale =
614						get_max_full_scales(channel);
615					printk("Obtained Max. Full Scales:\n");
616					printk("%i   ", (max_full_scale).fx);
617					printk("%i   ", (max_full_scale).fy);
618					printk("%i   ", (max_full_scale).fz);
619					printk("%i   ", (max_full_scale).mx);
620					printk("%i   ", (max_full_scale).my);
621					printk("%i   ", (max_full_scale).mz);
622					printk("\n");
623
624					set_full_scales(channel,
625						max_full_scale);
626
627					p->state =
628						state_jr3_init_set_full_scale_complete;
629					result = poll_delay_min_max(20, 100);	/*  Allow 20 ms for completion */
630				}
631			}
632			break;
633		case state_jr3_init_set_full_scale_complete:{
634				if (!is_complete(channel)) {
635					printk("state_jr3_init_set_full_scale_complete complete = %d\n", is_complete(channel));
636					result = poll_delay_min_max(20, 100);
637				} else {
638					volatile struct force_array *full_scale;
639
640					/*  Use ranges in kN or we will overflow arount 2000N! */
641					full_scale = &channel->full_scale;
642					p->range[0].range.min =
643						-get_s16(&full_scale->fx) *
644						1000;
645					p->range[0].range.max =
646						get_s16(&full_scale->fx) * 1000;
647					p->range[1].range.min =
648						-get_s16(&full_scale->fy) *
649						1000;
650					p->range[1].range.max =
651						get_s16(&full_scale->fy) * 1000;
652					p->range[2].range.min =
653						-get_s16(&full_scale->fz) *
654						1000;
655					p->range[2].range.max =
656						get_s16(&full_scale->fz) * 1000;
657					p->range[3].range.min =
658						-get_s16(&full_scale->mx) * 100;
659					p->range[3].range.max =
660						get_s16(&full_scale->mx) * 100;
661					p->range[4].range.min =
662						-get_s16(&full_scale->my) * 100;
663					p->range[4].range.max =
664						get_s16(&full_scale->my) * 100;
665					p->range[5].range.min =
666						-get_s16(&full_scale->mz) * 100;
667					p->range[5].range.max =
668						get_s16(&full_scale->mz) * 100;
669					p->range[6].range.min = -get_s16(&full_scale->v1) * 100;	/*  ?? */
670					p->range[6].range.max = get_s16(&full_scale->v1) * 100;	/*  ?? */
671					p->range[7].range.min = -get_s16(&full_scale->v2) * 100;	/*  ?? */
672					p->range[7].range.max = get_s16(&full_scale->v2) * 100;	/*  ?? */
673					p->range[8].range.min = 0;
674					p->range[8].range.max = 65535;
675
676					{
677						int i;
678						for (i = 0; i < 9; i++) {
679							printk("%d %d - %d\n",
680								i,
681								p->range[i].
682								range.min,
683								p->range[i].
684								range.max);
685						}
686					}
687
688					use_offset(channel, 0);
689					p->state =
690						state_jr3_init_use_offset_complete;
691					result = poll_delay_min_max(40, 100);	/*  Allow 40 ms for completion */
692				}
693			}
694			break;
695		case state_jr3_init_use_offset_complete:{
696				if (!is_complete(channel)) {
697					printk("state_jr3_init_use_offset_complete complete = %d\n", is_complete(channel));
698					result = poll_delay_min_max(20, 100);
699				} else {
700					printk("Default offsets %d %d %d %d %d %d\n", get_s16(&channel->offsets.fx), get_s16(&channel->offsets.fy), get_s16(&channel->offsets.fz), get_s16(&channel->offsets.mx), get_s16(&channel->offsets.my), get_s16(&channel->offsets.mz));
701
702					set_s16(&channel->offsets.fx, 0);
703					set_s16(&channel->offsets.fy, 0);
704					set_s16(&channel->offsets.fz, 0);
705					set_s16(&channel->offsets.mx, 0);
706					set_s16(&channel->offsets.my, 0);
707					set_s16(&channel->offsets.mz, 0);
708
709					set_offset(channel);
710
711					p->state = state_jr3_done;
712				}
713			}
714			break;
715		case state_jr3_done:{
716				poll_delay_min_max(10000, 20000);
717			}
718			break;
719		default:{
720				poll_delay_min_max(1000, 2000);
721			}
722			break;
723		}
724	}
725	return result;
726}
727
728static void jr3_pci_poll_dev(unsigned long data)
729{
730	unsigned long flags;
731	struct comedi_device *dev = (struct comedi_device *) data;
732	struct jr3_pci_dev_private *devpriv = dev->private;
733	unsigned long now;
734	int delay;
735	int i;
736
737	comedi_spin_lock_irqsave(&dev->spinlock, flags);
738	delay = 1000;
739	now = jiffies;
740	/*  Poll all channels that are ready to be polled */
741	for (i = 0; i < devpriv->n_channels; i++) {
742		struct jr3_pci_subdev_private *subdevpriv = dev->subdevices[i].private;
743		if (now > subdevpriv->next_time_min) {
744			struct poll_delay_t sub_delay;
745
746			sub_delay = jr3_pci_poll_subdevice(&dev->subdevices[i]);
747			subdevpriv->next_time_min =
748				jiffies + msecs_to_jiffies(sub_delay.min);
749			subdevpriv->next_time_max =
750				jiffies + msecs_to_jiffies(sub_delay.max);
751			if (sub_delay.max && sub_delay.max < delay) {
752/*
753* Wake up as late as possible -> poll as many channels as possible
754* at once
755*/
756				delay = sub_delay.max;
757			}
758		}
759	}
760	comedi_spin_unlock_irqrestore(&dev->spinlock, flags);
761
762	devpriv->timer.expires = jiffies + msecs_to_jiffies(delay);
763	add_timer(&devpriv->timer);
764}
765
766static int jr3_pci_attach(struct comedi_device *dev, struct comedi_devconfig *it)
767{
768	int result = 0;
769	struct pci_dev *card = NULL;
770	int opt_bus, opt_slot, i;
771	struct jr3_pci_dev_private *devpriv;
772
773	printk("comedi%d: jr3_pci\n", dev->minor);
774
775	opt_bus = it->options[0];
776	opt_slot = it->options[1];
777
778	if (sizeof(struct jr3_channel) != 0xc00) {
779		printk("sizeof(struct jr3_channel) = %x [expected %x]\n",
780			(unsigned)sizeof(struct jr3_channel), 0xc00);
781		return -EINVAL;
782	}
783
784	result = alloc_private(dev, sizeof(struct jr3_pci_dev_private));
785	if (result < 0) {
786		return -ENOMEM;
787	}
788	card = NULL;
789	devpriv = dev->private;
790	init_timer(&devpriv->timer);
791	while (1) {
792		card = pci_get_device(PCI_VENDOR_ID_JR3, PCI_ANY_ID, card);
793		if (card == NULL) {
794			/* No card found */
795			break;
796		} else {
797			switch (card->device) {
798			case PCI_DEVICE_ID_JR3_1_CHANNEL:{
799					devpriv->n_channels = 1;
800				}
801				break;
802			case PCI_DEVICE_ID_JR3_2_CHANNEL:{
803					devpriv->n_channels = 2;
804				}
805				break;
806			case PCI_DEVICE_ID_JR3_3_CHANNEL:{
807					devpriv->n_channels = 3;
808				}
809				break;
810			case PCI_DEVICE_ID_JR3_4_CHANNEL:{
811					devpriv->n_channels = 4;
812				}
813				break;
814			default:{
815					devpriv->n_channels = 0;
816				}
817			}
818			if (devpriv->n_channels >= 1) {
819				if (opt_bus == 0 && opt_slot == 0) {
820					/* Take first available card */
821					break;
822				} else if (opt_bus == card->bus->number &&
823					opt_slot == PCI_SLOT(card->devfn)) {
824					/* Take requested card */
825					break;
826				}
827			}
828		}
829	}
830	if (!card) {
831		printk(" no jr3_pci found\n");
832		return -EIO;
833	} else {
834		devpriv->pci_dev = card;
835		dev->board_name = "jr3_pci";
836	}
837
838	result = comedi_pci_enable(card, "jr3_pci");
839	if (result < 0) {
840		return -EIO;
841	}
842
843	devpriv->pci_enabled = 1;
844	devpriv->iobase = ioremap(pci_resource_start(card, 0), sizeof(struct jr3_t));
845	result = alloc_subdevices(dev, devpriv->n_channels);
846	if (result < 0)
847		goto out;
848
849	dev->open = jr3_pci_open;
850	for (i = 0; i < devpriv->n_channels; i++) {
851		dev->subdevices[i].type = COMEDI_SUBD_AI;
852		dev->subdevices[i].subdev_flags = SDF_READABLE | SDF_GROUND;
853		dev->subdevices[i].n_chan = 8 * 7 + 2;
854		dev->subdevices[i].insn_read = jr3_pci_ai_insn_read;
855		dev->subdevices[i].private =
856			kzalloc(sizeof(struct jr3_pci_subdev_private), GFP_KERNEL);
857		if (dev->subdevices[i].private) {
858			struct jr3_pci_subdev_private *p;
859			int j;
860
861			p = dev->subdevices[i].private;
862			p->channel = &devpriv->iobase->channel[i].data;
863			printk("p->channel %p %p (%tx)\n",
864				p->channel, devpriv->iobase,
865				((char *)(p->channel) -
866					(char *)(devpriv->iobase)));
867			p->channel_no = i;
868			for (j = 0; j < 8; j++) {
869				int k;
870
871				p->range[j].length = 1;
872				p->range[j].range.min = -1000000;
873				p->range[j].range.max = 1000000;
874				for (k = 0; k < 7; k++) {
875					p->range_table_list[j + k * 8] =
876						(struct comedi_lrange *) & p->range[j];
877					p->maxdata_list[j + k * 8] = 0x7fff;
878				}
879			}
880			p->range[8].length = 1;
881			p->range[8].range.min = 0;
882			p->range[8].range.max = 65536;
883
884			p->range_table_list[56] =
885				(struct comedi_lrange *) & p->range[8];
886			p->range_table_list[57] =
887				(struct comedi_lrange *) & p->range[8];
888			p->maxdata_list[56] = 0xffff;
889			p->maxdata_list[57] = 0xffff;
890			/*  Channel specific range and maxdata */
891			dev->subdevices[i].range_table = 0;
892			dev->subdevices[i].range_table_list =
893				p->range_table_list;
894			dev->subdevices[i].maxdata = 0;
895			dev->subdevices[i].maxdata_list = p->maxdata_list;
896		}
897	}
898
899	/*  Reset DSP card */
900	devpriv->iobase->channel[0].reset = 0;
901
902	result = comedi_load_firmware(dev, "jr3pci.idm", jr3_download_firmware);
903	printk("Firmare load %d\n", result);
904
905	if (result < 0) {
906		goto out;
907	}
908/*
909 * TODO: use firmware to load preferred offset tables. Suggested
910 * format:
911 *     model serial Fx Fy Fz Mx My Mz\n
912 *
913 *     comedi_load_firmware(dev, "jr3_offsets_table", jr3_download_firmware);
914 */
915
916/*
917 * It takes a few milliseconds for software to settle as much as we
918 * can read firmware version
919 */
920	msleep_interruptible(25);
921	for (i = 0; i < 0x18; i++) {
922		printk("%c",
923			get_u16(&devpriv->iobase->channel[0].data.
924				copyright[i]) >> 8);
925	}
926
927	/*  Start card timer */
928	for (i = 0; i < devpriv->n_channels; i++) {
929		struct jr3_pci_subdev_private *p = dev->subdevices[i].private;
930
931		p->next_time_min = jiffies + msecs_to_jiffies(500);
932		p->next_time_max = jiffies + msecs_to_jiffies(2000);
933	}
934
935	devpriv->timer.data = (unsigned long)dev;
936	devpriv->timer.function = jr3_pci_poll_dev;
937	devpriv->timer.expires = jiffies + msecs_to_jiffies(1000);
938	add_timer(&devpriv->timer);
939
940      out:
941	return result;
942}
943
944static int jr3_pci_detach(struct comedi_device *dev)
945{
946	int i;
947	struct jr3_pci_dev_private *devpriv = dev->private;
948
949	printk("comedi%d: jr3_pci: remove\n", dev->minor);
950	if (devpriv) {
951		del_timer_sync(&devpriv->timer);
952
953		if (dev->subdevices) {
954			for (i = 0; i < devpriv->n_channels; i++) {
955				kfree(dev->subdevices[i].private);
956			}
957		}
958
959		if (devpriv->iobase) {
960			iounmap((void *)devpriv->iobase);
961		}
962		if (devpriv->pci_enabled) {
963			comedi_pci_disable(devpriv->pci_dev);
964		}
965
966		if (devpriv->pci_dev) {
967			pci_dev_put(devpriv->pci_dev);
968		}
969	}
970	return 0;
971}
972
973COMEDI_PCI_INITCLEANUP(driver_jr3_pci, jr3_pci_pci_table);
974