• Sonic Zhang's avatar
    pinctrl: ADI PIN control driver for the GPIO controller on bf54x and bf60x. · e9a03add
    Sonic Zhang authored
    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: default avatarSonic Zhang <sonic.zhang@analog.com>
    Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
    e9a03add
pinctrl-adi2.c 30.3 KB