/*
|
* Allwinner SoCs display driver.
|
*
|
* Copyright (C) 2016 Allwinner.
|
*
|
* This file is licensed under the terms of the GNU General Public
|
* License version 2. This program is licensed "as is" without any
|
* warranty of any kind, whether express or implied.
|
*/
|
|
#include "lcd_source.h"
|
|
/**
|
* sunxi_lcd_delay_ms.
|
* @ms: Delay time, unit: millisecond.
|
*/
|
s32 sunxi_lcd_delay_ms(u32 ms)
|
{
|
if (g_lcd_drv.src_ops.sunxi_lcd_delay_ms)
|
return g_lcd_drv.src_ops.sunxi_lcd_delay_ms(ms);
|
|
return -1;
|
}
|
|
/**
|
* sunxi_lcd_delay_us.
|
* @us: Delay time, unit: microsecond.
|
*/
|
s32 sunxi_lcd_delay_us(u32 us)
|
{
|
if (g_lcd_drv.src_ops.sunxi_lcd_delay_us)
|
return g_lcd_drv.src_ops.sunxi_lcd_delay_us(us);
|
|
return -1;
|
}
|
|
/**
|
* sunxi_lcd_tcon_enable - enable timing controller.
|
* @screen_id: The index of screen.
|
*/
|
void sunxi_lcd_tcon_enable(u32 screen_id)
|
{
|
if (g_lcd_drv.src_ops.sunxi_lcd_tcon_enable)
|
g_lcd_drv.src_ops.sunxi_lcd_tcon_enable(screen_id);
|
}
|
|
|
/**
|
* sunxi_lcd_dsi_mode_switch
|
* @screen_id: The index of screen.
|
* @cmd_en : enable command mode
|
* @lp_en : enable low power mode for video mode
|
*/
|
void sunxi_lcd_dsi_mode_switch(u32 screen_id, u32 cmd_en, u32 lp_en)
|
{
|
if (g_lcd_drv.src_ops.sunxi_lcd_dsi_mode_switch)
|
g_lcd_drv.src_ops.sunxi_lcd_dsi_mode_switch(screen_id, cmd_en,
|
lp_en);
|
}
|
|
/**
|
* sunxi_lcd_tcon_disable - disable timing controller.
|
* @screen_id: The index of screen.
|
*/
|
void sunxi_lcd_tcon_disable(u32 screen_id)
|
{
|
if (g_lcd_drv.src_ops.sunxi_lcd_tcon_disable)
|
g_lcd_drv.src_ops.sunxi_lcd_tcon_disable(screen_id);
|
}
|
|
/**
|
* sunxi_lcd_backlight_enable - enable the backlight of panel.
|
* @screen_id: The index of screen.
|
*/
|
void sunxi_lcd_backlight_enable(u32 screen_id)
|
{
|
if (g_lcd_drv.src_ops.sunxi_lcd_backlight_enable)
|
g_lcd_drv.src_ops.sunxi_lcd_backlight_enable(screen_id);
|
}
|
|
/**
|
* sunxi_lcd_backlight_disable - disable the backlight of panel.
|
* @screen_id: The index of screen.
|
*/
|
void sunxi_lcd_backlight_disable(u32 screen_id)
|
{
|
if (g_lcd_drv.src_ops.sunxi_lcd_backlight_disable)
|
g_lcd_drv.src_ops.sunxi_lcd_backlight_disable(screen_id);
|
}
|
|
/**
|
* sunxi_lcd_power_enable - enable the power of panel.
|
* @screen_id: The index of screen.
|
* @pwr_id: The index of power
|
*/
|
void sunxi_lcd_power_enable(u32 screen_id, u32 pwr_id)
|
{
|
if (g_lcd_drv.src_ops.sunxi_lcd_power_enable)
|
g_lcd_drv.src_ops.sunxi_lcd_power_enable(screen_id, pwr_id);
|
}
|
|
/**
|
* sunxi_lcd_power_disable - disable the power of panel.
|
* @screen_id: The index of screen.
|
* @pwr_id: The index of power
|
*/
|
void sunxi_lcd_power_disable(u32 screen_id, u32 pwr_id)
|
{
|
if (g_lcd_drv.src_ops.sunxi_lcd_power_disable)
|
g_lcd_drv.src_ops.sunxi_lcd_power_disable(screen_id, pwr_id);
|
}
|
|
/**
|
* sunxi_lcd_pwm_enable - enable pwm modules, start output pwm wave.
|
* @screen_id: The index of screen.
|
*
|
* need to conifg gpio for pwm function
|
*/
|
s32 sunxi_lcd_pwm_enable(u32 screen_id)
|
{
|
if (g_lcd_drv.src_ops.sunxi_lcd_pwm_enable)
|
return g_lcd_drv.src_ops.sunxi_lcd_pwm_enable(screen_id);
|
|
return -1;
|
}
|
|
/**
|
* sunxi_lcd_pwm_disable - disable pwm modules, stop output pwm wave.
|
* @screen_id: The index of screen.
|
*/
|
s32 sunxi_lcd_pwm_disable(u32 screen_id)
|
{
|
if (g_lcd_drv.src_ops.sunxi_lcd_pwm_disable)
|
return g_lcd_drv.src_ops.sunxi_lcd_pwm_disable(screen_id);
|
|
return -1;
|
}
|
|
/**
|
*
|
* sunxi_lcd_cpu_set_auto_mode
|
* @screen_id: The index of screen.
|
*/
|
s32 sunxi_lcd_cpu_set_auto_mode(u32 screen_id)
|
{
|
if (g_lcd_drv.src_ops.sunxi_lcd_cpu_set_auto_mode)
|
return g_lcd_drv.src_ops.sunxi_lcd_cpu_set_auto_mode(screen_id);
|
|
return -1;
|
}
|
|
/**
|
* sunxi_lcd_cpu_write - write command and para to cpu panel.
|
* @screen_id: The index of screen.
|
* @command: Command to be transfer.
|
* @para: The pointer to para
|
* @para_num: The number of para
|
*/
|
s32 sunxi_lcd_cpu_write(u32 screen_id, u32 index, u32 data)
|
{
|
if (g_lcd_drv.src_ops.sunxi_lcd_cpu_write)
|
return g_lcd_drv.src_ops.sunxi_lcd_cpu_write(screen_id,
|
index, data);
|
|
return -1;
|
}
|
|
/**
|
* sunxi_lcd_cpu_write_index - write command to cpu panel.
|
* @screen_id: The index of screen.
|
* @index: Command or index to be transfer.
|
*/
|
s32 sunxi_lcd_cpu_write_index(u32 screen_id, u32 index)
|
{
|
if (g_lcd_drv.src_ops.sunxi_lcd_cpu_write_index)
|
return g_lcd_drv.src_ops.sunxi_lcd_cpu_write_index(screen_id,
|
index);
|
|
return -1;
|
}
|
|
/**
|
* sunxi_lcd_cpu_write_data - write data to cpu panel.
|
* @screen_id: The index of screen.
|
* @data: Data to be transfer.
|
*/
|
s32 sunxi_lcd_cpu_write_data(u32 screen_id, u32 data)
|
{
|
if (g_lcd_drv.src_ops.sunxi_lcd_cpu_write_data)
|
return g_lcd_drv.src_ops.sunxi_lcd_cpu_write_data(screen_id,
|
data);
|
|
return -1;
|
}
|
|
/**
|
* sunxi_lcd_dsi_dcs_write - write command and para to mipi panel.
|
* @screen_id: The index of screen.
|
* @command: Command to be transfer.
|
* @para: The pointer to para.
|
* @para_num: The number of para
|
*/
|
s32 sunxi_lcd_dsi_dcs_write(u32 screen_id, u8 command, u8 *para, u32 para_num)
|
{
|
if (g_lcd_drv.src_ops.sunxi_lcd_dsi_dcs_write)
|
return g_lcd_drv.src_ops.sunxi_lcd_dsi_dcs_write(screen_id,
|
command, para,
|
para_num);
|
|
return -1;
|
}
|
|
/**
|
* sunxi_lcd_dsi_dcs_write - write command and para to mipi panel.
|
* @screen_id: The index of screen.
|
* @command: Command to be transfer.
|
*/
|
s32 sunxi_lcd_dsi_dcs_write_0para(u32 screen_id, u8 command)
|
{
|
u8 tmp[5];
|
|
sunxi_lcd_dsi_dcs_write(screen_id, command, tmp, 0);
|
|
return -1;
|
}
|
|
/**
|
* sunxi_lcd_dsi_dcs_write_1para - write command and para to mipi panel.
|
* @screen_id: The index of screen.
|
* @command: Command to be transfer.
|
* @paran: Para to be transfer.
|
*/
|
s32 sunxi_lcd_dsi_dcs_write_1para(u32 screen_id, u8 command, u8 para1)
|
{
|
u8 tmp[5];
|
|
tmp[0] = para1;
|
sunxi_lcd_dsi_dcs_write(screen_id, command, tmp, 1);
|
|
return -1;
|
}
|
|
s32 sunxi_lcd_dsi_dcs_write_2para(u32 screen_id, u8 command, u8 para1, u8 para2)
|
{
|
u8 tmp[5];
|
|
tmp[0] = para1;
|
tmp[1] = para2;
|
sunxi_lcd_dsi_dcs_write(screen_id, command, tmp, 2);
|
|
return -1;
|
}
|
|
s32 sunxi_lcd_dsi_dcs_write_3para(u32 screen_id, u8 command, u8 para1, u8 para2,
|
u8 para3)
|
{
|
u8 tmp[5];
|
|
tmp[0] = para1;
|
tmp[1] = para2;
|
tmp[2] = para3;
|
sunxi_lcd_dsi_dcs_write(screen_id, command, tmp, 3);
|
|
return -1;
|
}
|
|
s32 sunxi_lcd_dsi_dcs_write_4para(u32 screen_id, u8 command, u8 para1, u8 para2,
|
u8 para3, u8 para4)
|
{
|
u8 tmp[5];
|
|
tmp[0] = para1;
|
tmp[1] = para2;
|
tmp[2] = para3;
|
tmp[3] = para4;
|
sunxi_lcd_dsi_dcs_write(screen_id, command, tmp, 4);
|
|
return -1;
|
}
|
|
s32 sunxi_lcd_dsi_dcs_write_5para(u32 screen_id, u8 command, u8 para1, u8 para2,
|
u8 para3, u8 para4, u8 para5)
|
{
|
u8 tmp[5];
|
|
tmp[0] = para1;
|
tmp[1] = para2;
|
tmp[2] = para3;
|
tmp[3] = para4;
|
tmp[4] = para5;
|
sunxi_lcd_dsi_dcs_write(screen_id, command, tmp, 5);
|
|
return -1;
|
}
|
|
s32 sunxi_lcd_dsi_dcs_write_6para(u32 screen_id, u8 command, u8 para1, u8 para2,
|
u8 para3, u8 para4, u8 para5, u8 para6)
|
{
|
u8 tmp[6];
|
|
tmp[0] = para1;
|
tmp[1] = para2;
|
tmp[2] = para3;
|
tmp[3] = para4;
|
tmp[4] = para5;
|
tmp[5] = para6;
|
sunxi_lcd_dsi_dcs_write(screen_id, command, tmp, 6);
|
|
return -1;
|
}
|
|
/**
|
* sunxi_lcd_dsi_gen_write - write command and para to mipi panel.
|
* @screen_id: The index of screen.
|
* @command: Command to be transfer.
|
* @para: The pointer to para.
|
* @para_num: The number of para
|
*/
|
s32 sunxi_lcd_dsi_gen_write(u32 screen_id, u8 command, u8 *para, u32 para_num)
|
{
|
if (g_lcd_drv.src_ops.sunxi_lcd_dsi_gen_write)
|
return g_lcd_drv.src_ops.sunxi_lcd_dsi_gen_write(screen_id,
|
command, para,
|
para_num);
|
|
return -1;
|
}
|
|
/**
|
* sunxi_lcd_dsi_gen_write - write command and para to mipi panel.
|
* @screen_id: The index of screen.
|
* @command: Command to be transfer.
|
*/
|
s32 sunxi_lcd_dsi_gen_write_0para(u32 screen_id, u8 command)
|
{
|
u8 tmp[5];
|
|
sunxi_lcd_dsi_gen_write(screen_id, command, tmp, 0);
|
|
return -1;
|
}
|
|
/**
|
* sunxi_lcd_dsi_gen_write_1para - write command and para to mipi panel.
|
* @screen_id: The index of screen.
|
* @command: Command to be transfer.
|
* @paran: Para to be transfer.
|
*/
|
s32 sunxi_lcd_dsi_gen_write_1para(u32 screen_id, u8 command, u8 para1)
|
{
|
u8 tmp[5];
|
|
tmp[0] = para1;
|
sunxi_lcd_dsi_gen_write(screen_id, command, tmp, 1);
|
|
return -1;
|
}
|
|
s32 sunxi_lcd_dsi_gen_write_2para(u32 screen_id, u8 command, u8 para1, u8 para2)
|
{
|
u8 tmp[5];
|
|
tmp[0] = para1;
|
tmp[1] = para2;
|
sunxi_lcd_dsi_gen_write(screen_id, command, tmp, 2);
|
|
return -1;
|
}
|
|
s32 sunxi_lcd_dsi_gen_write_3para(u32 screen_id, u8 command, u8 para1, u8 para2,
|
u8 para3)
|
{
|
u8 tmp[5];
|
|
tmp[0] = para1;
|
tmp[1] = para2;
|
tmp[2] = para3;
|
sunxi_lcd_dsi_gen_write(screen_id, command, tmp, 3);
|
|
return -1;
|
}
|
|
s32 sunxi_lcd_dsi_gen_write_4para(u32 screen_id, u8 command, u8 para1, u8 para2,
|
u8 para3, u8 para4)
|
{
|
u8 tmp[5];
|
|
tmp[0] = para1;
|
tmp[1] = para2;
|
tmp[2] = para3;
|
tmp[3] = para4;
|
sunxi_lcd_dsi_gen_write(screen_id, command, tmp, 4);
|
|
return -1;
|
}
|
|
s32 sunxi_lcd_dsi_gen_write_5para(u32 screen_id, u8 command, u8 para1, u8 para2,
|
u8 para3, u8 para4, u8 para5)
|
{
|
u8 tmp[5];
|
|
tmp[0] = para1;
|
tmp[1] = para2;
|
tmp[2] = para3;
|
tmp[3] = para4;
|
tmp[4] = para5;
|
sunxi_lcd_dsi_gen_write(screen_id, command, tmp, 5);
|
|
return -1;
|
}
|
|
/**
|
* sunxi_lcd_dsi_clk_enable - enable dsi clk.
|
* @screen_id: The index of screen.
|
*/
|
s32 sunxi_lcd_dsi_clk_enable(u32 screen_id)
|
{
|
if (g_lcd_drv.src_ops.sunxi_lcd_dsi_clk_enable)
|
return g_lcd_drv.src_ops.sunxi_lcd_dsi_clk_enable(screen_id, 1);
|
|
return -1;
|
}
|
|
/**
|
* sunxi_lcd_dsi_clk_disable - disable dsi clk.
|
* @screen_id: The index of screen.
|
*/
|
s32 sunxi_lcd_dsi_clk_disable(u32 screen_id)
|
{
|
if (g_lcd_drv.src_ops.sunxi_lcd_dsi_clk_enable)
|
return g_lcd_drv.src_ops.sunxi_lcd_dsi_clk_enable(screen_id, 0);
|
|
return -1;
|
}
|
|
/**
|
* sunxi_lcd_dsi_gen_read - generic short read
|
* @screen_id: The index of screen.
|
* @result: pointer that store the result
|
*/
|
static s32 sunxi_lcd_dsi_gen_short_read(u32 screen_id, u8 *para, u8 para_num,
|
u8 *result)
|
{
|
if (g_lcd_drv.src_ops.sunxi_lcd_dsi_gen_short_read)
|
return g_lcd_drv.src_ops.sunxi_lcd_dsi_gen_short_read(screen_id,
|
para, para_num,
|
result);
|
return -1;
|
}
|
|
/**
|
* @name :sunxi_lcd_dsi_set_max_ret_size
|
* @brief :set max ret size of dsi read
|
* @param[IN] :sel:index of dsi
|
* @param[IN] :size:number of byte of max size
|
* @return :0
|
*/
|
s32 sunxi_lcd_dsi_set_max_ret_size(u32 sel, u32 size)
|
{
|
if (g_lcd_drv.src_ops.sunxi_lcd_dsi_dcs_read)
|
return g_lcd_drv.src_ops.sunxi_lcd_dsi_set_max_ret_size(sel,
|
size);
|
return 0;
|
}
|
|
/**
|
* @name :sunxi_lcd_dsi_dcs_read
|
* @brief :dcs read
|
* @param[IN] :sel:index of dsi
|
* @param[IN] :cmd: dcs command
|
* @param[OUT] :result: pointer of read result,larger then max ret size
|
* @param[OUT] :num_p: number of bytes have been readed
|
* @return :number of bytes have been readed
|
*/
|
s32 sunxi_lcd_dsi_dcs_read(u32 sel, u8 cmd, u8 *result, u32 *num_p)
|
{
|
if (g_lcd_drv.src_ops.sunxi_lcd_dsi_dcs_read)
|
return g_lcd_drv.src_ops.sunxi_lcd_dsi_dcs_read(sel, cmd,
|
result, num_p);
|
return 0;
|
}
|
|
/**
|
* sunxi_lcd_dsi_gen_short_read0p - generic read without param
|
* @screen_id: The index of screen.
|
* @paran: Para to be transfer.
|
* @result: pointer that store the result
|
*/
|
s32 sunxi_lcd_dsi_gen_short_read0p(u32 screen_id, u8 *result)
|
{
|
u8 tmp[2];
|
|
return sunxi_lcd_dsi_gen_short_read(screen_id, tmp, 0, result);
|
}
|
|
/**
|
* sunxi_lcd_dsi_gen_short_read1p - generic read with 1 param
|
* @screen_id: The index of screen.
|
* @paran: Para to be transfer.
|
* @result: pointer that store the result
|
*/
|
s32 sunxi_lcd_dsi_gen_short_read1p(u32 screen_id, u8 para0, u8 *result)
|
{
|
u8 tmp[2];
|
|
tmp[0] = para0;
|
sunxi_lcd_dsi_gen_short_read(screen_id, tmp, 1, result);
|
|
return -1;
|
}
|
|
/**
|
* sunxi_lcd_dsi_gen_short_read2p - generic read with 2 param
|
* @screen_id: The index of screen.
|
* @paran: Para to be transfer.
|
* @result: pointer that store the result
|
*/
|
s32 sunxi_lcd_dsi_gen_short_read2p(u32 screen_id, u8 para0, u8 para1,
|
u8 *result)
|
{
|
u8 tmp[2];
|
|
tmp[0] = para0;
|
tmp[1] = para1;
|
return sunxi_lcd_dsi_gen_short_read(screen_id, tmp, 2, result);
|
}
|
|
/**
|
* sunxi_lcd_set_panel_funs - set panel functions.
|
* @name: The panel driver name.
|
* @lcd_cfg: The functions.
|
*/
|
s32 sunxi_lcd_set_panel_funs(char *name, struct disp_lcd_panel_fun *lcd_cfg)
|
{
|
if (g_lcd_drv.src_ops.sunxi_lcd_set_panel_funs)
|
return g_lcd_drv.src_ops.sunxi_lcd_set_panel_funs(name,
|
lcd_cfg);
|
|
return -1;
|
}
|
|
/**
|
* sunxi_lcd_pin_cfg - config pin panel used
|
* @screen_id: The index of screen.
|
* @bon: 1: config pin according to sys_config, 0: set disable state
|
*/
|
s32 sunxi_lcd_pin_cfg(u32 screen_id, u32 bon)
|
{
|
if (g_lcd_drv.src_ops.sunxi_lcd_pin_cfg)
|
return g_lcd_drv.src_ops.sunxi_lcd_pin_cfg(screen_id, bon);
|
|
return -1;
|
}
|
|
/**
|
* sunxi_lcd_gpio_set_value
|
* @screen_id: The index of screen.
|
* @io_index: the index of gpio
|
* @value: value of gpio to be set
|
*/
|
s32 sunxi_lcd_gpio_set_value(u32 screen_id, u32 io_index, u32 value)
|
{
|
if (g_lcd_drv.src_ops.sunxi_lcd_gpio_set_value)
|
return g_lcd_drv.src_ops.sunxi_lcd_gpio_set_value(screen_id,
|
io_index,
|
value);
|
|
return -1;
|
}
|
|
/**
|
* sunxi_lcd_gpio_set_direction
|
* @screen_id: The index of screen.
|
* @io_index: the index of gpio
|
* @direct: value of gpio to be set
|
*/
|
s32 sunxi_lcd_gpio_set_direction(u32 screen_id, u32 io_index, u32 direct)
|
{
|
if (g_lcd_drv.src_ops.sunxi_lcd_gpio_set_direction)
|
return g_lcd_drv.src_ops.sunxi_lcd_gpio_set_direction(screen_id,
|
io_index,
|
direct);
|
|
return -1;
|
}
|