s32 stbuf_init(struct stream_buf_s *buf) { s32 r; u32 dummy; u32 phy_addr; if (buf->flag & BUF_FLAG_IOMEM) { phy_addr = buf->buf_start; } else { r = _stbuf_alloc(buf); if (r < 0) { return r; } phy_addr = virt_to_phys((void *)buf->buf_start); } init_waitqueue_head(&buf->wq); _WRITE_ST_REG(CONTROL, 0); if (buf->type == BUF_TYPE_VIDEO) { /* reset VLD before setting all pointers */ WRITE_MPEG_REG(RESET0_REGISTER, RESET_VLD); dummy = READ_MPEG_REG(RESET0_REGISTER); WRITE_MPEG_REG(POWER_CTL_VLD, 1 << 4); } else if (buf->type == BUF_TYPE_AUDIO) { WRITE_MPEG_REG(AIU_AIFIFO_GBIT, 0x80); } if (buf->type == BUF_TYPE_SUBTITLE) { WRITE_MPEG_REG(PARSER_SUB_RP, phy_addr); WRITE_MPEG_REG(PARSER_SUB_START_PTR, phy_addr); WRITE_MPEG_REG(PARSER_SUB_END_PTR, phy_addr + buf->buf_size - 8); return 0; } _WRITE_ST_REG(START_PTR, phy_addr); _WRITE_ST_REG(CURR_PTR, phy_addr); _WRITE_ST_REG(END_PTR, phy_addr + buf->buf_size - 8); _SET_ST_REG_MASK(CONTROL, MEM_BUFCTRL_INIT); _CLR_ST_REG_MASK(CONTROL, MEM_BUFCTRL_INIT); _WRITE_ST_REG(BUF_CTRL, MEM_BUFCTRL_MANUAL); _WRITE_ST_REG(WP, phy_addr); _SET_ST_REG_MASK(BUF_CTRL, MEM_BUFCTRL_INIT); _CLR_ST_REG_MASK(BUF_CTRL, MEM_BUFCTRL_INIT); _SET_ST_REG_MASK(CONTROL, MEM_FILL_ON_LEVEL | MEM_CTRL_FILL_EN | MEM_CTRL_EMPTY_EN); return 0; }
s32 stbuf_init(struct stream_buf_s *buf) { s32 r; u32 dummy; u32 phy_addr; if (buf->flag & BUF_FLAG_IOMEM) { phy_addr = buf->buf_start; } else { r = _stbuf_alloc(buf); if (r < 0) { return r; } phy_addr = virt_to_phys((void *)buf->buf_start); } init_waitqueue_head(&buf->wq); #if MESON_CPU_TYPE >= MESON_CPU_TYPE_MESON8 if (HAS_HEVC_VDEC && buf->type == BUF_TYPE_HEVC) { CLEAR_VREG_MASK(HEVC_STREAM_CONTROL, 1); WRITE_VREG(HEVC_STREAM_START_ADDR, phy_addr); WRITE_VREG(HEVC_STREAM_END_ADDR, phy_addr + buf->buf_size); WRITE_VREG(HEVC_STREAM_RD_PTR, phy_addr); WRITE_VREG(HEVC_STREAM_WR_PTR, phy_addr); return 0; } #endif if (buf->type == BUF_TYPE_VIDEO) { _WRITE_ST_REG(CONTROL, 0); /* reset VLD before setting all pointers */ WRITE_VREG(VLD_MEM_VIFIFO_WRAP_COUNT,0); #if MESON_CPU_TYPE >= MESON_CPU_TYPE_MESON6 WRITE_VREG(DOS_SW_RESET0, (1<<4)); WRITE_VREG(DOS_SW_RESET0, 0); #else WRITE_MPEG_REG(RESET0_REGISTER, RESET_VLD); #endif dummy = READ_MPEG_REG(RESET0_REGISTER); WRITE_VREG(POWER_CTL_VLD, 1 << 4); } else if (buf->type == BUF_TYPE_AUDIO) { _WRITE_ST_REG(CONTROL, 0); WRITE_MPEG_REG(AIU_AIFIFO_GBIT, 0x80); } if (buf->type == BUF_TYPE_SUBTITLE) { WRITE_MPEG_REG(PARSER_SUB_RP, phy_addr); WRITE_MPEG_REG(PARSER_SUB_START_PTR, phy_addr); WRITE_MPEG_REG(PARSER_SUB_END_PTR, phy_addr + buf->buf_size - 8); return 0; } _WRITE_ST_REG(START_PTR, phy_addr); _WRITE_ST_REG(CURR_PTR, phy_addr); _WRITE_ST_REG(END_PTR, phy_addr + buf->buf_size - 8); _SET_ST_REG_MASK(CONTROL, MEM_BUFCTRL_INIT); _CLR_ST_REG_MASK(CONTROL, MEM_BUFCTRL_INIT); _WRITE_ST_REG(BUF_CTRL, MEM_BUFCTRL_MANUAL); _WRITE_ST_REG(WP, phy_addr); _SET_ST_REG_MASK(BUF_CTRL, MEM_BUFCTRL_INIT); _CLR_ST_REG_MASK(BUF_CTRL, MEM_BUFCTRL_INIT); _SET_ST_REG_MASK(CONTROL, (0x11 << 16) | MEM_FILL_ON_LEVEL | MEM_CTRL_FILL_EN | MEM_CTRL_EMPTY_EN); return 0; }