ec.c 27.1 KB
Newer Older
L
Linus Torvalds 已提交
1
/*
2
 *  ec.c - ACPI Embedded Controller Driver (v2.1)
L
Linus Torvalds 已提交
3
 *
4
 *  Copyright (C) 2006-2008 Alexey Starikovskiy <astarikovskiy@suse.de>
5
 *  Copyright (C) 2006 Denis Sadykov <denis.m.sadykov@intel.com>
L
Linus Torvalds 已提交
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
 *  Copyright (C) 2004 Luming Yu <luming.yu@intel.com>
 *  Copyright (C) 2001, 2002 Andy Grover <andrew.grover@intel.com>
 *  Copyright (C) 2001, 2002 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com>
 *
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or (at
 *  your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful, but
 *  WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License along
 *  with this program; if not, write to the Free Software Foundation, Inc.,
 *  59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
 *
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 */

29
/* Uncomment next line to get verbose printout */
30 31
/* #define DEBUG */

L
Linus Torvalds 已提交
32 33 34 35 36 37 38
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/types.h>
#include <linux/delay.h>
#include <linux/proc_fs.h>
#include <linux/seq_file.h>
D
Dmitry Torokhov 已提交
39
#include <linux/interrupt.h>
40
#include <linux/list.h>
41
#include <linux/spinlock.h>
L
Linus Torvalds 已提交
42 43 44 45 46 47 48 49
#include <asm/io.h>
#include <acpi/acpi_bus.h>
#include <acpi/acpi_drivers.h>
#include <acpi/actypes.h>

#define ACPI_EC_CLASS			"embedded_controller"
#define ACPI_EC_DEVICE_NAME		"Embedded Controller"
#define ACPI_EC_FILE_INFO		"info"
50

51 52
#undef PREFIX
#define PREFIX				"ACPI: EC: "
53

54
/* EC status register */
L
Linus Torvalds 已提交
55 56
#define ACPI_EC_FLAG_OBF	0x01	/* Output buffer full */
#define ACPI_EC_FLAG_IBF	0x02	/* Input buffer full */
D
Dmitry Torokhov 已提交
57
#define ACPI_EC_FLAG_BURST	0x10	/* burst mode */
L
Linus Torvalds 已提交
58
#define ACPI_EC_FLAG_SCI	0x20	/* EC-SCI occurred */
59

60
/* EC commands */
61
enum ec_command {
A
Alexey Starikovskiy 已提交
62 63 64 65 66
	ACPI_EC_COMMAND_READ = 0x80,
	ACPI_EC_COMMAND_WRITE = 0x81,
	ACPI_EC_BURST_ENABLE = 0x82,
	ACPI_EC_BURST_DISABLE = 0x83,
	ACPI_EC_COMMAND_QUERY = 0x84,
67
};
68

69
#define ACPI_EC_DELAY		500	/* Wait 500ms max. during EC ops */
70
#define ACPI_EC_UDELAY_GLK	1000	/* Wait 1ms max. to get global lock */
71
#define ACPI_EC_UDELAY		100	/* Wait 100us before polling EC again */
72

73 74 75
#define ACPI_EC_STORM_THRESHOLD 20	/* number of false interrupts
					   per one transaction */

76 77
enum {
	EC_FLAGS_QUERY_PENDING,		/* Query is pending */
78 79
	EC_FLAGS_GPE_MODE,		/* Expect GPE to be sent
					 * for status change */
80
	EC_FLAGS_NO_GPE,		/* Don't use GPE mode */
81 82 83
	EC_FLAGS_GPE_STORM,		/* GPE storm detected */
	EC_FLAGS_HANDLERS_INSTALLED	/* Handlers for GPE and
					 * OpReg are installed */
L
Linus Torvalds 已提交
84
};
85 86

/* If we find an EC via the ECDT, we need to keep a ptr to its context */
87
/* External interfaces use first EC only, so remember */
88 89 90 91 92 93 94 95 96 97
typedef int (*acpi_ec_query_func) (void *data);

struct acpi_ec_query_handler {
	struct list_head node;
	acpi_ec_query_func func;
	acpi_handle handle;
	void *data;
	u8 query_bit;
};

98
struct transaction {
99 100 101
	const u8 *wdata;
	u8 *rdata;
	unsigned short irq_count;
102
	u8 command;
103 104 105 106
	u8 wlen;
	u8 rlen;
};

107
static struct acpi_ec {
108
	acpi_handle handle;
109
	unsigned long gpe;
110 111
	unsigned long command_addr;
	unsigned long data_addr;
112
	unsigned long global_lock;
113
	unsigned long flags;
114
	struct mutex lock;
115
	wait_queue_head_t wait;
116
	struct list_head list;
117 118
	struct transaction *curr;
	spinlock_t curr_lock;
119
} *boot_ec, *first_ec;
120

121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145
/* 
 * Some Asus system have exchanged ECDT data/command IO addresses.
 */
static int print_ecdt_error(const struct dmi_system_id *id)
{
	printk(KERN_NOTICE PREFIX "%s detected - "
		"ECDT has exchanged control/data I/O address\n",
		id->ident);
	return 0;
}

static struct dmi_system_id __cpuinitdata ec_dmi_table[] = {
	{
	print_ecdt_error, "Asus L4R", {
	DMI_MATCH(DMI_BIOS_VERSION, "1008.006"),
	DMI_MATCH(DMI_PRODUCT_NAME, "L4R"),
	DMI_MATCH(DMI_BOARD_NAME, "L4R") }, NULL},
	{
	print_ecdt_error, "Asus M6R", {
	DMI_MATCH(DMI_BIOS_VERSION, "0207"),
	DMI_MATCH(DMI_PRODUCT_NAME, "M6R"),
	DMI_MATCH(DMI_BOARD_NAME, "M6R") }, NULL},
	{},
};

L
Linus Torvalds 已提交
146 147 148 149
/* --------------------------------------------------------------------------
                             Transaction Management
   -------------------------------------------------------------------------- */

150
static inline u8 acpi_ec_read_status(struct acpi_ec *ec)
L
Linus Torvalds 已提交
151
{
152
	u8 x = inb(ec->command_addr);
153
	pr_debug(PREFIX "---> status = 0x%2.2x\n", x);
154
	return x;
D
Dmitry Torokhov 已提交
155 156
}

157
static inline u8 acpi_ec_read_data(struct acpi_ec *ec)
158
{
159
	u8 x = inb(ec->data_addr);
160
	pr_debug(PREFIX "---> data = 0x%2.2x\n", x);
161
	return x;
162 163
}

164
static inline void acpi_ec_write_cmd(struct acpi_ec *ec, u8 command)
L
Luming Yu 已提交
165
{
166
	pr_debug(PREFIX "<--- command = 0x%2.2x\n", command);
167
	outb(command, ec->command_addr);
L
Luming Yu 已提交
168 169
}

170
static inline void acpi_ec_write_data(struct acpi_ec *ec, u8 data)
L
Luming Yu 已提交
171
{
172
	pr_debug(PREFIX "<--- data = 0x%2.2x\n", data);
173
	outb(data, ec->data_addr);
174
}
L
Luming Yu 已提交
175

176
static int ec_transaction_done(struct acpi_ec *ec)
177
{
178 179
	unsigned long flags;
	int ret = 0;
180 181
	spin_lock_irqsave(&ec->curr_lock, flags);
	if (!ec->curr || (!ec->curr->wlen && !ec->curr->rlen))
182
		ret = 1;
183
	spin_unlock_irqrestore(&ec->curr_lock, flags);
184
	return ret;
L
Luming Yu 已提交
185
}
D
Dmitry Torokhov 已提交
186

187
static void gpe_transaction(struct acpi_ec *ec, u8 status)
188
{
189
	unsigned long flags;
190 191
	spin_lock_irqsave(&ec->curr_lock, flags);
	if (!ec->curr)
192
		goto unlock;
193
	if (ec->curr->wlen > 0) {
194
		if ((status & ACPI_EC_FLAG_IBF) == 0) {
195 196
			acpi_ec_write_data(ec, *(ec->curr->wdata++));
			--ec->curr->wlen;
197 198
		} else
			/* false interrupt, state didn't change */
199
			++ec->curr->irq_count;
200

201
	} else if (ec->curr->rlen > 0) {
202
		if ((status & ACPI_EC_FLAG_OBF) == 1) {
203 204
			*(ec->curr->rdata++) = acpi_ec_read_data(ec);
			--ec->curr->rlen;
205 206
		} else
			/* false interrupt, state didn't change */
207
			++ec->curr->irq_count;
208 209
	}
unlock:
210
	spin_unlock_irqrestore(&ec->curr_lock, flags);
A
Alexey Starikovskiy 已提交
211
}
212

213
static int acpi_ec_wait(struct acpi_ec *ec)
A
Alexey Starikovskiy 已提交
214
{
215 216 217 218 219 220 221
	if (wait_event_timeout(ec->wait, ec_transaction_done(ec),
			       msecs_to_jiffies(ACPI_EC_DELAY)))
		return 0;
	/* missing GPEs, switch back to poll mode */
	if (printk_ratelimit())
		pr_info(PREFIX "missing confirmations, "
				"switch off interrupt mode.\n");
222
	set_bit(EC_FLAGS_NO_GPE, &ec->flags);
A
Alexey Starikovskiy 已提交
223
	clear_bit(EC_FLAGS_GPE_MODE, &ec->flags);
224
	return 1;
A
Alexey Starikovskiy 已提交
225 226
}

227 228 229
static void acpi_ec_gpe_query(void *ec_cxt);

static int ec_check_sci(struct acpi_ec *ec, u8 state)
230
{
231 232 233 234 235 236 237 238 239 240 241
	if (state & ACPI_EC_FLAG_SCI) {
		if (!test_and_set_bit(EC_FLAGS_QUERY_PENDING, &ec->flags))
			return acpi_os_execute(OSL_EC_BURST_HANDLER,
				acpi_ec_gpe_query, ec);
	}
	return 0;
}

static int ec_poll(struct acpi_ec *ec)
{
	unsigned long delay = jiffies + msecs_to_jiffies(ACPI_EC_DELAY);
242
	udelay(ACPI_EC_UDELAY);
243 244
	while (time_before(jiffies, delay)) {
		gpe_transaction(ec, acpi_ec_read_status(ec));
245
		udelay(ACPI_EC_UDELAY);
246
		if (ec_transaction_done(ec))
247
			return 0;
248
	}
249
	return -ETIME;
L
Linus Torvalds 已提交
250 251
}

252 253
static int acpi_ec_transaction_unlocked(struct acpi_ec *ec,
					struct transaction *t,
254
					int force_poll)
L
Luming Yu 已提交
255
{
256 257
	unsigned long tmp;
	int ret = 0;
258
	pr_debug(PREFIX "transaction start\n");
259 260 261 262
	/* disable GPE during transaction if storm is detected */
	if (test_bit(EC_FLAGS_GPE_STORM, &ec->flags)) {
		clear_bit(EC_FLAGS_GPE_MODE, &ec->flags);
		acpi_disable_gpe(NULL, ec->gpe, ACPI_NOT_ISR);
263
	}
264
	/* start transaction */
265
	spin_lock_irqsave(&ec->curr_lock, tmp);
266
	/* following two actions should be kept atomic */
267 268 269 270
	t->irq_count = 0;
	ec->curr = t;
	acpi_ec_write_cmd(ec, ec->curr->command);
	if (ec->curr->command == ACPI_EC_COMMAND_QUERY)
271
		clear_bit(EC_FLAGS_QUERY_PENDING, &ec->flags);
272
	spin_unlock_irqrestore(&ec->curr_lock, tmp);
273 274 275 276 277
	/* if we selected poll mode or failed in GPE-mode do a poll loop */
	if (force_poll ||
	    !test_bit(EC_FLAGS_GPE_MODE, &ec->flags) ||
	    acpi_ec_wait(ec))
		ret = ec_poll(ec);
278
	pr_debug(PREFIX "transaction end\n");
279 280 281
	spin_lock_irqsave(&ec->curr_lock, tmp);
	ec->curr = NULL;
	spin_unlock_irqrestore(&ec->curr_lock, tmp);
282 283 284 285 286 287
	if (test_bit(EC_FLAGS_GPE_STORM, &ec->flags)) {
		/* check if we received SCI during transaction */
		ec_check_sci(ec, acpi_ec_read_status(ec));
		/* it is safe to enable GPE outside of transaction */
		acpi_enable_gpe(NULL, ec->gpe, ACPI_NOT_ISR);
	} else if (test_bit(EC_FLAGS_GPE_MODE, &ec->flags) &&
288
		   t->irq_count > ACPI_EC_STORM_THRESHOLD) {
289 290
		pr_info(PREFIX "GPE storm detected, "
			"transactions will use polling mode\n");
291 292 293 294 295 296 297 298 299
		set_bit(EC_FLAGS_GPE_STORM, &ec->flags);
	}
	return ret;
}

static int ec_check_ibf0(struct acpi_ec *ec)
{
	u8 status = acpi_ec_read_status(ec);
	return (status & ACPI_EC_FLAG_IBF) == 0;
L
Luming Yu 已提交
300 301
}

302 303 304 305 306 307 308 309 310 311
static int ec_wait_ibf0(struct acpi_ec *ec)
{
	unsigned long delay = jiffies + msecs_to_jiffies(ACPI_EC_DELAY);
	/* interrupt wait manually if GPE mode is not active */
	unsigned long timeout = test_bit(EC_FLAGS_GPE_MODE, &ec->flags) ?
		msecs_to_jiffies(ACPI_EC_DELAY) : msecs_to_jiffies(1);
	while (time_before(jiffies, delay))
		if (wait_event_timeout(ec->wait, ec_check_ibf0(ec), timeout))
			return 0;
	return -ETIME;
L
Luming Yu 已提交
312 313
}

314
static int acpi_ec_transaction(struct acpi_ec *ec, struct transaction *t,
315
			       int force_poll)
L
Linus Torvalds 已提交
316
{
317
	int status;
L
Len Brown 已提交
318
	u32 glk;
319
	if (!ec || (!t) || (t->wlen && !t->wdata) || (t->rlen && !t->rdata))
320
		return -EINVAL;
321 322
	if (t->rdata)
		memset(t->rdata, 0, t->rlen);
323
	mutex_lock(&ec->lock);
324
	if (ec->global_lock) {
L
Linus Torvalds 已提交
325
		status = acpi_acquire_global_lock(ACPI_EC_UDELAY_GLK, &glk);
326
		if (ACPI_FAILURE(status)) {
327 328
			status = -ENODEV;
			goto unlock;
329
		}
L
Linus Torvalds 已提交
330
	}
331
	if (ec_wait_ibf0(ec)) {
332 333
		pr_err(PREFIX "input buffer is not empty, "
				"aborting transaction\n");
334
		status = -ETIME;
D
Dmitry Torokhov 已提交
335
		goto end;
336
	}
337
	status = acpi_ec_transaction_unlocked(ec, t, force_poll);
338
end:
339
	if (ec->global_lock)
L
Linus Torvalds 已提交
340
		acpi_release_global_lock(glk);
341
unlock:
342
	mutex_unlock(&ec->lock);
343
	return status;
L
Linus Torvalds 已提交
344 345
}

346 347 348 349 350 351 352
/*
 * Note: samsung nv5000 doesn't work with ec burst mode.
 * http://bugzilla.kernel.org/show_bug.cgi?id=4980
 */
int acpi_ec_burst_enable(struct acpi_ec *ec)
{
	u8 d;
353 354 355 356 357
	struct transaction t = {.command = ACPI_EC_BURST_ENABLE,
				.wdata = NULL, .rdata = &d,
				.wlen = 0, .rlen = 1};

	return acpi_ec_transaction(ec, &t, 0);
358 359 360 361
}

int acpi_ec_burst_disable(struct acpi_ec *ec)
{
362 363 364 365
	struct transaction t = {.command = ACPI_EC_BURST_DISABLE,
				.wdata = NULL, .rdata = NULL,
				.wlen = 0, .rlen = 0};

366
	return (acpi_ec_read_status(ec) & ACPI_EC_FLAG_BURST) ?
367
				acpi_ec_transaction(ec, &t, 0) : 0;
368 369
}

A
Alexey Starikovskiy 已提交
370
static int acpi_ec_read(struct acpi_ec *ec, u8 address, u8 * data)
371 372 373
{
	int result;
	u8 d;
374 375 376
	struct transaction t = {.command = ACPI_EC_COMMAND_READ,
				.wdata = &address, .rdata = &d,
				.wlen = 1, .rlen = 1};
377

378
	result = acpi_ec_transaction(ec, &t, 0);
379 380 381
	*data = d;
	return result;
}
382

383 384
static int acpi_ec_write(struct acpi_ec *ec, u8 address, u8 data)
{
A
Alexey Starikovskiy 已提交
385
	u8 wdata[2] = { address, data };
386 387 388 389 390
	struct transaction t = {.command = ACPI_EC_COMMAND_WRITE,
				.wdata = wdata, .rdata = NULL,
				.wlen = 2, .rlen = 0};

	return acpi_ec_transaction(ec, &t, 0);
391 392
}

L
Linus Torvalds 已提交
393 394 395
/*
 * Externally callable EC access functions. For now, assume 1 EC only
 */
396 397 398 399
int ec_burst_enable(void)
{
	if (!first_ec)
		return -ENODEV;
400
	return acpi_ec_burst_enable(first_ec);
401 402 403 404 405 406 407 408
}

EXPORT_SYMBOL(ec_burst_enable);

int ec_burst_disable(void)
{
	if (!first_ec)
		return -ENODEV;
409
	return acpi_ec_burst_disable(first_ec);
410 411 412 413
}

EXPORT_SYMBOL(ec_burst_disable);

A
Alexey Starikovskiy 已提交
414
int ec_read(u8 addr, u8 * val)
L
Linus Torvalds 已提交
415 416
{
	int err;
417
	u8 temp_data;
L
Linus Torvalds 已提交
418 419 420 421

	if (!first_ec)
		return -ENODEV;

422
	err = acpi_ec_read(first_ec, addr, &temp_data);
L
Linus Torvalds 已提交
423 424 425 426

	if (!err) {
		*val = temp_data;
		return 0;
L
Len Brown 已提交
427
	} else
L
Linus Torvalds 已提交
428 429
		return err;
}
L
Len Brown 已提交
430

L
Linus Torvalds 已提交
431 432
EXPORT_SYMBOL(ec_read);

L
Len Brown 已提交
433
int ec_write(u8 addr, u8 val)
L
Linus Torvalds 已提交
434 435 436 437 438 439
{
	int err;

	if (!first_ec)
		return -ENODEV;

440
	err = acpi_ec_write(first_ec, addr, val);
L
Linus Torvalds 已提交
441 442 443

	return err;
}
L
Len Brown 已提交
444

L
Linus Torvalds 已提交
445 446
EXPORT_SYMBOL(ec_write);

447
int ec_transaction(u8 command,
448
		   const u8 * wdata, unsigned wdata_len,
449 450
		   u8 * rdata, unsigned rdata_len,
		   int force_poll)
L
Luming Yu 已提交
451
{
452 453 454
	struct transaction t = {.command = command,
				.wdata = wdata, .rdata = rdata,
				.wlen = wdata_len, .rlen = rdata_len};
455 456
	if (!first_ec)
		return -ENODEV;
L
Luming Yu 已提交
457

458
	return acpi_ec_transaction(first_ec, &t, force_poll);
L
Luming Yu 已提交
459
}
L
Linus Torvalds 已提交
460

461 462
EXPORT_SYMBOL(ec_transaction);

A
Alexey Starikovskiy 已提交
463
static int acpi_ec_query(struct acpi_ec *ec, u8 * data)
464 465
{
	int result;
A
Alexey Starikovskiy 已提交
466
	u8 d;
467 468 469
	struct transaction t = {.command = ACPI_EC_COMMAND_QUERY,
				.wdata = NULL, .rdata = &d,
				.wlen = 0, .rlen = 1};
A
Alexey Starikovskiy 已提交
470 471
	if (!ec || !data)
		return -EINVAL;
L
Linus Torvalds 已提交
472

A
Alexey Starikovskiy 已提交
473 474 475 476 477
	/*
	 * Query the EC to find out which _Qxx method we need to evaluate.
	 * Note that successful completion of the query causes the ACPI_EC_SCI
	 * bit to be cleared (and thus clearing the interrupt source).
	 */
478

479
	result = acpi_ec_transaction(ec, &t, 0);
A
Alexey Starikovskiy 已提交
480 481
	if (result)
		return result;
L
Linus Torvalds 已提交
482

A
Alexey Starikovskiy 已提交
483 484
	if (!d)
		return -ENODATA;
L
Linus Torvalds 已提交
485

A
Alexey Starikovskiy 已提交
486 487
	*data = d;
	return 0;
L
Linus Torvalds 已提交
488 489 490 491 492
}

/* --------------------------------------------------------------------------
                                Event Management
   -------------------------------------------------------------------------- */
493 494 495 496 497 498 499 500 501 502 503 504 505 506
int acpi_ec_add_query_handler(struct acpi_ec *ec, u8 query_bit,
			      acpi_handle handle, acpi_ec_query_func func,
			      void *data)
{
	struct acpi_ec_query_handler *handler =
	    kzalloc(sizeof(struct acpi_ec_query_handler), GFP_KERNEL);
	if (!handler)
		return -ENOMEM;

	handler->query_bit = query_bit;
	handler->handle = handle;
	handler->func = func;
	handler->data = data;
	mutex_lock(&ec->lock);
507
	list_add(&handler->node, &ec->list);
508 509 510 511 512 513 514 515
	mutex_unlock(&ec->lock);
	return 0;
}

EXPORT_SYMBOL_GPL(acpi_ec_add_query_handler);

void acpi_ec_remove_query_handler(struct acpi_ec *ec, u8 query_bit)
{
A
Adrian Bunk 已提交
516
	struct acpi_ec_query_handler *handler, *tmp;
517
	mutex_lock(&ec->lock);
A
Adrian Bunk 已提交
518
	list_for_each_entry_safe(handler, tmp, &ec->list, node) {
519 520 521 522 523 524 525 526 527
		if (query_bit == handler->query_bit) {
			list_del(&handler->node);
			kfree(handler);
		}
	}
	mutex_unlock(&ec->lock);
}

EXPORT_SYMBOL_GPL(acpi_ec_remove_query_handler);
L
Linus Torvalds 已提交
528

L
Len Brown 已提交
529
static void acpi_ec_gpe_query(void *ec_cxt)
L
Luming Yu 已提交
530
{
531
	struct acpi_ec *ec = ec_cxt;
532
	u8 value = 0;
533
	struct acpi_ec_query_handler *handler, copy;
L
Luming Yu 已提交
534

535
	if (!ec || acpi_ec_query(ec, &value))
536
		return;
537 538 539 540 541 542 543 544 545 546 547 548 549 550 551
	mutex_lock(&ec->lock);
	list_for_each_entry(handler, &ec->list, node) {
		if (value == handler->query_bit) {
			/* have custom handler for this bit */
			memcpy(&copy, handler, sizeof(copy));
			mutex_unlock(&ec->lock);
			if (copy.func) {
				copy.func(copy.data);
			} else if (copy.handle) {
				acpi_evaluate_object(copy.handle, NULL, NULL, NULL);
			}
			return;
		}
	}
	mutex_unlock(&ec->lock);
L
Luming Yu 已提交
552
}
L
Linus Torvalds 已提交
553

L
Len Brown 已提交
554
static u32 acpi_ec_gpe_handler(void *data)
L
Linus Torvalds 已提交
555
{
556
	struct acpi_ec *ec = data;
557
	u8 status;
558

559
	pr_debug(PREFIX "~~~> interrupt\n");
560 561 562 563
	status = acpi_ec_read_status(ec);

	gpe_transaction(ec, status);
	if (ec_transaction_done(ec) && (status & ACPI_EC_FLAG_IBF) == 0)
564
		wake_up(&ec->wait);
D
Dmitry Torokhov 已提交
565

566 567 568
	ec_check_sci(ec, status);
	if (!test_bit(EC_FLAGS_GPE_MODE, &ec->flags) &&
	    !test_bit(EC_FLAGS_NO_GPE, &ec->flags)) {
569
		/* this is non-query, must be confirmation */
570 571 572 573 574 575 576
		if (!test_bit(EC_FLAGS_GPE_STORM, &ec->flags)) {
			if (printk_ratelimit())
				pr_info(PREFIX "non-query interrupt received,"
					" switching to interrupt mode\n");
		} else {
			/* hush, STORM switches the mode every transaction */
			pr_debug(PREFIX "non-query interrupt received,"
577
				" switching to interrupt mode\n");
578
		}
579
		set_bit(EC_FLAGS_GPE_MODE, &ec->flags);
580
	}
581
	return ACPI_INTERRUPT_HANDLED;
A
Alexey Starikovskiy 已提交
582 583
}

L
Linus Torvalds 已提交
584 585 586 587 588
/* --------------------------------------------------------------------------
                             Address Space Management
   -------------------------------------------------------------------------- */

static acpi_status
589 590
acpi_ec_space_handler(u32 function, acpi_physical_address address,
		      u32 bits, acpi_integer *value,
L
Len Brown 已提交
591
		      void *handler_context, void *region_context)
L
Linus Torvalds 已提交
592
{
593
	struct acpi_ec *ec = handler_context;
594
	int result = 0, i;
595
	u8 temp = 0;
L
Linus Torvalds 已提交
596 597

	if ((address > 0xFF) || !value || !handler_context)
598
		return AE_BAD_PARAMETER;
L
Linus Torvalds 已提交
599

600
	if (function != ACPI_READ && function != ACPI_WRITE)
601
		return AE_BAD_PARAMETER;
L
Linus Torvalds 已提交
602

603 604
	if (bits != 8 && acpi_strict)
		return AE_BAD_PARAMETER;
L
Linus Torvalds 已提交
605

606 607
	acpi_ec_burst_enable(ec);

608 609 610 611 612 613 614 615 616 617
	if (function == ACPI_READ) {
		result = acpi_ec_read(ec, address, &temp);
		*value = temp;
	} else {
		temp = 0xff & (*value);
		result = acpi_ec_write(ec, address, temp);
	}

	for (i = 8; unlikely(bits - i > 0); i += 8) {
		++address;
618 619 620 621 622 623 624
		if (function == ACPI_READ) {
			result = acpi_ec_read(ec, address, &temp);
			(*value) |= ((acpi_integer)temp) << i;
		} else {
			temp = 0xff & ((*value) >> i);
			result = acpi_ec_write(ec, address, temp);
		}
L
Linus Torvalds 已提交
625 626
	}

627 628
	acpi_ec_burst_disable(ec);

L
Linus Torvalds 已提交
629 630
	switch (result) {
	case -EINVAL:
631
		return AE_BAD_PARAMETER;
L
Linus Torvalds 已提交
632 633
		break;
	case -ENODEV:
634
		return AE_NOT_FOUND;
L
Linus Torvalds 已提交
635 636
		break;
	case -ETIME:
637
		return AE_TIME;
L
Linus Torvalds 已提交
638 639
		break;
	default:
640
		return AE_OK;
L
Linus Torvalds 已提交
641 642 643 644 645 646 647
	}
}

/* --------------------------------------------------------------------------
                              FS Interface (/proc)
   -------------------------------------------------------------------------- */

L
Len Brown 已提交
648
static struct proc_dir_entry *acpi_ec_dir;
L
Linus Torvalds 已提交
649

L
Len Brown 已提交
650
static int acpi_ec_read_info(struct seq_file *seq, void *offset)
L
Linus Torvalds 已提交
651
{
652
	struct acpi_ec *ec = seq->private;
L
Linus Torvalds 已提交
653 654 655 656

	if (!ec)
		goto end;

657 658 659 660
	seq_printf(seq, "gpe:\t\t\t0x%02x\n", (u32) ec->gpe);
	seq_printf(seq, "ports:\t\t\t0x%02x, 0x%02x\n",
		   (unsigned)ec->command_addr, (unsigned)ec->data_addr);
	seq_printf(seq, "use global lock:\t%s\n",
661
		   ec->global_lock ? "yes" : "no");
L
Len Brown 已提交
662
      end:
663
	return 0;
L
Linus Torvalds 已提交
664 665 666 667 668 669 670
}

static int acpi_ec_info_open_fs(struct inode *inode, struct file *file)
{
	return single_open(file, acpi_ec_read_info, PDE(inode)->data);
}

671
static struct file_operations acpi_ec_info_ops = {
L
Len Brown 已提交
672 673 674 675
	.open = acpi_ec_info_open_fs,
	.read = seq_read,
	.llseek = seq_lseek,
	.release = single_release,
L
Linus Torvalds 已提交
676 677 678
	.owner = THIS_MODULE,
};

L
Len Brown 已提交
679
static int acpi_ec_add_fs(struct acpi_device *device)
L
Linus Torvalds 已提交
680
{
L
Len Brown 已提交
681
	struct proc_dir_entry *entry = NULL;
L
Linus Torvalds 已提交
682 683 684

	if (!acpi_device_dir(device)) {
		acpi_device_dir(device) = proc_mkdir(acpi_device_bid(device),
L
Len Brown 已提交
685
						     acpi_ec_dir);
L
Linus Torvalds 已提交
686
		if (!acpi_device_dir(device))
687
			return -ENODEV;
L
Linus Torvalds 已提交
688 689
	}

690 691 692
	entry = proc_create_data(ACPI_EC_FILE_INFO, S_IRUGO,
				 acpi_device_dir(device),
				 &acpi_ec_info_ops, acpi_driver_data(device));
L
Linus Torvalds 已提交
693
	if (!entry)
694 695
		return -ENODEV;
	return 0;
L
Linus Torvalds 已提交
696 697
}

L
Len Brown 已提交
698
static int acpi_ec_remove_fs(struct acpi_device *device)
L
Linus Torvalds 已提交
699 700 701 702 703 704 705 706
{

	if (acpi_device_dir(device)) {
		remove_proc_entry(ACPI_EC_FILE_INFO, acpi_device_dir(device));
		remove_proc_entry(acpi_device_bid(device), acpi_ec_dir);
		acpi_device_dir(device) = NULL;
	}

707
	return 0;
L
Linus Torvalds 已提交
708 709 710 711 712
}

/* --------------------------------------------------------------------------
                               Driver Interface
   -------------------------------------------------------------------------- */
713 714 715 716 717 718 719 720
static acpi_status
ec_parse_io_ports(struct acpi_resource *resource, void *context);

static struct acpi_ec *make_acpi_ec(void)
{
	struct acpi_ec *ec = kzalloc(sizeof(struct acpi_ec), GFP_KERNEL);
	if (!ec)
		return NULL;
721
	ec->flags = 1 << EC_FLAGS_QUERY_PENDING;
722 723
	mutex_init(&ec->lock);
	init_waitqueue_head(&ec->wait);
724
	INIT_LIST_HEAD(&ec->list);
725
	spin_lock_init(&ec->curr_lock);
726 727
	return ec;
}
728

729 730 731 732 733 734 735 736 737 738 739 740 741
static acpi_status
acpi_ec_register_query_methods(acpi_handle handle, u32 level,
			       void *context, void **return_value)
{
	struct acpi_namespace_node *node = handle;
	struct acpi_ec *ec = context;
	int value = 0;
	if (sscanf(node->name.ascii, "_Q%x", &value) == 1) {
		acpi_ec_add_query_handler(ec, value, handle, NULL, NULL);
	}
	return AE_OK;
}

742 743
static acpi_status
ec_parse_device(acpi_handle handle, u32 Level, void *context, void **retval)
744
{
745
	acpi_status status;
746
	unsigned long long tmp;
747 748 749 750 751 752

	struct acpi_ec *ec = context;
	status = acpi_walk_resources(handle, METHOD_NAME__CRS,
				     ec_parse_io_ports, ec);
	if (ACPI_FAILURE(status))
		return status;
753 754 755

	/* Get GPE bit assignment (EC events). */
	/* TODO: Add support for _GPE returning a package */
756
	status = acpi_evaluate_integer(handle, "_GPE", NULL, &tmp);
757 758
	if (ACPI_FAILURE(status))
		return status;
759
	ec->gpe = tmp;
760
	/* Use the global lock for all EC transactions? */
761 762
	acpi_evaluate_integer(handle, "_GLK", NULL, &tmp);
	ec->global_lock = tmp;
763
	ec->handle = handle;
764
	return AE_CTRL_TERMINATE;
765 766
}

767 768 769 770
static void ec_remove_handlers(struct acpi_ec *ec)
{
	if (ACPI_FAILURE(acpi_remove_address_space_handler(ec->handle,
				ACPI_ADR_SPACE_EC, &acpi_ec_space_handler)))
771
		pr_err(PREFIX "failed to remove space handler\n");
772 773
	if (ACPI_FAILURE(acpi_remove_gpe_handler(NULL, ec->gpe,
				&acpi_ec_gpe_handler)))
774
		pr_err(PREFIX "failed to remove gpe handler\n");
775
	clear_bit(EC_FLAGS_HANDLERS_INSTALLED, &ec->flags);
776 777
}

778
static int acpi_ec_add(struct acpi_device *device)
L
Linus Torvalds 已提交
779
{
780
	struct acpi_ec *ec = NULL;
L
Luming Yu 已提交
781 782

	if (!device)
783
		return -EINVAL;
784 785 786
	strcpy(acpi_device_name(device), ACPI_EC_DEVICE_NAME);
	strcpy(acpi_device_class(device), ACPI_EC_CLASS);

787
	/* Check for boot EC */
788 789 790 791 792 793 794 795 796 797 798 799 800
	if (boot_ec &&
	    (boot_ec->handle == device->handle ||
	     boot_ec->handle == ACPI_ROOT_OBJECT)) {
		ec = boot_ec;
		boot_ec = NULL;
	} else {
		ec = make_acpi_ec();
		if (!ec)
			return -ENOMEM;
		if (ec_parse_device(device->handle, 0, ec, NULL) !=
		    AE_CTRL_TERMINATE) {
			kfree(ec);
			return -EINVAL;
801 802 803
		}
	}

804
	ec->handle = device->handle;
805 806 807 808 809

	/* Find and register all query methods */
	acpi_walk_namespace(ACPI_TYPE_METHOD, ec->handle, 1,
			    acpi_ec_register_query_methods, ec, NULL);

810 811
	if (!first_ec)
		first_ec = ec;
812
	device->driver_data = ec;
813
	acpi_ec_add_fs(device);
814
	pr_info(PREFIX "GPE = 0x%lx, I/O: command/status = 0x%lx, data = 0x%lx\n",
815
			  ec->gpe, ec->command_addr, ec->data_addr);
816
	pr_info(PREFIX "driver started in %s mode\n",
817
		(test_bit(EC_FLAGS_GPE_MODE, &ec->flags))?"interrupt":"poll");
818
	return 0;
L
Linus Torvalds 已提交
819 820
}

L
Len Brown 已提交
821
static int acpi_ec_remove(struct acpi_device *device, int type)
L
Linus Torvalds 已提交
822
{
823
	struct acpi_ec *ec;
824
	struct acpi_ec_query_handler *handler, *tmp;
L
Linus Torvalds 已提交
825 826

	if (!device)
827
		return -EINVAL;
L
Linus Torvalds 已提交
828 829

	ec = acpi_driver_data(device);
830
	mutex_lock(&ec->lock);
831
	list_for_each_entry_safe(handler, tmp, &ec->list, node) {
832 833 834 835
		list_del(&handler->node);
		kfree(handler);
	}
	mutex_unlock(&ec->lock);
L
Linus Torvalds 已提交
836
	acpi_ec_remove_fs(device);
837
	device->driver_data = NULL;
838
	if (ec == first_ec)
839
		first_ec = NULL;
840
	kfree(ec);
841
	return 0;
L
Linus Torvalds 已提交
842 843 844
}

static acpi_status
845
ec_parse_io_ports(struct acpi_resource *resource, void *context)
L
Linus Torvalds 已提交
846
{
847
	struct acpi_ec *ec = context;
L
Linus Torvalds 已提交
848

849
	if (resource->type != ACPI_RESOURCE_TYPE_IO)
L
Linus Torvalds 已提交
850 851 852 853 854 855 856
		return AE_OK;

	/*
	 * The first address region returned is the data port, and
	 * the second address region returned is the status/command
	 * port.
	 */
857
	if (ec->data_addr == 0)
858
		ec->data_addr = resource->data.io.minimum;
859
	else if (ec->command_addr == 0)
860
		ec->command_addr = resource->data.io.minimum;
861
	else
L
Linus Torvalds 已提交
862 863 864 865 866
		return AE_CTRL_TERMINATE;

	return AE_OK;
}

867 868
static int ec_install_handlers(struct acpi_ec *ec)
{
869
	acpi_status status;
870
	if (test_bit(EC_FLAGS_HANDLERS_INSTALLED, &ec->flags))
871
		return 0;
872
	status = acpi_install_gpe_handler(NULL, ec->gpe,
873 874
				  ACPI_GPE_EDGE_TRIGGERED,
				  &acpi_ec_gpe_handler, ec);
875 876 877 878 879 880 881
	if (ACPI_FAILURE(status))
		return -ENODEV;
	acpi_set_gpe_type(NULL, ec->gpe, ACPI_GPE_TYPE_RUNTIME);
	acpi_enable_gpe(NULL, ec->gpe, ACPI_NOT_ISR);
	status = acpi_install_address_space_handler(ec->handle,
						    ACPI_ADR_SPACE_EC,
						    &acpi_ec_space_handler,
882
						    NULL, ec);
883
	if (ACPI_FAILURE(status)) {
884 885 886 887 888 889 890 891 892 893 894 895 896
		if (status == AE_NOT_FOUND) {
			/*
			 * Maybe OS fails in evaluating the _REG object.
			 * The AE_NOT_FOUND error will be ignored and OS
			 * continue to initialize EC.
			 */
			printk(KERN_ERR "Fail in evaluating the _REG object"
				" of EC device. Broken bios is suspected.\n");
		} else {
			acpi_remove_gpe_handler(NULL, ec->gpe,
				&acpi_ec_gpe_handler);
			return -ENODEV;
		}
897 898
	}

899
	set_bit(EC_FLAGS_HANDLERS_INSTALLED, &ec->flags);
900 901 902
	return 0;
}

L
Len Brown 已提交
903
static int acpi_ec_start(struct acpi_device *device)
L
Linus Torvalds 已提交
904
{
905
	struct acpi_ec *ec;
906
	int ret = 0;
L
Linus Torvalds 已提交
907 908

	if (!device)
909
		return -EINVAL;
L
Linus Torvalds 已提交
910 911 912 913

	ec = acpi_driver_data(device);

	if (!ec)
914
		return -EINVAL;
L
Linus Torvalds 已提交
915

916
	ret = ec_install_handlers(ec);
917 918

	/* EC is fully operational, allow queries */
919
	clear_bit(EC_FLAGS_QUERY_PENDING, &ec->flags);
920
	return ret;
L
Linus Torvalds 已提交
921 922
}

L
Len Brown 已提交
923
static int acpi_ec_stop(struct acpi_device *device, int type)
L
Linus Torvalds 已提交
924
{
925
	struct acpi_ec *ec;
L
Linus Torvalds 已提交
926
	if (!device)
927
		return -EINVAL;
L
Linus Torvalds 已提交
928
	ec = acpi_driver_data(device);
929 930
	if (!ec)
		return -EINVAL;
931
	ec_remove_handlers(ec);
932

933
	return 0;
L
Linus Torvalds 已提交
934 935
}

936 937
int __init acpi_boot_ec_enable(void)
{
938
	if (!boot_ec || test_bit(EC_FLAGS_HANDLERS_INSTALLED, &boot_ec->flags))
939 940 941 942 943 944 945 946
		return 0;
	if (!ec_install_handlers(boot_ec)) {
		first_ec = boot_ec;
		return 0;
	}
	return -EFAULT;
}

947 948 949 950 951
static const struct acpi_device_id ec_device_ids[] = {
	{"PNP0C09", 0},
	{"", 0},
};

952 953 954 955
int __init acpi_ec_ecdt_probe(void)
{
	int ret;
	acpi_status status;
L
Len Brown 已提交
956
	struct acpi_table_ecdt *ecdt_ptr;
L
Luming Yu 已提交
957

958 959
	boot_ec = make_acpi_ec();
	if (!boot_ec)
960 961 962 963
		return -ENOMEM;
	/*
	 * Generate a boot ec context
	 */
964 965
	status = acpi_get_table(ACPI_SIG_ECDT, 1,
				(struct acpi_table_header **)&ecdt_ptr);
966
	if (ACPI_SUCCESS(status)) {
967
		pr_info(PREFIX "EC description table is found, configuring boot EC\n");
968 969
		boot_ec->command_addr = ecdt_ptr->control.address;
		boot_ec->data_addr = ecdt_ptr->data.address;
970 971 972 973 974 975 976 977 978
		if (dmi_check_system(ec_dmi_table)) {
			/*
			 * If the board falls into ec_dmi_table, it means
			 * that ECDT table gives the incorrect command/status
			 * & data I/O address. Just fix it.
			 */
			boot_ec->data_addr = ecdt_ptr->control.address;
			boot_ec->command_addr = ecdt_ptr->data.address;
		}
979
		boot_ec->gpe = ecdt_ptr->gpe;
980
		boot_ec->handle = ACPI_ROOT_OBJECT;
981
		acpi_get_handle(ACPI_ROOT_OBJECT, ecdt_ptr->id, &boot_ec->handle);
982
	} else {
983 984 985
		/* This workaround is needed only on some broken machines,
		 * which require early EC, but fail to provide ECDT */
		acpi_handle x;
986 987 988
		printk(KERN_DEBUG PREFIX "Look up EC in DSDT\n");
		status = acpi_get_devices(ec_device_ids[0].id, ec_parse_device,
						boot_ec, NULL);
989 990
		/* Check that acpi_get_devices actually find something */
		if (ACPI_FAILURE(status) || !boot_ec->handle)
991
			goto error;
992 993
		/* We really need to limit this workaround, the only ASUS,
		 * which needs it, has fake EC._INI method, so use it as flag.
994
		 * Keep boot_ec struct as it will be needed soon.
995 996
		 */
		if (ACPI_FAILURE(acpi_get_handle(boot_ec->handle, "_INI", &x)))
997
			return -ENODEV;
998
	}
L
Linus Torvalds 已提交
999

1000
	ret = ec_install_handlers(boot_ec);
1001 1002
	if (!ret) {
		first_ec = boot_ec;
1003
		return 0;
1004
	}
1005
      error:
1006 1007
	kfree(boot_ec);
	boot_ec = NULL;
L
Linus Torvalds 已提交
1008 1009 1010
	return -ENODEV;
}

1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043
static int acpi_ec_suspend(struct acpi_device *device, pm_message_t state)
{
	struct acpi_ec *ec = acpi_driver_data(device);
	/* Stop using GPE */
	set_bit(EC_FLAGS_NO_GPE, &ec->flags);
	clear_bit(EC_FLAGS_GPE_MODE, &ec->flags);
	acpi_disable_gpe(NULL, ec->gpe, ACPI_NOT_ISR);
	return 0;
}

static int acpi_ec_resume(struct acpi_device *device)
{
	struct acpi_ec *ec = acpi_driver_data(device);
	/* Enable use of GPE back */
	clear_bit(EC_FLAGS_NO_GPE, &ec->flags);
	acpi_enable_gpe(NULL, ec->gpe, ACPI_NOT_ISR);
	return 0;
}

static struct acpi_driver acpi_ec_driver = {
	.name = "ec",
	.class = ACPI_EC_CLASS,
	.ids = ec_device_ids,
	.ops = {
		.add = acpi_ec_add,
		.remove = acpi_ec_remove,
		.start = acpi_ec_start,
		.stop = acpi_ec_stop,
		.suspend = acpi_ec_suspend,
		.resume = acpi_ec_resume,
		},
};

L
Len Brown 已提交
1044
static int __init acpi_ec_init(void)
L
Linus Torvalds 已提交
1045
{
L
Len Brown 已提交
1046
	int result = 0;
L
Linus Torvalds 已提交
1047 1048

	if (acpi_disabled)
1049
		return 0;
L
Linus Torvalds 已提交
1050 1051 1052

	acpi_ec_dir = proc_mkdir(ACPI_EC_CLASS, acpi_root_dir);
	if (!acpi_ec_dir)
1053
		return -ENODEV;
L
Linus Torvalds 已提交
1054 1055 1056 1057 1058

	/* Now register the driver for the EC */
	result = acpi_bus_register_driver(&acpi_ec_driver);
	if (result < 0) {
		remove_proc_entry(ACPI_EC_CLASS, acpi_root_dir);
1059
		return -ENODEV;
L
Linus Torvalds 已提交
1060 1061
	}

1062
	return result;
L
Linus Torvalds 已提交
1063 1064 1065 1066 1067 1068
}

subsys_initcall(acpi_ec_init);

/* EC driver currently not unloadable */
#if 0
L
Len Brown 已提交
1069
static void __exit acpi_ec_exit(void)
L
Linus Torvalds 已提交
1070 1071 1072 1073 1074 1075
{

	acpi_bus_unregister_driver(&acpi_ec_driver);

	remove_proc_entry(ACPI_EC_CLASS, acpi_root_dir);

1076
	return;
L
Linus Torvalds 已提交
1077
}
1078
#endif	/* 0 */