mfd: display-serdes: update driver version to v11

Signed-off-by: Luo Wei <lw@rock-chips.com>
Change-Id: I29a6ff45df69858e5220e3f030061e86d6ca58fe
This commit is contained in:
Luo Wei
2024-08-16 15:33:58 +08:00
committed by Tao Huang
parent bddc67dd10
commit c5e70bb73e
4 changed files with 56 additions and 11 deletions

View File

@@ -106,7 +106,7 @@
#define SERDES_DBG_CHIP(x...) no_printk(x)
#endif
#define MFD_SERDES_DISPLAY_VERSION "serdes-mfd-displaly-v10-230901"
#define MFD_SERDES_DISPLAY_VERSION "serdes-mfd-displaly-v11-240815"
#define MAX_NUM_SERDES_SPLIT 8
struct serdes;
enum ser_link_mode {

View File

@@ -560,6 +560,10 @@ static int max96745_pinctrl_set_mux(struct serdes *serdes,
GPIO_A_REG(grp->pins[i] - pinctrl->pin_base),
GPIO_OUT_DIS,
FIELD_PREP(GPIO_OUT_DIS, data->gpio_out_dis));
serdes_set_bits(serdes,
GPIO_B_REG(grp->pins[i] - pinctrl->pin_base),
OUT_TYPE,
FIELD_PREP(OUT_TYPE, 1));
if (data->gpio_tx_en_a || data->gpio_tx_en_b)
serdes_set_bits(serdes,
GPIO_B_REG(grp->pins[i] - pinctrl->pin_base),

View File

@@ -15,7 +15,9 @@ static const struct regmap_range max96772_readable_ranges[] = {
regmap_reg_range(0x1700, 0x1700),
regmap_reg_range(0x4100, 0x4100),
regmap_reg_range(0x6230, 0x6230),
regmap_reg_range(0x7014, 0x7016),
regmap_reg_range(0xe75e, 0xe75e),
regmap_reg_range(0xe7c4, 0xe7c6),
regmap_reg_range(0xe776, 0xe7bf),
};
@@ -271,7 +273,7 @@ static struct serdes_chip_pinctrl_info max96772_pinctrl_info = {
.num_functions = ARRAY_SIZE(max96772_functions_desc),
};
static const struct reg_sequence max96772_clk_ref[3][14] = {
static const struct reg_sequence max96772_clk_ref[4][14] = {
{
{ 0xe7b2, 0x50 },
{ 0xe7b3, 0x00 },
@@ -313,10 +315,25 @@ static const struct reg_sequence max96772_clk_ref[3][14] = {
{ 0xe7b9, 0x00 },
{ 0xe7ba, 0x2e },
{ 0xe7bb, 0x00 },
{ 0xe7bc, 0x00 },
{ 0xe7bc, 0x02 },
{ 0xe7bd, 0x01 },
{ 0xe7be, 0x32 },
{ 0xe7bf, 0x00 },
}, {
{ 0xe7b2, 0x30 },
{ 0xe7b3, 0x00 },
{ 0xe7b4, 0x00 },
{ 0xe7b5, 0x40 },
{ 0xe7b6, 0x6c },
{ 0xe7b7, 0x20 },
{ 0xe7b8, 0x14 },
{ 0xe7b9, 0x00 },
{ 0xe7ba, 0x2e },
{ 0xe7bb, 0x00 },
{ 0xe7bc, 0x00 },
{ 0xe7bd, 0x00 },
{ 0xe7be, 0x32 },
{ 0xe7bf, 0x00 },
}
};
@@ -334,11 +351,6 @@ static int max96772_aux_dpcd_read(struct serdes *serdes, unsigned int reg, unsig
return 0;
}
static int max96772_panel_init(struct serdes *serdes)
{
return 0;
}
static int max96772_panel_prepare(struct serdes *serdes)
{
const struct drm_display_mode *mode = &serdes->serdes_panel->mode;
@@ -357,6 +369,10 @@ static int max96772_panel_prepare(struct serdes *serdes)
serdes_reg_write(serdes, 0xe7b1, 0x00);
}
dev_info(serdes->dev, "link_rate=0x%02x, lane_count=0x%02x, ssc=%d\n",
serdes->serdes_panel->link_rate, serdes->serdes_panel->lane_count,
serdes->serdes_panel->ssc);
switch (serdes->serdes_panel->link_rate) {
case DP_LINK_BW_5_4:
serdes_multi_reg_write(serdes, max96772_clk_ref[2],
@@ -445,6 +461,8 @@ static int max96772_panel_enable(struct serdes *serdes)
if (!ret)
return 0;
msleep(50);
ret = max96772_aux_dpcd_read(serdes, DP_LANE0_1_STATUS, &status[0]);
if (ret)
return ret;
@@ -465,13 +483,31 @@ static int max96772_panel_disable(struct serdes *serdes)
}
static struct serdes_chip_panel_ops max96772_panel_ops = {
.init = max96772_panel_init,
.prepare = max96772_panel_prepare,
.unprepare = max96772_panel_unprepare,
.enable = max96772_panel_enable,
.disable = max96772_panel_disable,
};
static int max96772_bridge_pre_enable(struct serdes *serdes)
{
int ret = 0;
SERDES_DBG_CHIP("%s: serdes %s ret=%d\n", __func__,
serdes->chip_data->name, ret);
return ret;
}
static int max96772_bridge_post_disable(struct serdes *serdes)
{
return 0;
}
static struct serdes_chip_bridge_ops max96772_bridge_ops = {
.enable = max96772_bridge_pre_enable,
.disable = max96772_bridge_post_disable,
};
static int max96772_pinctrl_set_mux(struct serdes *serdes,
unsigned int function, unsigned int group)
{
@@ -505,6 +541,10 @@ static int max96772_pinctrl_set_mux(struct serdes *serdes,
FIELD_PREP(GPIO_RX_EN, fdata->gpio_rx_en) |
FIELD_PREP(GPIO_TX_EN, fdata->gpio_tx_en) |
FIELD_PREP(GPIO_OUT, fdata->gpio_out_level));
serdes_set_bits(serdes,
GPIO_B_REG(grp->pins[i] - pinctrl->pin_base),
OUT_TYPE,
FIELD_PREP(OUT_TYPE, 1));
if (fdata->gpio_tx_en)
serdes_set_bits(serdes,
GPIO_B_REG(grp->pins[i] - pinctrl->pin_base),
@@ -765,6 +805,7 @@ struct serdes_chip_data serdes_max96772_data = {
.regmap_config = &max96772_regmap_config,
.pinctrl_info = &max96772_pinctrl_info,
.panel_ops = &max96772_panel_ops,
.bridge_ops = &max96772_bridge_ops,
.pinctrl_ops = &max96772_pinctrl_ops,
.gpio_ops = &max96772_gpio_ops,
.pm_ops = &max96772_pm_ops,

View File

@@ -408,8 +408,8 @@ static int serdes_i2c_probe(struct i2c_client *client,
__func__, dev->of_node->name, serdes->reg_hw, serdes->reg_use);
ret = serdes_set_i2c_address(serdes, serdes->reg_hw,
serdes->reg_use, serdes->link_use);
if (ret != 0)
return ret;
if (ret)
dev_err(dev, "%s failed to set i2c address\n", serdes->chip_data->name);
}
serdes->use_delay_work = of_property_read_bool(dev->of_node, "use-delay-work");