static int qpnp_vibrator_probe(struct spmi_device *spmi)
{
	struct qpnp_vib *vib;
	struct resource *vib_resource;
	int rc;

	vib = devm_kzalloc(&spmi->dev, sizeof(*vib), GFP_KERNEL);
	if (!vib)
		return -ENOMEM;

	vib->spmi = spmi;

	vib_resource = spmi_get_resource(spmi, 0, IORESOURCE_MEM, 0);
	if (!vib_resource) {
		dev_err(&spmi->dev, "Unable to get vibrator base address\n");
		return -EINVAL;
	}
	vib->base = vib_resource->start;

	rc = qpnp_vib_parse_dt(vib);
	if (rc) {
		dev_err(&spmi->dev, "DT parsing failed\n");
		return rc;
	}

	rc = qpnp_vibrator_config(vib);
	if (rc) {
		dev_err(&spmi->dev, "vib config failed\n");
		return rc;
	}

	mutex_init(&vib->lock);
	INIT_WORK(&vib->work, qpnp_vib_update);

	hrtimer_init(&vib->vib_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
	vib->vib_timer.function = qpnp_vib_timer_func;

	vib->timed_dev.name = "vibrator";
	vib->timed_dev.get_time = qpnp_vib_get_time;
	vib->timed_dev.enable = qpnp_vib_enable;

	dev_set_drvdata(&spmi->dev, vib);

	rc = timed_output_dev_register(&vib->timed_dev);
	if (rc < 0)
		return rc;

	device_create_file(vib->timed_dev.dev, &dev_attr_vtg_level);

	return rc;
}
Ejemplo n.º 2
0
static ssize_t voltage_level_store(
		struct device *dev, struct device_attribute *attr,
		const char *buf, size_t size)
{
	int voltage_input;
	struct timed_output_dev *time_cdev;
	struct qpnp_vib *vib ;
	time_cdev = (struct timed_output_dev *) dev_get_drvdata(dev);
	vib = container_of(time_cdev, struct qpnp_vib, timed_dev);

	voltage_input = -1;
	sscanf(buf, "%d ",&voltage_input);
	printk(KERN_INFO "[VIB] voltage input: %d\n", voltage_input);
	if (voltage_input/100 < QPNP_VIB_MIN_LEVEL || voltage_input/100 > QPNP_VIB_MAX_LEVEL){
		printk(KERN_INFO "[VIB] invalid voltage level input: %d\n",voltage_input);
		return -EINVAL;
	}
	vib->vtg_level = voltage_input/100;

	qpnp_vibrator_config(vib);
	return size;
}
Ejemplo n.º 3
0
static int qpnp_vibrator_probe(struct spmi_device *spmi)
{
	struct qpnp_vib *vib;
	struct resource *vib_resource;
	int rc;

	printk(KERN_INFO "[VIB] %s\n", __func__);
	vib = devm_kzalloc(&spmi->dev, sizeof(*vib), GFP_KERNEL);
	if (!vib)
		return -ENOMEM;

	vib->spmi = spmi;

	vib_resource = spmi_get_resource(spmi, 0, IORESOURCE_MEM, 0);
	if (!vib_resource) {
		dev_err(&spmi->dev, "Unable to get vibrator base address\n");
		return -EINVAL;
	}
	vib->base = vib_resource->start;

	rc = qpnp_vib_parse_dt(vib);
	if (rc) {
		dev_err(&spmi->dev, "DT parsing failed\n");
		return rc;
	}

	rc = qpnp_vibrator_config(vib);
	if (rc) {
		dev_err(&spmi->dev, "vib config failed\n");
		return rc;
	}

	mutex_init(&vib->lock);
	INIT_WORK(&vib->work, qpnp_vib_update);

	hrtimer_init(&vib->vib_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
	vib->vib_timer.function = qpnp_vib_timer_func;

	vib->timed_dev.name = "vibrator";
	vib->timed_dev.get_time = qpnp_vib_get_time;
	vib->timed_dev.enable = qpnp_vib_enable;

	dev_set_drvdata(&spmi->dev, vib);

	rc = timed_output_dev_register(&vib->timed_dev);
	if (rc < 0)
		return rc;

	rc = device_create_file(vib->timed_dev.dev, &dev_attr_voltage_level);
	if (rc < 0) {
		printk(KERN_INFO "[VIB] %s, create sysfs fail: voltage_level\n", __func__);
	}

#ifdef CONFIG_VIB_TRIGGERS
		vib->enabler.name = "qpnp-vibrator";
		vib->enabler.default_trigger = "vibrator";
		vib->enabler.enable = qpnp_vib_trigger_enable;
		vib->enabler.trigger_data = vib;
		vib_trigger_enabler_register(&vib->enabler);
#endif

	return rc;
}