|
@@ -27,6 +27,7 @@
|
|
|
#include "drmP.h"
|
|
|
#include "nouveau_drv.h"
|
|
|
#include "nouveau_hw.h"
|
|
|
+#include "nouveau_gpio.h"
|
|
|
|
|
|
int
|
|
|
nv10_gpio_sense(struct drm_device *dev, int line)
|
|
@@ -80,3 +81,43 @@ nv10_gpio_drive(struct drm_device *dev, int line, int dir, int out)
|
|
|
NVWriteCRTC(dev, 0, reg, mask | (data << line));
|
|
|
return 0;
|
|
|
}
|
|
|
+
|
|
|
+void
|
|
|
+nv10_gpio_irq_enable(struct drm_device *dev, int line, bool on)
|
|
|
+{
|
|
|
+ u32 mask = 0x00010001 << line;
|
|
|
+
|
|
|
+ nv_wr32(dev, 0x001104, mask);
|
|
|
+ nv_mask(dev, 0x001144, mask, on ? mask : 0);
|
|
|
+}
|
|
|
+
|
|
|
+static void
|
|
|
+nv10_gpio_isr(struct drm_device *dev)
|
|
|
+{
|
|
|
+ u32 intr = nv_rd32(dev, 0x1104);
|
|
|
+ u32 hi = (intr & 0x0000ffff) >> 0;
|
|
|
+ u32 lo = (intr & 0xffff0000) >> 16;
|
|
|
+
|
|
|
+ nouveau_gpio_isr(dev, 0, hi | lo);
|
|
|
+
|
|
|
+ nv_wr32(dev, 0x001104, intr);
|
|
|
+}
|
|
|
+
|
|
|
+int
|
|
|
+nv10_gpio_init(struct drm_device *dev)
|
|
|
+{
|
|
|
+ nv_wr32(dev, 0x001140, 0x00000000);
|
|
|
+ nv_wr32(dev, 0x001100, 0xffffffff);
|
|
|
+ nv_wr32(dev, 0x001144, 0x00000000);
|
|
|
+ nv_wr32(dev, 0x001104, 0xffffffff);
|
|
|
+ nouveau_irq_register(dev, 28, nv10_gpio_isr); /* PBUS */
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+void
|
|
|
+nv10_gpio_fini(struct drm_device *dev)
|
|
|
+{
|
|
|
+ nv_wr32(dev, 0x001140, 0x00000000);
|
|
|
+ nv_wr32(dev, 0x001144, 0x00000000);
|
|
|
+ nouveau_irq_unregister(dev, 28);
|
|
|
+}
|