Loading Documentation/devicetree/bindings/rtc/rtc-mt6397.txt 0 → 100644 +29 −0 Original line number Diff line number Diff line Device-Tree bindings for MediaTek PMIC based RTC MediaTek PMIC based RTC is an independent function of MediaTek PMIC that works as a type of multi-function device (MFD). The RTC can be configured and set up with PMIC wrapper bus which is a common resource shared with the other functions found on the same PMIC. For MediaTek PMIC MFD bindings, see: ../mfd/mt6397.txt For MediaTek PMIC wrapper bus bindings, see: ../soc/mediatek/pwrap.txt Required properties: - compatible: Should be one of follows "mediatek,mt6323-rtc": for MT6323 PMIC "mediatek,mt6397-rtc": for MT6397 PMIC Example: pmic { compatible = "mediatek,mt6323"; ... rtc { compatible = "mediatek,mt6323-rtc"; }; }; MAINTAINERS +7 −0 Original line number Diff line number Diff line Loading @@ -10266,6 +10266,13 @@ S: Maintained F: drivers/net/dsa/mt7530.* F: net/dsa/tag_mtk.c MEDIATEK BOARD LEVEL SHUTDOWN DRIVERS M: Sean Wang <sean.wang@mediatek.com> L: linux-pm@vger.kernel.org S: Maintained F: Documentation/devicetree/bindings/power/reset/mt6323-poweroff.txt F: drivers/power/reset/mt6323-poweroff.c MEDIATEK JPEG DRIVER M: Rick Chang <rick.chang@mediatek.com> M: Bin Liu <bin.liu@mediatek.com> Loading drivers/power/reset/Kconfig +10 −0 Original line number Diff line number Diff line Loading @@ -140,6 +140,16 @@ config POWER_RESET_LTC2952 This driver supports an external powerdown trigger and board power down via the LTC2952. Bindings are made in the device tree. config POWER_RESET_MT6323 bool "MediaTek MT6323 power-off driver" depends on MFD_MT6397 help The power-off driver is responsible for externally shutdown down the power of a remote MediaTek SoC MT6323 is connected to through controlling a tiny circuit BBPU inside MT6323 RTC. Say Y if you have a board where MT6323 could be found. config POWER_RESET_QNAP bool "QNAP power-off driver" depends on OF_GPIO && PLAT_ORION Loading drivers/power/reset/Makefile +1 −0 Original line number Diff line number Diff line Loading @@ -11,6 +11,7 @@ obj-$(CONFIG_POWER_RESET_GPIO) += gpio-poweroff.o obj-$(CONFIG_POWER_RESET_GPIO_RESTART) += gpio-restart.o obj-$(CONFIG_POWER_RESET_HISI) += hisi-reboot.o obj-$(CONFIG_POWER_RESET_MSM) += msm-poweroff.o obj-$(CONFIG_POWER_RESET_MT6323) += mt6323-poweroff.o obj-$(CONFIG_POWER_RESET_QCOM_PON) += qcom-pon.o obj-$(CONFIG_POWER_RESET_OCELOT_RESET) += ocelot-reset.o obj-$(CONFIG_POWER_RESET_PIIX4_POWEROFF) += piix4-poweroff.o Loading drivers/power/reset/mt6323-poweroff.c 0 → 100644 +97 −0 Original line number Diff line number Diff line // SPDX-License-Identifier: GPL-2.0 /* * Power off through MediaTek PMIC * * Copyright (C) 2018 MediaTek Inc. * * Author: Sean Wang <sean.wang@mediatek.com> * */ #include <linux/err.h> #include <linux/module.h> #include <linux/of.h> #include <linux/platform_device.h> #include <linux/mfd/mt6397/core.h> #include <linux/mfd/mt6397/rtc.h> struct mt6323_pwrc { struct device *dev; struct regmap *regmap; u32 base; }; static struct mt6323_pwrc *mt_pwrc; static void mt6323_do_pwroff(void) { struct mt6323_pwrc *pwrc = mt_pwrc; unsigned int val; int ret; regmap_write(pwrc->regmap, pwrc->base + RTC_BBPU, RTC_BBPU_KEY); regmap_write(pwrc->regmap, pwrc->base + RTC_WRTGR, 1); ret = regmap_read_poll_timeout(pwrc->regmap, pwrc->base + RTC_BBPU, val, !(val & RTC_BBPU_CBUSY), MTK_RTC_POLL_DELAY_US, MTK_RTC_POLL_TIMEOUT); if (ret) dev_err(pwrc->dev, "failed to write BBPU: %d\n", ret); /* Wait some time until system down, otherwise, notice with a warn */ mdelay(1000); WARN_ONCE(1, "Unable to power off system\n"); } static int mt6323_pwrc_probe(struct platform_device *pdev) { struct mt6397_chip *mt6397_chip = dev_get_drvdata(pdev->dev.parent); struct mt6323_pwrc *pwrc; struct resource *res; pwrc = devm_kzalloc(&pdev->dev, sizeof(*pwrc), GFP_KERNEL); if (!pwrc) return -ENOMEM; res = platform_get_resource(pdev, IORESOURCE_MEM, 0); pwrc->base = res->start; pwrc->regmap = mt6397_chip->regmap; pwrc->dev = &pdev->dev; mt_pwrc = pwrc; pm_power_off = &mt6323_do_pwroff; return 0; } static int mt6323_pwrc_remove(struct platform_device *pdev) { if (pm_power_off == &mt6323_do_pwroff) pm_power_off = NULL; return 0; } static const struct of_device_id mt6323_pwrc_dt_match[] = { { .compatible = "mediatek,mt6323-pwrc" }, {}, }; MODULE_DEVICE_TABLE(of, mt6323_pwrc_dt_match); static struct platform_driver mt6323_pwrc_driver = { .probe = mt6323_pwrc_probe, .remove = mt6323_pwrc_remove, .driver = { .name = "mt6323-pwrc", .of_match_table = mt6323_pwrc_dt_match, }, }; module_platform_driver(mt6323_pwrc_driver); MODULE_DESCRIPTION("Poweroff driver for MT6323 PMIC"); MODULE_AUTHOR("Sean Wang <sean.wang@mediatek.com>"); MODULE_LICENSE("GPL v2"); Loading
Documentation/devicetree/bindings/rtc/rtc-mt6397.txt 0 → 100644 +29 −0 Original line number Diff line number Diff line Device-Tree bindings for MediaTek PMIC based RTC MediaTek PMIC based RTC is an independent function of MediaTek PMIC that works as a type of multi-function device (MFD). The RTC can be configured and set up with PMIC wrapper bus which is a common resource shared with the other functions found on the same PMIC. For MediaTek PMIC MFD bindings, see: ../mfd/mt6397.txt For MediaTek PMIC wrapper bus bindings, see: ../soc/mediatek/pwrap.txt Required properties: - compatible: Should be one of follows "mediatek,mt6323-rtc": for MT6323 PMIC "mediatek,mt6397-rtc": for MT6397 PMIC Example: pmic { compatible = "mediatek,mt6323"; ... rtc { compatible = "mediatek,mt6323-rtc"; }; };
MAINTAINERS +7 −0 Original line number Diff line number Diff line Loading @@ -10266,6 +10266,13 @@ S: Maintained F: drivers/net/dsa/mt7530.* F: net/dsa/tag_mtk.c MEDIATEK BOARD LEVEL SHUTDOWN DRIVERS M: Sean Wang <sean.wang@mediatek.com> L: linux-pm@vger.kernel.org S: Maintained F: Documentation/devicetree/bindings/power/reset/mt6323-poweroff.txt F: drivers/power/reset/mt6323-poweroff.c MEDIATEK JPEG DRIVER M: Rick Chang <rick.chang@mediatek.com> M: Bin Liu <bin.liu@mediatek.com> Loading
drivers/power/reset/Kconfig +10 −0 Original line number Diff line number Diff line Loading @@ -140,6 +140,16 @@ config POWER_RESET_LTC2952 This driver supports an external powerdown trigger and board power down via the LTC2952. Bindings are made in the device tree. config POWER_RESET_MT6323 bool "MediaTek MT6323 power-off driver" depends on MFD_MT6397 help The power-off driver is responsible for externally shutdown down the power of a remote MediaTek SoC MT6323 is connected to through controlling a tiny circuit BBPU inside MT6323 RTC. Say Y if you have a board where MT6323 could be found. config POWER_RESET_QNAP bool "QNAP power-off driver" depends on OF_GPIO && PLAT_ORION Loading
drivers/power/reset/Makefile +1 −0 Original line number Diff line number Diff line Loading @@ -11,6 +11,7 @@ obj-$(CONFIG_POWER_RESET_GPIO) += gpio-poweroff.o obj-$(CONFIG_POWER_RESET_GPIO_RESTART) += gpio-restart.o obj-$(CONFIG_POWER_RESET_HISI) += hisi-reboot.o obj-$(CONFIG_POWER_RESET_MSM) += msm-poweroff.o obj-$(CONFIG_POWER_RESET_MT6323) += mt6323-poweroff.o obj-$(CONFIG_POWER_RESET_QCOM_PON) += qcom-pon.o obj-$(CONFIG_POWER_RESET_OCELOT_RESET) += ocelot-reset.o obj-$(CONFIG_POWER_RESET_PIIX4_POWEROFF) += piix4-poweroff.o Loading
drivers/power/reset/mt6323-poweroff.c 0 → 100644 +97 −0 Original line number Diff line number Diff line // SPDX-License-Identifier: GPL-2.0 /* * Power off through MediaTek PMIC * * Copyright (C) 2018 MediaTek Inc. * * Author: Sean Wang <sean.wang@mediatek.com> * */ #include <linux/err.h> #include <linux/module.h> #include <linux/of.h> #include <linux/platform_device.h> #include <linux/mfd/mt6397/core.h> #include <linux/mfd/mt6397/rtc.h> struct mt6323_pwrc { struct device *dev; struct regmap *regmap; u32 base; }; static struct mt6323_pwrc *mt_pwrc; static void mt6323_do_pwroff(void) { struct mt6323_pwrc *pwrc = mt_pwrc; unsigned int val; int ret; regmap_write(pwrc->regmap, pwrc->base + RTC_BBPU, RTC_BBPU_KEY); regmap_write(pwrc->regmap, pwrc->base + RTC_WRTGR, 1); ret = regmap_read_poll_timeout(pwrc->regmap, pwrc->base + RTC_BBPU, val, !(val & RTC_BBPU_CBUSY), MTK_RTC_POLL_DELAY_US, MTK_RTC_POLL_TIMEOUT); if (ret) dev_err(pwrc->dev, "failed to write BBPU: %d\n", ret); /* Wait some time until system down, otherwise, notice with a warn */ mdelay(1000); WARN_ONCE(1, "Unable to power off system\n"); } static int mt6323_pwrc_probe(struct platform_device *pdev) { struct mt6397_chip *mt6397_chip = dev_get_drvdata(pdev->dev.parent); struct mt6323_pwrc *pwrc; struct resource *res; pwrc = devm_kzalloc(&pdev->dev, sizeof(*pwrc), GFP_KERNEL); if (!pwrc) return -ENOMEM; res = platform_get_resource(pdev, IORESOURCE_MEM, 0); pwrc->base = res->start; pwrc->regmap = mt6397_chip->regmap; pwrc->dev = &pdev->dev; mt_pwrc = pwrc; pm_power_off = &mt6323_do_pwroff; return 0; } static int mt6323_pwrc_remove(struct platform_device *pdev) { if (pm_power_off == &mt6323_do_pwroff) pm_power_off = NULL; return 0; } static const struct of_device_id mt6323_pwrc_dt_match[] = { { .compatible = "mediatek,mt6323-pwrc" }, {}, }; MODULE_DEVICE_TABLE(of, mt6323_pwrc_dt_match); static struct platform_driver mt6323_pwrc_driver = { .probe = mt6323_pwrc_probe, .remove = mt6323_pwrc_remove, .driver = { .name = "mt6323-pwrc", .of_match_table = mt6323_pwrc_dt_match, }, }; module_platform_driver(mt6323_pwrc_driver); MODULE_DESCRIPTION("Poweroff driver for MT6323 PMIC"); MODULE_AUTHOR("Sean Wang <sean.wang@mediatek.com>"); MODULE_LICENSE("GPL v2");