162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci// Copyright (C) 2014-2017 Broadcom 362306a36Sopenharmony_ci 462306a36Sopenharmony_ci/* 562306a36Sopenharmony_ci * Broadcom Cygnus IOMUX driver 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci * This file contains the Cygnus IOMUX driver that supports group based PINMUX 862306a36Sopenharmony_ci * configuration. Although PINMUX configuration is mainly group based, the 962306a36Sopenharmony_ci * Cygnus IOMUX controller allows certain pins to be individually muxed to GPIO 1062306a36Sopenharmony_ci * function, and therefore be controlled by the Cygnus ASIU GPIO controller 1162306a36Sopenharmony_ci */ 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#include <linux/err.h> 1462306a36Sopenharmony_ci#include <linux/io.h> 1562306a36Sopenharmony_ci#include <linux/of.h> 1662306a36Sopenharmony_ci#include <linux/platform_device.h> 1762306a36Sopenharmony_ci#include <linux/seq_file.h> 1862306a36Sopenharmony_ci#include <linux/slab.h> 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci#include <linux/pinctrl/pinconf-generic.h> 2162306a36Sopenharmony_ci#include <linux/pinctrl/pinconf.h> 2262306a36Sopenharmony_ci#include <linux/pinctrl/pinctrl.h> 2362306a36Sopenharmony_ci#include <linux/pinctrl/pinmux.h> 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ci#include "../core.h" 2662306a36Sopenharmony_ci#include "../pinctrl-utils.h" 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci#define CYGNUS_NUM_IOMUX_REGS 8 2962306a36Sopenharmony_ci#define CYGNUS_NUM_MUX_PER_REG 8 3062306a36Sopenharmony_ci#define CYGNUS_NUM_IOMUX (CYGNUS_NUM_IOMUX_REGS * \ 3162306a36Sopenharmony_ci CYGNUS_NUM_MUX_PER_REG) 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_ci/* 3462306a36Sopenharmony_ci * Cygnus IOMUX register description 3562306a36Sopenharmony_ci * 3662306a36Sopenharmony_ci * @offset: register offset for mux configuration of a group 3762306a36Sopenharmony_ci * @shift: bit shift for mux configuration of a group 3862306a36Sopenharmony_ci * @alt: alternate function to set to 3962306a36Sopenharmony_ci */ 4062306a36Sopenharmony_cistruct cygnus_mux { 4162306a36Sopenharmony_ci unsigned int offset; 4262306a36Sopenharmony_ci unsigned int shift; 4362306a36Sopenharmony_ci unsigned int alt; 4462306a36Sopenharmony_ci}; 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ci/* 4762306a36Sopenharmony_ci * Keep track of Cygnus IOMUX configuration and prevent double configuration 4862306a36Sopenharmony_ci * 4962306a36Sopenharmony_ci * @cygnus_mux: Cygnus IOMUX register description 5062306a36Sopenharmony_ci * @is_configured: flag to indicate whether a mux setting has already been 5162306a36Sopenharmony_ci * configured 5262306a36Sopenharmony_ci */ 5362306a36Sopenharmony_cistruct cygnus_mux_log { 5462306a36Sopenharmony_ci struct cygnus_mux mux; 5562306a36Sopenharmony_ci bool is_configured; 5662306a36Sopenharmony_ci}; 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_ci/* 5962306a36Sopenharmony_ci * Group based IOMUX configuration 6062306a36Sopenharmony_ci * 6162306a36Sopenharmony_ci * @name: name of the group 6262306a36Sopenharmony_ci * @pins: array of pins used by this group 6362306a36Sopenharmony_ci * @num_pins: total number of pins used by this group 6462306a36Sopenharmony_ci * @mux: Cygnus group based IOMUX configuration 6562306a36Sopenharmony_ci */ 6662306a36Sopenharmony_cistruct cygnus_pin_group { 6762306a36Sopenharmony_ci const char *name; 6862306a36Sopenharmony_ci const unsigned *pins; 6962306a36Sopenharmony_ci unsigned num_pins; 7062306a36Sopenharmony_ci struct cygnus_mux mux; 7162306a36Sopenharmony_ci}; 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_ci/* 7462306a36Sopenharmony_ci * Cygnus mux function and supported pin groups 7562306a36Sopenharmony_ci * 7662306a36Sopenharmony_ci * @name: name of the function 7762306a36Sopenharmony_ci * @groups: array of groups that can be supported by this function 7862306a36Sopenharmony_ci * @num_groups: total number of groups that can be supported by this function 7962306a36Sopenharmony_ci */ 8062306a36Sopenharmony_cistruct cygnus_pin_function { 8162306a36Sopenharmony_ci const char *name; 8262306a36Sopenharmony_ci const char * const *groups; 8362306a36Sopenharmony_ci unsigned num_groups; 8462306a36Sopenharmony_ci}; 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_ci/* 8762306a36Sopenharmony_ci * Cygnus IOMUX pinctrl core 8862306a36Sopenharmony_ci * 8962306a36Sopenharmony_ci * @pctl: pointer to pinctrl_dev 9062306a36Sopenharmony_ci * @dev: pointer to device 9162306a36Sopenharmony_ci * @base0: first I/O register base of the Cygnus IOMUX controller 9262306a36Sopenharmony_ci * @base1: second I/O register base 9362306a36Sopenharmony_ci * @groups: pointer to array of groups 9462306a36Sopenharmony_ci * @num_groups: total number of groups 9562306a36Sopenharmony_ci * @functions: pointer to array of functions 9662306a36Sopenharmony_ci * @num_functions: total number of functions 9762306a36Sopenharmony_ci * @mux_log: pointer to the array of mux logs 9862306a36Sopenharmony_ci * @lock: lock to protect register access 9962306a36Sopenharmony_ci */ 10062306a36Sopenharmony_cistruct cygnus_pinctrl { 10162306a36Sopenharmony_ci struct pinctrl_dev *pctl; 10262306a36Sopenharmony_ci struct device *dev; 10362306a36Sopenharmony_ci void __iomem *base0; 10462306a36Sopenharmony_ci void __iomem *base1; 10562306a36Sopenharmony_ci 10662306a36Sopenharmony_ci const struct cygnus_pin_group *groups; 10762306a36Sopenharmony_ci unsigned num_groups; 10862306a36Sopenharmony_ci 10962306a36Sopenharmony_ci const struct cygnus_pin_function *functions; 11062306a36Sopenharmony_ci unsigned num_functions; 11162306a36Sopenharmony_ci 11262306a36Sopenharmony_ci struct cygnus_mux_log *mux_log; 11362306a36Sopenharmony_ci 11462306a36Sopenharmony_ci spinlock_t lock; 11562306a36Sopenharmony_ci}; 11662306a36Sopenharmony_ci 11762306a36Sopenharmony_ci/* 11862306a36Sopenharmony_ci * Certain pins can be individually muxed to GPIO function 11962306a36Sopenharmony_ci * 12062306a36Sopenharmony_ci * @is_supported: flag to indicate GPIO mux is supported for this pin 12162306a36Sopenharmony_ci * @offset: register offset for GPIO mux override of a pin 12262306a36Sopenharmony_ci * @shift: bit shift for GPIO mux override of a pin 12362306a36Sopenharmony_ci */ 12462306a36Sopenharmony_cistruct cygnus_gpio_mux { 12562306a36Sopenharmony_ci int is_supported; 12662306a36Sopenharmony_ci unsigned int offset; 12762306a36Sopenharmony_ci unsigned int shift; 12862306a36Sopenharmony_ci}; 12962306a36Sopenharmony_ci 13062306a36Sopenharmony_ci/* 13162306a36Sopenharmony_ci * Description of a pin in Cygnus 13262306a36Sopenharmony_ci * 13362306a36Sopenharmony_ci * @pin: pin number 13462306a36Sopenharmony_ci * @name: pin name 13562306a36Sopenharmony_ci * @gpio_mux: GPIO override related information 13662306a36Sopenharmony_ci */ 13762306a36Sopenharmony_cistruct cygnus_pin { 13862306a36Sopenharmony_ci unsigned pin; 13962306a36Sopenharmony_ci char *name; 14062306a36Sopenharmony_ci struct cygnus_gpio_mux gpio_mux; 14162306a36Sopenharmony_ci}; 14262306a36Sopenharmony_ci 14362306a36Sopenharmony_ci#define CYGNUS_PIN_DESC(p, n, i, o, s) \ 14462306a36Sopenharmony_ci{ \ 14562306a36Sopenharmony_ci .pin = p, \ 14662306a36Sopenharmony_ci .name = n, \ 14762306a36Sopenharmony_ci .gpio_mux = { \ 14862306a36Sopenharmony_ci .is_supported = i, \ 14962306a36Sopenharmony_ci .offset = o, \ 15062306a36Sopenharmony_ci .shift = s, \ 15162306a36Sopenharmony_ci }, \ 15262306a36Sopenharmony_ci} 15362306a36Sopenharmony_ci 15462306a36Sopenharmony_ci/* 15562306a36Sopenharmony_ci * List of pins in Cygnus 15662306a36Sopenharmony_ci */ 15762306a36Sopenharmony_cistatic struct cygnus_pin cygnus_pins[] = { 15862306a36Sopenharmony_ci CYGNUS_PIN_DESC(0, "ext_device_reset_n", 0, 0, 0), 15962306a36Sopenharmony_ci CYGNUS_PIN_DESC(1, "chip_mode0", 0, 0, 0), 16062306a36Sopenharmony_ci CYGNUS_PIN_DESC(2, "chip_mode1", 0, 0, 0), 16162306a36Sopenharmony_ci CYGNUS_PIN_DESC(3, "chip_mode2", 0, 0, 0), 16262306a36Sopenharmony_ci CYGNUS_PIN_DESC(4, "chip_mode3", 0, 0, 0), 16362306a36Sopenharmony_ci CYGNUS_PIN_DESC(5, "chip_mode4", 0, 0, 0), 16462306a36Sopenharmony_ci CYGNUS_PIN_DESC(6, "bsc0_scl", 0, 0, 0), 16562306a36Sopenharmony_ci CYGNUS_PIN_DESC(7, "bsc0_sda", 0, 0, 0), 16662306a36Sopenharmony_ci CYGNUS_PIN_DESC(8, "bsc1_scl", 0, 0, 0), 16762306a36Sopenharmony_ci CYGNUS_PIN_DESC(9, "bsc1_sda", 0, 0, 0), 16862306a36Sopenharmony_ci CYGNUS_PIN_DESC(10, "d1w_dq", 1, 0x28, 0), 16962306a36Sopenharmony_ci CYGNUS_PIN_DESC(11, "d1wowstz_l", 1, 0x4, 28), 17062306a36Sopenharmony_ci CYGNUS_PIN_DESC(12, "gpio0", 0, 0, 0), 17162306a36Sopenharmony_ci CYGNUS_PIN_DESC(13, "gpio1", 0, 0, 0), 17262306a36Sopenharmony_ci CYGNUS_PIN_DESC(14, "gpio2", 0, 0, 0), 17362306a36Sopenharmony_ci CYGNUS_PIN_DESC(15, "gpio3", 0, 0, 0), 17462306a36Sopenharmony_ci CYGNUS_PIN_DESC(16, "gpio4", 0, 0, 0), 17562306a36Sopenharmony_ci CYGNUS_PIN_DESC(17, "gpio5", 0, 0, 0), 17662306a36Sopenharmony_ci CYGNUS_PIN_DESC(18, "gpio6", 0, 0, 0), 17762306a36Sopenharmony_ci CYGNUS_PIN_DESC(19, "gpio7", 0, 0, 0), 17862306a36Sopenharmony_ci CYGNUS_PIN_DESC(20, "gpio8", 0, 0, 0), 17962306a36Sopenharmony_ci CYGNUS_PIN_DESC(21, "gpio9", 0, 0, 0), 18062306a36Sopenharmony_ci CYGNUS_PIN_DESC(22, "gpio10", 0, 0, 0), 18162306a36Sopenharmony_ci CYGNUS_PIN_DESC(23, "gpio11", 0, 0, 0), 18262306a36Sopenharmony_ci CYGNUS_PIN_DESC(24, "gpio12", 0, 0, 0), 18362306a36Sopenharmony_ci CYGNUS_PIN_DESC(25, "gpio13", 0, 0, 0), 18462306a36Sopenharmony_ci CYGNUS_PIN_DESC(26, "gpio14", 0, 0, 0), 18562306a36Sopenharmony_ci CYGNUS_PIN_DESC(27, "gpio15", 0, 0, 0), 18662306a36Sopenharmony_ci CYGNUS_PIN_DESC(28, "gpio16", 0, 0, 0), 18762306a36Sopenharmony_ci CYGNUS_PIN_DESC(29, "gpio17", 0, 0, 0), 18862306a36Sopenharmony_ci CYGNUS_PIN_DESC(30, "gpio18", 0, 0, 0), 18962306a36Sopenharmony_ci CYGNUS_PIN_DESC(31, "gpio19", 0, 0, 0), 19062306a36Sopenharmony_ci CYGNUS_PIN_DESC(32, "gpio20", 0, 0, 0), 19162306a36Sopenharmony_ci CYGNUS_PIN_DESC(33, "gpio21", 0, 0, 0), 19262306a36Sopenharmony_ci CYGNUS_PIN_DESC(34, "gpio22", 0, 0, 0), 19362306a36Sopenharmony_ci CYGNUS_PIN_DESC(35, "gpio23", 0, 0, 0), 19462306a36Sopenharmony_ci CYGNUS_PIN_DESC(36, "mdc", 0, 0, 0), 19562306a36Sopenharmony_ci CYGNUS_PIN_DESC(37, "mdio", 0, 0, 0), 19662306a36Sopenharmony_ci CYGNUS_PIN_DESC(38, "pwm0", 1, 0x10, 30), 19762306a36Sopenharmony_ci CYGNUS_PIN_DESC(39, "pwm1", 1, 0x10, 28), 19862306a36Sopenharmony_ci CYGNUS_PIN_DESC(40, "pwm2", 1, 0x10, 26), 19962306a36Sopenharmony_ci CYGNUS_PIN_DESC(41, "pwm3", 1, 0x10, 24), 20062306a36Sopenharmony_ci CYGNUS_PIN_DESC(42, "sc0_clk", 1, 0x10, 22), 20162306a36Sopenharmony_ci CYGNUS_PIN_DESC(43, "sc0_cmdvcc_l", 1, 0x10, 20), 20262306a36Sopenharmony_ci CYGNUS_PIN_DESC(44, "sc0_detect", 1, 0x10, 18), 20362306a36Sopenharmony_ci CYGNUS_PIN_DESC(45, "sc0_fcb", 1, 0x10, 16), 20462306a36Sopenharmony_ci CYGNUS_PIN_DESC(46, "sc0_io", 1, 0x10, 14), 20562306a36Sopenharmony_ci CYGNUS_PIN_DESC(47, "sc0_rst_l", 1, 0x10, 12), 20662306a36Sopenharmony_ci CYGNUS_PIN_DESC(48, "sc1_clk", 1, 0x10, 10), 20762306a36Sopenharmony_ci CYGNUS_PIN_DESC(49, "sc1_cmdvcc_l", 1, 0x10, 8), 20862306a36Sopenharmony_ci CYGNUS_PIN_DESC(50, "sc1_detect", 1, 0x10, 6), 20962306a36Sopenharmony_ci CYGNUS_PIN_DESC(51, "sc1_fcb", 1, 0x10, 4), 21062306a36Sopenharmony_ci CYGNUS_PIN_DESC(52, "sc1_io", 1, 0x10, 2), 21162306a36Sopenharmony_ci CYGNUS_PIN_DESC(53, "sc1_rst_l", 1, 0x10, 0), 21262306a36Sopenharmony_ci CYGNUS_PIN_DESC(54, "spi0_clk", 1, 0x18, 10), 21362306a36Sopenharmony_ci CYGNUS_PIN_DESC(55, "spi0_mosi", 1, 0x18, 6), 21462306a36Sopenharmony_ci CYGNUS_PIN_DESC(56, "spi0_miso", 1, 0x18, 8), 21562306a36Sopenharmony_ci CYGNUS_PIN_DESC(57, "spi0_ss", 1, 0x18, 4), 21662306a36Sopenharmony_ci CYGNUS_PIN_DESC(58, "spi1_clk", 1, 0x18, 2), 21762306a36Sopenharmony_ci CYGNUS_PIN_DESC(59, "spi1_mosi", 1, 0x1c, 30), 21862306a36Sopenharmony_ci CYGNUS_PIN_DESC(60, "spi1_miso", 1, 0x18, 0), 21962306a36Sopenharmony_ci CYGNUS_PIN_DESC(61, "spi1_ss", 1, 0x1c, 28), 22062306a36Sopenharmony_ci CYGNUS_PIN_DESC(62, "spi2_clk", 1, 0x1c, 26), 22162306a36Sopenharmony_ci CYGNUS_PIN_DESC(63, "spi2_mosi", 1, 0x1c, 22), 22262306a36Sopenharmony_ci CYGNUS_PIN_DESC(64, "spi2_miso", 1, 0x1c, 24), 22362306a36Sopenharmony_ci CYGNUS_PIN_DESC(65, "spi2_ss", 1, 0x1c, 20), 22462306a36Sopenharmony_ci CYGNUS_PIN_DESC(66, "spi3_clk", 1, 0x1c, 18), 22562306a36Sopenharmony_ci CYGNUS_PIN_DESC(67, "spi3_mosi", 1, 0x1c, 14), 22662306a36Sopenharmony_ci CYGNUS_PIN_DESC(68, "spi3_miso", 1, 0x1c, 16), 22762306a36Sopenharmony_ci CYGNUS_PIN_DESC(69, "spi3_ss", 1, 0x1c, 12), 22862306a36Sopenharmony_ci CYGNUS_PIN_DESC(70, "uart0_cts", 1, 0x1c, 10), 22962306a36Sopenharmony_ci CYGNUS_PIN_DESC(71, "uart0_rts", 1, 0x1c, 8), 23062306a36Sopenharmony_ci CYGNUS_PIN_DESC(72, "uart0_rx", 1, 0x1c, 6), 23162306a36Sopenharmony_ci CYGNUS_PIN_DESC(73, "uart0_tx", 1, 0x1c, 4), 23262306a36Sopenharmony_ci CYGNUS_PIN_DESC(74, "uart1_cts", 1, 0x1c, 2), 23362306a36Sopenharmony_ci CYGNUS_PIN_DESC(75, "uart1_dcd", 1, 0x1c, 0), 23462306a36Sopenharmony_ci CYGNUS_PIN_DESC(76, "uart1_dsr", 1, 0x20, 14), 23562306a36Sopenharmony_ci CYGNUS_PIN_DESC(77, "uart1_dtr", 1, 0x20, 12), 23662306a36Sopenharmony_ci CYGNUS_PIN_DESC(78, "uart1_ri", 1, 0x20, 10), 23762306a36Sopenharmony_ci CYGNUS_PIN_DESC(79, "uart1_rts", 1, 0x20, 8), 23862306a36Sopenharmony_ci CYGNUS_PIN_DESC(80, "uart1_rx", 1, 0x20, 6), 23962306a36Sopenharmony_ci CYGNUS_PIN_DESC(81, "uart1_tx", 1, 0x20, 4), 24062306a36Sopenharmony_ci CYGNUS_PIN_DESC(82, "uart3_rx", 1, 0x20, 2), 24162306a36Sopenharmony_ci CYGNUS_PIN_DESC(83, "uart3_tx", 1, 0x20, 0), 24262306a36Sopenharmony_ci CYGNUS_PIN_DESC(84, "sdio1_clk_sdcard", 1, 0x14, 6), 24362306a36Sopenharmony_ci CYGNUS_PIN_DESC(85, "sdio1_cmd", 1, 0x14, 4), 24462306a36Sopenharmony_ci CYGNUS_PIN_DESC(86, "sdio1_data0", 1, 0x14, 2), 24562306a36Sopenharmony_ci CYGNUS_PIN_DESC(87, "sdio1_data1", 1, 0x14, 0), 24662306a36Sopenharmony_ci CYGNUS_PIN_DESC(88, "sdio1_data2", 1, 0x18, 30), 24762306a36Sopenharmony_ci CYGNUS_PIN_DESC(89, "sdio1_data3", 1, 0x18, 28), 24862306a36Sopenharmony_ci CYGNUS_PIN_DESC(90, "sdio1_wp_n", 1, 0x18, 24), 24962306a36Sopenharmony_ci CYGNUS_PIN_DESC(91, "sdio1_card_rst", 1, 0x14, 10), 25062306a36Sopenharmony_ci CYGNUS_PIN_DESC(92, "sdio1_led_on", 1, 0x18, 26), 25162306a36Sopenharmony_ci CYGNUS_PIN_DESC(93, "sdio1_cd", 1, 0x14, 8), 25262306a36Sopenharmony_ci CYGNUS_PIN_DESC(94, "sdio0_clk_sdcard", 1, 0x14, 26), 25362306a36Sopenharmony_ci CYGNUS_PIN_DESC(95, "sdio0_cmd", 1, 0x14, 24), 25462306a36Sopenharmony_ci CYGNUS_PIN_DESC(96, "sdio0_data0", 1, 0x14, 22), 25562306a36Sopenharmony_ci CYGNUS_PIN_DESC(97, "sdio0_data1", 1, 0x14, 20), 25662306a36Sopenharmony_ci CYGNUS_PIN_DESC(98, "sdio0_data2", 1, 0x14, 18), 25762306a36Sopenharmony_ci CYGNUS_PIN_DESC(99, "sdio0_data3", 1, 0x14, 16), 25862306a36Sopenharmony_ci CYGNUS_PIN_DESC(100, "sdio0_wp_n", 1, 0x14, 12), 25962306a36Sopenharmony_ci CYGNUS_PIN_DESC(101, "sdio0_card_rst", 1, 0x14, 30), 26062306a36Sopenharmony_ci CYGNUS_PIN_DESC(102, "sdio0_led_on", 1, 0x14, 14), 26162306a36Sopenharmony_ci CYGNUS_PIN_DESC(103, "sdio0_cd", 1, 0x14, 28), 26262306a36Sopenharmony_ci CYGNUS_PIN_DESC(104, "sflash_clk", 1, 0x18, 22), 26362306a36Sopenharmony_ci CYGNUS_PIN_DESC(105, "sflash_cs_l", 1, 0x18, 20), 26462306a36Sopenharmony_ci CYGNUS_PIN_DESC(106, "sflash_mosi", 1, 0x18, 14), 26562306a36Sopenharmony_ci CYGNUS_PIN_DESC(107, "sflash_miso", 1, 0x18, 16), 26662306a36Sopenharmony_ci CYGNUS_PIN_DESC(108, "sflash_wp_n", 1, 0x18, 12), 26762306a36Sopenharmony_ci CYGNUS_PIN_DESC(109, "sflash_hold_n", 1, 0x18, 18), 26862306a36Sopenharmony_ci CYGNUS_PIN_DESC(110, "nand_ale", 1, 0xc, 30), 26962306a36Sopenharmony_ci CYGNUS_PIN_DESC(111, "nand_ce0_l", 1, 0xc, 28), 27062306a36Sopenharmony_ci CYGNUS_PIN_DESC(112, "nand_ce1_l", 1, 0xc, 26), 27162306a36Sopenharmony_ci CYGNUS_PIN_DESC(113, "nand_cle", 1, 0xc, 24), 27262306a36Sopenharmony_ci CYGNUS_PIN_DESC(114, "nand_dq0", 1, 0xc, 22), 27362306a36Sopenharmony_ci CYGNUS_PIN_DESC(115, "nand_dq1", 1, 0xc, 20), 27462306a36Sopenharmony_ci CYGNUS_PIN_DESC(116, "nand_dq2", 1, 0xc, 18), 27562306a36Sopenharmony_ci CYGNUS_PIN_DESC(117, "nand_dq3", 1, 0xc, 16), 27662306a36Sopenharmony_ci CYGNUS_PIN_DESC(118, "nand_dq4", 1, 0xc, 14), 27762306a36Sopenharmony_ci CYGNUS_PIN_DESC(119, "nand_dq5", 1, 0xc, 12), 27862306a36Sopenharmony_ci CYGNUS_PIN_DESC(120, "nand_dq6", 1, 0xc, 10), 27962306a36Sopenharmony_ci CYGNUS_PIN_DESC(121, "nand_dq7", 1, 0xc, 8), 28062306a36Sopenharmony_ci CYGNUS_PIN_DESC(122, "nand_rb_l", 1, 0xc, 6), 28162306a36Sopenharmony_ci CYGNUS_PIN_DESC(123, "nand_re_l", 1, 0xc, 4), 28262306a36Sopenharmony_ci CYGNUS_PIN_DESC(124, "nand_we_l", 1, 0xc, 2), 28362306a36Sopenharmony_ci CYGNUS_PIN_DESC(125, "nand_wp_l", 1, 0xc, 0), 28462306a36Sopenharmony_ci CYGNUS_PIN_DESC(126, "lcd_clac", 1, 0x4, 26), 28562306a36Sopenharmony_ci CYGNUS_PIN_DESC(127, "lcd_clcp", 1, 0x4, 24), 28662306a36Sopenharmony_ci CYGNUS_PIN_DESC(128, "lcd_cld0", 1, 0x4, 22), 28762306a36Sopenharmony_ci CYGNUS_PIN_DESC(129, "lcd_cld1", 1, 0x4, 0), 28862306a36Sopenharmony_ci CYGNUS_PIN_DESC(130, "lcd_cld10", 1, 0x4, 20), 28962306a36Sopenharmony_ci CYGNUS_PIN_DESC(131, "lcd_cld11", 1, 0x4, 18), 29062306a36Sopenharmony_ci CYGNUS_PIN_DESC(132, "lcd_cld12", 1, 0x4, 16), 29162306a36Sopenharmony_ci CYGNUS_PIN_DESC(133, "lcd_cld13", 1, 0x4, 14), 29262306a36Sopenharmony_ci CYGNUS_PIN_DESC(134, "lcd_cld14", 1, 0x4, 12), 29362306a36Sopenharmony_ci CYGNUS_PIN_DESC(135, "lcd_cld15", 1, 0x4, 10), 29462306a36Sopenharmony_ci CYGNUS_PIN_DESC(136, "lcd_cld16", 1, 0x4, 8), 29562306a36Sopenharmony_ci CYGNUS_PIN_DESC(137, "lcd_cld17", 1, 0x4, 6), 29662306a36Sopenharmony_ci CYGNUS_PIN_DESC(138, "lcd_cld18", 1, 0x4, 4), 29762306a36Sopenharmony_ci CYGNUS_PIN_DESC(139, "lcd_cld19", 1, 0x4, 2), 29862306a36Sopenharmony_ci CYGNUS_PIN_DESC(140, "lcd_cld2", 1, 0x8, 22), 29962306a36Sopenharmony_ci CYGNUS_PIN_DESC(141, "lcd_cld20", 1, 0x8, 30), 30062306a36Sopenharmony_ci CYGNUS_PIN_DESC(142, "lcd_cld21", 1, 0x8, 28), 30162306a36Sopenharmony_ci CYGNUS_PIN_DESC(143, "lcd_cld22", 1, 0x8, 26), 30262306a36Sopenharmony_ci CYGNUS_PIN_DESC(144, "lcd_cld23", 1, 0x8, 24), 30362306a36Sopenharmony_ci CYGNUS_PIN_DESC(145, "lcd_cld3", 1, 0x8, 20), 30462306a36Sopenharmony_ci CYGNUS_PIN_DESC(146, "lcd_cld4", 1, 0x8, 18), 30562306a36Sopenharmony_ci CYGNUS_PIN_DESC(147, "lcd_cld5", 1, 0x8, 16), 30662306a36Sopenharmony_ci CYGNUS_PIN_DESC(148, "lcd_cld6", 1, 0x8, 14), 30762306a36Sopenharmony_ci CYGNUS_PIN_DESC(149, "lcd_cld7", 1, 0x8, 12), 30862306a36Sopenharmony_ci CYGNUS_PIN_DESC(150, "lcd_cld8", 1, 0x8, 10), 30962306a36Sopenharmony_ci CYGNUS_PIN_DESC(151, "lcd_cld9", 1, 0x8, 8), 31062306a36Sopenharmony_ci CYGNUS_PIN_DESC(152, "lcd_clfp", 1, 0x8, 6), 31162306a36Sopenharmony_ci CYGNUS_PIN_DESC(153, "lcd_clle", 1, 0x8, 4), 31262306a36Sopenharmony_ci CYGNUS_PIN_DESC(154, "lcd_cllp", 1, 0x8, 2), 31362306a36Sopenharmony_ci CYGNUS_PIN_DESC(155, "lcd_clpower", 1, 0x8, 0), 31462306a36Sopenharmony_ci CYGNUS_PIN_DESC(156, "camera_vsync", 1, 0x4, 30), 31562306a36Sopenharmony_ci CYGNUS_PIN_DESC(157, "camera_trigger", 1, 0x0, 0), 31662306a36Sopenharmony_ci CYGNUS_PIN_DESC(158, "camera_strobe", 1, 0x0, 2), 31762306a36Sopenharmony_ci CYGNUS_PIN_DESC(159, "camera_standby", 1, 0x0, 4), 31862306a36Sopenharmony_ci CYGNUS_PIN_DESC(160, "camera_reset_n", 1, 0x0, 6), 31962306a36Sopenharmony_ci CYGNUS_PIN_DESC(161, "camera_pixdata9", 1, 0x0, 8), 32062306a36Sopenharmony_ci CYGNUS_PIN_DESC(162, "camera_pixdata8", 1, 0x0, 10), 32162306a36Sopenharmony_ci CYGNUS_PIN_DESC(163, "camera_pixdata7", 1, 0x0, 12), 32262306a36Sopenharmony_ci CYGNUS_PIN_DESC(164, "camera_pixdata6", 1, 0x0, 14), 32362306a36Sopenharmony_ci CYGNUS_PIN_DESC(165, "camera_pixdata5", 1, 0x0, 16), 32462306a36Sopenharmony_ci CYGNUS_PIN_DESC(166, "camera_pixdata4", 1, 0x0, 18), 32562306a36Sopenharmony_ci CYGNUS_PIN_DESC(167, "camera_pixdata3", 1, 0x0, 20), 32662306a36Sopenharmony_ci CYGNUS_PIN_DESC(168, "camera_pixdata2", 1, 0x0, 22), 32762306a36Sopenharmony_ci CYGNUS_PIN_DESC(169, "camera_pixdata1", 1, 0x0, 24), 32862306a36Sopenharmony_ci CYGNUS_PIN_DESC(170, "camera_pixdata0", 1, 0x0, 26), 32962306a36Sopenharmony_ci CYGNUS_PIN_DESC(171, "camera_pixclk", 1, 0x0, 28), 33062306a36Sopenharmony_ci CYGNUS_PIN_DESC(172, "camera_hsync", 1, 0x0, 30), 33162306a36Sopenharmony_ci CYGNUS_PIN_DESC(173, "camera_pll_ref_clk", 0, 0, 0), 33262306a36Sopenharmony_ci CYGNUS_PIN_DESC(174, "usb_id_indication", 0, 0, 0), 33362306a36Sopenharmony_ci CYGNUS_PIN_DESC(175, "usb_vbus_indication", 0, 0, 0), 33462306a36Sopenharmony_ci CYGNUS_PIN_DESC(176, "gpio0_3p3", 0, 0, 0), 33562306a36Sopenharmony_ci CYGNUS_PIN_DESC(177, "gpio1_3p3", 0, 0, 0), 33662306a36Sopenharmony_ci CYGNUS_PIN_DESC(178, "gpio2_3p3", 0, 0, 0), 33762306a36Sopenharmony_ci CYGNUS_PIN_DESC(179, "gpio3_3p3", 0, 0, 0), 33862306a36Sopenharmony_ci}; 33962306a36Sopenharmony_ci 34062306a36Sopenharmony_ci/* 34162306a36Sopenharmony_ci * List of groups of pins 34262306a36Sopenharmony_ci */ 34362306a36Sopenharmony_cistatic const unsigned bsc1_pins[] = { 8, 9 }; 34462306a36Sopenharmony_cistatic const unsigned pcie_clkreq_pins[] = { 8, 9 }; 34562306a36Sopenharmony_ci 34662306a36Sopenharmony_cistatic const unsigned i2s2_0_pins[] = { 12 }; 34762306a36Sopenharmony_cistatic const unsigned i2s2_1_pins[] = { 13 }; 34862306a36Sopenharmony_cistatic const unsigned i2s2_2_pins[] = { 14 }; 34962306a36Sopenharmony_cistatic const unsigned i2s2_3_pins[] = { 15 }; 35062306a36Sopenharmony_cistatic const unsigned i2s2_4_pins[] = { 16 }; 35162306a36Sopenharmony_ci 35262306a36Sopenharmony_cistatic const unsigned pwm4_pins[] = { 17 }; 35362306a36Sopenharmony_cistatic const unsigned pwm5_pins[] = { 18 }; 35462306a36Sopenharmony_ci 35562306a36Sopenharmony_cistatic const unsigned key0_pins[] = { 20 }; 35662306a36Sopenharmony_cistatic const unsigned key1_pins[] = { 21 }; 35762306a36Sopenharmony_cistatic const unsigned key2_pins[] = { 22 }; 35862306a36Sopenharmony_cistatic const unsigned key3_pins[] = { 23 }; 35962306a36Sopenharmony_cistatic const unsigned key4_pins[] = { 24 }; 36062306a36Sopenharmony_cistatic const unsigned key5_pins[] = { 25 }; 36162306a36Sopenharmony_ci 36262306a36Sopenharmony_cistatic const unsigned key6_pins[] = { 26 }; 36362306a36Sopenharmony_cistatic const unsigned audio_dte0_pins[] = { 26 }; 36462306a36Sopenharmony_ci 36562306a36Sopenharmony_cistatic const unsigned key7_pins[] = { 27 }; 36662306a36Sopenharmony_cistatic const unsigned audio_dte1_pins[] = { 27 }; 36762306a36Sopenharmony_ci 36862306a36Sopenharmony_cistatic const unsigned key8_pins[] = { 28 }; 36962306a36Sopenharmony_cistatic const unsigned key9_pins[] = { 29 }; 37062306a36Sopenharmony_cistatic const unsigned key10_pins[] = { 30 }; 37162306a36Sopenharmony_cistatic const unsigned key11_pins[] = { 31 }; 37262306a36Sopenharmony_cistatic const unsigned key12_pins[] = { 32 }; 37362306a36Sopenharmony_cistatic const unsigned key13_pins[] = { 33 }; 37462306a36Sopenharmony_ci 37562306a36Sopenharmony_cistatic const unsigned key14_pins[] = { 34 }; 37662306a36Sopenharmony_cistatic const unsigned audio_dte2_pins[] = { 34 }; 37762306a36Sopenharmony_ci 37862306a36Sopenharmony_cistatic const unsigned key15_pins[] = { 35 }; 37962306a36Sopenharmony_cistatic const unsigned audio_dte3_pins[] = { 35 }; 38062306a36Sopenharmony_ci 38162306a36Sopenharmony_cistatic const unsigned pwm0_pins[] = { 38 }; 38262306a36Sopenharmony_cistatic const unsigned pwm1_pins[] = { 39 }; 38362306a36Sopenharmony_cistatic const unsigned pwm2_pins[] = { 40 }; 38462306a36Sopenharmony_cistatic const unsigned pwm3_pins[] = { 41 }; 38562306a36Sopenharmony_ci 38662306a36Sopenharmony_cistatic const unsigned sdio0_pins[] = { 94, 95, 96, 97, 98, 99 }; 38762306a36Sopenharmony_ci 38862306a36Sopenharmony_cistatic const unsigned smart_card0_pins[] = { 42, 43, 44, 46, 47 }; 38962306a36Sopenharmony_cistatic const unsigned i2s0_0_pins[] = { 42, 43, 44, 46 }; 39062306a36Sopenharmony_cistatic const unsigned spdif_pins[] = { 47 }; 39162306a36Sopenharmony_ci 39262306a36Sopenharmony_cistatic const unsigned smart_card1_pins[] = { 48, 49, 50, 52, 53 }; 39362306a36Sopenharmony_cistatic const unsigned i2s1_0_pins[] = { 48, 49, 50, 52 }; 39462306a36Sopenharmony_ci 39562306a36Sopenharmony_cistatic const unsigned spi0_pins[] = { 54, 55, 56, 57 }; 39662306a36Sopenharmony_ci 39762306a36Sopenharmony_cistatic const unsigned spi1_pins[] = { 58, 59, 60, 61 }; 39862306a36Sopenharmony_ci 39962306a36Sopenharmony_cistatic const unsigned spi2_pins[] = { 62, 63, 64, 65 }; 40062306a36Sopenharmony_ci 40162306a36Sopenharmony_cistatic const unsigned spi3_pins[] = { 66, 67, 68, 69 }; 40262306a36Sopenharmony_cistatic const unsigned sw_led0_0_pins[] = { 66, 67, 68, 69 }; 40362306a36Sopenharmony_ci 40462306a36Sopenharmony_cistatic const unsigned d1w_pins[] = { 10, 11 }; 40562306a36Sopenharmony_cistatic const unsigned uart4_pins[] = { 10, 11 }; 40662306a36Sopenharmony_cistatic const unsigned sw_led2_0_pins[] = { 10, 11 }; 40762306a36Sopenharmony_ci 40862306a36Sopenharmony_cistatic const unsigned lcd_pins[] = { 126, 127, 128, 129, 130, 131, 132, 133, 40962306a36Sopenharmony_ci 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 41062306a36Sopenharmony_ci 148, 149, 150, 151, 152, 153, 154, 155 }; 41162306a36Sopenharmony_cistatic const unsigned sram_0_pins[] = { 126, 127, 128, 129, 130, 131, 132, 133, 41262306a36Sopenharmony_ci 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 41362306a36Sopenharmony_ci 148, 149, 150, 151, 152, 153, 154, 155 }; 41462306a36Sopenharmony_cistatic const unsigned spi5_pins[] = { 141, 142, 143, 144 }; 41562306a36Sopenharmony_ci 41662306a36Sopenharmony_cistatic const unsigned uart0_pins[] = { 70, 71, 72, 73 }; 41762306a36Sopenharmony_cistatic const unsigned sw_led0_1_pins[] = { 70, 71, 72, 73 }; 41862306a36Sopenharmony_ci 41962306a36Sopenharmony_cistatic const unsigned uart1_dte_pins[] = { 75, 76, 77, 78 }; 42062306a36Sopenharmony_cistatic const unsigned uart2_pins[] = { 75, 76, 77, 78 }; 42162306a36Sopenharmony_ci 42262306a36Sopenharmony_cistatic const unsigned uart1_pins[] = { 74, 79, 80, 81 }; 42362306a36Sopenharmony_ci 42462306a36Sopenharmony_cistatic const unsigned uart3_pins[] = { 82, 83 }; 42562306a36Sopenharmony_ci 42662306a36Sopenharmony_cistatic const unsigned qspi_0_pins[] = { 104, 105, 106, 107 }; 42762306a36Sopenharmony_ci 42862306a36Sopenharmony_cistatic const unsigned nand_pins[] = { 110, 111, 112, 113, 114, 115, 116, 117, 42962306a36Sopenharmony_ci 118, 119, 120, 121, 122, 123, 124, 125 }; 43062306a36Sopenharmony_ci 43162306a36Sopenharmony_cistatic const unsigned sdio0_cd_pins[] = { 103 }; 43262306a36Sopenharmony_ci 43362306a36Sopenharmony_cistatic const unsigned sdio0_mmc_pins[] = { 100, 101, 102 }; 43462306a36Sopenharmony_ci 43562306a36Sopenharmony_cistatic const unsigned sdio1_data_0_pins[] = { 86, 87 }; 43662306a36Sopenharmony_cistatic const unsigned can0_pins[] = { 86, 87 }; 43762306a36Sopenharmony_cistatic const unsigned spi4_0_pins[] = { 86, 87 }; 43862306a36Sopenharmony_ci 43962306a36Sopenharmony_cistatic const unsigned sdio1_data_1_pins[] = { 88, 89 }; 44062306a36Sopenharmony_cistatic const unsigned can1_pins[] = { 88, 89 }; 44162306a36Sopenharmony_cistatic const unsigned spi4_1_pins[] = { 88, 89 }; 44262306a36Sopenharmony_ci 44362306a36Sopenharmony_cistatic const unsigned sdio1_cd_pins[] = { 93 }; 44462306a36Sopenharmony_ci 44562306a36Sopenharmony_cistatic const unsigned sdio1_led_pins[] = { 84, 85 }; 44662306a36Sopenharmony_cistatic const unsigned sw_led2_1_pins[] = { 84, 85 }; 44762306a36Sopenharmony_ci 44862306a36Sopenharmony_cistatic const unsigned sdio1_mmc_pins[] = { 90, 91, 92 }; 44962306a36Sopenharmony_ci 45062306a36Sopenharmony_cistatic const unsigned cam_led_pins[] = { 156, 157, 158, 159, 160 }; 45162306a36Sopenharmony_cistatic const unsigned sw_led1_pins[] = { 156, 157, 158, 159 }; 45262306a36Sopenharmony_ci 45362306a36Sopenharmony_cistatic const unsigned cam_0_pins[] = { 169, 170, 171, 169, 170 }; 45462306a36Sopenharmony_ci 45562306a36Sopenharmony_cistatic const unsigned cam_1_pins[] = { 161, 162, 163, 164, 165, 166, 167, 45662306a36Sopenharmony_ci 168 }; 45762306a36Sopenharmony_cistatic const unsigned sram_1_pins[] = { 161, 162, 163, 164, 165, 166, 167, 45862306a36Sopenharmony_ci 168 }; 45962306a36Sopenharmony_ci 46062306a36Sopenharmony_cistatic const unsigned qspi_1_pins[] = { 108, 109 }; 46162306a36Sopenharmony_ci 46262306a36Sopenharmony_cistatic const unsigned smart_card0_fcb_pins[] = { 45 }; 46362306a36Sopenharmony_cistatic const unsigned i2s0_1_pins[] = { 45 }; 46462306a36Sopenharmony_ci 46562306a36Sopenharmony_cistatic const unsigned smart_card1_fcb_pins[] = { 51 }; 46662306a36Sopenharmony_cistatic const unsigned i2s1_1_pins[] = { 51 }; 46762306a36Sopenharmony_ci 46862306a36Sopenharmony_cistatic const unsigned gpio0_3p3_pins[] = { 176 }; 46962306a36Sopenharmony_cistatic const unsigned usb0_oc_pins[] = { 176 }; 47062306a36Sopenharmony_ci 47162306a36Sopenharmony_cistatic const unsigned gpio1_3p3_pins[] = { 177 }; 47262306a36Sopenharmony_cistatic const unsigned usb1_oc_pins[] = { 177 }; 47362306a36Sopenharmony_ci 47462306a36Sopenharmony_cistatic const unsigned gpio2_3p3_pins[] = { 178 }; 47562306a36Sopenharmony_cistatic const unsigned usb2_oc_pins[] = { 178 }; 47662306a36Sopenharmony_ci 47762306a36Sopenharmony_ci#define CYGNUS_PIN_GROUP(group_name, off, sh, al) \ 47862306a36Sopenharmony_ci{ \ 47962306a36Sopenharmony_ci .name = __stringify(group_name) "_grp", \ 48062306a36Sopenharmony_ci .pins = group_name ## _pins, \ 48162306a36Sopenharmony_ci .num_pins = ARRAY_SIZE(group_name ## _pins), \ 48262306a36Sopenharmony_ci .mux = { \ 48362306a36Sopenharmony_ci .offset = off, \ 48462306a36Sopenharmony_ci .shift = sh, \ 48562306a36Sopenharmony_ci .alt = al, \ 48662306a36Sopenharmony_ci } \ 48762306a36Sopenharmony_ci} 48862306a36Sopenharmony_ci 48962306a36Sopenharmony_ci/* 49062306a36Sopenharmony_ci * List of Cygnus pin groups 49162306a36Sopenharmony_ci */ 49262306a36Sopenharmony_cistatic const struct cygnus_pin_group cygnus_pin_groups[] = { 49362306a36Sopenharmony_ci CYGNUS_PIN_GROUP(i2s2_0, 0x0, 0, 2), 49462306a36Sopenharmony_ci CYGNUS_PIN_GROUP(i2s2_1, 0x0, 4, 2), 49562306a36Sopenharmony_ci CYGNUS_PIN_GROUP(i2s2_2, 0x0, 8, 2), 49662306a36Sopenharmony_ci CYGNUS_PIN_GROUP(i2s2_3, 0x0, 12, 2), 49762306a36Sopenharmony_ci CYGNUS_PIN_GROUP(i2s2_4, 0x0, 16, 2), 49862306a36Sopenharmony_ci CYGNUS_PIN_GROUP(pwm4, 0x0, 20, 0), 49962306a36Sopenharmony_ci CYGNUS_PIN_GROUP(pwm5, 0x0, 24, 2), 50062306a36Sopenharmony_ci CYGNUS_PIN_GROUP(key0, 0x4, 0, 1), 50162306a36Sopenharmony_ci CYGNUS_PIN_GROUP(key1, 0x4, 4, 1), 50262306a36Sopenharmony_ci CYGNUS_PIN_GROUP(key2, 0x4, 8, 1), 50362306a36Sopenharmony_ci CYGNUS_PIN_GROUP(key3, 0x4, 12, 1), 50462306a36Sopenharmony_ci CYGNUS_PIN_GROUP(key4, 0x4, 16, 1), 50562306a36Sopenharmony_ci CYGNUS_PIN_GROUP(key5, 0x4, 20, 1), 50662306a36Sopenharmony_ci CYGNUS_PIN_GROUP(key6, 0x4, 24, 1), 50762306a36Sopenharmony_ci CYGNUS_PIN_GROUP(audio_dte0, 0x4, 24, 2), 50862306a36Sopenharmony_ci CYGNUS_PIN_GROUP(key7, 0x4, 28, 1), 50962306a36Sopenharmony_ci CYGNUS_PIN_GROUP(audio_dte1, 0x4, 28, 2), 51062306a36Sopenharmony_ci CYGNUS_PIN_GROUP(key8, 0x8, 0, 1), 51162306a36Sopenharmony_ci CYGNUS_PIN_GROUP(key9, 0x8, 4, 1), 51262306a36Sopenharmony_ci CYGNUS_PIN_GROUP(key10, 0x8, 8, 1), 51362306a36Sopenharmony_ci CYGNUS_PIN_GROUP(key11, 0x8, 12, 1), 51462306a36Sopenharmony_ci CYGNUS_PIN_GROUP(key12, 0x8, 16, 1), 51562306a36Sopenharmony_ci CYGNUS_PIN_GROUP(key13, 0x8, 20, 1), 51662306a36Sopenharmony_ci CYGNUS_PIN_GROUP(key14, 0x8, 24, 1), 51762306a36Sopenharmony_ci CYGNUS_PIN_GROUP(audio_dte2, 0x8, 24, 2), 51862306a36Sopenharmony_ci CYGNUS_PIN_GROUP(key15, 0x8, 28, 1), 51962306a36Sopenharmony_ci CYGNUS_PIN_GROUP(audio_dte3, 0x8, 28, 2), 52062306a36Sopenharmony_ci CYGNUS_PIN_GROUP(pwm0, 0xc, 0, 0), 52162306a36Sopenharmony_ci CYGNUS_PIN_GROUP(pwm1, 0xc, 4, 0), 52262306a36Sopenharmony_ci CYGNUS_PIN_GROUP(pwm2, 0xc, 8, 0), 52362306a36Sopenharmony_ci CYGNUS_PIN_GROUP(pwm3, 0xc, 12, 0), 52462306a36Sopenharmony_ci CYGNUS_PIN_GROUP(sdio0, 0xc, 16, 0), 52562306a36Sopenharmony_ci CYGNUS_PIN_GROUP(smart_card0, 0xc, 20, 0), 52662306a36Sopenharmony_ci CYGNUS_PIN_GROUP(i2s0_0, 0xc, 20, 1), 52762306a36Sopenharmony_ci CYGNUS_PIN_GROUP(spdif, 0xc, 20, 1), 52862306a36Sopenharmony_ci CYGNUS_PIN_GROUP(smart_card1, 0xc, 24, 0), 52962306a36Sopenharmony_ci CYGNUS_PIN_GROUP(i2s1_0, 0xc, 24, 1), 53062306a36Sopenharmony_ci CYGNUS_PIN_GROUP(spi0, 0x10, 0, 0), 53162306a36Sopenharmony_ci CYGNUS_PIN_GROUP(spi1, 0x10, 4, 0), 53262306a36Sopenharmony_ci CYGNUS_PIN_GROUP(spi2, 0x10, 8, 0), 53362306a36Sopenharmony_ci CYGNUS_PIN_GROUP(spi3, 0x10, 12, 0), 53462306a36Sopenharmony_ci CYGNUS_PIN_GROUP(sw_led0_0, 0x10, 12, 2), 53562306a36Sopenharmony_ci CYGNUS_PIN_GROUP(d1w, 0x10, 16, 0), 53662306a36Sopenharmony_ci CYGNUS_PIN_GROUP(uart4, 0x10, 16, 1), 53762306a36Sopenharmony_ci CYGNUS_PIN_GROUP(sw_led2_0, 0x10, 16, 2), 53862306a36Sopenharmony_ci CYGNUS_PIN_GROUP(lcd, 0x10, 20, 0), 53962306a36Sopenharmony_ci CYGNUS_PIN_GROUP(sram_0, 0x10, 20, 1), 54062306a36Sopenharmony_ci CYGNUS_PIN_GROUP(spi5, 0x10, 20, 2), 54162306a36Sopenharmony_ci CYGNUS_PIN_GROUP(uart0, 0x14, 0, 0), 54262306a36Sopenharmony_ci CYGNUS_PIN_GROUP(sw_led0_1, 0x14, 0, 2), 54362306a36Sopenharmony_ci CYGNUS_PIN_GROUP(uart1_dte, 0x14, 4, 0), 54462306a36Sopenharmony_ci CYGNUS_PIN_GROUP(uart2, 0x14, 4, 1), 54562306a36Sopenharmony_ci CYGNUS_PIN_GROUP(uart1, 0x14, 8, 0), 54662306a36Sopenharmony_ci CYGNUS_PIN_GROUP(uart3, 0x14, 12, 0), 54762306a36Sopenharmony_ci CYGNUS_PIN_GROUP(qspi_0, 0x14, 16, 0), 54862306a36Sopenharmony_ci CYGNUS_PIN_GROUP(nand, 0x14, 20, 0), 54962306a36Sopenharmony_ci CYGNUS_PIN_GROUP(sdio0_cd, 0x18, 0, 0), 55062306a36Sopenharmony_ci CYGNUS_PIN_GROUP(sdio0_mmc, 0x18, 4, 0), 55162306a36Sopenharmony_ci CYGNUS_PIN_GROUP(sdio1_data_0, 0x18, 8, 0), 55262306a36Sopenharmony_ci CYGNUS_PIN_GROUP(can0, 0x18, 8, 1), 55362306a36Sopenharmony_ci CYGNUS_PIN_GROUP(spi4_0, 0x18, 8, 2), 55462306a36Sopenharmony_ci CYGNUS_PIN_GROUP(sdio1_data_1, 0x18, 12, 0), 55562306a36Sopenharmony_ci CYGNUS_PIN_GROUP(can1, 0x18, 12, 1), 55662306a36Sopenharmony_ci CYGNUS_PIN_GROUP(spi4_1, 0x18, 12, 2), 55762306a36Sopenharmony_ci CYGNUS_PIN_GROUP(sdio1_cd, 0x18, 16, 0), 55862306a36Sopenharmony_ci CYGNUS_PIN_GROUP(sdio1_led, 0x18, 20, 0), 55962306a36Sopenharmony_ci CYGNUS_PIN_GROUP(sw_led2_1, 0x18, 20, 2), 56062306a36Sopenharmony_ci CYGNUS_PIN_GROUP(sdio1_mmc, 0x18, 24, 0), 56162306a36Sopenharmony_ci CYGNUS_PIN_GROUP(cam_led, 0x1c, 0, 0), 56262306a36Sopenharmony_ci CYGNUS_PIN_GROUP(sw_led1, 0x1c, 0, 1), 56362306a36Sopenharmony_ci CYGNUS_PIN_GROUP(cam_0, 0x1c, 4, 0), 56462306a36Sopenharmony_ci CYGNUS_PIN_GROUP(cam_1, 0x1c, 8, 0), 56562306a36Sopenharmony_ci CYGNUS_PIN_GROUP(sram_1, 0x1c, 8, 1), 56662306a36Sopenharmony_ci CYGNUS_PIN_GROUP(qspi_1, 0x1c, 12, 0), 56762306a36Sopenharmony_ci CYGNUS_PIN_GROUP(bsc1, 0x1c, 16, 0), 56862306a36Sopenharmony_ci CYGNUS_PIN_GROUP(pcie_clkreq, 0x1c, 16, 1), 56962306a36Sopenharmony_ci CYGNUS_PIN_GROUP(smart_card0_fcb, 0x20, 0, 0), 57062306a36Sopenharmony_ci CYGNUS_PIN_GROUP(i2s0_1, 0x20, 0, 1), 57162306a36Sopenharmony_ci CYGNUS_PIN_GROUP(smart_card1_fcb, 0x20, 4, 0), 57262306a36Sopenharmony_ci CYGNUS_PIN_GROUP(i2s1_1, 0x20, 4, 1), 57362306a36Sopenharmony_ci CYGNUS_PIN_GROUP(gpio0_3p3, 0x28, 0, 0), 57462306a36Sopenharmony_ci CYGNUS_PIN_GROUP(usb0_oc, 0x28, 0, 1), 57562306a36Sopenharmony_ci CYGNUS_PIN_GROUP(gpio1_3p3, 0x28, 4, 0), 57662306a36Sopenharmony_ci CYGNUS_PIN_GROUP(usb1_oc, 0x28, 4, 1), 57762306a36Sopenharmony_ci CYGNUS_PIN_GROUP(gpio2_3p3, 0x28, 8, 0), 57862306a36Sopenharmony_ci CYGNUS_PIN_GROUP(usb2_oc, 0x28, 8, 1), 57962306a36Sopenharmony_ci}; 58062306a36Sopenharmony_ci 58162306a36Sopenharmony_ci/* 58262306a36Sopenharmony_ci * List of groups supported by functions 58362306a36Sopenharmony_ci */ 58462306a36Sopenharmony_cistatic const char * const i2s0_grps[] = { "i2s0_0_grp", "i2s0_1_grp" }; 58562306a36Sopenharmony_cistatic const char * const i2s1_grps[] = { "i2s1_0_grp", "i2s1_1_grp" }; 58662306a36Sopenharmony_cistatic const char * const i2s2_grps[] = { "i2s2_0_grp", "i2s2_1_grp", 58762306a36Sopenharmony_ci "i2s2_2_grp", "i2s2_3_grp", "i2s2_4_grp" }; 58862306a36Sopenharmony_cistatic const char * const spdif_grps[] = { "spdif_grp" }; 58962306a36Sopenharmony_cistatic const char * const pwm0_grps[] = { "pwm0_grp" }; 59062306a36Sopenharmony_cistatic const char * const pwm1_grps[] = { "pwm1_grp" }; 59162306a36Sopenharmony_cistatic const char * const pwm2_grps[] = { "pwm2_grp" }; 59262306a36Sopenharmony_cistatic const char * const pwm3_grps[] = { "pwm3_grp" }; 59362306a36Sopenharmony_cistatic const char * const pwm4_grps[] = { "pwm4_grp" }; 59462306a36Sopenharmony_cistatic const char * const pwm5_grps[] = { "pwm5_grp" }; 59562306a36Sopenharmony_cistatic const char * const key_grps[] = { "key0_grp", "key1_grp", "key2_grp", 59662306a36Sopenharmony_ci "key3_grp", "key4_grp", "key5_grp", "key6_grp", "key7_grp", "key8_grp", 59762306a36Sopenharmony_ci "key9_grp", "key10_grp", "key11_grp", "key12_grp", "key13_grp", 59862306a36Sopenharmony_ci "key14_grp", "key15_grp" }; 59962306a36Sopenharmony_cistatic const char * const audio_dte_grps[] = { "audio_dte0_grp", 60062306a36Sopenharmony_ci "audio_dte1_grp", "audio_dte2_grp", "audio_dte3_grp" }; 60162306a36Sopenharmony_cistatic const char * const smart_card0_grps[] = { "smart_card0_grp", 60262306a36Sopenharmony_ci "smart_card0_fcb_grp" }; 60362306a36Sopenharmony_cistatic const char * const smart_card1_grps[] = { "smart_card1_grp", 60462306a36Sopenharmony_ci "smart_card1_fcb_grp" }; 60562306a36Sopenharmony_cistatic const char * const spi0_grps[] = { "spi0_grp" }; 60662306a36Sopenharmony_cistatic const char * const spi1_grps[] = { "spi1_grp" }; 60762306a36Sopenharmony_cistatic const char * const spi2_grps[] = { "spi2_grp" }; 60862306a36Sopenharmony_cistatic const char * const spi3_grps[] = { "spi3_grp" }; 60962306a36Sopenharmony_cistatic const char * const spi4_grps[] = { "spi4_0_grp", "spi4_1_grp" }; 61062306a36Sopenharmony_cistatic const char * const spi5_grps[] = { "spi5_grp" }; 61162306a36Sopenharmony_ci 61262306a36Sopenharmony_cistatic const char * const sw_led0_grps[] = { "sw_led0_0_grp", 61362306a36Sopenharmony_ci "sw_led0_1_grp" }; 61462306a36Sopenharmony_cistatic const char * const sw_led1_grps[] = { "sw_led1_grp" }; 61562306a36Sopenharmony_cistatic const char * const sw_led2_grps[] = { "sw_led2_0_grp", 61662306a36Sopenharmony_ci "sw_led2_1_grp" }; 61762306a36Sopenharmony_cistatic const char * const d1w_grps[] = { "d1w_grp" }; 61862306a36Sopenharmony_cistatic const char * const lcd_grps[] = { "lcd_grp" }; 61962306a36Sopenharmony_cistatic const char * const sram_grps[] = { "sram_0_grp", "sram_1_grp" }; 62062306a36Sopenharmony_ci 62162306a36Sopenharmony_cistatic const char * const uart0_grps[] = { "uart0_grp" }; 62262306a36Sopenharmony_cistatic const char * const uart1_grps[] = { "uart1_grp", "uart1_dte_grp" }; 62362306a36Sopenharmony_cistatic const char * const uart2_grps[] = { "uart2_grp" }; 62462306a36Sopenharmony_cistatic const char * const uart3_grps[] = { "uart3_grp" }; 62562306a36Sopenharmony_cistatic const char * const uart4_grps[] = { "uart4_grp" }; 62662306a36Sopenharmony_cistatic const char * const qspi_grps[] = { "qspi_0_grp", "qspi_1_grp" }; 62762306a36Sopenharmony_cistatic const char * const nand_grps[] = { "nand_grp" }; 62862306a36Sopenharmony_cistatic const char * const sdio0_grps[] = { "sdio0_grp", "sdio0_cd_grp", 62962306a36Sopenharmony_ci "sdio0_mmc_grp" }; 63062306a36Sopenharmony_cistatic const char * const sdio1_grps[] = { "sdio1_data_0_grp", 63162306a36Sopenharmony_ci "sdio1_data_1_grp", "sdio1_cd_grp", "sdio1_led_grp", "sdio1_mmc_grp" }; 63262306a36Sopenharmony_cistatic const char * const can0_grps[] = { "can0_grp" }; 63362306a36Sopenharmony_cistatic const char * const can1_grps[] = { "can1_grp" }; 63462306a36Sopenharmony_cistatic const char * const cam_grps[] = { "cam_led_grp", "cam_0_grp", 63562306a36Sopenharmony_ci "cam_1_grp" }; 63662306a36Sopenharmony_cistatic const char * const bsc1_grps[] = { "bsc1_grp" }; 63762306a36Sopenharmony_cistatic const char * const pcie_clkreq_grps[] = { "pcie_clkreq_grp" }; 63862306a36Sopenharmony_cistatic const char * const usb0_oc_grps[] = { "usb0_oc_grp" }; 63962306a36Sopenharmony_cistatic const char * const usb1_oc_grps[] = { "usb1_oc_grp" }; 64062306a36Sopenharmony_cistatic const char * const usb2_oc_grps[] = { "usb2_oc_grp" }; 64162306a36Sopenharmony_ci 64262306a36Sopenharmony_ci#define CYGNUS_PIN_FUNCTION(func) \ 64362306a36Sopenharmony_ci{ \ 64462306a36Sopenharmony_ci .name = #func, \ 64562306a36Sopenharmony_ci .groups = func ## _grps, \ 64662306a36Sopenharmony_ci .num_groups = ARRAY_SIZE(func ## _grps), \ 64762306a36Sopenharmony_ci} 64862306a36Sopenharmony_ci 64962306a36Sopenharmony_ci/* 65062306a36Sopenharmony_ci * List of supported functions in Cygnus 65162306a36Sopenharmony_ci */ 65262306a36Sopenharmony_cistatic const struct cygnus_pin_function cygnus_pin_functions[] = { 65362306a36Sopenharmony_ci CYGNUS_PIN_FUNCTION(i2s0), 65462306a36Sopenharmony_ci CYGNUS_PIN_FUNCTION(i2s1), 65562306a36Sopenharmony_ci CYGNUS_PIN_FUNCTION(i2s2), 65662306a36Sopenharmony_ci CYGNUS_PIN_FUNCTION(spdif), 65762306a36Sopenharmony_ci CYGNUS_PIN_FUNCTION(pwm0), 65862306a36Sopenharmony_ci CYGNUS_PIN_FUNCTION(pwm1), 65962306a36Sopenharmony_ci CYGNUS_PIN_FUNCTION(pwm2), 66062306a36Sopenharmony_ci CYGNUS_PIN_FUNCTION(pwm3), 66162306a36Sopenharmony_ci CYGNUS_PIN_FUNCTION(pwm4), 66262306a36Sopenharmony_ci CYGNUS_PIN_FUNCTION(pwm5), 66362306a36Sopenharmony_ci CYGNUS_PIN_FUNCTION(key), 66462306a36Sopenharmony_ci CYGNUS_PIN_FUNCTION(audio_dte), 66562306a36Sopenharmony_ci CYGNUS_PIN_FUNCTION(smart_card0), 66662306a36Sopenharmony_ci CYGNUS_PIN_FUNCTION(smart_card1), 66762306a36Sopenharmony_ci CYGNUS_PIN_FUNCTION(spi0), 66862306a36Sopenharmony_ci CYGNUS_PIN_FUNCTION(spi1), 66962306a36Sopenharmony_ci CYGNUS_PIN_FUNCTION(spi2), 67062306a36Sopenharmony_ci CYGNUS_PIN_FUNCTION(spi3), 67162306a36Sopenharmony_ci CYGNUS_PIN_FUNCTION(spi4), 67262306a36Sopenharmony_ci CYGNUS_PIN_FUNCTION(spi5), 67362306a36Sopenharmony_ci CYGNUS_PIN_FUNCTION(sw_led0), 67462306a36Sopenharmony_ci CYGNUS_PIN_FUNCTION(sw_led1), 67562306a36Sopenharmony_ci CYGNUS_PIN_FUNCTION(sw_led2), 67662306a36Sopenharmony_ci CYGNUS_PIN_FUNCTION(d1w), 67762306a36Sopenharmony_ci CYGNUS_PIN_FUNCTION(lcd), 67862306a36Sopenharmony_ci CYGNUS_PIN_FUNCTION(sram), 67962306a36Sopenharmony_ci CYGNUS_PIN_FUNCTION(uart0), 68062306a36Sopenharmony_ci CYGNUS_PIN_FUNCTION(uart1), 68162306a36Sopenharmony_ci CYGNUS_PIN_FUNCTION(uart2), 68262306a36Sopenharmony_ci CYGNUS_PIN_FUNCTION(uart3), 68362306a36Sopenharmony_ci CYGNUS_PIN_FUNCTION(uart4), 68462306a36Sopenharmony_ci CYGNUS_PIN_FUNCTION(qspi), 68562306a36Sopenharmony_ci CYGNUS_PIN_FUNCTION(nand), 68662306a36Sopenharmony_ci CYGNUS_PIN_FUNCTION(sdio0), 68762306a36Sopenharmony_ci CYGNUS_PIN_FUNCTION(sdio1), 68862306a36Sopenharmony_ci CYGNUS_PIN_FUNCTION(can0), 68962306a36Sopenharmony_ci CYGNUS_PIN_FUNCTION(can1), 69062306a36Sopenharmony_ci CYGNUS_PIN_FUNCTION(cam), 69162306a36Sopenharmony_ci CYGNUS_PIN_FUNCTION(bsc1), 69262306a36Sopenharmony_ci CYGNUS_PIN_FUNCTION(pcie_clkreq), 69362306a36Sopenharmony_ci CYGNUS_PIN_FUNCTION(usb0_oc), 69462306a36Sopenharmony_ci CYGNUS_PIN_FUNCTION(usb1_oc), 69562306a36Sopenharmony_ci CYGNUS_PIN_FUNCTION(usb2_oc), 69662306a36Sopenharmony_ci}; 69762306a36Sopenharmony_ci 69862306a36Sopenharmony_cistatic int cygnus_get_groups_count(struct pinctrl_dev *pctrl_dev) 69962306a36Sopenharmony_ci{ 70062306a36Sopenharmony_ci struct cygnus_pinctrl *pinctrl = pinctrl_dev_get_drvdata(pctrl_dev); 70162306a36Sopenharmony_ci 70262306a36Sopenharmony_ci return pinctrl->num_groups; 70362306a36Sopenharmony_ci} 70462306a36Sopenharmony_ci 70562306a36Sopenharmony_cistatic const char *cygnus_get_group_name(struct pinctrl_dev *pctrl_dev, 70662306a36Sopenharmony_ci unsigned selector) 70762306a36Sopenharmony_ci{ 70862306a36Sopenharmony_ci struct cygnus_pinctrl *pinctrl = pinctrl_dev_get_drvdata(pctrl_dev); 70962306a36Sopenharmony_ci 71062306a36Sopenharmony_ci return pinctrl->groups[selector].name; 71162306a36Sopenharmony_ci} 71262306a36Sopenharmony_ci 71362306a36Sopenharmony_cistatic int cygnus_get_group_pins(struct pinctrl_dev *pctrl_dev, 71462306a36Sopenharmony_ci unsigned selector, const unsigned **pins, 71562306a36Sopenharmony_ci unsigned *num_pins) 71662306a36Sopenharmony_ci{ 71762306a36Sopenharmony_ci struct cygnus_pinctrl *pinctrl = pinctrl_dev_get_drvdata(pctrl_dev); 71862306a36Sopenharmony_ci 71962306a36Sopenharmony_ci *pins = pinctrl->groups[selector].pins; 72062306a36Sopenharmony_ci *num_pins = pinctrl->groups[selector].num_pins; 72162306a36Sopenharmony_ci 72262306a36Sopenharmony_ci return 0; 72362306a36Sopenharmony_ci} 72462306a36Sopenharmony_ci 72562306a36Sopenharmony_cistatic void cygnus_pin_dbg_show(struct pinctrl_dev *pctrl_dev, 72662306a36Sopenharmony_ci struct seq_file *s, unsigned offset) 72762306a36Sopenharmony_ci{ 72862306a36Sopenharmony_ci seq_printf(s, " %s", dev_name(pctrl_dev->dev)); 72962306a36Sopenharmony_ci} 73062306a36Sopenharmony_ci 73162306a36Sopenharmony_cistatic const struct pinctrl_ops cygnus_pinctrl_ops = { 73262306a36Sopenharmony_ci .get_groups_count = cygnus_get_groups_count, 73362306a36Sopenharmony_ci .get_group_name = cygnus_get_group_name, 73462306a36Sopenharmony_ci .get_group_pins = cygnus_get_group_pins, 73562306a36Sopenharmony_ci .pin_dbg_show = cygnus_pin_dbg_show, 73662306a36Sopenharmony_ci .dt_node_to_map = pinconf_generic_dt_node_to_map_group, 73762306a36Sopenharmony_ci .dt_free_map = pinctrl_utils_free_map, 73862306a36Sopenharmony_ci}; 73962306a36Sopenharmony_ci 74062306a36Sopenharmony_cistatic int cygnus_get_functions_count(struct pinctrl_dev *pctrl_dev) 74162306a36Sopenharmony_ci{ 74262306a36Sopenharmony_ci struct cygnus_pinctrl *pinctrl = pinctrl_dev_get_drvdata(pctrl_dev); 74362306a36Sopenharmony_ci 74462306a36Sopenharmony_ci return pinctrl->num_functions; 74562306a36Sopenharmony_ci} 74662306a36Sopenharmony_ci 74762306a36Sopenharmony_cistatic const char *cygnus_get_function_name(struct pinctrl_dev *pctrl_dev, 74862306a36Sopenharmony_ci unsigned selector) 74962306a36Sopenharmony_ci{ 75062306a36Sopenharmony_ci struct cygnus_pinctrl *pinctrl = pinctrl_dev_get_drvdata(pctrl_dev); 75162306a36Sopenharmony_ci 75262306a36Sopenharmony_ci return pinctrl->functions[selector].name; 75362306a36Sopenharmony_ci} 75462306a36Sopenharmony_ci 75562306a36Sopenharmony_cistatic int cygnus_get_function_groups(struct pinctrl_dev *pctrl_dev, 75662306a36Sopenharmony_ci unsigned selector, 75762306a36Sopenharmony_ci const char * const **groups, 75862306a36Sopenharmony_ci unsigned * const num_groups) 75962306a36Sopenharmony_ci{ 76062306a36Sopenharmony_ci struct cygnus_pinctrl *pinctrl = pinctrl_dev_get_drvdata(pctrl_dev); 76162306a36Sopenharmony_ci 76262306a36Sopenharmony_ci *groups = pinctrl->functions[selector].groups; 76362306a36Sopenharmony_ci *num_groups = pinctrl->functions[selector].num_groups; 76462306a36Sopenharmony_ci 76562306a36Sopenharmony_ci return 0; 76662306a36Sopenharmony_ci} 76762306a36Sopenharmony_ci 76862306a36Sopenharmony_cistatic int cygnus_pinmux_set(struct cygnus_pinctrl *pinctrl, 76962306a36Sopenharmony_ci const struct cygnus_pin_function *func, 77062306a36Sopenharmony_ci const struct cygnus_pin_group *grp, 77162306a36Sopenharmony_ci struct cygnus_mux_log *mux_log) 77262306a36Sopenharmony_ci{ 77362306a36Sopenharmony_ci const struct cygnus_mux *mux = &grp->mux; 77462306a36Sopenharmony_ci int i; 77562306a36Sopenharmony_ci u32 val, mask = 0x7; 77662306a36Sopenharmony_ci unsigned long flags; 77762306a36Sopenharmony_ci 77862306a36Sopenharmony_ci for (i = 0; i < CYGNUS_NUM_IOMUX; i++) { 77962306a36Sopenharmony_ci if (mux->offset != mux_log[i].mux.offset || 78062306a36Sopenharmony_ci mux->shift != mux_log[i].mux.shift) 78162306a36Sopenharmony_ci continue; 78262306a36Sopenharmony_ci 78362306a36Sopenharmony_ci /* match found if we reach here */ 78462306a36Sopenharmony_ci 78562306a36Sopenharmony_ci /* if this is a new configuration, just do it! */ 78662306a36Sopenharmony_ci if (!mux_log[i].is_configured) 78762306a36Sopenharmony_ci break; 78862306a36Sopenharmony_ci 78962306a36Sopenharmony_ci /* 79062306a36Sopenharmony_ci * IOMUX has been configured previously and one is trying to 79162306a36Sopenharmony_ci * configure it to a different function 79262306a36Sopenharmony_ci */ 79362306a36Sopenharmony_ci if (mux_log[i].mux.alt != mux->alt) { 79462306a36Sopenharmony_ci dev_err(pinctrl->dev, 79562306a36Sopenharmony_ci "double configuration error detected!\n"); 79662306a36Sopenharmony_ci dev_err(pinctrl->dev, "func:%s grp:%s\n", 79762306a36Sopenharmony_ci func->name, grp->name); 79862306a36Sopenharmony_ci return -EINVAL; 79962306a36Sopenharmony_ci } else { 80062306a36Sopenharmony_ci /* 80162306a36Sopenharmony_ci * One tries to configure it to the same function. 80262306a36Sopenharmony_ci * Just quit and don't bother 80362306a36Sopenharmony_ci */ 80462306a36Sopenharmony_ci return 0; 80562306a36Sopenharmony_ci } 80662306a36Sopenharmony_ci } 80762306a36Sopenharmony_ci 80862306a36Sopenharmony_ci mux_log[i].mux.alt = mux->alt; 80962306a36Sopenharmony_ci mux_log[i].is_configured = true; 81062306a36Sopenharmony_ci 81162306a36Sopenharmony_ci spin_lock_irqsave(&pinctrl->lock, flags); 81262306a36Sopenharmony_ci 81362306a36Sopenharmony_ci val = readl(pinctrl->base0 + grp->mux.offset); 81462306a36Sopenharmony_ci val &= ~(mask << grp->mux.shift); 81562306a36Sopenharmony_ci val |= grp->mux.alt << grp->mux.shift; 81662306a36Sopenharmony_ci writel(val, pinctrl->base0 + grp->mux.offset); 81762306a36Sopenharmony_ci 81862306a36Sopenharmony_ci spin_unlock_irqrestore(&pinctrl->lock, flags); 81962306a36Sopenharmony_ci 82062306a36Sopenharmony_ci return 0; 82162306a36Sopenharmony_ci} 82262306a36Sopenharmony_ci 82362306a36Sopenharmony_cistatic int cygnus_pinmux_set_mux(struct pinctrl_dev *pctrl_dev, 82462306a36Sopenharmony_ci unsigned func_select, unsigned grp_select) 82562306a36Sopenharmony_ci{ 82662306a36Sopenharmony_ci struct cygnus_pinctrl *pinctrl = pinctrl_dev_get_drvdata(pctrl_dev); 82762306a36Sopenharmony_ci const struct cygnus_pin_function *func = 82862306a36Sopenharmony_ci &pinctrl->functions[func_select]; 82962306a36Sopenharmony_ci const struct cygnus_pin_group *grp = &pinctrl->groups[grp_select]; 83062306a36Sopenharmony_ci 83162306a36Sopenharmony_ci dev_dbg(pctrl_dev->dev, "func:%u name:%s grp:%u name:%s\n", 83262306a36Sopenharmony_ci func_select, func->name, grp_select, grp->name); 83362306a36Sopenharmony_ci 83462306a36Sopenharmony_ci dev_dbg(pctrl_dev->dev, "offset:0x%08x shift:%u alt:%u\n", 83562306a36Sopenharmony_ci grp->mux.offset, grp->mux.shift, grp->mux.alt); 83662306a36Sopenharmony_ci 83762306a36Sopenharmony_ci return cygnus_pinmux_set(pinctrl, func, grp, pinctrl->mux_log); 83862306a36Sopenharmony_ci} 83962306a36Sopenharmony_ci 84062306a36Sopenharmony_cistatic int cygnus_gpio_request_enable(struct pinctrl_dev *pctrl_dev, 84162306a36Sopenharmony_ci struct pinctrl_gpio_range *range, 84262306a36Sopenharmony_ci unsigned pin) 84362306a36Sopenharmony_ci{ 84462306a36Sopenharmony_ci struct cygnus_pinctrl *pinctrl = pinctrl_dev_get_drvdata(pctrl_dev); 84562306a36Sopenharmony_ci const struct cygnus_gpio_mux *mux = pctrl_dev->desc->pins[pin].drv_data; 84662306a36Sopenharmony_ci u32 val; 84762306a36Sopenharmony_ci unsigned long flags; 84862306a36Sopenharmony_ci 84962306a36Sopenharmony_ci /* not all pins support GPIO pinmux override */ 85062306a36Sopenharmony_ci if (!mux->is_supported) 85162306a36Sopenharmony_ci return -ENOTSUPP; 85262306a36Sopenharmony_ci 85362306a36Sopenharmony_ci spin_lock_irqsave(&pinctrl->lock, flags); 85462306a36Sopenharmony_ci 85562306a36Sopenharmony_ci val = readl(pinctrl->base1 + mux->offset); 85662306a36Sopenharmony_ci val |= 0x3 << mux->shift; 85762306a36Sopenharmony_ci writel(val, pinctrl->base1 + mux->offset); 85862306a36Sopenharmony_ci 85962306a36Sopenharmony_ci spin_unlock_irqrestore(&pinctrl->lock, flags); 86062306a36Sopenharmony_ci 86162306a36Sopenharmony_ci dev_dbg(pctrl_dev->dev, 86262306a36Sopenharmony_ci "gpio request enable pin=%u offset=0x%x shift=%u\n", 86362306a36Sopenharmony_ci pin, mux->offset, mux->shift); 86462306a36Sopenharmony_ci 86562306a36Sopenharmony_ci return 0; 86662306a36Sopenharmony_ci} 86762306a36Sopenharmony_ci 86862306a36Sopenharmony_cistatic void cygnus_gpio_disable_free(struct pinctrl_dev *pctrl_dev, 86962306a36Sopenharmony_ci struct pinctrl_gpio_range *range, 87062306a36Sopenharmony_ci unsigned pin) 87162306a36Sopenharmony_ci{ 87262306a36Sopenharmony_ci struct cygnus_pinctrl *pinctrl = pinctrl_dev_get_drvdata(pctrl_dev); 87362306a36Sopenharmony_ci struct cygnus_gpio_mux *mux = pctrl_dev->desc->pins[pin].drv_data; 87462306a36Sopenharmony_ci u32 val; 87562306a36Sopenharmony_ci unsigned long flags; 87662306a36Sopenharmony_ci 87762306a36Sopenharmony_ci if (!mux->is_supported) 87862306a36Sopenharmony_ci return; 87962306a36Sopenharmony_ci 88062306a36Sopenharmony_ci spin_lock_irqsave(&pinctrl->lock, flags); 88162306a36Sopenharmony_ci 88262306a36Sopenharmony_ci val = readl(pinctrl->base1 + mux->offset); 88362306a36Sopenharmony_ci val &= ~(0x3 << mux->shift); 88462306a36Sopenharmony_ci writel(val, pinctrl->base1 + mux->offset); 88562306a36Sopenharmony_ci 88662306a36Sopenharmony_ci spin_unlock_irqrestore(&pinctrl->lock, flags); 88762306a36Sopenharmony_ci 88862306a36Sopenharmony_ci dev_err(pctrl_dev->dev, 88962306a36Sopenharmony_ci "gpio disable free pin=%u offset=0x%x shift=%u\n", 89062306a36Sopenharmony_ci pin, mux->offset, mux->shift); 89162306a36Sopenharmony_ci} 89262306a36Sopenharmony_ci 89362306a36Sopenharmony_cistatic const struct pinmux_ops cygnus_pinmux_ops = { 89462306a36Sopenharmony_ci .get_functions_count = cygnus_get_functions_count, 89562306a36Sopenharmony_ci .get_function_name = cygnus_get_function_name, 89662306a36Sopenharmony_ci .get_function_groups = cygnus_get_function_groups, 89762306a36Sopenharmony_ci .set_mux = cygnus_pinmux_set_mux, 89862306a36Sopenharmony_ci .gpio_request_enable = cygnus_gpio_request_enable, 89962306a36Sopenharmony_ci .gpio_disable_free = cygnus_gpio_disable_free, 90062306a36Sopenharmony_ci}; 90162306a36Sopenharmony_ci 90262306a36Sopenharmony_cistatic struct pinctrl_desc cygnus_pinctrl_desc = { 90362306a36Sopenharmony_ci .name = "cygnus-pinmux", 90462306a36Sopenharmony_ci .pctlops = &cygnus_pinctrl_ops, 90562306a36Sopenharmony_ci .pmxops = &cygnus_pinmux_ops, 90662306a36Sopenharmony_ci}; 90762306a36Sopenharmony_ci 90862306a36Sopenharmony_cistatic int cygnus_mux_log_init(struct cygnus_pinctrl *pinctrl) 90962306a36Sopenharmony_ci{ 91062306a36Sopenharmony_ci struct cygnus_mux_log *log; 91162306a36Sopenharmony_ci unsigned int i, j; 91262306a36Sopenharmony_ci 91362306a36Sopenharmony_ci pinctrl->mux_log = devm_kcalloc(pinctrl->dev, CYGNUS_NUM_IOMUX, 91462306a36Sopenharmony_ci sizeof(struct cygnus_mux_log), 91562306a36Sopenharmony_ci GFP_KERNEL); 91662306a36Sopenharmony_ci if (!pinctrl->mux_log) 91762306a36Sopenharmony_ci return -ENOMEM; 91862306a36Sopenharmony_ci 91962306a36Sopenharmony_ci for (i = 0; i < CYGNUS_NUM_IOMUX_REGS; i++) { 92062306a36Sopenharmony_ci for (j = 0; j < CYGNUS_NUM_MUX_PER_REG; j++) { 92162306a36Sopenharmony_ci log = &pinctrl->mux_log[i * CYGNUS_NUM_MUX_PER_REG 92262306a36Sopenharmony_ci + j]; 92362306a36Sopenharmony_ci log->mux.offset = i * 4; 92462306a36Sopenharmony_ci log->mux.shift = j * 4; 92562306a36Sopenharmony_ci log->mux.alt = 0; 92662306a36Sopenharmony_ci log->is_configured = false; 92762306a36Sopenharmony_ci } 92862306a36Sopenharmony_ci } 92962306a36Sopenharmony_ci 93062306a36Sopenharmony_ci return 0; 93162306a36Sopenharmony_ci} 93262306a36Sopenharmony_ci 93362306a36Sopenharmony_cistatic int cygnus_pinmux_probe(struct platform_device *pdev) 93462306a36Sopenharmony_ci{ 93562306a36Sopenharmony_ci struct cygnus_pinctrl *pinctrl; 93662306a36Sopenharmony_ci int i, ret; 93762306a36Sopenharmony_ci struct pinctrl_pin_desc *pins; 93862306a36Sopenharmony_ci unsigned num_pins = ARRAY_SIZE(cygnus_pins); 93962306a36Sopenharmony_ci 94062306a36Sopenharmony_ci pinctrl = devm_kzalloc(&pdev->dev, sizeof(*pinctrl), GFP_KERNEL); 94162306a36Sopenharmony_ci if (!pinctrl) 94262306a36Sopenharmony_ci return -ENOMEM; 94362306a36Sopenharmony_ci 94462306a36Sopenharmony_ci pinctrl->dev = &pdev->dev; 94562306a36Sopenharmony_ci platform_set_drvdata(pdev, pinctrl); 94662306a36Sopenharmony_ci spin_lock_init(&pinctrl->lock); 94762306a36Sopenharmony_ci 94862306a36Sopenharmony_ci pinctrl->base0 = devm_platform_ioremap_resource(pdev, 0); 94962306a36Sopenharmony_ci if (IS_ERR(pinctrl->base0)) { 95062306a36Sopenharmony_ci dev_err(&pdev->dev, "unable to map I/O space\n"); 95162306a36Sopenharmony_ci return PTR_ERR(pinctrl->base0); 95262306a36Sopenharmony_ci } 95362306a36Sopenharmony_ci 95462306a36Sopenharmony_ci pinctrl->base1 = devm_platform_ioremap_resource(pdev, 1); 95562306a36Sopenharmony_ci if (IS_ERR(pinctrl->base1)) { 95662306a36Sopenharmony_ci dev_err(&pdev->dev, "unable to map I/O space\n"); 95762306a36Sopenharmony_ci return PTR_ERR(pinctrl->base1); 95862306a36Sopenharmony_ci } 95962306a36Sopenharmony_ci 96062306a36Sopenharmony_ci ret = cygnus_mux_log_init(pinctrl); 96162306a36Sopenharmony_ci if (ret) { 96262306a36Sopenharmony_ci dev_err(&pdev->dev, "unable to initialize IOMUX log\n"); 96362306a36Sopenharmony_ci return ret; 96462306a36Sopenharmony_ci } 96562306a36Sopenharmony_ci 96662306a36Sopenharmony_ci pins = devm_kcalloc(&pdev->dev, num_pins, sizeof(*pins), GFP_KERNEL); 96762306a36Sopenharmony_ci if (!pins) 96862306a36Sopenharmony_ci return -ENOMEM; 96962306a36Sopenharmony_ci 97062306a36Sopenharmony_ci for (i = 0; i < num_pins; i++) { 97162306a36Sopenharmony_ci pins[i].number = cygnus_pins[i].pin; 97262306a36Sopenharmony_ci pins[i].name = cygnus_pins[i].name; 97362306a36Sopenharmony_ci pins[i].drv_data = &cygnus_pins[i].gpio_mux; 97462306a36Sopenharmony_ci } 97562306a36Sopenharmony_ci 97662306a36Sopenharmony_ci pinctrl->groups = cygnus_pin_groups; 97762306a36Sopenharmony_ci pinctrl->num_groups = ARRAY_SIZE(cygnus_pin_groups); 97862306a36Sopenharmony_ci pinctrl->functions = cygnus_pin_functions; 97962306a36Sopenharmony_ci pinctrl->num_functions = ARRAY_SIZE(cygnus_pin_functions); 98062306a36Sopenharmony_ci cygnus_pinctrl_desc.pins = pins; 98162306a36Sopenharmony_ci cygnus_pinctrl_desc.npins = num_pins; 98262306a36Sopenharmony_ci 98362306a36Sopenharmony_ci pinctrl->pctl = devm_pinctrl_register(&pdev->dev, &cygnus_pinctrl_desc, 98462306a36Sopenharmony_ci pinctrl); 98562306a36Sopenharmony_ci if (IS_ERR(pinctrl->pctl)) { 98662306a36Sopenharmony_ci dev_err(&pdev->dev, "unable to register Cygnus IOMUX pinctrl\n"); 98762306a36Sopenharmony_ci return PTR_ERR(pinctrl->pctl); 98862306a36Sopenharmony_ci } 98962306a36Sopenharmony_ci 99062306a36Sopenharmony_ci return 0; 99162306a36Sopenharmony_ci} 99262306a36Sopenharmony_ci 99362306a36Sopenharmony_cistatic const struct of_device_id cygnus_pinmux_of_match[] = { 99462306a36Sopenharmony_ci { .compatible = "brcm,cygnus-pinmux" }, 99562306a36Sopenharmony_ci { } 99662306a36Sopenharmony_ci}; 99762306a36Sopenharmony_ci 99862306a36Sopenharmony_cistatic struct platform_driver cygnus_pinmux_driver = { 99962306a36Sopenharmony_ci .driver = { 100062306a36Sopenharmony_ci .name = "cygnus-pinmux", 100162306a36Sopenharmony_ci .of_match_table = cygnus_pinmux_of_match, 100262306a36Sopenharmony_ci .suppress_bind_attrs = true, 100362306a36Sopenharmony_ci }, 100462306a36Sopenharmony_ci .probe = cygnus_pinmux_probe, 100562306a36Sopenharmony_ci}; 100662306a36Sopenharmony_ci 100762306a36Sopenharmony_cistatic int __init cygnus_pinmux_init(void) 100862306a36Sopenharmony_ci{ 100962306a36Sopenharmony_ci return platform_driver_register(&cygnus_pinmux_driver); 101062306a36Sopenharmony_ci} 101162306a36Sopenharmony_ciarch_initcall(cygnus_pinmux_init); 1012