static int pixcir_start(struct pixcir_i2c_ts_data *ts) { struct device *dev = &ts->client->dev; int error; /* LEVEL_TOUCH interrupt with active low polarity */ error = pixcir_set_int_mode(ts, PIXCIR_INT_LEVEL_TOUCH, 0); if (error) { dev_err(dev, "Failed to set interrupt mode: %d\n", error); return error; } ts->running = true; mb(); /* Update status before IRQ can fire */ /* enable interrupt generation */ error = pixcir_int_enable(ts, true); if (error) { dev_err(dev, "Failed to enable interrupt generation: %d\n", error); return error; } return 0; }
static int pixcir_stop(struct pixcir_i2c_ts_data *ts) { int error; /* Disable interrupt generation */ error = pixcir_int_enable(ts, false); if (error) { dev_err(&ts->client->dev, "Failed to disable interrupt generation: %d\n", error); return error; } /* Exit ISR if running, no more report parsing */ ts->running = false; mb(); /* update status before we synchronize irq */ /* Wait till running ISR is complete */ synchronize_irq(ts->client->irq); if (ts->gpio_enable) gpiod_set_value_cansleep(ts->gpio_enable, 0); return 0; }