blob: 0e0df27095c1e37d62b5da44625c270669717459 [file] [log] [blame]
/*
* drivers/amlogic/media/frame_sync/tsync_pcr.c
*
* 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.
*
*/
#include <linux/module.h>
#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/vmalloc.h>
#include <linux/uaccess.h>
#include <linux/slab.h>
#include <linux/platform_device.h>
#include <linux/amlogic/cpu_version.h>
#include <linux/amlogic/major.h>
#include "media_sync_core.h"
#include "media_sync_dev.h"
#define MEDIASYNC_DEVICE_NAME "mediasync"
static struct device *mediasync_dev;
typedef struct alloc_para {
s32 mDemuxId;
s32 mPcrPid;
} mediasync_alloc_para;
typedef struct systime_para {
s64 mStcUs;
s64 mSystemTimeUs;
}mediasync_systime_para;
typedef struct updatetime_para {
int64_t mMediaTimeUs;
int64_t mSystemTimeUs;
bool mForceUpdate;
}mediasync_updatetime_para;
typedef struct arthortime_para {
int64_t mMediaTimeUs;
int64_t mSystemTimeUs;
int64_t mStcTimeUs;
}mediasync_arthortime_para;
typedef struct priv_s {
s32 mSyncInsId;
mediasync_ins *mSyncIns;
}mediasync_priv_s;
static int mediasync_open(struct inode *inode, struct file *file)
{
mediasync_priv_s *priv = {0};
priv = kzalloc(sizeof(mediasync_priv_s), GFP_KERNEL);
if (priv == NULL)
return -ENOMEM;
priv->mSyncInsId = -1;
priv->mSyncIns = NULL;
file->private_data = priv;
return 0;
}
static int mediasync_release(struct inode *inode, struct file *file)
{
long ret = 0;
mediasync_priv_s *priv = (mediasync_priv_s *)file->private_data;
if (priv == NULL) {
return -ENOMEM;
}
if (priv->mSyncInsId != -1) {
ret = mediasync_ins_unbinder(priv->mSyncInsId);
priv->mSyncInsId = -1;
priv->mSyncIns = NULL;
}
kfree(priv);
return 0;
}
static long mediasync_ioctl(struct file *file, unsigned int cmd, ulong arg)
{
long ret = 0;
mediasync_speed SyncSpeed = {0};
mediasync_speed PcrSlope = {0};
mediasync_frameinfo FrameInfo = {-1, -1};
mediasync_audioinfo AudioInfo = {0, 0};
mediasync_videoinfo VideoInfo = {0, 0};
mediasync_audio_format AudioFormat;
mediasync_clocktype ClockType = UNKNOWN_CLOCK;
mediasync_clockprovider_state state;
s32 SyncInsId = -1;
s32 SyncPaused = 0;
s32 SyncMode = -1;
s32 SyncState = 0;
s64 NextVsyncSystemTime = 0;
s64 TrackMediaTime = 0;
int HasAudio = -1;
int HasVideo = -1;
s32 StartThreshold = 0;
s32 PtsAdjust = 0;
s64 VideoWorkMode = 0;
s64 FccEnable = 0;
int mute_flag = 0;
int PauseResumeFlag = 0;
mediasync_priv_s *priv = (mediasync_priv_s *)file->private_data;
mediasync_ins *SyncIns = NULL;
mediasync_alloc_para parm = {0};
mediasync_arthortime_para ArthorTime = {0};
mediasync_updatetime_para UpdateTime = {0};
mediasync_systime_para SystemTime = {0};
aml_Source_Type sourceType = TS_DEMOD;
s64 UpdateTimeThreshold = 0;
s64 StartMediaTime = -1;
switch (cmd) {
case MEDIASYNC_IOC_INSTANCE_ALLOC:
if (copy_from_user ((void *)&parm,
(void *)arg,
sizeof(parm)))
return -EFAULT;
if (mediasync_ins_alloc(parm.mDemuxId,
parm.mPcrPid,
&SyncInsId,
&SyncIns) < 0) {
return -EFAULT;
}
if (SyncIns == NULL) {
return -EFAULT;
}
if (priv != NULL) {
priv->mSyncInsId = SyncInsId;
priv->mSyncIns = SyncIns;
priv->mSyncIns->mRef++;
}
break;
case MEDIASYNC_IOC_INSTANCE_GET:
if (priv->mSyncIns == NULL) {
return -EFAULT;
}
SyncInsId = priv->mSyncInsId;
if (copy_to_user((void *)arg,
&SyncInsId,
sizeof(SyncInsId))) {
return -EFAULT;
}
break;
case MEDIASYNC_IOC_INSTANCE_BINDER:
if (copy_from_user((void *)&SyncInsId,
(void *)arg,
sizeof(SyncInsId))) {
return -EFAULT;
}
ret = mediasync_ins_binder(SyncInsId, &SyncIns);
if (SyncIns == NULL) {
return -EFAULT;
}
priv->mSyncInsId = SyncInsId;
priv->mSyncIns = SyncIns;
break;
case MEDIASYNC_IOC_UPDATE_MEDIATIME:
if (copy_from_user((void *)&UpdateTime,
(void *)arg,
sizeof(UpdateTime))) {
return -EFAULT;
}
if (priv->mSyncIns == NULL) {
return -EFAULT;
}
ret = mediasync_ins_update_mediatime(priv->mSyncInsId,
UpdateTime.mMediaTimeUs,
UpdateTime.mSystemTimeUs,
UpdateTime.mForceUpdate);
break;
case MEDIASYNC_IOC_GET_MEDIATIME:
if (priv->mSyncIns == NULL) {
return -EFAULT;
}
ret = mediasync_ins_get_anchor_time(priv->mSyncInsId,
&(ArthorTime.mMediaTimeUs),
&(ArthorTime.mStcTimeUs),
&(ArthorTime.mSystemTimeUs));
if (ret == 0) {
if (copy_to_user((void *)arg,
&ArthorTime,
sizeof(ArthorTime))) {
return -EFAULT;
}
}
break;
case MEDIASYNC_IOC_GET_SYSTEMTIME:
if (priv->mSyncIns == NULL) {
return -EFAULT;
}
ret = mediasync_ins_get_systemtime(priv->mSyncInsId,
&(SystemTime.mStcUs),
&(SystemTime.mSystemTimeUs));
if (ret == 0) {
if (copy_to_user((void *)arg,
&SystemTime,
sizeof(SystemTime))) {
return -EFAULT;
}
}
break;
case MEDIASYNC_IOC_GET_NEXTVSYNC_TIME:
if (priv->mSyncIns == NULL)
return -EFAULT;
ret = mediasync_ins_get_nextvsync_systemtime(priv->mSyncInsId,
&NextVsyncSystemTime);
if (ret == 0) {
if (copy_to_user((void *)arg,
&NextVsyncSystemTime,
sizeof(NextVsyncSystemTime)))
return -EFAULT;
}
break;
case MEDIASYNC_IOC_SET_SPEED:
if (copy_from_user((void *)&SyncSpeed,
(void *)arg,
sizeof(SyncSpeed)))
return -EFAULT;
if (priv->mSyncIns == NULL)
return -EFAULT;
ret = mediasync_ins_set_mediatime_speed(priv->mSyncInsId,
SyncSpeed);
break;
case MEDIASYNC_IOC_GET_SPEED:
if (priv->mSyncIns == NULL)
return -EFAULT;
ret = mediasync_ins_get_mediatime_speed(priv->mSyncInsId,
&SyncSpeed);
if (ret == 0) {
if (copy_to_user((void *)arg,
&SyncSpeed,
sizeof(SyncSpeed)))
return -EFAULT;
}
break;
case MEDIASYNC_IOC_SET_PAUSE:
if (copy_from_user((void *)&SyncPaused,
(void *)arg,
sizeof(SyncPaused)))
return -EFAULT;
if (priv->mSyncIns == NULL)
return -EFAULT;
ret = mediasync_ins_set_paused(priv->mSyncInsId,
SyncPaused);
break;
case MEDIASYNC_IOC_GET_PAUSE:
if (priv->mSyncIns == NULL)
return -EFAULT;
ret = mediasync_ins_get_paused(priv->mSyncInsId,
&SyncPaused);
if (ret == 0) {
if (copy_to_user((void *)arg,
&SyncPaused,
sizeof(SyncPaused)))
return -EFAULT;
}
break;
case MEDIASYNC_IOC_SET_SYNCMODE:
if (copy_from_user((void *)&SyncMode,
(void *)arg,
sizeof(SyncMode)))
return -EFAULT;
if (priv->mSyncIns == NULL)
return -EFAULT;
ret = mediasync_ins_set_syncmode(priv->mSyncInsId,
SyncMode);
break;
case MEDIASYNC_IOC_GET_SYNCMODE:
if (priv->mSyncIns == NULL)
return -EFAULT;
ret = mediasync_ins_get_syncmode(priv->mSyncInsId,
&SyncMode);
if (ret == 0) {
if (copy_to_user((void *)arg,
&SyncMode,
sizeof(SyncMode)))
return -EFAULT;
}
break;
case MEDIASYNC_IOC_GET_TRACKMEDIATIME:
if (priv->mSyncIns == NULL) {
return -EFAULT;
}
ret = mediasync_ins_get_trackmediatime(priv->mSyncInsId,
&TrackMediaTime);
if (ret == 0) {
if (copy_to_user((void *)arg,
&TrackMediaTime,
sizeof(TrackMediaTime))) {
return -EFAULT;
}
}
break;
case MEDIASYNC_IOC_SET_FIRST_AFRAME_INFO:
if (copy_from_user((void *)&FrameInfo,
(void *)arg,
sizeof(FrameInfo)))
return -EFAULT;
if (priv->mSyncIns == NULL)
return -EFAULT;
ret = mediasync_ins_set_firstaudioframeinfo(priv->mSyncInsId,
FrameInfo);
break;
case MEDIASYNC_IOC_GET_FIRST_AFRAME_INFO:
if (priv->mSyncIns == NULL)
return -EFAULT;
ret = mediasync_ins_get_firstaudioframeinfo(priv->mSyncInsId,
&FrameInfo);
if (ret == 0) {
if (copy_to_user((void *)arg,
&FrameInfo,
sizeof(FrameInfo)))
return -EFAULT;
}
break;
case MEDIASYNC_IOC_SET_FIRST_VFRAME_INFO:
if (copy_from_user((void *)&FrameInfo,
(void *)arg,
sizeof(FrameInfo)))
return -EFAULT;
if (priv->mSyncIns == NULL)
return -EFAULT;
ret = mediasync_ins_set_firstvideoframeinfo(priv->mSyncInsId,
FrameInfo);
break;
case MEDIASYNC_IOC_GET_FIRST_VFRAME_INFO:
if (priv->mSyncIns == NULL)
return -EFAULT;
ret = mediasync_ins_get_firstvideoframeinfo(priv->mSyncInsId,
&FrameInfo);
if (ret == 0) {
if (copy_to_user((void *)arg,
&FrameInfo,
sizeof(FrameInfo)))
return -EFAULT;
}
break;
case MEDIASYNC_IOC_SET_FIRST_DMXPCR_INFO:
if (copy_from_user((void *)&FrameInfo,
(void *)arg,
sizeof(FrameInfo)))
return -EFAULT;
if (priv->mSyncIns == NULL)
return -EFAULT;
ret = mediasync_ins_set_firstdmxpcrinfo(priv->mSyncInsId,
FrameInfo);
break;
case MEDIASYNC_IOC_GET_FIRST_DMXPCR_INFO:
if (priv->mSyncIns == NULL)
return -EFAULT;
ret = mediasync_ins_get_firstdmxpcrinfo(priv->mSyncInsId,
&FrameInfo);
if (ret == 0) {
if (copy_to_user((void *)arg,
&FrameInfo,
sizeof(FrameInfo)))
return -EFAULT;
}
break;
case MEDIASYNC_IOC_SET_REFCLOCK_INFO:
if (copy_from_user((void *)&FrameInfo,
(void *)arg,
sizeof(FrameInfo)))
return -EFAULT;
if (priv->mSyncIns == NULL)
return -EFAULT;
ret = mediasync_ins_set_refclockinfo(priv->mSyncInsId,
FrameInfo);
break;
case MEDIASYNC_IOC_GET_REFCLOCK_INFO:
if (priv->mSyncIns == NULL)
return -EFAULT;
ret = mediasync_ins_get_refclockinfo(priv->mSyncInsId,
&FrameInfo);
if (ret == 0) {
if (copy_to_user((void *)arg,
&FrameInfo,
sizeof(FrameInfo)))
return -EFAULT;
}
break;
case MEDIASYNC_IOC_SET_CUR_AFRAME_INFO:
if (copy_from_user((void *)&FrameInfo,
(void *)arg,
sizeof(FrameInfo)))
return -EFAULT;
if (priv->mSyncIns == NULL)
return -EFAULT;
ret = mediasync_ins_set_curaudioframeinfo(priv->mSyncInsId,
FrameInfo);
break;
case MEDIASYNC_IOC_GET_CUR_AFRAME_INFO:
if (priv->mSyncIns == NULL)
return -EFAULT;
ret = mediasync_ins_get_curaudioframeinfo(priv->mSyncInsId,
&FrameInfo);
if (ret == 0) {
if (copy_to_user((void *)arg,
&FrameInfo,
sizeof(FrameInfo)))
return -EFAULT;
}
break;
case MEDIASYNC_IOC_SET_CUR_VFRAME_INFO:
if (copy_from_user((void *)&FrameInfo,
(void *)arg,
sizeof(FrameInfo)))
return -EFAULT;
if (priv->mSyncIns == NULL)
return -EFAULT;
ret = mediasync_ins_set_curvideoframeinfo(priv->mSyncInsId,
FrameInfo);
break;
case MEDIASYNC_IOC_GET_CUR_VFRAME_INFO:
if (priv->mSyncIns == NULL)
return -EFAULT;
ret = mediasync_ins_get_curvideoframeinfo(priv->mSyncInsId,
&FrameInfo);
if (ret == 0) {
if (copy_to_user((void *)arg,
&FrameInfo,
sizeof(FrameInfo)))
return -EFAULT;
}
break;
case MEDIASYNC_IOC_SET_CUR_DMXPCR_INFO:
if (copy_from_user((void *)&FrameInfo,
(void *)arg,
sizeof(FrameInfo)))
return -EFAULT;
if (priv->mSyncIns == NULL)
return -EFAULT;
ret = mediasync_ins_set_curdmxpcrinfo(priv->mSyncInsId,
FrameInfo);
break;
case MEDIASYNC_IOC_GET_CUR_DMXPCR_INFO:
if (priv->mSyncIns == NULL)
return -EFAULT;
ret = mediasync_ins_get_curdmxpcrinfo(priv->mSyncInsId,
&FrameInfo);
if (ret == 0) {
if (copy_to_user((void *)arg,
&FrameInfo,
sizeof(FrameInfo)))
return -EFAULT;
}
break;
case MEDIASYNC_IOC_SET_AUDIO_INFO:
if (copy_from_user((void *)&AudioInfo,
(void *)arg,
sizeof(AudioInfo)))
return -EFAULT;
if (priv->mSyncIns == NULL)
return -EFAULT;
ret = mediasync_ins_set_audioinfo(priv->mSyncInsId,
AudioInfo);
break;
case MEDIASYNC_IOC_GET_AUDIO_INFO:
if (priv->mSyncIns == NULL)
return -EFAULT;
ret = mediasync_ins_get_audioinfo(priv->mSyncInsId,
&AudioInfo);
if (ret == 0) {
if (copy_to_user((void *)arg,
&AudioInfo,
sizeof(AudioInfo)))
return -EFAULT;
}
break;
case MEDIASYNC_IOC_SET_AUDIO_MUTEFLAG:
if (copy_from_user((void *)&mute_flag,
(void *)arg,
sizeof(mute_flag))) {
return -EFAULT;
}
if (priv->mSyncIns == NULL)
return -EFAULT;
ret = mediasync_ins_set_audiomute(priv->mSyncInsId,
mute_flag);
break;
case MEDIASYNC_IOC_GET_AUDIO_MUTEFLAG:
if (priv->mSyncIns == NULL)
return -EFAULT;
ret = mediasync_ins_get_audiomute(priv->mSyncInsId,
&mute_flag);
if (ret == 0) {
if (copy_to_user((void *)arg,
&mute_flag,
sizeof(mute_flag)))
return -EFAULT;
}
break;
case MEDIASYNC_IOC_SET_VIDEO_INFO:
if (copy_from_user((void *)&VideoInfo,
(void *)arg,
sizeof(VideoInfo)))
return -EFAULT;
if (priv->mSyncIns == NULL)
return -EFAULT;
ret = mediasync_ins_set_videoinfo(priv->mSyncInsId,
VideoInfo);
break;
case MEDIASYNC_IOC_GET_VIDEO_INFO:
if (priv->mSyncIns == NULL)
return -EFAULT;
ret = mediasync_ins_get_videoinfo(priv->mSyncInsId,
&VideoInfo);
if (ret == 0) {
if (copy_to_user((void *)arg,
&VideoInfo,
sizeof(VideoInfo)))
return -EFAULT;
}
break;
case MEDIASYNC_IOC_SET_HASAUDIO:
if (copy_from_user((void *)&HasAudio,
(void *)arg,
sizeof(HasAudio)))
return -EFAULT;
if (priv->mSyncIns == NULL)
return -EFAULT;
ret = mediasync_ins_set_hasaudio(priv->mSyncInsId,
HasAudio);
break;
case MEDIASYNC_IOC_GET_HASAUDIO:
if (priv->mSyncIns == NULL)
return -EFAULT;
ret = mediasync_ins_get_hasaudio(priv->mSyncInsId,
&HasAudio);
if (ret == 0) {
if (copy_to_user((void *)arg,
&HasAudio,
sizeof(HasAudio)))
return -EFAULT;
}
break;
case MEDIASYNC_IOC_SET_HASVIDEO:
if (copy_from_user((void *)&HasVideo,
(void *)arg,
sizeof(HasVideo)))
return -EFAULT;
if (priv->mSyncIns == NULL)
return -EFAULT;
ret = mediasync_ins_set_hasvideo(priv->mSyncInsId,
HasVideo);
break;
case MEDIASYNC_IOC_GET_HASVIDEO:
if (priv->mSyncIns == NULL)
return -EFAULT;
ret = mediasync_ins_get_hasvideo(priv->mSyncInsId,
&HasVideo);
if (ret == 0) {
if (copy_to_user((void *)arg,
&HasVideo,
sizeof(HasVideo)))
return -EFAULT;
}
break;
case MEDIASYNC_IOC_SET_AVSTATE:
if (copy_from_user((void *)&SyncState,
(void *)arg,
sizeof(SyncState)))
return -EFAULT;
if (priv->mSyncIns == NULL)
return -EFAULT;
ret = mediasync_ins_set_avsyncstate(priv->mSyncInsId,
SyncState);
break;
case MEDIASYNC_IOC_GET_AVSTATE:
if (priv->mSyncIns == NULL)
return -EFAULT;
ret = mediasync_ins_get_avsyncstate(priv->mSyncInsId,
&SyncState);
if (ret == 0) {
if (copy_to_user((void *)arg,
&SyncState,
sizeof(SyncState)))
return -EFAULT;
}
break;
case MEDIASYNC_IOC_SET_CLOCKTYPE:
if (copy_from_user((void *)&ClockType,
(void *)arg,
sizeof(ClockType)))
return -EFAULT;
if (priv->mSyncIns == NULL)
return -EFAULT;
ret = mediasync_ins_set_clocktype(priv->mSyncInsId,
ClockType);
break;
case MEDIASYNC_IOC_GET_CLOCKTYPE:
if (priv->mSyncIns == NULL)
return -EFAULT;
ret = mediasync_ins_get_clocktype(priv->mSyncInsId,
&ClockType);
if (ret == 0) {
if (copy_to_user((void *)arg,
&ClockType,
sizeof(ClockType)))
return -EFAULT;
}
break;
case MEDIASYNC_IOC_SET_CLOCKSTATE:
if (copy_from_user((void *)&state,
(void *)arg,
sizeof(state)))
return -EFAULT;
if (priv->mSyncIns == NULL)
return -EFAULT;
ret = mediasync_ins_set_clockstate(priv->mSyncInsId,
state);
break;
case MEDIASYNC_IOC_GET_CLOCKSTATE:
if (priv->mSyncIns == NULL)
return -EFAULT;
ret = mediasync_ins_get_clockstate(priv->mSyncInsId,
&state);
if (ret == 0) {
if (copy_to_user((void *)arg,
&state,
sizeof(state)))
return -EFAULT;
}
break;
case MEDIASYNC_IOC_SET_STARTTHRESHOLD:
if (copy_from_user((void *)&StartThreshold,
(void *)arg,
sizeof(StartThreshold)))
return -EFAULT;
if (priv->mSyncIns == NULL)
return -EFAULT;
ret = mediasync_ins_set_startthreshold(priv->mSyncInsId,
StartThreshold);
break;
case MEDIASYNC_IOC_GET_STARTTHRESHOLD:
if (priv->mSyncIns == NULL)
return -EFAULT;
ret = mediasync_ins_get_startthreshold(priv->mSyncInsId,
&StartThreshold);
if (ret == 0) {
if (copy_to_user((void *)arg,
&StartThreshold,
sizeof(StartThreshold)))
return -EFAULT;
}
break;
case MEDIASYNC_IOC_SET_PTSADJUST:
if (copy_from_user((void *)&PtsAdjust,
(void *)arg,
sizeof(PtsAdjust)))
return -EFAULT;
if (priv->mSyncIns == NULL)
return -EFAULT;
ret = mediasync_ins_set_ptsadjust(priv->mSyncInsId,
PtsAdjust);
break;
case MEDIASYNC_IOC_GET_PTSADJUST:
if (priv->mSyncIns == NULL)
return -EFAULT;
ret = mediasync_ins_get_ptsadjust(priv->mSyncInsId,
&PtsAdjust);
if (ret == 0) {
if (copy_to_user((void *)arg,
&PtsAdjust,
sizeof(PtsAdjust)))
return -EFAULT;
}
break;
case MEDIASYNC_IOC_SET_VIDEOWORKMODE:
if (copy_from_user((void *)&VideoWorkMode,
(void *)arg,
sizeof(VideoWorkMode)))
return -EFAULT;
if (priv->mSyncIns == NULL)
return -EFAULT;
ret = mediasync_ins_set_videoworkmode(priv->mSyncInsId,
VideoWorkMode);
break;
case MEDIASYNC_IOC_GET_VIDEOWORKMODE:
if (priv->mSyncIns == NULL)
return -EFAULT;
ret = mediasync_ins_get_videoworkmode(priv->mSyncInsId,
&VideoWorkMode);
if (ret == 0) {
if (copy_to_user((void *)arg,
&VideoWorkMode,
sizeof(VideoWorkMode)))
return -EFAULT;
}
break;
case MEDIASYNC_IOC_SET_FCCENABLE:
if (copy_from_user((void *)&FccEnable,
(void *)arg,
sizeof(FccEnable)))
return -EFAULT;
if (priv->mSyncIns == NULL)
return -EFAULT;
ret = mediasync_ins_set_fccenable(priv->mSyncInsId,
FccEnable);
break;
case MEDIASYNC_IOC_GET_FCCENABLE:
if (priv->mSyncIns == NULL)
return -EFAULT;
ret = mediasync_ins_get_fccenable(priv->mSyncInsId,
&FccEnable);
if (ret == 0) {
if (copy_to_user((void *)arg,
&FccEnable,
sizeof(FccEnable)))
return -EFAULT;
}
break;
case MEDIASYNC_IOC_SET_SOURCE_TYPE:
if (copy_from_user((void *)&sourceType,
(void *)arg,
sizeof(sourceType)))
return -EFAULT;
if (priv->mSyncIns == NULL)
return -EFAULT;
ret = mediasync_ins_set_source_type(priv->mSyncInsId,
sourceType);
break;
case MEDIASYNC_IOC_GET_SOURCE_TYPE:
if (priv->mSyncIns == NULL)
return -EFAULT;
ret = mediasync_ins_get_source_type(priv->mSyncInsId,
&sourceType);
if (ret == 0) {
if (copy_to_user((void *)arg,
&sourceType,
sizeof(sourceType)))
return -EFAULT;
}
break;
case MEDIASYNC_IOC_SET_UPDATETIME_THRESHOLD:
if (copy_from_user((void *)&UpdateTimeThreshold,
(void *)arg,
sizeof(UpdateTimeThreshold)))
return -EFAULT;
if (priv->mSyncIns == NULL)
return -EFAULT;
ret = mediasync_ins_set_updatetime_threshold(priv->mSyncInsId,
UpdateTimeThreshold);
break;
case MEDIASYNC_IOC_GET_UPDATETIME_THRESHOLD:
if (priv->mSyncIns == NULL)
return -EFAULT;
ret = mediasync_ins_get_updatetime_threshold(priv->mSyncInsId,
&UpdateTimeThreshold);
if (ret == 0) {
if (copy_to_user((void *)arg,
&UpdateTimeThreshold,
sizeof(UpdateTimeThreshold)))
return -EFAULT;
}
break;
case MEDIASYNC_IOC_SET_START_MEDIA_TIME:
if (priv->mSyncIns == NULL)
return -EFAULT;
if (copy_from_user((void *)&StartMediaTime,
(void *)arg,
sizeof(StartMediaTime)))
return -EFAULT;
ret = mediasync_ins_set_start_media_time(priv->mSyncInsId, StartMediaTime);
break;
case MEDIASYNC_IOC_GET_START_MEDIA_TIME:
if (priv->mSyncIns == NULL)
return -EFAULT;
ret = mediasync_ins_get_start_media_time(priv->mSyncInsId, &StartMediaTime);
if (ret == 0) {
if (copy_to_user((void *)arg,
&StartMediaTime,
sizeof(StartMediaTime)))
return -EFAULT;
}
break;
case MEDIASYNC_IOC_SET_AUDIO_FORMAT:
if (copy_from_user((void *)&AudioFormat,
(void *)arg,
sizeof(AudioFormat)))
return -EFAULT;
if (priv->mSyncIns == NULL)
return -EFAULT;
ret = mediasync_ins_set_audioformat(priv->mSyncInsId,
AudioFormat);
break;
case MEDIASYNC_IOC_GET_AUDIO_FORMAT:
if (priv->mSyncIns == NULL)
return -EFAULT;
ret = mediasync_ins_get_audioformat(priv->mSyncInsId,
&AudioFormat);
if (ret == 0) {
if (copy_to_user((void *)arg,
&AudioFormat,
sizeof(AudioFormat)))
return -EFAULT;
}
break;
case MEDIASYNC_IOC_SET_PAUSERESUME_FLAG:
if (copy_from_user((void *)&PauseResumeFlag,
(void *)arg,
sizeof(PauseResumeFlag)))
return -EFAULT;
if (priv->mSyncIns == NULL)
return -EFAULT;
ret = mediasync_ins_set_pauseresume(priv->mSyncInsId,
PauseResumeFlag);
break;
case MEDIASYNC_IOC_GET_PAUSERESUME_FLAG:
if (priv->mSyncIns == NULL)
return -EFAULT;
ret = mediasync_ins_get_pauseresume(priv->mSyncInsId,
&PauseResumeFlag);
if (ret == 0) {
if (copy_to_user((void *)arg,
&PauseResumeFlag,
sizeof(PauseResumeFlag)))
return -EFAULT;
}
break;
case MEDIASYNC_IOC_SET_PCRSLOPE:
if (copy_from_user((void *)&PcrSlope,
(void *)arg,
sizeof(PcrSlope)))
return -EFAULT;
if (priv->mSyncIns == NULL)
return -EFAULT;
ret = mediasync_ins_set_pcrslope(priv->mSyncInsId,
PcrSlope);
break;
case MEDIASYNC_IOC_GET_PCRSLOPE:
if (priv->mSyncIns == NULL)
return -EFAULT;
ret = mediasync_ins_get_pcrslope(priv->mSyncInsId,
&PcrSlope);
if (ret == 0) {
if (copy_to_user((void *)arg,
&PcrSlope,
sizeof(PcrSlope)))
return -EFAULT;
}
break;
default:
pr_info("invalid cmd:%d\n", cmd);
break;
}
return ret;
}
#ifdef CONFIG_COMPAT
static long mediasync_compat_ioctl(struct file *file, unsigned int cmd, ulong arg)
{
long ret = 0;
switch (cmd) {
case MEDIASYNC_IOC_INSTANCE_ALLOC:
case MEDIASYNC_IOC_INSTANCE_GET:
case MEDIASYNC_IOC_INSTANCE_BINDER:
case MEDIASYNC_IOC_UPDATE_MEDIATIME:
case MEDIASYNC_IOC_GET_MEDIATIME:
case MEDIASYNC_IOC_GET_SYSTEMTIME:
case MEDIASYNC_IOC_GET_NEXTVSYNC_TIME:
case MEDIASYNC_IOC_SET_SPEED:
case MEDIASYNC_IOC_GET_SPEED:
case MEDIASYNC_IOC_SET_PAUSE:
case MEDIASYNC_IOC_GET_PAUSE:
case MEDIASYNC_IOC_SET_SYNCMODE:
case MEDIASYNC_IOC_GET_SYNCMODE:
case MEDIASYNC_IOC_GET_TRACKMEDIATIME:
case MEDIASYNC_IOC_SET_FIRST_AFRAME_INFO:
case MEDIASYNC_IOC_GET_FIRST_AFRAME_INFO:
case MEDIASYNC_IOC_SET_FIRST_VFRAME_INFO:
case MEDIASYNC_IOC_GET_FIRST_VFRAME_INFO:
case MEDIASYNC_IOC_SET_FIRST_DMXPCR_INFO:
case MEDIASYNC_IOC_GET_FIRST_DMXPCR_INFO:
case MEDIASYNC_IOC_SET_REFCLOCK_INFO:
case MEDIASYNC_IOC_GET_REFCLOCK_INFO:
case MEDIASYNC_IOC_SET_CUR_AFRAME_INFO:
case MEDIASYNC_IOC_GET_CUR_AFRAME_INFO:
case MEDIASYNC_IOC_SET_CUR_VFRAME_INFO:
case MEDIASYNC_IOC_GET_CUR_VFRAME_INFO:
case MEDIASYNC_IOC_SET_CUR_DMXPCR_INFO:
case MEDIASYNC_IOC_GET_CUR_DMXPCR_INFO:
case MEDIASYNC_IOC_SET_AUDIO_INFO:
case MEDIASYNC_IOC_GET_AUDIO_INFO:
case MEDIASYNC_IOC_SET_VIDEO_INFO:
case MEDIASYNC_IOC_GET_VIDEO_INFO:
case MEDIASYNC_IOC_SET_AVSTATE:
case MEDIASYNC_IOC_GET_AVSTATE:
case MEDIASYNC_IOC_SET_HASAUDIO:
case MEDIASYNC_IOC_GET_HASAUDIO:
case MEDIASYNC_IOC_SET_HASVIDEO:
case MEDIASYNC_IOC_GET_HASVIDEO:
case MEDIASYNC_IOC_GET_CLOCKTYPE:
case MEDIASYNC_IOC_SET_CLOCKTYPE:
case MEDIASYNC_IOC_GET_CLOCKSTATE:
case MEDIASYNC_IOC_SET_CLOCKSTATE:
case MEDIASYNC_IOC_SET_STARTTHRESHOLD:
case MEDIASYNC_IOC_GET_STARTTHRESHOLD:
case MEDIASYNC_IOC_SET_PTSADJUST:
case MEDIASYNC_IOC_GET_PTSADJUST:
case MEDIASYNC_IOC_SET_VIDEOWORKMODE:
case MEDIASYNC_IOC_GET_VIDEOWORKMODE:
case MEDIASYNC_IOC_SET_FCCENABLE:
case MEDIASYNC_IOC_GET_FCCENABLE:
case MEDIASYNC_IOC_SET_AUDIO_MUTEFLAG:
case MEDIASYNC_IOC_GET_AUDIO_MUTEFLAG:
case MEDIASYNC_IOC_SET_SOURCE_TYPE:
case MEDIASYNC_IOC_GET_SOURCE_TYPE:
case MEDIASYNC_IOC_SET_UPDATETIME_THRESHOLD:
case MEDIASYNC_IOC_GET_UPDATETIME_THRESHOLD:
case MEDIASYNC_IOC_SET_START_MEDIA_TIME:
case MEDIASYNC_IOC_GET_START_MEDIA_TIME:
case MEDIASYNC_IOC_SET_AUDIO_FORMAT:
case MEDIASYNC_IOC_GET_AUDIO_FORMAT:
case MEDIASYNC_IOC_SET_PAUSERESUME_FLAG:
case MEDIASYNC_IOC_GET_PAUSERESUME_FLAG:
case MEDIASYNC_IOC_SET_PCRSLOPE:
case MEDIASYNC_IOC_GET_PCRSLOPE:
return mediasync_ioctl(file, cmd, arg);
default:
return -EINVAL;
}
return ret;
}
#endif
static const struct file_operations mediasync_fops = {
.owner = THIS_MODULE,
.open = mediasync_open,
.release = mediasync_release,
.unlocked_ioctl = mediasync_ioctl,
#ifdef CONFIG_COMPAT
.compat_ioctl = mediasync_compat_ioctl,
#endif
};
static struct attribute *mediasync_class_attrs[] = {
NULL
};
ATTRIBUTE_GROUPS(mediasync_class);
static struct class mediasync_class = {
.name = "mediasync",
.class_groups = mediasync_class_groups,
};
static int __init mediasync_module_init(void)
{
int r;
r = class_register(&mediasync_class);
if (r) {
pr_err("mediasync class create fail.\n");
return r;
}
/* create tsync device */
r = register_chrdev(MEDIASYNC_MAJOR, "mediasync", &mediasync_fops);
if (r < 0) {
pr_info("Can't register major for tsync\n");
goto err2;
}
mediasync_dev = device_create(&mediasync_class, NULL,
MKDEV(MEDIASYNC_MAJOR, 0), NULL, MEDIASYNC_DEVICE_NAME);
if (IS_ERR(mediasync_dev)) {
pr_err("Can't create mediasync_dev device\n");
goto err1;
}
return 0;
err1:
unregister_chrdev(MEDIASYNC_MAJOR, "mediasync");
err2:
class_unregister(&mediasync_class);
return 0;
}
static void __exit mediasync_module_exit(void)
{
device_destroy(&mediasync_class, MKDEV(MEDIASYNC_MAJOR, 0));
unregister_chrdev(MEDIASYNC_MAJOR, "mediasync");
class_unregister(&mediasync_class);
}
module_init(mediasync_module_init);
module_exit(mediasync_module_exit);
MODULE_DESCRIPTION("AMLOGIC media sync management driver");
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Lifeng Cao <lifeng.cao@amlogic.com>");