soundwire-for-asoc-5.11
Tag for asoc to resolve build dependency with commitb7cab9be7c("soundwire: SDCA: detect sdca_cascade interrupt") -----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEE+vs47OPLdNbVcHzyfBQHDyUjg0cFAl/HPjQACgkQfBQHDyUj g0d3ghAApbm5mSsQLCm9SFzeyNxfpeeibwATQ9aJXsNHie/4u3wDNXa+5i03X+b7 8UQ4tU5zjm0zzoQuDFDKtpBA4n1nxjZLABXpZKQFX0gq1zSFWrZlQ+XFkxaLRlGX 78fVULqMEQgsFd7SpEWDpUMMlaT629VN7WOOc7XFuqpnjgCq/KTsLxsgiFQJUJAH v267Po1lHjJk3LBDLjuSHG6Y7pnyvp2emIQ+5DYD3NA6z43u1RTKJKJymsInRtaH yVe+zHk+SeTi6/AX+fYl3c7UPAmi+1nnMCEGC6oApn8KJNH2tqUnArtvtSETv3wq cfMMcA+7NxjKrDg7nh+oa3HQNXndPc9SFipY8uEbpx43DtpUR7hhWKiioHHMIJmJ cMKvpo4ZKflqmwsS/uwSJ5SaEgyyHkn20dID1wm476yBrl3smiU4+eVf9LwVJkeM iMSZyjtcYJsLcPjt3YOvC3bATeYFcRWIeCaKQ0vnDBXDIs7bgW3xi77CLV8xwYYg /YQ0lWqi62pe8bIvJOF+TvFTLa76j0uTmfG5ZXL3qQ9d3DKnljfavzv23r9FgYV6 H5Tg+V7PMM1i3FPzk8S3q0BPzLvPU6wGmCf8GV18V21Ubu8dWlKrwXLrYh//X/IL IjD3t2KXhqM+Bi/lZcCpBSl8o59tN7exOMRyJBbNt3PYlzDaGTg= =ULXu -----END PGP SIGNATURE----- gpgsig -----BEGIN PGP SIGNATURE----- iQEzBAABCgAdFiEEreZoqmdXGLWf4p/qJNaLcl1Uh9AFAl/HnLwACgkQJNaLcl1U h9Bgewf/VKdaVZzzWoD1lWat7F9PjDuH8OGlweuXk/SnXMSJ5NJ2K2oQhsH67Pju cuzWthy52nDir0W0uHsJAV7FoSwj5vB4cxD+Pb61+gk68EnHrbu4W2xpPDyFbfXd /fb+w2ioGEuQEQBDG984tWuAM5zlOb65T2MFN/FU+zmIPzEQ2BrjgEBUr1D/MtNR PsVyGvrWMOkJ0/iHne9WhD/VjFauDyvVIjPT/5aMKfYwi56a+SP9hihD9kdX2y4k ghMrwujnlwHYGAphwCxM0WLi8smtYrmNSEuaalV0ARh1IBnIqRPL8aWpdTClraU4 WMLdWLBME00tzviBqPOnELBpkww5+w== =M1im -----END PGP SIGNATURE----- Merge tag 'soundwire-for-asoc-5.11' of git://git.kernel.org/pub/scm/linux/kernel/git/vkoul/soundwire into asoc-5.11 soundwire-for-asoc-5.11 Tag for asoc to resolve build dependency with commitb7cab9be7c("soundwire: SDCA: detect sdca_cascade interrupt")
This commit is contained in:
		
				commit
				
					
						c075a0c0f1
					
				
			
		
					 3 changed files with 32 additions and 1 deletions
				
			
		|  | @ -1424,6 +1424,7 @@ static int sdw_handle_slave_alerts(struct sdw_slave *slave) | ||||||
| 	int port_num, stat, ret, count = 0; | 	int port_num, stat, ret, count = 0; | ||||||
| 	unsigned long port; | 	unsigned long port; | ||||||
| 	bool slave_notify = false; | 	bool slave_notify = false; | ||||||
|  | 	u8 sdca_cascade = 0; | ||||||
| 	u8 buf, buf2[2], _buf, _buf2[2]; | 	u8 buf, buf2[2], _buf, _buf2[2]; | ||||||
| 	bool parity_check; | 	bool parity_check; | ||||||
| 	bool parity_quirk; | 	bool parity_quirk; | ||||||
|  | @ -1453,6 +1454,16 @@ static int sdw_handle_slave_alerts(struct sdw_slave *slave) | ||||||
| 		goto io_err; | 		goto io_err; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	if (slave->prop.is_sdca) { | ||||||
|  | 		ret = sdw_read(slave, SDW_DP0_INT); | ||||||
|  | 		if (ret < 0) { | ||||||
|  | 			dev_err(slave->bus->dev, | ||||||
|  | 				"SDW_DP0_INT read failed:%d\n", ret); | ||||||
|  | 			goto io_err; | ||||||
|  | 		} | ||||||
|  | 		sdca_cascade = ret & SDW_DP0_SDCA_CASCADE; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	do { | 	do { | ||||||
| 		/*
 | 		/*
 | ||||||
| 		 * Check parity, bus clash and Slave (impl defined) | 		 * Check parity, bus clash and Slave (impl defined) | ||||||
|  | @ -1489,6 +1500,10 @@ static int sdw_handle_slave_alerts(struct sdw_slave *slave) | ||||||
| 			clear |= SDW_SCP_INT1_IMPL_DEF; | 			clear |= SDW_SCP_INT1_IMPL_DEF; | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|  | 		/* the SDCA interrupts are cleared in the codec driver .interrupt_callback() */ | ||||||
|  | 		if (sdca_cascade) | ||||||
|  | 			slave_notify = true; | ||||||
|  | 
 | ||||||
| 		/* Check port 0 - 3 interrupts */ | 		/* Check port 0 - 3 interrupts */ | ||||||
| 		port = buf & SDW_SCP_INT1_PORT0_3; | 		port = buf & SDW_SCP_INT1_PORT0_3; | ||||||
| 
 | 
 | ||||||
|  | @ -1526,6 +1541,7 @@ static int sdw_handle_slave_alerts(struct sdw_slave *slave) | ||||||
| 		/* Update the Slave driver */ | 		/* Update the Slave driver */ | ||||||
| 		if (slave_notify && slave->ops && | 		if (slave_notify && slave->ops && | ||||||
| 		    slave->ops->interrupt_callback) { | 		    slave->ops->interrupt_callback) { | ||||||
|  | 			slave_intr.sdca_cascade = sdca_cascade; | ||||||
| 			slave_intr.control_port = clear; | 			slave_intr.control_port = clear; | ||||||
| 			memcpy(slave_intr.port, &port_status, | 			memcpy(slave_intr.port, &port_status, | ||||||
| 			       sizeof(slave_intr.port)); | 			       sizeof(slave_intr.port)); | ||||||
|  | @ -1563,11 +1579,21 @@ static int sdw_handle_slave_alerts(struct sdw_slave *slave) | ||||||
| 			goto io_err; | 			goto io_err; | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|  | 		if (slave->prop.is_sdca) { | ||||||
|  | 			ret = sdw_read(slave, SDW_DP0_INT); | ||||||
|  | 			if (ret < 0) { | ||||||
|  | 				dev_err(slave->bus->dev, | ||||||
|  | 					"SDW_DP0_INT read failed:%d\n", ret); | ||||||
|  | 				goto io_err; | ||||||
|  | 			} | ||||||
|  | 			sdca_cascade = ret & SDW_DP0_SDCA_CASCADE; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
| 		/* Make sure no interrupts are pending */ | 		/* Make sure no interrupts are pending */ | ||||||
| 		buf &= _buf; | 		buf &= _buf; | ||||||
| 		buf2[0] &= _buf2[0]; | 		buf2[0] &= _buf2[0]; | ||||||
| 		buf2[1] &= _buf2[1]; | 		buf2[1] &= _buf2[1]; | ||||||
| 		stat = buf || buf2[0] || buf2[1]; | 		stat = buf || buf2[0] || buf2[1] || sdca_cascade; | ||||||
| 
 | 
 | ||||||
| 		/*
 | 		/*
 | ||||||
| 		 * Exit loop if Slave is continuously in ALERT state even | 		 * Exit loop if Slave is continuously in ALERT state even | ||||||
|  |  | ||||||
|  | @ -37,6 +37,7 @@ static int field##_attribute_alloc(struct device *dev,			\ | ||||||
| 		return -ENOMEM;						\ | 		return -ENOMEM;						\ | ||||||
| 	dpn_attr->N = N;						\ | 	dpn_attr->N = N;						\ | ||||||
| 	dpn_attr->dir = dir;						\ | 	dpn_attr->dir = dir;						\ | ||||||
|  | 	sysfs_attr_init(&dpn_attr->dev_attr.attr);			\ | ||||||
| 	dpn_attr->format_string = format_string;			\ | 	dpn_attr->format_string = format_string;			\ | ||||||
| 	dpn_attr->dev_attr.attr.name = __stringify(field);		\ | 	dpn_attr->dev_attr.attr.name = __stringify(field);		\ | ||||||
| 	dpn_attr->dev_attr.attr.mode = 0444;				\ | 	dpn_attr->dev_attr.attr.mode = 0444;				\ | ||||||
|  |  | ||||||
|  | @ -359,6 +359,7 @@ struct sdw_dpn_prop { | ||||||
|  * @sink_dpn_prop: Sink Data Port N properties |  * @sink_dpn_prop: Sink Data Port N properties | ||||||
|  * @scp_int1_mask: SCP_INT1_MASK desired settings |  * @scp_int1_mask: SCP_INT1_MASK desired settings | ||||||
|  * @quirks: bitmask identifying deltas from the MIPI specification |  * @quirks: bitmask identifying deltas from the MIPI specification | ||||||
|  |  * @is_sdca: the Slave supports the SDCA specification | ||||||
|  */ |  */ | ||||||
| struct sdw_slave_prop { | struct sdw_slave_prop { | ||||||
| 	u32 mipi_revision; | 	u32 mipi_revision; | ||||||
|  | @ -382,6 +383,7 @@ struct sdw_slave_prop { | ||||||
| 	struct sdw_dpn_prop *sink_dpn_prop; | 	struct sdw_dpn_prop *sink_dpn_prop; | ||||||
| 	u8 scp_int1_mask; | 	u8 scp_int1_mask; | ||||||
| 	u32 quirks; | 	u32 quirks; | ||||||
|  | 	bool is_sdca; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| #define SDW_SLAVE_QUIRKS_INVALID_INITIAL_PARITY	BIT(0) | #define SDW_SLAVE_QUIRKS_INVALID_INITIAL_PARITY	BIT(0) | ||||||
|  | @ -479,10 +481,12 @@ struct sdw_slave_id { | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * struct sdw_slave_intr_status - Slave interrupt status |  * struct sdw_slave_intr_status - Slave interrupt status | ||||||
|  |  * @sdca_cascade: set if the Slave device reports an SDCA interrupt | ||||||
|  * @control_port: control port status |  * @control_port: control port status | ||||||
|  * @port: data port status |  * @port: data port status | ||||||
|  */ |  */ | ||||||
| struct sdw_slave_intr_status { | struct sdw_slave_intr_status { | ||||||
|  | 	bool sdca_cascade; | ||||||
| 	u8 control_port; | 	u8 control_port; | ||||||
| 	u8 port[15]; | 	u8 port[15]; | ||||||
| }; | }; | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Mark Brown
				Mark Brown