hc
2023-12-11 d2ccde1c8e90d38cee87a1b0309ad2827f3fd30d
kernel/drivers/media/dvb-frontends/tc90522.c
....@@ -685,10 +685,33 @@
685685 p += new_msgs[j].len;
686686 }
687687
688
- if (i < num)
688
+ if (i < num) {
689689 ret = -ENOMEM;
690
- else
690
+ } else if (!state->cfg.split_tuner_read_i2c || rd_num == 0) {
691691 ret = i2c_transfer(state->i2c_client->adapter, new_msgs, j);
692
+ } else {
693
+ /*
694
+ * Split transactions at each I2C_M_RD message.
695
+ * Some of the parent device require this,
696
+ * such as Friio (see. dvb-usb-gl861).
697
+ */
698
+ int from, to;
699
+
700
+ ret = 0;
701
+ from = 0;
702
+ do {
703
+ int r;
704
+
705
+ to = from + 1;
706
+ while (to < j && !(new_msgs[to].flags & I2C_M_RD))
707
+ to++;
708
+ r = i2c_transfer(state->i2c_client->adapter,
709
+ &new_msgs[from], to - from);
710
+ ret = (r <= 0) ? r : ret + r;
711
+ from = to;
712
+ } while (from < j && ret > 0);
713
+ }
714
+
692715 if (ret >= 0 && ret < j)
693716 ret = -EIO;
694717 kfree(new_msgs);
....@@ -781,7 +804,7 @@
781804 adap->owner = THIS_MODULE;
782805 adap->algo = &tc90522_tuner_i2c_algo;
783806 adap->dev.parent = &client->dev;
784
- strlcpy(adap->name, "tc90522_sub", sizeof(adap->name));
807
+ strscpy(adap->name, "tc90522_sub", sizeof(adap->name));
785808 i2c_set_adapdata(adap, state);
786809 ret = i2c_add_adapter(adap);
787810 if (ret < 0)