blob: 8a771bbb86943b9a9dc8da4d71e56211595c40ab [file] [log] [blame]
/* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */
/*
* Copyright (c) 2019 Amlogic, Inc. All rights reserved.
*/
#ifndef _MESON_MHU_COMMON_H_
#define _MESON_MHU_COMMON_H_
#include <linux/cdev.h>
#include <linux/mailbox_controller.h>
#define ASYNC_CMD 1
#define SYNC_CMD 2
#define SYNC_SHIFT(val) ((val) << 25)
#define SYNC_MASK 0x7
#define SIZE_MASK 0x1FF
#define SIZE_SHIFT(val) (((val) & SIZE_MASK) << 16)
#define SIZE_LEN(val) (((val) >> 16) & SIZE_MASK)
#define CMD_MASK 0xFFFF
#define CMD_SHIFT(val) (((val) & CMD_MASK) << 0)
#define TYPE_SHIFT 16
#define TYPE_VALUE(val) ((val) << TYPE_SHIFT)
#define MBOX_TIME_OUT 10000
#define MASK_MHU (BIT(0))
#define MASK_MHU_FIFO (BIT(1))
#define MASK_MHU_PL (BIT(2))
#define MASK_MHU_SEC (BIT(3))
#define MASK_MHU_ALL (MASK_MHU | MASK_MHU_FIFO | MASK_MHU_PL | MASK_MHU_SEC)
#define MBOX_MAX 10
#define MHUDEV_MAX (MBOX_MAX / 2)
#define CDEV_NAME_SIZE 32
extern struct device *mhu_device;
extern struct device *mhu_fifo_device;
extern struct device *mhu_pl_device;
extern struct device *mhu_sec_device;
extern u32 mhu_f;
struct mhu_data_buf {
u32 cmd;
int tx_size;
void *tx_buf;
int rx_size;
void *rx_buf;
void *cl_data;
int head_off;
};
enum call_type {
LISTEN_CALLBACK = TYPE_VALUE(0),
LISTEN_DATA = TYPE_VALUE(1),
};
struct mbox_message {
struct list_head list;
struct task_struct *task;
struct completion complete;
int cmd;
int chan_idx;
char *data;
};
struct mhu_chan {
int index;
int rx_irq;
int mhu_id;
char mhu_name[CDEV_NAME_SIZE];
struct mhu_ctlr *ctlr;
struct mhu_data_buf *data;
};
struct mhu_mbox {
int channel_id;
/*for mhu channel*/
struct mutex mutex;
struct list_head char_list;
dev_t char_no;
struct cdev char_cdev;
struct device *char_dev;
char char_name[32];
int mhu_id;
struct device *mhu_dev;
/*mhu lock for mhu hw reg*/
spinlock_t mhu_lock;
};
struct mhu_ctlr {
struct device *dev;
/*for old mhu*/
void __iomem *mbox_base;
void __iomem *payload_base;
/*for fifo mhu*/
void __iomem *mbox_wr_base;
void __iomem *mbox_rd_base;
void __iomem *mbox_fset_base;
void __iomem *mbox_fclr_base;
void __iomem *mbox_fsts_base;
void __iomem *mbox_irq_base;
void __iomem *mbox_payload_base;
int mhu_id[MBOX_MAX];
int mhu_irq;
int mhu_irqctlr;
int mhu_irqclr;
int mhu_irqmax;
/*for pl mhu*/
void __iomem *mbox_sts_base[MHUDEV_MAX];
void __iomem *mbox_set_base[MHUDEV_MAX];
void __iomem *mbox_clr_base[MHUDEV_MAX];
void __iomem *mbox_pl_base[MHUDEV_MAX];
/*for common*/
struct mutex mutex;
struct mbox_controller mbox_con;
struct mhu_chan *channels;
};
struct mhu_dev {
int chan_idx;
u32 dest;
u32 r_size;
struct list_head list;
dev_t char_no;
struct cdev char_cdev;
struct device *dev;
struct device *p_dev;
const char *name;
char *data;
bool busy;
struct completion complete;
};
#endif