// SPDX-License-Identifier: GPL-2.0
/* Author: Dan Scally <djrscally@gmail.com> */

#include <linux/acpi.h>
#include <linux/clkdev.h>
#include <linux/clk-provider.h>
#include <linux/device.h>
#include <linux/gpio/consumer.h>
#include <linux/gpio/machine.h>
#include <linux/i2c.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/overflow.h>
#include <linux/platform_device.h>
#include <linux/uuid.h>

#include "intel_skl_int3472_common.h"

/*
 * 79234640-9e10-4fea-a5c1-b5aa8b19756f
 * This _DSM GUID returns information about the GPIO lines mapped to a
 * discrete INT3472 device. Function number 1 returns a count of the GPIO
 * lines that are mapped. Subsequent functions return 32 bit ints encoding
 * information about the GPIO line, including its purpose.
 */
static const guid_t int3472_gpio_guid =
	GUID_INIT(0x79234640, 0x9e10, 0x4fea,
		  0xa5, 0xc1, 0xb5, 0xaa, 0x8b, 0x19, 0x75, 0x6f);

/*
 * 822ace8f-2814-4174-a56b-5f029fe079ee
 * This _DSM GUID returns a string from the sensor device, which acts as a
 * module identifier.
 */
static const guid_t cio2_sensor_module_guid =
	GUID_INIT(0x822ace8f, 0x2814, 0x4174,
		  0xa5, 0x6b, 0x5f, 0x02, 0x9f, 0xe0, 0x79, 0xee);

/*
 * Here follows platform specific mapping information that we can pass to
 * the functions mapping resources to the sensors. Where the sensors have
 * a power enable pin defined in DSDT we need to provide a supply name so
 * the sensor drivers can find the regulator. The device name will be derived
 * from the sensor's ACPI device within the code. Optionally, we can provide a
 * NULL terminated array of function name mappings to deal with any platform
 * specific deviations from the documented behaviour of GPIOs.
 *
 * Map a GPIO function name to NULL to prevent the driver from mapping that
 * GPIO at all.
 */

static const struct int3472_gpio_function_remap ov2680_gpio_function_remaps[] = {
	{ "reset", NULL },
	{ "powerdown", "reset" },
	{ }
};

static const struct int3472_sensor_config int3472_sensor_configs[] = {
	/* Lenovo Miix 510-12ISK - OV2680, Front */
	{ "GNDF140809R", { 0 }, ov2680_gpio_function_remaps },
	/* Lenovo Miix 510-12ISK - OV5648, Rear */
	{ "GEFF150023R", REGULATOR_SUPPLY("avdd", NULL), NULL },
	/* Surface Go 1&2 - OV5693, Front */
	{ "YHCU", REGULATOR_SUPPLY("avdd", NULL), NULL },
};

static const struct int3472_sensor_config *
skl_int3472_get_sensor_module_config(struct int3472_discrete_device *int3472)
{
	union acpi_object *obj;
	unsigned int i;

	obj = acpi_evaluate_dsm_typed(int3472->sensor->handle,
				      &cio2_sensor_module_guid, 0x00,
				      0x01, NULL, ACPI_TYPE_STRING);

	if (!obj) {
		dev_err(int3472->dev,
			"Failed to get sensor module string from _DSM\n");
		return ERR_PTR(-ENODEV);
	}

	if (obj->string.type != ACPI_TYPE_STRING) {
		dev_err(int3472->dev,
			"Sensor _DSM returned a non-string value\n");

		ACPI_FREE(obj);
		return ERR_PTR(-EINVAL);
	}

	for (i = 0; i < ARRAY_SIZE(int3472_sensor_configs); i++) {
		if (!strcmp(int3472_sensor_configs[i].sensor_module_name,
			    obj->string.pointer))
			break;
	}

	ACPI_FREE(obj);

	if (i >= ARRAY_SIZE(int3472_sensor_configs))
		return ERR_PTR(-EINVAL);

	return &int3472_sensor_configs[i];
}

static int skl_int3472_map_gpio_to_sensor(struct int3472_discrete_device *int3472,
					  struct acpi_resource *ares,
					  const char *func, u32 polarity)
{
	char *path = ares->data.gpio.resource_source.string_ptr;
	const struct int3472_sensor_config *sensor_config;
	struct gpiod_lookup *table_entry;
	struct acpi_device *adev;
	acpi_handle handle;
	acpi_status status;
	int ret;

	if (int3472->n_sensor_gpios >= INT3472_MAX_SENSOR_GPIOS) {
		dev_warn(int3472->dev, "Too many GPIOs mapped\n");
		return -EINVAL;
	}

	sensor_config = int3472->sensor_config;
	if (!IS_ERR(sensor_config) && sensor_config->function_maps) {
		const struct int3472_gpio_function_remap *remap;

		for (remap = sensor_config->function_maps; remap->documented; remap++) {
			if (!strcmp(func, remap->documented)) {
				func = remap->actual;
				break;
			}
		}
	}

	/* Functions mapped to NULL should not be mapped to the sensor */
	if (!func)
		return 0;

	status = acpi_get_handle(NULL, path, &handle);
	if (ACPI_FAILURE(status))
		return -EINVAL;

	ret = acpi_bus_get_device(handle, &adev);
	if (ret)
		return -ENODEV;

	table_entry = &int3472->gpios.table[int3472->n_sensor_gpios];
	table_entry->key = acpi_dev_name(adev);
	table_entry->chip_hwnum = ares->data.gpio.pin_table[0];
	table_entry->con_id = func;
	table_entry->idx = 0;
	table_entry->flags = polarity;

	int3472->n_sensor_gpios++;

	return 0;
}

static int skl_int3472_map_gpio_to_clk(struct int3472_discrete_device *int3472,
				       struct acpi_resource *ares, u8 type)
{
	char *path = ares->data.gpio.resource_source.string_ptr;
	struct gpio_desc *gpio;

	switch (type) {
	case INT3472_GPIO_TYPE_CLK_ENABLE:
		gpio = acpi_get_and_request_gpiod(path, ares->data.gpio.pin_table[0],
						  "int3472,clk-enable");
		if (IS_ERR(gpio))
			return (PTR_ERR(gpio));

		int3472->clock.ena_gpio = gpio;
		break;
	case INT3472_GPIO_TYPE_PRIVACY_LED:
		gpio = acpi_get_and_request_gpiod(path, ares->data.gpio.pin_table[0],
						  "int3472,privacy-led");
		if (IS_ERR(gpio))
			return (PTR_ERR(gpio));

		int3472->clock.led_gpio = gpio;
		break;
	default:
		dev_err(int3472->dev, "Invalid GPIO type 0x%02x for clock\n", type);
		break;
	}

	return 0;
}

/**
 * skl_int3472_handle_gpio_resources: Map PMIC resources to consuming sensor
 * @ares: A pointer to a &struct acpi_resource
 * @data: A pointer to a &struct int3472_discrete_device
 *
 * This function handles GPIO resources that are against an INT3472
 * ACPI device, by checking the value of the corresponding _DSM entry.
 * This will return a 32bit int, where the lowest byte represents the
 * function of the GPIO pin:
 *
 * 0x00 Reset
 * 0x01 Power down
 * 0x0b Power enable
 * 0x0c Clock enable
 * 0x0d Privacy LED
 *
 * There are some known platform specific quirks where that does not quite
 * hold up; for example where a pin with type 0x01 (Power down) is mapped to
 * a sensor pin that performs a reset function or entries in _CRS and _DSM that
 * do not actually correspond to a physical connection. These will be handled
 * by the mapping sub-functions.
 *
 * GPIOs will either be mapped directly to the sensor device or else used
 * to create clocks and regulators via the usual frameworks.
 *
 * Return:
 * * 1		- To continue the loop
 * * 0		- When all resources found are handled properly.
 * * -EINVAL	- If the resource is not a GPIO IO resource
 * * -ENODEV	- If the resource has no corresponding _DSM entry
 * * -Other	- Errors propagated from one of the sub-functions.
 */
static int skl_int3472_handle_gpio_resources(struct acpi_resource *ares,
					     void *data)
{
	struct int3472_discrete_device *int3472 = data;
	struct acpi_resource_gpio *agpio;
	union acpi_object *obj;
	const char *err_msg;
	int ret;
	u8 type;

	if (!acpi_gpio_get_io_resource(ares, &agpio))
		return 1;

	/*
	 * ngpios + 2 because the index of this _DSM function is 1-based and
	 * the first function is just a count.
	 */
	obj = acpi_evaluate_dsm_typed(int3472->adev->handle,
				      &int3472_gpio_guid, 0x00,
				      int3472->ngpios + 2,
				      NULL, ACPI_TYPE_INTEGER);

	if (!obj) {
		dev_warn(int3472->dev, "No _DSM entry for GPIO pin %u\n",
			 ares->data.gpio.pin_table[0]);
		return 1;
	}

	type = obj->integer.value & 0xff;

	switch (type) {
	case INT3472_GPIO_TYPE_RESET:
		ret = skl_int3472_map_gpio_to_sensor(int3472, ares, "reset",
						     GPIO_ACTIVE_LOW);
		if (ret)
			err_msg = "Failed to map reset pin to sensor\n";

		break;
	case INT3472_GPIO_TYPE_POWERDOWN:
		ret = skl_int3472_map_gpio_to_sensor(int3472, ares,
						     "powerdown",
						     GPIO_ACTIVE_LOW);
		if (ret)
			err_msg = "Failed to map powerdown pin to sensor\n";

		break;
	case INT3472_GPIO_TYPE_CLK_ENABLE:
	case INT3472_GPIO_TYPE_PRIVACY_LED:
		ret = skl_int3472_map_gpio_to_clk(int3472, ares, type);
		if (ret)
			err_msg = "Failed to map GPIO to clock\n";

		break;
	case INT3472_GPIO_TYPE_POWER_ENABLE:
		ret = skl_int3472_register_regulator(int3472, ares);
		if (ret)
			err_msg = "Failed to map regulator to sensor\n";

		break;
	default:
		dev_warn(int3472->dev,
			 "GPIO type 0x%02x unknown; the sensor may not work\n",
			 type);
		ret = 1;
		break;
	}

	int3472->ngpios++;
	ACPI_FREE(obj);

	if (ret)
		return dev_err_probe(int3472->dev, ret, err_msg);

	return 0;
}

static int skl_int3472_parse_crs(struct int3472_discrete_device *int3472)
{
	LIST_HEAD(resource_list);
	int ret;

	/*
	 * No error check, because not having a sensor config is not necessarily
	 * a failure mode.
	 */
	int3472->sensor_config = skl_int3472_get_sensor_module_config(int3472);

	ret = acpi_dev_get_resources(int3472->adev, &resource_list,
				     skl_int3472_handle_gpio_resources,
				     int3472);
	if (ret)
		goto out_free_res_list;

	/*
	 * If we find no clock enable GPIO pin then the privacy LED won't work.
	 * We've never seen that situation, but it's possible. Warn the user so
	 * it's clear what's happened.
	 */
	if (int3472->clock.ena_gpio) {
		ret = skl_int3472_register_clock(int3472);
		if (ret)
			goto out_free_res_list;
	} else {
		if (int3472->clock.led_gpio)
			dev_warn(int3472->dev,
				 "No clk GPIO. The privacy LED won't work\n");
	}

	int3472->gpios.dev_id = int3472->sensor_name;
	gpiod_add_lookup_table(&int3472->gpios);

out_free_res_list:
	acpi_dev_free_resource_list(&resource_list);

	return ret;
}

int skl_int3472_discrete_probe(struct platform_device *pdev)
{
	struct acpi_device *adev = ACPI_COMPANION(&pdev->dev);
	struct int3472_discrete_device *int3472;
	struct int3472_cldb cldb;
	int ret;

	ret = skl_int3472_fill_cldb(adev, &cldb);
	if (ret) {
		dev_err(&pdev->dev, "Couldn't fill CLDB structure\n");
		return ret;
	}

	if (cldb.control_logic_type != 1) {
		dev_err(&pdev->dev, "Unsupported control logic type %u\n",
			cldb.control_logic_type);
		return -EINVAL;
	}

	/* Max num GPIOs we've seen plus a terminator */
	int3472 = devm_kzalloc(&pdev->dev, struct_size(int3472, gpios.table,
			       INT3472_MAX_SENSOR_GPIOS + 1), GFP_KERNEL);
	if (!int3472)
		return -ENOMEM;

	int3472->adev = adev;
	int3472->dev = &pdev->dev;
	platform_set_drvdata(pdev, int3472);

	int3472->sensor = acpi_dev_get_first_consumer_dev(adev);
	if (!int3472->sensor) {
		dev_err(&pdev->dev, "INT3472 seems to have no dependents.\n");
		return -ENODEV;
	}

	int3472->sensor_name = devm_kasprintf(int3472->dev, GFP_KERNEL,
					      I2C_DEV_NAME_FORMAT,
					      acpi_dev_name(int3472->sensor));
	if (!int3472->sensor_name) {
		ret = -ENOMEM;
		goto err_put_sensor;
	}

	/*
	 * Initialising this list means we can call gpiod_remove_lookup_table()
	 * in failure paths without issue.
	 */
	INIT_LIST_HEAD(&int3472->gpios.list);

	ret = skl_int3472_parse_crs(int3472);
	if (ret) {
		skl_int3472_discrete_remove(pdev);
		return ret;
	}

	return 0;

err_put_sensor:
	acpi_dev_put(int3472->sensor);

	return ret;
}

int skl_int3472_discrete_remove(struct platform_device *pdev)
{
	struct int3472_discrete_device *int3472 = platform_get_drvdata(pdev);

	gpiod_remove_lookup_table(&int3472->gpios);
	regulator_unregister(int3472->regulator.rdev);
	clk_unregister(int3472->clock.clk);

	if (int3472->clock.cl)
		clkdev_drop(int3472->clock.cl);

	gpiod_put(int3472->regulator.gpio);
	gpiod_put(int3472->clock.ena_gpio);
	gpiod_put(int3472->clock.led_gpio);

	return 0;
}
