Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e25547f8 authored by Leonard Crestez's avatar Leonard Crestez Committed by Lee Jones
Browse files

mfd: bd718x7: Make power button press duration configurable



Allow overwriting the values in BD718XX_REG_PWRONCONFIG0 and
BD718XX_REG_PWRONCONFIG1 via devicetree. Read values in milliseconds and
attempt to round them to something supported by the hardware.

Keep existing values (from bootloader or OTP) if property is not
present.

Signed-off-by: default avatarLeonard Crestez <leonard.crestez@nxp.com>
Reviewed-By: default avatarMatti Vaittinen <matti.vaittinen@fi.rohmeurope.com>
[Lee: Fixed-up merge/API conflict]
Signed-off-by: default avatarLee Jones <lee.jones@linaro.org>
parent 907bf9d6
Loading
Loading
Loading
Loading
+42 −0
Original line number Diff line number Diff line
@@ -81,6 +81,44 @@ static const struct regmap_config bd718xx_regmap_config = {
	.cache_type = REGCACHE_RBTREE,
};

static int bd718xx_init_press_duration(struct bd718xx *bd718xx)
{
	struct device* dev = bd718xx->chip.dev;
	u32 short_press_ms, long_press_ms;
	u32 short_press_value, long_press_value;
	int ret;

	ret = of_property_read_u32(dev->of_node, "rohm,short-press-ms",
				   &short_press_ms);
	if (!ret) {
		short_press_value = min(15u, (short_press_ms + 250) / 500);
		ret = regmap_update_bits(bd718xx->chip.regmap,
					 BD718XX_REG_PWRONCONFIG0,
					 BD718XX_PWRBTN_PRESS_DURATION_MASK,
					 short_press_value);
		if (ret) {
			dev_err(dev, "Failed to init pwron short press\n");
			return ret;
		}
	}

	ret = of_property_read_u32(dev->of_node, "rohm,long-press-ms",
				   &long_press_ms);
	if (!ret) {
		long_press_value = min(15u, (long_press_ms + 500) / 1000);
		ret = regmap_update_bits(bd718xx->chip.regmap,
					 BD718XX_REG_PWRONCONFIG1,
					 BD718XX_PWRBTN_PRESS_DURATION_MASK,
					 long_press_value);
		if (ret) {
			dev_err(dev, "Failed to init pwron long press\n");
			return ret;
		}
	}

	return 0;
}

static int bd718xx_i2c_probe(struct i2c_client *i2c,
			    const struct i2c_device_id *id)
{
@@ -118,6 +156,10 @@ static int bd718xx_i2c_probe(struct i2c_client *i2c,
		return ret;
	}

	ret = bd718xx_init_press_duration(bd718xx);
	if (ret)
		return ret;

	ret = regmap_irq_get_virq(bd718xx->irq_data, BD718XX_INT_PWRBTN_S);

	if (ret < 0) {