20
20
#include <zephyr/net/wifi_mgmt.h>
21
21
#ifdef CONFIG_PM_DEVICE
22
22
#include <zephyr/pm/device.h>
23
+ #ifdef CONFIG_NXP_IW610
24
+ #include <fsl_gpc.h>
25
+ #endif
23
26
#endif
24
27
#ifdef CONFIG_WIFI_NM
25
28
#include <zephyr/net/wifi_nm.h>
@@ -73,7 +76,7 @@ extern struct interface g_uap;
73
76
extern const rtos_wpa_supp_dev_ops wpa_supp_ops ;
74
77
#endif
75
78
76
- #if defined( CONFIG_PM_DEVICE ) && defined( CONFIG_NXP_RW610 )
79
+ #ifdef CONFIG_PM_DEVICE
77
80
extern int is_hs_handshake_done ;
78
81
extern int wlan_host_sleep_state ;
79
82
extern bool skip_hs_handshake ;
@@ -2014,6 +2017,18 @@ extern void WL_MCI_WAKEUP0_DriverIRQHandler(void);
2014
2017
extern void WL_MCI_WAKEUP_DONE0_DriverIRQHandler (void );
2015
2018
#endif
2016
2019
2020
+ #ifdef CONFIG_PM_DEVICE
2021
+ #ifdef CONFIG_NXP_IW610
2022
+ struct gpio_callback wakeup_callback ;
2023
+
2024
+ static void gpio_wakeup_callback (const struct device * port , struct gpio_callback * cb ,
2025
+ gpio_port_pins_t pins )
2026
+ {
2027
+ /* TODO: Reserved for future use. */
2028
+ }
2029
+ #endif
2030
+ #endif
2031
+
2017
2032
static int nxp_wifi_dev_init (const struct device * dev )
2018
2033
{
2019
2034
struct nxp_wifi_dev * nxp_wifi = & nxp_wifi0 ;
@@ -2025,13 +2040,52 @@ static int nxp_wifi_dev_init(const struct device *dev)
2025
2040
#ifdef CONFIG_NXP_RW610
2026
2041
IRQ_CONNECT (IMU_IRQ_N , IMU_IRQ_P , WL_MCI_WAKEUP0_DriverIRQHandler , 0 , 0 );
2027
2042
irq_enable (IMU_IRQ_N );
2028
- IRQ_CONNECT (IMU_WAKEUP_IRQ_N , IMU_WAKEUP_IRQ_P , WL_MCI_WAKEUP_DONE0_DriverIRQHandler , 0 , 0 );
2043
+ IRQ_CONNECT (IMU_WAKEUP_IRQ_N , IMU_WAKEUP_IRQ_P ,
2044
+ WL_MCI_WAKEUP_DONE0_DriverIRQHandler , 0 , 0 );
2029
2045
irq_enable (IMU_WAKEUP_IRQ_N );
2030
2046
#if (DT_INST_PROP (0 , wakeup_source ))
2031
2047
EnableDeepSleepIRQ (IMU_IRQ_N );
2032
2048
#endif
2033
- #endif
2049
+ #elif defined(CONFIG_NXP_IW610 )
2050
+ #ifdef CONFIG_PM_DEVICE
2051
+ #if DT_NODE_HAS_PROP (DT_DRV_INST (0 ), wakeup_gpios )
2052
+ int err = 0 ;
2053
+ struct gpio_dt_spec wakeup = GPIO_DT_SPEC_GET (DT_DRV_INST (0 ), wakeup_gpios );
2054
+
2055
+ if (!gpio_is_ready_dt (& wakeup )) {
2056
+ LOG_ERR ("Error: failed to configure wakeup %s pin %d" , wakeup .port -> name ,
2057
+ wakeup .pin );
2058
+ return - EIO ;
2059
+ }
2060
+
2061
+ /* Configure wakeup gpio as input */
2062
+ err = gpio_pin_configure_dt (& wakeup , GPIO_INPUT );
2063
+ if (err ) {
2064
+ LOG_ERR ("Error %d: failed to configure wakeup %s pin %d" , err ,
2065
+ wakeup .port -> name , wakeup .pin );
2066
+ return err ;
2067
+ }
2068
+
2069
+ err = gpio_pin_set_dt (& wakeup , 0 );
2070
+ if (err ) {
2071
+ return err ;
2072
+ }
2034
2073
2074
+ /* Configure wakeup gpio interrupt */
2075
+ err = gpio_pin_interrupt_configure_dt (& wakeup , GPIO_INT_EDGE_FALLING );
2076
+ if (err ) {
2077
+ return err ;
2078
+ }
2079
+
2080
+ /* Set wakeup gpio callback function */
2081
+ gpio_init_callback (& wakeup_callback , gpio_wakeup_callback , BIT (wakeup .pin ));
2082
+ err = gpio_add_callback_dt (& wakeup , & wakeup_callback );
2083
+ if (err ) {
2084
+ return err ;
2085
+ }
2086
+ #endif
2087
+ #endif
2088
+ #endif
2035
2089
return 0 ;
2036
2090
}
2037
2091
@@ -2070,7 +2124,8 @@ static int nxp_wifi_set_config(const struct device *dev, enum ethernet_config_ty
2070
2124
return 0 ;
2071
2125
}
2072
2126
2073
- #if defined(CONFIG_PM_DEVICE ) && defined(CONFIG_NXP_RW610 )
2127
+ #ifdef CONFIG_PM_DEVICE
2128
+ #ifdef CONFIG_NXP_RW610
2074
2129
void device_pm_dump_wakeup_source (void )
2075
2130
{
2076
2131
if (POWER_GetWakeupStatus (IMU_IRQ_N )) {
@@ -2084,6 +2139,18 @@ void device_pm_dump_wakeup_source(void)
2084
2139
POWER_ClearWakeupStatus (32 );
2085
2140
}
2086
2141
}
2142
+ #endif
2143
+
2144
+ static bool nxp_wifi_wlan_wakeup (void )
2145
+ {
2146
+ #ifdef CONFIG_NXP_RW610
2147
+ return POWER_GetWakeupStatus (WL_MCI_WAKEUP0_IRQn );
2148
+ #elif CONFIG_NXP_IW610
2149
+ return GPC_GetIRQStatusFlag (GPC , GPIO1_Combined_0_15_IRQn );
2150
+ #else
2151
+ return false;
2152
+ #endif
2153
+ }
2087
2154
2088
2155
static int device_wlan_pm_action (const struct device * dev , enum pm_device_action pm_action )
2089
2156
{
@@ -2128,17 +2195,19 @@ static int device_wlan_pm_action(const struct device *dev, enum pm_device_action
2128
2195
/* If we are not woken up by WLAN, skip posting host sleep exit event.
2129
2196
* And skip host sleep handshake next time we are about to sleep.
2130
2197
*/
2131
- if (POWER_GetWakeupStatus ( WL_MCI_WAKEUP0_IRQn )) {
2198
+ if (nxp_wifi_wlan_wakeup ( )) {
2132
2199
ret = wlan_hs_send_event (HOST_SLEEP_EXIT , NULL );
2133
2200
if (ret != 0 ) {
2134
2201
return - EFAULT ;
2135
2202
}
2136
2203
wlan_hs_hanshake_cfg (false);
2137
2204
} else {
2205
+ LOG_INF ("Wakeup by other sources" );
2138
2206
wlan_hs_hanshake_cfg (true);
2139
2207
}
2140
-
2208
+ #ifdef CONFIG_NXP_RW610
2141
2209
device_pm_dump_wakeup_source ();
2210
+ #endif
2142
2211
if (wlan_host_sleep_state == HOST_SLEEP_ONESHOT ) {
2143
2212
wlan_host_sleep_state = HOST_SLEEP_DISABLE ;
2144
2213
wlan_hs_hanshake_cfg (false);
0 commit comments