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
0034
0035
0036
0037 #include <linux/module.h>
0038 #include <linux/pci.h>
0039 #include <linux/kernel.h>
0040 #include <linux/stddef.h>
0041 #include <linux/ioport.h>
0042 #include <linux/i2c.h>
0043 #include <linux/delay.h>
0044 #include <linux/dmi.h>
0045 #include <linux/acpi.h>
0046 #include <linux/slab.h>
0047 #include <linux/io.h>
0048
0049 MODULE_LICENSE("GPL");
0050 MODULE_AUTHOR("Hans-Frieder Vogt <hfvogt@gmx.net>");
0051 MODULE_DESCRIPTION("nForce2/3/4/5xx SMBus driver");
0052
0053
0054 struct nforce2_smbus {
0055 struct i2c_adapter adapter;
0056 int base;
0057 int size;
0058 int blockops;
0059 int can_abort;
0060 };
0061
0062
0063
0064
0065
0066
0067 #define NFORCE_PCI_SMB1 0x50
0068 #define NFORCE_PCI_SMB2 0x54
0069
0070
0071
0072
0073
0074 #define NVIDIA_SMB_PRTCL (smbus->base + 0x00)
0075 #define NVIDIA_SMB_STS (smbus->base + 0x01)
0076 #define NVIDIA_SMB_ADDR (smbus->base + 0x02)
0077 #define NVIDIA_SMB_CMD (smbus->base + 0x03)
0078 #define NVIDIA_SMB_DATA (smbus->base + 0x04)
0079 #define NVIDIA_SMB_BCNT (smbus->base + 0x24)
0080
0081 #define NVIDIA_SMB_STATUS_ABRT (smbus->base + 0x3c)
0082
0083
0084 #define NVIDIA_SMB_CTRL (smbus->base + 0x3e)
0085
0086 #define NVIDIA_SMB_STATUS_ABRT_STS 0x01
0087
0088 #define NVIDIA_SMB_CTRL_ABORT 0x20
0089 #define NVIDIA_SMB_STS_DONE 0x80
0090 #define NVIDIA_SMB_STS_ALRM 0x40
0091 #define NVIDIA_SMB_STS_RES 0x20
0092 #define NVIDIA_SMB_STS_STATUS 0x1f
0093
0094 #define NVIDIA_SMB_PRTCL_WRITE 0x00
0095 #define NVIDIA_SMB_PRTCL_READ 0x01
0096 #define NVIDIA_SMB_PRTCL_QUICK 0x02
0097 #define NVIDIA_SMB_PRTCL_BYTE 0x04
0098 #define NVIDIA_SMB_PRTCL_BYTE_DATA 0x06
0099 #define NVIDIA_SMB_PRTCL_WORD_DATA 0x08
0100 #define NVIDIA_SMB_PRTCL_BLOCK_DATA 0x0a
0101 #define NVIDIA_SMB_PRTCL_PEC 0x80
0102
0103
0104 #define MAX_TIMEOUT 100
0105
0106
0107 static const struct dmi_system_id nforce2_dmi_blacklist2[] = {
0108 {
0109 .ident = "DFI Lanparty NF4 Expert",
0110 .matches = {
0111 DMI_MATCH(DMI_BOARD_VENDOR, "DFI Corp,LTD"),
0112 DMI_MATCH(DMI_BOARD_NAME, "LP UT NF4 Expert"),
0113 },
0114 },
0115 { }
0116 };
0117
0118 static struct pci_driver nforce2_driver;
0119
0120
0121
0122 #if IS_ENABLED(CONFIG_I2C_NFORCE2_S4985)
0123 struct i2c_adapter *nforce2_smbus;
0124 EXPORT_SYMBOL_GPL(nforce2_smbus);
0125
0126 static void nforce2_set_reference(struct i2c_adapter *adap)
0127 {
0128 nforce2_smbus = adap;
0129 }
0130 #else
0131 static inline void nforce2_set_reference(struct i2c_adapter *adap) { }
0132 #endif
0133
0134 static void nforce2_abort(struct i2c_adapter *adap)
0135 {
0136 struct nforce2_smbus *smbus = adap->algo_data;
0137 int timeout = 0;
0138 unsigned char temp;
0139
0140 dev_dbg(&adap->dev, "Aborting current transaction\n");
0141
0142 outb_p(NVIDIA_SMB_CTRL_ABORT, NVIDIA_SMB_CTRL);
0143 do {
0144 msleep(1);
0145 temp = inb_p(NVIDIA_SMB_STATUS_ABRT);
0146 } while (!(temp & NVIDIA_SMB_STATUS_ABRT_STS) &&
0147 (timeout++ < MAX_TIMEOUT));
0148 if (!(temp & NVIDIA_SMB_STATUS_ABRT_STS))
0149 dev_err(&adap->dev, "Can't reset the smbus\n");
0150 outb_p(NVIDIA_SMB_STATUS_ABRT_STS, NVIDIA_SMB_STATUS_ABRT);
0151 }
0152
0153 static int nforce2_check_status(struct i2c_adapter *adap)
0154 {
0155 struct nforce2_smbus *smbus = adap->algo_data;
0156 int timeout = 0;
0157 unsigned char temp;
0158
0159 do {
0160 msleep(1);
0161 temp = inb_p(NVIDIA_SMB_STS);
0162 } while ((!temp) && (timeout++ < MAX_TIMEOUT));
0163
0164 if (timeout > MAX_TIMEOUT) {
0165 dev_dbg(&adap->dev, "SMBus Timeout!\n");
0166 if (smbus->can_abort)
0167 nforce2_abort(adap);
0168 return -ETIMEDOUT;
0169 }
0170 if (!(temp & NVIDIA_SMB_STS_DONE) || (temp & NVIDIA_SMB_STS_STATUS)) {
0171 dev_dbg(&adap->dev, "Transaction failed (0x%02x)!\n", temp);
0172 return -EIO;
0173 }
0174 return 0;
0175 }
0176
0177
0178 static s32 nforce2_access(struct i2c_adapter *adap, u16 addr,
0179 unsigned short flags, char read_write,
0180 u8 command, int size, union i2c_smbus_data *data)
0181 {
0182 struct nforce2_smbus *smbus = adap->algo_data;
0183 unsigned char protocol, pec;
0184 u8 len;
0185 int i, status;
0186
0187 protocol = (read_write == I2C_SMBUS_READ) ? NVIDIA_SMB_PRTCL_READ :
0188 NVIDIA_SMB_PRTCL_WRITE;
0189 pec = (flags & I2C_CLIENT_PEC) ? NVIDIA_SMB_PRTCL_PEC : 0;
0190
0191 switch (size) {
0192 case I2C_SMBUS_QUICK:
0193 protocol |= NVIDIA_SMB_PRTCL_QUICK;
0194 read_write = I2C_SMBUS_WRITE;
0195 break;
0196
0197 case I2C_SMBUS_BYTE:
0198 if (read_write == I2C_SMBUS_WRITE)
0199 outb_p(command, NVIDIA_SMB_CMD);
0200 protocol |= NVIDIA_SMB_PRTCL_BYTE;
0201 break;
0202
0203 case I2C_SMBUS_BYTE_DATA:
0204 outb_p(command, NVIDIA_SMB_CMD);
0205 if (read_write == I2C_SMBUS_WRITE)
0206 outb_p(data->byte, NVIDIA_SMB_DATA);
0207 protocol |= NVIDIA_SMB_PRTCL_BYTE_DATA;
0208 break;
0209
0210 case I2C_SMBUS_WORD_DATA:
0211 outb_p(command, NVIDIA_SMB_CMD);
0212 if (read_write == I2C_SMBUS_WRITE) {
0213 outb_p(data->word, NVIDIA_SMB_DATA);
0214 outb_p(data->word >> 8, NVIDIA_SMB_DATA + 1);
0215 }
0216 protocol |= NVIDIA_SMB_PRTCL_WORD_DATA | pec;
0217 break;
0218
0219 case I2C_SMBUS_BLOCK_DATA:
0220 outb_p(command, NVIDIA_SMB_CMD);
0221 if (read_write == I2C_SMBUS_WRITE) {
0222 len = data->block[0];
0223 if ((len == 0) || (len > I2C_SMBUS_BLOCK_MAX)) {
0224 dev_err(&adap->dev,
0225 "Transaction failed (requested block size: %d)\n",
0226 len);
0227 return -EINVAL;
0228 }
0229 outb_p(len, NVIDIA_SMB_BCNT);
0230 for (i = 0; i < I2C_SMBUS_BLOCK_MAX; i++)
0231 outb_p(data->block[i + 1],
0232 NVIDIA_SMB_DATA + i);
0233 }
0234 protocol |= NVIDIA_SMB_PRTCL_BLOCK_DATA | pec;
0235 break;
0236
0237 default:
0238 dev_err(&adap->dev, "Unsupported transaction %d\n", size);
0239 return -EOPNOTSUPP;
0240 }
0241
0242 outb_p((addr & 0x7f) << 1, NVIDIA_SMB_ADDR);
0243 outb_p(protocol, NVIDIA_SMB_PRTCL);
0244
0245 status = nforce2_check_status(adap);
0246 if (status)
0247 return status;
0248
0249 if (read_write == I2C_SMBUS_WRITE)
0250 return 0;
0251
0252 switch (size) {
0253 case I2C_SMBUS_BYTE:
0254 case I2C_SMBUS_BYTE_DATA:
0255 data->byte = inb_p(NVIDIA_SMB_DATA);
0256 break;
0257
0258 case I2C_SMBUS_WORD_DATA:
0259 data->word = inb_p(NVIDIA_SMB_DATA) |
0260 (inb_p(NVIDIA_SMB_DATA + 1) << 8);
0261 break;
0262
0263 case I2C_SMBUS_BLOCK_DATA:
0264 len = inb_p(NVIDIA_SMB_BCNT);
0265 if ((len <= 0) || (len > I2C_SMBUS_BLOCK_MAX)) {
0266 dev_err(&adap->dev,
0267 "Transaction failed (received block size: 0x%02x)\n",
0268 len);
0269 return -EPROTO;
0270 }
0271 for (i = 0; i < len; i++)
0272 data->block[i + 1] = inb_p(NVIDIA_SMB_DATA + i);
0273 data->block[0] = len;
0274 break;
0275 }
0276
0277 return 0;
0278 }
0279
0280
0281 static u32 nforce2_func(struct i2c_adapter *adapter)
0282 {
0283
0284 return I2C_FUNC_SMBUS_QUICK | I2C_FUNC_SMBUS_BYTE |
0285 I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA |
0286 I2C_FUNC_SMBUS_PEC |
0287 (((struct nforce2_smbus *)adapter->algo_data)->blockops ?
0288 I2C_FUNC_SMBUS_BLOCK_DATA : 0);
0289 }
0290
0291 static const struct i2c_algorithm smbus_algorithm = {
0292 .smbus_xfer = nforce2_access,
0293 .functionality = nforce2_func,
0294 };
0295
0296
0297 static const struct pci_device_id nforce2_ids[] = {
0298 { PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE2_SMBUS) },
0299 { PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE2S_SMBUS) },
0300 { PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE3_SMBUS) },
0301 { PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE3S_SMBUS) },
0302 { PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE4_SMBUS) },
0303 { PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP04_SMBUS) },
0304 { PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_SMBUS) },
0305 { PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP55_SMBUS) },
0306 { PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_SMBUS) },
0307 { PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP65_SMBUS) },
0308 { PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP67_SMBUS) },
0309 { PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP73_SMBUS) },
0310 { PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP78S_SMBUS) },
0311 { PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP79_SMBUS) },
0312 { 0 }
0313 };
0314
0315 MODULE_DEVICE_TABLE(pci, nforce2_ids);
0316
0317
0318 static int nforce2_probe_smb(struct pci_dev *dev, int bar, int alt_reg,
0319 struct nforce2_smbus *smbus, const char *name)
0320 {
0321 int error;
0322
0323 smbus->base = pci_resource_start(dev, bar);
0324 if (smbus->base) {
0325 smbus->size = pci_resource_len(dev, bar);
0326 } else {
0327
0328 u16 iobase;
0329
0330 if (pci_read_config_word(dev, alt_reg, &iobase)
0331 != PCIBIOS_SUCCESSFUL) {
0332 dev_err(&dev->dev, "Error reading PCI config for %s\n",
0333 name);
0334 return -EIO;
0335 }
0336
0337 smbus->base = iobase & PCI_BASE_ADDRESS_IO_MASK;
0338 smbus->size = 64;
0339 }
0340
0341 error = acpi_check_region(smbus->base, smbus->size,
0342 nforce2_driver.name);
0343 if (error)
0344 return error;
0345
0346 if (!request_region(smbus->base, smbus->size, nforce2_driver.name)) {
0347 dev_err(&smbus->adapter.dev, "Error requesting region %02x .. %02X for %s\n",
0348 smbus->base, smbus->base+smbus->size-1, name);
0349 return -EBUSY;
0350 }
0351 smbus->adapter.owner = THIS_MODULE;
0352 smbus->adapter.class = I2C_CLASS_HWMON | I2C_CLASS_SPD;
0353 smbus->adapter.algo = &smbus_algorithm;
0354 smbus->adapter.algo_data = smbus;
0355 smbus->adapter.dev.parent = &dev->dev;
0356 snprintf(smbus->adapter.name, sizeof(smbus->adapter.name),
0357 "SMBus nForce2 adapter at %04x", smbus->base);
0358
0359 error = i2c_add_adapter(&smbus->adapter);
0360 if (error) {
0361 release_region(smbus->base, smbus->size);
0362 return error;
0363 }
0364 dev_info(&smbus->adapter.dev, "nForce2 SMBus adapter at %#x\n",
0365 smbus->base);
0366 return 0;
0367 }
0368
0369
0370 static int nforce2_probe(struct pci_dev *dev, const struct pci_device_id *id)
0371 {
0372 struct nforce2_smbus *smbuses;
0373 int res1, res2;
0374
0375
0376 smbuses = kcalloc(2, sizeof(struct nforce2_smbus), GFP_KERNEL);
0377 if (!smbuses)
0378 return -ENOMEM;
0379 pci_set_drvdata(dev, smbuses);
0380
0381 switch (dev->device) {
0382 case PCI_DEVICE_ID_NVIDIA_NFORCE2_SMBUS:
0383 case PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_SMBUS:
0384 case PCI_DEVICE_ID_NVIDIA_NFORCE_MCP55_SMBUS:
0385 smbuses[0].blockops = 1;
0386 smbuses[1].blockops = 1;
0387 smbuses[0].can_abort = 1;
0388 smbuses[1].can_abort = 1;
0389 }
0390
0391
0392 res1 = nforce2_probe_smb(dev, 4, NFORCE_PCI_SMB1, &smbuses[0], "SMB1");
0393 if (res1 < 0)
0394 smbuses[0].base = 0;
0395
0396
0397 if (dmi_check_system(nforce2_dmi_blacklist2)) {
0398 dev_err(&dev->dev, "Disabling SMB2 for safety reasons.\n");
0399 res2 = -EPERM;
0400 smbuses[1].base = 0;
0401 } else {
0402 res2 = nforce2_probe_smb(dev, 5, NFORCE_PCI_SMB2, &smbuses[1],
0403 "SMB2");
0404 if (res2 < 0)
0405 smbuses[1].base = 0;
0406 }
0407
0408 if ((res1 < 0) && (res2 < 0)) {
0409
0410 kfree(smbuses);
0411 return -ENODEV;
0412 }
0413
0414 nforce2_set_reference(&smbuses[0].adapter);
0415 return 0;
0416 }
0417
0418
0419 static void nforce2_remove(struct pci_dev *dev)
0420 {
0421 struct nforce2_smbus *smbuses = pci_get_drvdata(dev);
0422
0423 nforce2_set_reference(NULL);
0424 if (smbuses[0].base) {
0425 i2c_del_adapter(&smbuses[0].adapter);
0426 release_region(smbuses[0].base, smbuses[0].size);
0427 }
0428 if (smbuses[1].base) {
0429 i2c_del_adapter(&smbuses[1].adapter);
0430 release_region(smbuses[1].base, smbuses[1].size);
0431 }
0432 kfree(smbuses);
0433 }
0434
0435 static struct pci_driver nforce2_driver = {
0436 .name = "nForce2_smbus",
0437 .id_table = nforce2_ids,
0438 .probe = nforce2_probe,
0439 .remove = nforce2_remove,
0440 };
0441
0442 module_pci_driver(nforce2_driver);