static int vib_probe(struct platform_device *pdev) { struct twl4030_codec_vibra_data *pdata = pdev->dev.platform_data; struct vib_data *data; int ret = 0; if (!pdata) { ret = -EBUSY; goto err0; } data = kzalloc(sizeof(struct vib_data), GFP_KERNEL); if (!data) { ret = -ENOMEM; goto err0; } data->pdata = pdata; data->twl6040 = dev_get_drvdata(pdev->dev.parent); INIT_WORK(&data->vib_work, vib_update); hrtimer_init(&data->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); data->timer.function = vib_timer_func; spin_lock_init(&data->lock); data->dev.name = "vibrator"; data->dev.get_time = vib_get_time; data->dev.enable = vib_enable; ret = timed_output_dev_register(&data->dev); if (ret < 0) goto err1; if (data->pdata->init) ret = data->pdata->init(); if (ret < 0) goto err2; misc_data = data; platform_set_drvdata(pdev, data); twl6040_enable(data->twl6040); vib_enable(&data->dev, data->pdata->initial_vibrate); return 0; err2: timed_output_dev_unregister(&data->dev); err1: kfree(data); err0: return ret; }
/* Called to enable amp (enable output force) */ IMMVIBESPIAPI VibeStatus ImmVibeSPI_ForceOut_AmpEnable( VibeUInt8 nActuatorIndex ) { DbgOut(( "[ImmVibeSPI] : ImmVibeSPI_ForceOut_AmpEnabled[%d]\n", g_bAmpEnabled )); if ( ! g_bAmpEnabled ) { g_bAmpEnabled = true; // Generate PWM CLK vib_generatePWM(NvOdmPwmMode_Enable); // Enable GPIO(enable pin) vib_enable(NV_TRUE); } return VIBE_S_SUCCESS; }
/* Called to disable amp (disable output force) */ IMMVIBESPIAPI VibeStatus ImmVibeSPI_ForceOut_AmpDisable( VibeUInt8 nActuatorIndex ) { DbgOut(( "[ImmVibeSPI] : ImmVibeSPI_ForceOut_AmpDisable[%d]\n", g_bAmpEnabled )); if ( g_bAmpEnabled ) { g_bAmpEnabled = false; // Disable GPIO(enable pin) vib_enable( NV_FALSE ); // Disable PWM CLK vib_generatePWM( NvOdmPwmMode_Disable ); } return VIBE_S_SUCCESS; }
/* * This is a temporary solution until a more global haptics soltion is * available for haptics that need to occur in any application */ void vibrator_haptic_fire(int value) { vib_enable(&misc_data->dev, value); }
static int vib_probe(struct platform_device *pdev) { struct twl4030_codec_vibra_data *pdata = pdev->dev.platform_data; struct vib_data *data; int ret = 0; if (!pdata) { ret = -EBUSY; goto err0; } data = kzalloc(sizeof(struct vib_data), GFP_KERNEL); if (!data) { ret = -ENOMEM; goto err0; } data->pdata = pdata; data->twl6040 = dev_get_drvdata(pdev->dev.parent); INIT_WORK(&data->vib_work, vib_update); INIT_DELAYED_WORK(&data->power_work, twl6040_vib_power_work); hrtimer_init(&data->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); data->timer.function = vib_timer_func; spin_lock_init(&data->lock); data->dev.name = "vibrator"; data->dev.get_time = vib_get_time; data->dev.enable = vib_enable; ret = timed_output_dev_register(&data->dev); if (ret < 0) goto err1; if (data->pdata->init) ret = data->pdata->init(); if (ret < 0) goto err2; misc_data = data; platform_set_drvdata(pdev, data); mutex_init(&misc_data->io_mutex); mutex_init(&misc_data->power_mutex); ret = twl6040_request_irq(data->twl6040, TWL6040_IRQ_VIB, twl6040_vib_irq_handler, "twl6040_irq_vib", data); if (ret) { pr_err("%s: VIB IRQ request failed: %d\n", __func__, ret); goto err2; } vib_enable(&data->dev, data->pdata->initial_vibrate); return 0; err2: timed_output_dev_unregister(&data->dev); err1: kfree(data); err0: return ret; }