[Resend because of new development cycle. Shawn, can this series get
through your tree? Sorry you weren't on CC on the former submissions.]
This series converts the guts driver from a platform driver to just an
core_initcall. The driver itself cannot (or rather should never) be
unloaded because others depends on detecting the current SoC revision
to apply chip errata. Other SoC drivers do it the same way. Overall I
got rid of all the global static variables.
The last patch finally adds unique id support to the guts driver. DT
binding can be found at:
Documentation/devicetree/bindings/nvmem/fsl,layerscape-sfp.yaml
changes since v1:
- call kfree() in error case, thanks Dan
- add missing of_node_put(np), thanks Dan
Michael Walle (7):
soc: fsl: guts: machine variable might be unset
soc: fsl: guts: remove module_exit() and fsl_guts_remove()
soc: fsl: guts: embed fsl_guts_get_svr() in probe()
soc: fsl: guts: allocate soc_dev_attr on the heap
soc: fsl: guts: use of_root instead of own reference
soc: fsl: guts: drop platform driver
soc: fsl: guts: add serial_number support
drivers/soc/fsl/guts.c | 219 ++++++++++++++++++++++-------------------
1 file changed, 118 insertions(+), 101 deletions(-)
--
2.30.2
If both the model and the compatible properties are missing, then
machine will not be set. Initialize it with NULL.
Fixes: 34c1c21e94ac ("soc: fsl: fix section mismatch build warnings")
Signed-off-by: Michael Walle <[email protected]>
Acked-by: Arnd Bergmann <[email protected]>
---
drivers/soc/fsl/guts.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/soc/fsl/guts.c b/drivers/soc/fsl/guts.c
index 5ed2fc1c53a0..be18d46c7b0f 100644
--- a/drivers/soc/fsl/guts.c
+++ b/drivers/soc/fsl/guts.c
@@ -140,7 +140,7 @@ static int fsl_guts_probe(struct platform_device *pdev)
struct device_node *root, *np = pdev->dev.of_node;
struct device *dev = &pdev->dev;
const struct fsl_soc_die_attr *soc_die;
- const char *machine;
+ const char *machine = NULL;
u32 svr;
/* Initialize guts */
--
2.30.2
This is the last global static variable. Drop it and allocate the memory
on the heap instead.
Signed-off-by: Michael Walle <[email protected]>
Acked-by: Arnd Bergmann <[email protected]>
---
drivers/soc/fsl/guts.c | 40 +++++++++++++++++++++-------------------
1 file changed, 21 insertions(+), 19 deletions(-)
diff --git a/drivers/soc/fsl/guts.c b/drivers/soc/fsl/guts.c
index 4e5675ab5f73..44e7a9bf6392 100644
--- a/drivers/soc/fsl/guts.c
+++ b/drivers/soc/fsl/guts.c
@@ -20,9 +20,6 @@ struct fsl_soc_die_attr {
u32 mask;
};
-static struct soc_device_attribute soc_dev_attr;
-
-
/* SoC die attribute definition for QorIQ platform */
static const struct fsl_soc_die_attr fsl_soc_die[] = {
/*
@@ -116,6 +113,7 @@ static const struct fsl_soc_die_attr *fsl_soc_die_match(
static int fsl_guts_probe(struct platform_device *pdev)
{
struct device_node *root, *np = pdev->dev.of_node;
+ struct soc_device_attribute *soc_dev_attr;
static struct soc_device *soc_dev;
struct device *dev = &pdev->dev;
const struct fsl_soc_die_attr *soc_die;
@@ -136,12 +134,16 @@ static int fsl_guts_probe(struct platform_device *pdev)
iounmap(regs);
/* Register soc device */
+ soc_dev_attr = devm_kzalloc(dev, sizeof(*soc_dev_attr), GFP_KERNEL);
+ if (!soc_dev_attr)
+ return -ENOMEM;
+
root = of_find_node_by_path("/");
if (of_property_read_string(root, "model", &machine))
of_property_read_string_index(root, "compatible", 0, &machine);
if (machine) {
- soc_dev_attr.machine = devm_kstrdup(dev, machine, GFP_KERNEL);
- if (!soc_dev_attr.machine) {
+ soc_dev_attr->machine = devm_kstrdup(dev, machine, GFP_KERNEL);
+ if (!soc_dev_attr->machine) {
of_node_put(root);
return -ENOMEM;
}
@@ -150,30 +152,30 @@ static int fsl_guts_probe(struct platform_device *pdev)
soc_die = fsl_soc_die_match(svr, fsl_soc_die);
if (soc_die) {
- soc_dev_attr.family = devm_kasprintf(dev, GFP_KERNEL,
- "QorIQ %s", soc_die->die);
+ soc_dev_attr->family = devm_kasprintf(dev, GFP_KERNEL,
+ "QorIQ %s", soc_die->die);
} else {
- soc_dev_attr.family = devm_kasprintf(dev, GFP_KERNEL, "QorIQ");
+ soc_dev_attr->family = devm_kasprintf(dev, GFP_KERNEL, "QorIQ");
}
- if (!soc_dev_attr.family)
+ if (!soc_dev_attr->family)
return -ENOMEM;
- soc_dev_attr.soc_id = devm_kasprintf(dev, GFP_KERNEL,
- "svr:0x%08x", svr);
- if (!soc_dev_attr.soc_id)
+ soc_dev_attr->soc_id = devm_kasprintf(dev, GFP_KERNEL,
+ "svr:0x%08x", svr);
+ if (!soc_dev_attr->soc_id)
return -ENOMEM;
- soc_dev_attr.revision = devm_kasprintf(dev, GFP_KERNEL, "%d.%d",
- (svr >> 4) & 0xf, svr & 0xf);
- if (!soc_dev_attr.revision)
+ soc_dev_attr->revision = devm_kasprintf(dev, GFP_KERNEL, "%d.%d",
+ (svr >> 4) & 0xf, svr & 0xf);
+ if (!soc_dev_attr->revision)
return -ENOMEM;
- soc_dev = soc_device_register(&soc_dev_attr);
+ soc_dev = soc_device_register(soc_dev_attr);
if (IS_ERR(soc_dev))
return PTR_ERR(soc_dev);
- pr_info("Machine: %s\n", soc_dev_attr.machine);
- pr_info("SoC family: %s\n", soc_dev_attr.family);
+ pr_info("Machine: %s\n", soc_dev_attr->machine);
+ pr_info("SoC family: %s\n", soc_dev_attr->family);
pr_info("SoC ID: %s, Revision: %s\n",
- soc_dev_attr.soc_id, soc_dev_attr.revision);
+ soc_dev_attr->soc_id, soc_dev_attr->revision);
return 0;
}
--
2.30.2
Move the reading of the SVR into the probe function as
fsl_guts_get_svr() is the only user of the static guts variable and this
lets us drop that as well as the malloc() for this variable. Also, we
can unmap the memory region after we accessed it, which will simplify
error handling later.
Signed-off-by: Michael Walle <[email protected]>
Acked-by: Arnd Bergmann <[email protected]>
---
drivers/soc/fsl/guts.c | 42 +++++++++++-------------------------------
1 file changed, 11 insertions(+), 31 deletions(-)
diff --git a/drivers/soc/fsl/guts.c b/drivers/soc/fsl/guts.c
index 0bea43770d51..4e5675ab5f73 100644
--- a/drivers/soc/fsl/guts.c
+++ b/drivers/soc/fsl/guts.c
@@ -14,18 +14,12 @@
#include <linux/platform_device.h>
#include <linux/fsl/guts.h>
-struct guts {
- struct ccsr_guts __iomem *regs;
- bool little_endian;
-};
-
struct fsl_soc_die_attr {
char *die;
u32 svr;
u32 mask;
};
-static struct guts *guts;
static struct soc_device_attribute soc_dev_attr;
@@ -119,40 +113,27 @@ static const struct fsl_soc_die_attr *fsl_soc_die_match(
return NULL;
}
-static u32 fsl_guts_get_svr(void)
-{
- u32 svr = 0;
-
- if (!guts || !guts->regs)
- return svr;
-
- if (guts->little_endian)
- svr = ioread32(&guts->regs->svr);
- else
- svr = ioread32be(&guts->regs->svr);
-
- return svr;
-}
-
static int fsl_guts_probe(struct platform_device *pdev)
{
struct device_node *root, *np = pdev->dev.of_node;
static struct soc_device *soc_dev;
struct device *dev = &pdev->dev;
const struct fsl_soc_die_attr *soc_die;
+ struct ccsr_guts __iomem *regs;
const char *machine = NULL;
+ bool little_endian;
u32 svr;
- /* Initialize guts */
- guts = devm_kzalloc(dev, sizeof(*guts), GFP_KERNEL);
- if (!guts)
- return -ENOMEM;
-
- guts->little_endian = of_property_read_bool(np, "little-endian");
+ regs = of_iomap(np, 0);
+ if (IS_ERR(regs))
+ return PTR_ERR(regs);
- guts->regs = devm_platform_ioremap_resource(pdev, 0);
- if (IS_ERR(guts->regs))
- return PTR_ERR(guts->regs);
+ little_endian = of_property_read_bool(np, "little-endian");
+ if (little_endian)
+ svr = ioread32(®s->svr);
+ else
+ svr = ioread32be(®s->svr);
+ iounmap(regs);
/* Register soc device */
root = of_find_node_by_path("/");
@@ -167,7 +148,6 @@ static int fsl_guts_probe(struct platform_device *pdev)
}
of_node_put(root);
- svr = fsl_guts_get_svr();
soc_die = fsl_soc_die_match(svr, fsl_soc_die);
if (soc_die) {
soc_dev_attr.family = devm_kasprintf(dev, GFP_KERNEL,
--
2.30.2
This driver will never be unloaded. Firstly, it is not available as a
module, but more importantly, other drivers will depend on this one to
apply possible chip errata.
Signed-off-by: Michael Walle <[email protected]>
Acked-by: Arnd Bergmann <[email protected]>
---
drivers/soc/fsl/guts.c | 15 +--------------
1 file changed, 1 insertion(+), 14 deletions(-)
diff --git a/drivers/soc/fsl/guts.c b/drivers/soc/fsl/guts.c
index be18d46c7b0f..0bea43770d51 100644
--- a/drivers/soc/fsl/guts.c
+++ b/drivers/soc/fsl/guts.c
@@ -27,7 +27,6 @@ struct fsl_soc_die_attr {
static struct guts *guts;
static struct soc_device_attribute soc_dev_attr;
-static struct soc_device *soc_dev;
/* SoC die attribute definition for QorIQ platform */
@@ -138,6 +137,7 @@ static u32 fsl_guts_get_svr(void)
static int fsl_guts_probe(struct platform_device *pdev)
{
struct device_node *root, *np = pdev->dev.of_node;
+ static struct soc_device *soc_dev;
struct device *dev = &pdev->dev;
const struct fsl_soc_die_attr *soc_die;
const char *machine = NULL;
@@ -197,12 +197,6 @@ static int fsl_guts_probe(struct platform_device *pdev)
return 0;
}
-static int fsl_guts_remove(struct platform_device *dev)
-{
- soc_device_unregister(soc_dev);
- return 0;
-}
-
/*
* Table for matching compatible strings, for device tree
* guts node, for Freescale QorIQ SOCs.
@@ -242,7 +236,6 @@ static struct platform_driver fsl_guts_driver = {
.of_match_table = fsl_guts_of_match,
},
.probe = fsl_guts_probe,
- .remove = fsl_guts_remove,
};
static int __init fsl_guts_init(void)
@@ -250,9 +243,3 @@ static int __init fsl_guts_init(void)
return platform_driver_register(&fsl_guts_driver);
}
core_initcall(fsl_guts_init);
-
-static void __exit fsl_guts_exit(void)
-{
- platform_driver_unregister(&fsl_guts_driver);
-}
-module_exit(fsl_guts_exit);
--
2.30.2
This driver cannot be unloaded and it will be needed very early in the
boot process because other driver (weakly) depend on it (eg. for chip
errata handling). Drop all the platform driver and devres stuff and
simply make it a core_initcall.
Signed-off-by: Michael Walle <[email protected]>
Acked-by: Arnd Bergmann <[email protected]>
---
drivers/soc/fsl/guts.c | 134 ++++++++++++++++++++++-------------------
1 file changed, 71 insertions(+), 63 deletions(-)
diff --git a/drivers/soc/fsl/guts.c b/drivers/soc/fsl/guts.c
index 585cbd9d8224..370be923aa0f 100644
--- a/drivers/soc/fsl/guts.c
+++ b/drivers/soc/fsl/guts.c
@@ -110,21 +110,59 @@ static const struct fsl_soc_die_attr *fsl_soc_die_match(
return NULL;
}
-static int fsl_guts_probe(struct platform_device *pdev)
+/*
+ * Table for matching compatible strings, for device tree
+ * guts node, for Freescale QorIQ SOCs.
+ */
+static const struct of_device_id fsl_guts_of_match[] = {
+ { .compatible = "fsl,qoriq-device-config-1.0", },
+ { .compatible = "fsl,qoriq-device-config-2.0", },
+ { .compatible = "fsl,p1010-guts", },
+ { .compatible = "fsl,p1020-guts", },
+ { .compatible = "fsl,p1021-guts", },
+ { .compatible = "fsl,p1022-guts", },
+ { .compatible = "fsl,p1023-guts", },
+ { .compatible = "fsl,p2020-guts", },
+ { .compatible = "fsl,bsc9131-guts", },
+ { .compatible = "fsl,bsc9132-guts", },
+ { .compatible = "fsl,mpc8536-guts", },
+ { .compatible = "fsl,mpc8544-guts", },
+ { .compatible = "fsl,mpc8548-guts", },
+ { .compatible = "fsl,mpc8568-guts", },
+ { .compatible = "fsl,mpc8569-guts", },
+ { .compatible = "fsl,mpc8572-guts", },
+ { .compatible = "fsl,ls1021a-dcfg", },
+ { .compatible = "fsl,ls1043a-dcfg", },
+ { .compatible = "fsl,ls2080a-dcfg", },
+ { .compatible = "fsl,ls1088a-dcfg", },
+ { .compatible = "fsl,ls1012a-dcfg", },
+ { .compatible = "fsl,ls1046a-dcfg", },
+ { .compatible = "fsl,lx2160a-dcfg", },
+ { .compatible = "fsl,ls1028a-dcfg", },
+ {}
+};
+
+static int __init fsl_guts_init(void)
{
- struct device_node *np = pdev->dev.of_node;
struct soc_device_attribute *soc_dev_attr;
static struct soc_device *soc_dev;
- struct device *dev = &pdev->dev;
const struct fsl_soc_die_attr *soc_die;
struct ccsr_guts __iomem *regs;
const char *machine = NULL;
+ struct device_node *np;
bool little_endian;
u32 svr;
+ int ret;
+
+ np = of_find_matching_node_and_match(NULL, fsl_guts_of_match, NULL);
+ if (!np)
+ return 0;
regs = of_iomap(np, 0);
- if (IS_ERR(regs))
+ if (IS_ERR(regs)) {
+ of_node_put(np);
return PTR_ERR(regs);
+ }
little_endian = of_property_read_bool(np, "little-endian");
if (little_endian)
@@ -132,92 +170,62 @@ static int fsl_guts_probe(struct platform_device *pdev)
else
svr = ioread32be(®s->svr);
iounmap(regs);
+ of_node_put(np);
/* Register soc device */
- soc_dev_attr = devm_kzalloc(dev, sizeof(*soc_dev_attr), GFP_KERNEL);
+ soc_dev_attr = kzalloc(sizeof(*soc_dev_attr), GFP_KERNEL);
if (!soc_dev_attr)
return -ENOMEM;
if (of_property_read_string(of_root, "model", &machine))
of_property_read_string_index(of_root, "compatible", 0, &machine);
if (machine) {
- soc_dev_attr->machine = devm_kstrdup(dev, machine, GFP_KERNEL);
+ soc_dev_attr->machine = kstrdup(machine, GFP_KERNEL);
if (!soc_dev_attr->machine)
- return -ENOMEM;
+ goto err_nomem;
}
soc_die = fsl_soc_die_match(svr, fsl_soc_die);
if (soc_die) {
- soc_dev_attr->family = devm_kasprintf(dev, GFP_KERNEL,
- "QorIQ %s", soc_die->die);
+ soc_dev_attr->family = kasprintf(GFP_KERNEL, "QorIQ %s",
+ soc_die->die);
} else {
- soc_dev_attr->family = devm_kasprintf(dev, GFP_KERNEL, "QorIQ");
+ soc_dev_attr->family = kasprintf(GFP_KERNEL, "QorIQ");
}
if (!soc_dev_attr->family)
- return -ENOMEM;
- soc_dev_attr->soc_id = devm_kasprintf(dev, GFP_KERNEL,
- "svr:0x%08x", svr);
+ goto err_nomem;
+
+ soc_dev_attr->soc_id = kasprintf(GFP_KERNEL, "svr:0x%08x", svr);
if (!soc_dev_attr->soc_id)
- return -ENOMEM;
- soc_dev_attr->revision = devm_kasprintf(dev, GFP_KERNEL, "%d.%d",
- (svr >> 4) & 0xf, svr & 0xf);
+ goto err_nomem;
+
+ soc_dev_attr->revision = kasprintf(GFP_KERNEL, "%d.%d",
+ (svr >> 4) & 0xf, svr & 0xf);
if (!soc_dev_attr->revision)
- return -ENOMEM;
+ goto err_nomem;
soc_dev = soc_device_register(soc_dev_attr);
- if (IS_ERR(soc_dev))
- return PTR_ERR(soc_dev);
+ if (IS_ERR(soc_dev)) {
+ ret = PTR_ERR(soc_dev);
+ goto err;
+ }
pr_info("Machine: %s\n", soc_dev_attr->machine);
pr_info("SoC family: %s\n", soc_dev_attr->family);
pr_info("SoC ID: %s, Revision: %s\n",
soc_dev_attr->soc_id, soc_dev_attr->revision);
- return 0;
-}
-/*
- * Table for matching compatible strings, for device tree
- * guts node, for Freescale QorIQ SOCs.
- */
-static const struct of_device_id fsl_guts_of_match[] = {
- { .compatible = "fsl,qoriq-device-config-1.0", },
- { .compatible = "fsl,qoriq-device-config-2.0", },
- { .compatible = "fsl,p1010-guts", },
- { .compatible = "fsl,p1020-guts", },
- { .compatible = "fsl,p1021-guts", },
- { .compatible = "fsl,p1022-guts", },
- { .compatible = "fsl,p1023-guts", },
- { .compatible = "fsl,p2020-guts", },
- { .compatible = "fsl,bsc9131-guts", },
- { .compatible = "fsl,bsc9132-guts", },
- { .compatible = "fsl,mpc8536-guts", },
- { .compatible = "fsl,mpc8544-guts", },
- { .compatible = "fsl,mpc8548-guts", },
- { .compatible = "fsl,mpc8568-guts", },
- { .compatible = "fsl,mpc8569-guts", },
- { .compatible = "fsl,mpc8572-guts", },
- { .compatible = "fsl,ls1021a-dcfg", },
- { .compatible = "fsl,ls1043a-dcfg", },
- { .compatible = "fsl,ls2080a-dcfg", },
- { .compatible = "fsl,ls1088a-dcfg", },
- { .compatible = "fsl,ls1012a-dcfg", },
- { .compatible = "fsl,ls1046a-dcfg", },
- { .compatible = "fsl,lx2160a-dcfg", },
- { .compatible = "fsl,ls1028a-dcfg", },
- {}
-};
-MODULE_DEVICE_TABLE(of, fsl_guts_of_match);
+ return 0;
-static struct platform_driver fsl_guts_driver = {
- .driver = {
- .name = "fsl-guts",
- .of_match_table = fsl_guts_of_match,
- },
- .probe = fsl_guts_probe,
-};
+err_nomem:
+ ret = -ENOMEM;
+err:
+ kfree(soc_dev_attr->machine);
+ kfree(soc_dev_attr->family);
+ kfree(soc_dev_attr->soc_id);
+ kfree(soc_dev_attr->revision);
+ kfree(soc_dev_attr);
-static int __init fsl_guts_init(void)
-{
- return platform_driver_register(&fsl_guts_driver);
+ return ret;
}
core_initcall(fsl_guts_init);
--
2.30.2
There is already a global of_root reference. Use that instead of getting
one on our own. We don't need to care about the reference count either
this way.
Signed-off-by: Michael Walle <[email protected]>
Acked-by: Arnd Bergmann <[email protected]>
---
drivers/soc/fsl/guts.c | 12 ++++--------
1 file changed, 4 insertions(+), 8 deletions(-)
diff --git a/drivers/soc/fsl/guts.c b/drivers/soc/fsl/guts.c
index 44e7a9bf6392..585cbd9d8224 100644
--- a/drivers/soc/fsl/guts.c
+++ b/drivers/soc/fsl/guts.c
@@ -112,7 +112,7 @@ static const struct fsl_soc_die_attr *fsl_soc_die_match(
static int fsl_guts_probe(struct platform_device *pdev)
{
- struct device_node *root, *np = pdev->dev.of_node;
+ struct device_node *np = pdev->dev.of_node;
struct soc_device_attribute *soc_dev_attr;
static struct soc_device *soc_dev;
struct device *dev = &pdev->dev;
@@ -138,17 +138,13 @@ static int fsl_guts_probe(struct platform_device *pdev)
if (!soc_dev_attr)
return -ENOMEM;
- root = of_find_node_by_path("/");
- if (of_property_read_string(root, "model", &machine))
- of_property_read_string_index(root, "compatible", 0, &machine);
+ if (of_property_read_string(of_root, "model", &machine))
+ of_property_read_string_index(of_root, "compatible", 0, &machine);
if (machine) {
soc_dev_attr->machine = devm_kstrdup(dev, machine, GFP_KERNEL);
- if (!soc_dev_attr->machine) {
- of_node_put(root);
+ if (!soc_dev_attr->machine)
return -ENOMEM;
- }
}
- of_node_put(root);
soc_die = fsl_soc_die_match(svr, fsl_soc_die);
if (soc_die) {
--
2.30.2
Am 2022-04-04 11:56, schrieb Michael Walle:
> [Resend because of new development cycle. Shawn, can this series get
> through your tree? Sorry you weren't on CC on the former submissions.]
>
> This series converts the guts driver from a platform driver to just an
> core_initcall. The driver itself cannot (or rather should never) be
> unloaded because others depends on detecting the current SoC revision
> to apply chip errata. Other SoC drivers do it the same way. Overall I
> got rid of all the global static variables.
>
> The last patch finally adds unique id support to the guts driver. DT
> binding can be found at:
> Documentation/devicetree/bindings/nvmem/fsl,layerscape-sfp.yaml
>
> changes since v1:
> - call kfree() in error case, thanks Dan
> - add missing of_node_put(np), thanks Dan
>
> Michael Walle (7):
> soc: fsl: guts: machine variable might be unset
> soc: fsl: guts: remove module_exit() and fsl_guts_remove()
> soc: fsl: guts: embed fsl_guts_get_svr() in probe()
> soc: fsl: guts: allocate soc_dev_attr on the heap
> soc: fsl: guts: use of_root instead of own reference
> soc: fsl: guts: drop platform driver
> soc: fsl: guts: add serial_number support
>
> drivers/soc/fsl/guts.c | 219 ++++++++++++++++++++++-------------------
> 1 file changed, 118 insertions(+), 101 deletions(-)
There goes another kernel release without any comments on this
series :(
Shawn, can you pick this up and give it some time in linux-next?
-michael
On Wed, Jun 22, 2022 at 01:03:33PM +0200, Michael Walle wrote:
> Am 2022-04-04 11:56, schrieb Michael Walle:
> > [Resend because of new development cycle. Shawn, can this series get
> > through your tree? Sorry you weren't on CC on the former submissions.]
> >
> > This series converts the guts driver from a platform driver to just an
> > core_initcall. The driver itself cannot (or rather should never) be
> > unloaded because others depends on detecting the current SoC revision
> > to apply chip errata. Other SoC drivers do it the same way. Overall I
> > got rid of all the global static variables.
> >
> > The last patch finally adds unique id support to the guts driver. DT
> > binding can be found at:
> > Documentation/devicetree/bindings/nvmem/fsl,layerscape-sfp.yaml
> >
> > changes since v1:
> > - call kfree() in error case, thanks Dan
> > - add missing of_node_put(np), thanks Dan
> >
> > Michael Walle (7):
> > soc: fsl: guts: machine variable might be unset
> > soc: fsl: guts: remove module_exit() and fsl_guts_remove()
> > soc: fsl: guts: embed fsl_guts_get_svr() in probe()
> > soc: fsl: guts: allocate soc_dev_attr on the heap
> > soc: fsl: guts: use of_root instead of own reference
> > soc: fsl: guts: drop platform driver
> > soc: fsl: guts: add serial_number support
> >
> > drivers/soc/fsl/guts.c | 219 ++++++++++++++++++++++-------------------
> > 1 file changed, 118 insertions(+), 101 deletions(-)
>
> There goes another kernel release without any comments on this
> series :(
>
> Shawn, can you pick this up and give it some time in linux-next?
Okay, I just picked the series up to IMX tree.
Leo, let me know if you want to drop it from IMX tree.
Shawn
> -----Original Message-----
> From: Shawn Guo <[email protected]>
> Sent: Monday, June 27, 2022 1:53 AM
> To: Michael Walle <[email protected]>
> Cc: [email protected]; [email protected];
> [email protected]; Leo Li <[email protected]>; Ulf Hansson
> <[email protected]>; Sudeep Holla <[email protected]>; Arnd
> Bergmann <[email protected]>; Dan Carpenter <[email protected]>
> Subject: Re: [PATCH RESEND v2 0/7] soc: fsl: guts: cleanups and
> serial_number support
>
> On Wed, Jun 22, 2022 at 01:03:33PM +0200, Michael Walle wrote:
> > Am 2022-04-04 11:56, schrieb Michael Walle:
> > > [Resend because of new development cycle. Shawn, can this series get
> > > through your tree? Sorry you weren't on CC on the former
> > > submissions.]
> > >
> > > This series converts the guts driver from a platform driver to just
> > > an core_initcall. The driver itself cannot (or rather should never)
> > > be unloaded because others depends on detecting the current SoC
> > > revision to apply chip errata. Other SoC drivers do it the same way.
> > > Overall I got rid of all the global static variables.
> > >
> > > The last patch finally adds unique id support to the guts driver. DT
> > > binding can be found at:
> > > Documentation/devicetree/bindings/nvmem/fsl,layerscape-sfp.yaml
> > >
> > > changes since v1:
> > > - call kfree() in error case, thanks Dan
> > > - add missing of_node_put(np), thanks Dan
> > >
> > > Michael Walle (7):
> > > soc: fsl: guts: machine variable might be unset
> > > soc: fsl: guts: remove module_exit() and fsl_guts_remove()
> > > soc: fsl: guts: embed fsl_guts_get_svr() in probe()
> > > soc: fsl: guts: allocate soc_dev_attr on the heap
> > > soc: fsl: guts: use of_root instead of own reference
> > > soc: fsl: guts: drop platform driver
> > > soc: fsl: guts: add serial_number support
> > >
> > > drivers/soc/fsl/guts.c | 219
> > > ++++++++++++++++++++++-------------------
> > > 1 file changed, 118 insertions(+), 101 deletions(-)
> >
> > There goes another kernel release without any comments on this series
> > :(
> >
> > Shawn, can you pick this up and give it some time in linux-next?
>
> Okay, I just picked the series up to IMX tree.
>
> Leo, let me know if you want to drop it from IMX tree.
No problem. You can take these through your tree. Thanks.
Regards,
Leo