• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /netgear-R7000-V1.0.7.12_1.2.5/components/opensource/linux/linux-2.6.36/arch/alpha/kernel/
1#include <linux/ioport.h>
2#include <asm/io.h>
3
4#include "pc873xx.h"
5
6static unsigned pc873xx_probelist[] = {0x398, 0x26e, 0};
7
8static char *pc873xx_names[] = {
9	"PC87303", "PC87306", "PC87312", "PC87332", "PC87334"
10};
11
12static unsigned int base, model;
13
14
15unsigned int __init pc873xx_get_base()
16{
17	return base;
18}
19
20char *__init pc873xx_get_model()
21{
22	return pc873xx_names[model];
23}
24
25static unsigned char __init pc873xx_read(unsigned int base, int reg)
26{
27	outb(reg, base);
28	return inb(base + 1);
29}
30
31static void __init pc873xx_write(unsigned int base, int reg, unsigned char data)
32{
33	unsigned long flags;
34
35	local_irq_save(flags);
36	outb(reg, base);
37	outb(data, base + 1);
38	outb(data, base + 1);		/* Must be written twice */
39	local_irq_restore(flags);
40}
41
42int __init pc873xx_probe(void)
43{
44	int val, index = 0;
45
46	while ((base = pc873xx_probelist[index++])) {
47
48		if (request_region(base, 2, "Super IO PC873xx") == NULL)
49			continue;
50
51		val = pc873xx_read(base, REG_SID);
52		if ((val & 0xf0) == 0x10) {
53			model = PC87332;
54			break;
55		} else if ((val & 0xf8) == 0x70) {
56			model = PC87306;
57			break;
58		} else if ((val & 0xf8) == 0x50) {
59			model = PC87334;
60			break;
61		} else if ((val & 0xf8) == 0x40) {
62			model = PC87303;
63			break;
64		}
65
66		release_region(base, 2);
67	}
68
69	return (base == 0) ? -1 : 1;
70}
71
72void __init pc873xx_enable_epp19(void)
73{
74	unsigned char data;
75
76	printk(KERN_INFO "PC873xx enabling EPP v1.9\n");
77	data = pc873xx_read(base, REG_PCR);
78	pc873xx_write(base, REG_PCR, (data & 0xFC) | 0x02);
79}
80
81void __init pc873xx_enable_ide(void)
82{
83	unsigned char data;
84
85	printk(KERN_INFO "PC873xx enabling IDE interrupt\n");
86	data = pc873xx_read(base, REG_FER);
87	pc873xx_write(base, REG_FER, data | 0x40);
88}
89