1a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm/*
2a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm * r8a7779 Power management support
3a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm *
4a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm * Copyright (C) 2011  Renesas Solutions Corp.
5a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm * Copyright (C) 2011  Magnus Damm
6a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm *
7a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm * This file is subject to the terms and conditions of the GNU General Public
8a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm * License.  See the file "COPYING" in the main directory of this archive
9a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm * for more details.
10a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm */
11a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm
12a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm#include <linux/pm.h>
13a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm#include <linux/suspend.h>
14a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm#include <linux/err.h>
15a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm#include <linux/pm_clock.h>
16a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm#include <linux/platform_device.h>
17a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm#include <linux/delay.h>
18a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm#include <linux/irq.h>
19a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm#include <linux/interrupt.h>
20a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm#include <linux/console.h>
21a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm#include <asm/io.h>
22a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm#include <mach/common.h>
23a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm#include <mach/r8a7779.h>
24a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm
25a662c08260fac126059a148cbd1061e71e806b4aMagnus Dammstatic void __iomem *r8a7779_sysc_base;
26a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm
27a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm/* SYSC */
28a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm#define SYSCSR 0x00
29a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm#define SYSCISR 0x04
30a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm#define SYSCISCR 0x08
31a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm#define SYSCIER 0x0c
32a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm#define SYSCIMR 0x10
33a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm#define PWRSR0 0x40
34a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm#define PWRSR1 0x80
35a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm#define PWRSR2 0xc0
36a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm#define PWRSR3 0x100
37a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm#define PWRSR4 0x140
38a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm
39a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm#define PWRSR_OFFS 0x00
40a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm#define PWROFFCR_OFFS 0x04
41a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm#define PWRONCR_OFFS 0x0c
42a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm#define PWRER_OFFS 0x14
43a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm
44a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm#define SYSCSR_RETRIES 100
45a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm#define SYSCSR_DELAY_US 1
46a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm
47a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm#define SYSCISR_RETRIES 1000
48a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm#define SYSCISR_DELAY_US 1
49a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm
50f40aaf6da14a4043d6361e0c7d74ada18e866059Magnus Damm#if defined(CONFIG_PM) || defined(CONFIG_SMP)
51f40aaf6da14a4043d6361e0c7d74ada18e866059Magnus Damm
52f40aaf6da14a4043d6361e0c7d74ada18e866059Magnus Dammstatic DEFINE_SPINLOCK(r8a7779_sysc_lock); /* SMP CPUs + I/O devices */
53a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm
54a662c08260fac126059a148cbd1061e71e806b4aMagnus Dammstatic int r8a7779_sysc_pwr_on_off(struct r8a7779_pm_ch *r8a7779_ch,
55a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm				   int sr_bit, int reg_offs)
56a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm{
57a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm	int k;
58a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm
59a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm	for (k = 0; k < SYSCSR_RETRIES; k++) {
60a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm		if (ioread32(r8a7779_sysc_base + SYSCSR) & (1 << sr_bit))
61a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm			break;
62a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm		udelay(SYSCSR_DELAY_US);
63a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm	}
64a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm
65a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm	if (k == SYSCSR_RETRIES)
66a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm		return -EAGAIN;
67a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm
68a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm	iowrite32(1 << r8a7779_ch->chan_bit,
69a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm		  r8a7779_sysc_base + r8a7779_ch->chan_offs + reg_offs);
70a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm
71a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm	return 0;
72a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm}
73a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm
74a662c08260fac126059a148cbd1061e71e806b4aMagnus Dammstatic int r8a7779_sysc_pwr_off(struct r8a7779_pm_ch *r8a7779_ch)
75a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm{
76a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm	return r8a7779_sysc_pwr_on_off(r8a7779_ch, 0, PWROFFCR_OFFS);
77a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm}
78a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm
79a662c08260fac126059a148cbd1061e71e806b4aMagnus Dammstatic int r8a7779_sysc_pwr_on(struct r8a7779_pm_ch *r8a7779_ch)
80a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm{
81a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm	return r8a7779_sysc_pwr_on_off(r8a7779_ch, 1, PWRONCR_OFFS);
82a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm}
83a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm
84a662c08260fac126059a148cbd1061e71e806b4aMagnus Dammstatic int r8a7779_sysc_update(struct r8a7779_pm_ch *r8a7779_ch,
85a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm			       int (*on_off_fn)(struct r8a7779_pm_ch *))
86a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm{
87a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm	unsigned int isr_mask = 1 << r8a7779_ch->isr_bit;
88a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm	unsigned int chan_mask = 1 << r8a7779_ch->chan_bit;
89a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm	unsigned int status;
90f40aaf6da14a4043d6361e0c7d74ada18e866059Magnus Damm	unsigned long flags;
91a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm	int ret = 0;
92a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm	int k;
93a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm
94f40aaf6da14a4043d6361e0c7d74ada18e866059Magnus Damm	spin_lock_irqsave(&r8a7779_sysc_lock, flags);
95f40aaf6da14a4043d6361e0c7d74ada18e866059Magnus Damm
96a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm	iowrite32(isr_mask, r8a7779_sysc_base + SYSCISCR);
97a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm
98a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm	do {
99a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm		ret = on_off_fn(r8a7779_ch);
100a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm		if (ret)
101a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm			goto out;
102a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm
103a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm		status = ioread32(r8a7779_sysc_base +
104a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm				  r8a7779_ch->chan_offs + PWRER_OFFS);
105a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm	} while (status & chan_mask);
106a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm
107a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm	for (k = 0; k < SYSCISR_RETRIES; k++) {
108a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm		if (ioread32(r8a7779_sysc_base + SYSCISR) & isr_mask)
109a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm			break;
110a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm		udelay(SYSCISR_DELAY_US);
111a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm	}
112a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm
113a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm	if (k == SYSCISR_RETRIES)
114a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm		ret = -EIO;
115a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm
116a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm	iowrite32(isr_mask, r8a7779_sysc_base + SYSCISCR);
117a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm
118a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm out:
119f40aaf6da14a4043d6361e0c7d74ada18e866059Magnus Damm	spin_unlock_irqrestore(&r8a7779_sysc_lock, flags);
120f40aaf6da14a4043d6361e0c7d74ada18e866059Magnus Damm
121a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm	pr_debug("r8a7779 power domain %d: %02x %02x %02x %02x %02x -> %d\n",
122a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm		 r8a7779_ch->isr_bit, ioread32(r8a7779_sysc_base + PWRSR0),
123a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm		 ioread32(r8a7779_sysc_base + PWRSR1),
124a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm		 ioread32(r8a7779_sysc_base + PWRSR2),
125a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm		 ioread32(r8a7779_sysc_base + PWRSR3),
126a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm		 ioread32(r8a7779_sysc_base + PWRSR4), ret);
127a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm	return ret;
128a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm}
129a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm
130f40aaf6da14a4043d6361e0c7d74ada18e866059Magnus Dammint r8a7779_sysc_power_down(struct r8a7779_pm_ch *r8a7779_ch)
131a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm{
132a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm	return r8a7779_sysc_update(r8a7779_ch, r8a7779_sysc_pwr_off);
133a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm}
134a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm
135f40aaf6da14a4043d6361e0c7d74ada18e866059Magnus Dammint r8a7779_sysc_power_up(struct r8a7779_pm_ch *r8a7779_ch)
136a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm{
137a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm	return r8a7779_sysc_update(r8a7779_ch, r8a7779_sysc_pwr_on);
138a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm}
139a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm
140a662c08260fac126059a148cbd1061e71e806b4aMagnus Dammstatic void __init r8a7779_sysc_init(void)
141a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm{
142a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm	r8a7779_sysc_base = ioremap_nocache(0xffd85000, PAGE_SIZE);
143a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm	if (!r8a7779_sysc_base)
144a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm		panic("unable to ioremap r8a7779 SYSC hardware block\n");
145a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm
146a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm	/* enable all interrupt sources, but do not use interrupt handler */
147a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm	iowrite32(0x0131000e, r8a7779_sysc_base + SYSCIER);
148a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm	iowrite32(0, r8a7779_sysc_base + SYSCIMR);
149a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm}
150a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm
151f40aaf6da14a4043d6361e0c7d74ada18e866059Magnus Damm#else /* CONFIG_PM || CONFIG_SMP */
152f40aaf6da14a4043d6361e0c7d74ada18e866059Magnus Damm
153f40aaf6da14a4043d6361e0c7d74ada18e866059Magnus Dammstatic inline void r8a7779_sysc_init(void) {}
154f40aaf6da14a4043d6361e0c7d74ada18e866059Magnus Damm
155f40aaf6da14a4043d6361e0c7d74ada18e866059Magnus Damm#endif /* CONFIG_PM || CONFIG_SMP */
156f40aaf6da14a4043d6361e0c7d74ada18e866059Magnus Damm
157f40aaf6da14a4043d6361e0c7d74ada18e866059Magnus Damm#ifdef CONFIG_PM
158f40aaf6da14a4043d6361e0c7d74ada18e866059Magnus Damm
159a662c08260fac126059a148cbd1061e71e806b4aMagnus Dammstatic int pd_power_down(struct generic_pm_domain *genpd)
160a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm{
161a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm	return r8a7779_sysc_power_down(to_r8a7779_ch(genpd));
162a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm}
163a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm
164a662c08260fac126059a148cbd1061e71e806b4aMagnus Dammstatic int pd_power_up(struct generic_pm_domain *genpd)
165a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm{
166a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm	return r8a7779_sysc_power_up(to_r8a7779_ch(genpd));
167a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm}
168a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm
169a662c08260fac126059a148cbd1061e71e806b4aMagnus Dammstatic bool pd_is_off(struct generic_pm_domain *genpd)
170a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm{
171a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm	struct r8a7779_pm_ch *r8a7779_ch = to_r8a7779_ch(genpd);
172a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm	unsigned int st;
173a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm
174a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm	st = ioread32(r8a7779_sysc_base + r8a7779_ch->chan_offs + PWRSR_OFFS);
175a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm	if (st & (1 << r8a7779_ch->chan_bit))
176a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm		return true;
177a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm
178a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm	return false;
179a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm}
180a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm
181a662c08260fac126059a148cbd1061e71e806b4aMagnus Dammstatic bool pd_active_wakeup(struct device *dev)
182a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm{
183a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm	return true;
184a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm}
185a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm
186a662c08260fac126059a148cbd1061e71e806b4aMagnus Dammvoid r8a7779_init_pm_domain(struct r8a7779_pm_domain *r8a7779_pd)
187a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm{
188a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm	struct generic_pm_domain *genpd = &r8a7779_pd->genpd;
189a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm
190a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm	pm_genpd_init(genpd, NULL, false);
191a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm	genpd->dev_ops.stop = pm_clk_suspend;
192a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm	genpd->dev_ops.start = pm_clk_resume;
193a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm	genpd->dev_ops.active_wakeup = pd_active_wakeup;
194a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm	genpd->dev_irq_safe = true;
195a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm	genpd->power_off = pd_power_down;
196a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm	genpd->power_on = pd_power_up;
197a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm
198a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm	if (pd_is_off(&r8a7779_pd->genpd))
199a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm		pd_power_up(&r8a7779_pd->genpd);
200a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm}
201a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm
202a662c08260fac126059a148cbd1061e71e806b4aMagnus Dammvoid r8a7779_add_device_to_domain(struct r8a7779_pm_domain *r8a7779_pd,
203a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm				 struct platform_device *pdev)
204a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm{
205a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm	struct device *dev = &pdev->dev;
206a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm
207a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm	pm_genpd_add_device(&r8a7779_pd->genpd, dev);
208a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm	if (pm_clk_no_clocks(dev))
209a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm		pm_clk_add(dev, NULL);
210a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm}
211a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm
212a662c08260fac126059a148cbd1061e71e806b4aMagnus Dammstruct r8a7779_pm_domain r8a7779_sh4a = {
213a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm	.ch = {
214a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm		.chan_offs = 0x80, /* PWRSR1 .. PWRER1 */
215a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm		.isr_bit = 16, /* SH4A */
216a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm	}
217a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm};
218a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm
219a662c08260fac126059a148cbd1061e71e806b4aMagnus Dammstruct r8a7779_pm_domain r8a7779_sgx = {
220a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm	.ch = {
221a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm		.chan_offs = 0xc0, /* PWRSR2 .. PWRER2 */
222a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm		.isr_bit = 20, /* SGX */
223a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm	}
224a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm};
225a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm
226a662c08260fac126059a148cbd1061e71e806b4aMagnus Dammstruct r8a7779_pm_domain r8a7779_vdp1 = {
227a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm	.ch = {
228a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm		.chan_offs = 0x100, /* PWRSR3 .. PWRER3 */
229a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm		.isr_bit = 21, /* VDP */
230a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm	}
231a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm};
232a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm
233a662c08260fac126059a148cbd1061e71e806b4aMagnus Dammstruct r8a7779_pm_domain r8a7779_impx3 = {
234a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm	.ch = {
235a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm		.chan_offs = 0x140, /* PWRSR4 .. PWRER4 */
236a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm		.isr_bit = 24, /* IMP */
237a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm	}
238a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm};
239a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm
240a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm#endif /* CONFIG_PM */
241a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm
242a662c08260fac126059a148cbd1061e71e806b4aMagnus Dammvoid __init r8a7779_pm_init(void)
243a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm{
244f40aaf6da14a4043d6361e0c7d74ada18e866059Magnus Damm	static int once;
245f40aaf6da14a4043d6361e0c7d74ada18e866059Magnus Damm
246f40aaf6da14a4043d6361e0c7d74ada18e866059Magnus Damm	if (!once++)
247f40aaf6da14a4043d6361e0c7d74ada18e866059Magnus Damm		r8a7779_sysc_init();
248a662c08260fac126059a148cbd1061e71e806b4aMagnus Damm}
249