OpenCores
URL https://opencores.org/ocsvn/test_project/test_project/trunk

Subversion Repositories test_project

[/] [test_project/] [trunk/] [linux_sd_driver/] [drivers/] [input/] [serio/] [i8042-sparcio.h] - Blame information for rev 62

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 62 marcus.erl
#ifndef _I8042_SPARCIO_H
2
#define _I8042_SPARCIO_H
3
 
4
#include <asm/io.h>
5
#include <asm/oplib.h>
6
#include <asm/prom.h>
7
#include <asm/of_device.h>
8
 
9
static int i8042_kbd_irq = -1;
10
static int i8042_aux_irq = -1;
11
#define I8042_KBD_IRQ i8042_kbd_irq
12
#define I8042_AUX_IRQ i8042_aux_irq
13
 
14
#define I8042_KBD_PHYS_DESC "sparcps2/serio0"
15
#define I8042_AUX_PHYS_DESC "sparcps2/serio1"
16
#define I8042_MUX_PHYS_DESC "sparcps2/serio%d"
17
 
18
static void __iomem *kbd_iobase;
19
static struct resource *kbd_res;
20
 
21
#define I8042_COMMAND_REG       (kbd_iobase + 0x64UL)
22
#define I8042_DATA_REG          (kbd_iobase + 0x60UL)
23
 
24
static inline int i8042_read_data(void)
25
{
26
        return readb(kbd_iobase + 0x60UL);
27
}
28
 
29
static inline int i8042_read_status(void)
30
{
31
        return readb(kbd_iobase + 0x64UL);
32
}
33
 
34
static inline void i8042_write_data(int val)
35
{
36
        writeb(val, kbd_iobase + 0x60UL);
37
}
38
 
39
static inline void i8042_write_command(int val)
40
{
41
        writeb(val, kbd_iobase + 0x64UL);
42
}
43
 
44
#define OBP_PS2KBD_NAME1        "kb_ps2"
45
#define OBP_PS2KBD_NAME2        "keyboard"
46
#define OBP_PS2MS_NAME1         "kdmouse"
47
#define OBP_PS2MS_NAME2         "mouse"
48
 
49
static int __devinit sparc_i8042_probe(struct of_device *op, const struct of_device_id *match)
50
{
51
        struct device_node *dp = op->node;
52
 
53
        dp = dp->child;
54
        while (dp) {
55
                if (!strcmp(dp->name, OBP_PS2KBD_NAME1) ||
56
                    !strcmp(dp->name, OBP_PS2KBD_NAME2)) {
57
                        struct of_device *kbd = of_find_device_by_node(dp);
58
                        unsigned int irq = kbd->irqs[0];
59
                        if (irq == 0xffffffff)
60
                                irq = op->irqs[0];
61
                        i8042_kbd_irq = irq;
62
                        kbd_iobase = of_ioremap(&kbd->resource[0],
63
                                                0, 8, "kbd");
64
                        kbd_res = &kbd->resource[0];
65
                } else if (!strcmp(dp->name, OBP_PS2MS_NAME1) ||
66
                           !strcmp(dp->name, OBP_PS2MS_NAME2)) {
67
                        struct of_device *ms = of_find_device_by_node(dp);
68
                        unsigned int irq = ms->irqs[0];
69
                        if (irq == 0xffffffff)
70
                                irq = op->irqs[0];
71
                        i8042_aux_irq = irq;
72
                }
73
 
74
                dp = dp->sibling;
75
        }
76
 
77
        return 0;
78
}
79
 
80
static int __devexit sparc_i8042_remove(struct of_device *op)
81
{
82
        of_iounmap(kbd_res, kbd_iobase, 8);
83
 
84
        return 0;
85
}
86
 
87
static struct of_device_id sparc_i8042_match[] = {
88
        {
89
                .name = "8042",
90
        },
91
        {},
92
};
93
MODULE_DEVICE_TABLE(of, sparc_i8042_match);
94
 
95
static struct of_platform_driver sparc_i8042_driver = {
96
        .name           = "i8042",
97
        .match_table    = sparc_i8042_match,
98
        .probe          = sparc_i8042_probe,
99
        .remove         = __devexit_p(sparc_i8042_remove),
100
};
101
 
102
static int __init i8042_platform_init(void)
103
{
104
#ifndef CONFIG_PCI
105
        return -ENODEV;
106
#else
107
        struct device_node *root = of_find_node_by_path("/");
108
 
109
        if (!strcmp(root->name, "SUNW,JavaStation-1")) {
110
                /* Hardcoded values for MrCoffee.  */
111
                i8042_kbd_irq = i8042_aux_irq = 13 | 0x20;
112
                kbd_iobase = ioremap(0x71300060, 8);
113
                if (!kbd_iobase)
114
                        return -ENODEV;
115
        } else {
116
                int err = of_register_driver(&sparc_i8042_driver,
117
                                             &of_bus_type);
118
                if (err)
119
                        return err;
120
 
121
                if (i8042_kbd_irq == -1 ||
122
                    i8042_aux_irq == -1) {
123
                        if (kbd_iobase) {
124
                                of_iounmap(kbd_res, kbd_iobase, 8);
125
                                kbd_iobase = (void __iomem *) NULL;
126
                        }
127
                        return -ENODEV;
128
                }
129
        }
130
 
131
        i8042_reset = 1;
132
 
133
        return 0;
134
#endif /* CONFIG_PCI */
135
}
136
 
137
static inline void i8042_platform_exit(void)
138
{
139
#ifdef CONFIG_PCI
140
        struct device_node *root = of_find_node_by_path("/");
141
 
142
        if (strcmp(root->name, "SUNW,JavaStation-1"))
143
                of_unregister_driver(&sparc_i8042_driver);
144
#endif
145
}
146
 
147
#endif /* _I8042_SPARCIO_H */

powered by: WebSVN 2.1.0

© copyright 1999-2025 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.