diff options
| author | Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp> | 2006-07-13 04:33:14 -0400 |
|---|---|---|
| committer | Ralf Baechle <ralf@linux-mips.org> | 2006-07-13 16:26:19 -0400 |
| commit | efcb487a8e9a86874cf63c3fbf6c85bbf87e6d87 (patch) | |
| tree | 621f0f33f95709303c9deea5f726ccfb4eb75e9a | |
| parent | 66151bbd20c6c62dbe5b131484c885086e3a8d29 (diff) | |
[MIPS] vr41xx: Removed old v2.4 VRC4173 driver
Signed-off-by: Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp>
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
| -rw-r--r-- | arch/mips/vr41xx/Kconfig | 6 | ||||
| -rw-r--r-- | arch/mips/vr41xx/common/Makefile | 3 | ||||
| -rw-r--r-- | arch/mips/vr41xx/common/vrc4173.c | 582 | ||||
| -rw-r--r-- | include/asm-mips/vr41xx/vrc4173.h | 201 |
4 files changed, 1 insertions, 791 deletions
diff --git a/arch/mips/vr41xx/Kconfig b/arch/mips/vr41xx/Kconfig index 6046ef23b2bf..92f41f6f934a 100644 --- a/arch/mips/vr41xx/Kconfig +++ b/arch/mips/vr41xx/Kconfig | |||
| @@ -86,9 +86,3 @@ config PCI_VR41XX | |||
| 86 | depends on MACH_VR41XX && HW_HAS_PCI | 86 | depends on MACH_VR41XX && HW_HAS_PCI |
| 87 | default y | 87 | default y |
| 88 | select PCI | 88 | select PCI |
| 89 | |||
| 90 | config VRC4173 | ||
| 91 | tristate "Add NEC VRC4173 companion chip support" | ||
| 92 | depends on MACH_VR41XX && PCI_VR41XX | ||
| 93 | help | ||
| 94 | The NEC VRC4173 is a companion chip for NEC VR4122/VR4131. | ||
diff --git a/arch/mips/vr41xx/common/Makefile b/arch/mips/vr41xx/common/Makefile index aa373974c80f..975d5caf9d1b 100644 --- a/arch/mips/vr41xx/common/Makefile +++ b/arch/mips/vr41xx/common/Makefile | |||
| @@ -2,7 +2,6 @@ | |||
| 2 | # Makefile for common code of the NEC VR4100 series. | 2 | # Makefile for common code of the NEC VR4100 series. |
| 3 | # | 3 | # |
| 4 | 4 | ||
| 5 | obj-y += bcu.o cmu.o icu.o init.o irq.o pmu.o type.o | 5 | obj-y += bcu.o cmu.o icu.o init.o irq.o pmu.o type.o |
| 6 | obj-$(CONFIG_VRC4173) += vrc4173.o | ||
| 7 | 6 | ||
| 8 | EXTRA_AFLAGS := $(CFLAGS) | 7 | EXTRA_AFLAGS := $(CFLAGS) |
diff --git a/arch/mips/vr41xx/common/vrc4173.c b/arch/mips/vr41xx/common/vrc4173.c deleted file mode 100644 index 3f1ae9721e4e..000000000000 --- a/arch/mips/vr41xx/common/vrc4173.c +++ /dev/null | |||
| @@ -1,582 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * vrc4173.c, NEC VRC4173 base driver for NEC VR4122/VR4131. | ||
| 3 | * | ||
| 4 | * Copyright (C) 2001-2003 MontaVista Software Inc. | ||
| 5 | * Author: Yoichi Yuasa <yyuasa@mvista.com, or source@mvista.com> | ||
| 6 | * Copyright (C) 2004 Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp> | ||
| 7 | * Copyright (C) 2005 Ralf Baechle (ralf@linux-mips.org) | ||
| 8 | * | ||
| 9 | * This program is free software; you can redistribute it and/or modify | ||
| 10 | * it under the terms of the GNU General Public License as published by | ||
| 11 | * the Free Software Foundation; either version 2 of the License, or | ||
| 12 | * (at your option) any later version. | ||
| 13 | * | ||
| 14 | * This program is distributed in the hope that it will be useful, | ||
| 15 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 17 | * GNU General Public License for more details. | ||
| 18 | * | ||
| 19 | * You should have received a copy of the GNU General Public License | ||
| 20 | * along with this program; if not, write to the Free Software | ||
| 21 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 22 | */ | ||
| 23 | #include <linux/init.h> | ||
| 24 | #include <linux/module.h> | ||
| 25 | #include <linux/interrupt.h> | ||
| 26 | #include <linux/irq.h> | ||
| 27 | #include <linux/pci.h> | ||
| 28 | #include <linux/spinlock.h> | ||
| 29 | #include <linux/types.h> | ||
| 30 | |||
| 31 | #include <asm/vr41xx/irq.h> | ||
| 32 | #include <asm/vr41xx/vr41xx.h> | ||
| 33 | #include <asm/vr41xx/vrc4173.h> | ||
| 34 | |||
| 35 | MODULE_DESCRIPTION("NEC VRC4173 base driver for NEC VR4122/4131"); | ||
| 36 | MODULE_AUTHOR("Yoichi Yuasa <yyuasa@mvista.com>"); | ||
| 37 | MODULE_LICENSE("GPL"); | ||
| 38 | |||
| 39 | #define VRC4173_CMUCLKMSK 0x040 | ||
| 40 | #define MSKPIU 0x0001 | ||
| 41 | #define MSKKIU 0x0002 | ||
| 42 | #define MSKAIU 0x0004 | ||
| 43 | #define MSKPS2CH1 0x0008 | ||
| 44 | #define MSKPS2CH2 0x0010 | ||
| 45 | #define MSKUSB 0x0020 | ||
| 46 | #define MSKCARD1 0x0040 | ||
| 47 | #define MSKCARD2 0x0080 | ||
| 48 | #define MSKAC97 0x0100 | ||
| 49 | #define MSK48MUSB 0x0400 | ||
| 50 | #define MSK48MPIN 0x0800 | ||
| 51 | #define MSK48MOSC 0x1000 | ||
| 52 | #define VRC4173_CMUSRST 0x042 | ||
| 53 | #define USBRST 0x0001 | ||
| 54 | #define CARD1RST 0x0002 | ||
| 55 | #define CARD2RST 0x0004 | ||
| 56 | #define AC97RST 0x0008 | ||
| 57 | |||
| 58 | #define VRC4173_SYSINT1REG 0x060 | ||
| 59 | #define VRC4173_MSYSINT1REG 0x06c | ||
| 60 | #define VRC4173_MPIUINTREG 0x06e | ||
| 61 | #define VRC4173_MAIUINTREG 0x070 | ||
| 62 | #define VRC4173_MKIUINTREG 0x072 | ||
| 63 | |||
| 64 | #define VRC4173_SELECTREG 0x09e | ||
| 65 | #define SEL3 0x0008 | ||
| 66 | #define SEL2 0x0004 | ||
| 67 | #define SEL1 0x0002 | ||
| 68 | #define SEL0 0x0001 | ||
| 69 | |||
| 70 | static struct pci_device_id vrc4173_id_table[] __devinitdata = { | ||
| 71 | { .vendor = PCI_VENDOR_ID_NEC, | ||
| 72 | .device = PCI_DEVICE_ID_NEC_VRC4173, | ||
| 73 | .subvendor = PCI_ANY_ID, | ||
| 74 | .subdevice = PCI_ANY_ID, }, | ||
| 75 | { .vendor = 0, }, | ||
| 76 | }; | ||
| 77 | |||
| 78 | unsigned long vrc4173_io_offset = 0; | ||
| 79 | |||
| 80 | EXPORT_SYMBOL(vrc4173_io_offset); | ||
| 81 | |||
| 82 | static int vrc4173_initialized; | ||
| 83 | static uint16_t vrc4173_cmuclkmsk; | ||
| 84 | static uint16_t vrc4173_selectreg; | ||
| 85 | static DEFINE_SPINLOCK(vrc4173_cmu_lock); | ||
| 86 | static DEFINE_SPINLOCK(vrc4173_giu_lock); | ||
| 87 | |||
| 88 | static inline void set_cmusrst(uint16_t val) | ||
| 89 | { | ||
| 90 | uint16_t cmusrst; | ||
| 91 | |||
| 92 | cmusrst = vrc4173_inw(VRC4173_CMUSRST); | ||
| 93 | cmusrst |= val; | ||
| 94 | vrc4173_outw(cmusrst, VRC4173_CMUSRST); | ||
| 95 | } | ||
| 96 | |||
| 97 | static inline void clear_cmusrst(uint16_t val) | ||
| 98 | { | ||
| 99 | uint16_t cmusrst; | ||
| 100 | |||
| 101 | cmusrst = vrc4173_inw(VRC4173_CMUSRST); | ||
| 102 | cmusrst &= ~val; | ||
| 103 | vrc4173_outw(cmusrst, VRC4173_CMUSRST); | ||
| 104 | } | ||
| 105 | |||
| 106 | void vrc4173_supply_clock(vrc4173_clock_t clock) | ||
| 107 | { | ||
| 108 | if (vrc4173_initialized) { | ||
| 109 | spin_lock_irq(&vrc4173_cmu_lock); | ||
| 110 | |||
| 111 | switch (clock) { | ||
| 112 | case VRC4173_PIU_CLOCK: | ||
| 113 | vrc4173_cmuclkmsk |= MSKPIU; | ||
| 114 | break; | ||
| 115 | case VRC4173_KIU_CLOCK: | ||
| 116 | vrc4173_cmuclkmsk |= MSKKIU; | ||
| 117 | break; | ||
| 118 | case VRC4173_AIU_CLOCK: | ||
| 119 | vrc4173_cmuclkmsk |= MSKAIU; | ||
| 120 | break; | ||
| 121 | case VRC4173_PS2_CH1_CLOCK: | ||
| 122 | vrc4173_cmuclkmsk |= MSKPS2CH1; | ||
| 123 | break; | ||
| 124 | case VRC4173_PS2_CH2_CLOCK: | ||
| 125 | vrc4173_cmuclkmsk |= MSKPS2CH2; | ||
| 126 | break; | ||
| 127 | case VRC4173_USBU_PCI_CLOCK: | ||
| 128 | set_cmusrst(USBRST); | ||
| 129 | vrc4173_cmuclkmsk |= MSKUSB; | ||
| 130 | break; | ||
| 131 | case VRC4173_CARDU1_PCI_CLOCK: | ||
| 132 | set_cmusrst(CARD1RST); | ||
| 133 | vrc4173_cmuclkmsk |= MSKCARD1; | ||
| 134 | break; | ||
| 135 | case VRC4173_CARDU2_PCI_CLOCK: | ||
| 136 | set_cmusrst(CARD2RST); | ||
| 137 | vrc4173_cmuclkmsk |= MSKCARD2; | ||
| 138 | break; | ||
| 139 | case VRC4173_AC97U_PCI_CLOCK: | ||
| 140 | set_cmusrst(AC97RST); | ||
| 141 | vrc4173_cmuclkmsk |= MSKAC97; | ||
| 142 | break; | ||
| 143 | case VRC4173_USBU_48MHz_CLOCK: | ||
| 144 | set_cmusrst(USBRST); | ||
| 145 | vrc4173_cmuclkmsk |= MSK48MUSB; | ||
| 146 | break; | ||
| 147 | case VRC4173_EXT_48MHz_CLOCK: | ||
| 148 | if (vrc4173_cmuclkmsk & MSK48MOSC) | ||
| 149 | vrc4173_cmuclkmsk |= MSK48MPIN; | ||
| 150 | else | ||
| 151 | printk(KERN_WARNING | ||
| 152 | "vrc4173_supply_clock: " | ||
| 153 | "Please supply VRC4173_48MHz_CLOCK first " | ||
| 154 | "rather than VRC4173_EXT_48MHz_CLOCK.\n"); | ||
| 155 | break; | ||
| 156 | case VRC4173_48MHz_CLOCK: | ||
| 157 | vrc4173_cmuclkmsk |= MSK48MOSC; | ||
| 158 | break; | ||
| 159 | default: | ||
| 160 | printk(KERN_WARNING | ||
| 161 | "vrc4173_supply_clock: Invalid CLOCK value %u\n", clock); | ||
| 162 | break; | ||
| 163 | } | ||
| 164 | |||
| 165 | vrc4173_outw(vrc4173_cmuclkmsk, VRC4173_CMUCLKMSK); | ||
| 166 | |||
| 167 | switch (clock) { | ||
| 168 | case VRC4173_USBU_PCI_CLOCK: | ||
| 169 | case VRC4173_USBU_48MHz_CLOCK: | ||
| 170 | clear_cmusrst(USBRST); | ||
| 171 | break; | ||
| 172 | case VRC4173_CARDU1_PCI_CLOCK: | ||
| 173 | clear_cmusrst(CARD1RST); | ||
| 174 | break; | ||
| 175 | case VRC4173_CARDU2_PCI_CLOCK: | ||
| 176 | clear_cmusrst(CARD2RST); | ||
| 177 | break; | ||
| 178 | case VRC4173_AC97U_PCI_CLOCK: | ||
| 179 | clear_cmusrst(AC97RST); | ||
| 180 | break; | ||
| 181 | default: | ||
| 182 | break; | ||
| 183 | } | ||
| 184 | |||
| 185 | spin_unlock_irq(&vrc4173_cmu_lock); | ||
| 186 | } | ||
| 187 | } | ||
| 188 | |||
| 189 | EXPORT_SYMBOL(vrc4173_supply_clock); | ||
| 190 | |||
| 191 | void vrc4173_mask_clock(vrc4173_clock_t clock) | ||
| 192 | { | ||
| 193 | if (vrc4173_initialized) { | ||
| 194 | spin_lock_irq(&vrc4173_cmu_lock); | ||
| 195 | |||
| 196 | switch (clock) { | ||
| 197 | case VRC4173_PIU_CLOCK: | ||
| 198 | vrc4173_cmuclkmsk &= ~MSKPIU; | ||
| 199 | break; | ||
| 200 | case VRC4173_KIU_CLOCK: | ||
| 201 | vrc4173_cmuclkmsk &= ~MSKKIU; | ||
| 202 | break; | ||
| 203 | case VRC4173_AIU_CLOCK: | ||
| 204 | vrc4173_cmuclkmsk &= ~MSKAIU; | ||
| 205 | break; | ||
| 206 | case VRC4173_PS2_CH1_CLOCK: | ||
| 207 | vrc4173_cmuclkmsk &= ~MSKPS2CH1; | ||
| 208 | break; | ||
| 209 | case VRC4173_PS2_CH2_CLOCK: | ||
| 210 | vrc4173_cmuclkmsk &= ~MSKPS2CH2; | ||
| 211 | break; | ||
| 212 | case VRC4173_USBU_PCI_CLOCK: | ||
| 213 | set_cmusrst(USBRST); | ||
| 214 | vrc4173_cmuclkmsk &= ~MSKUSB; | ||
| 215 | break; | ||
| 216 | case VRC4173_CARDU1_PCI_CLOCK: | ||
| 217 | set_cmusrst(CARD1RST); | ||
| 218 | vrc4173_cmuclkmsk &= ~MSKCARD1; | ||
| 219 | break; | ||
| 220 | case VRC4173_CARDU2_PCI_CLOCK: | ||
| 221 | set_cmusrst(CARD2RST); | ||
| 222 | vrc4173_cmuclkmsk &= ~MSKCARD2; | ||
| 223 | break; | ||
| 224 | case VRC4173_AC97U_PCI_CLOCK: | ||
| 225 | set_cmusrst(AC97RST); | ||
| 226 | vrc4173_cmuclkmsk &= ~MSKAC97; | ||
| 227 | break; | ||
| 228 | case VRC4173_USBU_48MHz_CLOCK: | ||
| 229 | set_cmusrst(USBRST); | ||
| 230 | vrc4173_cmuclkmsk &= ~MSK48MUSB; | ||
| 231 | break; | ||
| 232 | case VRC4173_EXT_48MHz_CLOCK: | ||
| 233 | vrc4173_cmuclkmsk &= ~MSK48MPIN; | ||
| 234 | break; | ||
| 235 | case VRC4173_48MHz_CLOCK: | ||
| 236 | vrc4173_cmuclkmsk &= ~MSK48MOSC; | ||
| 237 | break; | ||
| 238 | default: | ||
| 239 | printk(KERN_WARNING "vrc4173_mask_clock: Invalid CLOCK value %u\n", clock); | ||
| 240 | break; | ||
| 241 | } | ||
| 242 | |||
| 243 | vrc4173_outw(vrc4173_cmuclkmsk, VRC4173_CMUCLKMSK); | ||
| 244 | |||
| 245 | switch (clock) { | ||
| 246 | case VRC4173_USBU_PCI_CLOCK: | ||
| 247 | case VRC4173_USBU_48MHz_CLOCK: | ||
| 248 | clear_cmusrst(USBRST); | ||
| 249 | break; | ||
| 250 | case VRC4173_CARDU1_PCI_CLOCK: | ||
| 251 | clear_cmusrst(CARD1RST); | ||
| 252 | break; | ||
| 253 | case VRC4173_CARDU2_PCI_CLOCK: | ||
| 254 | clear_cmusrst(CARD2RST); | ||
| 255 | break; | ||
| 256 | case VRC4173_AC97U_PCI_CLOCK: | ||
| 257 | clear_cmusrst(AC97RST); | ||
| 258 | break; | ||
| 259 | default: | ||
| 260 | break; | ||
| 261 | } | ||
| 262 | |||
| 263 | spin_unlock_irq(&vrc4173_cmu_lock); | ||
| 264 | } | ||
| 265 | } | ||
| 266 | |||
| 267 | EXPORT_SYMBOL(vrc4173_mask_clock); | ||
| 268 | |||
| 269 | static inline void vrc4173_cmu_init(void) | ||
| 270 | { | ||
| 271 | vrc4173_cmuclkmsk = vrc4173_inw(VRC4173_CMUCLKMSK); | ||
| 272 | |||
| 273 | spin_lock_init(&vrc4173_cmu_lock); | ||
| 274 | } | ||
| 275 | |||
| 276 | void vrc4173_select_function(vrc4173_function_t function) | ||
| 277 | { | ||
| 278 | if (vrc4173_initialized) { | ||
| 279 | spin_lock_irq(&vrc4173_giu_lock); | ||
| 280 | |||
| 281 | switch(function) { | ||
| 282 | case PS2_CHANNEL1: | ||
| 283 | vrc4173_selectreg |= SEL2; | ||
| 284 | break; | ||
| 285 | case PS2_CHANNEL2: | ||
| 286 | vrc4173_selectreg |= SEL1; | ||
| 287 | break; | ||
| 288 | case TOUCHPANEL: | ||
| 289 | vrc4173_selectreg &= SEL2 | SEL1 | SEL0; | ||
| 290 | break; | ||
| 291 | case KEYBOARD_8SCANLINES: | ||
| 292 | vrc4173_selectreg &= SEL3 | SEL2 | SEL1; | ||
| 293 | break; | ||
| 294 | case KEYBOARD_10SCANLINES: | ||
| 295 | vrc4173_selectreg &= SEL3 | SEL2; | ||
| 296 | break; | ||
| 297 | case KEYBOARD_12SCANLINES: | ||
| 298 | vrc4173_selectreg &= SEL3; | ||
| 299 | break; | ||
| 300 | case GPIO_0_15PINS: | ||
| 301 | vrc4173_selectreg |= SEL0; | ||
| 302 | break; | ||
| 303 | case GPIO_16_20PINS: | ||
| 304 | vrc4173_selectreg |= SEL3; | ||
| 305 | break; | ||
| 306 | } | ||
| 307 | |||
| 308 | vrc4173_outw(vrc4173_selectreg, VRC4173_SELECTREG); | ||
| 309 | |||
| 310 | spin_unlock_irq(&vrc4173_giu_lock); | ||
| 311 | } | ||
| 312 | } | ||
| 313 | |||
| 314 | EXPORT_SYMBOL(vrc4173_select_function); | ||
| 315 | |||
| 316 | static inline void vrc4173_giu_init(void) | ||
| 317 | { | ||
| 318 | vrc4173_selectreg = vrc4173_inw(VRC4173_SELECTREG); | ||
| 319 | |||
| 320 | spin_lock_init(&vrc4173_giu_lock); | ||
| 321 | } | ||
| 322 | |||
| 323 | void vrc4173_enable_piuint(uint16_t mask) | ||
| 324 | { | ||
| 325 | struct irq_desc *desc = irq_desc + VRC4173_PIU_IRQ; | ||
| 326 | unsigned long flags; | ||
| 327 | uint16_t val; | ||
| 328 | |||
| 329 | spin_lock_irqsave(&desc->lock, flags); | ||
| 330 | val = vrc4173_inw(VRC4173_MPIUINTREG); | ||
| 331 | val |= mask; | ||
| 332 | vrc4173_outw(val, VRC4173_MPIUINTREG); | ||
| 333 | spin_unlock_irqrestore(&desc->lock, flags); | ||
| 334 | } | ||
| 335 | |||
| 336 | EXPORT_SYMBOL(vrc4173_enable_piuint); | ||
| 337 | |||
| 338 | void vrc4173_disable_piuint(uint16_t mask) | ||
| 339 | { | ||
| 340 | struct irq_desc *desc = irq_desc + VRC4173_PIU_IRQ; | ||
| 341 | unsigned long flags; | ||
| 342 | uint16_t val; | ||
| 343 | |||
| 344 | spin_lock_irqsave(&desc->lock, flags); | ||
| 345 | val = vrc4173_inw(VRC4173_MPIUINTREG); | ||
| 346 | val &= ~mask; | ||
| 347 | vrc4173_outw(val, VRC4173_MPIUINTREG); | ||
| 348 | spin_unlock_irqrestore(&desc->lock, flags); | ||
| 349 | } | ||
| 350 | |||
| 351 | EXPORT_SYMBOL(vrc4173_disable_piuint); | ||
| 352 | |||
| 353 | void vrc4173_enable_aiuint(uint16_t mask) | ||
| 354 | { | ||
| 355 | struct irq_desc *desc = irq_desc + VRC4173_AIU_IRQ; | ||
| 356 | unsigned long flags; | ||
| 357 | uint16_t val; | ||
| 358 | |||
| 359 | spin_lock_irqsave(&desc->lock, flags); | ||
| 360 | val = vrc4173_inw(VRC4173_MAIUINTREG); | ||
| 361 | val |= mask; | ||
| 362 | vrc4173_outw(val, VRC4173_MAIUINTREG); | ||
| 363 | spin_unlock_irqrestore(&desc->lock, flags); | ||
| 364 | } | ||
| 365 | |||
| 366 | EXPORT_SYMBOL(vrc4173_enable_aiuint); | ||
| 367 | |||
| 368 | void vrc4173_disable_aiuint(uint16_t mask) | ||
| 369 | { | ||
| 370 | struct irq_desc *desc = irq_desc + VRC4173_AIU_IRQ; | ||
| 371 | unsigned long flags; | ||
| 372 | uint16_t val; | ||
| 373 | |||
| 374 | spin_lock_irqsave(&desc->lock, flags); | ||
| 375 | val = vrc4173_inw(VRC4173_MAIUINTREG); | ||
| 376 | val &= ~mask; | ||
| 377 | vrc4173_outw(val, VRC4173_MAIUINTREG); | ||
| 378 | spin_unlock_irqrestore(&desc->lock, flags); | ||
| 379 | } | ||
| 380 | |||
| 381 | EXPORT_SYMBOL(vrc4173_disable_aiuint); | ||
| 382 | |||
| 383 | void vrc4173_enable_kiuint(uint16_t mask) | ||
| 384 | { | ||
| 385 | struct irq_desc *desc = irq_desc + VRC4173_KIU_IRQ; | ||
| 386 | unsigned long flags; | ||
| 387 | uint16_t val; | ||
| 388 | |||
| 389 | spin_lock_irqsave(&desc->lock, flags); | ||
| 390 | val = vrc4173_inw(VRC4173_MKIUINTREG); | ||
| 391 | val |= mask; | ||
| 392 | vrc4173_outw(val, VRC4173_MKIUINTREG); | ||
| 393 | spin_unlock_irqrestore(&desc->lock, flags); | ||
| 394 | } | ||
| 395 | |||
| 396 | EXPORT_SYMBOL(vrc4173_enable_kiuint); | ||
| 397 | |||
| 398 | void vrc4173_disable_kiuint(uint16_t mask) | ||
| 399 | { | ||
| 400 | struct irq_desc *desc = irq_desc + VRC4173_KIU_IRQ; | ||
| 401 | unsigned long flags; | ||
| 402 | uint16_t val; | ||
| 403 | |||
| 404 | spin_lock_irqsave(&desc->lock, flags); | ||
| 405 | val = vrc4173_inw(VRC4173_MKIUINTREG); | ||
| 406 | val &= ~mask; | ||
| 407 | vrc4173_outw(val, VRC4173_MKIUINTREG); | ||
| 408 | spin_unlock_irqrestore(&desc->lock, flags); | ||
| 409 | } | ||
| 410 | |||
| 411 | EXPORT_SYMBOL(vrc4173_disable_kiuint); | ||
| 412 | |||
| 413 | static void enable_vrc4173_irq(unsigned int irq) | ||
| 414 | { | ||
| 415 | uint16_t val; | ||
| 416 | |||
| 417 | val = vrc4173_inw(VRC4173_MSYSINT1REG); | ||
| 418 | val |= (uint16_t)1 << (irq - VRC4173_IRQ_BASE); | ||
| 419 | vrc4173_outw(val, VRC4173_MSYSINT1REG); | ||
| 420 | } | ||
| 421 | |||
| 422 | static void disable_vrc4173_irq(unsigned int irq) | ||
| 423 | { | ||
| 424 | uint16_t val; | ||
| 425 | |||
| 426 | val = vrc4173_inw(VRC4173_MSYSINT1REG); | ||
| 427 | val &= ~((uint16_t)1 << (irq - VRC4173_IRQ_BASE)); | ||
| 428 | vrc4173_outw(val, VRC4173_MSYSINT1REG); | ||
| 429 | } | ||
| 430 | |||
| 431 | static unsigned int startup_vrc4173_irq(unsigned int irq) | ||
| 432 | { | ||
| 433 | enable_vrc4173_irq(irq); | ||
| 434 | return 0; /* never anything pending */ | ||
| 435 | } | ||
| 436 | |||
| 437 | #define shutdown_vrc4173_irq disable_vrc4173_irq | ||
| 438 | #define ack_vrc4173_irq disable_vrc4173_irq | ||
| 439 | |||
| 440 | static void end_vrc4173_irq(unsigned int irq) | ||
| 441 | { | ||
| 442 | if (!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS))) | ||
| 443 | enable_vrc4173_irq(irq); | ||
| 444 | } | ||
| 445 | |||
| 446 | static struct irq_chip vrc4173_irq_type = { | ||
| 447 | .typename = "VRC4173", | ||
| 448 | .startup = startup_vrc4173_irq, | ||
| 449 | .shutdown = shutdown_vrc4173_irq, | ||
| 450 | .enable = enable_vrc4173_irq, | ||
| 451 | .disable = disable_vrc4173_irq, | ||
| 452 | .ack = ack_vrc4173_irq, | ||
| 453 | .end = end_vrc4173_irq, | ||
| 454 | }; | ||
| 455 | |||
| 456 | static int vrc4173_get_irq_number(int irq) | ||
| 457 | { | ||
| 458 | uint16_t status, mask; | ||
| 459 | int i; | ||
| 460 | |||
| 461 | status = vrc4173_inw(VRC4173_SYSINT1REG); | ||
| 462 | mask = vrc4173_inw(VRC4173_MSYSINT1REG); | ||
| 463 | |||
| 464 | status &= mask; | ||
| 465 | if (status) { | ||
| 466 | for (i = 0; i < 16; i++) | ||
| 467 | if (status & (0x0001 << i)) | ||
| 468 | return VRC4173_IRQ(i); | ||
| 469 | } | ||
| 470 | |||
| 471 | return -EINVAL; | ||
| 472 | } | ||
| 473 | |||
| 474 | static inline int vrc4173_icu_init(int cascade_irq) | ||
| 475 | { | ||
| 476 | int i; | ||
| 477 | |||
| 478 | if (cascade_irq < GIU_IRQ(0) || cascade_irq > GIU_IRQ(15)) | ||
| 479 | return -EINVAL; | ||
| 480 | |||
| 481 | vrc4173_outw(0, VRC4173_MSYSINT1REG); | ||
| 482 | |||
| 483 | vr41xx_set_irq_trigger(GIU_IRQ_TO_PIN(cascade_irq), TRIGGER_LEVEL, SIGNAL_THROUGH); | ||
| 484 | vr41xx_set_irq_level(GIU_IRQ_TO_PIN(cascade_irq), LEVEL_LOW); | ||
| 485 | |||
| 486 | for (i = VRC4173_IRQ_BASE; i <= VRC4173_IRQ_LAST; i++) | ||
| 487 | irq_desc[i].chip = &vrc4173_irq_type; | ||
| 488 | |||
| 489 | return 0; | ||
| 490 | } | ||
| 491 | |||
| 492 | static int __devinit vrc4173_probe(struct pci_dev *dev, | ||
| 493 | const struct pci_device_id *id) | ||
| 494 | { | ||
| 495 | unsigned long start, flags; | ||
| 496 | int err; | ||
| 497 | |||
| 498 | err = pci_enable_device(dev); | ||
| 499 | if (err < 0) { | ||
| 500 | printk(KERN_ERR "vrc4173: Failed to enable PCI device, aborting\n"); | ||
| 501 | return err; | ||
| 502 | } | ||
| 503 | |||
| 504 | pci_set_master(dev); | ||
| 505 | |||
| 506 | start = pci_resource_start(dev, 0); | ||
| 507 | if (start == 0) { | ||
| 508 | printk(KERN_ERR "vrc4173:No such PCI I/O resource, aborting\n"); | ||
| 509 | return -ENXIO; | ||
| 510 | } | ||
| 511 | |||
| 512 | flags = pci_resource_flags(dev, 0); | ||
| 513 | if ((flags & IORESOURCE_IO) == 0) { | ||
| 514 | printk(KERN_ERR "vrc4173: No such PCI I/O resource, aborting\n"); | ||
| 515 | return -ENXIO; | ||
| 516 | } | ||
| 517 | |||
| 518 | err = pci_request_regions(dev, "NEC VRC4173"); | ||
| 519 | if (err < 0) { | ||
| 520 | printk(KERN_ERR "vrc4173: PCI resources are busy, aborting\n"); | ||
| 521 | return err; | ||
| 522 | } | ||
| 523 | |||
| 524 | set_vrc4173_io_offset(start); | ||
| 525 | |||
| 526 | vrc4173_cmu_init(); | ||
| 527 | vrc4173_giu_init(); | ||
| 528 | |||
| 529 | err = vrc4173_icu_init(dev->irq); | ||
| 530 | if (err < 0) { | ||
| 531 | printk(KERN_ERR "vrc4173: Invalid IRQ %d, aborting\n", dev->irq); | ||
| 532 | return err; | ||
| 533 | } | ||
| 534 | |||
| 535 | err = vr41xx_cascade_irq(dev->irq, vrc4173_get_irq_number); | ||
| 536 | if (err < 0) { | ||
| 537 | printk(KERN_ERR "vrc4173: IRQ resource %d is busy, aborting\n", dev->irq); | ||
| 538 | return err; | ||
| 539 | } | ||
| 540 | |||
| 541 | printk(KERN_INFO | ||
| 542 | "NEC VRC4173 at 0x%#08lx, IRQ is cascaded to %d\n", start, dev->irq); | ||
| 543 | |||
| 544 | return 0; | ||
| 545 | } | ||
| 546 | |||
| 547 | static void vrc4173_remove(struct pci_dev *dev) | ||
| 548 | { | ||
| 549 | free_irq(dev->irq, NULL); | ||
| 550 | |||
| 551 | pci_release_regions(dev); | ||
| 552 | } | ||
| 553 | |||
| 554 | static struct pci_driver vrc4173_driver = { | ||
| 555 | .name = "NEC VRC4173", | ||
| 556 | .probe = vrc4173_probe, | ||
| 557 | .remove = vrc4173_remove, | ||
| 558 | .id_table = vrc4173_id_table, | ||
| 559 | }; | ||
| 560 | |||
| 561 | static int __devinit vrc4173_init(void) | ||
| 562 | { | ||
| 563 | int err; | ||
| 564 | |||
| 565 | err = pci_register_driver(&vrc4173_driver); | ||
| 566 | if (err < 0) | ||
| 567 | return err; | ||
| 568 | |||
| 569 | vrc4173_initialized = 1; | ||
| 570 | |||
| 571 | return 0; | ||
| 572 | } | ||
| 573 | |||
| 574 | static void __devexit vrc4173_exit(void) | ||
| 575 | { | ||
| 576 | vrc4173_initialized = 0; | ||
| 577 | |||
| 578 | pci_unregister_driver(&vrc4173_driver); | ||
| 579 | } | ||
| 580 | |||
| 581 | module_init(vrc4173_init); | ||
| 582 | module_exit(vrc4173_exit); | ||
diff --git a/include/asm-mips/vr41xx/vrc4173.h b/include/asm-mips/vr41xx/vrc4173.h deleted file mode 100644 index e5e6ad1d2f86..000000000000 --- a/include/asm-mips/vr41xx/vrc4173.h +++ /dev/null | |||
| @@ -1,201 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * vrc4173.h, Include file for NEC VRC4173. | ||
| 3 | * | ||
| 4 | * Copyright (C) 2000 Michael R. McDonald | ||
| 5 | * Copyright (C) 2001-2003 Montavista Software Inc. | ||
| 6 | * Author: Yoichi Yuasa <yyuasa@mvista.com, or source@mvista.com> | ||
| 7 | * Copyright (C) 2004 Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp> | ||
| 8 | * Copyright (C) 2005 Ralf Baechle (ralf@linux-mips.org) | ||
| 9 | * | ||
| 10 | * This program is free software; you can redistribute it and/or modify | ||
| 11 | * it under the terms of the GNU General Public License as published by | ||
| 12 | * the Free Software Foundation; either version 2 of the License, or | ||
| 13 | * (at your option) any later version. | ||
| 14 | * | ||
| 15 | * This program is distributed in the hope that it will be useful, | ||
| 16 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 17 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 18 | * GNU General Public License for more details. | ||
| 19 | * | ||
| 20 | * You should have received a copy of the GNU General Public License | ||
| 21 | * along with this program; if not, write to the Free Software | ||
| 22 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 23 | */ | ||
| 24 | #ifndef __NEC_VRC4173_H | ||
| 25 | #define __NEC_VRC4173_H | ||
| 26 | |||
| 27 | #include <asm/io.h> | ||
| 28 | |||
| 29 | /* | ||
| 30 | * PCI I/O accesses | ||
| 31 | */ | ||
| 32 | #ifdef CONFIG_VRC4173 | ||
| 33 | |||
| 34 | extern unsigned long vrc4173_io_offset; | ||
| 35 | |||
| 36 | #define set_vrc4173_io_offset(offset) do { vrc4173_io_offset = (offset); } while (0) | ||
| 37 | |||
| 38 | #define vrc4173_outb(val,port) outb((val), vrc4173_io_offset+(port)) | ||
| 39 | #define vrc4173_outw(val,port) outw((val), vrc4173_io_offset+(port)) | ||
| 40 | #define vrc4173_outl(val,port) outl((val), vrc4173_io_offset+(port)) | ||
| 41 | #define vrc4173_outb_p(val,port) outb_p((val), vrc4173_io_offset+(port)) | ||
| 42 | #define vrc4173_outw_p(val,port) outw_p((val), vrc4173_io_offset+(port)) | ||
| 43 | #define vrc4173_outl_p(val,port) outl_p((val), vrc4173_io_offset+(port)) | ||
| 44 | |||
| 45 | #define vrc4173_inb(port) inb(vrc4173_io_offset+(port)) | ||
| 46 | #define vrc4173_inw(port) inw(vrc4173_io_offset+(port)) | ||
| 47 | #define vrc4173_inl(port) inl(vrc4173_io_offset+(port)) | ||
| 48 | #define vrc4173_inb_p(port) inb_p(vrc4173_io_offset+(port)) | ||
| 49 | #define vrc4173_inw_p(port) inw_p(vrc4173_io_offset+(port)) | ||
| 50 | #define vrc4173_inl_p(port) inl_p(vrc4173_io_offset+(port)) | ||
| 51 | |||
| 52 | #define vrc4173_outsb(port,addr,count) outsb(vrc4173_io_offset+(port),(addr),(count)) | ||
| 53 | #define vrc4173_outsw(port,addr,count) outsw(vrc4173_io_offset+(port),(addr),(count)) | ||
| 54 | #define vrc4173_outsl(port,addr,count) outsl(vrc4173_io_offset+(port),(addr),(count)) | ||
| 55 | |||
| 56 | #define vrc4173_insb(port,addr,count) insb(vrc4173_io_offset+(port),(addr),(count)) | ||
| 57 | #define vrc4173_insw(port,addr,count) insw(vrc4173_io_offset+(port),(addr),(count)) | ||
| 58 | #define vrc4173_insl(port,addr,count) insl(vrc4173_io_offset+(port),(addr),(count)) | ||
| 59 | |||
| 60 | #else | ||
| 61 | |||
| 62 | #define set_vrc4173_io_offset(offset) do {} while (0) | ||
| 63 | |||
| 64 | #define vrc4173_outb(val,port) do {} while (0) | ||
| 65 | #define vrc4173_outw(val,port) do {} while (0) | ||
| 66 | #define vrc4173_outl(val,port) do {} while (0) | ||
| 67 | #define vrc4173_outb_p(val,port) do {} while (0) | ||
| 68 | #define vrc4173_outw_p(val,port) do {} while (0) | ||
| 69 | #define vrc4173_outl_p(val,port) do {} while (0) | ||
| 70 | |||
| 71 | #define vrc4173_inb(port) 0 | ||
| 72 | #define vrc4173_inw(port) 0 | ||
| 73 | #define vrc4173_inl(port) 0 | ||
| 74 | #define vrc4173_inb_p(port) 0 | ||
| 75 | #define vrc4173_inw_p(port) 0 | ||
| 76 | #define vrc4173_inl_p(port) 0 | ||
| 77 | |||
| 78 | #define vrc4173_outsb(port,addr,count) do {} while (0) | ||
| 79 | #define vrc4173_outsw(port,addr,count) do {} while (0) | ||
| 80 | #define vrc4173_outsl(port,addr,count) do {} while (0) | ||
| 81 | |||
| 82 | #define vrc4173_insb(port,addr,count) do {} while (0) | ||
| 83 | #define vrc4173_insw(port,addr,count) do {} while (0) | ||
| 84 | #define vrc4173_insl(port,addr,count) do {} while (0) | ||
| 85 | |||
| 86 | #endif | ||
| 87 | |||
| 88 | /* | ||
| 89 | * Clock Mask Unit | ||
| 90 | */ | ||
| 91 | typedef enum vrc4173_clock { | ||
| 92 | VRC4173_PIU_CLOCK, | ||
| 93 | VRC4173_KIU_CLOCK, | ||
| 94 | VRC4173_AIU_CLOCK, | ||
| 95 | VRC4173_PS2_CH1_CLOCK, | ||
| 96 | VRC4173_PS2_CH2_CLOCK, | ||
| 97 | VRC4173_USBU_PCI_CLOCK, | ||
| 98 | VRC4173_CARDU1_PCI_CLOCK, | ||
| 99 | VRC4173_CARDU2_PCI_CLOCK, | ||
| 100 | VRC4173_AC97U_PCI_CLOCK, | ||
| 101 | VRC4173_USBU_48MHz_CLOCK, | ||
| 102 | VRC4173_EXT_48MHz_CLOCK, | ||
| 103 | VRC4173_48MHz_CLOCK, | ||
| 104 | } vrc4173_clock_t; | ||
| 105 | |||
| 106 | #ifdef CONFIG_VRC4173 | ||
| 107 | |||
| 108 | extern void vrc4173_supply_clock(vrc4173_clock_t clock); | ||
| 109 | extern void vrc4173_mask_clock(vrc4173_clock_t clock); | ||
| 110 | |||
| 111 | #else | ||
| 112 | |||
| 113 | static inline void vrc4173_supply_clock(vrc4173_clock_t clock) {} | ||
| 114 | static inline void vrc4173_mask_clock(vrc4173_clock_t clock) {} | ||
| 115 | |||
| 116 | #endif | ||
| 117 | |||
| 118 | /* | ||
| 119 | * Interupt Control Unit | ||
| 120 | */ | ||
| 121 | |||
| 122 | #define VRC4173_PIUINT_COMMAND 0x0040 | ||
| 123 | #define VRC4173_PIUINT_DATA 0x0020 | ||
| 124 | #define VRC4173_PIUINT_PAGE1 0x0010 | ||
| 125 | #define VRC4173_PIUINT_PAGE0 0x0008 | ||
| 126 | #define VRC4173_PIUINT_DATALOST 0x0004 | ||
| 127 | #define VRC4173_PIUINT_STATUSCHANGE 0x0001 | ||
| 128 | |||
| 129 | #ifdef CONFIG_VRC4173 | ||
| 130 | |||
| 131 | extern void vrc4173_enable_piuint(uint16_t mask); | ||
| 132 | extern void vrc4173_disable_piuint(uint16_t mask); | ||
| 133 | |||
| 134 | #else | ||
| 135 | |||
| 136 | static inline void vrc4173_enable_piuint(uint16_t mask) {} | ||
| 137 | static inline void vrc4173_disable_piuint(uint16_t mask) {} | ||
| 138 | |||
| 139 | #endif | ||
| 140 | |||
| 141 | #define VRC4173_AIUINT_INPUT_DMAEND 0x0800 | ||
| 142 | #define VRC4173_AIUINT_INPUT_DMAHALT 0x0400 | ||
| 143 | #define VRC4173_AIUINT_INPUT_DATALOST 0x0200 | ||
| 144 | #define VRC4173_AIUINT_INPUT_DATA 0x0100 | ||
| 145 | #define VRC4173_AIUINT_OUTPUT_DMAEND 0x0008 | ||
| 146 | #define VRC4173_AIUINT_OUTPUT_DMAHALT 0x0004 | ||
| 147 | #define VRC4173_AIUINT_OUTPUT_NODATA 0x0002 | ||
| 148 | |||
| 149 | #ifdef CONFIG_VRC4173 | ||
| 150 | |||
| 151 | extern void vrc4173_enable_aiuint(uint16_t mask); | ||
| 152 | extern void vrc4173_disable_aiuint(uint16_t mask); | ||
| 153 | |||
| 154 | #else | ||
| 155 | |||
| 156 | static inline void vrc4173_enable_aiuint(uint16_t mask) {} | ||
| 157 | static inline void vrc4173_disable_aiuint(uint16_t mask) {} | ||
| 158 | |||
| 159 | #endif | ||
| 160 | |||
| 161 | #define VRC4173_KIUINT_DATALOST 0x0004 | ||
| 162 | #define VRC4173_KIUINT_DATAREADY 0x0002 | ||
| 163 | #define VRC4173_KIUINT_SCAN 0x0001 | ||
| 164 | |||
| 165 | #ifdef CONFIG_VRC4173 | ||
| 166 | |||
| 167 | extern void vrc4173_enable_kiuint(uint16_t mask); | ||
| 168 | extern void vrc4173_disable_kiuint(uint16_t mask); | ||
| 169 | |||
| 170 | #else | ||
| 171 | |||
| 172 | static inline void vrc4173_enable_kiuint(uint16_t mask) {} | ||
| 173 | static inline void vrc4173_disable_kiuint(uint16_t mask) {} | ||
| 174 | |||
| 175 | #endif | ||
| 176 | |||
| 177 | /* | ||
| 178 | * General-Purpose I/O Unit | ||
| 179 | */ | ||
| 180 | typedef enum vrc4173_function { | ||
| 181 | PS2_CHANNEL1, | ||
| 182 | PS2_CHANNEL2, | ||
| 183 | TOUCHPANEL, | ||
| 184 | KEYBOARD_8SCANLINES, | ||
| 185 | KEYBOARD_10SCANLINES, | ||
| 186 | KEYBOARD_12SCANLINES, | ||
| 187 | GPIO_0_15PINS, | ||
| 188 | GPIO_16_20PINS, | ||
| 189 | } vrc4173_function_t; | ||
| 190 | |||
| 191 | #ifdef CONFIG_VRC4173 | ||
| 192 | |||
| 193 | extern void vrc4173_select_function(vrc4173_function_t function); | ||
| 194 | |||
| 195 | #else | ||
| 196 | |||
| 197 | static inline void vrc4173_select_function(vrc4173_function_t function) {} | ||
| 198 | |||
| 199 | #endif | ||
| 200 | |||
| 201 | #endif /* __NEC_VRC4173_H */ | ||
