pinctrl: ADI PIN control driver for the GPIO controller on bf54x and bf60x.
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>
This commit is contained in:

committed by
Linus Walleij

parent
272b98c645
commit
e9a03add0c
40
include/linux/platform_data/pinctrl-adi2.h
Normal file
40
include/linux/platform_data/pinctrl-adi2.h
Normal file
@@ -0,0 +1,40 @@
|
||||
/*
|
||||
* 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
|
Reference in New Issue
Block a user