root/drivers/input/serio/i8042-sparcio.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. i8042_read_data
  2. i8042_read_status
  3. i8042_write_data
  4. i8042_write_command
  5. sparc_i8042_probe
  6. sparc_i8042_remove
  7. i8042_platform_init
  8. i8042_platform_exit
  9. i8042_platform_init
  10. i8042_platform_exit

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

/* [<][>][^][v][top][bottom][index][help] */