[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: Jean Delvare <khali@linux-fr.org> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
Родитель
f9ba6c04ef
Коммит
5c7ae65899
|
@ -7,6 +7,8 @@ Supported adapters:
|
||||||
* nForce3 250Gb MCP 10de:00E4
|
* nForce3 250Gb MCP 10de:00E4
|
||||||
* nForce4 MCP 10de:0052
|
* nForce4 MCP 10de:0052
|
||||||
* nForce4 MCP-04 10de:0034
|
* nForce4 MCP-04 10de:0034
|
||||||
|
* nForce4 MCP51 10de:0264
|
||||||
|
* nForce4 MCP55 10de:0368
|
||||||
|
|
||||||
Datasheet: not publically available, but seems to be similar to the
|
Datasheet: not publically available, but seems to be similar to the
|
||||||
AMD-8111 SMBus 2.0 adapter.
|
AMD-8111 SMBus 2.0 adapter.
|
||||||
|
|
|
@ -31,6 +31,8 @@
|
||||||
nForce3 250Gb MCP 00E4
|
nForce3 250Gb MCP 00E4
|
||||||
nForce4 MCP 0052
|
nForce4 MCP 0052
|
||||||
nForce4 MCP-04 0034
|
nForce4 MCP-04 0034
|
||||||
|
nForce4 MCP51 0264
|
||||||
|
nForce4 MCP55 0368
|
||||||
|
|
||||||
This driver supports the 2 SMBuses that are included in the MCP of the
|
This driver supports the 2 SMBuses that are included in the MCP of the
|
||||||
nForce2/3/4 chipsets.
|
nForce2/3/4 chipsets.
|
||||||
|
@ -64,6 +66,7 @@ struct nforce2_smbus {
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* nVidia nForce2 SMBus control register definitions
|
* nVidia nForce2 SMBus control register definitions
|
||||||
|
* (Newer incarnations use standard BARs 4 and 5 instead)
|
||||||
*/
|
*/
|
||||||
#define NFORCE_PCI_SMB1 0x50
|
#define NFORCE_PCI_SMB1 0x50
|
||||||
#define NFORCE_PCI_SMB2 0x54
|
#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_NFORCE3S_SMBUS) },
|
||||||
{ PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE4_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_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 }
|
{ 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -266,19 +271,29 @@ static struct pci_device_id nforce2_ids[] = {
|
||||||
MODULE_DEVICE_TABLE (pci, nforce2_ids);
|
MODULE_DEVICE_TABLE (pci, nforce2_ids);
|
||||||
|
|
||||||
|
|
||||||
static int __devinit nforce2_probe_smb (struct pci_dev *dev, int reg,
|
static int __devinit nforce2_probe_smb (struct pci_dev *dev, int bar,
|
||||||
struct nforce2_smbus *smbus, char *name)
|
int alt_reg, struct nforce2_smbus *smbus, const char *name)
|
||||||
{
|
{
|
||||||
u16 iobase;
|
|
||||||
int error;
|
int error;
|
||||||
|
|
||||||
if (pci_read_config_word(dev, reg, &iobase) != PCIBIOS_SUCCESSFUL) {
|
smbus->base = pci_resource_start(dev, bar);
|
||||||
dev_err(&smbus->adapter.dev, "Error reading PCI config for %s\n", name);
|
if (smbus->base) {
|
||||||
return -1;
|
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->base = iobase & PCI_BASE_ADDRESS_IO_MASK;
|
||||||
|
smbus->size = 8;
|
||||||
}
|
}
|
||||||
smbus->dev = dev;
|
smbus->dev = dev;
|
||||||
smbus->base = iobase & 0xfffc;
|
|
||||||
smbus->size = 8;
|
|
||||||
|
|
||||||
if (!request_region(smbus->base, smbus->size, nforce2_driver.name)) {
|
if (!request_region(smbus->base, smbus->size, nforce2_driver.name)) {
|
||||||
dev_err(&smbus->adapter.dev, "Error requesting region %02x .. %02X for %s\n",
|
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);
|
pci_set_drvdata(dev, smbuses);
|
||||||
|
|
||||||
/* SMBus adapter 1 */
|
/* 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) {
|
if (res1 < 0) {
|
||||||
dev_err(&dev->dev, "Error probing SMB1.\n");
|
dev_err(&dev->dev, "Error probing SMB1.\n");
|
||||||
smbuses[0].base = 0; /* to have a check value */
|
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) {
|
if (res2 < 0) {
|
||||||
dev_err(&dev->dev, "Error probing SMB2.\n");
|
dev_err(&dev->dev, "Error probing SMB2.\n");
|
||||||
smbuses[1].base = 0; /* to have a check value */
|
smbuses[1].base = 0; /* to have a check value */
|
||||||
|
|
|
@ -1130,9 +1130,11 @@
|
||||||
#define PCI_DEVICE_ID_NVIDIA_QUADRO4_900XGL 0x0258
|
#define PCI_DEVICE_ID_NVIDIA_QUADRO4_900XGL 0x0258
|
||||||
#define PCI_DEVICE_ID_NVIDIA_QUADRO4_750XGL 0x0259
|
#define PCI_DEVICE_ID_NVIDIA_QUADRO4_750XGL 0x0259
|
||||||
#define PCI_DEVICE_ID_NVIDIA_QUADRO4_700XGL 0x025B
|
#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_IDE 0x0265
|
||||||
#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_SATA 0x0266
|
#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_SATA 0x0266
|
||||||
#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_SATA2 0x0267
|
#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_IDE 0x036E
|
||||||
#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP55_SATA 0x037E
|
#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP55_SATA 0x037E
|
||||||
#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP55_SATA2 0x037F
|
#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP55_SATA2 0x037F
|
||||||
|
|
Загрузка…
Ссылка в новой задаче