mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-19 10:44:14 +08:00
mfd: mt6397: Modify suspend/resume behavior
Some pmics don't need backup interrupt settings, so we change to use pm notifier for the pmics which are necessary to store settings. Signed-off-by: Hsin-Hsiung Wang <hsin-hsiung.wang@mediatek.com> Signed-off-by: Lee Jones <lee.jones@linaro.org>
This commit is contained in:
parent
8f3d9f3542
commit
4e2e7cfec1
@ -100,35 +100,6 @@ static const struct mfd_cell mt6397_devs[] = {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef CONFIG_PM_SLEEP
|
|
||||||
static int mt6397_irq_suspend(struct device *dev)
|
|
||||||
{
|
|
||||||
struct mt6397_chip *chip = dev_get_drvdata(dev);
|
|
||||||
|
|
||||||
regmap_write(chip->regmap, chip->int_con[0], chip->wake_mask[0]);
|
|
||||||
regmap_write(chip->regmap, chip->int_con[1], chip->wake_mask[1]);
|
|
||||||
|
|
||||||
enable_irq_wake(chip->irq);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int mt6397_irq_resume(struct device *dev)
|
|
||||||
{
|
|
||||||
struct mt6397_chip *chip = dev_get_drvdata(dev);
|
|
||||||
|
|
||||||
regmap_write(chip->regmap, chip->int_con[0], chip->irq_masks_cur[0]);
|
|
||||||
regmap_write(chip->regmap, chip->int_con[1], chip->irq_masks_cur[1]);
|
|
||||||
|
|
||||||
disable_irq_wake(chip->irq);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static SIMPLE_DEV_PM_OPS(mt6397_pm_ops, mt6397_irq_suspend,
|
|
||||||
mt6397_irq_resume);
|
|
||||||
|
|
||||||
struct chip_data {
|
struct chip_data {
|
||||||
u32 cid_addr;
|
u32 cid_addr;
|
||||||
u32 cid_shift;
|
u32 cid_shift;
|
||||||
@ -238,7 +209,6 @@ static struct platform_driver mt6397_driver = {
|
|||||||
.driver = {
|
.driver = {
|
||||||
.name = "mt6397",
|
.name = "mt6397",
|
||||||
.of_match_table = of_match_ptr(mt6397_of_match),
|
.of_match_table = of_match_ptr(mt6397_of_match),
|
||||||
.pm = &mt6397_pm_ops,
|
|
||||||
},
|
},
|
||||||
.id_table = mt6397_id,
|
.id_table = mt6397_id,
|
||||||
};
|
};
|
||||||
|
@ -9,6 +9,7 @@
|
|||||||
#include <linux/of_irq.h>
|
#include <linux/of_irq.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/regmap.h>
|
#include <linux/regmap.h>
|
||||||
|
#include <linux/suspend.h>
|
||||||
#include <linux/mfd/mt6323/core.h>
|
#include <linux/mfd/mt6323/core.h>
|
||||||
#include <linux/mfd/mt6323/registers.h>
|
#include <linux/mfd/mt6323/registers.h>
|
||||||
#include <linux/mfd/mt6397/core.h>
|
#include <linux/mfd/mt6397/core.h>
|
||||||
@ -81,7 +82,7 @@ static struct irq_chip mt6397_irq_chip = {
|
|||||||
static void mt6397_irq_handle_reg(struct mt6397_chip *mt6397, int reg,
|
static void mt6397_irq_handle_reg(struct mt6397_chip *mt6397, int reg,
|
||||||
int irqbase)
|
int irqbase)
|
||||||
{
|
{
|
||||||
unsigned int status;
|
unsigned int status = 0;
|
||||||
int i, irq, ret;
|
int i, irq, ret;
|
||||||
|
|
||||||
ret = regmap_read(mt6397->regmap, reg, &status);
|
ret = regmap_read(mt6397->regmap, reg, &status);
|
||||||
@ -128,6 +129,36 @@ static const struct irq_domain_ops mt6397_irq_domain_ops = {
|
|||||||
.map = mt6397_irq_domain_map,
|
.map = mt6397_irq_domain_map,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static int mt6397_irq_pm_notifier(struct notifier_block *notifier,
|
||||||
|
unsigned long pm_event, void *unused)
|
||||||
|
{
|
||||||
|
struct mt6397_chip *chip =
|
||||||
|
container_of(notifier, struct mt6397_chip, pm_nb);
|
||||||
|
|
||||||
|
switch (pm_event) {
|
||||||
|
case PM_SUSPEND_PREPARE:
|
||||||
|
regmap_write(chip->regmap,
|
||||||
|
chip->int_con[0], chip->wake_mask[0]);
|
||||||
|
regmap_write(chip->regmap,
|
||||||
|
chip->int_con[1], chip->wake_mask[1]);
|
||||||
|
enable_irq_wake(chip->irq);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PM_POST_SUSPEND:
|
||||||
|
regmap_write(chip->regmap,
|
||||||
|
chip->int_con[0], chip->irq_masks_cur[0]);
|
||||||
|
regmap_write(chip->regmap,
|
||||||
|
chip->int_con[1], chip->irq_masks_cur[1]);
|
||||||
|
disable_irq_wake(chip->irq);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NOTIFY_DONE;
|
||||||
|
}
|
||||||
|
|
||||||
int mt6397_irq_init(struct mt6397_chip *chip)
|
int mt6397_irq_init(struct mt6397_chip *chip)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
@ -159,6 +190,7 @@ int mt6397_irq_init(struct mt6397_chip *chip)
|
|||||||
regmap_write(chip->regmap, chip->int_con[0], 0x0);
|
regmap_write(chip->regmap, chip->int_con[0], 0x0);
|
||||||
regmap_write(chip->regmap, chip->int_con[1], 0x0);
|
regmap_write(chip->regmap, chip->int_con[1], 0x0);
|
||||||
|
|
||||||
|
chip->pm_nb.notifier_call = mt6397_irq_pm_notifier;
|
||||||
chip->irq_domain = irq_domain_add_linear(chip->dev->of_node,
|
chip->irq_domain = irq_domain_add_linear(chip->dev->of_node,
|
||||||
MT6397_IRQ_NR,
|
MT6397_IRQ_NR,
|
||||||
&mt6397_irq_domain_ops,
|
&mt6397_irq_domain_ops,
|
||||||
@ -177,5 +209,6 @@ int mt6397_irq_init(struct mt6397_chip *chip)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
register_pm_notifier(&chip->pm_nb);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
#define __MFD_MT6397_CORE_H__
|
#define __MFD_MT6397_CORE_H__
|
||||||
|
|
||||||
#include <linux/mutex.h>
|
#include <linux/mutex.h>
|
||||||
|
#include <linux/notifier.h>
|
||||||
|
|
||||||
enum chip_id {
|
enum chip_id {
|
||||||
MT6323_CHIP_ID = 0x23,
|
MT6323_CHIP_ID = 0x23,
|
||||||
@ -54,6 +55,7 @@ enum mt6397_irq_numbers {
|
|||||||
struct mt6397_chip {
|
struct mt6397_chip {
|
||||||
struct device *dev;
|
struct device *dev;
|
||||||
struct regmap *regmap;
|
struct regmap *regmap;
|
||||||
|
struct notifier_block pm_nb;
|
||||||
int irq;
|
int irq;
|
||||||
struct irq_domain *irq_domain;
|
struct irq_domain *irq_domain;
|
||||||
struct mutex irqlock;
|
struct mutex irqlock;
|
||||||
|
Loading…
Reference in New Issue
Block a user