1/*
2 *  ISA Plug & Play support
3 *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
4 *
5 *
6 *   This program is free software; you can redistribute it and/or modify
7 *   it under the terms of the GNU General Public License as published by
8 *   the Free Software Foundation; either version 2 of the License, or
9 *   (at your option) any later version.
10 *
11 *   This program is distributed in the hope that it will be useful,
12 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
13 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 *   GNU General Public License for more details.
15 *
16 *   You should have received a copy of the GNU General Public License
17 *   along with this program; if not, write to the Free Software
18 *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19 *
20 *  Changelog:
21 *  2000-01-01	Added quirks handling for buggy hardware
22 *		Peter Denison <peterd@pnd-pc.demon.co.uk>
23 *  2000-06-14	Added isapnp_probe_devs() and isapnp_activate_dev()
24 *		Christoph Hellwig <hch@infradead.org>
25 *  2001-06-03  Added release_region calls to correspond with
26 *		request_region calls when a failure occurs.  Also
27 *		added KERN_* constants to printk() calls.
28 *  2001-11-07  Added isapnp_{,un}register_driver calls along the lines
29 *              of the pci driver interface
30 *              Kai Germaschewski <kai.germaschewski@gmx.de>
31 *  2002-06-06  Made the use of dma channel 0 configurable
32 *              Gerald Teschl <gerald.teschl@univie.ac.at>
33 *  2002-10-06  Ported to PnP Layer - Adam Belay <ambx1@neo.rr.com>
34 *  2003-08-11	Resource Management Updates - Adam Belay <ambx1@neo.rr.com>
35 */
36
37#include <linux/module.h>
38#include <linux/kernel.h>
39#include <linux/errno.h>
40#include <linux/delay.h>
41#include <linux/init.h>
42#include <linux/isapnp.h>
43#include <linux/mutex.h>
44#include <asm/io.h>
45
46#include "../base.h"
47
48#if 0
49#define ISAPNP_REGION_OK
50#endif
51
52int isapnp_disable;		/* Disable ISA PnP */
53static int isapnp_rdp;		/* Read Data Port */
54static int isapnp_reset = 1;	/* reset all PnP cards (deactivate) */
55static int isapnp_verbose = 1;	/* verbose mode */
56
57MODULE_AUTHOR("Jaroslav Kysela <perex@perex.cz>");
58MODULE_DESCRIPTION("Generic ISA Plug & Play support");
59module_param(isapnp_disable, int, 0);
60MODULE_PARM_DESC(isapnp_disable, "ISA Plug & Play disable");
61module_param(isapnp_rdp, int, 0);
62MODULE_PARM_DESC(isapnp_rdp, "ISA Plug & Play read data port");
63module_param(isapnp_reset, int, 0);
64MODULE_PARM_DESC(isapnp_reset, "ISA Plug & Play reset all cards");
65module_param(isapnp_verbose, int, 0);
66MODULE_PARM_DESC(isapnp_verbose, "ISA Plug & Play verbose mode");
67MODULE_LICENSE("GPL");
68
69#define _PIDXR		0x279
70#define _PNPWRP		0xa79
71
72/* short tags */
73#define _STAG_PNPVERNO		0x01
74#define _STAG_LOGDEVID		0x02
75#define _STAG_COMPATDEVID	0x03
76#define _STAG_IRQ		0x04
77#define _STAG_DMA		0x05
78#define _STAG_STARTDEP		0x06
79#define _STAG_ENDDEP		0x07
80#define _STAG_IOPORT		0x08
81#define _STAG_FIXEDIO		0x09
82#define _STAG_VENDOR		0x0e
83#define _STAG_END		0x0f
84/* long tags */
85#define _LTAG_MEMRANGE		0x81
86#define _LTAG_ANSISTR		0x82
87#define _LTAG_UNICODESTR	0x83
88#define _LTAG_VENDOR		0x84
89#define _LTAG_MEM32RANGE	0x85
90#define _LTAG_FIXEDMEM32RANGE	0x86
91
92/* Logical device control and configuration registers */
93
94#define ISAPNP_CFG_ACTIVATE	0x30	/* byte */
95#define ISAPNP_CFG_MEM		0x40	/* 4 * dword */
96#define ISAPNP_CFG_PORT		0x60	/* 8 * word */
97#define ISAPNP_CFG_IRQ		0x70	/* 2 * word */
98#define ISAPNP_CFG_DMA		0x74	/* 2 * byte */
99
100/*
101 * Sizes of ISAPNP logical device configuration register sets.
102 * See PNP-ISA-v1.0a.pdf, Appendix A.
103 */
104#define ISAPNP_MAX_MEM		4
105#define ISAPNP_MAX_PORT		8
106#define ISAPNP_MAX_IRQ		2
107#define ISAPNP_MAX_DMA		2
108
109static unsigned char isapnp_checksum_value;
110static DEFINE_MUTEX(isapnp_cfg_mutex);
111static int isapnp_csn_count;
112
113/* some prototypes */
114
115static inline void write_data(unsigned char x)
116{
117	outb(x, _PNPWRP);
118}
119
120static inline void write_address(unsigned char x)
121{
122	outb(x, _PIDXR);
123	udelay(20);
124}
125
126static inline unsigned char read_data(void)
127{
128	unsigned char val = inb(isapnp_rdp);
129	return val;
130}
131
132unsigned char isapnp_read_byte(unsigned char idx)
133{
134	write_address(idx);
135	return read_data();
136}
137
138static unsigned short isapnp_read_word(unsigned char idx)
139{
140	unsigned short val;
141
142	val = isapnp_read_byte(idx);
143	val = (val << 8) + isapnp_read_byte(idx + 1);
144	return val;
145}
146
147void isapnp_write_byte(unsigned char idx, unsigned char val)
148{
149	write_address(idx);
150	write_data(val);
151}
152
153static void isapnp_write_word(unsigned char idx, unsigned short val)
154{
155	isapnp_write_byte(idx, val >> 8);
156	isapnp_write_byte(idx + 1, val);
157}
158
159static void isapnp_key(void)
160{
161	unsigned char code = 0x6a, msb;
162	int i;
163
164	mdelay(1);
165	write_address(0x00);
166	write_address(0x00);
167
168	write_address(code);
169
170	for (i = 1; i < 32; i++) {
171		msb = ((code & 0x01) ^ ((code & 0x02) >> 1)) << 7;
172		code = (code >> 1) | msb;
173		write_address(code);
174	}
175}
176
177/* place all pnp cards in wait-for-key state */
178static void isapnp_wait(void)
179{
180	isapnp_write_byte(0x02, 0x02);
181}
182
183static void isapnp_wake(unsigned char csn)
184{
185	isapnp_write_byte(0x03, csn);
186}
187
188static void isapnp_device(unsigned char logdev)
189{
190	isapnp_write_byte(0x07, logdev);
191}
192
193static void isapnp_activate(unsigned char logdev)
194{
195	isapnp_device(logdev);
196	isapnp_write_byte(ISAPNP_CFG_ACTIVATE, 1);
197	udelay(250);
198}
199
200static void isapnp_deactivate(unsigned char logdev)
201{
202	isapnp_device(logdev);
203	isapnp_write_byte(ISAPNP_CFG_ACTIVATE, 0);
204	udelay(500);
205}
206
207static void __init isapnp_peek(unsigned char *data, int bytes)
208{
209	int i, j;
210	unsigned char d = 0;
211
212	for (i = 1; i <= bytes; i++) {
213		for (j = 0; j < 20; j++) {
214			d = isapnp_read_byte(0x05);
215			if (d & 1)
216				break;
217			udelay(100);
218		}
219		if (!(d & 1)) {
220			if (data != NULL)
221				*data++ = 0xff;
222			continue;
223		}
224		d = isapnp_read_byte(0x04);	/* PRESDI */
225		isapnp_checksum_value += d;
226		if (data != NULL)
227			*data++ = d;
228	}
229}
230
231#define RDP_STEP	32	/* minimum is 4 */
232
233static int isapnp_next_rdp(void)
234{
235	int rdp = isapnp_rdp;
236	static int old_rdp = 0;
237
238	if (old_rdp) {
239		release_region(old_rdp, 1);
240		old_rdp = 0;
241	}
242	while (rdp <= 0x3ff) {
243		/*
244		 *      We cannot use NE2000 probe spaces for ISAPnP or we
245		 *      will lock up machines.
246		 */
247		if ((rdp < 0x280 || rdp > 0x380)
248		    && request_region(rdp, 1, "ISAPnP")) {
249			isapnp_rdp = rdp;
250			old_rdp = rdp;
251			return 0;
252		}
253		rdp += RDP_STEP;
254	}
255	return -1;
256}
257
258/* Set read port address */
259static inline void isapnp_set_rdp(void)
260{
261	isapnp_write_byte(0x00, isapnp_rdp >> 2);
262	udelay(100);
263}
264
265/*
266 *	Perform an isolation. The port selection code now tries to avoid
267 *	"dangerous to read" ports.
268 */
269static int __init isapnp_isolate_rdp_select(void)
270{
271	isapnp_wait();
272	isapnp_key();
273
274	/* Control: reset CSN and conditionally everything else too */
275	isapnp_write_byte(0x02, isapnp_reset ? 0x05 : 0x04);
276	mdelay(2);
277
278	isapnp_wait();
279	isapnp_key();
280	isapnp_wake(0x00);
281
282	if (isapnp_next_rdp() < 0) {
283		isapnp_wait();
284		return -1;
285	}
286
287	isapnp_set_rdp();
288	udelay(1000);
289	write_address(0x01);
290	udelay(1000);
291	return 0;
292}
293
294/*
295 *  Isolate (assign uniqued CSN) to all ISA PnP devices.
296 */
297static int __init isapnp_isolate(void)
298{
299	unsigned char checksum = 0x6a;
300	unsigned char chksum = 0x00;
301	unsigned char bit = 0x00;
302	int data;
303	int csn = 0;
304	int i;
305	int iteration = 1;
306
307	isapnp_rdp = 0x213;
308	if (isapnp_isolate_rdp_select() < 0)
309		return -1;
310
311	while (1) {
312		for (i = 1; i <= 64; i++) {
313			data = read_data() << 8;
314			udelay(250);
315			data = data | read_data();
316			udelay(250);
317			if (data == 0x55aa)
318				bit = 0x01;
319			checksum =
320			    ((((checksum ^ (checksum >> 1)) & 0x01) ^ bit) << 7)
321			    | (checksum >> 1);
322			bit = 0x00;
323		}
324		for (i = 65; i <= 72; i++) {
325			data = read_data() << 8;
326			udelay(250);
327			data = data | read_data();
328			udelay(250);
329			if (data == 0x55aa)
330				chksum |= (1 << (i - 65));
331		}
332		if (checksum != 0x00 && checksum == chksum) {
333			csn++;
334
335			isapnp_write_byte(0x06, csn);
336			udelay(250);
337			iteration++;
338			isapnp_wake(0x00);
339			isapnp_set_rdp();
340			udelay(1000);
341			write_address(0x01);
342			udelay(1000);
343			goto __next;
344		}
345		if (iteration == 1) {
346			isapnp_rdp += RDP_STEP;
347			if (isapnp_isolate_rdp_select() < 0)
348				return -1;
349		} else if (iteration > 1) {
350			break;
351		}
352__next:
353		if (csn == 255)
354			break;
355		checksum = 0x6a;
356		chksum = 0x00;
357		bit = 0x00;
358	}
359	isapnp_wait();
360	isapnp_csn_count = csn;
361	return csn;
362}
363
364/*
365 *  Read one tag from stream.
366 */
367static int __init isapnp_read_tag(unsigned char *type, unsigned short *size)
368{
369	unsigned char tag, tmp[2];
370
371	isapnp_peek(&tag, 1);
372	if (tag == 0)		/* invalid tag */
373		return -1;
374	if (tag & 0x80) {	/* large item */
375		*type = tag;
376		isapnp_peek(tmp, 2);
377		*size = (tmp[1] << 8) | tmp[0];
378	} else {
379		*type = (tag >> 3) & 0x0f;
380		*size = tag & 0x07;
381	}
382	if (*type == 0xff && *size == 0xffff)	/* probably invalid data */
383		return -1;
384	return 0;
385}
386
387/*
388 *  Skip specified number of bytes from stream.
389 */
390static void __init isapnp_skip_bytes(int count)
391{
392	isapnp_peek(NULL, count);
393}
394
395/*
396 *  Parse logical device tag.
397 */
398static struct pnp_dev *__init isapnp_parse_device(struct pnp_card *card,
399						  int size, int number)
400{
401	unsigned char tmp[6];
402	struct pnp_dev *dev;
403	u32 eisa_id;
404	char id[8];
405
406	isapnp_peek(tmp, size);
407	eisa_id = tmp[0] | tmp[1] << 8 | tmp[2] << 16 | tmp[3] << 24;
408	pnp_eisa_id_to_string(eisa_id, id);
409
410	dev = pnp_alloc_dev(&isapnp_protocol, number, id);
411	if (!dev)
412		return NULL;
413
414	dev->card = card;
415	dev->capabilities |= PNP_CONFIGURABLE;
416	dev->capabilities |= PNP_READ;
417	dev->capabilities |= PNP_WRITE;
418	dev->capabilities |= PNP_DISABLE;
419	pnp_init_resources(dev);
420	return dev;
421}
422
423/*
424 *  Add IRQ resource to resources list.
425 */
426static void __init isapnp_parse_irq_resource(struct pnp_dev *dev,
427					     unsigned int option_flags,
428					     int size)
429{
430	unsigned char tmp[3];
431	unsigned long bits;
432	pnp_irq_mask_t map;
433	unsigned char flags = IORESOURCE_IRQ_HIGHEDGE;
434
435	isapnp_peek(tmp, size);
436	bits = (tmp[1] << 8) | tmp[0];
437
438	bitmap_zero(map.bits, PNP_IRQ_NR);
439	bitmap_copy(map.bits, &bits, 16);
440
441	if (size > 2)
442		flags = tmp[2];
443
444	pnp_register_irq_resource(dev, option_flags, &map, flags);
445}
446
447/*
448 *  Add DMA resource to resources list.
449 */
450static void __init isapnp_parse_dma_resource(struct pnp_dev *dev,
451					     unsigned int option_flags,
452					     int size)
453{
454	unsigned char tmp[2];
455
456	isapnp_peek(tmp, size);
457	pnp_register_dma_resource(dev, option_flags, tmp[0], tmp[1]);
458}
459
460/*
461 *  Add port resource to resources list.
462 */
463static void __init isapnp_parse_port_resource(struct pnp_dev *dev,
464					      unsigned int option_flags,
465					      int size)
466{
467	unsigned char tmp[7];
468	resource_size_t min, max, align, len;
469	unsigned char flags;
470
471	isapnp_peek(tmp, size);
472	min = (tmp[2] << 8) | tmp[1];
473	max = (tmp[4] << 8) | tmp[3];
474	align = tmp[5];
475	len = tmp[6];
476	flags = tmp[0] ? IORESOURCE_IO_16BIT_ADDR : 0;
477	pnp_register_port_resource(dev, option_flags,
478				   min, max, align, len, flags);
479}
480
481/*
482 *  Add fixed port resource to resources list.
483 */
484static void __init isapnp_parse_fixed_port_resource(struct pnp_dev *dev,
485						    unsigned int option_flags,
486						    int size)
487{
488	unsigned char tmp[3];
489	resource_size_t base, len;
490
491	isapnp_peek(tmp, size);
492	base = (tmp[1] << 8) | tmp[0];
493	len = tmp[2];
494	pnp_register_port_resource(dev, option_flags, base, base, 0, len,
495				   IORESOURCE_IO_FIXED);
496}
497
498/*
499 *  Add memory resource to resources list.
500 */
501static void __init isapnp_parse_mem_resource(struct pnp_dev *dev,
502					     unsigned int option_flags,
503					     int size)
504{
505	unsigned char tmp[9];
506	resource_size_t min, max, align, len;
507	unsigned char flags;
508
509	isapnp_peek(tmp, size);
510	min = ((tmp[2] << 8) | tmp[1]) << 8;
511	max = ((tmp[4] << 8) | tmp[3]) << 8;
512	align = (tmp[6] << 8) | tmp[5];
513	len = ((tmp[8] << 8) | tmp[7]) << 8;
514	flags = tmp[0];
515	pnp_register_mem_resource(dev, option_flags,
516				  min, max, align, len, flags);
517}
518
519/*
520 *  Add 32-bit memory resource to resources list.
521 */
522static void __init isapnp_parse_mem32_resource(struct pnp_dev *dev,
523					       unsigned int option_flags,
524					       int size)
525{
526	unsigned char tmp[17];
527	resource_size_t min, max, align, len;
528	unsigned char flags;
529
530	isapnp_peek(tmp, size);
531	min = (tmp[4] << 24) | (tmp[3] << 16) | (tmp[2] << 8) | tmp[1];
532	max = (tmp[8] << 24) | (tmp[7] << 16) | (tmp[6] << 8) | tmp[5];
533	align = (tmp[12] << 24) | (tmp[11] << 16) | (tmp[10] << 8) | tmp[9];
534	len = (tmp[16] << 24) | (tmp[15] << 16) | (tmp[14] << 8) | tmp[13];
535	flags = tmp[0];
536	pnp_register_mem_resource(dev, option_flags,
537				  min, max, align, len, flags);
538}
539
540/*
541 *  Add 32-bit fixed memory resource to resources list.
542 */
543static void __init isapnp_parse_fixed_mem32_resource(struct pnp_dev *dev,
544						     unsigned int option_flags,
545						     int size)
546{
547	unsigned char tmp[9];
548	resource_size_t base, len;
549	unsigned char flags;
550
551	isapnp_peek(tmp, size);
552	base = (tmp[4] << 24) | (tmp[3] << 16) | (tmp[2] << 8) | tmp[1];
553	len = (tmp[8] << 24) | (tmp[7] << 16) | (tmp[6] << 8) | tmp[5];
554	flags = tmp[0];
555	pnp_register_mem_resource(dev, option_flags, base, base, 0, len, flags);
556}
557
558/*
559 *  Parse card name for ISA PnP device.
560 */
561static void __init
562isapnp_parse_name(char *name, unsigned int name_max, unsigned short *size)
563{
564	if (name[0] == '\0') {
565		unsigned short size1 =
566		    *size >= name_max ? (name_max - 1) : *size;
567		isapnp_peek(name, size1);
568		name[size1] = '\0';
569		*size -= size1;
570
571		/* clean whitespace from end of string */
572		while (size1 > 0 && name[--size1] == ' ')
573			name[size1] = '\0';
574	}
575}
576
577/*
578 *  Parse resource map for logical device.
579 */
580static int __init isapnp_create_device(struct pnp_card *card,
581				       unsigned short size)
582{
583	int number = 0, skip = 0, priority, compat = 0;
584	unsigned char type, tmp[17];
585	unsigned int option_flags;
586	struct pnp_dev *dev;
587	u32 eisa_id;
588	char id[8];
589
590	if ((dev = isapnp_parse_device(card, size, number++)) == NULL)
591		return 1;
592	option_flags = 0;
593	pnp_add_card_device(card, dev);
594
595	while (1) {
596		if (isapnp_read_tag(&type, &size) < 0)
597			return 1;
598		if (skip && type != _STAG_LOGDEVID && type != _STAG_END)
599			goto __skip;
600		switch (type) {
601		case _STAG_LOGDEVID:
602			if (size >= 5 && size <= 6) {
603				if ((dev =
604				     isapnp_parse_device(card, size,
605							 number++)) == NULL)
606					return 1;
607				size = 0;
608				skip = 0;
609				option_flags = 0;
610				pnp_add_card_device(card, dev);
611			} else {
612				skip = 1;
613			}
614			compat = 0;
615			break;
616		case _STAG_COMPATDEVID:
617			if (size == 4 && compat < DEVICE_COUNT_COMPATIBLE) {
618				isapnp_peek(tmp, 4);
619				eisa_id = tmp[0] | tmp[1] << 8 |
620					  tmp[2] << 16 | tmp[3] << 24;
621				pnp_eisa_id_to_string(eisa_id, id);
622				pnp_add_id(dev, id);
623				compat++;
624				size = 0;
625			}
626			break;
627		case _STAG_IRQ:
628			if (size < 2 || size > 3)
629				goto __skip;
630			isapnp_parse_irq_resource(dev, option_flags, size);
631			size = 0;
632			break;
633		case _STAG_DMA:
634			if (size != 2)
635				goto __skip;
636			isapnp_parse_dma_resource(dev, option_flags, size);
637			size = 0;
638			break;
639		case _STAG_STARTDEP:
640			if (size > 1)
641				goto __skip;
642			priority = PNP_RES_PRIORITY_ACCEPTABLE;
643			if (size > 0) {
644				isapnp_peek(tmp, size);
645				priority = tmp[0];
646				size = 0;
647			}
648			option_flags = pnp_new_dependent_set(dev, priority);
649			break;
650		case _STAG_ENDDEP:
651			if (size != 0)
652				goto __skip;
653			option_flags = 0;
654			break;
655		case _STAG_IOPORT:
656			if (size != 7)
657				goto __skip;
658			isapnp_parse_port_resource(dev, option_flags, size);
659			size = 0;
660			break;
661		case _STAG_FIXEDIO:
662			if (size != 3)
663				goto __skip;
664			isapnp_parse_fixed_port_resource(dev, option_flags,
665							 size);
666			size = 0;
667			break;
668		case _STAG_VENDOR:
669			break;
670		case _LTAG_MEMRANGE:
671			if (size != 9)
672				goto __skip;
673			isapnp_parse_mem_resource(dev, option_flags, size);
674			size = 0;
675			break;
676		case _LTAG_ANSISTR:
677			isapnp_parse_name(dev->name, sizeof(dev->name), &size);
678			break;
679		case _LTAG_UNICODESTR:
680			/* silently ignore */
681			/* who use unicode for hardware identification? */
682			break;
683		case _LTAG_VENDOR:
684			break;
685		case _LTAG_MEM32RANGE:
686			if (size != 17)
687				goto __skip;
688			isapnp_parse_mem32_resource(dev, option_flags, size);
689			size = 0;
690			break;
691		case _LTAG_FIXEDMEM32RANGE:
692			if (size != 9)
693				goto __skip;
694			isapnp_parse_fixed_mem32_resource(dev, option_flags,
695							  size);
696			size = 0;
697			break;
698		case _STAG_END:
699			if (size > 0)
700				isapnp_skip_bytes(size);
701			return 1;
702		default:
703			dev_err(&dev->dev, "unknown tag %#x (card %i), "
704				"ignored\n", type, card->number);
705		}
706__skip:
707		if (size > 0)
708			isapnp_skip_bytes(size);
709	}
710	return 0;
711}
712
713/*
714 *  Parse resource map for ISA PnP card.
715 */
716static void __init isapnp_parse_resource_map(struct pnp_card *card)
717{
718	unsigned char type, tmp[17];
719	unsigned short size;
720
721	while (1) {
722		if (isapnp_read_tag(&type, &size) < 0)
723			return;
724		switch (type) {
725		case _STAG_PNPVERNO:
726			if (size != 2)
727				goto __skip;
728			isapnp_peek(tmp, 2);
729			card->pnpver = tmp[0];
730			card->productver = tmp[1];
731			size = 0;
732			break;
733		case _STAG_LOGDEVID:
734			if (size >= 5 && size <= 6) {
735				if (isapnp_create_device(card, size) == 1)
736					return;
737				size = 0;
738			}
739			break;
740		case _STAG_VENDOR:
741			break;
742		case _LTAG_ANSISTR:
743			isapnp_parse_name(card->name, sizeof(card->name),
744					  &size);
745			break;
746		case _LTAG_UNICODESTR:
747			/* silently ignore */
748			/* who use unicode for hardware identification? */
749			break;
750		case _LTAG_VENDOR:
751			break;
752		case _STAG_END:
753			if (size > 0)
754				isapnp_skip_bytes(size);
755			return;
756		default:
757			dev_err(&card->dev, "unknown tag %#x, ignored\n",
758			       type);
759		}
760__skip:
761		if (size > 0)
762			isapnp_skip_bytes(size);
763	}
764}
765
766/*
767 *  Compute ISA PnP checksum for first eight bytes.
768 */
769static unsigned char __init isapnp_checksum(unsigned char *data)
770{
771	int i, j;
772	unsigned char checksum = 0x6a, bit, b;
773
774	for (i = 0; i < 8; i++) {
775		b = data[i];
776		for (j = 0; j < 8; j++) {
777			bit = 0;
778			if (b & (1 << j))
779				bit = 1;
780			checksum =
781			    ((((checksum ^ (checksum >> 1)) & 0x01) ^ bit) << 7)
782			    | (checksum >> 1);
783		}
784	}
785	return checksum;
786}
787
788/*
789 *  Build device list for all present ISA PnP devices.
790 */
791static int __init isapnp_build_device_list(void)
792{
793	int csn;
794	unsigned char header[9], checksum;
795	struct pnp_card *card;
796	u32 eisa_id;
797	char id[8];
798
799	isapnp_wait();
800	isapnp_key();
801	for (csn = 1; csn <= isapnp_csn_count; csn++) {
802		isapnp_wake(csn);
803		isapnp_peek(header, 9);
804		checksum = isapnp_checksum(header);
805		eisa_id = header[0] | header[1] << 8 |
806			  header[2] << 16 | header[3] << 24;
807		pnp_eisa_id_to_string(eisa_id, id);
808		card = pnp_alloc_card(&isapnp_protocol, csn, id);
809		if (!card)
810			continue;
811
812		INIT_LIST_HEAD(&card->devices);
813		card->serial =
814		    (header[7] << 24) | (header[6] << 16) | (header[5] << 8) |
815		    header[4];
816		isapnp_checksum_value = 0x00;
817		isapnp_parse_resource_map(card);
818		if (isapnp_checksum_value != 0x00)
819			dev_err(&card->dev, "invalid checksum %#x\n",
820				isapnp_checksum_value);
821		card->checksum = isapnp_checksum_value;
822
823		pnp_add_card(card);
824	}
825	isapnp_wait();
826	return 0;
827}
828
829/*
830 *  Basic configuration routines.
831 */
832
833int isapnp_present(void)
834{
835	struct pnp_card *card;
836
837	pnp_for_each_card(card) {
838		if (card->protocol == &isapnp_protocol)
839			return 1;
840	}
841	return 0;
842}
843
844int isapnp_cfg_begin(int csn, int logdev)
845{
846	if (csn < 1 || csn > isapnp_csn_count || logdev > 10)
847		return -EINVAL;
848	mutex_lock(&isapnp_cfg_mutex);
849	isapnp_wait();
850	isapnp_key();
851	isapnp_wake(csn);
852#if 0
853	/* to avoid malfunction when the isapnptools package is used */
854	/* we must set RDP to our value again */
855	/* it is possible to set RDP only in the isolation phase */
856	/*   Jens Thoms Toerring <Jens.Toerring@physik.fu-berlin.de> */
857	isapnp_write_byte(0x02, 0x04);	/* clear CSN of card */
858	mdelay(2);		/* is this necessary? */
859	isapnp_wake(csn);	/* bring card into sleep state */
860	isapnp_wake(0);		/* bring card into isolation state */
861	isapnp_set_rdp();	/* reset the RDP port */
862	udelay(1000);		/* delay 1000us */
863	isapnp_write_byte(0x06, csn);	/* reset CSN to previous value */
864	udelay(250);		/* is this necessary? */
865#endif
866	if (logdev >= 0)
867		isapnp_device(logdev);
868	return 0;
869}
870
871int isapnp_cfg_end(void)
872{
873	isapnp_wait();
874	mutex_unlock(&isapnp_cfg_mutex);
875	return 0;
876}
877
878/*
879 *  Initialization.
880 */
881
882EXPORT_SYMBOL(isapnp_protocol);
883EXPORT_SYMBOL(isapnp_present);
884EXPORT_SYMBOL(isapnp_cfg_begin);
885EXPORT_SYMBOL(isapnp_cfg_end);
886EXPORT_SYMBOL(isapnp_write_byte);
887
888static int isapnp_get_resources(struct pnp_dev *dev)
889{
890	int i, ret;
891
892	pnp_dbg(&dev->dev, "get resources\n");
893	pnp_init_resources(dev);
894	isapnp_cfg_begin(dev->card->number, dev->number);
895	dev->active = isapnp_read_byte(ISAPNP_CFG_ACTIVATE);
896	if (!dev->active)
897		goto __end;
898
899	for (i = 0; i < ISAPNP_MAX_PORT; i++) {
900		ret = isapnp_read_word(ISAPNP_CFG_PORT + (i << 1));
901		pnp_add_io_resource(dev, ret, ret,
902				    ret == 0 ? IORESOURCE_DISABLED : 0);
903	}
904	for (i = 0; i < ISAPNP_MAX_MEM; i++) {
905		ret = isapnp_read_word(ISAPNP_CFG_MEM + (i << 3)) << 8;
906		pnp_add_mem_resource(dev, ret, ret,
907				     ret == 0 ? IORESOURCE_DISABLED : 0);
908	}
909	for (i = 0; i < ISAPNP_MAX_IRQ; i++) {
910		ret = isapnp_read_word(ISAPNP_CFG_IRQ + (i << 1)) >> 8;
911		pnp_add_irq_resource(dev, ret,
912				     ret == 0 ? IORESOURCE_DISABLED : 0);
913	}
914	for (i = 0; i < ISAPNP_MAX_DMA; i++) {
915		ret = isapnp_read_byte(ISAPNP_CFG_DMA + i);
916		pnp_add_dma_resource(dev, ret,
917				     ret == 4 ? IORESOURCE_DISABLED : 0);
918	}
919
920__end:
921	isapnp_cfg_end();
922	return 0;
923}
924
925static int isapnp_set_resources(struct pnp_dev *dev)
926{
927	struct resource *res;
928	int tmp;
929
930	pnp_dbg(&dev->dev, "set resources\n");
931	isapnp_cfg_begin(dev->card->number, dev->number);
932	dev->active = 1;
933	for (tmp = 0; tmp < ISAPNP_MAX_PORT; tmp++) {
934		res = pnp_get_resource(dev, IORESOURCE_IO, tmp);
935		if (pnp_resource_enabled(res)) {
936			pnp_dbg(&dev->dev, "  set io  %d to %#llx\n",
937				tmp, (unsigned long long) res->start);
938			isapnp_write_word(ISAPNP_CFG_PORT + (tmp << 1),
939					  res->start);
940		}
941	}
942	for (tmp = 0; tmp < ISAPNP_MAX_IRQ; tmp++) {
943		res = pnp_get_resource(dev, IORESOURCE_IRQ, tmp);
944		if (pnp_resource_enabled(res)) {
945			int irq = res->start;
946			if (irq == 2)
947				irq = 9;
948			pnp_dbg(&dev->dev, "  set irq %d to %d\n", tmp, irq);
949			isapnp_write_byte(ISAPNP_CFG_IRQ + (tmp << 1), irq);
950		}
951	}
952	for (tmp = 0; tmp < ISAPNP_MAX_DMA; tmp++) {
953		res = pnp_get_resource(dev, IORESOURCE_DMA, tmp);
954		if (pnp_resource_enabled(res)) {
955			pnp_dbg(&dev->dev, "  set dma %d to %lld\n",
956				tmp, (unsigned long long) res->start);
957			isapnp_write_byte(ISAPNP_CFG_DMA + tmp, res->start);
958		}
959	}
960	for (tmp = 0; tmp < ISAPNP_MAX_MEM; tmp++) {
961		res = pnp_get_resource(dev, IORESOURCE_MEM, tmp);
962		if (pnp_resource_enabled(res)) {
963			pnp_dbg(&dev->dev, "  set mem %d to %#llx\n",
964				tmp, (unsigned long long) res->start);
965			isapnp_write_word(ISAPNP_CFG_MEM + (tmp << 3),
966					  (res->start >> 8) & 0xffff);
967		}
968	}
969	/* FIXME: We aren't handling 32bit mems properly here */
970	isapnp_activate(dev->number);
971	isapnp_cfg_end();
972	return 0;
973}
974
975static int isapnp_disable_resources(struct pnp_dev *dev)
976{
977	if (!dev->active)
978		return -EINVAL;
979	isapnp_cfg_begin(dev->card->number, dev->number);
980	isapnp_deactivate(dev->number);
981	dev->active = 0;
982	isapnp_cfg_end();
983	return 0;
984}
985
986struct pnp_protocol isapnp_protocol = {
987	.name = "ISA Plug and Play",
988	.get = isapnp_get_resources,
989	.set = isapnp_set_resources,
990	.disable = isapnp_disable_resources,
991};
992
993static int __init isapnp_init(void)
994{
995	int cards;
996	struct pnp_card *card;
997	struct pnp_dev *dev;
998
999	if (isapnp_disable) {
1000		printk(KERN_INFO "isapnp: ISA Plug & Play support disabled\n");
1001		return 0;
1002	}
1003#ifdef CONFIG_PPC
1004	if (check_legacy_ioport(_PIDXR) || check_legacy_ioport(_PNPWRP))
1005		return -EINVAL;
1006#endif
1007#ifdef ISAPNP_REGION_OK
1008	if (!request_region(_PIDXR, 1, "isapnp index")) {
1009		printk(KERN_ERR "isapnp: Index Register 0x%x already used\n",
1010		       _PIDXR);
1011		return -EBUSY;
1012	}
1013#endif
1014	if (!request_region(_PNPWRP, 1, "isapnp write")) {
1015		printk(KERN_ERR
1016		       "isapnp: Write Data Register 0x%x already used\n",
1017		       _PNPWRP);
1018#ifdef ISAPNP_REGION_OK
1019		release_region(_PIDXR, 1);
1020#endif
1021		return -EBUSY;
1022	}
1023
1024	if (pnp_register_protocol(&isapnp_protocol) < 0)
1025		return -EBUSY;
1026
1027	/*
1028	 *      Print a message. The existing ISAPnP code is hanging machines
1029	 *      so let the user know where.
1030	 */
1031
1032	printk(KERN_INFO "isapnp: Scanning for PnP cards...\n");
1033	if (isapnp_rdp >= 0x203 && isapnp_rdp <= 0x3ff) {
1034		isapnp_rdp |= 3;
1035		if (!request_region(isapnp_rdp, 1, "isapnp read")) {
1036			printk(KERN_ERR
1037			       "isapnp: Read Data Register 0x%x already used\n",
1038			       isapnp_rdp);
1039#ifdef ISAPNP_REGION_OK
1040			release_region(_PIDXR, 1);
1041#endif
1042			release_region(_PNPWRP, 1);
1043			return -EBUSY;
1044		}
1045		isapnp_set_rdp();
1046	}
1047	if (isapnp_rdp < 0x203 || isapnp_rdp > 0x3ff) {
1048		cards = isapnp_isolate();
1049		if (cards < 0 || (isapnp_rdp < 0x203 || isapnp_rdp > 0x3ff)) {
1050#ifdef ISAPNP_REGION_OK
1051			release_region(_PIDXR, 1);
1052#endif
1053			release_region(_PNPWRP, 1);
1054			printk(KERN_INFO
1055			       "isapnp: No Plug & Play device found\n");
1056			return 0;
1057		}
1058		request_region(isapnp_rdp, 1, "isapnp read");
1059	}
1060	isapnp_build_device_list();
1061	cards = 0;
1062
1063	protocol_for_each_card(&isapnp_protocol, card) {
1064		cards++;
1065		if (isapnp_verbose) {
1066			dev_info(&card->dev, "card '%s'\n",
1067			       card->name[0] ? card->name : "unknown");
1068			if (isapnp_verbose < 2)
1069				continue;
1070			card_for_each_dev(card, dev) {
1071				dev_info(&card->dev, "device '%s'\n",
1072				       dev->name[0] ? dev->name : "unknown");
1073			}
1074		}
1075	}
1076	if (cards)
1077		printk(KERN_INFO
1078		       "isapnp: %i Plug & Play card%s detected total\n", cards,
1079		       cards > 1 ? "s" : "");
1080	else
1081		printk(KERN_INFO "isapnp: No Plug & Play card found\n");
1082
1083	isapnp_proc_init();
1084	return 0;
1085}
1086
1087device_initcall(isapnp_init);
1088
1089/* format is: noisapnp */
1090
1091static int __init isapnp_setup_disable(char *str)
1092{
1093	isapnp_disable = 1;
1094	return 1;
1095}
1096
1097__setup("noisapnp", isapnp_setup_disable);
1098
1099/* format is: isapnp=rdp,reset,skip_pci_scan,verbose */
1100
1101static int __init isapnp_setup_isapnp(char *str)
1102{
1103	(void)((get_option(&str, &isapnp_rdp) == 2) &&
1104	       (get_option(&str, &isapnp_reset) == 2) &&
1105	       (get_option(&str, &isapnp_verbose) == 2));
1106	return 1;
1107}
1108
1109__setup("isapnp=", isapnp_setup_isapnp);
1110