0001
0002
0003
0004
0005
0006
0007
0008 #include "zd1301_demod.h"
0009
0010 static u8 zd1301_demod_gain = 0x38;
0011 module_param_named(gain, zd1301_demod_gain, byte, 0644);
0012 MODULE_PARM_DESC(gain, "gain (value: 0x00 - 0x70, default: 0x38)");
0013
0014 struct zd1301_demod_dev {
0015 struct platform_device *pdev;
0016 struct dvb_frontend frontend;
0017 struct i2c_adapter adapter;
0018 u8 gain;
0019 };
0020
0021 static int zd1301_demod_wreg(struct zd1301_demod_dev *dev, u16 reg, u8 val)
0022 {
0023 struct platform_device *pdev = dev->pdev;
0024 struct zd1301_demod_platform_data *pdata = pdev->dev.platform_data;
0025
0026 return pdata->reg_write(pdata->reg_priv, reg, val);
0027 }
0028
0029 static int zd1301_demod_rreg(struct zd1301_demod_dev *dev, u16 reg, u8 *val)
0030 {
0031 struct platform_device *pdev = dev->pdev;
0032 struct zd1301_demod_platform_data *pdata = pdev->dev.platform_data;
0033
0034 return pdata->reg_read(pdata->reg_priv, reg, val);
0035 }
0036
0037 static int zd1301_demod_set_frontend(struct dvb_frontend *fe)
0038 {
0039 struct zd1301_demod_dev *dev = fe->demodulator_priv;
0040 struct platform_device *pdev = dev->pdev;
0041 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
0042 int ret;
0043 u32 if_frequency;
0044 u8 r6a50_val;
0045
0046 dev_dbg(&pdev->dev, "frequency=%u bandwidth_hz=%u\n",
0047 c->frequency, c->bandwidth_hz);
0048
0049
0050 if (fe->ops.tuner_ops.set_params &&
0051 fe->ops.tuner_ops.get_if_frequency) {
0052 ret = fe->ops.tuner_ops.set_params(fe);
0053 if (ret)
0054 goto err;
0055 ret = fe->ops.tuner_ops.get_if_frequency(fe, &if_frequency);
0056 if (ret)
0057 goto err;
0058 } else {
0059 ret = -EINVAL;
0060 goto err;
0061 }
0062
0063 dev_dbg(&pdev->dev, "if_frequency=%u\n", if_frequency);
0064 if (if_frequency != 36150000) {
0065 ret = -EINVAL;
0066 goto err;
0067 }
0068
0069 switch (c->bandwidth_hz) {
0070 case 6000000:
0071 r6a50_val = 0x78;
0072 break;
0073 case 7000000:
0074 r6a50_val = 0x68;
0075 break;
0076 case 8000000:
0077 r6a50_val = 0x58;
0078 break;
0079 default:
0080 ret = -EINVAL;
0081 goto err;
0082 }
0083
0084 ret = zd1301_demod_wreg(dev, 0x6a60, 0x11);
0085 if (ret)
0086 goto err;
0087 ret = zd1301_demod_wreg(dev, 0x6a47, 0x46);
0088 if (ret)
0089 goto err;
0090 ret = zd1301_demod_wreg(dev, 0x6a48, 0x46);
0091 if (ret)
0092 goto err;
0093 ret = zd1301_demod_wreg(dev, 0x6a4a, 0x15);
0094 if (ret)
0095 goto err;
0096 ret = zd1301_demod_wreg(dev, 0x6a4b, 0x63);
0097 if (ret)
0098 goto err;
0099 ret = zd1301_demod_wreg(dev, 0x6a5b, 0x99);
0100 if (ret)
0101 goto err;
0102 ret = zd1301_demod_wreg(dev, 0x6a3b, 0x10);
0103 if (ret)
0104 goto err;
0105 ret = zd1301_demod_wreg(dev, 0x6806, 0x01);
0106 if (ret)
0107 goto err;
0108 ret = zd1301_demod_wreg(dev, 0x6a41, 0x08);
0109 if (ret)
0110 goto err;
0111 ret = zd1301_demod_wreg(dev, 0x6a42, 0x46);
0112 if (ret)
0113 goto err;
0114 ret = zd1301_demod_wreg(dev, 0x6a44, 0x14);
0115 if (ret)
0116 goto err;
0117 ret = zd1301_demod_wreg(dev, 0x6a45, 0x67);
0118 if (ret)
0119 goto err;
0120 ret = zd1301_demod_wreg(dev, 0x6a38, 0x00);
0121 if (ret)
0122 goto err;
0123 ret = zd1301_demod_wreg(dev, 0x6a4c, 0x52);
0124 if (ret)
0125 goto err;
0126 ret = zd1301_demod_wreg(dev, 0x6a49, 0x2a);
0127 if (ret)
0128 goto err;
0129 ret = zd1301_demod_wreg(dev, 0x6840, 0x2e);
0130 if (ret)
0131 goto err;
0132 ret = zd1301_demod_wreg(dev, 0x6a50, r6a50_val);
0133 if (ret)
0134 goto err;
0135 ret = zd1301_demod_wreg(dev, 0x6a38, 0x07);
0136 if (ret)
0137 goto err;
0138
0139 return 0;
0140 err:
0141 dev_dbg(&pdev->dev, "failed=%d\n", ret);
0142 return ret;
0143 }
0144
0145 static int zd1301_demod_sleep(struct dvb_frontend *fe)
0146 {
0147 struct zd1301_demod_dev *dev = fe->demodulator_priv;
0148 struct platform_device *pdev = dev->pdev;
0149 int ret;
0150
0151 dev_dbg(&pdev->dev, "\n");
0152
0153 ret = zd1301_demod_wreg(dev, 0x6a43, 0x70);
0154 if (ret)
0155 goto err;
0156 ret = zd1301_demod_wreg(dev, 0x684e, 0x00);
0157 if (ret)
0158 goto err;
0159 ret = zd1301_demod_wreg(dev, 0x6849, 0x00);
0160 if (ret)
0161 goto err;
0162 ret = zd1301_demod_wreg(dev, 0x68e2, 0xd7);
0163 if (ret)
0164 goto err;
0165 ret = zd1301_demod_wreg(dev, 0x68e0, 0x39);
0166 if (ret)
0167 goto err;
0168 ret = zd1301_demod_wreg(dev, 0x6840, 0x21);
0169 if (ret)
0170 goto err;
0171
0172 return 0;
0173 err:
0174 dev_dbg(&pdev->dev, "failed=%d\n", ret);
0175 return ret;
0176 }
0177
0178 static int zd1301_demod_init(struct dvb_frontend *fe)
0179 {
0180 struct zd1301_demod_dev *dev = fe->demodulator_priv;
0181 struct platform_device *pdev = dev->pdev;
0182 int ret;
0183
0184 dev_dbg(&pdev->dev, "\n");
0185
0186 ret = zd1301_demod_wreg(dev, 0x6840, 0x26);
0187 if (ret)
0188 goto err;
0189 ret = zd1301_demod_wreg(dev, 0x68e0, 0xff);
0190 if (ret)
0191 goto err;
0192 ret = zd1301_demod_wreg(dev, 0x68e2, 0xd8);
0193 if (ret)
0194 goto err;
0195 ret = zd1301_demod_wreg(dev, 0x6849, 0x4e);
0196 if (ret)
0197 goto err;
0198 ret = zd1301_demod_wreg(dev, 0x684e, 0x01);
0199 if (ret)
0200 goto err;
0201 ret = zd1301_demod_wreg(dev, 0x6a43, zd1301_demod_gain);
0202 if (ret)
0203 goto err;
0204
0205 return 0;
0206 err:
0207 dev_dbg(&pdev->dev, "failed=%d\n", ret);
0208 return ret;
0209 }
0210
0211 static int zd1301_demod_get_tune_settings(struct dvb_frontend *fe,
0212 struct dvb_frontend_tune_settings *settings)
0213 {
0214 struct zd1301_demod_dev *dev = fe->demodulator_priv;
0215 struct platform_device *pdev = dev->pdev;
0216
0217 dev_dbg(&pdev->dev, "\n");
0218
0219
0220 settings->min_delay_ms = 400;
0221
0222 return 0;
0223 }
0224
0225 static int zd1301_demod_read_status(struct dvb_frontend *fe,
0226 enum fe_status *status)
0227 {
0228 struct zd1301_demod_dev *dev = fe->demodulator_priv;
0229 struct platform_device *pdev = dev->pdev;
0230 int ret;
0231 u8 u8tmp;
0232
0233 ret = zd1301_demod_rreg(dev, 0x6a24, &u8tmp);
0234 if (ret)
0235 goto err;
0236 if (u8tmp > 0x00 && u8tmp < 0x20)
0237 *status = FE_HAS_SIGNAL | FE_HAS_CARRIER | FE_HAS_VITERBI |
0238 FE_HAS_SYNC | FE_HAS_LOCK;
0239 else
0240 *status = 0;
0241
0242 dev_dbg(&pdev->dev, "lock byte=%02x\n", u8tmp);
0243
0244
0245
0246
0247
0248
0249
0250
0251
0252
0253
0254
0255
0256
0257
0258 if (dev->gain != zd1301_demod_gain) {
0259 dev->gain = zd1301_demod_gain;
0260
0261 ret = zd1301_demod_wreg(dev, 0x6a43, dev->gain);
0262 if (ret)
0263 goto err;
0264 }
0265
0266 return 0;
0267 err:
0268 dev_dbg(&pdev->dev, "failed=%d\n", ret);
0269 return ret;
0270 }
0271
0272 static const struct dvb_frontend_ops zd1301_demod_ops = {
0273 .delsys = {SYS_DVBT},
0274 .info = {
0275 .name = "ZyDAS ZD1301",
0276 .caps = FE_CAN_FEC_1_2 |
0277 FE_CAN_FEC_2_3 |
0278 FE_CAN_FEC_3_4 |
0279 FE_CAN_FEC_5_6 |
0280 FE_CAN_FEC_7_8 |
0281 FE_CAN_FEC_AUTO |
0282 FE_CAN_QPSK |
0283 FE_CAN_QAM_16 |
0284 FE_CAN_QAM_64 |
0285 FE_CAN_QAM_AUTO |
0286 FE_CAN_TRANSMISSION_MODE_AUTO |
0287 FE_CAN_GUARD_INTERVAL_AUTO |
0288 FE_CAN_HIERARCHY_AUTO |
0289 FE_CAN_MUTE_TS
0290 },
0291
0292 .sleep = zd1301_demod_sleep,
0293 .init = zd1301_demod_init,
0294 .set_frontend = zd1301_demod_set_frontend,
0295 .get_tune_settings = zd1301_demod_get_tune_settings,
0296 .read_status = zd1301_demod_read_status,
0297 };
0298
0299 struct dvb_frontend *zd1301_demod_get_dvb_frontend(struct platform_device *pdev)
0300 {
0301 struct zd1301_demod_dev *dev = platform_get_drvdata(pdev);
0302
0303 dev_dbg(&pdev->dev, "\n");
0304
0305 return &dev->frontend;
0306 }
0307 EXPORT_SYMBOL(zd1301_demod_get_dvb_frontend);
0308
0309 static int zd1301_demod_i2c_master_xfer(struct i2c_adapter *adapter,
0310 struct i2c_msg msg[], int num)
0311 {
0312 struct zd1301_demod_dev *dev = i2c_get_adapdata(adapter);
0313 struct platform_device *pdev = dev->pdev;
0314 int ret, i;
0315 unsigned long timeout;
0316 u8 u8tmp;
0317
0318 #define I2C_XFER_TIMEOUT 5
0319 #define ZD1301_IS_I2C_XFER_WRITE_READ(_msg, _num) \
0320 (_num == 2 && !(_msg[0].flags & I2C_M_RD) && (_msg[1].flags & I2C_M_RD))
0321 #define ZD1301_IS_I2C_XFER_WRITE(_msg, _num) \
0322 (_num == 1 && !(_msg[0].flags & I2C_M_RD))
0323 #define ZD1301_IS_I2C_XFER_READ(_msg, _num) \
0324 (_num == 1 && (_msg[0].flags & I2C_M_RD))
0325 if (ZD1301_IS_I2C_XFER_WRITE_READ(msg, num)) {
0326 dev_dbg(&pdev->dev, "write&read msg[0].len=%u msg[1].len=%u\n",
0327 msg[0].len, msg[1].len);
0328 if (msg[0].len > 1 || msg[1].len > 8) {
0329 ret = -EOPNOTSUPP;
0330 goto err;
0331 }
0332
0333 ret = zd1301_demod_wreg(dev, 0x6811, 0x80);
0334 if (ret)
0335 goto err;
0336 ret = zd1301_demod_wreg(dev, 0x6812, 0x05);
0337 if (ret)
0338 goto err;
0339 ret = zd1301_demod_wreg(dev, 0x6813, msg[1].addr << 1);
0340 if (ret)
0341 goto err;
0342 ret = zd1301_demod_wreg(dev, 0x6801, msg[0].buf[0]);
0343 if (ret)
0344 goto err;
0345 ret = zd1301_demod_wreg(dev, 0x6802, 0x00);
0346 if (ret)
0347 goto err;
0348 ret = zd1301_demod_wreg(dev, 0x6803, 0x06);
0349 if (ret)
0350 goto err;
0351 ret = zd1301_demod_wreg(dev, 0x6805, 0x00);
0352 if (ret)
0353 goto err;
0354 ret = zd1301_demod_wreg(dev, 0x6804, msg[1].len);
0355 if (ret)
0356 goto err;
0357
0358
0359 timeout = jiffies + msecs_to_jiffies(I2C_XFER_TIMEOUT);
0360 for (u8tmp = 1; !time_after(jiffies, timeout) && u8tmp;) {
0361 usleep_range(500, 800);
0362
0363 ret = zd1301_demod_rreg(dev, 0x6804, &u8tmp);
0364 if (ret)
0365 goto err;
0366 }
0367
0368 for (i = 0; i < msg[1].len; i++) {
0369 ret = zd1301_demod_rreg(dev, 0x0600 + i, &msg[1].buf[i]);
0370 if (ret)
0371 goto err;
0372 }
0373 } else if (ZD1301_IS_I2C_XFER_WRITE(msg, num)) {
0374 dev_dbg(&pdev->dev, "write msg[0].len=%u\n", msg[0].len);
0375 if (msg[0].len > 1 + 8) {
0376 ret = -EOPNOTSUPP;
0377 goto err;
0378 }
0379
0380 ret = zd1301_demod_wreg(dev, 0x6811, 0x80);
0381 if (ret)
0382 goto err;
0383 ret = zd1301_demod_wreg(dev, 0x6812, 0x01);
0384 if (ret)
0385 goto err;
0386 ret = zd1301_demod_wreg(dev, 0x6813, msg[0].addr << 1);
0387 if (ret)
0388 goto err;
0389 ret = zd1301_demod_wreg(dev, 0x6800, msg[0].buf[0]);
0390 if (ret)
0391 goto err;
0392 ret = zd1301_demod_wreg(dev, 0x6802, 0x00);
0393 if (ret)
0394 goto err;
0395 ret = zd1301_demod_wreg(dev, 0x6803, 0x06);
0396 if (ret)
0397 goto err;
0398
0399 for (i = 0; i < msg[0].len - 1; i++) {
0400 ret = zd1301_demod_wreg(dev, 0x0600 + i, msg[0].buf[1 + i]);
0401 if (ret)
0402 goto err;
0403 }
0404
0405 ret = zd1301_demod_wreg(dev, 0x6805, 0x80);
0406 if (ret)
0407 goto err;
0408 ret = zd1301_demod_wreg(dev, 0x6804, msg[0].len - 1);
0409 if (ret)
0410 goto err;
0411
0412
0413 timeout = jiffies + msecs_to_jiffies(I2C_XFER_TIMEOUT);
0414 for (u8tmp = 1; !time_after(jiffies, timeout) && u8tmp;) {
0415 usleep_range(500, 800);
0416
0417 ret = zd1301_demod_rreg(dev, 0x6804, &u8tmp);
0418 if (ret)
0419 goto err;
0420 }
0421 } else {
0422 dev_dbg(&pdev->dev, "unknown msg[0].len=%u\n", msg[0].len);
0423 ret = -EOPNOTSUPP;
0424 goto err;
0425 }
0426
0427 return num;
0428 err:
0429 dev_dbg(&pdev->dev, "failed=%d\n", ret);
0430 return ret;
0431 }
0432
0433 static u32 zd1301_demod_i2c_functionality(struct i2c_adapter *adapter)
0434 {
0435 return I2C_FUNC_I2C;
0436 }
0437
0438 static const struct i2c_algorithm zd1301_demod_i2c_algorithm = {
0439 .master_xfer = zd1301_demod_i2c_master_xfer,
0440 .functionality = zd1301_demod_i2c_functionality,
0441 };
0442
0443 struct i2c_adapter *zd1301_demod_get_i2c_adapter(struct platform_device *pdev)
0444 {
0445 struct zd1301_demod_dev *dev = platform_get_drvdata(pdev);
0446
0447 dev_dbg(&pdev->dev, "\n");
0448
0449 return &dev->adapter;
0450 }
0451 EXPORT_SYMBOL(zd1301_demod_get_i2c_adapter);
0452
0453
0454 static int zd1301_demod_probe(struct platform_device *pdev)
0455 {
0456 struct zd1301_demod_dev *dev;
0457 struct zd1301_demod_platform_data *pdata = pdev->dev.platform_data;
0458 int ret;
0459
0460 dev_dbg(&pdev->dev, "\n");
0461
0462 if (!pdata) {
0463 ret = -EINVAL;
0464 dev_err(&pdev->dev, "cannot proceed without platform data\n");
0465 goto err;
0466 }
0467 if (!pdev->dev.parent->driver) {
0468 ret = -EINVAL;
0469 dev_dbg(&pdev->dev, "no parent device\n");
0470 goto err;
0471 }
0472
0473 dev = kzalloc(sizeof(*dev), GFP_KERNEL);
0474 if (!dev) {
0475 ret = -ENOMEM;
0476 goto err;
0477 }
0478
0479
0480 dev->pdev = pdev;
0481 dev->gain = zd1301_demod_gain;
0482
0483
0484 ret = zd1301_demod_wreg(dev, 0x6840, 0x21);
0485 if (ret)
0486 goto err_kfree;
0487 ret = zd1301_demod_wreg(dev, 0x6a38, 0x07);
0488 if (ret)
0489 goto err_kfree;
0490
0491
0492 strscpy(dev->adapter.name, "ZyDAS ZD1301 demod",
0493 sizeof(dev->adapter.name));
0494 dev->adapter.algo = &zd1301_demod_i2c_algorithm;
0495 dev->adapter.algo_data = NULL;
0496 dev->adapter.dev.parent = pdev->dev.parent;
0497 i2c_set_adapdata(&dev->adapter, dev);
0498 ret = i2c_add_adapter(&dev->adapter);
0499 if (ret) {
0500 dev_err(&pdev->dev, "I2C adapter add failed %d\n", ret);
0501 goto err_kfree;
0502 }
0503
0504
0505 memcpy(&dev->frontend.ops, &zd1301_demod_ops, sizeof(dev->frontend.ops));
0506 dev->frontend.demodulator_priv = dev;
0507 platform_set_drvdata(pdev, dev);
0508 dev_info(&pdev->dev, "ZyDAS ZD1301 demod attached\n");
0509
0510 return 0;
0511 err_kfree:
0512 kfree(dev);
0513 err:
0514 dev_dbg(&pdev->dev, "failed=%d\n", ret);
0515 return ret;
0516 }
0517
0518 static int zd1301_demod_remove(struct platform_device *pdev)
0519 {
0520 struct zd1301_demod_dev *dev = platform_get_drvdata(pdev);
0521
0522 dev_dbg(&pdev->dev, "\n");
0523
0524 i2c_del_adapter(&dev->adapter);
0525 kfree(dev);
0526
0527 return 0;
0528 }
0529
0530 static struct platform_driver zd1301_demod_driver = {
0531 .driver = {
0532 .name = "zd1301_demod",
0533 .suppress_bind_attrs = true,
0534 },
0535 .probe = zd1301_demod_probe,
0536 .remove = zd1301_demod_remove,
0537 };
0538 module_platform_driver(zd1301_demod_driver);
0539
0540 MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");
0541 MODULE_DESCRIPTION("ZyDAS ZD1301 demodulator driver");
0542 MODULE_LICENSE("GPL");