M7350/kernel/include/linux/irqchip/msm-mpm-irq.h
2024-09-09 08:57:42 +00:00

168 lines
6.2 KiB
C

/* Copyright (c) 2010-2015, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
* only version 2 as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
*/
#ifndef __MSM_MPM_IRQ_H
#define __MSM_MPM_IRQ_H
#include <linux/types.h>
#include <linux/list.h>
#define MSM_MPM_NR_MPM_IRQS 64
#if defined(CONFIG_MSM_MPM_OF)
/**
* msm_mpm_enable_pin() - Enable/Disable a MPM pin for idle wakeups.
*
* @pin: MPM pin to set
* @enable: enable/disable the pin
*
* returns 0 on success or errorno
*
* Drivers can call the function to configure MPM pins for wakeup from idle low
* power modes. The API provides a direct access to the configuring MPM pins
* that are not connected to a IRQ/GPIO
*/
int msm_mpm_enable_pin(unsigned int pin, unsigned int enable);
/**
* msm_mpm_set_pin_wake() - Enable/Disable a MPM pin during suspend
*
* @pin: MPM pin to set
* @enable: enable/disable the pin as wakeup
*
* returns 0 on success or errorno
*
* Drivers can call the function to configure MPM pins for wakeup from suspend
* low power modes. The API provides a direct access to the configuring MPM pins
* that are not connected to a IRQ/GPIO
*/
int msm_mpm_set_pin_wake(unsigned int pin, unsigned int on);
/**
* msm_mpm_set_pin_type() - Set the flowtype of a MPM pin.
*
* @pin: MPM pin to configure
* @flow_type: flowtype of the MPM pin.
*
* returns 0 on success or errorno
*
* Drivers can call the function to configure the flowtype of the MPM pins
* The API provides a direct access to the configuring MPM pins that are not
* connected to a IRQ/GPIO
*/
int msm_mpm_set_pin_type(unsigned int pin, unsigned int flow_type);
/**
* msm_mpm_irqs_detectable() - Check if active irqs can be monitored by MPM
*
* @from_idle: indicates if the sytem is entering low power mode as a part of
* suspend/idle task.
*
* returns true if all active interrupts can be monitored by the MPM
*
* Low power management code calls into this API to check if all active
* interrupts can be monitored by MPM and choose a level such that all active
* interrupts can wake the system up from low power mode.
*/
bool msm_mpm_irqs_detectable(bool from_idle);
/**
* msm_mpm_gpio_detectable() - Check if active gpio irqs can be monitored by
* MPM
*
* @from_idle: indicates if the sytem is entering low power mode as a part of
* suspend/idle task.
*
* returns true if all active GPIO interrupts can be monitored by the MPM
*
* Low power management code calls into this API to check if all active
* GPIO interrupts can be monitored by MPM and choose a level such that all
* active interrupts can wake the system up from low power mode.
*/
bool msm_mpm_gpio_irqs_detectable(bool from_idle);
/**
* msm_mpm_enter_sleep() -Called from PM code before entering low power mode
*
* @sclk_count: wakeup time in sclk counts for programmed RPM wakeup
* @from_idle: indicates if the sytem is entering low power mode as a part of
* suspend/idle task.
* @cpumask: the next cpu to wakeup.
*
* Low power management code calls into this API to configure the MPM to
* monitor the active irqs before going to sleep.
*/
void msm_mpm_enter_sleep(uint64_t sclk_count, bool from_idle,
const struct cpumask *cpumask);
/**
* msm_mpm_exit_sleep() -Called from PM code after resuming from low power mode
*
* @from_idle: indicates if the sytem is entering low power mode as a part of
* suspend/idle task.
*
* Low power management code calls into this API to query the MPM for the
* wakeup source and retriggering the appropriate interrupt.
*/
void msm_mpm_exit_sleep(bool from_idle);
/**
* of_mpm_init() - Device tree initialization function
*
* The initialization function is called after * GPIO/GIC device initialization
* routines are called and before any device irqs are requested. MPM driver
* keeps track of all enabled/wakeup interrupts in the system to be able to
* configure MPM when entering a system wide low power mode. The MPM is a
* alway-on low power hardware block that monitors 64 wakeup interrupts when the
* system is in a low power mode. The initialization function constructs the MPM
* mapping between the IRQs and the MPM pin based on data in the device tree.
*/
void of_mpm_init(void);
#else
static inline int msm_mpm_enable_irq(unsigned int irq, unsigned int enable)
{ return -ENODEV; }
static inline int msm_mpm_set_irq_wake(unsigned int irq, unsigned int on)
{ return -ENODEV; }
static inline int msm_mpm_set_irq_type(unsigned int irq, unsigned int flow_type)
{ return -ENODEV; }
static inline int msm_mpm_enable_pin(unsigned int pin, unsigned int enable)
{ return -ENODEV; }
static inline int msm_mpm_set_pin_wake(unsigned int pin, unsigned int on)
{ return -ENODEV; }
static inline int msm_mpm_set_pin_type(unsigned int pin,
unsigned int flow_type)
{ return -ENODEV; }
static inline bool msm_mpm_irqs_detectable(bool from_idle)
{ return false; }
static inline bool msm_mpm_gpio_irqs_detectable(bool from_idle)
{ return false; }
static inline void msm_mpm_enter_sleep(uint64_t sclk_count, bool from_idle,
const struct cpumask *cpumask) {}
static inline void msm_mpm_exit_sleep(bool from_idle) {}
static inline void of_mpm_init(void) {}
#endif
#ifdef CONFIG_MSM_MPM_OF
/** msm_mpm_suspend_prepare() - Called at prepare_late() op during suspend
*
*
* When called the MPM driver checks if the wakeup interrupts can be monitored
* by MPM hardware and program them accordingly. If wake up interrupts cannot
* be monitored then it disallows system low power modes.
*/
void msm_mpm_suspend_prepare(void);
/** msm_mpm_suspend_wake - Called during wake() op in suspend.
*
* When called MPM drivers sets the vote for system low power modes depending
* on the active interrupts.
*/
void msm_mpm_suspend_wake(void);
#else
static inline void msm_mpm_suspend_prepare(void) {}
static inline void msm_mpm_suspend_wake(void) {}
#endif
#endif /* __MSM_MPM_IRQ_H */