1*7b96c6c8SSimon Glass // SPDX-License-Identifier: GPL-2.0
2*7b96c6c8SSimon Glass /*
3*7b96c6c8SSimon Glass * Sound for broadwell
4*7b96c6c8SSimon Glass *
5*7b96c6c8SSimon Glass * Copyright 2019 Google LLC
6*7b96c6c8SSimon Glass * Written by Simon Glass <sjg@chromium.org>
7*7b96c6c8SSimon Glass */
8*7b96c6c8SSimon Glass
9*7b96c6c8SSimon Glass #define LOG_CATEGORY UCLASS_SOUND
10*7b96c6c8SSimon Glass
11*7b96c6c8SSimon Glass #include <common.h>
12*7b96c6c8SSimon Glass #include <audio_codec.h>
13*7b96c6c8SSimon Glass #include <dm.h>
14*7b96c6c8SSimon Glass #include <i2s.h>
15*7b96c6c8SSimon Glass #include <sound.h>
16*7b96c6c8SSimon Glass
broadwell_sound_probe(struct udevice * dev)17*7b96c6c8SSimon Glass static int broadwell_sound_probe(struct udevice *dev)
18*7b96c6c8SSimon Glass {
19*7b96c6c8SSimon Glass return sound_find_codec_i2s(dev);
20*7b96c6c8SSimon Glass }
21*7b96c6c8SSimon Glass
broadwell_sound_setup(struct udevice * dev)22*7b96c6c8SSimon Glass static int broadwell_sound_setup(struct udevice *dev)
23*7b96c6c8SSimon Glass {
24*7b96c6c8SSimon Glass struct sound_uc_priv *uc_priv = dev_get_uclass_priv(dev);
25*7b96c6c8SSimon Glass struct i2s_uc_priv *i2c_priv = dev_get_uclass_priv(uc_priv->i2s);
26*7b96c6c8SSimon Glass int ret;
27*7b96c6c8SSimon Glass
28*7b96c6c8SSimon Glass if (uc_priv->setup_done)
29*7b96c6c8SSimon Glass return -EALREADY;
30*7b96c6c8SSimon Glass ret = audio_codec_set_params(uc_priv->codec, i2c_priv->id,
31*7b96c6c8SSimon Glass i2c_priv->samplingrate,
32*7b96c6c8SSimon Glass i2c_priv->samplingrate * i2c_priv->rfs,
33*7b96c6c8SSimon Glass i2c_priv->bitspersample,
34*7b96c6c8SSimon Glass i2c_priv->channels);
35*7b96c6c8SSimon Glass if (ret)
36*7b96c6c8SSimon Glass return ret;
37*7b96c6c8SSimon Glass uc_priv->setup_done = true;
38*7b96c6c8SSimon Glass
39*7b96c6c8SSimon Glass return 0;
40*7b96c6c8SSimon Glass }
41*7b96c6c8SSimon Glass
broadwell_sound_play(struct udevice * dev,void * data,uint data_size)42*7b96c6c8SSimon Glass static int broadwell_sound_play(struct udevice *dev, void *data, uint data_size)
43*7b96c6c8SSimon Glass {
44*7b96c6c8SSimon Glass struct sound_uc_priv *uc_priv = dev_get_uclass_priv(dev);
45*7b96c6c8SSimon Glass
46*7b96c6c8SSimon Glass return i2s_tx_data(uc_priv->i2s, data, data_size);
47*7b96c6c8SSimon Glass }
48*7b96c6c8SSimon Glass
49*7b96c6c8SSimon Glass static const struct sound_ops broadwell_sound_ops = {
50*7b96c6c8SSimon Glass .setup = broadwell_sound_setup,
51*7b96c6c8SSimon Glass .play = broadwell_sound_play,
52*7b96c6c8SSimon Glass };
53*7b96c6c8SSimon Glass
54*7b96c6c8SSimon Glass static const struct udevice_id broadwell_sound_ids[] = {
55*7b96c6c8SSimon Glass { .compatible = "google,samus-sound" },
56*7b96c6c8SSimon Glass { }
57*7b96c6c8SSimon Glass };
58*7b96c6c8SSimon Glass
59*7b96c6c8SSimon Glass U_BOOT_DRIVER(broadwell_sound_drv) = {
60*7b96c6c8SSimon Glass .name = "broadwell_sound",
61*7b96c6c8SSimon Glass .id = UCLASS_SOUND,
62*7b96c6c8SSimon Glass .of_match = broadwell_sound_ids,
63*7b96c6c8SSimon Glass .probe = broadwell_sound_probe,
64*7b96c6c8SSimon Glass .ops = &broadwell_sound_ops,
65*7b96c6c8SSimon Glass };
66