1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Renesas R-Car System Controller 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (C) 2016 Glider bvba 6*4882a593Smuzhiyun */ 7*4882a593Smuzhiyun #ifndef __SOC_RENESAS_RCAR_SYSC_H__ 8*4882a593Smuzhiyun #define __SOC_RENESAS_RCAR_SYSC_H__ 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun #include <linux/types.h> 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun /* 14*4882a593Smuzhiyun * Power Domain flags 15*4882a593Smuzhiyun */ 16*4882a593Smuzhiyun #define PD_CPU BIT(0) /* Area contains main CPU core */ 17*4882a593Smuzhiyun #define PD_SCU BIT(1) /* Area contains SCU and L2 cache */ 18*4882a593Smuzhiyun #define PD_NO_CR BIT(2) /* Area lacks PWR{ON,OFF}CR registers */ 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun #define PD_CPU_CR PD_CPU /* CPU area has CR (R-Car H1) */ 21*4882a593Smuzhiyun #define PD_CPU_NOCR PD_CPU | PD_NO_CR /* CPU area lacks CR (R-Car Gen2/3) */ 22*4882a593Smuzhiyun #define PD_ALWAYS_ON PD_NO_CR /* Always-on area */ 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun /* 26*4882a593Smuzhiyun * Description of a Power Area 27*4882a593Smuzhiyun */ 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun struct rcar_sysc_area { 30*4882a593Smuzhiyun const char *name; 31*4882a593Smuzhiyun u16 chan_offs; /* Offset of PWRSR register for this area */ 32*4882a593Smuzhiyun u8 chan_bit; /* Bit in PWR* (except for PWRUP in PWRSR) */ 33*4882a593Smuzhiyun u8 isr_bit; /* Bit in SYSCI*R */ 34*4882a593Smuzhiyun int parent; /* -1 if none */ 35*4882a593Smuzhiyun unsigned int flags; /* See PD_* */ 36*4882a593Smuzhiyun }; 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun /* 40*4882a593Smuzhiyun * SoC-specific Power Area Description 41*4882a593Smuzhiyun */ 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun struct rcar_sysc_info { 44*4882a593Smuzhiyun int (*init)(void); /* Optional */ 45*4882a593Smuzhiyun const struct rcar_sysc_area *areas; 46*4882a593Smuzhiyun unsigned int num_areas; 47*4882a593Smuzhiyun /* Optional External Request Mask Register */ 48*4882a593Smuzhiyun u32 extmask_offs; /* SYSCEXTMASK register offset */ 49*4882a593Smuzhiyun u32 extmask_val; /* SYSCEXTMASK register mask value */ 50*4882a593Smuzhiyun }; 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun extern const struct rcar_sysc_info r8a7742_sysc_info; 53*4882a593Smuzhiyun extern const struct rcar_sysc_info r8a7743_sysc_info; 54*4882a593Smuzhiyun extern const struct rcar_sysc_info r8a7745_sysc_info; 55*4882a593Smuzhiyun extern const struct rcar_sysc_info r8a77470_sysc_info; 56*4882a593Smuzhiyun extern const struct rcar_sysc_info r8a774a1_sysc_info; 57*4882a593Smuzhiyun extern const struct rcar_sysc_info r8a774b1_sysc_info; 58*4882a593Smuzhiyun extern const struct rcar_sysc_info r8a774c0_sysc_info; 59*4882a593Smuzhiyun extern const struct rcar_sysc_info r8a774e1_sysc_info; 60*4882a593Smuzhiyun extern const struct rcar_sysc_info r8a7779_sysc_info; 61*4882a593Smuzhiyun extern const struct rcar_sysc_info r8a7790_sysc_info; 62*4882a593Smuzhiyun extern const struct rcar_sysc_info r8a7791_sysc_info; 63*4882a593Smuzhiyun extern const struct rcar_sysc_info r8a7792_sysc_info; 64*4882a593Smuzhiyun extern const struct rcar_sysc_info r8a7794_sysc_info; 65*4882a593Smuzhiyun extern struct rcar_sysc_info r8a7795_sysc_info; 66*4882a593Smuzhiyun extern const struct rcar_sysc_info r8a77960_sysc_info; 67*4882a593Smuzhiyun extern const struct rcar_sysc_info r8a77961_sysc_info; 68*4882a593Smuzhiyun extern const struct rcar_sysc_info r8a77965_sysc_info; 69*4882a593Smuzhiyun extern const struct rcar_sysc_info r8a77970_sysc_info; 70*4882a593Smuzhiyun extern const struct rcar_sysc_info r8a77980_sysc_info; 71*4882a593Smuzhiyun extern const struct rcar_sysc_info r8a77990_sysc_info; 72*4882a593Smuzhiyun extern const struct rcar_sysc_info r8a77995_sysc_info; 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun /* 76*4882a593Smuzhiyun * Helpers for fixing up power area tables depending on SoC revision 77*4882a593Smuzhiyun */ 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun extern void rcar_sysc_nullify(struct rcar_sysc_area *areas, 80*4882a593Smuzhiyun unsigned int num_areas, u8 id); 81*4882a593Smuzhiyun 82*4882a593Smuzhiyun #endif /* __SOC_RENESAS_RCAR_SYSC_H__ */ 83