15 #include <linux/module.h>
32 #define DEVICE_ID_WM0010 10
61 static struct pll_clock_map {
63 int max_pll_spi_speed;
66 { 22000000, 26000000, 0x00201f11 },
67 { 18000000, 26000000, 0x00203f21 },
68 { 14000000, 26000000, 0x00202620 },
69 { 10000000, 22000000, 0x00203120 },
70 { 6500000, 22000000, 0x00204520 },
71 { 5500000, 22000000, 0x00103f10 },
126 {
"SDI2 Capture",
NULL,
"SDI1 Playback" },
127 {
"SDI1 Capture",
NULL,
"SDI2 Playback" },
129 {
"SDI1 Capture",
NULL,
"CLKIN" },
130 {
"SDI2 Capture",
NULL,
"CLKIN" },
131 {
"SDI1 Playback",
NULL,
"CLKIN" },
132 {
"SDI2 Playback",
NULL,
"CLKIN" },
137 const char *state_to_str[] = {
147 return state_to_str[
state];
153 struct wm0010_priv *wm0010 = snd_soc_codec_get_drvdata(codec);
159 state = wm0010->
state;
160 spin_unlock_irqrestore(&wm0010->
irq_lock, flags);
182 spin_unlock_irqrestore(&wm0010->
irq_lock, flags);
194 static void wm0010_mark_boot_failure(
struct wm0010_priv *wm0010)
200 state = wm0010->
state;
201 spin_unlock_irqrestore(&wm0010->
irq_lock, flags);
203 dev_err(wm0010->
dev,
"Failed to transition from `%s' state to `%s' state\n",
204 wm0010_state_to_str(state), wm0010_state_to_str(state + 1));
209 static void wm0010_boot_xfer_complete(
void *
data)
213 struct wm0010_priv *wm0010 = snd_soc_codec_get_drvdata(codec);
214 u32 *out32 = xfer->
t.rx_buf;
217 if (xfer->
m.status != 0) {
218 dev_err(codec->
dev,
"SPI transfer failed: %d\n",
220 wm0010_mark_boot_failure(wm0010);
226 for (i = 0; i < xfer->
t.len / 4; i++) {
227 dev_dbg(codec->
dev,
"%d: %04x\n", i, out32[i]);
232 "%d: ROM error reported in stage 2\n", i);
233 wm0010_mark_boot_failure(wm0010);
240 "%d: ROM bootloader running in stage 2\n", i);
241 wm0010_mark_boot_failure(wm0010);
245 dev_dbg(codec->
dev,
"Stage2 loader running\n");
249 dev_dbg(codec->
dev,
"CODE_HDR packet received\n");
253 dev_dbg(codec->
dev,
"CODE_DATA packet received\n");
270 dev_err(codec->
dev,
"Device reports image too long\n");
271 wm0010_mark_boot_failure(wm0010);
275 dev_err(codec->
dev,
"Device reports bad SPI packet\n");
276 wm0010_mark_boot_failure(wm0010);
280 dev_err(codec->
dev,
"Device reports SPI read overflow\n");
281 wm0010_mark_boot_failure(wm0010);
285 dev_err(codec->
dev,
"Device reports SPI underclock\n");
286 wm0010_mark_boot_failure(wm0010);
290 dev_err(codec->
dev,
"Device reports bad header packet\n");
291 wm0010_mark_boot_failure(wm0010);
295 dev_err(codec->
dev,
"Device reports invalid packet type\n");
296 wm0010_mark_boot_failure(wm0010);
300 dev_err(codec->
dev,
"Device reports data before header error\n");
301 wm0010_mark_boot_failure(wm0010);
305 dev_err(codec->
dev,
"Device reports invalid PLL packet\n");
309 dev_err(codec->
dev,
"Device reports packet alignment error\n");
310 wm0010_mark_boot_failure(wm0010);
314 dev_err(codec->
dev,
"Unrecognised return 0x%x\n",
316 wm0010_mark_boot_failure(wm0010);
329 static void byte_swap_64(
u64 *data_in,
u64 *data_out,
u32 len)
333 for (i = 0; i < len / 8; i++)
340 struct wm0010_priv *wm0010 = snd_soc_codec_get_drvdata(codec);
359 dev_warn(wm0010->
dev,
"DSP already powered up!\n");
360 spin_unlock_irqrestore(&wm0010->
irq_lock, flags);
362 if (wm0010->
sysclk > 26000000) {
363 dev_err(codec->
dev,
"Max DSP clock frequency is 26MHz\n");
368 INIT_LIST_HEAD(&xfer_list);
378 dev_err(&spi->
dev,
"Failed to enable core supplies: %d\n",
386 dev_err(&spi->
dev,
"Failed to enable DBVDD: %d\n", ret);
394 spin_unlock_irqrestore(&wm0010->
irq_lock, flags);
399 dev_err(codec->
dev,
"Failed to request stage2 loader: %d\n",
406 dev_err(codec->
dev,
"Failed to get interrupt from DSP\n");
410 spin_unlock_irqrestore(&wm0010->
irq_lock, flags);
412 dev_dbg(codec->
dev,
"Downloading %zu byte stage 2 loader\n", fw->
size);
417 dev_err(codec->
dev,
"Failed to allocate image buffer\n");
423 dev_err(codec->
dev,
"Failed to allocate output buffer\n");
429 spi_message_init(&
m);
435 t.speed_hz = wm0010->
sysclk / 10;
436 spi_message_add_tail(&
t, &
m);
438 dev_dbg(codec->
dev,
"Starting initial download at %dHz\n",
443 dev_err(codec->
dev,
"Initial download failed: %d\n", ret);
448 for (i = 0; i < fw->
size; i++) {
449 if (out[i] != 0x55) {
451 dev_err(codec->
dev,
"Boot ROM error: %x in %d\n",
453 wm0010_mark_boot_failure(wm0010);
464 dev_err(codec->
dev,
"Failed to get interrupt from DSP loader.\n");
468 spin_unlock_irqrestore(&wm0010->
irq_lock, flags);
474 memset(&pll_rec, 0,
sizeof(pll_rec));
476 pll_rec.length = (
sizeof(pll_rec) - 8);
481 len = pll_rec.length + 8;
485 "Failed to allocate RX buffer\n");
492 "Failed to allocate image buffer\n");
497 byte_swap_64((
u64 *)&pll_rec, img_swap, len);
499 spi_message_init(&
m);
505 t.speed_hz = wm0010->
sysclk / 6;
506 spi_message_add_tail(&
t, &
m);
510 dev_err(codec->
dev,
"First PLL write failed: %d\n", ret);
517 dev_err(codec->
dev,
"Second PLL write failed: %d\n", ret);
524 for (i = 0; i < len / 4; i++) {
525 if (*p == 0x0e00ed0f) {
540 dev_err(codec->
dev,
"Failed to request application: %d\n",
549 BUG_ON(!list_empty(&xfer_list));
550 init_completion(&
done);
554 dev_err(codec->
dev,
"First record not INFO\r\n");
560 dev_err(codec->
dev,
"Not a WM0010 firmware file.\r\n");
565 offset += ((rec->
length) + 8);
570 "Packet: command %d, data length = 0x%x\r\n",
577 "Failed to allocate RX buffer\n");
584 "Failed to allocate image buffer\n");
589 byte_swap_64((
u64 *)&rec->
command, img_swap, len);
593 dev_err(codec->
dev,
"Failed to allocate xfer\n");
600 spi_message_init(&xfer->
m);
601 xfer->
m.complete = wm0010_boot_xfer_complete;
602 xfer->
m.context = xfer;
603 xfer->
t.tx_buf = img_swap;
604 xfer->
t.rx_buf =
out;
606 xfer->
t.bits_per_word = 8;
609 xfer->
t.speed_hz = wm0010->
sysclk / 6;
621 spi_message_add_tail(&xfer->
t, &xfer->
m);
623 offset += ((rec->
length) + 8);
627 dev_dbg(codec->
dev,
"All transfers scheduled\n");
633 dev_err(codec->
dev,
"Write failed: %d\n", ret);
645 spin_unlock_irqrestore(&wm0010->
irq_lock, flags);
651 while (!list_empty(&xfer_list)) {
676 static int wm0010_set_bias_level(
struct snd_soc_codec *codec,
679 struct wm0010_priv *wm0010 = snd_soc_codec_get_drvdata(codec);
705 int clk_id,
unsigned int freq,
int dir)
707 struct wm0010_priv *wm0010 = snd_soc_codec_get_drvdata(codec);
712 if (freq < pll_clock_map[
ARRAY_SIZE(pll_clock_map)-1].max_sysclk) {
715 for (i = 0; i <
ARRAY_SIZE(pll_clock_map); i++)
716 if (freq >= pll_clock_map[i].max_sysclk)
729 .probe = wm0010_probe,
730 .set_bias_level = wm0010_set_bias_level,
731 .set_sysclk = wm0010_set_sysclk,
732 .idle_bias_off =
true,
734 .dapm_widgets = wm0010_dapm_widgets,
735 .num_dapm_widgets =
ARRAY_SIZE(wm0010_dapm_widgets),
736 .dapm_routes = wm0010_dapm_routes,
737 .num_dapm_routes =
ARRAY_SIZE(wm0010_dapm_routes),
740 #define WM0010_RATES (SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000)
741 #define WM0010_FORMATS (SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_S16_LE |\
742 SNDRV_PCM_FMTBIT_S20_3LE | SNDRV_PCM_FMTBIT_S24_LE |\
743 SNDRV_PCM_FMTBIT_S32_LE)
747 .name =
"wm0010-sdi1",
749 .stream_name =
"SDI1 Playback",
756 .stream_name =
"SDI1 Capture",
764 .name =
"wm0010-sdi2",
766 .stream_name =
"SDI2 Playback",
773 .stream_name =
"SDI2 Capture",
786 switch (wm0010->
state) {
804 struct wm0010_priv *wm0010 = snd_soc_codec_get_drvdata(codec);
813 unsigned long gpio_flags;
827 spi_set_drvdata(spi, wm0010);
830 if (dev_get_platdata(&spi->
dev))
832 sizeof(wm0010->
pdata));
841 dev_err(wm0010->
dev,
"Failed to obtain core supplies: %d\n",
847 if (IS_ERR(wm0010->
dbvdd)) {
848 ret = PTR_ERR(wm0010->
dbvdd);
849 dev_err(wm0010->
dev,
"Failed to obtain DBVDD: %d\n", ret);
853 if (wm0010->
pdata.gpio_reset) {
856 if (wm0010->
pdata.reset_active_high)
867 gpio_flags,
"wm0010 reset");
870 "Failed to request GPIO for DSP reset: %d\n",
875 dev_err(wm0010->
dev,
"No reset GPIO configured\n");
882 if (wm0010->
pdata.irq_flags)
883 trigger = wm0010->
pdata.irq_flags;
891 dev_err(wm0010->
dev,
"Failed to request IRQ %d: %d\n",
903 &soc_codec_dev_wm0010, wm0010_dai,
926 static struct spi_driver wm0010_spi_driver = {
932 .probe = wm0010_spi_probe,