struct clk_hw_onecell_data *hw_data;
        spinlock_t lock;
        void __iomem *reg;
+
+       /* Storage registers for suspend/resume operations */
+       u32 tbg_sel;
+       u32 div_sel0;
+       u32 div_sel1;
+       u32 div_sel2;
+       u32 clk_sel;
+       u32 clk_dis;
 };
 
 struct clk_double_div {
        return PTR_ERR_OR_ZERO(*hw);
 }
 
+static int __maybe_unused armada_3700_periph_clock_suspend(struct device *dev)
+{
+       struct clk_periph_driver_data *data = dev_get_drvdata(dev);
+
+       data->tbg_sel = readl(data->reg + TBG_SEL);
+       data->div_sel0 = readl(data->reg + DIV_SEL0);
+       data->div_sel1 = readl(data->reg + DIV_SEL1);
+       data->div_sel2 = readl(data->reg + DIV_SEL2);
+       data->clk_sel = readl(data->reg + CLK_SEL);
+       data->clk_dis = readl(data->reg + CLK_DIS);
+
+       return 0;
+}
+
+static int __maybe_unused armada_3700_periph_clock_resume(struct device *dev)
+{
+       struct clk_periph_driver_data *data = dev_get_drvdata(dev);
+
+       /* Follow the same order than what the Cortex-M3 does (ATF code) */
+       writel(data->clk_dis, data->reg + CLK_DIS);
+       writel(data->div_sel0, data->reg + DIV_SEL0);
+       writel(data->div_sel1, data->reg + DIV_SEL1);
+       writel(data->div_sel2, data->reg + DIV_SEL2);
+       writel(data->tbg_sel, data->reg + TBG_SEL);
+       writel(data->clk_sel, data->reg + CLK_SEL);
+
+       return 0;
+}
+
+static const struct dev_pm_ops armada_3700_periph_clock_pm_ops = {
+       SET_SYSTEM_SLEEP_PM_OPS(armada_3700_periph_clock_suspend,
+                               armada_3700_periph_clock_resume)
+};
+
 static int armada_3700_periph_clock_probe(struct platform_device *pdev)
 {
        struct clk_periph_driver_data *driver_data;
        .driver         = {
                .name   = "marvell-armada-3700-periph-clock",
                .of_match_table = armada_3700_periph_clock_of_match,
+               .pm     = &armada_3700_periph_clock_pm_ops,
        },
 };