Skip to content

Commit 95c88d8

Browse files
committed
for for all vars and fuctions to be initialized before launching TE interrupt
1 parent e48e9aa commit 95c88d8

File tree

3 files changed

+29
-23
lines changed

3 files changed

+29
-23
lines changed

drivers/staging/fbtft/fbtft-bus.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ static bool lock = false;
117117
int fbtft_start_new_screen_transfer_async(struct fbtft_par *par)
118118
{
119119
// printk("%s\n", __func__);
120-
if (par->pdata->te_irq && !par->ready_for_spi_async)
120+
if (par->pdata->te_irq_enabled && !par->ready_for_spi_async)
121121
return -1;
122122
if (lock)
123123
return -1;
@@ -292,7 +292,7 @@ static void spi_complete_data_write(void *arg)
292292
/* Start sending cmd init data */
293293
par->odd_line = !par->odd_line;
294294
lock = false;
295-
if (!par->pdata->te_irq)
295+
if (!par->pdata->te_irq_enabled)
296296
fbtft_start_new_screen_transfer_async(par);
297297
} else {
298298
write_line_start += 2;
@@ -303,7 +303,7 @@ static void spi_complete_data_write(void *arg)
303303
}
304304
} else {
305305
lock = false;
306-
if (!par->pdata->te_irq)
306+
if (!par->pdata->te_irq_enabled)
307307
fbtft_start_new_screen_transfer_async(par);
308308
}
309309
}

drivers/staging/fbtft/fbtft-core.c

Lines changed: 24 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1650,7 +1650,9 @@ static irqreturn_t irq_TE_handler(int irq_no, void *dev_id)
16501650
}
16511651
#endif //DEBUG_TE_IRQ_COUNT
16521652

1653-
fbtft_start_new_screen_transfer_async(pdata->par);
1653+
if(pdata->par->ready_for_spi_async){
1654+
fbtft_start_new_screen_transfer_async(pdata->par);
1655+
}
16541656

16551657
return IRQ_HANDLED;
16561658
}
@@ -1661,7 +1663,7 @@ static struct fbtft_platform_data *fbtft_probe_dt(struct device *dev)
16611663
{
16621664
struct device_node *node = dev->of_node;
16631665
struct fbtft_platform_data *pdata;
1664-
int gpio, irq_id, err;
1666+
int gpio, err;
16651667
enum of_gpio_flags of_flags;
16661668
char *te_irq_name;
16671669

@@ -1697,8 +1699,9 @@ static struct fbtft_platform_data *fbtft_probe_dt(struct device *dev)
16971699
pdata->display.fbtftops.init_display = fbtft_init_display_dt;
16981700
pdata->display.fbtftops.request_gpios = fbtft_request_gpios_dt;
16991701

1700-
/* TE signal for Vsync */
1701-
pdata->te_irq = false;
1702+
/* TE signal for Vsync - Checking if GPIO is correct */
1703+
pdata->te_irq_enabled = false;
1704+
pdata->te_irq_id = 0;
17021705
te_irq_name = "te-irq";
17031706
if (of_find_property(node, te_irq_name, NULL)) {
17041707
gpio = of_get_named_gpio_flags(node, te_irq_name, 0, &of_flags);
@@ -1709,21 +1712,13 @@ static struct fbtft_platform_data *fbtft_probe_dt(struct device *dev)
17091712
else{
17101713
pr_info("%s: '%s' = GPIO%d\n", __func__, te_irq_name, gpio);
17111714

1712-
irq_id = gpio_to_irq(gpio);
1713-
if(irq_id < 0) {
1714-
dev_err(dev,"%s - Unable to request IRQ: %d\n", __func__, irq_id);
1715+
pdata->te_irq_id = gpio_to_irq(gpio);
1716+
if(pdata->te_irq_id < 0) {
1717+
dev_err(dev,"%s - Unable to request IRQ: %d\n", __func__, pdata->te_irq_id);
17151718
}
17161719
else{
1717-
pr_info("TE GPIO%d, IRQ id = %d\n", gpio, irq_id);
1718-
1719-
err = request_irq(irq_id, irq_TE_handler, IRQF_SHARED | IRQF_TRIGGER_RISING,
1720-
"TE", pdata);
1721-
if (err < 0) {
1722-
dev_err(dev,"ERROR initializing TE signal irq\n");
1723-
}
1724-
else{
1725-
pdata->te_irq = true;
1726-
}
1720+
pr_info("TE GPIO%d, IRQ id = %d\n", gpio, pdata->te_irq_id);
1721+
pdata->te_irq_enabled = true;
17271722
}
17281723
}
17291724
}
@@ -1757,7 +1752,7 @@ int fbtft_probe_common(struct fbtft_display *display,
17571752
struct fb_info *info;
17581753
struct fbtft_par *par;
17591754
struct fbtft_platform_data *pdata;
1760-
int ret;
1755+
int ret, err;
17611756

17621757
if (sdev)
17631758
dev = &sdev->dev;
@@ -1855,11 +1850,21 @@ int fbtft_probe_common(struct fbtft_display *display,
18551850
if (ret < 0)
18561851
goto out_release;
18571852

1853+
/** Initialize TE interrupt */
1854+
if(par->pdata->te_irq_enabled){
1855+
err = request_irq(par->pdata->te_irq_id, irq_TE_handler, IRQF_SHARED | IRQF_TRIGGER_RISING,
1856+
"TE", par->pdata);
1857+
if (err < 0) {
1858+
dev_err(dev,"ERROR initializing TE signal irq\n");
1859+
par->pdata->te_irq_enabled = false;
1860+
}
1861+
}
1862+
18581863
if (par->spi_async_mode) {
18591864
/* Start constant Display update using spi async */
18601865
par->write_line_start = 0;
18611866
par->write_line_end = par->info->var.yres - 1;
1862-
if (par->pdata->te_irq)
1867+
if (par->pdata->te_irq_enabled)
18631868
par->ready_for_spi_async = true;
18641869
else
18651870
fbtft_start_new_screen_transfer_async(par);

drivers/staging/fbtft/fbtft.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,8 @@ struct fbtft_platform_data {
154154
unsigned long rotate_soft;
155155
bool bgr;
156156
bool spi_async_mode;
157-
bool te_irq;
157+
bool te_irq_enabled;
158+
int te_irq_id;
158159
bool interlacing;
159160
unsigned int fps;
160161
int txbuflen;

0 commit comments

Comments
 (0)