1 // SPDX-License-Identifier: GPL-2.0-only
3 // rt721-sdca-sdw.c -- rt721 SDCA ALSA SoC audio driver
5 // Copyright(c) 2024 Realtek Semiconductor Corp.
9 #include <linux/delay.h>
10 #include <linux/device.h>
11 #include <linux/module.h>
12 #include <linux/mod_devicetable.h>
13 #include <linux/pm_runtime.h>
14 #include <linux/soundwire/sdw_registers.h>
16 #include "rt721-sdca.h"
17 #include "rt721-sdca-sdw.h"
18 #include "rt-sdw-common.h"
20 static bool rt721_sdca_readable_register(struct device
*dev
, unsigned int reg
)
23 case 0x2f01 ... 0x2f0a:
27 case 0x2f58 ... 0x2f5d:
28 case SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC
, RT721_SDCA_ENT_XUV
,
29 RT721_SDCA_CTL_XUV
, 0):
30 case SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC
, RT721_SDCA_ENT_GE49
,
31 RT721_SDCA_CTL_SELECTED_MODE
, 0):
32 case SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC
, RT721_SDCA_ENT_GE49
,
33 RT721_SDCA_CTL_DETECTED_MODE
, 0):
34 case SDW_SDCA_CTL(FUNC_NUM_HID
, RT721_SDCA_ENT_HID01
,
35 RT721_SDCA_CTL_HIDTX_CURRENT_OWNER
, 0) ... SDW_SDCA_CTL(FUNC_NUM_HID
,
36 RT721_SDCA_ENT_HID01
, RT721_SDCA_CTL_HIDTX_MESSAGE_LENGTH
, 0):
37 case RT721_BUF_ADDR_HID1
... RT721_BUF_ADDR_HID2
:
44 static bool rt721_sdca_volatile_register(struct device
*dev
, unsigned int reg
)
49 case SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC
, RT721_SDCA_ENT_GE49
,
50 RT721_SDCA_CTL_DETECTED_MODE
, 0):
51 case SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC
, RT721_SDCA_ENT_XUV
,
52 RT721_SDCA_CTL_XUV
, 0):
53 case SDW_SDCA_CTL(FUNC_NUM_HID
, RT721_SDCA_ENT_HID01
,
54 RT721_SDCA_CTL_HIDTX_CURRENT_OWNER
, 0) ... SDW_SDCA_CTL(FUNC_NUM_HID
,
55 RT721_SDCA_ENT_HID01
, RT721_SDCA_CTL_HIDTX_MESSAGE_LENGTH
, 0):
56 case RT721_BUF_ADDR_HID1
... RT721_BUF_ADDR_HID2
:
63 static bool rt721_sdca_mbq_readable_register(struct device
*dev
, unsigned int reg
)
97 case 0x610002c ... 0x610002f:
98 case 0x6100053 ... 0x6100055:
105 case SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC
, RT721_SDCA_ENT_USER_FU05
, RT721_SDCA_CTL_FU_VOLUME
,
107 case SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC
, RT721_SDCA_ENT_USER_FU05
, RT721_SDCA_CTL_FU_VOLUME
,
109 case SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC
, RT721_SDCA_ENT_USER_FU0F
, RT721_SDCA_CTL_FU_VOLUME
,
111 case SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC
, RT721_SDCA_ENT_USER_FU0F
, RT721_SDCA_CTL_FU_VOLUME
,
113 case SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC
, RT721_SDCA_ENT_PLATFORM_FU44
,
114 RT721_SDCA_CTL_FU_CH_GAIN
, CH_L
):
115 case SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC
, RT721_SDCA_ENT_PLATFORM_FU44
,
116 RT721_SDCA_CTL_FU_CH_GAIN
, CH_R
):
117 case SDW_SDCA_CTL(FUNC_NUM_MIC_ARRAY
, RT721_SDCA_ENT_USER_FU1E
, RT721_SDCA_CTL_FU_VOLUME
,
119 case SDW_SDCA_CTL(FUNC_NUM_MIC_ARRAY
, RT721_SDCA_ENT_USER_FU1E
, RT721_SDCA_CTL_FU_VOLUME
,
121 case SDW_SDCA_CTL(FUNC_NUM_MIC_ARRAY
, RT721_SDCA_ENT_USER_FU1E
, RT721_SDCA_CTL_FU_VOLUME
,
123 case SDW_SDCA_CTL(FUNC_NUM_MIC_ARRAY
, RT721_SDCA_ENT_USER_FU1E
, RT721_SDCA_CTL_FU_VOLUME
,
125 case SDW_SDCA_CTL(FUNC_NUM_AMP
, RT721_SDCA_ENT_USER_FU06
, RT721_SDCA_CTL_FU_VOLUME
, CH_L
):
126 case SDW_SDCA_CTL(FUNC_NUM_AMP
, RT721_SDCA_ENT_USER_FU06
, RT721_SDCA_CTL_FU_VOLUME
, CH_R
):
133 static bool rt721_sdca_mbq_volatile_register(struct device
*dev
, unsigned int reg
)
162 static const struct regmap_config rt721_sdca_regmap
= {
165 .readable_reg
= rt721_sdca_readable_register
,
166 .volatile_reg
= rt721_sdca_volatile_register
,
167 .max_register
= 0x44ffffff,
168 .reg_defaults
= rt721_sdca_reg_defaults
,
169 .num_reg_defaults
= ARRAY_SIZE(rt721_sdca_reg_defaults
),
170 .cache_type
= REGCACHE_MAPLE
,
171 .use_single_read
= true,
172 .use_single_write
= true,
175 static const struct regmap_config rt721_sdca_mbq_regmap
= {
179 .readable_reg
= rt721_sdca_mbq_readable_register
,
180 .volatile_reg
= rt721_sdca_mbq_volatile_register
,
181 .max_register
= 0x41000312,
182 .reg_defaults
= rt721_sdca_mbq_defaults
,
183 .num_reg_defaults
= ARRAY_SIZE(rt721_sdca_mbq_defaults
),
184 .cache_type
= REGCACHE_MAPLE
,
185 .use_single_read
= true,
186 .use_single_write
= true,
189 static int rt721_sdca_update_status(struct sdw_slave
*slave
,
190 enum sdw_slave_status status
)
192 struct rt721_sdca_priv
*rt721
= dev_get_drvdata(&slave
->dev
);
194 if (status
== SDW_SLAVE_UNATTACHED
)
195 rt721
->hw_init
= false;
197 if (status
== SDW_SLAVE_ATTACHED
) {
198 if (rt721
->hs_jack
) {
200 * Due to the SCP_SDCA_INTMASK will be cleared by any reset, and then
201 * if the device attached again, we will need to set the setting back.
202 * It could avoid losing the jack detection interrupt.
203 * This also could sync with the cache value as the rt721_sdca_jack_init set.
205 sdw_write_no_pm(rt721
->slave
, SDW_SCP_SDCA_INTMASK1
,
206 SDW_SCP_SDCA_INTMASK_SDCA_0
);
207 sdw_write_no_pm(rt721
->slave
, SDW_SCP_SDCA_INTMASK2
,
208 SDW_SCP_SDCA_INTMASK_SDCA_8
);
213 * Perform initialization only if slave status is present and
214 * hw_init flag is false
216 if (rt721
->hw_init
|| status
!= SDW_SLAVE_ATTACHED
)
219 /* perform I/O transfers required for Slave initialization */
220 return rt721_sdca_io_init(&slave
->dev
, slave
);
223 static int rt721_sdca_read_prop(struct sdw_slave
*slave
)
225 struct sdw_slave_prop
*prop
= &slave
->prop
;
230 struct sdw_dpn_prop
*dpn
;
232 sdw_slave_read_prop(slave
);
233 prop
->scp_int1_mask
= SDW_SCP_INT1_BUS_CLASH
| SDW_SCP_INT1_PARITY
;
234 prop
->quirks
= SDW_SLAVE_QUIRKS_INVALID_INITIAL_PARITY
;
236 prop
->paging_support
= true;
239 * port = 1 for headphone playback
240 * port = 2 for headset-mic capture
241 * port = 3 for speaker playback
242 * port = 6 for digital-mic capture
244 prop
->source_ports
= BIT(6) | BIT(2); /* BITMAP: 01000100 */
245 prop
->sink_ports
= BIT(3) | BIT(1); /* BITMAP: 00001010 */
247 nval
= hweight32(prop
->source_ports
);
248 prop
->src_dpn_prop
= devm_kcalloc(&slave
->dev
, nval
,
249 sizeof(*prop
->src_dpn_prop
), GFP_KERNEL
);
250 if (!prop
->src_dpn_prop
)
254 dpn
= prop
->src_dpn_prop
;
255 addr
= prop
->source_ports
;
256 for_each_set_bit(bit
, &addr
, 32) {
258 dpn
[i
].type
= SDW_DPN_FULL
;
259 dpn
[i
].simple_ch_prep_sm
= true;
260 dpn
[i
].ch_prep_timeout
= 10;
264 /* do this again for sink now */
265 nval
= hweight32(prop
->sink_ports
);
266 prop
->sink_dpn_prop
= devm_kcalloc(&slave
->dev
, nval
,
267 sizeof(*prop
->sink_dpn_prop
), GFP_KERNEL
);
268 if (!prop
->sink_dpn_prop
)
272 dpn
= prop
->sink_dpn_prop
;
273 addr
= prop
->sink_ports
;
274 for_each_set_bit(bit
, &addr
, 32) {
276 dpn
[j
].type
= SDW_DPN_FULL
;
277 dpn
[j
].simple_ch_prep_sm
= true;
278 dpn
[j
].ch_prep_timeout
= 10;
282 /* set the timeout values */
283 prop
->clk_stop_timeout
= 1380;
286 prop
->wake_capable
= 1;
288 /* Three data lanes are supported by rt721-sdca codec */
289 prop
->lane_control_support
= true;
294 static int rt721_sdca_interrupt_callback(struct sdw_slave
*slave
,
295 struct sdw_slave_intr_status
*status
)
297 struct rt721_sdca_priv
*rt721
= dev_get_drvdata(&slave
->dev
);
299 int count
= 0, retry
= 3;
300 unsigned int sdca_cascade
, scp_sdca_stat1
, scp_sdca_stat2
= 0;
302 if (cancel_delayed_work_sync(&rt721
->jack_detect_work
)) {
303 dev_warn(&slave
->dev
, "%s the pending delayed_work was cancelled", __func__
);
304 /* avoid the HID owner doesn't change to device */
305 if (rt721
->scp_sdca_stat2
)
306 scp_sdca_stat2
= rt721
->scp_sdca_stat2
;
310 * The critical section below intentionally protects a rather large piece of code.
311 * We don't want to allow the system suspend to disable an interrupt while we are
312 * processing it, which could be problematic given the quirky SoundWire interrupt
313 * scheme. We do want however to prevent new workqueues from being scheduled if
314 * the disable_irq flag was set during system suspend.
316 mutex_lock(&rt721
->disable_irq_lock
);
318 ret
= sdw_read_no_pm(rt721
->slave
, SDW_SCP_SDCA_INT1
);
322 rt721
->scp_sdca_stat1
= ret
;
323 ret
= sdw_read_no_pm(rt721
->slave
, SDW_SCP_SDCA_INT2
);
327 rt721
->scp_sdca_stat2
= ret
;
329 rt721
->scp_sdca_stat2
|= scp_sdca_stat2
;
332 ret
= sdw_read_no_pm(rt721
->slave
, SDW_SCP_SDCA_INT1
);
335 if (ret
& SDW_SCP_SDCA_INTMASK_SDCA_0
) {
336 ret
= sdw_update_no_pm(rt721
->slave
, SDW_SCP_SDCA_INT1
,
337 SDW_SCP_SDCA_INT_SDCA_0
, SDW_SCP_SDCA_INT_SDCA_0
);
341 ret
= sdw_read_no_pm(rt721
->slave
, SDW_SCP_SDCA_INT2
);
344 if (ret
& SDW_SCP_SDCA_INTMASK_SDCA_8
) {
345 ret
= sdw_write_no_pm(rt721
->slave
, SDW_SCP_SDCA_INT2
,
346 SDW_SCP_SDCA_INTMASK_SDCA_8
);
351 /* check if flag clear or not */
352 ret
= sdw_read_no_pm(rt721
->slave
, SDW_DP0_INT
);
355 sdca_cascade
= ret
& SDW_DP0_SDCA_CASCADE
;
357 ret
= sdw_read_no_pm(rt721
->slave
, SDW_SCP_SDCA_INT1
);
360 scp_sdca_stat1
= ret
& SDW_SCP_SDCA_INTMASK_SDCA_0
;
362 ret
= sdw_read_no_pm(rt721
->slave
, SDW_SCP_SDCA_INT2
);
365 scp_sdca_stat2
= ret
& SDW_SCP_SDCA_INTMASK_SDCA_8
;
367 stat
= scp_sdca_stat1
|| scp_sdca_stat2
|| sdca_cascade
;
370 } while (stat
!= 0 && count
< retry
);
373 dev_warn(&slave
->dev
,
374 "%s scp_sdca_stat1=0x%x, scp_sdca_stat2=0x%x\n", __func__
,
375 rt721
->scp_sdca_stat1
, rt721
->scp_sdca_stat2
);
376 ret
= sdw_read_no_pm(rt721
->slave
, SDW_SCP_SDCA_INT1
);
377 ret
= sdw_read_no_pm(rt721
->slave
, SDW_SCP_SDCA_INT2
);
379 if (status
->sdca_cascade
&& !rt721
->disable_irq
)
380 mod_delayed_work(system_power_efficient_wq
,
381 &rt721
->jack_detect_work
, msecs_to_jiffies(280));
383 mutex_unlock(&rt721
->disable_irq_lock
);
388 mutex_unlock(&rt721
->disable_irq_lock
);
389 pr_err_ratelimited("IO error in %s, ret %d\n", __func__
, ret
);
393 static const struct sdw_slave_ops rt721_sdca_slave_ops
= {
394 .read_prop
= rt721_sdca_read_prop
,
395 .interrupt_callback
= rt721_sdca_interrupt_callback
,
396 .update_status
= rt721_sdca_update_status
,
399 static int rt721_sdca_sdw_probe(struct sdw_slave
*slave
,
400 const struct sdw_device_id
*id
)
402 struct regmap
*regmap
, *mbq_regmap
;
404 /* Regmap Initialization */
405 mbq_regmap
= devm_regmap_init_sdw_mbq(slave
, &rt721_sdca_mbq_regmap
);
406 if (IS_ERR(mbq_regmap
))
407 return PTR_ERR(mbq_regmap
);
409 regmap
= devm_regmap_init_sdw(slave
, &rt721_sdca_regmap
);
411 return PTR_ERR(regmap
);
413 return rt721_sdca_init(&slave
->dev
, regmap
, mbq_regmap
, slave
);
416 static int rt721_sdca_sdw_remove(struct sdw_slave
*slave
)
418 struct rt721_sdca_priv
*rt721
= dev_get_drvdata(&slave
->dev
);
420 if (rt721
->hw_init
) {
421 cancel_delayed_work_sync(&rt721
->jack_detect_work
);
422 cancel_delayed_work_sync(&rt721
->jack_btn_check_work
);
425 if (rt721
->first_hw_init
)
426 pm_runtime_disable(&slave
->dev
);
428 mutex_destroy(&rt721
->calibrate_mutex
);
429 mutex_destroy(&rt721
->disable_irq_lock
);
434 static const struct sdw_device_id rt721_sdca_id
[] = {
435 SDW_SLAVE_ENTRY_EXT(0x025d, 0x721, 0x3, 0x1, 0),
438 MODULE_DEVICE_TABLE(sdw
, rt721_sdca_id
);
440 static int __maybe_unused
rt721_sdca_dev_suspend(struct device
*dev
)
442 struct rt721_sdca_priv
*rt721
= dev_get_drvdata(dev
);
447 cancel_delayed_work_sync(&rt721
->jack_detect_work
);
448 cancel_delayed_work_sync(&rt721
->jack_btn_check_work
);
450 regcache_cache_only(rt721
->regmap
, true);
451 regcache_cache_only(rt721
->mbq_regmap
, true);
456 static int __maybe_unused
rt721_sdca_dev_system_suspend(struct device
*dev
)
458 struct rt721_sdca_priv
*rt721_sdca
= dev_get_drvdata(dev
);
459 struct sdw_slave
*slave
= dev_to_sdw_dev(dev
);
462 if (!rt721_sdca
->hw_init
)
466 * prevent new interrupts from being handled after the
467 * deferred work completes and before the parent disables
468 * interrupts on the link
470 mutex_lock(&rt721_sdca
->disable_irq_lock
);
471 rt721_sdca
->disable_irq
= true;
472 ret1
= sdw_update_no_pm(slave
, SDW_SCP_SDCA_INTMASK1
,
473 SDW_SCP_SDCA_INTMASK_SDCA_0
, 0);
474 ret2
= sdw_update_no_pm(slave
, SDW_SCP_SDCA_INTMASK2
,
475 SDW_SCP_SDCA_INTMASK_SDCA_8
, 0);
476 mutex_unlock(&rt721_sdca
->disable_irq_lock
);
478 if (ret1
< 0 || ret2
< 0) {
479 /* log but don't prevent suspend from happening */
480 dev_dbg(&slave
->dev
, "%s: could not disable SDCA interrupts\n:", __func__
);
483 return rt721_sdca_dev_suspend(dev
);
486 #define RT721_PROBE_TIMEOUT 5000
488 static int __maybe_unused
rt721_sdca_dev_resume(struct device
*dev
)
490 struct sdw_slave
*slave
= dev_to_sdw_dev(dev
);
491 struct rt721_sdca_priv
*rt721
= dev_get_drvdata(dev
);
494 if (!rt721
->first_hw_init
)
497 if (!slave
->unattach_request
) {
498 mutex_lock(&rt721
->disable_irq_lock
);
499 if (rt721
->disable_irq
== true) {
500 sdw_write_no_pm(slave
, SDW_SCP_SDCA_INTMASK1
, SDW_SCP_SDCA_INTMASK_SDCA_0
);
501 sdw_write_no_pm(slave
, SDW_SCP_SDCA_INTMASK2
, SDW_SCP_SDCA_INTMASK_SDCA_8
);
502 rt721
->disable_irq
= false;
504 mutex_unlock(&rt721
->disable_irq_lock
);
508 time
= wait_for_completion_timeout(&slave
->initialization_complete
,
509 msecs_to_jiffies(RT721_PROBE_TIMEOUT
));
511 dev_err(&slave
->dev
, "Initialization not complete, timed out\n");
512 sdw_show_ping_status(slave
->bus
, true);
518 slave
->unattach_request
= 0;
519 regcache_cache_only(rt721
->regmap
, false);
520 regcache_sync(rt721
->regmap
);
521 regcache_cache_only(rt721
->mbq_regmap
, false);
522 regcache_sync(rt721
->mbq_regmap
);
526 static const struct dev_pm_ops rt721_sdca_pm
= {
527 SET_SYSTEM_SLEEP_PM_OPS(rt721_sdca_dev_system_suspend
, rt721_sdca_dev_resume
)
528 SET_RUNTIME_PM_OPS(rt721_sdca_dev_suspend
, rt721_sdca_dev_resume
, NULL
)
531 static struct sdw_driver rt721_sdca_sdw_driver
= {
533 .name
= "rt721-sdca",
534 .owner
= THIS_MODULE
,
535 .pm
= &rt721_sdca_pm
,
537 .probe
= rt721_sdca_sdw_probe
,
538 .remove
= rt721_sdca_sdw_remove
,
539 .ops
= &rt721_sdca_slave_ops
,
540 .id_table
= rt721_sdca_id
,
542 module_sdw_driver(rt721_sdca_sdw_driver
);
544 MODULE_DESCRIPTION("ASoC RT721 SDCA SDW driver");
545 MODULE_AUTHOR("Jack Yu <jack.yu@realtek.com>");
546 MODULE_LICENSE("GPL");