On 21/11/2023 10:46, Jingbao Qiu wrote: > Implement the RTC driver for CV1800B, which able to provide time and > alarm functionality. > > Signed-off-by: Jingbao Qiu <qiujingbao.dlmu@xxxxxxxxx> > --- > drivers/rtc/Kconfig | 10 ++ > drivers/rtc/Makefile | 1 + > drivers/rtc/rtc-cv1800b.c | 293 ++++++++++++++++++++++++++++++++++++++ > 3 files changed, 304 insertions(+) > create mode 100644 drivers/rtc/rtc-cv1800b.c Bindings were not tested, so I assume you did not compile the code either. Please confirm that you fixed all warnings pointed out by W=1 builds, smatch and sparse. All of them. > > diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig > index 3814e0845e77..2089cceea38c 100644 > --- a/drivers/rtc/Kconfig > +++ b/drivers/rtc/Kconfig > @@ -1103,6 +1103,16 @@ config RTC_DRV_DS2404 > This driver can also be built as a module. If so, the module > will be called rtc-ds2404. > > +config RTC_DRV_CV1800B > + tristate "Sophgo CV1800B RTC" > + depends on ARCH_SOPHGO || COMPILE_TEST > + help > + If you say yes here you will get support for the > + RTC of the Sophgo CV1800B SOC. > + > + This depend on ARCH_SOPHGO and COMPILE_TEST. Please > + first config that. ... > +static int cv1800b_rtc_probe(struct platform_device *pdev) > +{ > + struct cv1800b_rtc_priv *rtc; > + struct resource *res; > + int ret; > + > + rtc = devm_kzalloc(&pdev->dev, sizeof(*rtc), GFP_KERNEL); > + if (!rtc) > + return -ENOMEM; > + > + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); > + if (!res) { > + ret = -ENODEV; > + goto err; > + } > + > + rtc->core_map = devm_ioremap_resource(&pdev->dev, res); Use helper combining these two calls. > + if (IS_ERR(rtc->core_map)) { > + ret = PTR_ERR(rtc->core_map); > + goto err; > + } > + > + rtc->irq = platform_get_irq(pdev, 0); > + platform_set_drvdata(pdev, rtc); Your code has random order. First you get IRQ, then you check its value, then you go further. > + if (rtc->irq < 0) { > + ret = -EINVAL; > + goto err; > + } > + > + ret = > + devm_request_irq(&pdev->dev, rtc->irq, cv1800b_rtc_irq_handler, Wrong wrapping. > + IRQF_SHARED, "rtc alarm", &pdev->dev); Why shared? > + if (ret) > + goto err; > + > + rtc->clk = devm_clk_get(&pdev->dev, NULL); > + if (IS_ERR(rtc->clk)) { > + dev_err(&pdev->dev, "no clock"); This code is not ready for upstream. There are multiple things wrong here. First, syntax is return dev_err_probe. Second, you do not have clocks and you do not allow them! Just open your binding. Third, use wrapper - devm_clk_get_enable or something like that. > + ret = PTR_ERR(rtc->clk); > + goto err; > + } Blank line. > + ret = clk_prepare_enable(rtc->clk); > + if (ret) > + goto err; Blank line. > + ret = cv1800b_rtc_softinit(rtc); > + if (ret) > + goto err; > + cv1800b_rtc_alarm_irq_enable(&pdev->dev, 1); > + rtc->rtc_dev = devm_rtc_allocate_device(&pdev->dev); > + if (IS_ERR(rtc->rtc_dev)) { > + ret = PTR_ERR(rtc->rtc_dev); > + goto err; > + } > + rtc->rtc_dev->range_max = U32_MAX; > + rtc->rtc_dev->ops = &cv800b_rtc_ops; > + > + return rtc_register_device(rtc->rtc_dev); > +err: > + return dev_err_probe(&pdev->dev, ret, "Failed to init cv1800b rtc\n"); Drop, just return. Best regards, Krzysztof