blob: 807239206f8fb1eb95d5c8b4794cc0c5e907aab5 [file] [log] [blame]
/*
* 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.
*/
#ifndef __ATVDEMOD_FUN_H
#define __ATVDEMOD_FUN_H
/*#include "../aml_fe.h"*/
#include <linux/amlogic/tvin/tvin.h>
#include "../aml_fe.h"
#include <linux/amlogic/iomap.h>
/*#define TVFE_APB_BASE_ADDR 0xd0046000*/
#define ATV_DMD_APB_BASE_ADDR 0xc8008000
#define ATV_DMD_APB_BASE_ADDR_GXTVBB 0xc8840000
#define HHI_ATV_DMD_SYS_CLK_CNTL 0x10f3
extern int atvdemod_debug_en;
extern struct amlatvdemod_device_s *amlatvdemod_devp;
extern unsigned int reg_23cf; /* IIR filter */
extern int broad_std_except_pal_m;
#undef pr_info
#define pr_info(args...)\
do {\
if (atvdemod_debug_en)\
printk(args);\
} while (0)
#undef pr_dbg
#define pr_dbg(a...) \
do {\
if (1)\
printk(a);\
} while (0)
#define ATVDEMOD_INTERVAL (HZ/100) /*10ms, #define HZ 100*/
extern int amlatvdemod_reg_read(unsigned int reg, unsigned int *val);
extern int amlatvdemod_reg_write(unsigned int reg, unsigned int val);
extern int amlatvdemod_hiu_reg_read(unsigned int reg, unsigned int *val);
extern int amlatvdemod_hiu_reg_write(unsigned int reg, unsigned int val);
static inline uint32_t R_ATVDEMOD_REG(uint32_t reg)
{
unsigned int val;
amlatvdemod_reg_read(reg, &val);
return val;
}
static inline void W_ATVDEMOD_REG(uint32_t reg,
const uint32_t val)
{
amlatvdemod_reg_write(reg, val);
}
static inline void W_ATVDEMOD_BIT(uint32_t reg,
const uint32_t value,
const uint32_t start,
const uint32_t len)
{
W_ATVDEMOD_REG(reg, ((R_ATVDEMOD_REG(reg) &
~(((1L << (len)) - 1) << (start))) |
(((value) & ((1L << (len)) - 1)) << (start))));
}
static inline uint32_t R_ATVDEMOD_BIT(uint32_t reg,
const uint32_t start,
const uint32_t len)
{
uint32_t val;
val = ((R_ATVDEMOD_REG(reg) >> (start)) & ((1L << (len)) - 1));
return val;
}
static inline uint32_t R_HIU_REG(uint32_t reg)
{
unsigned int val;
amlatvdemod_hiu_reg_read(reg, &val);
return val;
}
static inline void W_HIU_REG(uint32_t reg,
const uint32_t val)
{
amlatvdemod_hiu_reg_write(reg, val);
}
static inline void W_HIU_BIT(uint32_t reg,
const uint32_t value,
const uint32_t start,
const uint32_t len)
{
W_HIU_REG(reg, ((R_HIU_REG(reg) &
~(((1L << (len)) - 1) << (start))) |
(((value) & ((1L << (len)) - 1)) << (start))));
}
static inline uint32_t R_HIU_BIT(uint32_t reg,
const uint32_t start,
const uint32_t len)
{
uint32_t val;
val = ((R_HIU_REG(reg) >> (start)) & ((1L << (len)) - 1));
return val;
}
enum broadcast_standard_e {
ATVDEMOD_STD_NTSC = 0,
ATVDEMOD_STD_NTSC_J,
ATVDEMOD_STD_PAL_M,
ATVDEMOD_STD_PAL_BG,
ATVDEMOD_STD_DTV,
ATVDEMOD_STD_SECAM_DK2,
ATVDEMOD_STD_SECAM_DK3,
ATVDEMOD_STD_PAL_BG_NICAM,
ATVDEMOD_STD_PAL_DK_CHINA,
ATVDEMOD_STD_SECAM_L,
ATVDEMOD_STD_PAL_I,
ATVDEMOD_STD_PAL_DK1,
ATVDEMOD_STD_MAX,
};
enum gde_curve_e {
ATVDEMOD_CURVE_M = 0,
ATVDEMOD_CURVE_A,
ATVDEMOD_CURVE_B,
ATVDEMOD_CURVE_CHINA,
ATVDEMOD_CURVE_MAX,
};
enum sound_format_e {
ATVDEMOD_SOUND_STD_MONO = 0,
ATVDEMOD_SOUND_STD_NICAM,
ATVDEMOD_SOUND_STD_MAX,
};
extern void atv_dmd_wr_reg(unsigned char block, unsigned char reg,
unsigned long data);
extern unsigned long atv_dmd_rd_reg(unsigned char block, unsigned char reg);
extern unsigned long atv_dmd_rd_byte(unsigned long block_address,
unsigned long reg_addr);
extern unsigned long atv_dmd_rd_word(unsigned long block_address,
unsigned long reg_addr);
extern unsigned long atv_dmd_rd_long(unsigned long block_address,
unsigned long reg_addr);
extern void atv_dmd_wr_long(unsigned long block_address,
unsigned long reg_addr,
unsigned long data);
extern void atv_dmd_wr_word(unsigned long block_address,
unsigned long reg_addr,
unsigned long data);
extern void atv_dmd_wr_byte(unsigned long block_address,
unsigned long reg_addr,
unsigned long data);
extern void set_audio_gain_val(int val);
extern void set_video_gain_val(int val);
extern void atv_dmd_soft_reset(void);
extern void atv_dmd_input_clk_32m(void);
extern void read_version_register(void);
extern void check_communication_interface(void);
extern void power_on_receiver(void);
extern void atv_dmd_misc(void);
extern void configure_receiver(int Broadcast_Standard,
unsigned int Tuner_IF_Frequency,
int Tuner_Input_IF_inverted, int GDE_Curve,
int sound_format);
extern int atvdemod_clk_init(void);
extern int atvdemod_init(void);
extern void atvdemod_uninit(void);
extern void atv_dmd_set_std(void);
extern void retrieve_vpll_carrier_lock(int *lock);
extern void retrieve_video_lock(int *lock);
extern int retrieve_vpll_carrier_afc(void);
extern int get_atvdemod_snr_val(void);
extern int aml_atvdemod_get_snr(struct dvb_frontend *fe);
/*atv demod block address*/
/*address interval is 4, because it's 32bit interface,
* but the address is in byte
*/
#define ATV_DMD_TOP_CTRL 0x0
#define ATV_DMD_TOP_CTRL1 0x4
#define ATV_DMD_RST_CTRL 0x8
#define APB_BLOCK_ADDR_SYSTEM_MGT 0x0
#define APB_BLOCK_ADDR_AA_LP_NOTCH 0x1
#define APB_BLOCK_ADDR_MIXER_1 0x2
#define APB_BLOCK_ADDR_MIXER_3 0x3
#define APB_BLOCK_ADDR_ADC_SE 0x4
#define APB_BLOCK_ADDR_PWR_ANL 0x5
#define APB_BLOCK_ADDR_CARR_RCVY 0x6
#define APB_BLOCK_ADDR_FE_DROOP_MDF 0x7
#define APB_BLOCK_ADDR_SIF_IC_STD 0x8
#define APB_BLOCK_ADDR_SIF_STG_2 0x9
#define APB_BLOCK_ADDR_SIF_STG_3 0xa
#define APB_BLOCK_ADDR_IC_AGC 0xb
#define APB_BLOCK_ADDR_DAC_UPS 0xc
#define APB_BLOCK_ADDR_GDE_EQUAL 0xd
#define APB_BLOCK_ADDR_VFORMAT 0xe
#define APB_BLOCK_ADDR_VDAGC 0xf
#define APB_BLOCK_ADDR_VERS_REGISTER 0x10
#define APB_BLOCK_ADDR_INTERPT_MGT 0x11
#define APB_BLOCK_ADDR_ADC_MGR 0x12
#define APB_BLOCK_ADDR_GP_VD_FLT 0x13
#define APB_BLOCK_ADDR_CARR_DMD 0x14
#define APB_BLOCK_ADDR_SIF_VD_IF 0x15
#define APB_BLOCK_ADDR_VD_PKING 0x16
#define APB_BLOCK_ADDR_FE_DR_SMOOTH 0x17
#define APB_BLOCK_ADDR_AGC_PWM 0x18
#define APB_BLOCK_ADDR_DAC_UPS_24M 0x19
#define APB_BLOCK_ADDR_VFORMAT_DP 0x1a
#define APB_BLOCK_ADDR_VD_PKING_DAC 0x1b
#define APB_BLOCK_ADDR_MONO_PROC 0x1c
#define APB_BLOCK_ADDR_TOP 0x1d
#define SLAVE_BLOCKS_NUMBER 0x1d /*indeed totals 0x1e, adding top*/
/*Broadcast_Standard*/
/* 0: NTSC*/
/* 1: NTSC-J*/
/* 2: PAL-M,*/
/* 3: PAL-BG*/
/* 4: DTV*/
/* 5: SECAM- DK2*/
/* 6: SECAM -DK3*/
/* 7: PAL-BG, NICAM*/
/* 8: PAL-DK-CHINA*/
/* 9: SECAM-L / SECAM-DK3*/
/* 10: PAL-I*/
/* 11: PAL-DK1*/
#define AML_ATV_DEMOD_VIDEO_MODE_PROP_NTSC 0
#define AML_ATV_DEMOD_VIDEO_MODE_PROP_NTSC_J 1
#define AML_ATV_DEMOD_VIDEO_MODE_PROP_PAL_M 2
#define AML_ATV_DEMOD_VIDEO_MODE_PROP_PAL_BG 3
#define AML_ATV_DEMOD_VIDEO_MODE_PROP_DTV 4
#define AML_ATV_DEMOD_VIDEO_MODE_PROP_SECAM_DK2 5
#define AML_ATV_DEMOD_VIDEO_MODE_PROP_SECAM_DK3 6
#define AML_ATV_DEMOD_VIDEO_MODE_PROP_PAL_BG_NICAM 7
#define AML_ATV_DEMOD_VIDEO_MODE_PROP_PAL_DK 8
#define AML_ATV_DEMOD_VIDEO_MODE_PROP_SECAM_L 9
#define AML_ATV_DEMOD_VIDEO_MODE_PROP_PAL_I 10
#define AML_ATV_DEMOD_VIDEO_MODE_PROP_PAL_DK1 11
/* new add @20150813 begin */
#define AML_ATV_DEMOD_VIDEO_MODE_PROP_NTSC_DK 12
#define AML_ATV_DEMOD_VIDEO_MODE_PROP_NTSC_BG 13
#define AML_ATV_DEMOD_VIDEO_MODE_PROP_NTSC_I 14
#define AML_ATV_DEMOD_VIDEO_MODE_PROP_NTSC_M 15
/* new add @20150813 end */
/*GDE_Curve*/
/* 0: CURVE-M*/
/* 1: CURVE-A*/
/* 2: CURVE-B*/
/* 3: CURVE-CHINA*/
/* 4: BYPASS*/
#define AML_ATV_DEMOD_VIDEO_MODE_PROP_CURVE_M 0
#define AML_ATV_DEMOD_VIDEO_MODE_PROP_CURVE_A 1
#define AML_ATV_DEMOD_VIDEO_MODE_PROP_CURVE_B 2
#define AML_ATV_DEMOD_VIDEO_MODE_PROP_CURVE_CHINA 3
#define AML_ATV_DEMOD_VIDEO_MODE_PROP_CURVE_BYPASS 4
/*sound format 0: MONO;1:NICAM*/
#define AML_ATV_DEMOD_SOUND_MODE_PROP_MONO 0
#define AML_ATV_DEMOD_SOUND_MODE_PROP_NICAM 1
/**
*freq_hz:hs_freq
*freq_hz_cvrt=hs_freq/0.23841858
*vs_freq==50,freq_hz=15625;freq_hz_cvrt=0xffff
*vs_freq==60,freq_hz=15734,freq_hz_cvrt=0x101c9
**
*/
#define AML_ATV_DEMOD_FREQ_50HZ_VERT 0xffff /*65535*/
#define AML_ATV_DEMOD_FREQ_60HZ_VERT 0x101c9 /*65993*/
#define CARR_AFC_DEFAULT_VAL 0xffff
enum amlatvdemod_snr_level_e {
very_low = 1,
low,
ok_minus,
ok_plus,
high,
};
enum audio_detect_mode {
AUDIO_AUTO_DETECT = 0,
AUDIO_MANUAL_DETECT,
};
struct amlatvdemod_device_s {
struct class *clsp;
struct device *dev;
struct analog_parameters parm;
int fre_offset;
struct pinctrl *pin;
const char *pin_name;
};
extern void aml_audio_overmodulation(int enable);
extern void amlatvdemod_set_std(int val);
extern struct amlatvdemod_device_s *amlatvdemod_devp;
extern void aml_fix_PWM_adjust(int enable);
extern void aml_audio_valume_gain_set(unsigned int audio_gain);
extern unsigned int aml_audio_valume_gain_get(void);
extern void aml_atvdemod_overmodule_det(void);
extern int aml_audiomode_autodet(struct dvb_frontend *fe);
extern void retrieve_frequency_offset(int *freq_offset);
extern int aml_atvdemod_get_snr_ex(void);
#endif /* __ATVDEMOD_FUN_H */