Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Pierre-Louis Bossart and committed by
Vinod Koul
46b56a5c ccc6cf15

+28 -33
+28 -33
drivers/soundwire/intel_bus_common.c
··· 16 16 struct sdw_bus *bus = &cdns->bus; 17 17 int ret; 18 18 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 - 25 19 /* 26 20 * follow recommended programming flows to avoid timeouts when 27 21 * gsync is enabled ··· 26 32 ret = sdw_cdns_init(cdns); 27 33 if (ret < 0) { 28 34 dev_err(dev, "%s: unable to initialize Cadence IP: %d\n", __func__, ret); 29 - goto err_interrupt; 35 + return ret; 30 36 } 31 37 32 38 ret = sdw_cdns_exit_reset(cdns); 33 39 if (ret < 0) { 34 40 dev_err(dev, "%s: unable to exit bus reset sequence: %d\n", __func__, ret); 35 - goto err_interrupt; 41 + return ret; 36 42 } 37 43 38 44 if (bus->multi_link) { 39 45 ret = sdw_intel_sync_go(sdw); 40 46 if (ret < 0) { 41 47 dev_err(dev, "%s: sync go failed: %d\n", __func__, ret); 42 - goto err_interrupt; 48 + return ret; 43 49 } 44 50 } 51 + 52 + ret = sdw_cdns_enable_interrupt(cdns, true); 53 + if (ret < 0) { 54 + dev_err(dev, "%s: cannot enable interrupts: %d\n", __func__, ret); 55 + return ret; 56 + } 57 + 45 58 sdw_cdns_check_self_clearing_bits(cdns, __func__, 46 59 true, INTEL_MASTER_RESET_ITERATIONS); 47 60 48 61 return 0; 49 - 50 - err_interrupt: 51 - sdw_cdns_enable_interrupt(cdns, false); 52 - return ret; 53 62 } 54 63 55 64 int intel_start_bus_after_reset(struct sdw_intel *sdw) ··· 83 86 status = SDW_UNATTACH_REQUEST_MASTER_RESET; 84 87 sdw_clear_slave_status(bus, status); 85 88 86 - ret = sdw_cdns_enable_interrupt(cdns, true); 87 - if (ret < 0) { 88 - dev_err(dev, "cannot enable interrupts during resume\n"); 89 - return ret; 90 - } 91 - 92 89 /* 93 90 * follow recommended programming flows to avoid 94 91 * timeouts when gsync is enabled ··· 106 115 ret = sdw_cdns_clock_restart(cdns, !clock_stop0); 107 116 if (ret < 0) { 108 117 dev_err(dev, "unable to restart clock during resume\n"); 109 - goto err_interrupt; 118 + if (!clock_stop0) 119 + sdw_cdns_enable_interrupt(cdns, false); 120 + return ret; 110 121 } 111 122 112 123 if (!clock_stop0) { 113 124 ret = sdw_cdns_exit_reset(cdns); 114 125 if (ret < 0) { 115 126 dev_err(dev, "unable to exit bus reset sequence during resume\n"); 116 - goto err_interrupt; 127 + return ret; 117 128 } 118 129 119 130 if (bus->multi_link) { 120 131 ret = sdw_intel_sync_go(sdw); 121 132 if (ret < 0) { 122 133 dev_err(sdw->cdns.dev, "sync go failed during resume\n"); 123 - goto err_interrupt; 134 + return ret; 124 135 } 125 136 } 137 + 138 + ret = sdw_cdns_enable_interrupt(cdns, true); 139 + if (ret < 0) { 140 + dev_err(dev, "cannot enable interrupts during resume\n"); 141 + return ret; 142 + } 143 + 126 144 } 127 145 sdw_cdns_check_self_clearing_bits(cdns, __func__, true, INTEL_MASTER_RESET_ITERATIONS); 128 146 129 147 return 0; 130 - 131 - err_interrupt: 132 - sdw_cdns_enable_interrupt(cdns, false); 133 - return ret; 134 148 } 135 149 136 150 void intel_check_clock_stop(struct sdw_intel *sdw) ··· 154 158 struct sdw_cdns *cdns = &sdw->cdns; 155 159 int ret; 156 160 157 - ret = sdw_cdns_enable_interrupt(cdns, true); 158 - if (ret < 0) { 159 - dev_err(dev, "%s: cannot enable interrupts: %d\n", __func__, ret); 160 - return ret; 161 - } 162 - 163 161 ret = sdw_cdns_clock_restart(cdns, false); 164 162 if (ret < 0) { 165 163 dev_err(dev, "%s: unable to restart clock: %d\n", __func__, ret); 166 - sdw_cdns_enable_interrupt(cdns, false); 164 + return ret; 165 + } 166 + 167 + ret = sdw_cdns_enable_interrupt(cdns, true); 168 + if (ret < 0) { 169 + dev_err(dev, "%s: cannot enable interrupts: %d\n", __func__, ret); 167 170 return ret; 168 171 } 169 172