From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 5A032C001E0 for ; Wed, 9 Aug 2023 08:13:06 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231486AbjHIINF (ORCPT ); Wed, 9 Aug 2023 04:13:05 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59912 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230523AbjHIINE (ORCPT ); Wed, 9 Aug 2023 04:13:04 -0400 Received: from mail-pl1-x631.google.com (mail-pl1-x631.google.com [IPv6:2607:f8b0:4864:20::631]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7ADE71736; Wed, 9 Aug 2023 01:12:59 -0700 (PDT) Received: by mail-pl1-x631.google.com with SMTP id d9443c01a7336-1bc7e65ea44so4844985ad.1; Wed, 09 Aug 2023 01:12:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1691568779; x=1692173579; h=content-transfer-encoding:in-reply-to:from:content-language :references:cc:to:subject:user-agent:mime-version:date:message-id :from:to:cc:subject:date:message-id:reply-to; bh=HGi+I0X98yYTQWfLVJqeABIuTLMwNChc7qAz4vbozrE=; b=IL9596BVQqIVfbjlbPd34w3eRFt3rh4Kv+NvcuWWW26YXruQiRqRMMUgQh1WyajqCt U40St3d3Dje6oVKKTO2YZnnuy4bmCzm0duvZdRES93hAe1w6N5RdZa7inChx2Zav+4DA OTMM+OCx87fG+PFM2osD7oOvC8yYukAp9mXpT5+/Mtr6sf4jqsCjnp/MYoKxRtCl3KjO Sl7NESq922ku7SfjfSa8ComEcGucHm3Awbw7fL+/pTAia5/3Quq9KP6pgOvvSq0hra/J veyh4m7071BR00S3Y6tQZ7U7OCGQqbQSOQUORyIhsMUmOZHe0Khzz2YRTknBsrHZ8zwY f5Iw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1691568779; x=1692173579; h=content-transfer-encoding:in-reply-to:from:content-language :references:cc:to:subject:user-agent:mime-version:date:message-id :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=HGi+I0X98yYTQWfLVJqeABIuTLMwNChc7qAz4vbozrE=; b=NgdXuFDonuIX3vHq0W8urNySTUeCaLyfxCA+vhcAf1H3qojXt3ZB01Rb9mO6sHcBlA zJMLJrIOPAFrvXZ7oCejEi9fVy+KA7MHfOhmH7nZJ1LaUnfqx85FElE4mWla3d4L18tL OA06+OZR/kpVOfRshYEVwBBMfOcPg8X7qz5LEaKFARqUROV7unZhNYO7lA9w71ayzuTu UT9d4TICU237LBR3eLKHcbKgp5M2tBbSph3B/XgPLsY6oq55S9Pq+0KuUU4E6g07QjiV 2WeumXlkPKp4i/QlBXp4UlSOL/IRhX1o+v9qQFFWXA8Cl1f/qa1T8TBYl+Bavae89BSU bJ8w== X-Gm-Message-State: AOJu0YxTUe1IRXA43PqrxpGBDvZ/x4TNTa6Qy4n10ABGFszQJ3nFQvSj POOg4vkd2Zl5UzCYWAlxepc= X-Google-Smtp-Source: AGHT+IFDcLD09vqfO+TJnS2tTZ6ux/nNDoNRIxEJ7PROsKAlQQyu8im4YuAi7ttOxBqcdhKLWZ6xIg== X-Received: by 2002:a17:903:32c6:b0:1ae:6947:e63b with SMTP id i6-20020a17090332c600b001ae6947e63bmr2817181plr.16.1691568778702; Wed, 09 Aug 2023 01:12:58 -0700 (PDT) Received: from [172.19.1.47] (60-250-192-107.hinet-ip.hinet.net. [60.250.192.107]) by smtp.gmail.com with ESMTPSA id c7-20020a170902d48700b001bb9b87ac95sm10472777plg.103.2023.08.09.01.12.56 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 09 Aug 2023 01:12:58 -0700 (PDT) Message-ID: <426130f6-7b8a-91f9-559b-afc5afdc656e@gmail.com> Date: Wed, 9 Aug 2023 16:12:54 +0800 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Thunderbird/102.14.0 Subject: Re: [RESEND PATCH v2 3/3] rtc: Add driver for Nuvoton ma35d1 rtc controller To: Alexandre Belloni Cc: a.zummo@towertech.it, robh+dt@kernel.org, krzysztof.kozlowski+dt@linaro.org, conor+dt@kernel.org, linux-rtc@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, soc@kernel.org, mjchen@nuvoton.com, schung@nuvoton.com, Jacky Huang References: <20230809011542.429945-1-ychuang570808@gmail.com> <20230809011542.429945-4-ychuang570808@gmail.com> <20230809021025a7c0daec@mail.local> Content-Language: en-US From: Jacky Huang In-Reply-To: <20230809021025a7c0daec@mail.local> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-rtc@vger.kernel.org On 2023/8/9 上午 10:10, Alexandre Belloni wrote: > Hello, > > On 09/08/2023 01:15:42+0000, Jacky Huang wrote: >> + >> +struct ma35_bcd_time { >> + int bcd_sec; >> + int bcd_min; >> + int bcd_hour; >> + int bcd_mday; >> + int bcd_mon; >> + int bcd_year; >> +}; > I don't get why this struct is useful. I will remove this and modify code. >> + >> +static irqreturn_t ma35d1_rtc_interrupt(int irq, void *data) >> +{ >> + struct ma35_rtc *rtc = (struct ma35_rtc *)data; >> + unsigned long events = 0, rtc_irq; >> + >> + rtc_irq = rtc_reg_read(rtc, MA35_REG_RTC_INTSTS); >> + >> + if (rtc_irq & RTC_INTSTS_ALMIF) { >> + rtc_reg_write(rtc, MA35_REG_RTC_INTSTS, RTC_INTSTS_ALMIF); >> + events |= RTC_AF | RTC_IRQF; >> + } >> + >> + if (rtc_irq & RTC_INTSTS_TICKIF) { >> + rtc_reg_write(rtc, MA35_REG_RTC_INTSTS, RTC_INTSTS_TICKIF); >> + events |= RTC_UF | RTC_IRQF; > How did you test this path? We use BusyBox 'date' command to observe the time changed. In addition, we wrote a simple code to test it. (https://github.com/OpenNuvoton/MA35D1_Linux_Applications/tree/master/examples/rtc) >> + } >> + >> + rtc_update_irq(rtc->rtcdev, 1, events); >> + >> + return IRQ_HANDLED; >> +} >> + >> +static int ma35d1_rtc_init(struct ma35_rtc *rtc, u32 ms_timeout) >> +{ >> + const unsigned long timeout = jiffies + msecs_to_jiffies(ms_timeout); >> + >> + do { >> + if (rtc_reg_read(rtc, MA35_REG_RTC_INIT) & RTC_INIT_ACTIVE) >> + return 0; >> + >> + rtc_reg_write(rtc, MA35_REG_RTC_INIT, RTC_INIT_MAGIC_CODE); >> + >> + mdelay(1); >> + >> + } while (time_before(jiffies, timeout)); >> + >> + return -ETIMEDOUT; >> +} >> + >> +static int ma35d1_rtc_bcd2bin(u32 time, u32 cal, u32 wday, struct rtc_time *tm) >> +{ >> + tm->tm_mday = bcd2bin(cal >> 0); >> + tm->tm_mon = bcd2bin(cal >> 8); >> + tm->tm_mon = tm->tm_mon - 1; >> + tm->tm_year = bcd2bin(cal >> 16) + 100; >> + >> + tm->tm_sec = bcd2bin(time >> 0); >> + tm->tm_min = bcd2bin(time >> 8); >> + tm->tm_hour = bcd2bin(time >> 16); >> + >> + tm->tm_wday = wday; >> + >> + return rtc_valid_tm(tm); >> +} >> + >> +static int ma35d1_rtc_alarm_bcd2bin(u32 talm, u32 calm, struct rtc_time *tm) >> +{ >> + tm->tm_mday = bcd2bin(calm >> 0); >> + tm->tm_mon = bcd2bin(calm >> 8); >> + tm->tm_mon = tm->tm_mon - 1; >> + tm->tm_year = bcd2bin(calm >> 16) + 100; >> + >> + tm->tm_sec = bcd2bin(talm >> 0); >> + tm->tm_min = bcd2bin(talm >> 8); >> + tm->tm_hour = bcd2bin(talm >> 16); >> + >> + return rtc_valid_tm(tm); >> +} >> + >> +static void ma35d1_rtc_bin2bcd(struct device *dev, struct rtc_time *settm, >> + struct ma35_bcd_time *gettm) >> +{ >> + gettm->bcd_mday = bin2bcd(settm->tm_mday) << 0; >> + gettm->bcd_mon = bin2bcd((settm->tm_mon + 1)) << 8; >> + >> + if (settm->tm_year < 100) { >> + dev_warn(dev, "The year will be between 1970-1999, right?\n"); > No, don't do that, properly set the rtc hardware range and let the user > choose their time offset/window. We will modify the code as: #define MA35_BASE_YEAR 2000 /* assume 20YY not 19YY */ int year; year = tm->tm_year + 1900 – MA35_BASE_YEAR; if (year < 0) {     dev_err(dev, "invalid year: %d\n", year);     return -EINVAL; } >> + gettm->bcd_year = bin2bcd(settm->tm_year) << 16; >> + } else { >> + gettm->bcd_year = bin2bcd(settm->tm_year - 100) << 16; >> + } >> + >> + gettm->bcd_sec = bin2bcd(settm->tm_sec) << 0; >> + gettm->bcd_min = bin2bcd(settm->tm_min) << 8; >> + gettm->bcd_hour = bin2bcd(settm->tm_hour) << 16; >> +} > Those functions are only used once, simply put them in their call site. Sure, I will remove this function and put the code in their call site >> + >> +static int ma35d1_alarm_irq_enable(struct device *dev, u32 enabled) >> +{ >> + struct ma35_rtc *rtc = dev_get_drvdata(dev); >> + u32 reg_ien; >> + >> + reg_ien = rtc_reg_read(rtc, MA35_REG_RTC_INTEN); >> + >> + if (enabled) >> + rtc_reg_write(rtc, MA35_REG_RTC_INTEN, reg_ien | RTC_INTEN_ALMIEN); >> + else >> + rtc_reg_write(rtc, MA35_REG_RTC_INTEN, reg_ien & ~RTC_INTEN_ALMIEN); >> + >> + return 0; >> +} >> + >> +static int ma35d1_rtc_read_time(struct device *dev, struct rtc_time *tm) >> +{ >> + struct ma35_rtc *rtc = dev_get_drvdata(dev); >> + u32 time, cal, wday; >> + >> + time = rtc_reg_read(rtc, MA35_REG_RTC_TIME); >> + cal = rtc_reg_read(rtc, MA35_REG_RTC_CAL); >> + wday = rtc_reg_read(rtc, MA35_REG_RTC_WEEKDAY); > Are the registers properly latched when reading? How do you ensure that > MA35_REG_RTC_TIME didn't change before reading MA35_REG_RTC_CAL ? We will update the code as do {     time = rtc_reg_read(rtc, MA35_REG_RTC_TIME);     cal  = rtc_reg_read(rtc, MA35_REG_RTC_CAL);     wday = rtc_reg_read(rtc, MA35_REG_RTC_WEEKDAY); } while ((time != rtc_reg_read(rtc, MA35_REG_RTC_TIME)) ||          (cal != rtc_reg_read(rtc, MA35_REG_RTC_CAL)) ||          (wday != = rtc_reg_read(rtc, MA35_REG_RTC_WEEKDAY)) ); >> + >> + return ma35d1_rtc_bcd2bin(time, cal, wday, tm); >> +} >> + >> +static int ma35d1_rtc_set_time(struct device *dev, struct rtc_time *tm) >> +{ >> + struct ma35_rtc *rtc = dev_get_drvdata(dev); >> + struct ma35_bcd_time gettm; >> + u32 val; >> + >> + ma35d1_rtc_bin2bcd(dev, tm, &gettm); >> + >> + val = gettm.bcd_mday | gettm.bcd_mon | gettm.bcd_year; >> + rtc_reg_write(rtc, MA35_REG_RTC_CAL, val); >> + >> + val = gettm.bcd_sec | gettm.bcd_min | gettm.bcd_hour; >> + rtc_reg_write(rtc, MA35_REG_RTC_TIME, val); >> + > Same question about latching, shouldn't you stop the rtc while doing > this? In fact, once enabled, the RTC hardware of MA35D1 cannot be stopped; this is how the hardware is designed. Inside the MA35D1 RTC, there's an internal counter that advances by 128 counts per second. When the time or date register is updated, the internal counter of the RTC hardware will automatically reset to 0, so there is no need to worry about memory latch issues. >> + val = tm->tm_wday; >> + rtc_reg_write(rtc, MA35_REG_RTC_WEEKDAY, val); >> + >> + return 0; >> +} >> + >> +static int ma35d1_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm) >> +{ >> + struct ma35_rtc *rtc = dev_get_drvdata(dev); >> + struct ma35_bcd_time tm; >> + unsigned long val; >> + >> + ma35d1_rtc_bin2bcd(dev, &alrm->time, &tm); >> + >> + val = tm.bcd_mday | tm.bcd_mon | tm.bcd_year; >> + rtc_reg_write(rtc, MA35_REG_RTC_CALM, val); >> + >> + val = tm.bcd_sec | tm.bcd_min | tm.bcd_hour; >> + rtc_reg_write(rtc, MA35_REG_RTC_TALM, val); >> + > What about handling alrm.enabled here? The MA35D1 RTC hardware design does not have an alarm enable/disable bit. The decision to utilize the alarm can only be made through enabling or disabling the alarm interrupt. >> + return 0; >> +} >> + >> +static const struct rtc_class_ops ma35d1_rtc_ops = { >> + .read_time = ma35d1_rtc_read_time, >> + .set_time = ma35d1_rtc_set_time, >> + .read_alarm = ma35d1_rtc_read_alarm, >> + .set_alarm = ma35d1_rtc_set_alarm, >> + .alarm_irq_enable = ma35d1_alarm_irq_enable, >> +}; >> + >> +static int ma35d1_rtc_probe(struct platform_device *pdev) >> +{ >> + struct ma35_rtc *rtc; >> + struct clk *clk; >> + u32 regval; >> + int err; >> + >> + rtc = devm_kzalloc(&pdev->dev, sizeof(*rtc), GFP_KERNEL); >> + if (!rtc) >> + return -ENOMEM; >> + >> + rtc->rtc_reg = devm_platform_ioremap_resource(pdev, 0); >> + if (IS_ERR(rtc->rtc_reg)) >> + return PTR_ERR(rtc->rtc_reg); >> + >> + clk = of_clk_get(pdev->dev.of_node, 0); >> + if (IS_ERR(clk)) >> + return dev_err_probe(&pdev->dev, PTR_ERR(clk), "failed to find rtc clock\n"); >> + >> + err = clk_prepare_enable(clk); >> + if (err) >> + return -ENOENT; >> + >> + platform_set_drvdata(pdev, rtc); >> + >> + rtc->rtcdev = devm_rtc_device_register(&pdev->dev, pdev->name, >> + &ma35d1_rtc_ops, THIS_MODULE); >> + if (IS_ERR(rtc->rtcdev)) >> + return dev_err_probe(&pdev->dev, PTR_ERR(rtc->rtcdev), >> + "failed to register rtc device\n"); > This MUST be done last in probe, else you open a race with userspace. > Yes, I will moved it to last in probe. >> + >> + err = ma35d1_rtc_init(rtc, RTC_INIT_TIMEOUT); >> + if (err) >> + return err; >> + > I don't believe you should do this on every probe but only when this > hasn't been done yet. > >> + regval = rtc_reg_read(rtc, MA35_REG_RTC_CLKFMT); >> + regval |= RTC_CLKFMT_24HEN; >> + rtc_reg_write(rtc, MA35_REG_RTC_CLKFMT, regval); >> + > ditto I will modify them as: If (!(rtc_reg_read(rtc, MA35_REG_RTC_INIT) & RTC_INIT_ACK)) {     err = ma35d1_rtc_init(rtc, RTC_INIT_TIMEOUT);     if (err)         return err;     regval = rtc_reg_read(rtc, MA35_REG_RTC_CLKFMT);     regval |= RTC_CLKFMT_24HEN;     rtc_reg_write(rtc, MA35_REG_RTC_CLKFMT, regval);} } >> + rtc->irq_num = platform_get_irq(pdev, 0); >> + >> + err = devm_request_irq(&pdev->dev, rtc->irq_num, ma35d1_rtc_interrupt, >> + IRQF_NO_SUSPEND, "ma35d1rtc", rtc); >> + if (err) >> + return dev_err_probe(&pdev->dev, err, "Failed to request rtc irq\n"); >> + >> + regval = rtc_reg_read(rtc, MA35_REG_RTC_INTEN); >> + regval |= RTC_INTEN_TICKIEN; >> + rtc_reg_write(rtc, MA35_REG_RTC_INTEN, regval); >> + >> + device_init_wakeup(&pdev->dev, true); >> + > You must set the rtc range here. I will add: ma35d1_rtc->rtcdev->range_min = RTC_TIMESTAMP_BEGIN_2000; ma35d1_rtc->rtcdev->range_max = RTC_TIMESTAMP_END_2099; >> + return 0; >> +} >> + >> +static int ma35d1_rtc_suspend(struct platform_device *pdev, pm_message_t state) >> +{ >> + struct ma35_rtc *rtc = platform_get_drvdata(pdev); >> + u32 regval; >> + >> + if (device_may_wakeup(&pdev->dev)) >> + enable_irq_wake(rtc->irq_num); >> + >> + regval = rtc_reg_read(rtc, MA35_REG_RTC_INTEN); >> + regval &= ~RTC_INTEN_TICKIEN; >> + rtc_reg_write(rtc, MA35_REG_RTC_INTEN, regval); > This is not what the user is asking, don't do this. Also, how was this > tested? Sure, I will remove these three lines of code. We test it with "echo mem > /sys/power/state". >> + >> + return 0; >> +} >> + >> +static int ma35d1_rtc_resume(struct platform_device *pdev) >> +{ >> + struct ma35_rtc *rtc = platform_get_drvdata(pdev); >> + u32 regval; >> + >> + if (device_may_wakeup(&pdev->dev)) >> + disable_irq_wake(rtc->irq_num); >> + >> + regval = rtc_reg_read(rtc, MA35_REG_RTC_INTEN); >> + regval |= RTC_INTEN_TICKIEN; >> + rtc_reg_write(rtc, MA35_REG_RTC_INTEN, regval); >> + >> + return 0; >> +} >> + >> +static const struct of_device_id ma35d1_rtc_of_match[] = { >> + { .compatible = "nuvoton,ma35d1-rtc", }, >> + {}, >> +}; >> +MODULE_DEVICE_TABLE(of, ma35d1_rtc_of_match); >> + >> +static struct platform_driver ma35d1_rtc_driver = { >> + .suspend = ma35d1_rtc_suspend, >> + .resume = ma35d1_rtc_resume, >> + .probe = ma35d1_rtc_probe, >> + .driver = { >> + .name = "rtc-ma35d1", >> + .of_match_table = ma35d1_rtc_of_match, >> + }, >> +}; >> + >> +module_platform_driver(ma35d1_rtc_driver); >> + >> +MODULE_AUTHOR("Min-Jen Chen "); >> +MODULE_DESCRIPTION("MA35D1 RTC driver"); >> +MODULE_LICENSE("GPL"); >> -- >> 2.34.1 >> Best Regards, Jacky Huang From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 624E5EB64DD for ; Wed, 9 Aug 2023 08:13:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:Content-Type: Content-Transfer-Encoding:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:In-Reply-To:From:References:Cc:To:Subject: MIME-Version:Date:Message-ID:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=qocWvdBsI8fB4R7VpSY0ZXNoog0RjSZYWWGVgx0tmwM=; b=2X0zsGl3gi+/MS vcr3WH8jGit+PiDzE0sR+8zw2V1Ki6Kq6aCURfZpCvm/t6SZJVx+/i+rPAy25IM74o98pLGURVlP4 2ir7U4UgMzXzplS/TuZb6u6pJsyXXLsuryUYsZlIfkY2/o8fVqGgoFo8qvQ4vOgYSrK1jZSscwNkW yvnLSS+pfHEAY+kxRhS6hpcxwI0EuqJGvhFW948utvpQcwUBuzhTxFYATXELxZ58zTP857KbNYenO +LdJBCH0u/6nT+T8llU5IBj0bBHvwgdjgKwwJLm8tsizBtmUBOm2Wo+StAGfwvOuMmWSb84AfKnhi 0sOyhdP8410JmZSuvO3A==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1qTeJX-004L4N-3A; Wed, 09 Aug 2023 08:13:07 +0000 Received: from mail-pl1-x632.google.com ([2607:f8b0:4864:20::632]) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1qTeJR-004L2h-0x for linux-arm-kernel@lists.infradead.org; Wed, 09 Aug 2023 08:13:03 +0000 Received: by mail-pl1-x632.google.com with SMTP id d9443c01a7336-1bbc06f830aso4932525ad.0 for ; Wed, 09 Aug 2023 01:12:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1691568779; x=1692173579; h=content-transfer-encoding:in-reply-to:from:content-language :references:cc:to:subject:user-agent:mime-version:date:message-id :from:to:cc:subject:date:message-id:reply-to; bh=HGi+I0X98yYTQWfLVJqeABIuTLMwNChc7qAz4vbozrE=; b=IL9596BVQqIVfbjlbPd34w3eRFt3rh4Kv+NvcuWWW26YXruQiRqRMMUgQh1WyajqCt U40St3d3Dje6oVKKTO2YZnnuy4bmCzm0duvZdRES93hAe1w6N5RdZa7inChx2Zav+4DA OTMM+OCx87fG+PFM2osD7oOvC8yYukAp9mXpT5+/Mtr6sf4jqsCjnp/MYoKxRtCl3KjO Sl7NESq922ku7SfjfSa8ComEcGucHm3Awbw7fL+/pTAia5/3Quq9KP6pgOvvSq0hra/J veyh4m7071BR00S3Y6tQZ7U7OCGQqbQSOQUORyIhsMUmOZHe0Khzz2YRTknBsrHZ8zwY f5Iw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1691568779; x=1692173579; h=content-transfer-encoding:in-reply-to:from:content-language :references:cc:to:subject:user-agent:mime-version:date:message-id :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=HGi+I0X98yYTQWfLVJqeABIuTLMwNChc7qAz4vbozrE=; b=Ppr2TJLH/G1bsSnHK/C1YPa5WAjdxg6cIBcyKWOASyaMzPfdKXLNubMhaVoBNB9g1x yBzkhw3KzGH4CPMejAJfhPEPKzgxWHI9jpYZOFkb5+7O8OInKNa7G8Jzrt3yihyaRhrK xj3l37puQ3D3D1Y2BGWTA4CvitPyQIF2/N9atosZG5i84VRZP275a6dQHnU1ygE/Mtpq qMV0CsHhZwLW9Ow0s1YfVjh3CU/sj+cKikRTAICqxBUllNm4MfOmoDN847TZKzi2xykQ 0ACiczMiw7z1/7Ldy3CCLOqOOPQCtfhSjXWX9juttq2y0Z4FdNxtWaKhbfpt6JxJXQ7L hnxg== X-Gm-Message-State: AOJu0YzmdPAojDUkxifgHv4jYeYKvzZ1KLHwscKvUkSQnkgu+T+3bYSk earNK21dse2RK14xIX3z7Qw= X-Google-Smtp-Source: AGHT+IFDcLD09vqfO+TJnS2tTZ6ux/nNDoNRIxEJ7PROsKAlQQyu8im4YuAi7ttOxBqcdhKLWZ6xIg== X-Received: by 2002:a17:903:32c6:b0:1ae:6947:e63b with SMTP id i6-20020a17090332c600b001ae6947e63bmr2817181plr.16.1691568778702; Wed, 09 Aug 2023 01:12:58 -0700 (PDT) Received: from [172.19.1.47] (60-250-192-107.hinet-ip.hinet.net. [60.250.192.107]) by smtp.gmail.com with ESMTPSA id c7-20020a170902d48700b001bb9b87ac95sm10472777plg.103.2023.08.09.01.12.56 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 09 Aug 2023 01:12:58 -0700 (PDT) Message-ID: <426130f6-7b8a-91f9-559b-afc5afdc656e@gmail.com> Date: Wed, 9 Aug 2023 16:12:54 +0800 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Thunderbird/102.14.0 Subject: Re: [RESEND PATCH v2 3/3] rtc: Add driver for Nuvoton ma35d1 rtc controller To: Alexandre Belloni Cc: a.zummo@towertech.it, robh+dt@kernel.org, krzysztof.kozlowski+dt@linaro.org, conor+dt@kernel.org, linux-rtc@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, soc@kernel.org, mjchen@nuvoton.com, schung@nuvoton.com, Jacky Huang References: <20230809011542.429945-1-ychuang570808@gmail.com> <20230809011542.429945-4-ychuang570808@gmail.com> <20230809021025a7c0daec@mail.local> Content-Language: en-US From: Jacky Huang In-Reply-To: <20230809021025a7c0daec@mail.local> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20230809_011301_336476_F600E8A2 X-CRM114-Status: GOOD ( 30.01 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org CgpPbiAyMDIzLzgvOSDkuIrljYggMTA6MTAsIEFsZXhhbmRyZSBCZWxsb25pIHdyb3RlOgo+IEhl bGxvLAo+Cj4gT24gMDkvMDgvMjAyMyAwMToxNTo0MiswMDAwLCBKYWNreSBIdWFuZyB3cm90ZToK Pj4gKwo+PiArc3RydWN0IG1hMzVfYmNkX3RpbWUgewo+PiArCWludCBiY2Rfc2VjOwo+PiArCWlu dCBiY2RfbWluOwo+PiArCWludCBiY2RfaG91cjsKPj4gKwlpbnQgYmNkX21kYXk7Cj4+ICsJaW50 IGJjZF9tb247Cj4+ICsJaW50IGJjZF95ZWFyOwo+PiArfTsKPiBJIGRvbid0IGdldCB3aHkgdGhp cyBzdHJ1Y3QgaXMgdXNlZnVsLgoKSSB3aWxsIHJlbW92ZSB0aGlzIGFuZCBtb2RpZnkgY29kZS4K Cgo+PiArCj4+ICtzdGF0aWMgaXJxcmV0dXJuX3QgbWEzNWQxX3J0Y19pbnRlcnJ1cHQoaW50IGly cSwgdm9pZCAqZGF0YSkKPj4gK3sKPj4gKwlzdHJ1Y3QgbWEzNV9ydGMgKnJ0YyA9IChzdHJ1Y3Qg bWEzNV9ydGMgKilkYXRhOwo+PiArCXVuc2lnbmVkIGxvbmcgZXZlbnRzID0gMCwgcnRjX2lycTsK Pj4gKwo+PiArCXJ0Y19pcnEgPSBydGNfcmVnX3JlYWQocnRjLCBNQTM1X1JFR19SVENfSU5UU1RT KTsKPj4gKwo+PiArCWlmIChydGNfaXJxICYgUlRDX0lOVFNUU19BTE1JRikgewo+PiArCQlydGNf cmVnX3dyaXRlKHJ0YywgTUEzNV9SRUdfUlRDX0lOVFNUUywgUlRDX0lOVFNUU19BTE1JRik7Cj4+ ICsJCWV2ZW50cyB8PSBSVENfQUYgfCBSVENfSVJRRjsKPj4gKwl9Cj4+ICsKPj4gKwlpZiAocnRj X2lycSAmIFJUQ19JTlRTVFNfVElDS0lGKSB7Cj4+ICsJCXJ0Y19yZWdfd3JpdGUocnRjLCBNQTM1 X1JFR19SVENfSU5UU1RTLCBSVENfSU5UU1RTX1RJQ0tJRik7Cj4+ICsJCWV2ZW50cyB8PSBSVENf VUYgfCBSVENfSVJRRjsKPiBIb3cgZGlkIHlvdSB0ZXN0IHRoaXMgcGF0aD8KCldlIHVzZSBCdXN5 Qm94ICdkYXRlJyBjb21tYW5kIHRvIG9ic2VydmUgdGhlIHRpbWUgY2hhbmdlZC4KSW4gYWRkaXRp b24sIHdlIHdyb3RlIGEgc2ltcGxlIGNvZGUgdG8gdGVzdCBpdC4KKGh0dHBzOi8vZ2l0aHViLmNv bS9PcGVuTnV2b3Rvbi9NQTM1RDFfTGludXhfQXBwbGljYXRpb25zL3RyZWUvbWFzdGVyL2V4YW1w bGVzL3J0YykKCj4+ICsJfQo+PiArCj4+ICsJcnRjX3VwZGF0ZV9pcnEocnRjLT5ydGNkZXYsIDEs IGV2ZW50cyk7Cj4+ICsKPj4gKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cj4+ICt9Cj4+ICsKPj4gK3N0 YXRpYyBpbnQgbWEzNWQxX3J0Y19pbml0KHN0cnVjdCBtYTM1X3J0YyAqcnRjLCB1MzIgbXNfdGlt ZW91dCkKPj4gK3sKPj4gKwljb25zdCB1bnNpZ25lZCBsb25nIHRpbWVvdXQgPSBqaWZmaWVzICsg bXNlY3NfdG9famlmZmllcyhtc190aW1lb3V0KTsKPj4gKwo+PiArCWRvIHsKPj4gKwkJaWYgKHJ0 Y19yZWdfcmVhZChydGMsIE1BMzVfUkVHX1JUQ19JTklUKSAmIFJUQ19JTklUX0FDVElWRSkKPj4g KwkJCXJldHVybiAwOwo+PiArCj4+ICsJCXJ0Y19yZWdfd3JpdGUocnRjLCBNQTM1X1JFR19SVENf SU5JVCwgUlRDX0lOSVRfTUFHSUNfQ09ERSk7Cj4+ICsKPj4gKwkJbWRlbGF5KDEpOwo+PiArCj4+ ICsJfSB3aGlsZSAodGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpOwo+PiArCj4+ICsJcmV0 dXJuIC1FVElNRURPVVQ7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBpbnQgbWEzNWQxX3J0Y19iY2Qy YmluKHUzMiB0aW1lLCB1MzIgY2FsLCB1MzIgd2RheSwgc3RydWN0IHJ0Y190aW1lICp0bSkKPj4g K3sKPj4gKwl0bS0+dG1fbWRheQk9IGJjZDJiaW4oY2FsID4+IDApOwo+PiArCXRtLT50bV9tb24J PSBiY2QyYmluKGNhbCA+PiA4KTsKPj4gKwl0bS0+dG1fbW9uCT0gdG0tPnRtX21vbiAtIDE7Cj4+ ICsJdG0tPnRtX3llYXIJPSBiY2QyYmluKGNhbCA+PiAxNikgKyAxMDA7Cj4+ICsKPj4gKwl0bS0+ dG1fc2VjCT0gYmNkMmJpbih0aW1lID4+IDApOwo+PiArCXRtLT50bV9taW4JPSBiY2QyYmluKHRp bWUgPj4gOCk7Cj4+ICsJdG0tPnRtX2hvdXIJPSBiY2QyYmluKHRpbWUgPj4gMTYpOwo+PiArCj4+ ICsJdG0tPnRtX3dkYXkgPSB3ZGF5Owo+PiArCj4+ICsJcmV0dXJuIHJ0Y192YWxpZF90bSh0bSk7 Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBpbnQgbWEzNWQxX3J0Y19hbGFybV9iY2QyYmluKHUzMiB0 YWxtLCB1MzIgY2FsbSwgc3RydWN0IHJ0Y190aW1lICp0bSkKPj4gK3sKPj4gKwl0bS0+dG1fbWRh eQk9IGJjZDJiaW4oY2FsbSA+PiAwKTsKPj4gKwl0bS0+dG1fbW9uCT0gYmNkMmJpbihjYWxtID4+ IDgpOwo+PiArCXRtLT50bV9tb24JPSB0bS0+dG1fbW9uIC0gMTsKPj4gKwl0bS0+dG1feWVhcgk9 IGJjZDJiaW4oY2FsbSA+PiAxNikgKyAxMDA7Cj4+ICsKPj4gKwl0bS0+dG1fc2VjCT0gYmNkMmJp bih0YWxtID4+IDApOwo+PiArCXRtLT50bV9taW4JPSBiY2QyYmluKHRhbG0gPj4gOCk7Cj4+ICsJ dG0tPnRtX2hvdXIJPSBiY2QyYmluKHRhbG0gPj4gMTYpOwo+PiArCj4+ICsJcmV0dXJuIHJ0Y192 YWxpZF90bSh0bSk7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyB2b2lkIG1hMzVkMV9ydGNfYmluMmJj ZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqc2V0dG0sCj4+ICsJCQkgICAg ICAgc3RydWN0IG1hMzVfYmNkX3RpbWUgKmdldHRtKQo+PiArewo+PiArCWdldHRtLT5iY2RfbWRh eSA9IGJpbjJiY2Qoc2V0dG0tPnRtX21kYXkpIDw8IDA7Cj4+ICsJZ2V0dG0tPmJjZF9tb24gID0g YmluMmJjZCgoc2V0dG0tPnRtX21vbiArIDEpKSA8PCA4Owo+PiArCj4+ICsJaWYgKHNldHRtLT50 bV95ZWFyIDwgMTAwKSB7Cj4+ICsJCWRldl93YXJuKGRldiwgIlRoZSB5ZWFyIHdpbGwgYmUgYmV0 d2VlbiAxOTcwLTE5OTksIHJpZ2h0P1xuIik7Cj4gTm8sIGRvbid0IGRvIHRoYXQsIHByb3Blcmx5 IHNldCB0aGUgcnRjIGhhcmR3YXJlIHJhbmdlIGFuZCBsZXQgdGhlIHVzZXIKPiBjaG9vc2UgdGhl aXIgdGltZSBvZmZzZXQvd2luZG93LgoKV2Ugd2lsbCBtb2RpZnkgdGhlIGNvZGUgYXM6CgojZGVm aW5lIE1BMzVfQkFTRV9ZRUFSIDIwMDAgLyogYXNzdW1lIDIwWVkgbm90IDE5WVkgKi8KCmludCB5 ZWFyOwoKeWVhciA9IHRtLT50bV95ZWFyICsgMTkwMCDigJMgTUEzNV9CQVNFX1lFQVI7CmlmICh5 ZWFyIDwgMCkgewogwqDCoMKgIGRldl9lcnIoZGV2LCAiaW52YWxpZCB5ZWFyOiAlZFxuIiwgeWVh cik7CiDCoMKgwqAgcmV0dXJuIC1FSU5WQUw7Cn0KCgo+PiArCQlnZXR0bS0+YmNkX3llYXIgPSBi aW4yYmNkKHNldHRtLT50bV95ZWFyKSA8PCAxNjsKPj4gKwl9IGVsc2Ugewo+PiArCQlnZXR0bS0+ YmNkX3llYXIgPSBiaW4yYmNkKHNldHRtLT50bV95ZWFyIC0gMTAwKSA8PCAxNjsKPj4gKwl9Cj4+ ICsKPj4gKwlnZXR0bS0+YmNkX3NlYyAgPSBiaW4yYmNkKHNldHRtLT50bV9zZWMpIDw8IDA7Cj4+ ICsJZ2V0dG0tPmJjZF9taW4gID0gYmluMmJjZChzZXR0bS0+dG1fbWluKSA8PCA4Owo+PiArCWdl dHRtLT5iY2RfaG91ciA9IGJpbjJiY2Qoc2V0dG0tPnRtX2hvdXIpIDw8IDE2Owo+PiArfQo+IFRo b3NlIGZ1bmN0aW9ucyBhcmUgb25seSB1c2VkIG9uY2UsIHNpbXBseSBwdXQgdGhlbSBpbiB0aGVp ciBjYWxsIHNpdGUuCgpTdXJlLCBJIHdpbGwgcmVtb3ZlIHRoaXMgZnVuY3Rpb24gYW5kIHB1dCB0 aGUgY29kZSBpbiB0aGVpciBjYWxsIHNpdGUKCgo+PiArCj4+ICtzdGF0aWMgaW50IG1hMzVkMV9h bGFybV9pcnFfZW5hYmxlKHN0cnVjdCBkZXZpY2UgKmRldiwgdTMyIGVuYWJsZWQpCj4+ICt7Cj4+ ICsJc3RydWN0IG1hMzVfcnRjICpydGMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKPj4gKwl1MzIg cmVnX2llbjsKPj4gKwo+PiArCXJlZ19pZW4gPSBydGNfcmVnX3JlYWQocnRjLCBNQTM1X1JFR19S VENfSU5URU4pOwo+PiArCj4+ICsJaWYgKGVuYWJsZWQpCj4+ICsJCXJ0Y19yZWdfd3JpdGUocnRj LCBNQTM1X1JFR19SVENfSU5URU4sIHJlZ19pZW4gfCBSVENfSU5URU5fQUxNSUVOKTsKPj4gKwll bHNlCj4+ICsJCXJ0Y19yZWdfd3JpdGUocnRjLCBNQTM1X1JFR19SVENfSU5URU4sIHJlZ19pZW4g JiB+UlRDX0lOVEVOX0FMTUlFTik7Cj4+ICsKPj4gKwlyZXR1cm4gMDsKPj4gK30KPj4gKwo+PiAr c3RhdGljIGludCBtYTM1ZDFfcnRjX3JlYWRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVj dCBydGNfdGltZSAqdG0pCj4+ICt7Cj4+ICsJc3RydWN0IG1hMzVfcnRjICpydGMgPSBkZXZfZ2V0 X2RydmRhdGEoZGV2KTsKPj4gKwl1MzIgdGltZSwgY2FsLCB3ZGF5Owo+PiArCj4+ICsJdGltZSA9 IHJ0Y19yZWdfcmVhZChydGMsIE1BMzVfUkVHX1JUQ19USU1FKTsKPj4gKwljYWwgID0gcnRjX3Jl Z19yZWFkKHJ0YywgTUEzNV9SRUdfUlRDX0NBTCk7Cj4+ICsJd2RheSA9IHJ0Y19yZWdfcmVhZChy dGMsIE1BMzVfUkVHX1JUQ19XRUVLREFZKTsKPiBBcmUgdGhlIHJlZ2lzdGVycyBwcm9wZXJseSBs YXRjaGVkIHdoZW4gcmVhZGluZz8gSG93IGRvIHlvdSBlbnN1cmUgdGhhdAo+IE1BMzVfUkVHX1JU Q19USU1FIGRpZG4ndCBjaGFuZ2UgYmVmb3JlIHJlYWRpbmcgTUEzNV9SRUdfUlRDX0NBTCA/CgpX ZSB3aWxsIHVwZGF0ZSB0aGUgY29kZSBhcwoKZG8gewogwqDCoCDCoHRpbWUgPSBydGNfcmVnX3Jl YWQocnRjLCBNQTM1X1JFR19SVENfVElNRSk7CiDCoMKgIMKgY2FswqAgPSBydGNfcmVnX3JlYWQo cnRjLCBNQTM1X1JFR19SVENfQ0FMKTsKIMKgwqAgwqB3ZGF5ID0gcnRjX3JlZ19yZWFkKHJ0Yywg TUEzNV9SRUdfUlRDX1dFRUtEQVkpOwp9IHdoaWxlICgodGltZSAhPSBydGNfcmVnX3JlYWQocnRj LCBNQTM1X1JFR19SVENfVElNRSkpIHx8CiDCoMKgIMKgwqDCoMKgwqAgKGNhbCAhPSBydGNfcmVn X3JlYWQocnRjLCBNQTM1X1JFR19SVENfQ0FMKSkgfHwKIMKgwqAgwqDCoMKgwqDCoCAod2RheSAh PSA9IHJ0Y19yZWdfcmVhZChydGMsIE1BMzVfUkVHX1JUQ19XRUVLREFZKSkgKTsKCgo+PiArCj4+ ICsJcmV0dXJuIG1hMzVkMV9ydGNfYmNkMmJpbih0aW1lLCBjYWwsIHdkYXksIHRtKTsKPj4gK30K Pj4gKwo+PiArc3RhdGljIGludCBtYTM1ZDFfcnRjX3NldF90aW1lKHN0cnVjdCBkZXZpY2UgKmRl diwgc3RydWN0IHJ0Y190aW1lICp0bSkKPj4gK3sKPj4gKwlzdHJ1Y3QgbWEzNV9ydGMgKnJ0YyA9 IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwo+PiArCXN0cnVjdCBtYTM1X2JjZF90aW1lIGdldHRtOwo+ PiArCXUzMiB2YWw7Cj4+ICsKPj4gKwltYTM1ZDFfcnRjX2JpbjJiY2QoZGV2LCB0bSwgJmdldHRt KTsKPj4gKwo+PiArCXZhbCA9IGdldHRtLmJjZF9tZGF5IHwgZ2V0dG0uYmNkX21vbiB8IGdldHRt LmJjZF95ZWFyOwo+PiArCXJ0Y19yZWdfd3JpdGUocnRjLCBNQTM1X1JFR19SVENfQ0FMLCB2YWwp Owo+PiArCj4+ICsJdmFsID0gZ2V0dG0uYmNkX3NlYyB8IGdldHRtLmJjZF9taW4gfCBnZXR0bS5i Y2RfaG91cjsKPj4gKwlydGNfcmVnX3dyaXRlKHJ0YywgTUEzNV9SRUdfUlRDX1RJTUUsIHZhbCk7 Cj4+ICsKPiBTYW1lIHF1ZXN0aW9uIGFib3V0IGxhdGNoaW5nLCBzaG91bGRuJ3QgeW91IHN0b3Ag dGhlIHJ0YyB3aGlsZSBkb2luZwo+IHRoaXM/CgpJbiBmYWN0LCBvbmNlIGVuYWJsZWQsIHRoZSBS VEMgaGFyZHdhcmUgb2YgTUEzNUQxIGNhbm5vdCBiZSBzdG9wcGVkOyAKdGhpcyBpcyBob3cgdGhl IGhhcmR3YXJlIGlzIGRlc2lnbmVkLgpJbnNpZGUgdGhlIE1BMzVEMSBSVEMsIHRoZXJlJ3MgYW4g aW50ZXJuYWwgY291bnRlciB0aGF0IGFkdmFuY2VzIGJ5IDEyOCAKY291bnRzIHBlciBzZWNvbmQu CldoZW4gdGhlIHRpbWUgb3IgZGF0ZSByZWdpc3RlciBpcyB1cGRhdGVkLCB0aGUgaW50ZXJuYWwg Y291bnRlciBvZiB0aGUgClJUQyBoYXJkd2FyZSB3aWxsIGF1dG9tYXRpY2FsbHkgcmVzZXQgdG8g MCwKc28gdGhlcmUgaXMgbm8gbmVlZCB0byB3b3JyeSBhYm91dCBtZW1vcnkgbGF0Y2ggaXNzdWVz LgoKCj4+ICsJdmFsID0gdG0tPnRtX3dkYXk7Cj4+ICsJcnRjX3JlZ193cml0ZShydGMsIE1BMzVf UkVHX1JUQ19XRUVLREFZLCB2YWwpOwo+PiArCj4+ICsJcmV0dXJuIDA7Cj4+ICt9Cj4+ICsKPj4g K3N0YXRpYyBpbnQgbWEzNWQxX3J0Y19zZXRfYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1 Y3QgcnRjX3drYWxybSAqYWxybSkKPj4gK3sKPj4gKwlzdHJ1Y3QgbWEzNV9ydGMgKnJ0YyA9IGRl dl9nZXRfZHJ2ZGF0YShkZXYpOwo+PiArCXN0cnVjdCBtYTM1X2JjZF90aW1lIHRtOwo+PiArCXVu c2lnbmVkIGxvbmcgdmFsOwo+PiArCj4+ICsJbWEzNWQxX3J0Y19iaW4yYmNkKGRldiwgJmFscm0t PnRpbWUsICZ0bSk7Cj4+ICsKPj4gKwl2YWwgPSB0bS5iY2RfbWRheSB8IHRtLmJjZF9tb24gfCB0 bS5iY2RfeWVhcjsKPj4gKwlydGNfcmVnX3dyaXRlKHJ0YywgTUEzNV9SRUdfUlRDX0NBTE0sIHZh bCk7Cj4+ICsKPj4gKwl2YWwgPSB0bS5iY2Rfc2VjIHwgdG0uYmNkX21pbiB8IHRtLmJjZF9ob3Vy Owo+PiArCXJ0Y19yZWdfd3JpdGUocnRjLCBNQTM1X1JFR19SVENfVEFMTSwgdmFsKTsKPj4gKwo+ IFdoYXQgYWJvdXQgaGFuZGxpbmcgYWxybS5lbmFibGVkIGhlcmU/CgpUaGUgTUEzNUQxIFJUQyBo YXJkd2FyZSBkZXNpZ24gZG9lcyBub3QgaGF2ZSBhbiBhbGFybSBlbmFibGUvZGlzYWJsZSBiaXQu ClRoZSBkZWNpc2lvbiB0byB1dGlsaXplIHRoZSBhbGFybSBjYW4gb25seSBiZSBtYWRlIHRocm91 Z2ggZW5hYmxpbmcgb3IgCmRpc2FibGluZyB0aGUgYWxhcm0gaW50ZXJydXB0LgoKPj4gKwlyZXR1 cm4gMDsKPj4gK30KPj4gKwo+PiArc3RhdGljIGNvbnN0IHN0cnVjdCBydGNfY2xhc3Nfb3BzIG1h MzVkMV9ydGNfb3BzID0gewo+PiArCS5yZWFkX3RpbWUgPSBtYTM1ZDFfcnRjX3JlYWRfdGltZSwK Pj4gKwkuc2V0X3RpbWUgPSBtYTM1ZDFfcnRjX3NldF90aW1lLAo+PiArCS5yZWFkX2FsYXJtID0g bWEzNWQxX3J0Y19yZWFkX2FsYXJtLAo+PiArCS5zZXRfYWxhcm0gPSBtYTM1ZDFfcnRjX3NldF9h bGFybSwKPj4gKwkuYWxhcm1faXJxX2VuYWJsZSA9IG1hMzVkMV9hbGFybV9pcnFfZW5hYmxlLAo+ PiArfTsKPj4gKwo+PiArc3RhdGljIGludCBtYTM1ZDFfcnRjX3Byb2JlKHN0cnVjdCBwbGF0Zm9y bV9kZXZpY2UgKnBkZXYpCj4+ICt7Cj4+ICsJc3RydWN0IG1hMzVfcnRjICpydGM7Cj4+ICsJc3Ry dWN0IGNsayAqY2xrOwo+PiArCXUzMiByZWd2YWw7Cj4+ICsJaW50IGVycjsKPj4gKwo+PiArCXJ0 YyA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKnJ0YyksIEdGUF9LRVJORUwpOwo+ PiArCWlmICghcnRjKQo+PiArCQlyZXR1cm4gLUVOT01FTTsKPj4gKwo+PiArCXJ0Yy0+cnRjX3Jl ZyA9IGRldm1fcGxhdGZvcm1faW9yZW1hcF9yZXNvdXJjZShwZGV2LCAwKTsKPj4gKwlpZiAoSVNf RVJSKHJ0Yy0+cnRjX3JlZykpCj4+ICsJCXJldHVybiBQVFJfRVJSKHJ0Yy0+cnRjX3JlZyk7Cj4+ ICsKPj4gKwljbGsgPSBvZl9jbGtfZ2V0KHBkZXYtPmRldi5vZl9ub2RlLCAwKTsKPj4gKwlpZiAo SVNfRVJSKGNsaykpCj4+ICsJCXJldHVybiBkZXZfZXJyX3Byb2JlKCZwZGV2LT5kZXYsIFBUUl9F UlIoY2xrKSwgImZhaWxlZCB0byBmaW5kIHJ0YyBjbG9ja1xuIik7Cj4+ICsKPj4gKwllcnIgPSBj bGtfcHJlcGFyZV9lbmFibGUoY2xrKTsKPj4gKwlpZiAoZXJyKQo+PiArCQlyZXR1cm4gLUVOT0VO VDsKPj4gKwo+PiArCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHJ0Yyk7Cj4+ICsKPj4gKwly dGMtPnJ0Y2RldiA9IGRldm1fcnRjX2RldmljZV9yZWdpc3RlcigmcGRldi0+ZGV2LCBwZGV2LT5u YW1lLAo+PiArCQkJCQkgICAgICAgJm1hMzVkMV9ydGNfb3BzLCBUSElTX01PRFVMRSk7Cj4+ICsJ aWYgKElTX0VSUihydGMtPnJ0Y2RldikpCj4+ICsJCXJldHVybiBkZXZfZXJyX3Byb2JlKCZwZGV2 LT5kZXYsIFBUUl9FUlIocnRjLT5ydGNkZXYpLAo+PiArCQkJCSAgICAgImZhaWxlZCB0byByZWdp c3RlciBydGMgZGV2aWNlXG4iKTsKPiBUaGlzIE1VU1QgYmUgZG9uZSBsYXN0IGluIHByb2JlLCBl bHNlIHlvdSBvcGVuIGEgcmFjZSB3aXRoIHVzZXJzcGFjZS4KPgoKWWVzLCBJIHdpbGwgbW92ZWQg aXQgdG8gbGFzdCBpbiBwcm9iZS4KCgo+PiArCj4+ICsJZXJyID0gbWEzNWQxX3J0Y19pbml0KHJ0 YywgUlRDX0lOSVRfVElNRU9VVCk7Cj4+ICsJaWYgKGVycikKPj4gKwkJcmV0dXJuIGVycjsKPj4g Kwo+IEkgZG9uJ3QgYmVsaWV2ZSB5b3Ugc2hvdWxkIGRvIHRoaXMgb24gZXZlcnkgcHJvYmUgYnV0 IG9ubHkgd2hlbiB0aGlzCj4gaGFzbid0IGJlZW4gZG9uZSB5ZXQuCj4KPj4gKwlyZWd2YWwgPSBy dGNfcmVnX3JlYWQocnRjLCBNQTM1X1JFR19SVENfQ0xLRk1UKTsKPj4gKwlyZWd2YWwgfD0gUlRD X0NMS0ZNVF8yNEhFTjsKPj4gKwlydGNfcmVnX3dyaXRlKHJ0YywgTUEzNV9SRUdfUlRDX0NMS0ZN VCwgcmVndmFsKTsKPj4gKwo+IGRpdHRvCgpJIHdpbGwgbW9kaWZ5IHRoZW0gYXM6CgpJZiAoIShy dGNfcmVnX3JlYWQocnRjLCBNQTM1X1JFR19SVENfSU5JVCkgJiBSVENfSU5JVF9BQ0spKSB7CiDC oMKgIMKgZXJyID0gbWEzNWQxX3J0Y19pbml0KHJ0YywgUlRDX0lOSVRfVElNRU9VVCk7CiDCoMKg IMKgaWYgKGVycikKIMKgwqAgwqDCoMKgwqAgcmV0dXJuIGVycjsKIMKgwqAgwqByZWd2YWwgPSBy dGNfcmVnX3JlYWQocnRjLCBNQTM1X1JFR19SVENfQ0xLRk1UKTsKIMKgwqAgwqByZWd2YWwgfD0g UlRDX0NMS0ZNVF8yNEhFTjsKIMKgwqAgwqBydGNfcmVnX3dyaXRlKHJ0YywgTUEzNV9SRUdfUlRD X0NMS0ZNVCwgcmVndmFsKTt9Cn0KCgo+PiArCXJ0Yy0+aXJxX251bSA9IHBsYXRmb3JtX2dldF9p cnEocGRldiwgMCk7Cj4+ICsKPj4gKwllcnIgPSBkZXZtX3JlcXVlc3RfaXJxKCZwZGV2LT5kZXYs IHJ0Yy0+aXJxX251bSwgbWEzNWQxX3J0Y19pbnRlcnJ1cHQsCj4+ICsJCQkgICAgICAgSVJRRl9O T19TVVNQRU5ELCAibWEzNWQxcnRjIiwgcnRjKTsKPj4gKwlpZiAoZXJyKQo+PiArCQlyZXR1cm4g ZGV2X2Vycl9wcm9iZSgmcGRldi0+ZGV2LCBlcnIsICJGYWlsZWQgdG8gcmVxdWVzdCBydGMgaXJx XG4iKTsKPj4gKwo+PiArCXJlZ3ZhbCA9IHJ0Y19yZWdfcmVhZChydGMsIE1BMzVfUkVHX1JUQ19J TlRFTik7Cj4+ICsJcmVndmFsIHw9IFJUQ19JTlRFTl9USUNLSUVOOwo+PiArCXJ0Y19yZWdfd3Jp dGUocnRjLCBNQTM1X1JFR19SVENfSU5URU4sIHJlZ3ZhbCk7Cj4+ICsKPj4gKwlkZXZpY2VfaW5p dF93YWtldXAoJnBkZXYtPmRldiwgdHJ1ZSk7Cj4+ICsKPiBZb3UgbXVzdCBzZXQgdGhlIHJ0YyBy YW5nZSBoZXJlLgoKSSB3aWxsIGFkZDoKbWEzNWQxX3J0Yy0+cnRjZGV2LT5yYW5nZV9taW4gPSBS VENfVElNRVNUQU1QX0JFR0lOXzIwMDA7Cm1hMzVkMV9ydGMtPnJ0Y2Rldi0+cmFuZ2VfbWF4ID0g UlRDX1RJTUVTVEFNUF9FTkRfMjA5OTsKCgo+PiArCXJldHVybiAwOwo+PiArfQo+PiArCj4+ICtz dGF0aWMgaW50IG1hMzVkMV9ydGNfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2 LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCj4+ICt7Cj4+ICsJc3RydWN0IG1hMzVfcnRjICpydGMgPSBw bGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKPj4gKwl1MzIgcmVndmFsOwo+PiArCj4+ICsJaWYg KGRldmljZV9tYXlfd2FrZXVwKCZwZGV2LT5kZXYpKQo+PiArCQllbmFibGVfaXJxX3dha2UocnRj LT5pcnFfbnVtKTsKPj4gKwo+PiArCXJlZ3ZhbCA9IHJ0Y19yZWdfcmVhZChydGMsIE1BMzVfUkVH X1JUQ19JTlRFTik7Cj4+ICsJcmVndmFsICY9IH5SVENfSU5URU5fVElDS0lFTjsKPj4gKwlydGNf cmVnX3dyaXRlKHJ0YywgTUEzNV9SRUdfUlRDX0lOVEVOLCByZWd2YWwpOwo+IFRoaXMgaXMgbm90 IHdoYXQgdGhlIHVzZXIgaXMgYXNraW5nLCBkb24ndCBkbyB0aGlzLiBBbHNvLCBob3cgd2FzIHRo aXMKPiB0ZXN0ZWQ/CgpTdXJlLCBJIHdpbGwgcmVtb3ZlIHRoZXNlIHRocmVlIGxpbmVzIG9mIGNv ZGUuCgpXZSB0ZXN0IGl0IHdpdGggImVjaG8gbWVtID4gL3N5cy9wb3dlci9zdGF0ZSIuCgo+PiAr Cj4+ICsJcmV0dXJuIDA7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBpbnQgbWEzNWQxX3J0Y19yZXN1 bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKPj4gK3sKPj4gKwlzdHJ1Y3QgbWEzNV9y dGMgKnJ0YyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwo+PiArCXUzMiByZWd2YWw7Cj4+ ICsKPj4gKwlpZiAoZGV2aWNlX21heV93YWtldXAoJnBkZXYtPmRldikpCj4+ICsJCWRpc2FibGVf aXJxX3dha2UocnRjLT5pcnFfbnVtKTsKPj4gKwo+PiArCXJlZ3ZhbCA9IHJ0Y19yZWdfcmVhZChy dGMsIE1BMzVfUkVHX1JUQ19JTlRFTik7Cj4+ICsJcmVndmFsIHw9IFJUQ19JTlRFTl9USUNLSUVO Owo+PiArCXJ0Y19yZWdfd3JpdGUocnRjLCBNQTM1X1JFR19SVENfSU5URU4sIHJlZ3ZhbCk7Cj4+ ICsKPj4gKwlyZXR1cm4gMDsKPj4gK30KPj4gKwo+PiArc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9k ZXZpY2VfaWQgbWEzNWQxX3J0Y19vZl9tYXRjaFtdID0gewo+PiArCXsgLmNvbXBhdGlibGUgPSAi bnV2b3RvbixtYTM1ZDEtcnRjIiwgfSwKPj4gKwl7fSwKPj4gK307Cj4+ICtNT0RVTEVfREVWSUNF X1RBQkxFKG9mLCBtYTM1ZDFfcnRjX29mX21hdGNoKTsKPj4gKwo+PiArc3RhdGljIHN0cnVjdCBw bGF0Zm9ybV9kcml2ZXIgbWEzNWQxX3J0Y19kcml2ZXIgPSB7Cj4+ICsJLnN1c3BlbmQgICAgPSBt YTM1ZDFfcnRjX3N1c3BlbmQsCj4+ICsJLnJlc3VtZSAgICAgPSBtYTM1ZDFfcnRjX3Jlc3VtZSwK Pj4gKwkucHJvYmUgICAgICA9IG1hMzVkMV9ydGNfcHJvYmUsCj4+ICsJLmRyaXZlcgkJPSB7Cj4+ ICsJCS5uYW1lCT0gInJ0Yy1tYTM1ZDEiLAo+PiArCQkub2ZfbWF0Y2hfdGFibGUgPSBtYTM1ZDFf cnRjX29mX21hdGNoLAo+PiArCX0sCj4+ICt9Owo+PiArCj4+ICttb2R1bGVfcGxhdGZvcm1fZHJp dmVyKG1hMzVkMV9ydGNfZHJpdmVyKTsKPj4gKwo+PiArTU9EVUxFX0FVVEhPUigiTWluLUplbiBD aGVuIDxtamNoZW5AbnV2b3Rvbi5jb20+Iik7Cj4+ICtNT0RVTEVfREVTQ1JJUFRJT04oIk1BMzVE MSBSVEMgZHJpdmVyIik7Cj4+ICtNT0RVTEVfTElDRU5TRSgiR1BMIik7Cj4+IC0tIAo+PiAyLjM0 LjEKPj4KCgpCZXN0IFJlZ2FyZHMsCkphY2t5IEh1YW5nCgoKX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX18KbGludXgtYXJtLWtlcm5lbCBtYWlsaW5nIGxpc3QK bGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRl YWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtYXJtLWtlcm5lbAo=