static irqreturn_t cp2ap_status_handler(int irq, void *data) { struct modem_link_pm *pm = (struct modem_link_pm *)data; int cp2ap_status = gpio_get_value(pm->gpio_cp2ap_status); if (cp2ap_status) run_pm_fsm(pm, PM_EVENT_CP2AP_STATUS_HIGH); else run_pm_fsm(pm, PM_EVENT_CP2AP_STATUS_LOW); change_irq_level(irq, cp2ap_status); return IRQ_HANDLED; }
static void cp_free_work_func(struct work_struct *ws) { struct modem_link_pm *pm; pm = container_of(ws, struct modem_link_pm, cp_free_dwork.work); run_pm_fsm(pm, PM_EVENT_CP_HOLD_TIMEOUT); }
/** @brief interrupt handler for a wakeup interrupt 1) Reads the interrupt value\n 2) Performs interrupt handling\n @param irq the IRQ number @param data the pointer to a data */ static irqreturn_t cp2ap_wakeup_handler(int irq, void *data) { struct modem_link_pm *pm = (struct modem_link_pm *)data; int cp2ap_wakeup = gpio_get_value(pm->gpio_cp2ap_wakeup); mif_debug("%s: cp2ap_wakeup[%d]\n", __func__, cp2ap_wakeup); if (cp2ap_wakeup) { run_pm_fsm(pm, PM_EVENT_CP2AP_WAKEUP_HIGH); } else { run_pm_fsm(pm, PM_EVENT_CP2AP_WAKEUP_LOW); } change_irq_level(irq, cp2ap_wakeup); return IRQ_HANDLED; }
static void pm_wdog_bark(unsigned long data) { struct pm_wdog *wdog = (struct pm_wdog *)data; struct modem_link_pm *pm = wdog_to_pm(wdog); struct pm_fsm *fsm = &pm->fsm; enum pm_state c_state; unsigned long flags; spin_lock_irqsave(&pm->lock, flags); c_state = fsm->state; spin_unlock_irqrestore(&pm->lock, flags); if (wdog->w_state == c_state) { mif_err("%s: PM WDOG lost event {%s@%s}\n", pm->link_name, pm_event2str(wdog->w_event), pm_state2str(wdog->state)); return; } run_pm_fsm(pm, PM_EVENT_WDOG_TIMEOUT); }
static inline void link_error_cb(void *owner) { struct modem_link_pm *pm = (struct modem_link_pm *)owner; run_pm_fsm(pm, PM_EVENT_LINK_ERROR); }
static inline void link_mount_cb(void *owner) { struct modem_link_pm *pm = (struct modem_link_pm *)owner; run_pm_fsm(pm, PM_EVENT_LINK_MOUNTED); }
static inline void link_resume_cb(void *owner) { struct modem_link_pm *pm = (struct modem_link_pm *)owner; run_pm_fsm(pm, PM_EVENT_LINK_RESUMED); }
static inline void link_suspend_cb(void *owner) { struct modem_link_pm *pm = (struct modem_link_pm *)owner; run_pm_fsm(pm, PM_EVENT_LINK_SUSPENDED); }
static void request_hold(struct modem_link_pm *pm) { run_pm_fsm(pm, PM_EVENT_CP_HOLD_REQUEST); }