This patch series introduces Exynos Chipid platform driver.
Each Exynos SoC has ChipID block which can give information about SoC's
product Id and revision number.
At the same time it reduces dependency of mach-exynos files from plat-samsung,
by removing samsung_rev API, similar API is introduced in chipid driver itself
to get revision number and product id.
This patch series is based on Kukjin Kim's for-next having SHA_ID:
9db7d78aca2c7fbc19a26ce2ef01c805dc010c72
It can also be cleanly applied on latest (next-20141201) linux-next.
This has been tested against both tree on Exynos3250 and Exynos5250 (SMDK) board.
Revision 3 and it's discussion can be found here
- https://lkml.org/lkml/2014/5/10/31
- https://lkml.org/lkml/2014/6/10/270
- https://lkml.org/lkml/2014/5/11/16
Change since v3:
- This patch set contains 5/6 and 6/6 patch from v3 series.
- Made EXYNOS_CHIPID config option non-user selectable,
as suggested by Tomasz Figa.
- Made uniform macro for EXYNOS4/5_SOC_MASK as EXYNOS_SOC_MASK as
suggested by Tomasz Figa.
- Made local variables static in chipid driver.
- Added existing SoC's product id's.
- Added platform driver support.
Changes since v2:
- Reorganized patches as suggested by Tomasz Figa.
- Addressed review comments of Tomasz Figa in i2c-s3c2410.c file.
Changes since v1:
- Added patch to move i2c interrupt re-configuration code from exynos.c
to i2c driver, as suggested by Arnd.
- After above patch only user of SYS_I2C_CFG register is pm.c so moving
save/restore of this register also into i2c driver.
- Spiltted up exynos4 and exynos5 machine descriptors to get rid from
soc_is_exynos4/exynos5 kind of macros, as suggested by Arnd.
- Changed location of chipid driver to "drivers/soc".
- Added drivers/base/soc.c provided infrastructure to make SoC specific
information avaible to user space via sysfs entry, as suggested by Arnd.
Pankaj Dubey (2):
soc: samsung: add exynos chipid driver support
ARM: EXYNOS: refactoring of mach-exynos to enable chipid driver
arch/arm/mach-exynos/Kconfig | 2 +
arch/arm/mach-exynos/common.h | 46 ++----
arch/arm/mach-exynos/exynos.c | 77 ++++-----
arch/arm/mach-exynos/include/mach/map.h | 2 -
arch/arm/mach-exynos/platsmp.c | 2 +-
arch/arm/mach-exynos/pm.c | 8 +-
arch/arm/plat-samsung/cpu.c | 14 --
arch/arm/plat-samsung/include/plat/cpu.h | 2 -
arch/arm/plat-samsung/include/plat/map-s5p.h | 1 -
drivers/soc/Kconfig | 1 +
drivers/soc/Makefile | 1 +
drivers/soc/samsung/Kconfig | 14 ++
drivers/soc/samsung/Makefile | 1 +
drivers/soc/samsung/exynos-chipid.c | 218 ++++++++++++++++++++++++++
include/linux/soc/samsung/exynos-soc.h | 53 +++++++
15 files changed, 338 insertions(+), 104 deletions(-)
create mode 100644 drivers/soc/samsung/Kconfig
create mode 100644 drivers/soc/samsung/Makefile
create mode 100644 drivers/soc/samsung/exynos-chipid.c
create mode 100644 include/linux/soc/samsung/exynos-soc.h
--
1.7.9.5
Exynos SoCs have Chipid, for identification of product IDs
and SoC revisions. This patch intendes to provide initialization
code for all these functionalites, at the same time it provides some
sysfs entries for accessing these information to userspace.
This driver usese existing binding for exnos-chipid.
CC: Grant Likely <[email protected]>
CC: Rob Herring <[email protected]>
CC: Linus Walleij <[email protected]>
Signed-off-by: Pankaj Dubey <[email protected]>
---
drivers/soc/Kconfig | 1 +
drivers/soc/Makefile | 1 +
drivers/soc/samsung/Kconfig | 14 ++
drivers/soc/samsung/Makefile | 1 +
drivers/soc/samsung/exynos-chipid.c | 218 ++++++++++++++++++++++++++++++++
include/linux/soc/samsung/exynos-soc.h | 53 ++++++++
6 files changed, 288 insertions(+)
create mode 100644 drivers/soc/samsung/Kconfig
create mode 100644 drivers/soc/samsung/Makefile
create mode 100644 drivers/soc/samsung/exynos-chipid.c
create mode 100644 include/linux/soc/samsung/exynos-soc.h
diff --git a/drivers/soc/Kconfig b/drivers/soc/Kconfig
index 76d6bd4..c3abfbe 100644
--- a/drivers/soc/Kconfig
+++ b/drivers/soc/Kconfig
@@ -1,6 +1,7 @@
menu "SOC (System On Chip) specific Drivers"
source "drivers/soc/qcom/Kconfig"
+source "drivers/soc/samsung/Kconfig"
source "drivers/soc/ti/Kconfig"
source "drivers/soc/versatile/Kconfig"
diff --git a/drivers/soc/Makefile b/drivers/soc/Makefile
index 063113d..620366f 100644
--- a/drivers/soc/Makefile
+++ b/drivers/soc/Makefile
@@ -3,6 +3,7 @@
#
obj-$(CONFIG_ARCH_QCOM) += qcom/
+obj-$(CONFIG_SOC_SAMSUNG) += samsung/
obj-$(CONFIG_ARCH_TEGRA) += tegra/
obj-$(CONFIG_SOC_TI) += ti/
obj-$(CONFIG_PLAT_VERSATILE) += versatile/
diff --git a/drivers/soc/samsung/Kconfig b/drivers/soc/samsung/Kconfig
new file mode 100644
index 0000000..2d83652
--- /dev/null
+++ b/drivers/soc/samsung/Kconfig
@@ -0,0 +1,14 @@
+#
+# SAMSUNG SoC drivers
+#
+menu "Samsung SOC driver support"
+
+config SOC_SAMSUNG
+ bool
+
+config EXYNOS_CHIPID
+ bool
+ depends on ARCH_EXYNOS
+ select SOC_BUS
+
+endmenu
diff --git a/drivers/soc/samsung/Makefile b/drivers/soc/samsung/Makefile
new file mode 100644
index 0000000..855ca05
--- /dev/null
+++ b/drivers/soc/samsung/Makefile
@@ -0,0 +1 @@
+obj-$(CONFIG_EXYNOS_CHIPID) += exynos-chipid.o
diff --git a/drivers/soc/samsung/exynos-chipid.c b/drivers/soc/samsung/exynos-chipid.c
new file mode 100644
index 0000000..0e94f78
--- /dev/null
+++ b/drivers/soc/samsung/exynos-chipid.c
@@ -0,0 +1,218 @@
+/*
+ * Copyright (c) 2014 Samsung Electronics Co., Ltd.
+ * http://www.samsung.com/
+ *
+ * EXYNOS - CHIP ID support
+ * Author: Pankaj Dubey <[email protected]>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/io.h>
+#include <linux/of.h>
+#include <linux/of_address.h>
+#include <linux/of_platform.h>
+#include <linux/platform_device.h>
+#include <linux/slab.h>
+#include <linux/sys_soc.h>
+#include <linux/soc/samsung/exynos-soc.h>
+
+#define EXYNOS_SUBREV_MASK (0xF << 4)
+#define EXYNOS_MAINREV_MASK (0xF << 0)
+#define EXYNOS_REV_MASK (EXYNOS_SUBREV_MASK | EXYNOS_MAINREV_MASK)
+
+static void __iomem *exynos_chipid_base;
+
+static unsigned int soc_product_id;
+static unsigned int soc_revision;
+
+int exynos_product_id(void)
+{
+ return soc_product_id;
+}
+EXPORT_SYMBOL(exynos_product_id);
+
+int exynos_revision(void)
+{
+ return soc_revision;
+}
+EXPORT_SYMBOL(exynos_revision);
+
+static const char *exynos_product_id_to_name(unsigned int product_id)
+{
+ const char *soc_name;
+ unsigned int soc_id = product_id & EXYNOS_SOC_MASK;
+
+ switch (soc_id) {
+ case EXYNOS3250_SOC_ID:
+ soc_name = "EXYNOS3250";
+ break;
+ case EXYNOS4210_SOC_ID:
+ soc_name = "EXYNOS4210";
+ break;
+ case EXYNOS4212_SOC_ID:
+ soc_name = "EXYNOS4212";
+ break;
+ case EXYNOS4412_SOC_ID:
+ soc_name = "EXYNOS4412";
+ break;
+ case EXYNOS4415_SOC_ID:
+ soc_name = "EXYNOS4415";
+ break;
+ case EXYNOS5250_SOC_ID:
+ soc_name = "EXYNOS5250";
+ break;
+ case EXYNOS5260_SOC_ID:
+ soc_name = "EXYNOS5260";
+ break;
+ case EXYNOS5420_SOC_ID:
+ soc_name = "EXYNOS5420";
+ break;
+ case EXYNOS5440_SOC_ID:
+ soc_name = "EXYNOS5440";
+ break;
+ case EXYNOS5800_SOC_ID:
+ soc_name = "EXYNOS5800";
+ break;
+ default:
+ soc_name = "UNKNOWN";
+ }
+ return soc_name;
+}
+
+static ssize_t exynos_get_sub_rev(struct device *dev,
+ struct device_attribute *attr,
+ char *buf)
+{
+ return sprintf(buf, "%x\n", (unsigned int)
+ (soc_product_id & EXYNOS_SUBREV_MASK));
+}
+
+static struct device_attribute exynos_sub_rev_attr =
+ __ATTR(subrev, S_IRUGO, exynos_get_sub_rev, NULL);
+
+static ssize_t exynos_get_main_rev(struct device *dev,
+ struct device_attribute *attr,
+ char *buf)
+{
+ return sprintf(buf, "%x\n", (unsigned int)
+ (soc_product_id & EXYNOS_MAINREV_MASK));
+}
+
+static struct device_attribute exynos_main_rev_attr =
+ __ATTR(mainrev, S_IRUGO, exynos_get_main_rev, NULL);
+
+static ssize_t exynos_get_product_id(struct device *dev,
+ struct device_attribute *attr,
+ char *buf)
+{
+ return sprintf(buf, "%x\n", (unsigned int)
+ (soc_product_id & EXYNOS_SOC_MASK));
+}
+
+static struct device_attribute exynos_product_attr =
+ __ATTR(product, S_IRUGO, exynos_get_product_id, NULL);
+
+static struct of_device_id of_exynos_chipid_ids[] = {
+ {
+ .compatible = "samsung,exynos4210-chipid",
+ },
+ {},
+};
+
+/**
+ * exynos_chipid_early_init: Early chipid initialization
+ * @dev: pointer to chipid device
+ */
+void exynos_chipid_early_init(struct device *dev)
+{
+ struct device_node *np;
+ const struct of_device_id *match;
+
+ if (exynos_chipid_base)
+ return;
+
+ if (!dev)
+ np = of_find_matching_node_and_match(NULL,
+ of_exynos_chipid_ids, &match);
+ else
+ np = dev->of_node;
+
+ if (!np)
+ panic("%s, failed to find chipid node\n", __func__);
+
+ exynos_chipid_base = of_iomap(np, 0);
+
+ if (!exynos_chipid_base)
+ panic("%s: failed to map registers\n", __func__);
+
+ soc_product_id = __raw_readl(exynos_chipid_base);
+ soc_revision = soc_product_id & EXYNOS_REV_MASK;
+}
+
+static int exynos_chipid_probe(struct platform_device *pdev)
+{
+ struct soc_device_attribute *soc_dev_attr;
+ struct soc_device *soc_dev;
+ struct device_node *root;
+ int ret;
+
+ exynos_chipid_early_init(&pdev->dev);
+
+ soc_dev_attr = kzalloc(sizeof(*soc_dev_attr), GFP_KERNEL);
+ if (!soc_dev_attr)
+ return -ENODEV;
+
+ soc_dev_attr->family = "Samsung Exynos";
+
+ root = of_find_node_by_path("/");
+ ret = of_property_read_string(root, "model", &soc_dev_attr->machine);
+ of_node_put(root);
+ if (ret)
+ goto free_soc;
+
+ soc_dev_attr->revision = kasprintf(GFP_KERNEL, "%d",
+ soc_revision);
+ if (!soc_dev_attr->revision)
+ goto free_soc;
+
+ soc_dev_attr->soc_id = exynos_product_id_to_name(soc_product_id);
+
+ soc_dev = soc_device_register(soc_dev_attr);
+ if (IS_ERR(soc_dev))
+ goto free_rev;
+
+ device_create_file(soc_device_to_device(soc_dev), &exynos_product_attr);
+ device_create_file(soc_device_to_device(soc_dev),
+ &exynos_main_rev_attr);
+ device_create_file(soc_device_to_device(soc_dev), &exynos_sub_rev_attr);
+
+ soc_device_to_device(soc_dev);
+
+ dev_info(&pdev->dev, "Exynos: CPU[%s] CPU_REV[0x%x] Detected\n",
+ exynos_product_id_to_name(soc_product_id),
+ soc_revision);
+ return 0;
+free_rev:
+ kfree(soc_dev_attr->revision);
+free_soc:
+ kfree(soc_dev_attr);
+ return -EINVAL;
+}
+
+static struct platform_driver exynos_chipid_driver = {
+ .driver = {
+ .name = "exynos-chipid",
+ .of_match_table = of_exynos_chipid_ids,
+ },
+ .probe = exynos_chipid_probe,
+};
+
+static int __init exynos_chipid_init(void)
+{
+ return platform_driver_register(&exynos_chipid_driver);
+}
+core_initcall(exynos_chipid_init);
+
diff --git a/include/linux/soc/samsung/exynos-soc.h b/include/linux/soc/samsung/exynos-soc.h
new file mode 100644
index 0000000..f160332
--- /dev/null
+++ b/include/linux/soc/samsung/exynos-soc.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright (c) 2014 Samsung Electronics Co., Ltd.
+ * http://www.samsung.com
+ *
+ * Header for EXYNOS SoC Chipid support
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#ifndef __EXYNOS_SOC_H
+#define __EXYNOS_SOC_H
+
+#define EXYNOS3250_SOC_ID 0xE3472000
+#define EXYNOS4210_SOC_ID 0x43210000
+#define EXYNOS4212_SOC_ID 0x43220000
+#define EXYNOS4412_SOC_ID 0xE4412000
+#define EXYNOS4415_SOC_ID 0xE4415000
+#define EXYNOS5250_SOC_ID 0x43520000
+#define EXYNOS5260_SOC_ID 0xE5260000
+#define EXYNOS5410_SOC_ID 0xE5410000
+#define EXYNOS5420_SOC_ID 0xE5420000
+#define EXYNOS5440_SOC_ID 0xE5440000
+#define EXYNOS5800_SOC_ID 0xE5422000
+
+#define EXYNOS_SOC_MASK 0xFFFFF000
+
+#define EXYNOS4210_REV_0 0x0
+#define EXYNOS4210_REV_1_0 0x10
+#define EXYNOS4210_REV_1_1 0x11
+
+#ifdef CONFIG_ARCH_EXYNOS
+int exynos_product_id(void);
+int exynos_revision(void);
+#else
+static inline int exynos_product_id(void)
+{
+ return -ENOSYS;
+}
+
+static inline int exynos_revision(void)
+{
+ return -ENOSYS;
+}
+#endif
+
+/* Since we need chipid to be initialized as early as possible
+ * during secondary core bootup adding early initialization function
+ */
+extern void exynos_chipid_early_init(struct device *dev);
+
+#endif /* __EXYNOS_SOC_H */
--
1.7.9.5
This patch enables chipid driver for ARCH_EXYNOS and refactors
machine code for using chipid driver for identification of
SoC ID and SoC rev.
Signed-off-by: Pankaj Dubey <[email protected]>
---
arch/arm/mach-exynos/Kconfig | 2 +
arch/arm/mach-exynos/common.h | 46 ++++-----------
arch/arm/mach-exynos/exynos.c | 77 +++++++++++---------------
arch/arm/mach-exynos/include/mach/map.h | 2 -
arch/arm/mach-exynos/platsmp.c | 2 +-
arch/arm/mach-exynos/pm.c | 8 +--
arch/arm/plat-samsung/cpu.c | 14 -----
arch/arm/plat-samsung/include/plat/cpu.h | 2 -
arch/arm/plat-samsung/include/plat/map-s5p.h | 1 -
9 files changed, 50 insertions(+), 104 deletions(-)
diff --git a/arch/arm/mach-exynos/Kconfig b/arch/arm/mach-exynos/Kconfig
index b9e3f1c..dd656a4 100644
--- a/arch/arm/mach-exynos/Kconfig
+++ b/arch/arm/mach-exynos/Kconfig
@@ -25,6 +25,8 @@ menuconfig ARCH_EXYNOS
select S5P_DEV_MFC
select SRAM
select MFD_SYSCON
+ select SOC_SAMSUNG
+ select EXYNOS_CHIPID
help
Support for SAMSUNG EXYNOS SoCs (EXYNOS4/5)
diff --git a/arch/arm/mach-exynos/common.h b/arch/arm/mach-exynos/common.h
index 865f878..52fb23a 100644
--- a/arch/arm/mach-exynos/common.h
+++ b/arch/arm/mach-exynos/common.h
@@ -13,39 +13,24 @@
#define __ARCH_ARM_MACH_EXYNOS_COMMON_H
#include <linux/of.h>
-
-#define EXYNOS3250_SOC_ID 0xE3472000
-#define EXYNOS3_SOC_MASK 0xFFFFF000
-
-#define EXYNOS4210_CPU_ID 0x43210000
-#define EXYNOS4212_CPU_ID 0x43220000
-#define EXYNOS4412_CPU_ID 0xE4412200
-#define EXYNOS4_CPU_MASK 0xFFFE0000
-
-#define EXYNOS5250_SOC_ID 0x43520000
-#define EXYNOS5410_SOC_ID 0xE5410000
-#define EXYNOS5420_SOC_ID 0xE5420000
-#define EXYNOS5440_SOC_ID 0xE5440000
-#define EXYNOS5800_SOC_ID 0xE5422000
-#define EXYNOS5_SOC_MASK 0xFFFFF000
-
-extern unsigned long samsung_cpu_id;
+#include <linux/soc/samsung/exynos-soc.h>
#define IS_SAMSUNG_CPU(name, id, mask) \
static inline int is_samsung_##name(void) \
{ \
- return ((samsung_cpu_id & mask) == (id & mask)); \
+ int product_id = exynos_product_id(); \
+ return ((product_id & mask) == (id)); \
}
-IS_SAMSUNG_CPU(exynos3250, EXYNOS3250_SOC_ID, EXYNOS3_SOC_MASK)
-IS_SAMSUNG_CPU(exynos4210, EXYNOS4210_CPU_ID, EXYNOS4_CPU_MASK)
-IS_SAMSUNG_CPU(exynos4212, EXYNOS4212_CPU_ID, EXYNOS4_CPU_MASK)
-IS_SAMSUNG_CPU(exynos4412, EXYNOS4412_CPU_ID, EXYNOS4_CPU_MASK)
-IS_SAMSUNG_CPU(exynos5250, EXYNOS5250_SOC_ID, EXYNOS5_SOC_MASK)
-IS_SAMSUNG_CPU(exynos5410, EXYNOS5410_SOC_ID, EXYNOS5_SOC_MASK)
-IS_SAMSUNG_CPU(exynos5420, EXYNOS5420_SOC_ID, EXYNOS5_SOC_MASK)
-IS_SAMSUNG_CPU(exynos5440, EXYNOS5440_SOC_ID, EXYNOS5_SOC_MASK)
-IS_SAMSUNG_CPU(exynos5800, EXYNOS5800_SOC_ID, EXYNOS5_SOC_MASK)
+IS_SAMSUNG_CPU(exynos3250, EXYNOS3250_SOC_ID, EXYNOS_SOC_MASK)
+IS_SAMSUNG_CPU(exynos4210, EXYNOS4210_SOC_ID, EXYNOS_SOC_MASK)
+IS_SAMSUNG_CPU(exynos4212, EXYNOS4212_SOC_ID, EXYNOS_SOC_MASK)
+IS_SAMSUNG_CPU(exynos4412, EXYNOS4412_SOC_ID, EXYNOS_SOC_MASK)
+IS_SAMSUNG_CPU(exynos5250, EXYNOS5250_SOC_ID, EXYNOS_SOC_MASK)
+IS_SAMSUNG_CPU(exynos5410, EXYNOS5410_SOC_ID, EXYNOS_SOC_MASK)
+IS_SAMSUNG_CPU(exynos5420, EXYNOS5420_SOC_ID, EXYNOS_SOC_MASK)
+IS_SAMSUNG_CPU(exynos5440, EXYNOS5440_SOC_ID, EXYNOS_SOC_MASK)
+IS_SAMSUNG_CPU(exynos5800, EXYNOS5800_SOC_ID, EXYNOS_SOC_MASK)
#if defined(CONFIG_SOC_EXYNOS3250)
# define soc_is_exynos3250() is_samsung_exynos3250()
@@ -71,10 +56,6 @@ IS_SAMSUNG_CPU(exynos5800, EXYNOS5800_SOC_ID, EXYNOS5_SOC_MASK)
# define soc_is_exynos4412() 0
#endif
-#define EXYNOS4210_REV_0 (0x0)
-#define EXYNOS4210_REV_1_0 (0x10)
-#define EXYNOS4210_REV_1_1 (0x11)
-
#if defined(CONFIG_SOC_EXYNOS5250)
# define soc_is_exynos5250() is_samsung_exynos5250()
#else
@@ -150,9 +131,6 @@ extern void exynos_pm_central_suspend(void);
extern int exynos_pm_central_resume(void);
extern void exynos_enter_aftr(void);
-extern void s5p_init_cpu(void __iomem *cpuid_addr);
-extern unsigned int samsung_rev(void);
-
static inline void pmu_raw_writel(u32 val, u32 offset)
{
__raw_writel(val, pmu_base_addr + offset);
diff --git a/arch/arm/mach-exynos/exynos.c b/arch/arm/mach-exynos/exynos.c
index c13d083..e2a640b 100644
--- a/arch/arm/mach-exynos/exynos.c
+++ b/arch/arm/mach-exynos/exynos.c
@@ -126,53 +126,16 @@ static void __init exynos_init_late(void)
exynos_pm_init();
}
-static int __init exynos_fdt_map_chipid(unsigned long node, const char *uname,
- int depth, void *data)
+static void __init exynos4_init_io(void)
{
- struct map_desc iodesc;
- const __be32 *reg;
- int len;
-
- if (!of_flat_dt_is_compatible(node, "samsung,exynos4210-chipid") &&
- !of_flat_dt_is_compatible(node, "samsung,exynos5440-clock"))
- return 0;
-
- reg = of_get_flat_dt_prop(node, "reg", &len);
- if (reg == NULL || len != (sizeof(unsigned long) * 2))
- return 0;
-
- iodesc.pfn = __phys_to_pfn(be32_to_cpu(reg[0]));
- iodesc.length = be32_to_cpu(reg[1]) - 1;
- iodesc.virtual = (unsigned long)S5P_VA_CHIPID;
- iodesc.type = MT_DEVICE;
- iotable_init(&iodesc, 1);
- return 1;
-}
-
-/*
- * exynos_map_io
- *
- * register the standard cpu IO areas
- */
-static void __init exynos_map_io(void)
-{
- if (soc_is_exynos4())
- iotable_init(exynos4_iodesc, ARRAY_SIZE(exynos4_iodesc));
-
- if (soc_is_exynos5())
- iotable_init(exynos5_iodesc, ARRAY_SIZE(exynos5_iodesc));
+ debug_ll_io_init();
+ iotable_init(exynos4_iodesc, ARRAY_SIZE(exynos4_iodesc));
}
-static void __init exynos_init_io(void)
+static void __init exynos5_init_io(void)
{
debug_ll_io_init();
-
- of_scan_flat_dt(exynos_fdt_map_chipid, NULL);
-
- /* detect cpu id and rev. */
- s5p_init_cpu(S5P_VA_CHIPID);
-
- exynos_map_io();
+ iotable_init(exynos5_iodesc, ARRAY_SIZE(exynos5_iodesc));
}
static const struct of_device_id exynos_dt_pmu_match[] = {
@@ -209,6 +172,8 @@ static void __init exynos_init_irq(void)
* init_irq
*/
exynos_map_pmu();
+
+ exynos_chipid_early_init(NULL);
}
static void __init exynos_dt_machine_init(void)
@@ -258,7 +223,7 @@ static void __init exynos_dt_machine_init(void)
of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
}
-static char const *exynos_dt_compat[] __initconst = {
+static char const *exynos4_dt_compat[] __initconst = {
"samsung,exynos3",
"samsung,exynos3250",
"samsung,exynos4",
@@ -266,6 +231,10 @@ static char const *exynos_dt_compat[] __initconst = {
"samsung,exynos4212",
"samsung,exynos4412",
"samsung,exynos4415",
+ NULL
+};
+
+static char const *exynos5_dt_compat[] __initconst = {
"samsung,exynos5",
"samsung,exynos5250",
"samsung,exynos5260",
@@ -299,18 +268,34 @@ static void __init exynos_dt_fixup(void)
of_fdt_limit_memory(8);
}
-DT_MACHINE_START(EXYNOS_DT, "SAMSUNG EXYNOS (Flattened Device Tree)")
+DT_MACHINE_START(EXYNOS4_DT, "SAMSUNG EXYNOS4 (Flattened Device Tree)")
+ /* Maintainer: Thomas Abraham <[email protected]> */
+ /* Maintainer: Kukjin Kim <[email protected]> */
+ .l2c_aux_val = 0x3c400001,
+ .l2c_aux_mask = 0xc20fffff,
+ .smp = smp_ops(exynos_smp_ops),
+ .map_io = exynos4_init_io,
+ .init_early = exynos_firmware_init,
+ .init_irq = exynos_init_irq,
+ .init_machine = exynos_dt_machine_init,
+ .init_late = exynos_init_late,
+ .dt_compat = exynos4_dt_compat,
+ .reserve = exynos_reserve,
+ .dt_fixup = exynos_dt_fixup,
+MACHINE_END
+
+DT_MACHINE_START(EXYNOS5_DT, "SAMSUNG EXYNOS5 (Flattened Device Tree)")
/* Maintainer: Thomas Abraham <[email protected]> */
/* Maintainer: Kukjin Kim <[email protected]> */
.l2c_aux_val = 0x3c400001,
.l2c_aux_mask = 0xc20fffff,
.smp = smp_ops(exynos_smp_ops),
- .map_io = exynos_init_io,
+ .map_io = exynos5_init_io,
.init_early = exynos_firmware_init,
.init_irq = exynos_init_irq,
.init_machine = exynos_dt_machine_init,
.init_late = exynos_init_late,
- .dt_compat = exynos_dt_compat,
+ .dt_compat = exynos5_dt_compat,
.reserve = exynos_reserve,
.dt_fixup = exynos_dt_fixup,
MACHINE_END
diff --git a/arch/arm/mach-exynos/include/mach/map.h b/arch/arm/mach-exynos/include/mach/map.h
index 1ad3f49..2e1c115 100644
--- a/arch/arm/mach-exynos/include/mach/map.h
+++ b/arch/arm/mach-exynos/include/mach/map.h
@@ -22,8 +22,6 @@
#include <plat/map-s5p.h>
-#define EXYNOS_PA_CHIPID 0x10000000
-
#define EXYNOS4_PA_SYSCON 0x10010000
#define EXYNOS5_PA_SYSCON 0x10050100
diff --git a/arch/arm/mach-exynos/platsmp.c b/arch/arm/mach-exynos/platsmp.c
index 7a1ebfe..5c318c3 100644
--- a/arch/arm/mach-exynos/platsmp.c
+++ b/arch/arm/mach-exynos/platsmp.c
@@ -196,7 +196,7 @@ int exynos_cluster_power_state(int cluster)
static inline void __iomem *cpu_boot_reg_base(void)
{
- if (soc_is_exynos4210() && samsung_rev() == EXYNOS4210_REV_1_1)
+ if (soc_is_exynos4210() && exynos_revision() == EXYNOS4210_REV_1_1)
return pmu_base_addr + S5P_INFORM5;
return sysram_base_addr;
}
diff --git a/arch/arm/mach-exynos/pm.c b/arch/arm/mach-exynos/pm.c
index 86f3ecd..d694190 100644
--- a/arch/arm/mach-exynos/pm.c
+++ b/arch/arm/mach-exynos/pm.c
@@ -32,18 +32,18 @@
static inline void __iomem *exynos_boot_vector_addr(void)
{
- if (samsung_rev() == EXYNOS4210_REV_1_1)
+ if (exynos_revision() == EXYNOS4210_REV_1_1)
return pmu_base_addr + S5P_INFORM7;
- else if (samsung_rev() == EXYNOS4210_REV_1_0)
+ else if (exynos_revision() == EXYNOS4210_REV_1_0)
return sysram_base_addr + 0x24;
return pmu_base_addr + S5P_INFORM0;
}
static inline void __iomem *exynos_boot_vector_flag(void)
{
- if (samsung_rev() == EXYNOS4210_REV_1_1)
+ if (exynos_revision() == EXYNOS4210_REV_1_1)
return pmu_base_addr + S5P_INFORM6;
- else if (samsung_rev() == EXYNOS4210_REV_1_0)
+ else if (exynos_revision() == EXYNOS4210_REV_1_0)
return sysram_base_addr + 0x20;
return pmu_base_addr + S5P_INFORM1;
}
diff --git a/arch/arm/plat-samsung/cpu.c b/arch/arm/plat-samsung/cpu.c
index 71333bb..02d95fd 100644
--- a/arch/arm/plat-samsung/cpu.c
+++ b/arch/arm/plat-samsung/cpu.c
@@ -21,12 +21,6 @@
unsigned long samsung_cpu_id;
static unsigned int samsung_cpu_rev;
-unsigned int samsung_rev(void)
-{
- return samsung_cpu_rev;
-}
-EXPORT_SYMBOL(samsung_rev);
-
void __init s3c64xx_init_cpu(void)
{
samsung_cpu_id = __raw_readl(S3C_VA_SYS + 0x118);
@@ -43,11 +37,3 @@ void __init s3c64xx_init_cpu(void)
pr_info("Samsung CPU ID: 0x%08lx\n", samsung_cpu_id);
}
-
-void __init s5p_init_cpu(void __iomem *cpuid_addr)
-{
- samsung_cpu_id = __raw_readl(cpuid_addr);
- samsung_cpu_rev = samsung_cpu_id & 0xFF;
-
- pr_info("Samsung CPU ID: 0x%08lx\n", samsung_cpu_id);
-}
diff --git a/arch/arm/plat-samsung/include/plat/cpu.h b/arch/arm/plat-samsung/include/plat/cpu.h
index 61d14f3..fa7d0d6 100644
--- a/arch/arm/plat-samsung/include/plat/cpu.h
+++ b/arch/arm/plat-samsung/include/plat/cpu.h
@@ -114,8 +114,6 @@ extern void s3c24xx_init_io(struct map_desc *mach_desc, int size);
extern void s3c64xx_init_cpu(void);
-extern unsigned int samsung_rev(void);
-
extern void s3c24xx_init_uarts(struct s3c2410_uartcfg *cfg, int no);
extern void s3c24xx_init_clocks(int xtal);
diff --git a/arch/arm/plat-samsung/include/plat/map-s5p.h b/arch/arm/plat-samsung/include/plat/map-s5p.h
index f5cf2bd..3df015c 100644
--- a/arch/arm/plat-samsung/include/plat/map-s5p.h
+++ b/arch/arm/plat-samsung/include/plat/map-s5p.h
@@ -13,7 +13,6 @@
#ifndef __ASM_PLAT_MAP_S5P_H
#define __ASM_PLAT_MAP_S5P_H __FILE__
-#define S5P_VA_CHIPID S3C_ADDR(0x02000000)
#define S5P_VA_CMU S3C_ADDR(0x02100000)
#define S5P_VA_DMC0 S3C_ADDR(0x02440000)
--
1.7.9.5
> Exynos SoCs have Chipid, for identification of product IDs
> and SoC revisions. This patch intendes to provide initialization
> code for all these functionalites, at the same time it provides some
> sysfs entries for accessing these information to userspace.
>
> This driver usese existing binding for exnos-chipid.
Nice!
On Wednesday 03 December 2014 13:47:37 Pankaj Dubey wrote:
> + soc_dev_attr->soc_id = exynos_product_id_to_name(soc_product_id);
> +
> + soc_dev = soc_device_register(soc_dev_attr);
> + if (IS_ERR(soc_dev))
> + goto free_rev;
> +
> + device_create_file(soc_device_to_device(soc_dev), &exynos_product_attr);
> + device_create_file(soc_device_to_device(soc_dev),
> + &exynos_main_rev_attr);
> + device_create_file(soc_device_to_device(soc_dev), &exynos_sub_rev_attr);
> +
I don't like the idea of having three extra nonstandard properties here,
especially when you are not using the machine field for anything useful.
Also, all three of these just come from the same register, why expose
them all as the machine and revision standard properties.
Arnd
Hi Arnd,
On Wednesday 03 December 2014 04:13 PM, Arnd Bergmann wrote:
>> Exynos SoCs have Chipid, for identification of product IDs
>> and SoC revisions. This patch intendes to provide initialization
>> code for all these functionalites, at the same time it provides some
>> sysfs entries for accessing these information to userspace.
>>
>> This driver usese existing binding for exnos-chipid.
>
> Nice!
Thanks for review.
>
> On Wednesday 03 December 2014 13:47:37 Pankaj Dubey wrote:
>
>> + soc_dev_attr->soc_id = exynos_product_id_to_name(soc_product_id);
>> +
>> + soc_dev = soc_device_register(soc_dev_attr);
>> + if (IS_ERR(soc_dev))
>> + goto free_rev;
>> +
>> + device_create_file(soc_device_to_device(soc_dev), &exynos_product_attr);
>> + device_create_file(soc_device_to_device(soc_dev),
>> + &exynos_main_rev_attr);
>> + device_create_file(soc_device_to_device(soc_dev), &exynos_sub_rev_attr);
>> +
>
> I don't like the idea of having three extra nonstandard properties here,
> especially when you are not using the machine field for anything useful.
>
I did not get you here. Any suggestions how we can use 'machine' field
more useful way.
> Also, all three of these just come from the same register, why expose
> them all as the machine and revision standard properties.
>
Agreed. These properties are basically giving same information but with
small modification.
As you said these are getting exposed via standard properties as well,
so I have no issue to drop them. Just waiting for more review from
Samsung folks, will take care of this in next version.
Thanks,
Pankaj Dubey
> Arnd
>
On Thursday 04 December 2014 10:30:36 Pankaj Dubey wrote:
> >
> > On Wednesday 03 December 2014 13:47:37 Pankaj Dubey wrote:
> >
> >> + soc_dev_attr->soc_id = exynos_product_id_to_name(soc_product_id);
> >> +
> >> + soc_dev = soc_device_register(soc_dev_attr);
> >> + if (IS_ERR(soc_dev))
> >> + goto free_rev;
> >> +
> >> + device_create_file(soc_device_to_device(soc_dev), &exynos_product_attr);
> >> + device_create_file(soc_device_to_device(soc_dev),
> >> + &exynos_main_rev_attr);
> >> + device_create_file(soc_device_to_device(soc_dev), &exynos_sub_rev_attr);
> >> +
> >
> > I don't like the idea of having three extra nonstandard properties here,
> > especially when you are not using the machine field for anything useful.
> >
>
> I did not get you here. Any suggestions how we can use 'machine' field
> more useful way.
For instance you could pass the exynos_product_id_to_name() result to
the machine field instead of the soc_id field, and use the soc_id
for a more fine-grained distinction.
> > Also, all three of these just come from the same register, why expose
> > them all as the machine and revision standard properties.
> >
>
> Agreed. These properties are basically giving same information but with
> small modification.
> As you said these are getting exposed via standard properties as well,
> so I have no issue to drop them. Just waiting for more review from
> Samsung folks, will take care of this in next version.
Ok.
Arnd
Hi Yadwinder,
On Thursday 04 December 2014 11:56 PM, Yadwinder Singh Brar wrote:
> Hi Pankaj,
>
>
> On Wed, Dec 3, 2014 at 1:47 PM, Pankaj Dubey <[email protected]
> <mailto:[email protected]>> wrote:
>
> Exynos SoCs have Chipid, for identification of product IDs
> and SoC revisions. This patch intendes to provide initialization
> code for all these functionalites, at the same time it provides some
> sysfs entries for accessing these information to userspace.
>
> This driver usese existing binding for exnos-chipid.
>
> [ ... ]
>
> +
> +static unsigned int soc_product_id;
> +static unsigned int soc_revision;
> +
> +int exynos_product_id(void)
> +{
> + return soc_product_id;
> +}
> +EXPORT_SYMBOL(exynos_product_id);
> +
> +int exynos_revision(void)
> +{
> + return soc_revision;
> +}
> +EXPORT_SYMBOL(exynos_revision);
> +
>
>
> How about exporting only a struct containing members : soc_revision,
> soc_product_id
OK, keeping in mind that chipid driver might be used from other drivers
as well (such as asv) other than from mach-exynos, we can do this.
> and may be some more like asv/fused_info and keeping these function as
Other members such as fused_info etc. can be added as and when required.
As of now there is no active user of all those.
> inlines ?
>
> +static const char *exynos_product_id_to_name(unsigned int product_id)
>
>
> __init ? hmm .. I think almost whole driver other than __ATTR funcs.
>
OK, I'll take care of this in next patch version.
> Otherwise it looks nice to me :)
>
> Best Regards,
> Yadwinder
Thanks for review.
Pankaj Dubey