Linux Audio

Check our new training course

Loading...
v3.15
  1/*
  2 * This program is free software; you can redistribute it and/or modify it
  3 * under the terms of the GNU General Public License version 2 as published
  4 * by the Free Software Foundation.
  5 *
  6 * Copyright (C) 2008-2009 Gabor Juhos <juhosg@openwrt.org>
  7 * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org>
  8 * Copyright (C) 2013 John Crispin <blogic@openwrt.org>
  9 */
 10
 11#include <linux/pm.h>
 12#include <linux/io.h>
 13#include <linux/of.h>
 
 14#include <linux/reset-controller.h>
 15
 16#include <asm/reboot.h>
 17
 18#include <asm/mach-ralink/ralink_regs.h>
 19
 20/* Reset Control */
 21#define SYSC_REG_RESET_CTRL     0x034
 22#define RSTCTL_RESET_SYSTEM     BIT(0)
 
 
 23
 24static int ralink_assert_device(struct reset_controller_dev *rcdev,
 25				unsigned long id)
 26{
 27	u32 val;
 28
 29	if (id < 8)
 30		return -1;
 31
 32	val = rt_sysc_r32(SYSC_REG_RESET_CTRL);
 33	val |= BIT(id);
 34	rt_sysc_w32(val, SYSC_REG_RESET_CTRL);
 35
 36	return 0;
 37}
 38
 39static int ralink_deassert_device(struct reset_controller_dev *rcdev,
 40				  unsigned long id)
 41{
 42	u32 val;
 43
 44	if (id < 8)
 45		return -1;
 46
 47	val = rt_sysc_r32(SYSC_REG_RESET_CTRL);
 48	val &= ~BIT(id);
 49	rt_sysc_w32(val, SYSC_REG_RESET_CTRL);
 50
 51	return 0;
 52}
 53
 54static int ralink_reset_device(struct reset_controller_dev *rcdev,
 55			       unsigned long id)
 56{
 57	ralink_assert_device(rcdev, id);
 58	return ralink_deassert_device(rcdev, id);
 59}
 60
 61static struct reset_control_ops reset_ops = {
 62	.reset = ralink_reset_device,
 63	.assert = ralink_assert_device,
 64	.deassert = ralink_deassert_device,
 65};
 66
 67static struct reset_controller_dev reset_dev = {
 68	.ops			= &reset_ops,
 69	.owner			= THIS_MODULE,
 70	.nr_resets		= 32,
 71	.of_reset_n_cells	= 1,
 72};
 73
 74void ralink_rst_init(void)
 75{
 76	reset_dev.of_node = of_find_compatible_node(NULL, NULL,
 77						"ralink,rt2880-reset");
 78	if (!reset_dev.of_node)
 79		pr_err("Failed to find reset controller node");
 80	else
 81		reset_controller_register(&reset_dev);
 82}
 83
 84static void ralink_restart(char *command)
 85{
 
 
 
 
 
 86	local_irq_disable();
 87	rt_sysc_w32(RSTCTL_RESET_SYSTEM, SYSC_REG_RESET_CTRL);
 88	unreachable();
 89}
 90
 91static void ralink_halt(void)
 92{
 93	local_irq_disable();
 94	unreachable();
 95}
 96
 97static int __init mips_reboot_setup(void)
 98{
 99	_machine_restart = ralink_restart;
100	_machine_halt = ralink_halt;
101	pm_power_off = ralink_halt;
102
103	return 0;
104}
105
106arch_initcall(mips_reboot_setup);
v4.6
  1/*
  2 * This program is free software; you can redistribute it and/or modify it
  3 * under the terms of the GNU General Public License version 2 as published
  4 * by the Free Software Foundation.
  5 *
  6 * Copyright (C) 2008-2009 Gabor Juhos <juhosg@openwrt.org>
  7 * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org>
  8 * Copyright (C) 2013 John Crispin <blogic@openwrt.org>
  9 */
 10
 11#include <linux/pm.h>
 12#include <linux/io.h>
 13#include <linux/of.h>
 14#include <linux/delay.h>
 15#include <linux/reset-controller.h>
 16
 17#include <asm/reboot.h>
 18
 19#include <asm/mach-ralink/ralink_regs.h>
 20
 21/* Reset Control */
 22#define SYSC_REG_RESET_CTRL	0x034
 23
 24#define RSTCTL_RESET_PCI	BIT(26)
 25#define RSTCTL_RESET_SYSTEM	BIT(0)
 26
 27static int ralink_assert_device(struct reset_controller_dev *rcdev,
 28				unsigned long id)
 29{
 30	u32 val;
 31
 32	if (id < 8)
 33		return -1;
 34
 35	val = rt_sysc_r32(SYSC_REG_RESET_CTRL);
 36	val |= BIT(id);
 37	rt_sysc_w32(val, SYSC_REG_RESET_CTRL);
 38
 39	return 0;
 40}
 41
 42static int ralink_deassert_device(struct reset_controller_dev *rcdev,
 43				  unsigned long id)
 44{
 45	u32 val;
 46
 47	if (id < 8)
 48		return -1;
 49
 50	val = rt_sysc_r32(SYSC_REG_RESET_CTRL);
 51	val &= ~BIT(id);
 52	rt_sysc_w32(val, SYSC_REG_RESET_CTRL);
 53
 54	return 0;
 55}
 56
 57static int ralink_reset_device(struct reset_controller_dev *rcdev,
 58			       unsigned long id)
 59{
 60	ralink_assert_device(rcdev, id);
 61	return ralink_deassert_device(rcdev, id);
 62}
 63
 64static struct reset_control_ops reset_ops = {
 65	.reset = ralink_reset_device,
 66	.assert = ralink_assert_device,
 67	.deassert = ralink_deassert_device,
 68};
 69
 70static struct reset_controller_dev reset_dev = {
 71	.ops			= &reset_ops,
 72	.owner			= THIS_MODULE,
 73	.nr_resets		= 32,
 74	.of_reset_n_cells	= 1,
 75};
 76
 77void ralink_rst_init(void)
 78{
 79	reset_dev.of_node = of_find_compatible_node(NULL, NULL,
 80						"ralink,rt2880-reset");
 81	if (!reset_dev.of_node)
 82		pr_err("Failed to find reset controller node");
 83	else
 84		reset_controller_register(&reset_dev);
 85}
 86
 87static void ralink_restart(char *command)
 88{
 89	if (IS_ENABLED(CONFIG_PCI)) {
 90		rt_sysc_m32(0, RSTCTL_RESET_PCI, SYSC_REG_RESET_CTRL);
 91		mdelay(50);
 92	}
 93
 94	local_irq_disable();
 95	rt_sysc_w32(RSTCTL_RESET_SYSTEM, SYSC_REG_RESET_CTRL);
 96	unreachable();
 97}
 98
 99static void ralink_halt(void)
100{
101	local_irq_disable();
102	unreachable();
103}
104
105static int __init mips_reboot_setup(void)
106{
107	_machine_restart = ralink_restart;
108	_machine_halt = ralink_halt;
 
109
110	return 0;
111}
112
113arch_initcall(mips_reboot_setup);