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 2BA9EC04A94 for ; Thu, 10 Aug 2023 07:21:55 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232673AbjHJHVy (ORCPT ); Thu, 10 Aug 2023 03:21:54 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34318 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231254AbjHJHVy (ORCPT ); Thu, 10 Aug 2023 03:21:54 -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 1B1D210C; Thu, 10 Aug 2023 00:21:53 -0700 (PDT) Received: by mail-pl1-x631.google.com with SMTP id d9443c01a7336-1bc65360648so5844665ad.1; Thu, 10 Aug 2023 00:21:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1691652112; x=1692256912; 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=oMXI6kTVHPxuRl+9l/keZ7XvudCxl6pTTJO/Mk4iK5I=; b=PMtCNdYX/cUbPbFvOJNQorAyZG8d+0gVK0ec85K7ToAj9D7wEMyo8aIYvWKdFMMRTO DIKdzAF5L1uMK351ZC5QV9WDr5PeZQi6/l6+9iRlZDsRZgSJOm51Bwrp6xB6DofqW+DL KrSVk5lME250ueWWkdLydJCjNL8wry1I1/9T0IpUYHsTo12JEpiQmYqL66gfbhChEUAw HO10Xq4ttk30ndwx0e6angG4MxrmtFOYe7R3BumOCJHo2o/GqMN6Vgi9xRO9fbbYAd9N 1r+I8vTL07CAHLlBnVeS4od3XUkWqLQ6LJotTw3YqNAcw0mJEC5EQj+KEN0X6LoVTI8r 9Wkg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1691652112; x=1692256912; 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=oMXI6kTVHPxuRl+9l/keZ7XvudCxl6pTTJO/Mk4iK5I=; b=EXyC4xScIVCK5yzJWSfcaYKgAm6U+Y7NrDeZCt0EMzHW1vHGdQyfNYNpNwGujt3FOS /7AZ/7Z8nsPsn4e4aT6ptlsgEMoanqTf4xaLnGrIMDhJHn7YZ4qI29PYGnwOa4c08+05 kyqHvtulnA9+YxwnoQiFSX7bRu7zV9zYmkd7r3BL2GXMxp3C5QX6dNz80MmfTlO+cdhZ Yal9FsfLUBeZ1yT3LlCyf+GOEA4HGssKPXH64kU3X4/Rc9KwsaKJfDS1YJxbvKeBNWUV 1aLxagrpJY1vu81yBGBBWwS/9D8sXwyLqbH0KIPiaiA3PKghHKD/vBLnb/+MZxFLQzCS 2s5A== X-Gm-Message-State: AOJu0Ywgs6AyI4TLtAaARGj8ELbgbvQypMDawMCWYhceXNzZol177oHT YRAEhblLhrhcDCBTcvFou+M= X-Google-Smtp-Source: AGHT+IFW163EGmWvkpVnmKqAq23ut6gjOXWOT/PTXKFunpEYWbUnnsyG8OtoKetxK9h+JY8mIdRrkA== X-Received: by 2002:a17:902:f7ce:b0:1bd:a50a:e32d with SMTP id h14-20020a170902f7ce00b001bda50ae32dmr527359plw.68.1691652112361; Thu, 10 Aug 2023 00:21:52 -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 b1-20020a170902d50100b001bc445e249asm877783plg.124.2023.08.10.00.21.49 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 10 Aug 2023 00:21:51 -0700 (PDT) Message-ID: <347cf148-bda8-852b-768c-fa2b57ce5bcb@gmail.com> Date: Thu, 10 Aug 2023 15:21:47 +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> <426130f6-7b8a-91f9-559b-afc5afdc656e@gmail.com> <2023080922515326db190e@mail.local> Content-Language: en-US From: Jacky Huang In-Reply-To: <2023080922515326db190e@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/10 上午 06:51, Alexandre Belloni wrote: > On 09/08/2023 16:12:54+0800, Jacky Huang wrote: >> >> 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) >> > You should probably run rtctest: > > https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/tools/testing/selftests/rtc/rtctest.c Thank you for providing this information. We will run this test before submitting the next version. > >>>> + 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; >> } > This is not needed as the rtc core is going to check the value is in the > range once you set it. OK, I will drop the "if (year < 0)" check. >>>> + 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)) ); > Ok, so this mean your hardware doesn't do latching. I don't think it is > necessary to check MA35_REG_RTC_WEEKDAY. OK, I will remove the MA35_REG_RTC_WEEKDAY check. >> >>>> + >>>> + 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. > Ok, great > >> >>>> + 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. > Exactly, you should use alrm.enabled to enable or disable the alarm > interrupt. You can simply call ma35d1_alarm_irq_enable, many drivers are > doing this. OK, we will use irq enable/disable to support alrm.enabled. >>>> + 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; >> > Perfect. Maybe you should run rtc-range to check for proper operation in > the range: > https://git.kernel.org/pub/scm/linux/kernel/git/abelloni/rtc-tools.git/tree/rtc-range.c We will run this test. Thanks for providing this information. >>>> + 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". >> > Yes, my point is that if UIE is enabled, then the user wants to be woken > up every second. If this is not what is wanted, then UIE has to be > disabled before going to suspend. > > My question is why are you enabling RTC_INTEN_TICKIEN in probe? I don't > expect anyone to use an actual hardware tick interrupt, unless the alarm > is broken and can't be set every second. This is why I questioned the > RTC_UF path because I don't expect it to be taken at all. Yes, we will remove TICKIEN from probe and modify ma35d1_alarm_irq_enable(). TICKIEN will be enabled only if UIE is enabled. static int ma35d1_alarm_irq_enable(struct device *dev, unsigned int enabled) {     struct ma35d1_rtc *rtc = dev_get_drvdata(dev);     if (enabled) {         if (rtc->rtc->uie_rtctimer.enabled)             rtc_reg_write(rtc, NVT_RTC_INTEN,                       (rtc_reg_read(rtc, NVT_RTC_INTEN)|(RTC_INTEN_TICKIEN)));         if (rtc->rtc->aie_timer.enabled)             rtc_reg_write(rtc, NVT_RTC_INTEN,                       (rtc_reg_read(rtc, NVT_RTC_INTEN)|(RTC_INTEN_ALMIEN)));     } else {         if (rtc->rtc->uie_rtctimer.enabled)             rtc_reg_write(rtc, NVT_RTC_INTEN,                       (rtc_reg_read(rtc, NVT_RTC_INTEN) & (~RTC_INTEN_TICKIEN)));         if (rtc->rtc->aie_timer.enabled)             rtc_reg_write(rtc, NVT_RTC_INTEN,                       (rtc_reg_read(rtc, NVT_RTC_INTEN) & (~RTC_INTEN_ALMIEN)));     }     return 0; } >>>> + >>>> + 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 >> 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 F2144C04A94 for ; Thu, 10 Aug 2023 07:22:31 +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=9mPHAbfpqXtuTIoKeqa/bNJ+kYYYlMwqeYqgxLuyltA=; b=TceT/M5O+l8pxi bXvVTre3TCVvUGoWIHz/p7LUFU84A9xhBhI5F4sG76Gf8qKUBaFIy2wL6Gn8G1kAEyxdK3Gi3pu6a zjoSdJVubFYekfv3rVrQ6JPKGdnv44J+rGzTI5tGdHm1zeF+WPaPkQ3Fq31lYWJtuiaxLO9rk4W0i tmnLQF6kTQ2+Gf990ZHdXw9F71GM0lObiZ+EU2LGaJUC+mNI9RKpkXipw3lVSe37ToGE/JP/S75WK 7cn5m5wpwW3svdyMh2vpKUQfIzVhCk743Zr4V9C/UI+pFjhhx4j46XLSgj0X1r3BxeutVfyMvf6pW nDjWtGdI7zbeU0vAUH6Q==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1qTzze-006k0q-0K; Thu, 10 Aug 2023 07:22:02 +0000 Received: from mail-pl1-x62d.google.com ([2607:f8b0:4864:20::62d]) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1qTzzZ-006jzX-0I for linux-arm-kernel@lists.infradead.org; Thu, 10 Aug 2023 07:21:59 +0000 Received: by mail-pl1-x62d.google.com with SMTP id d9443c01a7336-1bda9207132so634045ad.0 for ; Thu, 10 Aug 2023 00:21:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1691652112; x=1692256912; 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=oMXI6kTVHPxuRl+9l/keZ7XvudCxl6pTTJO/Mk4iK5I=; b=PMtCNdYX/cUbPbFvOJNQorAyZG8d+0gVK0ec85K7ToAj9D7wEMyo8aIYvWKdFMMRTO DIKdzAF5L1uMK351ZC5QV9WDr5PeZQi6/l6+9iRlZDsRZgSJOm51Bwrp6xB6DofqW+DL KrSVk5lME250ueWWkdLydJCjNL8wry1I1/9T0IpUYHsTo12JEpiQmYqL66gfbhChEUAw HO10Xq4ttk30ndwx0e6angG4MxrmtFOYe7R3BumOCJHo2o/GqMN6Vgi9xRO9fbbYAd9N 1r+I8vTL07CAHLlBnVeS4od3XUkWqLQ6LJotTw3YqNAcw0mJEC5EQj+KEN0X6LoVTI8r 9Wkg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1691652112; x=1692256912; 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=oMXI6kTVHPxuRl+9l/keZ7XvudCxl6pTTJO/Mk4iK5I=; b=cgB9mLvyH4KYfIUS0iCDCwLL1aQGODAy4TwOrH7fTKfN85mA8g8yKucM0IpmNqOCDV g53JB5OwQSc83zMrrPU2tbEOTUDuUdaT43rv/L+A/W6eyZg5TLPcYDauHMYJ+mOmvNEZ UWyC5SzyBpe+PkC+sbA/jlEK+5Dc99PI4XaiKiFWlsHqheS+AT6hkscTl21MW15M+l6+ KCaOkchYPxGdfdRIK6gc4eQE/6adfEvS1RNEF7JexKdragCG7KuEpzLxfsPdRm106cmt FMUSieta6QC92F2Oi7SffKzD+/hoKmmLFrtDWML6Rgt/oSH+78+uH2WcH2xB7oMqspqq dhtA== X-Gm-Message-State: AOJu0Yw/ScI5l1VBV4yGTP2dPy6WweP48DJfloZHHbleUT8gUChUQoIr OkAfNmtVChkcsGZ1FqeDhW0O9g9AlFE= X-Google-Smtp-Source: AGHT+IFW163EGmWvkpVnmKqAq23ut6gjOXWOT/PTXKFunpEYWbUnnsyG8OtoKetxK9h+JY8mIdRrkA== X-Received: by 2002:a17:902:f7ce:b0:1bd:a50a:e32d with SMTP id h14-20020a170902f7ce00b001bda50ae32dmr527359plw.68.1691652112361; Thu, 10 Aug 2023 00:21:52 -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 b1-20020a170902d50100b001bc445e249asm877783plg.124.2023.08.10.00.21.49 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 10 Aug 2023 00:21:51 -0700 (PDT) Message-ID: <347cf148-bda8-852b-768c-fa2b57ce5bcb@gmail.com> Date: Thu, 10 Aug 2023 15:21:47 +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> <426130f6-7b8a-91f9-559b-afc5afdc656e@gmail.com> <2023080922515326db190e@mail.local> Content-Language: en-US From: Jacky Huang In-Reply-To: <2023080922515326db190e@mail.local> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20230810_002157_140054_EACB95E9 X-CRM114-Status: GOOD ( 38.97 ) 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 CgpPbiAyMDIzLzgvMTAg5LiK5Y2IIDA2OjUxLCBBbGV4YW5kcmUgQmVsbG9uaSB3cm90ZToKPiBP biAwOS8wOC8yMDIzIDE2OjEyOjU0KzA4MDAsIEphY2t5IEh1YW5nIHdyb3RlOgo+Pgo+PiBPbiAy MDIzLzgvOSDkuIrljYggMTA6MTAsIEFsZXhhbmRyZSBCZWxsb25pIHdyb3RlOgo+Pj4gSGVsbG8s Cj4+Pgo+Pj4gT24gMDkvMDgvMjAyMyAwMToxNTo0MiswMDAwLCBKYWNreSBIdWFuZyB3cm90ZToK Pj4+PiArCj4+Pj4gK3N0cnVjdCBtYTM1X2JjZF90aW1lIHsKPj4+PiArCWludCBiY2Rfc2VjOwo+ Pj4+ICsJaW50IGJjZF9taW47Cj4+Pj4gKwlpbnQgYmNkX2hvdXI7Cj4+Pj4gKwlpbnQgYmNkX21k YXk7Cj4+Pj4gKwlpbnQgYmNkX21vbjsKPj4+PiArCWludCBiY2RfeWVhcjsKPj4+PiArfTsKPj4+ IEkgZG9uJ3QgZ2V0IHdoeSB0aGlzIHN0cnVjdCBpcyB1c2VmdWwuCj4+IEkgd2lsbCByZW1vdmUg dGhpcyBhbmQgbW9kaWZ5IGNvZGUuCj4+Cj4+Cj4+Pj4gKwo+Pj4+ICtzdGF0aWMgaXJxcmV0dXJu X3QgbWEzNWQxX3J0Y19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGF0YSkKPj4+PiArewo+Pj4+ ICsJc3RydWN0IG1hMzVfcnRjICpydGMgPSAoc3RydWN0IG1hMzVfcnRjICopZGF0YTsKPj4+PiAr CXVuc2lnbmVkIGxvbmcgZXZlbnRzID0gMCwgcnRjX2lycTsKPj4+PiArCj4+Pj4gKwlydGNfaXJx ID0gcnRjX3JlZ19yZWFkKHJ0YywgTUEzNV9SRUdfUlRDX0lOVFNUUyk7Cj4+Pj4gKwo+Pj4+ICsJ aWYgKHJ0Y19pcnEgJiBSVENfSU5UU1RTX0FMTUlGKSB7Cj4+Pj4gKwkJcnRjX3JlZ193cml0ZShy dGMsIE1BMzVfUkVHX1JUQ19JTlRTVFMsIFJUQ19JTlRTVFNfQUxNSUYpOwo+Pj4+ICsJCWV2ZW50 cyB8PSBSVENfQUYgfCBSVENfSVJRRjsKPj4+PiArCX0KPj4+PiArCj4+Pj4gKwlpZiAocnRjX2ly cSAmIFJUQ19JTlRTVFNfVElDS0lGKSB7Cj4+Pj4gKwkJcnRjX3JlZ193cml0ZShydGMsIE1BMzVf UkVHX1JUQ19JTlRTVFMsIFJUQ19JTlRTVFNfVElDS0lGKTsKPj4+PiArCQlldmVudHMgfD0gUlRD X1VGIHwgUlRDX0lSUUY7Cj4+PiBIb3cgZGlkIHlvdSB0ZXN0IHRoaXMgcGF0aD8KPj4gV2UgdXNl IEJ1c3lCb3ggJ2RhdGUnIGNvbW1hbmQgdG8gb2JzZXJ2ZSB0aGUgdGltZSBjaGFuZ2VkLgo+PiBJ biBhZGRpdGlvbiwgd2Ugd3JvdGUgYSBzaW1wbGUgY29kZSB0byB0ZXN0IGl0Lgo+PiAoaHR0cHM6 Ly9naXRodWIuY29tL09wZW5OdXZvdG9uL01BMzVEMV9MaW51eF9BcHBsaWNhdGlvbnMvdHJlZS9t YXN0ZXIvZXhhbXBsZXMvcnRjKQo+Pgo+IFlvdSBzaG91bGQgcHJvYmFibHkgcnVuIHJ0Y3Rlc3Q6 Cj4KPiBodHRwczovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vbGludXgva2VybmVsL2dpdC90b3J2 YWxkcy9saW51eC5naXQvdHJlZS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9ydGMvcnRjdGVzdC5j CgpUaGFuayB5b3UgZm9yIHByb3ZpZGluZyB0aGlzIGluZm9ybWF0aW9uLgpXZSB3aWxsIHJ1biB0 aGlzIHRlc3QgYmVmb3JlIHN1Ym1pdHRpbmcgdGhlIG5leHQgdmVyc2lvbi4KCj4KPj4+PiArCWlm IChzZXR0bS0+dG1feWVhciA8IDEwMCkgewo+Pj4+ICsJCWRldl93YXJuKGRldiwgIlRoZSB5ZWFy IHdpbGwgYmUgYmV0d2VlbiAxOTcwLTE5OTksIHJpZ2h0P1xuIik7Cj4+PiBObywgZG9uJ3QgZG8g dGhhdCwgcHJvcGVybHkgc2V0IHRoZSBydGMgaGFyZHdhcmUgcmFuZ2UgYW5kIGxldCB0aGUgdXNl cgo+Pj4gY2hvb3NlIHRoZWlyIHRpbWUgb2Zmc2V0L3dpbmRvdy4KPj4gV2Ugd2lsbCBtb2RpZnkg dGhlIGNvZGUgYXM6Cj4+Cj4+ICNkZWZpbmUgTUEzNV9CQVNFX1lFQVIgMjAwMCAvKiBhc3N1bWUg MjBZWSBub3QgMTlZWSAqLwo+Pgo+PiBpbnQgeWVhcjsKPj4KPj4geWVhciA9IHRtLT50bV95ZWFy ICsgMTkwMCDigJMgTUEzNV9CQVNFX1lFQVI7Cj4+IGlmICh5ZWFyIDwgMCkgewo+PiAgwqDCoMKg IGRldl9lcnIoZGV2LCAiaW52YWxpZCB5ZWFyOiAlZFxuIiwgeWVhcik7Cj4+ICDCoMKgwqAgcmV0 dXJuIC1FSU5WQUw7Cj4+IH0KPiBUaGlzIGlzIG5vdCBuZWVkZWQgYXMgdGhlIHJ0YyBjb3JlIGlz IGdvaW5nIHRvIGNoZWNrIHRoZSB2YWx1ZSBpcyBpbiB0aGUKPiByYW5nZSBvbmNlIHlvdSBzZXQg aXQuCgpPSywgSSB3aWxsIGRyb3AgdGhlICJpZiAoeWVhciA8IDApIiBjaGVjay4KCj4+Pj4gKwl0 aW1lID0gcnRjX3JlZ19yZWFkKHJ0YywgTUEzNV9SRUdfUlRDX1RJTUUpOwo+Pj4+ICsJY2FsICA9 IHJ0Y19yZWdfcmVhZChydGMsIE1BMzVfUkVHX1JUQ19DQUwpOwo+Pj4+ICsJd2RheSA9IHJ0Y19y ZWdfcmVhZChydGMsIE1BMzVfUkVHX1JUQ19XRUVLREFZKTsKPj4+IEFyZSB0aGUgcmVnaXN0ZXJz IHByb3Blcmx5IGxhdGNoZWQgd2hlbiByZWFkaW5nPyBIb3cgZG8geW91IGVuc3VyZSB0aGF0Cj4+ PiBNQTM1X1JFR19SVENfVElNRSBkaWRuJ3QgY2hhbmdlIGJlZm9yZSByZWFkaW5nIE1BMzVfUkVH X1JUQ19DQUwgPwo+PiBXZSB3aWxsIHVwZGF0ZSB0aGUgY29kZSBhcwo+Pgo+PiBkbyB7Cj4+ICDC oMKgIMKgdGltZSA9IHJ0Y19yZWdfcmVhZChydGMsIE1BMzVfUkVHX1JUQ19USU1FKTsKPj4gIMKg wqAgwqBjYWzCoCA9IHJ0Y19yZWdfcmVhZChydGMsIE1BMzVfUkVHX1JUQ19DQUwpOwo+PiAgwqDC oCDCoHdkYXkgPSBydGNfcmVnX3JlYWQocnRjLCBNQTM1X1JFR19SVENfV0VFS0RBWSk7Cj4+IH0g d2hpbGUgKCh0aW1lICE9IHJ0Y19yZWdfcmVhZChydGMsIE1BMzVfUkVHX1JUQ19USU1FKSkgfHwK Pj4gIMKgwqAgwqDCoMKgwqDCoCAoY2FsICE9IHJ0Y19yZWdfcmVhZChydGMsIE1BMzVfUkVHX1JU Q19DQUwpKSB8fAo+PiAgwqDCoCDCoMKgwqDCoMKgICh3ZGF5ICE9ID0gcnRjX3JlZ19yZWFkKHJ0 YywgTUEzNV9SRUdfUlRDX1dFRUtEQVkpKSApOwo+IE9rLCBzbyB0aGlzIG1lYW4geW91ciBoYXJk d2FyZSBkb2Vzbid0IGRvIGxhdGNoaW5nLiBJIGRvbid0IHRoaW5rIGl0IGlzCj4gbmVjZXNzYXJ5 IHRvIGNoZWNrIE1BMzVfUkVHX1JUQ19XRUVLREFZLgoKT0ssIEkgd2lsbCByZW1vdmUgdGhlIE1B MzVfUkVHX1JUQ19XRUVLREFZIGNoZWNrLgo+Pgo+Pj4+ICsKPj4+PiArCXJldHVybiBtYTM1ZDFf cnRjX2JjZDJiaW4odGltZSwgY2FsLCB3ZGF5LCB0bSk7Cj4+Pj4gK30KPj4+PiArCj4+Pj4gK3N0 YXRpYyBpbnQgbWEzNWQxX3J0Y19zZXRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBy dGNfdGltZSAqdG0pCj4+Pj4gK3sKPj4+PiArCXN0cnVjdCBtYTM1X3J0YyAqcnRjID0gZGV2X2dl dF9kcnZkYXRhKGRldik7Cj4+Pj4gKwlzdHJ1Y3QgbWEzNV9iY2RfdGltZSBnZXR0bTsKPj4+PiAr CXUzMiB2YWw7Cj4+Pj4gKwo+Pj4+ICsJbWEzNWQxX3J0Y19iaW4yYmNkKGRldiwgdG0sICZnZXR0 bSk7Cj4+Pj4gKwo+Pj4+ICsJdmFsID0gZ2V0dG0uYmNkX21kYXkgfCBnZXR0bS5iY2RfbW9uIHwg Z2V0dG0uYmNkX3llYXI7Cj4+Pj4gKwlydGNfcmVnX3dyaXRlKHJ0YywgTUEzNV9SRUdfUlRDX0NB TCwgdmFsKTsKPj4+PiArCj4+Pj4gKwl2YWwgPSBnZXR0bS5iY2Rfc2VjIHwgZ2V0dG0uYmNkX21p biB8IGdldHRtLmJjZF9ob3VyOwo+Pj4+ICsJcnRjX3JlZ193cml0ZShydGMsIE1BMzVfUkVHX1JU Q19USU1FLCB2YWwpOwo+Pj4+ICsKPj4+IFNhbWUgcXVlc3Rpb24gYWJvdXQgbGF0Y2hpbmcsIHNo b3VsZG4ndCB5b3Ugc3RvcCB0aGUgcnRjIHdoaWxlIGRvaW5nCj4+PiB0aGlzPwo+PiBJbiBmYWN0 LCBvbmNlIGVuYWJsZWQsIHRoZSBSVEMgaGFyZHdhcmUgb2YgTUEzNUQxIGNhbm5vdCBiZSBzdG9w cGVkOyB0aGlzIGlzCj4+IGhvdyB0aGUgaGFyZHdhcmUgaXMgZGVzaWduZWQuCj4+IEluc2lkZSB0 aGUgTUEzNUQxIFJUQywgdGhlcmUncyBhbiBpbnRlcm5hbCBjb3VudGVyIHRoYXQgYWR2YW5jZXMg YnkgMTI4Cj4+IGNvdW50cyBwZXIgc2Vjb25kLgo+PiBXaGVuIHRoZSB0aW1lIG9yIGRhdGUgcmVn aXN0ZXIgaXMgdXBkYXRlZCwgdGhlIGludGVybmFsIGNvdW50ZXIgb2YgdGhlIFJUQwo+PiBoYXJk d2FyZSB3aWxsIGF1dG9tYXRpY2FsbHkgcmVzZXQgdG8gMCwKPj4gc28gdGhlcmUgaXMgbm8gbmVl ZCB0byB3b3JyeSBhYm91dCBtZW1vcnkgbGF0Y2ggaXNzdWVzLgo+IE9rLCBncmVhdAo+Cj4+Cj4+ Pj4gKwl2YWwgPSB0bS0+dG1fd2RheTsKPj4+PiArCXJ0Y19yZWdfd3JpdGUocnRjLCBNQTM1X1JF R19SVENfV0VFS0RBWSwgdmFsKTsKPj4+PiArCj4+Pj4gKwlyZXR1cm4gMDsKPj4+PiArfQo+Pj4+ ICsKPj4+PiArc3RhdGljIGludCBtYTM1ZDFfcnRjX3NldF9hbGFybShzdHJ1Y3QgZGV2aWNlICpk ZXYsIHN0cnVjdCBydGNfd2thbHJtICphbHJtKQo+Pj4+ICt7Cj4+Pj4gKwlzdHJ1Y3QgbWEzNV9y dGMgKnJ0YyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwo+Pj4+ICsJc3RydWN0IG1hMzVfYmNkX3Rp bWUgdG07Cj4+Pj4gKwl1bnNpZ25lZCBsb25nIHZhbDsKPj4+PiArCj4+Pj4gKwltYTM1ZDFfcnRj X2JpbjJiY2QoZGV2LCAmYWxybS0+dGltZSwgJnRtKTsKPj4+PiArCj4+Pj4gKwl2YWwgPSB0bS5i Y2RfbWRheSB8IHRtLmJjZF9tb24gfCB0bS5iY2RfeWVhcjsKPj4+PiArCXJ0Y19yZWdfd3JpdGUo cnRjLCBNQTM1X1JFR19SVENfQ0FMTSwgdmFsKTsKPj4+PiArCj4+Pj4gKwl2YWwgPSB0bS5iY2Rf c2VjIHwgdG0uYmNkX21pbiB8IHRtLmJjZF9ob3VyOwo+Pj4+ICsJcnRjX3JlZ193cml0ZShydGMs IE1BMzVfUkVHX1JUQ19UQUxNLCB2YWwpOwo+Pj4+ICsKPj4+IFdoYXQgYWJvdXQgaGFuZGxpbmcg YWxybS5lbmFibGVkIGhlcmU/Cj4+IFRoZSBNQTM1RDEgUlRDIGhhcmR3YXJlIGRlc2lnbiBkb2Vz IG5vdCBoYXZlIGFuIGFsYXJtIGVuYWJsZS9kaXNhYmxlIGJpdC4KPj4gVGhlIGRlY2lzaW9uIHRv IHV0aWxpemUgdGhlIGFsYXJtIGNhbiBvbmx5IGJlIG1hZGUgdGhyb3VnaCBlbmFibGluZyBvcgo+ PiBkaXNhYmxpbmcgdGhlIGFsYXJtIGludGVycnVwdC4KPiBFeGFjdGx5LCB5b3Ugc2hvdWxkIHVz ZSBhbHJtLmVuYWJsZWQgdG8gZW5hYmxlIG9yIGRpc2FibGUgdGhlIGFsYXJtCj4gaW50ZXJydXB0 LiBZb3UgY2FuIHNpbXBseSBjYWxsIG1hMzVkMV9hbGFybV9pcnFfZW5hYmxlLCBtYW55IGRyaXZl cnMgYXJlCj4gZG9pbmcgdGhpcy4KCk9LLCB3ZSB3aWxsIHVzZSBpcnEgZW5hYmxlL2Rpc2FibGUg dG8gc3VwcG9ydCBhbHJtLmVuYWJsZWQuCgo+Pj4+ICsJcmV0dXJuIDA7Cj4+Pj4gK30KPj4+PiAr Cj4+Pj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnRjX2NsYXNzX29wcyBtYTM1ZDFfcnRjX29wcyA9 IHsKPj4+PiArCS5yZWFkX3RpbWUgPSBtYTM1ZDFfcnRjX3JlYWRfdGltZSwKPj4+PiArCS5zZXRf dGltZSA9IG1hMzVkMV9ydGNfc2V0X3RpbWUsCj4+Pj4gKwkucmVhZF9hbGFybSA9IG1hMzVkMV9y dGNfcmVhZF9hbGFybSwKPj4+PiArCS5zZXRfYWxhcm0gPSBtYTM1ZDFfcnRjX3NldF9hbGFybSwK Pj4+PiArCS5hbGFybV9pcnFfZW5hYmxlID0gbWEzNWQxX2FsYXJtX2lycV9lbmFibGUsCj4+Pj4g K307Cj4+Pj4gKwo+Pj4+ICtzdGF0aWMgaW50IG1hMzVkMV9ydGNfcHJvYmUoc3RydWN0IHBsYXRm b3JtX2RldmljZSAqcGRldikKPj4+PiArewo+Pj4+ICsJc3RydWN0IG1hMzVfcnRjICpydGM7Cj4+ Pj4gKwlzdHJ1Y3QgY2xrICpjbGs7Cj4+Pj4gKwl1MzIgcmVndmFsOwo+Pj4+ICsJaW50IGVycjsK Pj4+PiArCj4+Pj4gKwlydGMgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpydGMp LCBHRlBfS0VSTkVMKTsKPj4+PiArCWlmICghcnRjKQo+Pj4+ICsJCXJldHVybiAtRU5PTUVNOwo+ Pj4+ICsKPj4+PiArCXJ0Yy0+cnRjX3JlZyA9IGRldm1fcGxhdGZvcm1faW9yZW1hcF9yZXNvdXJj ZShwZGV2LCAwKTsKPj4+PiArCWlmIChJU19FUlIocnRjLT5ydGNfcmVnKSkKPj4+PiArCQlyZXR1 cm4gUFRSX0VSUihydGMtPnJ0Y19yZWcpOwo+Pj4+ICsKPj4+PiArCWNsayA9IG9mX2Nsa19nZXQo cGRldi0+ZGV2Lm9mX25vZGUsIDApOwo+Pj4+ICsJaWYgKElTX0VSUihjbGspKQo+Pj4+ICsJCXJl dHVybiBkZXZfZXJyX3Byb2JlKCZwZGV2LT5kZXYsIFBUUl9FUlIoY2xrKSwgImZhaWxlZCB0byBm aW5kIHJ0YyBjbG9ja1xuIik7Cj4+Pj4gKwo+Pj4+ICsJZXJyID0gY2xrX3ByZXBhcmVfZW5hYmxl KGNsayk7Cj4+Pj4gKwlpZiAoZXJyKQo+Pj4+ICsJCXJldHVybiAtRU5PRU5UOwo+Pj4+ICsKPj4+ PiArCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHJ0Yyk7Cj4+Pj4gKwo+Pj4+ICsJcnRjLT5y dGNkZXYgPSBkZXZtX3J0Y19kZXZpY2VfcmVnaXN0ZXIoJnBkZXYtPmRldiwgcGRldi0+bmFtZSwK Pj4+PiArCQkJCQkgICAgICAgJm1hMzVkMV9ydGNfb3BzLCBUSElTX01PRFVMRSk7Cj4+Pj4gKwlp ZiAoSVNfRVJSKHJ0Yy0+cnRjZGV2KSkKPj4+PiArCQlyZXR1cm4gZGV2X2Vycl9wcm9iZSgmcGRl di0+ZGV2LCBQVFJfRVJSKHJ0Yy0+cnRjZGV2KSwKPj4+PiArCQkJCSAgICAgImZhaWxlZCB0byBy ZWdpc3RlciBydGMgZGV2aWNlXG4iKTsKPj4+IFRoaXMgTVVTVCBiZSBkb25lIGxhc3QgaW4gcHJv YmUsIGVsc2UgeW91IG9wZW4gYSByYWNlIHdpdGggdXNlcnNwYWNlLgo+Pj4KPj4gWWVzLCBJIHdp bGwgbW92ZWQgaXQgdG8gbGFzdCBpbiBwcm9iZS4KPj4KPj4KPj4+PiArCj4+Pj4gKwllcnIgPSBt YTM1ZDFfcnRjX2luaXQocnRjLCBSVENfSU5JVF9USU1FT1VUKTsKPj4+PiArCWlmIChlcnIpCj4+ Pj4gKwkJcmV0dXJuIGVycjsKPj4+PiArCj4+PiBJIGRvbid0IGJlbGlldmUgeW91IHNob3VsZCBk byB0aGlzIG9uIGV2ZXJ5IHByb2JlIGJ1dCBvbmx5IHdoZW4gdGhpcwo+Pj4gaGFzbid0IGJlZW4g ZG9uZSB5ZXQuCj4+Pgo+Pj4+ICsJcmVndmFsID0gcnRjX3JlZ19yZWFkKHJ0YywgTUEzNV9SRUdf UlRDX0NMS0ZNVCk7Cj4+Pj4gKwlyZWd2YWwgfD0gUlRDX0NMS0ZNVF8yNEhFTjsKPj4+PiArCXJ0 Y19yZWdfd3JpdGUocnRjLCBNQTM1X1JFR19SVENfQ0xLRk1ULCByZWd2YWwpOwo+Pj4+ICsKPj4+ IGRpdHRvCj4+IEkgd2lsbCBtb2RpZnkgdGhlbSBhczoKPj4KPj4gSWYgKCEocnRjX3JlZ19yZWFk KHJ0YywgTUEzNV9SRUdfUlRDX0lOSVQpICYgUlRDX0lOSVRfQUNLKSkgewo+PiAgwqDCoCDCoGVy ciA9IG1hMzVkMV9ydGNfaW5pdChydGMsIFJUQ19JTklUX1RJTUVPVVQpOwo+PiAgwqDCoCDCoGlm IChlcnIpCj4+ICDCoMKgIMKgwqDCoMKgIHJldHVybiBlcnI7Cj4+ICDCoMKgIMKgcmVndmFsID0g cnRjX3JlZ19yZWFkKHJ0YywgTUEzNV9SRUdfUlRDX0NMS0ZNVCk7Cj4+ICDCoMKgIMKgcmVndmFs IHw9IFJUQ19DTEtGTVRfMjRIRU47Cj4+ICDCoMKgIMKgcnRjX3JlZ193cml0ZShydGMsIE1BMzVf UkVHX1JUQ19DTEtGTVQsIHJlZ3ZhbCk7fQo+PiB9Cj4+Cj4+Cj4+Pj4gKwlydGMtPmlycV9udW0g PSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOwo+Pj4+ICsKPj4+PiArCWVyciA9IGRldm1fcmVx dWVzdF9pcnEoJnBkZXYtPmRldiwgcnRjLT5pcnFfbnVtLCBtYTM1ZDFfcnRjX2ludGVycnVwdCwK Pj4+PiArCQkJICAgICAgIElSUUZfTk9fU1VTUEVORCwgIm1hMzVkMXJ0YyIsIHJ0Yyk7Cj4+Pj4g KwlpZiAoZXJyKQo+Pj4+ICsJCXJldHVybiBkZXZfZXJyX3Byb2JlKCZwZGV2LT5kZXYsIGVyciwg IkZhaWxlZCB0byByZXF1ZXN0IHJ0YyBpcnFcbiIpOwo+Pj4+ICsKPj4+PiArCXJlZ3ZhbCA9IHJ0 Y19yZWdfcmVhZChydGMsIE1BMzVfUkVHX1JUQ19JTlRFTik7Cj4+Pj4gKwlyZWd2YWwgfD0gUlRD X0lOVEVOX1RJQ0tJRU47Cj4+Pj4gKwlydGNfcmVnX3dyaXRlKHJ0YywgTUEzNV9SRUdfUlRDX0lO VEVOLCByZWd2YWwpOwo+Pj4+ICsKPj4+PiArCWRldmljZV9pbml0X3dha2V1cCgmcGRldi0+ZGV2 LCB0cnVlKTsKPj4+PiArCj4+PiBZb3UgbXVzdCBzZXQgdGhlIHJ0YyByYW5nZSBoZXJlLgo+PiBJ IHdpbGwgYWRkOgo+PiBtYTM1ZDFfcnRjLT5ydGNkZXYtPnJhbmdlX21pbiA9IFJUQ19USU1FU1RB TVBfQkVHSU5fMjAwMDsKPj4gbWEzNWQxX3J0Yy0+cnRjZGV2LT5yYW5nZV9tYXggPSBSVENfVElN RVNUQU1QX0VORF8yMDk5Owo+Pgo+IFBlcmZlY3QuIE1heWJlIHlvdSBzaG91bGQgcnVuIHJ0Yy1y YW5nZSB0byBjaGVjayBmb3IgcHJvcGVyIG9wZXJhdGlvbiBpbgo+IHRoZSByYW5nZToKPiBodHRw czovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9hYmVsbG9uaS9ydGMt dG9vbHMuZ2l0L3RyZWUvcnRjLXJhbmdlLmMKCldlIHdpbGwgcnVuIHRoaXMgdGVzdC4KVGhhbmtz IGZvciBwcm92aWRpbmcgdGhpcyBpbmZvcm1hdGlvbi4KCj4+Pj4gKwlyZXR1cm4gMDsKPj4+PiAr fQo+Pj4+ICsKPj4+PiArc3RhdGljIGludCBtYTM1ZDFfcnRjX3N1c3BlbmQoc3RydWN0IHBsYXRm b3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQo+Pj4+ICt7Cj4+Pj4gKwlzdHJ1 Y3QgbWEzNV9ydGMgKnJ0YyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwo+Pj4+ICsJdTMy IHJlZ3ZhbDsKPj4+PiArCj4+Pj4gKwlpZiAoZGV2aWNlX21heV93YWtldXAoJnBkZXYtPmRldikp Cj4+Pj4gKwkJZW5hYmxlX2lycV93YWtlKHJ0Yy0+aXJxX251bSk7Cj4+Pj4gKwo+Pj4+ICsJcmVn dmFsID0gcnRjX3JlZ19yZWFkKHJ0YywgTUEzNV9SRUdfUlRDX0lOVEVOKTsKPj4+PiArCXJlZ3Zh bCAmPSB+UlRDX0lOVEVOX1RJQ0tJRU47Cj4+Pj4gKwlydGNfcmVnX3dyaXRlKHJ0YywgTUEzNV9S RUdfUlRDX0lOVEVOLCByZWd2YWwpOwo+Pj4gVGhpcyBpcyBub3Qgd2hhdCB0aGUgdXNlciBpcyBh c2tpbmcsIGRvbid0IGRvIHRoaXMuIEFsc28sIGhvdyB3YXMgdGhpcwo+Pj4gdGVzdGVkPwo+PiBT dXJlLCBJIHdpbGwgcmVtb3ZlIHRoZXNlIHRocmVlIGxpbmVzIG9mIGNvZGUuCj4+Cj4+IFdlIHRl c3QgaXQgd2l0aCAiZWNobyBtZW0gPiAvc3lzL3Bvd2VyL3N0YXRlIi4KPj4KPiBZZXMsIG15IHBv aW50IGlzIHRoYXQgaWYgVUlFIGlzIGVuYWJsZWQsIHRoZW4gdGhlIHVzZXIgd2FudHMgdG8gYmUg d29rZW4KPiB1cCBldmVyeSBzZWNvbmQuIElmIHRoaXMgaXMgbm90IHdoYXQgaXMgd2FudGVkLCB0 aGVuIFVJRSBoYXMgdG8gYmUKPiBkaXNhYmxlZCBiZWZvcmUgZ29pbmcgdG8gc3VzcGVuZC4KPgo+ IE15IHF1ZXN0aW9uIGlzIHdoeSBhcmUgeW91IGVuYWJsaW5nIFJUQ19JTlRFTl9USUNLSUVOIGlu IHByb2JlPyBJIGRvbid0Cj4gZXhwZWN0IGFueW9uZSB0byB1c2UgYW4gYWN0dWFsIGhhcmR3YXJl IHRpY2sgaW50ZXJydXB0LCB1bmxlc3MgdGhlIGFsYXJtCj4gaXMgYnJva2VuIGFuZCBjYW4ndCBi ZSBzZXQgZXZlcnkgc2Vjb25kLiBUaGlzIGlzIHdoeSBJIHF1ZXN0aW9uZWQgdGhlCj4gUlRDX1VG IHBhdGggYmVjYXVzZSBJIGRvbid0IGV4cGVjdCBpdCB0byBiZSB0YWtlbiBhdCBhbGwuCgpZZXMs IHdlIHdpbGwgcmVtb3ZlIFRJQ0tJRU4gZnJvbSBwcm9iZSBhbmQgbW9kaWZ5IG1hMzVkMV9hbGFy bV9pcnFfZW5hYmxlKCkuClRJQ0tJRU4gd2lsbCBiZSBlbmFibGVkIG9ubHkgaWYgVUlFIGlzIGVu YWJsZWQuCgpzdGF0aWMgaW50IG1hMzVkMV9hbGFybV9pcnFfZW5hYmxlKHN0cnVjdCBkZXZpY2Ug KmRldiwgdW5zaWduZWQgaW50IGVuYWJsZWQpCnsKIMKgwqAgwqBzdHJ1Y3QgbWEzNWQxX3J0YyAq cnRjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CgogwqDCoCDCoGlmIChlbmFibGVkKSB7CiDCoMKg IMKgwqDCoMKgIGlmIChydGMtPnJ0Yy0+dWllX3J0Y3RpbWVyLmVuYWJsZWQpCiDCoMKgIMKgwqDC oMKgIMKgwqDCoCBydGNfcmVnX3dyaXRlKHJ0YywgTlZUX1JUQ19JTlRFTiwKIMKgwqAgwqDCoMKg wqAgwqDCoMKgIMKgwqDCoCDCoMKgwqDCoMKgIChydGNfcmVnX3JlYWQocnRjLCAKTlZUX1JUQ19J TlRFTil8KFJUQ19JTlRFTl9USUNLSUVOKSkpOwogwqDCoCDCoMKgwqDCoCBpZiAocnRjLT5ydGMt PmFpZV90aW1lci5lbmFibGVkKQogwqDCoCDCoMKgwqDCoCDCoMKgwqAgcnRjX3JlZ193cml0ZShy dGMsIE5WVF9SVENfSU5URU4sCiDCoMKgIMKgwqDCoMKgIMKgwqDCoCDCoMKgwqAgwqDCoMKgwqDC oCAocnRjX3JlZ19yZWFkKHJ0YywgCk5WVF9SVENfSU5URU4pfChSVENfSU5URU5fQUxNSUVOKSkp OwogwqDCoCDCoH0gZWxzZSB7CiDCoMKgIMKgwqDCoMKgIGlmIChydGMtPnJ0Yy0+dWllX3J0Y3Rp bWVyLmVuYWJsZWQpCiDCoMKgIMKgwqDCoMKgIMKgwqDCoCBydGNfcmVnX3dyaXRlKHJ0YywgTlZU X1JUQ19JTlRFTiwKIMKgwqAgwqDCoMKgwqAgwqDCoMKgIMKgwqDCoCDCoMKgwqDCoMKgIChydGNf cmVnX3JlYWQocnRjLCBOVlRfUlRDX0lOVEVOKSAmIAooflJUQ19JTlRFTl9USUNLSUVOKSkpOwog wqDCoCDCoMKgwqDCoCBpZiAocnRjLT5ydGMtPmFpZV90aW1lci5lbmFibGVkKQogwqDCoCDCoMKg wqDCoCDCoMKgwqAgcnRjX3JlZ193cml0ZShydGMsIE5WVF9SVENfSU5URU4sCiDCoMKgIMKgwqDC oMKgIMKgwqDCoCDCoMKgwqAgwqDCoMKgwqDCoCAocnRjX3JlZ19yZWFkKHJ0YywgTlZUX1JUQ19J TlRFTikgJiAKKH5SVENfSU5URU5fQUxNSUVOKSkpOwogwqDCoCDCoH0KIMKgwqAgwqByZXR1cm4g MDsKfQoKCgo+Pj4+ICsKPj4+PiArCXJldHVybiAwOwo+Pj4+ICt9Cj4+Pj4gKwo+Pj4+ICtzdGF0 aWMgaW50IG1hMzVkMV9ydGNfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCj4+ Pj4gK3sKPj4+PiArCXN0cnVjdCBtYTM1X3J0YyAqcnRjID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEo cGRldik7Cj4+Pj4gKwl1MzIgcmVndmFsOwo+Pj4+ICsKPj4+PiArCWlmIChkZXZpY2VfbWF5X3dh a2V1cCgmcGRldi0+ZGV2KSkKPj4+PiArCQlkaXNhYmxlX2lycV93YWtlKHJ0Yy0+aXJxX251bSk7 Cj4+Pj4gKwo+Pj4+ICsJcmVndmFsID0gcnRjX3JlZ19yZWFkKHJ0YywgTUEzNV9SRUdfUlRDX0lO VEVOKTsKPj4+PiArCXJlZ3ZhbCB8PSBSVENfSU5URU5fVElDS0lFTjsKPj4+PiArCXJ0Y19yZWdf d3JpdGUocnRjLCBNQTM1X1JFR19SVENfSU5URU4sIHJlZ3ZhbCk7Cj4+Pj4gKwo+Pj4+ICsJcmV0 dXJuIDA7Cj4+Pj4gK30KPj4+PiArCj4+Pj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNl X2lkIG1hMzVkMV9ydGNfb2ZfbWF0Y2hbXSA9IHsKPj4+PiArCXsgLmNvbXBhdGlibGUgPSAibnV2 b3RvbixtYTM1ZDEtcnRjIiwgfSwKPj4+PiArCXt9LAo+Pj4+ICt9Owo+Pj4+ICtNT0RVTEVfREVW SUNFX1RBQkxFKG9mLCBtYTM1ZDFfcnRjX29mX21hdGNoKTsKPj4+PiArCj4+Pj4gK3N0YXRpYyBz dHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG1hMzVkMV9ydGNfZHJpdmVyID0gewo+Pj4+ICsJLnN1c3Bl bmQgICAgPSBtYTM1ZDFfcnRjX3N1c3BlbmQsCj4+Pj4gKwkucmVzdW1lICAgICA9IG1hMzVkMV9y dGNfcmVzdW1lLAo+Pj4+ICsJLnByb2JlICAgICAgPSBtYTM1ZDFfcnRjX3Byb2JlLAo+Pj4+ICsJ LmRyaXZlcgkJPSB7Cj4+Pj4gKwkJLm5hbWUJPSAicnRjLW1hMzVkMSIsCj4+Pj4gKwkJLm9mX21h dGNoX3RhYmxlID0gbWEzNWQxX3J0Y19vZl9tYXRjaCwKPj4+PiArCX0sCj4+Pj4gK307Cj4+Pj4g Kwo+Pj4+ICttb2R1bGVfcGxhdGZvcm1fZHJpdmVyKG1hMzVkMV9ydGNfZHJpdmVyKTsKPj4+PiAr Cj4+Pj4gK01PRFVMRV9BVVRIT1IoIk1pbi1KZW4gQ2hlbiA8bWpjaGVuQG51dm90b24uY29tPiIp Owo+Pj4+ICtNT0RVTEVfREVTQ1JJUFRJT04oIk1BMzVEMSBSVEMgZHJpdmVyIik7Cj4+Pj4gK01P RFVMRV9MSUNFTlNFKCJHUEwiKTsKPj4+PiAtLSAKPj4+PiAyLjM0LjEKPj4+Pgo+Pgo+PiBCZXN0 IFJlZ2FyZHMsCj4+IEphY2t5IEh1YW5nCj4+CgpCZXN0IFJlZ2FyZHMsCkphY2t5IEh1YW5nCgoK X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KbGludXgtYXJt LWtlcm5lbCBtYWlsaW5nIGxpc3QKbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3Jn Cmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtYXJtLWtl cm5lbAo=