bool dal_clock_source_construct(
			struct clock_source *clk_src,
			struct clock_source_init_data *clk_src_init_data)
{
	if (clk_src_init_data == NULL || clk_src_init_data->as == NULL)
		return false;
	clk_src->dal_ctx = clk_src_init_data->dal_ctx;
	clk_src->id = clk_src_init_data->clk_src_id;
	clk_src->adapter_service = clk_src_init_data->as;
	clk_src->bios_parser = dal_adapter_service_get_bios_parser(
			clk_src_init_data->as);
	clk_src->turn_off_ds = false;
	clk_src->clk_src_id = dal_graphics_object_id_get_clock_source_id(
						clk_src_init_data->clk_src_id);
	clk_src->is_gen_lock_capable = true;
/*NOTE is_gen_lock_capable is false only for ext clock source dce80 */

	clk_src->ep_ss_params = NULL;
	clk_src->dp_ss_params = NULL;
	clk_src->hdmi_ss_params = NULL;
	clk_src->hdmi_ss_params = NULL;
	clk_src->ep_ss_params_cnt = 0;
	clk_src->dp_ss_params_cnt = 0;
	clk_src->hdmi_ss_params_cnt = 0;
	clk_src->dvi_ss_params_cnt = 0;
	clk_src->output_signals = SIGNAL_TYPE_ALL;
	clk_src->input_signals = SIGNAL_TYPE_ALL;

	return true;
}
static void set_clock(
	struct display_clock *base,
	uint32_t requested_clk_khz)
{
	struct bp_pixel_clock_parameters pxl_clk_params;
	struct display_clock_dce110 *dc = DCLCK110_FROM_BASE(base);
	struct dc_bios *bp = dal_adapter_service_get_bios_parser(base->as);

	/* Prepare to program display clock*/
	memset(&pxl_clk_params, 0, sizeof(pxl_clk_params));

	pxl_clk_params.target_pixel_clock = requested_clk_khz;
	pxl_clk_params.pll_id = base->id;

	bp->funcs->program_display_engine_pll(bp, &pxl_clk_params);

	if (dc->dfs_bypass_enabled) {

		/* Cache the fixed display clock*/
		dc->dfs_bypass_disp_clk =
			pxl_clk_params.dfs_bypass_display_clock;
	}

	/* from power down, we need mark the clock state as ClocksStateNominal
	 * from HWReset, so when resume we will call pplib voltage regulator.*/
	if (requested_clk_khz == 0)
		base->cur_min_clks_state = CLOCKS_STATE_NOMINAL;
}
bool dce80_timing_generator_construct(
	struct dce110_timing_generator *tg110,
	struct adapter_service *as,
	struct dc_context *ctx,
	uint32_t instance,
	const struct dce110_timing_generator_offsets *offsets)
{
	if (!tg110)
		return false;

	if (!as)
		return false;

	tg110->controller_id = CONTROLLER_ID_D0 + instance;
	tg110->offsets = *offsets;
	tg110->derived_offsets = reg_offsets[instance];

	tg110->base.funcs = &dce80_tg_funcs;

	tg110->base.ctx = ctx;
	tg110->base.bp = dal_adapter_service_get_bios_parser(as);

	tg110->max_h_total = CRTC_H_TOTAL__CRTC_H_TOTAL_MASK + 1;
	tg110->max_v_total = CRTC_V_TOTAL__CRTC_V_TOTAL_MASK + 1;

	tg110->min_h_blank = 56;
	tg110->min_h_front_porch = 4;
	tg110->min_h_back_porch = 4;

	return true;
}
static bool construct(struct timing_generator *tg,
	struct dal_context *ctx,
	struct adapter_service *as,
	enum controller_id id)
{
	if (!as)
		return false;

	switch (id) {
	case CONTROLLER_ID_UNDERLAY0:
		break;
	default:
		return false;
	}

	if (!dal_timing_generator_construct(tg, id))
		return false;

	tg->ctx = ctx;
	tg->bp = dal_adapter_service_get_bios_parser(as);

	tg->regs = tg_underlay_regs[id - CONTROLLER_ID_UNDERLAY0];

	tg->funcs = &timing_generator_dce110_funcs;
	return true;
}
static enum bp_result link_transmitter_control(
	struct dce110_link_encoder *enc110,
	struct bp_transmitter_control *cntl)
{
	enum bp_result result;
	struct dc_bios *bp = dal_adapter_service_get_bios_parser(
					enc110->base.adapter_service);

	result = bp->funcs->transmitter_control(bp, cntl);

	return result;
}
/*
 * @brief
 * Configure digital transmitter and enable both encoder and transmitter
 * Actual output will be available after calling unblank()
 */
static enum encoder_result enable_output(
	struct encoder_impl *enc,
	const struct encoder_output *output)
{
	enum bp_result result = dal_bios_parser_crt_control(
		dal_adapter_service_get_bios_parser(enc->adapter_service),
		output->ctx.engine, true, output->crtc_timing.pixel_clock);

	ASSERT(BP_RESULT_OK == result);

	return ENCODER_RESULT_OK;
}
/*
 * @brief
 * Disable transmitter and its encoder
 */
static enum encoder_result disable_output(
	struct encoder_impl *enc,
	const struct encoder_output *output)
{
	enum bp_result result;
	struct hw_ctx_analog_encoder *hw_ctx =
		FROM_ENCODER_IMPL(enc)->base.hw_ctx;
	if (!hw_ctx->funcs->is_output_enabled(hw_ctx, output->ctx.engine))
		return ENCODER_RESULT_OK;
	result = dal_bios_parser_crt_control(
		dal_adapter_service_get_bios_parser(enc->adapter_service),
		output->ctx.engine,
		false,
		output->crtc_timing.pixel_clock);

	ASSERT(BP_RESULT_OK == result);

	return ENCODER_RESULT_OK;
}