summaryrefslogtreecommitdiff
Diffstat
-rw-r--r--[-rwxr-xr-x]Media.mk1
-rw-r--r--drivers/amvdec_ports/Makefile1
-rw-r--r--drivers/amvdec_ports/aml_vcodec_adapt.c112
-rw-r--r--drivers/amvdec_ports/aml_vcodec_adapt.h5
-rw-r--r--drivers/amvdec_ports/aml_vcodec_dec.c992
-rw-r--r--drivers/amvdec_ports/aml_vcodec_dec.h2
-rw-r--r--drivers/amvdec_ports/aml_vcodec_dec_drv.c122
-rw-r--r--drivers/amvdec_ports/aml_vcodec_dec_pm.c206
-rw-r--r--drivers/amvdec_ports/aml_vcodec_dec_pm.h34
-rw-r--r--drivers/amvdec_ports/aml_vcodec_drv.h188
-rw-r--r--drivers/amvdec_ports/aml_vcodec_util.c34
-rw-r--r--drivers/amvdec_ports/aml_vcodec_util.h90
-rw-r--r--drivers/amvdec_ports/aml_vcodec_vfm.c28
-rw-r--r--drivers/amvdec_ports/decoder/aml_h264_parser.c81
-rw-r--r--drivers/amvdec_ports/decoder/aml_h264_parser.h1
-rw-r--r--drivers/amvdec_ports/decoder/aml_hevc_parser.c133
-rw-r--r--drivers/amvdec_ports/decoder/aml_hevc_parser.h1
-rw-r--r--drivers/amvdec_ports/decoder/aml_mjpeg_parser.c34
-rw-r--r--drivers/amvdec_ports/decoder/aml_mjpeg_parser.h1
-rw-r--r--drivers/amvdec_ports/decoder/aml_mpeg12_parser.h1
-rw-r--r--drivers/amvdec_ports/decoder/aml_mpeg4_parser.c178
-rw-r--r--drivers/amvdec_ports/decoder/aml_mpeg4_parser.h1
-rw-r--r--drivers/amvdec_ports/decoder/aml_vp9_parser.c26
-rw-r--r--drivers/amvdec_ports/decoder/aml_vp9_parser.h1
-rw-r--r--drivers/amvdec_ports/decoder/vdec_h264_if.c223
-rw-r--r--drivers/amvdec_ports/decoder/vdec_hevc_if.c194
-rw-r--r--drivers/amvdec_ports/decoder/vdec_mjpeg_if.c210
-rw-r--r--drivers/amvdec_ports/decoder/vdec_mpeg12_if.c304
-rw-r--r--drivers/amvdec_ports/decoder/vdec_mpeg4_if.c209
-rw-r--r--drivers/amvdec_ports/decoder/vdec_vp9_if.c195
-rw-r--r--drivers/amvdec_ports/vdec_drv_if.c6
-rw-r--r--drivers/amvdec_ports/vdec_drv_if.h21
-rw-r--r--drivers/common/chips/chips.c1
-rw-r--r--drivers/common/chips/decoder_cpu_ver_info.c8
-rw-r--r--drivers/common/chips/decoder_cpu_ver_info.h1
-rw-r--r--drivers/common/firmware/firmware_drv.c9
-rw-r--r--drivers/common/firmware/firmware_type.c1
-rw-r--r--drivers/common/firmware/firmware_type.h1
-rw-r--r--drivers/common/media_clock/clk/clk.c3
-rw-r--r--drivers/common/media_clock/clk/clkg12.c5
-rw-r--r--drivers/frame_provider/decoder/Makefile1
-rw-r--r--drivers/frame_provider/decoder/avs/avs.c60
-rw-r--r--drivers/frame_provider/decoder/avs2/avs2_bufmgr.c12
-rw-r--r--drivers/frame_provider/decoder/avs2/avs2_global.h3
-rw-r--r--drivers/frame_provider/decoder/avs2/vavs2.c115
-rw-r--r--drivers/frame_provider/decoder/avs_multi/Makefile2
-rw-r--r--drivers/frame_provider/decoder/avs_multi/avs_multi.c1633
-rw-r--r--drivers/frame_provider/decoder/avs_multi/avsp_trans_multi.c5065
-rw-r--r--drivers/frame_provider/decoder/h264/vh264.c58
-rw-r--r--drivers/frame_provider/decoder/h264_multi/h264_dpb.c50
-rw-r--r--drivers/frame_provider/decoder/h264_multi/h264_dpb.h34
-rw-r--r--drivers/frame_provider/decoder/h264_multi/vmh264.c1043
-rw-r--r--drivers/frame_provider/decoder/h265/vh265.c707
-rw-r--r--drivers/frame_provider/decoder/mjpeg/vmjpeg_multi.c60
-rw-r--r--drivers/frame_provider/decoder/mpeg12/vmpeg12_multi.c595
-rw-r--r--drivers/frame_provider/decoder/mpeg4/vmpeg4.c5
-rw-r--r--drivers/frame_provider/decoder/mpeg4/vmpeg4_multi.c80
-rw-r--r--drivers/frame_provider/decoder/utils/amvdec.c5
-rw-r--r--drivers/frame_provider/decoder/utils/frame_check.c178
-rw-r--r--drivers/frame_provider/decoder/utils/frame_check.h4
-rw-r--r--drivers/frame_provider/decoder/utils/vdec.c530
-rw-r--r--drivers/frame_provider/decoder/utils/vdec.h18
-rw-r--r--drivers/frame_provider/decoder/utils/vdec_input.c12
-rw-r--r--drivers/frame_provider/decoder/utils/vdec_input.h3
-rw-r--r--drivers/frame_provider/decoder/utils/vdec_v4l2_buffer_ops.c92
-rw-r--r--drivers/frame_provider/decoder/utils/vdec_v4l2_buffer_ops.h7
-rw-r--r--drivers/frame_provider/decoder/vav1/Makefile2
-rw-r--r--drivers/frame_provider/decoder/vav1/aom_av1_define.h171
-rw-r--r--drivers/frame_provider/decoder/vav1/av1_bufmgr.c3392
-rw-r--r--drivers/frame_provider/decoder/vav1/av1_global.h2310
-rw-r--r--drivers/frame_provider/decoder/vav1/vav1.c9946
-rw-r--r--drivers/frame_provider/decoder/vav1/vav1.h22
-rw-r--r--drivers/frame_provider/decoder/vc1/vvc1.c46
-rw-r--r--drivers/frame_provider/decoder/vp9/vvp9.c449
-rw-r--r--drivers/frame_sink/encoder/h264/encoder.c2
-rw-r--r--drivers/stream_input/Makefile5
-rw-r--r--drivers/stream_input/amports/amstream.c263
-rw-r--r--drivers/stream_input/parser/demux/aml_dvb.h5
-rw-r--r--drivers/stream_input/parser/demux/hw_demux/demod_gt.h62
-rw-r--r--drivers/stream_input/parser/demux/hw_demux/frontend.c293
-rw-r--r--drivers/stream_input/parser/dvb_common.c17
-rw-r--r--drivers/stream_input/parser/dvb_common.h26
-rw-r--r--drivers/stream_input/parser/esparser.c15
-rw-r--r--drivers/stream_input/parser/hw_demux/aml_demod_gt.h87
-rw-r--r--drivers/stream_input/parser/hw_demux/aml_dmx.c270
-rw-r--r--drivers/stream_input/parser/hw_demux/aml_dvb.c445
-rw-r--r--drivers/stream_input/parser/hw_demux/aml_dvb.h32
-rw-r--r--drivers/stream_input/parser/streambuf.c9
-rw-r--r--drivers/stream_input/parser/tsdemux.c14
-rw-r--r--drivers/stream_input/parser/tsdemux.h1
-rw-r--r--drivers/stream_input/tv_frontend/Makefile16
-rw-r--r--drivers/stream_input/tv_frontend/aml_fe.c1372
-rw-r--r--drivers/stream_input/tv_frontend/aml_fe.h213
-rw-r--r--drivers/stream_input/tv_frontend/atv_demod/atvdemod_frontend.c791
-rw-r--r--drivers/stream_input/tv_frontend/atv_demod/atvdemod_func.c2163
-rw-r--r--drivers/stream_input/tv_frontend/atv_demod/atvdemod_func.h323
-rw-r--r--drivers/stream_input/tv_frontend/dtv_demod/aml_demod.c725
-rw-r--r--drivers/stream_input/tv_frontend/dtv_demod/amlfrontend.c1402
-rw-r--r--drivers/stream_input/tv_frontend/dtv_demod/demod_func.c2996
-rw-r--r--drivers/stream_input/tv_frontend/dtv_demod/dvbc_func.c1331
-rw-r--r--drivers/stream_input/tv_frontend/dtv_demod/dvbt_func.c2188
-rw-r--r--drivers/stream_input/tv_frontend/dtv_demod/i2c_func.c42
-rw-r--r--drivers/stream_input/tv_frontend/dtv_demod/include/acf_filter_coefficient.h414
-rw-r--r--drivers/stream_input/tv_frontend/dtv_demod/include/addr_dtmb_che.h77
-rw-r--r--drivers/stream_input/tv_frontend/dtv_demod/include/addr_dtmb_che_bit.h266
-rw-r--r--drivers/stream_input/tv_frontend/dtv_demod/include/addr_dtmb_front.h70
-rw-r--r--drivers/stream_input/tv_frontend/dtv_demod/include/addr_dtmb_front_bit.h331
-rw-r--r--drivers/stream_input/tv_frontend/dtv_demod/include/addr_dtmb_sync.h53
-rw-r--r--drivers/stream_input/tv_frontend/dtv_demod/include/addr_dtmb_sync_bit.h110
-rw-r--r--drivers/stream_input/tv_frontend/dtv_demod/include/addr_dtmb_top.h90
-rw-r--r--drivers/stream_input/tv_frontend/dtv_demod/include/addr_dtmb_top_bit.h178
-rw-r--r--drivers/stream_input/tv_frontend/dtv_demod/include/aml_dtv_demod_reg.h28
-rw-r--r--drivers/stream_input/tv_frontend/dtv_demod/include/amlfrontend.h86
-rw-r--r--drivers/stream_input/tv_frontend/dtv_demod/include/demod_func.h626
-rw-r--r--drivers/stream_input/tv_frontend/dtv_demod/tuner_func.c189
-rw-r--r--firmware/video_ucode.bin14148
116 files changed, 25845 insertions, 36303 deletions
diff --git a/drivers/stream_input/tv_frontend/atv_demod/atvdemod_frontend.c b/drivers/stream_input/tv_frontend/atv_demod/atvdemod_frontend.c
deleted file mode 100644
index 964bc42..0000000
--- a/drivers/stream_input/tv_frontend/atv_demod/atvdemod_frontend.c
+++ b/dev/null
@@ -1,791 +0,0 @@
-/*
- * Silicon labs atvdemod Device Driver
- *
- * Author: dezhi.kong <dezhi.kong@amlogic.com>
- *
- *
- * Copyright (C) 2014 Amlogic Inc.
- *
- * 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.
- */
-
-/* Standard Liniux Headers */
-#include <linux/init.h>
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/i2c.h>
-#include <linux/delay.h>
-#include <linux/slab.h>
-#include <linux/err.h>
-#include <linux/delay.h>
-#include <linux/jiffies.h>
-#include <linux/platform_device.h>
-#include <linux/io.h>
-
-/* Amlogic Headers */
-
-/* Local Headers */
-#include "atvdemod_func.h"
-#include "../aml_fe.h"
-#include <uapi/linux/dvb/frontend.h>
-#include <linux/amlogic/tvin/tvin.h>
-
-#define ATVDEMOD_DEVICE_NAME "amlatvdemod"
-#define ATVDEMOD_DRIVER_NAME "amlatvdemod"
-#define ATVDEMOD_MODULE_NAME "amlatvdemod"
-#define ATVDEMOD_CLASS_NAME "amlatvdemod"
-
-struct amlatvdemod_device_s *amlatvdemod_devp;
-#define AMLATVDEMOD_VER "Ref.2015/09/01a"
-
-static int afc_wave_cnt;
-static int last_frq, last_std;
-
-unsigned int reg_23cf = 0x88188832; /*IIR filter*/
-module_param(reg_23cf, uint, 0664);
-MODULE_PARM_DESC(reg_23cf, "\n reg_23cf\n");
-
-unsigned int atvdemod_scan_mode; /*IIR filter*/
-module_param(atvdemod_scan_mode, uint, 0664);
-MODULE_PARM_DESC(atvdemod_scan_mode, "\n atvdemod_scan_mode\n");
-
-/* used for resume */
-#define ATVDEMOD_STATE_IDEL 0
-#define ATVDEMOD_STATE_WORK 1
-#define ATVDEMOD_STATE_SLEEP 2
-static int atvdemod_state = ATVDEMOD_STATE_IDEL;
-
-int is_atvdemod_scan_mode(void)
-{
- return atvdemod_scan_mode;
-}
-EXPORT_SYMBOL(is_atvdemod_scan_mode);
-
-static int aml_atvdemod_enter_mode(struct aml_fe *fe, int mode);
-/*static void sound_store(const char *buff, v4l2_std_id *std);*/
-static ssize_t aml_atvdemod_store(struct class *cls,
- struct class_attribute *attr, const char *buf,
- size_t count)
-{
- int n = 0;
- unsigned int ret = 0;
- char *buf_orig, *ps, *token;
- char *parm[4];
- unsigned int data_snr[128];
- unsigned int data_snr_avg;
- int data_afc, block_addr, block_reg, block_val = 0;
- int i, val = 0;
- unsigned long tmp = 0;
- struct aml_fe *atvdemod_fe = NULL;
-
- buf_orig = kstrdup(buf, GFP_KERNEL);
- ps = buf_orig;
- block_addr = 0;
- block_reg = 0;
- while (1) {
- token = strsep(&ps, "\n");
- if (token == NULL)
- break;
- if (*token == '\0')
- continue;
- parm[n++] = token;
- }
- if (!strncmp(parm[0], "init", strlen("init"))) {
- ret = aml_atvdemod_enter_mode(atvdemod_fe, 0);
- if (ret)
- pr_info("[tuner..] atv_restart error.\n");
- } else if (!strcmp(parm[0], "tune")) {
- /* val = simple_strtol(parm[1], NULL, 10); */
- } else if (!strcmp(parm[0], "set")) {
- if (!strncmp(parm[1], "avout_gain", strlen("avout_gain"))) {
- if (kstrtoul(buf+strlen("avout_offset")+1, 10,
- &tmp) == 0)
- val = tmp;
- atv_dmd_wr_byte(0x0c, 0x01, val&0xff);
- } else if (!strncmp(parm[1], "avout_offset",
- strlen("avout_offset"))) {
- if (kstrtoul(buf+strlen("avout_offset")+1, 10,
- &tmp) == 0)
- val = tmp;
- atv_dmd_wr_byte(0x0c, 0x04, val&0xff);
- } else if (!strncmp(parm[1], "atv_gain", strlen("atv_gain"))) {
- if (kstrtoul(buf+strlen("atv_gain")+1, 10, &tmp) == 0)
- val = tmp;
- atv_dmd_wr_byte(0x19, 0x01, val&0xff);
- } else if (!strncmp(parm[1], "atv_offset",
- strlen("atv_offset"))) {
- if (kstrtoul(buf+strlen("atv_offset")+1, 10,
- &tmp) == 0)
- val = tmp;
- atv_dmd_wr_byte(0x19, 0x04, val&0xff);
- }
- } else if (!strcmp(parm[0], "get")) {
- if (!strncmp(parm[1], "avout_gain", strlen("avout_gain"))) {
- val = atv_dmd_rd_byte(0x0c, 0x01);
- pr_dbg("avout_gain:0x%x\n", val);
- } else if (!strncmp(parm[1], "avout_offset",
- strlen("avout_offset"))) {
- val = atv_dmd_rd_byte(0x0c, 0x04);
- pr_dbg("avout_offset:0x%x\n", val);
- } else if (!strncmp(parm[1], "atv_gain", strlen("atv_gain"))) {
- val = atv_dmd_rd_byte(0x19, 0x01);
- pr_dbg("atv_gain:0x%x\n", val);
- } else if (!strncmp(parm[1], "atv_offset",
- strlen("atv_offset"))) {
- val = atv_dmd_rd_byte(0x19, 0x04);
- pr_dbg("atv_offset:0x%x\n", val);
- }
- } else if (!strncmp(parm[0], "snr_hist", strlen("snr_hist"))) {
- data_snr_avg = 0;
- for (i = 0; i < 128; i++) {
- data_snr[i] =
- (atv_dmd_rd_long(APB_BLOCK_ADDR_VDAGC, 0x50) >> 8);
- usleep_range(50*1000, 50*1000+100);
- data_snr_avg += data_snr[i];
- }
- data_snr_avg = data_snr_avg / 128;
- pr_dbg("**********snr_hist_128avg:0x%x(%d)*********\n",
- data_snr_avg, data_snr_avg);
- } else if (!strncmp(parm[0], "afc_info", strlen("afc_info"))) {
- data_afc = retrieve_vpll_carrier_afc();
- pr_dbg("[amlatvdemod..]afc %d Khz.\n", data_afc);
- } else if (!strncmp(parm[0], "ver_info", strlen("ver_info"))) {
- pr_dbg("[amlatvdemod..]aml_atvdemod_ver %s.\n",
- AMLATVDEMOD_VER);
- } else if (!strncmp(parm[0], "audio_autodet",
- strlen("audio_autodet"))) {
- aml_audiomode_autodet(NULL);
- } else if (!strncmp(parm[0], "overmodule_det",
- strlen("overmodule_det"))) {
- /* unsigned long over_threshold, */
- /* int det_mode = auto_det_mode; */
- aml_atvdemod_overmodule_det();
- } else if (!strncmp(parm[0], "audio_gain_set",
- strlen("audio_gain_set"))) {
- if (kstrtoul(buf+strlen("audio_gain_set")+1, 16, &tmp) == 0)
- val = tmp;
- aml_audio_valume_gain_set(val);
- pr_dbg("audio_gain_set : %d\n", val);
- } else if (!strncmp(parm[0], "audio_gain_get",
- strlen("audio_gain_get"))) {
- val = aml_audio_valume_gain_get();
- pr_dbg("audio_gain_get : %d\n", val);
- } else if (!strncmp(parm[0], "fix_pwm_adj", strlen("fix_pwm_adj"))) {
- if (kstrtoul(parm[1], 10, &tmp) == 0) {
- val = tmp;
- aml_fix_PWM_adjust(val);
- }
- } else if (!strncmp(parm[0], "rs", strlen("rs"))) {
- if (kstrtoul(parm[1], 16, &tmp) == 0)
- block_addr = tmp;
- if (kstrtoul(parm[2], 16, &tmp) == 0)
- block_reg = tmp;
- if (block_addr < APB_BLOCK_ADDR_TOP)
- block_val = atv_dmd_rd_long(block_addr, block_reg);
- pr_info("rs block_addr:0x%x,block_reg:0x%x,block_val:0x%x\n",
- block_addr, block_reg, block_val);
- } else if (!strncmp(parm[0], "ws", strlen("ws"))) {
- if (kstrtoul(parm[1], 16, &tmp) == 0)
- block_addr = tmp;
- if (kstrtoul(parm[2], 16, &tmp) == 0)
- block_reg = tmp;
- if (kstrtoul(parm[3], 16, &tmp) == 0)
- block_val = tmp;
- if (block_addr < APB_BLOCK_ADDR_TOP)
- atv_dmd_wr_long(block_addr, block_reg, block_val);
- pr_info("ws block_addr:0x%x,block_reg:0x%x,block_val:0x%x\n",
- block_addr, block_reg, block_val);
- block_val = atv_dmd_rd_long(block_addr, block_reg);
- pr_info("readback_val:0x%x\n", block_val);
- } else if (!strncmp(parm[0], "pin_mux", strlen("pin_mux"))) {
- amlatvdemod_devp->pin =
- devm_pinctrl_get_select(amlatvdemod_devp->dev,
- amlatvdemod_devp->pin_name);
- pr_dbg("atvdemod agc pinmux name:%s\n",
- amlatvdemod_devp->pin_name);
- } else if (!strncmp(parm[0], "snr_cur", strlen("snr_cur"))) {
- data_snr_avg = aml_atvdemod_get_snr_ex();
- pr_dbg("**********snr_cur:%d*********\n", data_snr_avg);
- } else
- pr_dbg("invalid command\n");
- kfree(buf_orig);
- return count;
-}
-
-static ssize_t aml_atvdemod_show(struct class *cls,
- struct class_attribute *attr, char *buff)
-{
- pr_dbg("\n usage:\n");
- pr_dbg("[get soft version] echo ver_info > /sys/class/amlatvdemod/atvdemod_debug\n");
- pr_dbg("[get afc value] echo afc_info > /sys/class/amlatvdemod/atvdemod_debug\n");
- pr_dbg("[reinit atvdemod] echo init > /sys/class/amlatvdemod/atvdemod_debug\n");
- pr_dbg("[get av-out-gain/av-out-offset/atv-gain/atv-offset]:\n"
- "echo get av_gain/av_offset/atv_gain/atv_offset > /sys/class/amlatvdemod/atvdemod_debug\n");
- pr_dbg("[set av-out-gain/av-out-offset/atv-gain/atv-offset]:\n"
- "echo set av_gain/av_offset/atv_gain/atv_offset val(0~255) > /sys/class/amlatvdemod/atvdemod_debug\n");
- return 0;
-}
-static CLASS_ATTR(atvdemod_debug, 0644, aml_atvdemod_show, aml_atvdemod_store);
-
-void aml_atvdemod_set_frequency(unsigned int freq)
-{
-}
-
-/*static void aml_atvdemod_set_std(void);*/
-
-/*try audmode B,CH,I,DK,return the sound level*/
-/*static unsigned char set_video_audio_mode(unsigned char color,
- *unsigned char audmode);
- */
-/*static void aml_atvdemod_get_status(struct dvb_frontend *fe,
- *void *stat);
- */
-/*static void aaaml_atvdemod_get_pll_status(struct dvb_frontend *fe,
- *void *stat);
- */
-
-static int aml_atvdemod_fe_init(struct aml_fe_dev *dev)
-{
-
- int error_code = 0;
-
- if (!dev) {
- pr_dbg("[amlatvdemod..]%s: null pointer error.\n", __func__);
- return -1;
- }
- return error_code;
-}
-
-static int aml_atvdemod_enter_mode(struct aml_fe *fe, int mode)
-{
- int err_code;
-
- if (amlatvdemod_devp->pin_name != NULL)
- amlatvdemod_devp->pin =
- devm_pinctrl_get_select(amlatvdemod_devp->dev,
- amlatvdemod_devp->pin_name);
- /* printk("\n%s: set atvdemod pll...\n",__func__); */
- adc_set_pll_cntl(1, 0x1);
- atvdemod_clk_init();
- err_code = atvdemod_init();
- if (err_code) {
- pr_dbg("[amlatvdemod..]%s init atvdemod error.\n", __func__);
- return err_code;
- }
-
- set_aft_thread_enable(1);
- atvdemod_state = ATVDEMOD_STATE_WORK;
- return 0;
-}
-
-static int aml_atvdemod_leave_mode(struct aml_fe *fe, int mode)
-{
- set_aft_thread_enable(0);
- atvdemod_uninit();
- if (amlatvdemod_devp->pin != NULL) {
- devm_pinctrl_put(amlatvdemod_devp->pin);
- amlatvdemod_devp->pin = NULL;
- }
- /* reset adc pll flag */
- /* printk("\n%s: init atvdemod flag...\n",__func__); */
- adc_set_pll_cntl(0, 0x1);
- atvdemod_state = ATVDEMOD_STATE_IDEL;
- return 0;
-}
-
-static int aml_atvdemod_suspend(struct aml_fe_dev *dev)
-{
- pr_info("%s\n", __func__);
- if (atvdemod_state != ATVDEMOD_STATE_IDEL) {
- aml_atvdemod_leave_mode(NULL, 0);
- atvdemod_state = ATVDEMOD_STATE_SLEEP;
- }
- return 0;
-}
-
-static int aml_atvdemod_resume(struct aml_fe_dev *dev)
-{
- pr_info("%s\n", __func__);
- if (atvdemod_state == ATVDEMOD_STATE_SLEEP)
- aml_atvdemod_enter_mode(NULL, 0);
- return 0;
-}
-
-/*
- *static int aml_atvdemod_get_afc(struct dvb_frontend *fe,int *afc)
- *{
- * return 0;
- *}
- */
-
-/*ret:5~100;the val is bigger,the signal is better*/
-int aml_atvdemod_get_snr(struct dvb_frontend *fe)
-{
-#if 1
- return get_atvdemod_snr_val();
-#else
- unsigned int snr_val;
- int ret;
-
- snr_val = atv_dmd_rd_long(APB_BLOCK_ADDR_VDAGC, 0x50) >> 8;
- /* snr_val:900000~0xffffff,ret:5~15 */
- if (snr_val > 900000)
- ret = 15 - (snr_val - 900000)*10/(0xffffff - 900000);
- /* snr_val:158000~900000,ret:15~30 */
- else if (snr_val > 158000)
- ret = 30 - (snr_val - 158000)*15/(900000 - 158000);
- /* snr_val:31600~158000,ret:30~50 */
- else if (snr_val > 31600)
- ret = 50 - (snr_val - 31600)*20/(158000 - 31600);
- /* snr_val:316~31600,ret:50~80 */
- else if (snr_val > 316)
- ret = 80 - (snr_val - 316)*30/(31600 - 316);
- /* snr_val:0~316,ret:80~100 */
- else
- ret = 100 - (316 - snr_val)*20/316;
- return ret;
-#endif
-}
-EXPORT_SYMBOL(aml_atvdemod_get_snr);
-
-int aml_atvdemod_get_snr_ex(void)
-{
-#if 1
- return get_atvdemod_snr_val();
-#else
- unsigned int snr_val;
- int ret;
-
- snr_val = atv_dmd_rd_long(APB_BLOCK_ADDR_VDAGC, 0x50) >> 8;
- /* snr_val:900000~0xffffff,ret:5~15 */
- if (snr_val > 900000)
- ret = 15 - (snr_val - 900000)*10/(0xffffff - 900000);
- /* snr_val:158000~900000,ret:15~30 */
- else if (snr_val > 158000)
- ret = 30 - (snr_val - 158000)*15/(900000 - 158000);
- /* snr_val:31600~158000,ret:30~50 */
- else if (snr_val > 31600)
- ret = 50 - (snr_val - 31600)*20/(158000 - 31600);
- /* snr_val:316~31600,ret:50~80 */
- else if (snr_val > 316)
- ret = 80 - (snr_val - 316)*30/(31600 - 316);
- /* snr_val:0~316,ret:80~100 */
- else
- ret = 100 - (316 - snr_val)*20/316;
- return ret;
-#endif
-}
-EXPORT_SYMBOL(aml_atvdemod_get_snr_ex);
-
-/*tuner lock status & demod lock status should be same in silicon tuner*/
-static int aml_atvdemod_get_status(struct dvb_frontend *fe, void *stat)
-{
- int video_lock;
- fe_status_t *status = (fe_status_t *) stat;
-
- retrieve_video_lock(&video_lock);
- if ((video_lock & 0x1) == 0) {
- /* *status = FE_HAS_LOCK;*/
- *status = FE_TIMEDOUT;
- pr_info("video lock:locked\n");
- } else {
- pr_info("video lock:unlocked\n");
- *status = FE_TIMEDOUT;
- /* *status = FE_HAS_LOCK;*/
- }
- return 0;
-}
-
-/*tuner lock status & demod lock status should be same in silicon tuner*/
-/* force return lock, for atvdemo status not sure */
-static void aml_atvdemod_get_pll_status(struct dvb_frontend *fe, void *stat)
-{
- int vpll_lock;
- fe_status_t *status = (fe_status_t *) stat;
-
- retrieve_vpll_carrier_lock(&vpll_lock);
- if ((vpll_lock&0x1) == 0) {
- *status = FE_HAS_LOCK;
- pr_info("visual carrier lock:locked\n");
- } else {
- pr_info("visual carrier lock:unlocked\n");
- *status = FE_TIMEDOUT;
- /* *status = FE_HAS_LOCK;*/
- }
-}
-
-static int aml_atvdemod_get_atv_status(struct dvb_frontend *fe,
- struct atv_status_s *atv_status)
-{
- int vpll_lock = 0, line_lock = 0;
- int try_std = 1;
- int loop_cnt = 5;
- int cnt = 10;
- int try_std_cnt = 0;
- static int last_report_freq;
- struct dtv_frontend_properties *c = &fe->dtv_property_cache;
-
- while (fe && atv_status && loop_cnt--) {
- atv_status->afc = retrieve_vpll_carrier_afc();
- retrieve_vpll_carrier_lock(&vpll_lock);
- line_lock = atv_dmd_rd_byte(APB_BLOCK_ADDR_VDAGC, 0x4f)&0x10;
- if ((vpll_lock&0x1) == 0 || line_lock == 0) {
- atv_status->atv_lock = 1;
- try_std_cnt = 2;
- while (try_std_cnt--) {
- atv_status->afc = retrieve_vpll_carrier_afc();
- if (atv_status->afc > 1500
- && atvdemod_scan_mode) {
- if ((c->analog.std & 0xff000000)
- != V4L2_COLOR_STD_PAL) {
- c->analog.std =
- V4L2_COLOR_STD_PAL
- | V4L2_STD_PAL_BG;
- c->frequency += 1;
- fe->ops.set_frontend(fe);
- msleep(20);
- } else {
- c->analog.std =
- V4L2_COLOR_STD_NTSC
- | V4L2_STD_NTSC_M;
- c->frequency += 1;
- fe->ops.set_frontend(fe);
- usleep_range(20*1000,
- 20*1000+100);
- }
- atv_status->afc =
- retrieve_vpll_carrier_afc();
-
- cnt = 4;
- while (cnt--) {
- if (atv_status->afc < 1500)
- break;
- atv_status->afc =
- retrieve_vpll_carrier_afc();
- usleep_range(5*1000, 5*1000+100);
- }
- if (atv_status->afc < 1500)
- break;
- }
- }
-
- if (atv_status->afc > 4000 && !atvdemod_scan_mode)
- atv_status->atv_lock = 0;
-
- if (last_report_freq != c->frequency)
- last_report_freq = c->frequency;
-
- if (atvdemod_scan_mode)
- pr_err("%s,lock freq:%d, afc:%d\n", __func__,
- c->frequency, atv_status->afc);
- break;
-
- } else if (try_std%3 == 0 && atvdemod_scan_mode) {
- if ((c->analog.std & 0xff000000)
- != V4L2_COLOR_STD_PAL) {
- c->analog.std =
- V4L2_COLOR_STD_PAL | V4L2_STD_PAL_DK;
- }
- if (abs(c->frequency - last_report_freq) > 1000000) {
- c->frequency -= 500000;
- pr_err("@@@ %s freq:%d unlock,try back 0.5M\n",
- __func__, c->frequency);
- } else
- c->frequency += 1;
- fe->ops.set_frontend(fe);
- usleep_range(10*1000, 10*1000+100);
- }
- if (atvdemod_scan_mode)
- pr_err("@@@ %s freq:%d unlock, read lock again\n",
- __func__, c->frequency);
- if (atvdemod_scan_mode == 0)
- usleep_range(10*1000, 10*1000+100);
- else
- usleep_range(1000, 1200);
-
- atv_status->atv_lock = 0;
- try_std++;
- }
- if (atvdemod_scan_mode == 0) {
- if (abs(atv_status->afc) < 20)
- afc_wave_cnt = 0;
- if (500*1000 > abs(last_frq - c->frequency)
- && 20 < abs(atv_status->afc)
- && 200 > abs(atv_status->afc)) {
- afc_wave_cnt++;
- pr_err("%s play mode,afc_wave_cnt:%d\n",
- __func__, afc_wave_cnt);
- if (afc_wave_cnt < 20) {
- atv_status->afc = 0;
- pr_err("%s, afc is wave,ignore\n", __func__);
- }
- }
- }
- return 0;
-}
-
-void aml_atvdemod_set_params(struct dvb_frontend *fe,
- struct analog_parameters *p)
-{
- struct dtv_frontend_properties *c = &fe->dtv_property_cache;
-
- if (fe->ops.info.type == FE_ANALOG) {
- if ((p->std != amlatvdemod_devp->parm.std) ||
- (p->tuner_id == AM_TUNER_R840) ||
- (p->tuner_id == AM_TUNER_SI2151) ||
- (p->tuner_id == AM_TUNER_MXL661)) {
- amlatvdemod_devp->parm.std = p->std;
- amlatvdemod_devp->parm.if_freq = p->if_freq;
- amlatvdemod_devp->parm.if_inv = p->if_inv;
- amlatvdemod_devp->parm.tuner_id = p->tuner_id;
- /* open AGC if needed */
- if (amlatvdemod_devp->pin != NULL)
- devm_pinctrl_put(amlatvdemod_devp->pin);
- if (amlatvdemod_devp->pin_name)
- amlatvdemod_devp->pin =
- devm_pinctrl_get_select(amlatvdemod_devp->dev,
- amlatvdemod_devp->pin_name);
- atv_dmd_set_std();
- last_frq = c->frequency;
- last_std = c->analog.std;
- pr_info("[amlatvdemod..]%s set std color %s, audio type %s.\n",
- __func__,
- v4l2_std_to_str(0xff000000&amlatvdemod_devp->parm.std),
- v4l2_std_to_str(0xffffff&amlatvdemod_devp->parm.std));
- pr_info("[amlatvdemod..]%s set if_freq 0x%x, if_inv 0x%x.\n",
- __func__, amlatvdemod_devp->parm.if_freq,
- amlatvdemod_devp->parm.if_inv);
- }
- }
-}
-static int aml_atvdemod_get_afc(struct dvb_frontend *fe, s32 *afc)
-{
- *afc = retrieve_vpll_carrier_afc();
- pr_info("[amlatvdemod..]%s afc %d.\n", __func__, *afc);
- return 0;
-}
-
-static int aml_atvdemod_get_ops(struct aml_fe_dev *dev, int mode, void *ops)
-{
- struct analog_demod_ops *aml_analog_ops =
- (struct analog_demod_ops *)ops;
- if (!ops) {
- pr_dbg("[amlatvdemod..]%s null pointer error.\n", __func__);
- return -1;
- }
- aml_analog_ops->get_afc = aml_atvdemod_get_afc;
- aml_analog_ops->get_snr = aml_atvdemod_get_snr;
- aml_analog_ops->get_status = aml_atvdemod_get_status;
- aml_analog_ops->set_params = aml_atvdemod_set_params;
- aml_analog_ops->get_pll_status = aml_atvdemod_get_pll_status;
- aml_analog_ops->get_atv_status = aml_atvdemod_get_atv_status;
- return 0;
-}
-
-static struct aml_fe_drv aml_atvdemod_drv = {
- .name = "aml_atv_demod",
- .capability = AM_FE_ANALOG,
- .id = AM_ATV_DEMOD_AML,
- .get_ops = aml_atvdemod_get_ops,
- .init = aml_atvdemod_fe_init,
- .enter_mode = aml_atvdemod_enter_mode,
- .leave_mode = aml_atvdemod_leave_mode,
- .suspend = aml_atvdemod_suspend,
- .resume = aml_atvdemod_resume,
-};
-
-struct class *aml_atvdemod_clsp;
-
-static void aml_atvdemod_dt_parse(struct platform_device *pdev)
-{
- struct device_node *node;
- unsigned int val;
- int ret;
-
- node = pdev->dev.of_node;
- /* get integer value */
- if (node) {
- ret = of_property_read_u32(node, "reg_23cf", &val);
- if (ret)
- pr_dbg("Can't find reg_23cf.\n");
- else
- reg_23cf = val;
- ret = of_property_read_u32(node, "audio_gain_val", &val);
- if (ret)
- pr_dbg("Can't find audio_gain_val.\n");
- else
- set_audio_gain_val(val);
- ret = of_property_read_u32(node, "video_gain_val", &val);
- if (ret)
- pr_dbg("Can't find video_gain_val.\n");
- else
- set_video_gain_val(val);
- /* agc pin mux */
- ret = of_property_read_string(node, "pinctrl-names",
- &amlatvdemod_devp->pin_name);
- if (!ret) {
- /* amlatvdemod_devp->pin = */
- /* devm_pinctrl_get_select(&pdev->dev, */
- /* amlatvdemod_devp->pin_name); */
- pr_dbg("atvdemod agc pinmux name:%s\n",
- amlatvdemod_devp->pin_name);
- }
- }
-}
-static struct resource amlatvdemod_memobj;
-void __iomem *amlatvdemod_reg_base;
-void __iomem *amlatvdemod_hiu_reg_base;
-void __iomem *amlatvdemod_periphs_reg_base;
-int amlatvdemod_reg_read(unsigned int reg, unsigned int *val)
-{
- *val = readl(amlatvdemod_reg_base + reg);
- return 0;
-}
-
-int amlatvdemod_reg_write(unsigned int reg, unsigned int val)
-{
- writel(val, (amlatvdemod_reg_base + reg));
- return 0;
-}
-
-int amlatvdemod_hiu_reg_read(unsigned int reg, unsigned int *val)
-{
- *val = readl(amlatvdemod_hiu_reg_base + ((reg - 0x1000)<<2));
- return 0;
-}
-
-int amlatvdemod_hiu_reg_write(unsigned int reg, unsigned int val)
-{
- writel(val, (amlatvdemod_hiu_reg_base + ((reg - 0x1000)<<2)));
- return 0;
-}
-int amlatvdemod_periphs_reg_read(unsigned int reg, unsigned int *val)
-{
- *val = readl(amlatvdemod_periphs_reg_base + ((reg - 0x1000)<<2));
- return 0;
-}
-
-int amlatvdemod_periphs_reg_write(unsigned int reg, unsigned int val)
-{
- writel(val, (amlatvdemod_periphs_reg_base + ((reg - 0x1000)<<2)));
- return 0;
-}
-
-static int aml_atvdemod_probe(struct platform_device *pdev)
-{
- int ret = 0;
- struct resource *res;
- int size_io_reg;
-
- res = &amlatvdemod_memobj;
- amlatvdemod_devp = kmalloc(sizeof(struct amlatvdemod_device_s),
- GFP_KERNEL);
- if (!amlatvdemod_devp)
- goto fail_alloc_region;
- memset(amlatvdemod_devp, 0, sizeof(struct amlatvdemod_device_s));
- amlatvdemod_devp->clsp = class_create(THIS_MODULE,
- ATVDEMOD_DEVICE_NAME);
- if (!amlatvdemod_devp->clsp)
- goto fail_create_class;
- ret = class_create_file(amlatvdemod_devp->clsp,
- &class_attr_atvdemod_debug);
- if (ret)
- goto fail_class_create_file;
- amlatvdemod_devp->dev = &pdev->dev;
-
- /*reg mem*/
- pr_info("%s:amlatvdemod start get ioremap .\n", __func__);
- res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
- if (!res) {
- dev_err(&pdev->dev, "missing memory resource\n");
- return -ENODEV;
- }
- size_io_reg = resource_size(res);
- pr_info("amlatvdemod_probe reg=%p,size=%x\n",
- (void *)res->start, size_io_reg);
- amlatvdemod_reg_base =
- devm_ioremap_nocache(&pdev->dev, res->start, size_io_reg);
- if (!amlatvdemod_reg_base) {
- dev_err(&pdev->dev, "amlatvdemod ioremap failed\n");
- return -ENOMEM;
- }
- pr_info("%s: amlatvdemod maped reg_base =%p, size=%x\n",
- __func__, amlatvdemod_reg_base, size_io_reg);
- /*remap hiu mem*/
- amlatvdemod_hiu_reg_base = ioremap(0xc883c000, 0x2000);
- /*remap periphs mem*/
- amlatvdemod_periphs_reg_base = ioremap(0xc8834000, 0x2000);
-
- /*initialize the tuner common struct and register*/
- aml_register_fe_drv(AM_DEV_ATV_DEMOD, &aml_atvdemod_drv);
-
- aml_atvdemod_dt_parse(pdev);
- pr_dbg("[amlatvdemod.] : probe ok.\n");
- return 0;
-
-fail_class_create_file:
- pr_dbg("[amlatvdemod.] : atvdemod class file create error.\n");
- class_destroy(amlatvdemod_devp->clsp);
-fail_create_class:
- pr_dbg("[amlatvdemod.] : atvdemod class create error.\n");
- kfree(amlatvdemod_devp);
-fail_alloc_region:
- pr_dbg("[amlatvdemod.] : atvdemod alloc error.\n");
- pr_dbg("[amlatvdemod.] : atvdemod_init fail.\n");
- return ret;
-}
-
-static int __exit aml_atvdemod_remove(struct platform_device *pdev)
-{
- if (amlatvdemod_devp == NULL)
- return -1;
- class_destroy(amlatvdemod_devp->clsp);
- aml_unregister_fe_drv(AM_DEV_ATV_DEMOD, &aml_atvdemod_drv);
- kfree(amlatvdemod_devp);
- pr_dbg("[amlatvdemod.] : amvecm_remove.\n");
- return 0;
-}
-
-
-static const struct of_device_id aml_atvdemod_dt_match[] = {
- {
- .compatible = "amlogic, aml_atv_demod",
- },
- {},
-};
-
-static struct platform_driver aml_atvdemod_driver = {
- .driver = {
- .name = "aml_atv_demod",
- .owner = THIS_MODULE,
- .of_match_table = aml_atvdemod_dt_match,
- },
- .probe = aml_atvdemod_probe,
- .remove = __exit_p(aml_atvdemod_remove),
-};
-
-
-static int __init aml_atvdemod_init(void)
-{
- if (platform_driver_register(&aml_atvdemod_driver)) {
- pr_err("failed to register amlatvdemod driver module\n");
- return -ENODEV;
- }
- pr_dbg("[amlatvdemod..]%s.\n", __func__);
- return 0;
-}
-
-static void __exit aml_atvdemod_exit(void)
-{
- platform_driver_unregister(&aml_atvdemod_driver);
- pr_dbg("[amlatvdemod..]%s: driver removed ok.\n", __func__);
-}
-
-MODULE_AUTHOR("dezhi.kong <dezhi.kong@amlogic.com>");
-MODULE_DESCRIPTION("aml atv demod device driver");
-MODULE_LICENSE("GPL");
-
-fs_initcall(aml_atvdemod_init);
-module_exit(aml_atvdemod_exit);