upgrade to linux 2.6.10-1.12_FC2
[linux-2.6.git] / drivers / char / sonypi.h
1 /*
2  * Sony Programmable I/O Control Device driver for VAIO
3  *
4  * Copyright (C) 2001-2004 Stelian Pop <stelian@popies.net>
5  *
6  * Copyright (C) 2001-2002 AlcĂ´ve <www.alcove.com>
7  *
8  * Copyright (C) 2001 Michael Ashley <m.ashley@unsw.edu.au>
9  *
10  * Copyright (C) 2001 Junichi Morita <jun1m@mars.dti.ne.jp>
11  *
12  * Copyright (C) 2000 Takaya Kinjo <t-kinjo@tc4.so-net.ne.jp>
13  *
14  * Copyright (C) 2000 Andrew Tridgell <tridge@valinux.com>
15  *
16  * Earlier work by Werner Almesberger, Paul `Rusty' Russell and Paul Mackerras.
17  *
18  * This program is free software; you can redistribute it and/or modify
19  * it under the terms of the GNU General Public License as published by
20  * the Free Software Foundation; either version 2 of the License, or
21  * (at your option) any later version.
22  *
23  * This program is distributed in the hope that it will be useful,
24  * but WITHOUT ANY WARRANTY; without even the implied warranty of
25  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
26  * GNU General Public License for more details.
27  *
28  * You should have received a copy of the GNU General Public License
29  * along with this program; if not, write to the Free Software
30  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
31  *
32  */
33
34 #ifndef _SONYPI_PRIV_H_
35 #define _SONYPI_PRIV_H_
36
37 #ifdef __KERNEL__
38
39 #define SONYPI_DRIVER_VERSION    "1.25"
40
41 #define SONYPI_DEVICE_MODEL_TYPE1       1
42 #define SONYPI_DEVICE_MODEL_TYPE2       2
43
44 #include <linux/config.h>
45 #include <linux/types.h>
46 #include <linux/pci.h>
47 #include <linux/input.h>
48 #include <linux/acpi.h>
49 #include <linux/kfifo.h>
50 #include <linux/sonypi.h>
51
52 /* type1 models use those */
53 #define SONYPI_IRQ_PORT                 0x8034
54 #define SONYPI_IRQ_SHIFT                22
55 #define SONYPI_BASE                     0x50
56 #define SONYPI_G10A                     (SONYPI_BASE+0x14)
57 #define SONYPI_TYPE1_REGION_SIZE        0x08
58 #define SONYPI_TYPE1_EVTYPE_OFFSET      0x04
59
60 /* type2 series specifics */
61 #define SONYPI_SIRQ                     0x9b
62 #define SONYPI_SLOB                     0x9c
63 #define SONYPI_SHIB                     0x9d
64 #define SONYPI_TYPE2_REGION_SIZE        0x20
65 #define SONYPI_TYPE2_EVTYPE_OFFSET      0x12
66
67 /* battery / brightness addresses */
68 #define SONYPI_BAT_FLAGS        0x81
69 #define SONYPI_LCD_LIGHT        0x96
70 #define SONYPI_BAT1_PCTRM       0xa0
71 #define SONYPI_BAT1_LEFT        0xa2
72 #define SONYPI_BAT1_MAXRT       0xa4
73 #define SONYPI_BAT2_PCTRM       0xa8
74 #define SONYPI_BAT2_LEFT        0xaa
75 #define SONYPI_BAT2_MAXRT       0xac
76 #define SONYPI_BAT1_MAXTK       0xb0
77 #define SONYPI_BAT1_FULL        0xb2
78 #define SONYPI_BAT2_MAXTK       0xb8
79 #define SONYPI_BAT2_FULL        0xba
80
81 /* ioports used for brightness and type2 events */
82 #define SONYPI_DATA_IOPORT      0x62
83 #define SONYPI_CST_IOPORT       0x66
84
85 /* The set of possible ioports */
86 struct sonypi_ioport_list {
87         u16     port1;
88         u16     port2;
89 };
90
91 static struct sonypi_ioport_list sonypi_type1_ioport_list[] = {
92         { 0x10c0, 0x10c4 },     /* looks like the default on C1Vx */
93         { 0x1080, 0x1084 },
94         { 0x1090, 0x1094 },
95         { 0x10a0, 0x10a4 },
96         { 0x10b0, 0x10b4 },
97         { 0x0, 0x0 }
98 };
99
100 static struct sonypi_ioport_list sonypi_type2_ioport_list[] = {
101         { 0x1080, 0x1084 },
102         { 0x10a0, 0x10a4 },
103         { 0x10c0, 0x10c4 },
104         { 0x10e0, 0x10e4 },
105         { 0x0, 0x0 }
106 };
107
108 /* The set of possible interrupts */
109 struct sonypi_irq_list {
110         u16     irq;
111         u16     bits;
112 };
113
114 static struct sonypi_irq_list sonypi_type1_irq_list[] = {
115         { 11, 0x2 },    /* IRQ 11, GO22=0,GO23=1 in AML */
116         { 10, 0x1 },    /* IRQ 10, GO22=1,GO23=0 in AML */
117         {  5, 0x0 },    /* IRQ  5, GO22=0,GO23=0 in AML */
118         {  0, 0x3 }     /* no IRQ, GO22=1,GO23=1 in AML */
119 };
120
121 static struct sonypi_irq_list sonypi_type2_irq_list[] = {
122         { 11, 0x80 },   /* IRQ 11, 0x80 in SIRQ in AML */
123         { 10, 0x40 },   /* IRQ 10, 0x40 in SIRQ in AML */
124         {  9, 0x20 },   /* IRQ  9, 0x20 in SIRQ in AML */
125         {  6, 0x10 },   /* IRQ  6, 0x10 in SIRQ in AML */
126         {  0, 0x00 }    /* no IRQ, 0x00 in SIRQ in AML */
127 };
128
129 #define SONYPI_CAMERA_BRIGHTNESS                0
130 #define SONYPI_CAMERA_CONTRAST                  1
131 #define SONYPI_CAMERA_HUE                       2
132 #define SONYPI_CAMERA_COLOR                     3
133 #define SONYPI_CAMERA_SHARPNESS                 4
134
135 #define SONYPI_CAMERA_PICTURE                   5
136 #define SONYPI_CAMERA_EXPOSURE_MASK             0xC
137 #define SONYPI_CAMERA_WHITE_BALANCE_MASK        0x3
138 #define SONYPI_CAMERA_PICTURE_MODE_MASK         0x30
139 #define SONYPI_CAMERA_MUTE_MASK                 0x40
140
141 /* the rest don't need a loop until not 0xff */
142 #define SONYPI_CAMERA_AGC                       6
143 #define SONYPI_CAMERA_AGC_MASK                  0x30
144 #define SONYPI_CAMERA_SHUTTER_MASK              0x7
145
146 #define SONYPI_CAMERA_SHUTDOWN_REQUEST          7
147 #define SONYPI_CAMERA_CONTROL                   0x10
148
149 #define SONYPI_CAMERA_STATUS                    7
150 #define SONYPI_CAMERA_STATUS_READY              0x2
151 #define SONYPI_CAMERA_STATUS_POSITION           0x4
152
153 #define SONYPI_DIRECTION_BACKWARDS              0x4
154
155 #define SONYPI_CAMERA_REVISION                  8
156 #define SONYPI_CAMERA_ROMVERSION                9
157
158 /* Event masks */
159 #define SONYPI_JOGGER_MASK                      0x00000001
160 #define SONYPI_CAPTURE_MASK                     0x00000002
161 #define SONYPI_FNKEY_MASK                       0x00000004
162 #define SONYPI_BLUETOOTH_MASK                   0x00000008
163 #define SONYPI_PKEY_MASK                        0x00000010
164 #define SONYPI_BACK_MASK                        0x00000020
165 #define SONYPI_HELP_MASK                        0x00000040
166 #define SONYPI_LID_MASK                         0x00000080
167 #define SONYPI_ZOOM_MASK                        0x00000100
168 #define SONYPI_THUMBPHRASE_MASK                 0x00000200
169 #define SONYPI_MEYE_MASK                        0x00000400
170 #define SONYPI_MEMORYSTICK_MASK                 0x00000800
171 #define SONYPI_BATTERY_MASK                     0x00001000
172
173 struct sonypi_event {
174         u8      data;
175         u8      event;
176 };
177
178 /* The set of possible button release events */
179 static struct sonypi_event sonypi_releaseev[] = {
180         { 0x00, SONYPI_EVENT_ANYBUTTON_RELEASED },
181         { 0, 0 }
182 };
183
184 /* The set of possible jogger events  */
185 static struct sonypi_event sonypi_joggerev[] = {
186         { 0x1f, SONYPI_EVENT_JOGDIAL_UP },
187         { 0x01, SONYPI_EVENT_JOGDIAL_DOWN },
188         { 0x5f, SONYPI_EVENT_JOGDIAL_UP_PRESSED },
189         { 0x41, SONYPI_EVENT_JOGDIAL_DOWN_PRESSED },
190         { 0x1e, SONYPI_EVENT_JOGDIAL_FAST_UP },
191         { 0x02, SONYPI_EVENT_JOGDIAL_FAST_DOWN },
192         { 0x5e, SONYPI_EVENT_JOGDIAL_FAST_UP_PRESSED },
193         { 0x42, SONYPI_EVENT_JOGDIAL_FAST_DOWN_PRESSED },
194         { 0x1d, SONYPI_EVENT_JOGDIAL_VFAST_UP },
195         { 0x03, SONYPI_EVENT_JOGDIAL_VFAST_DOWN },
196         { 0x5d, SONYPI_EVENT_JOGDIAL_VFAST_UP_PRESSED },
197         { 0x43, SONYPI_EVENT_JOGDIAL_VFAST_DOWN_PRESSED },
198         { 0x40, SONYPI_EVENT_JOGDIAL_PRESSED },
199         { 0, 0 }
200 };
201
202 /* The set of possible capture button events */
203 static struct sonypi_event sonypi_captureev[] = {
204         { 0x05, SONYPI_EVENT_CAPTURE_PARTIALPRESSED },
205         { 0x07, SONYPI_EVENT_CAPTURE_PRESSED },
206         { 0x01, SONYPI_EVENT_CAPTURE_PARTIALRELEASED },
207         { 0, 0 }
208 };
209
210 /* The set of possible fnkeys events */
211 static struct sonypi_event sonypi_fnkeyev[] = {
212         { 0x10, SONYPI_EVENT_FNKEY_ESC },
213         { 0x11, SONYPI_EVENT_FNKEY_F1 },
214         { 0x12, SONYPI_EVENT_FNKEY_F2 },
215         { 0x13, SONYPI_EVENT_FNKEY_F3 },
216         { 0x14, SONYPI_EVENT_FNKEY_F4 },
217         { 0x15, SONYPI_EVENT_FNKEY_F5 },
218         { 0x16, SONYPI_EVENT_FNKEY_F6 },
219         { 0x17, SONYPI_EVENT_FNKEY_F7 },
220         { 0x18, SONYPI_EVENT_FNKEY_F8 },
221         { 0x19, SONYPI_EVENT_FNKEY_F9 },
222         { 0x1a, SONYPI_EVENT_FNKEY_F10 },
223         { 0x1b, SONYPI_EVENT_FNKEY_F11 },
224         { 0x1c, SONYPI_EVENT_FNKEY_F12 },
225         { 0x1f, SONYPI_EVENT_FNKEY_RELEASED },
226         { 0x21, SONYPI_EVENT_FNKEY_1 },
227         { 0x22, SONYPI_EVENT_FNKEY_2 },
228         { 0x31, SONYPI_EVENT_FNKEY_D },
229         { 0x32, SONYPI_EVENT_FNKEY_E },
230         { 0x33, SONYPI_EVENT_FNKEY_F },
231         { 0x34, SONYPI_EVENT_FNKEY_S },
232         { 0x35, SONYPI_EVENT_FNKEY_B },
233         { 0x36, SONYPI_EVENT_FNKEY_ONLY },
234         { 0, 0 }
235 };
236
237 /* The set of possible program key events */
238 static struct sonypi_event sonypi_pkeyev[] = {
239         { 0x01, SONYPI_EVENT_PKEY_P1 },
240         { 0x02, SONYPI_EVENT_PKEY_P2 },
241         { 0x04, SONYPI_EVENT_PKEY_P3 },
242         { 0x5c, SONYPI_EVENT_PKEY_P1 },
243         { 0, 0 }
244 };
245
246 /* The set of possible bluetooth events */
247 static struct sonypi_event sonypi_blueev[] = {
248         { 0x55, SONYPI_EVENT_BLUETOOTH_PRESSED },
249         { 0x59, SONYPI_EVENT_BLUETOOTH_ON },
250         { 0x5a, SONYPI_EVENT_BLUETOOTH_OFF },
251         { 0, 0 }
252 };
253
254 /* The set of possible back button events */
255 static struct sonypi_event sonypi_backev[] = {
256         { 0x20, SONYPI_EVENT_BACK_PRESSED },
257         { 0, 0 }
258 };
259
260 /* The set of possible help button events */
261 static struct sonypi_event sonypi_helpev[] = {
262         { 0x3b, SONYPI_EVENT_HELP_PRESSED },
263         { 0, 0 }
264 };
265
266
267 /* The set of possible lid events */
268 static struct sonypi_event sonypi_lidev[] = {
269         { 0x51, SONYPI_EVENT_LID_CLOSED },
270         { 0x50, SONYPI_EVENT_LID_OPENED },
271         { 0, 0 }
272 };
273
274 /* The set of possible zoom events */
275 static struct sonypi_event sonypi_zoomev[] = {
276         { 0x39, SONYPI_EVENT_ZOOM_PRESSED },
277         { 0, 0 }
278 };
279
280 /* The set of possible thumbphrase events */
281 static struct sonypi_event sonypi_thumbphraseev[] = {
282         { 0x3a, SONYPI_EVENT_THUMBPHRASE_PRESSED },
283         { 0, 0 }
284 };
285
286 /* The set of possible motioneye camera events */
287 static struct sonypi_event sonypi_meyeev[] = {
288         { 0x00, SONYPI_EVENT_MEYE_FACE },
289         { 0x01, SONYPI_EVENT_MEYE_OPPOSITE },
290         { 0, 0 }
291 };
292
293 /* The set of possible memorystick events */
294 static struct sonypi_event sonypi_memorystickev[] = {
295         { 0x53, SONYPI_EVENT_MEMORYSTICK_INSERT },
296         { 0x54, SONYPI_EVENT_MEMORYSTICK_EJECT },
297         { 0, 0 }
298 };
299
300 /* The set of possible battery events */
301 static struct sonypi_event sonypi_batteryev[] = {
302         { 0x20, SONYPI_EVENT_BATTERY_INSERT },
303         { 0x30, SONYPI_EVENT_BATTERY_REMOVE },
304         { 0, 0 }
305 };
306
307 struct sonypi_eventtypes {
308         int                     model;
309         u8                      data;
310         unsigned long           mask;
311         struct sonypi_event *   events;
312 } sonypi_eventtypes[] = {
313         { SONYPI_DEVICE_MODEL_TYPE1, 0, 0xffffffff, sonypi_releaseev },
314         { SONYPI_DEVICE_MODEL_TYPE1, 0x70, SONYPI_MEYE_MASK, sonypi_meyeev },
315         { SONYPI_DEVICE_MODEL_TYPE1, 0x30, SONYPI_LID_MASK, sonypi_lidev },
316         { SONYPI_DEVICE_MODEL_TYPE1, 0x60, SONYPI_CAPTURE_MASK, sonypi_captureev },
317         { SONYPI_DEVICE_MODEL_TYPE1, 0x10, SONYPI_JOGGER_MASK, sonypi_joggerev },
318         { SONYPI_DEVICE_MODEL_TYPE1, 0x20, SONYPI_FNKEY_MASK, sonypi_fnkeyev },
319         { SONYPI_DEVICE_MODEL_TYPE1, 0x30, SONYPI_BLUETOOTH_MASK, sonypi_blueev },
320         { SONYPI_DEVICE_MODEL_TYPE1, 0x40, SONYPI_PKEY_MASK, sonypi_pkeyev },
321         { SONYPI_DEVICE_MODEL_TYPE1, 0x30, SONYPI_MEMORYSTICK_MASK, sonypi_memorystickev },
322         { SONYPI_DEVICE_MODEL_TYPE1, 0x40, SONYPI_BATTERY_MASK, sonypi_batteryev },
323
324         { SONYPI_DEVICE_MODEL_TYPE2, 0, 0xffffffff, sonypi_releaseev },
325         { SONYPI_DEVICE_MODEL_TYPE2, 0x38, SONYPI_LID_MASK, sonypi_lidev },
326         { SONYPI_DEVICE_MODEL_TYPE2, 0x11, SONYPI_JOGGER_MASK, sonypi_joggerev },
327         { SONYPI_DEVICE_MODEL_TYPE2, 0x61, SONYPI_CAPTURE_MASK, sonypi_captureev },
328         { SONYPI_DEVICE_MODEL_TYPE2, 0x21, SONYPI_FNKEY_MASK, sonypi_fnkeyev },
329         { SONYPI_DEVICE_MODEL_TYPE2, 0x31, SONYPI_BLUETOOTH_MASK, sonypi_blueev },
330         { SONYPI_DEVICE_MODEL_TYPE2, 0x08, SONYPI_PKEY_MASK, sonypi_pkeyev },
331         { SONYPI_DEVICE_MODEL_TYPE2, 0x11, SONYPI_BACK_MASK, sonypi_backev },
332         { SONYPI_DEVICE_MODEL_TYPE2, 0x08, SONYPI_HELP_MASK, sonypi_helpev },
333         { SONYPI_DEVICE_MODEL_TYPE2, 0x21, SONYPI_ZOOM_MASK, sonypi_zoomev },
334         { SONYPI_DEVICE_MODEL_TYPE2, 0x20, SONYPI_THUMBPHRASE_MASK, sonypi_thumbphraseev },
335         { SONYPI_DEVICE_MODEL_TYPE2, 0x31, SONYPI_MEMORYSTICK_MASK, sonypi_memorystickev },
336         { SONYPI_DEVICE_MODEL_TYPE2, 0x41, SONYPI_BATTERY_MASK, sonypi_batteryev },
337         { SONYPI_DEVICE_MODEL_TYPE2, 0x31, SONYPI_PKEY_MASK, sonypi_pkeyev },
338
339         { 0 }
340 };
341
342 #define SONYPI_BUF_SIZE 128
343
344 /* The name of the devices for the input device drivers */
345 #define SONYPI_JOG_INPUTNAME    "Sony Vaio Jogdial"
346 #define SONYPI_KEY_INPUTNAME    "Sony Vaio Keys"
347
348 /* Correspondance table between sonypi events and input layer events */
349 struct {
350         int sonypiev;
351         int inputev;
352 } sonypi_inputkeys[] = {
353         { SONYPI_EVENT_CAPTURE_PRESSED,         KEY_CAMERA },
354         { SONYPI_EVENT_FNKEY_ONLY,              KEY_FN },
355         { SONYPI_EVENT_FNKEY_ESC,               KEY_FN_ESC },
356         { SONYPI_EVENT_FNKEY_F1,                KEY_FN_F1 },
357         { SONYPI_EVENT_FNKEY_F2,                KEY_FN_F2 },
358         { SONYPI_EVENT_FNKEY_F3,                KEY_FN_F3 },
359         { SONYPI_EVENT_FNKEY_F4,                KEY_FN_F4 },
360         { SONYPI_EVENT_FNKEY_F5,                KEY_FN_F5 },
361         { SONYPI_EVENT_FNKEY_F6,                KEY_FN_F6 },
362         { SONYPI_EVENT_FNKEY_F7,                KEY_FN_F7 },
363         { SONYPI_EVENT_FNKEY_F8,                KEY_FN_F8 },
364         { SONYPI_EVENT_FNKEY_F9,                KEY_FN_F9 },
365         { SONYPI_EVENT_FNKEY_F10,               KEY_FN_F10 },
366         { SONYPI_EVENT_FNKEY_F11,               KEY_FN_F11 },
367         { SONYPI_EVENT_FNKEY_F12,               KEY_FN_F12 },
368         { SONYPI_EVENT_FNKEY_1,                 KEY_FN_1 },
369         { SONYPI_EVENT_FNKEY_2,                 KEY_FN_2 },
370         { SONYPI_EVENT_FNKEY_D,                 KEY_FN_D },
371         { SONYPI_EVENT_FNKEY_E,                 KEY_FN_E },
372         { SONYPI_EVENT_FNKEY_F,                 KEY_FN_F },
373         { SONYPI_EVENT_FNKEY_S,                 KEY_FN_S },
374         { SONYPI_EVENT_FNKEY_B,                 KEY_FN_B },
375         { SONYPI_EVENT_BLUETOOTH_PRESSED,       KEY_BLUE },
376         { SONYPI_EVENT_BLUETOOTH_ON,            KEY_BLUE },
377         { SONYPI_EVENT_PKEY_P1,                 KEY_PROG1 },
378         { SONYPI_EVENT_PKEY_P2,                 KEY_PROG2 },
379         { SONYPI_EVENT_PKEY_P3,                 KEY_PROG3 },
380         { SONYPI_EVENT_BACK_PRESSED,            KEY_BACK },
381         { SONYPI_EVENT_HELP_PRESSED,            KEY_HELP },
382         { SONYPI_EVENT_ZOOM_PRESSED,            KEY_ZOOM },
383         { SONYPI_EVENT_THUMBPHRASE_PRESSED,     BTN_THUMB },
384         { 0, 0 },
385 };
386
387 struct sonypi_device {
388         struct pci_dev *dev;
389         struct platform_device *pdev;
390         u16 irq;
391         u16 bits;
392         u16 ioport1;
393         u16 ioport2;
394         u16 region_size;
395         u16 evtype_offset;
396         int camera_power;
397         int bluetooth_power;
398         struct semaphore lock;
399         struct kfifo *fifo;
400         spinlock_t fifo_lock;
401         wait_queue_head_t fifo_proc_list;
402         struct fasync_struct *fifo_async;
403         int open_count;
404         int model;
405         struct input_dev input_jog_dev;
406         struct input_dev input_key_dev;
407         struct work_struct input_work;
408         struct kfifo *input_fifo;
409         spinlock_t input_fifo_lock;
410 };
411
412 #define ITERATIONS_LONG         10000
413 #define ITERATIONS_SHORT        10
414
415 #define wait_on_command(quiet, command, iterations) { \
416         unsigned int n = iterations; \
417         while (--n && (command)) \
418                 udelay(1); \
419         if (!n && (verbose || !quiet)) \
420                 printk(KERN_WARNING "sonypi command failed at %s : %s (line %d)\n", __FILE__, __FUNCTION__, __LINE__); \
421 }
422
423 #ifdef CONFIG_ACPI
424 #define SONYPI_ACPI_ACTIVE (!acpi_disabled)
425 #else
426 #define SONYPI_ACPI_ACTIVE 0
427 #endif                          /* CONFIG_ACPI */
428
429 #endif                          /* __KERNEL__ */
430
431 #endif                          /* _SONYPI_PRIV_H_ */