blob: 364708c73418939cd12c61672a96d834b6d250d3 [file] [log] [blame]
Kuninori Morimoto33377442013-07-21 21:36:21 -07001/*
2 * Renesas R-Car Gen1 SRU/SSI 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 */
Kuninori Morimotoace0eb12014-10-21 18:13:46 -070011
12/*
13 * #define DEBUG
14 *
15 * you can also add below in
16 * ${LINUX}/drivers/base/regmap/regmap.c
17 * for regmap debug
18 *
19 * #define LOG_DEVICE "xxxx.rcar_sound"
20 */
21
Kuninori Morimoto33377442013-07-21 21:36:21 -070022#include "rsnd.h"
23
Kuninori Morimoto33377442013-07-21 21:36:21 -070024struct rsnd_gen {
Kuninori Morimoto33377442013-07-21 21:36:21 -070025 struct rsnd_gen_ops *ops;
Kuninori Morimoto55e5b6f2013-09-23 23:12:27 -070026
Kuninori Morimoto9993c162015-10-22 03:13:27 +000027 /* RSND_BASE_MAX base */
28 void __iomem *base[RSND_BASE_MAX];
29 phys_addr_t res[RSND_BASE_MAX];
Kuninori Morimotob8c63782014-07-29 00:37:31 -070030 struct regmap *regmap[RSND_BASE_MAX];
Kuninori Morimoto9993c162015-10-22 03:13:27 +000031
32 /* RSND_REG_MAX base */
Kuninori Morimoto55e5b6f2013-09-23 23:12:27 -070033 struct regmap_field *regs[RSND_REG_MAX];
Kuninori Morimoto0719ecf2015-11-26 08:43:59 +000034 const char *reg_name[RSND_REG_MAX];
Kuninori Morimoto33377442013-07-21 21:36:21 -070035};
36
37#define rsnd_priv_to_gen(p) ((struct rsnd_gen *)(p)->gen)
Kuninori Morimoto0719ecf2015-11-26 08:43:59 +000038#define rsnd_reg_name(gen, id) ((gen)->reg_name[id])
Kuninori Morimoto33377442013-07-21 21:36:21 -070039
Kuninori Morimotob8c63782014-07-29 00:37:31 -070040struct rsnd_regmap_field_conf {
41 int idx;
42 unsigned int reg_offset;
43 unsigned int id_offset;
Kuninori Morimoto0719ecf2015-11-26 08:43:59 +000044 const char *reg_name;
Kuninori Morimotob8c63782014-07-29 00:37:31 -070045};
46
Kuninori Morimoto0719ecf2015-11-26 08:43:59 +000047#define RSND_REG_SET(id, offset, _id_offset, n) \
Kuninori Morimotob8c63782014-07-29 00:37:31 -070048{ \
49 .idx = id, \
50 .reg_offset = offset, \
51 .id_offset = _id_offset, \
Kuninori Morimoto0719ecf2015-11-26 08:43:59 +000052 .reg_name = n, \
Kuninori Morimotob8c63782014-07-29 00:37:31 -070053}
54/* single address mapping */
55#define RSND_GEN_S_REG(id, offset) \
Kuninori Morimoto0719ecf2015-11-26 08:43:59 +000056 RSND_REG_SET(RSND_REG_##id, offset, 0, #id)
Kuninori Morimotob8c63782014-07-29 00:37:31 -070057
58/* multi address mapping */
59#define RSND_GEN_M_REG(id, offset, _id_offset) \
Kuninori Morimoto0719ecf2015-11-26 08:43:59 +000060 RSND_REG_SET(RSND_REG_##id, offset, _id_offset, #id)
Kuninori Morimoto55e5b6f2013-09-23 23:12:27 -070061
62/*
63 * basic function
64 */
Kuninori Morimoto42ee5d22013-11-28 18:43:13 -080065static int rsnd_is_accessible_reg(struct rsnd_priv *priv,
66 struct rsnd_gen *gen, enum rsnd_reg reg)
67{
68 if (!gen->regs[reg]) {
69 struct device *dev = rsnd_priv_to_dev(priv);
70
71 dev_err(dev, "unsupported register access %x\n", reg);
72 return 0;
73 }
74
75 return 1;
76}
77
Kuninori Morimoto55e5b6f2013-09-23 23:12:27 -070078u32 rsnd_read(struct rsnd_priv *priv,
79 struct rsnd_mod *mod, enum rsnd_reg reg)
80{
Kuninori Morimotob8c63782014-07-29 00:37:31 -070081 struct device *dev = rsnd_priv_to_dev(priv);
Kuninori Morimoto55e5b6f2013-09-23 23:12:27 -070082 struct rsnd_gen *gen = rsnd_priv_to_gen(priv);
83 u32 val;
84
Kuninori Morimoto42ee5d22013-11-28 18:43:13 -080085 if (!rsnd_is_accessible_reg(priv, gen, reg))
86 return 0;
87
Kuninori Morimotoc9b96382015-10-22 03:13:06 +000088 regmap_fields_read(gen->regs[reg], rsnd_mod_id(mod), &val);
89
Kuninori Morimoto0719ecf2015-11-26 08:43:59 +000090 dev_dbg(dev, "r %s[%d] - %-18s (%4d) : %08x\n",
91 rsnd_mod_name(mod), rsnd_mod_id(mod),
92 rsnd_reg_name(gen, reg), reg, val);
Kuninori Morimoto55e5b6f2013-09-23 23:12:27 -070093
94 return val;
95}
96
97void rsnd_write(struct rsnd_priv *priv,
98 struct rsnd_mod *mod,
99 enum rsnd_reg reg, u32 data)
100{
Kuninori Morimotob8c63782014-07-29 00:37:31 -0700101 struct device *dev = rsnd_priv_to_dev(priv);
Kuninori Morimoto55e5b6f2013-09-23 23:12:27 -0700102 struct rsnd_gen *gen = rsnd_priv_to_gen(priv);
103
Kuninori Morimoto42ee5d22013-11-28 18:43:13 -0800104 if (!rsnd_is_accessible_reg(priv, gen, reg))
105 return;
106
Kuninori Morimotoace0eb12014-10-21 18:13:46 -0700107 regmap_fields_write(gen->regs[reg], rsnd_mod_id(mod), data);
Kuninori Morimoto0719ecf2015-11-26 08:43:59 +0000108
109 dev_dbg(dev, "w %s[%d] - %-18s (%4d) : %08x\n",
110 rsnd_mod_name(mod), rsnd_mod_id(mod),
111 rsnd_reg_name(gen, reg), reg, data);
Kuninori Morimoto55e5b6f2013-09-23 23:12:27 -0700112}
113
Kuninori Morimoto7b47ab42015-06-16 08:53:11 +0000114void rsnd_force_write(struct rsnd_priv *priv,
115 struct rsnd_mod *mod,
116 enum rsnd_reg reg, u32 data)
117{
118 struct device *dev = rsnd_priv_to_dev(priv);
119 struct rsnd_gen *gen = rsnd_priv_to_gen(priv);
120
121 if (!rsnd_is_accessible_reg(priv, gen, reg))
122 return;
123
Kuninori Morimoto7b47ab42015-06-16 08:53:11 +0000124 regmap_fields_force_write(gen->regs[reg], rsnd_mod_id(mod), data);
Kuninori Morimoto0719ecf2015-11-26 08:43:59 +0000125
126 dev_dbg(dev, "w %s[%d] - %-18s (%4d) : %08x\n",
127 rsnd_mod_name(mod), rsnd_mod_id(mod),
128 rsnd_reg_name(gen, reg), reg, data);
Kuninori Morimoto7b47ab42015-06-16 08:53:11 +0000129}
130
Kuninori Morimoto55e5b6f2013-09-23 23:12:27 -0700131void rsnd_bset(struct rsnd_priv *priv, struct rsnd_mod *mod,
132 enum rsnd_reg reg, u32 mask, u32 data)
133{
Kuninori Morimoto4f8f86a2014-07-30 23:52:50 -0700134 struct device *dev = rsnd_priv_to_dev(priv);
Kuninori Morimoto55e5b6f2013-09-23 23:12:27 -0700135 struct rsnd_gen *gen = rsnd_priv_to_gen(priv);
136
Kuninori Morimoto42ee5d22013-11-28 18:43:13 -0800137 if (!rsnd_is_accessible_reg(priv, gen, reg))
138 return;
139
Kuninori Morimoto55e5b6f2013-09-23 23:12:27 -0700140 regmap_fields_update_bits(gen->regs[reg], rsnd_mod_id(mod),
141 mask, data);
Kuninori Morimoto0719ecf2015-11-26 08:43:59 +0000142
143 dev_dbg(dev, "b %s[%d] - %-18s (%4d) : %08x/%08x\n",
144 rsnd_mod_name(mod), rsnd_mod_id(mod),
145 rsnd_reg_name(gen, reg), reg, data, mask);
146
Kuninori Morimoto55e5b6f2013-09-23 23:12:27 -0700147}
148
Kuninori Morimotoc5212b42015-02-20 10:25:27 +0000149phys_addr_t rsnd_gen_get_phy_addr(struct rsnd_priv *priv, int reg_id)
150{
151 struct rsnd_gen *gen = rsnd_priv_to_gen(priv);
152
153 return gen->res[reg_id];
154}
155
Kuninori Morimoto72779112015-02-20 10:24:52 +0000156#define rsnd_gen_regmap_init(priv, id_size, reg_id, name, conf) \
157 _rsnd_gen_regmap_init(priv, id_size, reg_id, name, conf, ARRAY_SIZE(conf))
Kuninori Morimotob8c63782014-07-29 00:37:31 -0700158static int _rsnd_gen_regmap_init(struct rsnd_priv *priv,
159 int id_size,
160 int reg_id,
Kuninori Morimoto72779112015-02-20 10:24:52 +0000161 const char *name,
Kuninori Morimoto0719ecf2015-11-26 08:43:59 +0000162 const struct rsnd_regmap_field_conf *conf,
Kuninori Morimotob8c63782014-07-29 00:37:31 -0700163 int conf_size)
Kuninori Morimotoc1e6cc52013-11-28 18:43:01 -0800164{
Kuninori Morimotob8c63782014-07-29 00:37:31 -0700165 struct platform_device *pdev = rsnd_priv_to_pdev(priv);
166 struct rsnd_gen *gen = rsnd_priv_to_gen(priv);
Kuninori Morimotoc1e6cc52013-11-28 18:43:01 -0800167 struct device *dev = rsnd_priv_to_dev(priv);
Kuninori Morimotob8c63782014-07-29 00:37:31 -0700168 struct resource *res;
Kuninori Morimotoc1e6cc52013-11-28 18:43:01 -0800169 struct regmap_config regc;
Kuninori Morimotob8c63782014-07-29 00:37:31 -0700170 struct regmap_field *regs;
171 struct regmap *regmap;
172 struct reg_field regf;
173 void __iomem *base;
174 int i;
Kuninori Morimotoc1e6cc52013-11-28 18:43:01 -0800175
176 memset(&regc, 0, sizeof(regc));
177 regc.reg_bits = 32;
178 regc.val_bits = 32;
Kuninori Morimotob8c63782014-07-29 00:37:31 -0700179 regc.reg_stride = 4;
Kuninori Morimoto530b7b42015-03-10 01:25:36 +0000180 regc.name = name;
Kuninori Morimotoc1e6cc52013-11-28 18:43:01 -0800181
Kuninori Morimoto72779112015-02-20 10:24:52 +0000182 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, name);
183 if (!res)
184 res = platform_get_resource(pdev, IORESOURCE_MEM, reg_id);
Kuninori Morimotob8c63782014-07-29 00:37:31 -0700185 if (!res)
186 return -ENODEV;
Kuninori Morimotoc1e6cc52013-11-28 18:43:01 -0800187
Kuninori Morimotob8c63782014-07-29 00:37:31 -0700188 base = devm_ioremap_resource(dev, res);
189 if (IS_ERR(base))
190 return PTR_ERR(base);
Kuninori Morimoto42ee5d22013-11-28 18:43:13 -0800191
Kuninori Morimotob8c63782014-07-29 00:37:31 -0700192 regmap = devm_regmap_init_mmio(dev, base, &regc);
193 if (IS_ERR(regmap))
194 return PTR_ERR(regmap);
Kuninori Morimotoc1e6cc52013-11-28 18:43:01 -0800195
Kuninori Morimoto9993c162015-10-22 03:13:27 +0000196 /* RSND_BASE_MAX base */
Kuninori Morimotob8c63782014-07-29 00:37:31 -0700197 gen->base[reg_id] = base;
198 gen->regmap[reg_id] = regmap;
Kuninori Morimotoc5212b42015-02-20 10:25:27 +0000199 gen->res[reg_id] = res->start;
Kuninori Morimotob8c63782014-07-29 00:37:31 -0700200
201 for (i = 0; i < conf_size; i++) {
202
203 regf.reg = conf[i].reg_offset;
204 regf.id_offset = conf[i].id_offset;
205 regf.lsb = 0;
206 regf.msb = 31;
207 regf.id_size = id_size;
208
209 regs = devm_regmap_field_alloc(dev, regmap, regf);
210 if (IS_ERR(regs))
211 return PTR_ERR(regs);
212
Kuninori Morimoto9993c162015-10-22 03:13:27 +0000213 /* RSND_REG_MAX base */
Kuninori Morimotob8c63782014-07-29 00:37:31 -0700214 gen->regs[conf[i].idx] = regs;
Kuninori Morimoto0719ecf2015-11-26 08:43:59 +0000215 gen->reg_name[conf[i].idx] = conf[i].reg_name;
Kuninori Morimotoc1e6cc52013-11-28 18:43:01 -0800216 }
217
218 return 0;
219}
Kuninori Morimoto33377442013-07-21 21:36:21 -0700220
Kuninori Morimoto994a9df2013-11-28 18:43:23 -0800221/*
222 * Gen2
Kuninori Morimoto994a9df2013-11-28 18:43:23 -0800223 */
Kuninori Morimoto2ea6b072015-11-10 05:14:12 +0000224static int rsnd_gen2_probe(struct rsnd_priv *priv)
Kuninori Morimoto507d4662013-11-28 18:43:45 -0800225{
Kuninori Morimoto0719ecf2015-11-26 08:43:59 +0000226 const static struct rsnd_regmap_field_conf conf_ssiu[] = {
Kuninori Morimotob8c63782014-07-29 00:37:31 -0700227 RSND_GEN_S_REG(SSI_MODE0, 0x800),
228 RSND_GEN_S_REG(SSI_MODE1, 0x804),
229 /* FIXME: it needs SSI_MODE2/3 in the future */
230 RSND_GEN_M_REG(SSI_BUSIF_MODE, 0x0, 0x80),
231 RSND_GEN_M_REG(SSI_BUSIF_ADINR, 0x4, 0x80),
Kuninori Morimotocdde84d2015-07-15 07:09:27 +0000232 RSND_GEN_M_REG(SSI_BUSIF_DALIGN,0x8, 0x80),
Kuninori Morimotob8c63782014-07-29 00:37:31 -0700233 RSND_GEN_M_REG(SSI_CTRL, 0x10, 0x80),
Kuninori Morimotoefa991d2015-07-15 07:09:47 +0000234 RSND_GEN_M_REG(SSI_INT_ENABLE, 0x18, 0x80),
Kuninori Morimotob8c63782014-07-29 00:37:31 -0700235 };
Kuninori Morimotobf4e8d72015-11-30 08:50:08 +0000236
Kuninori Morimoto0719ecf2015-11-26 08:43:59 +0000237 const static struct rsnd_regmap_field_conf conf_scu[] = {
Kuninori Morimotobf4e8d72015-11-30 08:50:08 +0000238 RSND_GEN_M_REG(SRC_I_BUSIF_MODE,0x0, 0x20),
239 RSND_GEN_M_REG(SRC_O_BUSIF_MODE,0x4, 0x20),
Kuninori Morimoto46890322015-07-15 07:14:47 +0000240 RSND_GEN_M_REG(SRC_BUSIF_DALIGN,0x8, 0x20),
Kuninori Morimotob8c63782014-07-29 00:37:31 -0700241 RSND_GEN_M_REG(SRC_ROUTE_MODE0, 0xc, 0x20),
242 RSND_GEN_M_REG(SRC_CTRL, 0x10, 0x20),
Kuninori Morimotocfcefe02015-01-08 01:52:36 +0000243 RSND_GEN_M_REG(SRC_INT_ENABLE0, 0x18, 0x20),
Kuninori Morimotob8c63782014-07-29 00:37:31 -0700244 RSND_GEN_M_REG(CMD_ROUTE_SLCT, 0x18c, 0x20),
245 RSND_GEN_M_REG(CMD_CTRL, 0x190, 0x20),
Kuninori Morimotocfcefe02015-01-08 01:52:36 +0000246 RSND_GEN_S_REG(SCU_SYS_STATUS0, 0x1c8),
247 RSND_GEN_S_REG(SCU_SYS_INT_EN0, 0x1cc),
248 RSND_GEN_S_REG(SCU_SYS_STATUS1, 0x1d0),
249 RSND_GEN_S_REG(SCU_SYS_INT_EN1, 0x1c4),
Kuninori Morimotob8c63782014-07-29 00:37:31 -0700250 RSND_GEN_M_REG(SRC_SWRSR, 0x200, 0x40),
251 RSND_GEN_M_REG(SRC_SRCIR, 0x204, 0x40),
252 RSND_GEN_M_REG(SRC_ADINR, 0x214, 0x40),
253 RSND_GEN_M_REG(SRC_IFSCR, 0x21c, 0x40),
254 RSND_GEN_M_REG(SRC_IFSVR, 0x220, 0x40),
255 RSND_GEN_M_REG(SRC_SRCCR, 0x224, 0x40),
256 RSND_GEN_M_REG(SRC_BSDSR, 0x22c, 0x40),
257 RSND_GEN_M_REG(SRC_BSISR, 0x238, 0x40),
Kuninori Morimoto9269e3c2015-07-15 07:17:17 +0000258 RSND_GEN_M_REG(CTU_CTUIR, 0x504, 0x100),
259 RSND_GEN_M_REG(CTU_ADINR, 0x508, 0x100),
Kuninori Morimoto70fb1052015-07-15 07:17:36 +0000260 RSND_GEN_M_REG(MIX_SWRSR, 0xd00, 0x40),
261 RSND_GEN_M_REG(MIX_MIXIR, 0xd04, 0x40),
262 RSND_GEN_M_REG(MIX_ADINR, 0xd08, 0x40),
263 RSND_GEN_M_REG(MIX_MIXMR, 0xd10, 0x40),
264 RSND_GEN_M_REG(MIX_MVPDR, 0xd14, 0x40),
265 RSND_GEN_M_REG(MIX_MDBAR, 0xd18, 0x40),
266 RSND_GEN_M_REG(MIX_MDBBR, 0xd1c, 0x40),
267 RSND_GEN_M_REG(MIX_MDBCR, 0xd20, 0x40),
268 RSND_GEN_M_REG(MIX_MDBDR, 0xd24, 0x40),
269 RSND_GEN_M_REG(MIX_MDBER, 0xd28, 0x40),
Kuninori Morimotob8c63782014-07-29 00:37:31 -0700270 RSND_GEN_M_REG(DVC_SWRSR, 0xe00, 0x100),
271 RSND_GEN_M_REG(DVC_DVUIR, 0xe04, 0x100),
272 RSND_GEN_M_REG(DVC_ADINR, 0xe08, 0x100),
273 RSND_GEN_M_REG(DVC_DVUCR, 0xe10, 0x100),
274 RSND_GEN_M_REG(DVC_ZCMCR, 0xe14, 0x100),
Kuninori Morimoto3539cac2014-11-09 19:52:06 -0800275 RSND_GEN_M_REG(DVC_VRCTR, 0xe18, 0x100),
276 RSND_GEN_M_REG(DVC_VRPDR, 0xe1c, 0x100),
277 RSND_GEN_M_REG(DVC_VRDBR, 0xe20, 0x100),
Kuninori Morimotob8c63782014-07-29 00:37:31 -0700278 RSND_GEN_M_REG(DVC_VOL0R, 0xe28, 0x100),
279 RSND_GEN_M_REG(DVC_VOL1R, 0xe2c, 0x100),
280 RSND_GEN_M_REG(DVC_DVUER, 0xe48, 0x100),
281 };
Kuninori Morimoto0719ecf2015-11-26 08:43:59 +0000282 const static struct rsnd_regmap_field_conf conf_adg[] = {
Kuninori Morimotob8c63782014-07-29 00:37:31 -0700283 RSND_GEN_S_REG(BRRA, 0x00),
284 RSND_GEN_S_REG(BRRB, 0x04),
285 RSND_GEN_S_REG(SSICKR, 0x08),
286 RSND_GEN_S_REG(AUDIO_CLK_SEL0, 0x0c),
287 RSND_GEN_S_REG(AUDIO_CLK_SEL1, 0x10),
288 RSND_GEN_S_REG(AUDIO_CLK_SEL2, 0x14),
289 RSND_GEN_S_REG(DIV_EN, 0x30),
290 RSND_GEN_S_REG(SRCIN_TIMSEL0, 0x34),
291 RSND_GEN_S_REG(SRCIN_TIMSEL1, 0x38),
292 RSND_GEN_S_REG(SRCIN_TIMSEL2, 0x3c),
293 RSND_GEN_S_REG(SRCIN_TIMSEL3, 0x40),
294 RSND_GEN_S_REG(SRCIN_TIMSEL4, 0x44),
295 RSND_GEN_S_REG(SRCOUT_TIMSEL0, 0x48),
296 RSND_GEN_S_REG(SRCOUT_TIMSEL1, 0x4c),
297 RSND_GEN_S_REG(SRCOUT_TIMSEL2, 0x50),
298 RSND_GEN_S_REG(SRCOUT_TIMSEL3, 0x54),
299 RSND_GEN_S_REG(SRCOUT_TIMSEL4, 0x58),
300 RSND_GEN_S_REG(CMDOUT_TIMSEL, 0x5c),
301 };
Kuninori Morimoto0719ecf2015-11-26 08:43:59 +0000302 const static struct rsnd_regmap_field_conf conf_ssi[] = {
Kuninori Morimotob8c63782014-07-29 00:37:31 -0700303 RSND_GEN_M_REG(SSICR, 0x00, 0x40),
304 RSND_GEN_M_REG(SSISR, 0x04, 0x40),
305 RSND_GEN_M_REG(SSITDR, 0x08, 0x40),
306 RSND_GEN_M_REG(SSIRDR, 0x0c, 0x40),
307 RSND_GEN_M_REG(SSIWSR, 0x20, 0x40),
308 };
309 int ret_ssiu;
310 int ret_scu;
311 int ret_adg;
312 int ret_ssi;
Kuninori Morimoto507d4662013-11-28 18:43:45 -0800313
Kuninori Morimoto72779112015-02-20 10:24:52 +0000314 ret_ssiu = rsnd_gen_regmap_init(priv, 10, RSND_GEN2_SSIU, "ssiu", conf_ssiu);
315 ret_scu = rsnd_gen_regmap_init(priv, 10, RSND_GEN2_SCU, "scu", conf_scu);
316 ret_adg = rsnd_gen_regmap_init(priv, 10, RSND_GEN2_ADG, "adg", conf_adg);
317 ret_ssi = rsnd_gen_regmap_init(priv, 10, RSND_GEN2_SSI, "ssi", conf_ssi);
Kuninori Morimotob8c63782014-07-29 00:37:31 -0700318 if (ret_ssiu < 0 ||
319 ret_scu < 0 ||
320 ret_adg < 0 ||
321 ret_ssi < 0)
322 return ret_ssiu | ret_scu | ret_adg | ret_ssi;
Kuninori Morimoto507d4662013-11-28 18:43:45 -0800323
Kuninori Morimoto507d4662013-11-28 18:43:45 -0800324 return 0;
325}
326
Kuninori Morimoto994a9df2013-11-28 18:43:23 -0800327/*
328 * Gen1
329 */
330
Kuninori Morimoto2ea6b072015-11-10 05:14:12 +0000331static int rsnd_gen1_probe(struct rsnd_priv *priv)
Kuninori Morimoto33377442013-07-21 21:36:21 -0700332{
Kuninori Morimoto0719ecf2015-11-26 08:43:59 +0000333 const static struct rsnd_regmap_field_conf conf_adg[] = {
Kuninori Morimotob8c63782014-07-29 00:37:31 -0700334 RSND_GEN_S_REG(BRRA, 0x00),
335 RSND_GEN_S_REG(BRRB, 0x04),
336 RSND_GEN_S_REG(SSICKR, 0x08),
337 RSND_GEN_S_REG(AUDIO_CLK_SEL0, 0x0c),
338 RSND_GEN_S_REG(AUDIO_CLK_SEL1, 0x10),
Kuninori Morimotob8c63782014-07-29 00:37:31 -0700339 };
Kuninori Morimoto0719ecf2015-11-26 08:43:59 +0000340 const static struct rsnd_regmap_field_conf conf_ssi[] = {
Kuninori Morimotob8c63782014-07-29 00:37:31 -0700341 RSND_GEN_M_REG(SSICR, 0x00, 0x40),
342 RSND_GEN_M_REG(SSISR, 0x04, 0x40),
343 RSND_GEN_M_REG(SSITDR, 0x08, 0x40),
344 RSND_GEN_M_REG(SSIRDR, 0x0c, 0x40),
345 RSND_GEN_M_REG(SSIWSR, 0x20, 0x40),
346 };
Kuninori Morimotob8c63782014-07-29 00:37:31 -0700347 int ret_adg;
348 int ret_ssi;
Kuninori Morimoto07539c12013-07-21 21:36:35 -0700349
Kuninori Morimoto72779112015-02-20 10:24:52 +0000350 ret_adg = rsnd_gen_regmap_init(priv, 9, RSND_GEN1_ADG, "adg", conf_adg);
351 ret_ssi = rsnd_gen_regmap_init(priv, 9, RSND_GEN1_SSI, "ssi", conf_ssi);
Kuninori Morimotoe8e7b7b2015-11-10 05:09:52 +0000352 if (ret_adg < 0 ||
Kuninori Morimotob8c63782014-07-29 00:37:31 -0700353 ret_ssi < 0)
Kuninori Morimotoe8e7b7b2015-11-10 05:09:52 +0000354 return ret_adg | ret_ssi;
Kuninori Morimoto07539c12013-07-21 21:36:35 -0700355
Kuninori Morimoto33377442013-07-21 21:36:21 -0700356 return 0;
Kuninori Morimoto33377442013-07-21 21:36:21 -0700357}
358
Kuninori Morimoto33377442013-07-21 21:36:21 -0700359/*
360 * Gen
361 */
Kuninori Morimoto2ea6b072015-11-10 05:14:12 +0000362int rsnd_gen_probe(struct rsnd_priv *priv)
Kuninori Morimoto33377442013-07-21 21:36:21 -0700363{
364 struct device *dev = rsnd_priv_to_dev(priv);
365 struct rsnd_gen *gen;
Kuninori Morimoto531eaf42013-11-28 18:43:34 -0800366 int ret;
Kuninori Morimoto33377442013-07-21 21:36:21 -0700367
368 gen = devm_kzalloc(dev, sizeof(*gen), GFP_KERNEL);
369 if (!gen) {
370 dev_err(dev, "GEN allocate failed\n");
371 return -ENOMEM;
372 }
373
Kuninori Morimoto531eaf42013-11-28 18:43:34 -0800374 priv->gen = gen;
Kuninori Morimoto072188b2013-09-01 20:31:16 -0700375
Kuninori Morimoto507d4662013-11-28 18:43:45 -0800376 ret = -ENODEV;
377 if (rsnd_is_gen1(priv))
Kuninori Morimoto2ea6b072015-11-10 05:14:12 +0000378 ret = rsnd_gen1_probe(priv);
Kuninori Morimoto507d4662013-11-28 18:43:45 -0800379 else if (rsnd_is_gen2(priv))
Kuninori Morimoto2ea6b072015-11-10 05:14:12 +0000380 ret = rsnd_gen2_probe(priv);
Kuninori Morimoto507d4662013-11-28 18:43:45 -0800381
382 if (ret < 0)
Kuninori Morimoto072188b2013-09-01 20:31:16 -0700383 dev_err(dev, "unknown generation R-Car sound device\n");
Kuninori Morimoto072188b2013-09-01 20:31:16 -0700384
Kuninori Morimoto531eaf42013-11-28 18:43:34 -0800385 return ret;
Kuninori Morimoto33377442013-07-21 21:36:21 -0700386}