162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Intel Cherry Trail Crystal Cove PMIC operation region driver
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (C) 2019 Hans de Goede <hdegoede@redhat.com>
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#include <linux/acpi.h>
962306a36Sopenharmony_ci#include <linux/init.h>
1062306a36Sopenharmony_ci#include <linux/mfd/intel_soc_pmic.h>
1162306a36Sopenharmony_ci#include <linux/platform_device.h>
1262306a36Sopenharmony_ci#include <linux/regmap.h>
1362306a36Sopenharmony_ci#include "intel_pmic.h"
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci/*
1662306a36Sopenharmony_ci * We have no docs for the CHT Crystal Cove PMIC. The Asus Zenfone-2 kernel
1762306a36Sopenharmony_ci * code has 2 Crystal Cove regulator drivers, one calls the PMIC a "Crystal
1862306a36Sopenharmony_ci * Cove Plus" PMIC and talks about Cherry Trail, so presumably that one
1962306a36Sopenharmony_ci * could be used to get register info for the regulators if we need to
2062306a36Sopenharmony_ci * implement regulator support in the future.
2162306a36Sopenharmony_ci *
2262306a36Sopenharmony_ci * For now the sole purpose of this driver is to make
2362306a36Sopenharmony_ci * intel_soc_pmic_exec_mipi_pmic_seq_element work on devices with a
2462306a36Sopenharmony_ci * CHT Crystal Cove PMIC.
2562306a36Sopenharmony_ci */
2662306a36Sopenharmony_cistatic const struct intel_pmic_opregion_data intel_chtcrc_pmic_opregion_data = {
2762306a36Sopenharmony_ci	.lpat_raw_to_temp = acpi_lpat_raw_to_temp,
2862306a36Sopenharmony_ci	.pmic_i2c_address = 0x6e,
2962306a36Sopenharmony_ci};
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_cistatic int intel_chtcrc_pmic_opregion_probe(struct platform_device *pdev)
3262306a36Sopenharmony_ci{
3362306a36Sopenharmony_ci	struct intel_soc_pmic *pmic = dev_get_drvdata(pdev->dev.parent);
3462306a36Sopenharmony_ci	return intel_pmic_install_opregion_handler(&pdev->dev,
3562306a36Sopenharmony_ci			ACPI_HANDLE(pdev->dev.parent), pmic->regmap,
3662306a36Sopenharmony_ci			&intel_chtcrc_pmic_opregion_data);
3762306a36Sopenharmony_ci}
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_cistatic struct platform_driver intel_chtcrc_pmic_opregion_driver = {
4062306a36Sopenharmony_ci	.probe = intel_chtcrc_pmic_opregion_probe,
4162306a36Sopenharmony_ci	.driver = {
4262306a36Sopenharmony_ci		.name = "cht_crystal_cove_pmic",
4362306a36Sopenharmony_ci	},
4462306a36Sopenharmony_ci};
4562306a36Sopenharmony_cibuiltin_platform_driver(intel_chtcrc_pmic_opregion_driver);
46