/*
 * clk-max77802.c - Clock driver for Maxim 77802
 *
 * Copyright (C) 2014 Google, Inc
 *
 * Copyright (C) 2012 Samsung Electornics
 * Jonghwa Lee <jonghwa3.lee@samsung.com>
 *
 * This program is free software; you can redistribute  it and/or modify it
 * under  the terms of  the GNU General  Public License as published by the
 * Free Software Foundation;  either version 2 of the  License, or (at your
 * option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * This driver is based on clk-max77686.c
 */

#include <linux/kernel.h>
#include <linux/slab.h>
#include <linux/err.h>
#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/mfd/max77686-private.h>
#include <linux/clk-provider.h>
#include <linux/mutex.h>
#include <linux/clkdev.h>

#include <dt-bindings/clock/maxim,max77802.h>
#include "clk-max-gen.h"

#define MAX77802_CLOCK_OPMODE_MASK	0x1
#define MAX77802_CLOCK_LOW_JITTER_SHIFT 0x3

static struct clk_init_data max77802_clks_init[MAX77802_CLKS_NUM] = {
	[MAX77802_CLK_32K_AP] = {
		.name = "32khz_ap",
		.ops = &max_gen_clk_ops,
		.flags = CLK_IS_ROOT,
	},
	[MAX77802_CLK_32K_CP] = {
		.name = "32khz_cp",
		.ops = &max_gen_clk_ops,
		.flags = CLK_IS_ROOT,
	},
};

static int max77802_clk_probe(struct platform_device *pdev)
{
	struct max77686_dev *iodev = dev_get_drvdata(pdev->dev.parent);
	int ret;

	ret = max_gen_clk_probe(pdev, iodev->regmap, MAX77802_REG_32KHZ,
				max77802_clks_init, MAX77802_CLKS_NUM);

	if (ret) {
		dev_err(&pdev->dev, "generic probe failed %d\n", ret);
		return ret;
	}

	/* Enable low-jitter mode on the 32khz clocks. */
	ret = regmap_update_bits(iodev->regmap, MAX77802_REG_32KHZ,
				 1 << MAX77802_CLOCK_LOW_JITTER_SHIFT,
				 1 << MAX77802_CLOCK_LOW_JITTER_SHIFT);
	if (ret < 0)
		dev_err(&pdev->dev, "failed to enable low-jitter mode\n");

	return ret;
}

static int max77802_clk_remove(struct platform_device *pdev)
{
	return max_gen_clk_remove(pdev, MAX77802_CLKS_NUM);
}

static const struct platform_device_id max77802_clk_id[] = {
	{ "max77802-clk", 0},
	{ },
};
MODULE_DEVICE_TABLE(platform, max77802_clk_id);

static struct platform_driver max77802_clk_driver = {
	.driver = {
		.name  = "max77802-clk",
	},
	.probe = max77802_clk_probe,
	.remove = max77802_clk_remove,
	.id_table = max77802_clk_id,
};

module_platform_driver(max77802_clk_driver);

MODULE_DESCRIPTION("MAXIM 77802 Clock Driver");
MODULE_AUTHOR("Javier Martinez Canillas <javier.martinez@collabora.co.uk>");
MODULE_LICENSE("GPL");
