list_for_each_entry(e, &smi_infos, link) {
                if (e->io.addr_type != info->io.addr_type)
                        continue;
-               if (e->io.addr_data == info->io.addr_data)
+               if (e->io.addr_data == info->io.addr_data) {
+                       /*
+                        * This is a cheap hack, ACPI doesn't have a defined
+                        * slave address but SMBIOS does.  Pick it up from
+                        * any source that has it available.
+                        */
+                       if (info->slave_addr && !e->slave_addr)
+                               e->slave_addr = info->slave_addr;
                        return 0;
+               }
        }
 
        return 1;
 
 };
 
 struct ssif_addr_info {
-       unsigned short addr;
        struct i2c_board_info binfo;
        char *adapter_name;
        int debug;
        return false;
 }
 
+static int find_slave_address(struct i2c_client *client, int slave_addr)
+{
+       struct ssif_addr_info *info;
+
+       if (slave_addr)
+               return slave_addr;
+
+       /*
+        * Came in without a slave address, search around to see if
+        * the other sources have a slave address.  This lets us pick
+        * up an SMBIOS slave address when using ACPI.
+        */
+       list_for_each_entry(info, &ssif_infos, link) {
+               if (info->binfo.addr != client->addr)
+                       continue;
+               if (info->adapter_name && client->adapter->name &&
+                   strcmp_nospace(info->adapter_name,
+                                  client->adapter->name))
+                       continue;
+               if (info->slave_addr) {
+                       slave_addr = info->slave_addr;
+                       break;
+               }
+       }
+
+       return slave_addr;
+}
+
 /*
  * Global enables we care about.
  */
                }
        }
 
+       slave_addr = find_slave_address(client, slave_addr);
+
        pr_info(PFX "Trying %s-specified SSIF interface at i2c address 0x%x, adapter %s, slave address 0x%x\n",
               ipmi_addr_src_to_str(ssif_info->addr_source),
               client->addr, client->adapter->name, slave_addr);
                slave_addr = data[6];
        }
 
-       return new_ssif_client(myaddr, NULL, 0, 0, SI_SMBIOS);
+       return new_ssif_client(myaddr, NULL, 0, slave_addr, SI_SMBIOS);
 }
 
 static void dmi_iterator(void)