int ret = 0;
struct aml_lcd_drv_s *lcd_drv = aml_lcd_get_driver();
- mutex_lock(&lcd_vout_mutex);
+ mutex_lock(&lcd_drv->power_mutex);
if (!(mode & VMODE_INIT_BIT_MASK)) {
- if (VMODE_LCD == (mode & VMODE_MODE_BIT_MASK)) {
- lcd_drv->driver_init_pre();
- ret = lcd_drv->driver_init();
- } else {
+ if (VMODE_LCD == (mode & VMODE_MODE_BIT_MASK))
+ aml_lcd_notifier_call_chain(LCD_EVENT_POWER_ON, NULL);
+ else
ret = -EINVAL;
- }
} else
lcd_clk_gate_switch(1);
- mutex_unlock(&lcd_vout_mutex);
+ mutex_unlock(&lcd_drv->power_mutex);
return ret;
}
static int lcd_vout_disable(enum vmode_e cur_vmod)
{
- aml_lcd_notifier_call_chain(LCD_EVENT_IF_POWER_OFF, NULL);
+ struct aml_lcd_drv_s *lcd_drv = aml_lcd_get_driver();
+
+ mutex_lock(&lcd_drv->power_mutex);
+ aml_lcd_notifier_call_chain(LCD_EVENT_POWER_OFF, NULL);
LCDPR("%s finished\n", __func__);
+ mutex_unlock(&lcd_drv->power_mutex);
+
return 0;
}
LCDPR("vout_serve bypass\n");
return 0;
}
- mutex_lock(&lcd_vout_mutex);
+ mutex_lock(&lcd_drv->power_mutex);
/* do not change mode value here, for bit mask is useful */
lcd_vmode_vinfo_update(mode & VMODE_MODE_BIT_MASK);
if (!(mode & VMODE_INIT_BIT_MASK)) {
switch (mode & VMODE_MODE_BIT_MASK) {
case VMODE_LCD:
+ mutex_lock(&lcd_vout_mutex);
ret = lcd_drv->driver_change();
+ mutex_unlock(&lcd_vout_mutex);
break;
default:
ret = -EINVAL;
} else
lcd_clk_gate_switch(1);
- mutex_unlock(&lcd_vout_mutex);
+ mutex_unlock(&lcd_drv->power_mutex);
return ret;
}
static void vout_func_update_viu(int index, struct vout_server_s *p_server)
{
struct vinfo_s *vinfo = NULL;
- unsigned int mux_bit = 0, mux_sel = 3;
- unsigned int clk_bit = 0, clk_sel = 0;
+ unsigned int mux_bit = 0xff, mux_sel = VIU_MUX_MAX;
+ unsigned int clk_bit = 0xff, clk_sel = 0;
if (p_server->op.get_vinfo)
vinfo = p_server->op.get_vinfo();
break;
}
- vout_func_vcbus_setb(VPU_VIU_VENC_MUX_CTRL, mux_sel, mux_bit, 2);
- vout_func_vcbus_setb(VPU_VENCX_CLK_CTRL, clk_sel, clk_bit, 1);
+ if (mux_bit < 0xff) {
+ vout_func_vcbus_setb(VPU_VIU_VENC_MUX_CTRL,
+ mux_sel, mux_bit, 2);
+ }
+ if (clk_bit < 0xff)
+ vout_func_vcbus_setb(VPU_VENCX_CLK_CTRL, clk_sel, clk_bit, 1);
#if 0
VOUTPR("%s: %d, mux_sel=%d, clk_sel=%d\n",
if (p_server->op.vmode_is_supported(mode) == true) {
p_module->curr_vout_server = p_server;
- vout_func_update_viu(index, p_server);
- ret = p_server->op.set_vmode(mode);
if (p_server->op.set_state)
p_server->op.set_state(index);
} else {
p_server->op.clr_state(index);
}
}
+ vout_func_update_viu(index, p_module->curr_vout_server);
+ ret = p_module->curr_vout_server->op.set_vmode(mode);
mutex_unlock(&vout_mutex);