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 --- |