mirror of
https://github.com/lm-sensors/lm-sensors.git
synced 2026-11-13 17:00:15 +00:00
i2c-ali1563: Fix device initialization (backported from Linux 2.6)
The i2c-ali1563 initialization looks quite broken to me: * If the I/O space isn't enabled, we forcibly set 3 bits in the PCI configuration space instead of just the one enabling the I/O space. * After that we pretend to check if the write worked, but we don't actually read the new value from the register. * It's probably not a good idea to enable the I/O space if no base address has been set. So I propose the following changes to that part of the driver: * Merge ali1563_enable() into ali1563_setup(). * Check the base address before the I/O space enabled bit. git-svn-id: http://lm-sensors.org/svn/lm-sensors/trunk@4324 7894878c-1315-0410-8ee3-d5d059ff63e0
This commit is contained in:
1 parent
529b3a0d08
commit
567c1e3e3a
2 files changed
+19
-23
No files matched your search
@@ -5,6 +5,7 @@ SVN HEAD
|
||||
Man page i2cdetect.8: Scanning range can be restricted
|
||||
Module bmcsensors: Fix debugging messages
|
||||
Module i2c-ali1563: Improve the status messages (2.6 backport)
|
||||
Fix device initialization (2.6 backport)
|
||||
Module i2c-amd8111: Cleanups (2.6 backport)
|
||||
Fix initialization race (2.6 backport)
|
||||
Module i2c-nforce2: Drop unused reference to pci_dev (2.6 backport)
|
||||
|
||||
+18
-23
@@ -326,35 +326,12 @@ static u32 ali1563_func(struct i2c_adapter * a)
|
||||
}
|
||||
|
||||
|
||||
static void ali1563_enable(struct pci_dev * dev)
|
||||
{
|
||||
u16 ctrl;
|
||||
|
||||
pci_read_config_word(dev,ALI1563_SMBBA,&ctrl);
|
||||
ctrl |= 0x7;
|
||||
pci_write_config_word(dev,ALI1563_SMBBA,ctrl);
|
||||
}
|
||||
|
||||
static int __devinit ali1563_setup(struct pci_dev * dev)
|
||||
{
|
||||
u16 ctrl;
|
||||
|
||||
pci_read_config_word(dev,ALI1563_SMBBA,&ctrl);
|
||||
|
||||
/* Check if device is even enabled first */
|
||||
if (!(ctrl & ALI1563_SMB_IOEN)) {
|
||||
printk(KERN_WARNING "ali1563: I/O space not enabled, trying manually\n");
|
||||
ali1563_enable(dev);
|
||||
}
|
||||
if (!(ctrl & ALI1563_SMB_IOEN)) {
|
||||
printk(KERN_WARNING "ali1563: I/O space still not enabled, giving up\n");
|
||||
goto Err;
|
||||
}
|
||||
if (!(ctrl & ALI1563_SMB_HOSTEN)) {
|
||||
printk(KERN_WARNING "ali1563: Host Controller not enabled\n");
|
||||
goto Err;
|
||||
}
|
||||
|
||||
/* SMB I/O Base in high 12 bits and must be aligned with the
|
||||
* size of the I/O space. */
|
||||
ali1563_smba = ctrl & ~(ALI1563_SMB_IOSIZE - 1);
|
||||
@@ -362,6 +339,24 @@ static int __devinit ali1563_setup(struct pci_dev * dev)
|
||||
printk(KERN_WARNING "ali1563: ali1563_smba Uninitialized\n");
|
||||
goto Err;
|
||||
}
|
||||
|
||||
/* Check if device is enabled */
|
||||
if (!(ctrl & ALI1563_SMB_HOSTEN)) {
|
||||
printk(KERN_WARNING "ali1563: Host Controller not enabled\n");
|
||||
goto Err;
|
||||
}
|
||||
if (!(ctrl & ALI1563_SMB_IOEN)) {
|
||||
printk(KERN_WARNING "I/O space not enabled, trying manually\n");
|
||||
pci_write_config_word(dev, ALI1563_SMBBA,
|
||||
ctrl | ALI1563_SMB_IOEN);
|
||||
pci_read_config_word(dev, ALI1563_SMBBA, &ctrl);
|
||||
if (!(ctrl & ALI1563_SMB_IOEN)) {
|
||||
printk(KERN_WARNING "I/O space still not enabled, "
|
||||
"giving up\n");
|
||||
goto Err;
|
||||
}
|
||||
}
|
||||
|
||||
if (!request_region(ali1563_smba, ALI1563_SMB_IOSIZE,
|
||||
ali1563_pci_driver.name)) {
|
||||
printk(KERN_WARNING "ali1563: Could not allocate I/O space "
|
||||
|
||||
Reference in new issue
Block a user