@@ -28,6 +28,7 @@ LOG_MODULE_REGISTER(inputmodule, LOG_LEVEL_INF);
2828
2929int oc_count ;
3030int force_on ;
31+ int detect_mode ;
3132int hub_board_id [8 ]; /* EC console Debug use */
3233enum input_deck_state deck_state ;
3334
@@ -36,6 +37,17 @@ void module_oc_interrupt(enum gpio_signal signal)
3637 oc_count ++ ;
3738}
3839
40+ void set_detect_mode (int mode )
41+ {
42+ detect_mode = mode ;
43+ }
44+
45+ int get_detect_mode (void )
46+ {
47+ return detect_mode ;
48+ }
49+
50+
3951static void set_hub_mux (uint8_t input )
4052{
4153 gpio_pin_set_dt (GPIO_DT_FROM_NODELABEL (gpio_mux_a0 ),
@@ -72,9 +84,15 @@ static void scan_c_deck(bool full_scan)
7284
7385static void board_input_module_init (void )
7486{
75- deck_state = DECK_OFF ;
87+ /* need to wait bios_function_init() to update detect mode */
88+ if (detect_mode == 0x02 )
89+ deck_state = DECK_FORCE_ON ;
90+ else if (detect_mode == 0x04 )
91+ deck_state = DECK_FORCE_OFF ;
92+ else
93+ deck_state = DECK_OFF ;
7694}
77- DECLARE_HOOK (HOOK_INIT , board_input_module_init , HOOK_PRIO_DEFAULT );
95+ DECLARE_HOOK (HOOK_INIT , board_input_module_init , HOOK_PRIO_DEFAULT + 2 );
7896
7997static void poll_c_deck (void )
8098{
@@ -127,17 +145,24 @@ DECLARE_HOOK(HOOK_TICK, poll_c_deck, HOOK_PRIO_DEFAULT);
127145
128146static void input_modules_powerup (void )
129147{
130- if (deck_state != DECK_FORCE_ON && deck_state != DECK_FORCE_ON )
148+ if (deck_state == DECK_FORCE_ON )
149+ gpio_pin_set_dt (GPIO_DT_FROM_NODELABEL (gpio_hub_b_pwr_en ), 1 );
150+ else if (deck_state != DECK_FORCE_ON && deck_state != DECK_FORCE_ON )
131151 deck_state = DECK_DISCONNECTED ;
152+
132153}
133154DECLARE_HOOK (HOOK_CHIPSET_STARTUP , input_modules_powerup , HOOK_PRIO_DEFAULT );
134155
135156void input_modules_powerdown (void )
136157{
137- deck_state = DECK_OFF ;
138- gpio_pin_set_dt (GPIO_DT_FROM_NODELABEL (gpio_hub_b_pwr_en ), 0 );
139- /* Hub mux input 6 is NC, so lower power draw by disconnecting all PD*/
140- set_hub_mux (TOP_ROW_NOT_CONNECTED );
158+ if (deck_state == DECK_FORCE_ON )
159+ gpio_pin_set_dt (GPIO_DT_FROM_NODELABEL (gpio_hub_b_pwr_en ), 0 );
160+ else if (deck_state != DECK_FORCE_ON && deck_state != DECK_FORCE_ON ) {
161+ deck_state = DECK_OFF ;
162+ gpio_pin_set_dt (GPIO_DT_FROM_NODELABEL (gpio_hub_b_pwr_en ), 0 );
163+ /* Hub mux input 6 is NC, so lower power draw by disconnecting all PD */
164+ set_hub_mux (TOP_ROW_NOT_CONNECTED );
165+ }
141166}
142167
143168int get_deck_state (void )
@@ -148,9 +173,21 @@ int get_deck_state(void)
148173/* Host command */
149174static enum ec_status check_deck_state (struct host_cmd_handler_args * args )
150175{
176+ const struct ec_params_deck_state * p = args -> params ;
151177 struct ec_response_deck_state * r = args -> response ;
152178 int idx ;
153179
180+ /* set mode */
181+ if (p -> mode == 0x01 )
182+ deck_state = DECK_DISCONNECTED ;
183+ else if (p -> mode == 0x02 )
184+ deck_state = DECK_FORCE_ON ;
185+ else if (p -> mode == 0x04 )
186+ deck_state = DECK_FORCE_OFF ;
187+
188+ set_detect_mode (p -> mode );
189+
190+ /* return deck status */
154191 for (idx = 0 ; idx < 8 ; idx ++ )
155192 r -> input_deck_board_id [idx ] = (uint8_t )hub_board_id [idx ];
156193
0 commit comments