Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-or-later */
0002 /*
0003  * bsru6.h - ALPS BSRU6 tuner support (moved from budget-ci.c)
0004  *
0005  * the project's page is at https://linuxtv.org
0006  */
0007 
0008 #ifndef BSRU6_H
0009 #define BSRU6_H
0010 
0011 static u8 alps_bsru6_inittab[] = {
0012     0x01, 0x15,
0013     0x02, 0x30,
0014     0x03, 0x00,
0015     0x04, 0x7d,   /* F22FR = 0x7d, F22 = f_VCO / 128 / 0x7d = 22 kHz */
0016     0x05, 0x35,   /* I2CT = 0, SCLT = 1, SDAT = 1 */
0017     0x06, 0x40,   /* DAC not used, set to high impendance mode */
0018     0x07, 0x00,   /* DAC LSB */
0019     0x08, 0x40,   /* DiSEqC off, LNB power on OP2/LOCK pin on */
0020     0x09, 0x00,   /* FIFO */
0021     0x0c, 0x51,   /* OP1 ctl = Normal, OP1 val = 1 (LNB Power ON) */
0022     0x0d, 0x82,   /* DC offset compensation = ON, beta_agc1 = 2 */
0023     0x0e, 0x23,   /* alpha_tmg = 2, beta_tmg = 3 */
0024     0x10, 0x3f,   // AGC2  0x3d
0025     0x11, 0x84,
0026     0x12, 0xb9,
0027     0x15, 0xc9,   // lock detector threshold
0028     0x16, 0x00,
0029     0x17, 0x00,
0030     0x18, 0x00,
0031     0x19, 0x00,
0032     0x1a, 0x00,
0033     0x1f, 0x50,
0034     0x20, 0x00,
0035     0x21, 0x00,
0036     0x22, 0x00,
0037     0x23, 0x00,
0038     0x28, 0x00,  // out imp: normal  out type: parallel FEC mode:0
0039     0x29, 0x1e,  // 1/2 threshold
0040     0x2a, 0x14,  // 2/3 threshold
0041     0x2b, 0x0f,  // 3/4 threshold
0042     0x2c, 0x09,  // 5/6 threshold
0043     0x2d, 0x05,  // 7/8 threshold
0044     0x2e, 0x01,
0045     0x31, 0x1f,  // test all FECs
0046     0x32, 0x19,  // viterbi and synchro search
0047     0x33, 0xfc,  // rs control
0048     0x34, 0x93,  // error control
0049     0x0f, 0x52,
0050     0xff, 0xff
0051 };
0052 
0053 static int alps_bsru6_set_symbol_rate(struct dvb_frontend *fe, u32 srate, u32 ratio)
0054 {
0055     u8 aclk = 0;
0056     u8 bclk = 0;
0057 
0058     if (srate < 1500000) {
0059         aclk = 0xb7;
0060         bclk = 0x47;
0061     } else if (srate < 3000000) {
0062         aclk = 0xb7;
0063         bclk = 0x4b;
0064     } else if (srate < 7000000) {
0065         aclk = 0xb7;
0066         bclk = 0x4f;
0067     } else if (srate < 14000000) {
0068         aclk = 0xb7;
0069         bclk = 0x53;
0070     } else if (srate < 30000000) {
0071         aclk = 0xb6;
0072         bclk = 0x53;
0073     } else if (srate < 45000000) {
0074         aclk = 0xb4;
0075         bclk = 0x51;
0076     }
0077 
0078     stv0299_writereg(fe, 0x13, aclk);
0079     stv0299_writereg(fe, 0x14, bclk);
0080     stv0299_writereg(fe, 0x1f, (ratio >> 16) & 0xff);
0081     stv0299_writereg(fe, 0x20, (ratio >> 8) & 0xff);
0082     stv0299_writereg(fe, 0x21, ratio & 0xf0);
0083 
0084     return 0;
0085 }
0086 
0087 static int alps_bsru6_tuner_set_params(struct dvb_frontend *fe)
0088 {
0089     struct dtv_frontend_properties *p = &fe->dtv_property_cache;
0090     u8 buf[4];
0091     u32 div;
0092     struct i2c_msg msg = { .addr = 0x61, .flags = 0, .buf = buf, .len = sizeof(buf) };
0093     struct i2c_adapter *i2c = fe->tuner_priv;
0094 
0095     if ((p->frequency < 950000) || (p->frequency > 2150000))
0096         return -EINVAL;
0097 
0098     div = (p->frequency + (125 - 1)) / 125; /* round correctly */
0099     buf[0] = (div >> 8) & 0x7f;
0100     buf[1] = div & 0xff;
0101     buf[2] = 0x80 | ((div & 0x18000) >> 10) | 4;
0102     buf[3] = 0xC4;
0103 
0104     if (p->frequency > 1530000)
0105         buf[3] = 0xc0;
0106 
0107     if (fe->ops.i2c_gate_ctrl)
0108         fe->ops.i2c_gate_ctrl(fe, 1);
0109     if (i2c_transfer(i2c, &msg, 1) != 1)
0110         return -EIO;
0111     return 0;
0112 }
0113 
0114 static struct stv0299_config alps_bsru6_config = {
0115     .demod_address = 0x68,
0116     .inittab = alps_bsru6_inittab,
0117     .mclk = 88000000UL,
0118     .invert = 1,
0119     .skip_reinit = 0,
0120     .lock_output = STV0299_LOCKOUTPUT_1,
0121     .volt13_op0_op1 = STV0299_VOLT13_OP1,
0122     .min_delay_ms = 100,
0123     .set_symbol_rate = alps_bsru6_set_symbol_rate,
0124 };
0125 
0126 #endif