mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-21 16:29:59 +00:00
![Sonic Zhang](/assets/img/avatar_default.png)
The new ADI GPIO2 controller was introduced since the BF548 and BF60x processors. It differs a lot from the old one on BF5xx processors. So, create a pinctrl driver under the pinctrl framework. - Define gpio ports and pin interrupt controllers as individual platform devices. - Register a pinctrl driver for the whole GPIO ports and pin interrupt devices. - Probe pint devices before port devices. Put device instances into the global gpio and pint lists. - Define peripheral, irq and gpio reservation bit masks for each gpio port as runtime resources. - Save and restore gpio port and pint status MMRs in syscore PM functions. - Create the plug-in subdrivers to hold the pinctrl soc data for bf54x and bf60x. Add soc data into struct adi_pinctrl. Initialize the soc data in pin controller probe function. Get the pin groups and functions via the soc data reference. - Call gpiochip_add_pin_range() in gpio device probe function to register range cross reference between gpio device and pin control device. - Get range by pinctrl_find_gpio_range_from_pin(), find gpio_port object by container_of() and find adi_pinctrl by pin control device name. - Handle peripheral and gpio requests in pinctrl operation functions. - Demux gpio IRQs via the irq_domain created by each GPIO port. v2-changes: - Remove unlinke() directive. v3-changes: - Rename struct adi_pmx to adi_pinctrl. - Fix the comments of struct gpio_pint. - Remove unused pin_base in struct gpio_port. - Change pint_assign into bool type. - Add comments about the relationship between pint device and port device to the driver header. - Use BIT macro to shift bit. - Remove all bitmap reservation help functions. Inline reservation functions into the actual code. - Remove gpio and offset mutual reference help functions. - Remove all help functions to find gpio_port and adi_pinctrl structs. Get range by pinctrl_find_gpio_range_from_pin(), find gpio_port object by container_of() and find adi_pinctrl by pin control device name. - Pass bool type usage variable to port_setup help function. - Separate long bit operations into several lines and add comments. - Use debugfs to output all GPIO request information. - Avoid to set drvdata to NULL - Add explanation to function adi_gpio_init_int() - Call gpiochip_add_pin_range() in gpio device probe function to register range cross reference between gpio device and pin control device. - Remove the reference to pin control device from the gpio_port struct. Remove the reference list to gpio device from the adi_pinctrl struct. Replace the global adi_pinctrl list with adi_gpio_port_list. Walk through the gpio list to do power suspend and resume operations. - Remove the global GPIO base from struct adi_pinctrl, define pin base in the platform data for each GPIO port device. - Initialize adi_pinctrl_setup in arch_initcall(). - print the status of triggers, whether it is in GPIO mode, if it is flagged to be used as IRQ, etc in adi_pin_dbg_show(). - Create the plug-in subdrivers to hold the pinctrl soc data for bf54x and bf60x. Add soc data into struct adi_pinctrl. Initialize the soc data in pin controller probe function. Get the pin groups and functions via the soc data reference. v4-changes: - remove useless system_state checking. - replace dev_err with dev_warn in both irq and gpio pin cases. - comment on relationship between irq type and invert operation. - It is not necessary to check the reservation mode of the requested pin in IRQ chip operation. Remove the reservation map. - Use existing gpio/pinctrl subsystem debugfs files. Remove pinctrl-adi2 driver specific debugfs output. - Add linkport group and function information for bf60x. - Separate uart and ctsrts pins into 2 groups. - Separate APAPI and alternative ATAPI pins into 2 groups. Signed-off-by: Sonic Zhang <sonic.zhang@analog.com> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
75 lines
1.8 KiB
C
75 lines
1.8 KiB
C
/*
|
|
* Pinctrl Driver for ADI GPIO2 controller
|
|
*
|
|
* Copyright 2007-2013 Analog Devices Inc.
|
|
*
|
|
* Licensed under the GPLv2 or later
|
|
*/
|
|
|
|
#ifndef PINCTRL_PINCTRL_ADI2_H
|
|
#define PINCTRL_PINCTRL_ADI2_H
|
|
|
|
#include <linux/pinctrl/pinctrl.h>
|
|
|
|
/**
|
|
* struct adi_pin_group - describes a pin group
|
|
* @name: the name of this pin group
|
|
* @pins: an array of pins
|
|
* @num: the number of pins in this array
|
|
*/
|
|
struct adi_pin_group {
|
|
const char *name;
|
|
const unsigned *pins;
|
|
const unsigned num;
|
|
};
|
|
|
|
#define ADI_PIN_GROUP(n, p) \
|
|
{ \
|
|
.name = n, \
|
|
.pins = p, \
|
|
.num = ARRAY_SIZE(p), \
|
|
}
|
|
|
|
/**
|
|
* struct adi_pmx_func - describes function mux setting of pin groups
|
|
* @name: the name of this function mux setting
|
|
* @groups: an array of pin groups
|
|
* @num_groups: the number of pin groups in this array
|
|
* @mux: the function mux setting array, end by zero
|
|
*/
|
|
struct adi_pmx_func {
|
|
const char *name;
|
|
const char * const *groups;
|
|
const unsigned num_groups;
|
|
const unsigned short *mux;
|
|
};
|
|
|
|
#define ADI_PMX_FUNCTION(n, g, m) \
|
|
{ \
|
|
.name = n, \
|
|
.groups = g, \
|
|
.num_groups = ARRAY_SIZE(g), \
|
|
.mux = m, \
|
|
}
|
|
|
|
/**
|
|
* struct adi_pinctrl_soc_data - ADI pin controller per-SoC configuration
|
|
* @functions: The functions supported on this SoC.
|
|
* @nfunction: The number of entries in @functions.
|
|
* @groups: An array describing all pin groups the pin SoC supports.
|
|
* @ngroups: The number of entries in @groups.
|
|
* @pins: An array describing all pins the pin controller affects.
|
|
* @npins: The number of entries in @pins.
|
|
*/
|
|
struct adi_pinctrl_soc_data {
|
|
const struct adi_pmx_func *functions;
|
|
int nfunctions;
|
|
const struct adi_pin_group *groups;
|
|
int ngroups;
|
|
const struct pinctrl_pin_desc *pins;
|
|
int npins;
|
|
};
|
|
|
|
void adi_pinctrl_soc_init(const struct adi_pinctrl_soc_data **soc);
|
|
|
|
#endif /* PINCTRL_PINCTRL_ADI2_H */
|