drm/bridge: lt8912b: Add power supplies

Add supplies to the driver that can be used to turn the Lontium lt8912b
on and off. It can have up to 7 independent supplies, we add them all
and enable/disable them with bulk_enable/disable.

Signed-off-by: Stefan Eichenberger <stefan.eichenberger@toradex.com>
Signed-off-by: Francesco Dolcini <francesco.dolcini@toradex.com>
Reviewed-by: Robert Foss <rfoss@kernel.org>
Signed-off-by: Robert Foss <rfoss@kernel.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20231115121338.22959-4-francesco@dolcini.it
This commit is contained in:
Stefan Eichenberger 2023-11-15 13:13:38 +01:00 committed by Robert Foss
parent f168c7f7d1
commit f6d8a80f1d
No known key found for this signature in database
GPG key ID: 3EFD900F76D1D784

View file

@ -43,6 +43,8 @@ struct lt8912 {
struct videomode mode;
struct regulator_bulk_data supplies[7];
u8 data_lanes;
bool is_power_on;
};
@ -257,6 +259,12 @@ static int lt8912_free_i2c(struct lt8912 *lt)
static int lt8912_hard_power_on(struct lt8912 *lt)
{
int ret;
ret = regulator_bulk_enable(ARRAY_SIZE(lt->supplies), lt->supplies);
if (ret)
return ret;
gpiod_set_value_cansleep(lt->gp_reset, 0);
msleep(20);
@ -267,6 +275,9 @@ static void lt8912_hard_power_off(struct lt8912 *lt)
{
gpiod_set_value_cansleep(lt->gp_reset, 1);
msleep(20);
regulator_bulk_disable(ARRAY_SIZE(lt->supplies), lt->supplies);
lt->is_power_on = false;
}
@ -661,6 +672,21 @@ static int lt8912_bridge_suspend(struct device *dev)
static DEFINE_SIMPLE_DEV_PM_OPS(lt8912_bridge_pm_ops, lt8912_bridge_suspend, lt8912_bridge_resume);
static int lt8912_get_regulators(struct lt8912 *lt)
{
unsigned int i;
const char * const supply_names[] = {
"vdd", "vccmipirx", "vccsysclk", "vcclvdstx",
"vcchdmitx", "vcclvdspll", "vcchdmipll"
};
for (i = 0; i < ARRAY_SIZE(lt->supplies); i++)
lt->supplies[i].supply = supply_names[i];
return devm_regulator_bulk_get(lt->dev, ARRAY_SIZE(lt->supplies),
lt->supplies);
}
static int lt8912_parse_dt(struct lt8912 *lt)
{
struct gpio_desc *gp_reset;
@ -712,6 +738,10 @@ static int lt8912_parse_dt(struct lt8912 *lt)
goto err_free_host_node;
}
ret = lt8912_get_regulators(lt);
if (ret)
goto err_free_host_node;
of_node_put(port_node);
return 0;