Add hmp-usb-dvb-t2-c driver.
[vuplus_openvuplus_3.0] / meta-bsp / recipes-driver / hmp / hmp-usb-dvb-t2-c-v03arm / vu_backport.patch
diff --git a/meta-bsp/recipes-driver/hmp/hmp-usb-dvb-t2-c-v03arm/vu_backport.patch b/meta-bsp/recipes-driver/hmp/hmp-usb-dvb-t2-c-v03arm/vu_backport.patch
new file mode 100644 (file)
index 0000000..8c36728
--- /dev/null
@@ -0,0 +1,283 @@
+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 */