blob: 743caac26559234651138a1f0e78d6189a6bd2c2 [file] [log] [blame]
/*
* drivers/amlogic/media/dtv_demod/include/amlfrontend.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 _AMLFRONTEND_H
#define _AMLFRONTEND_H
/**/
#include "depend.h" /**/
#define KERNEL_4_9_EN 1
struct amlfe_config {
int fe_mode;
int i2c_id;
int tuner_type;
int tuner_addr;
};
enum Gxtv_Demod_Tuner_If {
Si2176_5M_If = 5,
Si2176_6M_If = 6
};
/* 0 -DVBC, 1-DVBT, ISDBT, 2-ATSC */
enum Gxtv_Demod_Dvb_Mode {
Gxtv_Dvbc = 0,
Gxtv_Dvbt_Isdbt = 1,
Gxtv_Atsc = 2,
Gxtv_Dtmb = 3,
};
enum demod_md {
UNKNOWN = 0,
AML_DVBC,
AML_DTMB,
AML_DVBT,
AML_ATSC,
AML_J83B,
AML_ISDBT,
AML_DVBT2
};
#define Adc_Clk_35M 35714 /* adc clk dvbc */
#define Demod_Clk_71M 71428 /* demod clk */
#define Adc_Clk_24M 24000
#define Demod_Clk_72M 72000
#define Demod_Clk_60M 60000
#define Adc_Clk_28M 28571 /* dvbt,isdbt */
#define Demod_Clk_66M 66666
#define Adc_Clk_26M 26000 /* atsc air */
#define Demod_Clk_78M 78000 /* */
#define Adc_Clk_25_2M 25200 /* atsc cable */
#define Demod_Clk_75M 75600 /* */
#define Adc_Clk_25M 25000 /* dtmb */
#define Demod_Clk_100M 100000 /* */
#define Demod_Clk_167M 167000 /* */
#define Demod_Clk_180M 180000 /* */
#define Demod_Clk_200M 200000 /* */
#define Demod_Clk_225M 225000
#define Demod_Clk_250M 250000
#define Adc_Clk_27M 27777 /* atsc */
#define Demod_Clk_83M 83333 /* */
enum M6_Demod_Pll_Mode {
Cry_mode = 0,
Adc_mode = 1
};
/*
* e: enum
* s: system
*/
enum es_map_addr {
ES_MAP_ADDR_DEMOD,
ES_MAP_ADDR_IOHIU,
ES_MAP_ADDR_AOBUS,
ES_MAP_ADDR_RESET,
ES_MAP_ADDR_NUM
};
struct ss_reg_phy {
unsigned int phy_addr;
unsigned int size;
/*void __iomem *p;*/
/*int flag;*/
};
struct ss_reg_vt {
void __iomem *v;
int flag;
};
/* rigister offset page */
#define IC_OFFS_V2 (0x02) /*MG9TV, GXTVBB, TXL*/
#define IC_OFFS_V3 (0x03) /*TXLX, GXLX, TXHD*/
#define IC_OFFS_V4 (0x04) /*TL1*/
#define IC_MD_NONE (0x00)
#define IC_DVBC_V2 (0x02) /*MG9TV, GXTVBB, TXL*/
#define IC_DVBC_V3 (0x03) /*TXLX, GXLX*/
#define IC_DTMB_V2 (0x02) /*MG9TV, GXTVBB*/
#define IC_DTMB_V3 (0x03) /*TXL, TXHD*/
#define IC_DVBT_V2 (0x02) /*TXLX*/
#define IC_ATSC_V2 (0x02) /*TXLX*/
/*-----------------------*/
#define IC_VER_GTVBB (0x00)
#define IC_VER_TXL (0x01)
#define IC_VER_TXLX (0x02)
#define IC_VER_GXLX (0x03)
#define IC_VER_TXHD (0x04)
#define IC_VER_TL1 (0x05)
#define IC_VER_NUB (0x06)
/*-----------------------*/
#if 0
struct ic_cfg_s {
/* register */
#if 0
unsigned int reg_demod_st;
unsigned int reg_demod_size;
unsigned int reg_iohiu_st;
unsigned int reg_iohiu_size;
unsigned int reg_aobus_st; /*ao bus*/
unsigned int reg_aobus_size;
unsigned int reg_reset_st; /*reset*/
unsigned int reg_reset_size;
#endif
/* module version */
union {
unsigned int all;
struct {
unsigned int atsc:4, dvbt:4, dtmb:4, dvbc:4,
reserved:4, offset:4, ic:8;
} b;
} hwver;
};
#endif
struct ic_ver {
unsigned int atsc:4, dvbt:4, dtmb:4, dvbc:4,
reserved:4, offset:4, ic:8;
};
struct ddemod_reg_off {
/* register address offset for demod*/
unsigned int off_demod_top;
unsigned int off_dvbc;
unsigned int off_dtmb;
unsigned int off_dvbt;
unsigned int off_atsc;
unsigned int off_front;
unsigned int off_isdbt;
#if 0
/*vertual address for dtv demod*/
void __iomem *base_demod;
void __iomem *base_iohiu;
void __iomem *base_aobus;
void __iomem *base_reset;
#else
#endif
};
struct meson_ddemod_data {
const char *name;
struct ic_ver icver;
/*struct ddemod_reg_off regoff;*/
};
enum DTVDEMOD_ST {
DTVDEMOD_ST_NOT_INI, /*driver is not init or init failed*/
DTVDEMOD_ST_IDLE, /*leave mode*/
DTVDEMOD_ST_WORK, /*enter_mode*/
};
/*polling*/
struct poll_machie_s {
unsigned int flg_stop; /**/
unsigned int flg_restart;
unsigned int state; /*idel, work,*/
/**/
unsigned int delayms;
unsigned int flg_updelay;
unsigned int crrcnt;
unsigned int maxcnt;
enum fe_status last_s;
unsigned int bch;
};
struct amlfe_exp_config {
/*config by aml_fe ?*/
/* */
int set_mode;
};
struct amldtvdemod_device_s {
struct class *clsp;
struct device *dev;
enum DTVDEMOD_ST state;
struct mutex lock; /*aml_lock*/
/*struct ic_cfg_s iccfg;*/
struct ic_ver icver;
struct ss_reg_phy reg_p[ES_MAP_ADDR_NUM];
struct ss_reg_vt reg_v[ES_MAP_ADDR_NUM];
struct ddemod_reg_off ireg;
struct meson_ddemod_data *data;
bool flg_cma_allc;
bool act_dtmb;
struct poll_machie_s poll_machie;
unsigned int en_detect;
#ifdef KERNEL_4_9_EN
/* clktree */
unsigned int clk_gate_state;
struct clk *vdac_clk_gate;
#endif
/*agc pin mux*/
struct pinctrl *pin;
const char *pin_name;
#if 1 /*move to aml_dtv_demod*/
/*for mem reserved*/
int mem_start;
int mem_end;
int mem_size;
int cma_flag;
#ifdef CONFIG_CMA
struct platform_device *this_pdev;
struct page *venc_pages;
unsigned int cma_mem_size;/* BYTE */
unsigned int cma_mem_alloc;
#endif
/*for dtv spectrum*/
int spectrum;
/*for atsc version*/
int atsc_version;
/*for dtv priv*/
#endif
enum aml_fe_n_mode_t n_mode; /*temp for mode*/
enum fe_delivery_system last_delsys;
#ifndef DVB_49
struct dvb_frontend *frontend; /**/
#else
struct dvb_frontend frontend; /**/
#endif
const struct amlfe_exp_config *afe_cfg;
struct dentry *demod_root;
};
extern struct amldtvdemod_device_s *dtvdd_devp; /**/
/*int M6_Demod_Dtmb_Init(struct aml_fe_dev *dev);*/
int convert_snr(int in_snr);
extern int vdac_enable_check_dtv(void);
extern unsigned int ats_thread_flg;
/*version*/
static inline int is_atsc_ver(unsigned int ver)
{
return dtvdd_devp->icver.atsc == ver;
}
static inline int is_dvbt_ver(unsigned int ver)
{
return dtvdd_devp->icver.dvbt == ver;
}
static inline int is_dtmb_ver(unsigned int ver)
{
return dtvdd_devp->icver.dtmb == ver;
}
static inline int is_dvbc_ver(unsigned int ver)
{
return dtvdd_devp->icver.dvbc == ver;
}
static inline int is_offset_ver(unsigned int ver)
{
return dtvdd_devp->icver.offset == ver;
}
static inline int get_atsc_ver(void)
{
return dtvdd_devp->icver.atsc;
}
static inline int get_dvbt_ver(void)
{
return dtvdd_devp->icver.dvbt;
}
static inline int get_dtmb_ver(void)
{
return dtvdd_devp->icver.dtmb;
}
static inline int get_dvbc_ver(void)
{
return dtvdd_devp->icver.dvbc;
}
static inline int is_ic_ver(unsigned int ver)
{
return dtvdd_devp->icver.ic == ver;
}
static inline int get_ic_ver(void)
{
return dtvdd_devp->icver.ic;
}
#if 0
static inline void __iomem *gbase_dvbt(void)
{
return dtvdd_devp->ireg.base_demod + dtvdd_devp->ireg.off_dvbt;
}
static inline void __iomem *gbase_dvbc(void)
{
return dtvdd_devp->ireg.base_demod + dtvdd_devp->ireg.off_dvbc;
}
static inline void __iomem *gbase_dtmb(void)
{
return dtvdd_devp->ireg.base_demod + dtvdd_devp->ireg.off_dtmb;
}
static inline void __iomem *gbase_atsc(void)
{
return dtvdd_devp->ireg.base_demod + dtvdd_devp->ireg.off_atsc;
}
static inline void __iomem *gbase_demod(void)
{
return dtvdd_devp->ireg.base_demod + dtvdd_devp->ireg.off_demod;
}
static inline void __iomem *gbase_aobus(void)
{
return dtvdd_devp->ireg.base_aobus;
}
static inline void __iomem *gbase_iohiu(void)
{
return dtvdd_devp->ireg.base_iohiu;
}
static inline void __iomem *gbase_reset(void)
{
return dtvdd_devp->ireg.base_reset;
}
static inline unsigned int gphybase_demod(void)
{
return dtvdd_devp->iccfg.reg_demod_st + dtvdd_devp->ireg.off_demod;
}
static inline unsigned int gphybase_hiu(void)
{
return dtvdd_devp->iccfg.reg_iohiu_st;
}
#else
static inline void __iomem *gbase_dvbt(void)
{
return dtvdd_devp->reg_v[ES_MAP_ADDR_DEMOD].v
+ dtvdd_devp->ireg.off_dvbt;
}
static inline void __iomem *gbase_dvbc(void)
{
return dtvdd_devp->reg_v[ES_MAP_ADDR_DEMOD].v
+ dtvdd_devp->ireg.off_dvbc;
}
static inline void __iomem *gbase_dtmb(void)
{
return dtvdd_devp->reg_v[ES_MAP_ADDR_DEMOD].v
+ dtvdd_devp->ireg.off_dtmb;
}
static inline void __iomem *gbase_atsc(void)
{
return dtvdd_devp->reg_v[ES_MAP_ADDR_DEMOD].v
+ dtvdd_devp->ireg.off_atsc;
}
static inline void __iomem *gbase_demod(void)
{
return dtvdd_devp->reg_v[ES_MAP_ADDR_DEMOD].v
+ dtvdd_devp->ireg.off_demod_top;
}
static inline void __iomem *gbase_isdbt(void)
{
return dtvdd_devp->reg_v[ES_MAP_ADDR_DEMOD].v
+ dtvdd_devp->ireg.off_isdbt;
}
static inline void __iomem *gbase_front(void)
{
return dtvdd_devp->reg_v[ES_MAP_ADDR_DEMOD].v
+ dtvdd_devp->ireg.off_front;
}
static inline void __iomem *gbase_aobus(void)
{
return dtvdd_devp->reg_v[ES_MAP_ADDR_AOBUS].v;
}
static inline void __iomem *gbase_iohiu(void)
{
return dtvdd_devp->reg_v[ES_MAP_ADDR_IOHIU].v;
}
static inline void __iomem *gbase_reset(void)
{
return dtvdd_devp->reg_v[ES_MAP_ADDR_RESET].v;
}
static inline unsigned int gphybase_demod(void)
{
return dtvdd_devp->reg_p[ES_MAP_ADDR_DEMOD].phy_addr;
}
static inline unsigned int gphybase_demodcfg(void)
{
return dtvdd_devp->reg_p[ES_MAP_ADDR_DEMOD].phy_addr
+ dtvdd_devp->ireg.off_demod_top;
}
static inline unsigned int gphybase_hiu(void)
{
return dtvdd_devp->reg_p[ES_MAP_ADDR_IOHIU].phy_addr;
}
#endif
/*poll*/
extern void dtmb_poll_start(void);
extern void dtmb_poll_stop(void);
extern unsigned int dtmb_is_update_delay(void);
extern unsigned int dtmb_get_delay_clear(void);
extern unsigned int dtmb_is_have_check(void);
extern void dtmb_poll_v3(void);
extern enum demod_md demod_get_current_mode(void);
extern unsigned int demod_dvbc_get_fast_search(void);
extern void demod_dvbc_set_fast_search(unsigned int en);
#endif