Example #1
0
static int akm8975_wait_for_data_ready(struct akm8975_data *akm)
{
	int data_ready = gpio_get_value_cansleep(PM8058_GPIO_PM_TO_SYS(akm->pdata->gpio_data_ready_int));
	int err;

	if (data_ready)
		return 0;

	enable_irq(akm->irq);

	err = wait_for_completion_timeout(&akm->data_ready, 5*HZ);
	if (err > 0)
		return 0;

	akm8975_disable_irq(akm);

	if (err == 0) {
		pr_err("akm: wait timed out\n");
		akm8975_ecs_set_mode_power_down(akm); /* It will be restart next time */
		
		/* Wait at least 300us after changing mode. */
		udelay(300);
//		return -ETIMEDOUT;
	}

	pr_err("akm: wait restart\n");
	return err;
}
Example #2
0
static int akm8975_setup_irq(struct akm8975_data *akm)
{
	int rc = -EIO;
	struct akm8975_platform_data *pdata = akm->pdata;

	/* trigger high so we don't miss initial interrupt if it
	 * is already pending
	 */
	rc = request_irq(akm->irq, akm8975_irq_handler, IRQF_TRIGGER_RISING,
			 "akm_int", akm);
	if (rc < 0) {
		pr_err("%s: request_irq(%d) failed for gpio %d (%d)\n",
			__func__, akm->irq,
			pdata->gpio_data_ready_int, rc);
		goto err_request_irq;
	}

	/* start with interrupt disabled until the driver is enabled */
	//akm->irq = irq;
	akm8975_disable_irq(akm);

	goto done;

err_request_irq:
	gpio_free(pdata->gpio_data_ready_int);
done:
	return rc;
}
Example #3
0
static int akm8975_wait_for_data_ready(struct akm8975_data *akm)
{
#if USING_IRQ
	int data_ready = gpio_get_value(akm->pdata->gpio_data_ready_int);
	int err;

	pr_info("1 akm8975_wait_for_data_ready: %d", data_ready);
	if (data_ready)
		return 0;

	enable_irq(akm->irq);

	err = wait_for_completion_timeout(&akm->data_ready, 5*HZ);
	data_ready = gpio_get_value(akm->pdata->gpio_data_ready_int);
	pr_info("2 akm8975_wait_for_data_ready: %d", data_ready);

	if (err > 0)
		return 0;

	akm8975_disable_irq(akm);

	if (err == 0) {
		pr_err("akm: wait timed out");
		return -ETIMEDOUT;
	}

	pr_err("akm: wait restart");
	return err;
#else
	int err;
	u8 buf;

	int count = 10;

	while (1) {
		msleep(1);
		err = i2c_smbus_read_i2c_block_data(akm->this_client,
				AK8975_REG_ST1, sizeof(buf), &buf);

		if (err != sizeof(buf)) {
			pr_err("%s: read data over i2c failed", __func__);
			return -1;
		}

		if (buf&0x1)
			break;

		count--;
		if (!count)
			break;
	}

	return 0;
#endif

}
Example #4
0
static int akm8975_setup_irq(struct akm8975_data *akm)
{
	int rc = -EIO;
	struct akm8975_platform_data *pdata = akm->pdata;
	int irq;

#if 0
	rc = gpio_request(pdata->gpio_data_ready_int, "gpio_akm_int");
	if (rc < 0) {
		pr_err("%s: gpio %d request failed (%d)\n",
			__func__, pdata->gpio_data_ready_int, rc);
		return rc;
	}

	rc = gpio_direction_input(pdata->gpio_data_ready_int);
	if (rc < 0) {
		pr_err("%s: failed to set gpio %d as input (%d)\n",
			__func__, pdata->gpio_data_ready_int, rc);
		goto err_gpio_direction_input;
	}

	irq = gpio_to_irq(pdata->gpio_data_ready_int);
#else
	irq = PM8058_GPIO_IRQ(PMIC8058_IRQ_BASE, pdata->gpio_data_ready_int);
#endif

	/* trigger high so we don't miss initial interrupt if it
	 * is already pending
	 */
	rc = request_threaded_irq(irq, NULL, akm8975_irq_handler, IRQF_TRIGGER_RISING,
			 "akm_int", akm);
	if (rc < 0) {
		pr_err("%s: request_irq(%d) failed for gpio %d (%d)\n",
			__func__, irq,
			pdata->gpio_data_ready_int, rc);
		goto err_request_irq;
	}

	/* start with interrupt disabled until the driver is enabled */
	akm->irq = irq;
	akm8975_disable_irq(akm);

	goto done;

err_request_irq:
//err_gpio_direction_input:
//	gpio_free(pdata->gpio_data_ready_int);
done:
	return rc;
}
Example #5
0
static int akm8975_wait_for_data_ready(struct akm8975_data *akm)
{
	int data_ready = gpio_get_value(akm->pdata->gpio_data_ready_int);
	int err;

	if (data_ready)
		return 0;

	enable_irq(akm->irq);

	err = wait_for_completion_timeout(&akm->data_ready, 5*HZ);
	if (err > 0)
		return 0;

	akm8975_disable_irq(akm);

	if (err == 0) {
		pr_err("akm: wait timed out\n");
		return -ETIMEDOUT;
	}

	pr_err("akm: wait restart\n");
	return err;
}