162306a36Sopenharmony_ci/* 262306a36Sopenharmony_ci * Driver for the ST Microelectronics SPEAr300 pinmux 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * Copyright (C) 2012 ST Microelectronics 562306a36Sopenharmony_ci * Viresh Kumar <vireshk@kernel.org> 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci * This file is licensed under the terms of the GNU General Public 862306a36Sopenharmony_ci * License version 2. This program is licensed "as is" without any 962306a36Sopenharmony_ci * warranty of any kind, whether express or implied. 1062306a36Sopenharmony_ci */ 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci#include <linux/err.h> 1362306a36Sopenharmony_ci#include <linux/init.h> 1462306a36Sopenharmony_ci#include <linux/mod_devicetable.h> 1562306a36Sopenharmony_ci#include <linux/platform_device.h> 1662306a36Sopenharmony_ci#include "pinctrl-spear3xx.h" 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci#define DRIVER_NAME "spear300-pinmux" 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci/* addresses */ 2162306a36Sopenharmony_ci#define PMX_CONFIG_REG 0x00 2262306a36Sopenharmony_ci#define MODE_CONFIG_REG 0x04 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci/* modes */ 2562306a36Sopenharmony_ci#define NAND_MODE (1 << 0) 2662306a36Sopenharmony_ci#define NOR_MODE (1 << 1) 2762306a36Sopenharmony_ci#define PHOTO_FRAME_MODE (1 << 2) 2862306a36Sopenharmony_ci#define LEND_IP_PHONE_MODE (1 << 3) 2962306a36Sopenharmony_ci#define HEND_IP_PHONE_MODE (1 << 4) 3062306a36Sopenharmony_ci#define LEND_WIFI_PHONE_MODE (1 << 5) 3162306a36Sopenharmony_ci#define HEND_WIFI_PHONE_MODE (1 << 6) 3262306a36Sopenharmony_ci#define ATA_PABX_WI2S_MODE (1 << 7) 3362306a36Sopenharmony_ci#define ATA_PABX_I2S_MODE (1 << 8) 3462306a36Sopenharmony_ci#define CAML_LCDW_MODE (1 << 9) 3562306a36Sopenharmony_ci#define CAMU_LCD_MODE (1 << 10) 3662306a36Sopenharmony_ci#define CAMU_WLCD_MODE (1 << 11) 3762306a36Sopenharmony_ci#define CAML_LCD_MODE (1 << 12) 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_cistatic struct spear_pmx_mode pmx_mode_nand = { 4062306a36Sopenharmony_ci .name = "nand", 4162306a36Sopenharmony_ci .mode = NAND_MODE, 4262306a36Sopenharmony_ci .reg = MODE_CONFIG_REG, 4362306a36Sopenharmony_ci .mask = 0x0000000F, 4462306a36Sopenharmony_ci .val = 0x00, 4562306a36Sopenharmony_ci}; 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_cistatic struct spear_pmx_mode pmx_mode_nor = { 4862306a36Sopenharmony_ci .name = "nor", 4962306a36Sopenharmony_ci .mode = NOR_MODE, 5062306a36Sopenharmony_ci .reg = MODE_CONFIG_REG, 5162306a36Sopenharmony_ci .mask = 0x0000000F, 5262306a36Sopenharmony_ci .val = 0x01, 5362306a36Sopenharmony_ci}; 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_cistatic struct spear_pmx_mode pmx_mode_photo_frame = { 5662306a36Sopenharmony_ci .name = "photo frame mode", 5762306a36Sopenharmony_ci .mode = PHOTO_FRAME_MODE, 5862306a36Sopenharmony_ci .reg = MODE_CONFIG_REG, 5962306a36Sopenharmony_ci .mask = 0x0000000F, 6062306a36Sopenharmony_ci .val = 0x02, 6162306a36Sopenharmony_ci}; 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_cistatic struct spear_pmx_mode pmx_mode_lend_ip_phone = { 6462306a36Sopenharmony_ci .name = "lend ip phone mode", 6562306a36Sopenharmony_ci .mode = LEND_IP_PHONE_MODE, 6662306a36Sopenharmony_ci .reg = MODE_CONFIG_REG, 6762306a36Sopenharmony_ci .mask = 0x0000000F, 6862306a36Sopenharmony_ci .val = 0x03, 6962306a36Sopenharmony_ci}; 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_cistatic struct spear_pmx_mode pmx_mode_hend_ip_phone = { 7262306a36Sopenharmony_ci .name = "hend ip phone mode", 7362306a36Sopenharmony_ci .mode = HEND_IP_PHONE_MODE, 7462306a36Sopenharmony_ci .reg = MODE_CONFIG_REG, 7562306a36Sopenharmony_ci .mask = 0x0000000F, 7662306a36Sopenharmony_ci .val = 0x04, 7762306a36Sopenharmony_ci}; 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_cistatic struct spear_pmx_mode pmx_mode_lend_wifi_phone = { 8062306a36Sopenharmony_ci .name = "lend wifi phone mode", 8162306a36Sopenharmony_ci .mode = LEND_WIFI_PHONE_MODE, 8262306a36Sopenharmony_ci .reg = MODE_CONFIG_REG, 8362306a36Sopenharmony_ci .mask = 0x0000000F, 8462306a36Sopenharmony_ci .val = 0x05, 8562306a36Sopenharmony_ci}; 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_cistatic struct spear_pmx_mode pmx_mode_hend_wifi_phone = { 8862306a36Sopenharmony_ci .name = "hend wifi phone mode", 8962306a36Sopenharmony_ci .mode = HEND_WIFI_PHONE_MODE, 9062306a36Sopenharmony_ci .reg = MODE_CONFIG_REG, 9162306a36Sopenharmony_ci .mask = 0x0000000F, 9262306a36Sopenharmony_ci .val = 0x06, 9362306a36Sopenharmony_ci}; 9462306a36Sopenharmony_ci 9562306a36Sopenharmony_cistatic struct spear_pmx_mode pmx_mode_ata_pabx_wi2s = { 9662306a36Sopenharmony_ci .name = "ata pabx wi2s mode", 9762306a36Sopenharmony_ci .mode = ATA_PABX_WI2S_MODE, 9862306a36Sopenharmony_ci .reg = MODE_CONFIG_REG, 9962306a36Sopenharmony_ci .mask = 0x0000000F, 10062306a36Sopenharmony_ci .val = 0x07, 10162306a36Sopenharmony_ci}; 10262306a36Sopenharmony_ci 10362306a36Sopenharmony_cistatic struct spear_pmx_mode pmx_mode_ata_pabx_i2s = { 10462306a36Sopenharmony_ci .name = "ata pabx i2s mode", 10562306a36Sopenharmony_ci .mode = ATA_PABX_I2S_MODE, 10662306a36Sopenharmony_ci .reg = MODE_CONFIG_REG, 10762306a36Sopenharmony_ci .mask = 0x0000000F, 10862306a36Sopenharmony_ci .val = 0x08, 10962306a36Sopenharmony_ci}; 11062306a36Sopenharmony_ci 11162306a36Sopenharmony_cistatic struct spear_pmx_mode pmx_mode_caml_lcdw = { 11262306a36Sopenharmony_ci .name = "caml lcdw mode", 11362306a36Sopenharmony_ci .mode = CAML_LCDW_MODE, 11462306a36Sopenharmony_ci .reg = MODE_CONFIG_REG, 11562306a36Sopenharmony_ci .mask = 0x0000000F, 11662306a36Sopenharmony_ci .val = 0x0C, 11762306a36Sopenharmony_ci}; 11862306a36Sopenharmony_ci 11962306a36Sopenharmony_cistatic struct spear_pmx_mode pmx_mode_camu_lcd = { 12062306a36Sopenharmony_ci .name = "camu lcd mode", 12162306a36Sopenharmony_ci .mode = CAMU_LCD_MODE, 12262306a36Sopenharmony_ci .reg = MODE_CONFIG_REG, 12362306a36Sopenharmony_ci .mask = 0x0000000F, 12462306a36Sopenharmony_ci .val = 0x0D, 12562306a36Sopenharmony_ci}; 12662306a36Sopenharmony_ci 12762306a36Sopenharmony_cistatic struct spear_pmx_mode pmx_mode_camu_wlcd = { 12862306a36Sopenharmony_ci .name = "camu wlcd mode", 12962306a36Sopenharmony_ci .mode = CAMU_WLCD_MODE, 13062306a36Sopenharmony_ci .reg = MODE_CONFIG_REG, 13162306a36Sopenharmony_ci .mask = 0x0000000F, 13262306a36Sopenharmony_ci .val = 0xE, 13362306a36Sopenharmony_ci}; 13462306a36Sopenharmony_ci 13562306a36Sopenharmony_cistatic struct spear_pmx_mode pmx_mode_caml_lcd = { 13662306a36Sopenharmony_ci .name = "caml lcd mode", 13762306a36Sopenharmony_ci .mode = CAML_LCD_MODE, 13862306a36Sopenharmony_ci .reg = MODE_CONFIG_REG, 13962306a36Sopenharmony_ci .mask = 0x0000000F, 14062306a36Sopenharmony_ci .val = 0x0F, 14162306a36Sopenharmony_ci}; 14262306a36Sopenharmony_ci 14362306a36Sopenharmony_cistatic struct spear_pmx_mode *spear300_pmx_modes[] = { 14462306a36Sopenharmony_ci &pmx_mode_nand, 14562306a36Sopenharmony_ci &pmx_mode_nor, 14662306a36Sopenharmony_ci &pmx_mode_photo_frame, 14762306a36Sopenharmony_ci &pmx_mode_lend_ip_phone, 14862306a36Sopenharmony_ci &pmx_mode_hend_ip_phone, 14962306a36Sopenharmony_ci &pmx_mode_lend_wifi_phone, 15062306a36Sopenharmony_ci &pmx_mode_hend_wifi_phone, 15162306a36Sopenharmony_ci &pmx_mode_ata_pabx_wi2s, 15262306a36Sopenharmony_ci &pmx_mode_ata_pabx_i2s, 15362306a36Sopenharmony_ci &pmx_mode_caml_lcdw, 15462306a36Sopenharmony_ci &pmx_mode_camu_lcd, 15562306a36Sopenharmony_ci &pmx_mode_camu_wlcd, 15662306a36Sopenharmony_ci &pmx_mode_caml_lcd, 15762306a36Sopenharmony_ci}; 15862306a36Sopenharmony_ci 15962306a36Sopenharmony_ci/* fsmc_2chips_pins */ 16062306a36Sopenharmony_cistatic const unsigned fsmc_2chips_pins[] = { 1, 97 }; 16162306a36Sopenharmony_cistatic struct spear_muxreg fsmc_2chips_muxreg[] = { 16262306a36Sopenharmony_ci { 16362306a36Sopenharmony_ci .reg = PMX_CONFIG_REG, 16462306a36Sopenharmony_ci .mask = PMX_FIRDA_MASK, 16562306a36Sopenharmony_ci .val = 0, 16662306a36Sopenharmony_ci }, 16762306a36Sopenharmony_ci}; 16862306a36Sopenharmony_ci 16962306a36Sopenharmony_cistatic struct spear_modemux fsmc_2chips_modemux[] = { 17062306a36Sopenharmony_ci { 17162306a36Sopenharmony_ci .modes = NAND_MODE | NOR_MODE | PHOTO_FRAME_MODE | 17262306a36Sopenharmony_ci ATA_PABX_WI2S_MODE | ATA_PABX_I2S_MODE, 17362306a36Sopenharmony_ci .muxregs = fsmc_2chips_muxreg, 17462306a36Sopenharmony_ci .nmuxregs = ARRAY_SIZE(fsmc_2chips_muxreg), 17562306a36Sopenharmony_ci }, 17662306a36Sopenharmony_ci}; 17762306a36Sopenharmony_ci 17862306a36Sopenharmony_cistatic struct spear_pingroup fsmc_2chips_pingroup = { 17962306a36Sopenharmony_ci .name = "fsmc_2chips_grp", 18062306a36Sopenharmony_ci .pins = fsmc_2chips_pins, 18162306a36Sopenharmony_ci .npins = ARRAY_SIZE(fsmc_2chips_pins), 18262306a36Sopenharmony_ci .modemuxs = fsmc_2chips_modemux, 18362306a36Sopenharmony_ci .nmodemuxs = ARRAY_SIZE(fsmc_2chips_modemux), 18462306a36Sopenharmony_ci}; 18562306a36Sopenharmony_ci 18662306a36Sopenharmony_ci/* fsmc_4chips_pins */ 18762306a36Sopenharmony_cistatic const unsigned fsmc_4chips_pins[] = { 1, 2, 3, 97 }; 18862306a36Sopenharmony_cistatic struct spear_muxreg fsmc_4chips_muxreg[] = { 18962306a36Sopenharmony_ci { 19062306a36Sopenharmony_ci .reg = PMX_CONFIG_REG, 19162306a36Sopenharmony_ci .mask = PMX_FIRDA_MASK | PMX_UART0_MASK, 19262306a36Sopenharmony_ci .val = 0, 19362306a36Sopenharmony_ci }, 19462306a36Sopenharmony_ci}; 19562306a36Sopenharmony_ci 19662306a36Sopenharmony_cistatic struct spear_modemux fsmc_4chips_modemux[] = { 19762306a36Sopenharmony_ci { 19862306a36Sopenharmony_ci .modes = NAND_MODE | NOR_MODE | PHOTO_FRAME_MODE | 19962306a36Sopenharmony_ci ATA_PABX_WI2S_MODE | ATA_PABX_I2S_MODE, 20062306a36Sopenharmony_ci .muxregs = fsmc_4chips_muxreg, 20162306a36Sopenharmony_ci .nmuxregs = ARRAY_SIZE(fsmc_4chips_muxreg), 20262306a36Sopenharmony_ci }, 20362306a36Sopenharmony_ci}; 20462306a36Sopenharmony_ci 20562306a36Sopenharmony_cistatic struct spear_pingroup fsmc_4chips_pingroup = { 20662306a36Sopenharmony_ci .name = "fsmc_4chips_grp", 20762306a36Sopenharmony_ci .pins = fsmc_4chips_pins, 20862306a36Sopenharmony_ci .npins = ARRAY_SIZE(fsmc_4chips_pins), 20962306a36Sopenharmony_ci .modemuxs = fsmc_4chips_modemux, 21062306a36Sopenharmony_ci .nmodemuxs = ARRAY_SIZE(fsmc_4chips_modemux), 21162306a36Sopenharmony_ci}; 21262306a36Sopenharmony_ci 21362306a36Sopenharmony_cistatic const char *const fsmc_grps[] = { "fsmc_2chips_grp", "fsmc_4chips_grp" 21462306a36Sopenharmony_ci}; 21562306a36Sopenharmony_cistatic struct spear_function fsmc_function = { 21662306a36Sopenharmony_ci .name = "fsmc", 21762306a36Sopenharmony_ci .groups = fsmc_grps, 21862306a36Sopenharmony_ci .ngroups = ARRAY_SIZE(fsmc_grps), 21962306a36Sopenharmony_ci}; 22062306a36Sopenharmony_ci 22162306a36Sopenharmony_ci/* clcd_lcdmode_pins */ 22262306a36Sopenharmony_cistatic const unsigned clcd_lcdmode_pins[] = { 49, 50 }; 22362306a36Sopenharmony_cistatic struct spear_muxreg clcd_lcdmode_muxreg[] = { 22462306a36Sopenharmony_ci { 22562306a36Sopenharmony_ci .reg = PMX_CONFIG_REG, 22662306a36Sopenharmony_ci .mask = PMX_TIMER_0_1_MASK | PMX_TIMER_2_3_MASK, 22762306a36Sopenharmony_ci .val = 0, 22862306a36Sopenharmony_ci }, 22962306a36Sopenharmony_ci}; 23062306a36Sopenharmony_ci 23162306a36Sopenharmony_cistatic struct spear_modemux clcd_lcdmode_modemux[] = { 23262306a36Sopenharmony_ci { 23362306a36Sopenharmony_ci .modes = HEND_IP_PHONE_MODE | HEND_WIFI_PHONE_MODE | 23462306a36Sopenharmony_ci CAMU_LCD_MODE | CAML_LCD_MODE, 23562306a36Sopenharmony_ci .muxregs = clcd_lcdmode_muxreg, 23662306a36Sopenharmony_ci .nmuxregs = ARRAY_SIZE(clcd_lcdmode_muxreg), 23762306a36Sopenharmony_ci }, 23862306a36Sopenharmony_ci}; 23962306a36Sopenharmony_ci 24062306a36Sopenharmony_cistatic struct spear_pingroup clcd_lcdmode_pingroup = { 24162306a36Sopenharmony_ci .name = "clcd_lcdmode_grp", 24262306a36Sopenharmony_ci .pins = clcd_lcdmode_pins, 24362306a36Sopenharmony_ci .npins = ARRAY_SIZE(clcd_lcdmode_pins), 24462306a36Sopenharmony_ci .modemuxs = clcd_lcdmode_modemux, 24562306a36Sopenharmony_ci .nmodemuxs = ARRAY_SIZE(clcd_lcdmode_modemux), 24662306a36Sopenharmony_ci}; 24762306a36Sopenharmony_ci 24862306a36Sopenharmony_ci/* clcd_pfmode_pins */ 24962306a36Sopenharmony_cistatic const unsigned clcd_pfmode_pins[] = { 47, 48, 49, 50 }; 25062306a36Sopenharmony_cistatic struct spear_muxreg clcd_pfmode_muxreg[] = { 25162306a36Sopenharmony_ci { 25262306a36Sopenharmony_ci .reg = PMX_CONFIG_REG, 25362306a36Sopenharmony_ci .mask = PMX_TIMER_2_3_MASK, 25462306a36Sopenharmony_ci .val = 0, 25562306a36Sopenharmony_ci }, 25662306a36Sopenharmony_ci}; 25762306a36Sopenharmony_ci 25862306a36Sopenharmony_cistatic struct spear_modemux clcd_pfmode_modemux[] = { 25962306a36Sopenharmony_ci { 26062306a36Sopenharmony_ci .modes = PHOTO_FRAME_MODE, 26162306a36Sopenharmony_ci .muxregs = clcd_pfmode_muxreg, 26262306a36Sopenharmony_ci .nmuxregs = ARRAY_SIZE(clcd_pfmode_muxreg), 26362306a36Sopenharmony_ci }, 26462306a36Sopenharmony_ci}; 26562306a36Sopenharmony_ci 26662306a36Sopenharmony_cistatic struct spear_pingroup clcd_pfmode_pingroup = { 26762306a36Sopenharmony_ci .name = "clcd_pfmode_grp", 26862306a36Sopenharmony_ci .pins = clcd_pfmode_pins, 26962306a36Sopenharmony_ci .npins = ARRAY_SIZE(clcd_pfmode_pins), 27062306a36Sopenharmony_ci .modemuxs = clcd_pfmode_modemux, 27162306a36Sopenharmony_ci .nmodemuxs = ARRAY_SIZE(clcd_pfmode_modemux), 27262306a36Sopenharmony_ci}; 27362306a36Sopenharmony_ci 27462306a36Sopenharmony_cistatic const char *const clcd_grps[] = { "clcd_lcdmode_grp", "clcd_pfmode_grp" 27562306a36Sopenharmony_ci}; 27662306a36Sopenharmony_cistatic struct spear_function clcd_function = { 27762306a36Sopenharmony_ci .name = "clcd", 27862306a36Sopenharmony_ci .groups = clcd_grps, 27962306a36Sopenharmony_ci .ngroups = ARRAY_SIZE(clcd_grps), 28062306a36Sopenharmony_ci}; 28162306a36Sopenharmony_ci 28262306a36Sopenharmony_ci/* tdm_pins */ 28362306a36Sopenharmony_cistatic const unsigned tdm_pins[] = { 34, 35, 36, 37, 38 }; 28462306a36Sopenharmony_cistatic struct spear_muxreg tdm_muxreg[] = { 28562306a36Sopenharmony_ci { 28662306a36Sopenharmony_ci .reg = PMX_CONFIG_REG, 28762306a36Sopenharmony_ci .mask = PMX_UART0_MODEM_MASK | PMX_SSP_CS_MASK, 28862306a36Sopenharmony_ci .val = 0, 28962306a36Sopenharmony_ci }, 29062306a36Sopenharmony_ci}; 29162306a36Sopenharmony_ci 29262306a36Sopenharmony_cistatic struct spear_modemux tdm_modemux[] = { 29362306a36Sopenharmony_ci { 29462306a36Sopenharmony_ci .modes = PHOTO_FRAME_MODE | LEND_IP_PHONE_MODE | 29562306a36Sopenharmony_ci HEND_IP_PHONE_MODE | LEND_WIFI_PHONE_MODE 29662306a36Sopenharmony_ci | HEND_WIFI_PHONE_MODE | ATA_PABX_WI2S_MODE 29762306a36Sopenharmony_ci | ATA_PABX_I2S_MODE | CAML_LCDW_MODE | CAMU_LCD_MODE 29862306a36Sopenharmony_ci | CAMU_WLCD_MODE | CAML_LCD_MODE, 29962306a36Sopenharmony_ci .muxregs = tdm_muxreg, 30062306a36Sopenharmony_ci .nmuxregs = ARRAY_SIZE(tdm_muxreg), 30162306a36Sopenharmony_ci }, 30262306a36Sopenharmony_ci}; 30362306a36Sopenharmony_ci 30462306a36Sopenharmony_cistatic struct spear_pingroup tdm_pingroup = { 30562306a36Sopenharmony_ci .name = "tdm_grp", 30662306a36Sopenharmony_ci .pins = tdm_pins, 30762306a36Sopenharmony_ci .npins = ARRAY_SIZE(tdm_pins), 30862306a36Sopenharmony_ci .modemuxs = tdm_modemux, 30962306a36Sopenharmony_ci .nmodemuxs = ARRAY_SIZE(tdm_modemux), 31062306a36Sopenharmony_ci}; 31162306a36Sopenharmony_ci 31262306a36Sopenharmony_cistatic const char *const tdm_grps[] = { "tdm_grp" }; 31362306a36Sopenharmony_cistatic struct spear_function tdm_function = { 31462306a36Sopenharmony_ci .name = "tdm", 31562306a36Sopenharmony_ci .groups = tdm_grps, 31662306a36Sopenharmony_ci .ngroups = ARRAY_SIZE(tdm_grps), 31762306a36Sopenharmony_ci}; 31862306a36Sopenharmony_ci 31962306a36Sopenharmony_ci/* i2c_clk_pins */ 32062306a36Sopenharmony_cistatic const unsigned i2c_clk_pins[] = { 45, 46, 47, 48 }; 32162306a36Sopenharmony_cistatic struct spear_muxreg i2c_clk_muxreg[] = { 32262306a36Sopenharmony_ci { 32362306a36Sopenharmony_ci .reg = PMX_CONFIG_REG, 32462306a36Sopenharmony_ci .mask = PMX_TIMER_0_1_MASK | PMX_TIMER_2_3_MASK, 32562306a36Sopenharmony_ci .val = 0, 32662306a36Sopenharmony_ci }, 32762306a36Sopenharmony_ci}; 32862306a36Sopenharmony_ci 32962306a36Sopenharmony_cistatic struct spear_modemux i2c_clk_modemux[] = { 33062306a36Sopenharmony_ci { 33162306a36Sopenharmony_ci .modes = LEND_IP_PHONE_MODE | HEND_IP_PHONE_MODE | 33262306a36Sopenharmony_ci LEND_WIFI_PHONE_MODE | HEND_WIFI_PHONE_MODE | 33362306a36Sopenharmony_ci ATA_PABX_WI2S_MODE | ATA_PABX_I2S_MODE | CAML_LCDW_MODE 33462306a36Sopenharmony_ci | CAML_LCD_MODE, 33562306a36Sopenharmony_ci .muxregs = i2c_clk_muxreg, 33662306a36Sopenharmony_ci .nmuxregs = ARRAY_SIZE(i2c_clk_muxreg), 33762306a36Sopenharmony_ci }, 33862306a36Sopenharmony_ci}; 33962306a36Sopenharmony_ci 34062306a36Sopenharmony_cistatic struct spear_pingroup i2c_clk_pingroup = { 34162306a36Sopenharmony_ci .name = "i2c_clk_grp_grp", 34262306a36Sopenharmony_ci .pins = i2c_clk_pins, 34362306a36Sopenharmony_ci .npins = ARRAY_SIZE(i2c_clk_pins), 34462306a36Sopenharmony_ci .modemuxs = i2c_clk_modemux, 34562306a36Sopenharmony_ci .nmodemuxs = ARRAY_SIZE(i2c_clk_modemux), 34662306a36Sopenharmony_ci}; 34762306a36Sopenharmony_ci 34862306a36Sopenharmony_cistatic const char *const i2c_grps[] = { "i2c_clk_grp" }; 34962306a36Sopenharmony_cistatic struct spear_function i2c_function = { 35062306a36Sopenharmony_ci .name = "i2c1", 35162306a36Sopenharmony_ci .groups = i2c_grps, 35262306a36Sopenharmony_ci .ngroups = ARRAY_SIZE(i2c_grps), 35362306a36Sopenharmony_ci}; 35462306a36Sopenharmony_ci 35562306a36Sopenharmony_ci/* caml_pins */ 35662306a36Sopenharmony_cistatic const unsigned caml_pins[] = { 12, 13, 14, 15, 16, 17, 18, 19, 20, 21 }; 35762306a36Sopenharmony_cistatic struct spear_muxreg caml_muxreg[] = { 35862306a36Sopenharmony_ci { 35962306a36Sopenharmony_ci .reg = PMX_CONFIG_REG, 36062306a36Sopenharmony_ci .mask = PMX_MII_MASK, 36162306a36Sopenharmony_ci .val = 0, 36262306a36Sopenharmony_ci }, 36362306a36Sopenharmony_ci}; 36462306a36Sopenharmony_ci 36562306a36Sopenharmony_cistatic struct spear_modemux caml_modemux[] = { 36662306a36Sopenharmony_ci { 36762306a36Sopenharmony_ci .modes = CAML_LCDW_MODE | CAML_LCD_MODE, 36862306a36Sopenharmony_ci .muxregs = caml_muxreg, 36962306a36Sopenharmony_ci .nmuxregs = ARRAY_SIZE(caml_muxreg), 37062306a36Sopenharmony_ci }, 37162306a36Sopenharmony_ci}; 37262306a36Sopenharmony_ci 37362306a36Sopenharmony_cistatic struct spear_pingroup caml_pingroup = { 37462306a36Sopenharmony_ci .name = "caml_grp", 37562306a36Sopenharmony_ci .pins = caml_pins, 37662306a36Sopenharmony_ci .npins = ARRAY_SIZE(caml_pins), 37762306a36Sopenharmony_ci .modemuxs = caml_modemux, 37862306a36Sopenharmony_ci .nmodemuxs = ARRAY_SIZE(caml_modemux), 37962306a36Sopenharmony_ci}; 38062306a36Sopenharmony_ci 38162306a36Sopenharmony_ci/* camu_pins */ 38262306a36Sopenharmony_cistatic const unsigned camu_pins[] = { 16, 17, 18, 19, 20, 21, 45, 46, 47, 48 }; 38362306a36Sopenharmony_cistatic struct spear_muxreg camu_muxreg[] = { 38462306a36Sopenharmony_ci { 38562306a36Sopenharmony_ci .reg = PMX_CONFIG_REG, 38662306a36Sopenharmony_ci .mask = PMX_TIMER_0_1_MASK | PMX_TIMER_2_3_MASK | PMX_MII_MASK, 38762306a36Sopenharmony_ci .val = 0, 38862306a36Sopenharmony_ci }, 38962306a36Sopenharmony_ci}; 39062306a36Sopenharmony_ci 39162306a36Sopenharmony_cistatic struct spear_modemux camu_modemux[] = { 39262306a36Sopenharmony_ci { 39362306a36Sopenharmony_ci .modes = CAMU_LCD_MODE | CAMU_WLCD_MODE, 39462306a36Sopenharmony_ci .muxregs = camu_muxreg, 39562306a36Sopenharmony_ci .nmuxregs = ARRAY_SIZE(camu_muxreg), 39662306a36Sopenharmony_ci }, 39762306a36Sopenharmony_ci}; 39862306a36Sopenharmony_ci 39962306a36Sopenharmony_cistatic struct spear_pingroup camu_pingroup = { 40062306a36Sopenharmony_ci .name = "camu_grp", 40162306a36Sopenharmony_ci .pins = camu_pins, 40262306a36Sopenharmony_ci .npins = ARRAY_SIZE(camu_pins), 40362306a36Sopenharmony_ci .modemuxs = camu_modemux, 40462306a36Sopenharmony_ci .nmodemuxs = ARRAY_SIZE(camu_modemux), 40562306a36Sopenharmony_ci}; 40662306a36Sopenharmony_ci 40762306a36Sopenharmony_cistatic const char *const cam_grps[] = { "caml_grp", "camu_grp" }; 40862306a36Sopenharmony_cistatic struct spear_function cam_function = { 40962306a36Sopenharmony_ci .name = "cam", 41062306a36Sopenharmony_ci .groups = cam_grps, 41162306a36Sopenharmony_ci .ngroups = ARRAY_SIZE(cam_grps), 41262306a36Sopenharmony_ci}; 41362306a36Sopenharmony_ci 41462306a36Sopenharmony_ci/* dac_pins */ 41562306a36Sopenharmony_cistatic const unsigned dac_pins[] = { 43, 44 }; 41662306a36Sopenharmony_cistatic struct spear_muxreg dac_muxreg[] = { 41762306a36Sopenharmony_ci { 41862306a36Sopenharmony_ci .reg = PMX_CONFIG_REG, 41962306a36Sopenharmony_ci .mask = PMX_TIMER_0_1_MASK, 42062306a36Sopenharmony_ci .val = 0, 42162306a36Sopenharmony_ci }, 42262306a36Sopenharmony_ci}; 42362306a36Sopenharmony_ci 42462306a36Sopenharmony_cistatic struct spear_modemux dac_modemux[] = { 42562306a36Sopenharmony_ci { 42662306a36Sopenharmony_ci .modes = ATA_PABX_I2S_MODE | CAML_LCDW_MODE | CAMU_LCD_MODE 42762306a36Sopenharmony_ci | CAMU_WLCD_MODE | CAML_LCD_MODE, 42862306a36Sopenharmony_ci .muxregs = dac_muxreg, 42962306a36Sopenharmony_ci .nmuxregs = ARRAY_SIZE(dac_muxreg), 43062306a36Sopenharmony_ci }, 43162306a36Sopenharmony_ci}; 43262306a36Sopenharmony_ci 43362306a36Sopenharmony_cistatic struct spear_pingroup dac_pingroup = { 43462306a36Sopenharmony_ci .name = "dac_grp", 43562306a36Sopenharmony_ci .pins = dac_pins, 43662306a36Sopenharmony_ci .npins = ARRAY_SIZE(dac_pins), 43762306a36Sopenharmony_ci .modemuxs = dac_modemux, 43862306a36Sopenharmony_ci .nmodemuxs = ARRAY_SIZE(dac_modemux), 43962306a36Sopenharmony_ci}; 44062306a36Sopenharmony_ci 44162306a36Sopenharmony_cistatic const char *const dac_grps[] = { "dac_grp" }; 44262306a36Sopenharmony_cistatic struct spear_function dac_function = { 44362306a36Sopenharmony_ci .name = "dac", 44462306a36Sopenharmony_ci .groups = dac_grps, 44562306a36Sopenharmony_ci .ngroups = ARRAY_SIZE(dac_grps), 44662306a36Sopenharmony_ci}; 44762306a36Sopenharmony_ci 44862306a36Sopenharmony_ci/* i2s_pins */ 44962306a36Sopenharmony_cistatic const unsigned i2s_pins[] = { 39, 40, 41, 42 }; 45062306a36Sopenharmony_cistatic struct spear_muxreg i2s_muxreg[] = { 45162306a36Sopenharmony_ci { 45262306a36Sopenharmony_ci .reg = PMX_CONFIG_REG, 45362306a36Sopenharmony_ci .mask = PMX_UART0_MODEM_MASK, 45462306a36Sopenharmony_ci .val = 0, 45562306a36Sopenharmony_ci }, 45662306a36Sopenharmony_ci}; 45762306a36Sopenharmony_ci 45862306a36Sopenharmony_cistatic struct spear_modemux i2s_modemux[] = { 45962306a36Sopenharmony_ci { 46062306a36Sopenharmony_ci .modes = LEND_IP_PHONE_MODE | HEND_IP_PHONE_MODE 46162306a36Sopenharmony_ci | LEND_WIFI_PHONE_MODE | HEND_WIFI_PHONE_MODE | 46262306a36Sopenharmony_ci ATA_PABX_I2S_MODE | CAML_LCDW_MODE | CAMU_LCD_MODE 46362306a36Sopenharmony_ci | CAMU_WLCD_MODE | CAML_LCD_MODE, 46462306a36Sopenharmony_ci .muxregs = i2s_muxreg, 46562306a36Sopenharmony_ci .nmuxregs = ARRAY_SIZE(i2s_muxreg), 46662306a36Sopenharmony_ci }, 46762306a36Sopenharmony_ci}; 46862306a36Sopenharmony_ci 46962306a36Sopenharmony_cistatic struct spear_pingroup i2s_pingroup = { 47062306a36Sopenharmony_ci .name = "i2s_grp", 47162306a36Sopenharmony_ci .pins = i2s_pins, 47262306a36Sopenharmony_ci .npins = ARRAY_SIZE(i2s_pins), 47362306a36Sopenharmony_ci .modemuxs = i2s_modemux, 47462306a36Sopenharmony_ci .nmodemuxs = ARRAY_SIZE(i2s_modemux), 47562306a36Sopenharmony_ci}; 47662306a36Sopenharmony_ci 47762306a36Sopenharmony_cistatic const char *const i2s_grps[] = { "i2s_grp" }; 47862306a36Sopenharmony_cistatic struct spear_function i2s_function = { 47962306a36Sopenharmony_ci .name = "i2s", 48062306a36Sopenharmony_ci .groups = i2s_grps, 48162306a36Sopenharmony_ci .ngroups = ARRAY_SIZE(i2s_grps), 48262306a36Sopenharmony_ci}; 48362306a36Sopenharmony_ci 48462306a36Sopenharmony_ci/* sdhci_4bit_pins */ 48562306a36Sopenharmony_cistatic const unsigned sdhci_4bit_pins[] = { 28, 29, 30, 31, 32, 33 }; 48662306a36Sopenharmony_cistatic struct spear_muxreg sdhci_4bit_muxreg[] = { 48762306a36Sopenharmony_ci { 48862306a36Sopenharmony_ci .reg = PMX_CONFIG_REG, 48962306a36Sopenharmony_ci .mask = PMX_GPIO_PIN0_MASK | PMX_GPIO_PIN1_MASK | 49062306a36Sopenharmony_ci PMX_GPIO_PIN2_MASK | PMX_GPIO_PIN3_MASK | 49162306a36Sopenharmony_ci PMX_GPIO_PIN4_MASK | PMX_GPIO_PIN5_MASK, 49262306a36Sopenharmony_ci .val = 0, 49362306a36Sopenharmony_ci }, 49462306a36Sopenharmony_ci}; 49562306a36Sopenharmony_ci 49662306a36Sopenharmony_cistatic struct spear_modemux sdhci_4bit_modemux[] = { 49762306a36Sopenharmony_ci { 49862306a36Sopenharmony_ci .modes = PHOTO_FRAME_MODE | LEND_IP_PHONE_MODE | 49962306a36Sopenharmony_ci HEND_IP_PHONE_MODE | LEND_WIFI_PHONE_MODE | 50062306a36Sopenharmony_ci HEND_WIFI_PHONE_MODE | CAML_LCDW_MODE | CAMU_LCD_MODE | 50162306a36Sopenharmony_ci CAMU_WLCD_MODE | CAML_LCD_MODE | ATA_PABX_WI2S_MODE, 50262306a36Sopenharmony_ci .muxregs = sdhci_4bit_muxreg, 50362306a36Sopenharmony_ci .nmuxregs = ARRAY_SIZE(sdhci_4bit_muxreg), 50462306a36Sopenharmony_ci }, 50562306a36Sopenharmony_ci}; 50662306a36Sopenharmony_ci 50762306a36Sopenharmony_cistatic struct spear_pingroup sdhci_4bit_pingroup = { 50862306a36Sopenharmony_ci .name = "sdhci_4bit_grp", 50962306a36Sopenharmony_ci .pins = sdhci_4bit_pins, 51062306a36Sopenharmony_ci .npins = ARRAY_SIZE(sdhci_4bit_pins), 51162306a36Sopenharmony_ci .modemuxs = sdhci_4bit_modemux, 51262306a36Sopenharmony_ci .nmodemuxs = ARRAY_SIZE(sdhci_4bit_modemux), 51362306a36Sopenharmony_ci}; 51462306a36Sopenharmony_ci 51562306a36Sopenharmony_ci/* sdhci_8bit_pins */ 51662306a36Sopenharmony_cistatic const unsigned sdhci_8bit_pins[] = { 24, 25, 26, 27, 28, 29, 30, 31, 32, 51762306a36Sopenharmony_ci 33 }; 51862306a36Sopenharmony_cistatic struct spear_muxreg sdhci_8bit_muxreg[] = { 51962306a36Sopenharmony_ci { 52062306a36Sopenharmony_ci .reg = PMX_CONFIG_REG, 52162306a36Sopenharmony_ci .mask = PMX_GPIO_PIN0_MASK | PMX_GPIO_PIN1_MASK | 52262306a36Sopenharmony_ci PMX_GPIO_PIN2_MASK | PMX_GPIO_PIN3_MASK | 52362306a36Sopenharmony_ci PMX_GPIO_PIN4_MASK | PMX_GPIO_PIN5_MASK | PMX_MII_MASK, 52462306a36Sopenharmony_ci .val = 0, 52562306a36Sopenharmony_ci }, 52662306a36Sopenharmony_ci}; 52762306a36Sopenharmony_ci 52862306a36Sopenharmony_cistatic struct spear_modemux sdhci_8bit_modemux[] = { 52962306a36Sopenharmony_ci { 53062306a36Sopenharmony_ci .modes = PHOTO_FRAME_MODE | LEND_IP_PHONE_MODE | 53162306a36Sopenharmony_ci HEND_IP_PHONE_MODE | LEND_WIFI_PHONE_MODE | 53262306a36Sopenharmony_ci HEND_WIFI_PHONE_MODE | CAML_LCDW_MODE | CAMU_LCD_MODE | 53362306a36Sopenharmony_ci CAMU_WLCD_MODE | CAML_LCD_MODE, 53462306a36Sopenharmony_ci .muxregs = sdhci_8bit_muxreg, 53562306a36Sopenharmony_ci .nmuxregs = ARRAY_SIZE(sdhci_8bit_muxreg), 53662306a36Sopenharmony_ci }, 53762306a36Sopenharmony_ci}; 53862306a36Sopenharmony_ci 53962306a36Sopenharmony_cistatic struct spear_pingroup sdhci_8bit_pingroup = { 54062306a36Sopenharmony_ci .name = "sdhci_8bit_grp", 54162306a36Sopenharmony_ci .pins = sdhci_8bit_pins, 54262306a36Sopenharmony_ci .npins = ARRAY_SIZE(sdhci_8bit_pins), 54362306a36Sopenharmony_ci .modemuxs = sdhci_8bit_modemux, 54462306a36Sopenharmony_ci .nmodemuxs = ARRAY_SIZE(sdhci_8bit_modemux), 54562306a36Sopenharmony_ci}; 54662306a36Sopenharmony_ci 54762306a36Sopenharmony_cistatic const char *const sdhci_grps[] = { "sdhci_4bit_grp", "sdhci_8bit_grp" }; 54862306a36Sopenharmony_cistatic struct spear_function sdhci_function = { 54962306a36Sopenharmony_ci .name = "sdhci", 55062306a36Sopenharmony_ci .groups = sdhci_grps, 55162306a36Sopenharmony_ci .ngroups = ARRAY_SIZE(sdhci_grps), 55262306a36Sopenharmony_ci}; 55362306a36Sopenharmony_ci 55462306a36Sopenharmony_ci/* gpio1_0_to_3_pins */ 55562306a36Sopenharmony_cistatic const unsigned gpio1_0_to_3_pins[] = { 39, 40, 41, 42 }; 55662306a36Sopenharmony_cistatic struct spear_muxreg gpio1_0_to_3_muxreg[] = { 55762306a36Sopenharmony_ci { 55862306a36Sopenharmony_ci .reg = PMX_CONFIG_REG, 55962306a36Sopenharmony_ci .mask = PMX_UART0_MODEM_MASK, 56062306a36Sopenharmony_ci .val = 0, 56162306a36Sopenharmony_ci }, 56262306a36Sopenharmony_ci}; 56362306a36Sopenharmony_ci 56462306a36Sopenharmony_cistatic struct spear_modemux gpio1_0_to_3_modemux[] = { 56562306a36Sopenharmony_ci { 56662306a36Sopenharmony_ci .modes = PHOTO_FRAME_MODE, 56762306a36Sopenharmony_ci .muxregs = gpio1_0_to_3_muxreg, 56862306a36Sopenharmony_ci .nmuxregs = ARRAY_SIZE(gpio1_0_to_3_muxreg), 56962306a36Sopenharmony_ci }, 57062306a36Sopenharmony_ci}; 57162306a36Sopenharmony_ci 57262306a36Sopenharmony_cistatic struct spear_pingroup gpio1_0_to_3_pingroup = { 57362306a36Sopenharmony_ci .name = "gpio1_0_to_3_grp", 57462306a36Sopenharmony_ci .pins = gpio1_0_to_3_pins, 57562306a36Sopenharmony_ci .npins = ARRAY_SIZE(gpio1_0_to_3_pins), 57662306a36Sopenharmony_ci .modemuxs = gpio1_0_to_3_modemux, 57762306a36Sopenharmony_ci .nmodemuxs = ARRAY_SIZE(gpio1_0_to_3_modemux), 57862306a36Sopenharmony_ci}; 57962306a36Sopenharmony_ci 58062306a36Sopenharmony_ci/* gpio1_4_to_7_pins */ 58162306a36Sopenharmony_cistatic const unsigned gpio1_4_to_7_pins[] = { 43, 44, 45, 46 }; 58262306a36Sopenharmony_ci 58362306a36Sopenharmony_cistatic struct spear_muxreg gpio1_4_to_7_muxreg[] = { 58462306a36Sopenharmony_ci { 58562306a36Sopenharmony_ci .reg = PMX_CONFIG_REG, 58662306a36Sopenharmony_ci .mask = PMX_TIMER_0_1_MASK | PMX_TIMER_2_3_MASK, 58762306a36Sopenharmony_ci .val = 0, 58862306a36Sopenharmony_ci }, 58962306a36Sopenharmony_ci}; 59062306a36Sopenharmony_ci 59162306a36Sopenharmony_cistatic struct spear_modemux gpio1_4_to_7_modemux[] = { 59262306a36Sopenharmony_ci { 59362306a36Sopenharmony_ci .modes = PHOTO_FRAME_MODE, 59462306a36Sopenharmony_ci .muxregs = gpio1_4_to_7_muxreg, 59562306a36Sopenharmony_ci .nmuxregs = ARRAY_SIZE(gpio1_4_to_7_muxreg), 59662306a36Sopenharmony_ci }, 59762306a36Sopenharmony_ci}; 59862306a36Sopenharmony_ci 59962306a36Sopenharmony_cistatic struct spear_pingroup gpio1_4_to_7_pingroup = { 60062306a36Sopenharmony_ci .name = "gpio1_4_to_7_grp", 60162306a36Sopenharmony_ci .pins = gpio1_4_to_7_pins, 60262306a36Sopenharmony_ci .npins = ARRAY_SIZE(gpio1_4_to_7_pins), 60362306a36Sopenharmony_ci .modemuxs = gpio1_4_to_7_modemux, 60462306a36Sopenharmony_ci .nmodemuxs = ARRAY_SIZE(gpio1_4_to_7_modemux), 60562306a36Sopenharmony_ci}; 60662306a36Sopenharmony_ci 60762306a36Sopenharmony_cistatic const char *const gpio1_grps[] = { "gpio1_0_to_3_grp", "gpio1_4_to_7_grp" 60862306a36Sopenharmony_ci}; 60962306a36Sopenharmony_cistatic struct spear_function gpio1_function = { 61062306a36Sopenharmony_ci .name = "gpio1", 61162306a36Sopenharmony_ci .groups = gpio1_grps, 61262306a36Sopenharmony_ci .ngroups = ARRAY_SIZE(gpio1_grps), 61362306a36Sopenharmony_ci}; 61462306a36Sopenharmony_ci 61562306a36Sopenharmony_ci/* pingroups */ 61662306a36Sopenharmony_cistatic struct spear_pingroup *spear300_pingroups[] = { 61762306a36Sopenharmony_ci SPEAR3XX_COMMON_PINGROUPS, 61862306a36Sopenharmony_ci &fsmc_2chips_pingroup, 61962306a36Sopenharmony_ci &fsmc_4chips_pingroup, 62062306a36Sopenharmony_ci &clcd_lcdmode_pingroup, 62162306a36Sopenharmony_ci &clcd_pfmode_pingroup, 62262306a36Sopenharmony_ci &tdm_pingroup, 62362306a36Sopenharmony_ci &i2c_clk_pingroup, 62462306a36Sopenharmony_ci &caml_pingroup, 62562306a36Sopenharmony_ci &camu_pingroup, 62662306a36Sopenharmony_ci &dac_pingroup, 62762306a36Sopenharmony_ci &i2s_pingroup, 62862306a36Sopenharmony_ci &sdhci_4bit_pingroup, 62962306a36Sopenharmony_ci &sdhci_8bit_pingroup, 63062306a36Sopenharmony_ci &gpio1_0_to_3_pingroup, 63162306a36Sopenharmony_ci &gpio1_4_to_7_pingroup, 63262306a36Sopenharmony_ci}; 63362306a36Sopenharmony_ci 63462306a36Sopenharmony_ci/* functions */ 63562306a36Sopenharmony_cistatic struct spear_function *spear300_functions[] = { 63662306a36Sopenharmony_ci SPEAR3XX_COMMON_FUNCTIONS, 63762306a36Sopenharmony_ci &fsmc_function, 63862306a36Sopenharmony_ci &clcd_function, 63962306a36Sopenharmony_ci &tdm_function, 64062306a36Sopenharmony_ci &i2c_function, 64162306a36Sopenharmony_ci &cam_function, 64262306a36Sopenharmony_ci &dac_function, 64362306a36Sopenharmony_ci &i2s_function, 64462306a36Sopenharmony_ci &sdhci_function, 64562306a36Sopenharmony_ci &gpio1_function, 64662306a36Sopenharmony_ci}; 64762306a36Sopenharmony_ci 64862306a36Sopenharmony_cistatic const struct of_device_id spear300_pinctrl_of_match[] = { 64962306a36Sopenharmony_ci { 65062306a36Sopenharmony_ci .compatible = "st,spear300-pinmux", 65162306a36Sopenharmony_ci }, 65262306a36Sopenharmony_ci {}, 65362306a36Sopenharmony_ci}; 65462306a36Sopenharmony_ci 65562306a36Sopenharmony_cistatic int spear300_pinctrl_probe(struct platform_device *pdev) 65662306a36Sopenharmony_ci{ 65762306a36Sopenharmony_ci spear3xx_machdata.groups = spear300_pingroups; 65862306a36Sopenharmony_ci spear3xx_machdata.ngroups = ARRAY_SIZE(spear300_pingroups); 65962306a36Sopenharmony_ci spear3xx_machdata.functions = spear300_functions; 66062306a36Sopenharmony_ci spear3xx_machdata.nfunctions = ARRAY_SIZE(spear300_functions); 66162306a36Sopenharmony_ci spear3xx_machdata.gpio_pingroups = NULL; 66262306a36Sopenharmony_ci spear3xx_machdata.ngpio_pingroups = 0; 66362306a36Sopenharmony_ci 66462306a36Sopenharmony_ci spear3xx_machdata.modes_supported = true; 66562306a36Sopenharmony_ci spear3xx_machdata.pmx_modes = spear300_pmx_modes; 66662306a36Sopenharmony_ci spear3xx_machdata.npmx_modes = ARRAY_SIZE(spear300_pmx_modes); 66762306a36Sopenharmony_ci 66862306a36Sopenharmony_ci pmx_init_addr(&spear3xx_machdata, PMX_CONFIG_REG); 66962306a36Sopenharmony_ci 67062306a36Sopenharmony_ci return spear_pinctrl_probe(pdev, &spear3xx_machdata); 67162306a36Sopenharmony_ci} 67262306a36Sopenharmony_ci 67362306a36Sopenharmony_cistatic struct platform_driver spear300_pinctrl_driver = { 67462306a36Sopenharmony_ci .driver = { 67562306a36Sopenharmony_ci .name = DRIVER_NAME, 67662306a36Sopenharmony_ci .of_match_table = spear300_pinctrl_of_match, 67762306a36Sopenharmony_ci }, 67862306a36Sopenharmony_ci .probe = spear300_pinctrl_probe, 67962306a36Sopenharmony_ci}; 68062306a36Sopenharmony_ci 68162306a36Sopenharmony_cistatic int __init spear300_pinctrl_init(void) 68262306a36Sopenharmony_ci{ 68362306a36Sopenharmony_ci return platform_driver_register(&spear300_pinctrl_driver); 68462306a36Sopenharmony_ci} 68562306a36Sopenharmony_ciarch_initcall(spear300_pinctrl_init); 686