source: cmedia/trunk/Sblive/emu10k1-joy.c@ 354

Last change on this file since 354 was 354, checked in by stevenhl, 17 years ago

Import untested baseline cmedia sources, work products and binaries
Binaries and work products should be deleted from repository.
once new builds are verified to work.

File size: 6.5 KB
Line 
1/* $Id: emu10k1-joy.c,v 1.1 2000/04/23 14:55:43 ktk Exp $ */
2
3
4/*
5 **********************************************************************
6 * emu10k1-joy.c - Creative EMU10K1 Joystick port driver
7 * Copyright 2000 Rui Sousa.
8 *
9 **********************************************************************
10 *
11 * Date Author Summary of changes
12 * ---- ------ ------------------
13 * April 1, 2000 Rui Sousa initial version
14 *
15 **********************************************************************
16 *
17 * This program is free software; you can redistribute it and/or
18 * modify it under the terms of the GNU General Public License as
19 * published by the Free Software Foundation; either version 2 of
20 * the License, or (at your option) any later version.
21 *
22 * This program is distributed in the hope that it will be useful,
23 * but WITHOUT ANY WARRANTY; without even the implied warranty of
24 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
25 * GNU General Public License for more details.
26 *
27 * You should have received a copy of the GNU General Public
28 * License along with this program; if not, write to the Free
29 * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139,
30 * USA.
31 *
32 **********************************************************************/
33
34#include <linux/module.h>
35#include <linux/init.h>
36#include <linux/pci.h>
37#include <linux/malloc.h>
38#include <linux/ioport.h>
39#include <linux/list.h>
40
41#include <emu_wrapper.h>
42
43#define DRIVER_VERSION "0.1"
44
45#ifndef PCI_VENDOR_ID_CREATIVE
46#define PCI_VENDOR_ID_CREATIVE 0x1102
47#endif
48
49#ifndef PCI_DEVICE_ID_CREATIVE_EMU10K1_JOYSTICK
50#define PCI_DEVICE_ID_CREATIVE_EMU10K1_JOYSTICK 0x7002
51#endif
52
53#define EMU10K1_JOYSTICK_EXTENT 0x8 /* 8 byte I/O space */
54
55#define NR_DEV 5
56
57static int io[NR_DEV] = { 0, };
58
59enum {
60 EMU10K1_JOYSTICK = 0
61};
62
63static char *card_names[] = {
64 "EMU10K1 Joystick Port"
65};
66
67static struct pci_device_id emu10k1_joy_pci_tbl[] __devinitdata = {
68 {PCI_VENDOR_ID_CREATIVE, PCI_DEVICE_ID_CREATIVE_EMU10K1_JOYSTICK,
69 PCI_ANY_ID, PCI_ANY_ID, 0, 0, EMU10K1_JOYSTICK},
70 {0,}
71};
72
73MODULE_DEVICE_TABLE(pci, emu10k1_joy_pci_tbl);
74
75struct emu10k1_joy_card {
76 struct list_head list;
77
78 struct pci_dev *pci_dev;
79 unsigned long iobase;
80 int addr_changed;
81};
82
83static LIST_HEAD(emu10k1_joy_devs);
84static unsigned int devindex = 0;
85
86/* Driver initialization routine */
87static int __devinit emu10k1_joy_probe(struct pci_dev *pci_dev, const struct pci_device_id *pci_id)
88{
89 struct emu10k1_joy_card *card;
90 u8 chiprev;
91
92 if ((card = kmalloc(sizeof(struct emu10k1_joy_card), GFP_KERNEL)) == NULL) {
93 printk(KERN_ERR "emu10k1-joy: out of memory\n");
94 return -ENOMEM;
95 }
96 memset(card, 0, sizeof(struct emu10k1_joy_card));
97
98#if LINUX_VERSION_CODE > 0x020320
99 if (pci_enable_device(pci_dev)) {
100 printk(KERN_ERR "emu10k1-joy: couldn't enable device\n");
101 kfree(card);
102 return -ENODEV;
103 }
104
105 card->iobase = pci_dev->resource[0].start;
106
107 if (request_region(card->iobase, EMU10K1_JOYSTICK_EXTENT, card_names[pci_id->driver_data])
108 == NULL) {
109 printk(KERN_ERR "emu10k1-joy: %s IO space in use\n",
110 card_names[pci_id->driver_data]);
111 kfree(card);
112 return -ENODEV;
113 }
114
115 pci_dev->driver_data = card;
116#else
117 card->iobase = pci_dev->base_address[0] & PCI_BASE_ADDRESS_IO_MASK;
118
119 if (check_region(card->iobase, EMU10K1_JOYSTICK_EXTENT)) {
120 printk(KERN_ERR "emu10k1-joy: IO space in use\n");
121 kfree(card);
122 return -ENODEV;
123 }
124
125 request_region(card->iobase, EMU10K1_JOYSTICK_EXTENT, card_names[pci_id->driver_data]);
126#endif
127
128 pci_read_config_byte(pci_dev, PCI_REVISION_ID, &chiprev);
129
130 printk(KERN_INFO "emu10k1-joy: %s rev %d found at IO 0x%04lx\n",
131 card_names[pci_id->driver_data], chiprev, card->iobase);
132
133 if (io[devindex]) {
134 if ((io[devindex] & ~0x18) != 0x200) {
135 printk(KERN_ERR "emu10k1-joy: invalid io value\n");
136 release_region(card->iobase, EMU10K1_JOYSTICK_EXTENT);
137 kfree(card);
138 return -ENODEV;
139 }
140
141 card->addr_changed = 1;
142 pci_write_config_dword(pci_dev, PCI_BASE_ADDRESS_0, io[devindex]);
143 printk(KERN_INFO "emu10k1-joy: IO ports mirrored at 0x%03x\n", io[devindex]);
144 }
145
146 list_add(&card->list, &emu10k1_joy_devs);
147 devindex++;
148
149 return 0;
150}
151
152static void __devexit emu10k1_joy_remove(struct pci_dev *pci_dev)
153{
154
155#if LINUX_VERSION_CODE > 0x020320
156 struct emu10k1_joy_card *card = pci_dev->driver_data;
157#else
158 struct emu10k1_joy_card *card =
159
160 list_entry(emu10k1_joy_devs.next, struct emu10k1_joy_card, list);
161#endif
162 if(card->addr_changed)
163 pci_write_config_dword(pci_dev, PCI_BASE_ADDRESS_0, card->iobase);
164
165 release_region(card->iobase, EMU10K1_JOYSTICK_EXTENT);
166
167 list_del(&card->list);
168 kfree(card);
169 return;
170}
171
172MODULE_PARM(io, "1-" __MODULE_STRING(NR_DEV) "i");
173MODULE_PARM_DESC(io, "sets joystick port address");
174MODULE_AUTHOR("Rui Sousa (Email to: emu10k1-devel@opensource.creative.com)");
175MODULE_DESCRIPTION("Creative EMU10K1 PCI Joystick Port v" DRIVER_VERSION
176 "\nCopyright (C) 2000 Rui Sousa");
177
178static struct pci_driver emu10k1_joy_pci_driver = {
179 name:"emu10k1 joystick",
180 id_table:emu10k1_joy_pci_tbl,
181 probe:emu10k1_joy_probe,
182 remove:emu10k1_joy_remove,
183};
184
185#if LINUX_VERSION_CODE > 0x020320
186static int __init emu10k1_joy_init_module(void)
187{
188 printk(KERN_INFO "Creative EMU10K1 PCI Joystick Port, version " DRIVER_VERSION ", " __TIME__
189 " " __DATE__ "\n");
190
191 return pci_module_init(&emu10k1_joy_pci_driver);
192}
193
194static void __exit emu10k1_joy_cleanup_module(void)
195{
196 pci_unregister_driver(&emu10k1_joy_pci_driver);
197 return;
198}
199
200#else
201static int __init emu10k1_joy_init_module(void)
202{
203 struct pci_dev *dev = NULL;
204 const struct pci_device_id *pci_id = emu10k1_joy_pci_driver.id_table;
205
206 printk(KERN_INFO "Creative EMU10K1 PCI Joystick Port, version " DRIVER_VERSION ", " __TIME__
207 " " __DATE__ "\n");
208
209 if (!pci_present())
210 return -ENODEV;
211
212 while (pci_id->vendor) {
213 while ((dev = pci_find_device(pci_id->vendor, pci_id->device, dev)))
214 emu10k1_joy_probe(dev, pci_id);
215
216 pci_id++;
217 }
218 return 0;
219}
220
221static void __exit emu10k1_joy_cleanup_module(void)
222{
223 struct emu10k1_joy_card *card;
224
225 while (!list_empty(&emu10k1_joy_devs)) {
226 card = list_entry(emu10k1_joy_devs.next, struct emu10k1_joy_card, list);
227
228 emu10k1_joy_remove(card->pci_dev);
229 }
230 return;
231}
232#endif
233
234module_init(emu10k1_joy_init_module);
235module_exit(emu10k1_joy_cleanup_module);
Note: See TracBrowser for help on using the repository browser.