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