wax.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:3k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * WAX Device Driver
  3.  *
  4.  * (c) Copyright 2000 The Puffin Group Inc.
  5.  *
  6.  * This program is free software; you can redistribute it and/or modify
  7.  * it under the terms of the GNU General Public License as published by
  8.  *      the Free Software Foundation; either version 2 of the License, or
  9.  *      (at your option) any later version.
  10.  *
  11.  * by Helge Deller <deller@gmx.de>
  12.  */
  13. #include <linux/errno.h>
  14. #include <linux/init.h>
  15. #include <linux/interrupt.h>
  16. #include <linux/ioport.h>
  17. #include <linux/slab.h>
  18. #include <linux/module.h>
  19. #include <linux/slab.h>
  20. #include <linux/types.h>
  21. #include <asm/io.h>
  22. #include <asm/hardware.h>
  23. #include <asm/gsc.h>
  24. #include <asm/irq.h>
  25. #include "busdevice.h"
  26. #define WAX_GSC_IRQ 7 /* Hardcoded Interrupt for GSC */
  27. #define WAX_GSC_NMI_IRQ 29
  28. static int wax_choose_irq(struct parisc_device *dev)
  29. {
  30. int irq = -1;
  31. switch (dev->id.sversion) {
  32. case 0x73: irq = 30; break; /* HIL */
  33. case 0x8c: irq = 25; break; /* RS232 */
  34. case 0x90: irq = 21; break; /* WAX EISA BA */
  35. }
  36. return irq;
  37. }
  38. static void __init
  39. wax_init_irq(struct busdevice *wax)
  40. {
  41. unsigned long base = wax->hpa;
  42. /* Stop WAX barking for a bit */
  43. gsc_writel(0x00000000, base+OFFSET_IMR);
  44. /* clear pending interrupts */
  45. (volatile u32) gsc_readl(base+OFFSET_IRR);
  46. /* We're not really convinced we want to reset the onboard
  47.          * devices. Firmware does it for us...
  48.  */
  49. /* Resets */
  50. // gsc_writel(0xFFFFFFFF, base+0x1000); /* HIL */
  51. // gsc_writel(0xFFFFFFFF, base+0x2000); /* RS232-B on Wax */
  52. /* Ok we hit it on the head with a hammer, our Dog is now
  53. ** comatose and muzzled.  Devices will now unmask WAX
  54. ** interrupts as they are registered as irq's in the WAX range.
  55. */
  56. }
  57. int __init
  58. wax_init_chip(struct parisc_device *dev)
  59. {
  60. struct busdevice *wax;
  61. struct gsc_irq gsc_irq;
  62. int irq, ret;
  63. wax = kmalloc(sizeof(struct busdevice), GFP_KERNEL);
  64. if (!wax)
  65. return -ENOMEM;
  66. wax->name = "Wax";
  67. wax->hpa = dev->hpa;
  68. wax->version = 0;   /* gsc_readb(wax->hpa+WAX_VER); */
  69. printk(KERN_INFO "%s at 0x%lx found.n", wax->name, wax->hpa);
  70. /* Stop wax hissing for a bit */
  71. wax_init_irq(wax);
  72. /* the IRQ wax should use */
  73. irq = gsc_claim_irq(&gsc_irq, WAX_GSC_IRQ);
  74. if (irq < 0) {
  75. printk(KERN_ERR "%s(): cannot get GSC irqn",
  76. __FUNCTION__);
  77. kfree(wax);
  78. return -EBUSY;
  79. }
  80. ret = request_irq(gsc_irq.irq, busdev_barked, 0, "wax", wax);
  81. if (ret < 0) {
  82. kfree(wax);
  83. return ret;
  84. }
  85. /* Save this for debugging later */
  86. wax->parent_irq = gsc_irq.irq;
  87. wax->eim = ((u32) gsc_irq.txn_addr) | gsc_irq.txn_data;
  88. /* enable IRQ's for devices below WAX */
  89. gsc_writel(wax->eim, wax->hpa + OFFSET_IAR);
  90. /* Done init'ing, register this driver */
  91. ret = gsc_common_irqsetup(dev, wax);
  92. if (ret) {
  93. kfree(wax);
  94. return ret;
  95. }
  96. fixup_child_irqs(dev, wax->busdev_region->data.irqbase,
  97. wax_choose_irq);
  98. /* On 715-class machines, Wax EISA is a sibling of Wax, not a child. */
  99. if (dev->parent->id.hw_type != HPHW_IOA) {
  100. fixup_child_irqs(dev->parent, wax->busdev_region->data.irqbase,
  101. wax_choose_irq);
  102. }
  103. return ret;
  104. }
  105. static struct parisc_device_id wax_tbl[] = {
  106.    { HPHW_BA, HVERSION_REV_ANY_ID, HVERSION_ANY_ID, 0x0008e },
  107. { 0, }
  108. };
  109. MODULE_DEVICE_TABLE(parisc, wax_tbl);
  110. struct parisc_driver wax_driver = {
  111. name: "Wax",
  112. id_table: wax_tbl,
  113. probe: wax_init_chip,
  114. };