blob: 98bad9f651ae3adbd4478889310eb022f2dc3f1e [file] [log] [blame]
/*
* drivers/amlogic/media/video_processor/videosync/videosync.h
*
* Copyright (C) 2017 Amlogic, Inc. All rights reserved.
*
* 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; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
*/
#ifndef _VIDEOSYNC_H
#define _VIDEOSYNC_H
#include <linux/module.h>
#include <linux/errno.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/sched.h>
#include <linux/slab.h>
#include <linux/mutex.h>
#include <linux/videodev2.h>
#include <linux/kthread.h>
#include <linux/freezer.h>
#include <linux/delay.h>
#include <linux/completion.h>
#include <linux/mm.h>
#include <linux/amlogic/media/vfm/vframe.h>
#include <linux/amlogic/media/vfm/vframe_provider.h>
#include <linux/amlogic/media/vfm/vframe_receiver.h>
#include <linux/amlogic/media/vfm/vframe.h>
#include <linux/amlogic/media/frame_sync/timestamp.h>
#include "vfp.h"
#include <linux/spinlock.h>
#define VIDEOSYNC_S_COUNT 1
#define VIDEOSYNC_ACTIVE 0
#define VIDEOSYNC_INACTIVE_REQ 1
#define VIDEOSYNC_INACTIVE 2
struct videosync_priv_s {
int vp_id; /* reserved */
struct videosync_s *dev_s;
};
struct videosync_dev {
struct videosync_s *video_prov;
struct task_struct *kthread;
struct completion thread_active;
struct mutex vp_mutex;
spinlock_t dev_s_num_slock;
u32 active_dev_s_num;
};
extern bool omx_secret_mode;
#define VIDEOSYNC_IOC_MAGIC 'P'
#define VIDEOSYNC_IOC_ALLOC_ID _IOR(VIDEOSYNC_IOC_MAGIC, 0x00, int)
#define VIDEOSYNC_IOC_FREE_ID _IOW(VIDEOSYNC_IOC_MAGIC, 0x01, int)
#define VIDEOSYNC_IOC_SET_FREERUN_MODE _IOW(VIDEOSYNC_IOC_MAGIC, 0x02, int)
#define VIDEOSYNC_IOC_GET_FREERUN_MODE _IOR(VIDEOSYNC_IOC_MAGIC, 0x03, int)
#define VIDEOSYNC_IOC_SET_OMX_VPTS _IOW(VIDEOSYNC_IOC_MAGIC, 0x04, unsigned int)
#define VIDEOSYNC_IOC_GET_OMX_VPTS _IOR(VIDEOSYNC_IOC_MAGIC, 0x05, unsigned int)
#define VIDEOSYNC_IOC_GET_OMX_VERSION \
_IOR(VIDEOSYNC_IOC_MAGIC, 0x06, unsigned int)
#define VIDEOSYNC_IOC_SET_OMX_ZORDER \
_IOW(VIDEOSYNC_IOC_MAGIC, 0x07, unsigned int)
#define VIDEOSYNC_S_VF_RECEIVER_NAME_SIZE 32
#define VIDEOSYNC_S_POOL_SIZE 16
#define VIDEOSYNC_VF_NAME_SIZE 32
extern int videosync_assign_map(char **receiver_name, int *inst);
struct videosync_buffer_states {
int buf_ready_num;
int buf_queued_num;
int total_num;
};
struct videosync_operations_s {
struct vframe_s *(*peek)(void *op_arg);
struct vframe_s *(*get)(void *op_arg);
void (*put)(struct vframe_s *, void *op_arg);
int (*event_cb)(int type, void *data, void *private_data);
int (*buffer_states)(struct videosync_buffer_states *states,
void *op_arg);
};
struct display_area {
u32 left;
u32 top;
u32 width;
u32 height;
};
struct videosync_s {
void *dev;
int index;
int fd_num;
char vf_receiver_name[VIDEOSYNC_S_VF_RECEIVER_NAME_SIZE];
int inst;
bool mapped;
bool receiver_register;
struct vframe_receiver_s vp_vf_receiver;
struct vfq_s queued_q;
struct vfq_s ready_q;
struct vframe_s *videosync_pool_queued[VIDEOSYNC_S_POOL_SIZE + 1];
struct vframe_s *videosync_pool_ready[VIDEOSYNC_S_POOL_SIZE + 1];
int active_state;
const struct videosync_operations_s *ops;
struct completion inactive_done;
struct vframe_s *cur_dispbuf;
spinlock_t timestamp_lock;
struct mutex omx_mutex;
u32 system_time_up;
u32 system_time;
u32 system_time_scale_remainder;
u32 omx_pts;
u32 vpts_ref;
u32 video_frame_repeat_count;
u32 freerun_mode;
u32 first_frame_toggled;
u32 get_frame_count;
u32 put_frame_count;
void *op_arg;
char *name;
struct display_area rect;
u32 zorder;
struct vframe_provider_s video_vf_prov;
char vf_provider_name[VIDEOSYNC_VF_NAME_SIZE];
};
#endif