Lines Matching full:aif
206 static void rk628_hdmirx_audio_fifo_init(struct rk628_audioinfo *aif) in rk628_hdmirx_audio_fifo_init() argument
209 dev_dbg(aif->dev, "%s initial fifo\n", __func__); in rk628_hdmirx_audio_fifo_init()
210 rk628_i2c_write(aif->rk628, HDMI_RX_AUD_FIFO_ICLR, 0x1f); in rk628_hdmirx_audio_fifo_init()
211 rk628_i2c_write(aif->rk628, HDMI_RX_AUD_FIFO_CTRL, 0x10001); in rk628_hdmirx_audio_fifo_init()
212 rk628_i2c_write(aif->rk628, HDMI_RX_AUD_FIFO_CTRL, 0x10000); in rk628_hdmirx_audio_fifo_init()
213 aif->audio_state.pre_state = aif->audio_state.init_state = INIT_FIFO_STATE*4; in rk628_hdmirx_audio_fifo_init()
216 static void rk628_hdmirx_audio_fifo_initd(struct rk628_audioinfo *aif) in rk628_hdmirx_audio_fifo_initd() argument
219 dev_dbg(aif->dev, "%s double initial fifo\n", __func__); in rk628_hdmirx_audio_fifo_initd()
220 rk628_i2c_write(aif->rk628, HDMI_RX_AUD_FIFO_ICLR, 0x1f); in rk628_hdmirx_audio_fifo_initd()
221 rk628_i2c_update_bits(aif->rk628, HDMI_RX_AUD_FIFO_TH, in rk628_hdmirx_audio_fifo_initd()
224 rk628_i2c_write(aif->rk628, HDMI_RX_AUD_FIFO_CTRL, 0x10001); in rk628_hdmirx_audio_fifo_initd()
225 rk628_i2c_write(aif->rk628, HDMI_RX_AUD_FIFO_CTRL, 0x10000); in rk628_hdmirx_audio_fifo_initd()
226 rk628_i2c_write(aif->rk628, HDMI_RX_AUD_FIFO_CTRL, 0x10001); in rk628_hdmirx_audio_fifo_initd()
227 rk628_i2c_write(aif->rk628, HDMI_RX_AUD_FIFO_CTRL, 0x10000); in rk628_hdmirx_audio_fifo_initd()
228 rk628_i2c_update_bits(aif->rk628, HDMI_RX_AUD_FIFO_TH, in rk628_hdmirx_audio_fifo_initd()
231 aif->audio_state.pre_state = aif->audio_state.init_state = INIT_FIFO_STATE*4; in rk628_hdmirx_audio_fifo_initd()
234 static u32 _rk628_hdmirx_audio_fs(struct rk628_audioinfo *aif) in _rk628_hdmirx_audio_fs() argument
240 rk628_i2c_read(aif->rk628, HDMI_RX_HDMI_CKM_RESULT, &clkrate); in _rk628_hdmirx_audio_fs()
244 rk628_i2c_read(aif->rk628, HDMI_RX_PDEC_ACR_CTS, &cts_decoded); in _rk628_hdmirx_audio_fs()
245 rk628_i2c_read(aif->rk628, HDMI_RX_PDEC_ACR_N, &n_decoded); in _rk628_hdmirx_audio_fs()
252 dev_dbg(aif->dev, in _rk628_hdmirx_audio_fs()
260 static void rk628_hdmirx_audio_clk_set_rate(struct rk628_audioinfo *aif, u32 rate) in rk628_hdmirx_audio_clk_set_rate() argument
263 dev_dbg(aif->dev, "%s: %u to %u\n", in rk628_hdmirx_audio_clk_set_rate()
264 __func__, aif->audio_state.hdmirx_aud_clkrate, rate); in rk628_hdmirx_audio_clk_set_rate()
265 rk628_clk_set_rate(aif->rk628, CGU_CLK_HDMIRX_AUD, rate); in rk628_hdmirx_audio_clk_set_rate()
266 aif->audio_state.hdmirx_aud_clkrate = rate; in rk628_hdmirx_audio_clk_set_rate()
269 static void rk628_hdmirx_audio_clk_inc_rate(struct rk628_audioinfo *aif, int dis) in rk628_hdmirx_audio_clk_inc_rate() argument
271 u32 hdmirx_aud_clkrate = aif->audio_state.hdmirx_aud_clkrate + dis; in rk628_hdmirx_audio_clk_inc_rate()
273 dev_dbg(aif->dev, "%s: %u to %u\n", in rk628_hdmirx_audio_clk_inc_rate()
274 __func__, aif->audio_state.hdmirx_aud_clkrate, hdmirx_aud_clkrate); in rk628_hdmirx_audio_clk_inc_rate()
275 rk628_clk_set_rate(aif->rk628, CGU_CLK_HDMIRX_AUD, hdmirx_aud_clkrate); in rk628_hdmirx_audio_clk_inc_rate()
276 aif->audio_state.hdmirx_aud_clkrate = hdmirx_aud_clkrate; in rk628_hdmirx_audio_clk_inc_rate()
279 static void rk628_hdmirx_audio_set_fs(struct rk628_audioinfo *aif, u32 fs_audio) in rk628_hdmirx_audio_set_fs() argument
283 dev_dbg(aif->dev, "%s: %u to %u with fs %u\n", __func__, in rk628_hdmirx_audio_set_fs()
284 aif->audio_state.hdmirx_aud_clkrate, hdmirx_aud_clkrate_t, in rk628_hdmirx_audio_set_fs()
286 rk628_clk_set_rate(aif->rk628, CGU_CLK_HDMIRX_AUD, hdmirx_aud_clkrate_t); in rk628_hdmirx_audio_set_fs()
287 aif->audio_state.hdmirx_aud_clkrate = hdmirx_aud_clkrate_t; in rk628_hdmirx_audio_set_fs()
288 aif->audio_state.fs_audio = fs_audio; in rk628_hdmirx_audio_set_fs()
291 static void rk628_hdmirx_audio_enable(struct rk628_audioinfo *aif) in rk628_hdmirx_audio_enable() argument
295 rk628_i2c_read(aif->rk628, HDMI_RX_AUD_FIFO_ISTS, &fifo_ints); in rk628_hdmirx_audio_enable()
296 dev_dbg(aif->dev, "%s fifo ints %#x\n", __func__, fifo_ints); in rk628_hdmirx_audio_enable()
298 rk628_hdmirx_audio_fifo_initd(aif); in rk628_hdmirx_audio_enable()
300 rk628_hdmirx_audio_fifo_init(aif); in rk628_hdmirx_audio_enable()
301 rk628_i2c_update_bits(aif->rk628, HDMI_RX_DMI_DISABLE_IF, in rk628_hdmirx_audio_enable()
303 aif->audio_state.audio_enable = true; in rk628_hdmirx_audio_enable()
304 aif->fifo_ints_en = true; in rk628_hdmirx_audio_enable()
305 rk628_i2c_write(aif->rk628, HDMI_RX_AUD_FIFO_IEN_SET, in rk628_hdmirx_audio_enable()
312 struct rk628_audioinfo *aif = container_of(dwork, struct rk628_audioinfo, in rk628_csi_delayed_work_audio() local
314 struct rk628_audiostate *audio_state = &aif->audio_state; in rk628_csi_delayed_work_audio()
320 fs_audio = _rk628_hdmirx_audio_fs(aif); in rk628_csi_delayed_work_audio()
322 dev_dbg(aif->dev, "%s: no supported fs(%u)\n", __func__, fs_audio); in rk628_csi_delayed_work_audio()
326 rk628_hdmirx_audio_set_fs(aif, fs_audio); in rk628_csi_delayed_work_audio()
327 rk628_hdmirx_audio_enable(aif); in rk628_csi_delayed_work_audio()
331 rk628_hdmirx_audio_set_fs(aif, fs_audio); in rk628_csi_delayed_work_audio()
332 rk628_i2c_read(aif->rk628, HDMI_RX_AUD_FIFO_FILLSTS1, &cur_state); in rk628_csi_delayed_work_audio()
333 dev_dbg(aif->dev, "%s: HDMI_RX_AUD_FIFO_FILLSTS1:%#x, single offset:%d, total offset:%d\n", in rk628_csi_delayed_work_audio()
336 aif->audio_present = true; in rk628_csi_delayed_work_audio()
338 aif->audio_present = false; in rk628_csi_delayed_work_audio()
341 rk628_hdmirx_audio_clk_inc_rate(aif, 10); in rk628_csi_delayed_work_audio()
343 rk628_hdmirx_audio_clk_inc_rate(aif, -10); in rk628_csi_delayed_work_audio()
346 schedule_delayed_work(&aif->delayed_work_audio, msecs_to_jiffies(1000)); in rk628_csi_delayed_work_audio()
355 struct rk628_audioinfo *aif = container_of(dwork, struct rk628_audioinfo, in rk628_csi_delayed_work_audio_rate_change() local
358 mutex_lock(aif->confctl_mutex); in rk628_csi_delayed_work_audio_rate_change()
359 fs_audio = _rk628_hdmirx_audio_fs(aif); in rk628_csi_delayed_work_audio_rate_change()
360 dev_dbg(aif->dev, "%s get audio fs %u\n", __func__, fs_audio); in rk628_csi_delayed_work_audio_rate_change()
361 if (aif->audio_state.ctsn_flag == (ACR_N_CHG_ICLR | ACR_CTS_CHG_ICLR)) { in rk628_csi_delayed_work_audio_rate_change()
362 aif->audio_state.ctsn_flag = 0; in rk628_csi_delayed_work_audio_rate_change()
364 rk628_hdmirx_audio_set_fs(aif, fs_audio); in rk628_csi_delayed_work_audio_rate_change()
366 rk628_hdmirx_audio_enable(aif); in rk628_csi_delayed_work_audio_rate_change()
368 dev_dbg(aif->dev, "%s invalid fs when ctsn updating\n", __func__); in rk628_csi_delayed_work_audio_rate_change()
370 schedule_delayed_work(&aif->delayed_work_audio, msecs_to_jiffies(1000)); in rk628_csi_delayed_work_audio_rate_change()
372 if (aif->audio_state.fifo_int) { in rk628_csi_delayed_work_audio_rate_change()
373 aif->audio_state.fifo_int = false; in rk628_csi_delayed_work_audio_rate_change()
375 rk628_hdmirx_audio_set_fs(aif, fs_audio); in rk628_csi_delayed_work_audio_rate_change()
376 rk628_i2c_read(aif->rk628, HDMI_RX_AUD_FIFO_FILLSTS1, &fifo_fillsts); in rk628_csi_delayed_work_audio_rate_change()
378 dev_dbg(aif->dev, "%s underflow after overflow\n", __func__); in rk628_csi_delayed_work_audio_rate_change()
379 rk628_hdmirx_audio_fifo_initd(aif); in rk628_csi_delayed_work_audio_rate_change()
381 dev_dbg(aif->dev, "%s overflow after underflow\n", __func__); in rk628_csi_delayed_work_audio_rate_change()
382 rk628_hdmirx_audio_fifo_initd(aif); in rk628_csi_delayed_work_audio_rate_change()
385 mutex_unlock(aif->confctl_mutex); in rk628_csi_delayed_work_audio_rate_change()
393 struct rk628_audioinfo *aif; in rk628_hdmirx_audioinfo_alloc() local
395 aif = devm_kzalloc(dev, sizeof(*aif), GFP_KERNEL); in rk628_hdmirx_audioinfo_alloc()
396 if (!aif) in rk628_hdmirx_audioinfo_alloc()
398 INIT_DELAYED_WORK(&aif->delayed_work_audio_rate_change, in rk628_hdmirx_audioinfo_alloc()
400 INIT_DELAYED_WORK(&aif->delayed_work_audio, in rk628_hdmirx_audioinfo_alloc()
402 aif->confctl_mutex = confctl_mutex; in rk628_hdmirx_audioinfo_alloc()
403 aif->rk628 = rk628; in rk628_hdmirx_audioinfo_alloc()
404 aif->i2s_enabled_default = en; in rk628_hdmirx_audioinfo_alloc()
405 aif->dev = dev; in rk628_hdmirx_audioinfo_alloc()
406 return aif; in rk628_hdmirx_audioinfo_alloc()
412 struct rk628_audioinfo *aif = (struct rk628_audioinfo *)info; in rk628_hdmirx_audio_cancel_work_audio() local
415 cancel_delayed_work_sync(&aif->delayed_work_audio); in rk628_hdmirx_audio_cancel_work_audio()
417 cancel_delayed_work(&aif->delayed_work_audio); in rk628_hdmirx_audio_cancel_work_audio()
423 struct rk628_audioinfo *aif = (struct rk628_audioinfo *)info; in rk628_hdmirx_audio_cancel_work_rate_change() local
426 cancel_delayed_work_sync(&aif->delayed_work_audio_rate_change); in rk628_hdmirx_audio_cancel_work_rate_change()
428 cancel_delayed_work(&aif->delayed_work_audio_rate_change); in rk628_hdmirx_audio_cancel_work_rate_change()
434 struct rk628_audioinfo *aif = (struct rk628_audioinfo *)info; in rk628_hdmirx_audio_destroy() local
436 if (!aif) in rk628_hdmirx_audio_destroy()
438 rk628_hdmirx_audio_cancel_work_audio(aif, true); in rk628_hdmirx_audio_destroy()
439 rk628_hdmirx_audio_cancel_work_rate_change(aif, true); in rk628_hdmirx_audio_destroy()
440 aif->confctl_mutex = NULL; in rk628_hdmirx_audio_destroy()
441 aif->rk628 = NULL; in rk628_hdmirx_audio_destroy()
447 struct rk628_audioinfo *aif = (struct rk628_audioinfo *)info; in rk628_hdmirx_audio_present() local
449 if (!aif) in rk628_hdmirx_audio_present()
451 return aif->audio_present; in rk628_hdmirx_audio_present()
457 struct rk628_audioinfo *aif = (struct rk628_audioinfo *)info; in rk628_hdmirx_audio_fs() local
459 if (!aif) in rk628_hdmirx_audio_fs()
461 return aif->audio_state.fs_audio; in rk628_hdmirx_audio_fs()
467 struct rk628_audioinfo *aif = (struct rk628_audioinfo *)info; in rk628_hdmirx_audio_i2s_ctrl() local
469 if (enable == aif->i2s_enabled) in rk628_hdmirx_audio_i2s_ctrl()
472 rk628_i2c_write(aif->rk628, HDMI_RX_AUD_SAO_CTRL, in rk628_hdmirx_audio_i2s_ctrl()
476 rk628_i2c_write(aif->rk628, HDMI_RX_AUD_SAO_CTRL, in rk628_hdmirx_audio_i2s_ctrl()
481 aif->i2s_enabled = enable; in rk628_hdmirx_audio_i2s_ctrl()
487 struct rk628_audioinfo *aif = (struct rk628_audioinfo *)info; in rk628_hdmirx_audio_setup() local
490 dev_dbg(aif->dev, "%s: setup audio\n", __func__); in rk628_hdmirx_audio_setup()
493 aif->audio_state.ctsn_flag = 0; in rk628_hdmirx_audio_setup()
494 aif->audio_state.fs_audio = 0; in rk628_hdmirx_audio_setup()
495 aif->audio_state.pre_state = 0; in rk628_hdmirx_audio_setup()
496 aif->audio_state.init_state = INIT_FIFO_STATE*4; in rk628_hdmirx_audio_setup()
497 aif->audio_state.fifo_int = false; in rk628_hdmirx_audio_setup()
498 aif->audio_state.audio_enable = false; in rk628_hdmirx_audio_setup()
499 aif->fifo_ints_en = false; in rk628_hdmirx_audio_setup()
500 aif->ctsn_ints_en = false; in rk628_hdmirx_audio_setup()
501 aif->i2s_enabled = false; in rk628_hdmirx_audio_setup()
503 rk628_hdmirx_audio_clk_set_rate(aif, 5644800); in rk628_hdmirx_audio_setup()
505 rk628_i2c_write(aif->rk628, HDMI_RX_AUDPLL_GEN_CTS, audio_pll_cts); in rk628_hdmirx_audio_setup()
507 rk628_i2c_write(aif->rk628, HDMI_RX_AUDPLL_GEN_N, audio_pll_n); in rk628_hdmirx_audio_setup()
510 rk628_i2c_update_bits(aif->rk628, HDMI_RX_AUD_CLK_CTRL, in rk628_hdmirx_audio_setup()
513 rk628_i2c_update_bits(aif->rk628, HDMI_RX_AUD_PLL_CTRL, in rk628_hdmirx_audio_setup()
515 rk628_i2c_update_bits(aif->rk628, HDMI_RX_AUD_FIFO_TH, in rk628_hdmirx_audio_setup()
524 rk628_i2c_update_bits(aif->rk628, HDMI_RX_AUD_FIFO_CTRL, in rk628_hdmirx_audio_setup()
529 rk628_i2c_write(aif->rk628, HDMI_RX_AUD_SAO_CTRL, in rk628_hdmirx_audio_setup()
532 (aif->i2s_enabled_default ? 0 : I2S_ENABLE_BITS(0x3f))); in rk628_hdmirx_audio_setup()
533 aif->i2s_enabled = aif->i2s_enabled_default; in rk628_hdmirx_audio_setup()
534 rk628_i2c_write(aif->rk628, HDMI_RX_AUD_MUTE_CTRL, in rk628_hdmirx_audio_setup()
543 rk628_i2c_write(aif->rk628, HDMI_RX_AUD_PAO_CTRL, in rk628_hdmirx_audio_setup()
545 rk628_i2c_write(aif->rk628, HDMI_RX_AUD_CHEXTR_CTRL, in rk628_hdmirx_audio_setup()
547 aif->ctsn_ints_en = true; in rk628_hdmirx_audio_setup()
548 rk628_i2c_write(aif->rk628, HDMI_RX_PDEC_IEN_SET, ACR_N_CHG_ICLR | ACR_CTS_CHG_ICLR); in rk628_hdmirx_audio_setup()
550 rk628_i2c_write(aif->rk628, HDMI_RX_PDEC_AUDIODET_CTRL, in rk628_hdmirx_audio_setup()
569 struct rk628_audioinfo *aif = (struct rk628_audioinfo *)info; in rk628_csi_isr_ctsn() local
572 dev_dbg(aif->dev, "%s: pdec_ints:%#x\n", __func__, pdec_ints); in rk628_csi_isr_ctsn()
575 aif->audio_state.ctsn_flag |= ACR_N_CHG_ICLR; in rk628_csi_isr_ctsn()
577 aif->audio_state.ctsn_flag |= ACR_CTS_CHG_ICLR; in rk628_csi_isr_ctsn()
578 if (aif->audio_state.ctsn_flag == ctsn_mask) { in rk628_csi_isr_ctsn()
579 dev_dbg(aif->dev, "%s: ctsn updated, disable ctsn int\n", __func__); in rk628_csi_isr_ctsn()
580 rk628_i2c_write(aif->rk628, HDMI_RX_PDEC_IEN_CLR, ctsn_mask); in rk628_csi_isr_ctsn()
581 aif->ctsn_ints_en = false; in rk628_csi_isr_ctsn()
582 schedule_delayed_work(&aif->delayed_work_audio_rate_change, 0); in rk628_csi_isr_ctsn()
584 rk628_i2c_write(aif->rk628, HDMI_RX_PDEC_ICLR, pdec_ints & ctsn_mask); in rk628_csi_isr_ctsn()
590 struct rk628_audioinfo *aif = (struct rk628_audioinfo *)info; in rk628_csi_isr_fifoints() local
593 dev_dbg(aif->dev, "%s: fifo_ints:%#x\n", __func__, fifo_ints); in rk628_csi_isr_fifoints()
596 dev_dbg(aif->dev, "%s: Audio FIFO overflow\n", __func__); in rk628_csi_isr_fifoints()
597 aif->audio_state.fifo_flag |= AFIF_OVERFL_ISTS; in rk628_csi_isr_fifoints()
600 dev_dbg(aif->dev, "%s: Audio FIFO underflow\n", __func__); in rk628_csi_isr_fifoints()
601 aif->audio_state.fifo_flag |= AFIF_UNDERFL_ISTS; in rk628_csi_isr_fifoints()
603 if (aif->audio_state.fifo_flag == fifo_mask) { in rk628_csi_isr_fifoints()
604 aif->audio_state.fifo_int = true; in rk628_csi_isr_fifoints()
605 aif->audio_state.fifo_flag = 0; in rk628_csi_isr_fifoints()
606 schedule_delayed_work(&aif->delayed_work_audio_rate_change, 0); in rk628_csi_isr_fifoints()
608 rk628_i2c_write(aif->rk628, HDMI_RX_AUD_FIFO_ICLR, fifo_ints & fifo_mask); in rk628_csi_isr_fifoints()