From 694f9bfb8efaef8a33e8992015ff9d0866faf4a2 Mon Sep 17 00:00:00 2001 From: Christian Lamparter Date: Sun, 17 Dec 2017 17:27:15 +0100 Subject: [PATCH 1/2] hwmon: tc654 add detection routine This patch adds a detection routine for the TC654/TC655 chips. Both IDs are listed in the Datasheet. Signed-off-by: Christian Lamparter --- drivers/hwmon/tc654.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) --- a/drivers/hwmon/tc654.c +++ b/drivers/hwmon/tc654.c @@ -64,6 +64,11 @@ enum tc654_regs { /* Register data is read (and cached) at most once per second. */ #define TC654_UPDATE_INTERVAL HZ +/* Manufacturer and Version Identification Register Values */ +#define TC654_MFR_ID_MICROCHIP 0x84 +#define TC654_VER_ID 0x00 +#define TC655_VER_ID 0x01 + struct tc654_data { struct i2c_client *client; @@ -497,6 +502,29 @@ static const struct i2c_device_id tc654_ {} }; +static int +tc654_detect(struct i2c_client *new_client, struct i2c_board_info *info) +{ + struct i2c_adapter *adapter = new_client->adapter; + int manufacturer, product; + + if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) + return -ENODEV; + + manufacturer = i2c_smbus_read_byte_data(new_client, TC654_REG_MFR_ID); + if (manufacturer != TC654_MFR_ID_MICROCHIP) + return -ENODEV; + + product = i2c_smbus_read_byte_data(new_client, TC654_REG_VER_ID); + if (!((product == TC654_VER_ID) || (product == TC655_VER_ID))) + return -ENODEV; + + strlcpy(info->type, product == TC654_VER_ID ? "tc654" : "tc655", + I2C_NAME_SIZE); + return 0; +} + + MODULE_DEVICE_TABLE(i2c, tc654_id); static struct i2c_driver tc654_driver = { @@ -505,6 +533,7 @@ static struct i2c_driver tc654_driver = }, .probe = tc654_probe, .id_table = tc654_id, + .detect = tc654_detect, }; module_i2c_driver(tc654_driver);