Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-or-later
0002 /*
0003  * E3C EC100 demodulator driver
0004  *
0005  * Copyright (C) 2009 Antti Palosaari <crope@iki.fi>
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 /* write single register */
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 /* read single register */
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 = &reg
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     /* program tuner */
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     /* reg/bw |   6  |   7  |   8
0100        -------+------+------+------
0101        A 0x1b | 0xa1 | 0xe7 | 0x2c
0102        A 0x1c | 0x55 | 0x63 | 0x72
0103        -------+------+------+------
0104        B 0x1b | 0xb7 | 0x00 | 0x49
0105        B 0x1c | 0x55 | 0x64 | 0x72 */
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); /* if freq */
0130     if (ret)
0131         goto error;
0132     ret = ec100_write_reg(state, 0x0d, 0x31); /* if freq */
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); /* go */
0141     if (ret)
0142         goto error;
0143     ret = ec100_write_reg(state, 0x00, 0x20); /* go */
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         /* bit7 set - have lock */
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             /* bit4 set - have signal */
0185             *status |= FE_HAS_SIGNAL;
0186             if (!(tmp & 0x01)) {
0187                 /* bit0 clear - have ~valid signal */
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     /* if counter overflow or clear */
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     /* allocate memory for the internal state */
0279     state = kzalloc(sizeof(struct ec100_state), GFP_KERNEL);
0280     if (state == NULL)
0281         goto error;
0282 
0283     /* setup the state */
0284     state->i2c = i2c;
0285     memcpy(&state->config, config, sizeof(struct ec100_config));
0286 
0287     /* check if the demod is there */
0288     ret = ec100_read_reg(state, 0x33, &tmp);
0289     if (ret || tmp != 0x0b)
0290         goto error;
0291 
0292     /* create dvb_frontend */
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");