mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-12 13:55:32 +00:00
![Dave Gerlach](/assets/img/avatar_default.png)
Some boards like the AM335x EVM-SK and AM437x GP EVM provide software control via a GPIO pin to toggle the DDR VTT regulator to reduce power consumption in low power states. The VTT regulator should be disabled after enabling self-refresh on suspend, and should be enabled before disabling self-refresh on resume. This is to allow proper self-refresh entry/exit commands to be transmitted to the memory. The "ti,vtt-gpio-pin" device tree property in the wkup_m3_ipc node specifies which GPIO pin to use. This property is communicated to the Wakeup Cortex M3 co-processor where the actual toggling of the GPIO pin happens in CM3 firmware [1]. Please note that the GPIO pin must be on the GPIO0 module as that module is in the wakeup power domain. [1] https://git.ti.com/cgit/processor-firmware/ti-amx3-cm3-pm-firmware/tree/src/pm_services/ddr.c?h=08.02.00.006#n190 Signed-off-by: Dave Gerlach <d-gerlach@ti.com> Signed-off-by: Keerthy <j-keerthy@ti.com> [dfustini: remove the unnecessary "ti,needs-vtt-toggle" property] Signed-off-by: Drew Fustini <dfustini@baylibre.com> Signed-off-by: Nishanth Menon <nm@ti.com> Link: https://lore.kernel.org/r/20220409211215.2529387-3-dfustini@baylibre.com
65 lines
1.8 KiB
C
65 lines
1.8 KiB
C
/*
|
|
* TI Wakeup M3 for AMx3 SoCs Power Management Routines
|
|
*
|
|
* Copyright (C) 2015 Texas Instruments Incorporated - https://www.ti.com/
|
|
* Dave Gerlach <d-gerlach@ti.com>
|
|
*
|
|
* 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 version 2.
|
|
*
|
|
* This program is distributed "as is" WITHOUT ANY WARRANTY of any
|
|
* kind, whether express or implied; without even the implied warranty
|
|
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*/
|
|
|
|
#ifndef _LINUX_WKUP_M3_IPC_H
|
|
#define _LINUX_WKUP_M3_IPC_H
|
|
|
|
#define WKUP_M3_DEEPSLEEP 1
|
|
#define WKUP_M3_STANDBY 2
|
|
#define WKUP_M3_IDLE 3
|
|
|
|
#include <linux/mailbox_client.h>
|
|
|
|
struct wkup_m3_ipc_ops;
|
|
|
|
struct wkup_m3_ipc {
|
|
struct rproc *rproc;
|
|
|
|
void __iomem *ipc_mem_base;
|
|
struct device *dev;
|
|
|
|
int mem_type;
|
|
unsigned long resume_addr;
|
|
int vtt_conf;
|
|
int state;
|
|
|
|
struct completion sync_complete;
|
|
struct mbox_client mbox_client;
|
|
struct mbox_chan *mbox;
|
|
|
|
struct wkup_m3_ipc_ops *ops;
|
|
int is_rtc_only;
|
|
};
|
|
|
|
struct wkup_m3_wakeup_src {
|
|
int irq_nr;
|
|
char src[10];
|
|
};
|
|
|
|
struct wkup_m3_ipc_ops {
|
|
void (*set_mem_type)(struct wkup_m3_ipc *m3_ipc, int mem_type);
|
|
void (*set_resume_address)(struct wkup_m3_ipc *m3_ipc, void *addr);
|
|
int (*prepare_low_power)(struct wkup_m3_ipc *m3_ipc, int state);
|
|
int (*finish_low_power)(struct wkup_m3_ipc *m3_ipc);
|
|
int (*request_pm_status)(struct wkup_m3_ipc *m3_ipc);
|
|
const char *(*request_wake_src)(struct wkup_m3_ipc *m3_ipc);
|
|
void (*set_rtc_only)(struct wkup_m3_ipc *m3_ipc);
|
|
};
|
|
|
|
struct wkup_m3_ipc *wkup_m3_ipc_get(void);
|
|
void wkup_m3_ipc_put(struct wkup_m3_ipc *m3_ipc);
|
|
void wkup_m3_set_rtc_only_mode(void);
|
|
#endif /* _LINUX_WKUP_M3_IPC_H */
|