[ACPI] Enable EC Burst Mode
[cascardo/linux.git] / drivers / acpi / ec.c
1 /*
2  *  acpi_ec.c - ACPI Embedded Controller Driver ($Revision: 38 $)
3  *
4  *  Copyright (C) 2004 Luming Yu <luming.yu@intel.com>
5  *  Copyright (C) 2001, 2002 Andy Grover <andrew.grover@intel.com>
6  *  Copyright (C) 2001, 2002 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com>
7  *
8  * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
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 (at
13  *  your option) any later version.
14  *
15  *  This program is distributed in the hope that it will be useful, but
16  *  WITHOUT ANY WARRANTY; without even the implied warranty of
17  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18  *  General Public License for more details.
19  *
20  *  You should have received a copy of the GNU General Public License along
21  *  with this program; if not, write to the Free Software Foundation, Inc.,
22  *  59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
23  *
24  * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
25  */
26
27 #include <linux/kernel.h>
28 #include <linux/module.h>
29 #include <linux/init.h>
30 #include <linux/types.h>
31 #include <linux/delay.h>
32 #include <linux/proc_fs.h>
33 #include <linux/seq_file.h>
34 #include <linux/interrupt.h>
35 #include <asm/io.h>
36 #include <acpi/acpi_bus.h>
37 #include <acpi/acpi_drivers.h>
38 #include <acpi/actypes.h>
39
40 #define _COMPONENT              ACPI_EC_COMPONENT
41 ACPI_MODULE_NAME                ("acpi_ec")
42
43 #define ACPI_EC_COMPONENT               0x00100000
44 #define ACPI_EC_CLASS                   "embedded_controller"
45 #define ACPI_EC_HID                     "PNP0C09"
46 #define ACPI_EC_DRIVER_NAME             "ACPI Embedded Controller Driver"
47 #define ACPI_EC_DEVICE_NAME             "Embedded Controller"
48 #define ACPI_EC_FILE_INFO               "info"
49
50
51 #define ACPI_EC_FLAG_OBF        0x01    /* Output buffer full */
52 #define ACPI_EC_FLAG_IBF        0x02    /* Input buffer full */
53 #define ACPI_EC_FLAG_BURST      0x10    /* burst mode */
54 #define ACPI_EC_FLAG_SCI        0x20    /* EC-SCI occurred */
55
56 #define ACPI_EC_EVENT_OBF       0x01    /* Output buffer full */
57 #define ACPI_EC_EVENT_IBE       0x02    /* Input buffer empty */
58
59 #define ACPI_EC_DELAY           50      /* Wait 50ms max. during EC ops */
60 #define ACPI_EC_UDELAY_GLK      1000    /* Wait 1ms max. to get global lock */
61
62 #define ACPI_EC_COMMAND_READ    0x80
63 #define ACPI_EC_COMMAND_WRITE   0x81
64 #define ACPI_EC_BURST_ENABLE    0x82
65 #define ACPI_EC_BURST_DISABLE   0x83
66 #define ACPI_EC_COMMAND_QUERY   0x84
67
68 static int acpi_ec_add (struct acpi_device *device);
69 static int acpi_ec_remove (struct acpi_device *device, int type);
70 static int acpi_ec_start (struct acpi_device *device);
71 static int acpi_ec_stop (struct acpi_device *device, int type);
72
73 static struct acpi_driver acpi_ec_driver = {
74         .name =         ACPI_EC_DRIVER_NAME,
75         .class =        ACPI_EC_CLASS,
76         .ids =          ACPI_EC_HID,
77         .ops =          {
78                                 .add =          acpi_ec_add,
79                                 .remove =       acpi_ec_remove,
80                                 .start =        acpi_ec_start,
81                                 .stop =         acpi_ec_stop,
82                         },
83 };
84
85 struct acpi_ec {
86         acpi_handle                     handle;
87         unsigned long                   uid;
88         unsigned long                   gpe_bit;
89         struct acpi_generic_address     status_addr;
90         struct acpi_generic_address     command_addr;
91         struct acpi_generic_address     data_addr;
92         unsigned long                   global_lock;
93         unsigned int                    expect_event;
94         atomic_t                        leaving_burst; /* 0 : No, 1 : Yes, 2: abort*/
95         atomic_t                        pending_gpe;
96         struct semaphore                sem;
97         wait_queue_head_t               wait;
98 };
99
100 /* If we find an EC via the ECDT, we need to keep a ptr to its context */
101 static struct acpi_ec   *ec_ecdt;
102
103 /* External interfaces use first EC only, so remember */
104 static struct acpi_device *first_ec;
105
106 /* --------------------------------------------------------------------------
107                              Transaction Management
108    -------------------------------------------------------------------------- */
109
110 static inline u32 acpi_ec_read_status(struct acpi_ec *ec)
111 {
112         u32     status = 0;
113
114         acpi_hw_low_level_read(8, &status, &ec->status_addr);
115         return status;
116 }
117
118 static int acpi_ec_wait(struct acpi_ec *ec, unsigned int event)
119 {
120         int     result = 0;
121
122         ACPI_FUNCTION_TRACE("acpi_ec_wait");
123
124         ec->expect_event = event;
125         smp_mb();
126
127         result = wait_event_interruptible_timeout(ec->wait,
128                                         !ec->expect_event,
129                                         msecs_to_jiffies(ACPI_EC_DELAY));
130         
131         ec->expect_event = 0;
132         smp_mb();
133
134         if (result < 0){
135                 ACPI_DEBUG_PRINT((ACPI_DB_ERROR," result  = %d ", result));
136                 return_VALUE(result);
137         }
138
139         /*
140          * Verify that the event in question has actually happened by
141          * querying EC status. Do the check even if operation timed-out
142          * to make sure that we did not miss interrupt.
143          */
144         switch (event) {
145         case ACPI_EC_EVENT_OBF:
146                 if (acpi_ec_read_status(ec) & ACPI_EC_FLAG_OBF)
147                         return_VALUE(0);
148                 break;
149
150         case ACPI_EC_EVENT_IBE:
151                 if (~acpi_ec_read_status(ec) & ACPI_EC_FLAG_IBF)
152                         return_VALUE(0);
153                 break;
154         }
155
156         return_VALUE(-ETIME);
157 }
158
159
160
161 static int
162 acpi_ec_enter_burst_mode (
163         struct acpi_ec          *ec)
164 {
165         u32                     tmp = 0;
166         int                     status = 0;
167
168         ACPI_FUNCTION_TRACE("acpi_ec_enter_burst_mode");
169
170         status = acpi_ec_read_status(ec);
171         if (status != -EINVAL &&
172                 !(status & ACPI_EC_FLAG_BURST)){
173                 ACPI_DEBUG_PRINT((ACPI_DB_INFO,"entering burst mode \n"));
174                 acpi_hw_low_level_write(8, ACPI_EC_BURST_ENABLE, &ec->command_addr);
175                 status = acpi_ec_wait(ec, ACPI_EC_EVENT_OBF);
176                 if (status){
177                         acpi_enable_gpe(NULL, ec->gpe_bit, ACPI_NOT_ISR);
178                         ACPI_DEBUG_PRINT((ACPI_DB_ERROR," status = %d\n", status));
179                         return_VALUE(-EINVAL);
180                 }
181                 acpi_hw_low_level_read(8, &tmp, &ec->data_addr);
182                 acpi_enable_gpe(NULL, ec->gpe_bit, ACPI_NOT_ISR);
183                 if(tmp != 0x90 ) {/* Burst ACK byte*/
184                         ACPI_DEBUG_PRINT((ACPI_DB_ERROR,"Ack failed \n"));
185                         return_VALUE(-EINVAL);
186                 }
187         } else
188                 ACPI_DEBUG_PRINT((ACPI_DB_INFO,"already be in burst mode \n"));
189         atomic_set(&ec->leaving_burst , 0);
190         return_VALUE(0);
191 }
192
193 static int
194 acpi_ec_leave_burst_mode (
195         struct acpi_ec          *ec)
196 {
197         int                     status =0;
198
199         ACPI_FUNCTION_TRACE("acpi_ec_leave_burst_mode");
200
201         atomic_set(&ec->leaving_burst , 1);
202         status = acpi_ec_read_status(ec);
203         if (status != -EINVAL &&
204                 (status & ACPI_EC_FLAG_BURST)){
205                 ACPI_DEBUG_PRINT((ACPI_DB_INFO,"leaving burst mode\n"));
206                 acpi_hw_low_level_write(8, ACPI_EC_BURST_DISABLE, &ec->command_addr);
207                 status = acpi_ec_wait(ec, ACPI_EC_FLAG_IBF);
208                 if (status){
209                         acpi_enable_gpe(NULL, ec->gpe_bit, ACPI_NOT_ISR);
210                         ACPI_DEBUG_PRINT((ACPI_DB_ERROR,"------->wait fail\n"));
211                         return_VALUE(-EINVAL);
212                 }
213                 acpi_enable_gpe(NULL, ec->gpe_bit, ACPI_NOT_ISR);
214                 status = acpi_ec_read_status(ec);
215                 if (status != -EINVAL &&
216                         (status & ACPI_EC_FLAG_BURST)) {
217                         ACPI_DEBUG_PRINT((ACPI_DB_ERROR,"------->status fail\n"));
218                         return_VALUE(-EINVAL);
219                 }
220         }else
221                 ACPI_DEBUG_PRINT((ACPI_DB_INFO,"already be in Non-burst mode \n"));
222         ACPI_DEBUG_PRINT((ACPI_DB_INFO,"leaving burst mode\n"));
223
224         return_VALUE(0);
225 }
226
227 static int
228 acpi_ec_read (
229         struct acpi_ec          *ec,
230         u8                      address,
231         u32                     *data)
232 {
233         int                     status = 0;
234         u32                     glk;
235
236         ACPI_FUNCTION_TRACE("acpi_ec_read");
237
238         if (!ec || !data)
239                 return_VALUE(-EINVAL);
240
241 retry:
242         *data = 0;
243
244         if (ec->global_lock) {
245                 status = acpi_acquire_global_lock(ACPI_EC_UDELAY_GLK, &glk);
246                 if (ACPI_FAILURE(status))
247                         return_VALUE(-ENODEV);
248         }
249
250         WARN_ON(in_interrupt());
251         down(&ec->sem);
252
253         if(acpi_ec_enter_burst_mode(ec))
254                 goto end;
255
256         acpi_hw_low_level_write(8, ACPI_EC_COMMAND_READ, &ec->command_addr);
257         status = acpi_ec_wait(ec, ACPI_EC_EVENT_IBE);
258         acpi_enable_gpe(NULL, ec->gpe_bit, ACPI_NOT_ISR);
259         if (status) {
260                 goto end;
261         }
262
263         acpi_hw_low_level_write(8, address, &ec->data_addr);
264         status= acpi_ec_wait(ec, ACPI_EC_EVENT_OBF);
265         if (status){
266                 acpi_enable_gpe(NULL, ec->gpe_bit, ACPI_NOT_ISR);
267                 goto end;
268         }
269
270         acpi_hw_low_level_read(8, data, &ec->data_addr);
271         acpi_enable_gpe(NULL, ec->gpe_bit, ACPI_NOT_ISR);
272
273         ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Read [%02x] from address [%02x]\n",
274                 *data, address));
275         
276 end:
277         acpi_ec_leave_burst_mode(ec);
278         up(&ec->sem);
279
280         if (ec->global_lock)
281                 acpi_release_global_lock(glk);
282
283         if(atomic_read(&ec->leaving_burst) == 2){
284                 ACPI_DEBUG_PRINT((ACPI_DB_INFO,"aborted, retry ...\n"));
285                 while(!atomic_read(&ec->pending_gpe)){
286                         msleep(1);      
287                 }
288                 acpi_enable_gpe(NULL, ec->gpe_bit, ACPI_NOT_ISR);
289                 goto retry;
290         }
291
292         return_VALUE(status);
293 }
294
295
296 static int
297 acpi_ec_write (
298         struct acpi_ec          *ec,
299         u8                      address,
300         u8                      data)
301 {
302         int                     status = 0;
303         u32                     glk;
304         u32                     tmp;
305
306         ACPI_FUNCTION_TRACE("acpi_ec_write");
307
308         if (!ec)
309                 return_VALUE(-EINVAL);
310 retry:
311         if (ec->global_lock) {
312                 status = acpi_acquire_global_lock(ACPI_EC_UDELAY_GLK, &glk);
313                 if (ACPI_FAILURE(status))
314                         return_VALUE(-ENODEV);
315         }
316
317         WARN_ON(in_interrupt());
318         down(&ec->sem);
319
320         if(acpi_ec_enter_burst_mode(ec))
321                 goto end;
322
323         status = acpi_ec_read_status(ec);
324         if (status != -EINVAL &&
325                 !(status & ACPI_EC_FLAG_BURST)){
326                 acpi_hw_low_level_write(8, ACPI_EC_BURST_ENABLE, &ec->command_addr);
327                 status = acpi_ec_wait(ec, ACPI_EC_EVENT_OBF);
328                 if (status)
329                         goto end;
330                 acpi_hw_low_level_read(8, &tmp, &ec->data_addr);
331                 if(tmp != 0x90 ) /* Burst ACK byte*/
332                         goto end;
333         }
334         /*Now we are in burst mode*/
335
336         acpi_hw_low_level_write(8, ACPI_EC_COMMAND_WRITE, &ec->command_addr);
337         status = acpi_ec_wait(ec, ACPI_EC_EVENT_IBE);
338         acpi_enable_gpe(NULL, ec->gpe_bit, ACPI_NOT_ISR);
339         if (status){
340                 goto end;
341         }
342
343         acpi_hw_low_level_write(8, address, &ec->data_addr);
344         status = acpi_ec_wait(ec, ACPI_EC_EVENT_IBE);
345         if (status){
346                 acpi_enable_gpe(NULL, ec->gpe_bit, ACPI_NOT_ISR);
347                 goto end;
348         }
349
350         acpi_hw_low_level_write(8, data, &ec->data_addr);
351         status = acpi_ec_wait(ec, ACPI_EC_EVENT_IBE);
352         acpi_enable_gpe(NULL, ec->gpe_bit, ACPI_NOT_ISR);
353         if (status)
354                 goto end;
355
356         ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Wrote [%02x] to address [%02x]\n",
357                 data, address));
358
359 end:
360         acpi_ec_leave_burst_mode(ec);
361         up(&ec->sem);
362
363         if (ec->global_lock)
364                 acpi_release_global_lock(glk);
365
366         if(atomic_read(&ec->leaving_burst) == 2){
367                 ACPI_DEBUG_PRINT((ACPI_DB_INFO,"aborted, retry ...\n"));
368                 while(!atomic_read(&ec->pending_gpe)){
369                         msleep(1);      
370                 }
371                 acpi_enable_gpe(NULL, ec->gpe_bit, ACPI_NOT_ISR);
372                 goto retry;
373         }
374
375         return_VALUE(status);
376 }
377
378 /*
379  * Externally callable EC access functions. For now, assume 1 EC only
380  */
381 int
382 ec_read(u8 addr, u8 *val)
383 {
384         struct acpi_ec *ec;
385         int err;
386         u32 temp_data;
387
388         if (!first_ec)
389                 return -ENODEV;
390
391         ec = acpi_driver_data(first_ec);
392
393         err = acpi_ec_read(ec, addr, &temp_data);
394
395         if (!err) {
396                 *val = temp_data;
397                 return 0;
398         }
399         else
400                 return err;
401 }
402 EXPORT_SYMBOL(ec_read);
403
404 int
405 ec_write(u8 addr, u8 val)
406 {
407         struct acpi_ec *ec;
408         int err;
409
410         if (!first_ec)
411                 return -ENODEV;
412
413         ec = acpi_driver_data(first_ec);
414
415         err = acpi_ec_write(ec, addr, val);
416
417         return err;
418 }
419 EXPORT_SYMBOL(ec_write);
420
421
422 static int
423 acpi_ec_query (
424         struct acpi_ec          *ec,
425         u32                     *data)
426 {
427         int                     status = 0;
428         u32                     glk;
429
430         ACPI_FUNCTION_TRACE("acpi_ec_query");
431
432         if (!ec || !data)
433                 return_VALUE(-EINVAL);
434 retry:
435         *data = 0;
436
437         if (ec->global_lock) {
438                 status = acpi_acquire_global_lock(ACPI_EC_UDELAY_GLK, &glk);
439                 if (ACPI_FAILURE(status))
440                         return_VALUE(-ENODEV);
441         }
442
443         down(&ec->sem);
444         if(acpi_ec_enter_burst_mode(ec))
445                 goto end;
446         /*
447          * Query the EC to find out which _Qxx method we need to evaluate.
448          * Note that successful completion of the query causes the ACPI_EC_SCI
449          * bit to be cleared (and thus clearing the interrupt source).
450          */
451         acpi_hw_low_level_write(8, ACPI_EC_COMMAND_QUERY, &ec->command_addr);
452         status = acpi_ec_wait(ec, ACPI_EC_EVENT_OBF);
453         if (status){
454                 acpi_enable_gpe(NULL, ec->gpe_bit, ACPI_NOT_ISR);
455                 goto end;
456         }
457
458         acpi_hw_low_level_read(8, data, &ec->data_addr);
459         acpi_enable_gpe(NULL, ec->gpe_bit, ACPI_NOT_ISR);
460         if (!*data)
461                 status = -ENODATA;
462
463 end:
464         acpi_ec_leave_burst_mode(ec);
465         up(&ec->sem);
466
467         if (ec->global_lock)
468                 acpi_release_global_lock(glk);
469
470         if(atomic_read(&ec->leaving_burst) == 2){
471                 ACPI_DEBUG_PRINT((ACPI_DB_INFO,"aborted, retry ...\n"));
472                 while(!atomic_read(&ec->pending_gpe)){
473                         msleep(1);      
474                 }
475                 acpi_enable_gpe(NULL, ec->gpe_bit, ACPI_NOT_ISR);
476                 goto retry;
477         }
478
479         return_VALUE(status);
480 }
481
482
483 /* --------------------------------------------------------------------------
484                                 Event Management
485    -------------------------------------------------------------------------- */
486
487 struct acpi_ec_query_data {
488         acpi_handle             handle;
489         u8                      data;
490 };
491
492 static void
493 acpi_ec_gpe_query (
494         void                    *ec_cxt)
495 {
496         struct acpi_ec          *ec = (struct acpi_ec *) ec_cxt;
497         u32                     value;
498         int                     result = -ENODATA;
499         static char             object_name[5] = {'_','Q','0','0','\0'};
500         const char              hex[] = {'0','1','2','3','4','5','6','7',
501                                          '8','9','A','B','C','D','E','F'};
502
503         ACPI_FUNCTION_TRACE("acpi_ec_gpe_query");
504
505         if (acpi_ec_read_status(ec) & ACPI_EC_FLAG_SCI)
506                 result = acpi_ec_query(ec, &value);
507
508         if (result)
509                 goto end;
510
511         object_name[2] = hex[((value >> 4) & 0x0F)];
512         object_name[3] = hex[(value & 0x0F)];
513
514         ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Evaluating %s\n", object_name));
515
516         acpi_evaluate_object(ec->handle, object_name, NULL, NULL);
517         atomic_dec(&ec->pending_gpe);
518 end:    
519         return;
520 }
521
522 static u32
523 acpi_ec_gpe_handler (
524         void                    *data)
525 {
526         acpi_status             status = AE_OK;
527         u32                     value;
528         struct acpi_ec          *ec = (struct acpi_ec *) data;
529
530         if (!ec)
531                 return ACPI_INTERRUPT_NOT_HANDLED;
532
533         acpi_disable_gpe(NULL, ec->gpe_bit, ACPI_ISR);
534
535         value = acpi_ec_read_status(ec);
536
537         if((value & ACPI_EC_FLAG_IBF) &&
538                 !(value & ACPI_EC_FLAG_BURST) &&
539                         (atomic_read(&ec->leaving_burst) == 0)) { 
540         /*
541          * the embedded controller disables 
542          * burst mode for any reason other 
543          * than the burst disable command
544          * to process critical event.
545          */
546                 atomic_set(&ec->leaving_burst , 2); /* block current pending transaction
547                                         and retry */
548                 wake_up(&ec->wait);
549         }else {
550                 if ((ec->expect_event == ACPI_EC_EVENT_OBF &&
551                                 (value & ACPI_EC_FLAG_OBF)) ||
552                                 (ec->expect_event == ACPI_EC_EVENT_IBE &&
553                                 !(value & ACPI_EC_FLAG_IBF))) {
554                         ec->expect_event = 0;
555                         wake_up(&ec->wait);
556                         
557                 }
558         }
559
560         if (value & ACPI_EC_FLAG_SCI){
561                 atomic_add(1, &ec->pending_gpe) ;
562                 status = acpi_os_queue_for_execution(OSD_PRIORITY_GPE,
563                                                 acpi_ec_gpe_query, ec);
564         } 
565
566         return status == AE_OK ?
567                 ACPI_INTERRUPT_HANDLED : ACPI_INTERRUPT_NOT_HANDLED;
568 }
569
570 /* --------------------------------------------------------------------------
571                              Address Space Management
572    -------------------------------------------------------------------------- */
573
574 static acpi_status
575 acpi_ec_space_setup (
576         acpi_handle             region_handle,
577         u32                     function,
578         void                    *handler_context,
579         void                    **return_context)
580 {
581         /*
582          * The EC object is in the handler context and is needed
583          * when calling the acpi_ec_space_handler.
584          */
585         *return_context  = (function != ACPI_REGION_DEACTIVATE) ?
586                                                 handler_context : NULL;
587
588         return AE_OK;
589 }
590
591
592 static acpi_status
593 acpi_ec_space_handler (
594         u32                     function,
595         acpi_physical_address   address,
596         u32                     bit_width,
597         acpi_integer            *value,
598         void                    *handler_context,
599         void                    *region_context)
600 {
601         int                     result = 0;
602         struct acpi_ec          *ec = NULL;
603         u32                     temp = 0;
604         acpi_integer            f_v = 0;
605         int                     i = 0;
606
607         ACPI_FUNCTION_TRACE("acpi_ec_space_handler");
608
609         if ((address > 0xFF) || !value || !handler_context)
610                 return_VALUE(AE_BAD_PARAMETER);
611
612         if(bit_width != 8) {
613                 printk(KERN_WARNING PREFIX "acpi_ec_space_handler: bit_width should be 8\n");
614                 if (acpi_strict)
615                         return_VALUE(AE_BAD_PARAMETER);
616         }
617
618         ec = (struct acpi_ec *) handler_context;
619
620 next_byte:
621         switch (function) {
622         case ACPI_READ:
623                 result = acpi_ec_read(ec, (u8) address, &temp);
624                 *value = (acpi_integer) temp;
625                 break;
626         case ACPI_WRITE:
627                 result = acpi_ec_write(ec, (u8) address, (u8) *value);
628                 break;
629         default:
630                 result = -EINVAL;
631                 goto out;
632                 break;
633         }
634
635         bit_width -= 8;
636         if(bit_width){
637
638                 if(function == ACPI_READ)
639                         f_v |= (acpi_integer) (*value) << 8*i;
640                 if(function == ACPI_WRITE)
641                         (*value) >>=8; 
642                 i++;
643                 goto next_byte;
644         }
645
646
647         if(function == ACPI_READ){
648                 f_v |= (acpi_integer) (*value) << 8*i;
649                 *value = f_v;
650         }
651
652                 
653 out:
654         switch (result) {
655         case -EINVAL:
656                 return_VALUE(AE_BAD_PARAMETER);
657                 break;
658         case -ENODEV:
659                 return_VALUE(AE_NOT_FOUND);
660                 break;
661         case -ETIME:
662                 return_VALUE(AE_TIME);
663                 break;
664         default:
665                 return_VALUE(AE_OK);
666         }
667         
668
669 }
670
671
672 /* --------------------------------------------------------------------------
673                               FS Interface (/proc)
674    -------------------------------------------------------------------------- */
675
676 static struct proc_dir_entry    *acpi_ec_dir;
677
678
679 static int
680 acpi_ec_read_info (struct seq_file *seq, void *offset)
681 {
682         struct acpi_ec          *ec = (struct acpi_ec *) seq->private;
683
684         ACPI_FUNCTION_TRACE("acpi_ec_read_info");
685
686         if (!ec)
687                 goto end;
688
689         seq_printf(seq, "gpe bit:                 0x%02x\n",
690                 (u32) ec->gpe_bit);
691         seq_printf(seq, "ports:                   0x%02x, 0x%02x\n",
692                 (u32) ec->status_addr.address, (u32) ec->data_addr.address);
693         seq_printf(seq, "use global lock:         %s\n",
694                 ec->global_lock?"yes":"no");
695
696 end:
697         return_VALUE(0);
698 }
699
700 static int acpi_ec_info_open_fs(struct inode *inode, struct file *file)
701 {
702         return single_open(file, acpi_ec_read_info, PDE(inode)->data);
703 }
704
705 static struct file_operations acpi_ec_info_ops = {
706         .open           = acpi_ec_info_open_fs,
707         .read           = seq_read,
708         .llseek         = seq_lseek,
709         .release        = single_release,
710         .owner = THIS_MODULE,
711 };
712
713 static int
714 acpi_ec_add_fs (
715         struct acpi_device      *device)
716 {
717         struct proc_dir_entry   *entry;
718
719         ACPI_FUNCTION_TRACE("acpi_ec_add_fs");
720
721         if (!acpi_device_dir(device)) {
722                 acpi_device_dir(device) = proc_mkdir(acpi_device_bid(device),
723                         acpi_ec_dir);
724                 if (!acpi_device_dir(device))
725                         return_VALUE(-ENODEV);
726         }
727
728         entry = create_proc_entry(ACPI_EC_FILE_INFO, S_IRUGO,
729                 acpi_device_dir(device));
730         if (!entry)
731                 ACPI_DEBUG_PRINT((ACPI_DB_WARN,
732                         "Unable to create '%s' fs entry\n",
733                         ACPI_EC_FILE_INFO));
734         else {
735                 entry->proc_fops = &acpi_ec_info_ops;
736                 entry->data = acpi_driver_data(device);
737                 entry->owner = THIS_MODULE;
738         }
739
740         return_VALUE(0);
741 }
742
743
744 static int
745 acpi_ec_remove_fs (
746         struct acpi_device      *device)
747 {
748         ACPI_FUNCTION_TRACE("acpi_ec_remove_fs");
749
750         if (acpi_device_dir(device)) {
751                 remove_proc_entry(ACPI_EC_FILE_INFO, acpi_device_dir(device));
752                 remove_proc_entry(acpi_device_bid(device), acpi_ec_dir);
753                 acpi_device_dir(device) = NULL;
754         }
755
756         return_VALUE(0);
757 }
758
759
760 /* --------------------------------------------------------------------------
761                                Driver Interface
762    -------------------------------------------------------------------------- */
763
764 static int
765 acpi_ec_add (
766         struct acpi_device      *device)
767 {
768         int                     result;
769         acpi_status             status;
770         struct acpi_ec          *ec;
771         unsigned long           uid;
772
773         ACPI_FUNCTION_TRACE("acpi_ec_add");
774
775         if (!device)
776                 return_VALUE(-EINVAL);
777
778         ec = kmalloc(sizeof(struct acpi_ec), GFP_KERNEL);
779         if (!ec)
780                 return_VALUE(-ENOMEM);
781         memset(ec, 0, sizeof(struct acpi_ec));
782
783         ec->handle = device->handle;
784         ec->uid = -1;
785         atomic_set(&ec->pending_gpe, 0);
786         atomic_set(&ec->leaving_burst , 1);
787         init_MUTEX(&ec->sem);
788         init_waitqueue_head(&ec->wait);
789         strcpy(acpi_device_name(device), ACPI_EC_DEVICE_NAME);
790         strcpy(acpi_device_class(device), ACPI_EC_CLASS);
791         acpi_driver_data(device) = ec;
792
793         /* Use the global lock for all EC transactions? */
794         acpi_evaluate_integer(ec->handle, "_GLK", NULL, &ec->global_lock);
795
796         /* If our UID matches the UID for the ECDT-enumerated EC,
797            we now have the *real* EC info, so kill the makeshift one.*/
798         acpi_evaluate_integer(ec->handle, "_UID", NULL, &uid);
799         if (ec_ecdt && ec_ecdt->uid == uid) {
800                 acpi_remove_address_space_handler(ACPI_ROOT_OBJECT,
801                         ACPI_ADR_SPACE_EC, &acpi_ec_space_handler);
802
803                 acpi_remove_gpe_handler(NULL, ec_ecdt->gpe_bit, &acpi_ec_gpe_handler);
804
805                 kfree(ec_ecdt);
806         }
807
808         /* Get GPE bit assignment (EC events). */
809         /* TODO: Add support for _GPE returning a package */
810         status = acpi_evaluate_integer(ec->handle, "_GPE", NULL, &ec->gpe_bit);
811         if (ACPI_FAILURE(status)) {
812                 ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
813                         "Error obtaining GPE bit assignment\n"));
814                 result = -ENODEV;
815                 goto end;
816         }
817
818         result = acpi_ec_add_fs(device);
819         if (result)
820                 goto end;
821
822         printk(KERN_INFO PREFIX "%s [%s] (gpe %d)\n",
823                 acpi_device_name(device), acpi_device_bid(device),
824                 (u32) ec->gpe_bit);
825
826         if (!first_ec)
827                 first_ec = device;
828
829 end:
830         if (result)
831                 kfree(ec);
832
833         return_VALUE(result);
834 }
835
836
837 static int
838 acpi_ec_remove (
839         struct acpi_device      *device,
840         int                     type)
841 {
842         struct acpi_ec          *ec;
843
844         ACPI_FUNCTION_TRACE("acpi_ec_remove");
845
846         if (!device)
847                 return_VALUE(-EINVAL);
848
849         ec = acpi_driver_data(device);
850
851         acpi_ec_remove_fs(device);
852
853         kfree(ec);
854
855         return_VALUE(0);
856 }
857
858
859 static acpi_status
860 acpi_ec_io_ports (
861         struct acpi_resource    *resource,
862         void                    *context)
863 {
864         struct acpi_ec          *ec = (struct acpi_ec *) context;
865         struct acpi_generic_address *addr;
866
867         if (resource->id != ACPI_RSTYPE_IO) {
868                 return AE_OK;
869         }
870
871         /*
872          * The first address region returned is the data port, and
873          * the second address region returned is the status/command
874          * port.
875          */
876         if (ec->data_addr.register_bit_width == 0) {
877                 addr = &ec->data_addr;
878         } else if (ec->command_addr.register_bit_width == 0) {
879                 addr = &ec->command_addr;
880         } else {
881                 return AE_CTRL_TERMINATE;
882         }
883
884         addr->address_space_id = ACPI_ADR_SPACE_SYSTEM_IO;
885         addr->register_bit_width = 8;
886         addr->register_bit_offset = 0;
887         addr->address = resource->data.io.min_base_address;
888
889         return AE_OK;
890 }
891
892
893 static int
894 acpi_ec_start (
895         struct acpi_device      *device)
896 {
897         acpi_status             status;
898         struct acpi_ec          *ec;
899
900         ACPI_FUNCTION_TRACE("acpi_ec_start");
901
902         if (!device)
903                 return_VALUE(-EINVAL);
904
905         ec = acpi_driver_data(device);
906
907         if (!ec)
908                 return_VALUE(-EINVAL);
909
910         /*
911          * Get I/O port addresses. Convert to GAS format.
912          */
913         status = acpi_walk_resources(ec->handle, METHOD_NAME__CRS,
914                 acpi_ec_io_ports, ec);
915         if (ACPI_FAILURE(status) || ec->command_addr.register_bit_width == 0) {
916                 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Error getting I/O port addresses"));
917                 return_VALUE(-ENODEV);
918         }
919
920         ec->status_addr = ec->command_addr;
921
922         ACPI_DEBUG_PRINT((ACPI_DB_INFO, "gpe=0x%02x, ports=0x%2x,0x%2x\n",
923                 (u32) ec->gpe_bit, (u32) ec->command_addr.address,
924                 (u32) ec->data_addr.address));
925
926         /*
927          * Install GPE handler
928          */
929         status = acpi_install_gpe_handler(NULL, ec->gpe_bit,
930                 ACPI_GPE_EDGE_TRIGGERED, &acpi_ec_gpe_handler, ec);
931         if (ACPI_FAILURE(status)) {
932                 return_VALUE(-ENODEV);
933         }
934         acpi_set_gpe_type (NULL, ec->gpe_bit, ACPI_GPE_TYPE_RUNTIME);
935         acpi_enable_gpe (NULL, ec->gpe_bit, ACPI_NOT_ISR);
936
937         status = acpi_install_address_space_handler (ec->handle,
938                         ACPI_ADR_SPACE_EC, &acpi_ec_space_handler,
939                         &acpi_ec_space_setup, ec);
940         if (ACPI_FAILURE(status)) {
941                 acpi_remove_gpe_handler(NULL, ec->gpe_bit, &acpi_ec_gpe_handler);
942                 return_VALUE(-ENODEV);
943         }
944
945         return_VALUE(AE_OK);
946 }
947
948
949 static int
950 acpi_ec_stop (
951         struct acpi_device      *device,
952         int                     type)
953 {
954         acpi_status             status;
955         struct acpi_ec          *ec;
956
957         ACPI_FUNCTION_TRACE("acpi_ec_stop");
958
959         if (!device)
960                 return_VALUE(-EINVAL);
961
962         ec = acpi_driver_data(device);
963
964         status = acpi_remove_address_space_handler(ec->handle,
965                 ACPI_ADR_SPACE_EC, &acpi_ec_space_handler);
966         if (ACPI_FAILURE(status))
967                 return_VALUE(-ENODEV);
968
969         status = acpi_remove_gpe_handler(NULL, ec->gpe_bit, &acpi_ec_gpe_handler);
970         if (ACPI_FAILURE(status))
971                 return_VALUE(-ENODEV);
972
973         return_VALUE(0);
974 }
975
976 static acpi_status __init
977 acpi_fake_ecdt_callback (
978         acpi_handle     handle,
979         u32             Level,
980         void            *context,
981         void            **retval)
982 {
983         acpi_status     status;
984
985         status = acpi_walk_resources(handle, METHOD_NAME__CRS,
986                 acpi_ec_io_ports, ec_ecdt);
987         if (ACPI_FAILURE(status))
988                 return status;
989         ec_ecdt->status_addr = ec_ecdt->command_addr;
990
991         ec_ecdt->uid = -1;
992         acpi_evaluate_integer(handle, "_UID", NULL, &ec_ecdt->uid);
993
994         status = acpi_evaluate_integer(handle, "_GPE", NULL, &ec_ecdt->gpe_bit);
995         if (ACPI_FAILURE(status))
996                 return status;
997         ec_ecdt->global_lock = TRUE;
998         ec_ecdt->handle = handle;
999
1000         printk(KERN_INFO PREFIX  "GPE=0x%02x, ports=0x%2x, 0x%2x\n",
1001                 (u32) ec_ecdt->gpe_bit, (u32) ec_ecdt->command_addr.address,
1002                 (u32) ec_ecdt->data_addr.address);
1003
1004         return AE_CTRL_TERMINATE;
1005 }
1006
1007 /*
1008  * Some BIOS (such as some from Gateway laptops) access EC region very early
1009  * such as in BAT0._INI or EC._INI before an EC device is found and
1010  * do not provide an ECDT. According to ACPI spec, ECDT isn't mandatorily
1011  * required, but if EC regison is accessed early, it is required.
1012  * The routine tries to workaround the BIOS bug by pre-scan EC device
1013  * It assumes that _CRS, _HID, _GPE, _UID methods of EC don't touch any
1014  * op region (since _REG isn't invoked yet). The assumption is true for
1015  * all systems found.
1016  */
1017 static int __init
1018 acpi_ec_fake_ecdt(void)
1019 {
1020         acpi_status     status;
1021         int             ret = 0;
1022
1023         printk(KERN_INFO PREFIX "Try to make an fake ECDT\n");
1024
1025         ec_ecdt = kmalloc(sizeof(struct acpi_ec), GFP_KERNEL);
1026         if (!ec_ecdt) {
1027                 ret = -ENOMEM;
1028                 goto error;
1029         }
1030         memset(ec_ecdt, 0, sizeof(struct acpi_ec));
1031
1032         status = acpi_get_devices (ACPI_EC_HID,
1033                                 acpi_fake_ecdt_callback,
1034                                 NULL,
1035                                 NULL);
1036         if (ACPI_FAILURE(status)) {
1037                 kfree(ec_ecdt);
1038                 ec_ecdt = NULL;
1039                 ret = -ENODEV;
1040                 goto error;
1041         }
1042         return 0;
1043 error:
1044         printk(KERN_ERR PREFIX "Can't make an fake ECDT\n");
1045         return ret;
1046 }
1047
1048 static int __init
1049 acpi_ec_get_real_ecdt(void)
1050 {
1051         acpi_status             status;
1052         struct acpi_table_ecdt  *ecdt_ptr;
1053
1054         status = acpi_get_firmware_table("ECDT", 1, ACPI_LOGICAL_ADDRESSING,
1055                 (struct acpi_table_header **) &ecdt_ptr);
1056         if (ACPI_FAILURE(status))
1057                 return -ENODEV;
1058
1059         printk(KERN_INFO PREFIX "Found ECDT\n");
1060
1061         /*
1062          * Generate a temporary ec context to use until the namespace is scanned
1063          */
1064         ec_ecdt = kmalloc(sizeof(struct acpi_ec), GFP_KERNEL);
1065         if (!ec_ecdt)
1066                 return -ENOMEM;
1067         memset(ec_ecdt, 0, sizeof(struct acpi_ec));
1068
1069         init_MUTEX(&ec_ecdt->sem);
1070         init_waitqueue_head(&ec_ecdt->wait);
1071         ec_ecdt->command_addr = ecdt_ptr->ec_control;
1072         ec_ecdt->status_addr = ecdt_ptr->ec_control;
1073         ec_ecdt->data_addr = ecdt_ptr->ec_data;
1074         ec_ecdt->gpe_bit = ecdt_ptr->gpe_bit;
1075         /* use the GL just to be safe */
1076         ec_ecdt->global_lock = TRUE;
1077         ec_ecdt->uid = ecdt_ptr->uid;
1078
1079         status = acpi_get_handle(NULL, ecdt_ptr->ec_id, &ec_ecdt->handle);
1080         if (ACPI_FAILURE(status)) {
1081                 goto error;
1082         }
1083
1084         return 0;
1085 error:
1086         printk(KERN_ERR PREFIX "Could not use ECDT\n");
1087         kfree(ec_ecdt);
1088         ec_ecdt = NULL;
1089
1090         return -ENODEV;
1091 }
1092
1093 static int __initdata acpi_fake_ecdt_enabled;
1094 int __init
1095 acpi_ec_ecdt_probe (void)
1096 {
1097         acpi_status             status;
1098         int                     ret;
1099
1100         ret = acpi_ec_get_real_ecdt();
1101         /* Try to make a fake ECDT */
1102         if (ret && acpi_fake_ecdt_enabled) {
1103                 ret = acpi_ec_fake_ecdt();
1104         }
1105
1106         if (ret)
1107                 return 0;
1108
1109         /*
1110          * Install GPE handler
1111          */
1112         status = acpi_install_gpe_handler(NULL, ec_ecdt->gpe_bit,
1113                 ACPI_GPE_EDGE_TRIGGERED, &acpi_ec_gpe_handler,
1114                 ec_ecdt);
1115         if (ACPI_FAILURE(status)) {
1116                 goto error;
1117         }
1118         acpi_set_gpe_type (NULL, ec_ecdt->gpe_bit, ACPI_GPE_TYPE_RUNTIME);
1119         acpi_enable_gpe (NULL, ec_ecdt->gpe_bit, ACPI_NOT_ISR);
1120
1121         status = acpi_install_address_space_handler (ACPI_ROOT_OBJECT,
1122                         ACPI_ADR_SPACE_EC, &acpi_ec_space_handler,
1123                         &acpi_ec_space_setup, ec_ecdt);
1124         if (ACPI_FAILURE(status)) {
1125                 acpi_remove_gpe_handler(NULL, ec_ecdt->gpe_bit,
1126                         &acpi_ec_gpe_handler);
1127                 goto error;
1128         }
1129
1130         return 0;
1131
1132 error:
1133         printk(KERN_ERR PREFIX "Could not use ECDT\n");
1134         kfree(ec_ecdt);
1135         ec_ecdt = NULL;
1136
1137         return -ENODEV;
1138 }
1139
1140
1141 static int __init acpi_ec_init (void)
1142 {
1143         int                     result;
1144
1145         ACPI_FUNCTION_TRACE("acpi_ec_init");
1146
1147         if (acpi_disabled)
1148                 return_VALUE(0);
1149
1150         acpi_ec_dir = proc_mkdir(ACPI_EC_CLASS, acpi_root_dir);
1151         if (!acpi_ec_dir)
1152                 return_VALUE(-ENODEV);
1153
1154         /* Now register the driver for the EC */
1155         result = acpi_bus_register_driver(&acpi_ec_driver);
1156         if (result < 0) {
1157                 remove_proc_entry(ACPI_EC_CLASS, acpi_root_dir);
1158                 return_VALUE(-ENODEV);
1159         }
1160
1161         return_VALUE(result);
1162 }
1163
1164 subsys_initcall(acpi_ec_init);
1165
1166 /* EC driver currently not unloadable */
1167 #if 0
1168 static void __exit
1169 acpi_ec_exit (void)
1170 {
1171         ACPI_FUNCTION_TRACE("acpi_ec_exit");
1172
1173         acpi_bus_unregister_driver(&acpi_ec_driver);
1174
1175         remove_proc_entry(ACPI_EC_CLASS, acpi_root_dir);
1176
1177         return_VOID;
1178 }
1179 #endif /* 0 */
1180
1181 static int __init acpi_fake_ecdt_setup(char *str)
1182 {
1183         acpi_fake_ecdt_enabled = 1;
1184         return 0;
1185 }
1186 __setup("acpi_fake_ecdt", acpi_fake_ecdt_setup);