ChangeSet 1.1179.3.4, 2003/04/23 11:33:48-07:00, hch at lst.de [PATCH] i2c: bring i2c-viapro uptodate with the style guide drivers/i2c/busses/i2c-viapro.c | 321 ++++++++++++++++++---------------------- 1 files changed, 149 insertions(+), 172 deletions(-) diff -Nru a/drivers/i2c/busses/i2c-viapro.c b/drivers/i2c/busses/i2c-viapro.c --- a/drivers/i2c/busses/i2c-viapro.c Thu Apr 24 16:47:16 2003 +++ b/drivers/i2c/busses/i2c-viapro.c Thu Apr 24 16:47:16 2003 @@ -42,23 +42,24 @@ #include <linux/init.h> #include <asm/io.h> -#define SMBBA1 0x90 -#define SMBBA2 0x80 -#define SMBBA3 0xD0 +#define SMBBA1 0x90 +#define SMBBA2 0x80 +#define SMBBA3 0xD0 /* SMBus address offsets */ -#define SMBHSTSTS (0 + vt596_smba) -#define SMBHSLVSTS (1 + vt596_smba) -#define SMBHSTCNT (2 + vt596_smba) -#define SMBHSTCMD (3 + vt596_smba) -#define SMBHSTADD (4 + vt596_smba) -#define SMBHSTDAT0 (5 + vt596_smba) -#define SMBHSTDAT1 (6 + vt596_smba) -#define SMBBLKDAT (7 + vt596_smba) -#define SMBSLVCNT (8 + vt596_smba) -#define SMBSHDWCMD (9 + vt596_smba) -#define SMBSLVEVT (0xA + vt596_smba) -#define SMBSLVDAT (0xC + vt596_smba) +static unsigned short vt596_smba; +#define SMBHSTSTS (vt596_smba + 0) +#define SMBHSLVSTS (vt596_smba + 1) +#define SMBHSTCNT (vt596_smba + 2) +#define SMBHSTCMD (vt596_smba + 3) +#define SMBHSTADD (vt596_smba + 4) +#define SMBHSTDAT0 (vt596_smba + 5) +#define SMBHSTDAT1 (vt596_smba + 6) +#define SMBBLKDAT (vt596_smba + 7) +#define SMBSLVCNT (vt596_smba + 8) +#define SMBSHDWCMD (vt596_smba + 9) +#define SMBSLVEVT (vt596_smba + 0xA) +#define SMBSLVDAT (vt596_smba + 0xC) /* PCI Address Constants */ @@ -68,14 +69,14 @@ static unsigned short smb_cf_hstcfg = 0xD2; #define SMBHSTCFG (smb_cf_hstcfg) -#define SMBSLVC (SMBHSTCFG+1) -#define SMBSHDW1 (SMBHSTCFG+2) -#define SMBSHDW2 (SMBHSTCFG+3) -#define SMBREV (SMBHSTCFG+4) +#define SMBSLVC (smb_cf_hstcfg + 1) +#define SMBSHDW1 (smb_cf_hstcfg + 2) +#define SMBSHDW2 (smb_cf_hstcfg + 3) +#define SMBREV (smb_cf_hstcfg + 4) /* Other settings */ -#define MAX_TIMEOUT 500 -#define ENABLE_INT9 0 +#define MAX_TIMEOUT 500 +#define ENABLE_INT9 0 /* VT82C596 constants */ #define VT596_QUICK 0x00 @@ -84,144 +85,33 @@ #define VT596_WORD_DATA 0x0C #define VT596_BLOCK_DATA 0x14 -/* insmod parameters */ /* If force is set to anything different from 0, we forcibly enable the VT596. DANGEROUS! */ -static int force = 0; +static int force; MODULE_PARM(force, "i"); MODULE_PARM_DESC(force, "Forcibly enable the SMBus. DANGEROUS!"); /* If force_addr is set to anything different from 0, we forcibly enable the VT596 at the given address. VERY DANGEROUS! */ -static int force_addr = 0; +static int force_addr; MODULE_PARM(force_addr, "i"); MODULE_PARM_DESC(force_addr, "Forcibly enable the SMBus at the given address. " "EXTREMELY DANGEROUS!"); -static void vt596_do_pause(unsigned int amount); -static int vt596_transaction(void); -s32 vt596_access(struct i2c_adapter * adap, u16 addr, unsigned short flags, - char read_write, u8 command, int size, union i2c_smbus_data * data); -u32 vt596_func(struct i2c_adapter *adapter); - -static struct i2c_algorithm smbus_algorithm = { - .name = "Non-I2C SMBus adapter", - .id = I2C_ALGO_SMBUS, - .smbus_xfer = vt596_access, - .functionality = vt596_func, -}; - -static struct i2c_adapter vt596_adapter = { - .owner = THIS_MODULE, - .id = I2C_ALGO_SMBUS | I2C_HW_SMBUS_VIA2, - .algo = &smbus_algorithm, - .dev = { - .name = "unset", - }, -}; - - - - -static unsigned short vt596_smba = 0; - - -/* Detect whether a compatible device can be found, and initialize it. */ -int vt596_setup(struct pci_dev *VT596_dev, struct pci_device_id const *id) -{ - unsigned char temp; - - dev_info(&VT596_dev->dev, "Found Via %s device\n", VT596_dev->dev.name); - - /* Determine the address of the SMBus areas */ - if (force_addr) { - vt596_smba = force_addr & 0xfff0; - force = 0; - } else { - if ((pci_read_config_word(VT596_dev, id->driver_data, &vt596_smba)) - || !(vt596_smba & 0x1)) { - /* try 2nd address and config reg. for 596 */ - if((id->device == PCI_DEVICE_ID_VIA_82C596_3) && - (!pci_read_config_word(VT596_dev, SMBBA2, &vt596_smba)) && - (vt596_smba & 0x1)) { - smb_cf_hstcfg = 0x84; - } else { - /* no matches at all */ - dev_err(&VT596_dev->dev, "Cannot configure " - "SMBus I/O Base address\n"); - return(-ENODEV); - } - } - vt596_smba &= 0xfff0; - if(vt596_smba == 0) { - dev_err(&VT596_dev->dev, "SMBus base address " - "uninitialized - upgrade BIOS or use " - "force_addr=0xaddr\n"); - return -ENODEV; - } - } - - if (!request_region(vt596_smba, 8, "viapro-smbus")) { - dev_err(&VT596_dev->dev, "SMBus region 0x%x already in use!\n", - vt596_smba); - return(-ENODEV); - } - - pci_read_config_byte(VT596_dev, SMBHSTCFG, &temp); - /* If force_addr is set, we program the new address here. Just to make - sure, we disable the VT596 first. */ - if (force_addr) { - pci_write_config_byte(VT596_dev, SMBHSTCFG, temp & 0xfe); - pci_write_config_word(VT596_dev, id->driver_data, vt596_smba); - pci_write_config_byte(VT596_dev, SMBHSTCFG, temp | 0x01); - dev_warn(&VT596_dev->dev, "WARNING: SMBus interface set to new " - "address 0x%04x!\n", vt596_smba); - } else if ((temp & 1) == 0) { - if (force) { - /* NOTE: This assumes I/O space and other allocations - * WERE done by the Bios! Don't complain if your - * hardware does weird things after enabling this. - * :') Check for Bios updates before resorting to - * this. - */ - pci_write_config_byte(VT596_dev, SMBHSTCFG, - temp | 1); - dev_info(&VT596_dev->dev, "Enabling SMBus device\n"); - } else { - dev_err(&VT596_dev->dev, "SMBUS: Error: Host SMBus " - "controller not enabled! - upgrade BIOS or " - "use force=1\n"); - return(-ENODEV); - } - } - - if ((temp & 0x0E) == 8) - dev_dbg(&VT596_dev->dev, "using Interrupt 9 for SMBus.\n"); - else if ((temp & 0x0E) == 0) - dev_dbg(&VT596_dev->dev, "using Interrupt SMI# for SMBus.\n"); - else - dev_dbg(&VT596_dev->dev, "Illegal Interrupt configuration " - "(or code out of date)!\n"); - - pci_read_config_byte(VT596_dev, SMBREV, &temp); - dev_dbg(&VT596_dev->dev, "SMBREV = 0x%X\n", temp); - dev_dbg(&VT596_dev->dev, "VT596_smba = 0x%X\n", vt596_smba); - - return(0); -} +static struct i2c_adapter vt596_adapter; /* Internally used pause function */ -void vt596_do_pause(unsigned int amount) +static void vt596_do_pause(unsigned int amount) { current->state = TASK_INTERRUPTIBLE; schedule_timeout(amount); } /* Another internally used function */ -int vt596_transaction(void) +static int vt596_transaction(void) { int temp; int result = 0; @@ -296,15 +186,16 @@ } /* Return -1 on error. */ -s32 vt596_access(struct i2c_adapter *adap, u16 addr, unsigned short flags, - char read_write, u8 command, int size, - union i2c_smbus_data * data) +static s32 vt596_access(struct i2c_adapter *adap, u16 addr, + unsigned short flags, char read_write, u8 command, + int size, union i2c_smbus_data *data) { int i, len; switch (size) { case I2C_SMBUS_PROC_CALL: - dev_info(&vt596_adapter.dev, "I2C_SMBUS_PROC_CALL not supported!\n"); + dev_info(&vt596_adapter.dev, + "I2C_SMBUS_PROC_CALL not supported!\n"); return -1; case I2C_SMBUS_QUICK: outb_p(((addr & 0x7f) << 1) | (read_write & 0x01), @@ -363,7 +254,6 @@ if ((read_write == I2C_SMBUS_WRITE) || (size == VT596_QUICK)) return 0; - switch (size) { case VT596_BYTE: /* Where is the result put? I assume here it is in @@ -388,15 +278,127 @@ return 0; } - -u32 vt596_func(struct i2c_adapter *adapter) +static u32 vt596_func(struct i2c_adapter *adapter) { return I2C_FUNC_SMBUS_QUICK | I2C_FUNC_SMBUS_BYTE | I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA | I2C_FUNC_SMBUS_BLOCK_DATA; } +static struct i2c_algorithm smbus_algorithm = { + .name = "Non-I2C SMBus adapter", + .id = I2C_ALGO_SMBUS, + .smbus_xfer = vt596_access, + .functionality = vt596_func, +}; + +static struct i2c_adapter vt596_adapter = { + .owner = THIS_MODULE, + .id = I2C_ALGO_SMBUS | I2C_HW_SMBUS_VIA2, + .algo = &smbus_algorithm, + .dev = { + .name = "unset", + }, +}; + +static int __devinit vt596_probe(struct pci_dev *pdev, + const struct pci_device_id *id) +{ + unsigned char temp; + int error = -ENODEV; + + /* Determine the address of the SMBus areas */ + if (force_addr) { + vt596_smba = force_addr & 0xfff0; + force = 0; + goto found; + } + + if ((pci_read_config_word(pdev, id->driver_data, &vt596_smba)) || + !(vt596_smba & 0x1)) { + /* try 2nd address and config reg. for 596 */ + if (id->device == PCI_DEVICE_ID_VIA_82C596_3 && + !pci_read_config_word(pdev, SMBBA2, &vt596_smba) && + (vt596_smba & 0x1)) { + smb_cf_hstcfg = 0x84; + } else { + /* no matches at all */ + dev_err(&pdev->dev, "Cannot configure " + "SMBus I/O Base address\n"); + return -ENODEV; + } + } + vt596_smba &= 0xfff0; + if (vt596_smba == 0) { + dev_err(&pdev->dev, "SMBus base address " + "uninitialized - upgrade BIOS or use " + "force_addr=0xaddr\n"); + return -ENODEV; + } + + found: + if (!request_region(vt596_smba, 8, "viapro-smbus")) { + dev_err(&pdev->dev, "SMBus region 0x%x already in use!\n", + vt596_smba); + return -ENODEV; + } + + pci_read_config_byte(pdev, SMBHSTCFG, &temp); + /* If force_addr is set, we program the new address here. Just to make + sure, we disable the VT596 first. */ + if (force_addr) { + pci_write_config_byte(pdev, SMBHSTCFG, temp & 0xfe); + pci_write_config_word(pdev, id->driver_data, vt596_smba); + pci_write_config_byte(pdev, SMBHSTCFG, temp | 0x01); + dev_warn(&pdev->dev, "WARNING: SMBus interface set to new " + "address 0x%04x!\n", vt596_smba); + } else if ((temp & 1) == 0) { + if (force) { + /* NOTE: This assumes I/O space and other allocations + * WERE done by the Bios! Don't complain if your + * hardware does weird things after enabling this. + * :') Check for Bios updates before resorting to + * this. + */ + pci_write_config_byte(pdev, SMBHSTCFG, temp | 1); + dev_info(&pdev->dev, "Enabling SMBus device\n"); + } else { + dev_err(&pdev->dev, "SMBUS: Error: Host SMBus " + "controller not enabled! - upgrade BIOS or " + "use force=1\n"); + goto release_region; + } + } + + if ((temp & 0x0E) == 8) + dev_dbg(&pdev->dev, "using Interrupt 9 for SMBus.\n"); + else if ((temp & 0x0E) == 0) + dev_dbg(&pdev->dev, "using Interrupt SMI# for SMBus.\n"); + else + dev_dbg(&pdev->dev, "Illegal Interrupt configuration " + "(or code out of date)!\n"); + + pci_read_config_byte(pdev, SMBREV, &temp); + dev_dbg(&pdev->dev, "SMBREV = 0x%X\n", temp); + dev_dbg(&pdev->dev, "VT596_smba = 0x%X\n", vt596_smba); + + vt596_adapter.dev.parent = &pdev->dev; + snprintf(vt596_adapter.dev.name, DEVICE_NAME_SIZE, + "SMBus Via Pro adapter at %04x", vt596_smba); + + return i2c_add_adapter(&vt596_adapter); + + release_region: + release_region(vt596_smba, 8); + return error; +} + +static void __devexit vt596_remove(struct pci_dev *pdev) +{ + i2c_del_adapter(&vt596_adapter); + release_region(vt596_smba, 8); +} static struct pci_device_id vt596_ids[] __devinitdata = { { @@ -451,29 +453,6 @@ { 0, } }; -static int __devinit vt596_probe(struct pci_dev *dev, const struct pci_device_id *id) -{ - int retval; - - retval = vt596_setup(dev, id); - if (retval) - return retval; - - vt596_adapter.dev.parent = &dev->dev; - - snprintf(vt596_adapter.dev.name, DEVICE_NAME_SIZE, - "SMBus Via Pro adapter at %04x", vt596_smba); - - retval = i2c_add_adapter(&vt596_adapter); - - return retval; -} - -static void __devexit vt596_remove(struct pci_dev *dev) -{ - i2c_del_adapter(&vt596_adapter); -} - static struct pci_driver vt596_driver = { .name = "vt596 smbus", .id_table = vt596_ids, @@ -490,14 +469,12 @@ static void __exit i2c_vt596_exit(void) { pci_unregister_driver(&vt596_driver); - release_region(vt596_smba, 8); } - - -MODULE_AUTHOR("Frodo Looijaard <frodol at dds.nl> and Philip Edelbrock <phil at netroedge.com>"); +MODULE_AUTHOR( + "Frodo Looijaard <frodol at dds.nl> and " + "Philip Edelbrock <phil at netroedge.com>"); MODULE_DESCRIPTION("vt82c596 SMBus driver"); - MODULE_LICENSE("GPL"); module_init(i2c_vt596_init);