0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033 #include <linux/module.h>
0034 #include <linux/delay.h>
0035 #include <linux/pci.h>
0036 #include <linux/kernel.h>
0037 #include <linux/stddef.h>
0038 #include <linux/ioport.h>
0039 #include <linux/i2c.h>
0040 #include <linux/init.h>
0041 #include <linux/acpi.h>
0042 #include <linux/io.h>
0043
0044 static struct pci_dev *vt596_pdev;
0045
0046 #define SMBBA1 0x90
0047 #define SMBBA2 0x80
0048 #define SMBBA3 0xD0
0049
0050
0051 static unsigned short vt596_smba;
0052 #define SMBHSTSTS (vt596_smba + 0)
0053 #define SMBHSTCNT (vt596_smba + 2)
0054 #define SMBHSTCMD (vt596_smba + 3)
0055 #define SMBHSTADD (vt596_smba + 4)
0056 #define SMBHSTDAT0 (vt596_smba + 5)
0057 #define SMBHSTDAT1 (vt596_smba + 6)
0058 #define SMBBLKDAT (vt596_smba + 7)
0059
0060
0061
0062
0063
0064
0065 static unsigned short SMBHSTCFG = 0xD2;
0066
0067
0068 #define MAX_TIMEOUT 500
0069
0070
0071 #define VT596_QUICK 0x00
0072 #define VT596_BYTE 0x04
0073 #define VT596_BYTE_DATA 0x08
0074 #define VT596_WORD_DATA 0x0C
0075 #define VT596_PROC_CALL 0x10
0076 #define VT596_BLOCK_DATA 0x14
0077 #define VT596_I2C_BLOCK_DATA 0x34
0078
0079
0080
0081
0082 static bool force;
0083 module_param(force, bool, 0);
0084 MODULE_PARM_DESC(force, "Forcibly enable the SMBus. DANGEROUS!");
0085
0086
0087
0088 static u16 force_addr;
0089 module_param_hw(force_addr, ushort, ioport, 0);
0090 MODULE_PARM_DESC(force_addr,
0091 "Forcibly enable the SMBus at the given address. "
0092 "EXTREMELY DANGEROUS!");
0093
0094
0095 static struct pci_driver vt596_driver;
0096 static struct i2c_adapter vt596_adapter;
0097
0098 #define FEATURE_I2CBLOCK (1<<0)
0099 static unsigned int vt596_features;
0100
0101 #ifdef DEBUG
0102 static void vt596_dump_regs(const char *msg, u8 size)
0103 {
0104 dev_dbg(&vt596_adapter.dev, "%s: STS=%02x CNT=%02x CMD=%02x ADD=%02x "
0105 "DAT=%02x,%02x\n", msg, inb_p(SMBHSTSTS), inb_p(SMBHSTCNT),
0106 inb_p(SMBHSTCMD), inb_p(SMBHSTADD), inb_p(SMBHSTDAT0),
0107 inb_p(SMBHSTDAT1));
0108
0109 if (size == VT596_BLOCK_DATA
0110 || size == VT596_I2C_BLOCK_DATA) {
0111 int i;
0112
0113 dev_dbg(&vt596_adapter.dev, "BLK=");
0114 for (i = 0; i < I2C_SMBUS_BLOCK_MAX / 2; i++)
0115 printk("%02x,", inb_p(SMBBLKDAT));
0116 printk("\n");
0117 dev_dbg(&vt596_adapter.dev, " ");
0118 for (; i < I2C_SMBUS_BLOCK_MAX - 1; i++)
0119 printk("%02x,", inb_p(SMBBLKDAT));
0120 printk("%02x\n", inb_p(SMBBLKDAT));
0121 }
0122 }
0123 #else
0124 static inline void vt596_dump_regs(const char *msg, u8 size) { }
0125 #endif
0126
0127
0128 static int vt596_transaction(u8 size)
0129 {
0130 int temp;
0131 int result = 0;
0132 int timeout = 0;
0133
0134 vt596_dump_regs("Transaction (pre)", size);
0135
0136
0137 if ((temp = inb_p(SMBHSTSTS)) & 0x1F) {
0138 dev_dbg(&vt596_adapter.dev, "SMBus busy (0x%02x). "
0139 "Resetting...\n", temp);
0140
0141 outb_p(temp, SMBHSTSTS);
0142 if ((temp = inb_p(SMBHSTSTS)) & 0x1F) {
0143 dev_err(&vt596_adapter.dev, "SMBus reset failed! "
0144 "(0x%02x)\n", temp);
0145 return -EBUSY;
0146 }
0147 }
0148
0149
0150 outb_p(0x40 | size, SMBHSTCNT);
0151
0152
0153 do {
0154 msleep(1);
0155 temp = inb_p(SMBHSTSTS);
0156 } while ((temp & 0x01) && (++timeout < MAX_TIMEOUT));
0157
0158
0159 if (timeout == MAX_TIMEOUT) {
0160 result = -ETIMEDOUT;
0161 dev_err(&vt596_adapter.dev, "SMBus timeout!\n");
0162 }
0163
0164 if (temp & 0x10) {
0165 result = -EIO;
0166 dev_err(&vt596_adapter.dev, "Transaction failed (0x%02x)\n",
0167 size);
0168 }
0169
0170 if (temp & 0x08) {
0171 result = -EIO;
0172 dev_err(&vt596_adapter.dev, "SMBus collision!\n");
0173 }
0174
0175 if (temp & 0x04) {
0176 result = -ENXIO;
0177 dev_dbg(&vt596_adapter.dev, "No response\n");
0178 }
0179
0180
0181 if (temp & 0x1F)
0182 outb_p(temp, SMBHSTSTS);
0183
0184 vt596_dump_regs("Transaction (post)", size);
0185
0186 return result;
0187 }
0188
0189
0190 static s32 vt596_access(struct i2c_adapter *adap, u16 addr,
0191 unsigned short flags, char read_write, u8 command,
0192 int size, union i2c_smbus_data *data)
0193 {
0194 int i;
0195 int status;
0196
0197 switch (size) {
0198 case I2C_SMBUS_QUICK:
0199 size = VT596_QUICK;
0200 break;
0201 case I2C_SMBUS_BYTE:
0202 if (read_write == I2C_SMBUS_WRITE)
0203 outb_p(command, SMBHSTCMD);
0204 size = VT596_BYTE;
0205 break;
0206 case I2C_SMBUS_BYTE_DATA:
0207 outb_p(command, SMBHSTCMD);
0208 if (read_write == I2C_SMBUS_WRITE)
0209 outb_p(data->byte, SMBHSTDAT0);
0210 size = VT596_BYTE_DATA;
0211 break;
0212 case I2C_SMBUS_WORD_DATA:
0213 outb_p(command, SMBHSTCMD);
0214 if (read_write == I2C_SMBUS_WRITE) {
0215 outb_p(data->word & 0xff, SMBHSTDAT0);
0216 outb_p((data->word & 0xff00) >> 8, SMBHSTDAT1);
0217 }
0218 size = VT596_WORD_DATA;
0219 break;
0220 case I2C_SMBUS_PROC_CALL:
0221 outb_p(command, SMBHSTCMD);
0222 outb_p(data->word & 0xff, SMBHSTDAT0);
0223 outb_p((data->word & 0xff00) >> 8, SMBHSTDAT1);
0224 size = VT596_PROC_CALL;
0225 break;
0226 case I2C_SMBUS_I2C_BLOCK_DATA:
0227 if (!(vt596_features & FEATURE_I2CBLOCK))
0228 goto exit_unsupported;
0229 if (read_write == I2C_SMBUS_READ)
0230 outb_p(data->block[0], SMBHSTDAT0);
0231 fallthrough;
0232 case I2C_SMBUS_BLOCK_DATA:
0233 outb_p(command, SMBHSTCMD);
0234 if (read_write == I2C_SMBUS_WRITE) {
0235 u8 len = data->block[0];
0236 if (len > I2C_SMBUS_BLOCK_MAX)
0237 len = I2C_SMBUS_BLOCK_MAX;
0238 outb_p(len, SMBHSTDAT0);
0239 inb_p(SMBHSTCNT);
0240 for (i = 1; i <= len; i++)
0241 outb_p(data->block[i], SMBBLKDAT);
0242 }
0243 size = (size == I2C_SMBUS_I2C_BLOCK_DATA) ?
0244 VT596_I2C_BLOCK_DATA : VT596_BLOCK_DATA;
0245 break;
0246 default:
0247 goto exit_unsupported;
0248 }
0249
0250 outb_p(((addr & 0x7f) << 1) | read_write, SMBHSTADD);
0251
0252 status = vt596_transaction(size);
0253 if (status)
0254 return status;
0255
0256 if (size == VT596_PROC_CALL)
0257 read_write = I2C_SMBUS_READ;
0258
0259 if ((read_write == I2C_SMBUS_WRITE) || (size == VT596_QUICK))
0260 return 0;
0261
0262 switch (size) {
0263 case VT596_BYTE:
0264 case VT596_BYTE_DATA:
0265 data->byte = inb_p(SMBHSTDAT0);
0266 break;
0267 case VT596_WORD_DATA:
0268 case VT596_PROC_CALL:
0269 data->word = inb_p(SMBHSTDAT0) + (inb_p(SMBHSTDAT1) << 8);
0270 break;
0271 case VT596_I2C_BLOCK_DATA:
0272 case VT596_BLOCK_DATA:
0273 data->block[0] = inb_p(SMBHSTDAT0);
0274 if (data->block[0] > I2C_SMBUS_BLOCK_MAX)
0275 data->block[0] = I2C_SMBUS_BLOCK_MAX;
0276 inb_p(SMBHSTCNT);
0277 for (i = 1; i <= data->block[0]; i++)
0278 data->block[i] = inb_p(SMBBLKDAT);
0279 break;
0280 }
0281 return 0;
0282
0283 exit_unsupported:
0284 dev_warn(&vt596_adapter.dev, "Unsupported transaction %d\n",
0285 size);
0286 return -EOPNOTSUPP;
0287 }
0288
0289 static u32 vt596_func(struct i2c_adapter *adapter)
0290 {
0291 u32 func = I2C_FUNC_SMBUS_QUICK | I2C_FUNC_SMBUS_BYTE |
0292 I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA |
0293 I2C_SMBUS_PROC_CALL | I2C_FUNC_SMBUS_BLOCK_DATA;
0294
0295 if (vt596_features & FEATURE_I2CBLOCK)
0296 func |= I2C_FUNC_SMBUS_I2C_BLOCK;
0297 return func;
0298 }
0299
0300 static const struct i2c_algorithm smbus_algorithm = {
0301 .smbus_xfer = vt596_access,
0302 .functionality = vt596_func,
0303 };
0304
0305 static struct i2c_adapter vt596_adapter = {
0306 .owner = THIS_MODULE,
0307 .class = I2C_CLASS_HWMON | I2C_CLASS_SPD,
0308 .algo = &smbus_algorithm,
0309 };
0310
0311 static int vt596_probe(struct pci_dev *pdev,
0312 const struct pci_device_id *id)
0313 {
0314 unsigned char temp;
0315 int error;
0316
0317
0318 if (force_addr) {
0319 vt596_smba = force_addr & 0xfff0;
0320 force = 0;
0321 goto found;
0322 }
0323
0324 if ((pci_read_config_word(pdev, id->driver_data, &vt596_smba)) ||
0325 !(vt596_smba & 0x0001)) {
0326
0327 if (id->device == PCI_DEVICE_ID_VIA_82C596_3 &&
0328 !pci_read_config_word(pdev, SMBBA2, &vt596_smba) &&
0329 (vt596_smba & 0x0001)) {
0330 SMBHSTCFG = 0x84;
0331 } else {
0332
0333 dev_err(&pdev->dev, "Cannot configure "
0334 "SMBus I/O Base address\n");
0335 return -ENODEV;
0336 }
0337 }
0338
0339 vt596_smba &= 0xfff0;
0340 if (vt596_smba == 0) {
0341 dev_err(&pdev->dev, "SMBus base address "
0342 "uninitialized - upgrade BIOS or use "
0343 "force_addr=0xaddr\n");
0344 return -ENODEV;
0345 }
0346
0347 found:
0348 error = acpi_check_region(vt596_smba, 8, vt596_driver.name);
0349 if (error)
0350 return -ENODEV;
0351
0352 if (!request_region(vt596_smba, 8, vt596_driver.name)) {
0353 dev_err(&pdev->dev, "SMBus region 0x%x already in use!\n",
0354 vt596_smba);
0355 return -ENODEV;
0356 }
0357
0358 pci_read_config_byte(pdev, SMBHSTCFG, &temp);
0359
0360
0361 if (force_addr) {
0362 pci_write_config_byte(pdev, SMBHSTCFG, temp & 0xfe);
0363 pci_write_config_word(pdev, id->driver_data, vt596_smba);
0364 pci_write_config_byte(pdev, SMBHSTCFG, temp | 0x01);
0365 dev_warn(&pdev->dev, "WARNING: SMBus interface set to new "
0366 "address 0x%04x!\n", vt596_smba);
0367 } else if (!(temp & 0x01)) {
0368 if (force) {
0369
0370
0371
0372
0373
0374
0375 pci_write_config_byte(pdev, SMBHSTCFG, temp | 0x01);
0376 dev_info(&pdev->dev, "Enabling SMBus device\n");
0377 } else {
0378 dev_err(&pdev->dev, "SMBUS: Error: Host SMBus "
0379 "controller not enabled! - upgrade BIOS or "
0380 "use force=1\n");
0381 error = -ENODEV;
0382 goto release_region;
0383 }
0384 }
0385
0386 dev_dbg(&pdev->dev, "VT596_smba = 0x%X\n", vt596_smba);
0387
0388 switch (pdev->device) {
0389 case PCI_DEVICE_ID_VIA_CX700:
0390 case PCI_DEVICE_ID_VIA_VX800:
0391 case PCI_DEVICE_ID_VIA_VX855:
0392 case PCI_DEVICE_ID_VIA_VX900:
0393 case PCI_DEVICE_ID_VIA_8251:
0394 case PCI_DEVICE_ID_VIA_8237:
0395 case PCI_DEVICE_ID_VIA_8237A:
0396 case PCI_DEVICE_ID_VIA_8237S:
0397 case PCI_DEVICE_ID_VIA_8235:
0398 case PCI_DEVICE_ID_VIA_8233A:
0399 case PCI_DEVICE_ID_VIA_8233_0:
0400 vt596_features |= FEATURE_I2CBLOCK;
0401 break;
0402 case PCI_DEVICE_ID_VIA_82C686_4:
0403
0404
0405 if (pdev->revision >= 0x40)
0406 vt596_features |= FEATURE_I2CBLOCK;
0407 break;
0408 }
0409
0410 vt596_adapter.dev.parent = &pdev->dev;
0411 snprintf(vt596_adapter.name, sizeof(vt596_adapter.name),
0412 "SMBus Via Pro adapter at %04x", vt596_smba);
0413
0414 vt596_pdev = pci_dev_get(pdev);
0415 error = i2c_add_adapter(&vt596_adapter);
0416 if (error) {
0417 pci_dev_put(vt596_pdev);
0418 vt596_pdev = NULL;
0419 goto release_region;
0420 }
0421
0422
0423
0424
0425
0426 return -ENODEV;
0427
0428 release_region:
0429 release_region(vt596_smba, 8);
0430 return error;
0431 }
0432
0433 static const struct pci_device_id vt596_ids[] = {
0434 { PCI_DEVICE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C596_3),
0435 .driver_data = SMBBA1 },
0436 { PCI_DEVICE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C596B_3),
0437 .driver_data = SMBBA1 },
0438 { PCI_DEVICE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C686_4),
0439 .driver_data = SMBBA1 },
0440 { PCI_DEVICE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8233_0),
0441 .driver_data = SMBBA3 },
0442 { PCI_DEVICE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8233A),
0443 .driver_data = SMBBA3 },
0444 { PCI_DEVICE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8235),
0445 .driver_data = SMBBA3 },
0446 { PCI_DEVICE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8237),
0447 .driver_data = SMBBA3 },
0448 { PCI_DEVICE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8237A),
0449 .driver_data = SMBBA3 },
0450 { PCI_DEVICE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8237S),
0451 .driver_data = SMBBA3 },
0452 { PCI_DEVICE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8231_4),
0453 .driver_data = SMBBA1 },
0454 { PCI_DEVICE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8251),
0455 .driver_data = SMBBA3 },
0456 { PCI_DEVICE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_CX700),
0457 .driver_data = SMBBA3 },
0458 { PCI_DEVICE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_VX800),
0459 .driver_data = SMBBA3 },
0460 { PCI_DEVICE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_VX855),
0461 .driver_data = SMBBA3 },
0462 { PCI_DEVICE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_VX900),
0463 .driver_data = SMBBA3 },
0464 { 0, }
0465 };
0466
0467 MODULE_DEVICE_TABLE(pci, vt596_ids);
0468
0469 static struct pci_driver vt596_driver = {
0470 .name = "vt596_smbus",
0471 .id_table = vt596_ids,
0472 .probe = vt596_probe,
0473 };
0474
0475 static int __init i2c_vt596_init(void)
0476 {
0477 return pci_register_driver(&vt596_driver);
0478 }
0479
0480
0481 static void __exit i2c_vt596_exit(void)
0482 {
0483 pci_unregister_driver(&vt596_driver);
0484 if (vt596_pdev != NULL) {
0485 i2c_del_adapter(&vt596_adapter);
0486 release_region(vt596_smba, 8);
0487 pci_dev_put(vt596_pdev);
0488 vt596_pdev = NULL;
0489 }
0490 }
0491
0492 MODULE_AUTHOR("Kyosti Malkki <kmalkki@cc.hut.fi>");
0493 MODULE_AUTHOR("Mark D. Studebaker <mdsxyz123@yahoo.com>");
0494 MODULE_AUTHOR("Jean Delvare <jdelvare@suse.de>");
0495 MODULE_DESCRIPTION("vt82c596 SMBus driver");
0496 MODULE_LICENSE("GPL");
0497
0498 module_init(i2c_vt596_init);
0499 module_exit(i2c_vt596_exit);