diff --git a/drivers/video/sunxi/lcd_fb/dev_lcd_fb.c b/drivers/video/sunxi/lcd_fb/dev_lcd_fb.c
index e7db39c4c..9670e4bdd 100644
--- a/drivers/video/sunxi/lcd_fb/dev_lcd_fb.c
+++ b/drivers/video/sunxi/lcd_fb/dev_lcd_fb.c
@@ -222,6 +222,14 @@ int sunxi_lcd_fb_disp_get_source_ops(
 	src_ops->sunxi_lcd_fb_para_write_ops =
 		sunxi_lcd_fb_bsp_disp_lcd_para_write;
 	src_ops->sunxi_lcd_fb_cmd_read_ops = sunxi_lcd_fb_bsp_disp_lcd_cmd_read;
+	src_ops->sunxi_lcd_fb_qspi_cmd_write_ops =
+		sunxi_lcd_fb_bsp_disp_qspi_lcd_cmd_write;
+	src_ops->sunxi_lcd_fb_qspi_para_write_ops =
+		sunxi_lcd_fb_bsp_disp_qspi_lcd_para_write;
+	src_ops->sunxi_lcd_fb_qspi_multi_para_write_ops =
+		sunxi_lcd_fb_bsp_disp_qspi_lcd_multi_para_write;
+	src_ops->sunxi_lcd_fb_qspi_cmd_read_ops =
+		sunxi_lcd_fb_bsp_disp_qspi_lcd_cmd_read;
 	return 0;
 }
 
@@ -231,5 +239,5 @@ module_exit(sunxi_lcd_fb_module_exit);
 MODULE_AUTHOR("zhengxiaobin <zhengxiaobin@allwinnertech.com>");
 MODULE_AUTHOR("zhangyuanjing <zhangyuanjing@allwinnertech.com>");
 MODULE_DESCRIPTION("sunxi lcd fb module");
-MODULE_VERSION("1.0.1");
+MODULE_VERSION("1.0.2");
 MODULE_LICENSE("GPL");
diff --git a/drivers/video/sunxi/lcd_fb/disp_display.c b/drivers/video/sunxi/lcd_fb/disp_display.c
index 381cd0513..74895ce3a 100644
--- a/drivers/video/sunxi/lcd_fb/disp_display.c
+++ b/drivers/video/sunxi/lcd_fb/disp_display.c
@@ -50,8 +50,7 @@ s32 sunxi_lcd_fb_bsp_disp_get_screen_physical_height(u32 disp)
 	return height;
 }
 
-s32 sunxi_lcd_fb_bsp_disp_lcd_set_layer(u32 disp,
-						     struct fb_info *p_info)
+s32 sunxi_lcd_fb_bsp_disp_lcd_set_layer(u32 disp, struct fb_info *p_info)
 {
 	struct sunxi_lcd_fb_device *lcd;
 
@@ -77,8 +76,7 @@ s32 sunxi_lcd_fb_bsp_disp_lcd_wait_for_vsync(u32 disp)
 	return lcd->wait_for_vsync(lcd);
 }
 
-s32 sunxi_lcd_fb_bsp_disp_lcd_set_var(u32 disp,
-						   struct fb_info *p_info)
+s32 sunxi_lcd_fb_bsp_disp_lcd_set_var(u32 disp, struct fb_info *p_info)
 {
 	struct sunxi_lcd_fb_device *lcd;
 
@@ -309,9 +307,7 @@ s32 sunxi_lcd_fb_bsp_disp_lcd_pin_cfg(u32 disp, u32 en)
 	return ret;
 }
 
-s32 sunxi_lcd_fb_bsp_disp_lcd_gpio_set_value(u32 disp,
-							  u32 io_index,
-							  u32 value)
+s32 sunxi_lcd_fb_bsp_disp_lcd_gpio_set_value(u32 disp, u32 io_index, u32 value)
 {
 	int ret = -1;
 	struct sunxi_lcd_fb_device *lcd;
@@ -323,9 +319,8 @@ s32 sunxi_lcd_fb_bsp_disp_lcd_gpio_set_value(u32 disp,
 	return ret;
 }
 
-s32 sunxi_lcd_fb_bsp_disp_lcd_gpio_set_direction(u32 disp,
-								  u32 io_index,
-								  u32 direction)
+s32 sunxi_lcd_fb_bsp_disp_lcd_gpio_set_direction(u32 disp, u32 io_index,
+						 u32 direction)
 {
 	int ret = -1;
 	struct sunxi_lcd_fb_device *lcd;
@@ -375,7 +370,7 @@ struct sunxi_lcd_fb_device *sunxi_sunxi_lcd_fb_device_get(int disp)
 {
 	struct sunxi_lcd_fb_device *dispdev = NULL;
 
-	list_for_each_entry(dispdev, &device_list, list) {
+	list_for_each_entry (dispdev, &device_list, list) {
 		if (dispdev->disp == disp) {
 			return dispdev;
 		}
@@ -395,9 +390,9 @@ void *sunxi_lcd_fb_dma_malloc(u32 num_bytes, void *phys_addr)
 	if (num_bytes != 0) {
 		actual_bytes = MY_BYTE_ALIGN(num_bytes);
 
-		address = dma_alloc_coherent(g_drv_info.device, actual_bytes,
-					     (dma_addr_t *)phys_addr,
-					     GFP_KERNEL);
+		address =
+			dma_alloc_coherent(g_drv_info.device, actual_bytes,
+					   (dma_addr_t *)phys_addr, GFP_KERNEL);
 		if (address) {
 			LCDFB_INF(
 				"dma_alloc_coherent ok, address=0x%p, size=0x%x\n",
@@ -450,15 +445,65 @@ s32 sunxi_lcd_fb_bsp_disp_lcd_para_write(u32 screen_id, u8 para)
 	return ret;
 }
 
-s32 sunxi_lcd_fb_bsp_disp_lcd_cmd_read(u32 screen_id, u8 cmd,
-						    u8 *rx_buf, u8 len)
+s32 sunxi_lcd_fb_bsp_disp_lcd_cmd_read(u32 screen_id, u8 cmd, u8 *rx_buf,
+				       u8 len)
 {
 	int ret = -1;
 	struct sunxi_lcd_fb_device *lcd;
 
 	lcd = sunxi_lcd_fb_disp_get_lcd(screen_id);
-	if (lcd && lcd->para_write)
+	if (lcd && lcd->cmd_read)
 		ret = lcd->cmd_read(lcd, cmd, rx_buf, len);
 
 	return ret;
 }
+
+s32 sunxi_lcd_fb_bsp_disp_qspi_lcd_cmd_write(u32 screen_id, u8 cmd)
+{
+	int ret = -1;
+	struct sunxi_lcd_fb_device *lcd;
+
+	lcd = sunxi_lcd_fb_disp_get_lcd(screen_id);
+	if (lcd && lcd->qspi_cmd_write)
+		ret = lcd->qspi_cmd_write(lcd, cmd);
+
+	return ret;
+}
+
+s32 sunxi_lcd_fb_bsp_disp_qspi_lcd_para_write(u32 screen_id, u8 cmd, u8 para)
+{
+	int ret = -1;
+	struct sunxi_lcd_fb_device *lcd;
+
+	lcd = sunxi_lcd_fb_disp_get_lcd(screen_id);
+	if (lcd && lcd->qspi_para_write)
+		ret = lcd->qspi_para_write(lcd, cmd, para);
+
+	return ret;
+}
+
+s32 sunxi_lcd_fb_bsp_disp_qspi_lcd_multi_para_write(u32 screen_id, u8 cmd,
+						    u8 *tx_buf, u32 len)
+{
+	int ret = -1;
+	struct sunxi_lcd_fb_device *lcd;
+
+	lcd = sunxi_lcd_fb_disp_get_lcd(screen_id);
+	if (lcd && lcd->qspi_multi_para_write)
+		ret = lcd->qspi_multi_para_write(lcd, cmd, tx_buf, len);
+
+	return ret;
+}
+
+s32 sunxi_lcd_fb_bsp_disp_qspi_lcd_cmd_read(u32 screen_id, u8 cmd, u8 *rx_buf,
+					    u8 len)
+{
+	int ret = -1;
+	struct sunxi_lcd_fb_device *lcd;
+
+	lcd = sunxi_lcd_fb_disp_get_lcd(screen_id);
+	if (lcd && lcd->qspi_cmd_read)
+		ret = lcd->qspi_cmd_read(lcd, cmd, rx_buf, len);
+
+	return ret;
+}
diff --git a/drivers/video/sunxi/lcd_fb/disp_display.h b/drivers/video/sunxi/lcd_fb/disp_display.h
index 4d161adf8..425887d54 100644
--- a/drivers/video/sunxi/lcd_fb/disp_display.h
+++ b/drivers/video/sunxi/lcd_fb/disp_display.h
@@ -53,8 +53,7 @@ s32 sunxi_lcd_fb_bsp_disp_lcd_pwm_disable(u32 disp);
 
 s32 sunxi_lcd_fb_bsp_disp_lcd_power_enable(u32 disp, u32 power_id);
 
-s32 sunxi_lcd_fb_bsp_disp_lcd_power_disable(u32 disp,
-							 u32 power_id);
+s32 sunxi_lcd_fb_bsp_disp_lcd_power_disable(u32 disp, u32 power_id);
 
 s32 sunxi_lcd_fb_bsp_disp_lcd_set_bright(u32 disp, u32 bright);
 
@@ -62,12 +61,10 @@ s32 sunxi_lcd_fb_bsp_disp_lcd_get_bright(u32 disp);
 
 s32 sunxi_lcd_fb_bsp_disp_lcd_pin_cfg(u32 disp, u32 en);
 
-s32 sunxi_lcd_fb_bsp_disp_lcd_gpio_set_value(u32 disp,
-							  u32 io_index,
-							  u32 value);
+s32 sunxi_lcd_fb_bsp_disp_lcd_gpio_set_value(u32 disp, u32 io_index, u32 value);
 
-s32 sunxi_lcd_fb_bsp_disp_lcd_gpio_set_direction(
-	u32 disp, u32 io_index, u32 direction);
+s32 sunxi_lcd_fb_bsp_disp_lcd_gpio_set_direction(u32 disp, u32 io_index,
+						 u32 direction);
 
 struct sunxi_lcd_fb_disp_lcd_flow *bsp_disp_lcd_get_open_flow(u32 disp);
 
@@ -88,20 +85,28 @@ s32 sunxi_sunxi_lcd_fb_device_register(struct sunxi_lcd_fb_device *dispdev);
 
 s32 sunxi_sunxi_lcd_fb_device_unregister(struct sunxi_lcd_fb_device *dispdev);
 
-s32 sunxi_lcd_fb_bsp_disp_lcd_set_layer(u32 disp,
-						     struct fb_info *p_info);
+s32 sunxi_lcd_fb_bsp_disp_lcd_set_layer(u32 disp, struct fb_info *p_info);
 
 s32 sunxi_lcd_fb_bsp_disp_lcd_blank(u32 disp, u32 en);
 
-s32 sunxi_lcd_fb_bsp_disp_lcd_set_var(u32 disp,
-						   struct fb_info *p_info);
+s32 sunxi_lcd_fb_bsp_disp_lcd_set_var(u32 disp, struct fb_info *p_info);
 
 s32 sunxi_lcd_fb_bsp_disp_lcd_cmd_write(u32 screen_id, u8 cmd);
 
 s32 sunxi_lcd_fb_bsp_disp_lcd_para_write(u32 screen_id, u8 para);
 
-s32 sunxi_lcd_fb_bsp_disp_lcd_cmd_read(u32 screen_id, u8 cmd,
-						    u8 *rx_buf, u8 len);
+s32 sunxi_lcd_fb_bsp_disp_lcd_cmd_read(u32 screen_id, u8 cmd, u8 *rx_buf,
+				       u8 len);
+
+s32 sunxi_lcd_fb_bsp_disp_qspi_lcd_cmd_write(u32 screen_id, u8 cmd);
+
+s32 sunxi_lcd_fb_bsp_disp_qspi_lcd_para_write(u32 screen_id, u8 cmd, u8 para);
+
+s32 sunxi_lcd_fb_bsp_disp_qspi_lcd_multi_para_write(u32 screen_id, u8 cmd,
+						    u8 *tx_buf, u32 len);
+
+s32 sunxi_lcd_fb_bsp_disp_qspi_lcd_cmd_read(u32 screen_id, u8 cmd, u8 *rx_buf,
+					    u8 len);
 
 s32 sunxi_lcd_fb_bsp_disp_lcd_wait_for_vsync(u32 disp);
 
diff --git a/drivers/video/sunxi/lcd_fb/panels/Kconfig b/drivers/video/sunxi/lcd_fb/panels/Kconfig
index 012b1e0ee..4fd9256d3 100644
--- a/drivers/video/sunxi/lcd_fb/panels/Kconfig
+++ b/drivers/video/sunxi/lcd_fb/panels/Kconfig
@@ -22,3 +22,10 @@ config LCD_SUPPORT_NV3029S
 	default n
 	help
 		If you want to support nv3029s panel for display driver, select it.
+
+config LCD_SUPPORT_ST77916_QSPI
+	bool "LCD support ST77916 QSPI panel"
+	default n
+	help
+		If you want to support ST77916 QSPI panel for display driver, select it.
+
diff --git a/drivers/video/sunxi/lcd_fb/panels/lcd_source.h b/drivers/video/sunxi/lcd_fb/panels/lcd_source.h
index 9c4995689..f2694460a 100644
--- a/drivers/video/sunxi/lcd_fb/panels/lcd_source.h
+++ b/drivers/video/sunxi/lcd_fb/panels/lcd_source.h
@@ -20,10 +20,6 @@ struct sunxi_lcd_drv {
 
 extern struct sunxi_lcd_drv g_lcd_fb_drv;
 
-/**
- * sunxi_lcd_delay_ms.
- * @ms: Delay time, unit: millisecond.
- */
 static inline s32 sunxi_lcd_panel_delay_ms(u32 ms)
 {
 	return g_lcd_fb_drv.src_ops.sunxi_lcd_fb_delay_ms_ops(ms);
@@ -31,10 +27,6 @@ static inline s32 sunxi_lcd_panel_delay_ms(u32 ms)
 	return -1;
 }
 
-/**
-  * sunxi_lcd_delay_us.
-  * @us: Delay time, unit: microsecond.
-  */
 static inline s32 sunxi_lcd_panel_delay_us(u32 us)
 {
 	return g_lcd_fb_drv.src_ops.sunxi_lcd_fb_delay_us_ops(us);
@@ -42,10 +34,6 @@ static inline s32 sunxi_lcd_panel_delay_us(u32 us)
 	return -1;
 }
 
-/**
-  * sunxi_lcd_backlight_enable - enable the backlight of panel.
-  * @screen_id: The index of screen.
-  */
 static inline void sunxi_lcd_panel_backlight_enable(u32 screen_id)
 {
 	if (g_lcd_fb_drv.src_ops.sunxi_lcd_fb_backlight_enable_ops)
@@ -53,10 +41,6 @@ static inline void sunxi_lcd_panel_backlight_enable(u32 screen_id)
 			screen_id);
 }
 
-/**
-  * sunxi_lcd_backlight_disable - disable the backlight of panel.
-  * @screen_id: The index of screen.
-  */
 static inline void sunxi_lcd_panel_backlight_disable(u32 screen_id)
 {
 	if (g_lcd_fb_drv.src_ops.sunxi_lcd_fb_backlight_disable_ops)
@@ -64,11 +48,6 @@ static inline void sunxi_lcd_panel_backlight_disable(u32 screen_id)
 			screen_id);
 }
 
-/**
-  * sunxi_lcd_power_enable - enable the power of panel.
-  * @screen_id: The index of screen.
-  * @pwr_id:     The index of power
-  */
 static inline void sunxi_lcd_panel_power_enable(u32 screen_id, u32 pwr_id)
 {
 	if (g_lcd_fb_drv.src_ops.sunxi_lcd_fb_power_enable_ops)
@@ -76,11 +55,6 @@ static inline void sunxi_lcd_panel_power_enable(u32 screen_id, u32 pwr_id)
 								   pwr_id);
 }
 
-/**
-  * sunxi_lcd_power_disable - disable the power of panel.
-  * @screen_id: The index of screen.
-  * @pwr_id:     The index of power
-  */
 static inline void sunxi_lcd_panel_power_disable(u32 screen_id, u32 pwr_id)
 {
 	if (g_lcd_fb_drv.src_ops.sunxi_lcd_fb_power_disable_ops)
@@ -88,12 +62,6 @@ static inline void sunxi_lcd_panel_power_disable(u32 screen_id, u32 pwr_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
-  */
 static inline s32 sunxi_lcd_panel_pwm_enable(u32 screen_id)
 {
 	if (g_lcd_fb_drv.src_ops.sunxi_lcd_fb_pwm_enable_ops)
@@ -103,10 +71,6 @@ static inline s32 sunxi_lcd_panel_pwm_enable(u32 screen_id)
 	return -1;
 }
 
-/**
-  * sunxi_lcd_pwm_disable - disable pwm modules, stop output pwm wave.
-  * @screen_id: The index of screen.
-  */
 static inline s32 sunxi_lcd_panel_pwm_disable(u32 screen_id)
 {
 	if (g_lcd_fb_drv.src_ops.sunxi_lcd_fb_pwm_disable_ops)
@@ -116,11 +80,6 @@ static inline s32 sunxi_lcd_panel_pwm_disable(u32 screen_id)
 	return -1;
 }
 
-/**
-  * sunxi_lcd_set_panel_funs -  set panel functions.
-  * @name: The panel driver name.
-  * @lcd_cfg: The functions.
-  */
 static inline s32
 sunxi_lcd_panel_set_panel_funs(char *name,
 			       struct sunxi_lcd_fb_disp_lcd_panel_fun *lcd_cfg)
@@ -132,11 +91,7 @@ sunxi_lcd_panel_set_panel_funs(char *name,
 	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
-  */
+
 static inline s32 sunxi_lcd_panel_pin_cfg(u32 screen_id, u32 bon)
 {
 	if (g_lcd_fb_drv.src_ops.sunxi_lcd_fb_pin_cfg_ops)
@@ -146,12 +101,6 @@ static inline s32 sunxi_lcd_panel_pin_cfg(u32 screen_id, u32 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
-  */
 static inline s32 sunxi_lcd_panel_gpio_set_value(u32 screen_id, u32 io_index,
 						 u32 value)
 {
@@ -162,12 +111,6 @@ static inline s32 sunxi_lcd_panel_gpio_set_value(u32 screen_id, u32 io_index,
 	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
-  */
 static inline s32 sunxi_lcd_panel_gpio_set_direction(u32 screen_id,
 						     u32 io_index, u32 direct)
 {
@@ -178,11 +121,6 @@ static inline s32 sunxi_lcd_panel_gpio_set_direction(u32 screen_id,
 	return -1;
 }
 
-/**
-  * sunxi_lcd_cmd_write
-  * @screen_id: The index of screen.
-  * @cmd:  command to be send
-  */
 static inline s32 sunxi_lcd_panel_cmd_write(u32 screen_id, u8 cmd)
 {
 	if (g_lcd_fb_drv.src_ops.sunxi_lcd_fb_cmd_write_ops)
@@ -192,11 +130,6 @@ static inline s32 sunxi_lcd_panel_cmd_write(u32 screen_id, u8 cmd)
 	return -1;
 }
 
-/**
-  * sunxi_lcd_para_write
-  * @screen_id: The index of screen.
-  * @para:  para to be writed
-  */
 static inline s32 sunxi_lcd_panel_para_write(u32 screen_id, u8 para)
 {
 	if (g_lcd_fb_drv.src_ops.sunxi_lcd_fb_para_write_ops)
@@ -206,12 +139,6 @@ static inline s32 sunxi_lcd_panel_para_write(u32 screen_id, u8 para)
 	return -1;
 }
 
-/**
-  * sunxi_lcd_para_write
-  * @screen_id: The index of screen.
-  * @cmd:  command to be read
-  * @len:  length of bytes to be read
-  */
 static inline s32 sunxi_lcd_panel_cmd_read(u32 screen_id, u8 cmd, u8 *rx_buf,
 					   u8 len)
 {
@@ -222,6 +149,44 @@ static inline s32 sunxi_lcd_panel_cmd_read(u32 screen_id, u8 cmd, u8 *rx_buf,
 	return -1;
 }
 
+static inline s32 sunxi_lcd_panel_qspi_cmd_write(u32 screen_id, u8 cmd)
+{
+	if (g_lcd_fb_drv.src_ops.sunxi_lcd_fb_cmd_write_ops)
+		return g_lcd_fb_drv.src_ops.sunxi_lcd_fb_qspi_cmd_write_ops(
+			screen_id, cmd);
+
+	return -1;
+}
+
+
+static inline s32 sunxi_lcd_panel_qspi_para_write(u32 screen_id, u8 cmd, u8 para)
+{
+	if (g_lcd_fb_drv.src_ops.sunxi_lcd_fb_para_write_ops)
+		return g_lcd_fb_drv.src_ops.sunxi_lcd_fb_qspi_para_write_ops(
+			screen_id, cmd, para);
+
+	return -1;
+}
+
+static inline s32 sunxi_lcd_panel_qspi_multi_para_write(u32 screen_id, u8 cmd, u8 *tx_buf, u32 len)
+{
+	if (g_lcd_fb_drv.src_ops.sunxi_lcd_fb_para_write_ops)
+		return g_lcd_fb_drv.src_ops.sunxi_lcd_fb_qspi_multi_para_write_ops(
+			screen_id, cmd, tx_buf, len);
+
+	return -1;
+}
+
+static inline s32 sunxi_lcd_panel_qspi_cmd_read(u32 screen_id, u8 cmd, u8 *rx_buf,
+					   u8 len)
+{
+	if (g_lcd_fb_drv.src_ops.sunxi_lcd_fb_cmd_read_ops)
+		return g_lcd_fb_drv.src_ops.sunxi_lcd_fb_qspi_cmd_read_ops(
+			screen_id, cmd, rx_buf, len);
+
+	return -1;
+}
+
 /* For back port to old Panel Driver */
 #ifndef sunxi_lcd_delay_ms
 #define sunxi_lcd_delay_ms sunxi_lcd_panel_delay_ms
@@ -283,6 +248,22 @@ static inline s32 sunxi_lcd_panel_cmd_read(u32 screen_id, u8 cmd, u8 *rx_buf,
 #define sunxi_lcd_cmd_read sunxi_lcd_panel_cmd_read
 #endif
 
+#ifndef sunxi_lcd_qspi_cmd_write
+#define sunxi_lcd_qspi_cmd_write sunxi_lcd_panel_qspi_cmd_write
+#endif
+
+#ifndef sunxi_lcd_qspi_para_write
+#define sunxi_lcd_qspi_para_write sunxi_lcd_panel_qspi_para_write
+#endif
+
+#ifndef sunxi_lcd_qspi_multi_para_write
+#define sunxi_lcd_qspi_multi_para_write sunxi_lcd_panel_qspi_multi_para_write
+#endif
+
+#ifndef sunxi_lcd_qspi_cmd_read
+#define sunxi_lcd_qspi_cmd_read sunxi_lcd_panel_qspi_cmd_read
+#endif
+
 #ifndef LCD_OPEN_FUNC
 #define LCD_OPEN_FUNC LCD_FB_OPEN_FUNC
 #endif
diff --git a/drivers/video/sunxi/lcd_fb/panels/panels.c b/drivers/video/sunxi/lcd_fb/panels/panels.c
index 03f7da0a4..4c9eafc88 100644
--- a/drivers/video/sunxi/lcd_fb/panels/panels.c
+++ b/drivers/video/sunxi/lcd_fb/panels/panels.c
@@ -24,9 +24,11 @@ struct __lcd_panel *g_lcd_fb_panel_array[] = {
 #if IS_ENABLED(CONFIG_LCD_SUPPORT_KLD2844B)
 	&kld2844b_panel,
 #endif
-
 #if IS_ENABLED(CONFIG_LCD_SUPPORT_NV3029S)
 	&nv3029s_panel,
+#endif
+#if IS_ENABLED(CONFIG_LCD_SUPPORT_ST77916_QSPI)
+	&st77916_qspi_panel,
 #endif
 	NULL,
 };
diff --git a/drivers/video/sunxi/lcd_fb/panels/panels.h b/drivers/video/sunxi/lcd_fb/panels/panels.h
index 5279ec640..ba683f1c1 100644
--- a/drivers/video/sunxi/lcd_fb/panels/panels.h
+++ b/drivers/video/sunxi/lcd_fb/panels/panels.h
@@ -46,4 +46,8 @@ extern struct __lcd_panel kld2844b_panel;
 extern struct __lcd_panel nv3029s_panel;
 #endif
 
+#if IS_ENABLED(CONFIG_LCD_SUPPORT_ST77916_QSPI)
+extern struct __lcd_panel st77916_qspi_panel;
+#endif
+
 #endif
diff --git a/drivers/video/sunxi/lcd_fb/panels/st77916.c b/drivers/video/sunxi/lcd_fb/panels/st77916.c
new file mode 100644
index 000000000..63f42506a
--- /dev/null
+++ b/drivers/video/sunxi/lcd_fb/panels/st77916.c
@@ -0,0 +1,397 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+/* Copyright(c) 2020 - 2023 Allwinner Technology Co.,Ltd. All rights reserved. */
+
+#include "st77916.h"
+
+static void LCD_power_on(u32 sel);
+static void LCD_power_off(u32 sel);
+static void LCD_bl_open(u32 sel);
+static void LCD_bl_close(u32 sel);
+static void LCD_panel_init(u32 sel);
+static void LCD_panel_exit(u32 sel);
+
+#define RESET(s, v) sunxi_lcd_gpio_set_value(s, 0, v)
+#define power_en(sel, val) sunxi_lcd_gpio_set_value(sel, 0, val)
+
+struct sunxi_lcd_fb_disp_panel_para info;
+
+static void address(unsigned int sel, int x, int y, int width, int height)
+{
+	unsigned char reg_para_buf[4];
+	reg_para_buf[0] = (y >> 8) & 0xff;
+	reg_para_buf[1] = y & 0xff;
+	reg_para_buf[2] = (height >> 8) & 0xff;
+	reg_para_buf[3] = height & 0xff;
+	sunxi_lcd_qspi_multi_para_write(sel, 0x2B, reg_para_buf, 4);
+
+	reg_para_buf[0] = (x >> 8) & 0xff;
+	reg_para_buf[1] = x & 0xff;
+	reg_para_buf[2] = (width >> 8) & 0xff;
+	reg_para_buf[3] = width & 0xff;
+	sunxi_lcd_qspi_multi_para_write(sel, 0x2A, reg_para_buf, 4);
+	return;
+}
+
+/* cmd is u8 type, we using u16 as internal control */
+#define REGFLAG_END_OF_TABLE 0xFFFC /* END OF REGISTERS MARKER */
+
+struct lcm_setting_table {
+	u16 cmd;
+	u8 para_list[32];
+	u32 count;
+	u32 delay_ms;
+};
+
+/* clang-format off */
+static struct lcm_setting_table lcm_initialization_setting[] = {
+	{ 0xF0, { 0x28 }, 1, 0 },
+	{ 0xF2, { 0x28 }, 1, 0 },
+	{ 0x73, { 0xF0 }, 1, 0 },
+	{ 0x7C, { 0xD1 }, 1, 0 },
+	{ 0x83, { 0xE0 }, 1, 0 },
+	{ 0x84, { 0x61 }, 1, 0 },
+	{ 0xF2, { 0x82 }, 1, 0 },
+	{ 0xF0, { 0x00 }, 1, 0 },
+	{ 0xF0, { 0x01 }, 1, 0 },
+	{ 0xF1, { 0x01 }, 1, 0 },
+	{ 0xB0, { 0x5E }, 1, 0 },
+	{ 0xB1, { 0x55 }, 1, 0 },
+	{ 0xB2, { 0x24 }, 1, 0 },
+	{ 0xB3, { 0x01 }, 1, 0 },
+	{ 0xB4, { 0x87 }, 1, 0 },
+	{ 0xB5, { 0x44 }, 1, 0 },
+	{ 0xB6, { 0x8B }, 1, 0 },
+	{ 0xB7, { 0x40 }, 1, 0 },
+	{ 0xB8, { 0x86 }, 1, 0 },
+	{ 0xB9, { 0x15 }, 1, 0 },
+	{ 0xBA, { 0x00 }, 1, 0 },
+	{ 0xBB, { 0x08 }, 1, 0 },
+	{ 0xBC, { 0x08 }, 1, 0 },
+	{ 0xBD, { 0x00 }, 1, 0 },
+	{ 0xBE, { 0x00 }, 1, 0 },
+	{ 0xBF, { 0x07 }, 1, 0 },
+	{ 0xC0, { 0x80 }, 1, 0 },
+	{ 0xC1, { 0x10 }, 1, 0 },
+	{ 0xC2, { 0x37 }, 1, 0 },
+	{ 0xC3, { 0x80 }, 1, 0 },
+	{ 0xC4, { 0x10 }, 1, 0 },
+	{ 0xC5, { 0x37 }, 1, 0 },
+	{ 0xC6, { 0xA9 }, 1, 0 },
+	{ 0xC7, { 0x41 }, 1, 0 },
+	{ 0xC8, { 0x01 }, 1, 0 },
+	{ 0xC9, { 0xA9 }, 1, 0 },
+	{ 0xCA, { 0x41 }, 1, 0 },
+	{ 0xCB, { 0x01 }, 1, 0 },
+	{ 0xCC, { 0x7F }, 1, 0 },
+	{ 0xCD, { 0x7F }, 1, 0 },
+	{ 0xCE, { 0xFF }, 1, 0 },
+	{ 0xD0, { 0x91 }, 1, 0 },
+	{ 0xD1, { 0x68 }, 1, 0 },
+	{ 0xD2, { 0x68 }, 1, 0 },
+	{ 0xF5, { 0x00, 0xA5 }, 2, 0 },
+	{ 0xDD, { 0x40 }, 1, 0 },
+	{ 0xDE, { 0x40 }, 1, 0 },
+	{ 0xF1, { 0x10 }, 1, 0 },
+	{ 0xF0, { 0x00 }, 1, 0 },
+	{ 0xF0, { 0x02 }, 1, 0 },
+	{ 0xE0, { 0xF0, 0x10, 0x18, 0x0D, 0x0C, 0x38, 0x3E, 0x44, 0x51, 0x39, 0x15, 0x15, 0x30, 0x34 }, 14, 0 },
+	{ 0xE1, { 0xF0, 0x0F, 0x17, 0x0D, 0x0B, 0x07, 0x3E, 0x33, 0x51, 0x39, 0x15, 0x15, 0x30, 0x34 }, 14, 0 },
+	{ 0xF0, { 0x10 }, 1, 0 },
+	{ 0xF3, { 0x10 }, 1, 0 },
+	{ 0xE0, { 0x08 }, 1, 0 },
+	{ 0xE1, { 0x00 }, 1, 0 },
+	{ 0xE2, { 0x00 }, 1, 0 },
+	{ 0xE3, { 0x00 }, 1, 0 },
+	{ 0xE4, { 0xE0 }, 1, 0 },
+	{ 0xE5, { 0x06 }, 1, 0 },
+	{ 0xE6, { 0x21 }, 1, 0 },
+	{ 0xE7, { 0x03 }, 1, 0 },
+	{ 0xE8, { 0x05 }, 1, 0 },
+	{ 0xE9, { 0x02 }, 1, 0 },
+	{ 0xEA, { 0xE9 }, 1, 0 },
+	{ 0xEB, { 0x00 }, 1, 0 },
+	{ 0xEC, { 0x00 }, 1, 0 },
+	{ 0xED, { 0x14 }, 1, 0 },
+	{ 0xEE, { 0xFF }, 1, 0 },
+	{ 0xEF, { 0x00 }, 1, 0 },
+	{ 0xF8, { 0xFF }, 1, 0 },
+	{ 0xF9, { 0x00 }, 1, 0 },
+	{ 0xFA, { 0x00 }, 1, 0 },
+	{ 0xFB, { 0x30 }, 1, 0 },
+	{ 0xFC, { 0x00 }, 1, 0 },
+	{ 0xFD, { 0x00 }, 1, 0 },
+	{ 0xFE, { 0x00 }, 1, 0 },
+	{ 0xFF, { 0x00 }, 1, 0 },
+	{ 0x60, { 0x40 }, 1, 0 },
+	{ 0x61, { 0x05 }, 1, 0 },
+	{ 0x62, { 0x00 }, 1, 0 },
+	{ 0x63, { 0x42 }, 1, 0 },
+	{ 0x64, { 0xDA }, 1, 0 },
+	{ 0x65, { 0x00 }, 1, 0 },
+	{ 0x66, { 0x00 }, 1, 0 },
+	{ 0x67, { 0x00 }, 1, 0 },
+	{ 0x68, { 0x00 }, 1, 0 },
+	{ 0x69, { 0x00 }, 1, 0 },
+	{ 0x6A, { 0x00 }, 1, 0 },
+	{ 0x6B, { 0x00 }, 1, 0 },
+	{ 0x70, { 0x40 }, 1, 0 },
+	{ 0x71, { 0x04 }, 1, 0 },
+	{ 0x72, { 0x00 }, 1, 0 },
+	{ 0x73, { 0x42 }, 1, 0 },
+	{ 0x74, { 0xD9 }, 1, 0 },
+	{ 0x75, { 0x00 }, 1, 0 },
+	{ 0x76, { 0x00 }, 1, 0 },
+	{ 0x77, { 0x00 }, 1, 0 },
+	{ 0x78, { 0x00 }, 1, 0 },
+	{ 0x79, { 0x00 }, 1, 0 },
+	{ 0x7A, { 0x00 }, 1, 0 },
+	{ 0x7B, { 0x00 }, 1, 0 },
+	{ 0x80, { 0x48 }, 1, 0 },
+	{ 0x81, { 0x00 }, 1, 0 },
+	{ 0x82, { 0x07 }, 1, 0 },
+	{ 0x83, { 0x02 }, 1, 0 },
+	{ 0x84, { 0xD7 }, 1, 0 },
+	{ 0x85, { 0x04 }, 1, 0 },
+	{ 0x86, { 0x00 }, 1, 0 },
+	{ 0x87, { 0x00 }, 1, 0 },
+	{ 0x88, { 0x48 }, 1, 0 },
+	{ 0x89, { 0x00 }, 1, 0 },
+	{ 0x8A, { 0x09 }, 1, 0 },
+	{ 0x8B, { 0x02 }, 1, 0 },
+	{ 0x8C, { 0xD9 }, 1, 0 },
+	{ 0x8D, { 0x04 }, 1, 0 },
+	{ 0x8E, { 0x00 }, 1, 0 },
+	{ 0x8F, { 0x00 }, 1, 0 },
+	{ 0x90, { 0x48 }, 1, 0 },
+	{ 0x91, { 0x00 }, 1, 0 },
+	{ 0x92, { 0x0B }, 1, 0 },
+	{ 0x93, { 0x02 }, 1, 0 },
+	{ 0x94, { 0xDB }, 1, 0 },
+	{ 0x95, { 0x04 }, 1, 0 },
+	{ 0x96, { 0x00 }, 1, 0 },
+	{ 0x97, { 0x00 }, 1, 0 },
+	{ 0x98, { 0x48 }, 1, 0 },
+	{ 0x99, { 0x00 }, 1, 0 },
+	{ 0x9A, { 0x0D }, 1, 0 },
+	{ 0x9B, { 0x02 }, 1, 0 },
+	{ 0x9C, { 0xDD }, 1, 0 },
+	{ 0x9D, { 0x04 }, 1, 0 },
+	{ 0x9E, { 0x00 }, 1, 0 },
+	{ 0x9F, { 0x00 }, 1, 0 },
+	{ 0xA0, { 0x48 }, 1, 0 },
+	{ 0xA1, { 0x00 }, 1, 0 },
+	{ 0xA2, { 0x06 }, 1, 0 },
+	{ 0xA3, { 0x02 }, 1, 0 },
+	{ 0xA4, { 0xD6 }, 1, 0 },
+	{ 0xA5, { 0x04 }, 1, 0 },
+	{ 0xA6, { 0x00 }, 1, 0 },
+	{ 0xA7, { 0x00 }, 1, 0 },
+	{ 0xA8, { 0x48 }, 1, 0 },
+	{ 0xA9, { 0x00 }, 1, 0 },
+	{ 0xAA, { 0x08 }, 1, 0 },
+	{ 0xAB, { 0x02 }, 1, 0 },
+	{ 0xAC, { 0xD8 }, 1, 0 },
+	{ 0xAD, { 0x04 }, 1, 0 },
+	{ 0xAE, { 0x00 }, 1, 0 },
+	{ 0xAF, { 0x00 }, 1, 0 },
+	{ 0xB0, { 0x48 }, 1, 0 },
+	{ 0xB1, { 0x00 }, 1, 0 },
+	{ 0xB2, { 0x0A }, 1, 0 },
+	{ 0xB3, { 0x02 }, 1, 0 },
+	{ 0xB4, { 0xDA }, 1, 0 },
+	{ 0xB5, { 0x04 }, 1, 0 },
+	{ 0xB6, { 0x00 }, 1, 0 },
+	{ 0xB7, { 0x00 }, 1, 0 },
+	{ 0xB8, { 0x48 }, 1, 0 },
+	{ 0xB9, { 0x00 }, 1, 0 },
+	{ 0xBA, { 0x0C }, 1, 0 },
+	{ 0xBB, { 0x02 }, 1, 0 },
+	{ 0xBC, { 0xDC }, 1, 0 },
+	{ 0xBD, { 0x04 }, 1, 0 },
+	{ 0xBE, { 0x00 }, 1, 0 },
+	{ 0xBF, { 0x00 }, 1, 0 },
+	{ 0xC0, { 0x10 }, 1, 0 },
+	{ 0xC1, { 0x47 }, 1, 0 },
+	{ 0xC2, { 0x56 }, 1, 0 },
+	{ 0xC3, { 0x65 }, 1, 0 },
+	{ 0xC4, { 0x74 }, 1, 0 },
+	{ 0xC5, { 0x88 }, 1, 0 },
+	{ 0xC6, { 0x99 }, 1, 0 },
+	{ 0xC7, { 0x01 }, 1, 0 },
+	{ 0xC8, { 0xBB }, 1, 0 },
+	{ 0xC9, { 0xAA }, 1, 0 },
+	{ 0xD0, { 0x10 }, 1, 0 },
+	{ 0xD1, { 0x47 }, 1, 0 },
+	{ 0xD2, { 0x56 }, 1, 0 },
+	{ 0xD3, { 0x65 }, 1, 0 },
+	{ 0xD4, { 0x74 }, 1, 0 },
+	{ 0xD5, { 0x88 }, 1, 0 },
+	{ 0xD6, { 0x99 }, 1, 0 },
+	{ 0xD7, { 0x01 }, 1, 0 },
+	{ 0xD8, { 0xBB }, 1, 0 },
+	{ 0xD9, { 0xAA }, 1, 0 },
+	{ 0xF3, { 0x01 }, 1, 0 },
+	{ 0xF0, { 0x00 }, 1, 0 },
+	{ REGFLAG_END_OF_TABLE, {}, 0, 0 },
+};
+/* clang-format on */
+
+static void LCD_panel_init(unsigned int sel)
+{
+	int i = 0;
+
+	memset(&info, 0, sizeof(info));
+	if (sunxi_lcd_fb_bsp_disp_get_panel_info(sel, &info)) {
+		LCDFB_WRN("get panel info fail!\n");
+		return;
+	}
+
+	// Iterate over the initialization table
+	while (lcm_initialization_setting[i].cmd != REGFLAG_END_OF_TABLE) {
+		u16 cmd = lcm_initialization_setting[i].cmd;
+		u32 para_count = lcm_initialization_setting[i].count;
+		u32 delay_ms = lcm_initialization_setting[i].delay_ms;
+		u8 *para_list = lcm_initialization_setting[i].para_list;
+		if (para_count == 1) {
+			sunxi_lcd_panel_qspi_para_write(sel, (cmd & 0xFF),
+							para_list[0]);
+		} else if (para_count > 1) {
+			sunxi_lcd_panel_qspi_multi_para_write(
+				sel, (cmd & 0xFF), para_list, para_count);
+		} else {
+			sunxi_lcd_panel_qspi_cmd_write(sel, (cmd & 0xFF));
+		}
+		sunxi_lcd_delay_ms(delay_ms);
+		i++;
+	}
+
+	/* set panel format */
+	/* 55----RGB565;66---RGB666 */
+	switch (info.lcd_pixel_fmt) {
+	case LCDFB_FORMAT_RGB_565:
+	case LCDFB_FORMAT_BGR_565:
+		sunxi_lcd_panel_qspi_para_write(sel, 0x3a, 0x55);
+		break;
+	default:
+		sunxi_lcd_panel_qspi_para_write(sel, 0x3a, 0x66);
+		break;
+	}
+
+	/* display on */
+	sunxi_lcd_panel_qspi_cmd_write(sel, 0x21);
+	sunxi_lcd_panel_qspi_cmd_write(sel, 0x11);
+	sunxi_lcd_delay_ms(120);
+	sunxi_lcd_panel_qspi_cmd_write(sel, 0x29);
+}
+
+static void LCD_panel_exit(unsigned int sel)
+{
+	sunxi_lcd_panel_qspi_cmd_write(sel, 0x28);
+	sunxi_lcd_panel_qspi_cmd_write(sel, 0x10);
+}
+
+static s32 LCD_open_flow(u32 sel)
+{
+	LCDFB_HERE;
+	/* open lcd power, and delay 50ms */
+	LCD_OPEN_FUNC(sel, LCD_power_on, 50);
+	/* open lcd power, than delay 200ms */
+	LCD_OPEN_FUNC(sel, LCD_panel_init, 200);
+
+	LCD_OPEN_FUNC(sel, sunxi_lcd_fb_black_screen, 50);
+	/* open lcd backlight, and delay 0ms */
+	LCD_OPEN_FUNC(sel, LCD_bl_open, 0);
+
+	return 0;
+}
+
+static s32 LCD_close_flow(u32 sel)
+{
+	LCDFB_HERE;
+	/* close lcd backlight, and delay 0ms */
+	LCD_CLOSE_FUNC(sel, LCD_bl_close, 50);
+	/* open lcd power, than delay 200ms */
+	LCD_CLOSE_FUNC(sel, LCD_panel_exit, 10);
+	/* close lcd power, and delay 500ms */
+	LCD_CLOSE_FUNC(sel, LCD_power_off, 10);
+
+	return 0;
+}
+
+static void LCD_power_on(u32 sel)
+{
+	/* config lcd_power pin to open lcd power0 */
+	LCDFB_HERE;
+	power_en(sel, 1);
+
+	sunxi_lcd_power_enable(sel, 0);
+
+	sunxi_lcd_pin_cfg(sel, 1);
+	RESET(sel, 1);
+	sunxi_lcd_delay_ms(100);
+	RESET(sel, 0);
+	sunxi_lcd_delay_ms(100);
+	RESET(sel, 1);
+}
+
+static void LCD_power_off(u32 sel)
+{
+	LCDFB_HERE;
+	/* config lcd_power pin to close lcd power0 */
+	sunxi_lcd_power_disable(sel, 0);
+	power_en(sel, 0);
+}
+
+static void LCD_bl_open(u32 sel)
+{
+	sunxi_lcd_pwm_enable(sel);
+	/* config lcd_bl_en pin to open lcd backlight */
+	sunxi_lcd_backlight_enable(sel);
+	LCDFB_HERE;
+}
+
+static void LCD_bl_close(u32 sel)
+{
+	/* config lcd_bl_en pin to close lcd backlight */
+	sunxi_lcd_backlight_disable(sel);
+	sunxi_lcd_pwm_disable(sel);
+	LCDFB_HERE;
+}
+
+/* sel: 0:lcd0; 1:lcd1 */
+static s32 LCD_user_defined_func(u32 sel, u32 para1, u32 para2, u32 para3)
+{
+	LCDFB_HERE;
+	return 0;
+}
+
+static int lcd_set_var(unsigned int sel, struct fb_info *p_info)
+{
+	return 0;
+}
+
+static int lcd_set_addr_win(unsigned int sel, int x, int y, int width,
+			    int height)
+{
+	address(sel, x, y, width, height);
+	return 0;
+}
+
+static int lcd_blank(unsigned int sel, unsigned int en)
+{
+	return 0;
+}
+
+struct __lcd_panel st77916_qspi_panel = {
+	/* panel driver name, must mach the name of lcd_drv_name in sys_config.fex
+	*/
+	.name = "st77916_qspi",
+	.func = {
+		.cfg_open_flow = LCD_open_flow,
+		.cfg_close_flow = LCD_close_flow,
+		.lcd_user_defined_func = LCD_user_defined_func,
+		.blank = lcd_blank,
+		.set_var = lcd_set_var,
+		.set_addr_win = lcd_set_addr_win,
+	},
+};
\ No newline at end of file
diff --git a/drivers/video/sunxi/lcd_fb/panels/st77916.h b/drivers/video/sunxi/lcd_fb/panels/st77916.h
new file mode 100644
index 000000000..eba5c0e8e
--- /dev/null
+++ b/drivers/video/sunxi/lcd_fb/panels/st77916.h
@@ -0,0 +1,11 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+/* Copyright(c) 2020 - 2023 Allwinner Technology Co.,Ltd. All rights reserved. */
+
+#ifndef _ST77916_SPI_H
+#define _ST77916_SPI_H
+
+#include "panels.h"
+
+struct __lcd_panel st77916_qspi_panel;
+
+#endif /* End of file */
-- 
2.25.1

