Home
last modified time | relevance | path

Searched refs:dai_link (Results 1 - 25 of 388) sorted by relevance

12345678910>>...16

/kernel/linux/linux-5.10/sound/soc/
H A Dsoc-link.c27 func, rtd->dai_link->name, ret); in _soc_link_ret()
45 if (rtd->dai_link->init) in snd_soc_link_init()
46 ret = rtd->dai_link->init(rtd); in snd_soc_link_init()
53 if (rtd->dai_link->exit) in snd_soc_link_exit()
54 rtd->dai_link->exit(rtd); in snd_soc_link_exit()
62 if (rtd->dai_link->be_hw_params_fixup) in snd_soc_link_be_hw_params_fixup()
63 ret = rtd->dai_link->be_hw_params_fixup(rtd, params); in snd_soc_link_be_hw_params_fixup()
73 if (rtd->dai_link->ops && in snd_soc_link_startup()
74 rtd->dai_link->ops->startup) in snd_soc_link_startup()
75 ret = rtd->dai_link in snd_soc_link_startup()
[all...]
/kernel/linux/linux-6.6/sound/soc/
H A Dsoc-link.c27 func, rtd->dai_link->name, ret); in _soc_link_ret()
45 if (rtd->dai_link->init) in snd_soc_link_init()
46 ret = rtd->dai_link->init(rtd); in snd_soc_link_init()
53 if (rtd->dai_link->exit) in snd_soc_link_exit()
54 rtd->dai_link->exit(rtd); in snd_soc_link_exit()
62 if (rtd->dai_link->be_hw_params_fixup) in snd_soc_link_be_hw_params_fixup()
63 ret = rtd->dai_link->be_hw_params_fixup(rtd, params); in snd_soc_link_be_hw_params_fixup()
73 if (rtd->dai_link->ops && in snd_soc_link_startup()
74 rtd->dai_link->ops->startup) in snd_soc_link_startup()
75 ret = rtd->dai_link in snd_soc_link_startup()
[all...]
H A Dsoc-pcm.c46 func, rtd->dai_link->name, ret); in _soc_pcm_ret()
74 return (rtd)->dai_link->num_cpus == 1 ? asoc_rtd_to_cpu(rtd, 0)->name : "multicpu"; in soc_cpu_dai_name()
78 return (rtd)->dai_link->num_codecs == 1 ? asoc_rtd_to_codec(rtd, 0)->name : "multicodec"; in soc_codec_dai_name()
119 "[%s - %s]\n", fe->dai_link->name, in dpcm_show_state()
148 "- %s\n", be->dai_link->name); in dpcm_show_state()
175 if (fe->dai_link->num_cpus > 1) { in dpcm_state_read_file()
207 if (!rtd->dai_link->dynamic) in soc_dpcm_debugfs_add()
213 rtd->debugfs_dpcm_root = debugfs_create_dir(rtd->dai_link->name, in soc_dpcm_debugfs_add()
224 name = kasprintf(GFP_KERNEL, "%s:%s", dpcm->be->dai_link->name, in dpcm_create_debugfs_state()
320 if (!rtd->pmdown_time || rtd->dai_link in snd_soc_runtime_ignore_pmdown_time()
2777 struct snd_soc_dai_link *dai_link = rtd->dai_link; soc_get_playback_capture() local
[all...]
/kernel/linux/linux-6.6/sound/soc/mediatek/common/
H A Dmtk-soundcard-driver.c17 struct snd_soc_dai_link *dai_link) in set_card_codec_info()
25 dev_dbg(dev, "%s no specified codec\n", dai_link->name); in set_card_codec_info()
30 ret = snd_soc_of_get_dai_link_codecs(dev, codec_node, dai_link); in set_card_codec_info()
36 dai_link->name); in set_card_codec_info()
43 struct snd_soc_dai_link *dai_link) in set_dailink_daifmt()
58 dai_link->dai_fmt &= SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK; in set_dailink_daifmt()
59 dai_link->dai_fmt |= daifmt; in set_dailink_daifmt()
72 dai_link->dai_fmt &= ~SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK; in set_dailink_daifmt()
73 dai_link->dai_fmt |= of_clk_table[i].val; in set_dailink_daifmt()
86 struct snd_soc_dai_link *dai_link; in parse_dai_link_info() local
15 set_card_codec_info(struct snd_soc_card *card, struct device_node *sub_node, struct snd_soc_dai_link *dai_link) set_card_codec_info() argument
41 set_dailink_daifmt(struct snd_soc_card *card, struct device_node *sub_node, struct snd_soc_dai_link *dai_link) set_dailink_daifmt() argument
127 struct snd_soc_dai_link *dai_link; clean_card_reference() local
[all...]
H A Dmtk-dsp-sof-common.c27 if (conn->normal_link && strcmp(rtd->dai_link->name, conn->normal_link)) in mtk_sof_dai_link_fixup()
31 if (strcmp(runtime->dai_link->name, conn->sof_link)) in mtk_sof_dai_link_fixup()
36 sof_dai_link = runtime->dai_link; in mtk_sof_dai_link_fixup()
56 struct snd_soc_dai_link *dai_link; in mtk_sof_card_probe() local
59 for_each_card_prelinks(card, i, dai_link) { in mtk_sof_card_probe()
60 if (dai_link->no_pcm && !dai_link->stream_name && dai_link->name) in mtk_sof_card_probe()
61 dai_link->stream_name = dai_link in mtk_sof_card_probe()
[all...]
/kernel/linux/linux-6.6/sound/soc/mediatek/mt8183/
H A Dmt8183-mt6358-ts3a227-max98357.c621 .dai_link = mt8183_mt6358_ts3a227_dai_links,
632 .dai_link = mt8183_mt6358_ts3a227_dai_links,
654 .dai_link = mt8183_mt6358_ts3a227_dai_links,
667 .dai_link = mt8183_mt6358_ts3a227_dai_links,
709 struct snd_soc_dai_link *dai_link; in mt8183_mt6358_ts3a227_max98357_dev_probe() local
731 for_each_card_prelinks(card, i, dai_link) { in mt8183_mt6358_ts3a227_max98357_dev_probe()
732 if (ec_codec && strcmp(dai_link->name, "Wake on Voice") == 0) { in mt8183_mt6358_ts3a227_max98357_dev_probe()
733 dai_link->cpus[0].name = NULL; in mt8183_mt6358_ts3a227_max98357_dev_probe()
734 dai_link->cpus[0].of_node = ec_codec; in mt8183_mt6358_ts3a227_max98357_dev_probe()
735 dai_link in mt8183_mt6358_ts3a227_max98357_dev_probe()
[all...]
H A Dmt8183-da7219-max98357.c659 .dai_link = mt8183_da7219_dai_links,
716 .dai_link = mt8183_da7219_dai_links,
733 .dai_link = mt8183_da7219_dai_links,
745 struct snd_soc_dai_link *dai_link; in mt8183_da7219_max98357_dev_probe() local
768 for_each_card_prelinks(card, i, dai_link) { in mt8183_da7219_max98357_dev_probe()
769 if (strcmp(dai_link->name, "I2S3") == 0) { in mt8183_da7219_max98357_dev_probe()
771 dai_link->be_hw_params_fixup = in mt8183_da7219_max98357_dev_probe()
773 dai_link->ops = &mt8183_da7219_i2s_ops; in mt8183_da7219_max98357_dev_probe()
774 dai_link->cpus = i2s3_max98357a_cpus; in mt8183_da7219_max98357_dev_probe()
775 dai_link in mt8183_da7219_max98357_dev_probe()
[all...]
/kernel/linux/linux-5.10/sound/soc/meson/
H A Dgx-card.c49 struct snd_soc_dai_link *link = &card->dai_link[*index]; in gx_card_parse_i2s()
82 struct snd_soc_dai_link *dai_link = &card->dai_link[*index]; in gx_card_add_link() local
90 dai_link->cpus = cpu; in gx_card_add_link()
91 dai_link->num_cpus = 1; in gx_card_add_link()
93 ret = meson_card_parse_dai(card, np, &dai_link->cpus->of_node, in gx_card_add_link()
94 &dai_link->cpus->dai_name); in gx_card_add_link()
98 if (gx_card_cpu_identify(dai_link->cpus, "FIFO")) in gx_card_add_link()
99 return meson_card_set_fe_link(card, dai_link, np, true); in gx_card_add_link()
101 ret = meson_card_set_be_link(card, dai_link, n in gx_card_add_link()
[all...]
H A Daxg-card.c107 struct snd_soc_dai_link *pad = &card->dai_link[*index]; in axg_card_add_tdm_loopback()
117 lb = &card->dai_link[*index + 1]; in axg_card_add_tdm_loopback()
252 struct snd_soc_dai_link *link = &card->dai_link[*index]; in axg_card_parse_tdm()
313 struct snd_soc_dai_link *dai_link = &card->dai_link[*index]; in axg_card_add_link() local
321 dai_link->cpus = cpu; in axg_card_add_link()
322 dai_link->num_cpus = 1; in axg_card_add_link()
324 ret = meson_card_parse_dai(card, np, &dai_link->cpus->of_node, in axg_card_add_link()
325 &dai_link->cpus->dai_name); in axg_card_add_link()
329 if (axg_card_cpu_is_playback_fe(dai_link in axg_card_add_link()
[all...]
/kernel/linux/linux-6.6/sound/soc/meson/
H A Dgx-card.c49 struct snd_soc_dai_link *link = &card->dai_link[*index]; in gx_card_parse_i2s()
82 struct snd_soc_dai_link *dai_link = &card->dai_link[*index]; in gx_card_add_link() local
90 dai_link->cpus = cpu; in gx_card_add_link()
91 dai_link->num_cpus = 1; in gx_card_add_link()
93 ret = meson_card_parse_dai(card, np, dai_link->cpus); in gx_card_add_link()
97 if (gx_card_cpu_identify(dai_link->cpus, "FIFO")) in gx_card_add_link()
98 return meson_card_set_fe_link(card, dai_link, np, true); in gx_card_add_link()
100 ret = meson_card_set_be_link(card, dai_link, np); in gx_card_add_link()
105 if (gx_card_cpu_identify(dai_link in gx_card_add_link()
[all...]
H A Daxg-card.c107 struct snd_soc_dai_link *pad = &card->dai_link[*index]; in axg_card_add_tdm_loopback()
117 lb = &card->dai_link[*index + 1]; in axg_card_add_tdm_loopback()
250 struct snd_soc_dai_link *link = &card->dai_link[*index]; in axg_card_parse_tdm()
311 struct snd_soc_dai_link *dai_link = &card->dai_link[*index]; in axg_card_add_link() local
319 dai_link->cpus = cpu; in axg_card_add_link()
320 dai_link->num_cpus = 1; in axg_card_add_link()
322 ret = meson_card_parse_dai(card, np, dai_link->cpus); in axg_card_add_link()
326 if (axg_card_cpu_is_playback_fe(dai_link->cpus->of_node)) in axg_card_add_link()
327 return meson_card_set_fe_link(card, dai_link, n in axg_card_add_link()
[all...]
/kernel/linux/linux-5.10/sound/soc/samsung/
H A Darndale.c124 .dai_link = arndale_rt5631_dai,
131 .dai_link = arndale_wm1811_dai,
137 struct snd_soc_dai_link *dai_link; in arndale_put_of_nodes() local
140 for_each_card_prelinks(card, i, dai_link) { in arndale_put_of_nodes()
141 of_node_put(dai_link->cpus->of_node); in arndale_put_of_nodes()
142 of_node_put(dai_link->codecs->of_node); in arndale_put_of_nodes()
150 struct snd_soc_dai_link *dai_link; in arndale_audio_probe() local
155 dai_link = card->dai_link; in arndale_audio_probe()
157 dai_link in arndale_audio_probe()
[all...]
/kernel/linux/linux-6.6/sound/soc/samsung/
H A Darndale.c124 .dai_link = arndale_rt5631_dai,
131 .dai_link = arndale_wm1811_dai,
137 struct snd_soc_dai_link *dai_link; in arndale_put_of_nodes() local
140 for_each_card_prelinks(card, i, dai_link) { in arndale_put_of_nodes()
141 of_node_put(dai_link->cpus->of_node); in arndale_put_of_nodes()
142 of_node_put(dai_link->codecs->of_node); in arndale_put_of_nodes()
150 struct snd_soc_dai_link *dai_link; in arndale_audio_probe() local
155 dai_link = card->dai_link; in arndale_audio_probe()
157 dai_link in arndale_audio_probe()
[all...]
/kernel/linux/linux-5.10/sound/soc/generic/
H A Dsimple-card.c122 struct snd_soc_dai_link *dai_link = simple_priv_to_link(priv, li->link); in simple_dai_link_of_dpcm() local
125 struct snd_soc_dai_link_component *cpus = dai_link->cpus; in simple_dai_link_of_dpcm()
126 struct snd_soc_dai_link_component *codecs = dai_link->codecs; in simple_dai_link_of_dpcm()
158 dai_link->dynamic = 1; in simple_dai_link_of_dpcm()
159 dai_link->dpcm_merged_format = 1; in simple_dai_link_of_dpcm()
164 ret = asoc_simple_parse_cpu(np, dai_link, &is_single_links); in simple_dai_link_of_dpcm()
168 ret = asoc_simple_parse_clk_cpu(dev, np, dai_link, dai); in simple_dai_link_of_dpcm()
172 ret = asoc_simple_set_dailink_name(dev, dai_link, in simple_dai_link_of_dpcm()
178 asoc_simple_canonicalize_cpu(dai_link, is_single_links); in simple_dai_link_of_dpcm()
188 dai_link in simple_dai_link_of_dpcm()
251 struct snd_soc_dai_link *dai_link = simple_priv_to_link(priv, li->link); simple_dai_link_of() local
632 struct snd_soc_dai_link *dai_link = priv->dai_link; asoc_simple_probe() local
[all...]
H A Dsimple-card-utils.c98 struct snd_soc_dai_link *dai_link, in asoc_simple_set_dailink_name()
112 dai_link->name = name; in asoc_simple_set_dailink_name()
113 dai_link->stream_name = name; in asoc_simple_set_dailink_name()
139 if (!card->name && card->dai_link) in asoc_simple_parse_card_name()
140 card->name = card->dai_link->name; in asoc_simple_parse_card_name()
337 struct snd_soc_dai_link *dai_link = rtd->dai_link; in asoc_simple_init_dai_link_params() local
357 dev_err(rtd->dev, "simple-card: no valid dai_link params\n"); in asoc_simple_init_dai_link_params()
372 dai_link->params = params; in asoc_simple_init_dai_link_params()
373 dai_link in asoc_simple_init_dai_link_params()
97 asoc_simple_set_dailink_name(struct device *dev, struct snd_soc_dai_link *dai_link, const char *fmt, ...) asoc_simple_set_dailink_name() argument
402 asoc_simple_canonicalize_platform(struct snd_soc_dai_link *dai_link) asoc_simple_canonicalize_platform() argument
417 asoc_simple_canonicalize_cpu(struct snd_soc_dai_link *dai_link, int is_single_links) asoc_simple_canonicalize_cpu() argument
436 struct snd_soc_dai_link *dai_link; asoc_simple_clean_reference() local
602 struct snd_soc_dai_link *dai_link; asoc_simple_init_priv() local
[all...]
H A Daudio-graph-card.c210 struct snd_soc_dai_link *dai_link = simple_priv_to_link(priv, li->link); in graph_dai_link_of_dpcm() local
218 struct snd_soc_dai_link_component *cpus = dai_link->cpus; in graph_dai_link_of_dpcm()
219 struct snd_soc_dai_link_component *codecs = dai_link->codecs; in graph_dai_link_of_dpcm()
243 dai_link->dynamic = 1; in graph_dai_link_of_dpcm()
244 dai_link->dpcm_merged_format = 1; in graph_dai_link_of_dpcm()
249 ret = asoc_simple_parse_cpu(ep, dai_link, &is_single_links); in graph_dai_link_of_dpcm()
253 ret = asoc_simple_parse_clk_cpu(dev, ep, dai_link, dai); in graph_dai_link_of_dpcm()
257 ret = asoc_simple_set_dailink_name(dev, dai_link, in graph_dai_link_of_dpcm()
264 asoc_simple_canonicalize_cpu(dai_link, is_single_links); in graph_dai_link_of_dpcm()
274 dai_link in graph_dai_link_of_dpcm()
340 struct snd_soc_dai_link *dai_link = simple_priv_to_link(priv, li->link); graph_dai_link_of() local
[all...]
/kernel/linux/linux-5.10/sound/soc/mediatek/mt8183/
H A Dmt8183-mt6358-ts3a227-max98357.c527 .dai_link = mt8183_mt6358_ts3a227_dai_links,
534 .dai_link = mt8183_mt6358_ts3a227_dai_links,
552 .dai_link = mt8183_mt6358_ts3a227_dai_links,
591 struct snd_soc_dai_link *dai_link; in mt8183_mt6358_ts3a227_max98357_dev_probe() local
614 for_each_card_prelinks(card, i, dai_link) { in mt8183_mt6358_ts3a227_max98357_dev_probe()
615 if (ec_codec && strcmp(dai_link->name, "Wake on Voice") == 0) { in mt8183_mt6358_ts3a227_max98357_dev_probe()
616 dai_link->cpus[0].name = NULL; in mt8183_mt6358_ts3a227_max98357_dev_probe()
617 dai_link->cpus[0].of_node = ec_codec; in mt8183_mt6358_ts3a227_max98357_dev_probe()
618 dai_link->cpus[0].dai_name = NULL; in mt8183_mt6358_ts3a227_max98357_dev_probe()
619 dai_link in mt8183_mt6358_ts3a227_max98357_dev_probe()
[all...]
H A Dmt8183-da7219-max98357.c611 .dai_link = mt8183_da7219_dai_links,
662 .dai_link = mt8183_da7219_dai_links,
679 .dai_link = mt8183_da7219_dai_links,
691 struct snd_soc_dai_link *dai_link; in mt8183_da7219_max98357_dev_probe() local
714 for_each_card_prelinks(card, i, dai_link) { in mt8183_da7219_max98357_dev_probe()
715 if (strcmp(dai_link->name, "I2S3") == 0) { in mt8183_da7219_max98357_dev_probe()
717 dai_link->be_hw_params_fixup = in mt8183_da7219_max98357_dev_probe()
719 dai_link->ops = &mt8183_da7219_i2s_ops; in mt8183_da7219_max98357_dev_probe()
720 dai_link->cpus = i2s3_max98357a_cpus; in mt8183_da7219_max98357_dev_probe()
721 dai_link in mt8183_da7219_max98357_dev_probe()
[all...]
/kernel/linux/linux-5.10/include/sound/
H A Dsimple_card_utils.h55 struct snd_soc_dai_link *dai_link; member
63 #define simple_priv_to_link(priv, i) (simple_priv_to_card(priv)->dai_link + (i))
79 struct snd_soc_dai_link *dai_link,
84 #define asoc_simple_parse_clk_cpu(dev, node, dai_link, simple_dai) \
85 asoc_simple_parse_clk(dev, node, simple_dai, dai_link->cpus)
86 #define asoc_simple_parse_clk_codec(dev, node, dai_link, simple_dai) \
87 asoc_simple_parse_clk(dev, node, simple_dai, dai_link->codecs)
100 #define asoc_simple_parse_cpu(node, dai_link, is_single_link) \
101 asoc_simple_parse_dai(node, dai_link->cpus, is_single_link)
102 #define asoc_simple_parse_codec(node, dai_link) \
[all...]
/kernel/linux/linux-6.6/sound/soc/generic/
H A Dsimple-card.c159 struct snd_soc_dai_link *dai_link = simple_priv_to_link(priv, li->link); in simple_parse_node() local
166 dlc = asoc_link_to_cpu(dai_link, 0); in simple_parse_node()
169 dlc = asoc_link_to_codec(dai_link, 0); in simple_parse_node()
197 struct snd_soc_dai_link *dai_link = simple_priv_to_link(priv, li->link); in simple_link_init() local
201 prefix, &dai_link->dai_fmt); in simple_link_init()
205 dai_link->init = asoc_simple_dai_init; in simple_link_init()
206 dai_link->ops = &simple_ops; in simple_link_init()
208 return asoc_simple_set_dailink_name(dev, dai_link, name); in simple_link_init()
218 struct snd_soc_dai_link *dai_link = simple_priv_to_link(priv, li->link); in simple_dai_link_of_dpcm() local
233 struct snd_soc_dai_link_component *cpus = asoc_link_to_cpu(dai_link, in simple_dai_link_of_dpcm()
298 struct snd_soc_dai_link *dai_link = simple_priv_to_link(priv, li->link); simple_dai_link_of() local
759 struct snd_soc_dai_link *dai_link = priv->dai_link; asoc_simple_probe() local
[all...]
H A Daudio-graph-card.c113 struct snd_soc_dai_link *dai_link = simple_priv_to_link(priv, li->link); in graph_parse_node() local
120 dlc = asoc_link_to_cpu(dai_link, 0); in graph_parse_node()
123 dlc = asoc_link_to_codec(dai_link, 0); in graph_parse_node()
151 struct snd_soc_dai_link *dai_link = simple_priv_to_link(priv, li->link); in graph_link_init() local
155 NULL, &dai_link->dai_fmt); in graph_link_init()
159 dai_link->init = asoc_simple_dai_init; in graph_link_init()
160 dai_link->ops = &graph_ops; in graph_link_init()
162 dai_link->ops = priv->ops; in graph_link_init()
164 return asoc_simple_set_dailink_name(dev, dai_link, name); in graph_link_init()
173 struct snd_soc_dai_link *dai_link in graph_dai_link_of_dpcm() local
267 struct snd_soc_dai_link *dai_link = simple_priv_to_link(priv, li->link); graph_dai_link_of() local
[all...]
/kernel/linux/linux-5.10/sound/soc/rockchip/
H A Drockchip_max98090.c183 if (!strcmp(rtd->dai_link->name, "HDMI")) in rk_aif1_hw_params()
243 /* max98090 dai_link */
257 /* HDMI codec dai_link */
270 /* max98090 and HDMI codec dai_link */
303 .dai_link = rk_max98090_dailinks,
318 .dai_link = rk_hdmi_dailinks,
331 .dai_link = rk_max98090_hdmi_dailinks,
401 card->dai_link[DAILINK_MAX98090].codecs->of_node = np_audio; in snd_rk_mc_probe()
402 card->dai_link[DAILINK_HDMI].codecs->of_node = np_hdmi; in snd_rk_mc_probe()
403 card->dai_link[DAILINK_MAX9809 in snd_rk_mc_probe()
[all...]
/kernel/linux/linux-6.6/sound/soc/rockchip/
H A Drockchip_max98090.c183 if (!strcmp(rtd->dai_link->name, "HDMI")) in rk_aif1_hw_params()
243 /* max98090 dai_link */
257 /* HDMI codec dai_link */
270 /* max98090 and HDMI codec dai_link */
303 .dai_link = rk_max98090_dailinks,
318 .dai_link = rk_hdmi_dailinks,
331 .dai_link = rk_max98090_hdmi_dailinks,
401 card->dai_link[DAILINK_MAX98090].codecs->of_node = np_audio; in snd_rk_mc_probe()
402 card->dai_link[DAILINK_HDMI].codecs->of_node = np_hdmi; in snd_rk_mc_probe()
403 card->dai_link[DAILINK_MAX9809 in snd_rk_mc_probe()
[all...]
/kernel/linux/linux-5.10/sound/soc/qcom/
H A Dstorm.c70 struct snd_soc_dai_link *dai_link = card->dai_link; in storm_parse_of() local
73 dai_link->cpus->of_node = of_parse_phandle(np, "cpu", 0); in storm_parse_of()
74 if (!dai_link->cpus->of_node) { in storm_parse_of()
78 dai_link->platforms->of_node = dai_link->cpus->of_node; in storm_parse_of()
80 dai_link->codecs->of_node = of_parse_phandle(np, "codec", 0); in storm_parse_of()
81 if (!dai_link->codecs->of_node) { in storm_parse_of()
107 card->dai_link = &storm_dai_link; in storm_platform_probe()
/kernel/linux/linux-6.6/sound/soc/qcom/
H A Dstorm.c70 struct snd_soc_dai_link *dai_link = card->dai_link; in storm_parse_of() local
73 dai_link->cpus->of_node = of_parse_phandle(np, "cpu", 0); in storm_parse_of()
74 if (!dai_link->cpus->of_node) { in storm_parse_of()
78 dai_link->platforms->of_node = dai_link->cpus->of_node; in storm_parse_of()
80 dai_link->codecs->of_node = of_parse_phandle(np, "codec", 0); in storm_parse_of()
81 if (!dai_link->codecs->of_node) { in storm_parse_of()
107 card->dai_link = &storm_dai_link; in storm_platform_probe()

Completed in 21 milliseconds

12345678910>>...16