WIP
Signed-off-by: Alistair Francis <alistair@alistair23.me>5.4-rM2-2.2.x-imx-deep-sleep
parent
064c838bd2
commit
67e03fec70
|
@ -168,6 +168,14 @@
|
|||
};
|
||||
};
|
||||
|
||||
// &mu {
|
||||
// status = "disabled";
|
||||
// };
|
||||
|
||||
&ocrams {
|
||||
fsl,enable-lpsr;
|
||||
};
|
||||
|
||||
&cpu0 {
|
||||
cpu-supply = <&buck1_reg>;
|
||||
};
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 :
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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()) {
|
||||
|
|
|
@ -771,6 +771,8 @@ void pm_relax(struct device *dev)
|
|||
{
|
||||
unsigned long flags;
|
||||
|
||||
printk("%s - %d\n", __func__, __LINE__);
|
||||
|
||||
if (!dev)
|
||||
return;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
/*
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
/scratch/alistair/remarkable/linux
|
File diff suppressed because it is too large
Load Diff
Binary file not shown.
|
@ -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:
|
|
@ -0,0 +1,2 @@
|
|||
# Soft dependencies extracted from modules themselves.
|
||||
softdep libcrc32c pre: crc32c
|
|
@ -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
|
|
@ -0,0 +1 @@
|
|||
/scratch/alistair/remarkable/linux
|
Loading…
Reference in New Issue