e9a03add0c
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>
40 lines
1.1 KiB
C
40 lines
1.1 KiB
C
/*
|
|
* Pinctrl Driver for ADI GPIO2 controller
|
|
*
|
|
* Copyright 2007-2013 Analog Devices Inc.
|
|
*
|
|
* Licensed under the GPLv2 or later
|
|
*/
|
|
|
|
|
|
#ifndef PINCTRL_ADI2_H
|
|
#define PINCTRL_ADI2_H
|
|
|
|
#include <linux/io.h>
|
|
#include <linux/platform_device.h>
|
|
|
|
/**
|
|
* struct adi_pinctrl_gpio_platform_data - Pinctrl gpio platform data
|
|
* for ADI GPIO2 device.
|
|
*
|
|
* @port_gpio_base: Optional global GPIO index of the GPIO bank.
|
|
* 0 means driver decides.
|
|
* @port_pin_base: Pin index of the pin controller device.
|
|
* @port_width: PIN number of the GPIO bank device
|
|
* @pint_id: GPIO PINT device id that this GPIO bank should map to.
|
|
* @pint_assign: The 32-bit GPIO PINT registers can be divided into 2 parts. A
|
|
* GPIO bank can be mapped into either low 16 bits[0] or high 16
|
|
* bits[1] of each PINT register.
|
|
* @pint_map: GIOP bank mapping code in PINT device
|
|
*/
|
|
struct adi_pinctrl_gpio_platform_data {
|
|
unsigned int port_gpio_base;
|
|
unsigned int port_pin_base;
|
|
unsigned int port_width;
|
|
u8 pinctrl_id;
|
|
u8 pint_id;
|
|
bool pint_assign;
|
|
u8 pint_map;
|
|
};
|
|
|
|
#endif
|