// SPDX-License-Identifier: GPL-2.0-only /* * Core driver for the pin muxing portions of the pin control subsystem * * Copyright (C) 2011-2012 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 <[email protected]> * * Copyright (C) 2012 NVIDIA CORPORATION. All rights reserved. */ #define pr_fmt(fmt) … #include <linux/array_size.h> #include <linux/ctype.h> #include <linux/debugfs.h> #include <linux/device.h> #include <linux/err.h> #include <linux/init.h> #include <linux/list.h> #include <linux/module.h> #include <linux/radix-tree.h> #include <linux/seq_file.h> #include <linux/slab.h> #include <linux/string.h> #include <linux/pinctrl/machine.h> #include <linux/pinctrl/pinctrl.h> #include <linux/pinctrl/pinmux.h> #include "core.h" #include "pinmux.h" int pinmux_check_ops(struct pinctrl_dev *pctldev) { … } int pinmux_validate_map(const struct pinctrl_map *map, int i) { … } /** * pinmux_can_be_used_for_gpio() - check if a specific pin * is either muxed to a different function or used as gpio. * * @pctldev: the associated pin controller device * @pin: the pin number in the global pin space * * Controllers not defined as strict will always return true, * menaning that the gpio can be used. */ bool pinmux_can_be_used_for_gpio(struct pinctrl_dev *pctldev, unsigned int pin) { … } /** * pin_request() - request a single pin to be muxed in, typically for GPIO * @pctldev: the associated pin controller device * @pin: the pin number in the global pin space * @owner: a representation of the owner of this pin; typically the device * name that controls its mux function, or the requested GPIO name * @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 *owner, struct pinctrl_gpio_range *gpio_range) { … } /** * 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 previous owner. This is used * for callers that dynamically allocate an owner 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) { … } /** * pinmux_request_gpio() - request pinmuxing for a GPIO pin * @pctldev: pin controller device affected * @pin: the pin to mux in for GPIO * @range: the applicable GPIO range * @gpio: number of requested GPIO */ int pinmux_request_gpio(struct pinctrl_dev *pctldev, struct pinctrl_gpio_range *range, unsigned int pin, unsigned int gpio) { … } /** * pinmux_free_gpio() - release a pin from GPIO muxing * @pctldev: the pin controller device for the pin * @pin: the affected currently GPIO-muxed in pin * @range: applicable GPIO range */ void pinmux_free_gpio(struct pinctrl_dev *pctldev, unsigned int pin, struct pinctrl_gpio_range *range) { … } /** * pinmux_gpio_direction() - set the direction of a single muxed-in GPIO pin * @pctldev: the pin controller handling this pin * @range: applicable GPIO range * @pin: the affected GPIO pin in this controller * @input: true if we set the pin as input, false for output */ int pinmux_gpio_direction(struct pinctrl_dev *pctldev, struct pinctrl_gpio_range *range, unsigned int pin, bool input) { … } static int pinmux_func_name_to_selector(struct pinctrl_dev *pctldev, const char *function) { … } int pinmux_map_to_setting(const struct pinctrl_map *map, struct pinctrl_setting *setting) { … } void pinmux_free_setting(const struct pinctrl_setting *setting) { … } int pinmux_enable_setting(const struct pinctrl_setting *setting) { … } void pinmux_disable_setting(const struct pinctrl_setting *setting) { … } #ifdef CONFIG_DEBUG_FS /* Called from pincontrol core */ static int pinmux_functions_show(struct seq_file *s, void *what) { … } DEFINE_SHOW_ATTRIBUTE(…); static int pinmux_pins_show(struct seq_file *s, void *what) { … } DEFINE_SHOW_ATTRIBUTE(…); void pinmux_show_map(struct seq_file *s, const struct pinctrl_map *map) { … } void pinmux_show_setting(struct seq_file *s, const struct pinctrl_setting *setting) { … } static int pinmux_select_show(struct seq_file *s, void *unused) { … } static ssize_t pinmux_select_write(struct file *file, const char __user *user_buf, size_t len, loff_t *ppos) { … } DEFINE_SHOW_STORE_ATTRIBUTE(…); void pinmux_init_device_debugfs(struct dentry *devroot, struct pinctrl_dev *pctldev) { … } #endif /* CONFIG_DEBUG_FS */ #ifdef CONFIG_GENERIC_PINMUX_FUNCTIONS /** * pinmux_generic_get_function_count() - returns number of functions * @pctldev: pin controller device */ int pinmux_generic_get_function_count(struct pinctrl_dev *pctldev) { … } EXPORT_SYMBOL_GPL(…); /** * pinmux_generic_get_function_name() - returns the function name * @pctldev: pin controller device * @selector: function number */ const char * pinmux_generic_get_function_name(struct pinctrl_dev *pctldev, unsigned int selector) { … } EXPORT_SYMBOL_GPL(…); /** * pinmux_generic_get_function_groups() - gets the function groups * @pctldev: pin controller device * @selector: function number * @groups: array of pin groups * @ngroups: number of pin groups */ int pinmux_generic_get_function_groups(struct pinctrl_dev *pctldev, unsigned int selector, const char * const **groups, unsigned int * const ngroups) { … } EXPORT_SYMBOL_GPL(…); /** * pinmux_generic_get_function() - returns a function based on the number * @pctldev: pin controller device * @selector: function number */ struct function_desc *pinmux_generic_get_function(struct pinctrl_dev *pctldev, unsigned int selector) { … } EXPORT_SYMBOL_GPL(…); /** * pinmux_generic_add_function() - adds a function group * @pctldev: pin controller device * @name: name of the function * @groups: array of pin groups * @ngroups: number of pin groups * @data: pin controller driver specific data */ int pinmux_generic_add_function(struct pinctrl_dev *pctldev, const char *name, const char * const *groups, const unsigned int ngroups, void *data) { … } EXPORT_SYMBOL_GPL(…); /** * pinmux_generic_remove_function() - removes a numbered function * @pctldev: pin controller device * @selector: function number * * Note that the caller must take care of locking. */ int pinmux_generic_remove_function(struct pinctrl_dev *pctldev, unsigned int selector) { … } EXPORT_SYMBOL_GPL(…); /** * pinmux_generic_free_functions() - removes all functions * @pctldev: pin controller device * * Note that the caller must take care of locking. The pinctrl * functions are allocated with devm_kzalloc() so no need to free * them here. */ void pinmux_generic_free_functions(struct pinctrl_dev *pctldev) { … } #endif /* CONFIG_GENERIC_PINMUX_FUNCTIONS */