diff options
| -rw-r--r-- | drivers/char/ipmi/ipmi_dmi.c | 70 | ||||
| -rw-r--r-- | drivers/char/ipmi/ipmi_dmi.h | 8 | ||||
| -rw-r--r-- | drivers/char/ipmi/ipmi_msghandler.c | 2 | ||||
| -rw-r--r-- | drivers/char/ipmi/ipmi_si_intf.c | 2 | ||||
| -rw-r--r-- | drivers/char/ipmi/ipmi_si_platform.c | 101 | ||||
| -rw-r--r-- | drivers/char/ipmi/ipmi_si_sm.h | 2 | ||||
| -rw-r--r-- | drivers/char/ipmi/ipmi_ssif.c | 12 | ||||
| -rw-r--r-- | include/linux/ipmi.h | 2 |
8 files changed, 104 insertions, 95 deletions
diff --git a/drivers/char/ipmi/ipmi_dmi.c b/drivers/char/ipmi/ipmi_dmi.c index 2a84401dea05..d08d41903b0f 100644 --- a/drivers/char/ipmi/ipmi_dmi.c +++ b/drivers/char/ipmi/ipmi_dmi.c | |||
| @@ -8,10 +8,16 @@ | |||
| 8 | #include <linux/dmi.h> | 8 | #include <linux/dmi.h> |
| 9 | #include <linux/platform_device.h> | 9 | #include <linux/platform_device.h> |
| 10 | #include <linux/property.h> | 10 | #include <linux/property.h> |
| 11 | #include "ipmi_si_sm.h" | ||
| 11 | #include "ipmi_dmi.h" | 12 | #include "ipmi_dmi.h" |
| 12 | 13 | ||
| 14 | #define IPMI_DMI_TYPE_KCS 0x01 | ||
| 15 | #define IPMI_DMI_TYPE_SMIC 0x02 | ||
| 16 | #define IPMI_DMI_TYPE_BT 0x03 | ||
| 17 | #define IPMI_DMI_TYPE_SSIF 0x04 | ||
| 18 | |||
| 13 | struct ipmi_dmi_info { | 19 | struct ipmi_dmi_info { |
| 14 | int type; | 20 | enum si_type si_type; |
| 15 | u32 flags; | 21 | u32 flags; |
| 16 | unsigned long addr; | 22 | unsigned long addr; |
| 17 | u8 slave_addr; | 23 | u8 slave_addr; |
| @@ -22,6 +28,15 @@ static struct ipmi_dmi_info *ipmi_dmi_infos; | |||
| 22 | 28 | ||
| 23 | static int ipmi_dmi_nr __initdata; | 29 | static int ipmi_dmi_nr __initdata; |
| 24 | 30 | ||
| 31 | #define set_prop_entry(_p_, _name_, type, val) \ | ||
| 32 | do { \ | ||
| 33 | struct property_entry *_p = &_p_; \ | ||
| 34 | _p->name = _name_; \ | ||
| 35 | _p->length = sizeof(type); \ | ||
| 36 | _p->is_string = false; \ | ||
| 37 | _p->value.type##_data = val; \ | ||
| 38 | } while(0) | ||
| 39 | |||
| 25 | static void __init dmi_add_platform_ipmi(unsigned long base_addr, | 40 | static void __init dmi_add_platform_ipmi(unsigned long base_addr, |
| 26 | u32 flags, | 41 | u32 flags, |
| 27 | u8 slave_addr, | 42 | u8 slave_addr, |
| @@ -32,27 +47,14 @@ static void __init dmi_add_platform_ipmi(unsigned long base_addr, | |||
| 32 | struct platform_device *pdev; | 47 | struct platform_device *pdev; |
| 33 | struct resource r[4]; | 48 | struct resource r[4]; |
| 34 | unsigned int num_r = 1, size; | 49 | unsigned int num_r = 1, size; |
| 35 | struct property_entry p[4] = { | 50 | struct property_entry p[5]; |
| 36 | PROPERTY_ENTRY_U8("slave-addr", slave_addr), | 51 | unsigned int pidx = 0; |
| 37 | PROPERTY_ENTRY_U8("ipmi-type", type), | ||
| 38 | PROPERTY_ENTRY_U16("i2c-addr", base_addr), | ||
| 39 | { } | ||
| 40 | }; | ||
| 41 | char *name, *override; | 52 | char *name, *override; |
| 42 | int rv; | 53 | int rv; |
| 54 | enum si_type si_type; | ||
| 43 | struct ipmi_dmi_info *info; | 55 | struct ipmi_dmi_info *info; |
| 44 | 56 | ||
| 45 | info = kmalloc(sizeof(*info), GFP_KERNEL); | 57 | memset(p, 0, sizeof(p)); |
| 46 | if (!info) { | ||
| 47 | pr_warn("ipmi:dmi: Could not allocate dmi info\n"); | ||
| 48 | } else { | ||
| 49 | info->type = type; | ||
| 50 | info->flags = flags; | ||
| 51 | info->addr = base_addr; | ||
| 52 | info->slave_addr = slave_addr; | ||
| 53 | info->next = ipmi_dmi_infos; | ||
| 54 | ipmi_dmi_infos = info; | ||
| 55 | } | ||
| 56 | 58 | ||
| 57 | name = "dmi-ipmi-si"; | 59 | name = "dmi-ipmi-si"; |
| 58 | override = "ipmi_si"; | 60 | override = "ipmi_si"; |
| @@ -62,19 +64,42 @@ static void __init dmi_add_platform_ipmi(unsigned long base_addr, | |||
| 62 | override = "ipmi_ssif"; | 64 | override = "ipmi_ssif"; |
| 63 | offset = 1; | 65 | offset = 1; |
| 64 | size = 1; | 66 | size = 1; |
| 67 | si_type = SI_TYPE_INVALID; | ||
| 65 | break; | 68 | break; |
| 66 | case IPMI_DMI_TYPE_BT: | 69 | case IPMI_DMI_TYPE_BT: |
| 67 | size = 3; | 70 | size = 3; |
| 71 | si_type = SI_BT; | ||
| 68 | break; | 72 | break; |
| 69 | case IPMI_DMI_TYPE_KCS: | 73 | case IPMI_DMI_TYPE_KCS: |
| 74 | size = 2; | ||
| 75 | si_type = SI_KCS; | ||
| 76 | break; | ||
| 70 | case IPMI_DMI_TYPE_SMIC: | 77 | case IPMI_DMI_TYPE_SMIC: |
| 71 | size = 2; | 78 | size = 2; |
| 79 | si_type = SI_SMIC; | ||
| 72 | break; | 80 | break; |
| 73 | default: | 81 | default: |
| 74 | pr_err("ipmi:dmi: Invalid IPMI type: %d", type); | 82 | pr_err("ipmi:dmi: Invalid IPMI type: %d", type); |
| 75 | return; | 83 | return; |
| 76 | } | 84 | } |
| 77 | 85 | ||
| 86 | if (si_type != SI_TYPE_INVALID) | ||
| 87 | set_prop_entry(p[pidx++], "ipmi-type", u8, si_type); | ||
| 88 | set_prop_entry(p[pidx++], "slave-addr", u8, slave_addr); | ||
| 89 | set_prop_entry(p[pidx++], "addr-source", u8, SI_SMBIOS); | ||
| 90 | |||
| 91 | info = kmalloc(sizeof(*info), GFP_KERNEL); | ||
| 92 | if (!info) { | ||
| 93 | pr_warn("ipmi:dmi: Could not allocate dmi info\n"); | ||
| 94 | } else { | ||
| 95 | info->si_type = si_type; | ||
| 96 | info->flags = flags; | ||
| 97 | info->addr = base_addr; | ||
| 98 | info->slave_addr = slave_addr; | ||
| 99 | info->next = ipmi_dmi_infos; | ||
| 100 | ipmi_dmi_infos = info; | ||
| 101 | } | ||
| 102 | |||
| 78 | pdev = platform_device_alloc(name, ipmi_dmi_nr); | 103 | pdev = platform_device_alloc(name, ipmi_dmi_nr); |
| 79 | if (!pdev) { | 104 | if (!pdev) { |
| 80 | pr_err("ipmi:dmi: Error allocation IPMI platform device"); | 105 | pr_err("ipmi:dmi: Error allocation IPMI platform device"); |
| @@ -82,8 +107,10 @@ static void __init dmi_add_platform_ipmi(unsigned long base_addr, | |||
| 82 | } | 107 | } |
| 83 | pdev->driver_override = override; | 108 | pdev->driver_override = override; |
| 84 | 109 | ||
| 85 | if (type == IPMI_DMI_TYPE_SSIF) | 110 | if (type == IPMI_DMI_TYPE_SSIF) { |
| 111 | set_prop_entry(p[pidx++], "i2c-addr", u16, base_addr); | ||
| 86 | goto add_properties; | 112 | goto add_properties; |
| 113 | } | ||
| 87 | 114 | ||
| 88 | memset(r, 0, sizeof(r)); | 115 | memset(r, 0, sizeof(r)); |
| 89 | 116 | ||
| @@ -151,12 +178,13 @@ err: | |||
| 151 | * This function allows an ACPI-specified IPMI device to look up the | 178 | * This function allows an ACPI-specified IPMI device to look up the |
| 152 | * slave address from the DMI table. | 179 | * slave address from the DMI table. |
| 153 | */ | 180 | */ |
| 154 | int ipmi_dmi_get_slave_addr(int type, u32 flags, unsigned long base_addr) | 181 | int ipmi_dmi_get_slave_addr(enum si_type si_type, u32 flags, |
| 182 | unsigned long base_addr) | ||
| 155 | { | 183 | { |
| 156 | struct ipmi_dmi_info *info = ipmi_dmi_infos; | 184 | struct ipmi_dmi_info *info = ipmi_dmi_infos; |
| 157 | 185 | ||
| 158 | while (info) { | 186 | while (info) { |
| 159 | if (info->type == type && | 187 | if (info->si_type == si_type && |
| 160 | info->flags == flags && | 188 | info->flags == flags && |
| 161 | info->addr == base_addr) | 189 | info->addr == base_addr) |
| 162 | return info->slave_addr; | 190 | return info->slave_addr; |
diff --git a/drivers/char/ipmi/ipmi_dmi.h b/drivers/char/ipmi/ipmi_dmi.h index 0a1afe5ceb1e..062015b8f520 100644 --- a/drivers/char/ipmi/ipmi_dmi.h +++ b/drivers/char/ipmi/ipmi_dmi.h | |||
| @@ -2,11 +2,7 @@ | |||
| 2 | * DMI defines for use by IPMI | 2 | * DMI defines for use by IPMI |
| 3 | */ | 3 | */ |
| 4 | 4 | ||
| 5 | #define IPMI_DMI_TYPE_KCS 0x01 | ||
| 6 | #define IPMI_DMI_TYPE_SMIC 0x02 | ||
| 7 | #define IPMI_DMI_TYPE_BT 0x03 | ||
| 8 | #define IPMI_DMI_TYPE_SSIF 0x04 | ||
| 9 | |||
| 10 | #ifdef CONFIG_IPMI_DMI_DECODE | 5 | #ifdef CONFIG_IPMI_DMI_DECODE |
| 11 | int ipmi_dmi_get_slave_addr(int type, u32 flags, unsigned long base_addr); | 6 | int ipmi_dmi_get_slave_addr(enum si_type si_type, u32 flags, |
| 7 | unsigned long base_addr); | ||
| 12 | #endif | 8 | #endif |
diff --git a/drivers/char/ipmi/ipmi_msghandler.c b/drivers/char/ipmi/ipmi_msghandler.c index fd3ac6b50412..9d1eaf70f406 100644 --- a/drivers/char/ipmi/ipmi_msghandler.c +++ b/drivers/char/ipmi/ipmi_msghandler.c | |||
| @@ -594,7 +594,7 @@ static DEFINE_MUTEX(smi_watchers_mutex); | |||
| 594 | 594 | ||
| 595 | static const char * const addr_src_to_str[] = { | 595 | static const char * const addr_src_to_str[] = { |
| 596 | "invalid", "hotmod", "hardcoded", "SPMI", "ACPI", "SMBIOS", "PCI", | 596 | "invalid", "hotmod", "hardcoded", "SPMI", "ACPI", "SMBIOS", "PCI", |
| 597 | "device-tree" | 597 | "device-tree", "platform" |
| 598 | }; | 598 | }; |
| 599 | 599 | ||
| 600 | const char *ipmi_addr_src_to_str(enum ipmi_addr_src src) | 600 | const char *ipmi_addr_src_to_str(enum ipmi_addr_src src) |
diff --git a/drivers/char/ipmi/ipmi_si_intf.c b/drivers/char/ipmi/ipmi_si_intf.c index efc8ee9b5071..55e0c42bee4d 100644 --- a/drivers/char/ipmi/ipmi_si_intf.c +++ b/drivers/char/ipmi/ipmi_si_intf.c | |||
| @@ -89,7 +89,7 @@ enum si_intf_state { | |||
| 89 | #define IPMI_BT_INTMASK_CLEAR_IRQ_BIT 2 | 89 | #define IPMI_BT_INTMASK_CLEAR_IRQ_BIT 2 |
| 90 | #define IPMI_BT_INTMASK_ENABLE_IRQ_BIT 1 | 90 | #define IPMI_BT_INTMASK_ENABLE_IRQ_BIT 1 |
| 91 | 91 | ||
| 92 | static const char * const si_to_str[] = { "kcs", "smic", "bt" }; | 92 | static const char * const si_to_str[] = { "invalid", "kcs", "smic", "bt" }; |
| 93 | 93 | ||
| 94 | static int initialized; | 94 | static int initialized; |
| 95 | 95 | ||
diff --git a/drivers/char/ipmi/ipmi_si_platform.c b/drivers/char/ipmi/ipmi_si_platform.c index cf5c3e5e72e2..9573f1116450 100644 --- a/drivers/char/ipmi/ipmi_si_platform.c +++ b/drivers/char/ipmi/ipmi_si_platform.c | |||
| @@ -6,14 +6,13 @@ | |||
| 6 | */ | 6 | */ |
| 7 | #include <linux/types.h> | 7 | #include <linux/types.h> |
| 8 | #include <linux/module.h> | 8 | #include <linux/module.h> |
| 9 | #include "ipmi_dmi.h" | ||
| 10 | #include <linux/dmi.h> | ||
| 11 | #include <linux/of_device.h> | 9 | #include <linux/of_device.h> |
| 12 | #include <linux/of_platform.h> | 10 | #include <linux/of_platform.h> |
| 13 | #include <linux/of_address.h> | 11 | #include <linux/of_address.h> |
| 14 | #include <linux/of_irq.h> | 12 | #include <linux/of_irq.h> |
| 15 | #include <linux/acpi.h> | 13 | #include <linux/acpi.h> |
| 16 | #include "ipmi_si.h" | 14 | #include "ipmi_si.h" |
| 15 | #include "ipmi_dmi.h" | ||
| 17 | 16 | ||
| 18 | #define PFX "ipmi_platform: " | 17 | #define PFX "ipmi_platform: " |
| 19 | 18 | ||
| @@ -21,19 +20,29 @@ static bool si_tryplatform = true; | |||
| 21 | #ifdef CONFIG_ACPI | 20 | #ifdef CONFIG_ACPI |
| 22 | static bool si_tryacpi = true; | 21 | static bool si_tryacpi = true; |
| 23 | #endif | 22 | #endif |
| 23 | #ifdef CONFIG_OF | ||
| 24 | static bool si_tryopenfirmware = true; | ||
| 25 | #endif | ||
| 24 | #ifdef CONFIG_DMI | 26 | #ifdef CONFIG_DMI |
| 25 | static bool si_trydmi = true; | 27 | static bool si_trydmi = true; |
| 28 | #else | ||
| 29 | static bool si_trydmi = false; | ||
| 26 | #endif | 30 | #endif |
| 27 | 31 | ||
| 28 | module_param_named(tryplatform, si_tryplatform, bool, 0); | 32 | module_param_named(tryplatform, si_tryplatform, bool, 0); |
| 29 | MODULE_PARM_DESC(tryplatform, "Setting this to zero will disable the" | 33 | MODULE_PARM_DESC(tryplatform, "Setting this to zero will disable the" |
| 30 | " default scan of the interfaces identified via platform" | 34 | " default scan of the interfaces identified via platform" |
| 31 | " interfaces like openfirmware"); | 35 | " interfaces besides ACPI, OpenFirmware, and DMI"); |
| 32 | #ifdef CONFIG_ACPI | 36 | #ifdef CONFIG_ACPI |
| 33 | module_param_named(tryacpi, si_tryacpi, bool, 0); | 37 | module_param_named(tryacpi, si_tryacpi, bool, 0); |
| 34 | MODULE_PARM_DESC(tryacpi, "Setting this to zero will disable the" | 38 | MODULE_PARM_DESC(tryacpi, "Setting this to zero will disable the" |
| 35 | " default scan of the interfaces identified via ACPI"); | 39 | " default scan of the interfaces identified via ACPI"); |
| 36 | #endif | 40 | #endif |
| 41 | #ifdef CONFIG_OF | ||
| 42 | module_param_named(tryopenfirmware, si_tryopenfirmware, bool, 0); | ||
| 43 | MODULE_PARM_DESC(tryacpi, "Setting this to zero will disable the" | ||
| 44 | " default scan of the interfaces identified via OpenFirmware"); | ||
| 45 | #endif | ||
| 37 | #ifdef CONFIG_DMI | 46 | #ifdef CONFIG_DMI |
| 38 | module_param_named(trydmi, si_trydmi, bool, 0); | 47 | module_param_named(trydmi, si_trydmi, bool, 0); |
| 39 | MODULE_PARM_DESC(trydmi, "Setting this to zero will disable the" | 48 | MODULE_PARM_DESC(trydmi, "Setting this to zero will disable the" |
| @@ -235,7 +244,6 @@ static void spmi_find_bmc(void) | |||
| 235 | } | 244 | } |
| 236 | #endif | 245 | #endif |
| 237 | 246 | ||
| 238 | #if defined(CONFIG_DMI) || defined(CONFIG_ACPI) | ||
| 239 | static struct resource * | 247 | static struct resource * |
| 240 | ipmi_get_info_from_resources(struct platform_device *pdev, | 248 | ipmi_get_info_from_resources(struct platform_device *pdev, |
| 241 | struct si_sm_io *io) | 249 | struct si_sm_io *io) |
| @@ -271,48 +279,52 @@ ipmi_get_info_from_resources(struct platform_device *pdev, | |||
| 271 | return res; | 279 | return res; |
| 272 | } | 280 | } |
| 273 | 281 | ||
| 274 | #endif | 282 | static int platform_ipmi_probe(struct platform_device *pdev) |
| 275 | |||
| 276 | #ifdef CONFIG_DMI | ||
| 277 | static int dmi_ipmi_probe(struct platform_device *pdev) | ||
| 278 | { | 283 | { |
| 279 | struct si_sm_io io; | 284 | struct si_sm_io io; |
| 280 | u8 type, slave_addr; | 285 | u8 type, slave_addr, addr_source; |
| 281 | int rv; | 286 | int rv; |
| 282 | 287 | ||
| 283 | if (!si_trydmi) | 288 | rv = device_property_read_u8(&pdev->dev, "addr-source", &addr_source); |
| 284 | return -ENODEV; | 289 | if (rv) |
| 290 | addr_source = SI_PLATFORM; | ||
| 291 | if (addr_source >= SI_LAST) | ||
| 292 | return -EINVAL; | ||
| 293 | |||
| 294 | if (addr_source == SI_SMBIOS) { | ||
| 295 | if (!si_trydmi) | ||
| 296 | return -ENODEV; | ||
| 297 | } else { | ||
| 298 | if (!si_tryplatform) | ||
| 299 | return -ENODEV; | ||
| 300 | } | ||
| 285 | 301 | ||
| 286 | rv = device_property_read_u8(&pdev->dev, "ipmi-type", &type); | 302 | rv = device_property_read_u8(&pdev->dev, "ipmi-type", &type); |
| 287 | if (rv) | 303 | if (rv) |
| 288 | return -ENODEV; | 304 | return -ENODEV; |
| 289 | 305 | ||
| 290 | memset(&io, 0, sizeof(io)); | 306 | memset(&io, 0, sizeof(io)); |
| 291 | io.addr_source = SI_SMBIOS; | 307 | io.addr_source = addr_source; |
| 292 | pr_info(PFX "probing via SMBIOS\n"); | 308 | dev_info(&pdev->dev, PFX "probing via %s\n", |
| 309 | ipmi_addr_src_to_str(addr_source)); | ||
| 293 | 310 | ||
| 294 | switch (type) { | 311 | switch (type) { |
| 295 | case IPMI_DMI_TYPE_KCS: | 312 | case SI_KCS: |
| 296 | io.si_type = SI_KCS; | 313 | case SI_SMIC: |
| 297 | break; | 314 | case SI_BT: |
| 298 | case IPMI_DMI_TYPE_SMIC: | 315 | io.si_type = type; |
| 299 | io.si_type = SI_SMIC; | ||
| 300 | break; | ||
| 301 | case IPMI_DMI_TYPE_BT: | ||
| 302 | io.si_type = SI_BT; | ||
| 303 | break; | 316 | break; |
| 304 | default: | 317 | default: |
| 318 | dev_err(&pdev->dev, "ipmi-type property is invalid\n"); | ||
| 305 | return -EINVAL; | 319 | return -EINVAL; |
| 306 | } | 320 | } |
| 307 | 321 | ||
| 308 | if (!ipmi_get_info_from_resources(pdev, &io)) { | 322 | if (!ipmi_get_info_from_resources(pdev, &io)) |
| 309 | rv = -EINVAL; | 323 | return -EINVAL; |
| 310 | goto err_free; | ||
| 311 | } | ||
| 312 | 324 | ||
| 313 | rv = device_property_read_u8(&pdev->dev, "slave-addr", &slave_addr); | 325 | rv = device_property_read_u8(&pdev->dev, "slave-addr", &slave_addr); |
| 314 | if (rv) { | 326 | if (rv) { |
| 315 | dev_warn(&pdev->dev, "device has no slave-addr property"); | 327 | dev_warn(&pdev->dev, "device has no slave-addr property\n"); |
| 316 | io.slave_addr = 0x20; | 328 | io.slave_addr = 0x20; |
| 317 | } else { | 329 | } else { |
| 318 | io.slave_addr = slave_addr; | 330 | io.slave_addr = slave_addr; |
| @@ -333,16 +345,7 @@ static int dmi_ipmi_probe(struct platform_device *pdev) | |||
| 333 | ipmi_si_add_smi(&io); | 345 | ipmi_si_add_smi(&io); |
| 334 | 346 | ||
| 335 | return 0; | 347 | return 0; |
| 336 | |||
| 337 | err_free: | ||
| 338 | return rv; | ||
| 339 | } | 348 | } |
| 340 | #else | ||
| 341 | static int dmi_ipmi_probe(struct platform_device *pdev) | ||
| 342 | { | ||
| 343 | return -ENODEV; | ||
| 344 | } | ||
| 345 | #endif /* CONFIG_DMI */ | ||
| 346 | 349 | ||
| 347 | #ifdef CONFIG_OF | 350 | #ifdef CONFIG_OF |
| 348 | static const struct of_device_id of_ipmi_match[] = { | 351 | static const struct of_device_id of_ipmi_match[] = { |
| @@ -366,6 +369,9 @@ static int of_ipmi_probe(struct platform_device *pdev) | |||
| 366 | int ret; | 369 | int ret; |
| 367 | int proplen; | 370 | int proplen; |
| 368 | 371 | ||
| 372 | if (!si_tryopenfirmware) | ||
| 373 | return -ENODEV; | ||
| 374 | |||
| 369 | dev_info(&pdev->dev, "probing via device tree\n"); | 375 | dev_info(&pdev->dev, "probing via device tree\n"); |
| 370 | 376 | ||
| 371 | match = of_match_device(of_ipmi_match, &pdev->dev); | 377 | match = of_match_device(of_ipmi_match, &pdev->dev); |
| @@ -436,25 +442,12 @@ static int find_slave_address(struct si_sm_io *io, int slave_addr) | |||
| 436 | { | 442 | { |
| 437 | #ifdef CONFIG_IPMI_DMI_DECODE | 443 | #ifdef CONFIG_IPMI_DMI_DECODE |
| 438 | if (!slave_addr) { | 444 | if (!slave_addr) { |
| 439 | int type = -1; | ||
| 440 | u32 flags = IORESOURCE_IO; | 445 | u32 flags = IORESOURCE_IO; |
| 441 | 446 | ||
| 442 | switch (io->si_type) { | ||
| 443 | case SI_KCS: | ||
| 444 | type = IPMI_DMI_TYPE_KCS; | ||
| 445 | break; | ||
| 446 | case SI_BT: | ||
| 447 | type = IPMI_DMI_TYPE_BT; | ||
| 448 | break; | ||
| 449 | case SI_SMIC: | ||
| 450 | type = IPMI_DMI_TYPE_SMIC; | ||
| 451 | break; | ||
| 452 | } | ||
| 453 | |||
| 454 | if (io->addr_type == IPMI_MEM_ADDR_SPACE) | 447 | if (io->addr_type == IPMI_MEM_ADDR_SPACE) |
| 455 | flags = IORESOURCE_MEM; | 448 | flags = IORESOURCE_MEM; |
| 456 | 449 | ||
| 457 | slave_addr = ipmi_dmi_get_slave_addr(type, flags, | 450 | slave_addr = ipmi_dmi_get_slave_addr(io->si_type, flags, |
| 458 | io->addr_data); | 451 | io->addr_data); |
| 459 | } | 452 | } |
| 460 | #endif | 453 | #endif |
| @@ -563,7 +556,7 @@ static int ipmi_probe(struct platform_device *pdev) | |||
| 563 | if (acpi_ipmi_probe(pdev) == 0) | 556 | if (acpi_ipmi_probe(pdev) == 0) |
| 564 | return 0; | 557 | return 0; |
| 565 | 558 | ||
| 566 | return dmi_ipmi_probe(pdev); | 559 | return platform_ipmi_probe(pdev); |
| 567 | } | 560 | } |
| 568 | 561 | ||
| 569 | static int ipmi_remove(struct platform_device *pdev) | 562 | static int ipmi_remove(struct platform_device *pdev) |
| @@ -583,11 +576,9 @@ struct platform_driver ipmi_platform_driver = { | |||
| 583 | 576 | ||
| 584 | void ipmi_si_platform_init(void) | 577 | void ipmi_si_platform_init(void) |
| 585 | { | 578 | { |
| 586 | if (si_tryplatform) { | 579 | int rv = platform_driver_register(&ipmi_platform_driver); |
| 587 | int rv = platform_driver_register(&ipmi_platform_driver); | 580 | if (rv) |
| 588 | if (rv) | 581 | pr_err(PFX "Unable to register driver: %d\n", rv); |
| 589 | pr_err(PFX "Unable to register driver: %d\n", rv); | ||
| 590 | } | ||
| 591 | 582 | ||
| 592 | #ifdef CONFIG_ACPI | 583 | #ifdef CONFIG_ACPI |
| 593 | if (si_tryacpi) | 584 | if (si_tryacpi) |
diff --git a/drivers/char/ipmi/ipmi_si_sm.h b/drivers/char/ipmi/ipmi_si_sm.h index fbf5bfccde2e..aa8d88ab4433 100644 --- a/drivers/char/ipmi/ipmi_si_sm.h +++ b/drivers/char/ipmi/ipmi_si_sm.h | |||
| @@ -43,7 +43,7 @@ | |||
| 43 | struct si_sm_data; | 43 | struct si_sm_data; |
| 44 | 44 | ||
| 45 | enum si_type { | 45 | enum si_type { |
| 46 | SI_KCS, SI_SMIC, SI_BT | 46 | SI_TYPE_INVALID, SI_KCS, SI_SMIC, SI_BT |
| 47 | }; | 47 | }; |
| 48 | 48 | ||
| 49 | /* | 49 | /* |
diff --git a/drivers/char/ipmi/ipmi_ssif.c b/drivers/char/ipmi/ipmi_ssif.c index aadec879d052..466b3a1c0adf 100644 --- a/drivers/char/ipmi/ipmi_ssif.c +++ b/drivers/char/ipmi/ipmi_ssif.c | |||
| @@ -53,6 +53,7 @@ | |||
| 53 | #include <linux/acpi.h> | 53 | #include <linux/acpi.h> |
| 54 | #include <linux/ctype.h> | 54 | #include <linux/ctype.h> |
| 55 | #include <linux/time64.h> | 55 | #include <linux/time64.h> |
| 56 | #include "ipmi_si_sm.h" | ||
| 56 | #include "ipmi_dmi.h" | 57 | #include "ipmi_dmi.h" |
| 57 | 58 | ||
| 58 | #define PFX "ipmi_ssif: " | 59 | #define PFX "ipmi_ssif: " |
| @@ -1482,7 +1483,7 @@ static int find_slave_address(struct i2c_client *client, int slave_addr) | |||
| 1482 | #ifdef CONFIG_IPMI_DMI_DECODE | 1483 | #ifdef CONFIG_IPMI_DMI_DECODE |
| 1483 | if (!slave_addr) | 1484 | if (!slave_addr) |
| 1484 | slave_addr = ipmi_dmi_get_slave_addr( | 1485 | slave_addr = ipmi_dmi_get_slave_addr( |
| 1485 | IPMI_DMI_TYPE_SSIF, | 1486 | SI_TYPE_INVALID, |
| 1486 | i2c_adapter_id(client->adapter), | 1487 | i2c_adapter_id(client->adapter), |
| 1487 | client->addr); | 1488 | client->addr); |
| 1488 | #endif | 1489 | #endif |
| @@ -2013,20 +2014,13 @@ static void spmi_find_bmc(void) { } | |||
| 2013 | #ifdef CONFIG_DMI | 2014 | #ifdef CONFIG_DMI |
| 2014 | static int dmi_ipmi_probe(struct platform_device *pdev) | 2015 | static int dmi_ipmi_probe(struct platform_device *pdev) |
| 2015 | { | 2016 | { |
| 2016 | u8 type, slave_addr = 0; | 2017 | u8 slave_addr = 0; |
| 2017 | u16 i2c_addr; | 2018 | u16 i2c_addr; |
| 2018 | int rv; | 2019 | int rv; |
| 2019 | 2020 | ||
| 2020 | if (!ssif_trydmi) | 2021 | if (!ssif_trydmi) |
| 2021 | return -ENODEV; | 2022 | return -ENODEV; |
| 2022 | 2023 | ||
| 2023 | rv = device_property_read_u8(&pdev->dev, "ipmi-type", &type); | ||
| 2024 | if (rv) | ||
| 2025 | return -ENODEV; | ||
| 2026 | |||
| 2027 | if (type != IPMI_DMI_TYPE_SSIF) | ||
| 2028 | return -ENODEV; | ||
| 2029 | |||
| 2030 | rv = device_property_read_u16(&pdev->dev, "i2c-addr", &i2c_addr); | 2024 | rv = device_property_read_u16(&pdev->dev, "i2c-addr", &i2c_addr); |
| 2031 | if (rv) { | 2025 | if (rv) { |
| 2032 | dev_warn(&pdev->dev, PFX "No i2c-addr property\n"); | 2026 | dev_warn(&pdev->dev, PFX "No i2c-addr property\n"); |
diff --git a/include/linux/ipmi.h b/include/linux/ipmi.h index 80fc3f798984..f4ffacf4fe9d 100644 --- a/include/linux/ipmi.h +++ b/include/linux/ipmi.h | |||
| @@ -277,7 +277,7 @@ int ipmi_validate_addr(struct ipmi_addr *addr, int len); | |||
| 277 | */ | 277 | */ |
| 278 | enum ipmi_addr_src { | 278 | enum ipmi_addr_src { |
| 279 | SI_INVALID = 0, SI_HOTMOD, SI_HARDCODED, SI_SPMI, SI_ACPI, SI_SMBIOS, | 279 | SI_INVALID = 0, SI_HOTMOD, SI_HARDCODED, SI_SPMI, SI_ACPI, SI_SMBIOS, |
| 280 | SI_PCI, SI_DEVICETREE, SI_LAST | 280 | SI_PCI, SI_DEVICETREE, SI_PLATFORM, SI_LAST |
| 281 | }; | 281 | }; |
| 282 | const char *ipmi_addr_src_to_str(enum ipmi_addr_src src); | 282 | const char *ipmi_addr_src_to_str(enum ipmi_addr_src src); |
| 283 | 283 | ||
