i2c-i801.c 37.4 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4
/*
    Copyright (c) 1998 - 2002  Frodo Looijaard <frodol@dds.nl>,
    Philip Edelbrock <phil@netroedge.com>, and Mark D. Studebaker
    <mdsxyz123@yahoo.com>
5
    Copyright (C) 2007 - 2012  Jean Delvare <khali@linux-fr.org>
6 7
    Copyright (C) 2010         Intel Corporation,
                               David Woodhouse <dwmw2@infradead.org>
L
Linus Torvalds 已提交
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

    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., 675 Mass Ave, Cambridge, MA 02139, USA.
*/

/*
25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
  Supports the following Intel I/O Controller Hubs (ICH):

                                  I/O                     Block   I2C
                                  region  SMBus   Block   proc.   block
  Chip name             PCI ID    size    PEC     buffer  call    read
  ----------------------------------------------------------------------
  82801AA  (ICH)        0x2413     16      no      no      no      no
  82801AB  (ICH0)       0x2423     16      no      no      no      no
  82801BA  (ICH2)       0x2443     16      no      no      no      no
  82801CA  (ICH3)       0x2483     32     soft     no      no      no
  82801DB  (ICH4)       0x24c3     32     hard     yes     no      no
  82801E   (ICH5)       0x24d3     32     hard     yes     yes     yes
  6300ESB               0x25a4     32     hard     yes     yes     yes
  82801F   (ICH6)       0x266a     32     hard     yes     yes     yes
  6310ESB/6320ESB       0x269b     32     hard     yes     yes     yes
  82801G   (ICH7)       0x27da     32     hard     yes     yes     yes
  82801H   (ICH8)       0x283e     32     hard     yes     yes     yes
  82801I   (ICH9)       0x2930     32     hard     yes     yes     yes
43
  EP80579 (Tolapai)     0x5032     32     hard     yes     yes     yes
44 45
  ICH10                 0x3a30     32     hard     yes     yes     yes
  ICH10                 0x3a60     32     hard     yes     yes     yes
46
  5/3400 Series (PCH)   0x3b30     32     hard     yes     yes     yes
47
  6 Series (PCH)        0x1c22     32     hard     yes     yes     yes
48
  Patsburg (PCH)        0x1d22     32     hard     yes     yes     yes
49 50 51
  Patsburg (PCH) IDF    0x1d70     32     hard     yes     yes     yes
  Patsburg (PCH) IDF    0x1d71     32     hard     yes     yes     yes
  Patsburg (PCH) IDF    0x1d72     32     hard     yes     yes     yes
52
  DH89xxCC (PCH)        0x2330     32     hard     yes     yes     yes
53
  Panther Point (PCH)   0x1e22     32     hard     yes     yes     yes
54
  Lynx Point (PCH)      0x8c22     32     hard     yes     yes     yes
55
  Lynx Point-LP (PCH)   0x9c22     32     hard     yes     yes     yes
56 57 58 59 60 61

  Features supported by this driver:
  Software PEC                     no
  Hardware PEC                     yes
  Block buffer                     yes
  Block process call transaction   no
62
  I2C block read transaction       yes  (doesn't use the block buffer)
63
  Slave mode                       no
64
  Interrupt processing             yes
65 66

  See the file Documentation/i2c/busses/i2c-i801 for details.
L
Linus Torvalds 已提交
67 68
*/

69
#include <linux/interrupt.h>
L
Linus Torvalds 已提交
70 71 72 73 74 75 76 77
#include <linux/module.h>
#include <linux/pci.h>
#include <linux/kernel.h>
#include <linux/stddef.h>
#include <linux/delay.h>
#include <linux/ioport.h>
#include <linux/init.h>
#include <linux/i2c.h>
78
#include <linux/acpi.h>
79
#include <linux/io.h>
80
#include <linux/dmi.h>
B
Ben Hutchings 已提交
81
#include <linux/slab.h>
82
#include <linux/wait.h>
83 84
#include <linux/err.h>

85 86
#if (defined CONFIG_I2C_MUX_GPIO || defined CONFIG_I2C_MUX_GPIO_MODULE) && \
		defined CONFIG_DMI
87 88 89 90
#include <linux/gpio.h>
#include <linux/i2c-mux-gpio.h>
#include <linux/platform_device.h>
#endif
L
Linus Torvalds 已提交
91 92

/* I801 SMBus address offsets */
93 94 95 96 97 98 99 100 101 102
#define SMBHSTSTS(p)	(0 + (p)->smba)
#define SMBHSTCNT(p)	(2 + (p)->smba)
#define SMBHSTCMD(p)	(3 + (p)->smba)
#define SMBHSTADD(p)	(4 + (p)->smba)
#define SMBHSTDAT0(p)	(5 + (p)->smba)
#define SMBHSTDAT1(p)	(6 + (p)->smba)
#define SMBBLKDAT(p)	(7 + (p)->smba)
#define SMBPEC(p)	(8 + (p)->smba)		/* ICH3 and later */
#define SMBAUXSTS(p)	(12 + (p)->smba)	/* ICH4 and later */
#define SMBAUXCTL(p)	(13 + (p)->smba)	/* ICH4 and later */
L
Linus Torvalds 已提交
103 104

/* PCI Address Constants */
105
#define SMBBAR		4
106
#define SMBPCISTS	0x006
L
Linus Torvalds 已提交
107 108
#define SMBHSTCFG	0x040

109 110 111
/* Host status bits for SMBPCISTS */
#define SMBPCISTS_INTS		0x08

L
Linus Torvalds 已提交
112 113 114 115 116
/* Host configuration bits for SMBHSTCFG */
#define SMBHSTCFG_HST_EN	1
#define SMBHSTCFG_SMB_SMI_EN	2
#define SMBHSTCFG_I2C_EN	4

L
Lucas De Marchi 已提交
117
/* Auxiliary control register bits, ICH4+ only */
O
Oleg Ryjkov 已提交
118 119 120
#define SMBAUXCTL_CRC		1
#define SMBAUXCTL_E32B		2

L
Linus Torvalds 已提交
121
/* Other settings */
122
#define MAX_RETRIES		400
L
Linus Torvalds 已提交
123 124 125 126 127 128

/* I801 command constants */
#define I801_QUICK		0x00
#define I801_BYTE		0x04
#define I801_BYTE_DATA		0x08
#define I801_WORD_DATA		0x0C
129
#define I801_PROC_CALL		0x10	/* unimplemented */
L
Linus Torvalds 已提交
130
#define I801_BLOCK_DATA		0x14
131
#define I801_I2C_BLOCK_DATA	0x18	/* ICH5 and later */
132 133 134 135 136 137 138

/* I801 Host Control register bits */
#define SMBHSTCNT_INTREN	0x01
#define SMBHSTCNT_KILL		0x02
#define SMBHSTCNT_LAST_BYTE	0x20
#define SMBHSTCNT_START		0x40
#define SMBHSTCNT_PEC_EN	0x80	/* ICH3 and later */
L
Linus Torvalds 已提交
139

O
Oleg Ryjkov 已提交
140 141 142 143 144 145 146 147 148
/* I801 Hosts Status register bits */
#define SMBHSTSTS_BYTE_DONE	0x80
#define SMBHSTSTS_INUSE_STS	0x40
#define SMBHSTSTS_SMBALERT_STS	0x20
#define SMBHSTSTS_FAILED	0x10
#define SMBHSTSTS_BUS_ERR	0x08
#define SMBHSTSTS_DEV_ERR	0x04
#define SMBHSTSTS_INTR		0x02
#define SMBHSTSTS_HOST_BUSY	0x01
L
Linus Torvalds 已提交
149

150 151 152 153 154
#define STATUS_ERROR_FLAGS	(SMBHSTSTS_FAILED | SMBHSTSTS_BUS_ERR | \
				 SMBHSTSTS_DEV_ERR)

#define STATUS_FLAGS		(SMBHSTSTS_BYTE_DONE | SMBHSTSTS_INTR | \
				 STATUS_ERROR_FLAGS)
155

156 157 158
/* Older devices have their ID defined in <linux/pci_ids.h> */
#define PCI_DEVICE_ID_INTEL_COUGARPOINT_SMBUS	0x1c22
#define PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS	0x1d22
159 160 161 162
/* Patsburg also has three 'Integrated Device Function' SMBus controllers */
#define PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF0	0x1d70
#define PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF1	0x1d71
#define PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF2	0x1d72
163
#define PCI_DEVICE_ID_INTEL_PANTHERPOINT_SMBUS	0x1e22
164 165
#define PCI_DEVICE_ID_INTEL_DH89XXCC_SMBUS	0x2330
#define PCI_DEVICE_ID_INTEL_5_3400_SERIES_SMBUS	0x3b30
166
#define PCI_DEVICE_ID_INTEL_LYNXPOINT_SMBUS	0x8c22
167
#define PCI_DEVICE_ID_INTEL_LYNXPOINT_LP_SMBUS	0x9c22
168

169 170 171 172 173 174 175 176 177
struct i801_mux_config {
	char *gpio_chip;
	unsigned values[3];
	int n_values;
	unsigned classes[3];
	unsigned gpios[2];		/* Relative to gpio_chip->base */
	int n_gpios;
};

178 179 180 181 182 183
struct i801_priv {
	struct i2c_adapter adapter;
	unsigned long smba;
	unsigned char original_hstcfg;
	struct pci_dev *pci_dev;
	unsigned int features;
184 185 186 187

	/* isr processing */
	wait_queue_head_t waitq;
	u8 status;
188 189 190 191 192 193 194

	/* Command state used by isr for byte-by-byte block transactions */
	u8 cmd;
	bool is_read;
	int count;
	int len;
	u8 *data;
195

196 197
#if (defined CONFIG_I2C_MUX_GPIO || defined CONFIG_I2C_MUX_GPIO_MODULE) && \
		defined CONFIG_DMI
198 199 200
	const struct i801_mux_config *mux_drvdata;
	struct platform_device *mux_pdev;
#endif
201 202
};

203
static struct pci_driver i801_driver;
204 205 206 207 208

#define FEATURE_SMBUS_PEC	(1 << 0)
#define FEATURE_BLOCK_BUFFER	(1 << 1)
#define FEATURE_BLOCK_PROC	(1 << 2)
#define FEATURE_I2C_BLOCK_READ	(1 << 3)
209
#define FEATURE_IRQ		(1 << 4)
210 211
/* Not really a feature, but it's convenient to handle it as such */
#define FEATURE_IDF		(1 << 15)
L
Linus Torvalds 已提交
212

213 214 215 216 217
static const char *i801_feature_names[] = {
	"SMBus PEC",
	"Block buffer",
	"Block process call",
	"I2C block read",
218
	"Interrupt",
219 220 221 222 223 224
};

static unsigned int disable_features;
module_param(disable_features, uint, S_IRUGO | S_IWUSR);
MODULE_PARM_DESC(disable_features, "Disable selected driver features");

225 226
/* Make sure the SMBus host is ready to start transmitting.
   Return 0 if it is, -EBUSY if it is not. */
227
static int i801_check_pre(struct i801_priv *priv)
L
Linus Torvalds 已提交
228
{
229
	int status;
L
Linus Torvalds 已提交
230

231
	status = inb_p(SMBHSTSTS(priv));
232
	if (status & SMBHSTSTS_HOST_BUSY) {
233
		dev_err(&priv->pci_dev->dev, "SMBus is busy, can't use it!\n");
234 235 236 237 238
		return -EBUSY;
	}

	status &= STATUS_FLAGS;
	if (status) {
239
		dev_dbg(&priv->pci_dev->dev, "Clearing status flags (%02x)\n",
240
			status);
241 242
		outb_p(status, SMBHSTSTS(priv));
		status = inb_p(SMBHSTSTS(priv)) & STATUS_FLAGS;
243
		if (status) {
244
			dev_err(&priv->pci_dev->dev,
245 246
				"Failed clearing status flags (%02x)\n",
				status);
247
			return -EBUSY;
L
Linus Torvalds 已提交
248 249 250
		}
	}

251 252
	return 0;
}
L
Linus Torvalds 已提交
253

J
Jean Delvare 已提交
254 255 256 257 258 259
/*
 * Convert the status register to an error code, and clear it.
 * Note that status only contains the bits we want to clear, not the
 * actual register value.
 */
static int i801_check_post(struct i801_priv *priv, int status)
260 261
{
	int result = 0;
L
Linus Torvalds 已提交
262

263 264 265 266 267 268
	/*
	 * If the SMBus is still busy, we give up
	 * Note: This timeout condition only happens when using polling
	 * transactions.  For interrupt operation, NAK/timeout is indicated by
	 * DEV_ERR.
	 */
J
Jean Delvare 已提交
269
	if (unlikely(status < 0)) {
270
		dev_err(&priv->pci_dev->dev, "Transaction timeout\n");
O
Oleg Ryjkov 已提交
271
		/* try to stop the current command */
272 273 274
		dev_dbg(&priv->pci_dev->dev, "Terminating the current operation\n");
		outb_p(inb_p(SMBHSTCNT(priv)) | SMBHSTCNT_KILL,
		       SMBHSTCNT(priv));
275
		usleep_range(1000, 2000);
276 277
		outb_p(inb_p(SMBHSTCNT(priv)) & (~SMBHSTCNT_KILL),
		       SMBHSTCNT(priv));
278 279

		/* Check if it worked */
280
		status = inb_p(SMBHSTSTS(priv));
281 282
		if ((status & SMBHSTSTS_HOST_BUSY) ||
		    !(status & SMBHSTSTS_FAILED))
283
			dev_err(&priv->pci_dev->dev,
284
				"Failed terminating the transaction\n");
285
		outb_p(STATUS_FLAGS, SMBHSTSTS(priv));
286
		return -ETIMEDOUT;
L
Linus Torvalds 已提交
287 288
	}

289
	if (status & SMBHSTSTS_FAILED) {
290
		result = -EIO;
291
		dev_err(&priv->pci_dev->dev, "Transaction failed\n");
292 293 294
	}
	if (status & SMBHSTSTS_DEV_ERR) {
		result = -ENXIO;
295
		dev_dbg(&priv->pci_dev->dev, "No response\n");
L
Linus Torvalds 已提交
296
	}
297
	if (status & SMBHSTSTS_BUS_ERR) {
298
		result = -EAGAIN;
299
		dev_dbg(&priv->pci_dev->dev, "Lost arbitration\n");
L
Linus Torvalds 已提交
300 301
	}

J
Jean Delvare 已提交
302 303
	/* Clear status flags except BYTE_DONE, to be cleared by caller */
	outb_p(status, SMBHSTSTS(priv));
L
Linus Torvalds 已提交
304 305 306 307

	return result;
}

J
Jean Delvare 已提交
308 309
/* Wait for BUSY being cleared and either INTR or an error flag being set */
static int i801_wait_intr(struct i801_priv *priv)
310 311
{
	int timeout = 0;
J
Jean Delvare 已提交
312
	int status;
313 314 315

	/* We will always wait for a fraction of a second! */
	do {
316
		usleep_range(250, 500);
317
		status = inb_p(SMBHSTSTS(priv));
J
Jean Delvare 已提交
318 319 320
	} while (((status & SMBHSTSTS_HOST_BUSY) ||
		  !(status & (STATUS_ERROR_FLAGS | SMBHSTSTS_INTR))) &&
		 (timeout++ < MAX_RETRIES));
321

J
Jean Delvare 已提交
322 323 324 325 326
	if (timeout > MAX_RETRIES) {
		dev_dbg(&priv->pci_dev->dev, "INTR Timeout!\n");
		return -ETIMEDOUT;
	}
	return status & (STATUS_ERROR_FLAGS | SMBHSTSTS_INTR);
327 328
}

J
Jean Delvare 已提交
329 330
/* Wait for either BYTE_DONE or an error flag being set */
static int i801_wait_byte_done(struct i801_priv *priv)
O
Oleg Ryjkov 已提交
331 332
{
	int timeout = 0;
333
	int status;
O
Oleg Ryjkov 已提交
334

J
Jean Delvare 已提交
335
	/* We will always wait for a fraction of a second! */
O
Oleg Ryjkov 已提交
336
	do {
337
		usleep_range(250, 500);
338
		status = inb_p(SMBHSTSTS(priv));
J
Jean Delvare 已提交
339 340 341 342 343 344 345 346 347 348 349 350 351 352
	} while (!(status & (STATUS_ERROR_FLAGS | SMBHSTSTS_BYTE_DONE)) &&
		 (timeout++ < MAX_RETRIES));

	if (timeout > MAX_RETRIES) {
		dev_dbg(&priv->pci_dev->dev, "BYTE_DONE Timeout!\n");
		return -ETIMEDOUT;
	}
	return status & STATUS_ERROR_FLAGS;
}

static int i801_transaction(struct i801_priv *priv, int xact)
{
	int status;
	int result;
O
Oleg Ryjkov 已提交
353

J
Jean Delvare 已提交
354 355 356
	result = i801_check_pre(priv);
	if (result < 0)
		return result;
R
Roel Kluin 已提交
357

358 359 360 361 362 363 364 365
	if (priv->features & FEATURE_IRQ) {
		outb_p(xact | SMBHSTCNT_INTREN | SMBHSTCNT_START,
		       SMBHSTCNT(priv));
		wait_event(priv->waitq, (status = priv->status));
		priv->status = 0;
		return i801_check_post(priv, status);
	}

J
Jean Delvare 已提交
366 367 368 369 370 371
	/* the current contents of SMBHSTCNT can be overwritten, since PEC,
	 * SMBSCMD are passed in xact */
	outb_p(xact | SMBHSTCNT_START, SMBHSTCNT(priv));

	status = i801_wait_intr(priv);
	return i801_check_post(priv, status);
O
Oleg Ryjkov 已提交
372 373
}

374 375
static int i801_block_transaction_by_block(struct i801_priv *priv,
					   union i2c_smbus_data *data,
376 377 378
					   char read_write, int hwpec)
{
	int i, len;
379
	int status;
380

381
	inb_p(SMBHSTCNT(priv)); /* reset the data buffer index */
382 383 384 385

	/* Use 32-byte buffer to process this transaction */
	if (read_write == I2C_SMBUS_WRITE) {
		len = data->block[0];
386
		outb_p(len, SMBHSTDAT0(priv));
387
		for (i = 0; i < len; i++)
388
			outb_p(data->block[i+1], SMBBLKDAT(priv));
389 390
	}

D
Daniel Kurtz 已提交
391
	status = i801_transaction(priv, I801_BLOCK_DATA |
392
				  (hwpec ? SMBHSTCNT_PEC_EN : 0));
393 394
	if (status)
		return status;
395 396

	if (read_write == I2C_SMBUS_READ) {
397
		len = inb_p(SMBHSTDAT0(priv));
398
		if (len < 1 || len > I2C_SMBUS_BLOCK_MAX)
399
			return -EPROTO;
400 401 402

		data->block[0] = len;
		for (i = 0; i < len; i++)
403
			data->block[i + 1] = inb_p(SMBBLKDAT(priv));
404 405 406 407
	}
	return 0;
}

408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448
static void i801_isr_byte_done(struct i801_priv *priv)
{
	if (priv->is_read) {
		/* For SMBus block reads, length is received with first byte */
		if (((priv->cmd & 0x1c) == I801_BLOCK_DATA) &&
		    (priv->count == 0)) {
			priv->len = inb_p(SMBHSTDAT0(priv));
			if (priv->len < 1 || priv->len > I2C_SMBUS_BLOCK_MAX) {
				dev_err(&priv->pci_dev->dev,
					"Illegal SMBus block read size %d\n",
					priv->len);
				/* FIXME: Recover */
				priv->len = I2C_SMBUS_BLOCK_MAX;
			} else {
				dev_dbg(&priv->pci_dev->dev,
					"SMBus block read size is %d\n",
					priv->len);
			}
			priv->data[-1] = priv->len;
		}

		/* Read next byte */
		if (priv->count < priv->len)
			priv->data[priv->count++] = inb(SMBBLKDAT(priv));
		else
			dev_dbg(&priv->pci_dev->dev,
				"Discarding extra byte on block read\n");

		/* Set LAST_BYTE for last byte of read transaction */
		if (priv->count == priv->len - 1)
			outb_p(priv->cmd | SMBHSTCNT_LAST_BYTE,
			       SMBHSTCNT(priv));
	} else if (priv->count < priv->len - 1) {
		/* Write next byte, except for IRQ after last byte */
		outb_p(priv->data[++priv->count], SMBBLKDAT(priv));
	}

	/* Clear BYTE_DONE to continue with next byte */
	outb_p(SMBHSTSTS_BYTE_DONE, SMBHSTSTS(priv));
}

449
/*
450 451 452 453 454 455 456 457 458 459 460 461
 * There are two kinds of interrupts:
 *
 * 1) i801 signals transaction completion with one of these interrupts:
 *      INTR - Success
 *      DEV_ERR - Invalid command, NAK or communication timeout
 *      BUS_ERR - SMI# transaction collision
 *      FAILED - transaction was canceled due to a KILL request
 *    When any of these occur, update ->status and wake up the waitq.
 *    ->status must be cleared before kicking off the next transaction.
 *
 * 2) For byte-by-byte (I2C read/write) transactions, one BYTE_DONE interrupt
 *    occurs for each byte of a byte-by-byte to prepare the next byte.
462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477
 */
static irqreturn_t i801_isr(int irq, void *dev_id)
{
	struct i801_priv *priv = dev_id;
	u16 pcists;
	u8 status;

	/* Confirm this is our interrupt */
	pci_read_config_word(priv->pci_dev, SMBPCISTS, &pcists);
	if (!(pcists & SMBPCISTS_INTS))
		return IRQ_NONE;

	status = inb_p(SMBHSTSTS(priv));
	if (status != 0x42)
		dev_dbg(&priv->pci_dev->dev, "irq: status = %02x\n", status);

478 479 480
	if (status & SMBHSTSTS_BYTE_DONE)
		i801_isr_byte_done(priv);

481 482 483 484 485 486 487 488 489 490 491 492 493 494
	/*
	 * Clear irq sources and report transaction result.
	 * ->status must be cleared before the next transaction is started.
	 */
	status &= SMBHSTSTS_INTR | STATUS_ERROR_FLAGS;
	if (status) {
		outb_p(status, SMBHSTSTS(priv));
		priv->status |= status;
		wake_up(&priv->waitq);
	}

	return IRQ_HANDLED;
}

495 496 497 498 499
/*
 * For "byte-by-byte" block transactions:
 *   I2C write uses cmd=I801_BLOCK_DATA, I2C_EN=1
 *   I2C read uses cmd=I801_I2C_BLOCK_DATA
 */
500 501
static int i801_block_transaction_byte_by_byte(struct i801_priv *priv,
					       union i2c_smbus_data *data,
502 503
					       char read_write, int command,
					       int hwpec)
L
Linus Torvalds 已提交
504 505 506
{
	int i, len;
	int smbcmd;
507
	int status;
508 509
	int result;

510
	result = i801_check_pre(priv);
511 512
	if (result < 0)
		return result;
L
Linus Torvalds 已提交
513

514
	len = data->block[0];
L
Linus Torvalds 已提交
515 516

	if (read_write == I2C_SMBUS_WRITE) {
517 518
		outb_p(len, SMBHSTDAT0(priv));
		outb_p(data->block[1], SMBBLKDAT(priv));
L
Linus Torvalds 已提交
519 520
	}

521 522 523 524 525 526
	if (command == I2C_SMBUS_I2C_BLOCK_DATA &&
	    read_write == I2C_SMBUS_READ)
		smbcmd = I801_I2C_BLOCK_DATA;
	else
		smbcmd = I801_BLOCK_DATA;

527 528 529 530 531 532 533 534 535 536 537 538 539 540 541
	if (priv->features & FEATURE_IRQ) {
		priv->is_read = (read_write == I2C_SMBUS_READ);
		if (len == 1 && priv->is_read)
			smbcmd |= SMBHSTCNT_LAST_BYTE;
		priv->cmd = smbcmd | SMBHSTCNT_INTREN;
		priv->len = len;
		priv->count = 0;
		priv->data = &data->block[1];

		outb_p(priv->cmd | SMBHSTCNT_START, SMBHSTCNT(priv));
		wait_event(priv->waitq, (status = priv->status));
		priv->status = 0;
		return i801_check_post(priv, status);
	}

L
Linus Torvalds 已提交
542
	for (i = 1; i <= len; i++) {
543
		if (i == len && read_write == I2C_SMBUS_READ)
544
			smbcmd |= SMBHSTCNT_LAST_BYTE;
D
Daniel Kurtz 已提交
545
		outb_p(smbcmd, SMBHSTCNT(priv));
L
Linus Torvalds 已提交
546 547

		if (i == 1)
548
			outb_p(inb(SMBHSTCNT(priv)) | SMBHSTCNT_START,
549
			       SMBHSTCNT(priv));
L
Linus Torvalds 已提交
550

J
Jean Delvare 已提交
551 552 553
		status = i801_wait_byte_done(priv);
		if (status)
			goto exit;
L
Linus Torvalds 已提交
554

555 556
		if (i == 1 && read_write == I2C_SMBUS_READ
		 && command != I2C_SMBUS_I2C_BLOCK_DATA) {
557
			len = inb_p(SMBHSTDAT0(priv));
558
			if (len < 1 || len > I2C_SMBUS_BLOCK_MAX) {
559
				dev_err(&priv->pci_dev->dev,
560 561 562
					"Illegal SMBus block read size %d\n",
					len);
				/* Recover */
563 564 565 566 567
				while (inb_p(SMBHSTSTS(priv)) &
				       SMBHSTSTS_HOST_BUSY)
					outb_p(SMBHSTSTS_BYTE_DONE,
					       SMBHSTSTS(priv));
				outb_p(SMBHSTSTS_INTR, SMBHSTSTS(priv));
568
				return -EPROTO;
569
			}
L
Linus Torvalds 已提交
570 571 572 573 574
			data->block[0] = len;
		}

		/* Retrieve/store value in SMBBLKDAT */
		if (read_write == I2C_SMBUS_READ)
575
			data->block[i] = inb_p(SMBBLKDAT(priv));
L
Linus Torvalds 已提交
576
		if (read_write == I2C_SMBUS_WRITE && i+1 <= len)
577
			outb_p(data->block[i+1], SMBBLKDAT(priv));
L
Linus Torvalds 已提交
578

579
		/* signals SMBBLKDAT ready */
J
Jean Delvare 已提交
580
		outb_p(SMBHSTSTS_BYTE_DONE, SMBHSTSTS(priv));
L
Linus Torvalds 已提交
581
	}
582

J
Jean Delvare 已提交
583 584 585
	status = i801_wait_intr(priv);
exit:
	return i801_check_post(priv, status);
586
}
L
Linus Torvalds 已提交
587

588
static int i801_set_block_buffer_mode(struct i801_priv *priv)
589
{
590 591
	outb_p(inb_p(SMBAUXCTL(priv)) | SMBAUXCTL_E32B, SMBAUXCTL(priv));
	if ((inb_p(SMBAUXCTL(priv)) & SMBAUXCTL_E32B) == 0)
592
		return -EIO;
593 594 595 596
	return 0;
}

/* Block transaction function */
597 598
static int i801_block_transaction(struct i801_priv *priv,
				  union i2c_smbus_data *data, char read_write,
599 600 601 602 603 604 605 606
				  int command, int hwpec)
{
	int result = 0;
	unsigned char hostc;

	if (command == I2C_SMBUS_I2C_BLOCK_DATA) {
		if (read_write == I2C_SMBUS_WRITE) {
			/* set I2C_EN bit in configuration register */
607 608
			pci_read_config_byte(priv->pci_dev, SMBHSTCFG, &hostc);
			pci_write_config_byte(priv->pci_dev, SMBHSTCFG,
609
					      hostc | SMBHSTCFG_I2C_EN);
610 611
		} else if (!(priv->features & FEATURE_I2C_BLOCK_READ)) {
			dev_err(&priv->pci_dev->dev,
612
				"I2C block read is unsupported!\n");
613
			return -EOPNOTSUPP;
614 615 616
		}
	}

617 618
	if (read_write == I2C_SMBUS_WRITE
	 || command == I2C_SMBUS_I2C_BLOCK_DATA) {
619 620 621 622 623
		if (data->block[0] < 1)
			data->block[0] = 1;
		if (data->block[0] > I2C_SMBUS_BLOCK_MAX)
			data->block[0] = I2C_SMBUS_BLOCK_MAX;
	} else {
624
		data->block[0] = 32;	/* max for SMBus block reads */
625 626
	}

627 628 629
	/* Experience has shown that the block buffer can only be used for
	   SMBus (not I2C) block transactions, even though the datasheet
	   doesn't mention this limitation. */
630
	if ((priv->features & FEATURE_BLOCK_BUFFER)
631
	 && command != I2C_SMBUS_I2C_BLOCK_DATA
632 633 634
	 && i801_set_block_buffer_mode(priv) == 0)
		result = i801_block_transaction_by_block(priv, data,
							 read_write, hwpec);
635
	else
636 637
		result = i801_block_transaction_byte_by_byte(priv, data,
							     read_write,
638
							     command, hwpec);
639

640 641
	if (command == I2C_SMBUS_I2C_BLOCK_DATA
	 && read_write == I2C_SMBUS_WRITE) {
L
Linus Torvalds 已提交
642
		/* restore saved configuration register value */
643
		pci_write_config_byte(priv->pci_dev, SMBHSTCFG, hostc);
L
Linus Torvalds 已提交
644 645 646 647
	}
	return result;
}

648
/* Return negative errno on error. */
649
static s32 i801_access(struct i2c_adapter *adap, u16 addr,
L
Linus Torvalds 已提交
650
		       unsigned short flags, char read_write, u8 command,
651
		       int size, union i2c_smbus_data *data)
L
Linus Torvalds 已提交
652
{
653
	int hwpec;
L
Linus Torvalds 已提交
654 655
	int block = 0;
	int ret, xact = 0;
656
	struct i801_priv *priv = i2c_get_adapdata(adap);
L
Linus Torvalds 已提交
657

658
	hwpec = (priv->features & FEATURE_SMBUS_PEC) && (flags & I2C_CLIENT_PEC)
659 660
		&& size != I2C_SMBUS_QUICK
		&& size != I2C_SMBUS_I2C_BLOCK_DATA;
L
Linus Torvalds 已提交
661 662 663 664

	switch (size) {
	case I2C_SMBUS_QUICK:
		outb_p(((addr & 0x7f) << 1) | (read_write & 0x01),
665
		       SMBHSTADD(priv));
L
Linus Torvalds 已提交
666 667 668 669
		xact = I801_QUICK;
		break;
	case I2C_SMBUS_BYTE:
		outb_p(((addr & 0x7f) << 1) | (read_write & 0x01),
670
		       SMBHSTADD(priv));
L
Linus Torvalds 已提交
671
		if (read_write == I2C_SMBUS_WRITE)
672
			outb_p(command, SMBHSTCMD(priv));
L
Linus Torvalds 已提交
673 674 675 676
		xact = I801_BYTE;
		break;
	case I2C_SMBUS_BYTE_DATA:
		outb_p(((addr & 0x7f) << 1) | (read_write & 0x01),
677 678
		       SMBHSTADD(priv));
		outb_p(command, SMBHSTCMD(priv));
L
Linus Torvalds 已提交
679
		if (read_write == I2C_SMBUS_WRITE)
680
			outb_p(data->byte, SMBHSTDAT0(priv));
L
Linus Torvalds 已提交
681 682 683 684
		xact = I801_BYTE_DATA;
		break;
	case I2C_SMBUS_WORD_DATA:
		outb_p(((addr & 0x7f) << 1) | (read_write & 0x01),
685 686
		       SMBHSTADD(priv));
		outb_p(command, SMBHSTCMD(priv));
L
Linus Torvalds 已提交
687
		if (read_write == I2C_SMBUS_WRITE) {
688 689
			outb_p(data->word & 0xff, SMBHSTDAT0(priv));
			outb_p((data->word & 0xff00) >> 8, SMBHSTDAT1(priv));
L
Linus Torvalds 已提交
690 691 692 693 694
		}
		xact = I801_WORD_DATA;
		break;
	case I2C_SMBUS_BLOCK_DATA:
		outb_p(((addr & 0x7f) << 1) | (read_write & 0x01),
695 696
		       SMBHSTADD(priv));
		outb_p(command, SMBHSTCMD(priv));
L
Linus Torvalds 已提交
697 698
		block = 1;
		break;
699 700 701
	case I2C_SMBUS_I2C_BLOCK_DATA:
		/* NB: page 240 of ICH5 datasheet shows that the R/#W
		 * bit should be cleared here, even when reading */
702
		outb_p((addr & 0x7f) << 1, SMBHSTADD(priv));
703 704 705
		if (read_write == I2C_SMBUS_READ) {
			/* NB: page 240 of ICH5 datasheet also shows
			 * that DATA1 is the cmd field when reading */
706
			outb_p(command, SMBHSTDAT1(priv));
707
		} else
708
			outb_p(command, SMBHSTCMD(priv));
709 710
		block = 1;
		break;
L
Linus Torvalds 已提交
711
	default:
712 713
		dev_err(&priv->pci_dev->dev, "Unsupported transaction %d\n",
			size);
714
		return -EOPNOTSUPP;
L
Linus Torvalds 已提交
715 716
	}

O
Oleg Ryjkov 已提交
717
	if (hwpec)	/* enable/disable hardware PEC */
718
		outb_p(inb_p(SMBAUXCTL(priv)) | SMBAUXCTL_CRC, SMBAUXCTL(priv));
O
Oleg Ryjkov 已提交
719
	else
720 721
		outb_p(inb_p(SMBAUXCTL(priv)) & (~SMBAUXCTL_CRC),
		       SMBAUXCTL(priv));
722

723
	if (block)
724 725
		ret = i801_block_transaction(priv, data, read_write, size,
					     hwpec);
726
	else
D
Daniel Kurtz 已提交
727
		ret = i801_transaction(priv, xact);
L
Linus Torvalds 已提交
728

729
	/* Some BIOSes don't like it when PEC is enabled at reboot or resume
730 731
	   time, so we forcibly disable it after every transaction. Turn off
	   E32B for the same reason. */
732
	if (hwpec || block)
733 734
		outb_p(inb_p(SMBAUXCTL(priv)) &
		       ~(SMBAUXCTL_CRC | SMBAUXCTL_E32B), SMBAUXCTL(priv));
735

736
	if (block)
L
Linus Torvalds 已提交
737
		return ret;
738
	if (ret)
739
		return ret;
L
Linus Torvalds 已提交
740 741 742 743 744 745
	if ((read_write == I2C_SMBUS_WRITE) || (xact == I801_QUICK))
		return 0;

	switch (xact & 0x7f) {
	case I801_BYTE:	/* Result put in SMBHSTDAT0 */
	case I801_BYTE_DATA:
746
		data->byte = inb_p(SMBHSTDAT0(priv));
L
Linus Torvalds 已提交
747 748
		break;
	case I801_WORD_DATA:
749 750
		data->word = inb_p(SMBHSTDAT0(priv)) +
			     (inb_p(SMBHSTDAT1(priv)) << 8);
L
Linus Torvalds 已提交
751 752 753 754 755 756 757 758
		break;
	}
	return 0;
}


static u32 i801_func(struct i2c_adapter *adapter)
{
759 760
	struct i801_priv *priv = i2c_get_adapdata(adapter);

L
Linus Torvalds 已提交
761
	return I2C_FUNC_SMBUS_QUICK | I2C_FUNC_SMBUS_BYTE |
762 763
	       I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA |
	       I2C_FUNC_SMBUS_BLOCK_DATA | I2C_FUNC_SMBUS_WRITE_I2C_BLOCK |
764 765
	       ((priv->features & FEATURE_SMBUS_PEC) ? I2C_FUNC_SMBUS_PEC : 0) |
	       ((priv->features & FEATURE_I2C_BLOCK_READ) ?
766
		I2C_FUNC_SMBUS_READ_I2C_BLOCK : 0);
L
Linus Torvalds 已提交
767 768
}

769
static const struct i2c_algorithm smbus_algorithm = {
L
Linus Torvalds 已提交
770 771 772 773
	.smbus_xfer	= i801_access,
	.functionality	= i801_func,
};

774
static DEFINE_PCI_DEVICE_TABLE(i801_ids) = {
L
Linus Torvalds 已提交
775 776 777 778 779 780 781 782 783
	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AA_3) },
	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AB_3) },
	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801BA_2) },
	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_3) },
	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_3) },
	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801EB_3) },
	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ESB_4) },
	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH6_16) },
	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH7_17) },
784
	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ESB2_17) },
785
	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH8_5) },
786
	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH9_6) },
787
	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_EP80579_1) },
788 789
	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH10_4) },
	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH10_5) },
790 791
	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_5_3400_SERIES_SMBUS) },
	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_COUGARPOINT_SMBUS) },
792
	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS) },
793 794 795
	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF0) },
	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF1) },
	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF2) },
796
	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_DH89XXCC_SMBUS) },
797
	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PANTHERPOINT_SMBUS) },
798
	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_LYNXPOINT_SMBUS) },
799
	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_LYNXPOINT_LP_SMBUS) },
L
Linus Torvalds 已提交
800 801 802
	{ 0, }
};

803
MODULE_DEVICE_TABLE(pci, i801_ids);
L
Linus Torvalds 已提交
804

805
#if defined CONFIG_X86 && defined CONFIG_DMI
806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835
static unsigned char apanel_addr;

/* Scan the system ROM for the signature "FJKEYINF" */
static __init const void __iomem *bios_signature(const void __iomem *bios)
{
	ssize_t offset;
	const unsigned char signature[] = "FJKEYINF";

	for (offset = 0; offset < 0x10000; offset += 0x10) {
		if (check_signature(bios + offset, signature,
				    sizeof(signature)-1))
			return bios + offset;
	}
	return NULL;
}

static void __init input_apanel_init(void)
{
	void __iomem *bios;
	const void __iomem *p;

	bios = ioremap(0xF0000, 0x10000); /* Can't fail */
	p = bios_signature(bios);
	if (p) {
		/* just use the first address */
		apanel_addr = readb(p + 8 + 3) >> 1;
	}
	iounmap(bios);
}

836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858
struct dmi_onboard_device_info {
	const char *name;
	u8 type;
	unsigned short i2c_addr;
	const char *i2c_type;
};

static struct dmi_onboard_device_info __devinitdata dmi_devices[] = {
	{ "Syleus", DMI_DEV_TYPE_OTHER, 0x73, "fscsyl" },
	{ "Hermes", DMI_DEV_TYPE_OTHER, 0x73, "fscher" },
	{ "Hades",  DMI_DEV_TYPE_OTHER, 0x73, "fschds" },
};

static void __devinit dmi_check_onboard_device(u8 type, const char *name,
					       struct i2c_adapter *adap)
{
	int i;
	struct i2c_board_info info;

	for (i = 0; i < ARRAY_SIZE(dmi_devices); i++) {
		/* & ~0x80, ignore enabled/disabled bit */
		if ((type & ~0x80) != dmi_devices[i].type)
			continue;
859
		if (strcasecmp(name, dmi_devices[i].name))
860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901
			continue;

		memset(&info, 0, sizeof(struct i2c_board_info));
		info.addr = dmi_devices[i].i2c_addr;
		strlcpy(info.type, dmi_devices[i].i2c_type, I2C_NAME_SIZE);
		i2c_new_device(adap, &info);
		break;
	}
}

/* We use our own function to check for onboard devices instead of
   dmi_find_device() as some buggy BIOS's have the devices we are interested
   in marked as disabled */
static void __devinit dmi_check_onboard_devices(const struct dmi_header *dm,
						void *adap)
{
	int i, count;

	if (dm->type != 10)
		return;

	count = (dm->length - sizeof(struct dmi_header)) / 2;
	for (i = 0; i < count; i++) {
		const u8 *d = (char *)(dm + 1) + (i * 2);
		const char *name = ((char *) dm) + dm->length;
		u8 type = d[0];
		u8 s = d[1];

		if (!s)
			continue;
		s--;
		while (s > 0 && name[0]) {
			name += strlen(name) + 1;
			s--;
		}
		if (name[0] == 0) /* Bogus string reference */
			continue;

		dmi_check_onboard_device(type, name, adap);
	}
}

902 903 904 905 906 907 908 909 910 911 912 913 914 915 916
/* Register optional slaves */
static void __devinit i801_probe_optional_slaves(struct i801_priv *priv)
{
	/* Only register slaves on main SMBus channel */
	if (priv->features & FEATURE_IDF)
		return;

	if (apanel_addr) {
		struct i2c_board_info info;

		memset(&info, 0, sizeof(struct i2c_board_info));
		info.addr = apanel_addr;
		strlcpy(info.type, "fujitsu_apanel", I2C_NAME_SIZE);
		i2c_new_device(&priv->adapter, &info);
	}
917

918 919 920
	if (dmi_name_in_vendors("FUJITSU"))
		dmi_walk(dmi_check_onboard_devices, &priv->adapter);
}
921 922 923 924
#else
static void __init input_apanel_init(void) {}
static void __devinit i801_probe_optional_slaves(struct i801_priv *priv) {}
#endif	/* CONFIG_X86 && CONFIG_DMI */
925

926 927
#if (defined CONFIG_I2C_MUX_GPIO || defined CONFIG_I2C_MUX_GPIO_MODULE) && \
		defined CONFIG_DMI
928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018
static struct i801_mux_config i801_mux_config_asus_z8_d12 = {
	.gpio_chip = "gpio_ich",
	.values = { 0x02, 0x03 },
	.n_values = 2,
	.classes = { I2C_CLASS_SPD, I2C_CLASS_SPD },
	.gpios = { 52, 53 },
	.n_gpios = 2,
};

static struct i801_mux_config i801_mux_config_asus_z8_d18 = {
	.gpio_chip = "gpio_ich",
	.values = { 0x02, 0x03, 0x01 },
	.n_values = 3,
	.classes = { I2C_CLASS_SPD, I2C_CLASS_SPD, I2C_CLASS_SPD },
	.gpios = { 52, 53 },
	.n_gpios = 2,
};

static struct dmi_system_id __devinitdata mux_dmi_table[] = {
	{
		.matches = {
			DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
			DMI_MATCH(DMI_BOARD_NAME, "Z8NA-D6(C)"),
		},
		.driver_data = &i801_mux_config_asus_z8_d12,
	},
	{
		.matches = {
			DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
			DMI_MATCH(DMI_BOARD_NAME, "Z8P(N)E-D12(X)"),
		},
		.driver_data = &i801_mux_config_asus_z8_d12,
	},
	{
		.matches = {
			DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
			DMI_MATCH(DMI_BOARD_NAME, "Z8NH-D12"),
		},
		.driver_data = &i801_mux_config_asus_z8_d12,
	},
	{
		.matches = {
			DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
			DMI_MATCH(DMI_BOARD_NAME, "Z8PH-D12/IFB"),
		},
		.driver_data = &i801_mux_config_asus_z8_d12,
	},
	{
		.matches = {
			DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
			DMI_MATCH(DMI_BOARD_NAME, "Z8NR-D12"),
		},
		.driver_data = &i801_mux_config_asus_z8_d12,
	},
	{
		.matches = {
			DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
			DMI_MATCH(DMI_BOARD_NAME, "Z8P(N)H-D12"),
		},
		.driver_data = &i801_mux_config_asus_z8_d12,
	},
	{
		.matches = {
			DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
			DMI_MATCH(DMI_BOARD_NAME, "Z8PG-D18"),
		},
		.driver_data = &i801_mux_config_asus_z8_d18,
	},
	{
		.matches = {
			DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
			DMI_MATCH(DMI_BOARD_NAME, "Z8PE-D18"),
		},
		.driver_data = &i801_mux_config_asus_z8_d18,
	},
	{
		.matches = {
			DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
			DMI_MATCH(DMI_BOARD_NAME, "Z8PS-D12"),
		},
		.driver_data = &i801_mux_config_asus_z8_d12,
	},
	{ }
};

/* Setup multiplexing if needed */
static int __devinit i801_add_mux(struct i801_priv *priv)
{
	struct device *dev = &priv->adapter.dev;
	const struct i801_mux_config *mux_config;
	struct i2c_mux_gpio_platform_data gpio_data;
1019
	int err;
1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030

	if (!priv->mux_drvdata)
		return 0;
	mux_config = priv->mux_drvdata;

	/* Prepare the platform data */
	memset(&gpio_data, 0, sizeof(struct i2c_mux_gpio_platform_data));
	gpio_data.parent = priv->adapter.nr;
	gpio_data.values = mux_config->values;
	gpio_data.n_values = mux_config->n_values;
	gpio_data.classes = mux_config->classes;
1031 1032
	gpio_data.gpio_chip = mux_config->gpio_chip;
	gpio_data.gpios = mux_config->gpios;
1033 1034 1035 1036 1037
	gpio_data.n_gpios = mux_config->n_gpios;
	gpio_data.idle = I2C_MUX_GPIO_NO_IDLE;

	/* Register the mux device */
	priv->mux_pdev = platform_device_register_data(dev, "i2c-mux-gpio",
1038
				PLATFORM_DEVID_AUTO, &gpio_data,
1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064
				sizeof(struct i2c_mux_gpio_platform_data));
	if (IS_ERR(priv->mux_pdev)) {
		err = PTR_ERR(priv->mux_pdev);
		priv->mux_pdev = NULL;
		dev_err(dev, "Failed to register i2c-mux-gpio device\n");
		return err;
	}

	return 0;
}

static void __devexit i801_del_mux(struct i801_priv *priv)
{
	if (priv->mux_pdev)
		platform_device_unregister(priv->mux_pdev);
}

static unsigned int __devinit i801_get_adapter_class(struct i801_priv *priv)
{
	const struct dmi_system_id *id;
	const struct i801_mux_config *mux_config;
	unsigned int class = I2C_CLASS_HWMON | I2C_CLASS_SPD;
	int i;

	id = dmi_first_match(mux_dmi_table);
	if (id) {
J
Jean Delvare 已提交
1065
		/* Remove branch classes from trunk */
1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085
		mux_config = id->driver_data;
		for (i = 0; i < mux_config->n_values; i++)
			class &= ~mux_config->classes[i];

		/* Remember for later */
		priv->mux_drvdata = mux_config;
	}

	return class;
}
#else
static inline int i801_add_mux(struct i801_priv *priv) { return 0; }
static inline void i801_del_mux(struct i801_priv *priv) { }

static inline unsigned int i801_get_adapter_class(struct i801_priv *priv)
{
	return I2C_CLASS_HWMON | I2C_CLASS_SPD;
}
#endif

1086 1087
static int __devinit i801_probe(struct pci_dev *dev,
				const struct pci_device_id *id)
L
Linus Torvalds 已提交
1088
{
1089
	unsigned char temp;
1090
	int err, i;
1091 1092 1093 1094 1095 1096 1097 1098
	struct i801_priv *priv;

	priv = kzalloc(sizeof(*priv), GFP_KERNEL);
	if (!priv)
		return -ENOMEM;

	i2c_set_adapdata(&priv->adapter, priv);
	priv->adapter.owner = THIS_MODULE;
1099
	priv->adapter.class = i801_get_adapter_class(priv);
1100
	priv->adapter.algo = &smbus_algorithm;
L
Linus Torvalds 已提交
1101

1102
	priv->pci_dev = dev;
1103
	switch (dev->device) {
1104 1105 1106 1107 1108
	case PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF0:
	case PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF1:
	case PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF2:
		priv->features |= FEATURE_IDF;
		/* fall through */
1109
	default:
1110
		priv->features |= FEATURE_I2C_BLOCK_READ;
1111 1112
		/* fall through */
	case PCI_DEVICE_ID_INTEL_82801DB_3:
1113 1114
		priv->features |= FEATURE_SMBUS_PEC;
		priv->features |= FEATURE_BLOCK_BUFFER;
1115 1116 1117 1118 1119
		/* fall through */
	case PCI_DEVICE_ID_INTEL_82801CA_3:
	case PCI_DEVICE_ID_INTEL_82801BA_2:
	case PCI_DEVICE_ID_INTEL_82801AB_3:
	case PCI_DEVICE_ID_INTEL_82801AA_3:
1120 1121
		break;
	}
1122

1123 1124 1125 1126 1127 1128 1129 1130
	/* IRQ processing tested on CougarPoint PCH, ICH5, ICH7-M and ICH10 */
	if (dev->device == PCI_DEVICE_ID_INTEL_COUGARPOINT_SMBUS ||
	    dev->device == PCI_DEVICE_ID_INTEL_82801EB_3 ||
	    dev->device == PCI_DEVICE_ID_INTEL_ICH7_17 ||
	    dev->device == PCI_DEVICE_ID_INTEL_ICH8_5 ||
	    dev->device == PCI_DEVICE_ID_INTEL_ICH9_6 ||
	    dev->device == PCI_DEVICE_ID_INTEL_ICH10_4 ||
	    dev->device == PCI_DEVICE_ID_INTEL_ICH10_5)
1131 1132
		priv->features |= FEATURE_IRQ;

1133 1134
	/* Disable features on user request */
	for (i = 0; i < ARRAY_SIZE(i801_feature_names); i++) {
1135
		if (priv->features & disable_features & (1 << i))
1136 1137 1138
			dev_notice(&dev->dev, "%s disabled by user\n",
				   i801_feature_names[i]);
	}
1139
	priv->features &= ~disable_features;
1140

1141 1142 1143 1144 1145 1146 1147 1148
	err = pci_enable_device(dev);
	if (err) {
		dev_err(&dev->dev, "Failed to enable SMBus PCI device (%d)\n",
			err);
		goto exit;
	}

	/* Determine the address of the SMBus area */
1149 1150
	priv->smba = pci_resource_start(dev, SMBBAR);
	if (!priv->smba) {
1151 1152 1153
		dev_err(&dev->dev, "SMBus base address uninitialized, "
			"upgrade BIOS\n");
		err = -ENODEV;
1154
		goto exit;
1155 1156
	}

1157
	err = acpi_check_resource_conflict(&dev->resource[SMBBAR]);
1158 1159
	if (err) {
		err = -ENODEV;
1160
		goto exit;
1161
	}
1162

1163 1164 1165
	err = pci_request_region(dev, SMBBAR, i801_driver.name);
	if (err) {
		dev_err(&dev->dev, "Failed to request SMBus region "
1166
			"0x%lx-0x%Lx\n", priv->smba,
1167
			(unsigned long long)pci_resource_end(dev, SMBBAR));
1168
		goto exit;
1169 1170
	}

1171 1172
	pci_read_config_byte(priv->pci_dev, SMBHSTCFG, &temp);
	priv->original_hstcfg = temp;
1173 1174 1175 1176 1177
	temp &= ~SMBHSTCFG_I2C_EN;	/* SMBus timing */
	if (!(temp & SMBHSTCFG_HST_EN)) {
		dev_info(&dev->dev, "Enabling SMBus device\n");
		temp |= SMBHSTCFG_HST_EN;
	}
1178
	pci_write_config_byte(priv->pci_dev, SMBHSTCFG, temp);
1179

1180
	if (temp & SMBHSTCFG_SMB_SMI_EN) {
1181
		dev_dbg(&dev->dev, "SMBus using interrupt SMI#\n");
1182 1183 1184
		/* Disable SMBus interrupt feature if SMBus using SMI# */
		priv->features &= ~FEATURE_IRQ;
	}
L
Linus Torvalds 已提交
1185

1186
	/* Clear special mode bits */
1187 1188 1189
	if (priv->features & (FEATURE_SMBUS_PEC | FEATURE_BLOCK_BUFFER))
		outb_p(inb_p(SMBAUXCTL(priv)) &
		       ~(SMBAUXCTL_CRC | SMBAUXCTL_E32B), SMBAUXCTL(priv));
1190

1191 1192 1193 1194 1195 1196 1197 1198 1199 1200
	if (priv->features & FEATURE_IRQ) {
		init_waitqueue_head(&priv->waitq);

		err = request_irq(dev->irq, i801_isr, IRQF_SHARED,
				  i801_driver.name, priv);
		if (err) {
			dev_err(&dev->dev, "Failed to allocate irq %d: %d\n",
				dev->irq, err);
			goto exit_release;
		}
1201
		dev_info(&dev->dev, "SMBus using PCI Interrupt\n");
1202 1203
	}

1204
	/* set up the sysfs linkage to our parent device */
1205
	priv->adapter.dev.parent = &dev->dev;
L
Linus Torvalds 已提交
1206

J
Jean Delvare 已提交
1207
	/* Retry up to 3 times on lost arbitration */
1208
	priv->adapter.retries = 3;
J
Jean Delvare 已提交
1209

1210 1211 1212
	snprintf(priv->adapter.name, sizeof(priv->adapter.name),
		"SMBus I801 adapter at %04lx", priv->smba);
	err = i2c_add_adapter(&priv->adapter);
1213 1214
	if (err) {
		dev_err(&dev->dev, "Failed to add SMBus adapter\n");
1215
		goto exit_free_irq;
1216
	}
1217

1218
	i801_probe_optional_slaves(priv);
1219 1220
	/* We ignore errors - multiplexing is optional */
	i801_add_mux(priv);
1221

1222
	pci_set_drvdata(dev, priv);
1223

1224
	return 0;
1225

1226 1227 1228
exit_free_irq:
	if (priv->features & FEATURE_IRQ)
		free_irq(dev->irq, priv);
1229 1230
exit_release:
	pci_release_region(dev, SMBBAR);
1231
exit:
1232
	kfree(priv);
1233
	return err;
L
Linus Torvalds 已提交
1234 1235 1236 1237
}

static void __devexit i801_remove(struct pci_dev *dev)
{
1238 1239
	struct i801_priv *priv = pci_get_drvdata(dev);

1240
	i801_del_mux(priv);
1241 1242
	i2c_del_adapter(&priv->adapter);
	pci_write_config_byte(dev, SMBHSTCFG, priv->original_hstcfg);
1243 1244 1245

	if (priv->features & FEATURE_IRQ)
		free_irq(dev->irq, priv);
1246
	pci_release_region(dev, SMBBAR);
1247

1248 1249
	pci_set_drvdata(dev, NULL);
	kfree(priv);
1250 1251 1252 1253
	/*
	 * do not call pci_disable_device(dev) since it can cause hard hangs on
	 * some systems during power-off (eg. Fujitsu-Siemens Lifebook E8010)
	 */
L
Linus Torvalds 已提交
1254 1255
}

1256 1257 1258
#ifdef CONFIG_PM
static int i801_suspend(struct pci_dev *dev, pm_message_t mesg)
{
1259 1260
	struct i801_priv *priv = pci_get_drvdata(dev);

1261
	pci_save_state(dev);
1262
	pci_write_config_byte(dev, SMBHSTCFG, priv->original_hstcfg);
1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277
	pci_set_power_state(dev, pci_choose_state(dev, mesg));
	return 0;
}

static int i801_resume(struct pci_dev *dev)
{
	pci_set_power_state(dev, PCI_D0);
	pci_restore_state(dev);
	return pci_enable_device(dev);
}
#else
#define i801_suspend NULL
#define i801_resume NULL
#endif

L
Linus Torvalds 已提交
1278 1279 1280 1281 1282
static struct pci_driver i801_driver = {
	.name		= "i801_smbus",
	.id_table	= i801_ids,
	.probe		= i801_probe,
	.remove		= __devexit_p(i801_remove),
1283 1284
	.suspend	= i801_suspend,
	.resume		= i801_resume,
L
Linus Torvalds 已提交
1285 1286 1287 1288
};

static int __init i2c_i801_init(void)
{
1289 1290
	if (dmi_name_in_vendors("FUJITSU"))
		input_apanel_init();
L
Linus Torvalds 已提交
1291 1292 1293 1294 1295 1296 1297 1298
	return pci_register_driver(&i801_driver);
}

static void __exit i2c_i801_exit(void)
{
	pci_unregister_driver(&i801_driver);
}

1299 1300
MODULE_AUTHOR("Mark D. Studebaker <mdsxyz123@yahoo.com>, "
	      "Jean Delvare <khali@linux-fr.org>");
L
Linus Torvalds 已提交
1301 1302 1303 1304 1305
MODULE_DESCRIPTION("I801 SMBus driver");
MODULE_LICENSE("GPL");

module_init(i2c_i801_init);
module_exit(i2c_i801_exit);