Skip to content

Commit 46b56a5

Browse files
plbossartvinodkoul
authored andcommitted
soundwire: intel_bus_common: enable interrupts last
It's not clear why we enabled interrupts in the Cadence IP first. The logical programming sequence should be to first start the bus, and only second to enable the interrupts. Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> Reviewed-by: Rander Wang <rander.wang@intel.com> Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com> Link: https://lore.kernel.org/r/20230518024119.164160-2-yung-chuan.liao@linux.intel.com Signed-off-by: Vinod Koul <vkoul@kernel.org>
1 parent ccc6cf1 commit 46b56a5

1 file changed

Lines changed: 26 additions & 31 deletions

File tree

drivers/soundwire/intel_bus_common.c

Lines changed: 26 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,6 @@ int intel_start_bus(struct sdw_intel *sdw)
1616
struct sdw_bus *bus = &cdns->bus;
1717
int ret;
1818

19-
ret = sdw_cdns_enable_interrupt(cdns, true);
20-
if (ret < 0) {
21-
dev_err(dev, "%s: cannot enable interrupts: %d\n", __func__, ret);
22-
return ret;
23-
}
24-
2519
/*
2620
* follow recommended programming flows to avoid timeouts when
2721
* gsync is enabled
@@ -32,30 +26,33 @@ int intel_start_bus(struct sdw_intel *sdw)
3226
ret = sdw_cdns_init(cdns);
3327
if (ret < 0) {
3428
dev_err(dev, "%s: unable to initialize Cadence IP: %d\n", __func__, ret);
35-
goto err_interrupt;
29+
return ret;
3630
}
3731

3832
ret = sdw_cdns_exit_reset(cdns);
3933
if (ret < 0) {
4034
dev_err(dev, "%s: unable to exit bus reset sequence: %d\n", __func__, ret);
41-
goto err_interrupt;
35+
return ret;
4236
}
4337

4438
if (bus->multi_link) {
4539
ret = sdw_intel_sync_go(sdw);
4640
if (ret < 0) {
4741
dev_err(dev, "%s: sync go failed: %d\n", __func__, ret);
48-
goto err_interrupt;
42+
return ret;
4943
}
5044
}
45+
46+
ret = sdw_cdns_enable_interrupt(cdns, true);
47+
if (ret < 0) {
48+
dev_err(dev, "%s: cannot enable interrupts: %d\n", __func__, ret);
49+
return ret;
50+
}
51+
5152
sdw_cdns_check_self_clearing_bits(cdns, __func__,
5253
true, INTEL_MASTER_RESET_ITERATIONS);
5354

5455
return 0;
55-
56-
err_interrupt:
57-
sdw_cdns_enable_interrupt(cdns, false);
58-
return ret;
5956
}
6057

6158
int intel_start_bus_after_reset(struct sdw_intel *sdw)
@@ -86,12 +83,6 @@ int intel_start_bus_after_reset(struct sdw_intel *sdw)
8683
status = SDW_UNATTACH_REQUEST_MASTER_RESET;
8784
sdw_clear_slave_status(bus, status);
8885

89-
ret = sdw_cdns_enable_interrupt(cdns, true);
90-
if (ret < 0) {
91-
dev_err(dev, "cannot enable interrupts during resume\n");
92-
return ret;
93-
}
94-
9586
/*
9687
* follow recommended programming flows to avoid
9788
* timeouts when gsync is enabled
@@ -115,31 +106,36 @@ int intel_start_bus_after_reset(struct sdw_intel *sdw)
115106
ret = sdw_cdns_clock_restart(cdns, !clock_stop0);
116107
if (ret < 0) {
117108
dev_err(dev, "unable to restart clock during resume\n");
118-
goto err_interrupt;
109+
if (!clock_stop0)
110+
sdw_cdns_enable_interrupt(cdns, false);
111+
return ret;
119112
}
120113

121114
if (!clock_stop0) {
122115
ret = sdw_cdns_exit_reset(cdns);
123116
if (ret < 0) {
124117
dev_err(dev, "unable to exit bus reset sequence during resume\n");
125-
goto err_interrupt;
118+
return ret;
126119
}
127120

128121
if (bus->multi_link) {
129122
ret = sdw_intel_sync_go(sdw);
130123
if (ret < 0) {
131124
dev_err(sdw->cdns.dev, "sync go failed during resume\n");
132-
goto err_interrupt;
125+
return ret;
133126
}
134127
}
128+
129+
ret = sdw_cdns_enable_interrupt(cdns, true);
130+
if (ret < 0) {
131+
dev_err(dev, "cannot enable interrupts during resume\n");
132+
return ret;
133+
}
134+
135135
}
136136
sdw_cdns_check_self_clearing_bits(cdns, __func__, true, INTEL_MASTER_RESET_ITERATIONS);
137137

138138
return 0;
139-
140-
err_interrupt:
141-
sdw_cdns_enable_interrupt(cdns, false);
142-
return ret;
143139
}
144140

145141
void intel_check_clock_stop(struct sdw_intel *sdw)
@@ -158,16 +154,15 @@ int intel_start_bus_after_clock_stop(struct sdw_intel *sdw)
158154
struct sdw_cdns *cdns = &sdw->cdns;
159155
int ret;
160156

161-
ret = sdw_cdns_enable_interrupt(cdns, true);
157+
ret = sdw_cdns_clock_restart(cdns, false);
162158
if (ret < 0) {
163-
dev_err(dev, "%s: cannot enable interrupts: %d\n", __func__, ret);
159+
dev_err(dev, "%s: unable to restart clock: %d\n", __func__, ret);
164160
return ret;
165161
}
166162

167-
ret = sdw_cdns_clock_restart(cdns, false);
163+
ret = sdw_cdns_enable_interrupt(cdns, true);
168164
if (ret < 0) {
169-
dev_err(dev, "%s: unable to restart clock: %d\n", __func__, ret);
170-
sdw_cdns_enable_interrupt(cdns, false);
165+
dev_err(dev, "%s: cannot enable interrupts: %d\n", __func__, ret);
171166
return ret;
172167
}
173168

0 commit comments

Comments
 (0)