Subject: [PATCH v3 0/3] mtk-socinfo driver implementation

v3 changes:
changes dts:
1. remove socinfo node so mtk-socinfo can be registered from mtk-efuse
2. add unit address to mtk-socinfo nodes

mtk-socinfo.c:
1. add static to previously global variables
2. remove the check on soc_dev in mtk_socinfo_remove
3. Drop .owner from platform_driver mtk_socinfo
4. Instead of probing from devicetree, socinfo is registered from
mtk-efuse

mtk-efuse.c:
1. Add mtk-efuse name to nvmem_config to avoid confusion with future
nvmem nodes
2. register mtk-socinfo from mtk-efuse

William-tw Lin (3):
arm64: dts: Add node for chip info driver
soc: mediatek: mtk-socinfo: Add driver for getting chip information
nvmem: mtk-efuse: Modify driver for getting chip information

arch/arm64/boot/dts/mediatek/mt8173.dtsi | 9 ++
arch/arm64/boot/dts/mediatek/mt8183.dtsi | 9 ++
arch/arm64/boot/dts/mediatek/mt8186.dtsi | 4 +
arch/arm64/boot/dts/mediatek/mt8192.dtsi | 8 +
arch/arm64/boot/dts/mediatek/mt8195.dtsi | 3 +
drivers/nvmem/mtk-efuse.c | 11 +-
drivers/soc/mediatek/Kconfig | 8 +
drivers/soc/mediatek/Makefile | 1 +
drivers/soc/mediatek/mtk-socinfo.c | 186 +++++++++++++++++++++++
9 files changed, 238 insertions(+), 1 deletion(-)
create mode 100644 drivers/soc/mediatek/mtk-socinfo.c

--
2.18.0



Subject: [PATCH v3 2/3] soc: mediatek: mtk-socinfo: Add driver for getting chip information

Add driver for socinfo retrieval. This patch includes the following:
1. mtk-socinfo driver for chip info retrieval
2. Related changes to Makefile and Kconfig

Signed-off-by: William-tw Lin <[email protected]>
---
drivers/soc/mediatek/Kconfig | 8 ++
drivers/soc/mediatek/Makefile | 1 +
drivers/soc/mediatek/mtk-socinfo.c | 186 +++++++++++++++++++++++++++++
3 files changed, 195 insertions(+)
create mode 100644 drivers/soc/mediatek/mtk-socinfo.c

diff --git a/drivers/soc/mediatek/Kconfig b/drivers/soc/mediatek/Kconfig
index 0810b5b0c688..f34d93977ba6 100644
--- a/drivers/soc/mediatek/Kconfig
+++ b/drivers/soc/mediatek/Kconfig
@@ -68,4 +68,12 @@ config MTK_SVS
chip process corner, temperatures and other factors. Then DVFS
driver could apply SVS bank voltage to PMIC/Buck.

+config MTK_SOCINFO
+ tristate "MediaTek SoC Information"
+ default y
+ help
+ The MediaTek SoC Information (mtk-socinfo) driver provides
+ information about the SoC to the userspace including the
+ manufacturer name, marketing name and soc name.
+
endmenu
diff --git a/drivers/soc/mediatek/Makefile b/drivers/soc/mediatek/Makefile
index 9d3ce7878c5c..6830512848fd 100644
--- a/drivers/soc/mediatek/Makefile
+++ b/drivers/soc/mediatek/Makefile
@@ -7,3 +7,4 @@ obj-$(CONFIG_MTK_REGULATOR_COUPLER) += mtk-regulator-coupler.o
obj-$(CONFIG_MTK_MMSYS) += mtk-mmsys.o
obj-$(CONFIG_MTK_MMSYS) += mtk-mutex.o
obj-$(CONFIG_MTK_SVS) += mtk-svs.o
+obj-$(CONFIG_MTK_SOCINFO) += mtk-socinfo.o
diff --git a/drivers/soc/mediatek/mtk-socinfo.c b/drivers/soc/mediatek/mtk-socinfo.c
new file mode 100644
index 000000000000..4a257b5c8eda
--- /dev/null
+++ b/drivers/soc/mediatek/mtk-socinfo.c
@@ -0,0 +1,186 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (c) 2023 MediaTek Inc.
+ */
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/of_platform.h>
+#include <linux/pm_runtime.h>
+#include <linux/nvmem-consumer.h>
+#include <linux/device.h>
+#include <linux/debugfs.h>
+#include <linux/seq_file.h>
+#include <linux/string.h>
+#include <linux/sys_soc.h>
+#include <linux/slab.h>
+#include <linux/platform_device.h>
+
+#define MTK_SOCINFO_ENTRY(_soc_name, _segment_name, _marketing_name, _cell_data1, _cell_data2) {\
+ .soc_name = _soc_name, \
+ .segment_name = _segment_name, \
+ .marketing_name = _marketing_name, \
+ .cell_data = {_cell_data1, _cell_data2} \
+}
+#define CELL_NOT_USED (0xFFFFFFFF)
+#define MAX_CELLS (2)
+
+struct mtk_socinfo {
+ struct device *dev;
+ struct name_data *name_data;
+ struct socinfo_data *socinfo_data;
+ struct soc_device *soc_dev;
+};
+
+struct socinfo_data {
+ char *soc_name;
+ char *segment_name;
+ char *marketing_name;
+ u32 cell_data[MAX_CELLS];
+};
+
+static const char *cell_names[MAX_CELLS] = {"socinfo-data1", "socinfo-data2"};
+
+static struct socinfo_data socinfo_data_table[] = {
+ MTK_SOCINFO_ENTRY("MT8173", "MT8173V/AC", "MT8173", 0x6CA20004, 0x10000000),
+ MTK_SOCINFO_ENTRY("MT8183", "MT8183V/AZA", "Kompanio 500", 0x00010043, 0x00000840),
+ MTK_SOCINFO_ENTRY("MT8186", "MT8186GV/AZA", "Kompanio 520", 0x81861001, CELL_NOT_USED),
+ MTK_SOCINFO_ENTRY("MT8186T", "MT8186TV/AZA", "Kompanio 528", 0x81862001, CELL_NOT_USED),
+ MTK_SOCINFO_ENTRY("MT8188", "MT8188GV/AZA", "Kompanio 830", 0x81880000, 0x00000010),
+ MTK_SOCINFO_ENTRY("MT8188", "MT8188GV/HZA", "Kompanio 830", 0x81880000, 0x00000011),
+ MTK_SOCINFO_ENTRY("MT8192", "MT8192V/AZA", "Kompanio 820", 0x00001100, 0x00040080),
+ MTK_SOCINFO_ENTRY("MT8192T", "MT8192V/ATZA", "Kompanio 828", 0x00000100, 0x000400C0),
+ MTK_SOCINFO_ENTRY("MT8195", "MT8195GV/EZA", "Kompanio 1200", 0x81950300, CELL_NOT_USED),
+ MTK_SOCINFO_ENTRY("MT8195", "MT8195GV/EHZA", "Kompanio 1200", 0x81950304, CELL_NOT_USED),
+ MTK_SOCINFO_ENTRY("MT8195", "MT8195TV/EZA", "Kompanio 1380", 0x81950400, CELL_NOT_USED),
+ MTK_SOCINFO_ENTRY("MT8195", "MT8195TV/EHZA", "Kompanio 1380", 0x81950404, CELL_NOT_USED),
+};
+
+static int mtk_socinfo_create_socinfo_node(struct mtk_socinfo *mtk_socinfop)
+{
+ struct soc_device_attribute *attrs;
+ static char machine[30] = {0};
+ static const char *soc_manufacturer = "MediaTek";
+
+ attrs = devm_kzalloc(mtk_socinfop->dev, sizeof(*attrs), GFP_KERNEL);
+ if (!attrs)
+ return -ENOMEM;
+
+ snprintf(machine, sizeof(machine), "%s (%s)", mtk_socinfop->socinfo_data->marketing_name,
+ mtk_socinfop->socinfo_data->soc_name);
+ attrs->family = soc_manufacturer;
+ attrs->machine = machine;
+
+ mtk_socinfop->soc_dev = soc_device_register(attrs);
+ if (IS_ERR(mtk_socinfop->soc_dev))
+ return PTR_ERR(mtk_socinfop->soc_dev);
+
+ dev_info(mtk_socinfop->dev, "%s %s SoC detected.\n", soc_manufacturer, attrs->machine);
+ return 0;
+}
+
+static u32 mtk_socinfo_read_cell(struct device *dev, const char *name)
+{
+ struct nvmem_device *nvmemp;
+ struct device_node *np = dev->of_node;
+ u32 offset;
+ u32 cell_val = CELL_NOT_USED;
+
+ nvmemp = devm_nvmem_device_get(dev, "mtk-efuse0");
+ if (IS_ERR(nvmemp))
+ goto out;
+
+ np = of_find_node_by_name(NULL, name);
+ if (!np)
+ goto out;
+
+ if (of_property_read_u32_index(np, "reg", 0, &offset))
+ goto out;
+
+ nvmem_device_read(nvmemp, offset, sizeof(cell_val), &cell_val);
+
+ nvmem_device_put(nvmemp);
+
+out:
+ return cell_val;
+}
+
+static int mtk_socinfo_get_socinfo_data(struct mtk_socinfo *mtk_socinfop)
+{
+ unsigned int i, j;
+ unsigned int num_cell_data = 0;
+ u32 cell_data[MAX_CELLS] = {0};
+ bool match_socinfo;
+ int match_socinfo_index = -1;
+
+ for (i = 0; i < MAX_CELLS; i++) {
+ cell_data[i] = mtk_socinfo_read_cell(mtk_socinfop->dev, cell_names[i]);
+ if (cell_data[i] != CELL_NOT_USED)
+ num_cell_data++;
+ else
+ break;
+ }
+
+ if (!num_cell_data)
+ return -ENOENT;
+
+ for (i = 0; i < ARRAY_SIZE(socinfo_data_table); i++) {
+ match_socinfo = true;
+ for (j = 0; j < num_cell_data; j++) {
+ if (cell_data[j] != socinfo_data_table[i].cell_data[j]) {
+ match_socinfo = false;
+ break;
+ }
+ }
+ if (match_socinfo) {
+ mtk_socinfop->socinfo_data = &(socinfo_data_table[i]);
+ match_socinfo_index = i;
+ break;
+ }
+ }
+
+ return match_socinfo_index >= 0 ? match_socinfo_index : -ENOENT;
+}
+
+static int mtk_socinfo_probe(struct platform_device *pdev)
+{
+ struct mtk_socinfo *mtk_socinfop;
+ int ret;
+
+ mtk_socinfop = devm_kzalloc(&pdev->dev, sizeof(*mtk_socinfop), GFP_KERNEL);
+ if (!mtk_socinfop)
+ return -ENOMEM;
+
+ mtk_socinfop->dev = &pdev->dev;
+
+ ret = mtk_socinfo_get_socinfo_data(mtk_socinfop);
+ if (ret < 0)
+ return dev_err_probe(mtk_socinfop->dev, ret, "Failed to get socinfo data\n");
+
+ ret = mtk_socinfo_create_socinfo_node(mtk_socinfop);
+ if (ret)
+ return dev_err_probe(mtk_socinfop->dev, ret, "Cannot create node\n");
+
+ platform_set_drvdata(pdev, mtk_socinfop);
+ return 0;
+}
+
+static void mtk_socinfo_remove(struct platform_device *pdev)
+{
+ struct mtk_socinfo *mtk_socinfop = platform_get_drvdata(pdev);
+
+ soc_device_unregister(mtk_socinfop->soc_dev);
+}
+
+static struct platform_driver mtk_socinfo = {
+ .probe = mtk_socinfo_probe,
+ .remove_new = mtk_socinfo_remove,
+ .driver = {
+ .name = "mtk-socinfo",
+ },
+};
+builtin_platform_driver(mtk_socinfo);
+
+MODULE_AUTHOR("William-TW LIN <[email protected]>");
+MODULE_DESCRIPTION("MediaTek socinfo driver");
+MODULE_LICENSE("GPL");
--
2.18.0


Subject: [PATCH v3 3/3] nvmem: mtk-efuse: Modify driver for getting chip information

Retrieval of soc info is needed. This patch includes the following:
1. Register socinfo device in mtk-efuse.c

Signed-off-by: William-tw Lin <[email protected]>
---
drivers/nvmem/mtk-efuse.c | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/drivers/nvmem/mtk-efuse.c b/drivers/nvmem/mtk-efuse.c
index 84f05b40a411..3914e039e288 100644
--- a/drivers/nvmem/mtk-efuse.c
+++ b/drivers/nvmem/mtk-efuse.c
@@ -68,6 +68,7 @@ static int mtk_efuse_probe(struct platform_device *pdev)
struct nvmem_config econfig = {};
struct mtk_efuse_priv *priv;
const struct mtk_efuse_pdata *pdata;
+ struct platform_device *socinfo;

priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
if (!priv)
@@ -85,11 +86,19 @@ static int mtk_efuse_probe(struct platform_device *pdev)
econfig.size = resource_size(res);
econfig.priv = priv;
econfig.dev = dev;
+ econfig.name = "mtk-efuse";
if (pdata->uses_post_processing)
econfig.fixup_dt_cell_info = &mtk_efuse_fixup_dt_cell_info;
nvmem = devm_nvmem_register(dev, &econfig);
+ if (IS_ERR(nvmem))
+ return PTR_ERR(nvmem);

- return PTR_ERR_OR_ZERO(nvmem);
+ socinfo = platform_device_register_data(&pdev->dev, "mtk-socinfo",
+ PLATFORM_DEVID_AUTO, NULL, 0);
+ if (IS_ERR(socinfo))
+ dev_info(dev, "MediaTek SoC Information will be unavailable\n");
+
+ return 0;
}

static const struct mtk_efuse_pdata mtk_mt8186_efuse_pdata = {
--
2.18.0


Subject: [PATCH v3 1/3] arm64: dts: Add node for chip info driver

Add dts node for socinfo retrieval for the following projects:
MT8173, MT8183, MT8186, MT8192, MT8195

Signed-off-by: William-tw Lin <[email protected]>
---
arch/arm64/boot/dts/mediatek/mt8173.dtsi | 9 +++++++++
arch/arm64/boot/dts/mediatek/mt8183.dtsi | 9 +++++++++
arch/arm64/boot/dts/mediatek/mt8186.dtsi | 4 ++++
arch/arm64/boot/dts/mediatek/mt8192.dtsi | 8 ++++++++
arch/arm64/boot/dts/mediatek/mt8195.dtsi | 3 +++
5 files changed, 33 insertions(+)

diff --git a/arch/arm64/boot/dts/mediatek/mt8173.dtsi b/arch/arm64/boot/dts/mediatek/mt8173.dtsi
index c47d7d900f28..06916e60679a 100644
--- a/arch/arm64/boot/dts/mediatek/mt8173.dtsi
+++ b/arch/arm64/boot/dts/mediatek/mt8173.dtsi
@@ -590,6 +590,15 @@
reg = <0 0x10206000 0 0x1000>;
#address-cells = <1>;
#size-cells = <1>;
+
+ socinfo_data1: socinfo-data1@40 {
+ reg = <0x040 0x4>;
+ };
+
+ socinfo_data2: socinfo-data2@44 {
+ reg = <0x044 0x4>;
+ };
+
thermal_calibration: calib@528 {
reg = <0x528 0xc>;
};
diff --git a/arch/arm64/boot/dts/mediatek/mt8183.dtsi b/arch/arm64/boot/dts/mediatek/mt8183.dtsi
index 976dc968b3ca..d39c25db042e 100644
--- a/arch/arm64/boot/dts/mediatek/mt8183.dtsi
+++ b/arch/arm64/boot/dts/mediatek/mt8183.dtsi
@@ -1585,6 +1585,15 @@
reg = <0 0x11f10000 0 0x1000>;
#address-cells = <1>;
#size-cells = <1>;
+
+ socinfo_data1: socinfo-data1@4c {
+ reg = <0x04c 0x4>;
+ };
+
+ socinfo_data2: socinfo-data2@60 {
+ reg = <0x060 0x4>;
+ };
+
thermal_calibration: calib@180 {
reg = <0x180 0xc>;
};
diff --git a/arch/arm64/boot/dts/mediatek/mt8186.dtsi b/arch/arm64/boot/dts/mediatek/mt8186.dtsi
index df0c04f2ba1d..0e2f6fe14081 100644
--- a/arch/arm64/boot/dts/mediatek/mt8186.dtsi
+++ b/arch/arm64/boot/dts/mediatek/mt8186.dtsi
@@ -1672,6 +1672,10 @@
reg = <0x59c 0x4>;
bits = <0 3>;
};
+
+ socinfo_data1: socinfo-data1@7a0 {
+ reg = <0x7a0 0x4>;
+ };
};

mipi_tx0: dsi-phy@11cc0000 {
diff --git a/arch/arm64/boot/dts/mediatek/mt8192.dtsi b/arch/arm64/boot/dts/mediatek/mt8192.dtsi
index 69f4cded5dbb..a329b430429f 100644
--- a/arch/arm64/boot/dts/mediatek/mt8192.dtsi
+++ b/arch/arm64/boot/dts/mediatek/mt8192.dtsi
@@ -1120,6 +1120,14 @@
#address-cells = <1>;
#size-cells = <1>;

+ socinfo_data1: socinfo-data1@44 {
+ reg = <0x044 0x4>;
+ };
+
+ socinfo_data2: socinfo-data2@50 {
+ reg = <0x050 0x4>;
+ };
+
lvts_e_data1: data1@1c0 {
reg = <0x1c0 0x58>;
};
diff --git a/arch/arm64/boot/dts/mediatek/mt8195.dtsi b/arch/arm64/boot/dts/mediatek/mt8195.dtsi
index e0ac2e9f5b72..f1926a6afa8f 100644
--- a/arch/arm64/boot/dts/mediatek/mt8195.dtsi
+++ b/arch/arm64/boot/dts/mediatek/mt8195.dtsi
@@ -1686,6 +1686,9 @@
lvts_efuse_data2: lvts2-calib@1d0 {
reg = <0x1d0 0x38>;
};
+ socinfo_data1: socinfo-data1@7a0 {
+ reg = <0x7a0 0x4>;
+ };
};

u3phy2: t-phy@11c40000 {
--
2.18.0


Subject: Re: [PATCH v3 2/3] soc: mediatek: mtk-socinfo: Add driver for getting chip information

Il 20/12/23 11:39, William-tw Lin ha scritto:
> Add driver for socinfo retrieval. This patch includes the following:
> 1. mtk-socinfo driver for chip info retrieval
> 2. Related changes to Makefile and Kconfig
>
> Signed-off-by: William-tw Lin <[email protected]>
> ---
> drivers/soc/mediatek/Kconfig | 8 ++
> drivers/soc/mediatek/Makefile | 1 +
> drivers/soc/mediatek/mtk-socinfo.c | 186 +++++++++++++++++++++++++++++
> 3 files changed, 195 insertions(+)
> create mode 100644 drivers/soc/mediatek/mtk-socinfo.c
>
> diff --git a/drivers/soc/mediatek/Kconfig b/drivers/soc/mediatek/Kconfig
> index 0810b5b0c688..f34d93977ba6 100644
> --- a/drivers/soc/mediatek/Kconfig
> +++ b/drivers/soc/mediatek/Kconfig
> @@ -68,4 +68,12 @@ config MTK_SVS
> chip process corner, temperatures and other factors. Then DVFS
> driver could apply SVS bank voltage to PMIC/Buck.
>
> +config MTK_SOCINFO
> + tristate "MediaTek SoC Information"
> + default y

Add the dependency please.

depends on NVMEM_MTK_EFUSE

> + help
> + The MediaTek SoC Information (mtk-socinfo) driver provides
> + information about the SoC to the userspace including the
> + manufacturer name, marketing name and soc name.
> +
> endmenu
> diff --git a/drivers/soc/mediatek/Makefile b/drivers/soc/mediatek/Makefile
> index 9d3ce7878c5c..6830512848fd 100644
> --- a/drivers/soc/mediatek/Makefile
> +++ b/drivers/soc/mediatek/Makefile
> @@ -7,3 +7,4 @@ obj-$(CONFIG_MTK_REGULATOR_COUPLER) += mtk-regulator-coupler.o
> obj-$(CONFIG_MTK_MMSYS) += mtk-mmsys.o
> obj-$(CONFIG_MTK_MMSYS) += mtk-mutex.o
> obj-$(CONFIG_MTK_SVS) += mtk-svs.o
> +obj-$(CONFIG_MTK_SOCINFO) += mtk-socinfo.o
> diff --git a/drivers/soc/mediatek/mtk-socinfo.c b/drivers/soc/mediatek/mtk-socinfo.c
> new file mode 100644
> index 000000000000..4a257b5c8eda
> --- /dev/null
> +++ b/drivers/soc/mediatek/mtk-socinfo.c
> @@ -0,0 +1,186 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * Copyright (c) 2023 MediaTek Inc.
> + */
> +#include <linux/kernel.h>
> +#include <linux/module.h>
> +#include <linux/of.h>
> +#include <linux/of_platform.h>
> +#include <linux/pm_runtime.h>
> +#include <linux/nvmem-consumer.h>
> +#include <linux/device.h>
> +#include <linux/debugfs.h>
> +#include <linux/seq_file.h>
> +#include <linux/string.h>
> +#include <linux/sys_soc.h>
> +#include <linux/slab.h>
> +#include <linux/platform_device.h>
> +
> +#define MTK_SOCINFO_ENTRY(_soc_name, _segment_name, _marketing_name, _cell_data1, _cell_data2) {\
> + .soc_name = _soc_name, \
> + .segment_name = _segment_name, \
> + .marketing_name = _marketing_name, \
> + .cell_data = {_cell_data1, _cell_data2} \
> +}
> +#define CELL_NOT_USED (0xFFFFFFFF)
> +#define MAX_CELLS (2)
> +
> +struct mtk_socinfo {
> + struct device *dev;
> + struct name_data *name_data;
> + struct socinfo_data *socinfo_data;
> + struct soc_device *soc_dev;
> +};
> +
> +struct socinfo_data {
> + char *soc_name;
> + char *segment_name;
> + char *marketing_name;
> + u32 cell_data[MAX_CELLS];
> +};
> +
> +static const char *cell_names[MAX_CELLS] = {"socinfo-data1", "socinfo-data2"};
> +
> +static struct socinfo_data socinfo_data_table[] = {
> + MTK_SOCINFO_ENTRY("MT8173", "MT8173V/AC", "MT8173", 0x6CA20004, 0x10000000),
> + MTK_SOCINFO_ENTRY("MT8183", "MT8183V/AZA", "Kompanio 500", 0x00010043, 0x00000840),
> + MTK_SOCINFO_ENTRY("MT8186", "MT8186GV/AZA", "Kompanio 520", 0x81861001, CELL_NOT_USED),
> + MTK_SOCINFO_ENTRY("MT8186T", "MT8186TV/AZA", "Kompanio 528", 0x81862001, CELL_NOT_USED),
> + MTK_SOCINFO_ENTRY("MT8188", "MT8188GV/AZA", "Kompanio 830", 0x81880000, 0x00000010),
> + MTK_SOCINFO_ENTRY("MT8188", "MT8188GV/HZA", "Kompanio 830", 0x81880000, 0x00000011),
> + MTK_SOCINFO_ENTRY("MT8192", "MT8192V/AZA", "Kompanio 820", 0x00001100, 0x00040080),
> + MTK_SOCINFO_ENTRY("MT8192T", "MT8192V/ATZA", "Kompanio 828", 0x00000100, 0x000400C0),
> + MTK_SOCINFO_ENTRY("MT8195", "MT8195GV/EZA", "Kompanio 1200", 0x81950300, CELL_NOT_USED),
> + MTK_SOCINFO_ENTRY("MT8195", "MT8195GV/EHZA", "Kompanio 1200", 0x81950304, CELL_NOT_USED),
> + MTK_SOCINFO_ENTRY("MT8195", "MT8195TV/EZA", "Kompanio 1380", 0x81950400, CELL_NOT_USED),
> + MTK_SOCINFO_ENTRY("MT8195", "MT8195TV/EHZA", "Kompanio 1380", 0x81950404, CELL_NOT_USED),
> +};
> +
> +static int mtk_socinfo_create_socinfo_node(struct mtk_socinfo *mtk_socinfop)
> +{
> + struct soc_device_attribute *attrs;
> + static char machine[30] = {0};
> + static const char *soc_manufacturer = "MediaTek";
> +
> + attrs = devm_kzalloc(mtk_socinfop->dev, sizeof(*attrs), GFP_KERNEL);
> + if (!attrs)
> + return -ENOMEM;
> +
> + snprintf(machine, sizeof(machine), "%s (%s)", mtk_socinfop->socinfo_data->marketing_name,
> + mtk_socinfop->socinfo_data->soc_name);
> + attrs->family = soc_manufacturer;
> + attrs->machine = machine;
> +
> + mtk_socinfop->soc_dev = soc_device_register(attrs);
> + if (IS_ERR(mtk_socinfop->soc_dev))
> + return PTR_ERR(mtk_socinfop->soc_dev);
> +
> + dev_info(mtk_socinfop->dev, "%s %s SoC detected.\n", soc_manufacturer, attrs->machine);
> + return 0;
> +}
> +
> +static u32 mtk_socinfo_read_cell(struct device *dev, const char *name)
> +{
> + struct nvmem_device *nvmemp;
> + struct device_node *np = dev->of_node;
> + u32 offset;
> + u32 cell_val = CELL_NOT_USED;
> +
> + nvmemp = devm_nvmem_device_get(dev, "mtk-efuse0");

Are you sure that this is supposed to be "mtk-efuse0" and not "mtk-efuse"?
Looks strange.

Everything else looks ok.

Cheers,
Angelo



Subject: Re: [PATCH v3 3/3] nvmem: mtk-efuse: Modify driver for getting chip information

Il 20/12/23 11:39, William-tw Lin ha scritto:
> Retrieval of soc info is needed. This patch includes the following:
> 1. Register socinfo device in mtk-efuse.c
>

nvmem: mtk-efuse: Register MediaTek socinfo driver from efuse

The socinfo driver reads chip information from eFuses and does not need
any devicetree node. Register it from mtk-efuse.

While at it, also add the name for this driver's nvmem_config.


^^^ that's a proper commit title and description :-)

> Signed-off-by: William-tw Lin <[email protected]>
> ---
> drivers/nvmem/mtk-efuse.c | 11 ++++++++++-
> 1 file changed, 10 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/nvmem/mtk-efuse.c b/drivers/nvmem/mtk-efuse.c
> index 84f05b40a411..3914e039e288 100644
> --- a/drivers/nvmem/mtk-efuse.c
> +++ b/drivers/nvmem/mtk-efuse.c
> @@ -68,6 +68,7 @@ static int mtk_efuse_probe(struct platform_device *pdev)
> struct nvmem_config econfig = {};
> struct mtk_efuse_priv *priv;
> const struct mtk_efuse_pdata *pdata;
> + struct platform_device *socinfo;
>
> priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
> if (!priv)
> @@ -85,11 +86,19 @@ static int mtk_efuse_probe(struct platform_device *pdev)
> econfig.size = resource_size(res);
> econfig.priv = priv;
> econfig.dev = dev;
> + econfig.name = "mtk-efuse";
> if (pdata->uses_post_processing)
> econfig.fixup_dt_cell_info = &mtk_efuse_fixup_dt_cell_info;
> nvmem = devm_nvmem_register(dev, &econfig);
> + if (IS_ERR(nvmem))
> + return PTR_ERR(nvmem);
>
> - return PTR_ERR_OR_ZERO(nvmem);
> + socinfo = platform_device_register_data(&pdev->dev, "mtk-socinfo",
> + PLATFORM_DEVID_AUTO, NULL, 0);
> + if (IS_ERR(socinfo))
> + dev_info(dev, "MediaTek SoC Information will be unavailable\n");
> +

if (IS_ERR(socinfo))
dev_info(dev, "MediaTek SoC Information will be unavailable\n");

platform_set_drvdata(pdev, socinfo);
return 0;

> + return 0;
> }
>
> static const struct mtk_efuse_pdata mtk_mt8186_efuse_pdata = {


static void mtk_efuse_remove(struct platform_device *pdev)
{
struct platform_device *socinfo = platform_get_drvdata(pdev);

if (!IS_ERR_OR_NULL(socinfo))
platform_device_unregister(socinfo);
}

static struct platform_driver mtk_efuse_driver = {
.probe = mtk_efuse_probe,
.remove_new = mtk_efuse_remove, <---- add this
.driver = {
.name = "mediatek,efuse",
.of_match_table = mtk_efuse_of_match,
}
};

After those additions, it's good for me.

Thanks,
Angelo

Subject: Re: [PATCH v3 1/3] arm64: dts: Add node for chip info driver

Il 20/12/23 11:38, William-tw Lin ha scritto:
> Add dts node for socinfo retrieval for the following projects:
> MT8173, MT8183, MT8186, MT8192, MT8195
>

arm64: dts: mediatek: Add socinfo efuses to MT8173/83/96/92/95 SoCs

Add efuse nodes for socinfo retrieval for MT8173, MT8183, MT8186,
MT8192 and MT8195.



...because you're not adding a chipinfo node, but efuse nodes :-)


> Signed-off-by: William-tw Lin <[email protected]>
> ---
> arch/arm64/boot/dts/mediatek/mt8173.dtsi | 9 +++++++++
> arch/arm64/boot/dts/mediatek/mt8183.dtsi | 9 +++++++++
> arch/arm64/boot/dts/mediatek/mt8186.dtsi | 4 ++++
> arch/arm64/boot/dts/mediatek/mt8192.dtsi | 8 ++++++++
> arch/arm64/boot/dts/mediatek/mt8195.dtsi | 3 +++
> 5 files changed, 33 insertions(+)
>
> diff --git a/arch/arm64/boot/dts/mediatek/mt8173.dtsi b/arch/arm64/boot/dts/mediatek/mt8173.dtsi
> index c47d7d900f28..06916e60679a 100644
> --- a/arch/arm64/boot/dts/mediatek/mt8173.dtsi
> +++ b/arch/arm64/boot/dts/mediatek/mt8173.dtsi
> @@ -590,6 +590,15 @@
> reg = <0 0x10206000 0 0x1000>;
> #address-cells = <1>;
> #size-cells = <1>;
> +
> + socinfo_data1: socinfo-data1@40 {

Also, you don't need the phandles as those nodes will never be modified from
board specific devicetree, nor assigned to any devicetree node.

This means that you can go with just

socinfo-data1@40 {
reg ...
}

same for data2 and for all SoCs.

Apart from that, looks good to me.

Cheers,
Angelo

2023-12-20 11:36:40

by Krzysztof Kozlowski

[permalink] [raw]
Subject: Re: [PATCH v3 2/3] soc: mediatek: mtk-socinfo: Add driver for getting chip information

On 20/12/2023 11:39, William-tw Lin wrote:
> Add driver for socinfo retrieval. This patch includes the following:
> 1. mtk-socinfo driver for chip info retrieval
> 2. Related changes to Makefile and Kconfig
>
> Signed-off-by: William-tw Lin <[email protected]>

...

> +static struct platform_driver mtk_socinfo = {
> + .probe = mtk_socinfo_probe,
> + .remove_new = mtk_socinfo_remove,
> + .driver = {
> + .name = "mtk-socinfo",
> + },
> +};
> +builtin_platform_driver(mtk_socinfo);

module platform driver, because this is tristate and because this should
be a module.

Best regards,
Krzysztof


Subject: Re: [PATCH v3 2/3] soc: mediatek: mtk-socinfo: Add driver for getting chip information

Il 20/12/23 12:34, Krzysztof Kozlowski ha scritto:
> On 20/12/2023 11:39, William-tw Lin wrote:
>> Add driver for socinfo retrieval. This patch includes the following:
>> 1. mtk-socinfo driver for chip info retrieval
>> 2. Related changes to Makefile and Kconfig
>>
>> Signed-off-by: William-tw Lin <[email protected]>
>
> ...
>
>> +static struct platform_driver mtk_socinfo = {
>> + .probe = mtk_socinfo_probe,
>> + .remove_new = mtk_socinfo_remove,
>> + .driver = {
>> + .name = "mtk-socinfo",
>> + },
>> +};
>> +builtin_platform_driver(mtk_socinfo);
>
> module platform driver, because this is tristate and because this should
> be a module.
>

Oh! Yes, right! Thanks for catching that, it totally slipped off my brain.

Cheers,
Angelo



Subject: Re: [PATCH v3 2/3] soc: mediatek: mtk-socinfo: Add driver for getting chip information

Hi Krzysztof,

Thank you for the comments. The fix regarding module_platform_driver
will be provided in the next version of patches. Thanks a lot!

Best regards,
William
On Wed, 2023-12-20 at 12:34 +0100, Krzysztof Kozlowski wrote:
>
> External email : Please do not click links or open attachments until
> you have verified the sender or the content.
> On 20/12/2023 11:39, William-tw Lin wrote:
> > Add driver for socinfo retrieval. This patch includes the
> following:
> > 1. mtk-socinfo driver for chip info retrieval
> > 2. Related changes to Makefile and Kconfig
> >
> > Signed-off-by: William-tw Lin <[email protected]>
>
> ...
>
> > +static struct platform_driver mtk_socinfo = {
> > +.probe = mtk_socinfo_probe,
> > +.remove_new = mtk_socinfo_remove,
> > +.driver = {
> > +.name = "mtk-socinfo",
> > +},
> > +};
> > +builtin_platform_driver(mtk_socinfo);
>
> module platform driver, because this is tristate and because this
> should
> be a module.
>
> Best regards,
> Krzysztof

Subject: Re: [PATCH v3 2/3] soc: mediatek: mtk-socinfo: Add driver for getting chip information

On Wed, 2023-12-20 at 11:53 +0100, AngeloGioacchino Del Regno wrote:
> Il 20/12/23 11:39, William-tw Lin ha scritto:
> > Add driver for socinfo retrieval. This patch includes the
> > following:
> > 1. mtk-socinfo driver for chip info retrieval
> > 2. Related changes to Makefile and Kconfig
> >
> > Signed-off-by: William-tw Lin <[email protected]>
> > ---
> > drivers/soc/mediatek/Kconfig | 8 ++
> > drivers/soc/mediatek/Makefile | 1 +
> > drivers/soc/mediatek/mtk-socinfo.c | 186
> > +++++++++++++++++++++++++++++
> > 3 files changed, 195 insertions(+)
> > create mode 100644 drivers/soc/mediatek/mtk-socinfo.c
> >
> > diff --git a/drivers/soc/mediatek/Kconfig
> > b/drivers/soc/mediatek/Kconfig
> > index 0810b5b0c688..f34d93977ba6 100644
> > --- a/drivers/soc/mediatek/Kconfig
> > +++ b/drivers/soc/mediatek/Kconfig
> > @@ -68,4 +68,12 @@ config MTK_SVS
> > chip process corner, temperatures and other factors. Then
> > DVFS
> > driver could apply SVS bank voltage to PMIC/Buck.
> >
> > +config MTK_SOCINFO
> > + tristate "MediaTek SoC Information"
> > + default y
>
> Add the dependency please.
>
> depends on NVMEM_MTK_EFUSE
>
> > + help
> > + The MediaTek SoC Information (mtk-socinfo) driver provides
> > + information about the SoC to the userspace including the
> > + manufacturer name, marketing name and soc name.
> > +
> > endmenu
> > diff --git a/drivers/soc/mediatek/Makefile
> > b/drivers/soc/mediatek/Makefile
> > index 9d3ce7878c5c..6830512848fd 100644
> > --- a/drivers/soc/mediatek/Makefile
> > +++ b/drivers/soc/mediatek/Makefile
> > @@ -7,3 +7,4 @@ obj-$(CONFIG_MTK_REGULATOR_COUPLER) += mtk-
> > regulator-coupler.o
> > obj-$(CONFIG_MTK_MMSYS) += mtk-mmsys.o
> > obj-$(CONFIG_MTK_MMSYS) += mtk-mutex.o
> > obj-$(CONFIG_MTK_SVS) += mtk-svs.o
> > +obj-$(CONFIG_MTK_SOCINFO) += mtk-socinfo.o
> > diff --git a/drivers/soc/mediatek/mtk-socinfo.c
> > b/drivers/soc/mediatek/mtk-socinfo.c
> > new file mode 100644
> > index 000000000000..4a257b5c8eda
> > --- /dev/null
> > +++ b/drivers/soc/mediatek/mtk-socinfo.c
> > @@ -0,0 +1,186 @@
> > +// SPDX-License-Identifier: GPL-2.0
> > +/*
> > + * Copyright (c) 2023 MediaTek Inc.
> > + */
> > +#include <linux/kernel.h>
> > +#include <linux/module.h>
> > +#include <linux/of.h>
> > +#include <linux/of_platform.h>
> > +#include <linux/pm_runtime.h>
> > +#include <linux/nvmem-consumer.h>
> > +#include <linux/device.h>
> > +#include <linux/debugfs.h>
> > +#include <linux/seq_file.h>
> > +#include <linux/string.h>
> > +#include <linux/sys_soc.h>
> > +#include <linux/slab.h>
> > +#include <linux/platform_device.h>
> > +
> > +#define MTK_SOCINFO_ENTRY(_soc_name, _segment_name,
> > _marketing_name, _cell_data1, _cell_data2) {\
> > + .soc_name = _soc_name,
> > \
> > + .segment_name = _segment_name,
> > \
> > + .marketing_name = _marketing_name,
> > \
> > + .cell_data = {_cell_data1, _cell_data2}
> > \
> > +}
> > +#define CELL_NOT_USED (0xFFFFFFFF)
> > +#define MAX_CELLS (2)
> > +
> > +struct mtk_socinfo {
> > + struct device *dev;
> > + struct name_data *name_data;
> > + struct socinfo_data *socinfo_data;
> > + struct soc_device *soc_dev;
> > +};
> > +
> > +struct socinfo_data {
> > + char *soc_name;
> > + char *segment_name;
> > + char *marketing_name;
> > + u32 cell_data[MAX_CELLS];
> > +};
> > +
> > +static const char *cell_names[MAX_CELLS] = {"socinfo-data1",
> > "socinfo-data2"};
> > +
> > +static struct socinfo_data socinfo_data_table[] = {
> > + MTK_SOCINFO_ENTRY("MT8173", "MT8173V/AC", "MT8173", 0x6CA20004,
> > 0x10000000),
> > + MTK_SOCINFO_ENTRY("MT8183", "MT8183V/AZA", "Kompanio 500",
> > 0x00010043, 0x00000840),
> > + MTK_SOCINFO_ENTRY("MT8186", "MT8186GV/AZA", "Kompanio 520",
> > 0x81861001, CELL_NOT_USED),
> > + MTK_SOCINFO_ENTRY("MT8186T", "MT8186TV/AZA", "Kompanio 528",
> > 0x81862001, CELL_NOT_USED),
> > + MTK_SOCINFO_ENTRY("MT8188", "MT8188GV/AZA", "Kompanio 830",
> > 0x81880000, 0x00000010),
> > + MTK_SOCINFO_ENTRY("MT8188", "MT8188GV/HZA", "Kompanio 830",
> > 0x81880000, 0x00000011),
> > + MTK_SOCINFO_ENTRY("MT8192", "MT8192V/AZA", "Kompanio 820",
> > 0x00001100, 0x00040080),
> > + MTK_SOCINFO_ENTRY("MT8192T", "MT8192V/ATZA", "Kompanio 828",
> > 0x00000100, 0x000400C0),
> > + MTK_SOCINFO_ENTRY("MT8195", "MT8195GV/EZA", "Kompanio 1200",
> > 0x81950300, CELL_NOT_USED),
> > + MTK_SOCINFO_ENTRY("MT8195", "MT8195GV/EHZA", "Kompanio 1200",
> > 0x81950304, CELL_NOT_USED),
> > + MTK_SOCINFO_ENTRY("MT8195", "MT8195TV/EZA", "Kompanio 1380",
> > 0x81950400, CELL_NOT_USED),
> > + MTK_SOCINFO_ENTRY("MT8195", "MT8195TV/EHZA", "Kompanio 1380",
> > 0x81950404, CELL_NOT_USED),
> > +};
> > +
> > +static int mtk_socinfo_create_socinfo_node(struct mtk_socinfo
> > *mtk_socinfop)
> > +{
> > + struct soc_device_attribute *attrs;
> > + static char machine[30] = {0};
> > + static const char *soc_manufacturer = "MediaTek";
> > +
> > + attrs = devm_kzalloc(mtk_socinfop->dev, sizeof(*attrs),
> > GFP_KERNEL);
> > + if (!attrs)
> > + return -ENOMEM;
> > +
> > + snprintf(machine, sizeof(machine), "%s (%s)", mtk_socinfop-
> > >socinfo_data->marketing_name,
> > + mtk_socinfop->socinfo_data->soc_name);
> > + attrs->family = soc_manufacturer;
> > + attrs->machine = machine;
> > +
> > + mtk_socinfop->soc_dev = soc_device_register(attrs);
> > + if (IS_ERR(mtk_socinfop->soc_dev))
> > + return PTR_ERR(mtk_socinfop->soc_dev);
> > +
> > + dev_info(mtk_socinfop->dev, "%s %s SoC detected.\n",
> > soc_manufacturer, attrs->machine);
> > + return 0;
> > +}
> > +
> > +static u32 mtk_socinfo_read_cell(struct device *dev, const char
> > *name)
> > +{
> > + struct nvmem_device *nvmemp;
> > + struct device_node *np = dev->of_node;
> > + u32 offset;
> > + u32 cell_val = CELL_NOT_USED;
> > +
> > + nvmemp = devm_nvmem_device_get(dev, "mtk-efuse0");
>
> Are you sure that this is supposed to be "mtk-efuse0" and not "mtk-
> efuse"?
> Looks strange.
>
> Everything else looks ok.
>
> Cheers,
> Angelo
>
>
Hi Angelo,

Thank you for the comments! I can confirm that the node for mtk-efuse
is "mtk-efuse0" since nvmem_regsiter() automatically appends an id to
the name. The changes for the other comments will be addressed in the
next version of patches. Thank you so much!

Best regards,
William