[Feature][T106_eSDK]update from T106-V2.01.01.02P56U06.AP.15.05_CAP.15.05 to T106-V2.01.01.02P56U06.AP.15.11_CAP.15.11.01
Only Configure: No
Affected branch: master
Affected module: unknow
Is it affected on both ZXIC and MTK: only ZXIC
Self-test: Yes
Doc Update: No
Change-Id: If8f21262a363af23493123574902bf038b8ff297
diff --git a/upstream/linux-5.10/drivers/spi/spidev.c b/upstream/linux-5.10/drivers/spi/spidev.c
index 1522a21..2a7cdbc 100755
--- a/upstream/linux-5.10/drivers/spi/spidev.c
+++ b/upstream/linux-5.10/drivers/spi/spidev.c
@@ -217,48 +217,30 @@
return -EMSGSIZE;
spidev = filp->private_data;
+ /* yu.dong@20240715 [T106BUG-641] SPI packet loss problem, merged into ZXW patch start */
+ if(spidev->spi->master->slave) {
+ #ifdef SPI_SLAVE_FOR_YK
+ size_t total = 0;
+ if (spidev->spi->rd_pos == spidev->spi->recv_pos) {
-
- #ifdef SPI_SLAVE_FOR_YK
- size_t total = 0;
-
- if (spidev->spi->rd_pos == spidev->spi->recv_pos) {
-
- status = 0;
- spidev->spi->is_rd_waiting = true;
- if(0 != wait_event_freezable(spidev->spi->rd_wait, spidev->spi->recv_done)) {
- if(spidev->spi->controller->spi_slave_rd_stop)
- spidev->spi->controller->spi_slave_rd_stop(spidev->spi);
- spidev->spi->is_rd_waiting = false;
- return status;
- }else {
- spidev->spi->recv_done = false;
- spidev->spi->is_rd_waiting = false;
+ status = 0;
+ spidev->spi->is_rd_waiting = true;
+ if(0 != wait_event_freezable(spidev->spi->rd_wait, spidev->spi->recv_done)) {
+ if(spidev->spi->controller->spi_slave_rd_stop)
+ spidev->spi->controller->spi_slave_rd_stop(spidev->spi);
+ spidev->spi->is_rd_waiting = false;
+ return status;
+ }else {
+ spidev->spi->recv_done = false;
+ spidev->spi->is_rd_waiting = false;
+ }
}
- }
- mutex_lock(&spidev->buf_lock);
- if(spidev->spi->rd_pos < spidev->spi->recv_pos) {
+ mutex_lock(&spidev->buf_lock);
+ if(spidev->spi->rd_pos < spidev->spi->recv_pos) {
- total = spidev->spi->recv_pos - spidev->spi->rd_pos;
- status = (total > count) ? count : total;
-
- missing = copy_to_user(buf, spidev->rx_buffer+spidev->spi->rd_pos, status);
- if (missing == status) {
- status = -EFAULT;
- }
- else {
- status = status - missing;
- spidev->spi->rd_pos += status;
- }
-
- }else if(spidev->spi->rd_pos > spidev->spi->recv_pos) {
-
- total = bufsiz - (spidev->spi->rd_pos - spidev->spi->recv_pos);
- status = (total > count) ? count : total;
-
- if((spidev->spi->rd_pos + status) <= bufsiz) {
-
+ total = spidev->spi->recv_pos - spidev->spi->rd_pos;
+ status = (total > count) ? count : total;
missing = copy_to_user(buf, spidev->rx_buffer+spidev->spi->rd_pos, status);
if (missing == status) {
status = -EFAULT;
@@ -266,48 +248,81 @@
else {
status = status - missing;
spidev->spi->rd_pos += status;
- spidev->spi->rd_pos = spidev->spi->rd_pos%bufsiz;
- }
- }else {
-
- unsigned long first,rest;
-
- first = bufsiz - spidev->spi->rd_pos;
- missing = copy_to_user(buf, spidev->rx_buffer+spidev->spi->rd_pos, first);
- if (missing == first) {
- status = -EFAULT;
- } else {
- status = status - missing;
}
- rest = status-first;
- missing = copy_to_user(buf+first, spidev->rx_buffer, rest);
- if (missing == rest) {
- status = -EFAULT;
- } else {
- status = status - missing;
+ }else if(spidev->spi->rd_pos > spidev->spi->recv_pos) {
+
+ total = bufsiz - (spidev->spi->rd_pos - spidev->spi->recv_pos);
+ status = (total > count) ? count : total;
+
+ if((spidev->spi->rd_pos + status) <= bufsiz) {
+
+ missing = copy_to_user(buf, spidev->rx_buffer+spidev->spi->rd_pos, status);
+ if (missing == status) {
+ status = -EFAULT;
+ }
+ else {
+ status = status - missing;
+ spidev->spi->rd_pos += status;
+ spidev->spi->rd_pos = spidev->spi->rd_pos%bufsiz;
+ }
+ }else {
+
+ unsigned long first,rest;
+
+ first = bufsiz - spidev->spi->rd_pos;
+ missing = copy_to_user(buf, spidev->rx_buffer+spidev->spi->rd_pos, first);
+ if (missing == first) {
+ status = -EFAULT;
+ } else {
+ status = status - missing;
+ }
+
+ rest = status-first;
+ missing = copy_to_user(buf+first, spidev->rx_buffer, rest);
+ if (missing == rest) {
+ status = -EFAULT;
+ } else {
+ status = status - missing;
+ }
+ spidev->spi->rd_pos = rest;
}
- spidev->spi->rd_pos = rest;
}
- }
- #else
- mutex_lock(&spidev->buf_lock);
- if(spidev->rd_from_rx_buffer)
- status = count;
- else
- status = spidev_sync_read(spidev, count);
-
- if (status > 0) {
-
- missing = copy_to_user(buf, spidev->rx_buffer, status);
- if (missing == status)
- status = -EFAULT;
+ #else
+ mutex_lock(&spidev->buf_lock);
+ if(spidev->rd_from_rx_buffer)
+ status = count;
else
- status = status - missing;
- }
- #endif
- mutex_unlock(&spidev->buf_lock);
+ status = spidev_sync_read(spidev, count);
+ if (status > 0) {
+
+ missing = copy_to_user(buf, spidev->rx_buffer, status);
+ if (missing == status)
+ status = -EFAULT;
+ else
+ status = status - missing;
+ }
+ #endif
+ mutex_unlock(&spidev->buf_lock);
+ }else {
+ mutex_lock(&spidev->buf_lock);
+
+ if(spidev->rd_from_rx_buffer)
+ status = count;
+ else
+ status = spidev_sync_read(spidev, count);
+
+ if(status > 0) {
+ missing = copy_to_user(buf, spidev->rx_buffer, status);
+ if (missing == status)
+ status = -EFAULT;
+ else
+ status = status - missing;
+ }
+ mutex_unlock(&spidev->buf_lock);
+ }
+ /* yu.dong@20240715 [T106BUG-641] SPI packet loss problem, merged into ZXW patch end */
return status;
}
/* yu.dong@20240617 [T106BUG-641] SPI packet loss problem, add kernel buffer scheme end*/
@@ -783,15 +798,19 @@
}
}
- /* yu.dong@20240617 [T106BUG-641] SPI packet loss problem, add kernel buffer scheme start */
- #ifdef SPI_SLAVE_FOR_YK
- if(spidev->rx_buffer) {
- spidev->spi->rx_buf = spidev->rx_buffer;
- if(spidev->spi->controller->spi_slave_rd_start)
- spidev->spi->controller->spi_slave_rd_start(spidev->spi);
- }
- #endif
- /* yu.dong@20240617 [T106BUG-641] SPI packet loss problem, add kernel buffer scheme end */
+ /* yu.dong@20240715 [T106BUG-641] SPI packet loss problem, merged into ZXW patch start */
+ /* yu.dong@20240617 [T106BUG-641] SPI packet loss problem, add kernel buffer scheme start */
+ if(spidev->spi->master->slave) {
+ #ifdef SPI_SLAVE_FOR_YK
+ if(spidev->rx_buffer) {
+ spidev->spi->rx_buf = spidev->rx_buffer;
+ if(spidev->spi->controller->spi_slave_rd_start)
+ spidev->spi->controller->spi_slave_rd_start(spidev->spi);
+ }
+ #endif
+ }
+ /* yu.dong@20240617 [T106BUG-641] SPI packet loss problem, add kernel buffer scheme end */
+ /* yu.dong@20240715 [T106BUG-641] SPI packet loss problem, merged into ZXW patch end */
spidev->users++;
filp->private_data = spidev;
stream_open(inode, filp);
@@ -838,14 +857,18 @@
spi = spi_dev_get(spidev->spi);
spin_unlock_irq(&spidev->spi_lock);
- /* yu.dong@20240617 [T106BUG-641] SPI packet loss problem, add kernel buffer scheme start */
- #ifdef SPI_SLAVE_FOR_YK
- if(spidev->rx_buffer) {
- if(spi->controller->spi_slave_rd_stop)
- spi->controller->spi_slave_rd_stop(spi);
- }
- #endif
- /* yu.dong@20240617 [T106BUG-641] SPI packet loss problem, add kernel buffer scheme end */
+ /* yu.dong@20240715 [T106BUG-641] SPI packet loss problem, merged into ZXW patch start */
+ /* yu.dong@20240617 [T106BUG-641] SPI packet loss problem, add kernel buffer scheme start */
+ if(spidev->spi->master->slave) {
+ #ifdef SPI_SLAVE_FOR_YK
+ if(spidev->rx_buffer) {
+ if(spi->controller->spi_slave_rd_stop)
+ spi->controller->spi_slave_rd_stop(spi);
+ }
+ #endif
+ }
+ /* yu.dong@20240617 [T106BUG-641] SPI packet loss problem, add kernel buffer scheme end */
+ /* yu.dong@20240715 [T106BUG-641] SPI packet loss problem, merged into ZXW patch end*/
if(spi && spi->master->slave)
pm_relax(&spi->dev);
kfree(spidev->tx_buffer);
@@ -2257,7 +2280,14 @@
dev_info(&spi->dev,"trans_gap_num = 0x%x",val);
}
- // yu.dong@20240617 [T106BUG-641] SPI packet loss problem, add kernel buffer scheme.
+ if (device_property_read_u32(&spi->dev, "setup-immediately",&val)) {
+ spi->setup_immediately = 0;
+ dev_err(&spi->dev,"setup-immediately get failed");
+ }
+ else {
+ spi->setup_immediately = val;
+ dev_info(&spi->dev,"setup-immediately = 0x%x",val);
+ }
/* If we can allocate a minor number, hook up this device.
* Reusing minors is fine so long as udev or mdev is working.