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; }
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; }
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 }
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; }
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; }