Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5c7ae658 authored by Jean Delvare's avatar Jean Delvare Committed by Greg Kroah-Hartman
Browse files

[PATCH] I2C: i2c-nforce2: Add support for the nForce4 MCP51 and MCP55



Add support for the new nForce4 MCP51 (also known as nForce 410 or
430) and nForce4 MCP55 to the i2c-nforce2 driver. Some code changes
were required because the base I/O address registers have changed in
these versions. Standard BARs are now being used, while the original
nForce2 chips used non-standard ones.

Signed-off-by: default avatarJean Delvare <khali@linux-fr.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent f9ba6c04
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -7,6 +7,8 @@ Supported adapters:
  * nForce3 250Gb MCP          10de:00E4 
  * nForce4 MCP                10de:0052
  * nForce4 MCP-04             10de:0034
  * nForce4 MCP51              10de:0264
  * nForce4 MCP55              10de:0368

Datasheet: not publically available, but seems to be similar to the
           AMD-8111 SMBus 2.0 adapter.
+27 −11
Original line number Diff line number Diff line
@@ -31,6 +31,8 @@
    nForce3 250Gb MCP		00E4
    nForce4 MCP			0052
    nForce4 MCP-04		0034
    nForce4 MCP51		0264
    nForce4 MCP55		0368

    This driver supports the 2 SMBuses that are included in the MCP of the
    nForce2/3/4 chipsets.
@@ -64,6 +66,7 @@ struct nforce2_smbus {

/*
 * nVidia nForce2 SMBus control register definitions
 * (Newer incarnations use standard BARs 4 and 5 instead)
 */
#define NFORCE_PCI_SMB1	0x50
#define NFORCE_PCI_SMB2	0x54
@@ -259,6 +262,8 @@ static struct pci_device_id nforce2_ids[] = {
	{ PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE3S_SMBUS) },
	{ PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE4_SMBUS) },
	{ PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP04_SMBUS) },
	{ PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_SMBUS) },
	{ PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP55_SMBUS) },
	{ 0 }
};

@@ -266,19 +271,29 @@ static struct pci_device_id nforce2_ids[] = {
MODULE_DEVICE_TABLE (pci, nforce2_ids);


static int __devinit nforce2_probe_smb (struct pci_dev *dev, int reg,
	struct nforce2_smbus *smbus, char *name)
static int __devinit nforce2_probe_smb (struct pci_dev *dev, int bar,
	int alt_reg, struct nforce2_smbus *smbus, const char *name)
{
	u16 iobase;
	int error;

	if (pci_read_config_word(dev, reg, &iobase) != PCIBIOS_SUCCESSFUL) {
		dev_err(&smbus->adapter.dev, "Error reading PCI config for %s\n", name);
	smbus->base = pci_resource_start(dev, bar);
	if (smbus->base) {
		smbus->size = pci_resource_len(dev, bar);
	} else {
		/* Older incarnations of the device used non-standard BARs */
		u16 iobase;

		if (pci_read_config_word(dev, alt_reg, &iobase)
		    != PCIBIOS_SUCCESSFUL) {
			dev_err(&dev->dev, "Error reading PCI config for %s\n",
				name);
			return -1;
		}
	smbus->dev  = dev;
	smbus->base = iobase & 0xfffc;

		smbus->base = iobase & PCI_BASE_ADDRESS_IO_MASK;
		smbus->size = 8;
	}
	smbus->dev = dev;

	if (!request_region(smbus->base, smbus->size, nforce2_driver.name)) {
		dev_err(&smbus->adapter.dev, "Error requesting region %02x .. %02X for %s\n",
@@ -313,12 +328,13 @@ static int __devinit nforce2_probe(struct pci_dev *dev, const struct pci_device_
	pci_set_drvdata(dev, smbuses);

	/* SMBus adapter 1 */
	res1 = nforce2_probe_smb (dev, NFORCE_PCI_SMB1, &smbuses[0], "SMB1");
	res1 = nforce2_probe_smb(dev, 4, NFORCE_PCI_SMB1, &smbuses[0], "SMB1");
	if (res1 < 0) {
		dev_err(&dev->dev, "Error probing SMB1.\n");
		smbuses[0].base = 0;	/* to have a check value */
	}
	res2 = nforce2_probe_smb (dev, NFORCE_PCI_SMB2, &smbuses[1], "SMB2");
	/* SMBus adapter 2 */
	res2 = nforce2_probe_smb(dev, 5, NFORCE_PCI_SMB2, &smbuses[1], "SMB2");
	if (res2 < 0) {
		dev_err(&dev->dev, "Error probing SMB2.\n");
		smbuses[1].base = 0;	/* to have a check value */
+2 −0
Original line number Diff line number Diff line
@@ -1130,9 +1130,11 @@
#define PCI_DEVICE_ID_NVIDIA_QUADRO4_900XGL	0x0258
#define PCI_DEVICE_ID_NVIDIA_QUADRO4_750XGL	0x0259
#define PCI_DEVICE_ID_NVIDIA_QUADRO4_700XGL	0x025B
#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_SMBUS	0x0264
#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_IDE	0x0265
#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_SATA	0x0266
#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_SATA2	0x0267
#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP55_SMBUS	0x0368
#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP55_IDE	0x036E
#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP55_SATA	0x037E
#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP55_SATA2	0x037F