xref: /arm-trusted-firmware/include/plat/marvell/armada/a8k/common/armada_common.h (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright (C) 2018 Marvell International Ltd.
3*91f16700Schasinglulu  *
4*91f16700Schasinglulu  * SPDX-License-Identifier:     BSD-3-Clause
5*91f16700Schasinglulu  * https://spdx.org/licenses
6*91f16700Schasinglulu  */
7*91f16700Schasinglulu 
8*91f16700Schasinglulu #ifndef ARMADA_COMMON_H
9*91f16700Schasinglulu #define ARMADA_COMMON_H
10*91f16700Schasinglulu 
11*91f16700Schasinglulu #include <drivers/marvell/amb_adec.h>
12*91f16700Schasinglulu #include <drivers/marvell/ccu.h>
13*91f16700Schasinglulu #include <drivers/marvell/io_win.h>
14*91f16700Schasinglulu #include <drivers/marvell/iob.h>
15*91f16700Schasinglulu 
16*91f16700Schasinglulu /*
17*91f16700Schasinglulu  * This struct supports skip image request
18*91f16700Schasinglulu  * detection_method: the method used to detect the request "signal".
19*91f16700Schasinglulu  * info:
20*91f16700Schasinglulu  *	GPIO:
21*91f16700Schasinglulu  *		detection_method: HIGH (pressed button), LOW (unpressed button),
22*91f16700Schasinglulu  *		num (button mpp number).
23*91f16700Schasinglulu  *	i2c:
24*91f16700Schasinglulu  *		i2c_addr: the address of the i2c chosen.
25*91f16700Schasinglulu  *		i2d_reg: the i2c register chosen.
26*91f16700Schasinglulu  *	test:
27*91f16700Schasinglulu  *		choose the DIE you picked the button in (AP or CP).
28*91f16700Schasinglulu  *		in case of CP(cp_index = 0 if CP0, cp_index = 1 if CP1)
29*91f16700Schasinglulu  */
30*91f16700Schasinglulu struct skip_image {
31*91f16700Schasinglulu 	enum {
32*91f16700Schasinglulu 		GPIO,
33*91f16700Schasinglulu 		I2C,
34*91f16700Schasinglulu 		USER_DEFINED
35*91f16700Schasinglulu 	} detection_method;
36*91f16700Schasinglulu 
37*91f16700Schasinglulu 	struct {
38*91f16700Schasinglulu 		struct {
39*91f16700Schasinglulu 			int num;
40*91f16700Schasinglulu 			enum {
41*91f16700Schasinglulu 				HIGH,
42*91f16700Schasinglulu 				LOW
43*91f16700Schasinglulu 			} button_state;
44*91f16700Schasinglulu 
45*91f16700Schasinglulu 		} gpio;
46*91f16700Schasinglulu 
47*91f16700Schasinglulu 		struct {
48*91f16700Schasinglulu 			int i2c_addr;
49*91f16700Schasinglulu 			int i2c_reg;
50*91f16700Schasinglulu 		} i2c;
51*91f16700Schasinglulu 
52*91f16700Schasinglulu 		struct {
53*91f16700Schasinglulu 			enum {
54*91f16700Schasinglulu 				CP,
55*91f16700Schasinglulu 				AP
56*91f16700Schasinglulu 			} cp_ap;
57*91f16700Schasinglulu 			int cp_index;
58*91f16700Schasinglulu 		} test;
59*91f16700Schasinglulu 	} info;
60*91f16700Schasinglulu };
61*91f16700Schasinglulu 
62*91f16700Schasinglulu /*
63*91f16700Schasinglulu  * This struct supports SoC power off method
64*91f16700Schasinglulu  * type: the method used to power off the SoC
65*91f16700Schasinglulu  * cfg:
66*91f16700Schasinglulu  *	PMIC_GPIO:
67*91f16700Schasinglulu  *	pin_count: current GPIO pin number used for toggling the signal for
68*91f16700Schasinglulu  *		   notifying external PMIC
69*91f16700Schasinglulu  *	info:	   holds the GPIOs information, CP GPIO should be used and
70*91f16700Schasinglulu  *		   all GPIOs should be within same GPIO config. register
71*91f16700Schasinglulu  *	step_count: current step number to toggle the GPIO for PMIC
72*91f16700Schasinglulu  *	seq:       GPIO toggling values in sequence, each bit represents a GPIO.
73*91f16700Schasinglulu  *		   For example, bit0 represents first GPIO used for toggling
74*91f16700Schasinglulu  *		   the GPIO the last step is used to trigger the power off
75*91f16700Schasinglulu  *		   signal
76*91f16700Schasinglulu  *	delay_ms:  transition interval for the GPIO setting to take effect
77*91f16700Schasinglulu  *		   in unit of ms
78*91f16700Schasinglulu  */
79*91f16700Schasinglulu /* Max GPIO number used to notify PMIC to power off the SoC */
80*91f16700Schasinglulu #define PMIC_GPIO_MAX_NUMBER		8
81*91f16700Schasinglulu /* Max GPIO toggling steps in sequence to power off the SoC */
82*91f16700Schasinglulu #define PMIC_GPIO_MAX_TOGGLE_STEP	8
83*91f16700Schasinglulu 
84*91f16700Schasinglulu enum gpio_output_state {
85*91f16700Schasinglulu 	GPIO_LOW = 0,
86*91f16700Schasinglulu 	GPIO_HIGH
87*91f16700Schasinglulu };
88*91f16700Schasinglulu 
89*91f16700Schasinglulu typedef struct gpio_info {
90*91f16700Schasinglulu 	int cp_index;
91*91f16700Schasinglulu 	int gpio_index;
92*91f16700Schasinglulu } gpio_info_t;
93*91f16700Schasinglulu 
94*91f16700Schasinglulu struct power_off_method {
95*91f16700Schasinglulu 	enum {
96*91f16700Schasinglulu 		PMIC_GPIO,
97*91f16700Schasinglulu 	} type;
98*91f16700Schasinglulu 
99*91f16700Schasinglulu 	struct {
100*91f16700Schasinglulu 		struct {
101*91f16700Schasinglulu 			int pin_count;
102*91f16700Schasinglulu 			struct gpio_info info[PMIC_GPIO_MAX_NUMBER];
103*91f16700Schasinglulu 			int step_count;
104*91f16700Schasinglulu 			uint32_t seq[PMIC_GPIO_MAX_TOGGLE_STEP];
105*91f16700Schasinglulu 			int delay_ms;
106*91f16700Schasinglulu 		} gpio;
107*91f16700Schasinglulu 	} cfg;
108*91f16700Schasinglulu };
109*91f16700Schasinglulu 
110*91f16700Schasinglulu int marvell_gpio_config(void);
111*91f16700Schasinglulu uint32_t marvell_get_io_win_gcr_target(int ap_idx);
112*91f16700Schasinglulu uint32_t marvell_get_ccu_gcr_target(int ap_idx);
113*91f16700Schasinglulu 
114*91f16700Schasinglulu 
115*91f16700Schasinglulu /*
116*91f16700Schasinglulu  * The functions below are defined as Weak and may be overridden
117*91f16700Schasinglulu  * in specific Marvell standard platform
118*91f16700Schasinglulu  */
119*91f16700Schasinglulu int marvell_get_amb_memory_map(struct addr_map_win **win,
120*91f16700Schasinglulu 			       uint32_t *size, uintptr_t base);
121*91f16700Schasinglulu int marvell_get_io_win_memory_map(int ap_idx, struct addr_map_win **win,
122*91f16700Schasinglulu 				  uint32_t *size);
123*91f16700Schasinglulu int marvell_get_iob_memory_map(struct addr_map_win **win,
124*91f16700Schasinglulu 			       uint32_t *size, uintptr_t base);
125*91f16700Schasinglulu int marvell_get_ccu_memory_map(int ap_idx, struct addr_map_win **win,
126*91f16700Schasinglulu 			       uint32_t *size);
127*91f16700Schasinglulu int system_power_off(void);
128*91f16700Schasinglulu 
129*91f16700Schasinglulu #endif /* ARMADA_COMMON_H */
130