struct i2c_client *client;
struct regmap *regmap;
struct gpio_desc *reset_gpio;
- bool running;
+ u16 level;
};
static const struct regmap_config aw86927_regmap_config = {
if (!level)
level = effect->u.rumble.weak_magnitude;
- /* If already running, don't restart playback */
- if (haptics->running && level)
+ /* If level does not change, don't restart playback */
+ if (haptics->level == level)
return 0;
- haptics->running = level;
+ haptics->level = level;
+
schedule_work(&haptics->play_work);
return 0;
if (err)
return err;
- /* set gain to value lower than 0x80 to avoid distorted playback */
- err = regmap_write(haptics->regmap, AW86927_PLAYCFG2_REG, 0x7c);
+ err = regmap_write(haptics->regmap, AW86927_PLAYCFG2_REG, haptics->level * 0x80 / 0xffff);
if (err)
return err;
struct device *dev = &haptics->client->dev;
int err;
- if (haptics->running)
+ if (haptics->level)
err = aw86927_play_sine(haptics);
else
err = aw86927_stop(haptics);