Skip to content

Commit

Permalink
MIPS: lantiq: add reset-controller api support
Browse files Browse the repository at this point in the history
Add a reset-controller binding for the reset registers found on the lantiq
SoC.

Signed-off-by: John Crispin <blogic@openwrt.org>
Patchwork: http://patchwork.linux-mips.org/patch/8043/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
  • Loading branch information
John Crispin authored and Ralf Baechle committed Nov 24, 2014
1 parent 05637f1 commit c530781
Show file tree
Hide file tree
Showing 2 changed files with 63 additions and 0 deletions.
2 changes: 2 additions & 0 deletions arch/mips/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -296,6 +296,8 @@ config LANTIQ
select USE_OF
select PINCTRL
select PINCTRL_LANTIQ
select ARCH_HAS_RESET_CONTROLLER
select RESET_CONTROLLER

config LASAT
bool "LASAT Networks platforms"
Expand Down
61 changes: 61 additions & 0 deletions arch/mips/lantiq/xway/reset.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
#include <linux/delay.h>
#include <linux/of_address.h>
#include <linux/of_platform.h>
#include <linux/reset-controller.h>

#include <asm/reboot.h>

Expand Down Expand Up @@ -113,6 +114,66 @@ void ltq_reset_once(unsigned int module, ulong u)
ltq_rcu_w32(ltq_rcu_r32(RCU_RST_REQ) & ~module, RCU_RST_REQ);
}

static int ltq_assert_device(struct reset_controller_dev *rcdev,
unsigned long id)
{
u32 val;

if (id < 8)
return -1;

val = ltq_rcu_r32(RCU_RST_REQ);
val |= BIT(id);
ltq_rcu_w32(val, RCU_RST_REQ);

return 0;
}

static int ltq_deassert_device(struct reset_controller_dev *rcdev,
unsigned long id)
{
u32 val;

if (id < 8)
return -1;

val = ltq_rcu_r32(RCU_RST_REQ);
val &= ~BIT(id);
ltq_rcu_w32(val, RCU_RST_REQ);

return 0;
}

static int ltq_reset_device(struct reset_controller_dev *rcdev,
unsigned long id)
{
ltq_assert_device(rcdev, id);
return ltq_deassert_device(rcdev, id);
}

static struct reset_control_ops reset_ops = {
.reset = ltq_reset_device,
.assert = ltq_assert_device,
.deassert = ltq_deassert_device,
};

static struct reset_controller_dev reset_dev = {
.ops = &reset_ops,
.owner = THIS_MODULE,
.nr_resets = 32,
.of_reset_n_cells = 1,
};

void ltq_rst_init(void)
{
reset_dev.of_node = of_find_compatible_node(NULL, NULL,
"lantiq,xway-reset");
if (!reset_dev.of_node)
pr_err("Failed to find reset controller node");
else
reset_controller_register(&reset_dev);
}

static void ltq_machine_restart(char *command)
{
local_irq_disable();
Expand Down

0 comments on commit c530781

Please sign in to comment.