linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [RESEND v2] soc: imx: Add generic i.MX8 SoC driver
@ 2019-03-22 16:49 Abel Vesa
  2019-03-28 16:43 ` Leonard Crestez
  2019-04-20 13:26 ` Shawn Guo
  0 siblings, 2 replies; 4+ messages in thread
From: Abel Vesa @ 2019-03-22 16:49 UTC (permalink / raw)
  To: Shawn Guo, Sascha Hauer, Fabio Estevam, Lucas Stach, Rob Herring
  Cc: dl-linux-imx, Linux Kernel Mailing List, linux-arm-kernel, Abel Vesa

Add generic i.MX8 SoC driver along with the i.MX8MQ SoC specific code.
For now, only i.MX8MQ revision B1 is supported. For any other, i.MX8MQ
revision it will print 'unknown'.

Signed-off-by: Abel Vesa <abel.vesa@nxp.com>
---
 drivers/soc/imx/Makefile   |   1 +
 drivers/soc/imx/soc-imx8.c | 115 +++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 116 insertions(+)
 create mode 100644 drivers/soc/imx/soc-imx8.c

diff --git a/drivers/soc/imx/Makefile b/drivers/soc/imx/Makefile
index 506a6f3..d6b529e0 100644
--- a/drivers/soc/imx/Makefile
+++ b/drivers/soc/imx/Makefile
@@ -1,2 +1,3 @@
 obj-$(CONFIG_HAVE_IMX_GPC) += gpc.o
 obj-$(CONFIG_IMX_GPCV2_PM_DOMAINS) += gpcv2.o
+obj-$(CONFIG_ARCH_MXC) += soc-imx8.o
diff --git a/drivers/soc/imx/soc-imx8.c b/drivers/soc/imx/soc-imx8.c
new file mode 100644
index 0000000..fc6429f
--- /dev/null
+++ b/drivers/soc/imx/soc-imx8.c
@@ -0,0 +1,115 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright 2019 NXP.
+ */
+
+#include <linux/init.h>
+#include <linux/io.h>
+#include <linux/of_address.h>
+#include <linux/slab.h>
+#include <linux/sys_soc.h>
+#include <linux/platform_device.h>
+#include <linux/of.h>
+
+#define REV_B1				0x21
+
+#define IMX8MQ_SW_INFO_B1		0x40
+#define IMX8MQ_SW_MAGIC_B1		0xff0055aa
+
+struct imx8_soc_data {
+	char *name;
+	u32 (*soc_revision)(void);
+};
+
+static u32 __init imx8mq_soc_revision(void)
+{
+	struct device_node *np;
+	void __iomem *ocotp_base;
+	u32 magic;
+	u32 rev = 0;
+
+	np = of_find_compatible_node(NULL, NULL, "fsl,imx8mq-ocotp");
+	if (!np)
+		goto out;
+
+	ocotp_base = of_iomap(np, 0);
+	WARN_ON(!ocotp_base);
+
+	magic = readl_relaxed(ocotp_base + IMX8MQ_SW_INFO_B1);
+	if (magic == IMX8MQ_SW_MAGIC_B1)
+		rev = REV_B1;
+
+	iounmap(ocotp_base);
+
+out:
+	of_node_put(np);
+	return rev;
+}
+
+static const struct imx8_soc_data imx8mq_soc_data = {
+	.name = "i.MX8MQ",
+	.soc_revision = imx8mq_soc_revision,
+};
+
+static const struct of_device_id imx8_soc_match[] = {
+	{ .compatible = "fsl,imx8mq", .data = &imx8mq_soc_data, },
+	{ }
+};
+
+#define imx8_revision(soc_rev) \
+	soc_rev ? \
+	kasprintf(GFP_KERNEL, "%d.%d", (soc_rev >> 4) & 0xf,  soc_rev & 0xf) : \
+	"unknown"
+
+static int __init imx8_soc_init(void)
+{
+	struct soc_device_attribute *soc_dev_attr;
+	struct soc_device *soc_dev;
+	struct device_node *root;
+	const struct of_device_id *id;
+	u32 soc_rev = 0;
+	const struct imx8_soc_data *data;
+	int ret;
+
+	soc_dev_attr = kzalloc(sizeof(*soc_dev_attr), GFP_KERNEL);
+	if (!soc_dev_attr)
+		return -ENODEV;
+
+	soc_dev_attr->family = "Freescale i.MX";
+
+	root = of_find_node_by_path("/");
+	ret = of_property_read_string(root, "model", &soc_dev_attr->machine);
+	if (ret)
+		goto free_soc;
+
+	id = of_match_node(imx8_soc_match, root);
+	if (!id)
+		goto free_soc;
+
+	of_node_put(root);
+
+	data = id->data;
+	if (data) {
+		soc_dev_attr->soc_id = data->name;
+		if (data->soc_revision)
+			soc_rev = data->soc_revision();
+	}
+
+	soc_dev_attr->revision = imx8_revision(soc_rev);
+	if (!soc_dev_attr->revision)
+		goto free_soc;
+
+	soc_dev = soc_device_register(soc_dev_attr);
+	if (IS_ERR(soc_dev))
+		goto free_rev;
+
+	return 0;
+
+free_rev:
+	kfree(soc_dev_attr->revision);
+free_soc:
+	kfree(soc_dev_attr);
+	of_node_put(root);
+	return -ENODEV;
+}
+device_initcall(imx8_soc_init);
-- 
2.7.4


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [RESEND v2] soc: imx: Add generic i.MX8 SoC driver
  2019-03-22 16:49 [RESEND v2] soc: imx: Add generic i.MX8 SoC driver Abel Vesa
@ 2019-03-28 16:43 ` Leonard Crestez
  2019-04-18 22:01   ` Leonard Crestez
  2019-04-20 13:26 ` Shawn Guo
  1 sibling, 1 reply; 4+ messages in thread
From: Leonard Crestez @ 2019-03-28 16:43 UTC (permalink / raw)
  To: l.stach, Abel Vesa, Anson Huang
  Cc: dl-linux-imx, linux-kernel, Fabio Estevam, Ye Li, robh, shawnguo,
	linux-arm-kernel, kernel

On Fri, 2019-03-22 at 16:49 +0000, Abel Vesa wrote:
> Add generic i.MX8 SoC driver along with the i.MX8MQ SoC specific code.
> For now, only i.MX8MQ revision B1 is supported. For any other, i.MX8MQ
> revision it will print 'unknown'.

> +#define REV_B1				0x21
> +
> +#define IMX8MQ_SW_INFO_B1		0x40
> +#define IMX8MQ_SW_MAGIC_B1		0xff0055aa
> +
> +	np = of_find_compatible_node(NULL, NULL, "fsl,imx8mq-ocotp");+
> +	ocotp_base = of_iomap(np, 0);
> +
> +	magic = readl_relaxed(ocotp_base + IMX8MQ_SW_INFO_B1);
> +	if (magic == IMX8MQ_SW_MAGIC_B1)
> +		rev = REV_B1;

This is based on ATF code in vendor tree, but shouldn't we have some
sort of explanation for this "magic"?

Looking at the OCOTP driver reg 0x40 is IMX_OCOTP_ADDR_DATA2 and it's
used as part of fuse writes. According to the driver code 8mq is
compatible with 7d and this write path is enabled for imx8mq-ocotp. 

Looking at the OCOTP manual reg 0x40 is OCOTP_HW_OCOTP_READ_FUSE_DATA
and it's meant to be used together with IMX_OCOTP_ADDR_CTRL to read
info. Maybe my manual (rev0 2018-01) is incorrect?

Looking at the manual this will return the value of the fuse last
requested via IMX_OCOTP_ADDR_CTRL but no such request is made in this
driver. So reading from OCOTP 0x40 might return an unrelated value?!

The manual does document that fuse 0x440[3:0] is a "silicon revision
number"; maybe we should read that?

--
Regards,
Leonard

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [RESEND v2] soc: imx: Add generic i.MX8 SoC driver
  2019-03-28 16:43 ` Leonard Crestez
@ 2019-04-18 22:01   ` Leonard Crestez
  0 siblings, 0 replies; 4+ messages in thread
From: Leonard Crestez @ 2019-04-18 22:01 UTC (permalink / raw)
  To: Lucas Stach, Abel Vesa, Peng Fan
  Cc: Anson Huang, dl-linux-imx, linux-kernel, Fabio Estevam, Ye Li,
	robh, shawnguo, linux-arm-kernel, kernel

On 3/28/2019 6:43 PM, Leonard Crestez wrote:
> On Fri, 2019-03-22 at 16:49 +0000, Abel Vesa wrote:
>> Add generic i.MX8 SoC driver along with the i.MX8MQ SoC specific code.
>> For now, only i.MX8MQ revision B1 is supported. For any other, i.MX8MQ
>> revision it will print 'unknown'.
> 
>> +#define REV_B1				0x21
>> +
>> +#define IMX8MQ_SW_INFO_B1		0x40
>> +#define IMX8MQ_SW_MAGIC_B1		0xff0055aa
>> +
>> +	np = of_find_compatible_node(NULL, NULL, "fsl,imx8mq-ocotp");+
>> +	ocotp_base = of_iomap(np, 0);
>> +
>> +	magic = readl_relaxed(ocotp_base + IMX8MQ_SW_INFO_B1);
>> +	if (magic == IMX8MQ_SW_MAGIC_B1)
>> +		rev = REV_B1;
> 
> This is based on ATF code in vendor tree, but shouldn't we have some
> sort of explanation for this "magic"?
> 
> Looking at the OCOTP driver reg 0x40 is IMX_OCOTP_ADDR_DATA2 and it's
> used as part of fuse writes. According to the driver code 8mq is
> compatible with 7d and this write path is enabled for imx8mq-ocotp.

After further digging in NXP manuals and uboot sources it seems that 
imx8mq ocotp is like imx6 rather than imx7. Posted fix for nvmem driver:

https://patchwork.kernel.org/patch/10908081/

Reviewed-by: Leonard Crestez <leonard.crestez@nxp.com>

It might still be nice to find a way to identify imx8mq B0.

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [RESEND v2] soc: imx: Add generic i.MX8 SoC driver
  2019-03-22 16:49 [RESEND v2] soc: imx: Add generic i.MX8 SoC driver Abel Vesa
  2019-03-28 16:43 ` Leonard Crestez
@ 2019-04-20 13:26 ` Shawn Guo
  1 sibling, 0 replies; 4+ messages in thread
From: Shawn Guo @ 2019-04-20 13:26 UTC (permalink / raw)
  To: Abel Vesa
  Cc: Sascha Hauer, Fabio Estevam, Lucas Stach, Rob Herring,
	dl-linux-imx, Linux Kernel Mailing List, linux-arm-kernel

On Fri, Mar 22, 2019 at 04:49:20PM +0000, Abel Vesa wrote:
> Add generic i.MX8 SoC driver along with the i.MX8MQ SoC specific code.
> For now, only i.MX8MQ revision B1 is supported. For any other, i.MX8MQ
> revision it will print 'unknown'.
> 
> Signed-off-by: Abel Vesa <abel.vesa@nxp.com>

Applied, thanks.

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2019-04-20 13:27 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-03-22 16:49 [RESEND v2] soc: imx: Add generic i.MX8 SoC driver Abel Vesa
2019-03-28 16:43 ` Leonard Crestez
2019-04-18 22:01   ` Leonard Crestez
2019-04-20 13:26 ` Shawn Guo

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).