Commit | Line | Data |
---|---|---|
07539c1d KM |
1 | /* |
2 | * Renesas R-Car SCU support | |
3 | * | |
4 | * Copyright (C) 2013 Renesas Solutions Corp. | |
5 | * Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> | |
6 | * | |
7 | * This program is free software; you can redistribute it and/or modify | |
8 | * it under the terms of the GNU General Public License version 2 as | |
9 | * published by the Free Software Foundation. | |
10 | */ | |
11 | #include "rsnd.h" | |
12 | ||
13 | struct rsnd_scu { | |
14 | struct rsnd_scu_platform_info *info; /* rcar_snd.h */ | |
15 | struct rsnd_mod mod; | |
16 | }; | |
17 | ||
18 | #define rsnd_mod_to_scu(_mod) \ | |
19 | container_of((_mod), struct rsnd_scu, mod) | |
20 | ||
21 | #define for_each_rsnd_scu(pos, priv, i) \ | |
22 | for ((i) = 0; \ | |
23 | ((i) < rsnd_scu_nr(priv)) && \ | |
24 | ((pos) = (struct rsnd_scu *)(priv)->scu + i); \ | |
25 | i++) | |
26 | ||
27 | static int rsnd_scu_init(struct rsnd_mod *mod, | |
28 | struct rsnd_dai *rdai, | |
29 | struct rsnd_dai_stream *io) | |
30 | { | |
31 | struct rsnd_priv *priv = rsnd_mod_to_priv(mod); | |
32 | struct device *dev = rsnd_priv_to_dev(priv); | |
33 | ||
34 | dev_dbg(dev, "%s.%d init\n", rsnd_mod_name(mod), rsnd_mod_id(mod)); | |
35 | ||
36 | return 0; | |
37 | } | |
38 | ||
39 | static int rsnd_scu_quit(struct rsnd_mod *mod, | |
40 | struct rsnd_dai *rdai, | |
41 | struct rsnd_dai_stream *io) | |
42 | { | |
43 | struct rsnd_priv *priv = rsnd_mod_to_priv(mod); | |
44 | struct device *dev = rsnd_priv_to_dev(priv); | |
45 | ||
46 | dev_dbg(dev, "%s.%d quit\n", rsnd_mod_name(mod), rsnd_mod_id(mod)); | |
47 | ||
48 | return 0; | |
49 | } | |
50 | ||
51 | static int rsnd_scu_start(struct rsnd_mod *mod, | |
52 | struct rsnd_dai *rdai, | |
53 | struct rsnd_dai_stream *io) | |
54 | { | |
55 | struct rsnd_priv *priv = rsnd_mod_to_priv(mod); | |
56 | struct device *dev = rsnd_priv_to_dev(priv); | |
57 | ||
58 | dev_dbg(dev, "%s.%d start\n", rsnd_mod_name(mod), rsnd_mod_id(mod)); | |
59 | ||
60 | return 0; | |
61 | } | |
62 | ||
63 | static int rsnd_scu_stop(struct rsnd_mod *mod, | |
64 | struct rsnd_dai *rdai, | |
65 | struct rsnd_dai_stream *io) | |
66 | { | |
67 | struct rsnd_priv *priv = rsnd_mod_to_priv(mod); | |
68 | struct device *dev = rsnd_priv_to_dev(priv); | |
69 | ||
70 | dev_dbg(dev, "%s.%d stop\n", rsnd_mod_name(mod), rsnd_mod_id(mod)); | |
71 | ||
72 | return 0; | |
73 | } | |
74 | ||
75 | static struct rsnd_mod_ops rsnd_scu_ops = { | |
76 | .name = "scu", | |
77 | .init = rsnd_scu_init, | |
78 | .quit = rsnd_scu_quit, | |
79 | .start = rsnd_scu_start, | |
80 | .stop = rsnd_scu_stop, | |
81 | }; | |
82 | ||
83 | struct rsnd_mod *rsnd_scu_mod_get(struct rsnd_priv *priv, int id) | |
84 | { | |
85 | BUG_ON(id < 0 || id >= rsnd_scu_nr(priv)); | |
86 | ||
87 | return &((struct rsnd_scu *)(priv->scu) + id)->mod; | |
88 | } | |
89 | ||
90 | int rsnd_scu_probe(struct platform_device *pdev, | |
91 | struct rcar_snd_info *info, | |
92 | struct rsnd_priv *priv) | |
93 | { | |
94 | struct device *dev = rsnd_priv_to_dev(priv); | |
95 | struct rsnd_scu *scu; | |
96 | int i, nr; | |
97 | ||
98 | /* | |
99 | * init SCU | |
100 | */ | |
101 | nr = info->scu_info_nr; | |
102 | scu = devm_kzalloc(dev, sizeof(*scu) * nr, GFP_KERNEL); | |
103 | if (!scu) { | |
104 | dev_err(dev, "SCU allocate failed\n"); | |
105 | return -ENOMEM; | |
106 | } | |
107 | ||
108 | priv->scu_nr = nr; | |
109 | priv->scu = scu; | |
110 | ||
111 | for_each_rsnd_scu(scu, priv, i) { | |
112 | rsnd_mod_init(priv, &scu->mod, | |
113 | &rsnd_scu_ops, i); | |
114 | scu->info = &info->scu_info[i]; | |
115 | } | |
116 | ||
117 | dev_dbg(dev, "scu probed\n"); | |
118 | ||
119 | return 0; | |
120 | } | |
121 | ||
122 | void rsnd_scu_remove(struct platform_device *pdev, | |
123 | struct rsnd_priv *priv) | |
124 | { | |
125 | } |