0001
0002
0003
0004
0005
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,
0016 0x05, 0x35,
0017 0x06, 0x40,
0018 0x07, 0x00,
0019 0x08, 0x40,
0020 0x09, 0x00,
0021 0x0c, 0x51,
0022 0x0d, 0x82,
0023 0x0e, 0x23,
0024 0x10, 0x3f,
0025 0x11, 0x84,
0026 0x12, 0xb9,
0027 0x15, 0xc9,
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,
0039 0x29, 0x1e,
0040 0x2a, 0x14,
0041 0x2b, 0x0f,
0042 0x2c, 0x09,
0043 0x2d, 0x05,
0044 0x2e, 0x01,
0045 0x31, 0x1f,
0046 0x32, 0x19,
0047 0x33, 0xfc,
0048 0x34, 0x93,
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;
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