From 4bec674c9f3f0bc137cf5aa4d2cb01e9f8027b3d Mon Sep 17 00:00:00 2001 From: John Crispin Date: Wed, 8 May 2013 22:08:39 +0200 Subject: [PATCH 155/164] reset: MIPS: ralink: add core/device reset wrapper Add a helper for reseting different devices ont he SoC. Signed-off-by: John Crispin --- arch/mips/Kconfig | 1 + arch/mips/ralink/of.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++ arch/mips/ralink/reset.c | 1 + 3 files changed, 61 insertions(+) diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig index b237c50..cfc7153 100644 --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig @@ -444,6 +444,7 @@ config RALINK select HAVE_MACH_CLKDEV select CLKDEV_LOOKUP select ARCH_REQUIRE_GPIOLIB + select ARCH_HAS_RESET_CONTROLLER config SGI_IP22 bool "SGI IP22 (Indy/Indigo2)" diff --git a/arch/mips/ralink/of.c b/arch/mips/ralink/of.c index 8efb02b..2faf478 100644 --- a/arch/mips/ralink/of.c +++ b/arch/mips/ralink/of.c @@ -14,16 +14,22 @@ #include #include #include +#include #include #include #include +#include #include #include #include +#include + #include "common.h" +#define SYSC_REG_RESET_CTRL 0x034 + __iomem void *rt_sysc_membase; __iomem void *rt_memc_membase; @@ -96,6 +102,53 @@ void __init plat_mem_setup(void) soc_info.mem_size_max * SZ_1M); } +static int ralink_assert_device(struct reset_controller_dev *rcdev, unsigned long id) +{ + u32 val; + + if (id < 8) + return -1; + + val = rt_sysc_r32(SYSC_REG_RESET_CTRL); + val |= BIT(id); + rt_sysc_w32(val, SYSC_REG_RESET_CTRL); + + return 0; +} + +static int ralink_deassert_device(struct reset_controller_dev *rcdev, unsigned long id) +{ + u32 val; + + if (id < 8) + return -1; + + val = rt_sysc_r32(SYSC_REG_RESET_CTRL); + val &= ~BIT(id); + rt_sysc_w32(val, SYSC_REG_RESET_CTRL); + + return 0; +} + +static int ralink_reset_device(struct reset_controller_dev *rcdev, unsigned long id) +{ + ralink_assert_device(rcdev, id); + return ralink_deassert_device(rcdev, id); +} + +static struct reset_control_ops reset_ops = { + .reset = ralink_reset_device, + .assert = ralink_assert_device, + .deassert = ralink_deassert_device, +}; + +static struct reset_controller_dev reset_dev = { + .ops = &reset_ops, + .owner = THIS_MODULE, + .nr_resets = 32, + .of_reset_n_cells = 1, +}; + static int __init plat_of_setup(void) { static struct of_device_id of_ids[3]; @@ -110,6 +163,12 @@ static int __init plat_of_setup(void) if (of_platform_populate(NULL, of_ids, NULL, NULL)) panic("failed to populate DT\n"); + reset_dev.of_node = of_find_compatible_node(NULL, NULL, "ralink,rt2880-reset"); + if (!reset_dev.of_node) + panic("Failed to find reset controller node"); + + reset_controller_register(&reset_dev); + ralink_pinmux(); return 0; diff --git a/arch/mips/ralink/reset.c b/arch/mips/ralink/reset.c index 22120e5..6c15f4f 100644 --- a/arch/mips/ralink/reset.c +++ b/arch/mips/ralink/reset.c @@ -10,6 +10,7 @@ #include #include +#include #include -- 1.7.10.4