1
0
Fork 0
Signed-off-by: Alistair Francis <alistair@alistair23.me>
5.4-rM2-2.2.x-imx-deep-sleep
Alistair Francis 2021-02-11 17:37:29 -08:00
parent 064c838bd2
commit 67e03fec70
19 changed files with 2496 additions and 9 deletions

View File

@ -168,6 +168,14 @@
};
};
// &mu {
// status = "disabled";
// };
&ocrams {
fsl,enable-lpsr;
};
&cpu0 {
cpu-supply = <&buck1_reg>;
};

View File

@ -42,6 +42,7 @@ CONFIG_CPU_IDLE=y
CONFIG_VFP=y
CONFIG_NEON=y
CONFIG_PM_DEBUG=y
CONFIG_PM_ADVANCED_DEBUG=y
CONFIG_PM_TEST_SUSPEND=y
CONFIG_MODULES=y
CONFIG_MODULE_UNLOAD=y

View File

@ -75,6 +75,8 @@ void imx_gpc_hold_m4_in_sleep(void)
int val;
unsigned long timeout = jiffies + msecs_to_jiffies(500);
printk("%s - %d\n", __func__, __LINE__);
/* wait M4 in wfi before asserting hold request */
while (!imx_gpc_is_m4_sleeping())
if (time_after(jiffies, timeout))
@ -232,6 +234,8 @@ static int imx_gpc_irq_set_wake(struct irq_data *d, unsigned int on)
unsigned long flags;
u32 mask;
printk("%s - %d\n", __func__, __LINE__);
mask = 1 << d->hwirq % 32;
spin_lock_irqsave(&gpc_lock, flags);
gpc_wake_irqs[idx] = on ? gpc_wake_irqs[idx] | mask :

View File

@ -165,7 +165,7 @@ static int imx_mu_send_message(unsigned int index, unsigned int data)
}
}
if (te_flag == 0)
pr_info("BUG: TEn is not changed immediately"
pr_err("BUG: TEn is not changed immediately"
"when ATRn is filled up.\n");
return 0;
@ -183,7 +183,7 @@ static void mu_work_handler(struct work_struct *work)
message = m4_message[out_idx % MAX_NUM];
spin_unlock_irqrestore(&mu_lock, flags);
pr_debug("receive M4 message 0x%x\n", message);
pr_err("receive M4 message 0x%x\n", message);
switch (message) {
case MU_LPM_M4_RUN_MODE:
@ -215,6 +215,7 @@ static void mu_work_handler(struct work_struct *work)
m4_freq_low = true;
break;
default:
pr_err("mu_work_handler: default\n");
if ((message & MU_LPM_M4_WAKEUP_SRC_MASK) ==
MU_LPM_M4_WAKEUP_SRC_VAL) {
irq = (message & MU_LPM_M4_WAKEUP_IRQ_MASK) >>
@ -292,6 +293,8 @@ static irqreturn_t imx_mu_isr(int irq, void *param)
u32 irqs;
unsigned long flags;
pr_err("MU imx_mu_isr\n");
if (cpu_is_imx7ulp())
irqs = readl_relaxed(mu_base + MX7ULP_MU_SR);
else
@ -384,7 +387,7 @@ static int imx_mu_probe(struct platform_device *pdev)
writel_relaxed(readl_relaxed(mu_base + MU_ACR) |
BIT(26) | BIT(27), mu_base + MU_ACR);
pr_info("MU is ready for cross core communication!\n");
pr_err("MU is ready for cross core communication!\n");
return 0;
}

View File

@ -132,6 +132,12 @@
#define M4_RCR_GO 0xAA
#define M4_OCRAMS_RESERVED_SIZE 0xc
#define SNVS_LPCR 0x38
#define SNVS_LPCR_ON_TIME_MASK GENMASK(21, 20)
#define SNVS_LPCR_ON_TIME_SHIFT 20
#define SNVS_LPCR_ON_TIME_50MS 0x1
#define SNVS_LPCR_ON_TIME_500MS 0x0
extern unsigned long iram_tlb_base_addr;
extern unsigned long iram_tlb_phys_addr;
@ -719,6 +725,32 @@ static int imx7_pm_is_resume_from_lpsr(void)
return readl_relaxed(lpsr_base);
}
static void imx7_lpsr_tweaks_enable(bool lpsr_enable)
{
u32 val;
/*
* To get GPIO1/2 LPSR wakeup work,
* set bit 7 of SNVS register 0x48. Unfortunately, it brings us
* a side effect, that is setting TOP (Turn off System Power) bit
* of SNVS LPCR register results in an immediate reset instead of
* power-off. To work around the issue, we only enable this when
* entering LPSR sleep state.
*/
val = readl_relaxed(pm_info->snvs_base.vbase + 0x48);
val &= ~BIT(7);
val |= lpsr_enable ? BIT(7) : 0;
writel_relaxed(val, pm_info->snvs_base.vbase + 0x48);
/* Key press length, shorter keypress in LPSR sleep */
val = readl_relaxed(pm_info->snvs_base.vbase + SNVS_LPCR);
val &= ~SNVS_LPCR_ON_TIME_MASK;
val |= (lpsr_enable ? SNVS_LPCR_ON_TIME_50MS : SNVS_LPCR_ON_TIME_500MS)
<< SNVS_LPCR_ON_TIME_SHIFT;
writel_relaxed(val, pm_info->snvs_base.vbase + SNVS_LPCR);
}
static int imx7_pm_enter(suspend_state_t state)
{
unsigned int console_saved_reg[10] = {0};
@ -789,6 +821,7 @@ static int imx7_pm_enter(suspend_state_t state)
imx7_console_save(console_saved_reg);
memcpy(ocram_saved_in_ddr, ocram_base, ocram_size);
if (lpsr_enabled) {
imx7_lpsr_tweaks_enable(true);
imx7_pm_set_lpsr_resume_addr(pm_info->resume_addr);
imx7_console_io_save();
memcpy(lpm_ocram_saved_in_ddr, lpm_ocram_base,
@ -814,6 +847,7 @@ static int imx7_pm_enter(suspend_state_t state)
imx7_sys_counter_restore();
imx7_gpio_restore();
imx7d_enable_rcosc();
imx7_lpsr_tweaks_enable(false);
}
if (imx_gpcv2_is_mf_mix_off() ||
imx7_pm_is_resume_from_lpsr()) {

View File

@ -771,6 +771,8 @@ void pm_relax(struct device *dev)
{
unsigned long flags;
printk("%s - %d\n", __func__, __LINE__);
if (!dev)
return;

View File

@ -75,6 +75,8 @@ static void imx_sc_check_for_events(struct work_struct *work)
struct imx_sc_rpc_msg *hdr = &msg.hdr;
bool state;
printk("%s - %d\n", __func__, __LINE__);
hdr->ver = IMX_SC_RPC_VERSION;
hdr->svc = IMX_SC_RPC_SVC_MISC;
hdr->func = IMX_SC_MISC_FUNC_GET_BUTTON_STATUS;

View File

@ -48,16 +48,24 @@ static void imx_imx_snvs_check_for_events(struct timer_list *t)
struct input_dev *input = pdata->input;
u32 state;
printk("imx_imx_snvs_check_for_events\n");
if (pdata->clk) {
if (pdata->suspended)
printk(" imx_imx_snvs_check_for_events: have a clock\n");
if (pdata->suspended) {
printk(" imx_imx_snvs_check_for_events: suspended\n");
clk_prepare_enable(pdata->clk);
else
}
else {
printk(" imx_imx_snvs_check_for_events: not suspended\n");
clk_enable(pdata->clk);
}
}
regmap_read(pdata->snvs, SNVS_HPSR_REG, &state);
if (pdata->clk) {
printk(" imx_imx_snvs_check_for_events: have a clock 2\n");
if (pdata->suspended)
clk_disable_unprepare(pdata->clk);
else
@ -68,6 +76,7 @@ static void imx_imx_snvs_check_for_events(struct timer_list *t)
/* only report new event if status changed */
if (state ^ pdata->keystate) {
printk(" imx_imx_snvs_check_for_events: status changed: %d\n", state);
pdata->keystate = state;
input_event(input, EV_KEY, pdata->keycode, state);
input_sync(input);
@ -76,6 +85,7 @@ static void imx_imx_snvs_check_for_events(struct timer_list *t)
/* repeat check if pressed long */
if (state) {
printk(" imx_imx_snvs_check_for_events: state: %d\n", state);
mod_timer(&pdata->check_timer,
jiffies + msecs_to_jiffies(REPEAT_INTERVAL));
}
@ -88,26 +98,35 @@ static irqreturn_t imx_snvs_pwrkey_interrupt(int irq, void *dev_id)
struct input_dev *input = pdata->input;
u32 lp_status;
printk("imx_snvs_pwrkey_interrupt\n");
pm_wakeup_event(pdata->input->dev.parent, 0);
if (pdata->clk)
if (pdata->clk) {
printk(" imx_snvs_pwrkey_interrupt: clock enable\n");
clk_enable(pdata->clk);
}
if (pdata->suspended) {
printk(" imx_snvs_pwrkey_interrupt: suspended\n");
pdata->keystate = 1;
input_event(input, EV_KEY, pdata->keycode, 1);
input_sync(input);
}
regmap_read(pdata->snvs, SNVS_LPSR_REG, &lp_status);
if (lp_status & SNVS_LPSR_SPO)
if (lp_status & SNVS_LPSR_SPO) {
printk(" imx_snvs_pwrkey_interrupt: Setting timer\n");
mod_timer(&pdata->check_timer, jiffies + msecs_to_jiffies(DEBOUNCE_TIME));
}
/* clear SPO status */
regmap_write(pdata->snvs, SNVS_LPSR_REG, SNVS_LPSR_SPO);
if (pdata->clk)
if (pdata->clk) {
printk(" imx_snvs_pwrkey_interrupt: disable timer\n");
clk_disable(pdata->clk);
}
return IRQ_HANDLED;
}

View File

@ -79,7 +79,7 @@ static void power_supply_changed_work(struct work_struct *work)
struct power_supply *psy = container_of(work, struct power_supply,
changed_work);
dev_dbg(&psy->dev, "%s\n", __func__);
printk("%s - %d\n", __func__, __LINE__);
spin_lock_irqsave(&psy->changed_lock, flags);
/*

View File

@ -28,6 +28,8 @@ static void try_to_suspend(struct work_struct *work)
{
unsigned int initial_count, final_count;
printk("%s - %d\n", __func__, __LINE__);
if (!pm_get_wakeup_count(&initial_count, true))
goto out;

View File

@ -602,6 +602,8 @@ static ssize_t state_store(struct kobject *kobj, struct kobj_attribute *attr,
suspend_state_t state;
int error;
printk("%s - %d\n", __func__, __LINE__);
error = pm_autosleep_lock();
if (error)
return error;

View File

@ -0,0 +1 @@
/scratch/alistair/remarkable/linux

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,26 @@
kernel/fs/fat/msdos.ko:
kernel/fs/nls/nls_iso8859-15.ko:
kernel/fs/binfmt_misc.ko:
kernel/fs/isofs/isofs.ko:
kernel/fs/udf/udf.ko: kernel/lib/crc-itu-t.ko
kernel/crypto/tcrypt.ko:
kernel/drivers/dma/dmatest.ko:
kernel/drivers/net/wireless/ath/ath6kl/ath6kl_core.ko:
kernel/drivers/net/wireless/ath/ath6kl/ath6kl_sdio.ko: kernel/drivers/net/wireless/ath/ath6kl/ath6kl_core.ko
kernel/drivers/net/wireless/broadcom/brcm80211/brcmutil/brcmutil.ko:
kernel/drivers/net/wireless/broadcom/brcm80211/brcmfmac/brcmfmac.ko: kernel/drivers/net/wireless/broadcom/brcm80211/brcmutil/brcmutil.ko
kernel/drivers/net/usb/cdc_eem.ko:
kernel/drivers/usb/misc/usbtest.ko:
kernel/drivers/usb/class/cdc-acm.ko:
kernel/drivers/usb/serial/usbserial.ko:
kernel/drivers/usb/serial/ftdi_sio.ko: kernel/drivers/usb/serial/usbserial.ko
kernel/drivers/usb/serial/option.ko: kernel/drivers/usb/serial/usb_wwan.ko kernel/drivers/usb/serial/usbserial.ko
kernel/drivers/usb/serial/usb_wwan.ko: kernel/drivers/usb/serial/usbserial.ko
kernel/drivers/input/serio/serport.ko:
kernel/drivers/input/mouse/psmouse.ko:
kernel/drivers/i2c/algos/i2c-algo-pcf.ko:
kernel/drivers/i2c/algos/i2c-algo-pca.ko:
kernel/lib/crc-ccitt.ko:
kernel/lib/crc-itu-t.ko:
kernel/lib/crc7.ko:
kernel/lib/libcrc32c.ko:

View File

@ -0,0 +1,2 @@
# Soft dependencies extracted from modules themselves.
softdep libcrc32c pre: crc32c

View File

@ -0,0 +1,83 @@
# Aliases for symbols, used by symbol_request().
alias symbol:ath6kl_core_cleanup ath6kl_core
alias symbol:ath6kl_warn ath6kl_core
alias symbol:ath6kl_hif_rw_comp_handler ath6kl_core
alias symbol:usb_wwan_get_serial_info usb_wwan
alias symbol:usb_wwan_set_serial_info usb_wwan
alias symbol:usb_serial_suspend usbserial
alias symbol:usb_serial_generic_submit_read_urbs usbserial
alias symbol:ath6kl_hif_intr_bh_handler ath6kl_core
alias symbol:brcmu_pktq_pflush brcmutil
alias symbol:usb_serial_port_softint usbserial
alias symbol:crc_itu_t_table crc_itu_t
alias symbol:ath6kl_core_init ath6kl_core
alias symbol:usb_serial_generic_get_icount usbserial
alias symbol:brcmu_pktq_init brcmutil
alias symbol:usb_serial_resume usbserial
alias symbol:ath6kl_printk ath6kl_core
alias symbol:crc_ccitt_false crc_ccitt
alias symbol:brcmu_pktq_pdeq_match brcmutil
alias symbol:usb_serial_generic_write usbserial
alias symbol:usb_wwan_tiocmget usb_wwan
alias symbol:usb_serial_generic_process_read_urb usbserial
alias symbol:ath6kl_stop_txrx ath6kl_core
alias symbol:usb_serial_generic_chars_in_buffer usbserial
alias symbol:usb_serial_generic_read_bulk_callback usbserial
alias symbol:ath6kl_read_tgt_stats ath6kl_core
alias symbol:i2c_pca_add_bus i2c_algo_pca
alias symbol:i2c_pca_add_numbered_bus i2c_algo_pca
alias symbol:ath6kl_core_tx_complete ath6kl_core
alias symbol:usb_serial_generic_resume usbserial
alias symbol:crc32c libcrc32c
alias symbol:usb_serial_generic_tiocmiwait usbserial
alias symbol:usb_serial_generic_unthrottle usbserial
alias symbol:ath6kl_core_destroy ath6kl_core
alias symbol:brcmu_dotrev_str brcmutil
alias symbol:crc7_be crc7
alias symbol:brcmu_pktq_penq_head brcmutil
alias symbol:usb_wwan_close usb_wwan
alias symbol:usb_serial_register_drivers usbserial
alias symbol:ath6kl_cfg80211_resume ath6kl_core
alias symbol:ath6kl_info ath6kl_core
alias symbol:i2c_pcf_add_bus i2c_algo_pcf
alias symbol:brcmu_pktq_pdeq brcmutil
alias symbol:usb_serial_generic_close usbserial
alias symbol:usb_wwan_chars_in_buffer usb_wwan
alias symbol:crc_ccitt crc_ccitt
alias symbol:usb_wwan_port_remove usb_wwan
alias symbol:usb_wwan_tiocmset usb_wwan
alias symbol:brcmu_pktq_penq brcmutil
alias symbol:brcmu_boardrev_str brcmutil
alias symbol:usb_serial_handle_break usbserial
alias symbol:usb_serial_handle_sysrq_char usbserial
alias symbol:brcmu_pktq_mdeq brcmutil
alias symbol:brcmu_pkt_buf_free_skb brcmutil
alias symbol:usb_serial_generic_throttle usbserial
alias symbol:brcmu_pkt_buf_get_skb brcmutil
alias symbol:brcmu_pktq_flush brcmutil
alias symbol:usb_serial_generic_wait_until_sent usbserial
alias symbol:crc_itu_t crc_itu_t
alias symbol:usb_wwan_dtr_rts usb_wwan
alias symbol:usb_wwan_suspend usb_wwan
alias symbol:usb_serial_generic_open usbserial
alias symbol:ath6kl_cfg80211_suspend ath6kl_core
alias symbol:usb_wwan_write usb_wwan
alias symbol:usb_wwan_resume usb_wwan
alias symbol:brcmu_pktq_pdeq_tail brcmutil
alias symbol:usb_serial_deregister_drivers usbserial
alias symbol:usb_wwan_open usb_wwan
alias symbol:ath6kl_core_create ath6kl_core
alias symbol:usb_wwan_write_room usb_wwan
alias symbol:usb_serial_generic_write_start usbserial
alias symbol:crc32c_impl libcrc32c
alias symbol:crc7_be_syndrome_table crc7
alias symbol:brcmu_d11_attach brcmutil
alias symbol:brcmu_pktq_peek_tail brcmutil
alias symbol:crc_ccitt_false_table crc_ccitt
alias symbol:brcmu_pktq_mlen brcmutil
alias symbol:ath6kl_err ath6kl_core
alias symbol:usb_serial_generic_write_bulk_callback usbserial
alias symbol:usb_wwan_port_probe usb_wwan
alias symbol:ath6kl_core_rx_complete ath6kl_core
alias symbol:usb_serial_handle_dcd_change usbserial
alias symbol:crc_ccitt_table crc_ccitt

View File

@ -0,0 +1 @@
/scratch/alistair/remarkable/linux