mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-11 15:11:48 -04:00
haptics: awinic: add haptic context while flat-up
-1, add haptic context whild flat-up reduce the gain of vibration -2, disable this feature when the bootmode is factory Change-Id: I7c99cc9ffe257020176e51dd72f16da852315d36 Signed-off-by: xuwt2 <xuwt2@lenovo.com> Reviewed-on: https://gerrit.mot.com/1263466 SLTApproved: Slta Waiver SME-Granted: SME Approvals Granted Tested-by: Jira Key Reviewed-by: Jialei Hao <haojl2@motorola.com> Reviewed-by: Jianqi Yang <yangj@motorola.com> Submit-Approved: Jira Key
This commit is contained in:
parent
f07839f5a3
commit
a9f24ec5ad
2 changed files with 145 additions and 53 deletions
|
|
@ -1191,61 +1191,116 @@ static void aw869x_rtp_play(struct aw869x *aw869x, int value)
|
|||
}
|
||||
}
|
||||
|
||||
static void aw869x_haptic_context(struct aw869x *aw869x, enum aw869x_haptic_mode cmd)
|
||||
{
|
||||
int t_top = 0;
|
||||
if (!gpio_is_valid(aw869x->haptic_context_gpio)) {
|
||||
pr_info("%s haptic context gpio is invalid \n", __func__);
|
||||
return;
|
||||
}
|
||||
|
||||
t_top = gpio_get_value(aw869x->haptic_context_gpio);
|
||||
if (t_top) {
|
||||
switch (cmd) {
|
||||
case HAPTIC_RTP:
|
||||
aw869x->gain = 0x20;
|
||||
break;
|
||||
case HAPTIC_SHORT:
|
||||
aw869x->gain = 0x20;
|
||||
break;
|
||||
case HAPTIC_LONG:
|
||||
aw869x->gain = 0x06;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void aw869x_vibrate(struct aw869x *aw869x, int value)
|
||||
{
|
||||
int seq;
|
||||
mutex_lock(&aw869x->lock);
|
||||
int seq;
|
||||
mutex_lock(&aw869x->lock);
|
||||
|
||||
aw869x_haptic_stop(aw869x);
|
||||
seq = (aw869x->seq >> ((AW869X_SEQUENCER_SIZE - 1) * 8)) & 0xFF;
|
||||
pr_info("%s: value=%d, seq=%d\n", __FUNCTION__, value, seq);
|
||||
if (value > 0 || seq > 2) {
|
||||
if (seq >= AW869X_SEQ_NO_RTP_BASE)
|
||||
aw869x_rtp_play(aw869x, seq- AW869X_SEQ_NO_RTP_BASE);
|
||||
else if (value < 100 || seq > 2) {
|
||||
aw869x_i2c_write_bits(aw869x, AW869X_REG_PWMDBG,
|
||||
AW869X_BIT_PWMDBG_PWMCLK_MODE_MASK, AW869X_BIT_PWMDBG_PWMCLK_MODE_12KB);
|
||||
aw869x_haptic_set_bst_vol(aw869x, AW869X_BIT_BSTCFG_BSTVOL_8P75V);
|
||||
//aw869x_haptic_set_peak_cur(aw869x, AW869X_BIT_BSTCFG_PEAKCUR_3P5A);
|
||||
aw869x_haptic_set_gain(aw869x, 0x20);
|
||||
aw869x_haptic_stop(aw869x);
|
||||
seq = (aw869x->seq >> ((AW869X_SEQUENCER_SIZE - 1) * 8)) & 0xFF;
|
||||
pr_info("%s: value=%d, seq=%d\n", __FUNCTION__, value, seq);
|
||||
|
||||
if (aw869x->seq == 0)
|
||||
aw869x->seq = 0x01000000;
|
||||
if (value > 0 || seq > 2) {
|
||||
|
||||
aw869x_haptic_set_que_seq(aw869x, aw869x->seq);
|
||||
//aw869x_haptic_set_repeat_seq(aw869x, 0);
|
||||
//aw869x->index = 0x01;
|
||||
aw869x_haptic_play_que_seq(aw869x, 0x01);
|
||||
/*
|
||||
value = (value>HAPTIC_MAX_TIMEOUT)? HAPTIC_MAX_TIMEOUT:value;
|
||||
hrtimer_start(&aw869x->timer,
|
||||
ns_to_ktime((u64)value * NSEC_PER_MSEC), HRTIMER_MODE_REL);
|
||||
*/
|
||||
} else {
|
||||
aw869x_i2c_write_bits(aw869x, AW869X_REG_PWMDBG,
|
||||
AW869X_BIT_PWMDBG_PWMCLK_MODE_MASK, AW869X_BIT_PWMDBG_PWMCLK_MODE_12KB);
|
||||
aw869x_haptic_set_bst_vol(aw869x, AW869X_BIT_BSTCFG_BSTVOL_6P25V);
|
||||
aw869x_haptic_set_gain(aw869x, 0x0e);
|
||||
aw869x->duration = value;
|
||||
/* wav index config */
|
||||
aw869x->index = 0x02;
|
||||
aw869x_haptic_set_repeat_que_seq(aw869x, aw869x->index);
|
||||
|
||||
/* run ms timer */
|
||||
hrtimer_cancel(&aw869x->timer);
|
||||
aw869x->state = 0x01;
|
||||
if (aw869x->state)
|
||||
{
|
||||
hrtimer_start(&aw869x->timer,
|
||||
ktime_set(aw869x->duration / 1000, (value % 1000) * 1000000),
|
||||
HRTIMER_MODE_REL);
|
||||
if (seq >= AW869X_SEQ_NO_RTP_BASE) {
|
||||
aw869x->haptic_mode = HAPTIC_RTP;
|
||||
aw869x->gain = 0x20;
|
||||
} else if (value < 100 || seq > 2) {
|
||||
aw869x->haptic_mode = HAPTIC_SHORT;
|
||||
aw869x->gain = 0x20;
|
||||
} else {
|
||||
aw869x->haptic_mode = HAPTIC_LONG;
|
||||
aw869x->gain = 0x0e;
|
||||
}
|
||||
schedule_work(&aw869x->vibrator_work);
|
||||
|
||||
if(!aw869x->factory_mode)
|
||||
aw869x_haptic_context(aw869x,aw869x->haptic_mode);
|
||||
|
||||
if (aw869x->debugfs_debug)
|
||||
aw869x_haptic_set_gain(aw869x, aw869x->gain_debug);
|
||||
else
|
||||
aw869x_haptic_set_gain(aw869x, aw869x->gain);
|
||||
|
||||
switch (aw869x->haptic_mode) {
|
||||
case HAPTIC_RTP:
|
||||
aw869x_rtp_play(aw869x, seq - AW869X_SEQ_NO_RTP_BASE);
|
||||
break;
|
||||
case HAPTIC_SHORT:
|
||||
aw869x_i2c_write_bits(aw869x, AW869X_REG_PWMDBG,
|
||||
AW869X_BIT_PWMDBG_PWMCLK_MODE_MASK,
|
||||
AW869X_BIT_PWMDBG_PWMCLK_MODE_12KB);
|
||||
aw869x_haptic_set_bst_vol(aw869x, AW869X_BIT_BSTCFG_BSTVOL_8P75V);
|
||||
//aw869x_haptic_set_peak_cur(aw869x, AW869X_BIT_BSTCFG_PEAKCUR_3P5A);
|
||||
|
||||
if (aw869x->seq == 0)
|
||||
aw869x->seq = 0x01000000;
|
||||
|
||||
aw869x_haptic_set_que_seq(aw869x, aw869x->seq);
|
||||
//aw869x_haptic_set_repeat_seq(aw869x, 0);
|
||||
//aw869x->index = 0x01;
|
||||
aw869x_haptic_play_que_seq(aw869x, 0x01);
|
||||
/*
|
||||
value = (value>HAPTIC_MAX_TIMEOUT)? HAPTIC_MAX_TIMEOUT:value;
|
||||
hrtimer_start(&aw869x->timer,
|
||||
ns_to_ktime((u64)value * NSEC_PER_MSEC), HRTIMER_MODE_REL);
|
||||
*/
|
||||
break;
|
||||
case HAPTIC_LONG:
|
||||
aw869x_i2c_write_bits(aw869x, AW869X_REG_PWMDBG,
|
||||
AW869X_BIT_PWMDBG_PWMCLK_MODE_MASK,
|
||||
AW869X_BIT_PWMDBG_PWMCLK_MODE_12KB);
|
||||
aw869x_haptic_set_bst_vol(aw869x, AW869X_BIT_BSTCFG_BSTVOL_6P25V);
|
||||
|
||||
aw869x->duration = value;
|
||||
/* wav index config */
|
||||
aw869x->index = 0x02;
|
||||
aw869x_haptic_set_repeat_que_seq(aw869x, aw869x->index);
|
||||
|
||||
/* run ms timer */
|
||||
hrtimer_cancel(&aw869x->timer);
|
||||
aw869x->state = 0x01;
|
||||
if (aw869x->state)
|
||||
{
|
||||
hrtimer_start(&aw869x->timer,
|
||||
ktime_set(aw869x->duration / 1000, (value % 1000) * 1000000),
|
||||
HRTIMER_MODE_REL);
|
||||
}
|
||||
schedule_work(&aw869x->vibrator_work);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
/* Restore to default short waveform */
|
||||
if (seq > 2)
|
||||
aw869x->seq = 0;
|
||||
}
|
||||
/* Restore to default short waveform */
|
||||
if (seq > 2)
|
||||
aw869x->seq = 0;
|
||||
}
|
||||
|
||||
mutex_unlock(&aw869x->lock);
|
||||
}
|
||||
|
|
@ -1523,7 +1578,7 @@ static ssize_t aw869x_gain_show(struct device *dev,
|
|||
struct aw869x *aw869x = container_of(cdev, struct aw869x, cdev);
|
||||
#endif
|
||||
|
||||
return snprintf(buf, PAGE_SIZE, "%d\n", aw869x->gain);
|
||||
return snprintf(buf, PAGE_SIZE, "%d\n", aw869x->gain_debug);
|
||||
}
|
||||
|
||||
static ssize_t aw869x_gain_store(struct device *dev,
|
||||
|
|
@ -1546,8 +1601,12 @@ static ssize_t aw869x_gain_store(struct device *dev,
|
|||
pr_info("%s: value=%d\n", __FUNCTION__, val);
|
||||
|
||||
mutex_lock(&aw869x->lock);
|
||||
aw869x->gain = val;
|
||||
aw869x_haptic_set_gain(aw869x, (unsigned char)aw869x->gain);
|
||||
if (val > 0)
|
||||
aw869x->debugfs_debug = true;
|
||||
else
|
||||
aw869x->debugfs_debug = false;
|
||||
aw869x->gain_debug = val;
|
||||
aw869x_haptic_set_gain(aw869x, (unsigned char)aw869x->gain_debug);
|
||||
mutex_unlock(&aw869x->lock);
|
||||
return count;
|
||||
}
|
||||
|
|
@ -2225,6 +2284,13 @@ static int aw869x_parse_dt(struct device *dev, struct aw869x *aw869x,
|
|||
dev_info(dev, "%s: irq gpio provided ok.\n", __func__);
|
||||
}
|
||||
|
||||
aw869x->haptic_context_gpio = of_get_named_gpio(np, "haptic-context-gpio", 0);
|
||||
if (aw869x->haptic_context_gpio < 0) {
|
||||
dev_err(dev, "%s: no haptic context gpio provided.\n", __func__);
|
||||
} else {
|
||||
dev_info(dev, "%s: haptic context gpio provided ok.\n", __func__);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -2374,6 +2440,19 @@ static struct attribute_group aw869x_attribute_group = {
|
|||
};
|
||||
|
||||
|
||||
static bool mmi_factory_check(void)
|
||||
{
|
||||
struct device_node *np = of_find_node_by_path("/chosen");
|
||||
bool factory = false;
|
||||
|
||||
if (np)
|
||||
factory = of_property_read_bool(np, "mmi,factory-cable");
|
||||
|
||||
of_node_put(np);
|
||||
|
||||
return factory;
|
||||
}
|
||||
|
||||
/******************************************************
|
||||
*
|
||||
* i2c driver
|
||||
|
|
@ -2478,6 +2557,8 @@ static int aw869x_i2c_probe(struct i2c_client *i2c, const struct i2c_device_id *
|
|||
|
||||
g_aw869x = aw869x;
|
||||
|
||||
aw869x->factory_mode = mmi_factory_check();
|
||||
|
||||
aw869x_vibrator_init(aw869x);
|
||||
|
||||
aw869x_haptic_init(aw869x);
|
||||
|
|
|
|||
|
|
@ -83,6 +83,12 @@ enum aw869x_haptic_bst_mode {
|
|||
AW869X_HAPTIC_BOOST_MODE = 1,
|
||||
};
|
||||
|
||||
enum aw869x_haptic_mode{
|
||||
HAPTIC_NONE = 0x00,
|
||||
HAPTIC_SHORT = 0x01,
|
||||
HAPTIC_LONG = 0x02,
|
||||
HAPTIC_RTP = 0x03,
|
||||
};
|
||||
|
||||
/*********************************************************
|
||||
*
|
||||
|
|
@ -124,15 +130,20 @@ struct aw869x {
|
|||
|
||||
int reset_gpio;
|
||||
int irq_gpio;
|
||||
int haptic_context_gpio;
|
||||
int state;
|
||||
int duration;
|
||||
int amplitude;
|
||||
int index;
|
||||
int vmax;
|
||||
int gain;
|
||||
int gain_debug;
|
||||
int seq;
|
||||
int loop;
|
||||
|
||||
enum aw869x_haptic_mode haptic_mode;
|
||||
bool factory_mode;
|
||||
bool debugfs_debug;
|
||||
unsigned char hwen_flag;
|
||||
unsigned char flags;
|
||||
unsigned char chipid;
|
||||
|
|
|
|||
Loading…
Reference in a new issue