Skip to content

Commit 081222c

Browse files
committed
Merge remote-tracking branch 'soundwire/next' into sound/upstream-20250619
2 parents cf9ffa7 + 393350c commit 081222c

9 files changed

Lines changed: 40 additions & 68 deletions

File tree

Documentation/driver-api/soundwire/bra.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -333,4 +333,4 @@ FIFO sizes to avoid xruns.
333333

334334
Alignment requirements are currently not enforced at the core level
335335
but at the platform-level, e.g. for Intel the data sizes must be
336-
multiples of 32 bytes.
336+
equal to or larger than 16 bytes.

MAINTAINERS

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23279,7 +23279,6 @@ SOUNDWIRE SUBSYSTEM
2327923279
M: Vinod Koul <vkoul@kernel.org>
2328023280
M: Bard Liao <yung-chuan.liao@linux.intel.com>
2328123281
R: Pierre-Louis Bossart <pierre-louis.bossart@linux.dev>
23282-
R: Sanyog Kale <sanyog.r.kale@intel.com>
2328323282
L: linux-sound@vger.kernel.org
2328423283
S: Supported
2328523284
T: git git://git.kernel.org/pub/scm/linux/kernel/git/vkoul/soundwire.git

drivers/soundwire/amd_manager.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1074,6 +1074,7 @@ static void amd_sdw_manager_remove(struct platform_device *pdev)
10741074
int ret;
10751075

10761076
pm_runtime_disable(&pdev->dev);
1077+
cancel_work_sync(&amd_manager->amd_sdw_work);
10771078
amd_disable_sdw_interrupts(amd_manager);
10781079
sdw_bus_master_delete(&amd_manager->bus);
10791080
ret = amd_disable_sdw_manager(amd_manager);
@@ -1178,10 +1179,10 @@ static int __maybe_unused amd_pm_prepare(struct device *dev)
11781179
* device is not in runtime suspend state, observed that device alerts are missing
11791180
* without pm_prepare on AMD platforms in clockstop mode0.
11801181
*/
1181-
if (amd_manager->power_mode_mask & AMD_SDW_CLK_STOP_MODE) {
1182-
ret = pm_request_resume(dev);
1182+
if (amd_manager->power_mode_mask) {
1183+
ret = pm_runtime_resume(dev);
11831184
if (ret < 0) {
1184-
dev_err(bus->dev, "pm_request_resume failed: %d\n", ret);
1185+
dev_err(bus->dev, "pm_runtime_resume failed: %d\n", ret);
11851186
return 0;
11861187
}
11871188
}

drivers/soundwire/bus.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1753,15 +1753,15 @@ static int sdw_handle_slave_alerts(struct sdw_slave *slave)
17531753

17541754
/* Update the Slave driver */
17551755
if (slave_notify) {
1756+
if (slave->prop.use_domain_irq && slave->irq)
1757+
handle_nested_irq(slave->irq);
1758+
17561759
mutex_lock(&slave->sdw_dev_lock);
17571760

17581761
if (slave->probed) {
17591762
struct device *dev = &slave->dev;
17601763
struct sdw_driver *drv = drv_to_sdw_driver(dev->driver);
17611764

1762-
if (slave->prop.use_domain_irq && slave->irq)
1763-
handle_nested_irq(slave->irq);
1764-
17651765
if (drv->ops && drv->ops->interrupt_callback) {
17661766
slave_intr.sdca_cascade = sdca_cascade;
17671767
slave_intr.control_port = clear;

drivers/soundwire/intel_ace2x.c

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include <linux/soundwire/sdw_registers.h>
1212
#include <linux/soundwire/sdw.h>
1313
#include <linux/soundwire/sdw_intel.h>
14+
#include <linux/string_choices.h>
1415
#include <sound/hdaudio.h>
1516
#include <sound/hda-mlink.h>
1617
#include <sound/hda-sdw-bpt.h>
@@ -183,7 +184,7 @@ static int intel_ace2x_bpt_open_stream(struct sdw_intel *sdw, struct sdw_slave *
183184
return 0;
184185

185186
dev_err(cdns->dev, "%s: sdw_prepare_%s_dma_buffer failed %d\n",
186-
__func__, command ? "read" : "write", ret);
187+
__func__, str_read_write(command), ret);
187188

188189
ret1 = hda_sdw_bpt_close(cdns->dev->parent, /* PCI device */
189190
sdw->bpt_ctx.bpt_tx_stream, &sdw->bpt_ctx.dmab_tx_bdl,
@@ -245,17 +246,17 @@ static void intel_ace2x_bpt_close_stream(struct sdw_intel *sdw, struct sdw_slave
245246
cdns->bus.bpt_stream = NULL;
246247
}
247248

248-
#define INTEL_BPT_MSG_BYTE_ALIGNMENT 32
249+
#define INTEL_BPT_MSG_BYTE_MIN 16
249250

250251
static int intel_ace2x_bpt_send_async(struct sdw_intel *sdw, struct sdw_slave *slave,
251252
struct sdw_bpt_msg *msg)
252253
{
253254
struct sdw_cdns *cdns = &sdw->cdns;
254255
int ret;
255256

256-
if (msg->len % INTEL_BPT_MSG_BYTE_ALIGNMENT) {
257-
dev_err(cdns->dev, "BPT message length %d is not a multiple of %d bytes\n",
258-
msg->len, INTEL_BPT_MSG_BYTE_ALIGNMENT);
257+
if (msg->len < INTEL_BPT_MSG_BYTE_MIN) {
258+
dev_err(cdns->dev, "BPT message length %d is less than the minimum bytes %d\n",
259+
msg->len, INTEL_BPT_MSG_BYTE_MIN);
259260
return -EINVAL;
260261
}
261262

drivers/soundwire/qcom.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1648,9 +1648,9 @@ static int qcom_swrm_probe(struct platform_device *pdev)
16481648
if (ret)
16491649
goto err_master_add;
16501650

1651-
dev_info(dev, "Qualcomm Soundwire controller v%x.%x.%x Registered\n",
1652-
(ctrl->version >> 24) & 0xff, (ctrl->version >> 16) & 0xff,
1653-
ctrl->version & 0xffff);
1651+
dev_dbg(dev, "Qualcomm Soundwire controller v%x.%x.%x registered\n",
1652+
(ctrl->version >> 24) & 0xff, (ctrl->version >> 16) & 0xff,
1653+
ctrl->version & 0xffff);
16541654

16551655
pm_runtime_set_autosuspend_delay(dev, 3000);
16561656
pm_runtime_use_autosuspend(dev);

sound/soc/codecs/cs42l43-jack.c

Lines changed: 18 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -362,22 +362,23 @@ static void cs42l43_stop_button_detect(struct cs42l43_codec *priv)
362362
priv->button_detect_running = false;
363363
}
364364

365+
#define CS42L43_BUTTON_COMB_US 11000
365366
#define CS42L43_BUTTON_COMB_MAX 512
366367
#define CS42L43_BUTTON_ROUT 2210
367368

368-
void cs42l43_button_press_work(struct work_struct *work)
369+
irqreturn_t cs42l43_button_press(int irq, void *data)
369370
{
370-
struct cs42l43_codec *priv = container_of(work, struct cs42l43_codec,
371-
button_press_work.work);
371+
struct cs42l43_codec *priv = data;
372372
struct cs42l43 *cs42l43 = priv->core;
373+
irqreturn_t iret = IRQ_NONE;
373374
unsigned int buttons = 0;
374375
unsigned int val = 0;
375376
int i, ret;
376377

377378
ret = pm_runtime_resume_and_get(priv->dev);
378379
if (ret) {
379380
dev_err(priv->dev, "Failed to resume for button press: %d\n", ret);
380-
return;
381+
return iret;
381382
}
382383

383384
mutex_lock(&priv->jack_lock);
@@ -387,6 +388,9 @@ void cs42l43_button_press_work(struct work_struct *work)
387388
goto error;
388389
}
389390

391+
// Wait for 2 full cycles of comb filter to ensure good reading
392+
usleep_range(2 * CS42L43_BUTTON_COMB_US, 2 * CS42L43_BUTTON_COMB_US + 50);
393+
390394
regmap_read(cs42l43->regmap, CS42L43_DETECT_STATUS_1, &val);
391395

392396
/* Bail if jack removed, the button is irrelevant and likely invalid */
@@ -420,34 +424,27 @@ void cs42l43_button_press_work(struct work_struct *work)
420424

421425
snd_soc_jack_report(priv->jack_hp, buttons, CS42L43_JACK_BUTTONS);
422426

427+
iret = IRQ_HANDLED;
428+
423429
error:
424430
mutex_unlock(&priv->jack_lock);
425431

426432
pm_runtime_mark_last_busy(priv->dev);
427433
pm_runtime_put_autosuspend(priv->dev);
428-
}
429-
430-
irqreturn_t cs42l43_button_press(int irq, void *data)
431-
{
432-
struct cs42l43_codec *priv = data;
433-
434-
// Wait for 2 full cycles of comb filter to ensure good reading
435-
queue_delayed_work(system_wq, &priv->button_press_work,
436-
msecs_to_jiffies(20));
437434

438-
return IRQ_HANDLED;
435+
return iret;
439436
}
440437

441-
void cs42l43_button_release_work(struct work_struct *work)
438+
irqreturn_t cs42l43_button_release(int irq, void *data)
442439
{
443-
struct cs42l43_codec *priv = container_of(work, struct cs42l43_codec,
444-
button_release_work);
440+
struct cs42l43_codec *priv = data;
441+
irqreturn_t iret = IRQ_NONE;
445442
int ret;
446443

447444
ret = pm_runtime_resume_and_get(priv->dev);
448445
if (ret) {
449446
dev_err(priv->dev, "Failed to resume for button release: %d\n", ret);
450-
return;
447+
return iret;
451448
}
452449

453450
mutex_lock(&priv->jack_lock);
@@ -456,6 +453,8 @@ void cs42l43_button_release_work(struct work_struct *work)
456453
dev_dbg(priv->dev, "Button release IRQ\n");
457454

458455
snd_soc_jack_report(priv->jack_hp, 0, CS42L43_JACK_BUTTONS);
456+
457+
iret = IRQ_HANDLED;
459458
} else {
460459
dev_dbg(priv->dev, "Spurious button release IRQ\n");
461460
}
@@ -464,15 +463,8 @@ void cs42l43_button_release_work(struct work_struct *work)
464463

465464
pm_runtime_mark_last_busy(priv->dev);
466465
pm_runtime_put_autosuspend(priv->dev);
467-
}
468466

469-
irqreturn_t cs42l43_button_release(int irq, void *data)
470-
{
471-
struct cs42l43_codec *priv = data;
472-
473-
queue_work(system_wq, &priv->button_release_work);
474-
475-
return IRQ_HANDLED;
467+
return iret;
476468
}
477469

478470
void cs42l43_bias_sense_timeout(struct work_struct *work)
@@ -787,8 +779,6 @@ irqreturn_t cs42l43_tip_sense(int irq, void *data)
787779

788780
cancel_delayed_work(&priv->bias_sense_timeout);
789781
cancel_delayed_work(&priv->tip_sense_work);
790-
cancel_delayed_work(&priv->button_press_work);
791-
cancel_work(&priv->button_release_work);
792782

793783
// Ensure delay after suspend is long enough to avoid false detection
794784
if (priv->suspend_jack_debounce)

sound/soc/codecs/cs42l43.c

Lines changed: 5 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -167,13 +167,14 @@ static void cs42l43_hp_ilimit_clear_work(struct work_struct *work)
167167
snd_soc_dapm_mutex_unlock(dapm);
168168
}
169169

170-
static void cs42l43_hp_ilimit_work(struct work_struct *work)
170+
static irqreturn_t cs42l43_hp_ilimit(int irq, void *data)
171171
{
172-
struct cs42l43_codec *priv = container_of(work, struct cs42l43_codec,
173-
hp_ilimit_work);
172+
struct cs42l43_codec *priv = data;
174173
struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(priv->component);
175174
struct cs42l43 *cs42l43 = priv->core;
176175

176+
dev_dbg(priv->dev, "headphone ilimit IRQ\n");
177+
177178
snd_soc_dapm_mutex_lock(dapm);
178179

179180
if (priv->hp_ilimit_count < CS42L43_HP_ILIMIT_MAX_COUNT) {
@@ -183,7 +184,7 @@ static void cs42l43_hp_ilimit_work(struct work_struct *work)
183184

184185
priv->hp_ilimit_count++;
185186
snd_soc_dapm_mutex_unlock(dapm);
186-
return;
187+
return IRQ_HANDLED;
187188
}
188189

189190
dev_err(priv->dev, "Disabling headphone for %dmS, due to frequent current limit\n",
@@ -218,15 +219,6 @@ static void cs42l43_hp_ilimit_work(struct work_struct *work)
218219
priv->hp_ilimited = false;
219220

220221
snd_soc_dapm_mutex_unlock(dapm);
221-
}
222-
223-
static irqreturn_t cs42l43_hp_ilimit(int irq, void *data)
224-
{
225-
struct cs42l43_codec *priv = data;
226-
227-
dev_dbg(priv->dev, "headphone ilimit IRQ\n");
228-
229-
queue_work(system_long_wq, &priv->hp_ilimit_work);
230222

231223
return IRQ_HANDLED;
232224
}
@@ -2159,10 +2151,7 @@ static void cs42l43_component_remove(struct snd_soc_component *component)
21592151

21602152
cancel_delayed_work_sync(&priv->bias_sense_timeout);
21612153
cancel_delayed_work_sync(&priv->tip_sense_work);
2162-
cancel_delayed_work_sync(&priv->button_press_work);
2163-
cancel_work_sync(&priv->button_release_work);
21642154

2165-
cancel_work_sync(&priv->hp_ilimit_work);
21662155
cancel_delayed_work_sync(&priv->hp_ilimit_clear_work);
21672156

21682157
priv->component = NULL;
@@ -2314,10 +2303,7 @@ static int cs42l43_codec_probe(struct platform_device *pdev)
23142303

23152304
INIT_DELAYED_WORK(&priv->tip_sense_work, cs42l43_tip_sense_work);
23162305
INIT_DELAYED_WORK(&priv->bias_sense_timeout, cs42l43_bias_sense_timeout);
2317-
INIT_DELAYED_WORK(&priv->button_press_work, cs42l43_button_press_work);
23182306
INIT_DELAYED_WORK(&priv->hp_ilimit_clear_work, cs42l43_hp_ilimit_clear_work);
2319-
INIT_WORK(&priv->button_release_work, cs42l43_button_release_work);
2320-
INIT_WORK(&priv->hp_ilimit_work, cs42l43_hp_ilimit_work);
23212307

23222308
pm_runtime_set_autosuspend_delay(priv->dev, 100);
23232309
pm_runtime_use_autosuspend(priv->dev);

sound/soc/codecs/cs42l43.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -88,8 +88,6 @@ struct cs42l43_codec {
8888

8989
struct delayed_work tip_sense_work;
9090
struct delayed_work bias_sense_timeout;
91-
struct delayed_work button_press_work;
92-
struct work_struct button_release_work;
9391
struct completion type_detect;
9492
struct completion load_detect;
9593

@@ -99,7 +97,6 @@ struct cs42l43_codec {
9997
int jack_override;
10098
bool suspend_jack_debounce;
10199

102-
struct work_struct hp_ilimit_work;
103100
struct delayed_work hp_ilimit_clear_work;
104101
bool hp_ilimited;
105102
int hp_ilimit_count;
@@ -134,8 +131,6 @@ int cs42l43_set_jack(struct snd_soc_component *component,
134131
struct snd_soc_jack *jack, void *d);
135132
void cs42l43_bias_sense_timeout(struct work_struct *work);
136133
void cs42l43_tip_sense_work(struct work_struct *work);
137-
void cs42l43_button_press_work(struct work_struct *work);
138-
void cs42l43_button_release_work(struct work_struct *work);
139134
irqreturn_t cs42l43_bias_detect_clamp(int irq, void *data);
140135
irqreturn_t cs42l43_button_press(int irq, void *data);
141136
irqreturn_t cs42l43_button_release(int irq, void *data);

0 commit comments

Comments
 (0)