]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
mfd: intel-m10-bmc: Split into core and spi specific parts
authorIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
Mon, 16 Jan 2023 10:08:38 +0000 (12:08 +0200)
committerLee Jones <lee@kernel.org>
Fri, 27 Jan 2023 10:35:00 +0000 (10:35 +0000)
Split the common code from intel-m10-bmc driver into intel-m10-bmc-core
and move the SPI bus parts into an interface specific file.

intel-m10-bmc-core becomes the core MFD functions which can support
multiple bus interface like SPI bus.

Co-developed-by: Tianfei zhang <tianfei.zhang@intel.com>
Signed-off-by: Tianfei zhang <tianfei.zhang@intel.com>
Reviewed-by: Russ Weight <russell.h.weight@intel.com>
Acked-by: Guenter Roeck <linux@roeck-us.net> # hwmon
Reviewed-by: Xu Yilun <yilun.xu@intel.com>
Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
Signed-off-by: Lee Jones <lee@kernel.org>
Link: https://lore.kernel.org/r/20230116100845.6153-5-ilpo.jarvinen@linux.intel.com
MAINTAINERS
drivers/fpga/Kconfig
drivers/hwmon/Kconfig
drivers/mfd/Kconfig
drivers/mfd/Makefile
drivers/mfd/intel-m10-bmc-core.c [new file with mode: 0644]
drivers/mfd/intel-m10-bmc-spi.c [moved from drivers/mfd/intel-m10-bmc.c with 59% similarity]
include/linux/mfd/intel-m10-bmc.h

index f61eb221415bd490a4b29945bc284b313562721f..261c1dc793bc825cdc07c26b1ad3c49c68b6758d 100644 (file)
@@ -10576,7 +10576,7 @@ S:      Maintained
 F:     Documentation/ABI/testing/sysfs-driver-intel-m10-bmc
 F:     Documentation/hwmon/intel-m10-bmc-hwmon.rst
 F:     drivers/hwmon/intel-m10-bmc-hwmon.c
-F:     drivers/mfd/intel-m10-bmc.c
+F:     drivers/mfd/intel-m10-bmc*
 F:     include/linux/mfd/intel-m10-bmc.h
 
 INTEL MENLOW THERMAL DRIVER
index 6ce143dafd049540a81b5dc57048b9a1dda8778a..0a00763b9f28a8f2643ce53cbf35a2388e93b493 100644 (file)
@@ -246,7 +246,7 @@ config FPGA_MGR_VERSAL_FPGA
 
 config FPGA_M10_BMC_SEC_UPDATE
        tristate "Intel MAX10 BMC Secure Update driver"
-       depends on MFD_INTEL_M10_BMC
+       depends on MFD_INTEL_M10_BMC_CORE
        select FW_LOADER
        select FW_UPLOAD
        help
index 3176c33af6c699d1d8390f2f1c26508c5816468e..42c28e887df38d93b13768363bb578812dc765c1 100644 (file)
@@ -2341,7 +2341,7 @@ config SENSORS_XGENE
 
 config SENSORS_INTEL_M10_BMC_HWMON
        tristate "Intel MAX10 BMC Hardware Monitoring"
-       depends on MFD_INTEL_M10_BMC
+       depends on MFD_INTEL_M10_BMC_CORE
        help
          This driver provides support for the hardware monitoring functionality
          on Intel MAX10 BMC chip.
index 30db49f3186680ae02892295a30e3d857fae7dfe..b6ab85831cde86de6879899a1481ff2d29bcde42 100644 (file)
@@ -2224,18 +2224,24 @@ config SGI_MFD_IOC3
          If you have an SGI Origin, Octane, or a PCI IOC3 card,
          then say Y. Otherwise say N.
 
-config MFD_INTEL_M10_BMC
-       tristate "Intel MAX 10 Board Management Controller"
-       depends on SPI_MASTER
-       select REGMAP_SPI_AVMM
-       select MFD_CORE
-       help
-         Support for the Intel MAX 10 board management controller using the
-         SPI interface.
-
-         This driver provides common support for accessing the device,
-         additional drivers must be enabled in order to use the functionality
-         of the device.
+config MFD_INTEL_M10_BMC_CORE
+        tristate
+        select MFD_CORE
+        select REGMAP
+        default n
+
+config MFD_INTEL_M10_BMC_SPI
+        tristate "Intel MAX 10 Board Management Controller with SPI"
+        depends on SPI_MASTER
+        select MFD_INTEL_M10_BMC_CORE
+        select REGMAP_SPI_AVMM
+        help
+          Support for the Intel MAX 10 board management controller using the
+          SPI interface.
+
+          This driver provides common support for accessing the device,
+          additional drivers must be enabled in order to use the functionality
+          of the device.
 
 config MFD_RSMU_I2C
        tristate "Renesas Synchronization Management Unit with I2C"
index 457471478a9379a6a9b06421d8041f3737f4b2f6..b360b29150b556add3155a4a5ebb6968ea6b907d 100644 (file)
@@ -269,7 +269,9 @@ obj-$(CONFIG_MFD_QCOM_PM8008)       += qcom-pm8008.o
 obj-$(CONFIG_SGI_MFD_IOC3)     += ioc3.o
 obj-$(CONFIG_MFD_SIMPLE_MFD_I2C)       += simple-mfd-i2c.o
 obj-$(CONFIG_MFD_SMPRO)                += smpro-core.o
-obj-$(CONFIG_MFD_INTEL_M10_BMC)   += intel-m10-bmc.o
+
+obj-$(CONFIG_MFD_INTEL_M10_BMC_CORE)   += intel-m10-bmc-core.o
+obj-$(CONFIG_MFD_INTEL_M10_BMC_SPI)    += intel-m10-bmc-spi.o
 
 obj-$(CONFIG_MFD_ATC260X)      += atc260x-core.o
 obj-$(CONFIG_MFD_ATC260X_I2C)  += atc260x-i2c.o
diff --git a/drivers/mfd/intel-m10-bmc-core.c b/drivers/mfd/intel-m10-bmc-core.c
new file mode 100644 (file)
index 0000000..dd26e3a
--- /dev/null
@@ -0,0 +1,122 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Intel MAX 10 Board Management Controller chip - common code
+ *
+ * Copyright (C) 2018-2020 Intel Corporation. All rights reserved.
+ */
+
+#include <linux/bitfield.h>
+#include <linux/device.h>
+#include <linux/dev_printk.h>
+#include <linux/mfd/core.h>
+#include <linux/mfd/intel-m10-bmc.h>
+#include <linux/module.h>
+
+static ssize_t bmc_version_show(struct device *dev,
+                               struct device_attribute *attr, char *buf)
+{
+       struct intel_m10bmc *ddata = dev_get_drvdata(dev);
+       unsigned int val;
+       int ret;
+
+       ret = m10bmc_sys_read(ddata, M10BMC_BUILD_VER, &val);
+       if (ret)
+               return ret;
+
+       return sprintf(buf, "0x%x\n", val);
+}
+static DEVICE_ATTR_RO(bmc_version);
+
+static ssize_t bmcfw_version_show(struct device *dev,
+                                 struct device_attribute *attr, char *buf)
+{
+       struct intel_m10bmc *ddata = dev_get_drvdata(dev);
+       unsigned int val;
+       int ret;
+
+       ret = m10bmc_sys_read(ddata, NIOS2_FW_VERSION, &val);
+       if (ret)
+               return ret;
+
+       return sprintf(buf, "0x%x\n", val);
+}
+static DEVICE_ATTR_RO(bmcfw_version);
+
+static ssize_t mac_address_show(struct device *dev,
+                               struct device_attribute *attr, char *buf)
+{
+       struct intel_m10bmc *ddata = dev_get_drvdata(dev);
+       unsigned int macaddr_low, macaddr_high;
+       int ret;
+
+       ret = m10bmc_sys_read(ddata, M10BMC_MAC_LOW, &macaddr_low);
+       if (ret)
+               return ret;
+
+       ret = m10bmc_sys_read(ddata, M10BMC_MAC_HIGH, &macaddr_high);
+       if (ret)
+               return ret;
+
+       return sysfs_emit(buf, "%02x:%02x:%02x:%02x:%02x:%02x\n",
+                         (u8)FIELD_GET(M10BMC_MAC_BYTE1, macaddr_low),
+                         (u8)FIELD_GET(M10BMC_MAC_BYTE2, macaddr_low),
+                         (u8)FIELD_GET(M10BMC_MAC_BYTE3, macaddr_low),
+                         (u8)FIELD_GET(M10BMC_MAC_BYTE4, macaddr_low),
+                         (u8)FIELD_GET(M10BMC_MAC_BYTE5, macaddr_high),
+                         (u8)FIELD_GET(M10BMC_MAC_BYTE6, macaddr_high));
+}
+static DEVICE_ATTR_RO(mac_address);
+
+static ssize_t mac_count_show(struct device *dev,
+                             struct device_attribute *attr, char *buf)
+{
+       struct intel_m10bmc *ddata = dev_get_drvdata(dev);
+       unsigned int macaddr_high;
+       int ret;
+
+       ret = m10bmc_sys_read(ddata, M10BMC_MAC_HIGH, &macaddr_high);
+       if (ret)
+               return ret;
+
+       return sysfs_emit(buf, "%u\n", (u8)FIELD_GET(M10BMC_MAC_COUNT, macaddr_high));
+}
+static DEVICE_ATTR_RO(mac_count);
+
+static struct attribute *m10bmc_attrs[] = {
+       &dev_attr_bmc_version.attr,
+       &dev_attr_bmcfw_version.attr,
+       &dev_attr_mac_address.attr,
+       &dev_attr_mac_count.attr,
+       NULL,
+};
+
+static const struct attribute_group m10bmc_group = {
+       .attrs = m10bmc_attrs,
+};
+
+const struct attribute_group *m10bmc_dev_groups[] = {
+       &m10bmc_group,
+       NULL,
+};
+EXPORT_SYMBOL_GPL(m10bmc_dev_groups);
+
+int m10bmc_dev_init(struct intel_m10bmc *m10bmc, const struct intel_m10bmc_platform_info *info)
+{
+       int ret;
+
+       m10bmc->info = info;
+       dev_set_drvdata(m10bmc->dev, m10bmc);
+
+       ret = devm_mfd_add_devices(m10bmc->dev, PLATFORM_DEVID_AUTO,
+                                  info->cells, info->n_cells,
+                                  NULL, 0, NULL);
+       if (ret)
+               dev_err(m10bmc->dev, "Failed to register sub-devices: %d\n", ret);
+
+       return ret;
+}
+EXPORT_SYMBOL_GPL(m10bmc_dev_init);
+
+MODULE_DESCRIPTION("Intel MAX 10 BMC core driver");
+MODULE_AUTHOR("Intel Corporation");
+MODULE_LICENSE("GPL v2");
similarity index 59%
rename from drivers/mfd/intel-m10-bmc.c
rename to drivers/mfd/intel-m10-bmc-spi.c
index 2c26203c47998ab4e5d00ce31e5815ea431e357c..be1d4ddedabb76bb6ebb6fd4081a9fff2616d19e 100644 (file)
@@ -5,29 +5,14 @@
  * Copyright (C) 2018-2020 Intel Corporation. All rights reserved.
  */
 #include <linux/bitfield.h>
+#include <linux/dev_printk.h>
 #include <linux/init.h>
 #include <linux/mfd/core.h>
 #include <linux/mfd/intel-m10-bmc.h>
 #include <linux/module.h>
-#include <linux/mutex.h>
 #include <linux/regmap.h>
 #include <linux/spi/spi.h>
 
-static struct mfd_cell m10bmc_d5005_subdevs[] = {
-       { .name = "d5005bmc-hwmon" },
-       { .name = "d5005bmc-sec-update" }
-};
-
-static struct mfd_cell m10bmc_pacn3000_subdevs[] = {
-       { .name = "n3000bmc-hwmon" },
-       { .name = "n3000bmc-retimer" },
-       { .name = "n3000bmc-sec-update" },
-};
-
-static struct mfd_cell m10bmc_n5010_subdevs[] = {
-       { .name = "n5010bmc-hwmon" },
-};
-
 static const struct regmap_range m10bmc_regmap_range[] = {
        regmap_reg_range(M10BMC_LEGACY_BUILD_VER, M10BMC_LEGACY_BUILD_VER),
        regmap_reg_range(M10BMC_SYS_BASE, M10BMC_SYS_END),
@@ -48,86 +33,6 @@ static struct regmap_config intel_m10bmc_regmap_config = {
        .max_register = M10BMC_MEM_END,
 };
 
-static ssize_t bmc_version_show(struct device *dev,
-                               struct device_attribute *attr, char *buf)
-{
-       struct intel_m10bmc *ddata = dev_get_drvdata(dev);
-       unsigned int val;
-       int ret;
-
-       ret = m10bmc_sys_read(ddata, M10BMC_BUILD_VER, &val);
-       if (ret)
-               return ret;
-
-       return sprintf(buf, "0x%x\n", val);
-}
-static DEVICE_ATTR_RO(bmc_version);
-
-static ssize_t bmcfw_version_show(struct device *dev,
-                                 struct device_attribute *attr, char *buf)
-{
-       struct intel_m10bmc *ddata = dev_get_drvdata(dev);
-       unsigned int val;
-       int ret;
-
-       ret = m10bmc_sys_read(ddata, NIOS2_FW_VERSION, &val);
-       if (ret)
-               return ret;
-
-       return sprintf(buf, "0x%x\n", val);
-}
-static DEVICE_ATTR_RO(bmcfw_version);
-
-static ssize_t mac_address_show(struct device *dev,
-                               struct device_attribute *attr, char *buf)
-{
-       struct intel_m10bmc *ddata = dev_get_drvdata(dev);
-       unsigned int macaddr_low, macaddr_high;
-       int ret;
-
-       ret = m10bmc_sys_read(ddata, M10BMC_MAC_LOW, &macaddr_low);
-       if (ret)
-               return ret;
-
-       ret = m10bmc_sys_read(ddata, M10BMC_MAC_HIGH, &macaddr_high);
-       if (ret)
-               return ret;
-
-       return sysfs_emit(buf, "%02x:%02x:%02x:%02x:%02x:%02x\n",
-                         (u8)FIELD_GET(M10BMC_MAC_BYTE1, macaddr_low),
-                         (u8)FIELD_GET(M10BMC_MAC_BYTE2, macaddr_low),
-                         (u8)FIELD_GET(M10BMC_MAC_BYTE3, macaddr_low),
-                         (u8)FIELD_GET(M10BMC_MAC_BYTE4, macaddr_low),
-                         (u8)FIELD_GET(M10BMC_MAC_BYTE5, macaddr_high),
-                         (u8)FIELD_GET(M10BMC_MAC_BYTE6, macaddr_high));
-}
-static DEVICE_ATTR_RO(mac_address);
-
-static ssize_t mac_count_show(struct device *dev,
-                             struct device_attribute *attr, char *buf)
-{
-       struct intel_m10bmc *ddata = dev_get_drvdata(dev);
-       unsigned int macaddr_high;
-       int ret;
-
-       ret = m10bmc_sys_read(ddata, M10BMC_MAC_HIGH, &macaddr_high);
-       if (ret)
-               return ret;
-
-       return sysfs_emit(buf, "%u\n",
-                         (u8)FIELD_GET(M10BMC_MAC_COUNT, macaddr_high));
-}
-static DEVICE_ATTR_RO(mac_count);
-
-static struct attribute *m10bmc_attrs[] = {
-       &dev_attr_bmc_version.attr,
-       &dev_attr_bmcfw_version.attr,
-       &dev_attr_mac_address.attr,
-       &dev_attr_mac_count.attr,
-       NULL,
-};
-ATTRIBUTE_GROUPS(m10bmc);
-
 static int check_m10bmc_version(struct intel_m10bmc *ddata)
 {
        unsigned int v;
@@ -166,11 +71,9 @@ static int intel_m10_bmc_spi_probe(struct spi_device *spi)
                return -ENOMEM;
 
        info = (struct intel_m10bmc_platform_info *)id->driver_data;
-       ddata->info = info;
        ddata->dev = dev;
 
-       ddata->regmap =
-               devm_regmap_init_spi_avmm(spi, &intel_m10bmc_regmap_config);
+       ddata->regmap = devm_regmap_init_spi_avmm(spi, &intel_m10bmc_regmap_config);
        if (IS_ERR(ddata->regmap)) {
                ret = PTR_ERR(ddata->regmap);
                dev_err(dev, "Failed to allocate regmap: %d\n", ret);
@@ -185,15 +88,24 @@ static int intel_m10_bmc_spi_probe(struct spi_device *spi)
                return ret;
        }
 
-       ret = devm_mfd_add_devices(dev, PLATFORM_DEVID_AUTO,
-                                  info->cells, info->n_cells,
-                                  NULL, 0, NULL);
-       if (ret)
-               dev_err(dev, "Failed to register sub-devices: %d\n", ret);
-
-       return ret;
+       return m10bmc_dev_init(ddata, info);
 }
 
+static struct mfd_cell m10bmc_d5005_subdevs[] = {
+       { .name = "d5005bmc-hwmon" },
+       { .name = "d5005bmc-sec-update" },
+};
+
+static struct mfd_cell m10bmc_pacn3000_subdevs[] = {
+       { .name = "n3000bmc-hwmon" },
+       { .name = "n3000bmc-retimer" },
+       { .name = "n3000bmc-sec-update" },
+};
+
+static struct mfd_cell m10bmc_n5010_subdevs[] = {
+       { .name = "n5010bmc-hwmon" },
+};
+
 static const struct intel_m10bmc_platform_info m10bmc_spi_n3000 = {
        .cells = m10bmc_pacn3000_subdevs,
        .n_cells = ARRAY_SIZE(m10bmc_pacn3000_subdevs),
@@ -220,14 +132,14 @@ MODULE_DEVICE_TABLE(spi, m10bmc_spi_id);
 static struct spi_driver intel_m10bmc_spi_driver = {
        .driver = {
                .name = "intel-m10-bmc",
-               .dev_groups = m10bmc_groups,
+               .dev_groups = m10bmc_dev_groups,
        },
        .probe = intel_m10_bmc_spi_probe,
        .id_table = m10bmc_spi_id,
 };
 module_spi_driver(intel_m10bmc_spi_driver);
 
-MODULE_DESCRIPTION("Intel MAX 10 BMC Device Driver");
+MODULE_DESCRIPTION("Intel MAX 10 BMC SPI bus interface");
 MODULE_AUTHOR("Intel Corporation");
 MODULE_LICENSE("GPL v2");
 MODULE_ALIAS("spi:intel-m10-bmc");
index f418cad88e643f3322451a238bb4de65931e0f8b..a80deb61b69a59f7f3d31f3400de51ca9ad1a93c 100644 (file)
@@ -174,4 +174,10 @@ m10bmc_raw_read(struct intel_m10bmc *m10bmc, unsigned int addr,
 #define m10bmc_sys_read(m10bmc, offset, val) \
        m10bmc_raw_read(m10bmc, M10BMC_SYS_BASE + (offset), val)
 
+/*
+ * MAX10 BMC Core support
+ */
+int m10bmc_dev_init(struct intel_m10bmc *m10bmc, const struct intel_m10bmc_platform_info *info);
+extern const struct attribute_group *m10bmc_dev_groups[];
+
 #endif /* __MFD_INTEL_M10_BMC_H */