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