adg.c (68a550248e295ba548e30c876ccdec351e286eee) adg.c (e8e7b7bdc65c19f8d84c25f7e0d21176d598c870)
1/*
2 * Helper routines for R-Car sound ADG.
3 *
4 * Copyright (C) 2013 Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
5 *
6 * This file is subject to the terms and conditions of the GNU General Public
7 * License. See the file "COPYING" in the main directory of this archive
8 * for more details.

--- 228 unchanged lines hidden (view full) ---

237{
238 u32 val = rsnd_adg_ssi_ws_timing_gen2(io);
239
240 rsnd_mod_confirm_src(src_mod);
241
242 return rsnd_adg_set_src_timsel_gen2(src_mod, io, val);
243}
244
1/*
2 * Helper routines for R-Car sound ADG.
3 *
4 * Copyright (C) 2013 Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
5 *
6 * This file is subject to the terms and conditions of the GNU General Public
7 * License. See the file "COPYING" in the main directory of this archive
8 * for more details.

--- 228 unchanged lines hidden (view full) ---

237{
238 u32 val = rsnd_adg_ssi_ws_timing_gen2(io);
239
240 rsnd_mod_confirm_src(src_mod);
241
242 return rsnd_adg_set_src_timsel_gen2(src_mod, io, val);
243}
244
245int rsnd_adg_set_convert_clk_gen1(struct rsnd_priv *priv,
246 struct rsnd_mod *mod,
247 unsigned int src_rate,
248 unsigned int dst_rate)
249{
250 struct rsnd_adg *adg = rsnd_priv_to_adg(priv);
251 struct rsnd_mod *adg_mod = rsnd_mod_get(adg);
252 struct device *dev = rsnd_priv_to_dev(priv);
253 int idx, sel, div, shift;
254 u32 mask, val;
255 int id = rsnd_mod_id(mod);
256 unsigned int sel_rate [] = {
257 clk_get_rate(adg->clk[CLKA]), /* 000: CLKA */
258 clk_get_rate(adg->clk[CLKB]), /* 001: CLKB */
259 clk_get_rate(adg->clk[CLKC]), /* 010: CLKC */
260 0, /* 011: MLBCLK (not used) */
261 adg->rbga_rate_for_441khz, /* 100: RBGA */
262 adg->rbgb_rate_for_48khz, /* 101: RBGB */
263 };
264
265 /* find div (= 1/128, 1/256, 1/512, 1/1024, 1/2048 */
266 for (sel = 0; sel < ARRAY_SIZE(sel_rate); sel++) {
267 for (div = 128, idx = 0;
268 div <= 2048;
269 div *= 2, idx++) {
270 if (src_rate == sel_rate[sel] / div) {
271 val = (idx << 4) | sel;
272 goto find_rate;
273 }
274 }
275 }
276 dev_err(dev, "can't find convert src clk\n");
277 return -EINVAL;
278
279find_rate:
280 shift = (id % 4) * 8;
281 mask = 0xFF << shift;
282 val = val << shift;
283
284 dev_dbg(dev, "adg convert src clk = %02x\n", val);
285
286 switch (id / 4) {
287 case 0:
288 rsnd_mod_bset(adg_mod, AUDIO_CLK_SEL3, mask, val);
289 break;
290 case 1:
291 rsnd_mod_bset(adg_mod, AUDIO_CLK_SEL4, mask, val);
292 break;
293 case 2:
294 rsnd_mod_bset(adg_mod, AUDIO_CLK_SEL5, mask, val);
295 break;
296 }
297
298 /*
299 * Gen1 doesn't need dst_rate settings,
300 * since it uses SSI WS pin.
301 * see also rsnd_src_set_route_if_gen1()
302 */
303
304 return 0;
305}
306
307static void rsnd_adg_set_ssi_clk(struct rsnd_mod *ssi_mod, u32 val)
308{
309 struct rsnd_priv *priv = rsnd_mod_to_priv(ssi_mod);
310 struct rsnd_adg *adg = rsnd_priv_to_adg(priv);
311 struct rsnd_mod *adg_mod = rsnd_mod_get(adg);
312 int id = rsnd_mod_id(ssi_mod);
313 int shift = (id % 4) * 8;
314 u32 mask = 0xFF << shift;

--- 305 unchanged lines hidden ---
245static void rsnd_adg_set_ssi_clk(struct rsnd_mod *ssi_mod, u32 val)
246{
247 struct rsnd_priv *priv = rsnd_mod_to_priv(ssi_mod);
248 struct rsnd_adg *adg = rsnd_priv_to_adg(priv);
249 struct rsnd_mod *adg_mod = rsnd_mod_get(adg);
250 int id = rsnd_mod_id(ssi_mod);
251 int shift = (id % 4) * 8;
252 u32 mask = 0xFF << shift;

--- 305 unchanged lines hidden ---