blob: 15b04386be287e5408395f8eeddbe2d6fa872dc1 [file] [log] [blame]
/*
* Copyright (C) 2017 Amlogic, Inc. 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 as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* 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 __SCP_SUSPEND_H_
#define __SCP_SUSPEND_H_
typedef unsigned int uint32_t;
/* wake up reason*/
#define UDEFINED_WAKEUP 0
#define CHARGING_WAKEUP 1
#define REMOTE_WAKEUP 2
#define RTC_WAKEUP 3
#define BT_WAKEUP 4
#define WIFI_WAKEUP 5
#define POWER_KEY_WAKEUP 6
#define AUTO_WAKEUP 7
#define CEC_WAKEUP 8
#define REMOTE_CUS_WAKEUP 9
#define ETH_PHY_WAKEUP 10
#define CECB_WAKEUP 11
/* wake up source*/
#define UDEFINED_WAKEUP_SRC (1<<0)
#define CHARGING_WAKEUP_SRC (1<<1)
#define REMOTE_WAKEUP_SRC (1<<2)
#define RTC_WAKEUP_SRC (1<<3)
#define BT_WAKEUP_SRC (1<<4)
#define WIFI_WAKEUP_SRC (1<<5)
#define POWER_KEY_WAKEUP_SRC (1<<6)
#define AUTO_WAKEUP_SRC (1<<7)
#define CEC_WAKEUP_SRC (1<<8)
#define ETH_PHY_WAKEUP_SRC (1<<9)
#define CECB_WAKEUP_SRC (1<<10)
struct pwr_op {
void (*power_off_at_clk81)(void);
void (*power_on_at_clk81)(unsigned int);
void (*power_off_at_24M)(void);
void (*power_on_at_24M)(void);
void (*power_off_at_32k)(unsigned int);
void (*power_on_at_32k)(unsigned int);
void (*shut_down)(void);
unsigned int (*detect_key)(unsigned int);
void (*get_wakeup_source)(void *, unsigned int);
};
static void inline aml_update_bits(unsigned int reg, unsigned int mask, unsigned int val)
{
unsigned int tmp, orig;
orig = readl(reg);
tmp = orig & ~mask;
tmp |= val & mask;
writel(tmp, reg);
}
#define IRQ_TIMERA_NUM 1
#define IRQ_GPIO0_NUM 8
#define IRQ_GPIO1_NUM 9
#define IRQ_AO_IR_DEC_NUM 42
#define IRQ_AO_CEC_NUM 45
#define IRQ_AO_GPIO0_NUM 46
#define IRQ_ETH_PHY_NUM 23
#define IRQ_AO_CECB_NUM 51
/* GPIO trigger type*/
#define GPIO_IRQ_LOW_LEVEL 0
#define GPIO_IRQ_HIGH_LEVEL 1
#define GPIO_IRQ_FALLING_EDGE 2
#define GPIO_IRQ_RISING_EDGE 3
enum {
IRQ_TIMERA = 0,
IRQ_GPIO0,
IRQ_GPIO1,
IRQ_GPIO2,
IRQ_GPIO3,
IRQ_AO_IR_DEC,
IRQ_AO_CEC,
IRQ_AO_GPIO0,
IRQ_AO_GPIO1,
IRQ_AO_TIMERA,
IRQ_ETH_PHY,
IRQ_AO_CECB,
WAKE_UP_MAX = 32,
};
/* M3 CPU has 2 ao-gpio-irq, 4 gpio-irq*/
#define GPIO_WAKEUP_MAX 6
struct wakeup_gpio_info {
int wakeup_id;
int gpio_in_idx;
int gpio_in_ao;
int gpio_out_idx;
int gpio_out_ao;
int irq;
int trig_type;
};
struct wakeup_info {
unsigned status;
unsigned sources;
unsigned gpio_info_count;
struct wakeup_gpio_info gpio_info[GPIO_WAKEUP_MAX];
};
#define DIRECTION_IN 1
#define DIRECTION_OUT 0
#define SYS_SUSPEND 1
#define SYS_POWEROFF 0
#endif