Lines Matching full:haptics
284 static int da7280_haptic_mem_update(struct da7280_haptic *haptics) in da7280_haptic_mem_update() argument
290 error = regmap_read(haptics->regmap, DA7280_IRQ_STATUS1, &val); in da7280_haptic_mem_update()
294 dev_warn(haptics->dev, in da7280_haptic_mem_update()
301 error = regmap_read(haptics->regmap, DA7280_MEM_CTL2, &val); in da7280_haptic_mem_update()
305 dev_warn(haptics->dev, "Please unlock the bit first\n"); in da7280_haptic_mem_update()
310 error = regmap_update_bits(haptics->regmap, in da7280_haptic_mem_update()
317 error = regmap_read(haptics->regmap, DA7280_MEM_CTL1, &val); in da7280_haptic_mem_update()
321 return regmap_bulk_write(haptics->regmap, val, haptics->snp_mem, in da7280_haptic_mem_update()
325 static int da7280_haptic_set_pwm(struct da7280_haptic *haptics, bool enabled) in da7280_haptic_set_pwm() argument
331 if (!haptics->gain && enabled) { in da7280_haptic_set_pwm()
332 dev_err(haptics->dev, "Unable to enable pwm with 0 gain\n"); in da7280_haptic_set_pwm()
336 pwm_get_state(haptics->pwm_dev, &state); in da7280_haptic_set_pwm()
339 period_mag_multi = (u64)state.period * haptics->gain; in da7280_haptic_set_pwm()
347 if (!haptics->acc_en) { in da7280_haptic_set_pwm()
355 error = pwm_apply_state(haptics->pwm_dev, &state); in da7280_haptic_set_pwm()
357 dev_err(haptics->dev, "Failed to apply pwm state: %d\n", error); in da7280_haptic_set_pwm()
362 static void da7280_haptic_activate(struct da7280_haptic *haptics) in da7280_haptic_activate() argument
366 if (haptics->active) in da7280_haptic_activate()
369 switch (haptics->op_mode) { in da7280_haptic_activate()
372 if (haptics->acc_en && haptics->level > 0x7F) in da7280_haptic_activate()
373 haptics->level = 0x7F; in da7280_haptic_activate()
374 else if (haptics->level > 0xFF) in da7280_haptic_activate()
375 haptics->level = 0xFF; in da7280_haptic_activate()
378 error = regmap_write(haptics->regmap, DA7280_TOP_CTL2, in da7280_haptic_activate()
379 haptics->level); in da7280_haptic_activate()
381 dev_err(haptics->dev, in da7280_haptic_activate()
383 haptics->level, error); in da7280_haptic_activate()
389 if (da7280_haptic_set_pwm(haptics, true)) in da7280_haptic_activate()
409 dev_err(haptics->dev, "Invalid op mode %d\n", haptics->op_mode); in da7280_haptic_activate()
413 error = regmap_update_bits(haptics->regmap, in da7280_haptic_activate()
416 haptics->op_mode); in da7280_haptic_activate()
418 dev_err(haptics->dev, in da7280_haptic_activate()
423 if (haptics->op_mode == DA7280_PWM_MODE || in da7280_haptic_activate()
424 haptics->op_mode == DA7280_RTWM_MODE) { in da7280_haptic_activate()
425 error = regmap_update_bits(haptics->regmap, in da7280_haptic_activate()
430 dev_err(haptics->dev, in da7280_haptic_activate()
436 haptics->active = true; in da7280_haptic_activate()
439 static void da7280_haptic_deactivate(struct da7280_haptic *haptics) in da7280_haptic_deactivate() argument
443 if (!haptics->active) in da7280_haptic_deactivate()
447 error = regmap_update_bits(haptics->regmap, in da7280_haptic_deactivate()
451 dev_err(haptics->dev, in da7280_haptic_deactivate()
456 switch (haptics->op_mode) { in da7280_haptic_deactivate()
458 error = regmap_write(haptics->regmap, in da7280_haptic_deactivate()
461 dev_err(haptics->dev, in da7280_haptic_deactivate()
468 if (da7280_haptic_set_pwm(haptics, false)) in da7280_haptic_deactivate()
474 error = regmap_update_bits(haptics->regmap, in da7280_haptic_deactivate()
478 dev_err(haptics->dev, in da7280_haptic_deactivate()
486 dev_err(haptics->dev, "Invalid op mode %d\n", haptics->op_mode); in da7280_haptic_deactivate()
490 haptics->active = false; in da7280_haptic_deactivate()
495 struct da7280_haptic *haptics = in da7280_haptic_work() local
497 int val = haptics->val; in da7280_haptic_work()
500 da7280_haptic_activate(haptics); in da7280_haptic_work()
502 da7280_haptic_deactivate(haptics); in da7280_haptic_work()
509 struct da7280_haptic *haptics = input_get_drvdata(dev); in da7280_haptics_upload_effect() local
516 if (haptics->active) in da7280_haptics_upload_effect()
522 haptics->op_mode = haptics->const_op_mode; in da7280_haptics_upload_effect()
523 if (haptics->op_mode == DA7280_DRO_MODE) { in da7280_haptics_upload_effect()
525 haptics->level = tmp / 0x7FFF; in da7280_haptics_upload_effect()
529 haptics->gain = effect->u.constant.level <= 0 ? in da7280_haptics_upload_effect()
536 dev_err(haptics->dev, in da7280_haptics_upload_effect()
556 dev_err(haptics->dev, "Invalid waveform data size\n"); in da7280_haptics_upload_effect()
565 memset(haptics->snp_mem, 0, DA7280_SNP_MEM_SIZE); in da7280_haptics_upload_effect()
569 dev_err(haptics->dev, in da7280_haptics_upload_effect()
574 haptics->snp_mem[i] = (u8)data[i]; in da7280_haptics_upload_effect()
577 error = da7280_haptic_mem_update(haptics); in da7280_haptics_upload_effect()
579 dev_err(haptics->dev, in da7280_haptics_upload_effect()
594 dev_err(haptics->dev, in da7280_haptics_upload_effect()
601 haptics->ps_seq_id = data[DA7280_CUSTOM_SEQ_ID_IDX] & 0x0f; in da7280_haptics_upload_effect()
602 haptics->ps_seq_loop = data[DA7280_CUSTOM_SEQ_LOOP_IDX] & 0x0f; in da7280_haptics_upload_effect()
603 haptics->op_mode = haptics->periodic_op_mode; in da7280_haptics_upload_effect()
605 val = FIELD_PREP(DA7280_PS_SEQ_ID_MASK, haptics->ps_seq_id) | in da7280_haptics_upload_effect()
607 haptics->ps_seq_loop); in da7280_haptics_upload_effect()
608 error = regmap_write(haptics->regmap, DA7280_SEQ_CTL2, val); in da7280_haptics_upload_effect()
610 dev_err(haptics->dev, in da7280_haptics_upload_effect()
625 dev_err(haptics->dev, in da7280_haptics_upload_effect()
633 haptics->gpi_ctl[num].seq_id = in da7280_haptics_upload_effect()
635 haptics->op_mode = haptics->periodic_op_mode; in da7280_haptics_upload_effect()
638 haptics->gpi_ctl[num].seq_id); in da7280_haptics_upload_effect()
639 error = regmap_update_bits(haptics->regmap, in da7280_haptics_upload_effect()
644 dev_err(haptics->dev, in da7280_haptics_upload_effect()
651 dev_err(haptics->dev, "Unsupported effect type: %d\n", in da7280_haptics_upload_effect()
662 struct da7280_haptic *haptics = input_get_drvdata(dev); in da7280_haptics_playback() local
664 if (!haptics->op_mode) { in da7280_haptics_playback()
665 dev_warn(haptics->dev, "No effects have been uploaded\n"); in da7280_haptics_playback()
669 if (likely(!haptics->suspended)) { in da7280_haptics_playback()
670 haptics->val = val; in da7280_haptics_playback()
671 schedule_work(&haptics->work); in da7280_haptics_playback()
677 static int da7280_haptic_start(struct da7280_haptic *haptics) in da7280_haptic_start() argument
681 error = regmap_update_bits(haptics->regmap, in da7280_haptic_start()
686 dev_err(haptics->dev, "Unable to enable device: %d\n", error); in da7280_haptic_start()
693 static void da7280_haptic_stop(struct da7280_haptic *haptics) in da7280_haptic_stop() argument
697 cancel_work_sync(&haptics->work); in da7280_haptic_stop()
700 da7280_haptic_deactivate(haptics); in da7280_haptic_stop()
702 error = regmap_update_bits(haptics->regmap, DA7280_TOP_CTL1, in da7280_haptic_stop()
705 dev_err(haptics->dev, "Failed to disable device: %d\n", error); in da7280_haptic_stop()
710 struct da7280_haptic *haptics = input_get_drvdata(dev); in da7280_haptic_open() local
712 return da7280_haptic_start(haptics); in da7280_haptic_open()
717 struct da7280_haptic *haptics = input_get_drvdata(dev); in da7280_haptic_close() local
719 da7280_haptic_stop(haptics); in da7280_haptic_close()
773 struct da7280_haptic *haptics) in da7280_parse_properties() argument
786 haptics->dev_type = DA7280_DEV_MAX; in da7280_parse_properties()
789 haptics->dev_type = da7280_haptic_of_mode_str(dev, str); in da7280_parse_properties()
791 haptics->const_op_mode = DA7280_DRO_MODE; in da7280_parse_properties()
794 haptics->const_op_mode = DA7280_PWM_MODE; in da7280_parse_properties()
796 haptics->periodic_op_mode = DA7280_RTWM_MODE; in da7280_parse_properties()
799 haptics->periodic_op_mode = DA7280_ETWM_MODE; in da7280_parse_properties()
801 haptics->nommax = DA7280_SKIP_INIT; in da7280_parse_properties()
804 haptics->nommax = da7280_haptic_of_volt_rating_set(val); in da7280_parse_properties()
806 haptics->absmax = DA7280_SKIP_INIT; in da7280_parse_properties()
809 haptics->absmax = da7280_haptic_of_volt_rating_set(val); in da7280_parse_properties()
811 haptics->imax = DA7280_IMAX_DEFAULT; in da7280_parse_properties()
814 haptics->imax = (val - 28600) / DA7280_IMAX_STEP + 1; in da7280_parse_properties()
816 haptics->impd = DA7280_IMPD_DEFAULT; in da7280_parse_properties()
819 haptics->impd = val; in da7280_parse_properties()
821 haptics->resonant_freq_h = DA7280_SKIP_INIT; in da7280_parse_properties()
822 haptics->resonant_freq_l = DA7280_SKIP_INIT; in da7280_parse_properties()
827 haptics->resonant_freq_h = in da7280_parse_properties()
829 haptics->resonant_freq_l = in da7280_parse_properties()
832 haptics->resonant_freq_h = DA7280_RESONT_FREQH_DFT; in da7280_parse_properties()
833 haptics->resonant_freq_l = DA7280_RESONT_FREQL_DFT; in da7280_parse_properties()
838 haptics->ps_seq_id = 0; in da7280_parse_properties()
841 haptics->ps_seq_id = val; in da7280_parse_properties()
843 haptics->ps_seq_loop = 0; in da7280_parse_properties()
846 haptics->ps_seq_loop = val; in da7280_parse_properties()
851 haptics->gpi_ctl[i].seq_id = DA7280_GPI_SEQ_ID_DFT + i; in da7280_parse_properties()
854 haptics->gpi_ctl[i].seq_id = val; in da7280_parse_properties()
857 haptics->gpi_ctl[i].mode = 0; in da7280_parse_properties()
860 haptics->gpi_ctl[i].mode = in da7280_parse_properties()
864 haptics->gpi_ctl[i].polarity = 0; in da7280_parse_properties()
867 haptics->gpi_ctl[i].polarity = in da7280_parse_properties()
871 haptics->bemf_sense_en = in da7280_parse_properties()
873 haptics->freq_track_en = in da7280_parse_properties()
875 haptics->acc_en = in da7280_parse_properties()
877 haptics->rapid_stop_en = in da7280_parse_properties()
879 haptics->amp_pid_en = in da7280_parse_properties()
882 haptics->mem_update = false; in da7280_parse_properties()
886 haptics->mem_update = true; in da7280_parse_properties()
887 memset(haptics->snp_mem, 0, DA7280_SNP_MEM_SIZE); in da7280_parse_properties()
890 haptics->snp_mem[i] = (u8)mem[i]; in da7280_parse_properties()
892 dev_err(haptics->dev, in da7280_parse_properties()
895 haptics->mem_update = false; in da7280_parse_properties()
904 struct da7280_haptic *haptics = data; in da7280_irq_handler() local
905 struct device *dev = haptics->dev; in da7280_irq_handler()
910 error = regmap_bulk_read(haptics->regmap, DA7280_IRQ_EVENT1, in da7280_irq_handler()
918 error = regmap_write(haptics->regmap, DA7280_IRQ_EVENT1, events[0]); in da7280_irq_handler()
929 error = regmap_update_bits(haptics->regmap, DA7280_TOP_CTL1, in da7280_irq_handler()
937 haptics->active = false; in da7280_irq_handler()
962 static int da7280_init(struct da7280_haptic *haptics) in da7280_init() argument
973 if (haptics->dev_type == DA7280_DEV_MAX) { in da7280_init()
974 error = regmap_read(haptics->regmap, DA7280_TOP_CFG1, &val); in da7280_init()
978 haptics->dev_type = val & DA7280_ACTUATOR_TYPE_MASK ? in da7280_init()
983 if (haptics->dev_type == DA7280_LRA && in da7280_init()
984 haptics->resonant_freq_l != DA7280_SKIP_INIT) { in da7280_init()
985 error = regmap_write(haptics->regmap, DA7280_FRQ_LRA_PER_H, in da7280_init()
986 haptics->resonant_freq_h); in da7280_init()
989 error = regmap_write(haptics->regmap, DA7280_FRQ_LRA_PER_L, in da7280_init()
990 haptics->resonant_freq_l); in da7280_init()
993 } else if (haptics->dev_type == DA7280_ERM_COIN) { in da7280_init()
994 error = regmap_update_bits(haptics->regmap, DA7280_TOP_INT_CFG1, in da7280_init()
1003 error = regmap_update_bits(haptics->regmap, DA7280_TOP_CFG4, in da7280_init()
1008 haptics->acc_en = false; in da7280_init()
1009 haptics->rapid_stop_en = false; in da7280_init()
1010 haptics->amp_pid_en = false; in da7280_init()
1020 (haptics->dev_type ? 1 : 0)) | in da7280_init()
1022 (haptics->bemf_sense_en ? 1 : 0)) | in da7280_init()
1024 (haptics->freq_track_en ? 1 : 0)) | in da7280_init()
1026 (haptics->acc_en ? 1 : 0)) | in da7280_init()
1028 (haptics->rapid_stop_en ? 1 : 0)) | in da7280_init()
1030 (haptics->amp_pid_en ? 1 : 0)); in da7280_init()
1032 error = regmap_update_bits(haptics->regmap, DA7280_TOP_CFG1, mask, val); in da7280_init()
1036 error = regmap_update_bits(haptics->regmap, DA7280_TOP_CFG5, in da7280_init()
1038 haptics->acc_en ? in da7280_init()
1043 error = regmap_update_bits(haptics->regmap, in da7280_init()
1046 haptics->acc_en ? in da7280_init()
1051 if (haptics->nommax != DA7280_SKIP_INIT) { in da7280_init()
1052 error = regmap_write(haptics->regmap, DA7280_ACTUATOR1, in da7280_init()
1053 haptics->nommax); in da7280_init()
1058 if (haptics->absmax != DA7280_SKIP_INIT) { in da7280_init()
1059 error = regmap_write(haptics->regmap, DA7280_ACTUATOR2, in da7280_init()
1060 haptics->absmax); in da7280_init()
1065 error = regmap_update_bits(haptics->regmap, DA7280_ACTUATOR3, in da7280_init()
1066 DA7280_IMAX_MASK, haptics->imax); in da7280_init()
1070 v2i_factor = haptics->impd * (haptics->imax + 4) / 1610400; in da7280_init()
1071 error = regmap_write(haptics->regmap, DA7280_CALIB_V2I_L, in da7280_init()
1075 error = regmap_write(haptics->regmap, DA7280_CALIB_V2I_H, in da7280_init()
1080 error = regmap_update_bits(haptics->regmap, in da7280_init()
1087 if (haptics->mem_update) { in da7280_init()
1088 error = da7280_haptic_mem_update(haptics); in da7280_init()
1094 val = FIELD_PREP(DA7280_PS_SEQ_ID_MASK, haptics->ps_seq_id) | in da7280_init()
1095 FIELD_PREP(DA7280_PS_SEQ_LOOP_MASK, haptics->ps_seq_loop); in da7280_init()
1096 error = regmap_write(haptics->regmap, DA7280_SEQ_CTL2, val); in da7280_init()
1103 haptics->gpi_ctl[i].seq_id) | in da7280_init()
1105 haptics->gpi_ctl[i].mode) | in da7280_init()
1107 haptics->gpi_ctl[i].polarity); in da7280_init()
1108 error = regmap_write(haptics->regmap, in da7280_init()
1115 error = regmap_update_bits(haptics->regmap, in da7280_init()
1123 error = regmap_write(haptics->regmap, DA7280_IRQ_EVENT1, 0xff); in da7280_init()
1127 error = regmap_update_bits(haptics->regmap, in da7280_init()
1135 haptics->active = false; in da7280_init()
1139 dev_err(haptics->dev, "chip initialization error: %d\n", error); in da7280_init()
1147 struct da7280_haptic *haptics; in da7280_probe() local
1158 haptics = devm_kzalloc(dev, sizeof(*haptics), GFP_KERNEL); in da7280_probe()
1159 if (!haptics) in da7280_probe()
1162 haptics->dev = dev; in da7280_probe()
1164 da7280_parse_properties(dev, haptics); in da7280_probe()
1166 if (haptics->const_op_mode == DA7280_PWM_MODE) { in da7280_probe()
1167 haptics->pwm_dev = devm_pwm_get(dev, NULL); in da7280_probe()
1168 error = PTR_ERR_OR_ZERO(haptics->pwm_dev); in da7280_probe()
1177 pwm_init_state(haptics->pwm_dev, &state); in da7280_probe()
1179 error = pwm_apply_state(haptics->pwm_dev, &state); in da7280_probe()
1196 INIT_WORK(&haptics->work, da7280_haptic_work); in da7280_probe()
1198 haptics->client = client; in da7280_probe()
1199 i2c_set_clientdata(client, haptics); in da7280_probe()
1201 haptics->regmap = devm_regmap_init_i2c(client, in da7280_probe()
1203 error = PTR_ERR_OR_ZERO(haptics->regmap); in da7280_probe()
1209 error = da7280_init(haptics); in da7280_probe()
1226 input_set_drvdata(input_dev, haptics); in da7280_probe()
1227 haptics->input_dev = input_dev; in da7280_probe()
1229 input_set_capability(haptics->input_dev, EV_FF, FF_PERIODIC); in da7280_probe()
1230 input_set_capability(haptics->input_dev, EV_FF, FF_CUSTOM); in da7280_probe()
1231 input_set_capability(haptics->input_dev, EV_FF, FF_CONSTANT); in da7280_probe()
1232 input_set_capability(haptics->input_dev, EV_FF, FF_GAIN); in da7280_probe()
1234 error = input_ff_create(haptics->input_dev, in da7280_probe()
1254 "da7280-haptics", haptics); in da7280_probe()
1266 struct da7280_haptic *haptics = dev_get_drvdata(dev); in da7280_suspend() local
1268 mutex_lock(&haptics->input_dev->mutex); in da7280_suspend()
1274 spin_lock_irq(&haptics->input_dev->event_lock); in da7280_suspend()
1275 haptics->suspended = true; in da7280_suspend()
1276 spin_unlock_irq(&haptics->input_dev->event_lock); in da7280_suspend()
1278 da7280_haptic_stop(haptics); in da7280_suspend()
1280 mutex_unlock(&haptics->input_dev->mutex); in da7280_suspend()
1287 struct da7280_haptic *haptics = dev_get_drvdata(dev); in da7280_resume() local
1290 mutex_lock(&haptics->input_dev->mutex); in da7280_resume()
1292 retval = da7280_haptic_start(haptics); in da7280_resume()
1294 spin_lock_irq(&haptics->input_dev->event_lock); in da7280_resume()
1295 haptics->suspended = false; in da7280_resume()
1296 spin_unlock_irq(&haptics->input_dev->event_lock); in da7280_resume()
1299 mutex_unlock(&haptics->input_dev->mutex); in da7280_resume()
1330 MODULE_DESCRIPTION("DA7280 haptics driver");