1 // SPDX-License-Identifier: GPL-2.0-only
3 * rt5677-spi.c -- RT5677 ALSA SoC audio codec driver
5 * Copyright 2013 Realtek Semiconductor Corp.
6 * Author: Oder Chiou <oder_chiou@realtek.com>
9 #include <linux/module.h>
10 #include <linux/input.h>
11 #include <linux/spi/spi.h>
12 #include <linux/device.h>
13 #include <linux/init.h>
14 #include <linux/delay.h>
15 #include <linux/interrupt.h>
16 #include <linux/irq.h>
17 #include <linux/slab.h>
18 #include <linux/sched.h>
19 #include <linux/uaccess.h>
20 #include <linux/regulator/consumer.h>
21 #include <linux/pm_qos.h>
22 #include <linux/sysfs.h>
23 #include <linux/clk.h>
24 #include <linux/firmware.h>
25 #include <linux/acpi.h>
27 #include <sound/soc.h>
30 #include "rt5677-spi.h"
32 #define DRV_NAME "rt5677spi"
34 #define RT5677_SPI_BURST_LEN 240
35 #define RT5677_SPI_HEADER 5
36 #define RT5677_SPI_FREQ 6000000
38 /* The AddressPhase and DataPhase of SPI commands are MSB first on the wire.
39 * DataPhase word size of 16-bit commands is 2 bytes.
40 * DataPhase word size of 32-bit commands is 4 bytes.
41 * DataPhase word size of burst commands is 8 bytes.
42 * The DSP CPU is little-endian.
44 #define RT5677_SPI_WRITE_BURST 0x5
45 #define RT5677_SPI_READ_BURST 0x4
46 #define RT5677_SPI_WRITE_32 0x3
47 #define RT5677_SPI_READ_32 0x2
48 #define RT5677_SPI_WRITE_16 0x1
49 #define RT5677_SPI_READ_16 0x0
51 #define RT5677_BUF_BYTES_TOTAL 0x20000
52 #define RT5677_MIC_BUF_ADDR 0x60030000
53 #define RT5677_MODEL_ADDR 0x5FFC9800
54 #define RT5677_MIC_BUF_BYTES ((u32)(RT5677_BUF_BYTES_TOTAL - \
56 #define RT5677_MIC_BUF_FIRST_READ_SIZE 0x10000
58 static struct spi_device
*g_spi
;
59 static DEFINE_MUTEX(spi_mutex
);
63 struct delayed_work copy_work
;
64 struct mutex dma_lock
;
65 struct snd_pcm_substream
*substream
;
66 size_t dma_offset
; /* zero-based offset into runtime->dma_area */
67 size_t avail_bytes
; /* number of new bytes since last period */
68 u32 mic_read_offset
; /* zero-based offset into DSP's mic buffer */
69 bool new_hotword
; /* a new hotword is fired */
72 static const struct snd_pcm_hardware rt5677_spi_pcm_hardware
= {
73 .info
= SNDRV_PCM_INFO_MMAP
|
74 SNDRV_PCM_INFO_MMAP_VALID
|
75 SNDRV_PCM_INFO_INTERLEAVED
,
76 .formats
= SNDRV_PCM_FMTBIT_S16_LE
,
77 .period_bytes_min
= PAGE_SIZE
,
78 .period_bytes_max
= RT5677_BUF_BYTES_TOTAL
/ 8,
83 .buffer_bytes_max
= RT5677_BUF_BYTES_TOTAL
,
86 static struct snd_soc_dai_driver rt5677_spi_dai
= {
87 /* The DAI name "rt5677-dsp-cpu-dai" is not used. The actual DAI name
88 * registered with ASoC is the name of the device "spi-RT5677AA:00",
89 * because we only have one DAI. See snd_soc_register_dais().
91 .name
= "rt5677-dsp-cpu-dai",
94 .stream_name
= "DSP Capture",
97 .rates
= SNDRV_PCM_RATE_16000
,
98 .formats
= SNDRV_PCM_FMTBIT_S16_LE
,
102 /* PCM for streaming audio from the DSP buffer */
103 static int rt5677_spi_pcm_open(
104 struct snd_soc_component
*component
,
105 struct snd_pcm_substream
*substream
)
107 snd_soc_set_runtime_hwparams(substream
, &rt5677_spi_pcm_hardware
);
111 static int rt5677_spi_pcm_close(
112 struct snd_soc_component
*component
,
113 struct snd_pcm_substream
*substream
)
115 struct snd_soc_pcm_runtime
*rtd
= substream
->private_data
;
116 struct snd_soc_component
*codec_component
=
117 snd_soc_rtdcom_lookup(rtd
, "rt5677");
118 struct rt5677_priv
*rt5677
=
119 snd_soc_component_get_drvdata(codec_component
);
120 struct rt5677_dsp
*rt5677_dsp
=
121 snd_soc_component_get_drvdata(component
);
123 cancel_delayed_work_sync(&rt5677_dsp
->copy_work
);
124 rt5677
->set_dsp_vad(codec_component
, false);
128 static int rt5677_spi_hw_params(
129 struct snd_soc_component
*component
,
130 struct snd_pcm_substream
*substream
,
131 struct snd_pcm_hw_params
*hw_params
)
133 struct rt5677_dsp
*rt5677_dsp
=
134 snd_soc_component_get_drvdata(component
);
136 mutex_lock(&rt5677_dsp
->dma_lock
);
137 rt5677_dsp
->substream
= substream
;
138 mutex_unlock(&rt5677_dsp
->dma_lock
);
143 static int rt5677_spi_hw_free(
144 struct snd_soc_component
*component
,
145 struct snd_pcm_substream
*substream
)
147 struct rt5677_dsp
*rt5677_dsp
=
148 snd_soc_component_get_drvdata(component
);
150 mutex_lock(&rt5677_dsp
->dma_lock
);
151 rt5677_dsp
->substream
= NULL
;
152 mutex_unlock(&rt5677_dsp
->dma_lock
);
157 static int rt5677_spi_prepare(
158 struct snd_soc_component
*component
,
159 struct snd_pcm_substream
*substream
)
161 struct snd_soc_pcm_runtime
*rtd
= substream
->private_data
;
162 struct snd_soc_component
*rt5677_component
=
163 snd_soc_rtdcom_lookup(rtd
, "rt5677");
164 struct rt5677_priv
*rt5677
=
165 snd_soc_component_get_drvdata(rt5677_component
);
166 struct rt5677_dsp
*rt5677_dsp
=
167 snd_soc_component_get_drvdata(component
);
169 rt5677
->set_dsp_vad(rt5677_component
, true);
170 rt5677_dsp
->dma_offset
= 0;
171 rt5677_dsp
->avail_bytes
= 0;
175 static snd_pcm_uframes_t
rt5677_spi_pcm_pointer(
176 struct snd_soc_component
*component
,
177 struct snd_pcm_substream
*substream
)
179 struct snd_pcm_runtime
*runtime
= substream
->runtime
;
180 struct rt5677_dsp
*rt5677_dsp
=
181 snd_soc_component_get_drvdata(component
);
183 return bytes_to_frames(runtime
, rt5677_dsp
->dma_offset
);
186 static int rt5677_spi_mic_write_offset(u32
*mic_write_offset
)
189 /* Grab the first 4 bytes that hold the write pointer on the
190 * dsp, and check to make sure that it points somewhere inside the
193 ret
= rt5677_spi_read(RT5677_MIC_BUF_ADDR
, mic_write_offset
,
197 /* Adjust the offset so that it's zero-based */
198 *mic_write_offset
= *mic_write_offset
- sizeof(u32
);
199 return *mic_write_offset
< RT5677_MIC_BUF_BYTES
? 0 : -EFAULT
;
203 * Copy one contiguous block of audio samples from the DSP mic buffer to the
204 * dma_area of the pcm runtime. The receiving buffer may wrap around.
205 * @begin: start offset of the block to copy, in bytes.
206 * @end: offset of the first byte after the block to copy, must be greater
207 * than or equal to begin.
209 * Return: Zero if successful, or a negative error code on failure.
211 static int rt5677_spi_copy_block(struct rt5677_dsp
*rt5677_dsp
,
214 struct snd_pcm_runtime
*runtime
= rt5677_dsp
->substream
->runtime
;
215 size_t bytes_per_frame
= frames_to_bytes(runtime
, 1);
216 size_t first_chunk_len
, second_chunk_len
;
219 if (begin
> end
|| runtime
->dma_bytes
< 2 * bytes_per_frame
) {
220 dev_err(rt5677_dsp
->dev
,
221 "Invalid copy from (%u, %u), dma_area size %zu\n",
222 begin
, end
, runtime
->dma_bytes
);
226 /* The block to copy is empty */
230 /* If the incoming chunk is too big for the receiving buffer, only the
231 * last "receiving buffer size - one frame" bytes are copied.
233 if (end
- begin
> runtime
->dma_bytes
- bytes_per_frame
)
234 begin
= end
- (runtime
->dma_bytes
- bytes_per_frame
);
236 /* May need to split to two chunks, calculate the size of each */
237 first_chunk_len
= end
- begin
;
238 second_chunk_len
= 0;
239 if (rt5677_dsp
->dma_offset
+ first_chunk_len
> runtime
->dma_bytes
) {
240 /* Receiving buffer wrapped around */
241 second_chunk_len
= first_chunk_len
;
242 first_chunk_len
= runtime
->dma_bytes
- rt5677_dsp
->dma_offset
;
243 second_chunk_len
-= first_chunk_len
;
246 /* Copy first chunk */
247 ret
= rt5677_spi_read(RT5677_MIC_BUF_ADDR
+ sizeof(u32
) + begin
,
248 runtime
->dma_area
+ rt5677_dsp
->dma_offset
,
252 rt5677_dsp
->dma_offset
+= first_chunk_len
;
253 if (rt5677_dsp
->dma_offset
== runtime
->dma_bytes
)
254 rt5677_dsp
->dma_offset
= 0;
256 /* Copy second chunk */
257 if (second_chunk_len
) {
258 ret
= rt5677_spi_read(RT5677_MIC_BUF_ADDR
+ sizeof(u32
) +
259 begin
+ first_chunk_len
, runtime
->dma_area
,
262 rt5677_dsp
->dma_offset
= second_chunk_len
;
268 * Copy a given amount of audio samples from the DSP mic buffer starting at
269 * mic_read_offset, to the dma_area of the pcm runtime. The source buffer may
270 * wrap around. mic_read_offset is updated after successful copy.
271 * @amount: amount of samples to copy, in bytes.
273 * Return: Zero if successful, or a negative error code on failure.
275 static int rt5677_spi_copy(struct rt5677_dsp
*rt5677_dsp
, u32 amount
)
283 target
= rt5677_dsp
->mic_read_offset
+ amount
;
284 /* Copy the first chunk in DSP's mic buffer */
285 ret
|= rt5677_spi_copy_block(rt5677_dsp
, rt5677_dsp
->mic_read_offset
,
286 min(target
, RT5677_MIC_BUF_BYTES
));
288 if (target
>= RT5677_MIC_BUF_BYTES
) {
289 /* Wrap around, copy the second chunk */
290 target
-= RT5677_MIC_BUF_BYTES
;
291 ret
|= rt5677_spi_copy_block(rt5677_dsp
, 0, target
);
295 rt5677_dsp
->mic_read_offset
= target
;
300 * A delayed work that streams audio samples from the DSP mic buffer to the
301 * dma_area of the pcm runtime via SPI.
303 static void rt5677_spi_copy_work(struct work_struct
*work
)
305 struct rt5677_dsp
*rt5677_dsp
=
306 container_of(work
, struct rt5677_dsp
, copy_work
.work
);
307 struct snd_pcm_runtime
*runtime
;
308 u32 mic_write_offset
;
309 size_t new_bytes
, copy_bytes
, period_bytes
;
313 /* Ensure runtime->dma_area buffer does not go away while copying. */
314 mutex_lock(&rt5677_dsp
->dma_lock
);
315 if (!rt5677_dsp
->substream
) {
316 dev_err(rt5677_dsp
->dev
, "No pcm substream\n");
320 runtime
= rt5677_dsp
->substream
->runtime
;
322 if (rt5677_spi_mic_write_offset(&mic_write_offset
)) {
323 dev_err(rt5677_dsp
->dev
, "No mic_write_offset\n");
327 /* If this is the first time that we've asked for streaming data after
328 * a hotword is fired, we should start reading from the previous 2
329 * seconds of audio from wherever the mic_write_offset is currently.
331 if (rt5677_dsp
->new_hotword
) {
332 rt5677_dsp
->new_hotword
= false;
333 /* See if buffer wraparound happens */
334 if (mic_write_offset
< RT5677_MIC_BUF_FIRST_READ_SIZE
)
335 rt5677_dsp
->mic_read_offset
= RT5677_MIC_BUF_BYTES
-
336 (RT5677_MIC_BUF_FIRST_READ_SIZE
-
339 rt5677_dsp
->mic_read_offset
= mic_write_offset
-
340 RT5677_MIC_BUF_FIRST_READ_SIZE
;
343 /* Calculate the amount of new samples in bytes */
344 if (rt5677_dsp
->mic_read_offset
<= mic_write_offset
)
345 new_bytes
= mic_write_offset
- rt5677_dsp
->mic_read_offset
;
347 new_bytes
= RT5677_MIC_BUF_BYTES
+ mic_write_offset
348 - rt5677_dsp
->mic_read_offset
;
350 /* Copy all new samples from DSP mic buffer, one period at a time */
351 period_bytes
= snd_pcm_lib_period_bytes(rt5677_dsp
->substream
);
353 copy_bytes
= min(new_bytes
, period_bytes
354 - rt5677_dsp
->avail_bytes
);
355 ret
= rt5677_spi_copy(rt5677_dsp
, copy_bytes
);
357 dev_err(rt5677_dsp
->dev
, "Copy failed %d\n", ret
);
360 rt5677_dsp
->avail_bytes
+= copy_bytes
;
361 if (rt5677_dsp
->avail_bytes
>= period_bytes
) {
362 snd_pcm_period_elapsed(rt5677_dsp
->substream
);
363 rt5677_dsp
->avail_bytes
= 0;
365 new_bytes
-= copy_bytes
;
368 delay
= bytes_to_frames(runtime
, period_bytes
) / (runtime
->rate
/ 1000);
369 schedule_delayed_work(&rt5677_dsp
->copy_work
, msecs_to_jiffies(delay
));
371 mutex_unlock(&rt5677_dsp
->dma_lock
);
374 static int rt5677_spi_pcm_new(struct snd_soc_component
*component
,
375 struct snd_soc_pcm_runtime
*rtd
)
377 snd_pcm_set_managed_buffer_all(rtd
->pcm
, SNDRV_DMA_TYPE_VMALLOC
,
382 static int rt5677_spi_pcm_probe(struct snd_soc_component
*component
)
384 struct rt5677_dsp
*rt5677_dsp
;
386 rt5677_dsp
= devm_kzalloc(component
->dev
, sizeof(*rt5677_dsp
),
390 rt5677_dsp
->dev
= &g_spi
->dev
;
391 mutex_init(&rt5677_dsp
->dma_lock
);
392 INIT_DELAYED_WORK(&rt5677_dsp
->copy_work
, rt5677_spi_copy_work
);
394 snd_soc_component_set_drvdata(component
, rt5677_dsp
);
398 static const struct snd_soc_component_driver rt5677_spi_dai_component
= {
400 .probe
= rt5677_spi_pcm_probe
,
401 .open
= rt5677_spi_pcm_open
,
402 .close
= rt5677_spi_pcm_close
,
403 .hw_params
= rt5677_spi_hw_params
,
404 .hw_free
= rt5677_spi_hw_free
,
405 .prepare
= rt5677_spi_prepare
,
406 .pointer
= rt5677_spi_pcm_pointer
,
407 .pcm_construct
= rt5677_spi_pcm_new
,
410 /* Select a suitable transfer command for the next transfer to ensure
411 * the transfer address is always naturally aligned while minimizing
412 * the total number of transfers required.
414 * 3 transfer commands are available:
415 * RT5677_SPI_READ/WRITE_16: Transfer 2 bytes
416 * RT5677_SPI_READ/WRITE_32: Transfer 4 bytes
417 * RT5677_SPI_READ/WRITE_BURST: Transfer any multiples of 8 bytes
420 * 16 Bit writes and reads are restricted to the address range
421 * 0x18020000 ~ 0x18021000
423 * For example, reading 256 bytes at 0x60030004 uses the following commands:
424 * 0x60030004 RT5677_SPI_READ_32 4 bytes
425 * 0x60030008 RT5677_SPI_READ_BURST 240 bytes
426 * 0x600300F8 RT5677_SPI_READ_BURST 8 bytes
427 * 0x60030100 RT5677_SPI_READ_32 4 bytes
430 * @read: true for read commands; false for write commands
431 * @align: alignment of the next transfer address
432 * @remain: number of bytes remaining to transfer
435 * @len: number of bytes to transfer with the selected command
436 * Returns the selected command
438 static u8
rt5677_spi_select_cmd(bool read
, u32 align
, u32 remain
, u32
*len
)
442 if (align
== 4 || remain
<= 4) {
443 cmd
= RT5677_SPI_READ_32
;
446 cmd
= RT5677_SPI_READ_BURST
;
447 *len
= (((remain
- 1) >> 3) + 1) << 3;
448 *len
= min_t(u32
, *len
, RT5677_SPI_BURST_LEN
);
450 return read
? cmd
: cmd
+ 1;
453 /* Copy dstlen bytes from src to dst, while reversing byte order for each word.
454 * If srclen < dstlen, zeros are padded.
456 static void rt5677_spi_reverse(u8
*dst
, u32 dstlen
, const u8
*src
, u32 srclen
)
459 u32 word_size
= min_t(u32
, dstlen
, 8);
461 for (w
= 0; w
< dstlen
; w
+= word_size
) {
462 for (i
= 0; i
< word_size
&& i
+ w
< dstlen
; i
++) {
463 si
= w
+ word_size
- i
- 1;
464 dst
[w
+ i
] = si
< srclen
? src
[si
] : 0;
469 /* Read DSP address space using SPI. addr and len have to be 4-byte aligned. */
470 int rt5677_spi_read(u32 addr
, void *rxbuf
, size_t len
)
474 struct spi_transfer t
[2];
475 struct spi_message m
;
476 /* +4 bytes is for the DummyPhase following the AddressPhase */
477 u8 header
[RT5677_SPI_HEADER
+ 4];
478 u8 body
[RT5677_SPI_BURST_LEN
];
485 if ((addr
& 3) || (len
& 3)) {
486 dev_err(&g_spi
->dev
, "Bad read align 0x%x(%zu)\n", addr
, len
);
490 memset(t
, 0, sizeof(t
));
491 t
[0].tx_buf
= header
;
492 t
[0].len
= sizeof(header
);
493 t
[0].speed_hz
= RT5677_SPI_FREQ
;
495 t
[1].speed_hz
= RT5677_SPI_FREQ
;
496 spi_message_init_with_transfers(&m
, t
, ARRAY_SIZE(t
));
498 for (offset
= 0; offset
< len
; offset
+= t
[1].len
) {
499 spi_cmd
= rt5677_spi_select_cmd(true, (addr
+ offset
) & 7,
500 len
- offset
, &t
[1].len
);
502 /* Construct SPI message header */
504 header
[1] = ((addr
+ offset
) & 0xff000000) >> 24;
505 header
[2] = ((addr
+ offset
) & 0x00ff0000) >> 16;
506 header
[3] = ((addr
+ offset
) & 0x0000ff00) >> 8;
507 header
[4] = ((addr
+ offset
) & 0x000000ff) >> 0;
509 mutex_lock(&spi_mutex
);
510 status
|= spi_sync(g_spi
, &m
);
511 mutex_unlock(&spi_mutex
);
514 /* Copy data back to caller buffer */
515 rt5677_spi_reverse(cb
+ offset
, len
- offset
, body
, t
[1].len
);
519 EXPORT_SYMBOL_GPL(rt5677_spi_read
);
521 /* Write DSP address space using SPI. addr has to be 4-byte aligned.
522 * If len is not 4-byte aligned, then extra zeros are written at the end
525 int rt5677_spi_write(u32 addr
, const void *txbuf
, size_t len
)
529 struct spi_transfer t
;
530 struct spi_message m
;
531 /* +1 byte is for the DummyPhase following the DataPhase */
532 u8 buf
[RT5677_SPI_HEADER
+ RT5677_SPI_BURST_LEN
+ 1];
533 u8
*body
= buf
+ RT5677_SPI_HEADER
;
535 const u8
*cb
= txbuf
;
541 dev_err(&g_spi
->dev
, "Bad write align 0x%x(%zu)\n", addr
, len
);
545 memset(&t
, 0, sizeof(t
));
547 t
.speed_hz
= RT5677_SPI_FREQ
;
548 spi_message_init_with_transfers(&m
, &t
, 1);
550 for (offset
= 0; offset
< len
;) {
551 spi_cmd
= rt5677_spi_select_cmd(false, (addr
+ offset
) & 7,
552 len
- offset
, &t
.len
);
554 /* Construct SPI message header */
556 buf
[1] = ((addr
+ offset
) & 0xff000000) >> 24;
557 buf
[2] = ((addr
+ offset
) & 0x00ff0000) >> 16;
558 buf
[3] = ((addr
+ offset
) & 0x0000ff00) >> 8;
559 buf
[4] = ((addr
+ offset
) & 0x000000ff) >> 0;
561 /* Fetch data from caller buffer */
562 rt5677_spi_reverse(body
, t
.len
, cb
+ offset
, len
- offset
);
564 t
.len
+= RT5677_SPI_HEADER
+ 1;
566 mutex_lock(&spi_mutex
);
567 status
|= spi_sync(g_spi
, &m
);
568 mutex_unlock(&spi_mutex
);
572 EXPORT_SYMBOL_GPL(rt5677_spi_write
);
574 int rt5677_spi_write_firmware(u32 addr
, const struct firmware
*fw
)
576 return rt5677_spi_write(addr
, fw
->data
, fw
->size
);
578 EXPORT_SYMBOL_GPL(rt5677_spi_write_firmware
);
580 void rt5677_spi_hotword_detected(void)
582 struct rt5677_dsp
*rt5677_dsp
;
587 rt5677_dsp
= dev_get_drvdata(&g_spi
->dev
);
589 dev_err(&g_spi
->dev
, "Can't get rt5677_dsp\n");
593 mutex_lock(&rt5677_dsp
->dma_lock
);
594 dev_info(rt5677_dsp
->dev
, "Hotword detected\n");
595 rt5677_dsp
->new_hotword
= true;
596 mutex_unlock(&rt5677_dsp
->dma_lock
);
598 schedule_delayed_work(&rt5677_dsp
->copy_work
, 0);
600 EXPORT_SYMBOL_GPL(rt5677_spi_hotword_detected
);
602 static int rt5677_spi_probe(struct spi_device
*spi
)
608 ret
= snd_soc_register_component(&spi
->dev
, &rt5677_spi_dai_component
,
611 dev_err(&spi
->dev
, "Failed to register component.\n");
616 static int rt5677_spi_remove(struct spi_device
*spi
)
618 snd_soc_unregister_component(&spi
->dev
);
622 static const struct acpi_device_id rt5677_spi_acpi_id
[] = {
626 MODULE_DEVICE_TABLE(acpi
, rt5677_spi_acpi_id
);
628 static struct spi_driver rt5677_spi_driver
= {
631 .acpi_match_table
= ACPI_PTR(rt5677_spi_acpi_id
),
633 .probe
= rt5677_spi_probe
,
634 .remove
= rt5677_spi_remove
,
636 module_spi_driver(rt5677_spi_driver
);
638 MODULE_DESCRIPTION("ASoC RT5677 SPI driver");
639 MODULE_AUTHOR("Oder Chiou <oder_chiou@realtek.com>");
640 MODULE_LICENSE("GPL v2");