Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[media] adv7180: free an interrupt on failure paths in init_device()

There is request_irq() in init_device(), but the interrupt is not removed
on failure paths. The patch adds proper error handling.

Found by Linux Driver Verification project (linuxtesting.org).

Signed-off-by: Alexey Khoroshilov <khoroshilov@ispras.ru>
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>

authored by

Alexey Khoroshilov and committed by
Mauro Carvalho Chehab
df065b37 320c6387

+11 -7
+11 -7
drivers/media/i2c/adv7180.c
··· 561 561 ret = i2c_smbus_write_byte_data(client, ADV7180_ADI_CTRL_REG, 562 562 ADV7180_ADI_CTRL_IRQ_SPACE); 563 563 if (ret < 0) 564 - return ret; 564 + goto err; 565 565 566 566 /* config the Interrupt pin to be active low */ 567 567 ret = i2c_smbus_write_byte_data(client, ADV7180_ICONF1_ADI, 568 568 ADV7180_ICONF1_ACTIVE_LOW | 569 569 ADV7180_ICONF1_PSYNC_ONLY); 570 570 if (ret < 0) 571 - return ret; 571 + goto err; 572 572 573 573 ret = i2c_smbus_write_byte_data(client, ADV7180_IMR1_ADI, 0); 574 574 if (ret < 0) 575 - return ret; 575 + goto err; 576 576 577 577 ret = i2c_smbus_write_byte_data(client, ADV7180_IMR2_ADI, 0); 578 578 if (ret < 0) 579 - return ret; 579 + goto err; 580 580 581 581 /* enable AD change interrupts interrupts */ 582 582 ret = i2c_smbus_write_byte_data(client, ADV7180_IMR3_ADI, 583 583 ADV7180_IRQ3_AD_CHANGE); 584 584 if (ret < 0) 585 - return ret; 585 + goto err; 586 586 587 587 ret = i2c_smbus_write_byte_data(client, ADV7180_IMR4_ADI, 0); 588 588 if (ret < 0) 589 - return ret; 589 + goto err; 590 590 591 591 ret = i2c_smbus_write_byte_data(client, ADV7180_ADI_CTRL_REG, 592 592 0); 593 593 if (ret < 0) 594 - return ret; 594 + goto err; 595 595 } 596 596 597 597 return 0; 598 + 599 + err: 600 + free_irq(state->irq, state); 601 + return ret; 598 602 } 599 603 600 604 static int adv7180_probe(struct i2c_client *client,