diff options
author | Sylwester Nawrocki <s.nawrocki@samsung.com> | 2019-08-13 17:08:20 +0200 |
---|---|---|
committer | Krzysztof Kozlowski <krzk@kernel.org> | 2019-08-15 20:25:25 +0200 |
commit | 40d8aff614f71ab3cab20785b4f213e3802d4e87 (patch) | |
tree | 59075eca9ad344bf9245d7542295d491f15d920e /drivers/soc | |
parent | 3253b7b7cd44c4dd029a4ce280ef9f409a256e5f (diff) | |
download | linux-40d8aff614f71ab3cab20785b4f213e3802d4e87.tar.gz linux-40d8aff614f71ab3cab20785b4f213e3802d4e87.tar.bz2 linux-40d8aff614f71ab3cab20785b4f213e3802d4e87.zip |
soc: samsung: chipid: Convert exynos-chipid driver to use the regmap API
Convert the driver to use regmap API in order to allow other
drivers, like ASV, to access the CHIPID registers.
Add definition of selected CHIPID register offsets and register bit
fields for Exynos5422 SoC.
Signed-off-by: Sylwester Nawrocki <s.nawrocki@samsung.com>
Signed-off-by: Krzysztof Kozlowski <krzk@kernel.org>
Diffstat (limited to 'drivers/soc')
-rw-r--r-- | drivers/soc/samsung/exynos-chipid.c | 34 |
1 files changed, 13 insertions, 21 deletions
diff --git a/drivers/soc/samsung/exynos-chipid.c b/drivers/soc/samsung/exynos-chipid.c index bcf691f2b650..006a95feb618 100644 --- a/drivers/soc/samsung/exynos-chipid.c +++ b/drivers/soc/samsung/exynos-chipid.c @@ -9,16 +9,13 @@ */ #include <linux/io.h> +#include <linux/mfd/syscon.h> #include <linux/of.h> -#include <linux/of_address.h> +#include <linux/regmap.h> #include <linux/slab.h> +#include <linux/soc/samsung/exynos-chipid.h> #include <linux/sys_soc.h> -#define EXYNOS_SUBREV_MASK (0xF << 4) -#define EXYNOS_MAINREV_MASK (0xF << 0) -#define EXYNOS_REV_MASK (EXYNOS_SUBREV_MASK | EXYNOS_MAINREV_MASK) -#define EXYNOS_MASK 0xFFFFF000 - static const struct exynos_soc_id { const char *name; unsigned int id; @@ -51,29 +48,24 @@ static const char * __init product_id_to_soc_id(unsigned int product_id) int __init exynos_chipid_early_init(void) { struct soc_device_attribute *soc_dev_attr; - void __iomem *exynos_chipid_base; struct soc_device *soc_dev; struct device_node *root; - struct device_node *np; + struct regmap *regmap; u32 product_id; u32 revision; + int ret; - /* look up for chipid node */ - np = of_find_compatible_node(NULL, NULL, "samsung,exynos4210-chipid"); - if (!np) - return -ENODEV; - - exynos_chipid_base = of_iomap(np, 0); - of_node_put(np); - - if (!exynos_chipid_base) { - pr_err("Failed to map SoC chipid\n"); - return -ENXIO; + regmap = syscon_regmap_lookup_by_compatible("samsung,exynos4210-chipid"); + if (IS_ERR(regmap)) { + pr_err("Failed to get CHIPID regmap\n"); + return PTR_ERR(regmap); } - product_id = readl_relaxed(exynos_chipid_base); + ret = regmap_read(regmap, EXYNOS_CHIPID_REG_PRO_ID, &product_id); + if (ret < 0) + return ret; + revision = product_id & EXYNOS_REV_MASK; - iounmap(exynos_chipid_base); soc_dev_attr = kzalloc(sizeof(*soc_dev_attr), GFP_KERNEL); if (!soc_dev_attr) |