mirror of
https://github.com/lm-sensors/lm-sensors
synced 2025-09-01 23:05:25 +00:00
backport from kernel 2.5.54 which contained changes from
Christoph Hellwig <hch@lst.de> and Pavel <pavel@ucw.cz>; Leave in 3 things: refcounts, init printk, and compile #error if i2c is too old. git-svn-id: http://lm-sensors.org/svn/lm-sensors/trunk@1693 7894878c-1315-0410-8ee3-d5d059ff63e0
This commit is contained in:
@@ -25,55 +25,7 @@
|
|||||||
#error Your i2c is too old - i2c-2.7.0 or greater required!
|
#error Your i2c is too old - i2c-2.7.0 or greater required!
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0)
|
|
||||||
#include <linux/kcomp.h>
|
|
||||||
#define MAX_PCI_DEVS 8
|
|
||||||
static struct pci_dev *amd8111_devs[MAX_PCI_DEVS] = { NULL, /* ... */ };
|
|
||||||
static void *amd8111_drvdata[MAX_PCI_DEVS];
|
|
||||||
static int amd8111_devcnt = 0;
|
|
||||||
|
|
||||||
#define min_t(t, x, y) (((x)<(y))?(x):(y))
|
|
||||||
#define __devinit
|
|
||||||
#define __devexit
|
|
||||||
#define __devinitdata
|
|
||||||
#define __devexit_p(x) x
|
|
||||||
struct pci_device_id {
|
|
||||||
unsigned int vendor, device;
|
|
||||||
unsigned int subvendor, subdevice;
|
|
||||||
unsigned int class, class_mask;
|
|
||||||
unsigned long driver_data;
|
|
||||||
};
|
|
||||||
struct pci_driver {
|
|
||||||
struct list_head node;
|
|
||||||
char *name;
|
|
||||||
const struct pci_device_id *id_table;
|
|
||||||
int (*probe)(struct pci_dev *dev, const struct pci_device_id *id);
|
|
||||||
void (*remove)(struct pci_dev *dev);
|
|
||||||
};
|
|
||||||
#define PCI_ANY_ID 0xffff
|
|
||||||
|
|
||||||
static void *pci_get_drvdata(struct pci_dev *dev)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
for (i = 0; i < amd8111_devcnt; i++)
|
|
||||||
if (amd8111_devs[i] == dev)
|
|
||||||
return amd8111_drvdata[i];
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void pci_set_drvdata(struct pci_dev *dev, void *driver_data)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
for (i = 0; i < amd8111_devcnt; i++)
|
|
||||||
if (amd8111_devs[i] == dev)
|
|
||||||
amd8111_drvdata[i] = driver_data;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef MODULE_LICENSE
|
|
||||||
MODULE_LICENSE("GPL");
|
MODULE_LICENSE("GPL");
|
||||||
#endif
|
|
||||||
MODULE_AUTHOR ("Vojtech Pavlik <vojtech@suse.cz>");
|
MODULE_AUTHOR ("Vojtech Pavlik <vojtech@suse.cz>");
|
||||||
MODULE_DESCRIPTION("AMD8111 SMBus 2.0 driver");
|
MODULE_DESCRIPTION("AMD8111 SMBus 2.0 driver");
|
||||||
|
|
||||||
@@ -400,7 +352,7 @@ static int __devinit amd8111_probe(struct pci_dev *dev, const struct pci_device_
|
|||||||
if (~pci_resource_flags(dev, 0) & IORESOURCE_IO)
|
if (~pci_resource_flags(dev, 0) & IORESOURCE_IO)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (!(smbus = kmalloc(sizeof(struct amd_smbus), GFP_KERNEL)))
|
if (!(smbus = (void*)kmalloc(sizeof(struct amd_smbus), GFP_KERNEL)))
|
||||||
return -1;
|
return -1;
|
||||||
memset(smbus, 0, sizeof(struct amd_smbus));
|
memset(smbus, 0, sizeof(struct amd_smbus));
|
||||||
|
|
||||||
@@ -409,18 +361,10 @@ static int __devinit amd8111_probe(struct pci_dev *dev, const struct pci_device_
|
|||||||
smbus->base = pci_resource_start(dev, 0);
|
smbus->base = pci_resource_start(dev, 0);
|
||||||
smbus->size = pci_resource_len(dev, 0);
|
smbus->size = pci_resource_len(dev, 0);
|
||||||
|
|
||||||
#if LINUX_VERSION_CODE > KERNEL_VERSION(2,3,14)
|
|
||||||
if (!request_region(smbus->base, smbus->size, "amd8111 SMBus 2.0")) {
|
if (!request_region(smbus->base, smbus->size, "amd8111 SMBus 2.0")) {
|
||||||
kfree(smbus);
|
kfree(smbus);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
if (check_region(smbus->base, smbus->size) < 0) {
|
|
||||||
kfree(smbus);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
request_region(smbus->base, smbus->size, "amd8111 SMBus 2.0");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
sprintf(smbus->adapter.name, "SMBus2 AMD8111 adapter at %04x", smbus->base);
|
sprintf(smbus->adapter.name, "SMBus2 AMD8111 adapter at %04x", smbus->base);
|
||||||
smbus->adapter.id = I2C_ALGO_SMBUS | I2C_HW_SMBUS_AMD8111;
|
smbus->adapter.id = I2C_ALGO_SMBUS | I2C_HW_SMBUS_AMD8111;
|
||||||
@@ -438,17 +382,13 @@ static int __devinit amd8111_probe(struct pci_dev *dev, const struct pci_device_
|
|||||||
|
|
||||||
pci_write_config_dword(smbus->dev, AMD_PCI_MISC, 0);
|
pci_write_config_dword(smbus->dev, AMD_PCI_MISC, 0);
|
||||||
|
|
||||||
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0)
|
|
||||||
printk(KERN_INFO "i2c-amd8111.c: AMD8111 SMBus 2.0 adapter at %#x\n", smbus->base);
|
printk(KERN_INFO "i2c-amd8111.c: AMD8111 SMBus 2.0 adapter at %#x\n", smbus->base);
|
||||||
#else
|
|
||||||
printk(KERN_INFO "i2c-amd8111.c: AMD8111 SMBus 2.0 adapter at pci%s\n", dev->slot_name);
|
|
||||||
#endif
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __devexit amd8111_remove(struct pci_dev *dev)
|
static void __devexit amd8111_remove(struct pci_dev *dev)
|
||||||
{
|
{
|
||||||
struct amd_smbus *smbus = pci_get_drvdata(dev);
|
struct amd_smbus *smbus = (void*) pci_get_drvdata(dev);
|
||||||
if (i2c_del_adapter(&smbus->adapter)) {
|
if (i2c_del_adapter(&smbus->adapter)) {
|
||||||
printk(KERN_WARNING "i2c-amd8111.c: Failed to unregister adapter.\n");
|
printk(KERN_WARNING "i2c-amd8111.c: Failed to unregister adapter.\n");
|
||||||
return;
|
return;
|
||||||
@@ -461,37 +401,6 @@ static struct pci_device_id amd8111_id_table[] __devinitdata =
|
|||||||
{{ 0x1022, 0x746a, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
|
{{ 0x1022, 0x746a, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
|
||||||
{ 0 }};
|
{ 0 }};
|
||||||
|
|
||||||
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0)
|
|
||||||
|
|
||||||
int i2c_amd8111_init(void)
|
|
||||||
{
|
|
||||||
struct pci_dev *pci;
|
|
||||||
struct pci_device_id *id;
|
|
||||||
int found = 0;
|
|
||||||
|
|
||||||
for (id = amd8111_id_table; id->vendor; id++) {
|
|
||||||
pci = NULL;
|
|
||||||
while ((pci = pci_find_device(id->vendor, id->device, pci)))
|
|
||||||
if (amd8111_devcnt < 8 && !amd8111_probe(pci, id))
|
|
||||||
amd8111_devs[amd8111_devcnt++] = pci;
|
|
||||||
}
|
|
||||||
|
|
||||||
return found ? 0 : -ENODEV;
|
|
||||||
}
|
|
||||||
|
|
||||||
int __init amd8111_init(void)
|
|
||||||
{
|
|
||||||
return i2c_amd8111_init();
|
|
||||||
}
|
|
||||||
|
|
||||||
void __exit amd8111_exit(void)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
for (i = 0; i < amd8111_devcnt; i++)
|
|
||||||
amd8111_remove(amd8111_devs[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
static struct pci_driver amd8111_driver = {
|
static struct pci_driver amd8111_driver = {
|
||||||
.name = "amd8111 smbus 2.0",
|
.name = "amd8111 smbus 2.0",
|
||||||
@@ -502,6 +411,7 @@ static struct pci_driver amd8111_driver = {
|
|||||||
|
|
||||||
int __init amd8111_init(void)
|
int __init amd8111_init(void)
|
||||||
{
|
{
|
||||||
|
printk(KERN_INFO "i2c-amd8111.o version %s (%s)\n", LM_VERSION, LM_DATE);
|
||||||
return pci_module_init(&amd8111_driver);
|
return pci_module_init(&amd8111_driver);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -510,11 +420,5 @@ void __exit amd8111_exit(void)
|
|||||||
pci_unregister_driver(&amd8111_driver);
|
pci_unregister_driver(&amd8111_driver);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
MODULE_DEVICE_TABLE(pci, amd8111_id_table);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
module_init(amd8111_init);
|
module_init(amd8111_init);
|
||||||
module_exit(amd8111_exit);
|
module_exit(amd8111_exit);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user