On Thu, Jan 28, 2021 at 4:33 PM Andy Shevchenko andy.shevchenko@gmail.com wrote:
On Thu, Jan 28, 2021 at 2:58 PM Carlis zhangxuezhi3@gmail.com wrote:
...
Taking all together you probably need to create a helper and use it inside init_display(), like
static int init_tearing_effect_line(struct fbtft_par *par) { struct device *dev = par->info->device; struct gpio_desc *te; int irq, rc;
te = gpiod_get_optional(dev, "te", GPIOD_IN); if (IS_ERR(te)) return dev_err_probe(dev, PTR_ERR(te), "Failed to request te GPIO\n");
Sorry, here I missed the following:
/* Absence of TE IRQ is not critical */ if (!te) return 0;
irq = gpiod_to_irq(te); // this value you have to save in the driver's (per device) data structure.
/* GPIO is locked as an IRQ, we may drop the reference */ gpiod_put(te);
...and here:
if (irq < 0) return irq;
init_completion(&spi_panel_te); // should be in the (per device) data structure rc = devm_request_irq(dev, irq, spi_panel_te_handler, IRQF_TRIGGER_RISING, "TE_GPIO", par); if (rc) return dev_err_probe(dev, rc, "TE IRQ request failed.\n"); disable_irq_nosync(irq); return irq; }