109 lines
2.9 KiB
C
109 lines
2.9 KiB
C
|
/*
|
||
|
* Samsung Exynos SoC series VIPx driver
|
||
|
*
|
||
|
* Copyright (c) 2018 Samsung Electronics Co., Ltd
|
||
|
*
|
||
|
* This program is free software; you can redistribute it and/or modify
|
||
|
* it under the terms of the GNU General Public License version 2 as
|
||
|
* published by the Free Software Foundation.
|
||
|
*/
|
||
|
|
||
|
#ifndef __VIPX_INTERFACE_H__
|
||
|
#define __VIPX_INTERFACE_H__
|
||
|
|
||
|
#include <linux/platform_device.h>
|
||
|
#include <linux/timer.h>
|
||
|
|
||
|
#include "vipx-config.h"
|
||
|
#include "platform/vipx-ctrl.h"
|
||
|
#include "vipx-taskmgr.h"
|
||
|
|
||
|
#define VIPX_WORK_MAX_COUNT (20)
|
||
|
#define VIPX_WORK_MAX_DATA (24)
|
||
|
#define VIPX_RESPONSE_TIMEOUT (500) /* msecs */
|
||
|
|
||
|
struct vipx_system;
|
||
|
|
||
|
enum vipx_interrupt_direction {
|
||
|
IRQ0_TO_DEVICE,
|
||
|
IRQ1_TO_DEVICE,
|
||
|
IRQ_FROM_DEVICE,
|
||
|
};
|
||
|
|
||
|
enum vipx_work_message {
|
||
|
VIPX_WORK_MTYPE_BLK,
|
||
|
VIPX_WORK_MTYPE_NBLK,
|
||
|
};
|
||
|
|
||
|
enum vipx_interface_state {
|
||
|
VIPX_ITF_STATE_OPEN,
|
||
|
VIPX_ITF_STATE_BOOTUP,
|
||
|
VIPX_ITF_STATE_START
|
||
|
};
|
||
|
|
||
|
struct vipx_work {
|
||
|
struct list_head list;
|
||
|
unsigned int valid;
|
||
|
unsigned int id;
|
||
|
enum vipx_work_message message;
|
||
|
unsigned int param0;
|
||
|
unsigned int param1;
|
||
|
unsigned int param2;
|
||
|
unsigned int param3;
|
||
|
unsigned char data[VIPX_WORK_MAX_DATA];
|
||
|
};
|
||
|
|
||
|
struct vipx_work_list {
|
||
|
struct vipx_work work[VIPX_WORK_MAX_COUNT];
|
||
|
spinlock_t slock;
|
||
|
struct list_head free_head;
|
||
|
unsigned int free_cnt;
|
||
|
struct list_head reply_head;
|
||
|
unsigned int reply_cnt;
|
||
|
};
|
||
|
|
||
|
struct vipx_interface {
|
||
|
int irq[REG_MAX];
|
||
|
void __iomem *regs;
|
||
|
struct vipx_taskmgr taskmgr;
|
||
|
void *cookie;
|
||
|
unsigned long state;
|
||
|
|
||
|
wait_queue_head_t reply_wq;
|
||
|
spinlock_t process_barrier;
|
||
|
struct vipx_work_list work_list;
|
||
|
struct work_struct work_queue;
|
||
|
|
||
|
struct vipx_task *request[VIPX_MAX_GRAPH];
|
||
|
struct vipx_task *process;
|
||
|
struct vipx_work reply[VIPX_MAX_GRAPH];
|
||
|
unsigned int done_cnt;
|
||
|
unsigned int wait_time;
|
||
|
|
||
|
struct vipx_mailbox_ctrl *mctrl;
|
||
|
struct vipx_system *system;
|
||
|
};
|
||
|
|
||
|
int vipx_hw_wait_bootup(struct vipx_interface *itf);
|
||
|
|
||
|
int vipx_hw_config(struct vipx_interface *itf, struct vipx_task *itask);
|
||
|
int vipx_hw_process(struct vipx_interface *itf, struct vipx_task *itask);
|
||
|
int vipx_hw_create(struct vipx_interface *itf, struct vipx_task *itask);
|
||
|
int vipx_hw_destroy(struct vipx_interface *itf, struct vipx_task *itask);
|
||
|
int vipx_hw_init(struct vipx_interface *itf, struct vipx_task *itask);
|
||
|
int vipx_hw_deinit(struct vipx_interface *itf, struct vipx_task *itask);
|
||
|
|
||
|
int vipx_hw_load_graph(struct vipx_interface *itf, struct vipx_task *itask);
|
||
|
int vipx_hw_unload_graph(struct vipx_interface *itf, struct vipx_task *itask);
|
||
|
int vipx_hw_execute_graph(struct vipx_interface *itf, struct vipx_task *itask);
|
||
|
|
||
|
int vipx_interface_start(struct vipx_interface *itf);
|
||
|
int vipx_interface_stop(struct vipx_interface *itf);
|
||
|
int vipx_interface_open(struct vipx_interface *itf, void *mbox);
|
||
|
int vipx_interface_close(struct vipx_interface *itf);
|
||
|
|
||
|
int vipx_interface_probe(struct vipx_system *sys);
|
||
|
void vipx_interface_remove(struct vipx_interface *itf);
|
||
|
|
||
|
#endif
|