]> err.no Git - linux-2.6/blobdiff - drivers/input/serio/i8042-sparcio.h
sparc: i8042-sparcio.h: fix warning
[linux-2.6] / drivers / input / serio / i8042-sparcio.h
index 6d66351805a2506e8c8d75dcf090b23197d82a0d..66bafe308b0cd053252e4f0cbf8b3644dfd7c5a5 100644 (file)
@@ -1,13 +1,10 @@
 #ifndef _I8042_SPARCIO_H
 #define _I8042_SPARCIO_H
 
-#include <linux/config.h>
 #include <asm/io.h>
-
-#ifdef CONFIG_PCI
 #include <asm/oplib.h>
-#include <asm/ebus.h>
-#endif
+#include <asm/prom.h>
+#include <asm/of_device.h>
 
 static int i8042_kbd_irq = -1;
 static int i8042_aux_irq = -1;
@@ -19,6 +16,7 @@ static int i8042_aux_irq = -1;
 #define I8042_MUX_PHYS_DESC "sparcps2/serio%d"
 
 static void __iomem *kbd_iobase;
+static struct resource *kbd_res;
 
 #define I8042_COMMAND_REG      (kbd_iobase + 0x64UL)
 #define I8042_DATA_REG         (kbd_iobase + 0x60UL)
@@ -43,59 +41,88 @@ static inline void i8042_write_command(int val)
        writeb(val, kbd_iobase + 0x64UL);
 }
 
+#ifdef CONFIG_PCI
+
 #define OBP_PS2KBD_NAME1       "kb_ps2"
 #define OBP_PS2KBD_NAME2       "keyboard"
 #define OBP_PS2MS_NAME1                "kdmouse"
 #define OBP_PS2MS_NAME2                "mouse"
 
-static int __init i8042_platform_init(void)
+static int __devinit sparc_i8042_probe(struct of_device *op, const struct of_device_id *match)
 {
-#ifndef CONFIG_PCI
-       return -ENODEV;
-#else
-       char prop[128];
-       int len;
-
-       len = prom_getproperty(prom_root_node, "name", prop, sizeof(prop));
-       if (len < 0) {
-               printk("i8042: Cannot get name property of root OBP node.\n");
-               return -ENODEV;
+       struct device_node *dp = op->node;
+
+       dp = dp->child;
+       while (dp) {
+               if (!strcmp(dp->name, OBP_PS2KBD_NAME1) ||
+                   !strcmp(dp->name, OBP_PS2KBD_NAME2)) {
+                       struct of_device *kbd = of_find_device_by_node(dp);
+                       unsigned int irq = kbd->irqs[0];
+                       if (irq == 0xffffffff)
+                               irq = op->irqs[0];
+                       i8042_kbd_irq = irq;
+                       kbd_iobase = of_ioremap(&kbd->resource[0],
+                                               0, 8, "kbd");
+                       kbd_res = &kbd->resource[0];
+               } else if (!strcmp(dp->name, OBP_PS2MS_NAME1) ||
+                          !strcmp(dp->name, OBP_PS2MS_NAME2)) {
+                       struct of_device *ms = of_find_device_by_node(dp);
+                       unsigned int irq = ms->irqs[0];
+                       if (irq == 0xffffffff)
+                               irq = op->irqs[0];
+                       i8042_aux_irq = irq;
+               }
+
+               dp = dp->sibling;
        }
-       if (strncmp(prop, "SUNW,JavaStation-1", len) == 0) {
+
+       return 0;
+}
+
+static int __devexit sparc_i8042_remove(struct of_device *op)
+{
+       of_iounmap(kbd_res, kbd_iobase, 8);
+
+       return 0;
+}
+
+static struct of_device_id sparc_i8042_match[] = {
+       {
+               .name = "8042",
+       },
+       {},
+};
+MODULE_DEVICE_TABLE(of, sparc_i8042_match);
+
+static struct of_platform_driver sparc_i8042_driver = {
+       .name           = "i8042",
+       .match_table    = sparc_i8042_match,
+       .probe          = sparc_i8042_probe,
+       .remove         = __devexit_p(sparc_i8042_remove),
+};
+
+static int __init i8042_platform_init(void)
+{
+       struct device_node *root = of_find_node_by_path("/");
+
+       if (!strcmp(root->name, "SUNW,JavaStation-1")) {
                /* Hardcoded values for MrCoffee.  */
                i8042_kbd_irq = i8042_aux_irq = 13 | 0x20;
                kbd_iobase = ioremap(0x71300060, 8);
                if (!kbd_iobase)
                        return -ENODEV;
        } else {
-               struct linux_ebus *ebus;
-               struct linux_ebus_device *edev;
-               struct linux_ebus_child *child;
-
-               for_each_ebus(ebus) {
-                       for_each_ebusdev(edev, ebus) {
-                               if (!strcmp(edev->prom_node->name, "8042"))
-                                       goto edev_found;
-                       }
-               }
-               return -ENODEV;
-
-       edev_found:
-               for_each_edevchild(edev, child) {
-                       if (!strcmp(child->prom_node->name, OBP_PS2KBD_NAME1) ||
-                           !strcmp(child->prom_node->name, OBP_PS2KBD_NAME2)) {
-                               i8042_kbd_irq = child->irqs[0];
-                               kbd_iobase =
-                                       ioremap(child->resource[0].start, 8);
-                       }
-                       if (!strcmp(child->prom_node->name, OBP_PS2MS_NAME1) ||
-                           !strcmp(child->prom_node->name, OBP_PS2MS_NAME2))
-                               i8042_aux_irq = child->irqs[0];
-               }
+               int err = of_register_driver(&sparc_i8042_driver,
+                                            &of_bus_type);
+               if (err)
+                       return err;
+
                if (i8042_kbd_irq == -1 ||
                    i8042_aux_irq == -1) {
-                       printk("i8042: Error, 8042 device lacks both kbd and "
-                              "mouse nodes.\n");
+                       if (kbd_iobase) {
+                               of_iounmap(kbd_res, kbd_iobase, 8);
+                               kbd_iobase = (void __iomem *) NULL;
+                       }
                        return -ENODEV;
                }
        }
@@ -103,14 +130,25 @@ static int __init i8042_platform_init(void)
        i8042_reset = 1;
 
        return 0;
-#endif /* CONFIG_PCI */
 }
 
 static inline void i8042_platform_exit(void)
 {
-#ifdef CONFIG_PCI
-       iounmap(kbd_iobase);
-#endif
+       struct device_node *root = of_find_node_by_path("/");
+
+       if (strcmp(root->name, "SUNW,JavaStation-1"))
+               of_unregister_driver(&sparc_i8042_driver);
+}
+
+#else /* !CONFIG_PCI */
+static int __init i8042_platform_init(void)
+{
+       return -ENODEV;
+}
+
+static inline void i8042_platform_exit(void)
+{
 }
+#endif /* !CONFIG_PCI */
 
 #endif /* _I8042_SPARCIO_H */