[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.