@@ -15,12 +15,20 @@
#define ONENAND_SYNC_READ (1 << 0)
#define ONENAND_SYNC_READWRITE (1 << 1)
+enum {
+ ONENAND_PM_CONSTRAINT_OFF,
+ ONENAND_PM_CONSTRAINT_ERASING,
+ ONENAND_PM_CONSTRAINT_OTHER,
+};
+
struct omap_onenand_platform_data {
int cs;
int gpio_irq;
struct mtd_partition *parts;
int nr_parts;
int (*onenand_setup)(void __iomem *, int freq);
+ void (*set_pm_constraints)(struct device *dev,
+ int on);
int dma_channel;
u8 flags;
u8 regulator_can_sleep;
@@ -64,6 +64,7 @@ struct omap2_onenand {
int dma_channel;
int freq;
int (*setup)(void __iomem *base, int freq);
+ void (*set_pm_constraints)(struct device *dev, int on);
struct regulator *regulator;
};
@@ -605,13 +606,21 @@ static void omap2_onenand_shutdown(struct platform_device *pdev)
static int omap2_onenand_enable(struct mtd_info *mtd)
{
- int ret;
+ int ret, on;
struct omap2_onenand *c = container_of(mtd, struct omap2_onenand, mtd);
ret = regulator_enable(c->regulator);
if (ret != 0)
dev_err(&c->pdev->dev, "cant enable regulator\n");
+ if (c->set_pm_constraints) {
+ if (c->onenand.state == FL_ERASING)
+ on = ONENAND_PM_CONSTRAINT_ERASING;
+ else
+ on = ONENAND_PM_CONSTRAINT_OTHER;
+ c->set_pm_constraints(&c->pdev->dev, on);
+ }
+
return ret;
}
@@ -620,6 +629,9 @@ static int omap2_onenand_disable(struct mtd_info *mtd)
int ret;
struct omap2_onenand *c = container_of(mtd, struct omap2_onenand, mtd);
+ if (c->set_pm_constraints)
+ c->set_pm_constraints(&c->pdev->dev, ONENAND_PM_CONSTRAINT_OFF);
+
ret = regulator_disable(c->regulator);
if (ret != 0)
dev_err(&c->pdev->dev, "cant disable regulator\n");
@@ -682,6 +694,8 @@ static int __devinit omap2_onenand_probe(struct platform_device *pdev)
c->setup = pdata->onenand_setup;
}
+ c->set_pm_constraints = pdata->set_pm_constraints;
+
if (c->gpio_irq) {
if ((r = gpio_request(c->gpio_irq, "OneNAND irq")) < 0) {
dev_err(&pdev->dev, "Failed to request GPIO%d for "