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

Commit b8fdaf5a authored by Darrick J. Wong's avatar Darrick J. Wong Committed by Linus Torvalds
Browse files

i5k_amb: support Intel 5400 chipset



Minor rework to support the Intel 5400 chipset.

Signed-off-by: default avatarDarrick J. Wong <djwong@us.ibm.com>
Cc: "Mark M. Hoffman" <mhoffman@lightlink.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent ca68d0ac
Loading
Loading
Loading
Loading
+34 −5
Original line number Diff line number Diff line
@@ -111,6 +111,7 @@ struct i5k_amb_data {
	void __iomem *amb_mmio;
	struct i5k_device_attribute *attrs;
	unsigned int num_attrs;
	unsigned long chipset_id;
};

static ssize_t show_name(struct device *dev, struct device_attribute *devattr,
@@ -382,7 +383,8 @@ static int __devinit i5k_amb_add(void)
	return res;
}

static int __devinit i5k_find_amb_registers(struct i5k_amb_data *data)
static int __devinit i5k_find_amb_registers(struct i5k_amb_data *data,
					    unsigned long devid)
{
	struct pci_dev *pcidev;
	u32 val32;
@@ -390,7 +392,7 @@ static int __devinit i5k_find_amb_registers(struct i5k_amb_data *data)

	/* Find AMB register memory space */
	pcidev = pci_get_device(PCI_VENDOR_ID_INTEL,
				PCI_DEVICE_ID_INTEL_5000_ERR,
				devid,
				NULL);
	if (!pcidev)
		return -ENODEV;
@@ -409,6 +411,8 @@ static int __devinit i5k_find_amb_registers(struct i5k_amb_data *data)
		goto out;
	}

	data->chipset_id = devid;

	res = 0;
out:
	pci_dev_put(pcidev);
@@ -441,10 +445,30 @@ static int __devinit i5k_channel_probe(u16 *amb_present, unsigned long dev_id)
	return res;
}

static unsigned long i5k_channel_pci_id(struct i5k_amb_data *data,
					unsigned long channel)
{
	switch (data->chipset_id) {
	case PCI_DEVICE_ID_INTEL_5000_ERR:
		return PCI_DEVICE_ID_INTEL_5000_FBD0 + channel;
	case PCI_DEVICE_ID_INTEL_5400_ERR:
		return PCI_DEVICE_ID_INTEL_5400_FBD0 + channel;
	default:
		BUG();
	}
}

static unsigned long chipset_ids[] = {
	PCI_DEVICE_ID_INTEL_5000_ERR,
	PCI_DEVICE_ID_INTEL_5400_ERR,
	0
};

static int __devinit i5k_amb_probe(struct platform_device *pdev)
{
	struct i5k_amb_data *data;
	struct resource *reso;
	int i;
	int res = -ENODEV;

	data = kzalloc(sizeof(*data), GFP_KERNEL);
@@ -452,19 +476,24 @@ static int __devinit i5k_amb_probe(struct platform_device *pdev)
		return -ENOMEM;

	/* Figure out where the AMB registers live */
	res = i5k_find_amb_registers(data);
	i = 0;
	do {
		res = i5k_find_amb_registers(data, chipset_ids[i]);
		i++;
	} while (res && chipset_ids[i]);

	if (res)
		goto err;

	/* Copy the DIMM presence map for the first two channels */
	res = i5k_channel_probe(&data->amb_present[0],
				PCI_DEVICE_ID_INTEL_5000_FBD0);
				i5k_channel_pci_id(data, 0));
	if (res)
		goto err;

	/* Copy the DIMM presence map for the optional second two channels */
	i5k_channel_probe(&data->amb_present[2],
			  PCI_DEVICE_ID_INTEL_5000_FBD1);
			  i5k_channel_pci_id(data, 1));

	/* Set up resource regions */
	reso = request_mem_region(data->amb_base, data->amb_len, DRVNAME);
+3 −0
Original line number Diff line number Diff line
@@ -2383,6 +2383,9 @@
#define PCI_DEVICE_ID_INTEL_ICH10_4	0x3a30
#define PCI_DEVICE_ID_INTEL_ICH10_5	0x3a60
#define PCI_DEVICE_ID_INTEL_IOAT_SNB	0x402f
#define PCI_DEVICE_ID_INTEL_5400_ERR	0x4030
#define PCI_DEVICE_ID_INTEL_5400_FBD0	0x4035
#define PCI_DEVICE_ID_INTEL_5400_FBD1	0x4036
#define PCI_DEVICE_ID_INTEL_IOAT_SCNB	0x65ff
#define PCI_DEVICE_ID_INTEL_TOLAPAI_0	0x5031
#define PCI_DEVICE_ID_INTEL_TOLAPAI_1	0x5032