hwmon: (pmbus/ibm-cffps) Add another PSU CCIN to version detection
authorEddie James <eajames@linux.ibm.com>
Wed, 11 Mar 2020 17:43:10 +0000 (12:43 -0500)
committerGuenter Roeck <linux@roeck-us.net>
Sun, 15 Mar 2020 13:38:59 +0000 (06:38 -0700)
There is an additional CCIN for the IBM CFFPS that may be classifed as
either version one or version two, based upon the rest of the bits of
the CCIN. Add support for it in the version detection.

Signed-off-by: Eddie James <eajames@linux.ibm.com>
Link: https://lore.kernel.org/r/1583948590-17220-1-git-send-email-eajames@linux.ibm.com
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
drivers/hwmon/pmbus/ibm-cffps.c

index b9bfa43..7d300f2 100644 (file)
 #define CFFPS_INPUT_HISTORY_CMD                        0xD6
 #define CFFPS_INPUT_HISTORY_SIZE               100
 
+#define CFFPS_CCIN_REVISION                    GENMASK(7, 0)
+#define  CFFPS_CCIN_REVISION_LEGACY             0xde
 #define CFFPS_CCIN_VERSION                     GENMASK(15, 8)
 #define CFFPS_CCIN_VERSION_1                    0x2b
 #define CFFPS_CCIN_VERSION_2                    0x2e
+#define CFFPS_CCIN_VERSION_3                    0x51
 
 /* STATUS_MFR_SPECIFIC bits */
 #define CFFPS_MFR_FAN_FAULT                    BIT(0)
@@ -486,11 +489,14 @@ static int ibm_cffps_probe(struct i2c_client *client,
                vs = (enum versions)id->driver_data;
 
        if (vs == cffps_unknown) {
+               u16 ccin_revision = 0;
                u16 ccin_version = CFFPS_CCIN_VERSION_1;
                int ccin = i2c_smbus_read_word_swapped(client, CFFPS_CCIN_CMD);
 
-               if (ccin > 0)
+               if (ccin > 0) {
+                       ccin_revision = FIELD_GET(CFFPS_CCIN_REVISION, ccin);
                        ccin_version = FIELD_GET(CFFPS_CCIN_VERSION, ccin);
+               }
 
                switch (ccin_version) {
                default:
@@ -500,6 +506,12 @@ static int ibm_cffps_probe(struct i2c_client *client,
                case CFFPS_CCIN_VERSION_2:
                        vs = cffps2;
                        break;
+               case CFFPS_CCIN_VERSION_3:
+                       if (ccin_revision == CFFPS_CCIN_REVISION_LEGACY)
+                               vs = cffps1;
+                       else
+                               vs = cffps2;
+                       break;
                }
 
                /* Set the client name to include the version number. */