ipmi: Add the i2c-addr property for SSIF interfaces
authorCorey Minyard <cminyard@mvista.com>
Wed, 24 Apr 2019 13:32:02 +0000 (08:32 -0500)
committerCorey Minyard <cminyard@mvista.com>
Wed, 24 Apr 2019 14:02:53 +0000 (09:02 -0500)
This is required for SSIF to work.

There was no way to know if the interface being added was SI
or SSIF from the platform data, but that was required so the
i2c-addr is only added for SSIF interfaces.  So add a field
for that.

Also rework the logic a bit so that ipmi-type is not set
for SSIF interfaces, as it is not necessary for that.

Fixes: 3cd83bac481d ("ipmi: Consolidate the adding of platform devices")
Reported-by: Kamlakant Patel <kamlakantp@marvell.com>
Signed-off-by: Corey Minyard <cminyard@mvista.com>
Cc: stable@vger.kernel.org # 5.1
drivers/char/ipmi/ipmi_dmi.c
drivers/char/ipmi/ipmi_plat_data.c
drivers/char/ipmi/ipmi_plat_data.h
drivers/char/ipmi/ipmi_si_hardcode.c
drivers/char/ipmi/ipmi_si_hotmod.c

index f2411468f33ff44707e45ab34cd359d2c3b5a0f0..f38e651dd1b58dcaeafb07cb4787a9dec83e6280 100644 (file)
@@ -47,9 +47,11 @@ static void __init dmi_add_platform_ipmi(unsigned long base_addr,
        memset(&p, 0, sizeof(p));
 
        name = "dmi-ipmi-si";
+       p.iftype = IPMI_PLAT_IF_SI;
        switch (type) {
        case IPMI_DMI_TYPE_SSIF:
                name = "dmi-ipmi-ssif";
+               p.iftype = IPMI_PLAT_IF_SSIF;
                p.type = SI_TYPE_INVALID;
                break;
        case IPMI_DMI_TYPE_BT:
index 8f0ca2a848eb4ea61763fbd2ea96fc4dfef39b99..28471ff2a3a3e3400c81dbc6f59862e8815bb1dc 100644 (file)
@@ -12,7 +12,7 @@ struct platform_device *ipmi_platform_add(const char *name, unsigned int inst,
                                          struct ipmi_plat_data *p)
 {
        struct platform_device *pdev;
-       unsigned int num_r = 1, size, pidx = 0;
+       unsigned int num_r = 1, size = 0, pidx = 0;
        struct resource r[4];
        struct property_entry pr[6];
        u32 flags;
@@ -21,19 +21,22 @@ struct platform_device *ipmi_platform_add(const char *name, unsigned int inst,
        memset(pr, 0, sizeof(pr));
        memset(r, 0, sizeof(r));
 
-       if (p->type == SI_BT)
-               size = 3;
-       else if (p->type == SI_TYPE_INVALID)
-               size = 0;
-       else
-               size = 2;
+       if (p->iftype == IPMI_PLAT_IF_SI) {
+               if (p->type == SI_BT)
+                       size = 3;
+               else if (p->type != SI_TYPE_INVALID)
+                       size = 2;
+
+               if (p->regsize == 0)
+                       p->regsize = DEFAULT_REGSIZE;
+               if (p->regspacing == 0)
+                       p->regspacing = p->regsize;
 
-       if (p->regsize == 0)
-               p->regsize = DEFAULT_REGSIZE;
-       if (p->regspacing == 0)
-               p->regspacing = p->regsize;
+               pr[pidx++] = PROPERTY_ENTRY_U8("ipmi-type", p->type);
+       } else if (p->iftype == IPMI_PLAT_IF_SSIF) {
+               pr[pidx++] = PROPERTY_ENTRY_U16("i2c-addr", p->addr);
+       }
 
-       pr[pidx++] = PROPERTY_ENTRY_U8("ipmi-type", p->type);
        if (p->slave_addr)
                pr[pidx++] = PROPERTY_ENTRY_U8("slave-addr", p->slave_addr);
        pr[pidx++] = PROPERTY_ENTRY_U8("addr-source", p->addr_source);
index 567cfcec8ada399c81c643a0e58185286a47a229..9ba744ea957136b398671a95a56f972ee256bac3 100644 (file)
@@ -6,7 +6,10 @@
 
 #include <linux/ipmi.h>
 
+enum ipmi_plat_interface_type { IPMI_PLAT_IF_SI, IPMI_PLAT_IF_SSIF };
+
 struct ipmi_plat_data {
+       enum ipmi_plat_interface_type iftype;
        unsigned int type; /* si_type for si, SI_INVALID for others */
        unsigned int space; /* addr_space for si, intf# for ssif. */
        unsigned long addr;
index 682221eebd66101cb67b04e2ac979ab7caeae51c..f6ece756950453fb92bf0f5d0837bb817234863e 100644 (file)
@@ -83,6 +83,7 @@ static void __init ipmi_hardcode_init_one(const char *si_type_str,
 
        memset(&p, 0, sizeof(p));
 
+       p.iftype = IPMI_PLAT_IF_SI;
        if (!si_type_str || !*si_type_str || strcmp(si_type_str, "kcs") == 0) {
                p.type = SI_KCS;
        } else if (strcmp(si_type_str, "smic") == 0) {
index 03140f6cdf6faab87970d8b1cc2cc123a42802bd..42a925f8cf69e6923dced09f2fb392edd523446b 100644 (file)
@@ -108,6 +108,7 @@ static int parse_hotmod_str(const char *curr, enum hotmod_op *op,
        int rv;
        unsigned int ival;
 
+       h->iftype = IPMI_PLAT_IF_SI;
        rv = parse_str(hotmod_ops, &ival, "operation", &curr);
        if (rv)
                return rv;