* [PATCH 0/5] Correctly handle plaform_get_irq()'s result in the i2C drivers @ 2021-06-23 20:48 Sergey Shtylyov 2021-06-23 20:53 ` [PATCH 1/5] i2c: hix5hd2: fix IRQ check Sergey Shtylyov ` (4 more replies) 0 siblings, 5 replies; 7+ messages in thread From: Sergey Shtylyov @ 2021-06-23 20:48 UTC (permalink / raw) To: linux-i2c Cc: Qii Wang, Matthias Brugger, linux-arm-kernel, linux-mediatek, linux-samsung-soc Here are 5 patches against the 'i2c/for-current' branch of the Jens Axboe's 'linux-block.git' repo. The affected drivers call platform_get_irq() but mis-interprete its result -- they consider IRQ0 as error and (sometimes) the real error codes as valid IRQs... :-/ [1/5] i2c: hix5hd2: fix IRQ check [2/5] i2c: mt65xx: fix IRQ check [3/5] i2c: pmcmsp: fix-IRQ-check [4/5] i2c: s3c2410: fix IRQ check [5/5] i2c: xlp9xx: fix main IRQ check ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH 1/5] i2c: hix5hd2: fix IRQ check 2021-06-23 20:48 [PATCH 0/5] Correctly handle plaform_get_irq()'s result in the i2C drivers Sergey Shtylyov @ 2021-06-23 20:53 ` Sergey Shtylyov 2021-06-23 20:56 ` [PATCH 2/5] i2c: mt65xx: " Sergey Shtylyov ` (3 subsequent siblings) 4 siblings, 0 replies; 7+ messages in thread From: Sergey Shtylyov @ 2021-06-23 20:53 UTC (permalink / raw) To: linux-i2c Iff platform_get_irq() returns 0, the driver's probe() method will return 0 early (as if the method's call was successful). Let's consider IRQ0 valid for simplicity -- devm_request_irq() can always override that decision... Fixes: 15ef27756b23 ("i2c: hix5hd2: add i2c controller driver") Signed-off-by: Sergey Shtylyov <s.shtylyov@omp.ru> --- drivers/i2c/busses/i2c-hix5hd2.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) Index: linux/drivers/i2c/busses/i2c-hix5hd2.c =================================================================== --- linux.orig/drivers/i2c/busses/i2c-hix5hd2.c +++ linux/drivers/i2c/busses/i2c-hix5hd2.c @@ -413,7 +413,7 @@ static int hix5hd2_i2c_probe(struct plat return PTR_ERR(priv->regs); irq = platform_get_irq(pdev, 0); - if (irq <= 0) + if (irq < 0) return irq; priv->clk = devm_clk_get(&pdev->dev, NULL); ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH 2/5] i2c: mt65xx: fix IRQ check 2021-06-23 20:48 [PATCH 0/5] Correctly handle plaform_get_irq()'s result in the i2C drivers Sergey Shtylyov 2021-06-23 20:53 ` [PATCH 1/5] i2c: hix5hd2: fix IRQ check Sergey Shtylyov @ 2021-06-23 20:56 ` Sergey Shtylyov 2021-06-23 20:58 ` [PATCH 3/5] i2c: pmcmsp: fix-IRQ-check Sergey Shtylyov ` (2 subsequent siblings) 4 siblings, 0 replies; 7+ messages in thread From: Sergey Shtylyov @ 2021-06-23 20:56 UTC (permalink / raw) To: linux-i2c; +Cc: Qii Wang, Matthias Brugger, linux-arm-kernel, linux-mediatek Iff platform_get_irq() returns 0, the driver's probe() method will return 0 early (as if the method's call was successful). Let's consider IRQ0 valid for simplicity -- devm_request_irq() can always override that decision... Fixes: ce38815d39ea ("I2C: mediatek: Add driver for MediaTek I2C controller") Signed-off-by: Sergey Shtylyov <s.shtylyov@omprussia.ru> --- drivers/i2c/busses/i2c-mt65xx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) Index: linux/drivers/i2c/busses/i2c-mt65xx.c =================================================================== --- linux.orig/drivers/i2c/busses/i2c-mt65xx.c +++ linux/drivers/i2c/busses/i2c-mt65xx.c @@ -1211,7 +1211,7 @@ static int mtk_i2c_probe(struct platform return PTR_ERR(i2c->pdmabase); irq = platform_get_irq(pdev, 0); - if (irq <= 0) + if (irq < 0) return irq; init_completion(&i2c->msg_complete); ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH 3/5] i2c: pmcmsp: fix-IRQ-check 2021-06-23 20:48 [PATCH 0/5] Correctly handle plaform_get_irq()'s result in the i2C drivers Sergey Shtylyov 2021-06-23 20:53 ` [PATCH 1/5] i2c: hix5hd2: fix IRQ check Sergey Shtylyov 2021-06-23 20:56 ` [PATCH 2/5] i2c: mt65xx: " Sergey Shtylyov @ 2021-06-23 20:58 ` Sergey Shtylyov 2021-06-29 7:19 ` [kbuild] " Dan Carpenter 2021-06-23 21:01 ` [PATCH 4/5] i2c: s3c2410: fix IRQ check Sergey Shtylyov 2021-06-23 21:06 ` [PATCH 5/5] i2c: xlp9xx: fix main " Sergey Shtylyov 4 siblings, 1 reply; 7+ messages in thread From: Sergey Shtylyov @ 2021-06-23 20:58 UTC (permalink / raw) To: linux-i2c The driver's probe() method is written as if platform_get_irq() returns 0 on error, while actually it returns a negative error code (with all the other values considered valid IRQs). Rewrite the driver's IRQ checking code to pass the positive IRQ #s to request_irq(), propagate -EPROBE_DEFER upstream, and use the polling mode when platform_get_irq() returns negative error code or 0... Fixes: 1b144df1d7d6 ("i2c: New PMC MSP71xx TWI bus driver") Signed-off-by: Sergey Shtylyov <s.shtylyov@omp.ru> --- drivers/i2c/busses/i2c-pmcmsp.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) Index: linux/drivers/i2c/busses/i2c-pmcmsp.c =================================================================== --- linux.orig/drivers/i2c/busses/i2c-pmcmsp.c +++ linux/drivers/i2c/busses/i2c-pmcmsp.c @@ -291,8 +291,13 @@ static int pmcmsptwi_probe(struct platfo } /* request the irq */ - pmcmsptwi_data.irq = platform_get_irq(pldev, 0); - if (pmcmsptwi_data.irq) { + rc = platform_get_irq(pldev, 0); + if (rc == -EPROBE_DEFER) + return rc; + if (rc <= 0) { + pmcmsptwi_data.irq = 0; + } else { + pmcmsptwi_data.irq = rc; rc = request_irq(pmcmsptwi_data.irq, &pmcmsptwi_interrupt, IRQF_SHARED, pldev->name, &pmcmsptwi_data); if (rc == 0) { ^ permalink raw reply [flat|nested] 7+ messages in thread
* [kbuild] Re: [PATCH 3/5] i2c: pmcmsp: fix-IRQ-check 2021-06-23 20:58 ` [PATCH 3/5] i2c: pmcmsp: fix-IRQ-check Sergey Shtylyov @ 2021-06-29 7:19 ` Dan Carpenter 0 siblings, 0 replies; 7+ messages in thread From: Dan Carpenter @ 2021-06-29 7:19 UTC (permalink / raw) To: kbuild, Sergey Shtylyov, linux-i2c; +Cc: lkp, kbuild-all Hi Sergey, url: https://github.com/0day-ci/linux/commits/Sergey-Shtylyov/Correctly-handle-plaform_get_irq-s-result-in-the-i2C-drivers/20210624-050805 base: https://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux.git i2c/for-next config: microblaze-randconfig-m031-20210628 (attached as .config) compiler: microblaze-linux-gcc (GCC) 9.3.0 If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <lkp@intel.com> Reported-by: Dan Carpenter <dan.carpenter@oracle.com> smatch warnings: drivers/i2c/busses/i2c-pmcmsp.c:355 pmcmsptwi_probe() warn: 'pmcmsptwi_data.iobase' not released on lines: 296. drivers/i2c/busses/i2c-pmcmsp.c:355 pmcmsptwi_probe() warn: 'res->start' not released on lines: 296. vim +355 drivers/i2c/busses/i2c-pmcmsp.c 0b255e927d47b5 Bill Pemberton 2012-11-27 261 static int pmcmsptwi_probe(struct platform_device *pldev) 1b144df1d7d69d Marc St-Jean 2007-07-12 262 { 1b144df1d7d69d Marc St-Jean 2007-07-12 263 struct resource *res; 1b144df1d7d69d Marc St-Jean 2007-07-12 264 int rc = -ENODEV; 1b144df1d7d69d Marc St-Jean 2007-07-12 265 1b144df1d7d69d Marc St-Jean 2007-07-12 266 /* get the static platform resources */ 1b144df1d7d69d Marc St-Jean 2007-07-12 267 res = platform_get_resource(pldev, IORESOURCE_MEM, 0); 1b144df1d7d69d Marc St-Jean 2007-07-12 268 if (!res) { 1b144df1d7d69d Marc St-Jean 2007-07-12 269 dev_err(&pldev->dev, "IOMEM resource not found\n"); 1b144df1d7d69d Marc St-Jean 2007-07-12 270 goto ret_err; 1b144df1d7d69d Marc St-Jean 2007-07-12 271 } 1b144df1d7d69d Marc St-Jean 2007-07-12 272 1b144df1d7d69d Marc St-Jean 2007-07-12 273 /* reserve the memory region */ c6ffddea36dd57 Linus Walleij 2009-06-14 274 if (!request_mem_region(res->start, resource_size(res), 1b144df1d7d69d Marc St-Jean 2007-07-12 275 pldev->name)) { 1b144df1d7d69d Marc St-Jean 2007-07-12 276 dev_err(&pldev->dev, 066e6e805d4af2 Krzysztof Kozlowski 2020-01-15 277 "Unable to get memory/io address region %pap\n", 066e6e805d4af2 Krzysztof Kozlowski 2020-01-15 278 &res->start); 1b144df1d7d69d Marc St-Jean 2007-07-12 279 rc = -EBUSY; 1b144df1d7d69d Marc St-Jean 2007-07-12 280 goto ret_err; 1b144df1d7d69d Marc St-Jean 2007-07-12 281 } 1b144df1d7d69d Marc St-Jean 2007-07-12 282 1b144df1d7d69d Marc St-Jean 2007-07-12 283 /* remap the memory */ 4bdc0d676a6431 Christoph Hellwig 2020-01-06 284 pmcmsptwi_data.iobase = ioremap(res->start, c6ffddea36dd57 Linus Walleij 2009-06-14 285 resource_size(res)); 1b144df1d7d69d Marc St-Jean 2007-07-12 286 if (!pmcmsptwi_data.iobase) { 1b144df1d7d69d Marc St-Jean 2007-07-12 287 dev_err(&pldev->dev, 066e6e805d4af2 Krzysztof Kozlowski 2020-01-15 288 "Unable to ioremap address %pap\n", &res->start); 1b144df1d7d69d Marc St-Jean 2007-07-12 289 rc = -EIO; 1b144df1d7d69d Marc St-Jean 2007-07-12 290 goto ret_unreserve; 1b144df1d7d69d Marc St-Jean 2007-07-12 291 } 1b144df1d7d69d Marc St-Jean 2007-07-12 292 1b144df1d7d69d Marc St-Jean 2007-07-12 293 /* request the irq */ fa227704e6a1e0 Sergey Shtylyov 2021-06-23 294 rc = platform_get_irq(pldev, 0); fa227704e6a1e0 Sergey Shtylyov 2021-06-23 295 if (rc == -EPROBE_DEFER) fa227704e6a1e0 Sergey Shtylyov 2021-06-23 296 return rc; Need to clean up the ioremap() and the request_mem_region(). fa227704e6a1e0 Sergey Shtylyov 2021-06-23 297 if (rc <= 0) { fa227704e6a1e0 Sergey Shtylyov 2021-06-23 298 pmcmsptwi_data.irq = 0; fa227704e6a1e0 Sergey Shtylyov 2021-06-23 299 } else { fa227704e6a1e0 Sergey Shtylyov 2021-06-23 300 pmcmsptwi_data.irq = rc; 1b144df1d7d69d Marc St-Jean 2007-07-12 301 rc = request_irq(pmcmsptwi_data.irq, &pmcmsptwi_interrupt, d38a0149e8a11c Theodore Ts'o 2012-07-17 302 IRQF_SHARED, pldev->name, &pmcmsptwi_data); 1b144df1d7d69d Marc St-Jean 2007-07-12 303 if (rc == 0) { 1b144df1d7d69d Marc St-Jean 2007-07-12 304 /* 1b144df1d7d69d Marc St-Jean 2007-07-12 305 * Enable 'DONE' interrupt only. 1b144df1d7d69d Marc St-Jean 2007-07-12 306 * 1b144df1d7d69d Marc St-Jean 2007-07-12 307 * If you enable all interrupts, you will get one on 1b144df1d7d69d Marc St-Jean 2007-07-12 308 * error and another when the operation completes. 1b144df1d7d69d Marc St-Jean 2007-07-12 309 * This way you only have to handle one interrupt, 1b144df1d7d69d Marc St-Jean 2007-07-12 310 * but you can still check all result flags. 1b144df1d7d69d Marc St-Jean 2007-07-12 311 */ 1b144df1d7d69d Marc St-Jean 2007-07-12 312 pmcmsptwi_writel(MSP_TWI_INT_STS_DONE, 1b144df1d7d69d Marc St-Jean 2007-07-12 313 pmcmsptwi_data.iobase + 1b144df1d7d69d Marc St-Jean 2007-07-12 314 MSP_TWI_INT_MSK_REG_OFFSET); 1b144df1d7d69d Marc St-Jean 2007-07-12 315 } else { 1b144df1d7d69d Marc St-Jean 2007-07-12 316 dev_warn(&pldev->dev, 1b144df1d7d69d Marc St-Jean 2007-07-12 317 "Could not assign TWI IRQ handler " 1b144df1d7d69d Marc St-Jean 2007-07-12 318 "to irq %d (continuing with poll)\n", 1b144df1d7d69d Marc St-Jean 2007-07-12 319 pmcmsptwi_data.irq); 1b144df1d7d69d Marc St-Jean 2007-07-12 320 pmcmsptwi_data.irq = 0; 1b144df1d7d69d Marc St-Jean 2007-07-12 321 } 1b144df1d7d69d Marc St-Jean 2007-07-12 322 } 1b144df1d7d69d Marc St-Jean 2007-07-12 323 1b144df1d7d69d Marc St-Jean 2007-07-12 324 init_completion(&pmcmsptwi_data.wait); 1b144df1d7d69d Marc St-Jean 2007-07-12 325 mutex_init(&pmcmsptwi_data.lock); 1b144df1d7d69d Marc St-Jean 2007-07-12 326 1b144df1d7d69d Marc St-Jean 2007-07-12 327 pmcmsptwi_set_clock_config(&pmcmsptwi_defclockcfg, &pmcmsptwi_data); 1b144df1d7d69d Marc St-Jean 2007-07-12 328 pmcmsptwi_set_twi_config(&pmcmsptwi_defcfg, &pmcmsptwi_data); 1b144df1d7d69d Marc St-Jean 2007-07-12 329 1b144df1d7d69d Marc St-Jean 2007-07-12 330 printk(KERN_INFO DRV_NAME ": Registering MSP71xx I2C adapter\n"); 1b144df1d7d69d Marc St-Jean 2007-07-12 331 1b144df1d7d69d Marc St-Jean 2007-07-12 332 pmcmsptwi_adapter.dev.parent = &pldev->dev; 1b144df1d7d69d Marc St-Jean 2007-07-12 333 platform_set_drvdata(pldev, &pmcmsptwi_adapter); 1b144df1d7d69d Marc St-Jean 2007-07-12 334 i2c_set_adapdata(&pmcmsptwi_adapter, &pmcmsptwi_data); 1b144df1d7d69d Marc St-Jean 2007-07-12 335 1b144df1d7d69d Marc St-Jean 2007-07-12 336 rc = i2c_add_adapter(&pmcmsptwi_adapter); ea734404f3daf1 Wolfram Sang 2016-08-09 337 if (rc) 1b144df1d7d69d Marc St-Jean 2007-07-12 338 goto ret_unmap; 1b144df1d7d69d Marc St-Jean 2007-07-12 339 1b144df1d7d69d Marc St-Jean 2007-07-12 340 return 0; 1b144df1d7d69d Marc St-Jean 2007-07-12 341 1b144df1d7d69d Marc St-Jean 2007-07-12 342 ret_unmap: 1b144df1d7d69d Marc St-Jean 2007-07-12 343 if (pmcmsptwi_data.irq) { 1b144df1d7d69d Marc St-Jean 2007-07-12 344 pmcmsptwi_writel(0, 1b144df1d7d69d Marc St-Jean 2007-07-12 345 pmcmsptwi_data.iobase + MSP_TWI_INT_MSK_REG_OFFSET); 1b144df1d7d69d Marc St-Jean 2007-07-12 346 free_irq(pmcmsptwi_data.irq, &pmcmsptwi_data); 1b144df1d7d69d Marc St-Jean 2007-07-12 347 } 1b144df1d7d69d Marc St-Jean 2007-07-12 348 1b144df1d7d69d Marc St-Jean 2007-07-12 349 iounmap(pmcmsptwi_data.iobase); 1b144df1d7d69d Marc St-Jean 2007-07-12 350 1b144df1d7d69d Marc St-Jean 2007-07-12 351 ret_unreserve: c6ffddea36dd57 Linus Walleij 2009-06-14 352 release_mem_region(res->start, resource_size(res)); 1b144df1d7d69d Marc St-Jean 2007-07-12 353 1b144df1d7d69d Marc St-Jean 2007-07-12 354 ret_err: 1b144df1d7d69d Marc St-Jean 2007-07-12 @355 return rc; 1b144df1d7d69d Marc St-Jean 2007-07-12 356 } --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org _______________________________________________ kbuild mailing list -- kbuild@lists.01.org To unsubscribe send an email to kbuild-leave@lists.01.org ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH 4/5] i2c: s3c2410: fix IRQ check 2021-06-23 20:48 [PATCH 0/5] Correctly handle plaform_get_irq()'s result in the i2C drivers Sergey Shtylyov ` (2 preceding siblings ...) 2021-06-23 20:58 ` [PATCH 3/5] i2c: pmcmsp: fix-IRQ-check Sergey Shtylyov @ 2021-06-23 21:01 ` Sergey Shtylyov 2021-06-23 21:06 ` [PATCH 5/5] i2c: xlp9xx: fix main " Sergey Shtylyov 4 siblings, 0 replies; 7+ messages in thread From: Sergey Shtylyov @ 2021-06-23 21:01 UTC (permalink / raw) To: linux-i2c; +Cc: linux-samsung-soc Iff platform_get_irq() returns 0, the driver's probe() method will return 0 early (as if the method's call was successful). Let's consider IRQ0 valid for simplicity -- devm_request_irq() can always override that decision... Fixes: 2bbd681ba2b ("i2c-s3c2410: Change IRQ to be plain integer.") Signed-off-by: Sergey Shtylyov <s.shtylyov@omp.ru> --- drivers/i2c/busses/i2c-s3c2410.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) Index: linux/drivers/i2c/busses/i2c-s3c2410.c =================================================================== --- linux.orig/drivers/i2c/busses/i2c-s3c2410.c +++ linux/drivers/i2c/busses/i2c-s3c2410.c @@ -1137,7 +1137,7 @@ static int s3c24xx_i2c_probe(struct plat */ if (!(i2c->quirks & QUIRK_POLL)) { i2c->irq = ret = platform_get_irq(pdev, 0); - if (ret <= 0) { + if (ret < 0) { dev_err(&pdev->dev, "cannot find IRQ\n"); clk_unprepare(i2c->clk); return ret; ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH 5/5] i2c: xlp9xx: fix main IRQ check 2021-06-23 20:48 [PATCH 0/5] Correctly handle plaform_get_irq()'s result in the i2C drivers Sergey Shtylyov ` (3 preceding siblings ...) 2021-06-23 21:01 ` [PATCH 4/5] i2c: s3c2410: fix IRQ check Sergey Shtylyov @ 2021-06-23 21:06 ` Sergey Shtylyov 4 siblings, 0 replies; 7+ messages in thread From: Sergey Shtylyov @ 2021-06-23 21:06 UTC (permalink / raw) To: linux-i2c, George Cherian Iff platform_get_irq() returns 0 for the main IRQ, the driver's probe() method will return 0 early (as if the method's call was successful). Let's consider IRQ0 valid for simplicity -- devm_request_irq() can always override that decision... Fixes: 2bbd681ba2b ("i2c: xlp9xx: Driver for Netlogic XLP9XX/5XX I2C controller") Signed-off-by: Sergey Shtylyov <s.shtylyov@omp.ru> --- drivers/i2c/busses/i2c-xlp9xx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) Index: linux/drivers/i2c/busses/i2c-xlp9xx.c =================================================================== --- linux.orig/drivers/i2c/busses/i2c-xlp9xx.c +++ linux/drivers/i2c/busses/i2c-xlp9xx.c @@ -517,7 +517,7 @@ static int xlp9xx_i2c_probe(struct platf return PTR_ERR(priv->base); priv->irq = platform_get_irq(pdev, 0); - if (priv->irq <= 0) + if (priv->irq < 0) return priv->irq; /* SMBAlert irq */ priv->alert_data.irq = platform_get_irq(pdev, 1); ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2021-06-29 7:19 UTC | newest] Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2021-06-23 20:48 [PATCH 0/5] Correctly handle plaform_get_irq()'s result in the i2C drivers Sergey Shtylyov 2021-06-23 20:53 ` [PATCH 1/5] i2c: hix5hd2: fix IRQ check Sergey Shtylyov 2021-06-23 20:56 ` [PATCH 2/5] i2c: mt65xx: " Sergey Shtylyov 2021-06-23 20:58 ` [PATCH 3/5] i2c: pmcmsp: fix-IRQ-check Sergey Shtylyov 2021-06-29 7:19 ` [kbuild] " Dan Carpenter 2021-06-23 21:01 ` [PATCH 4/5] i2c: s3c2410: fix IRQ check Sergey Shtylyov 2021-06-23 21:06 ` [PATCH 5/5] i2c: xlp9xx: fix main " Sergey Shtylyov
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).