--- /dev/null
+diff -Naur media_build-bst.orig/linux/drivers/media/dvb-frontends/sit2_mod.c media_build-bst/linux/drivers/media/dvb-frontends/sit2_mod.c
+--- media_build-bst.orig/linux/drivers/media/dvb-frontends/sit2_mod.c 2014-11-06 07:17:41.000000000 +0100
++++ media_build-bst/linux/drivers/media/dvb-frontends/sit2_mod.c 2015-10-21 15:19:44.000000000 +0200
+@@ -1,16 +1,16 @@
+ /*+++ *******************************************************************\
+ * SIT2 - DVB-T2/T/C demodulator and tuner
+ *
+-* --------------------------------------------------------------- \r
+-* This software is provided "AS IS" without warranty of any kind, \r
+-* either expressed or implied, including but not limited to the \r
+-* implied warranties of noninfringement, merchantability and/or \r
+-* fitness for a particular purpose.\r
+-* --------------------------------------------------------------- \r
+-* \r
++* ---------------------------------------------------------------
++* This software is provided "AS IS" without warranty of any kind,
++* either expressed or implied, including but not limited to the
++* implied warranties of noninfringement, merchantability and/or
++* fitness for a particular purpose.
++* ---------------------------------------------------------------
++*
+ * Copyright (c) 2013 ShenZhen Bestunar Ltd,Inc.
+ * All rights reserved.
+-* Max Nibble <nibble.max@gmail.com>\r
++* Max Nibble <nibble.max@gmail.com>
+ *
+ *
+ \******************************************************************* ---*/
+@@ -20,9 +20,7 @@
+ #include <linux/kernel.h>
+ #include <linux/module.h>
+ #include <linux/string.h>
+-//#include <linux/slab.h>
+ #include <asm/div64.h>
+-//#include "kmem_func.h"
+ #include "dvb_frontend.h"
+ #include "sit2.h"
+ #include "sit2_op.h"
+@@ -32,11 +30,109 @@
+ struct sit2_state *state = fe->demodulator_priv;
+ kfree(state);
+ }
++static void sit2_mod_release(struct dvb_frontend *fe)
++{
++ struct sit2_mod_state *m_state = fe->demodulator_priv;
++ kfree(m_state);
++}
++
++static int sit2_mod_init(struct dvb_frontend *fe)
++{
++ struct sit2_mod_state *m_state = fe->demodulator_priv;
++ struct sit2_state *state = &m_state->drv_state;
++ return sit2_drv_init(state);
++}
++
++static int sit2_mod_sleep(struct dvb_frontend *fe)
++{
++ struct sit2_mod_state *m_state = fe->demodulator_priv;
++ struct sit2_state *state = &m_state->drv_state;
++ return sit2_drv_sleep(state);
++}
++
++static int sit2_mod_get_frontend_algo(struct dvb_frontend *fe)
++{
++ return DVBFE_ALGO_HW;
++}
++
++static int sit2_mod_set_frontend(struct dvb_frontend *fe)
++{
++ struct dtv_frontend_properties *c = &fe->dtv_property_cache;
++ struct sit2_mod_state *m_state = fe->demodulator_priv;
++ struct sit2_state *state = &m_state->drv_state;
++
++ return sit2_drv_set_frontend(state, c->delivery_system, c->frequency, c->bandwidth_hz,
++ c->symbol_rate, c->modulation, c->stream_id);
++}
++
++static int sit2_mod_read_status(struct dvb_frontend *fe, fe_status_t *status)
++{
++ struct sit2_mod_state *m_state = fe->demodulator_priv;
++ struct sit2_state *state = &m_state->drv_state;
++ return sit2_drv_read_status(state, status);
++}
++
++static int sit2_mod_tune(struct dvb_frontend *fe,
++ bool re_tune,
++ unsigned int mode_flags,
++ unsigned int *delay,
++ fe_status_t *status)
++{
++ *delay = HZ / 5;
++ if (re_tune) {
++ int ret = sit2_mod_set_frontend(fe);
++ if (ret)
++ return ret;
++ }
++ return sit2_mod_read_status(fe, status);
++}
++
++static int sit2_mod_get_frontend(struct dvb_frontend *fe)
++{
++ struct dtv_frontend_properties *c = &fe->dtv_property_cache;
++ struct sit2_mod_state *m_state = fe->demodulator_priv;
++ struct sit2_state *state = &m_state->drv_state;
++
++ return sit2_drv_get_frontend(state, &c->symbol_rate, &c->modulation, &c->transmission_mode,
++ &c->guard_interval, &c->hierarchy, &c->code_rate_HP, &c->code_rate_LP, &c->inversion, &c->fec_inner);
++}
++
++static int sit2_mod_read_snr(struct dvb_frontend *fe, u16 *snr)
++{
++ struct sit2_mod_state *m_state = fe->demodulator_priv;
++ struct sit2_state *state = &m_state->drv_state;
++ return sit2_drv_read_snr(state, snr);
++}
++
++static int sit2_mod_read_ber(struct dvb_frontend *fe, u32 *ber)
++{
++ struct sit2_mod_state *m_state = fe->demodulator_priv;
++ struct sit2_state *state = &m_state->drv_state;
++ return sit2_drv_read_ber(state, ber);
++}
++
++static int sit2_mod_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
++{
++ struct sit2_mod_state *m_state = fe->demodulator_priv;
++ struct sit2_state *state = &m_state->drv_state;
++ return sit2_drv_read_ucblocks(state, ucblocks);
++}
++
++static int sit2_mod_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
++{
++ struct sit2_mod_state *m_state = fe->demodulator_priv;
++ struct sit2_state *state = &m_state->drv_state;
++ return sit2_drv_read_signal_strength(state, strength);
++}
+
+ static const struct dvb_frontend_ops sit2_ops = {
++
++ /* DVB-T, DVB-T2 and DVB-C */
+ .delsys = { SYS_DVBT, SYS_DVBT2, SYS_DVBC_ANNEX_A },
++
++ /* DVB-C only */
+ /*.delsys = { SYS_DVBC_ANNEX_A },*/
+- /* default: DVB-T/T2 */
++
+ .info = {
+ .name = "Sit2 DVB-T2/C",
+ .frequency_stepsize = 62500,
+@@ -65,43 +161,43 @@
+ FE_CAN_MULTISTREAM
+ },
+
+- .release = sit2_drv_release,
+- .init = sit2_drv_init,
+- .sleep = sit2_drv_sleep,
+-
+- .tune = sit2_drv_tune,
+- .set_frontend = sit2_drv_set_frontend,
+- .get_frontend = sit2_drv_get_frontend,
+- .get_frontend_algo = sit2_drv_get_frontend_algo,
+-
+- .read_status = sit2_drv_read_status,
+- .read_snr = sit2_drv_read_snr,
+- .read_ber = sit2_drv_read_ber,
+- .read_ucblocks = sit2_drv_read_ucblocks,
+- .read_signal_strength = sit2_drv_read_signal_strength,
++ .release = sit2_mod_release,
++ .init = sit2_mod_init,
++ .sleep = sit2_mod_sleep,
++
++ .tune = sit2_mod_tune,
++ .set_frontend = sit2_mod_set_frontend,
++ .get_frontend = sit2_mod_get_frontend,
++ .get_frontend_algo = sit2_mod_get_frontend_algo,
++
++ .read_status = sit2_mod_read_status,
++ .read_snr = sit2_mod_read_snr,
++ .read_ber = sit2_mod_read_ber,
++ .read_ucblocks = sit2_mod_read_ucblocks,
++ .read_signal_strength = sit2_mod_read_signal_strength,
+ };
+
+ struct dvb_frontend *sit2_attach(const struct sit2_config *config,
+ struct i2c_adapter *i2c)
+ {
+- struct sit2_state *state = NULL;
+- state = kzalloc(sizeof(struct sit2_state), GFP_KERNEL);
++ struct sit2_mod_state *m_state = NULL;
++ m_state = kzalloc(sizeof(struct sit2_mod_state), GFP_KERNEL);
+
+- if (!state) {
++ if (!m_state) {
+ #ifdef _SIT2_DEBUG_
+ dev_err(&i2c->dev, "%s: kzalloc() failed\n",
+ KBUILD_MODNAME);
+ #endif
+ goto error;
+ }
+- sit2_op_attach(state, config, i2c);
++ sit2_op_attach(&m_state->drv_state, i2c, config->ts_bus_mode, config->ts_clock_mode);
+
+- memcpy(&state->frontend.ops, &sit2_ops,
++ memcpy(&m_state->frontend.ops, &sit2_ops,
+ sizeof(struct dvb_frontend_ops));
+- state->frontend.demodulator_priv = state;
+- return &state->frontend;
++ m_state->frontend.demodulator_priv = m_state;
++ return &m_state->frontend;
+ error:
+- kfree(state);
++ kfree(m_state);
+ return NULL;
+ }
+ EXPORT_SYMBOL(sit2_attach);
+diff -Naur media_build-bst.orig/linux/drivers/media/dvb-frontends/sit2_op.h media_build-bst/linux/drivers/media/dvb-frontends/sit2_op.h
+--- media_build-bst.orig/linux/drivers/media/dvb-frontends/sit2_op.h 2014-07-25 17:18:39.000000000 +0200
++++ media_build-bst/linux/drivers/media/dvb-frontends/sit2_op.h 2015-03-20 05:07:37.000000000 +0100
+@@ -36,10 +36,8 @@
+
+ /*global state*/
+ struct sit2_state {
+- struct dvb_frontend frontend;
+- const struct sit2_config *config;
+ struct i2c_adapter *i2c;
+-
++
+ bool isInited;
+ u8 demod_addr;
+ u8 tuner_addr;
+@@ -52,25 +50,35 @@
+ int plp_id;
+ u32 stream;
+ u32 dvbc_symrate;
+- u8 dvbt2_profile;
++ u8 dvbt2_profile;
++
++ u8 ts_bus_mode; /*1-serial, 2-parallel.*/
++ u8 ts_clock_mode; /*0-auto, 1-manual.*/
++};
++
++struct sit2_mod_state {
++ struct dvb_frontend frontend;
++ const struct sit2_config *config;
++ struct sit2_state drv_state;
+ };
+
+-int sit2_drv_init(struct dvb_frontend *fe);
+-int sit2_drv_sleep(struct dvb_frontend *fe);
++int sit2_drv_init(struct sit2_state *state);
++int sit2_drv_sleep(struct sit2_state *state);
++
++int sit2_drv_set_frontend(struct sit2_state *state,
++fe_delivery_system_t delivery_system, u32 frequency, u32 bandwidth_hz,
++u32 symbol_rate, fe_modulation_t modulation, u32 stream_id);
++
++int sit2_drv_get_frontend(struct sit2_state *state,
++u32 *symbol_rate, fe_modulation_t *modulation, fe_transmit_mode_t *transmission_mode,
++fe_guard_interval_t *guard_interval, fe_hierarchy_t *hierarchy, fe_code_rate_t *code_rate_HP,
++fe_code_rate_t *code_rate_LP, fe_spectral_inversion_t *inversion, fe_code_rate_t *fec_inner);
+
+-int sit2_drv_tune(struct dvb_frontend *fe,
+- bool re_tune,
+- unsigned int mode_flags,
+- unsigned int *delay,
+- fe_status_t *status);
+-int sit2_drv_set_frontend(struct dvb_frontend *fe);
+-int sit2_drv_get_frontend(struct dvb_frontend *fe);
+-int sit2_drv_get_frontend_algo(struct dvb_frontend *fe);
+-int sit2_drv_read_status(struct dvb_frontend *fe, fe_status_t *status);
+-int sit2_drv_read_snr(struct dvb_frontend *fe, u16 *snr);
+-int sit2_drv_read_ber(struct dvb_frontend *fe, u32 *ber);
+-int sit2_drv_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks);
+-int sit2_drv_read_signal_strength(struct dvb_frontend *fe, u16 *strength);
+-void sit2_op_attach(struct sit2_state *state, const struct sit2_config *config, struct i2c_adapter *i2c);
++int sit2_drv_read_status(struct sit2_state *state, fe_status_t *status);
++int sit2_drv_read_snr(struct sit2_state *state, u16 *snr);
++int sit2_drv_read_ber(struct sit2_state *state, u32 *ber);
++int sit2_drv_read_ucblocks(struct sit2_state *state, u32 *ucblocks);
++int sit2_drv_read_signal_strength(struct sit2_state *state, u16 *strength);
++void sit2_op_attach(struct sit2_state *state, struct i2c_adapter *i2c, u8 ts_bus_mode, u8 ts_clock_mode);
+
+ #endif /* SIT2_OP_H */