Commit c075a0c0 authored by Mark Brown's avatar Mark Brown

Merge tag 'soundwire-for-asoc-5.11' of...

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 commit b7cab9be
("soundwire: SDCA: detect sdca_cascade interrupt")
parents e5879d98 b7cab9be
...@@ -1424,6 +1424,7 @@ static int sdw_handle_slave_alerts(struct sdw_slave *slave) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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, \ ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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];
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment