platform/mellanox: mlxreg-hotplug: Add support for new capability register
authorVadim Pasternak <vadimp@mellanox.com>
Mon, 13 Jan 2020 16:28:38 +0000 (16:28 +0000)
committerAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Mon, 13 Jan 2020 19:02:46 +0000 (21:02 +0200)
Add support for capability register, which is used for detection of the
actual number of interrupt capable components within the particular
group, supported by the specific system.
Such components could be for example the number of power units and
interrupts related to these units.
The motivation is to avoid adding a new code in the future in order to
distinct between the systems type supported different number of the
components like power supplies, FANs, ASICs, line cards.

Signed-off-by: Vadim Pasternak <vadimp@mellanox.com>
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
drivers/platform/mellanox/mlxreg-hotplug.c
include/linux/platform_data/mlxreg.h

index 706207d192aeba3ceabbc405e4f121405c311781..77be37a1fbcf58f30f135234d67294444ee46fda 100644 (file)
@@ -504,6 +504,20 @@ static int mlxreg_hotplug_set_irq(struct mlxreg_hotplug_priv_data *priv)
        item = pdata->items;
 
        for (i = 0; i < pdata->counter; i++, item++) {
+               if (item->capability) {
+                       /*
+                        * Read group capability register to get actual number
+                        * of interrupt capable components and set group mask
+                        * accordingly.
+                        */
+                       ret = regmap_read(priv->regmap, item->capability,
+                                         &regval);
+                       if (ret)
+                               goto out;
+
+                       item->mask = GENMASK((regval & item->mask) - 1, 0);
+               }
+
                /* Clear group presense event. */
                ret = regmap_write(priv->regmap, item->reg +
                                   MLXREG_HOTPLUG_EVENT_OFF, 0);
index 6d54fe3bcac9c934e679d53d8101e3da81a88d4e..b8da8aef24464fdcea202f9cb20f5393e32a8a11 100644 (file)
@@ -101,6 +101,7 @@ struct mlxreg_core_data {
  * @aggr_mask: group aggregation mask;
  * @reg: group interrupt status register;
  * @mask: group interrupt mask;
+ * @capability: group capability register;
  * @cache: last status value for elements fro the same group;
  * @count: number of available elements in the group;
  * @ind: element's index inside the group;
@@ -112,6 +113,7 @@ struct mlxreg_core_item {
        u32 aggr_mask;
        u32 reg;
        u32 mask;
+       u32 capability;
        u32 cache;
        u8 count;
        u8 ind;