From 2f7c68cb55ecb7331f2381deb497c27155f32faf Mon Sep 17 00:00:00 2001
From: hc <hc@nodka.com>
Date: Wed, 03 Jan 2024 09:43:39 +0000
Subject: [PATCH] update kernel to 5.10.198

---
 kernel/drivers/mfd/display-serdes/core.h |   90 +++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 86 insertions(+), 4 deletions(-)

diff --git a/kernel/drivers/mfd/display-serdes/core.h b/kernel/drivers/mfd/display-serdes/core.h
index 28f9945..8563ae5 100644
--- a/kernel/drivers/mfd/display-serdes/core.h
+++ b/kernel/drivers/mfd/display-serdes/core.h
@@ -46,6 +46,7 @@
 #include <drm/drm_of.h>
 #include <drm/drm_connector.h>
 #include <drm/drm_probe_helper.h>
+#include <drm/drm_dp_helper.h>
 #include <drm/drm_device.h>
 #include <drm/drm_modes.h>
 #include <drm/drm_atomic_state_helper.h>
@@ -69,6 +70,8 @@
 #include "../../../../drivers/pinctrl/pinconf.h"
 #include "../../../../drivers/pinctrl/pinmux.h"
 #include "../../../../drivers/gpio/gpiolib.h"
+#include "../../../../drivers/extcon/extcon.h"
+#include "../../../../drivers/base/regmap/internal.h"
 
 /*
 * if enable all the debug information,
@@ -99,8 +102,15 @@
 #endif
 
 #define MFD_SERDES_DISPLAY_VERSION "serdes-mfd-displaly-v10-230901"
-
+#define MAX_NUM_SERDES_SPLIT 8
 struct serdes;
+enum ser_link_mode {
+	SER_DUAL_LINK,
+	SER_LINKA,
+	SER_LINKB,
+	SER_SPLITTER_MODE,
+};
+
 struct serdes_chip_pinctrl_info {
 	struct pinctrl_pin_desc *pins;
 	unsigned int num_pins;
@@ -160,6 +170,12 @@
 	int (*to_irq)(struct serdes *serdes, int gpio);
 };
 
+struct serdes_chip_split_ops {
+	int (*select)(struct serdes *serdes, int chan);
+	int (*deselect)(struct serdes *serdes, int chan);
+	int (*set_i2c_addr)(struct serdes *serdes, int address, int link);
+};
+
 struct serdes_chip_pm_ops {
 	/* serdes chip function for suspend and resume */
 	int (*suspend)(struct serdes *serdes);
@@ -188,12 +204,14 @@
 	int same_chip_count;
 	u8 bank_num;
 
+	int (*chip_init)(struct serdes *serdes);
 	struct regmap_config *regmap_config;
 	struct serdes_chip_pinctrl_info *pinctrl_info;
 	struct serdes_chip_bridge_ops *bridge_ops;
 	struct serdes_chip_panel_ops *panel_ops;
 	struct serdes_chip_pinctrl_ops *pinctrl_ops;
 	struct serdes_chip_gpio_ops *gpio_ops;
+	struct serdes_chip_split_ops *split_ops;
 	struct serdes_chip_pm_ops *pm_ops;
 	struct serdes_chip_irq_ops *irq_ops;
 };
@@ -237,7 +255,35 @@
 	struct serdes *parent;
 	struct regmap *regmap;
 	struct mipi_dsi_device *dsi;
-	struct device_node *dsi_node;
+	struct device_node *remote_node;
+	struct drm_display_mode mode;
+	struct backlight_device *backlight;
+	struct serdes_init_seq *serdes_init_seq;
+	bool sel_mipi;
+	bool dv_swp_ab;
+	bool dpi_deskew_en;
+	bool split_mode;
+	u32 num_lanes;
+	u32 dsi_lane_map[4];
+};
+
+struct serdes_panel_split {
+	struct drm_panel panel;
+	enum drm_connector_status status;
+	struct drm_connector connector;
+
+	const char *name;
+	u32 width_mm;
+	u32 height_mm;
+	u32 link_rate;
+	u32 lane_count;
+	bool ssc;
+
+	struct device *dev;
+	struct serdes *parent;
+	struct regmap *regmap;
+	struct mipi_dsi_device *dsi;
+	struct device_node *remote_node;
 	struct drm_display_mode mode;
 	struct backlight_device *backlight;
 	struct serdes_init_seq *serdes_init_seq;
@@ -261,7 +307,7 @@
 	struct serdes *parent;
 	struct regmap *regmap;
 	struct mipi_dsi_device *dsi;
-	struct device_node *dsi_node;
+	struct device_node *remote_node;
 	struct drm_display_mode mode;
 	struct backlight_device *backlight;
 
@@ -269,6 +315,29 @@
 	bool dv_swp_ab;
 	bool dpi_deskew_en;
 	bool split_mode;
+	u32 num_lanes;
+	u32 dsi_lane_map[4];
+};
+
+struct serdes_bridge_split {
+	struct drm_bridge base_bridge;
+	struct drm_bridge *next_bridge;
+	enum drm_connector_status status;
+	atomic_t triggered;
+	struct drm_connector connector;
+	struct drm_panel *panel;
+
+	struct device *dev;
+	struct serdes *parent;
+	struct regmap *regmap;
+	struct mipi_dsi_device *dsi;
+	struct device_node *remote_node;
+	struct drm_display_mode mode;
+	struct backlight_device *backlight;
+
+	bool sel_mipi;
+	bool dv_swp_ab;
+	bool dpi_deskew_en;
 	u32 num_lanes;
 	u32 dsi_lane_map[4];
 };
@@ -303,13 +372,25 @@
 	struct delayed_work mfd_delay_work;
 	bool route_enable;
 	bool use_delay_work;
+
+	bool split_mode_enable;
+	unsigned int reg_hw;
+	unsigned int reg_use;
+	unsigned int link_use;
+	unsigned int id_serdes_bridge_split;
+	unsigned int id_serdes_panel_split;
+	struct serdes *g_serdes_bridge_split;
+
 	struct pinctrl *pinctrl_node;
 	struct pinctrl_state *pins_default;
+	struct pinctrl_state *pins_init;
 	struct pinctrl_state *pins_sleep;
 
 	struct serdes_init_seq *serdes_init_seq;
 	struct serdes_bridge *serdes_bridge;
+	struct serdes_bridge_split *serdes_bridge_split;
 	struct serdes_panel *serdes_panel;
+	struct serdes_panel_split *serdes_panel_split;
 	struct serdes_pinctrl *pinctrl;
 	struct serdes_chip_data *chip_data;
 };
@@ -334,7 +415,8 @@
 int serdes_set_pinctrl_sleep(struct serdes *serdes);
 int serdes_device_suspend(struct serdes *serdes);
 int serdes_device_resume(struct serdes *serdes);
-void serdes_device_shutdown(struct serdes *serdes);
+void serdes_device_poweroff(struct serdes *serdes);
+int serdes_device_shutdown(struct serdes *serdes);
 int serdes_irq_init(struct serdes *serdes);
 void serdes_irq_exit(struct serdes *serdes);
 void serdes_auxadc_init(struct serdes *serdes);

--
Gitblit v1.6.2