Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

ASoC: cs35l56: Bugfixes

Merge series from Richard Fitzgerald <rf@opensource.cirrus.com>:

Miscellaneous bugfixes for the cs35l56 codec driver.

+25 -17
+17 -16
sound/soc/codecs/cs35l56.c
··· 358 358 return 0; 359 359 } 360 360 361 - static void cs35l56_set_asp_slot_positions(struct cs35l56_private *cs35l56, 362 - unsigned int reg, unsigned long mask) 361 + static unsigned int cs35l56_make_tdm_config_word(unsigned int reg_val, unsigned long mask) 363 362 { 364 - unsigned int reg_val, channel_shift; 363 + unsigned int channel_shift; 365 364 int bit_num; 366 - 367 - /* Init all slots to 63 */ 368 - switch (reg) { 369 - case CS35L56_ASP1_FRAME_CONTROL1: 370 - reg_val = 0x3f3f3f3f; 371 - break; 372 - case CS35L56_ASP1_FRAME_CONTROL5: 373 - reg_val = 0x3f3f3f; 374 - break; 375 - } 376 365 377 366 /* Enable consecutive TX1..TXn for each of the slots set in mask */ 378 367 channel_shift = 0; ··· 371 382 channel_shift += 8; 372 383 } 373 384 374 - regmap_write(cs35l56->base.regmap, reg, reg_val); 385 + return reg_val; 375 386 } 376 387 377 388 static int cs35l56_asp_dai_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, ··· 407 418 if (rx_mask == 0) 408 419 rx_mask = 0xf; // ASPTX1..TX4 in slots 0..3 409 420 410 - cs35l56_set_asp_slot_positions(cs35l56, CS35L56_ASP1_FRAME_CONTROL1, rx_mask); 411 - cs35l56_set_asp_slot_positions(cs35l56, CS35L56_ASP1_FRAME_CONTROL5, tx_mask); 421 + /* Default unused slots to 63 */ 422 + regmap_write(cs35l56->base.regmap, CS35L56_ASP1_FRAME_CONTROL1, 423 + cs35l56_make_tdm_config_word(0x3f3f3f3f, rx_mask)); 424 + regmap_write(cs35l56->base.regmap, CS35L56_ASP1_FRAME_CONTROL5, 425 + cs35l56_make_tdm_config_word(0x3f3f3f, tx_mask)); 412 426 413 427 dev_dbg(cs35l56->base.dev, "tdm slot width: %u count: %u tx_mask: %#x rx_mask: %#x\n", 414 428 cs35l56->asp_slot_width, cs35l56->asp_slot_count, tx_mask, rx_mask); ··· 952 960 953 961 dev_dbg(dev, "system_resume\n"); 954 962 963 + /* 964 + * We might have done a hard reset or the CS35L56 was power-cycled 965 + * so wait for control port to be ready. 966 + */ 967 + cs35l56_wait_control_port_ready(); 968 + 955 969 /* Undo pm_runtime_force_suspend() before re-enabling the irq */ 956 970 ret = pm_runtime_force_resume(dev); 957 971 if (cs35l56->base.irq) ··· 976 978 return ret; 977 979 978 980 cs35l56->base.fw_patched = false; 981 + wm_adsp_power_down(&cs35l56->dsp); 979 982 queue_work(cs35l56->dsp_wq, &cs35l56->dsp_work); 980 983 981 984 /* ··· 1076 1077 return dev_err_probe(cs35l56->base.dev, ret, "Failed to enable supplies\n"); 1077 1078 1078 1079 if (cs35l56->base.reset_gpio) { 1080 + /* ACPI can override GPIOD_OUT_LOW flag so force it to start low */ 1081 + gpiod_set_value_cansleep(cs35l56->base.reset_gpio, 0); 1079 1082 cs35l56_wait_min_reset_pulse(); 1080 1083 gpiod_set_value_cansleep(cs35l56->base.reset_gpio, 1); 1081 1084 }
+7 -1
sound/soc/codecs/wm_adsp.c
··· 1025 1025 } 1026 1026 EXPORT_SYMBOL_GPL(wm_adsp_power_up); 1027 1027 1028 + void wm_adsp_power_down(struct wm_adsp *dsp) 1029 + { 1030 + cs_dsp_power_down(&dsp->cs_dsp); 1031 + } 1032 + EXPORT_SYMBOL_GPL(wm_adsp_power_down); 1033 + 1028 1034 static void wm_adsp_boot_work(struct work_struct *work) 1029 1035 { 1030 1036 struct wm_adsp *dsp = container_of(work, ··· 1052 1046 queue_work(system_unbound_wq, &dsp->boot_work); 1053 1047 break; 1054 1048 case SND_SOC_DAPM_PRE_PMD: 1055 - cs_dsp_power_down(&dsp->cs_dsp); 1049 + wm_adsp_power_down(dsp); 1056 1050 break; 1057 1051 default: 1058 1052 break;
+1
sound/soc/codecs/wm_adsp.h
··· 92 92 struct snd_kcontrol *kcontrol, int event); 93 93 94 94 int wm_adsp_power_up(struct wm_adsp *dsp); 95 + void wm_adsp_power_down(struct wm_adsp *dsp); 95 96 96 97 irqreturn_t wm_adsp2_bus_error(int irq, void *data); 97 98 irqreturn_t wm_halo_bus_error(int irq, void *data);