From patchwork Fri Feb 28 23:37:02 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alessandro Zummo X-Patchwork-Id: 325363 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from mail-yh0-x23f.google.com (mail-yh0-x23f.google.com [IPv6:2607:f8b0:4002:c01::23f]) (using TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id EE1472C00BC for ; Sat, 1 Mar 2014 10:37:09 +1100 (EST) Received: by mail-yh0-f63.google.com with SMTP id c41sf289619yho.8 for ; Fri, 28 Feb 2014 15:37:06 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlegroups.com; s=20120806; h=date:from:to:cc:subject:message-id:organization:mime-version :x-original-sender:x-original-authentication-results:reply-to :precedence:mailing-list:list-id:list-post:list-help:list-archive :sender:list-subscribe:list-unsubscribe:content-type; bh=gOn2Dqwfw6xnMdE/56dgl/qaYSU4+noSI06xFEFekuM=; b=MeLzIDC1Ngq5F8IV+dKc3Ir8rDRWooXRY+yTOYLTnhHbew771GyS+Qnja6/fSEs9JZ EGP0pwN9gOTBhulfP4iznv+ycgzh8tyguUJ0F4elhc2TonCie0XJP+n9FsVRIJ++4oUy QPCgTA6ExkwoOPmYRuW/FkOBdKLr5rTASBKvseuWb9AR2V94r3EMWqUo1jtobPqXD9yK CIMsBQPGcFYL7FGNFCkUrxQHiGbEGnnMaZJIaxqcGzJPZ9vdo++mKtEuIkxtYevvzFZ/ 1rAPfUWa4gDZiiPNM12IlxJ0M+DYY2GgVXjjd7pjMZJj4N/MSnZrfWNwUz+yK+JHnXmk xowA== X-Received: by 10.50.23.80 with SMTP id k16mr109958igf.16.1393630626643; Fri, 28 Feb 2014 15:37:06 -0800 (PST) X-BeenThere: rtc-linux@googlegroups.com Received: by 10.50.114.10 with SMTP id jc10ls735324igb.25.canary; Fri, 28 Feb 2014 15:37:06 -0800 (PST) X-Received: by 10.43.79.196 with SMTP id zr4mr5847460icb.3.1393630626102; Fri, 28 Feb 2014 15:37:06 -0800 (PST) Received: from zabrina.hetzner-de.towertech.it (zabrina.hetzner-de.towertech.it. [178.63.16.19]) by gmr-mx.google.com with ESMTP id j9si840523qch.1.2014.02.28.15.37.05 for ; Fri, 28 Feb 2014 15:37:05 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of a.zummo@towertech.it designates 178.63.16.19 as permitted sender) client-ip=178.63.16.19; Received: from linux.lan.towertech.it (93-50-192-40.ip153.fastwebnet.it [93.50.192.40]) by smtp.towertech.it (Postfix) with ESMTPSA id 3fbRwv2PJhzn0J; Sat, 1 Mar 2014 00:37:03 +0100 (CET) Date: Sat, 1 Mar 2014 00:37:02 +0100 From: Alessandro Zummo To: rtc-linux@googlegroups.com Cc: ab@mycable.de, aghayal@codeaurora.org, akpm@linux-foundation.org, alexandre.torgue@st.com, alnovak@suse.cz, andy.sharp@lsi.com, anemo@mba.ocn.ne.jp, axel.lin@gmail.com, balbi@ti.com, broonie@opensource.wolfsonmicro.com, byron.bbradley@gmail.com, dale@farnsworth.org, dchen@diasemi.com, dsaxena@plexity.net, gregory.hermant@calao-systems.com, grygorii.strashko@ti.com, gxt@mprc.pku.edu.cn, hvr@gnu.org, iamjoonsoo.kim@lge.com, jg1.han@samsung.com, jkosina@suse.cz, jlu@pengutronix.de, john.stultz@linaro.org, Julia.Lawall@lip6.fr, julien.delacou@stericsson.com, khilman@linaro.org, kosmo@semihalf.com, lars@metafoo.de, lee.jones@linaro.org, linus.walleij@linaro.org, l.stach@pengutronix.de, mark.rutland@arm.com, martyn.welch@ge.com, mcuos.com@gmail.com, michal.simek@xilinx.com, mike@compulab.co.il, peter.senna@gmail.com, peter.ujfalusi@ti.com, roman.fietze@telemotive.de, sachin.kamat@linaro.org, sameo@linux.intel.com, scottwood@freescale.com, s.hauer@pengutronix.de, shc_work@mail.ru, shubhrajyoti@ti.com, slapin@ossfans.org, srikanth.srinivasan@freescale.com, srinidhi.kasagar@stericsson.com, stable@vger.kernel.org, tixy@linaro.org, tony@atomide.com, vapier.adi@gmail.com, virupax.sadashivpetimath@stericsson.com, wfp5p@virginia.edu, wg@grandegger.com, Xianglong.Du@csr.com, yongjun_wei@trendmicro.com.cn, yuasa@linux-mips.org Subject: [rtc-linux] RTC drivers need some love Message-ID: <20140301003702.1f9619cd@linux.lan.towertech.it> Organization: Tower Technologies MIME-Version: 1.0 X-Original-Sender: a.zummo@towertech.it X-Original-Authentication-Results: gmr-mx.google.com; spf=pass (google.com: best guess record for domain of a.zummo@towertech.it designates 178.63.16.19 as permitted sender) smtp.mail=a.zummo@towertech.it Reply-To: rtc-linux@googlegroups.com Precedence: list Mailing-list: list rtc-linux@googlegroups.com; contact rtc-linux+owners@googlegroups.com List-ID: X-Google-Group-Id: 712029733259 List-Post: , List-Help: , List-Archive: Sender: rtc-linux@googlegroups.com List-Subscribe: , List-Unsubscribe: , Hello, you're receiving this email because you were involved in the development of one or more RTC drivers. Recently it has been brought to my attention that there's a race condition in some drivers [1]. If your drivers bails out after the rtc_device_register() call, it may trigger the condition. There are two things that drivers often do after rtc_device_register(): a) register sysfs entries b) request irqs It seems that most drivers could still work correctly if those do not succeed. The proposed course of action is to modify the drivers in order to avoid bailing out (and notify the user where appropriate). Any other action that might trigger a bail out should be done before rtc_device_register. I've modified 22 of them in order to provide an example of what the fix might look like (patch attached). Julia Lawall has been kind enough to write a semantic file for coccinelle that quickly found the affected files [2]. I'd appreciate if you can give a look to your driver and provide a patch if appropriate. If you're lucky I've already patched it and you just have to check if my work makes sense to you. Thanks for your cooperation. [1] https://lkml.org/lkml/2014/2/26/185 [2] drivers/rtc/rtc-ab8500.c drivers/rtc/rtc-as3722.c drivers/rtc/rtc-at91sam9.c drivers/rtc/rtc-bfin.c drivers/rtc/rtc-cmos.c drivers/rtc/rtc-da9055.c drivers/rtc/rtc-davinci.c drivers/rtc/rtc-ds1305.c drivers/rtc/rtc-ds1307.c drivers/rtc/rtc-ds1511.c drivers/rtc/rtc-ds1553.c drivers/rtc/rtc-ds1672.c drivers/rtc/rtc-ds1742.c drivers/rtc/rtc-ds3232.c drivers/rtc/rtc-ep93xx.c drivers/rtc/rtc-isl1208.c drivers/rtc/rtc-jz4740.c drivers/rtc/rtc-m41t80.c drivers/rtc/rtc-m48t59.c drivers/rtc/rtc-max77686.c drivers/rtc/rtc-max8907.c drivers/rtc/rtc-max8997.c drivers/rtc/rtc-mc13xxx.c drivers/rtc/rtc-mrst.c drivers/rtc/rtc-nuc900.c drivers/rtc/rtc-omap.c drivers/rtc/rtc-palmas.c drivers/rtc/rtc-pcap.c drivers/rtc/rtc-pcf2123.c drivers/rtc/rtc-pl031.c drivers/rtc/rtc-pm8xxx.c drivers/rtc/rtc-rp5c01.c drivers/rtc/rtc-rs5c372.c drivers/rtc/rtc-rv3029c2.c drivers/rtc/rtc-rx8025.c drivers/rtc/rtc-s3c.c drivers/rtc/rtc-s5m.c drivers/rtc/rtc-sirfsoc.c drivers/rtc/rtc-stk17ta8.c drivers/rtc/rtc-stmp3xxx.c drivers/rtc/rtc-tegra.c drivers/rtc/rtc-test.c drivers/rtc/rtc-tps6586x.c drivers/rtc/rtc-tps80031.c drivers/rtc/rtc-twl.c drivers/rtc/rtc-tx4939.c drivers/rtc/rtc-vr41xx.c drivers/rtc/rtc-vt8500.c drivers/rtc/rtc-x1205.c diff --git a/drivers/rtc/rtc-ab8500.c b/drivers/rtc/rtc-ab8500.c index 727e2f5..3fabe3c 100644 --- a/drivers/rtc/rtc-ab8500.c +++ b/drivers/rtc/rtc-ab8500.c @@ -485,23 +485,21 @@ static int ab8500_rtc_probe(struct platform_device *pdev) (struct rtc_class_ops *)platid->driver_data, THIS_MODULE); if (IS_ERR(rtc)) { - dev_err(&pdev->dev, "Registration failed\n"); - err = PTR_ERR(rtc); - return err; + return PTR_ERR(rtc); } err = devm_request_threaded_irq(&pdev->dev, irq, NULL, rtc_alarm_handler, IRQF_NO_SUSPEND | IRQF_ONESHOT, "ab8500-rtc", rtc); - if (err < 0) - return err; + if (err) { + dev_err(&pdev->dev, "unable to request IRQ, alarm not available\n"); + } platform_set_drvdata(pdev, rtc); err = ab8500_sysfs_rtc_register(&pdev->dev); if (err) { dev_err(&pdev->dev, "sysfs RTC failed to register\n"); - return err; } return 0; diff --git a/drivers/rtc/rtc-da9055.c b/drivers/rtc/rtc-da9055.c index 48cb2ac3..04a2157 100644 --- a/drivers/rtc/rtc-da9055.c +++ b/drivers/rtc/rtc-da9055.c @@ -283,11 +283,11 @@ static int da9055_rtc_probe(struct platform_device *pdev) ret = da9055_rtc_device_init(rtc->da9055, pdata); if (ret < 0) - goto err_rtc; + return ret; ret = da9055_reg_read(rtc->da9055, DA9055_REG_ALARM_Y); if (ret < 0) - goto err_rtc; + return ret; if (ret & DA9055_RTC_ALM_EN) rtc->alarm_enable = 1; @@ -297,8 +297,7 @@ static int da9055_rtc_probe(struct platform_device *pdev) rtc->rtc = devm_rtc_device_register(&pdev->dev, pdev->name, &da9055_rtc_ops, THIS_MODULE); if (IS_ERR(rtc->rtc)) { - ret = PTR_ERR(rtc->rtc); - goto err_rtc; + return PTR_ERR(rtc->rtc); } alm_irq = platform_get_irq_byname(pdev, "ALM"); @@ -310,9 +309,7 @@ static int da9055_rtc_probe(struct platform_device *pdev) if (ret != 0) dev_err(rtc->da9055->dev, "irq registration failed: %d\n", ret); -err_rtc: - return ret; - + return 0; } #ifdef CONFIG_PM diff --git a/drivers/rtc/rtc-ds1305.c b/drivers/rtc/rtc-ds1305.c index 2dd586a..129add77 100644 --- a/drivers/rtc/rtc-ds1305.c +++ b/drivers/rtc/rtc-ds1305.c @@ -756,19 +756,17 @@ static int ds1305_probe(struct spi_device *spi) status = devm_request_irq(&spi->dev, spi->irq, ds1305_irq, 0, dev_name(&ds1305->rtc->dev), ds1305); if (status < 0) { - dev_dbg(&spi->dev, "request_irq %d --> %d\n", + dev_err(&spi->dev, "request_irq %d --> %d\n", spi->irq, status); - return status; + } else { + device_set_wakeup_capable(&spi->dev, 1); } - - device_set_wakeup_capable(&spi->dev, 1); } /* export NVRAM */ status = sysfs_create_bin_file(&spi->dev.kobj, &nvram); if (status < 0) { - dev_dbg(&spi->dev, "register nvram --> %d\n", status); - return status; + dev_err(&spi->dev, "register nvram --> %d\n", status); } return 0; diff --git a/drivers/rtc/rtc-ds1307.c b/drivers/rtc/rtc-ds1307.c index 4e75345..2c65081 100644 --- a/drivers/rtc/rtc-ds1307.c +++ b/drivers/rtc/rtc-ds1307.c @@ -930,52 +930,54 @@ read_rtc: ds1307->rtc = devm_rtc_device_register(&client->dev, client->name, &ds13xx_rtc_ops, THIS_MODULE); if (IS_ERR(ds1307->rtc)) { - err = PTR_ERR(ds1307->rtc); - dev_err(&client->dev, - "unable to register the class device\n"); - goto exit; + return PTR_ERR(ds1307->rtc); } if (want_irq) { err = request_irq(client->irq, ds1307_irq, IRQF_SHARED, ds1307->rtc->name, client); if (err) { - dev_err(&client->dev, - "unable to request IRQ!\n"); - goto exit; - } + client->irq = 0; + dev_err(&client->dev, "unable to request IRQ!\n"); + } else { - device_set_wakeup_capable(&client->dev, 1); - set_bit(HAS_ALARM, &ds1307->flags); - dev_dbg(&client->dev, "got IRQ %d\n", client->irq); + device_set_wakeup_capable(&client->dev, 1); + set_bit(HAS_ALARM, &ds1307->flags); + dev_dbg(&client->dev, "got IRQ %d\n", client->irq); + } } if (chip->nvram_size) { + ds1307->nvram = devm_kzalloc(&client->dev, sizeof(struct bin_attribute), GFP_KERNEL); if (!ds1307->nvram) { - err = -ENOMEM; - goto err_irq; + dev_err(&client->dev, "cannot allocate memory for nvram sysfs\n"); + } else { + + ds1307->nvram->attr.name = "nvram"; + ds1307->nvram->attr.mode = S_IRUGO | S_IWUSR; + + sysfs_bin_attr_init(ds1307->nvram); + + ds1307->nvram->read = ds1307_nvram_read; + ds1307->nvram->write = ds1307_nvram_write; + ds1307->nvram->size = chip->nvram_size; + ds1307->nvram_offset = chip->nvram_offset; + + err = sysfs_create_bin_file(&client->dev.kobj, ds1307->nvram); + if (err) { + dev_err(&client->dev, "unable to create sysfs file: %s\n", ds1307->nvram->attr.name); + } else { + set_bit(HAS_NVRAM, &ds1307->flags); + dev_info(&client->dev, "%zu bytes nvram\n", ds1307->nvram->size); + } } - ds1307->nvram->attr.name = "nvram"; - ds1307->nvram->attr.mode = S_IRUGO | S_IWUSR; - sysfs_bin_attr_init(ds1307->nvram); - ds1307->nvram->read = ds1307_nvram_read; - ds1307->nvram->write = ds1307_nvram_write; - ds1307->nvram->size = chip->nvram_size; - ds1307->nvram_offset = chip->nvram_offset; - err = sysfs_create_bin_file(&client->dev.kobj, ds1307->nvram); - if (err) - goto err_irq; - set_bit(HAS_NVRAM, &ds1307->flags); - dev_info(&client->dev, "%zu bytes nvram\n", ds1307->nvram->size); } return 0; -err_irq: - free_irq(client->irq, client); exit: return err; } diff --git a/drivers/rtc/rtc-ds1511.c b/drivers/rtc/rtc-ds1511.c index bc7b4fc..d1c3120 100644 --- a/drivers/rtc/rtc-ds1511.c +++ b/drivers/rtc/rtc-ds1511.c @@ -473,7 +473,6 @@ static struct bin_attribute ds1511_nvram_attr = { static int ds1511_rtc_probe(struct platform_device *pdev) { - struct rtc_device *rtc; struct resource *res; struct rtc_plat_data *pdata; int ret = 0; @@ -526,15 +525,17 @@ static int ds1511_rtc_probe(struct platform_device *pdev) } } - rtc = devm_rtc_device_register(&pdev->dev, pdev->name, &ds1511_rtc_ops, + pdata->rtc = devm_rtc_device_register(&pdev->dev, pdev->name, &ds1511_rtc_ops, THIS_MODULE); - if (IS_ERR(rtc)) - return PTR_ERR(rtc); - pdata->rtc = rtc; + if (IS_ERR(pdata->rtc)) + return PTR_ERR(pdata->rtc); ret = sysfs_create_bin_file(&pdev->dev.kobj, &ds1511_nvram_attr); + if (ret) { + dev_err(&pdev->dev, "Unable to create sysfs entry: %s\n", ds1511_nvram_attr.attr.name); + } - return ret; + return 0; } static int ds1511_rtc_remove(struct platform_device *pdev) diff --git a/drivers/rtc/rtc-ds1553.c b/drivers/rtc/rtc-ds1553.c index fd31571..c4a87f6 100644 --- a/drivers/rtc/rtc-ds1553.c +++ b/drivers/rtc/rtc-ds1553.c @@ -278,7 +278,6 @@ static struct bin_attribute ds1553_nvram_attr = { static int ds1553_rtc_probe(struct platform_device *pdev) { - struct rtc_device *rtc; struct resource *res; unsigned int cen, sec; struct rtc_plat_data *pdata; @@ -321,15 +320,17 @@ static int ds1553_rtc_probe(struct platform_device *pdev) } } - rtc = devm_rtc_device_register(&pdev->dev, pdev->name, + pdata->rtc = devm_rtc_device_register(&pdev->dev, pdev->name, &ds1553_rtc_ops, THIS_MODULE); - if (IS_ERR(rtc)) - return PTR_ERR(rtc); - pdata->rtc = rtc; + if (IS_ERR(pdata->rtc)) + return PTR_ERR(pdata->rtc); ret = sysfs_create_bin_file(&pdev->dev.kobj, &ds1553_nvram_attr); + if (ret) { + dev_err(&pdev->dev, "unable to create sysfs file: %s\n", ds1553_nvram_attr.attr.name); + } - return ret; + return 0; } static int ds1553_rtc_remove(struct platform_device *pdev) diff --git a/drivers/rtc/rtc-ds1672.c b/drivers/rtc/rtc-ds1672.c index 18e2d84..927d119 100644 --- a/drivers/rtc/rtc-ds1672.c +++ b/drivers/rtc/rtc-ds1672.c @@ -177,8 +177,9 @@ static int ds1672_probe(struct i2c_client *client, /* read control register */ err = ds1672_get_control(client, &control); - if (err) - goto exit_devreg; + if (err) { + dev_warn(&client->dev, "Unable to read the control register\n"); + } if (control & DS1672_REG_CONTROL_EOSC) dev_warn(&client->dev, "Oscillator not enabled. " @@ -186,13 +187,11 @@ static int ds1672_probe(struct i2c_client *client, /* Register sysfs hooks */ err = device_create_file(&client->dev, &dev_attr_control); - if (err) - goto exit_devreg; + if (err) { + dev_err(&client->dev, "Unable to create sysfs entry: %s\n", dev_attr_control.attr.name); + } return 0; - - exit_devreg: - return err; } static struct i2c_device_id ds1672_id[] = { diff --git a/drivers/rtc/rtc-ds1742.c b/drivers/rtc/rtc-ds1742.c index 5a1f3b2..99f00f6 100644 --- a/drivers/rtc/rtc-ds1742.c +++ b/drivers/rtc/rtc-ds1742.c @@ -204,8 +204,11 @@ static int ds1742_rtc_probe(struct platform_device *pdev) return PTR_ERR(rtc); ret = sysfs_create_bin_file(&pdev->dev.kobj, &pdata->nvram_attr); + if (ret) { + dev_err(&pdev->dev, "Unable to create sysfs entry: %s\n", pdata->nvram_attr.attr.name); + } - return ret; + return 0; } static int ds1742_rtc_remove(struct platform_device *pdev) diff --git a/drivers/rtc/rtc-ds3232.c b/drivers/rtc/rtc-ds3232.c index b83bb5a5..15497c5 100644 --- a/drivers/rtc/rtc-ds3232.c +++ b/drivers/rtc/rtc-ds3232.c @@ -414,7 +414,6 @@ static int ds3232_probe(struct i2c_client *client, ds3232->rtc = devm_rtc_device_register(&client->dev, client->name, &ds3232_rtc_ops, THIS_MODULE); if (IS_ERR(ds3232->rtc)) { - dev_err(&client->dev, "unable to register the class device\n"); return PTR_ERR(ds3232->rtc); } @@ -423,7 +422,6 @@ static int ds3232_probe(struct i2c_client *client, "ds3232", client); if (ret) { dev_err(&client->dev, "unable to request IRQ\n"); - return ret; } } diff --git a/drivers/rtc/rtc-ep93xx.c b/drivers/rtc/rtc-ep93xx.c index 5e4f5dc..843fb29 100644 --- a/drivers/rtc/rtc-ep93xx.c +++ b/drivers/rtc/rtc-ep93xx.c @@ -153,8 +153,9 @@ static int ep93xx_rtc_probe(struct platform_device *pdev) } err = sysfs_create_group(&pdev->dev.kobj, &ep93xx_rtc_sysfs_files); - if (err) - goto exit; + if (err) { + dev_err(&pdev->dev, "Unable to create sysfs entries\n"); + } return 0; diff --git a/drivers/rtc/rtc-isl1208.c b/drivers/rtc/rtc-isl1208.c index c3c549d..db35428 100644 --- a/drivers/rtc/rtc-isl1208.c +++ b/drivers/rtc/rtc-isl1208.c @@ -642,6 +642,17 @@ isl1208_probe(struct i2c_client *client, const struct i2c_device_id *id) dev_info(&client->dev, "chip found, driver version " DRV_VERSION "\n"); + rc = isl1208_i2c_get_sr(client); + if (rc < 0) { + dev_err(&client->dev, "reading status failed\n"); + return rc; + } + + if (rc & ISL1208_REG_SR_RTCF) + dev_warn(&client->dev, "rtc power failure detected, " + "please set clock.\n"); + + if (client->irq > 0) { rc = devm_request_threaded_irq(&client->dev, client->irq, NULL, isl1208_rtc_interrupt, @@ -667,19 +678,10 @@ isl1208_probe(struct i2c_client *client, const struct i2c_device_id *id) i2c_set_clientdata(client, rtc); - rc = isl1208_i2c_get_sr(client); - if (rc < 0) { - dev_err(&client->dev, "reading status failed\n"); - return rc; - } - - if (rc & ISL1208_REG_SR_RTCF) - dev_warn(&client->dev, "rtc power failure detected, " - "please set clock.\n"); - rc = sysfs_create_group(&client->dev.kobj, &isl1208_rtc_sysfs_files); - if (rc) - return rc; + if (rc) { + dev_err(&client->dev, "Unable to create sysfs entries\n"); + } return 0; } diff --git a/drivers/rtc/rtc-jz4740.c b/drivers/rtc/rtc-jz4740.c index 1b126d2..819f008 100644 --- a/drivers/rtc/rtc-jz4740.c +++ b/drivers/rtc/rtc-jz4740.c @@ -247,6 +247,16 @@ static int jz4740_rtc_probe(struct platform_device *pdev) return -EBUSY; } + scratchpad = jz4740_rtc_reg_read(rtc, JZ_REG_RTC_SCRATCHPAD); + if (scratchpad != 0x12345678) { + ret = jz4740_rtc_reg_write(rtc, JZ_REG_RTC_SCRATCHPAD, 0x12345678); + ret = jz4740_rtc_reg_write(rtc, JZ_REG_RTC_SEC, 0); + if (ret) { + dev_err(&pdev->dev, "Could not write write to RTC registers\n"); + return ret; + } + } + spin_lock_init(&rtc->lock); platform_set_drvdata(pdev, rtc); @@ -256,26 +266,13 @@ static int jz4740_rtc_probe(struct platform_device *pdev) rtc->rtc = devm_rtc_device_register(&pdev->dev, pdev->name, &jz4740_rtc_ops, THIS_MODULE); if (IS_ERR(rtc->rtc)) { - ret = PTR_ERR(rtc->rtc); - dev_err(&pdev->dev, "Failed to register rtc device: %d\n", ret); - return ret; + return PTR_ERR(rtc->rtc); } ret = devm_request_irq(&pdev->dev, rtc->irq, jz4740_rtc_irq, 0, pdev->name, rtc); if (ret) { dev_err(&pdev->dev, "Failed to request rtc irq: %d\n", ret); - return ret; - } - - scratchpad = jz4740_rtc_reg_read(rtc, JZ_REG_RTC_SCRATCHPAD); - if (scratchpad != 0x12345678) { - ret = jz4740_rtc_reg_write(rtc, JZ_REG_RTC_SCRATCHPAD, 0x12345678); - ret = jz4740_rtc_reg_write(rtc, JZ_REG_RTC_SEC, 0); - if (ret) { - dev_err(&pdev->dev, "Could not write write to RTC registers\n"); - return ret; - } } return 0; diff --git a/drivers/rtc/rtc-mc13xxx.c b/drivers/rtc/rtc-mc13xxx.c index 77ea989..25ff1f6 100644 --- a/drivers/rtc/rtc-mc13xxx.c +++ b/drivers/rtc/rtc-mc13xxx.c @@ -355,22 +355,22 @@ static int __init mc13xxx_rtc_probe(struct platform_device *pdev) &mc13xxx_rtc_ops, THIS_MODULE); if (IS_ERR(priv->rtc)) { ret = PTR_ERR(priv->rtc); + } - mc13xxx_lock(mc13xxx); + mc13xxx_lock(mc13xxx); - mc13xxx_irq_free(mc13xxx, MC13XXX_IRQ_TODA, priv); + mc13xxx_irq_free(mc13xxx, MC13XXX_IRQ_TODA, priv); err_alarm_irq_request: - mc13xxx_irq_free(mc13xxx, MC13XXX_IRQ_1HZ, priv); + mc13xxx_irq_free(mc13xxx, MC13XXX_IRQ_1HZ, priv); err_update_irq_request: err_reset_irq_status: - mc13xxx_irq_free(mc13xxx, MC13XXX_IRQ_RTCRST, priv); + mc13xxx_irq_free(mc13xxx, MC13XXX_IRQ_RTCRST, priv); err_reset_irq_request: - mc13xxx_unlock(mc13xxx); - } + mc13xxx_unlock(mc13xxx); return ret; } diff --git a/drivers/rtc/rtc-pl031.c b/drivers/rtc/rtc-pl031.c index 99181fff..a830c42 100644 --- a/drivers/rtc/rtc-pl031.c +++ b/drivers/rtc/rtc-pl031.c @@ -376,7 +376,7 @@ static int pl031_probe(struct amba_device *adev, const struct amba_id *id) if (IS_ERR(ldata->rtc)) { ret = PTR_ERR(ldata->rtc); goto out_no_rtc; - } + } if (request_irq(adev->irq[0], pl031_interrupt, vendor->irqflags, "rtc-pl031", ldata)) { diff --git a/drivers/rtc/rtc-pm8xxx.c b/drivers/rtc/rtc-pm8xxx.c index 03f8f75..3dfac16 100644 --- a/drivers/rtc/rtc-pm8xxx.c +++ b/drivers/rtc/rtc-pm8xxx.c @@ -454,8 +454,6 @@ static int pm8xxx_rtc_probe(struct platform_device *pdev) rtc_dd->rtc = devm_rtc_device_register(&pdev->dev, "pm8xxx_rtc", &pm8xxx_rtc_ops, THIS_MODULE); if (IS_ERR(rtc_dd->rtc)) { - dev_err(&pdev->dev, "%s: RTC registration failed (%ld)\n", - __func__, PTR_ERR(rtc_dd->rtc)); return PTR_ERR(rtc_dd->rtc); } @@ -465,13 +463,10 @@ static int pm8xxx_rtc_probe(struct platform_device *pdev) "pm8xxx_rtc_alarm", rtc_dd); if (rc < 0) { dev_err(&pdev->dev, "Request IRQ failed (%d)\n", rc); - return rc; } device_init_wakeup(&pdev->dev, 1); - dev_dbg(&pdev->dev, "Probe success !!\n"); - return 0; } diff --git a/drivers/rtc/rtc-rs5c372.c b/drivers/rtc/rtc-rs5c372.c index ccf54f0..c5ca929 100644 --- a/drivers/rtc/rtc-rs5c372.c +++ b/drivers/rtc/rtc-rs5c372.c @@ -577,16 +577,14 @@ static int rs5c372_probe(struct i2c_client *client, smbus_mode = 1; else { /* Still no good, give up */ - err = -ENODEV; - goto exit; + return -ENODEV; } } rs5c372 = devm_kzalloc(&client->dev, sizeof(struct rs5c372), GFP_KERNEL); if (!rs5c372) { - err = -ENOMEM; - goto exit; + return -ENOMEM; } rs5c372->client = client; @@ -598,8 +596,8 @@ static int rs5c372_probe(struct i2c_client *client, rs5c372->smbus = smbus_mode; err = rs5c_get_regs(rs5c372); - if (err < 0) - goto exit; + if (err) + return err; /* clock may be set for am/pm or 24 hr time */ switch (rs5c372->type) { @@ -623,7 +621,7 @@ static int rs5c372_probe(struct i2c_client *client, break; default: dev_err(&client->dev, "unknown RTC type\n"); - goto exit; + return -ENODEV; } /* if the oscillator lost power and no other software (like @@ -635,7 +633,7 @@ static int rs5c372_probe(struct i2c_client *client, err = rs5c_oscillator_setup(rs5c372); if (unlikely(err < 0)) { dev_err(&client->dev, "setup error\n"); - goto exit; + return err; } if (rs5c372_get_datetime(client, &tm) < 0) @@ -660,18 +658,15 @@ static int rs5c372_probe(struct i2c_client *client, &rs5c372_rtc_ops, THIS_MODULE); if (IS_ERR(rs5c372->rtc)) { - err = PTR_ERR(rs5c372->rtc); - goto exit; + return PTR_ERR(rs5c372->rtc); } err = rs5c_sysfs_register(&client->dev); - if (err) - goto exit; + if (err) { + dev_err(&client->dev, "Unable to create sysfs entries\n"); + } return 0; - -exit: - return err; } static int rs5c372_remove(struct i2c_client *client) diff --git a/drivers/rtc/rtc-rx8025.c b/drivers/rtc/rtc-rx8025.c index 8fa23ea..dae9d1a 100644 --- a/drivers/rtc/rtc-rx8025.c +++ b/drivers/rtc/rtc-rx8025.c @@ -545,15 +545,13 @@ static int rx8025_probe(struct i2c_client *client, | I2C_FUNC_SMBUS_I2C_BLOCK)) { dev_err(&adapter->dev, "doesn't support required functionality\n"); - err = -EIO; - goto errout; + return -EIO; } rx8025 = devm_kzalloc(&client->dev, sizeof(*rx8025), GFP_KERNEL); if (!rx8025) { dev_err(&adapter->dev, "failed to alloc memory\n"); - err = -ENOMEM; - goto errout; + return -ENOMEM; } rx8025->client = client; @@ -562,7 +560,7 @@ static int rx8025_probe(struct i2c_client *client, err = rx8025_init_client(client, &need_reset); if (err) - goto errout; + return err; if (need_reset) { struct rtc_time tm; @@ -575,9 +573,7 @@ static int rx8025_probe(struct i2c_client *client, rx8025->rtc = devm_rtc_device_register(&client->dev, client->name, &rx8025_rtc_ops, THIS_MODULE); if (IS_ERR(rx8025->rtc)) { - err = PTR_ERR(rx8025->rtc); - dev_err(&client->dev, "unable to register the class device\n"); - goto errout; + return PTR_ERR(rx8025->rtc); } if (client->irq > 0) { @@ -585,8 +581,8 @@ static int rx8025_probe(struct i2c_client *client, err = request_irq(client->irq, rx8025_irq, 0, "rx8025", client); if (err) { - dev_err(&client->dev, "unable to request IRQ\n"); - goto errout; + client->irq = 0; + dev_err(&client->dev, "Unable to request IRQ\n"); } } @@ -594,18 +590,11 @@ static int rx8025_probe(struct i2c_client *client, rx8025->rtc->max_user_freq = 1; err = rx8025_sysfs_register(&client->dev); - if (err) - goto errout_irq; + if (err) { + dev_err(&client->dev, "Unable to create sysfs entries\n"); + } return 0; - -errout_irq: - if (client->irq > 0) - free_irq(client->irq, client); - -errout: - dev_err(&adapter->dev, "probing for rx8025 failed\n"); - return err; } static int rx8025_remove(struct i2c_client *client) diff --git a/drivers/rtc/rtc-sirfsoc.c b/drivers/rtc/rtc-sirfsoc.c index 3eb3642..a4bab3d 100644 --- a/drivers/rtc/rtc-sirfsoc.c +++ b/drivers/rtc/rtc-sirfsoc.c @@ -293,9 +293,7 @@ static int sirfsoc_rtc_probe(struct platform_device *pdev) rtcdrv->rtc = devm_rtc_device_register(&pdev->dev, pdev->name, &sirfsoc_rtc_ops, THIS_MODULE); if (IS_ERR(rtcdrv->rtc)) { - err = PTR_ERR(rtcdrv->rtc); - dev_err(&pdev->dev, "can't register RTC device\n"); - return err; + return PTR_ERR(rtcdrv->rtc); } /* 0x3 -> RTC_CLK */ @@ -322,7 +320,6 @@ static int sirfsoc_rtc_probe(struct platform_device *pdev) rtcdrv); if (err) { dev_err(&pdev->dev, "Unable to register for the SiRF SOC RTC IRQ\n"); - return err; } return 0; diff --git a/drivers/rtc/rtc-test.c b/drivers/rtc/rtc-test.c index 7746e65..b9b4d00 100644 --- a/drivers/rtc/rtc-test.c +++ b/drivers/rtc/rtc-test.c @@ -104,20 +104,17 @@ static int test_probe(struct platform_device *plat_dev) rtc = devm_rtc_device_register(&plat_dev->dev, "test", &test_rtc_ops, THIS_MODULE); if (IS_ERR(rtc)) { - err = PTR_ERR(rtc); - return err; + return PTR_ERR(rtc); } err = device_create_file(&plat_dev->dev, &dev_attr_irq); - if (err) - goto err; + if (err) { + dev_err(&plat_dev->dev, "Unable to create sysfs entry: %s\n", dev_attr_irq.attr.name); + } platform_set_drvdata(plat_dev, rtc); return 0; - -err: - return err; } static int test_remove(struct platform_device *plat_dev) diff --git a/drivers/rtc/rtc-twl.c b/drivers/rtc/rtc-twl.c index 1915464..0a37c6c 100644 --- a/drivers/rtc/rtc-twl.c +++ b/drivers/rtc/rtc-twl.c @@ -529,8 +529,6 @@ static int twl_rtc_probe(struct platform_device *pdev) rtc = devm_rtc_device_register(&pdev->dev, pdev->name, &twl_rtc_ops, THIS_MODULE); if (IS_ERR(rtc)) { - dev_err(&pdev->dev, "can't register RTC device, err %ld\n", - PTR_ERR(rtc)); return PTR_ERR(rtc); } @@ -540,7 +538,6 @@ static int twl_rtc_probe(struct platform_device *pdev) dev_name(&rtc->dev), rtc); if (ret < 0) { dev_err(&pdev->dev, "IRQ is not free.\n"); - return ret; } platform_set_drvdata(pdev, rtc); diff --git a/drivers/rtc/rtc-x1205.c b/drivers/rtc/rtc-x1205.c index 365dc65..e0ec42c 100644 --- a/drivers/rtc/rtc-x1205.c +++ b/drivers/rtc/rtc-x1205.c @@ -659,8 +659,9 @@ static int x1205_probe(struct i2c_client *client, } err = x1205_sysfs_register(&client->dev); - if (err) - return err; + if (err) { + dev_err(&client->dev, "Unable to create sysfs entries\n"); + } return 0; }