0001
0002
0003
0004
0005
0006
0007
0008 #include <media/dvb_frontend.h>
0009 #include "ec100.h"
0010
0011 struct ec100_state {
0012 struct i2c_adapter *i2c;
0013 struct dvb_frontend frontend;
0014 struct ec100_config config;
0015
0016 u16 ber;
0017 };
0018
0019
0020 static int ec100_write_reg(struct ec100_state *state, u8 reg, u8 val)
0021 {
0022 int ret;
0023 u8 buf[2] = {reg, val};
0024 struct i2c_msg msg[1] = {
0025 {
0026 .addr = state->config.demod_address,
0027 .flags = 0,
0028 .len = sizeof(buf),
0029 .buf = buf,
0030 }
0031 };
0032
0033 ret = i2c_transfer(state->i2c, msg, 1);
0034 if (ret == 1) {
0035 ret = 0;
0036 } else {
0037 dev_warn(&state->i2c->dev, "%s: i2c wr failed=%d reg=%02x\n",
0038 KBUILD_MODNAME, ret, reg);
0039 ret = -EREMOTEIO;
0040 }
0041
0042 return ret;
0043 }
0044
0045
0046 static int ec100_read_reg(struct ec100_state *state, u8 reg, u8 *val)
0047 {
0048 int ret;
0049 struct i2c_msg msg[2] = {
0050 {
0051 .addr = state->config.demod_address,
0052 .flags = 0,
0053 .len = 1,
0054 .buf = ®
0055 }, {
0056 .addr = state->config.demod_address,
0057 .flags = I2C_M_RD,
0058 .len = 1,
0059 .buf = val
0060 }
0061 };
0062
0063 ret = i2c_transfer(state->i2c, msg, 2);
0064 if (ret == 2) {
0065 ret = 0;
0066 } else {
0067 dev_warn(&state->i2c->dev, "%s: i2c rd failed=%d reg=%02x\n",
0068 KBUILD_MODNAME, ret, reg);
0069 ret = -EREMOTEIO;
0070 }
0071
0072 return ret;
0073 }
0074
0075 static int ec100_set_frontend(struct dvb_frontend *fe)
0076 {
0077 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
0078 struct ec100_state *state = fe->demodulator_priv;
0079 int ret;
0080 u8 tmp, tmp2;
0081
0082 dev_dbg(&state->i2c->dev, "%s: frequency=%d bandwidth_hz=%d\n",
0083 __func__, c->frequency, c->bandwidth_hz);
0084
0085
0086 if (fe->ops.tuner_ops.set_params)
0087 fe->ops.tuner_ops.set_params(fe);
0088
0089 ret = ec100_write_reg(state, 0x04, 0x06);
0090 if (ret)
0091 goto error;
0092 ret = ec100_write_reg(state, 0x67, 0x58);
0093 if (ret)
0094 goto error;
0095 ret = ec100_write_reg(state, 0x05, 0x18);
0096 if (ret)
0097 goto error;
0098
0099
0100
0101
0102
0103
0104
0105
0106
0107 switch (c->bandwidth_hz) {
0108 case 6000000:
0109 tmp = 0xb7;
0110 tmp2 = 0x55;
0111 break;
0112 case 7000000:
0113 tmp = 0x00;
0114 tmp2 = 0x64;
0115 break;
0116 case 8000000:
0117 default:
0118 tmp = 0x49;
0119 tmp2 = 0x72;
0120 }
0121
0122 ret = ec100_write_reg(state, 0x1b, tmp);
0123 if (ret)
0124 goto error;
0125 ret = ec100_write_reg(state, 0x1c, tmp2);
0126 if (ret)
0127 goto error;
0128
0129 ret = ec100_write_reg(state, 0x0c, 0xbb);
0130 if (ret)
0131 goto error;
0132 ret = ec100_write_reg(state, 0x0d, 0x31);
0133 if (ret)
0134 goto error;
0135
0136 ret = ec100_write_reg(state, 0x08, 0x24);
0137 if (ret)
0138 goto error;
0139
0140 ret = ec100_write_reg(state, 0x00, 0x00);
0141 if (ret)
0142 goto error;
0143 ret = ec100_write_reg(state, 0x00, 0x20);
0144 if (ret)
0145 goto error;
0146
0147 return ret;
0148 error:
0149 dev_dbg(&state->i2c->dev, "%s: failed=%d\n", __func__, ret);
0150 return ret;
0151 }
0152
0153 static int ec100_get_tune_settings(struct dvb_frontend *fe,
0154 struct dvb_frontend_tune_settings *fesettings)
0155 {
0156 fesettings->min_delay_ms = 300;
0157 fesettings->step_size = 0;
0158 fesettings->max_drift = 0;
0159
0160 return 0;
0161 }
0162
0163 static int ec100_read_status(struct dvb_frontend *fe, enum fe_status *status)
0164 {
0165 struct ec100_state *state = fe->demodulator_priv;
0166 int ret;
0167 u8 tmp;
0168 *status = 0;
0169
0170 ret = ec100_read_reg(state, 0x42, &tmp);
0171 if (ret)
0172 goto error;
0173
0174 if (tmp & 0x80) {
0175
0176 *status |= FE_HAS_SIGNAL | FE_HAS_CARRIER | FE_HAS_VITERBI |
0177 FE_HAS_SYNC | FE_HAS_LOCK;
0178 } else {
0179 ret = ec100_read_reg(state, 0x01, &tmp);
0180 if (ret)
0181 goto error;
0182
0183 if (tmp & 0x10) {
0184
0185 *status |= FE_HAS_SIGNAL;
0186 if (!(tmp & 0x01)) {
0187
0188 *status |= FE_HAS_CARRIER | FE_HAS_VITERBI;
0189 }
0190 }
0191 }
0192
0193 return ret;
0194 error:
0195 dev_dbg(&state->i2c->dev, "%s: failed=%d\n", __func__, ret);
0196 return ret;
0197 }
0198
0199 static int ec100_read_ber(struct dvb_frontend *fe, u32 *ber)
0200 {
0201 struct ec100_state *state = fe->demodulator_priv;
0202 int ret;
0203 u8 tmp, tmp2;
0204 u16 ber2;
0205
0206 *ber = 0;
0207
0208 ret = ec100_read_reg(state, 0x65, &tmp);
0209 if (ret)
0210 goto error;
0211 ret = ec100_read_reg(state, 0x66, &tmp2);
0212 if (ret)
0213 goto error;
0214
0215 ber2 = (tmp2 << 8) | tmp;
0216
0217
0218 if (ber2 < state->ber)
0219 *ber = ber2;
0220 else
0221 *ber = ber2 - state->ber;
0222
0223 state->ber = ber2;
0224
0225 return ret;
0226 error:
0227 dev_dbg(&state->i2c->dev, "%s: failed=%d\n", __func__, ret);
0228 return ret;
0229 }
0230
0231 static int ec100_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
0232 {
0233 struct ec100_state *state = fe->demodulator_priv;
0234 int ret;
0235 u8 tmp;
0236
0237 ret = ec100_read_reg(state, 0x24, &tmp);
0238 if (ret) {
0239 *strength = 0;
0240 goto error;
0241 }
0242
0243 *strength = ((tmp << 8) | tmp);
0244
0245 return ret;
0246 error:
0247 dev_dbg(&state->i2c->dev, "%s: failed=%d\n", __func__, ret);
0248 return ret;
0249 }
0250
0251 static int ec100_read_snr(struct dvb_frontend *fe, u16 *snr)
0252 {
0253 *snr = 0;
0254 return 0;
0255 }
0256
0257 static int ec100_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
0258 {
0259 *ucblocks = 0;
0260 return 0;
0261 }
0262
0263 static void ec100_release(struct dvb_frontend *fe)
0264 {
0265 struct ec100_state *state = fe->demodulator_priv;
0266 kfree(state);
0267 }
0268
0269 static const struct dvb_frontend_ops ec100_ops;
0270
0271 struct dvb_frontend *ec100_attach(const struct ec100_config *config,
0272 struct i2c_adapter *i2c)
0273 {
0274 int ret;
0275 struct ec100_state *state = NULL;
0276 u8 tmp;
0277
0278
0279 state = kzalloc(sizeof(struct ec100_state), GFP_KERNEL);
0280 if (state == NULL)
0281 goto error;
0282
0283
0284 state->i2c = i2c;
0285 memcpy(&state->config, config, sizeof(struct ec100_config));
0286
0287
0288 ret = ec100_read_reg(state, 0x33, &tmp);
0289 if (ret || tmp != 0x0b)
0290 goto error;
0291
0292
0293 memcpy(&state->frontend.ops, &ec100_ops,
0294 sizeof(struct dvb_frontend_ops));
0295 state->frontend.demodulator_priv = state;
0296
0297 return &state->frontend;
0298 error:
0299 kfree(state);
0300 return NULL;
0301 }
0302 EXPORT_SYMBOL(ec100_attach);
0303
0304 static const struct dvb_frontend_ops ec100_ops = {
0305 .delsys = { SYS_DVBT },
0306 .info = {
0307 .name = "E3C EC100 DVB-T",
0308 .caps =
0309 FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
0310 FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
0311 FE_CAN_QPSK | FE_CAN_QAM_16 |
0312 FE_CAN_QAM_64 | FE_CAN_QAM_AUTO |
0313 FE_CAN_TRANSMISSION_MODE_AUTO |
0314 FE_CAN_GUARD_INTERVAL_AUTO |
0315 FE_CAN_HIERARCHY_AUTO |
0316 FE_CAN_MUTE_TS
0317 },
0318
0319 .release = ec100_release,
0320 .set_frontend = ec100_set_frontend,
0321 .get_tune_settings = ec100_get_tune_settings,
0322 .read_status = ec100_read_status,
0323 .read_ber = ec100_read_ber,
0324 .read_signal_strength = ec100_read_signal_strength,
0325 .read_snr = ec100_read_snr,
0326 .read_ucblocks = ec100_read_ucblocks,
0327 };
0328
0329 MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");
0330 MODULE_DESCRIPTION("E3C EC100 DVB-T demodulator driver");
0331 MODULE_LICENSE("GPL");