diff options
Diffstat (limited to 'drivers/i2c/busses/i2c-i801.c')
-rw-r--r-- | drivers/i2c/busses/i2c-i801.c | 35 |
1 files changed, 7 insertions, 28 deletions
diff --git a/drivers/i2c/busses/i2c-i801.c b/drivers/i2c/busses/i2c-i801.c index 4396dc91d5f5..0d5374cce9cc 100644 --- a/drivers/i2c/busses/i2c-i801.c +++ b/drivers/i2c/busses/i2c-i801.c | |||
@@ -92,15 +92,6 @@ | |||
92 | #define I801_START 0x40 | 92 | #define I801_START 0x40 |
93 | #define I801_PEC_EN 0x80 /* ICH4 only */ | 93 | #define I801_PEC_EN 0x80 /* ICH4 only */ |
94 | 94 | ||
95 | /* insmod parameters */ | ||
96 | |||
97 | /* If force_addr is set to anything different from 0, we forcibly enable | ||
98 | the I801 at the given address. VERY DANGEROUS! */ | ||
99 | static u16 force_addr; | ||
100 | module_param(force_addr, ushort, 0); | ||
101 | MODULE_PARM_DESC(force_addr, | ||
102 | "Forcibly enable the I801 at the given address. " | ||
103 | "EXTREMELY DANGEROUS!"); | ||
104 | 95 | ||
105 | static int i801_transaction(void); | 96 | static int i801_transaction(void); |
106 | static int i801_block_transaction(union i2c_smbus_data *data, char read_write, | 97 | static int i801_block_transaction(union i2c_smbus_data *data, char read_write, |
@@ -129,16 +120,12 @@ static int i801_setup(struct pci_dev *dev) | |||
129 | isich4 = 0; | 120 | isich4 = 0; |
130 | 121 | ||
131 | /* Determine the address of the SMBus areas */ | 122 | /* Determine the address of the SMBus areas */ |
132 | if (force_addr) { | 123 | pci_read_config_word(I801_dev, SMBBA, &i801_smba); |
133 | i801_smba = force_addr & 0xfff0; | 124 | i801_smba &= 0xfff0; |
134 | } else { | 125 | if (!i801_smba) { |
135 | pci_read_config_word(I801_dev, SMBBA, &i801_smba); | 126 | dev_err(&dev->dev, "SMBus base address uninitialized, " |
136 | i801_smba &= 0xfff0; | 127 | "upgrade BIOS\n"); |
137 | if(i801_smba == 0) { | 128 | return -ENODEV; |
138 | dev_err(&dev->dev, "SMB base address uninitialized " | ||
139 | "- upgrade BIOS or use force_addr=0xaddr\n"); | ||
140 | return -ENODEV; | ||
141 | } | ||
142 | } | 129 | } |
143 | 130 | ||
144 | if (!request_region(i801_smba, (isich4 ? 16 : 8), i801_driver.name)) { | 131 | if (!request_region(i801_smba, (isich4 ? 16 : 8), i801_driver.name)) { |
@@ -152,15 +139,7 @@ static int i801_setup(struct pci_dev *dev) | |||
152 | temp &= ~SMBHSTCFG_I2C_EN; /* SMBus timing */ | 139 | temp &= ~SMBHSTCFG_I2C_EN; /* SMBus timing */ |
153 | pci_write_config_byte(I801_dev, SMBHSTCFG, temp); | 140 | pci_write_config_byte(I801_dev, SMBHSTCFG, temp); |
154 | 141 | ||
155 | /* If force_addr is set, we program the new address here. Just to make | 142 | if (!(temp & 1)) { |
156 | sure, we disable the device first. */ | ||
157 | if (force_addr) { | ||
158 | pci_write_config_byte(I801_dev, SMBHSTCFG, temp & 0xfe); | ||
159 | pci_write_config_word(I801_dev, SMBBA, i801_smba); | ||
160 | pci_write_config_byte(I801_dev, SMBHSTCFG, temp | 0x01); | ||
161 | dev_warn(&dev->dev, "WARNING: I801 SMBus interface set to " | ||
162 | "new address %04x!\n", i801_smba); | ||
163 | } else if ((temp & 1) == 0) { | ||
164 | pci_write_config_byte(I801_dev, SMBHSTCFG, temp | 1); | 143 | pci_write_config_byte(I801_dev, SMBHSTCFG, temp | 1); |
165 | dev_warn(&dev->dev, "enabling SMBus device\n"); | 144 | dev_warn(&dev->dev, "enabling SMBus device\n"); |
166 | } | 145 | } |