Lines Matching +full:write +full:- +full:0 +full:- +full:bps
1 // SPDX-License-Identifier: GPL-2.0-only
3 // rt1017-sdca-sdw.c -- rt1017 SDCA ALSA SoC amplifier audio driver
18 #include <sound/soc-dapm.h>
22 #include "rt1017-sdca-sdw.h"
27 case 0x2f55: in rt1017_sdca_readable_register()
28 case 0x3206: in rt1017_sdca_readable_register()
29 case 0xc000: in rt1017_sdca_readable_register()
30 case 0xc001: in rt1017_sdca_readable_register()
31 case 0xc022: in rt1017_sdca_readable_register()
32 case 0xc030: in rt1017_sdca_readable_register()
33 case 0xc104: in rt1017_sdca_readable_register()
34 case 0xc10b: in rt1017_sdca_readable_register()
35 case 0xc10c: in rt1017_sdca_readable_register()
36 case 0xc110: in rt1017_sdca_readable_register()
37 case 0xc112: in rt1017_sdca_readable_register()
38 case 0xc300: in rt1017_sdca_readable_register()
39 case 0xc301: in rt1017_sdca_readable_register()
40 case 0xc318: in rt1017_sdca_readable_register()
41 case 0xc325 ... 0xc328: in rt1017_sdca_readable_register()
42 case 0xc331: in rt1017_sdca_readable_register()
43 case 0xc340: in rt1017_sdca_readable_register()
44 case 0xc350 ... 0xc351: in rt1017_sdca_readable_register()
45 case 0xc500: in rt1017_sdca_readable_register()
46 case 0xc502: in rt1017_sdca_readable_register()
47 case 0xc504: in rt1017_sdca_readable_register()
48 case 0xc507: in rt1017_sdca_readable_register()
49 case 0xc509: in rt1017_sdca_readable_register()
50 case 0xc510: in rt1017_sdca_readable_register()
51 case 0xc512: in rt1017_sdca_readable_register()
52 case 0xc518: in rt1017_sdca_readable_register()
53 case 0xc51b: in rt1017_sdca_readable_register()
54 case 0xc51d: in rt1017_sdca_readable_register()
55 case 0xc520: in rt1017_sdca_readable_register()
56 case 0xc540 ... 0xc542: in rt1017_sdca_readable_register()
57 case 0xc550 ... 0xc552: in rt1017_sdca_readable_register()
58 case 0xc600: in rt1017_sdca_readable_register()
59 case 0xc602: in rt1017_sdca_readable_register()
60 case 0xc612: in rt1017_sdca_readable_register()
61 case 0xc622: in rt1017_sdca_readable_register()
62 case 0xc632: in rt1017_sdca_readable_register()
63 case 0xc642: in rt1017_sdca_readable_register()
64 case 0xc651: in rt1017_sdca_readable_register()
65 case 0xca00: in rt1017_sdca_readable_register()
66 case 0xca09 ... 0xca0c: in rt1017_sdca_readable_register()
67 case 0xca0e ... 0xca0f: in rt1017_sdca_readable_register()
68 case 0xca10 ... 0xca11: in rt1017_sdca_readable_register()
69 case 0xca16 ... 0xca17: in rt1017_sdca_readable_register()
70 case 0xcb00: in rt1017_sdca_readable_register()
71 case 0xcc00: in rt1017_sdca_readable_register()
72 case 0xcc02: in rt1017_sdca_readable_register()
73 case 0xd017: in rt1017_sdca_readable_register()
74 case 0xd01a ... 0xd01c: in rt1017_sdca_readable_register()
75 case 0xd101: in rt1017_sdca_readable_register()
76 case 0xd20c: in rt1017_sdca_readable_register()
77 case 0xd300: in rt1017_sdca_readable_register()
78 case 0xd370: in rt1017_sdca_readable_register()
79 case 0xd500: in rt1017_sdca_readable_register()
80 case 0xd545 ... 0xd548: in rt1017_sdca_readable_register()
81 case 0xd5a5 ... 0xd5a8: in rt1017_sdca_readable_register()
82 case 0xd5aa ... 0xd5ad: in rt1017_sdca_readable_register()
83 case 0xda04 ... 0xda07: in rt1017_sdca_readable_register()
84 case 0xda09 ... 0xda0a: in rt1017_sdca_readable_register()
85 case 0xda0c ... 0xda0f: in rt1017_sdca_readable_register()
86 case 0xda11 ... 0xda14: in rt1017_sdca_readable_register()
87 case 0xda16 ... 0xda19: in rt1017_sdca_readable_register()
88 case 0xdab6 ... 0xdabb: in rt1017_sdca_readable_register()
89 case 0xdb09 ... 0xdb0a: in rt1017_sdca_readable_register()
90 case 0xdb14: in rt1017_sdca_readable_register()
93 RT1017_SDCA_CTL_UDMPU_CLUSTER, 0): in rt1017_sdca_readable_register()
95 RT1017_SDCA_CTL_FU_MUTE, 0x01): in rt1017_sdca_readable_register()
97 RT1017_SDCA_CTL_BYPASS, 0): in rt1017_sdca_readable_register()
99 RT1017_SDCA_CTL_PROT_STAT, 0): in rt1017_sdca_readable_register()
101 RT1017_SDCA_CTL_FS_INDEX, 0): in rt1017_sdca_readable_register()
103 RT1017_SDCA_CTL_REQ_POWER_STATE, 0): in rt1017_sdca_readable_register()
105 RT1017_SDCA_CTL_REQ_POWER_STATE, 0): in rt1017_sdca_readable_register()
115 case 0x2f55: in rt1017_sdca_volatile_register()
116 case 0xc000: in rt1017_sdca_volatile_register()
117 case 0xc022: in rt1017_sdca_volatile_register()
118 case 0xc351: in rt1017_sdca_volatile_register()
119 case 0xc518: in rt1017_sdca_volatile_register()
121 RT1017_SDCA_CTL_PROT_STAT, 0): in rt1017_sdca_volatile_register()
129 { 0xc001, 0x43 },
130 { 0x2f55, 0x02 },
131 { 0x3206, 0x80 },
132 { 0x005f, 0x7f },
133 { 0xd101, 0xa0 },
134 { 0xc112, 0xc0 },
135 { 0xc104, 0xaa },
136 { 0xc110, 0x59 },
137 { 0xc112, 0xc0 },
138 { 0xc340, 0x80 },
139 { 0xd017, 0x2c },
140 { 0xd01a, 0xc8 },
141 { 0xd01b, 0xcf },
142 { 0xd01c, 0x0c },
143 { 0xd20c, 0x14 },
144 { 0xdb09, 0x0f },
145 { 0xdb0a, 0x7f },
146 { 0xdb14, 0x03 },
147 { 0xcb00, 0x31 },
148 { 0xc318, 0x44 },
149 { 0xc325, 0xce },
150 { 0xc326, 0x13 },
151 { 0xc327, 0x5f },
152 { 0xc328, 0xf3 },
153 { 0xc350, 0xe1 },
154 { 0xc351, 0x88 },
155 { 0xc030, 0x14 },
156 { 0xc331, 0xf2 },
157 { 0xc551, 0x0f },
158 { 0xc552, 0xff },
159 { 0xc651, 0xc0 },
160 { 0xc550, 0xd0 },
161 { 0xc612, 0x00 },
162 { 0xc622, 0x00 },
163 { 0xc632, 0x00 },
164 { 0xc642, 0x00 },
165 { 0xc602, 0xf0 },
166 { 0xc600, 0xd0 },
167 { 0xcc02, 0x78 },
168 { 0xcc00, 0x90 },
169 { 0xc300, 0x3f },
170 { 0xc301, 0x1d },
171 { 0xc10b, 0x2e },
172 { 0xc10c, 0x36 },
174 { 0xd5a5, 0x00 },
175 { 0xd5a6, 0x6a },
176 { 0xd5a7, 0xaa },
177 { 0xd5a8, 0xaa },
178 { 0xd5aa, 0x00 },
179 { 0xd5ab, 0x16 },
180 { 0xd5ac, 0xdb },
181 { 0xd5ad, 0x6d },
182 { 0xd545, 0x09 },
183 { 0xd546, 0x30 },
184 { 0xd547, 0xf0 },
185 { 0xd548, 0xf0 },
186 { 0xd500, 0x20 },
187 { 0xc504, 0x3f },
188 { 0xc540, 0x00 },
189 { 0xc541, 0x0a },
190 { 0xc542, 0x1a },
191 { 0xc512, 0x00 },
192 { 0xc520, 0x40 },
193 { 0xc51b, 0x7f },
194 { 0xc51d, 0x0f },
195 { 0xc500, 0x40 },
196 { 0xc502, 0xde },
197 { 0xc507, 0x05 },
198 { 0xc509, 0x05 },
199 { 0xc510, 0x40 },
200 { 0xc518, 0xc0 },
201 { 0xc500, 0xc0 },
203 { 0xda0c, 0x00 },
204 { 0xda0d, 0x0b },
205 { 0xda0e, 0x55 },
206 { 0xda0f, 0x55 },
207 { 0xda04, 0x00 },
208 { 0xda05, 0x51 },
209 { 0xda06, 0xeb },
210 { 0xda07, 0x85 },
211 { 0xca16, 0x0f },
212 { 0xca17, 0x00 },
213 { 0xda09, 0x5d },
214 { 0xda0a, 0xc0 },
215 { 0xda11, 0x26 },
216 { 0xda12, 0x66 },
217 { 0xda13, 0x66 },
218 { 0xda14, 0x66 },
219 { 0xda16, 0x79 },
220 { 0xda17, 0x99 },
221 { 0xda18, 0x99 },
222 { 0xda19, 0x99 },
223 { 0xca09, 0x00 },
224 { 0xca0a, 0x07 },
225 { 0xca0b, 0x89 },
226 { 0xca0c, 0x61 },
227 { 0xca0e, 0x00 },
228 { 0xca0f, 0x03 },
229 { 0xca10, 0xc4 },
230 { 0xca11, 0xb0 },
231 { 0xdab6, 0x00 },
232 { 0xdab7, 0x01 },
233 { 0xdab8, 0x00 },
234 { 0xdab9, 0x00 },
235 { 0xdaba, 0x00 },
236 { 0xdabb, 0x00 },
237 { 0xd017, 0x0e },
238 { 0xca00, 0xcd },
239 { 0xc022, 0x84 },
242 #define RT1017_MAX_REG_NUM 0x4108ffff
259 struct sdw_slave_prop *prop = &slave->prop; in rt1017_sdca_read_prop()
266 prop->scp_int1_mask = SDW_SCP_INT1_BUS_CLASH | SDW_SCP_INT1_PARITY; in rt1017_sdca_read_prop()
267 prop->quirks = SDW_SLAVE_QUIRKS_INVALID_INITIAL_PARITY; in rt1017_sdca_read_prop()
269 prop->paging_support = true; in rt1017_sdca_read_prop()
275 prop->source_ports = BIT(2); /* BITMAP: 00000100 */ in rt1017_sdca_read_prop()
276 prop->sink_ports = BIT(1); /* BITMAP: 00000010 */ in rt1017_sdca_read_prop()
278 nval = hweight32(prop->source_ports); in rt1017_sdca_read_prop()
279 prop->src_dpn_prop = devm_kcalloc(&slave->dev, nval, in rt1017_sdca_read_prop()
280 sizeof(*prop->src_dpn_prop), GFP_KERNEL); in rt1017_sdca_read_prop()
281 if (!prop->src_dpn_prop) in rt1017_sdca_read_prop()
282 return -ENOMEM; in rt1017_sdca_read_prop()
284 i = 0; in rt1017_sdca_read_prop()
285 dpn = prop->src_dpn_prop; in rt1017_sdca_read_prop()
286 addr = prop->source_ports; in rt1017_sdca_read_prop()
296 nval = hweight32(prop->sink_ports); in rt1017_sdca_read_prop()
297 prop->sink_dpn_prop = devm_kcalloc(&slave->dev, nval, in rt1017_sdca_read_prop()
298 sizeof(*prop->sink_dpn_prop), GFP_KERNEL); in rt1017_sdca_read_prop()
299 if (!prop->sink_dpn_prop) in rt1017_sdca_read_prop()
300 return -ENOMEM; in rt1017_sdca_read_prop()
302 j = 0; in rt1017_sdca_read_prop()
303 dpn = prop->sink_dpn_prop; in rt1017_sdca_read_prop()
304 addr = prop->sink_ports; in rt1017_sdca_read_prop()
314 prop->clk_stop_timeout = 64; in rt1017_sdca_read_prop()
316 return 0; in rt1017_sdca_read_prop()
323 if (rt1017->hw_init) in rt1017_sdca_io_init()
324 return 0; in rt1017_sdca_io_init()
326 if (rt1017->first_hw_init) { in rt1017_sdca_io_init()
327 regcache_cache_only(rt1017->regmap, false); in rt1017_sdca_io_init()
328 regcache_cache_bypass(rt1017->regmap, true); in rt1017_sdca_io_init()
335 pm_runtime_set_autosuspend_delay(&slave->dev, 3000); in rt1017_sdca_io_init()
336 pm_runtime_use_autosuspend(&slave->dev); in rt1017_sdca_io_init()
339 pm_runtime_set_active(&slave->dev); in rt1017_sdca_io_init()
342 pm_runtime_mark_last_busy(&slave->dev); in rt1017_sdca_io_init()
344 pm_runtime_enable(&slave->dev); in rt1017_sdca_io_init()
347 pm_runtime_get_noresume(&slave->dev); in rt1017_sdca_io_init()
350 regmap_write(rt1017->regmap, 0xc000, 0x02); in rt1017_sdca_io_init()
352 /* initial settings - blind write */ in rt1017_sdca_io_init()
353 regmap_multi_reg_write(rt1017->regmap, rt1017_blind_write, in rt1017_sdca_io_init()
356 if (rt1017->first_hw_init) { in rt1017_sdca_io_init()
357 regcache_cache_bypass(rt1017->regmap, false); in rt1017_sdca_io_init()
358 regcache_mark_dirty(rt1017->regmap); in rt1017_sdca_io_init()
360 rt1017->first_hw_init = true; in rt1017_sdca_io_init()
363 rt1017->hw_init = true; in rt1017_sdca_io_init()
365 pm_runtime_put_autosuspend(&slave->dev); in rt1017_sdca_io_init()
367 dev_dbg(&slave->dev, "hw_init complete\n"); in rt1017_sdca_io_init()
368 return 0; in rt1017_sdca_io_init()
374 struct rt1017_sdca_priv *rt1017 = dev_get_drvdata(&slave->dev); in rt1017_sdca_update_status()
377 rt1017->hw_init = false; in rt1017_sdca_update_status()
383 if (rt1017->hw_init || status != SDW_SLAVE_ATTACHED) in rt1017_sdca_update_status()
384 return 0; in rt1017_sdca_update_status()
387 return rt1017_sdca_io_init(&slave->dev, slave); in rt1017_sdca_update_status()
406 RT1017_SDCA_CTL_UDMPU_CLUSTER, 0),
407 0, rt1017_rx_data_ch_select);
416 SDW_SDCA_CTL(FUNC_NUM_SMART_AMP, RT1017_SDCA_ENT_FU, RT1017_SDCA_CTL_FU_MUTE, 0x1),
417 0, 1, 1);
422 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in rt1017_sdca_pde23_event()
424 unsigned char ps0 = 0x0, ps3 = 0x3; in rt1017_sdca_pde23_event()
428 regmap_write(rt1017->regmap, in rt1017_sdca_pde23_event()
430 RT1017_SDCA_CTL_REQ_POWER_STATE, 0), in rt1017_sdca_pde23_event()
434 regmap_write(rt1017->regmap, in rt1017_sdca_pde23_event()
436 RT1017_SDCA_CTL_REQ_POWER_STATE, 0), in rt1017_sdca_pde23_event()
442 return 0; in rt1017_sdca_pde23_event()
448 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in rt1017_sdca_classd_event()
453 regmap_update_bits(rt1017->regmap, RT1017_PWM_TRIM_1, in rt1017_sdca_classd_event()
455 regmap_write(rt1017->regmap, RT1017_CLASSD_INT_1, 0x10); in rt1017_sdca_classd_event()
461 return 0; in rt1017_sdca_classd_event()
467 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in rt1017_sdca_feedback_event()
472 regmap_update_bits(rt1017->regmap, 0xd017, 0x1f, 0x08); in rt1017_sdca_feedback_event()
475 regmap_update_bits(rt1017->regmap, 0xd017, 0x1f, 0x09); in rt1017_sdca_feedback_event()
481 return 0; in rt1017_sdca_feedback_event()
486 SND_SOC_DAPM_AIF_IN("DP1RX", "DP1 Playback", 0, SND_SOC_NOPM, 0, 0),
487 SND_SOC_DAPM_AIF_OUT_E("DP2TX", "DP2 Capture", 0, SND_SOC_NOPM, 0, 0,
491 SND_SOC_DAPM_SWITCH("DAC", SND_SOC_NOPM, 0, 0, &rt1017_sto_dac),
494 SND_SOC_DAPM_PGA_E("CLASS D", SND_SOC_NOPM, 0, 0, NULL, 0,
498 SND_SOC_DAPM_SUPPLY("PDE23", SND_SOC_NOPM, 0, 0,
501 SND_SOC_DAPM_PGA("I Sense", SND_SOC_NOPM, 0, 0, NULL, 0),
502 SND_SOC_DAPM_PGA("V Sense", SND_SOC_NOPM, 0, 0, NULL, 0),
531 ret = pm_runtime_resume(component->dev); in rt1017_sdca_component_probe()
532 if (ret < 0 && ret != -EACCES) in rt1017_sdca_component_probe()
535 return 0; in rt1017_sdca_component_probe()
542 regcache_cache_only(rt1017->regmap, true); in rt1017_sdca_component_remove()
562 return 0; in rt1017_sdca_set_sdw_stream()
575 struct snd_soc_component *component = dai->component; in rt1017_sdca_pcm_hw_params()
584 dev_dbg(dai->dev, "%s %s", __func__, dai->name); in rt1017_sdca_pcm_hw_params()
588 return -EINVAL; in rt1017_sdca_pcm_hw_params()
590 if (!rt1017->sdw_slave) in rt1017_sdca_pcm_hw_params()
591 return -EINVAL; in rt1017_sdca_pcm_hw_params()
595 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { in rt1017_sdca_pcm_hw_params()
604 ch_mask = (1 << num_channels) - 1; in rt1017_sdca_pcm_hw_params()
608 stream_config.bps = snd_pcm_format_width(params_format(params)); in rt1017_sdca_pcm_hw_params()
614 dev_dbg(dai->dev, "frame_rate %d, ch_count %d, bps %d, direction %d, ch_mask %d, port: %d\n", in rt1017_sdca_pcm_hw_params()
618 retval = sdw_stream_add_slave(rt1017->sdw_slave, &stream_config, in rt1017_sdca_pcm_hw_params()
621 dev_err(dai->dev, "Unable to configure port\n"); in rt1017_sdca_pcm_hw_params()
640 dev_err(component->dev, "Rate %d is not supported\n", in rt1017_sdca_pcm_hw_params()
642 return -EINVAL; in rt1017_sdca_pcm_hw_params()
646 regmap_write(rt1017->regmap, in rt1017_sdca_pcm_hw_params()
648 RT1017_SDCA_CTL_FS_INDEX, 0), in rt1017_sdca_pcm_hw_params()
651 return 0; in rt1017_sdca_pcm_hw_params()
657 struct snd_soc_component *component = dai->component; in rt1017_sdca_pcm_hw_free()
662 if (!rt1017->sdw_slave) in rt1017_sdca_pcm_hw_free()
663 return -EINVAL; in rt1017_sdca_pcm_hw_free()
665 sdw_stream_remove_slave(rt1017->sdw_slave, sdw_stream); in rt1017_sdca_pcm_hw_free()
666 return 0; in rt1017_sdca_pcm_hw_free()
683 .name = "rt1017-aif",
710 return -ENOMEM; in rt1017_sdca_init()
713 rt1017->sdw_slave = slave; in rt1017_sdca_init()
714 rt1017->regmap = regmap; in rt1017_sdca_init()
720 rt1017->hw_init = false; in rt1017_sdca_init()
721 rt1017->first_hw_init = false; in rt1017_sdca_init()
741 return rt1017_sdca_init(&slave->dev, regmap, slave); in rt1017_sdca_sdw_probe()
746 struct rt1017_sdca_priv *rt1017 = dev_get_drvdata(&slave->dev); in rt1017_sdca_sdw_remove()
748 if (rt1017->first_hw_init) in rt1017_sdca_sdw_remove()
749 pm_runtime_disable(&slave->dev); in rt1017_sdca_sdw_remove()
751 return 0; in rt1017_sdca_sdw_remove()
755 SDW_SLAVE_ENTRY_EXT(0x025d, 0x1017, 0x3, 0x1, 0),
764 if (!rt1017->hw_init) in rt1017_sdca_dev_suspend()
765 return 0; in rt1017_sdca_dev_suspend()
767 regcache_cache_only(rt1017->regmap, true); in rt1017_sdca_dev_suspend()
769 return 0; in rt1017_sdca_dev_suspend()
780 if (!rt1017->first_hw_init) in rt1017_sdca_dev_resume()
781 return 0; in rt1017_sdca_dev_resume()
783 if (!slave->unattach_request) in rt1017_sdca_dev_resume()
786 time = wait_for_completion_timeout(&slave->initialization_complete, in rt1017_sdca_dev_resume()
789 dev_err(&slave->dev, "Initialization not complete, timed out\n"); in rt1017_sdca_dev_resume()
790 sdw_show_ping_status(slave->bus, true); in rt1017_sdca_dev_resume()
792 return -ETIMEDOUT; in rt1017_sdca_dev_resume()
796 slave->unattach_request = 0; in rt1017_sdca_dev_resume()
797 regcache_cache_only(rt1017->regmap, false); in rt1017_sdca_dev_resume()
798 regcache_sync(rt1017->regmap); in rt1017_sdca_dev_resume()
800 return 0; in rt1017_sdca_dev_resume()
810 .name = "rt1017-sdca",