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