/*
 * Core driver for the pin muxing portions of the pin control subsystem
 *
 * Copyright (C) 2011 ST-Ericsson SA
 * Written on behalf of Linaro for ST-Ericsson
 * Based on bits of regulator core, gpio core and clk core
 *
 * Author: Linus Walleij <linus.walleij@linaro.org>
 *
 * License terms: GNU General Public License (GPL) version 2
 */
#define pr_fmt(fmt) "pinmux core: " fmt

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/device.h>
#include <linux/slab.h>
#include <linux/radix-tree.h>
#include <linux/err.h>
#include <linux/list.h>
#include <linux/mutex.h>
#include <linux/spinlock.h>
#include <linux/string.h>
#include <linux/sysfs.h>
#include <linux/debugfs.h>
#include <linux/seq_file.h>
#include <linux/pinctrl/machine.h>
#include <linux/pinctrl/pinmux.h>
#include "core.h"

/* List of pinmuxes */
static DEFINE_MUTEX(pinmux_list_mutex);
static LIST_HEAD(pinmux_list);

/* Global pinmux maps */
static struct pinmux_map *pinmux_maps;
static unsigned pinmux_maps_num;

/**
 * struct pinmux_group - group list item for pinmux groups
 * @node: pinmux group list node
 * @group_selector: the group selector for this group
 */
struct pinmux_group {
	struct list_head node;
	unsigned group_selector;
};

/**
 * struct pinmux - per-device pinmux state holder
 * @node: global list node
 * @dev: the device using this pinmux
 * @usecount: the number of active users of this mux setting, used to keep
 *	track of nested use cases
 * @pctldev: pin control device handling this pinmux
 * @func_selector: the function selector for the pinmux device handling
 *	this pinmux
 * @groups: the group selectors for the pinmux device and
 *	selector combination handling this pinmux, this is a list that
 *	will be traversed on all pinmux operations such as
 *	get/put/enable/disable
 * @mutex: a lock for the pinmux state holder
 */
struct pinmux {
	struct list_head node;
	struct device *dev;
	unsigned usecount;
	struct pinctrl_dev *pctldev;
	unsigned func_selector;
	struct list_head groups;
	struct mutex mutex;
};

/**
 * struct pinmux_hog - a list item to stash mux hogs
 * @node: pinmux hog list node
 * @map: map entry responsible for this hogging
 * @pmx: the pinmux hogged by this item
 */
struct pinmux_hog {
	struct list_head node;
	struct pinmux_map const *map;
	struct pinmux *pmx;
};

/**
 * pin_request() - request a single pin to be muxed in, typically for GPIO
 * @pin: the pin number in the global pin space
 * @function: a functional name to give to this pin, passed to the driver
 *	so it knows what function to mux in, e.g. the string "gpioNN"
 *	means that you want to mux in the pin for use as GPIO number NN
 * @gpio_range: the range matching the GPIO pin if this is a request for a
 *	single GPIO pin
 */
static int pin_request(struct pinctrl_dev *pctldev,
		       int pin, const char *function,
		       struct pinctrl_gpio_range *gpio_range)
{
	struct pin_desc *desc;
	const struct pinmux_ops *ops = pctldev->desc->pmxops;
	int status = -EINVAL;

	dev_dbg(pctldev->dev, "request pin %d for %s\n", pin, function);

	desc = pin_desc_get(pctldev, pin);
	if (desc == NULL) {
		dev_err(pctldev->dev,
			"pin is not registered so it cannot be requested\n");
		goto out;
	}

	if (!function) {
		dev_err(pctldev->dev, "no function name given\n");
		return -EINVAL;
	}

	spin_lock(&desc->lock);
	if (desc->mux_function) {
		spin_unlock(&desc->lock);
		dev_err(pctldev->dev,
			"pin already requested\n");
		goto out;
	}
	desc->mux_function = function;
	spin_unlock(&desc->lock);

	/* Let each pin increase references to this module */
	if (!try_module_get(pctldev->owner)) {
		dev_err(pctldev->dev,
			"could not increase module refcount for pin %d\n",
			pin);
		status = -EINVAL;
		goto out_free_pin;
	}

	/*
	 * If there is no kind of request function for the pin we just assume
	 * we got it by default and proceed.
	 */
	if (gpio_range && ops->gpio_request_enable)
		/* This requests and enables a single GPIO pin */
		status = ops->gpio_request_enable(pctldev, gpio_range, pin);
	else if (ops->request)
		status = ops->request(pctldev, pin);
	else
		status = 0;

	if (status)
		dev_err(pctldev->dev, "->request on device %s failed for pin %d\n",
		       pctldev->desc->name, pin);
out_free_pin:
	if (status) {
		spin_lock(&desc->lock);
		desc->mux_function = NULL;
		spin_unlock(&desc->lock);
	}
out:
	if (status)
		dev_err(pctldev->dev, "pin-%d (%s) status %d\n",
		       pin, function ? : "?", status);

	return status;
}

/**
 * pin_free() - release a single muxed in pin so something else can be muxed
 * @pctldev: pin controller device handling this pin
 * @pin: the pin to free
 * @gpio_range: the range matching the GPIO pin if this is a request for a
 *	single GPIO pin
 *
 * This function returns a pointer to the function name in use. This is used
 * for callers that dynamically allocate a function name so it can be freed
 * once the pin is free. This is done for GPIO request functions.
 */
static const char *pin_free(struct pinctrl_dev *pctldev, int pin,
			    struct pinctrl_gpio_range *gpio_range)
{
	const struct pinmux_ops *ops = pctldev->desc->pmxops;
	struct pin_desc *desc;
	const char *func;

	desc = pin_desc_get(pctldev, pin);
	if (desc == NULL) {
		dev_err(pctldev->dev,
			"pin is not registered so it cannot be freed\n");
		return NULL;
	}

	/*
	 * If there is no kind of request function for the pin we just assume
	 * we got it by default and proceed.
	 */
	if (gpio_range && ops->gpio_disable_free)
		ops->gpio_disable_free(pctldev, gpio_range, pin);
	else if (ops->free)
		ops->free(pctldev, pin);

	spin_lock(&desc->lock);
	func = desc->mux_function;
	desc->mux_function = NULL;
	spin_unlock(&desc->lock);
	module_put(pctldev->owner);

	return func;
}

/**
 * pinmux_request_gpio() - request a single pin to be muxed in as GPIO
 * @gpio: the GPIO pin number from the GPIO subsystem number space
 *
 * This function should *ONLY* be used from gpiolib-based GPIO drivers,
 * as part of their gpio_request() semantics, platforms and individual drivers
 * shall *NOT* request GPIO pins to be muxed in.
 */
int pinmux_request_gpio(unsigned gpio)
{
	char gpiostr[16];
	const char *function;
	struct pinctrl_dev *pctldev;
	struct pinctrl_gpio_range *range;
	int ret;
	int pin;

	ret = pinctrl_get_device_gpio_range(gpio, &pctldev, &range);
	if (ret)
		return -EINVAL;

	/* Convert to the pin controllers number space */
	pin = gpio - range->base + range->pin_base;

	/* Conjure some name stating what chip and pin this is taken by */
	snprintf(gpiostr, 15, "%s:%d", range->name, gpio);

	function = kstrdup(gpiostr, GFP_KERNEL);
	if (!function)
		return -EINVAL;

	ret = pin_request(pctldev, pin, function, range);
	if (ret < 0)
		kfree(function);

	return ret;
}
EXPORT_SYMBOL_GPL(pinmux_request_gpio);

/**
 * pinmux_free_gpio() - free a single pin, currently used as GPIO
 * @gpio: the GPIO pin number from the GPIO subsystem number space
 *
 * This function should *ONLY* be used from gpiolib-based GPIO drivers,
 * as part of their gpio_free() semantics, platforms and individual drivers
 * shall *NOT* request GPIO pins to be muxed out.
 */
void pinmux_free_gpio(unsigned gpio)
{
	struct pinctrl_dev *pctldev;
	struct pinctrl_gpio_range *range;
	int ret;
	int pin;
	const char *func;

	ret = pinctrl_get_device_gpio_range(gpio, &pctldev, &range);
	if (ret)
		return;

	/* Convert to the pin controllers number space */
	pin = gpio - range->base + range->pin_base;

	func = pin_free(pctldev, pin, range);
	kfree(func);
}
EXPORT_SYMBOL_GPL(pinmux_free_gpio);

static int pinmux_gpio_direction(unsigned gpio, bool input)
{
	struct pinctrl_dev *pctldev;
	struct pinctrl_gpio_range *range;
	const struct pinmux_ops *ops;
	int ret;
	int pin;

	ret = pinctrl_get_device_gpio_range(gpio, &pctldev, &range);
	if (ret)
		return ret;

	ops = pctldev->desc->pmxops;

	/* Convert to the pin controllers number space */
	pin = gpio - range->base + range->pin_base;

	if (ops->gpio_set_direction)
		ret = ops->gpio_set_direction(pctldev, range, pin, input);
	else
		ret = 0;

	return ret;
}

/**
 * pinmux_gpio_direction_input() - request a GPIO pin to go into input mode
 * @gpio: the GPIO pin number from the GPIO subsystem number space
 *
 * This function should *ONLY* be used from gpiolib-based GPIO drivers,
 * as part of their gpio_direction_input() semantics, platforms and individual
 * drivers shall *NOT* touch pinmux GPIO calls.
 */
int pinmux_gpio_direction_input(unsigned gpio)
{
	return pinmux_gpio_direction(gpio, true);
}
EXPORT_SYMBOL_GPL(pinmux_gpio_direction_input);

/**
 * pinmux_gpio_direction_output() - request a GPIO pin to go into output mode
 * @gpio: the GPIO pin number from the GPIO subsystem number space
 *
 * This function should *ONLY* be used from gpiolib-based GPIO drivers,
 * as part of their gpio_direction_output() semantics, platforms and individual
 * drivers shall *NOT* touch pinmux GPIO calls.
 */
int pinmux_gpio_direction_output(unsigned gpio)
{
	return pinmux_gpio_direction(gpio, false);
}
EXPORT_SYMBOL_GPL(pinmux_gpio_direction_output);

/**
 * pinmux_register_mappings() - register a set of pinmux mappings
 * @maps: the pinmux mappings table to register, this should be marked with
 *	__initdata so it can be discarded after boot, this function will
 *	perform a shallow copy for the mapping entries.
 * @num_maps: the number of maps in the mapping table
 *
 * Only call this once during initialization of your machine, the function is
 * tagged as __init and won't be callable after init has completed. The map
 * passed into this function will be owned by the pinmux core and cannot be
 * freed.
 */
int __init pinmux_register_mappings(struct pinmux_map const *maps,
				    unsigned num_maps)
{
	void *tmp_maps;
	int i;

	pr_debug("add %d pinmux maps\n", num_maps);

	/* First sanity check the new mapping */
	for (i = 0; i < num_maps; i++) {
		if (!maps[i].name) {
			pr_err("failed to register map %d: no map name given\n",
					i);
			return -EINVAL;
		}

		if (!maps[i].ctrl_dev && !maps[i].ctrl_dev_name) {
			pr_err("failed to register map %s (%d): no pin control device given\n",
			       maps[i].name, i);
			return -EINVAL;
		}

		if (!maps[i].function) {
			pr_err("failed to register map %s (%d): no function ID given\n",
					maps[i].name, i);
			return -EINVAL;
		}

		if (!maps[i].dev && !maps[i].dev_name)
			pr_debug("add system map %s function %s with no device\n",
				 maps[i].name,
				 maps[i].function);
		else
			pr_debug("register map %s, function %s\n",
				 maps[i].name,
				 maps[i].function);
	}

	/*
	 * Make a copy of the map array - string pointers will end up in the
	 * kernel const section anyway so these do not need to be deep copied.
	 */
	if (!pinmux_maps_num) {
		/* On first call, just copy them */
		tmp_maps = kmemdup(maps,
				   sizeof(struct pinmux_map) * num_maps,
				   GFP_KERNEL);
		if (!tmp_maps)
			return -ENOMEM;
	} else {
		/* Subsequent calls, reallocate array to new size */
		size_t oldsize = sizeof(struct pinmux_map) * pinmux_maps_num;
		size_t newsize = sizeof(struct pinmux_map) * num_maps;

		tmp_maps = krealloc(pinmux_maps, oldsize + newsize, GFP_KERNEL);
		if (!tmp_maps)
			return -ENOMEM;
		memcpy((tmp_maps + oldsize), maps, newsize);
	}

	pinmux_maps = tmp_maps;
	pinmux_maps_num += num_maps;
	return 0;
}

/**
 * acquire_pins() - acquire all the pins for a certain function on a pinmux
 * @pctldev: the device to take the pins on
 * @func_selector: the function selector to acquire the pins for
 * @group_selector: the group selector containing the pins to acquire
 */
static int acquire_pins(struct pinctrl_dev *pctldev,
			unsigned func_selector,
			unsigned group_selector)
{
	const struct pinctrl_ops *pctlops = pctldev->desc->pctlops;
	const struct pinmux_ops *pmxops = pctldev->desc->pmxops;
	const char *func = pmxops->get_function_name(pctldev,
						     func_selector);
	const unsigned *pins;
	unsigned num_pins;
	int ret;
	int i;

	ret = pctlops->get_group_pins(pctldev, group_selector,
				      &pins, &num_pins);
	if (ret)
		return ret;

	dev_dbg(pctldev->dev, "requesting the %u pins from group %u\n",
		num_pins, group_selector);

	/* Try to allocate all pins in this group, one by one */
	for (i = 0; i < num_pins; i++) {
		ret = pin_request(pctldev, pins[i], func, NULL);
		if (ret) {
			dev_err(pctldev->dev,
				"could not get pin %d for function %s on device %s - conflicting mux mappings?\n",
				pins[i], func ? : "(undefined)",
				pinctrl_dev_get_name(pctldev));
			/* On error release all taken pins */
			i--; /* this pin just failed */
			for (; i >= 0; i--)
				pin_free(pctldev, pins[i], NULL);
			return -ENODEV;
		}
	}
	return 0;
}

/**
 * release_pins() - release pins taken by earlier acquirement
 * @pctldev: the device to free the pins on
 * @group_selector: the group selector containing the pins to free
 */
static void release_pins(struct pinctrl_dev *pctldev,
			 unsigned group_selector)
{
	const struct pinctrl_ops *pctlops = pctldev->desc->pctlops;
	const unsigned *pins;
	unsigned num_pins;
	int ret;
	int i;

	ret = pctlops->get_group_pins(pctldev, group_selector,
				      &pins, &num_pins);
	if (ret) {
		dev_err(pctldev->dev, "could not get pins to release for group selector %d\n",
			group_selector);
		return;
	}
	for (i = 0; i < num_pins; i++)
		pin_free(pctldev, pins[i], NULL);
}

/**
 * pinmux_check_pin_group() - check function and pin group combo
 * @pctldev: device to check the pin group vs function for
 * @func_selector: the function selector to check the pin group for, we have
 *	already looked this up in the calling function
 * @pin_group: the pin group to match to the function
 *
 * This function will check that the pinmux driver can supply the
 * selected pin group for a certain function, returns the group selector if
 * the group and function selector will work fine together, else returns
 * negative
 */
static int pinmux_check_pin_group(struct pinctrl_dev *pctldev,
				  unsigned func_selector,
				  const char *pin_group)
{
	const struct pinmux_ops *pmxops = pctldev->desc->pmxops;
	const struct pinctrl_ops *pctlops = pctldev->desc->pctlops;
	int ret;

	/*
	 * If the driver does not support different pin groups for the
	 * functions, we only support group 0, and assume this exists.
	 */
	if (!pctlops || !pctlops->list_groups)
		return 0;

	/*
	 * Passing NULL (no specific group) will select the first and
	 * hopefully only group of pins available for this function.
	 */
	if (!pin_group) {
		char const * const *groups;
		unsigned num_groups;

		ret = pmxops->get_function_groups(pctldev, func_selector,
						  &groups, &num_groups);
		if (ret)
			return ret;
		if (num_groups < 1)
			return -EINVAL;
		ret = pinctrl_get_group_selector(pctldev, groups[0]);
		if (ret < 0) {
			dev_err(pctldev->dev,
				"function %s wants group %s but the pin controller does not seem to have that group\n",
				pmxops->get_function_name(pctldev, func_selector),
				groups[0]);
			return ret;
		}

		if (num_groups > 1)
			dev_dbg(pctldev->dev,
				"function %s support more than one group, default-selecting first group %s (%d)\n",
				pmxops->get_function_name(pctldev, func_selector),
				groups[0],
				ret);

		return ret;
	}

	dev_dbg(pctldev->dev,
		"check if we have pin group %s on controller %s\n",
		pin_group, pinctrl_dev_get_name(pctldev));

	ret = pinctrl_get_group_selector(pctldev, pin_group);
	if (ret < 0) {
		dev_dbg(pctldev->dev,
			"%s does not support pin group %s with function %s\n",
			pinctrl_dev_get_name(pctldev),
			pin_group,
			pmxops->get_function_name(pctldev, func_selector));
	}
	return ret;
}

/**
 * pinmux_search_function() - check pin control driver for a certain function
 * @pctldev: device to check for function and position
 * @map: function map containing the function and position to look for
 * @func_selector: returns the applicable function selector if found
 * @group_selector: returns the applicable group selector if found
 *
 * This will search the pinmux driver for an applicable
 * function with a specific pin group, returns 0 if these can be mapped
 * negative otherwise
 */
static int pinmux_search_function(struct pinctrl_dev *pctldev,
				  struct pinmux_map const *map,
				  unsigned *func_selector,
				  unsigned *group_selector)
{
	const struct pinmux_ops *ops = pctldev->desc->pmxops;
	unsigned selector = 0;

	/* See if this pctldev has this function */
	while (ops->list_functions(pctldev, selector) >= 0) {
		const char *fname = ops->get_function_name(pctldev,
							   selector);
		int ret;

		if (!strcmp(map->function, fname)) {
			/* Found the function, check pin group */
			ret = pinmux_check_pin_group(pctldev, selector,
						     map->group);
			if (ret < 0)
				return ret;

			/* This function and group selector can be used */
			*func_selector = selector;
			*group_selector = ret;
			return 0;

		}
		selector++;
	}

	pr_err("%s does not support function %s\n",
	       pinctrl_dev_get_name(pctldev), map->function);
	return -EINVAL;
}

/**
 * pinmux_enable_muxmap() - enable a map entry for a certain pinmux
 */
static int pinmux_enable_muxmap(struct pinctrl_dev *pctldev,
				struct pinmux *pmx,
				struct device *dev,
				const char *devname,
				struct pinmux_map const *map)
{
	unsigned func_selector;
	unsigned group_selector;
	struct pinmux_group *grp;
	int ret;

	/*
	 * Note that we're not locking the pinmux mutex here, because
	 * this is only called at pinmux initialization time when it
	 * has not been added to any list and thus is not reachable
	 * by anyone else.
	 */

	if (pmx->pctldev && pmx->pctldev != pctldev) {
		dev_err(pctldev->dev,
			"different pin control devices given for device %s, function %s\n",
			devname, map->function);
		return -EINVAL;
	}
	pmx->dev = dev;
	pmx->pctldev = pctldev;

	/* Now go into the driver and try to match a function and group */
	ret = pinmux_search_function(pctldev, map, &func_selector,
				     &group_selector);
	if (ret < 0)
		return ret;

	/*
	 * If the function selector is already set, it needs to be identical,
	 * we support several groups with one function but not several
	 * functions with one or several groups in the same pinmux.
	 */
	if (pmx->func_selector != UINT_MAX &&
	    pmx->func_selector != func_selector) {
		dev_err(pctldev->dev,
			"dual function defines in the map for device %s\n",
		       devname);
		return -EINVAL;
	}
	pmx->func_selector = func_selector;

	/* Now add this group selector, we may have many of them */
	grp = kmalloc(sizeof(struct pinmux_group), GFP_KERNEL);
	if (!grp)
		return -ENOMEM;
	grp->group_selector = group_selector;
	ret = acquire_pins(pctldev, func_selector, group_selector);
	if (ret) {
		kfree(grp);
		return ret;
	}
	list_add(&grp->node, &pmx->groups);

	return 0;
}

static void pinmux_free_groups(struct pinmux *pmx)
{
	struct list_head *node, *tmp;

	list_for_each_safe(node, tmp, &pmx->groups) {
		struct pinmux_group *grp =
			list_entry(node, struct pinmux_group, node);
		/* Release all pins taken by this group */
		release_pins(pmx->pctldev, grp->group_selector);
		list_del(node);
		kfree(grp);
	}
}

/**
 * pinmux_get() - retrieves the pinmux for a certain device
 * @dev: the device to get the pinmux for
 * @name: an optional specific mux mapping name or NULL, the name is only
 *	needed if you want to have more than one mapping per device, or if you
 *	need an anonymous pinmux (not tied to any specific device)
 */
struct pinmux *pinmux_get(struct device *dev, const char *name)
{
	struct pinmux_map const *map = NULL;
	struct pinctrl_dev *pctldev = NULL;
	const char *devname = NULL;
	struct pinmux *pmx;
	bool found_map;
	unsigned num_maps = 0;
	int ret = -ENODEV;
	int i;

	/* We must have dev or ID or both */
	if (!dev && !name)
		return ERR_PTR(-EINVAL);

	if (dev)
		devname = dev_name(dev);

	pr_debug("get mux %s for device %s\n", name,
		 devname ? devname : "(none)");

	/*
	 * create the state cookie holder struct pinmux for each
	 * mapping, this is what consumers will get when requesting
	 * a pinmux handle with pinmux_get()
	 */
	pmx = kzalloc(sizeof(struct pinmux), GFP_KERNEL);
	if (pmx == NULL)
		return ERR_PTR(-ENOMEM);
	mutex_init(&pmx->mutex);
	pmx->func_selector = UINT_MAX;
	INIT_LIST_HEAD(&pmx->groups);

	/* Iterate over the pinmux maps to locate the right ones */
	for (i = 0; i < pinmux_maps_num; i++) {
		map = &pinmux_maps[i];
		found_map = false;

		/*
		 * First, try to find the pctldev given in the map
		 */
		pctldev = get_pinctrl_dev_from_dev(map->ctrl_dev,
						   map->ctrl_dev_name);
		if (!pctldev) {
			const char *devname = NULL;

			if (map->ctrl_dev)
				devname = dev_name(map->ctrl_dev);
			else if (map->ctrl_dev_name)
				devname = map->ctrl_dev_name;

			pr_warning("could not find a pinctrl device for pinmux function %s, fishy, they shall all have one\n",
				   map->function);
			pr_warning("given pinctrl device name: %s",
				   devname ? devname : "UNDEFINED");

			/* Continue to check the other mappings anyway... */
			continue;
		}

		pr_debug("in map, found pctldev %s to handle function %s",
			 dev_name(pctldev->dev), map->function);


		/*
		 * If we're looking for a specific named map, this must match,
		 * else we loop and look for the next.
		 */
		if (name != NULL) {
			if (map->name == NULL)
				continue;
			if (strcmp(map->name, name))
				continue;
		}

		/*
		 * This is for the case where no device name is given, we
		 * already know that the function name matches from above
		 * code.
		 */
		if (!map->dev_name && (name != NULL))
			found_map = true;

		/* If the mapping has a device set up it must match */
		if (map->dev_name &&
		    (!devname || !strcmp(map->dev_name, devname)))
			/* MATCH! */
			found_map = true;

		/* If this map is applicable, then apply it */
		if (found_map) {
			ret = pinmux_enable_muxmap(pctldev, pmx, dev,
						   devname, map);
			if (ret) {
				pinmux_free_groups(pmx);
				kfree(pmx);
				return ERR_PTR(ret);
			}
			num_maps++;
		}
	}


	/* We should have atleast one map, right */
	if (!num_maps) {
		pr_err("could not find any mux maps for device %s, ID %s\n",
		       devname ? devname : "(anonymous)",
		       name ? name : "(undefined)");
		kfree(pmx);
		return ERR_PTR(-EINVAL);
	}

	pr_debug("found %u mux maps for device %s, UD %s\n",
		 num_maps,
		 devname ? devname : "(anonymous)",
		 name ? name : "(undefined)");

	/* Add the pinmux to the global list */
	mutex_lock(&pinmux_list_mutex);
	list_add(&pmx->node, &pinmux_list);
	mutex_unlock(&pinmux_list_mutex);

	return pmx;
}
EXPORT_SYMBOL_GPL(pinmux_get);

/**
 * pinmux_put() - release a previously claimed pinmux
 * @pmx: a pinmux previously claimed by pinmux_get()
 */
void pinmux_put(struct pinmux *pmx)
{
	if (pmx == NULL)
		return;

	mutex_lock(&pmx->mutex);
	if (pmx->usecount)
		pr_warn("releasing pinmux with active users!\n");
	/* Free the groups and all acquired pins */
	pinmux_free_groups(pmx);
	mutex_unlock(&pmx->mutex);

	/* Remove from list */
	mutex_lock(&pinmux_list_mutex);
	list_del(&pmx->node);
	mutex_unlock(&pinmux_list_mutex);

	kfree(pmx);
}
EXPORT_SYMBOL_GPL(pinmux_put);

/**
 * pinmux_enable() - enable a certain pinmux setting
 * @pmx: the pinmux to enable, previously claimed by pinmux_get()
 */
int pinmux_enable(struct pinmux *pmx)
{
	int ret = 0;

	if (pmx == NULL)
		return -EINVAL;
	mutex_lock(&pmx->mutex);
	if (pmx->usecount++ == 0) {
		struct pinctrl_dev *pctldev = pmx->pctldev;
		const struct pinmux_ops *ops = pctldev->desc->pmxops;
		struct pinmux_group *grp;

		list_for_each_entry(grp, &pmx->groups, node) {
			ret = ops->enable(pctldev, pmx->func_selector,
					  grp->group_selector);
			if (ret) {
				/*
				 * TODO: call disable() on all groups we called
				 * enable() on to this point?
				 */
				pmx->usecount--;
				break;
			}
		}
	}
	mutex_unlock(&pmx->mutex);
	return ret;
}
EXPORT_SYMBOL_GPL(pinmux_enable);

/**
 * pinmux_disable() - disable a certain pinmux setting
 * @pmx: the pinmux to disable, previously claimed by pinmux_get()
 */
void pinmux_disable(struct pinmux *pmx)
{
	if (pmx == NULL)
		return;

	mutex_lock(&pmx->mutex);
	if (--pmx->usecount == 0) {
		struct pinctrl_dev *pctldev = pmx->pctldev;
		const struct pinmux_ops *ops = pctldev->desc->pmxops;
		struct pinmux_group *grp;

		list_for_each_entry(grp, &pmx->groups, node) {
			ops->disable(pctldev, pmx->func_selector,
				     grp->group_selector);
		}
	}
	mutex_unlock(&pmx->mutex);
}
EXPORT_SYMBOL_GPL(pinmux_disable);

int pinmux_check_ops(struct pinctrl_dev *pctldev)
{
	const struct pinmux_ops *ops = pctldev->desc->pmxops;
	unsigned selector = 0;

	/* Check that we implement required operations */
	if (!ops->list_functions ||
	    !ops->get_function_name ||
	    !ops->get_function_groups ||
	    !ops->enable ||
	    !ops->disable)
		return -EINVAL;

	/* Check that all functions registered have names */
	while (ops->list_functions(pctldev, selector) >= 0) {
		const char *fname = ops->get_function_name(pctldev,
							   selector);
		if (!fname) {
			pr_err("pinmux ops has no name for function%u\n",
				selector);
			return -EINVAL;
		}
		selector++;
	}

	return 0;
}

/* Hog a single map entry and add to the hoglist */
static int pinmux_hog_map(struct pinctrl_dev *pctldev,
			  struct pinmux_map const *map)
{
	struct pinmux_hog *hog;
	struct pinmux *pmx;
	int ret;

	if (map->dev || map->dev_name) {
		/*
		 * TODO: the day we have device tree support, we can
		 * traverse the device tree and hog to specific device nodes
		 * without any problems, so then we can hog pinmuxes for
		 * all devices that just want a static pin mux at this point.
		 */
		dev_err(pctldev->dev, "map %s wants to hog a non-system pinmux, this is not going to work\n",
				map->name);
		return -EINVAL;
	}

	hog = kzalloc(sizeof(struct pinmux_hog), GFP_KERNEL);
	if (!hog)
		return -ENOMEM;

	pmx = pinmux_get(NULL, map->name);
	if (IS_ERR(pmx)) {
		kfree(hog);
		dev_err(pctldev->dev,
			"could not get the %s pinmux mapping for hogging\n",
			map->name);
		return PTR_ERR(pmx);
	}

	ret = pinmux_enable(pmx);
	if (ret) {
		pinmux_put(pmx);
		kfree(hog);
		dev_err(pctldev->dev,
			"could not enable the %s pinmux mapping for hogging\n",
			map->name);
		return ret;
	}

	hog->map = map;
	hog->pmx = pmx;

	dev_info(pctldev->dev, "hogged map %s, function %s\n", map->name,
		 map->function);
	mutex_lock(&pctldev->pinmux_hogs_lock);
	list_add(&hog->node, &pctldev->pinmux_hogs);
	mutex_unlock(&pctldev->pinmux_hogs_lock);

	return 0;
}

/**
 * pinmux_hog_maps() - hog specific map entries on controller device
 * @pctldev: the pin control device to hog entries on
 *
 * When the pin controllers are registered, there may be some specific pinmux
 * map entries that need to be hogged, i.e. get+enabled until the system shuts
 * down.
 */
int pinmux_hog_maps(struct pinctrl_dev *pctldev)
{
	struct device *dev = pctldev->dev;
	const char *devname = dev_name(dev);
	int ret;
	int i;

	INIT_LIST_HEAD(&pctldev->pinmux_hogs);
	mutex_init(&pctldev->pinmux_hogs_lock);

	for (i = 0; i < pinmux_maps_num; i++) {
		struct pinmux_map const *map = &pinmux_maps[i];

		if (!map->hog_on_boot)
			continue;

		if ((map->ctrl_dev == dev) ||
			(map->ctrl_dev_name &&
				!strcmp(map->ctrl_dev_name, devname))) {
			/* OK time to hog! */
			ret = pinmux_hog_map(pctldev, map);
			if (ret)
				return ret;
		}
	}
	return 0;
}

/**
 * pinmux_unhog_maps() - unhog specific map entries on controller device
 * @pctldev: the pin control device to unhog entries on
 */
void pinmux_unhog_maps(struct pinctrl_dev *pctldev)
{
	struct list_head *node, *tmp;

	mutex_lock(&pctldev->pinmux_hogs_lock);
	list_for_each_safe(node, tmp, &pctldev->pinmux_hogs) {
		struct pinmux_hog *hog =
			list_entry(node, struct pinmux_hog, node);
		pinmux_disable(hog->pmx);
		pinmux_put(hog->pmx);
		list_del(node);
		kfree(hog);
	}
	mutex_unlock(&pctldev->pinmux_hogs_lock);
}

#ifdef CONFIG_DEBUG_FS

/* Called from pincontrol core */
static int pinmux_functions_show(struct seq_file *s, void *what)
{
	struct pinctrl_dev *pctldev = s->private;
	const struct pinmux_ops *pmxops = pctldev->desc->pmxops;
	unsigned func_selector = 0;

	while (pmxops->list_functions(pctldev, func_selector) >= 0) {
		const char *func = pmxops->get_function_name(pctldev,
							  func_selector);
		const char * const *groups;
		unsigned num_groups;
		int ret;
		int i;

		ret = pmxops->get_function_groups(pctldev, func_selector,
						  &groups, &num_groups);
		if (ret)
			seq_printf(s, "function %s: COULD NOT GET GROUPS\n",
				   func);

		seq_printf(s, "function: %s, groups = [ ", func);
		for (i = 0; i < num_groups; i++)
			seq_printf(s, "%s ", groups[i]);
		seq_puts(s, "]\n");

		func_selector++;

	}

	return 0;
}

static int pinmux_pins_show(struct seq_file *s, void *what)
{
	struct pinctrl_dev *pctldev = s->private;
	unsigned i, pin;

	seq_puts(s, "Pinmux settings per pin\n");
	seq_puts(s, "Format: pin (name): pinmuxfunction\n");

	/* The pin number can be retrived from the pin controller descriptor */
	for (i = 0; i < pctldev->desc->npins; i++) {

		struct pin_desc *desc;

		pin = pctldev->desc->pins[i].number;
		desc = pin_desc_get(pctldev, pin);
		/* Skip if we cannot search the pin */
		if (desc == NULL)
			continue;

		seq_printf(s, "pin %d (%s): %s\n", pin,
			   desc->name ? desc->name : "unnamed",
			   desc->mux_function ? desc->mux_function
					      : "UNCLAIMED");
	}

	return 0;
}

static int pinmux_hogs_show(struct seq_file *s, void *what)
{
	struct pinctrl_dev *pctldev = s->private;
	struct pinmux_hog *hog;

	seq_puts(s, "Pinmux map hogs held by device\n");

	list_for_each_entry(hog, &pctldev->pinmux_hogs, node)
		seq_printf(s, "%s\n", hog->map->name);

	return 0;
}

static int pinmux_show(struct seq_file *s, void *what)
{
	struct pinmux *pmx;

	seq_puts(s, "Requested pinmuxes and their maps:\n");
	list_for_each_entry(pmx, &pinmux_list, node) {
		struct pinctrl_dev *pctldev = pmx->pctldev;
		const struct pinmux_ops *pmxops;
		const struct pinctrl_ops *pctlops;
		struct pinmux_group *grp;

		if (!pctldev) {
			seq_puts(s, "NO PIN CONTROLLER DEVICE\n");
			continue;
		}

		pmxops = pctldev->desc->pmxops;
		pctlops = pctldev->desc->pctlops;

		seq_printf(s, "device: %s function: %s (%u),",
			   pinctrl_dev_get_name(pmx->pctldev),
			   pmxops->get_function_name(pctldev,
				   pmx->func_selector),
			   pmx->func_selector);

		seq_printf(s, " groups: [");
		list_for_each_entry(grp, &pmx->groups, node) {
			seq_printf(s, " %s (%u)",
				   pctlops->get_group_name(pctldev,
					   grp->group_selector),
				   grp->group_selector);
		}
		seq_printf(s, " ]");

		seq_printf(s, " users: %u map-> %s\n",
			   pmx->usecount,
			   pmx->dev ? dev_name(pmx->dev) : "(system)");
	}

	return 0;
}

static int pinmux_maps_show(struct seq_file *s, void *what)
{
	int i;

	seq_puts(s, "Pinmux maps:\n");

	for (i = 0; i < pinmux_maps_num; i++) {
		struct pinmux_map const *map = &pinmux_maps[i];

		seq_printf(s, "%s:\n", map->name);
		if (map->dev || map->dev_name)
			seq_printf(s, "  device: %s\n",
				   map->dev ? dev_name(map->dev) :
				   map->dev_name);
		else
			seq_printf(s, "  SYSTEM MUX\n");
		seq_printf(s, "  controlling device %s\n",
			   map->ctrl_dev ? dev_name(map->ctrl_dev) :
			   map->ctrl_dev_name);
		seq_printf(s, "  function: %s\n", map->function);
		seq_printf(s, "  group: %s\n", map->group ? map->group :
			   "(default)");
	}
	return 0;
}

static int pinmux_functions_open(struct inode *inode, struct file *file)
{
	return single_open(file, pinmux_functions_show, inode->i_private);
}

static int pinmux_pins_open(struct inode *inode, struct file *file)
{
	return single_open(file, pinmux_pins_show, inode->i_private);
}

static int pinmux_hogs_open(struct inode *inode, struct file *file)
{
	return single_open(file, pinmux_hogs_show, inode->i_private);
}

static int pinmux_open(struct inode *inode, struct file *file)
{
	return single_open(file, pinmux_show, NULL);
}

static int pinmux_maps_open(struct inode *inode, struct file *file)
{
	return single_open(file, pinmux_maps_show, NULL);
}

static const struct file_operations pinmux_functions_ops = {
	.open		= pinmux_functions_open,
	.read		= seq_read,
	.llseek		= seq_lseek,
	.release	= single_release,
};

static const struct file_operations pinmux_pins_ops = {
	.open		= pinmux_pins_open,
	.read		= seq_read,
	.llseek		= seq_lseek,
	.release	= single_release,
};

static const struct file_operations pinmux_hogs_ops = {
	.open		= pinmux_hogs_open,
	.read		= seq_read,
	.llseek		= seq_lseek,
	.release	= single_release,
};

static const struct file_operations pinmux_ops = {
	.open		= pinmux_open,
	.read		= seq_read,
	.llseek		= seq_lseek,
	.release	= single_release,
};

static const struct file_operations pinmux_maps_ops = {
	.open		= pinmux_maps_open,
	.read		= seq_read,
	.llseek		= seq_lseek,
	.release	= single_release,
};

void pinmux_init_device_debugfs(struct dentry *devroot,
			 struct pinctrl_dev *pctldev)
{
	debugfs_create_file("pinmux-functions", S_IFREG | S_IRUGO,
			    devroot, pctldev, &pinmux_functions_ops);
	debugfs_create_file("pinmux-pins", S_IFREG | S_IRUGO,
			    devroot, pctldev, &pinmux_pins_ops);
	debugfs_create_file("pinmux-hogs", S_IFREG | S_IRUGO,
			    devroot, pctldev, &pinmux_hogs_ops);
}

void pinmux_init_debugfs(struct dentry *subsys_root)
{
	debugfs_create_file("pinmuxes", S_IFREG | S_IRUGO,
			    subsys_root, NULL, &pinmux_ops);
	debugfs_create_file("pinmux-maps", S_IFREG | S_IRUGO,
			    subsys_root, NULL, &pinmux_maps_ops);
}

#endif /* CONFIG_DEBUG_FS */
