1 // SPDX-License-Identifier: GPL-2.0-only
2 // cs42l42-sdw.c -- CS42L42 ALSA SoC audio driver SoundWire driver
4 // Copyright (C) 2022 Cirrus Logic, Inc. and
5 // Cirrus Logic International Semiconductor Ltd.
7 #include <linux/acpi.h>
8 #include <linux/device.h>
9 #include <linux/gpio/consumer.h>
10 #include <linux/iopoll.h>
11 #include <linux/module.h>
12 #include <linux/mod_devicetable.h>
13 #include <linux/of_irq.h>
14 #include <linux/pm_runtime.h>
15 #include <linux/soundwire/sdw.h>
16 #include <linux/soundwire/sdw_registers.h>
17 #include <linux/soundwire/sdw_type.h>
18 #include <sound/pcm.h>
19 #include <sound/pcm_params.h>
20 #include <sound/sdw.h>
21 #include <sound/soc.h>
25 #define CS42L42_SDW_CAPTURE_PORT 1
26 #define CS42L42_SDW_PLAYBACK_PORT 2
28 /* Register addresses are offset when sent over SoundWire */
29 #define CS42L42_SDW_ADDR_OFFSET 0x8000
31 #define CS42L42_SDW_MEM_ACCESS_STATUS 0xd0
32 #define CS42L42_SDW_MEM_READ_DATA 0xd8
34 #define CS42L42_SDW_LAST_LATE BIT(3)
35 #define CS42L42_SDW_CMD_IN_PROGRESS BIT(2)
36 #define CS42L42_SDW_RDATA_RDY BIT(0)
38 #define CS42L42_DELAYED_READ_POLL_US 1
39 #define CS42L42_DELAYED_READ_TIMEOUT_US 100
41 static const struct snd_soc_dapm_route cs42l42_sdw_audio_map
[] = {
43 { "HP", NULL
, "MIXER" },
44 { "MIXER", NULL
, "DACSRC" },
45 { "DACSRC", NULL
, "Playback" },
48 { "ADCSRC", NULL
, "HS" },
49 { "Capture", NULL
, "ADCSRC" },
52 static int cs42l42_sdw_dai_startup(struct snd_pcm_substream
*substream
,
53 struct snd_soc_dai
*dai
)
55 struct cs42l42_private
*cs42l42
= snd_soc_component_get_drvdata(dai
->component
);
57 if (!cs42l42
->init_done
)
63 static int cs42l42_sdw_dai_hw_params(struct snd_pcm_substream
*substream
,
64 struct snd_pcm_hw_params
*params
,
65 struct snd_soc_dai
*dai
)
67 struct cs42l42_private
*cs42l42
= snd_soc_component_get_drvdata(dai
->component
);
68 struct sdw_stream_runtime
*sdw_stream
= snd_soc_dai_get_dma_data(dai
, substream
);
69 struct sdw_stream_config stream_config
= {0};
70 struct sdw_port_config port_config
= {0};
76 /* Needed for PLL configuration when we are notified of new bus config */
77 cs42l42
->sample_rate
= params_rate(params
);
79 snd_sdw_params_to_config(substream
, params
, &stream_config
, &port_config
);
81 if (substream
->stream
== SNDRV_PCM_STREAM_PLAYBACK
)
82 port_config
.num
= CS42L42_SDW_PLAYBACK_PORT
;
84 port_config
.num
= CS42L42_SDW_CAPTURE_PORT
;
86 ret
= sdw_stream_add_slave(cs42l42
->sdw_peripheral
, &stream_config
, &port_config
, 1,
89 dev_err(dai
->dev
, "Failed to add sdw stream: %d\n", ret
);
93 cs42l42_src_config(dai
->component
, params_rate(params
));
98 static int cs42l42_sdw_dai_prepare(struct snd_pcm_substream
*substream
,
99 struct snd_soc_dai
*dai
)
101 struct cs42l42_private
*cs42l42
= snd_soc_component_get_drvdata(dai
->component
);
103 dev_dbg(dai
->dev
, "dai_prepare: sclk=%u rate=%u\n", cs42l42
->sclk
, cs42l42
->sample_rate
);
105 if (!cs42l42
->sclk
|| !cs42l42
->sample_rate
)
109 * At this point we know the sample rate from hw_params, and the SWIRE_CLK from bus_config()
110 * callback. This could only fail if the ACPI or machine driver are misconfigured to allow
111 * an unsupported SWIRE_CLK and sample_rate combination.
114 return cs42l42_pll_config(dai
->component
, cs42l42
->sclk
, cs42l42
->sample_rate
);
117 static int cs42l42_sdw_dai_hw_free(struct snd_pcm_substream
*substream
,
118 struct snd_soc_dai
*dai
)
120 struct cs42l42_private
*cs42l42
= snd_soc_component_get_drvdata(dai
->component
);
121 struct sdw_stream_runtime
*sdw_stream
= snd_soc_dai_get_dma_data(dai
, substream
);
123 sdw_stream_remove_slave(cs42l42
->sdw_peripheral
, sdw_stream
);
124 cs42l42
->sample_rate
= 0;
129 static int cs42l42_sdw_port_prep(struct sdw_slave
*slave
,
130 struct sdw_prepare_ch
*prepare_ch
,
131 enum sdw_port_prep_ops state
)
133 struct cs42l42_private
*cs42l42
= dev_get_drvdata(&slave
->dev
);
134 unsigned int pdn_mask
;
136 if (prepare_ch
->num
== CS42L42_SDW_PLAYBACK_PORT
)
137 pdn_mask
= CS42L42_HP_PDN_MASK
;
139 pdn_mask
= CS42L42_ADC_PDN_MASK
;
141 if (state
== SDW_OPS_PORT_PRE_PREP
) {
142 dev_dbg(cs42l42
->dev
, "Prep Port pdn_mask:%x\n", pdn_mask
);
143 regmap_clear_bits(cs42l42
->regmap
, CS42L42_PWR_CTL1
, pdn_mask
);
144 usleep_range(CS42L42_HP_ADC_EN_TIME_US
, CS42L42_HP_ADC_EN_TIME_US
+ 1000);
145 } else if (state
== SDW_OPS_PORT_POST_DEPREP
) {
146 dev_dbg(cs42l42
->dev
, "Deprep Port pdn_mask:%x\n", pdn_mask
);
147 regmap_set_bits(cs42l42
->regmap
, CS42L42_PWR_CTL1
, pdn_mask
);
153 static int cs42l42_sdw_dai_set_sdw_stream(struct snd_soc_dai
*dai
, void *sdw_stream
,
156 snd_soc_dai_dma_data_set(dai
, direction
, sdw_stream
);
161 static void cs42l42_sdw_dai_shutdown(struct snd_pcm_substream
*substream
,
162 struct snd_soc_dai
*dai
)
164 snd_soc_dai_set_dma_data(dai
, substream
, NULL
);
167 static const struct snd_soc_dai_ops cs42l42_sdw_dai_ops
= {
168 .startup
= cs42l42_sdw_dai_startup
,
169 .shutdown
= cs42l42_sdw_dai_shutdown
,
170 .hw_params
= cs42l42_sdw_dai_hw_params
,
171 .prepare
= cs42l42_sdw_dai_prepare
,
172 .hw_free
= cs42l42_sdw_dai_hw_free
,
173 .mute_stream
= cs42l42_mute_stream
,
174 .set_stream
= cs42l42_sdw_dai_set_sdw_stream
,
177 static struct snd_soc_dai_driver cs42l42_sdw_dai
= {
178 .name
= "cs42l42-sdw",
180 .stream_name
= "Playback",
183 /* Restrict which rates and formats are supported */
184 .rates
= SNDRV_PCM_RATE_8000_96000
,
185 .formats
= SNDRV_PCM_FMTBIT_S16_LE
|
186 SNDRV_PCM_FMTBIT_S24_LE
|
187 SNDRV_PCM_FMTBIT_S32_LE
,
190 .stream_name
= "Capture",
193 /* Restrict which rates and formats are supported */
194 .rates
= SNDRV_PCM_RATE_8000_96000
,
195 .formats
= SNDRV_PCM_FMTBIT_S16_LE
|
196 SNDRV_PCM_FMTBIT_S24_LE
|
197 SNDRV_PCM_FMTBIT_S32_LE
,
200 .ops
= &cs42l42_sdw_dai_ops
,
203 static int cs42l42_sdw_poll_status(struct sdw_slave
*peripheral
, u8 mask
, u8 match
)
207 ret
= read_poll_timeout(sdw_read_no_pm
, sdwret
,
208 (sdwret
< 0) || ((sdwret
& mask
) == match
),
209 CS42L42_DELAYED_READ_POLL_US
, CS42L42_DELAYED_READ_TIMEOUT_US
,
210 false, peripheral
, CS42L42_SDW_MEM_ACCESS_STATUS
);
215 dev_err(&peripheral
->dev
, "MEM_ACCESS_STATUS & %#x for %#x fail: %d\n",
221 static int cs42l42_sdw_read(void *context
, unsigned int reg
, unsigned int *val
)
223 struct sdw_slave
*peripheral
= context
;
227 reg
+= CS42L42_SDW_ADDR_OFFSET
;
229 ret
= cs42l42_sdw_poll_status(peripheral
, CS42L42_SDW_CMD_IN_PROGRESS
, 0);
233 ret
= sdw_read_no_pm(peripheral
, reg
);
235 dev_err(&peripheral
->dev
, "Failed to issue read @0x%x: %d\n", reg
, ret
);
239 data
= (u8
)ret
; /* possible non-delayed read value */
240 ret
= sdw_read_no_pm(peripheral
, CS42L42_SDW_MEM_ACCESS_STATUS
);
242 dev_err(&peripheral
->dev
, "Failed to read MEM_ACCESS_STATUS: %d\n", ret
);
246 /* If read was not delayed we already have the result */
247 if ((ret
& CS42L42_SDW_LAST_LATE
) == 0) {
252 /* Poll for delayed read completion */
253 if ((ret
& CS42L42_SDW_RDATA_RDY
) == 0) {
254 ret
= cs42l42_sdw_poll_status(peripheral
,
255 CS42L42_SDW_RDATA_RDY
, CS42L42_SDW_RDATA_RDY
);
260 ret
= sdw_read_no_pm(peripheral
, CS42L42_SDW_MEM_READ_DATA
);
262 dev_err(&peripheral
->dev
, "Failed to read READ_DATA: %d\n", ret
);
271 static int cs42l42_sdw_write(void *context
, unsigned int reg
, unsigned int val
)
273 struct sdw_slave
*peripheral
= context
;
276 ret
= cs42l42_sdw_poll_status(peripheral
, CS42L42_SDW_CMD_IN_PROGRESS
, 0);
280 return sdw_write_no_pm(peripheral
, reg
+ CS42L42_SDW_ADDR_OFFSET
, (u8
)val
);
283 /* Initialise cs42l42 using SoundWire - this is only called once, during initialisation */
284 static void cs42l42_sdw_init(struct sdw_slave
*peripheral
)
286 struct cs42l42_private
*cs42l42
= dev_get_drvdata(&peripheral
->dev
);
289 regcache_cache_only(cs42l42
->regmap
, false);
291 ret
= cs42l42_init(cs42l42
);
293 regcache_cache_only(cs42l42
->regmap
, true);
297 /* Write out any cached changes that happened between probe and attach */
298 ret
= regcache_sync(cs42l42
->regmap
);
300 dev_warn(cs42l42
->dev
, "Failed to sync cache: %d\n", ret
);
302 /* Disable internal logic that makes clock-stop conditional */
303 regmap_clear_bits(cs42l42
->regmap
, CS42L42_PWR_CTL3
, CS42L42_SW_CLK_STP_STAT_SEL_MASK
);
306 /* This cancels the pm_runtime_get_noresume() call from cs42l42_sdw_probe(). */
307 pm_runtime_put_autosuspend(cs42l42
->dev
);
310 static int cs42l42_sdw_read_prop(struct sdw_slave
*peripheral
)
312 struct cs42l42_private
*cs42l42
= dev_get_drvdata(&peripheral
->dev
);
313 struct sdw_slave_prop
*prop
= &peripheral
->prop
;
314 struct sdw_dpn_prop
*ports
;
316 ports
= devm_kcalloc(cs42l42
->dev
, 2, sizeof(*ports
), GFP_KERNEL
);
320 prop
->source_ports
= BIT(CS42L42_SDW_CAPTURE_PORT
);
321 prop
->sink_ports
= BIT(CS42L42_SDW_PLAYBACK_PORT
);
322 prop
->quirks
= SDW_SLAVE_QUIRKS_INVALID_INITIAL_PARITY
;
323 prop
->scp_int1_mask
= SDW_SCP_INT1_BUS_CLASH
| SDW_SCP_INT1_PARITY
;
326 ports
[0].num
= CS42L42_SDW_CAPTURE_PORT
;
327 ports
[0].type
= SDW_DPN_FULL
;
328 ports
[0].ch_prep_timeout
= 10;
329 prop
->src_dpn_prop
= &ports
[0];
332 ports
[1].num
= CS42L42_SDW_PLAYBACK_PORT
;
333 ports
[1].type
= SDW_DPN_FULL
;
334 ports
[1].ch_prep_timeout
= 10;
335 prop
->sink_dpn_prop
= &ports
[1];
340 static int cs42l42_sdw_update_status(struct sdw_slave
*peripheral
,
341 enum sdw_slave_status status
)
343 struct cs42l42_private
*cs42l42
= dev_get_drvdata(&peripheral
->dev
);
346 case SDW_SLAVE_ATTACHED
:
347 dev_dbg(cs42l42
->dev
, "ATTACHED\n");
350 * The SoundWire core can report stale ATTACH notifications
351 * if we hard-reset CS42L42 in probe() but it had already been
352 * enumerated. Reject the ATTACH if we haven't yet seen an
353 * UNATTACH report for the device being in reset.
355 if (cs42l42
->sdw_waiting_first_unattach
)
359 * Initialise codec, this only needs to be done once.
360 * When resuming from suspend, resume callback will handle re-init of codec,
361 * using regcache_sync().
363 if (!cs42l42
->init_done
)
364 cs42l42_sdw_init(peripheral
);
366 case SDW_SLAVE_UNATTACHED
:
367 dev_dbg(cs42l42
->dev
, "UNATTACHED\n");
369 if (cs42l42
->sdw_waiting_first_unattach
) {
371 * SoundWire core has seen that CS42L42 is not on
372 * the bus so release RESET and wait for ATTACH.
374 cs42l42
->sdw_waiting_first_unattach
= false;
375 gpiod_set_value_cansleep(cs42l42
->reset_gpio
, 1);
386 static int cs42l42_sdw_bus_config(struct sdw_slave
*peripheral
,
387 struct sdw_bus_params
*params
)
389 struct cs42l42_private
*cs42l42
= dev_get_drvdata(&peripheral
->dev
);
390 unsigned int new_sclk
= params
->curr_dr_freq
/ 2;
392 /* The cs42l42 cannot support a glitchless SWIRE_CLK change. */
393 if ((new_sclk
!= cs42l42
->sclk
) && cs42l42
->stream_use
) {
394 dev_warn(cs42l42
->dev
, "Rejected SCLK change while audio active\n");
398 cs42l42
->sclk
= new_sclk
;
400 dev_dbg(cs42l42
->dev
, "bus_config: sclk=%u c=%u r=%u\n",
401 cs42l42
->sclk
, params
->col
, params
->row
);
406 static const struct sdw_slave_ops cs42l42_sdw_ops
= {
407 /* No interrupt callback because only hardware INT is supported for Jack Detect in the CS42L42 */
408 .read_prop
= cs42l42_sdw_read_prop
,
409 .update_status
= cs42l42_sdw_update_status
,
410 .bus_config
= cs42l42_sdw_bus_config
,
411 .port_prep
= cs42l42_sdw_port_prep
,
414 static int __maybe_unused
cs42l42_sdw_runtime_suspend(struct device
*dev
)
416 struct cs42l42_private
*cs42l42
= dev_get_drvdata(dev
);
418 dev_dbg(dev
, "Runtime suspend\n");
420 if (!cs42l42
->init_done
)
423 /* The host controller could suspend, which would mean no register access */
424 regcache_cache_only(cs42l42
->regmap
, true);
429 static const struct reg_sequence __maybe_unused cs42l42_soft_reboot_seq
[] = {
430 REG_SEQ0(CS42L42_SOFT_RESET_REBOOT
, 0x1e),
433 static int __maybe_unused
cs42l42_sdw_handle_unattach(struct cs42l42_private
*cs42l42
)
435 struct sdw_slave
*peripheral
= cs42l42
->sdw_peripheral
;
437 if (!peripheral
->unattach_request
)
440 /* Cannot access registers until master re-attaches. */
441 dev_dbg(&peripheral
->dev
, "Wait for initialization_complete\n");
442 if (!wait_for_completion_timeout(&peripheral
->initialization_complete
,
443 msecs_to_jiffies(5000))) {
444 dev_err(&peripheral
->dev
, "initialization_complete timed out\n");
448 peripheral
->unattach_request
= 0;
451 * After a bus reset there must be a reconfiguration reset to
452 * reinitialize the internal state of CS42L42.
454 regmap_multi_reg_write_bypassed(cs42l42
->regmap
,
455 cs42l42_soft_reboot_seq
,
456 ARRAY_SIZE(cs42l42_soft_reboot_seq
));
457 usleep_range(CS42L42_BOOT_TIME_US
, CS42L42_BOOT_TIME_US
* 2);
458 regcache_mark_dirty(cs42l42
->regmap
);
463 static int __maybe_unused
cs42l42_sdw_runtime_resume(struct device
*dev
)
465 static const unsigned int ts_dbnce_ms
[] = { 0, 125, 250, 500, 750, 1000, 1250, 1500};
466 struct cs42l42_private
*cs42l42
= dev_get_drvdata(dev
);
470 dev_dbg(dev
, "Runtime resume\n");
472 if (!cs42l42
->init_done
)
475 ret
= cs42l42_sdw_handle_unattach(cs42l42
);
478 } else if (ret
> 0) {
479 dbnce
= max(cs42l42
->ts_dbnc_rise
, cs42l42
->ts_dbnc_fall
);
482 msleep(ts_dbnce_ms
[dbnce
]);
485 regcache_cache_only(cs42l42
->regmap
, false);
487 /* Sync LATCH_TO_VP first so the VP domain registers sync correctly */
488 regcache_sync_region(cs42l42
->regmap
, CS42L42_MIC_DET_CTL1
, CS42L42_MIC_DET_CTL1
);
489 regcache_sync(cs42l42
->regmap
);
494 static int __maybe_unused
cs42l42_sdw_resume(struct device
*dev
)
496 struct cs42l42_private
*cs42l42
= dev_get_drvdata(dev
);
499 dev_dbg(dev
, "System resume\n");
501 /* Power-up so it can re-enumerate */
502 ret
= cs42l42_resume(dev
);
506 /* Wait for re-attach */
507 ret
= cs42l42_sdw_handle_unattach(cs42l42
);
511 cs42l42_resume_restore(dev
);
516 static int cs42l42_sdw_probe(struct sdw_slave
*peripheral
, const struct sdw_device_id
*id
)
518 struct snd_soc_component_driver
*component_drv
;
519 struct device
*dev
= &peripheral
->dev
;
520 struct cs42l42_private
*cs42l42
;
521 struct regmap_config
*regmap_conf
;
522 struct regmap
*regmap
;
525 cs42l42
= devm_kzalloc(dev
, sizeof(*cs42l42
), GFP_KERNEL
);
529 if (has_acpi_companion(dev
))
530 irq
= acpi_dev_gpio_irq_get(ACPI_COMPANION(dev
), 0);
532 irq
= of_irq_get(dev
->of_node
, 0);
537 return dev_err_probe(dev
, irq
, "Failed to get IRQ\n");
539 regmap_conf
= devm_kmemdup(dev
, &cs42l42_regmap
, sizeof(cs42l42_regmap
), GFP_KERNEL
);
542 regmap_conf
->reg_bits
= 16;
543 regmap_conf
->num_ranges
= 0;
544 regmap_conf
->reg_read
= cs42l42_sdw_read
;
545 regmap_conf
->reg_write
= cs42l42_sdw_write
;
547 regmap
= devm_regmap_init(dev
, NULL
, peripheral
, regmap_conf
);
549 return dev_err_probe(dev
, PTR_ERR(regmap
), "Failed to allocate register map\n");
551 /* Start in cache-only until device is enumerated */
552 regcache_cache_only(regmap
, true);
554 component_drv
= devm_kmemdup(dev
,
555 &cs42l42_soc_component
,
556 sizeof(cs42l42_soc_component
),
561 component_drv
->dapm_routes
= cs42l42_sdw_audio_map
;
562 component_drv
->num_dapm_routes
= ARRAY_SIZE(cs42l42_sdw_audio_map
);
565 cs42l42
->regmap
= regmap
;
566 cs42l42
->sdw_peripheral
= peripheral
;
568 cs42l42
->devid
= CS42L42_CHIP_ID
;
571 * pm_runtime is needed to control bus manager suspend, and to
572 * recover from an unattach_request when the manager suspends.
574 pm_runtime_set_autosuspend_delay(cs42l42
->dev
, 3000);
575 pm_runtime_use_autosuspend(cs42l42
->dev
);
576 pm_runtime_mark_last_busy(cs42l42
->dev
);
577 pm_runtime_set_active(cs42l42
->dev
);
578 pm_runtime_get_noresume(cs42l42
->dev
);
579 pm_runtime_enable(cs42l42
->dev
);
581 ret
= cs42l42_common_probe(cs42l42
, component_drv
, &cs42l42_sdw_dai
);
588 static int cs42l42_sdw_remove(struct sdw_slave
*peripheral
)
590 struct cs42l42_private
*cs42l42
= dev_get_drvdata(&peripheral
->dev
);
592 cs42l42_common_remove(cs42l42
);
593 pm_runtime_disable(cs42l42
->dev
);
598 static const struct dev_pm_ops cs42l42_sdw_pm
= {
599 SET_SYSTEM_SLEEP_PM_OPS(cs42l42_suspend
, cs42l42_sdw_resume
)
600 SET_RUNTIME_PM_OPS(cs42l42_sdw_runtime_suspend
, cs42l42_sdw_runtime_resume
, NULL
)
603 static const struct sdw_device_id cs42l42_sdw_id
[] = {
604 SDW_SLAVE_ENTRY(0x01FA, 0x4242, 0),
607 MODULE_DEVICE_TABLE(sdw
, cs42l42_sdw_id
);
609 static struct sdw_driver cs42l42_sdw_driver
= {
611 .name
= "cs42l42-sdw",
612 .pm
= &cs42l42_sdw_pm
,
614 .probe
= cs42l42_sdw_probe
,
615 .remove
= cs42l42_sdw_remove
,
616 .ops
= &cs42l42_sdw_ops
,
617 .id_table
= cs42l42_sdw_id
,
620 module_sdw_driver(cs42l42_sdw_driver
);
622 MODULE_DESCRIPTION("ASoC CS42L42 SoundWire driver");
623 MODULE_AUTHOR("Richard Fitzgerald <rf@opensource.cirrus.com>");
624 MODULE_LICENSE("GPL");
625 MODULE_IMPORT_NS("SND_SOC_CS42L42_CORE");