Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[media] m88ds3103: use own reg update_bits() implementation

Device stopped to tuning some channels after regmap conversion.
Reason is that regmap_update_bits() works a bit differently for
partially volatile registers than old homemade routine. Return
back to old routine in order to fix issue.

Fixes: 478932b16052f5ded74685d096ae920cd17d6424

Cc: <stable@kernel.org> # 4.2+
Reported-by: Mark Clarkstone <hello@markclarkstone.co.uk>
Tested-by: Mark Clarkstone <hello@markclarkstone.co.uk>
Signed-off-by: Antti Palosaari <crope@iki.fi>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>

authored by

Antti Palosaari and committed by
Mauro Carvalho Chehab
56ea37da d18ca5b7

+47 -26
+47 -26
drivers/media/dvb-frontends/m88ds3103.c
··· 18 18 19 19 static struct dvb_frontend_ops m88ds3103_ops; 20 20 21 + /* write single register with mask */ 22 + static int m88ds3103_update_bits(struct m88ds3103_dev *dev, 23 + u8 reg, u8 mask, u8 val) 24 + { 25 + int ret; 26 + u8 tmp; 27 + 28 + /* no need for read if whole reg is written */ 29 + if (mask != 0xff) { 30 + ret = regmap_bulk_read(dev->regmap, reg, &tmp, 1); 31 + if (ret) 32 + return ret; 33 + 34 + val &= mask; 35 + tmp &= ~mask; 36 + val |= tmp; 37 + } 38 + 39 + return regmap_bulk_write(dev->regmap, reg, &val, 1); 40 + } 41 + 21 42 /* write reg val table using reg addr auto increment */ 22 43 static int m88ds3103_wr_reg_val_tab(struct m88ds3103_dev *dev, 23 44 const struct m88ds3103_reg_val *tab, int tab_len) ··· 415 394 u8tmp2 = 0x00; /* 0b00 */ 416 395 break; 417 396 } 418 - ret = regmap_update_bits(dev->regmap, 0x22, 0xc0, u8tmp1 << 6); 397 + ret = m88ds3103_update_bits(dev, 0x22, 0xc0, u8tmp1 << 6); 419 398 if (ret) 420 399 goto err; 421 - ret = regmap_update_bits(dev->regmap, 0x24, 0xc0, u8tmp2 << 6); 400 + ret = m88ds3103_update_bits(dev, 0x24, 0xc0, u8tmp2 << 6); 422 401 if (ret) 423 402 goto err; 424 403 } ··· 476 455 if (ret) 477 456 goto err; 478 457 } 479 - ret = regmap_update_bits(dev->regmap, 0x9d, 0x08, 0x08); 458 + ret = m88ds3103_update_bits(dev, 0x9d, 0x08, 0x08); 480 459 if (ret) 481 460 goto err; 482 461 ret = regmap_write(dev->regmap, 0xf1, 0x01); 483 462 if (ret) 484 463 goto err; 485 - ret = regmap_update_bits(dev->regmap, 0x30, 0x80, 0x80); 464 + ret = m88ds3103_update_bits(dev, 0x30, 0x80, 0x80); 486 465 if (ret) 487 466 goto err; 488 467 } ··· 519 498 switch (dev->cfg->ts_mode) { 520 499 case M88DS3103_TS_SERIAL: 521 500 case M88DS3103_TS_SERIAL_D7: 522 - ret = regmap_update_bits(dev->regmap, 0x29, 0x20, u8tmp1); 501 + ret = m88ds3103_update_bits(dev, 0x29, 0x20, u8tmp1); 523 502 if (ret) 524 503 goto err; 525 504 u8tmp1 = 0; ··· 588 567 if (ret) 589 568 goto err; 590 569 591 - ret = regmap_update_bits(dev->regmap, 0x4d, 0x02, dev->cfg->spec_inv << 1); 570 + ret = m88ds3103_update_bits(dev, 0x4d, 0x02, dev->cfg->spec_inv << 1); 592 571 if (ret) 593 572 goto err; 594 573 595 - ret = regmap_update_bits(dev->regmap, 0x30, 0x10, dev->cfg->agc_inv << 4); 574 + ret = m88ds3103_update_bits(dev, 0x30, 0x10, dev->cfg->agc_inv << 4); 596 575 if (ret) 597 576 goto err; 598 577 ··· 646 625 dev->warm = false; 647 626 648 627 /* wake up device from sleep */ 649 - ret = regmap_update_bits(dev->regmap, 0x08, 0x01, 0x01); 628 + ret = m88ds3103_update_bits(dev, 0x08, 0x01, 0x01); 650 629 if (ret) 651 630 goto err; 652 - ret = regmap_update_bits(dev->regmap, 0x04, 0x01, 0x00); 631 + ret = m88ds3103_update_bits(dev, 0x04, 0x01, 0x00); 653 632 if (ret) 654 633 goto err; 655 - ret = regmap_update_bits(dev->regmap, 0x23, 0x10, 0x00); 634 + ret = m88ds3103_update_bits(dev, 0x23, 0x10, 0x00); 656 635 if (ret) 657 636 goto err; 658 637 ··· 770 749 utmp = 0x29; 771 750 else 772 751 utmp = 0x27; 773 - ret = regmap_update_bits(dev->regmap, utmp, 0x01, 0x00); 752 + ret = m88ds3103_update_bits(dev, utmp, 0x01, 0x00); 774 753 if (ret) 775 754 goto err; 776 755 777 756 /* sleep */ 778 - ret = regmap_update_bits(dev->regmap, 0x08, 0x01, 0x00); 757 + ret = m88ds3103_update_bits(dev, 0x08, 0x01, 0x00); 779 758 if (ret) 780 759 goto err; 781 - ret = regmap_update_bits(dev->regmap, 0x04, 0x01, 0x01); 760 + ret = m88ds3103_update_bits(dev, 0x04, 0x01, 0x01); 782 761 if (ret) 783 762 goto err; 784 - ret = regmap_update_bits(dev->regmap, 0x23, 0x10, 0x10); 763 + ret = m88ds3103_update_bits(dev, 0x23, 0x10, 0x10); 785 764 if (ret) 786 765 goto err; 787 766 ··· 1013 992 } 1014 993 1015 994 utmp = tone << 7 | dev->cfg->envelope_mode << 5; 1016 - ret = regmap_update_bits(dev->regmap, 0xa2, 0xe0, utmp); 995 + ret = m88ds3103_update_bits(dev, 0xa2, 0xe0, utmp); 1017 996 if (ret) 1018 997 goto err; 1019 998 1020 999 utmp = 1 << 2; 1021 - ret = regmap_update_bits(dev->regmap, 0xa1, reg_a1_mask, utmp); 1000 + ret = m88ds3103_update_bits(dev, 0xa1, reg_a1_mask, utmp); 1022 1001 if (ret) 1023 1002 goto err; 1024 1003 ··· 1068 1047 voltage_dis ^= dev->cfg->lnb_en_pol; 1069 1048 1070 1049 utmp = voltage_dis << 1 | voltage_sel << 0; 1071 - ret = regmap_update_bits(dev->regmap, 0xa2, 0x03, utmp); 1050 + ret = m88ds3103_update_bits(dev, 0xa2, 0x03, utmp); 1072 1051 if (ret) 1073 1052 goto err; 1074 1053 ··· 1101 1080 } 1102 1081 1103 1082 utmp = dev->cfg->envelope_mode << 5; 1104 - ret = regmap_update_bits(dev->regmap, 0xa2, 0xe0, utmp); 1083 + ret = m88ds3103_update_bits(dev, 0xa2, 0xe0, utmp); 1105 1084 if (ret) 1106 1085 goto err; 1107 1086 ··· 1136 1115 } else { 1137 1116 dev_dbg(&client->dev, "diseqc tx timeout\n"); 1138 1117 1139 - ret = regmap_update_bits(dev->regmap, 0xa1, 0xc0, 0x40); 1118 + ret = m88ds3103_update_bits(dev, 0xa1, 0xc0, 0x40); 1140 1119 if (ret) 1141 1120 goto err; 1142 1121 } 1143 1122 1144 - ret = regmap_update_bits(dev->regmap, 0xa2, 0xc0, 0x80); 1123 + ret = m88ds3103_update_bits(dev, 0xa2, 0xc0, 0x80); 1145 1124 if (ret) 1146 1125 goto err; 1147 1126 ··· 1173 1152 } 1174 1153 1175 1154 utmp = dev->cfg->envelope_mode << 5; 1176 - ret = regmap_update_bits(dev->regmap, 0xa2, 0xe0, utmp); 1155 + ret = m88ds3103_update_bits(dev, 0xa2, 0xe0, utmp); 1177 1156 if (ret) 1178 1157 goto err; 1179 1158 ··· 1215 1194 } else { 1216 1195 dev_dbg(&client->dev, "diseqc tx timeout\n"); 1217 1196 1218 - ret = regmap_update_bits(dev->regmap, 0xa1, 0xc0, 0x40); 1197 + ret = m88ds3103_update_bits(dev, 0xa1, 0xc0, 0x40); 1219 1198 if (ret) 1220 1199 goto err; 1221 1200 } 1222 1201 1223 - ret = regmap_update_bits(dev->regmap, 0xa2, 0xc0, 0x80); 1202 + ret = m88ds3103_update_bits(dev, 0xa2, 0xc0, 0x80); 1224 1203 if (ret) 1225 1204 goto err; 1226 1205 ··· 1456 1435 goto err_kfree; 1457 1436 1458 1437 /* sleep */ 1459 - ret = regmap_update_bits(dev->regmap, 0x08, 0x01, 0x00); 1438 + ret = m88ds3103_update_bits(dev, 0x08, 0x01, 0x00); 1460 1439 if (ret) 1461 1440 goto err_kfree; 1462 - ret = regmap_update_bits(dev->regmap, 0x04, 0x01, 0x01); 1441 + ret = m88ds3103_update_bits(dev, 0x04, 0x01, 0x01); 1463 1442 if (ret) 1464 1443 goto err_kfree; 1465 - ret = regmap_update_bits(dev->regmap, 0x23, 0x10, 0x10); 1444 + ret = m88ds3103_update_bits(dev, 0x23, 0x10, 0x10); 1466 1445 if (ret) 1467 1446 goto err_kfree; 1468 1447