mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-28 23:24:50 +00:00
cdd5de500b
Introduce a wkup_m3_ipc driver to handle communication between the MPU and Cortex M3 wkup_m3 present on am335x. This driver is responsible for actually booting the wkup_m3_rproc and also handling all IPC which is done using the IPC registers in the control module, a mailbox, and a separate interrupt back from the wkup_m3. A small API is exposed for executing specific power commands, which include configuring for low power mode, request a transition to a low power mode, and status info on a previous transition. Signed-off-by: Dave Gerlach <d-gerlach@ti.com> Signed-off-by: Tony Lindgren <tony@atomide.com>
55 lines
1.5 KiB
C
55 lines
1.5 KiB
C
/*
|
|
* TI Wakeup M3 for AMx3 SoCs Power Management Routines
|
|
*
|
|
* Copyright (C) 2015 Texas Instruments Incorporated - http://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 state;
|
|
|
|
struct completion sync_complete;
|
|
struct mbox_client mbox_client;
|
|
struct mbox_chan *mbox;
|
|
|
|
struct wkup_m3_ipc_ops *ops;
|
|
};
|
|
|
|
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);
|
|
};
|
|
|
|
struct wkup_m3_ipc *wkup_m3_ipc_get(void);
|
|
void wkup_m3_ipc_put(struct wkup_m3_ipc *m3_ipc);
|
|
#endif /* _LINUX_WKUP_M3_IPC_H */
|