i2c-i801.c 26.6 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, 2008   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 54 55 56 57 58

  Features supported by this driver:
  Software PEC                     no
  Hardware PEC                     yes
  Block buffer                     yes
  Block process call transaction   no
59
  I2C block read transaction       yes  (doesn't use the block buffer)
60
  Slave mode                       no
61 62

  See the file Documentation/i2c/busses/i2c-i801 for details.
L
Linus Torvalds 已提交
63 64 65 66 67 68 69 70 71 72
*/

#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>
73
#include <linux/acpi.h>
74
#include <linux/io.h>
75
#include <linux/dmi.h>
B
Ben Hutchings 已提交
76
#include <linux/slab.h>
L
Linus Torvalds 已提交
77 78

/* I801 SMBus address offsets */
79 80 81 82 83 84 85 86 87 88
#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 已提交
89 90

/* PCI Address Constants */
91
#define SMBBAR		4
L
Linus Torvalds 已提交
92 93 94 95 96 97 98
#define SMBHSTCFG	0x040

/* Host configuration bits for SMBHSTCFG */
#define SMBHSTCFG_HST_EN	1
#define SMBHSTCFG_SMB_SMI_EN	2
#define SMBHSTCFG_I2C_EN	4

O
Oleg Ryjkov 已提交
99 100 101 102 103 104 105
/* Auxillary control register bits, ICH4+ only */
#define SMBAUXCTL_CRC		1
#define SMBAUXCTL_E32B		2

/* kill bit for SMBHSTCNT */
#define SMBHSTCNT_KILL		2

L
Linus Torvalds 已提交
106 107 108 109 110 111 112 113 114
/* Other settings */
#define MAX_TIMEOUT		100
#define ENABLE_INT9		0	/* set to 0x01 to enable - untested */

/* I801 command constants */
#define I801_QUICK		0x00
#define I801_BYTE		0x04
#define I801_BYTE_DATA		0x08
#define I801_WORD_DATA		0x0C
115
#define I801_PROC_CALL		0x10	/* unimplemented */
L
Linus Torvalds 已提交
116
#define I801_BLOCK_DATA		0x14
117
#define I801_I2C_BLOCK_DATA	0x18	/* ICH5 and later */
L
Linus Torvalds 已提交
118
#define I801_BLOCK_LAST		0x34
119
#define I801_I2C_BLOCK_LAST	0x38	/* ICH5 and later */
L
Linus Torvalds 已提交
120
#define I801_START		0x40
121
#define I801_PEC_EN		0x80	/* ICH3 and later */
L
Linus Torvalds 已提交
122

O
Oleg Ryjkov 已提交
123 124 125 126 127 128 129 130 131
/* 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 已提交
132

133 134 135 136
#define STATUS_FLAGS		(SMBHSTSTS_BYTE_DONE | SMBHSTSTS_FAILED | \
				 SMBHSTSTS_BUS_ERR | SMBHSTSTS_DEV_ERR | \
				 SMBHSTSTS_INTR)

137 138 139 140 141
/* 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

142 143 144 145 146 147 148 149
struct i801_priv {
	struct i2c_adapter adapter;
	unsigned long smba;
	unsigned char original_hstcfg;
	struct pci_dev *pci_dev;
	unsigned int features;
};

150
static struct pci_driver i801_driver;
151 152 153 154 155

#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)
L
Linus Torvalds 已提交
156

157 158 159 160 161 162 163 164 165 166 167
static const char *i801_feature_names[] = {
	"SMBus PEC",
	"Block buffer",
	"Block process call",
	"I2C block read",
};

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

168 169
/* Make sure the SMBus host is ready to start transmitting.
   Return 0 if it is, -EBUSY if it is not. */
170
static int i801_check_pre(struct i801_priv *priv)
L
Linus Torvalds 已提交
171
{
172
	int status;
L
Linus Torvalds 已提交
173

174
	status = inb_p(SMBHSTSTS(priv));
175
	if (status & SMBHSTSTS_HOST_BUSY) {
176
		dev_err(&priv->pci_dev->dev, "SMBus is busy, can't use it!\n");
177 178 179 180 181
		return -EBUSY;
	}

	status &= STATUS_FLAGS;
	if (status) {
182
		dev_dbg(&priv->pci_dev->dev, "Clearing status flags (%02x)\n",
183
			status);
184 185
		outb_p(status, SMBHSTSTS(priv));
		status = inb_p(SMBHSTSTS(priv)) & STATUS_FLAGS;
186
		if (status) {
187
			dev_err(&priv->pci_dev->dev,
188 189
				"Failed clearing status flags (%02x)\n",
				status);
190
			return -EBUSY;
L
Linus Torvalds 已提交
191 192 193
		}
	}

194 195
	return 0;
}
L
Linus Torvalds 已提交
196

197
/* Convert the status register to an error code, and clear it. */
198
static int i801_check_post(struct i801_priv *priv, int status, int timeout)
199 200
{
	int result = 0;
L
Linus Torvalds 已提交
201 202

	/* If the SMBus is still busy, we give up */
203
	if (timeout) {
204
		dev_err(&priv->pci_dev->dev, "Transaction timeout\n");
O
Oleg Ryjkov 已提交
205
		/* try to stop the current command */
206 207 208
		dev_dbg(&priv->pci_dev->dev, "Terminating the current operation\n");
		outb_p(inb_p(SMBHSTCNT(priv)) | SMBHSTCNT_KILL,
		       SMBHSTCNT(priv));
O
Oleg Ryjkov 已提交
209
		msleep(1);
210 211
		outb_p(inb_p(SMBHSTCNT(priv)) & (~SMBHSTCNT_KILL),
		       SMBHSTCNT(priv));
212 213

		/* Check if it worked */
214
		status = inb_p(SMBHSTSTS(priv));
215 216
		if ((status & SMBHSTSTS_HOST_BUSY) ||
		    !(status & SMBHSTSTS_FAILED))
217
			dev_err(&priv->pci_dev->dev,
218
				"Failed terminating the transaction\n");
219
		outb_p(STATUS_FLAGS, SMBHSTSTS(priv));
220
		return -ETIMEDOUT;
L
Linus Torvalds 已提交
221 222
	}

223
	if (status & SMBHSTSTS_FAILED) {
224
		result = -EIO;
225
		dev_err(&priv->pci_dev->dev, "Transaction failed\n");
226 227 228
	}
	if (status & SMBHSTSTS_DEV_ERR) {
		result = -ENXIO;
229
		dev_dbg(&priv->pci_dev->dev, "No response\n");
L
Linus Torvalds 已提交
230
	}
231
	if (status & SMBHSTSTS_BUS_ERR) {
232
		result = -EAGAIN;
233
		dev_dbg(&priv->pci_dev->dev, "Lost arbitration\n");
L
Linus Torvalds 已提交
234 235
	}

236 237
	if (result) {
		/* Clear error flags */
238 239
		outb_p(status & STATUS_FLAGS, SMBHSTSTS(priv));
		status = inb_p(SMBHSTSTS(priv)) & STATUS_FLAGS;
240
		if (status) {
241
			dev_warn(&priv->pci_dev->dev, "Failed clearing status "
242 243 244
				 "flags at end of transaction (%02x)\n",
				 status);
		}
L
Linus Torvalds 已提交
245 246 247 248 249
	}

	return result;
}

250
static int i801_transaction(struct i801_priv *priv, int xact)
251 252 253 254 255
{
	int status;
	int result;
	int timeout = 0;

256
	result = i801_check_pre(priv);
257 258 259 260 261
	if (result < 0)
		return result;

	/* the current contents of SMBHSTCNT can be overwritten, since PEC,
	 * INTREN, SMBSCMD are passed in xact */
262
	outb_p(xact | I801_START, SMBHSTCNT(priv));
263 264 265 266

	/* We will always wait for a fraction of a second! */
	do {
		msleep(1);
267
		status = inb_p(SMBHSTSTS(priv));
268 269
	} while ((status & SMBHSTSTS_HOST_BUSY) && (timeout++ < MAX_TIMEOUT));

270
	result = i801_check_post(priv, status, timeout > MAX_TIMEOUT);
271 272 273
	if (result < 0)
		return result;

274
	outb_p(SMBHSTSTS_INTR, SMBHSTSTS(priv));
275 276 277
	return 0;
}

O
Oleg Ryjkov 已提交
278
/* wait for INTR bit as advised by Intel */
279
static void i801_wait_hwpec(struct i801_priv *priv)
O
Oleg Ryjkov 已提交
280 281
{
	int timeout = 0;
282
	int status;
O
Oleg Ryjkov 已提交
283 284 285

	do {
		msleep(1);
286
		status = inb_p(SMBHSTSTS(priv));
287
	} while ((!(status & SMBHSTSTS_INTR))
O
Oleg Ryjkov 已提交
288 289
		 && (timeout++ < MAX_TIMEOUT));

R
Roel Kluin 已提交
290
	if (timeout > MAX_TIMEOUT)
291
		dev_dbg(&priv->pci_dev->dev, "PEC Timeout!\n");
R
Roel Kluin 已提交
292

293
	outb_p(status, SMBHSTSTS(priv));
O
Oleg Ryjkov 已提交
294 295
}

296 297
static int i801_block_transaction_by_block(struct i801_priv *priv,
					   union i2c_smbus_data *data,
298 299 300
					   char read_write, int hwpec)
{
	int i, len;
301
	int status;
302

303
	inb_p(SMBHSTCNT(priv)); /* reset the data buffer index */
304 305 306 307

	/* Use 32-byte buffer to process this transaction */
	if (read_write == I2C_SMBUS_WRITE) {
		len = data->block[0];
308
		outb_p(len, SMBHSTDAT0(priv));
309
		for (i = 0; i < len; i++)
310
			outb_p(data->block[i+1], SMBBLKDAT(priv));
311 312
	}

313
	status = i801_transaction(priv, I801_BLOCK_DATA | ENABLE_INT9 |
314 315 316
				  I801_PEC_EN * hwpec);
	if (status)
		return status;
317 318

	if (read_write == I2C_SMBUS_READ) {
319
		len = inb_p(SMBHSTDAT0(priv));
320
		if (len < 1 || len > I2C_SMBUS_BLOCK_MAX)
321
			return -EPROTO;
322 323 324

		data->block[0] = len;
		for (i = 0; i < len; i++)
325
			data->block[i + 1] = inb_p(SMBBLKDAT(priv));
326 327 328 329
	}
	return 0;
}

330 331
static int i801_block_transaction_byte_by_byte(struct i801_priv *priv,
					       union i2c_smbus_data *data,
332 333
					       char read_write, int command,
					       int hwpec)
L
Linus Torvalds 已提交
334 335 336
{
	int i, len;
	int smbcmd;
337
	int status;
338
	int result;
L
Linus Torvalds 已提交
339
	int timeout;
340

341
	result = i801_check_pre(priv);
342 343
	if (result < 0)
		return result;
L
Linus Torvalds 已提交
344

345
	len = data->block[0];
L
Linus Torvalds 已提交
346 347

	if (read_write == I2C_SMBUS_WRITE) {
348 349
		outb_p(len, SMBHSTDAT0(priv));
		outb_p(data->block[1], SMBBLKDAT(priv));
L
Linus Torvalds 已提交
350 351 352
	}

	for (i = 1; i <= len; i++) {
353 354 355 356 357 358 359 360 361 362 363 364
		if (i == len && read_write == I2C_SMBUS_READ) {
			if (command == I2C_SMBUS_I2C_BLOCK_DATA)
				smbcmd = I801_I2C_BLOCK_LAST;
			else
				smbcmd = I801_BLOCK_LAST;
		} else {
			if (command == I2C_SMBUS_I2C_BLOCK_DATA
			 && read_write == I2C_SMBUS_READ)
				smbcmd = I801_I2C_BLOCK_DATA;
			else
				smbcmd = I801_BLOCK_DATA;
		}
365
		outb_p(smbcmd | ENABLE_INT9, SMBHSTCNT(priv));
L
Linus Torvalds 已提交
366 367

		if (i == 1)
368 369
			outb_p(inb(SMBHSTCNT(priv)) | I801_START,
			       SMBHSTCNT(priv));
L
Linus Torvalds 已提交
370 371 372 373 374

		/* We will always wait for a fraction of a second! */
		timeout = 0;
		do {
			msleep(1);
375
			status = inb_p(SMBHSTSTS(priv));
376 377
		} while ((!(status & SMBHSTSTS_BYTE_DONE))
			 && (timeout++ < MAX_TIMEOUT));
L
Linus Torvalds 已提交
378

379
		result = i801_check_post(priv, status, timeout > MAX_TIMEOUT);
380 381
		if (result < 0)
			return result;
L
Linus Torvalds 已提交
382

383 384
		if (i == 1 && read_write == I2C_SMBUS_READ
		 && command != I2C_SMBUS_I2C_BLOCK_DATA) {
385
			len = inb_p(SMBHSTDAT0(priv));
386
			if (len < 1 || len > I2C_SMBUS_BLOCK_MAX) {
387
				dev_err(&priv->pci_dev->dev,
388 389 390
					"Illegal SMBus block read size %d\n",
					len);
				/* Recover */
391 392 393 394 395
				while (inb_p(SMBHSTSTS(priv)) &
				       SMBHSTSTS_HOST_BUSY)
					outb_p(SMBHSTSTS_BYTE_DONE,
					       SMBHSTSTS(priv));
				outb_p(SMBHSTSTS_INTR, SMBHSTSTS(priv));
396
				return -EPROTO;
397
			}
L
Linus Torvalds 已提交
398 399 400 401 402
			data->block[0] = len;
		}

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

407
		/* signals SMBBLKDAT ready */
408
		outb_p(SMBHSTSTS_BYTE_DONE | SMBHSTSTS_INTR, SMBHSTSTS(priv));
L
Linus Torvalds 已提交
409
	}
410 411

	return 0;
412
}
L
Linus Torvalds 已提交
413

414
static int i801_set_block_buffer_mode(struct i801_priv *priv)
415
{
416 417
	outb_p(inb_p(SMBAUXCTL(priv)) | SMBAUXCTL_E32B, SMBAUXCTL(priv));
	if ((inb_p(SMBAUXCTL(priv)) & SMBAUXCTL_E32B) == 0)
418
		return -EIO;
419 420 421 422
	return 0;
}

/* Block transaction function */
423 424
static int i801_block_transaction(struct i801_priv *priv,
				  union i2c_smbus_data *data, char read_write,
425 426 427 428 429 430 431 432
				  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 */
433 434
			pci_read_config_byte(priv->pci_dev, SMBHSTCFG, &hostc);
			pci_write_config_byte(priv->pci_dev, SMBHSTCFG,
435
					      hostc | SMBHSTCFG_I2C_EN);
436 437
		} else if (!(priv->features & FEATURE_I2C_BLOCK_READ)) {
			dev_err(&priv->pci_dev->dev,
438
				"I2C block read is unsupported!\n");
439
			return -EOPNOTSUPP;
440 441 442
		}
	}

443 444
	if (read_write == I2C_SMBUS_WRITE
	 || command == I2C_SMBUS_I2C_BLOCK_DATA) {
445 446 447 448 449
		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 {
450
		data->block[0] = 32;	/* max for SMBus block reads */
451 452
	}

453 454 455
	/* 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. */
456
	if ((priv->features & FEATURE_BLOCK_BUFFER)
457
	 && command != I2C_SMBUS_I2C_BLOCK_DATA
458 459 460
	 && i801_set_block_buffer_mode(priv) == 0)
		result = i801_block_transaction_by_block(priv, data,
							 read_write, hwpec);
461
	else
462 463
		result = i801_block_transaction_byte_by_byte(priv, data,
							     read_write,
464
							     command, hwpec);
465 466

	if (result == 0 && hwpec)
467
		i801_wait_hwpec(priv);
L
Linus Torvalds 已提交
468

469 470
	if (command == I2C_SMBUS_I2C_BLOCK_DATA
	 && read_write == I2C_SMBUS_WRITE) {
L
Linus Torvalds 已提交
471
		/* restore saved configuration register value */
472
		pci_write_config_byte(priv->pci_dev, SMBHSTCFG, hostc);
L
Linus Torvalds 已提交
473 474 475 476
	}
	return result;
}

477
/* Return negative errno on error. */
478
static s32 i801_access(struct i2c_adapter *adap, u16 addr,
L
Linus Torvalds 已提交
479
		       unsigned short flags, char read_write, u8 command,
480
		       int size, union i2c_smbus_data *data)
L
Linus Torvalds 已提交
481
{
482
	int hwpec;
L
Linus Torvalds 已提交
483 484
	int block = 0;
	int ret, xact = 0;
485
	struct i801_priv *priv = i2c_get_adapdata(adap);
L
Linus Torvalds 已提交
486

487
	hwpec = (priv->features & FEATURE_SMBUS_PEC) && (flags & I2C_CLIENT_PEC)
488 489
		&& size != I2C_SMBUS_QUICK
		&& size != I2C_SMBUS_I2C_BLOCK_DATA;
L
Linus Torvalds 已提交
490 491 492 493

	switch (size) {
	case I2C_SMBUS_QUICK:
		outb_p(((addr & 0x7f) << 1) | (read_write & 0x01),
494
		       SMBHSTADD(priv));
L
Linus Torvalds 已提交
495 496 497 498
		xact = I801_QUICK;
		break;
	case I2C_SMBUS_BYTE:
		outb_p(((addr & 0x7f) << 1) | (read_write & 0x01),
499
		       SMBHSTADD(priv));
L
Linus Torvalds 已提交
500
		if (read_write == I2C_SMBUS_WRITE)
501
			outb_p(command, SMBHSTCMD(priv));
L
Linus Torvalds 已提交
502 503 504 505
		xact = I801_BYTE;
		break;
	case I2C_SMBUS_BYTE_DATA:
		outb_p(((addr & 0x7f) << 1) | (read_write & 0x01),
506 507
		       SMBHSTADD(priv));
		outb_p(command, SMBHSTCMD(priv));
L
Linus Torvalds 已提交
508
		if (read_write == I2C_SMBUS_WRITE)
509
			outb_p(data->byte, SMBHSTDAT0(priv));
L
Linus Torvalds 已提交
510 511 512 513
		xact = I801_BYTE_DATA;
		break;
	case I2C_SMBUS_WORD_DATA:
		outb_p(((addr & 0x7f) << 1) | (read_write & 0x01),
514 515
		       SMBHSTADD(priv));
		outb_p(command, SMBHSTCMD(priv));
L
Linus Torvalds 已提交
516
		if (read_write == I2C_SMBUS_WRITE) {
517 518
			outb_p(data->word & 0xff, SMBHSTDAT0(priv));
			outb_p((data->word & 0xff00) >> 8, SMBHSTDAT1(priv));
L
Linus Torvalds 已提交
519 520 521 522 523
		}
		xact = I801_WORD_DATA;
		break;
	case I2C_SMBUS_BLOCK_DATA:
		outb_p(((addr & 0x7f) << 1) | (read_write & 0x01),
524 525
		       SMBHSTADD(priv));
		outb_p(command, SMBHSTCMD(priv));
L
Linus Torvalds 已提交
526 527
		block = 1;
		break;
528 529 530
	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 */
531
		outb_p((addr & 0x7f) << 1, SMBHSTADD(priv));
532 533 534
		if (read_write == I2C_SMBUS_READ) {
			/* NB: page 240 of ICH5 datasheet also shows
			 * that DATA1 is the cmd field when reading */
535
			outb_p(command, SMBHSTDAT1(priv));
536
		} else
537
			outb_p(command, SMBHSTCMD(priv));
538 539
		block = 1;
		break;
L
Linus Torvalds 已提交
540
	default:
541 542
		dev_err(&priv->pci_dev->dev, "Unsupported transaction %d\n",
			size);
543
		return -EOPNOTSUPP;
L
Linus Torvalds 已提交
544 545
	}

O
Oleg Ryjkov 已提交
546
	if (hwpec)	/* enable/disable hardware PEC */
547
		outb_p(inb_p(SMBAUXCTL(priv)) | SMBAUXCTL_CRC, SMBAUXCTL(priv));
O
Oleg Ryjkov 已提交
548
	else
549 550
		outb_p(inb_p(SMBAUXCTL(priv)) & (~SMBAUXCTL_CRC),
		       SMBAUXCTL(priv));
551

552
	if (block)
553 554
		ret = i801_block_transaction(priv, data, read_write, size,
					     hwpec);
555
	else
556
		ret = i801_transaction(priv, xact | ENABLE_INT9);
L
Linus Torvalds 已提交
557

558
	/* Some BIOSes don't like it when PEC is enabled at reboot or resume
559 560
	   time, so we forcibly disable it after every transaction. Turn off
	   E32B for the same reason. */
561
	if (hwpec || block)
562 563
		outb_p(inb_p(SMBAUXCTL(priv)) &
		       ~(SMBAUXCTL_CRC | SMBAUXCTL_E32B), SMBAUXCTL(priv));
564

565
	if (block)
L
Linus Torvalds 已提交
566
		return ret;
567
	if (ret)
568
		return ret;
L
Linus Torvalds 已提交
569 570 571 572 573 574
	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:
575
		data->byte = inb_p(SMBHSTDAT0(priv));
L
Linus Torvalds 已提交
576 577
		break;
	case I801_WORD_DATA:
578 579
		data->word = inb_p(SMBHSTDAT0(priv)) +
			     (inb_p(SMBHSTDAT1(priv)) << 8);
L
Linus Torvalds 已提交
580 581 582 583 584 585 586 587
		break;
	}
	return 0;
}


static u32 i801_func(struct i2c_adapter *adapter)
{
588 589
	struct i801_priv *priv = i2c_get_adapdata(adapter);

L
Linus Torvalds 已提交
590
	return I2C_FUNC_SMBUS_QUICK | I2C_FUNC_SMBUS_BYTE |
591 592
	       I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA |
	       I2C_FUNC_SMBUS_BLOCK_DATA | I2C_FUNC_SMBUS_WRITE_I2C_BLOCK |
593 594
	       ((priv->features & FEATURE_SMBUS_PEC) ? I2C_FUNC_SMBUS_PEC : 0) |
	       ((priv->features & FEATURE_I2C_BLOCK_READ) ?
595
		I2C_FUNC_SMBUS_READ_I2C_BLOCK : 0);
L
Linus Torvalds 已提交
596 597
}

598
static const struct i2c_algorithm smbus_algorithm = {
L
Linus Torvalds 已提交
599 600 601 602
	.smbus_xfer	= i801_access,
	.functionality	= i801_func,
};

603
static const struct pci_device_id i801_ids[] = {
L
Linus Torvalds 已提交
604 605 606 607 608 609 610 611 612
	{ 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) },
613
	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ESB2_17) },
614
	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH8_5) },
615
	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH9_6) },
616
	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_EP80579_1) },
617 618
	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH10_4) },
	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH10_5) },
619 620
	{ 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) },
621
	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS) },
622 623 624
	{ 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) },
625
	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_DH89XXCC_SMBUS) },
L
Linus Torvalds 已提交
626 627 628
	{ 0, }
};

629
MODULE_DEVICE_TABLE(pci, i801_ids);
L
Linus Torvalds 已提交
630

631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664
#if defined CONFIG_INPUT_APANEL || defined CONFIG_INPUT_APANEL_MODULE
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);
}
#else
static void __init input_apanel_init(void) {}
#endif

665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688
#if defined CONFIG_SENSORS_FSCHMD || defined CONFIG_SENSORS_FSCHMD_MODULE
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;
689
		if (strcasecmp(name, dmi_devices[i].name))
690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732
			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);
	}
}
#endif

733 734
static int __devinit i801_probe(struct pci_dev *dev,
				const struct pci_device_id *id)
L
Linus Torvalds 已提交
735
{
736
	unsigned char temp;
737
	int err, i;
738 739 740 741 742 743 744 745 746 747
	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;
	priv->adapter.class = I2C_CLASS_HWMON | I2C_CLASS_SPD;
	priv->adapter.algo = &smbus_algorithm;
L
Linus Torvalds 已提交
748

749
	priv->pci_dev = dev;
750
	switch (dev->device) {
751
	default:
752
		priv->features |= FEATURE_I2C_BLOCK_READ;
753 754
		/* fall through */
	case PCI_DEVICE_ID_INTEL_82801DB_3:
755 756
		priv->features |= FEATURE_SMBUS_PEC;
		priv->features |= FEATURE_BLOCK_BUFFER;
757 758 759 760 761
		/* 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:
762 763
		break;
	}
764

765 766
	/* Disable features on user request */
	for (i = 0; i < ARRAY_SIZE(i801_feature_names); i++) {
767
		if (priv->features & disable_features & (1 << i))
768 769 770
			dev_notice(&dev->dev, "%s disabled by user\n",
				   i801_feature_names[i]);
	}
771
	priv->features &= ~disable_features;
772

773 774 775 776 777 778 779 780
	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 */
781 782
	priv->smba = pci_resource_start(dev, SMBBAR);
	if (!priv->smba) {
783 784 785
		dev_err(&dev->dev, "SMBus base address uninitialized, "
			"upgrade BIOS\n");
		err = -ENODEV;
786
		goto exit;
787 788
	}

789
	err = acpi_check_resource_conflict(&dev->resource[SMBBAR]);
790 791
	if (err) {
		err = -ENODEV;
792
		goto exit;
793
	}
794

795 796 797
	err = pci_request_region(dev, SMBBAR, i801_driver.name);
	if (err) {
		dev_err(&dev->dev, "Failed to request SMBus region "
798
			"0x%lx-0x%Lx\n", priv->smba,
799
			(unsigned long long)pci_resource_end(dev, SMBBAR));
800
		goto exit;
801 802
	}

803 804
	pci_read_config_byte(priv->pci_dev, SMBHSTCFG, &temp);
	priv->original_hstcfg = temp;
805 806 807 808 809
	temp &= ~SMBHSTCFG_I2C_EN;	/* SMBus timing */
	if (!(temp & SMBHSTCFG_HST_EN)) {
		dev_info(&dev->dev, "Enabling SMBus device\n");
		temp |= SMBHSTCFG_HST_EN;
	}
810
	pci_write_config_byte(priv->pci_dev, SMBHSTCFG, temp);
811 812 813 814 815

	if (temp & SMBHSTCFG_SMB_SMI_EN)
		dev_dbg(&dev->dev, "SMBus using interrupt SMI#\n");
	else
		dev_dbg(&dev->dev, "SMBus using PCI Interrupt\n");
L
Linus Torvalds 已提交
816

817
	/* Clear special mode bits */
818 819 820
	if (priv->features & (FEATURE_SMBUS_PEC | FEATURE_BLOCK_BUFFER))
		outb_p(inb_p(SMBAUXCTL(priv)) &
		       ~(SMBAUXCTL_CRC | SMBAUXCTL_E32B), SMBAUXCTL(priv));
821

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

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

828 829 830
	snprintf(priv->adapter.name, sizeof(priv->adapter.name),
		"SMBus I801 adapter at %04lx", priv->smba);
	err = i2c_add_adapter(&priv->adapter);
831 832
	if (err) {
		dev_err(&dev->dev, "Failed to add SMBus adapter\n");
833
		goto exit_release;
834
	}
835 836 837 838 839 840 841 842 843

	/* Register optional slaves */
#if defined CONFIG_INPUT_APANEL || defined CONFIG_INPUT_APANEL_MODULE
	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);
844
		i2c_new_device(&priv->adapter, &info);
845 846
	}
#endif
847
#if defined CONFIG_SENSORS_FSCHMD || defined CONFIG_SENSORS_FSCHMD_MODULE
848
	if (dmi_name_in_vendors("FUJITSU"))
849
		dmi_walk(dmi_check_onboard_devices, &priv->adapter);
850
#endif
851

852
	pci_set_drvdata(dev, priv);
853
	return 0;
854

855 856
exit_release:
	pci_release_region(dev, SMBBAR);
857
exit:
858
	kfree(priv);
859
	return err;
L
Linus Torvalds 已提交
860 861 862 863
}

static void __devexit i801_remove(struct pci_dev *dev)
{
864 865 866 867
	struct i801_priv *priv = pci_get_drvdata(dev);

	i2c_del_adapter(&priv->adapter);
	pci_write_config_byte(dev, SMBHSTCFG, priv->original_hstcfg);
868
	pci_release_region(dev, SMBBAR);
869 870
	pci_set_drvdata(dev, NULL);
	kfree(priv);
871 872 873 874
	/*
	 * 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 已提交
875 876
}

877 878 879
#ifdef CONFIG_PM
static int i801_suspend(struct pci_dev *dev, pm_message_t mesg)
{
880 881
	struct i801_priv *priv = pci_get_drvdata(dev);

882
	pci_save_state(dev);
883
	pci_write_config_byte(dev, SMBHSTCFG, priv->original_hstcfg);
884 885 886 887 888 889 890 891 892 893 894 895 896 897 898
	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 已提交
899 900 901 902 903
static struct pci_driver i801_driver = {
	.name		= "i801_smbus",
	.id_table	= i801_ids,
	.probe		= i801_probe,
	.remove		= __devexit_p(i801_remove),
904 905
	.suspend	= i801_suspend,
	.resume		= i801_resume,
L
Linus Torvalds 已提交
906 907 908 909
};

static int __init i2c_i801_init(void)
{
910
	input_apanel_init();
L
Linus Torvalds 已提交
911 912 913 914 915 916 917 918
	return pci_register_driver(&i801_driver);
}

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

919 920
MODULE_AUTHOR("Mark D. Studebaker <mdsxyz123@yahoo.com>, "
	      "Jean Delvare <khali@linux-fr.org>");
L
Linus Torvalds 已提交
921 922 923 924 925
MODULE_DESCRIPTION("I801 SMBus driver");
MODULE_LICENSE("GPL");

module_init(i2c_i801_init);
module_exit(i2c_i801_exit);