152130b60SViresh Kumar /* 252130b60SViresh Kumar * Driver for the ST Microelectronics SPEAr310 pinmux 352130b60SViresh Kumar * 452130b60SViresh Kumar * Copyright (C) 2012 ST Microelectronics 510d8935fSViresh Kumar * Viresh Kumar <viresh.linux@gmail.com> 652130b60SViresh Kumar * 752130b60SViresh Kumar * This file is licensed under the terms of the GNU General Public 852130b60SViresh Kumar * License version 2. This program is licensed "as is" without any 952130b60SViresh Kumar * warranty of any kind, whether express or implied. 1052130b60SViresh Kumar */ 1152130b60SViresh Kumar 1252130b60SViresh Kumar #include <linux/err.h> 1352130b60SViresh Kumar #include <linux/init.h> 1452130b60SViresh Kumar #include <linux/module.h> 1552130b60SViresh Kumar #include <linux/of_device.h> 1652130b60SViresh Kumar #include <linux/platform_device.h> 1752130b60SViresh Kumar #include "pinctrl-spear3xx.h" 1852130b60SViresh Kumar 1952130b60SViresh Kumar #define DRIVER_NAME "spear310-pinmux" 2052130b60SViresh Kumar 2152130b60SViresh Kumar /* addresses */ 2252130b60SViresh Kumar #define PMX_CONFIG_REG 0x08 2352130b60SViresh Kumar 2452130b60SViresh Kumar /* emi_cs_0_to_5_pins */ 2552130b60SViresh Kumar static const unsigned emi_cs_0_to_5_pins[] = { 45, 46, 47, 48, 49, 50 }; 2652130b60SViresh Kumar static struct spear_muxreg emi_cs_0_to_5_muxreg[] = { 2752130b60SViresh Kumar { 2852130b60SViresh Kumar .reg = PMX_CONFIG_REG, 2952130b60SViresh Kumar .mask = PMX_TIMER_0_1_MASK | PMX_TIMER_2_3_MASK, 3052130b60SViresh Kumar .val = 0, 3152130b60SViresh Kumar }, 3252130b60SViresh Kumar }; 3352130b60SViresh Kumar 3452130b60SViresh Kumar static struct spear_modemux emi_cs_0_to_5_modemux[] = { 3552130b60SViresh Kumar { 3652130b60SViresh Kumar .muxregs = emi_cs_0_to_5_muxreg, 3752130b60SViresh Kumar .nmuxregs = ARRAY_SIZE(emi_cs_0_to_5_muxreg), 3852130b60SViresh Kumar }, 3952130b60SViresh Kumar }; 4052130b60SViresh Kumar 4152130b60SViresh Kumar static struct spear_pingroup emi_cs_0_to_5_pingroup = { 4252130b60SViresh Kumar .name = "emi_cs_0_to_5_grp", 4352130b60SViresh Kumar .pins = emi_cs_0_to_5_pins, 4452130b60SViresh Kumar .npins = ARRAY_SIZE(emi_cs_0_to_5_pins), 4552130b60SViresh Kumar .modemuxs = emi_cs_0_to_5_modemux, 4652130b60SViresh Kumar .nmodemuxs = ARRAY_SIZE(emi_cs_0_to_5_modemux), 4752130b60SViresh Kumar }; 4852130b60SViresh Kumar 4952130b60SViresh Kumar static const char *const emi_cs_0_to_5_grps[] = { "emi_cs_0_to_5_grp" }; 5052130b60SViresh Kumar static struct spear_function emi_cs_0_to_5_function = { 5152130b60SViresh Kumar .name = "emi", 5252130b60SViresh Kumar .groups = emi_cs_0_to_5_grps, 5352130b60SViresh Kumar .ngroups = ARRAY_SIZE(emi_cs_0_to_5_grps), 5452130b60SViresh Kumar }; 5552130b60SViresh Kumar 5652130b60SViresh Kumar /* uart1_pins */ 5752130b60SViresh Kumar static const unsigned uart1_pins[] = { 0, 1 }; 5852130b60SViresh Kumar static struct spear_muxreg uart1_muxreg[] = { 5952130b60SViresh Kumar { 6052130b60SViresh Kumar .reg = PMX_CONFIG_REG, 6152130b60SViresh Kumar .mask = PMX_FIRDA_MASK, 6252130b60SViresh Kumar .val = 0, 6352130b60SViresh Kumar }, 6452130b60SViresh Kumar }; 6552130b60SViresh Kumar 6652130b60SViresh Kumar static struct spear_modemux uart1_modemux[] = { 6752130b60SViresh Kumar { 6852130b60SViresh Kumar .muxregs = uart1_muxreg, 6952130b60SViresh Kumar .nmuxregs = ARRAY_SIZE(uart1_muxreg), 7052130b60SViresh Kumar }, 7152130b60SViresh Kumar }; 7252130b60SViresh Kumar 7352130b60SViresh Kumar static struct spear_pingroup uart1_pingroup = { 7452130b60SViresh Kumar .name = "uart1_grp", 7552130b60SViresh Kumar .pins = uart1_pins, 7652130b60SViresh Kumar .npins = ARRAY_SIZE(uart1_pins), 7752130b60SViresh Kumar .modemuxs = uart1_modemux, 7852130b60SViresh Kumar .nmodemuxs = ARRAY_SIZE(uart1_modemux), 7952130b60SViresh Kumar }; 8052130b60SViresh Kumar 8152130b60SViresh Kumar static const char *const uart1_grps[] = { "uart1_grp" }; 8252130b60SViresh Kumar static struct spear_function uart1_function = { 8352130b60SViresh Kumar .name = "uart1", 8452130b60SViresh Kumar .groups = uart1_grps, 8552130b60SViresh Kumar .ngroups = ARRAY_SIZE(uart1_grps), 8652130b60SViresh Kumar }; 8752130b60SViresh Kumar 8852130b60SViresh Kumar /* uart2_pins */ 8952130b60SViresh Kumar static const unsigned uart2_pins[] = { 43, 44 }; 9052130b60SViresh Kumar static struct spear_muxreg uart2_muxreg[] = { 9152130b60SViresh Kumar { 9252130b60SViresh Kumar .reg = PMX_CONFIG_REG, 9352130b60SViresh Kumar .mask = PMX_TIMER_0_1_MASK, 9452130b60SViresh Kumar .val = 0, 9552130b60SViresh Kumar }, 9652130b60SViresh Kumar }; 9752130b60SViresh Kumar 9852130b60SViresh Kumar static struct spear_modemux uart2_modemux[] = { 9952130b60SViresh Kumar { 10052130b60SViresh Kumar .muxregs = uart2_muxreg, 10152130b60SViresh Kumar .nmuxregs = ARRAY_SIZE(uart2_muxreg), 10252130b60SViresh Kumar }, 10352130b60SViresh Kumar }; 10452130b60SViresh Kumar 10552130b60SViresh Kumar static struct spear_pingroup uart2_pingroup = { 10652130b60SViresh Kumar .name = "uart2_grp", 10752130b60SViresh Kumar .pins = uart2_pins, 10852130b60SViresh Kumar .npins = ARRAY_SIZE(uart2_pins), 10952130b60SViresh Kumar .modemuxs = uart2_modemux, 11052130b60SViresh Kumar .nmodemuxs = ARRAY_SIZE(uart2_modemux), 11152130b60SViresh Kumar }; 11252130b60SViresh Kumar 11352130b60SViresh Kumar static const char *const uart2_grps[] = { "uart2_grp" }; 11452130b60SViresh Kumar static struct spear_function uart2_function = { 11552130b60SViresh Kumar .name = "uart2", 11652130b60SViresh Kumar .groups = uart2_grps, 11752130b60SViresh Kumar .ngroups = ARRAY_SIZE(uart2_grps), 11852130b60SViresh Kumar }; 11952130b60SViresh Kumar 12052130b60SViresh Kumar /* uart3_pins */ 12152130b60SViresh Kumar static const unsigned uart3_pins[] = { 37, 38 }; 12252130b60SViresh Kumar static struct spear_muxreg uart3_muxreg[] = { 12352130b60SViresh Kumar { 12452130b60SViresh Kumar .reg = PMX_CONFIG_REG, 12552130b60SViresh Kumar .mask = PMX_UART0_MODEM_MASK, 12652130b60SViresh Kumar .val = 0, 12752130b60SViresh Kumar }, 12852130b60SViresh Kumar }; 12952130b60SViresh Kumar 13052130b60SViresh Kumar static struct spear_modemux uart3_modemux[] = { 13152130b60SViresh Kumar { 13252130b60SViresh Kumar .muxregs = uart3_muxreg, 13352130b60SViresh Kumar .nmuxregs = ARRAY_SIZE(uart3_muxreg), 13452130b60SViresh Kumar }, 13552130b60SViresh Kumar }; 13652130b60SViresh Kumar 13752130b60SViresh Kumar static struct spear_pingroup uart3_pingroup = { 13852130b60SViresh Kumar .name = "uart3_grp", 13952130b60SViresh Kumar .pins = uart3_pins, 14052130b60SViresh Kumar .npins = ARRAY_SIZE(uart3_pins), 14152130b60SViresh Kumar .modemuxs = uart3_modemux, 14252130b60SViresh Kumar .nmodemuxs = ARRAY_SIZE(uart3_modemux), 14352130b60SViresh Kumar }; 14452130b60SViresh Kumar 14552130b60SViresh Kumar static const char *const uart3_grps[] = { "uart3_grp" }; 14652130b60SViresh Kumar static struct spear_function uart3_function = { 14752130b60SViresh Kumar .name = "uart3", 14852130b60SViresh Kumar .groups = uart3_grps, 14952130b60SViresh Kumar .ngroups = ARRAY_SIZE(uart3_grps), 15052130b60SViresh Kumar }; 15152130b60SViresh Kumar 15252130b60SViresh Kumar /* uart4_pins */ 15352130b60SViresh Kumar static const unsigned uart4_pins[] = { 39, 40 }; 15452130b60SViresh Kumar static struct spear_muxreg uart4_muxreg[] = { 15552130b60SViresh Kumar { 15652130b60SViresh Kumar .reg = PMX_CONFIG_REG, 15752130b60SViresh Kumar .mask = PMX_UART0_MODEM_MASK, 15852130b60SViresh Kumar .val = 0, 15952130b60SViresh Kumar }, 16052130b60SViresh Kumar }; 16152130b60SViresh Kumar 16252130b60SViresh Kumar static struct spear_modemux uart4_modemux[] = { 16352130b60SViresh Kumar { 16452130b60SViresh Kumar .muxregs = uart4_muxreg, 16552130b60SViresh Kumar .nmuxregs = ARRAY_SIZE(uart4_muxreg), 16652130b60SViresh Kumar }, 16752130b60SViresh Kumar }; 16852130b60SViresh Kumar 16952130b60SViresh Kumar static struct spear_pingroup uart4_pingroup = { 17052130b60SViresh Kumar .name = "uart4_grp", 17152130b60SViresh Kumar .pins = uart4_pins, 17252130b60SViresh Kumar .npins = ARRAY_SIZE(uart4_pins), 17352130b60SViresh Kumar .modemuxs = uart4_modemux, 17452130b60SViresh Kumar .nmodemuxs = ARRAY_SIZE(uart4_modemux), 17552130b60SViresh Kumar }; 17652130b60SViresh Kumar 17752130b60SViresh Kumar static const char *const uart4_grps[] = { "uart4_grp" }; 17852130b60SViresh Kumar static struct spear_function uart4_function = { 17952130b60SViresh Kumar .name = "uart4", 18052130b60SViresh Kumar .groups = uart4_grps, 18152130b60SViresh Kumar .ngroups = ARRAY_SIZE(uart4_grps), 18252130b60SViresh Kumar }; 18352130b60SViresh Kumar 18452130b60SViresh Kumar /* uart5_pins */ 18552130b60SViresh Kumar static const unsigned uart5_pins[] = { 41, 42 }; 18652130b60SViresh Kumar static struct spear_muxreg uart5_muxreg[] = { 18752130b60SViresh Kumar { 18852130b60SViresh Kumar .reg = PMX_CONFIG_REG, 18952130b60SViresh Kumar .mask = PMX_UART0_MODEM_MASK, 19052130b60SViresh Kumar .val = 0, 19152130b60SViresh Kumar }, 19252130b60SViresh Kumar }; 19352130b60SViresh Kumar 19452130b60SViresh Kumar static struct spear_modemux uart5_modemux[] = { 19552130b60SViresh Kumar { 19652130b60SViresh Kumar .muxregs = uart5_muxreg, 19752130b60SViresh Kumar .nmuxregs = ARRAY_SIZE(uart5_muxreg), 19852130b60SViresh Kumar }, 19952130b60SViresh Kumar }; 20052130b60SViresh Kumar 20152130b60SViresh Kumar static struct spear_pingroup uart5_pingroup = { 20252130b60SViresh Kumar .name = "uart5_grp", 20352130b60SViresh Kumar .pins = uart5_pins, 20452130b60SViresh Kumar .npins = ARRAY_SIZE(uart5_pins), 20552130b60SViresh Kumar .modemuxs = uart5_modemux, 20652130b60SViresh Kumar .nmodemuxs = ARRAY_SIZE(uart5_modemux), 20752130b60SViresh Kumar }; 20852130b60SViresh Kumar 20952130b60SViresh Kumar static const char *const uart5_grps[] = { "uart5_grp" }; 21052130b60SViresh Kumar static struct spear_function uart5_function = { 21152130b60SViresh Kumar .name = "uart5", 21252130b60SViresh Kumar .groups = uart5_grps, 21352130b60SViresh Kumar .ngroups = ARRAY_SIZE(uart5_grps), 21452130b60SViresh Kumar }; 21552130b60SViresh Kumar 21652130b60SViresh Kumar /* fsmc_pins */ 21752130b60SViresh Kumar static const unsigned fsmc_pins[] = { 34, 35, 36 }; 21852130b60SViresh Kumar static struct spear_muxreg fsmc_muxreg[] = { 21952130b60SViresh Kumar { 22052130b60SViresh Kumar .reg = PMX_CONFIG_REG, 22152130b60SViresh Kumar .mask = PMX_SSP_CS_MASK, 22252130b60SViresh Kumar .val = 0, 22352130b60SViresh Kumar }, 22452130b60SViresh Kumar }; 22552130b60SViresh Kumar 22652130b60SViresh Kumar static struct spear_modemux fsmc_modemux[] = { 22752130b60SViresh Kumar { 22852130b60SViresh Kumar .muxregs = fsmc_muxreg, 22952130b60SViresh Kumar .nmuxregs = ARRAY_SIZE(fsmc_muxreg), 23052130b60SViresh Kumar }, 23152130b60SViresh Kumar }; 23252130b60SViresh Kumar 23352130b60SViresh Kumar static struct spear_pingroup fsmc_pingroup = { 23452130b60SViresh Kumar .name = "fsmc_grp", 23552130b60SViresh Kumar .pins = fsmc_pins, 23652130b60SViresh Kumar .npins = ARRAY_SIZE(fsmc_pins), 23752130b60SViresh Kumar .modemuxs = fsmc_modemux, 23852130b60SViresh Kumar .nmodemuxs = ARRAY_SIZE(fsmc_modemux), 23952130b60SViresh Kumar }; 24052130b60SViresh Kumar 24152130b60SViresh Kumar static const char *const fsmc_grps[] = { "fsmc_grp" }; 24252130b60SViresh Kumar static struct spear_function fsmc_function = { 24352130b60SViresh Kumar .name = "fsmc", 24452130b60SViresh Kumar .groups = fsmc_grps, 24552130b60SViresh Kumar .ngroups = ARRAY_SIZE(fsmc_grps), 24652130b60SViresh Kumar }; 24752130b60SViresh Kumar 24852130b60SViresh Kumar /* rs485_0_pins */ 24952130b60SViresh Kumar static const unsigned rs485_0_pins[] = { 19, 20, 21, 22, 23 }; 25052130b60SViresh Kumar static struct spear_muxreg rs485_0_muxreg[] = { 25152130b60SViresh Kumar { 25252130b60SViresh Kumar .reg = PMX_CONFIG_REG, 25352130b60SViresh Kumar .mask = PMX_MII_MASK, 25452130b60SViresh Kumar .val = 0, 25552130b60SViresh Kumar }, 25652130b60SViresh Kumar }; 25752130b60SViresh Kumar 25852130b60SViresh Kumar static struct spear_modemux rs485_0_modemux[] = { 25952130b60SViresh Kumar { 26052130b60SViresh Kumar .muxregs = rs485_0_muxreg, 26152130b60SViresh Kumar .nmuxregs = ARRAY_SIZE(rs485_0_muxreg), 26252130b60SViresh Kumar }, 26352130b60SViresh Kumar }; 26452130b60SViresh Kumar 26552130b60SViresh Kumar static struct spear_pingroup rs485_0_pingroup = { 26652130b60SViresh Kumar .name = "rs485_0_grp", 26752130b60SViresh Kumar .pins = rs485_0_pins, 26852130b60SViresh Kumar .npins = ARRAY_SIZE(rs485_0_pins), 26952130b60SViresh Kumar .modemuxs = rs485_0_modemux, 27052130b60SViresh Kumar .nmodemuxs = ARRAY_SIZE(rs485_0_modemux), 27152130b60SViresh Kumar }; 27252130b60SViresh Kumar 27352130b60SViresh Kumar static const char *const rs485_0_grps[] = { "rs485_0" }; 27452130b60SViresh Kumar static struct spear_function rs485_0_function = { 27552130b60SViresh Kumar .name = "rs485_0", 27652130b60SViresh Kumar .groups = rs485_0_grps, 27752130b60SViresh Kumar .ngroups = ARRAY_SIZE(rs485_0_grps), 27852130b60SViresh Kumar }; 27952130b60SViresh Kumar 28052130b60SViresh Kumar /* rs485_1_pins */ 28152130b60SViresh Kumar static const unsigned rs485_1_pins[] = { 14, 15, 16, 17, 18 }; 28252130b60SViresh Kumar static struct spear_muxreg rs485_1_muxreg[] = { 28352130b60SViresh Kumar { 28452130b60SViresh Kumar .reg = PMX_CONFIG_REG, 28552130b60SViresh Kumar .mask = PMX_MII_MASK, 28652130b60SViresh Kumar .val = 0, 28752130b60SViresh Kumar }, 28852130b60SViresh Kumar }; 28952130b60SViresh Kumar 29052130b60SViresh Kumar static struct spear_modemux rs485_1_modemux[] = { 29152130b60SViresh Kumar { 29252130b60SViresh Kumar .muxregs = rs485_1_muxreg, 29352130b60SViresh Kumar .nmuxregs = ARRAY_SIZE(rs485_1_muxreg), 29452130b60SViresh Kumar }, 29552130b60SViresh Kumar }; 29652130b60SViresh Kumar 29752130b60SViresh Kumar static struct spear_pingroup rs485_1_pingroup = { 29852130b60SViresh Kumar .name = "rs485_1_grp", 29952130b60SViresh Kumar .pins = rs485_1_pins, 30052130b60SViresh Kumar .npins = ARRAY_SIZE(rs485_1_pins), 30152130b60SViresh Kumar .modemuxs = rs485_1_modemux, 30252130b60SViresh Kumar .nmodemuxs = ARRAY_SIZE(rs485_1_modemux), 30352130b60SViresh Kumar }; 30452130b60SViresh Kumar 30552130b60SViresh Kumar static const char *const rs485_1_grps[] = { "rs485_1" }; 30652130b60SViresh Kumar static struct spear_function rs485_1_function = { 30752130b60SViresh Kumar .name = "rs485_1", 30852130b60SViresh Kumar .groups = rs485_1_grps, 30952130b60SViresh Kumar .ngroups = ARRAY_SIZE(rs485_1_grps), 31052130b60SViresh Kumar }; 31152130b60SViresh Kumar 31252130b60SViresh Kumar /* tdm_pins */ 31352130b60SViresh Kumar static const unsigned tdm_pins[] = { 10, 11, 12, 13 }; 31452130b60SViresh Kumar static struct spear_muxreg tdm_muxreg[] = { 31552130b60SViresh Kumar { 31652130b60SViresh Kumar .reg = PMX_CONFIG_REG, 31752130b60SViresh Kumar .mask = PMX_MII_MASK, 31852130b60SViresh Kumar .val = 0, 31952130b60SViresh Kumar }, 32052130b60SViresh Kumar }; 32152130b60SViresh Kumar 32252130b60SViresh Kumar static struct spear_modemux tdm_modemux[] = { 32352130b60SViresh Kumar { 32452130b60SViresh Kumar .muxregs = tdm_muxreg, 32552130b60SViresh Kumar .nmuxregs = ARRAY_SIZE(tdm_muxreg), 32652130b60SViresh Kumar }, 32752130b60SViresh Kumar }; 32852130b60SViresh Kumar 32952130b60SViresh Kumar static struct spear_pingroup tdm_pingroup = { 33052130b60SViresh Kumar .name = "tdm_grp", 33152130b60SViresh Kumar .pins = tdm_pins, 33252130b60SViresh Kumar .npins = ARRAY_SIZE(tdm_pins), 33352130b60SViresh Kumar .modemuxs = tdm_modemux, 33452130b60SViresh Kumar .nmodemuxs = ARRAY_SIZE(tdm_modemux), 33552130b60SViresh Kumar }; 33652130b60SViresh Kumar 33752130b60SViresh Kumar static const char *const tdm_grps[] = { "tdm_grp" }; 33852130b60SViresh Kumar static struct spear_function tdm_function = { 33952130b60SViresh Kumar .name = "tdm", 34052130b60SViresh Kumar .groups = tdm_grps, 34152130b60SViresh Kumar .ngroups = ARRAY_SIZE(tdm_grps), 34252130b60SViresh Kumar }; 34352130b60SViresh Kumar 34452130b60SViresh Kumar /* pingroups */ 34552130b60SViresh Kumar static struct spear_pingroup *spear310_pingroups[] = { 34652130b60SViresh Kumar SPEAR3XX_COMMON_PINGROUPS, 34752130b60SViresh Kumar &emi_cs_0_to_5_pingroup, 34852130b60SViresh Kumar &uart1_pingroup, 34952130b60SViresh Kumar &uart2_pingroup, 35052130b60SViresh Kumar &uart3_pingroup, 35152130b60SViresh Kumar &uart4_pingroup, 35252130b60SViresh Kumar &uart5_pingroup, 35352130b60SViresh Kumar &fsmc_pingroup, 35452130b60SViresh Kumar &rs485_0_pingroup, 35552130b60SViresh Kumar &rs485_1_pingroup, 35652130b60SViresh Kumar &tdm_pingroup, 35752130b60SViresh Kumar }; 35852130b60SViresh Kumar 35952130b60SViresh Kumar /* functions */ 36052130b60SViresh Kumar static struct spear_function *spear310_functions[] = { 36152130b60SViresh Kumar SPEAR3XX_COMMON_FUNCTIONS, 36252130b60SViresh Kumar &emi_cs_0_to_5_function, 36352130b60SViresh Kumar &uart1_function, 36452130b60SViresh Kumar &uart2_function, 36552130b60SViresh Kumar &uart3_function, 36652130b60SViresh Kumar &uart4_function, 36752130b60SViresh Kumar &uart5_function, 36852130b60SViresh Kumar &fsmc_function, 36952130b60SViresh Kumar &rs485_0_function, 37052130b60SViresh Kumar &rs485_1_function, 37152130b60SViresh Kumar &tdm_function, 37252130b60SViresh Kumar }; 37352130b60SViresh Kumar 37452130b60SViresh Kumar static struct of_device_id spear310_pinctrl_of_match[] __devinitdata = { 37552130b60SViresh Kumar { 37652130b60SViresh Kumar .compatible = "st,spear310-pinmux", 37752130b60SViresh Kumar }, 37852130b60SViresh Kumar {}, 37952130b60SViresh Kumar }; 38052130b60SViresh Kumar 38152130b60SViresh Kumar static int __devinit spear310_pinctrl_probe(struct platform_device *pdev) 38252130b60SViresh Kumar { 38352130b60SViresh Kumar int ret; 38452130b60SViresh Kumar 38552130b60SViresh Kumar spear3xx_machdata.groups = spear310_pingroups; 38652130b60SViresh Kumar spear3xx_machdata.ngroups = ARRAY_SIZE(spear310_pingroups); 38752130b60SViresh Kumar spear3xx_machdata.functions = spear310_functions; 38852130b60SViresh Kumar spear3xx_machdata.nfunctions = ARRAY_SIZE(spear310_functions); 38952130b60SViresh Kumar 39052130b60SViresh Kumar pmx_init_addr(&spear3xx_machdata, PMX_CONFIG_REG); 391*f4f8e563SViresh Kumar pmx_init_gpio_pingroup_addr(spear3xx_machdata.gpio_pingroups, 392*f4f8e563SViresh Kumar spear3xx_machdata.ngpio_pingroups, PMX_CONFIG_REG); 39352130b60SViresh Kumar 39452130b60SViresh Kumar spear3xx_machdata.modes_supported = false; 39552130b60SViresh Kumar 39652130b60SViresh Kumar ret = spear_pinctrl_probe(pdev, &spear3xx_machdata); 39752130b60SViresh Kumar if (ret) 39852130b60SViresh Kumar return ret; 39952130b60SViresh Kumar 40052130b60SViresh Kumar return 0; 40152130b60SViresh Kumar } 40252130b60SViresh Kumar 40352130b60SViresh Kumar static int __devexit spear310_pinctrl_remove(struct platform_device *pdev) 40452130b60SViresh Kumar { 40552130b60SViresh Kumar return spear_pinctrl_remove(pdev); 40652130b60SViresh Kumar } 40752130b60SViresh Kumar 40852130b60SViresh Kumar static struct platform_driver spear310_pinctrl_driver = { 40952130b60SViresh Kumar .driver = { 41052130b60SViresh Kumar .name = DRIVER_NAME, 41152130b60SViresh Kumar .owner = THIS_MODULE, 41252130b60SViresh Kumar .of_match_table = spear310_pinctrl_of_match, 41352130b60SViresh Kumar }, 41452130b60SViresh Kumar .probe = spear310_pinctrl_probe, 41552130b60SViresh Kumar .remove = __devexit_p(spear310_pinctrl_remove), 41652130b60SViresh Kumar }; 41752130b60SViresh Kumar 41852130b60SViresh Kumar static int __init spear310_pinctrl_init(void) 41952130b60SViresh Kumar { 42052130b60SViresh Kumar return platform_driver_register(&spear310_pinctrl_driver); 42152130b60SViresh Kumar } 42252130b60SViresh Kumar arch_initcall(spear310_pinctrl_init); 42352130b60SViresh Kumar 42452130b60SViresh Kumar static void __exit spear310_pinctrl_exit(void) 42552130b60SViresh Kumar { 42652130b60SViresh Kumar platform_driver_unregister(&spear310_pinctrl_driver); 42752130b60SViresh Kumar } 42852130b60SViresh Kumar module_exit(spear310_pinctrl_exit); 42952130b60SViresh Kumar 43010d8935fSViresh Kumar MODULE_AUTHOR("Viresh Kumar <viresh.linux@gmail.com>"); 43152130b60SViresh Kumar MODULE_DESCRIPTION("ST Microelectronics SPEAr310 pinctrl driver"); 43252130b60SViresh Kumar MODULE_LICENSE("GPL v2"); 43352130b60SViresh Kumar MODULE_DEVICE_TABLE(of, SPEAr310_pinctrl_of_match); 434