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/rohm/rohm-bu18rl82.c | 68 +++++++++++++++++++++++---------- 1 files changed, 47 insertions(+), 21 deletions(-) diff --git a/kernel/drivers/mfd/display-serdes/rohm/rohm-bu18rl82.c b/kernel/drivers/mfd/display-serdes/rohm/rohm-bu18rl82.c index d0e8f71..385b266 100644 --- a/kernel/drivers/mfd/display-serdes/rohm/rohm-bu18rl82.c +++ b/kernel/drivers/mfd/display-serdes/rohm/rohm-bu18rl82.c @@ -45,6 +45,7 @@ struct serdes_function_data { u8 gpio_rx_en:1; u16 gpio_id; + u16 mdelay; }; static const char *serdes_gpio_groups[] = { @@ -71,6 +72,16 @@ .num_group_names = ARRAY_SIZE(serdes_gpio_groups), \ .data = (void *)(const struct serdes_function_data []) { \ { .gpio_rx_en = 0, .gpio_id = id + 2 } \ + }, \ +} \ + +#define FUNCTION_DES_DELAY_MS(ms) \ +{ \ + .name = "DELAY_"#ms"MS", \ + .group_names = serdes_gpio_groups, \ + .num_group_names = ARRAY_SIZE(serdes_gpio_groups), \ + .data = (void *)(const struct serdes_function_data []) { \ + { .mdelay = ms, } \ }, \ } \ @@ -154,6 +165,12 @@ FUNCTION_DESC_GPIO_OUTPUT_HIGH(), FUNCTION_DESC_GPIO_OUTPUT_LOW(), + + FUNCTION_DES_DELAY_MS(10), + FUNCTION_DES_DELAY_MS(50), + FUNCTION_DES_DELAY_MS(100), + FUNCTION_DES_DELAY_MS(200), + FUNCTION_DES_DELAY_MS(500), }; static struct serdes_chip_pinctrl_info bu18rl82_pinctrl_info = { @@ -203,34 +220,33 @@ static int bu18rl82_bridge_init(struct serdes *serdes) { - return 0; - bu18rl82_bridge_swrst(serdes); return 0; } -static int bu18rl82_bridge_enable(struct serdes *serdes) +static int bu18rl82_bridge_pre_enable(struct serdes *serdes) { int ret = 0; /* 1:enable 0:disable */ bu18rl82_enable_hwint(serdes, 0); + msleep(100); + SERDES_DBG_CHIP("%s: serdes %s ret=%d\n", __func__, serdes->chip_data->name, ret); return ret; } -static int bu18rl82_bridge_disable(struct serdes *serdes) +static int bu18rl82_bridge_post_disable(struct serdes *serdes) { return 0; } static struct serdes_chip_bridge_ops bu18rl82_bridge_ops = { - .init = bu18rl82_bridge_init, - .enable = bu18rl82_bridge_enable, - .disable = bu18rl82_bridge_disable, + .enable = bu18rl82_bridge_pre_enable, + .disable = bu18rl82_bridge_post_disable, }; static int bu18rl82_pinctrl_config_get(struct serdes *serdes, @@ -320,6 +336,7 @@ struct function_desc *func; struct group_desc *grp; int i, offset; + u16 ms; func = pinmux_generic_get_function(pinctrl->pctl, function); if (!func) @@ -335,6 +352,7 @@ if (func->data) { struct serdes_function_data *fdata = func->data; + ms = fdata->mdelay; for (i = 0; i < grp->num_pins; i++) { offset = grp->pins[i] - pinctrl->pin_base; @@ -344,22 +362,29 @@ else SERDES_DBG_CHIP("%s: serdes chip %s gpio_id=0x%x, offset=%d\n", __func__, serdes->chip_data->name, fdata->gpio_id, offset); - serdes_set_bits(serdes, bu18rl82_gpio_oen[offset].reg, - bu18rl82_gpio_oen[offset].mask, - FIELD_PREP(BIT(3), fdata->gpio_rx_en)); - serdes_set_bits(serdes, bu18rl82_gpio_id_low[offset].reg, - bu18rl82_gpio_id_low[offset].mask, - FIELD_PREP(GENMASK(7, 0), - (fdata->gpio_id & 0xff))); + if (!ms) { + serdes_set_bits(serdes, bu18rl82_gpio_oen[offset].reg, + bu18rl82_gpio_oen[offset].mask, + FIELD_PREP(BIT(3), fdata->gpio_rx_en)); - serdes_set_bits(serdes, bu18rl82_gpio_id_high[offset].reg, - bu18rl82_gpio_id_high[offset].mask, - FIELD_PREP(GENMASK(2, 0), - ((fdata->gpio_id >> 8) & 0x7))); - serdes_set_bits(serdes, bu18rl82_gpio_pden[offset].reg, - bu18rl82_gpio_pden[offset].mask, - FIELD_PREP(BIT(4), 0)); + serdes_set_bits(serdes, bu18rl82_gpio_id_low[offset].reg, + bu18rl82_gpio_id_low[offset].mask, + FIELD_PREP(GENMASK(7, 0), + (fdata->gpio_id & 0xff))); + + serdes_set_bits(serdes, bu18rl82_gpio_id_high[offset].reg, + bu18rl82_gpio_id_high[offset].mask, + FIELD_PREP(GENMASK(2, 0), + ((fdata->gpio_id >> 8) & 0x7))); + serdes_set_bits(serdes, bu18rl82_gpio_pden[offset].reg, + bu18rl82_gpio_pden[offset].mask, + FIELD_PREP(BIT(4), 0)); + } else { + mdelay(ms); + SERDES_DBG_CHIP("%s: delay %d ms\n", + __func__, ms); + } } } @@ -447,6 +472,7 @@ .serdes_id = ROHM_ID_BU18RL82, .bridge_type = TYPE_BRIDGE_BRIDGE, .connector_type = DRM_MODE_CONNECTOR_LVDS, + .chip_init = bu18rl82_bridge_init, .regmap_config = &bu18rl82_regmap_config, .pinctrl_info = &bu18rl82_pinctrl_info, .bridge_ops = &bu18rl82_bridge_ops, -- Gitblit v1.6.2