Changeset 3139

Show
Ignore:
Timestamp:
10/29/05 21:48:20 (8 years ago)
Author:
khali
Message:

Support I2C block read when possible. This is a backport from
Linux 2.6.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • lm-sensors/trunk/kernel/busses/i2c-viapro.c

    r3138 r3139  
    55    Philip Edelbrock <phil@netroedge.com>, Kyösti Mälkki <kmalkki@cc.hut.fi>, 
    66    Mark D. Studebaker <mdsxyz123@yahoo.com> 
     7    Copyright (C) 2005  Jean Delvare <khali@linux-fr.org> 
    78 
    89    This program is free software; you can redistribute it and/or modify 
     
    8889#define VT596_WORD_DATA         0x0C 
    8990#define VT596_BLOCK_DATA        0x14 
     91#define VT596_I2C_BLOCK_DATA    0x34 
    9092 
    9193 
     
    106108 
    107109static struct i2c_adapter vt596_adapter; 
     110 
     111#define FEATURE_I2CBLOCK        (1<<0) 
     112static unsigned int vt596_features; 
    108113 
    109114/* Another internally used function */ 
     
    221226                size = VT596_WORD_DATA; 
    222227                break; 
     228        case I2C_SMBUS_I2C_BLOCK_DATA: 
     229                if (!(vt596_features & FEATURE_I2CBLOCK)) 
     230                        return -1; 
     231                if (read_write == I2C_SMBUS_READ) 
     232                        outb_p(I2C_SMBUS_BLOCK_MAX, SMBHSTDAT0); 
     233                /* Fall through */ 
    223234        case I2C_SMBUS_BLOCK_DATA: 
    224235                outb_p(((addr & 0x7f) << 1) | (read_write & 0x01), 
     
    236247                                outb_p(data->block[i], SMBBLKDAT); 
    237248                } 
    238                 size = VT596_BLOCK_DATA; 
     249                size = (size == I2C_SMBUS_I2C_BLOCK_DATA) ? 
     250                       VT596_I2C_BLOCK_DATA : VT596_BLOCK_DATA; 
    239251                break; 
    240252        default: 
     
    243255        } 
    244256 
    245         outb_p((size & 0x1C) + (ENABLE_INT9 & 1), SMBHSTCNT); 
     257        outb_p((size & 0x3C) + (ENABLE_INT9 & 1), SMBHSTCNT); 
    246258 
    247259        if (vt596_transaction()) /* Error in transaction */ 
     
    265277                data->word = inb_p(SMBHSTDAT0) + (inb_p(SMBHSTDAT1) << 8); 
    266278                break; 
     279        case VT596_I2C_BLOCK_DATA: 
    267280        case VT596_BLOCK_DATA: 
    268281                data->block[0] = inb_p(SMBHSTDAT0); 
     
    293306static u32 vt596_func(struct i2c_adapter *adapter) 
    294307{ 
    295         return I2C_FUNC_SMBUS_QUICK | I2C_FUNC_SMBUS_BYTE | 
     308        u32 func = I2C_FUNC_SMBUS_QUICK | I2C_FUNC_SMBUS_BYTE | 
    296309            I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA | 
    297310            I2C_FUNC_SMBUS_BLOCK_DATA; 
     311 
     312        if (vt596_features & FEATURE_I2CBLOCK) 
     313                func |= I2C_FUNC_SMBUS_I2C_BLOCK; 
     314        return func; 
    298315} 
    299316 
     
    395412        dev_dbg(pdev, "VT596_smba = 0x%X\n", vt596_smba); 
    396413 
     414        switch (id->device) { 
     415        case PCI_DEVICE_ID_VIA_8237: 
     416        case PCI_DEVICE_ID_VIA_8235: 
     417        case PCI_DEVICE_ID_VIA_8233A: 
     418        case PCI_DEVICE_ID_VIA_8233_0: 
     419                vt596_features |= FEATURE_I2CBLOCK; 
     420                break; 
     421        case PCI_DEVICE_ID_VIA_82C686_4: 
     422                /* The VT82C686B (rev 0x40) does support I2C block 
     423                   transactions, but the VT82C686A (rev 0x30) doesn't */ 
     424                if (!pci_read_config_byte(pdev, PCI_REVISION_ID, &temp) 
     425                 && temp >= 0x40) 
     426                        vt596_features |= FEATURE_I2CBLOCK; 
     427                break; 
     428        } 
     429 
    397430        snprintf(vt596_adapter.name, 32, 
    398431                 "SMBus Via Pro adapter at %04x", vt596_smba);