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