BPI-R2 already has an on-board RTC

I only noticed it compared to 4.14-main.

ok, 4.14 currently supports much more features like hdmi (second gmac, hnat, …) which may cause more options…basic hdmi-patches (by mediatek) maybe included, but at least dts-nodes and fbdev is missing

@jofri: if i activate rtc_class=y (see my defconfig in 4.19-rc) i get the following errors:

  CC      drivers/rtc/rtc-mt6397.o
In file included from drivers/rtc/rtc-mt6397.c:13:
./include/linux/mfd/mt6397/core.h:59:15: error: field 'irqlock' has incomplete type
  struct mutex irqlock;
drivers/rtc/rtc-mt6397.c:320:34: error: array type has incomplete element type 'struct of_device_id'
 static const struct of_device_id mt6397_rtc_of_match[] = {
drivers/rtc/rtc-mt6397.c:321:4: error: field name not in record or union initializer
  { .compatible = "mediatek,mt6323-rtc", },
drivers/rtc/rtc-mt6397.c:321:4: note: (near initialization for 'mt6397_rtc_of_match')
drivers/rtc/rtc-mt6397.c:322:4: error: field name not in record or union initializer
  { .compatible = "mediatek,mt6397-rtc", },
drivers/rtc/rtc-mt6397.c:322:4: note: (near initialization for 'mt6397_rtc_of_match')
drivers/rtc/rtc-mt6397.c:320:34: warning: 'mt6397_rtc_of_match' defined but not used [-Wunused-variable]
 static const struct of_device_id mt6397_rtc_of_match[] = {
scripts/Makefile.build:307: recipe for target 'drivers/rtc/rtc-mt6397.o' failed
make[2]: *** [drivers/rtc/rtc-mt6397.o] Error 1
scripts/Makefile.build:548: recipe for target 'drivers/rtc' failed
make[1]: *** [drivers/rtc] Error 2
Makefile:1057: recipe for target 'drivers' failed
make: *** [drivers] Error 2

can you take a look at this? First one seems to be missing include



1 Like
diff --git a/drivers/rtc/rtc-mt6397.c b/drivers/rtc/rtc-mt6397.c
index 1ebeaaf11dfa..c3ed1e660f85 100644
--- a/drivers/rtc/rtc-mt6397.c
+++ b/drivers/rtc/rtc-mt6397.c
@@ -17,6 +17,7 @@
 #include <linux/regmap.h>
 #include <linux/rtc.h>
 #include <linux/mfd/mt6397/rtc.h>
+#include <linux/mod_devicetable.h>

 static int mtk_rtc_write_trigger(struct mt6397_rtc *rtc)
diff --git a/include/linux/mfd/mt6397/core.h b/include/linux/mfd/mt6397/core.h
index d678f526e498..0425c68cc187 100644
--- a/include/linux/mfd/mt6397/core.h
+++ b/include/linux/mfd/mt6397/core.h
@@ -15,6 +15,8 @@
 #ifndef __MFD_MT6397_CORE_H__
 #define __MFD_MT6397_CORE_H__

+#include <linux/mutex.h>
 enum mt6397_irq_numbers {
        MT6397_IRQ_SPKL_AB = 0,

thanks, like my fix :wink:


it seems that poweroff from 4.19-rc1 is not compatible with 4.19 final. i have added 2 includes to get it compilable, but board does not poweroff completely

power consumption is 1 W instead of 0.2W and all leds are going in a darker mode, but lit all, also network-leds stay on

also in this strange mode reset-switch does not work

i also changed this because i load kernel from tftp


can help here again? it seems that the main files (drivers/mfd/mt6397-core.c, drivers/rtc/rtc-mt6397.c) are not changed in last time

https://patchwork.kernel.org/patch/10593453/ seems not to be merged…that was my first thought

@moore @linkerosa @Jackzeng can you help here? Something seems to be changed between rc1 and final (or rc7…had same behaviour while testing hdmi)

edit: mhm, it seems that tjis issue depends on any module…if i boot from sd-card with modules poweroff works like expected…if i boot kernel from tftp (only uImage) it does not working

Hello Frank,

So I have now tested 4.19. With me everything is as it should be at boot by sd. With tftp I have not tested, but are you sure that the kernel synonymous to the modules fits. “uname -a” and module-path.


On tftp i have no modules (load only uimage) so i guess i need any module for this to work…this i want to make builtin. But i don’t know which module it is…the rtc and power are already builtin. Keyboard-pmic should be module for users who have soldered power-switch

@jofri can you try to make your Patch included in mainline?


do you mean in your master branch?

i mean making it ready to post to linux-mediatek :wink:

like i did for dsa-patches and will do for fbdev if i get answer from CK Hu :slight_smile:

make a git format-patch and then a scripts/checkpatch.pl


this removes some code and i don’t know why…you have to describe it and maybe split into multiple parts. but when it is in mainline it will be maintained.

Hello Frank,

I inserted poweroff in your branch ‘origin / 4.20-rc’

(last commit 7dfcda746c0d50aae40839327753eda165320f9d)

and tested it with checkpatch.pl without error.

The compiler runs without errors. Unfortunately I can not check the kernel myself, because my R2 is in use elsewhere.

0001-add-doc-and-MAINTAINERS-for-poweroff.patch (4,4 KB) 0002-add-dts-for-poweroff.patch (1,1 KB) 0003-add-driver-and-MAINTAINERS-for-poweroff.patch (15,3 KB)

1 Like

Thank you,i test it as far as i can

btw. For multi-patch you need also cover-letter (description what series do) its a textfile beginning with 0000- (patch 0/x) created by format-patch --cover-letter

Is it necessary to remove rtc for poweroff?

Thanks, I’ve learned a lot here. A year ago, I did not start to mess with git. Also docuwiki arouses my interest.At the moment I am dealing with the BPI-W2. This is a big construction site.


a sorry, you move the code (to rtc.h) not remove it…

btw. i also started with git here with my first kernel (while getting 4.14 running (sd-card issue) )

you should drop my defconfig in your Patch because this does not exist on mainline (and brings warning because i’ve already set option while copy from 4.19)

will now compile and test it…

nano /etc/acpi/events/power



service acpid restart

rebased my 4.20-poweroff to avoid the warning (maybe will cause problems if i want to merge…but will not do this on rc)

@jofri have you tried to send it to mainline? Any problems? Have you created cover-letter?

@jofri any idea how to get poweroff working in uboot?

maybe we can implement it like this: https://patchwork.ozlabs.org/patch/1075860/

i don’t know how to convert linux regmap_write to uboot pmic_clrsetbits which seem to do similar

as far as i found in your patches this seems to be the key to power off the board:

which value is pwrc->base ? maybe it’s the same as REG_DEVCTRL for the rk8xx

1 Like

pwrc->base should be this (drivers/mfd/mt6397-core.c):

#define MT6323_PWRC_BASE	0x8000

regmap_write(dev,reg,val) is defined here: https://elixir.bootlin.com/linux/v4.19/source/drivers/base/regmap/regmap.c#L1778

writing in uboot:

pmic_reg_write(struct udevice *dev, uint reg, uint value)

maybe i can use this: http://git.denx.de/?p=u-boot.git;a=blob;f=drivers/power/domain/mtk-power-domain.c;h=c67e8804b16f9355820882d95f30c4330ddef640;hb=9dec738a8b843bcdcf22ed3e11c59255e9f79d2b#l258 ?

currently it seems there is no pmic implemented yet, so i don’t know how i can get the device to set the register-value :frowning:

Mhm…uboot has also regmap_write…but how to get the regmap (first param)? I found no use in mt7623 patches in uboot,but regmap-config-option is set


In kernel the regmap is defined/allocated in probe

Imho i only need this:

struct mt6397_chip *mt6397_chip = dev_get_drvdata(pdev->dev.parent);

how to get the pdev (passed to probe) in uboot and where does dev_get_drvdata reads the data?

Imho i need to define a platform-device in dts and a platform-driver struct,something like this:

static struct platform_driver mt6397_driver = {
    .probe = mt6397_probe,
    .remove = mt6397_remove,
    .driver = {
        .name = "mt6397",
        .of_match_table = of_mt6397_match

But i still don’t understand where the regmap getting its data…here the parent-dev is used…this is the mt6323-node…maybe there is a shorter way without creating the full mt6323-node

Edit 24.10.2019:

Poweroff patches are finally prepared for mainline (5.5 merge window):



Any idea about poweroff in uboot?

edit 22th Nov 2019:

with the great help of @ray i got manually poweroff working in uboot:

mw 0x1000d09c 0xc0004300
mw 0x1000d09c 0xc01e0001

where register 1000d09c is pwrap-base (1000d000) + PWRAP_WACS2_CMD (0x9c) and value is calculated this way:

printf "%x\n" $(( (1 << 31) | ((0x8000 >> 1) << 16) | 0x4300 ))
printf "%x\n" $(( (1 << 31) | ((0x803c >> 1) << 16) | 1 ))

based on linux access method:

WR4(wrp, PWRAP_WACS2_CMD, (1 << 31) | ((adr >> 1) << 16) | wdata);

here 0x8000 is MT6323_PWRC_BASE and 0x3c is the RTC_WRTGR

how it’s done in linux:

#define MT6323_PWRC_BASE 0x8000
#define RTC_BBPU 0x0000
#define RTC_BBPU_KEY (0x43 << 8)
#define RTC_WRTGR 0x003c

regmap_write(pwrc->regmap, pwrc->base + RTC_BBPU, RTC_BBPU_KEY);
regmap_write(pwrc->regmap, pwrc->base + RTC_WRTGR, 1);

with pmic-calculation:

1 Like