Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
11 changed files
with
320 additions
and
118 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
24 changes: 24 additions & 0 deletions
24
Documentation/devicetree/bindings/power/reset/mt6397-rtc-poweroff.txt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
Device-Tree bindings for Power Device on MediaTek PMIC RTC | ||
|
||
The power device is responsible for externally power off or on the remote | ||
MediaTek SoC through the a tiny circuit block BBPU inside PMIC RTC. | ||
|
||
Required parent node: | ||
- rtc | ||
For MediaTek PMIC RTC bindings, see: | ||
Documentation/devicetree/bindings/mfd/mt6397.txt | ||
|
||
Required properties: | ||
- compatible: Should be one of follows | ||
"mediatek,mt6323-rtc-poweroff": for MT6323 PMIC | ||
"mediatek,mt6397-rtc-poweroff": for MT6397 PMIC | ||
|
||
Example: | ||
|
||
rtc { | ||
compatible = "mediatek,mt6323-rtc"; | ||
|
||
power-off { | ||
compatible = "mediatek,mt6323-rtc-poweroff"; | ||
}; | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
Device-Tree bindings for MediaTek PMIC based RTC | ||
|
||
MediaTek PMIC based RTC is an independent function of MediaTek PMIC which | ||
is working as a multi-function device (MFD). And the RTC can be configured and | ||
set up via PMIC wrapper bus. Which is also common resource shared among the | ||
other functions present on the PMIC. | ||
|
||
For MediaTek PMIC wrapper bus bindings, see: | ||
Documentation/devicetree/bindings/soc/mediatek/pwrap.txt | ||
|
||
Required parent node: | ||
- pmic | ||
For MediaTek PMIC MFD bindings, see: | ||
Documentation/devicetree/bindings/mfd/mt6397.txt | ||
|
||
Required properties: | ||
- compatible: Should be one of follows | ||
"mediatek,mt6323-rtc": for MT6323 PMIC | ||
"mediatek,mt6397-rtc": for MT6397 PMIC | ||
|
||
Optional child node: | ||
- power-off | ||
For Power-Off Device for MediaTek PMIC RTC bindings, see: | ||
Documentation/devicetree/bindings/power/reset/mt6397-rtc-poweroff.txt | ||
|
||
Example: | ||
|
||
pmic { | ||
compatible = "mediatek,mt6323"; | ||
|
||
... | ||
rtc { | ||
compatible = "mediatek,mt6323-rtc"; | ||
|
||
power-off { | ||
compatible = "mediatek,mt6323-rtc-poweroff"; | ||
}; | ||
}; | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -532,3 +532,6 @@ CONFIG_NFS_COMMON=y | |
#xfs | ||
CONFIG_XFS_FS=m | ||
|
||
#RTC/POWER | ||
CONFIG_POWER_RESET=y | ||
CONFIG_POWER_RESET_MT6397_RTC=y |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,100 @@ | ||
// SPDX-License-Identifier: GPL-2.0 | ||
/* | ||
* Power-off using MediaTek PMIC RTC device | ||
* | ||
* 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/rtc/mt6397.h> | ||
|
||
struct mt6397_rtc_powercon { | ||
struct device *dev; | ||
struct mt6397_rtc *rtc; | ||
}; | ||
|
||
static struct mt6397_rtc_powercon *mt_powercon; | ||
|
||
static void mt6397_rtc_do_poweroff(void) | ||
{ | ||
struct mt6397_rtc_powercon *powercon = mt_powercon; | ||
struct mt6397_rtc *rtc = powercon->rtc; | ||
unsigned int val; | ||
int ret; | ||
|
||
regmap_write(rtc->regmap, rtc->addr_base + RTC_BBPU, RTC_BBPU_KEY); | ||
regmap_write(rtc->regmap, rtc->addr_base + RTC_WRTGR, 1); | ||
|
||
ret = regmap_read_poll_timeout(rtc->regmap, | ||
rtc->addr_base + RTC_BBPU, val, | ||
!(val & RTC_BBPU_CBUSY), | ||
MTK_RTC_POLL_DELAY_US, | ||
MTK_RTC_POLL_TIMEOUT); | ||
if (ret) | ||
dev_err(powercon->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 poweroff system\n"); | ||
} | ||
|
||
static int mt6397_rtc_poweroff_probe(struct platform_device *pdev) | ||
{ | ||
struct mt6397_rtc *rtc = dev_get_drvdata(pdev->dev.parent); | ||
struct mt6397_rtc_powercon *powercon; | ||
|
||
if (!rtc) { | ||
dev_err(&pdev->dev, "Can't find RTC as the parent\n"); | ||
return -ENODEV; | ||
} | ||
|
||
powercon = devm_kzalloc(&pdev->dev, sizeof(*powercon), GFP_KERNEL); | ||
if (!powercon) | ||
return -ENOMEM; | ||
|
||
powercon->dev = &pdev->dev; | ||
powercon->rtc = rtc; | ||
mt_powercon = powercon; | ||
|
||
pm_power_off = &mt6397_rtc_do_poweroff; | ||
|
||
return 0; | ||
} | ||
|
||
static int mt6397_rtc_poweroff_remove(struct platform_device *pdev) | ||
{ | ||
if (pm_power_off == &mt6397_rtc_do_poweroff) | ||
pm_power_off = NULL; | ||
|
||
return 0; | ||
} | ||
|
||
static const struct of_device_id mt6397_rtc_poweroff_dt_match[] = { | ||
{ .compatible = "mediatek,mt6323-rtc-poweroff" }, | ||
{ .compatible = "mediatek,mt6397-rtc-poweroff" }, | ||
{}, | ||
}; | ||
MODULE_DEVICE_TABLE(of, mt6397_rtc_poweroff_dt_match); | ||
|
||
static struct platform_driver mt6397_rtc_poweroff_driver = { | ||
.probe = mt6397_rtc_poweroff_probe, | ||
.remove = mt6397_rtc_poweroff_remove, | ||
.driver = { | ||
.name = "mt6397-rtc-poweroff", | ||
.of_match_table = mt6397_rtc_poweroff_dt_match, | ||
}, | ||
}; | ||
|
||
module_platform_driver(mt6397_rtc_poweroff_driver); | ||
|
||
MODULE_DESCRIPTION("Poweroff driver using MediaTek PMIC RTC"); | ||
MODULE_AUTHOR("Sean Wang <sean.wang@mediatek.com>"); | ||
MODULE_LICENSE("GPL v2"); | ||
MODULE_ALIAS("platform:mt6397-rtc-poweroff"); |
Oops, something went wrong.