static int __init vibe_probe(struct platform_device *pdev) { int rc; struct vibe_state *state; DPRINTK("In %s...\n", __func__); state = kzalloc(sizeof(struct vibe_state), GFP_KERNEL); if (!state) return (-ENOMEM); plat_vibrator_register((struct vibrator_platform_data*)(pdev->dev.platform_data)); /* init phys. vibe device */ plat_vibrator_init(); /* * Set default values: 0 = disabled, 50% duty cycle */ state->direction = 0; state->duty_cycle = 50; /* * Configure hardware. */ rc = plat_vibrator_set_direction(state->direction); if (rc) goto err0; rc = plat_vibrator_set_duty_cycle(state->duty_cycle); if (rc) goto err0; dev_set_drvdata(&pdev->dev, state); mutex_init(&state->mutex); /* create sysfs attribute */ if ((rc = device_create_file(&pdev->dev, &dev_attr_direction))) goto err0; if ((rc = device_create_file(&pdev->dev, &dev_attr_duty_cycle))) goto err1; register_vibetonz(state); printk(KERN_INFO "Vibrator driver initialized...\n"); return 0; err1: device_remove_file(&pdev->dev, &dev_attr_direction); err0: kfree(state); printk(KERN_ERR "ERROR: Vibrator driver intitialization failed.\n"); return rc; }
int _duty_cycle_store(struct vibe_state * state, int value) { int rc; /* 0 <= duty_cycle <= 100 */ if (value > 100) value = 100; mutex_lock(&state->mutex); rc = plat_vibrator_set_duty_cycle(value); if (rc != 0){ mutex_unlock(&state->mutex); return -EIO; } state->duty_cycle = value; mutex_unlock(&state->mutex); return 0; }