1414
1515#include <linux/mfd/tps6594.h>
1616
17- #define TPS6594_PINCTRL_PINS_NB 11
18-
1917#define TPS6594_PINCTRL_GPIO_FUNCTION 0
2018#define TPS6594_PINCTRL_SCL_I2C2_CS_SPI_FUNCTION 1
2119#define TPS6594_PINCTRL_TRIG_WDOG_FUNCTION 1
4038#define TPS6594_PINCTRL_SYNCCLKOUT_FUNCTION_GPIO8 3
4139#define TPS6594_PINCTRL_CLK32KOUT_FUNCTION_GPIO9 3
4240
41+ /* TPS65224 pin muxval */
42+ #define TPS65224_PINCTRL_SDA_I2C2_SDO_SPI_FUNCTION 1
43+ #define TPS65224_PINCTRL_SCL_I2C2_CS_SPI_FUNCTION 1
44+ #define TPS65224_PINCTRL_VMON1_FUNCTION 1
45+ #define TPS65224_PINCTRL_VMON2_FUNCTION 1
46+ #define TPS65224_PINCTRL_WKUP_FUNCTION 1
47+ #define TPS65224_PINCTRL_NSLEEP2_FUNCTION 2
48+ #define TPS65224_PINCTRL_NSLEEP1_FUNCTION 2
49+ #define TPS65224_PINCTRL_SYNCCLKIN_FUNCTION 2
50+ #define TPS65224_PINCTRL_NERR_MCU_FUNCTION 2
51+ #define TPS65224_PINCTRL_NINT_FUNCTION 3
52+ #define TPS65224_PINCTRL_TRIG_WDOG_FUNCTION 3
53+ #define TPS65224_PINCTRL_PB_FUNCTION 3
54+ #define TPS65224_PINCTRL_ADC_IN_FUNCTION 3
55+
56+ /* TPS65224 Special muxval for recalcitrant pins */
57+ #define TPS65224_PINCTRL_NSLEEP2_FUNCTION_GPIO5 1
58+ #define TPS65224_PINCTRL_WKUP_FUNCTION_GPIO5 4
59+ #define TPS65224_PINCTRL_SYNCCLKIN_FUNCTION_GPIO5 3
60+
4361#define TPS6594_OFFSET_GPIO_SEL 5
4462
45- #define FUNCTION (fname , v ) \
63+ #define TPS65224_NGPIO_PER_REG 6
64+ #define TPS6594_NGPIO_PER_REG 8
65+
66+ #define FUNCTION (dev_name , fname , v ) \
4667{ \
4768 .pinfunction = PINCTRL_PINFUNCTION(#fname, \
48- tps6594_ ##fname##_func_group_names, \
49- ARRAY_SIZE(tps6594_ ##fname##_func_group_names)),\
69+ dev_name##_ ##fname##_func_group_names, \
70+ ARRAY_SIZE(dev_name##_ ##fname##_func_group_names)),\
5071 .muxval = v, \
5172}
5273
53- static const struct pinctrl_pin_desc tps6594_pins [TPS6594_PINCTRL_PINS_NB ] = {
74+ static const struct pinctrl_pin_desc tps6594_pins [] = {
5475 PINCTRL_PIN (0 , "GPIO0" ), PINCTRL_PIN (1 , "GPIO1" ),
5576 PINCTRL_PIN (2 , "GPIO2" ), PINCTRL_PIN (3 , "GPIO3" ),
5677 PINCTRL_PIN (4 , "GPIO4" ), PINCTRL_PIN (5 , "GPIO5" ),
@@ -143,30 +164,127 @@ static const char *const tps6594_syncclkin_func_group_names[] = {
143164 "GPIO9" ,
144165};
145166
167+ static const struct pinctrl_pin_desc tps65224_pins [] = {
168+ PINCTRL_PIN (0 , "GPIO0" ), PINCTRL_PIN (1 , "GPIO1" ),
169+ PINCTRL_PIN (2 , "GPIO2" ), PINCTRL_PIN (3 , "GPIO3" ),
170+ PINCTRL_PIN (4 , "GPIO4" ), PINCTRL_PIN (5 , "GPIO5" ),
171+ };
172+
173+ static const char * const tps65224_gpio_func_group_names [] = {
174+ "GPIO0" , "GPIO1" , "GPIO2" , "GPIO3" , "GPIO4" , "GPIO5" ,
175+ };
176+
177+ static const char * const tps65224_sda_i2c2_sdo_spi_func_group_names [] = {
178+ "GPIO0" ,
179+ };
180+
181+ static const char * const tps65224_nsleep2_func_group_names [] = {
182+ "GPIO0" , "GPIO5" ,
183+ };
184+
185+ static const char * const tps65224_nint_func_group_names [] = {
186+ "GPIO0" ,
187+ };
188+
189+ static const char * const tps65224_scl_i2c2_cs_spi_func_group_names [] = {
190+ "GPIO1" ,
191+ };
192+
193+ static const char * const tps65224_nsleep1_func_group_names [] = {
194+ "GPIO1" , "GPIO2" , "GPIO3" ,
195+ };
196+
197+ static const char * const tps65224_trig_wdog_func_group_names [] = {
198+ "GPIO1" ,
199+ };
200+
201+ static const char * const tps65224_vmon1_func_group_names [] = {
202+ "GPIO2" ,
203+ };
204+
205+ static const char * const tps65224_pb_func_group_names [] = {
206+ "GPIO2" ,
207+ };
208+
209+ static const char * const tps65224_vmon2_func_group_names [] = {
210+ "GPIO3" ,
211+ };
212+
213+ static const char * const tps65224_adc_in_func_group_names [] = {
214+ "GPIO3" , "GPIO4" ,
215+ };
216+
217+ static const char * const tps65224_wkup_func_group_names [] = {
218+ "GPIO4" , "GPIO5" ,
219+ };
220+
221+ static const char * const tps65224_syncclkin_func_group_names [] = {
222+ "GPIO4" , "GPIO5" ,
223+ };
224+
225+ static const char * const tps65224_nerr_mcu_func_group_names [] = {
226+ "GPIO5" ,
227+ };
228+
146229struct tps6594_pinctrl_function {
147230 struct pinfunction pinfunction ;
148231 u8 muxval ;
149232};
150233
234+ struct muxval_remap {
235+ unsigned int group ;
236+ u8 muxval ;
237+ u8 remap ;
238+ };
239+
240+ struct muxval_remap tps65224_muxval_remap [] = {
241+ {5 , TPS6594_PINCTRL_DISABLE_WDOG_FUNCTION , TPS65224_PINCTRL_WKUP_FUNCTION_GPIO5 },
242+ {5 , TPS65224_PINCTRL_SYNCCLKIN_FUNCTION , TPS65224_PINCTRL_SYNCCLKIN_FUNCTION_GPIO5 },
243+ {5 , TPS65224_PINCTRL_NSLEEP2_FUNCTION , TPS65224_PINCTRL_NSLEEP2_FUNCTION_GPIO5 },
244+ };
245+
246+ struct muxval_remap tps6594_muxval_remap [] = {
247+ {8 , TPS6594_PINCTRL_DISABLE_WDOG_FUNCTION , TPS6594_PINCTRL_DISABLE_WDOG_FUNCTION_GPIO8 },
248+ {8 , TPS6594_PINCTRL_SYNCCLKOUT_FUNCTION , TPS6594_PINCTRL_SYNCCLKOUT_FUNCTION_GPIO8 },
249+ {9 , TPS6594_PINCTRL_CLK32KOUT_FUNCTION , TPS6594_PINCTRL_CLK32KOUT_FUNCTION_GPIO9 },
250+ };
251+
151252static const struct tps6594_pinctrl_function pinctrl_functions [] = {
152- FUNCTION (gpio , TPS6594_PINCTRL_GPIO_FUNCTION ),
153- FUNCTION (nsleep1 , TPS6594_PINCTRL_NSLEEP1_FUNCTION ),
154- FUNCTION (nsleep2 , TPS6594_PINCTRL_NSLEEP2_FUNCTION ),
155- FUNCTION (wkup1 , TPS6594_PINCTRL_WKUP1_FUNCTION ),
156- FUNCTION (wkup2 , TPS6594_PINCTRL_WKUP2_FUNCTION ),
157- FUNCTION (scl_i2c2_cs_spi , TPS6594_PINCTRL_SCL_I2C2_CS_SPI_FUNCTION ),
158- FUNCTION (nrstout_soc , TPS6594_PINCTRL_NRSTOUT_SOC_FUNCTION ),
159- FUNCTION (trig_wdog , TPS6594_PINCTRL_TRIG_WDOG_FUNCTION ),
160- FUNCTION (sda_i2c2_sdo_spi , TPS6594_PINCTRL_SDA_I2C2_SDO_SPI_FUNCTION ),
161- FUNCTION (clk32kout , TPS6594_PINCTRL_CLK32KOUT_FUNCTION ),
162- FUNCTION (nerr_soc , TPS6594_PINCTRL_NERR_SOC_FUNCTION ),
163- FUNCTION (sclk_spmi , TPS6594_PINCTRL_SCLK_SPMI_FUNCTION ),
164- FUNCTION (sdata_spmi , TPS6594_PINCTRL_SDATA_SPMI_FUNCTION ),
165- FUNCTION (nerr_mcu , TPS6594_PINCTRL_NERR_MCU_FUNCTION ),
166- FUNCTION (syncclkout , TPS6594_PINCTRL_SYNCCLKOUT_FUNCTION ),
167- FUNCTION (disable_wdog , TPS6594_PINCTRL_DISABLE_WDOG_FUNCTION ),
168- FUNCTION (pdog , TPS6594_PINCTRL_PDOG_FUNCTION ),
169- FUNCTION (syncclkin , TPS6594_PINCTRL_SYNCCLKIN_FUNCTION ),
253+ FUNCTION (tps6594 , gpio , TPS6594_PINCTRL_GPIO_FUNCTION ),
254+ FUNCTION (tps6594 , nsleep1 , TPS6594_PINCTRL_NSLEEP1_FUNCTION ),
255+ FUNCTION (tps6594 , nsleep2 , TPS6594_PINCTRL_NSLEEP2_FUNCTION ),
256+ FUNCTION (tps6594 , wkup1 , TPS6594_PINCTRL_WKUP1_FUNCTION ),
257+ FUNCTION (tps6594 , wkup2 , TPS6594_PINCTRL_WKUP2_FUNCTION ),
258+ FUNCTION (tps6594 , scl_i2c2_cs_spi , TPS6594_PINCTRL_SCL_I2C2_CS_SPI_FUNCTION ),
259+ FUNCTION (tps6594 , nrstout_soc , TPS6594_PINCTRL_NRSTOUT_SOC_FUNCTION ),
260+ FUNCTION (tps6594 , trig_wdog , TPS6594_PINCTRL_TRIG_WDOG_FUNCTION ),
261+ FUNCTION (tps6594 , sda_i2c2_sdo_spi , TPS6594_PINCTRL_SDA_I2C2_SDO_SPI_FUNCTION ),
262+ FUNCTION (tps6594 , clk32kout , TPS6594_PINCTRL_CLK32KOUT_FUNCTION ),
263+ FUNCTION (tps6594 , nerr_soc , TPS6594_PINCTRL_NERR_SOC_FUNCTION ),
264+ FUNCTION (tps6594 , sclk_spmi , TPS6594_PINCTRL_SCLK_SPMI_FUNCTION ),
265+ FUNCTION (tps6594 , sdata_spmi , TPS6594_PINCTRL_SDATA_SPMI_FUNCTION ),
266+ FUNCTION (tps6594 , nerr_mcu , TPS6594_PINCTRL_NERR_MCU_FUNCTION ),
267+ FUNCTION (tps6594 , syncclkout , TPS6594_PINCTRL_SYNCCLKOUT_FUNCTION ),
268+ FUNCTION (tps6594 , disable_wdog , TPS6594_PINCTRL_DISABLE_WDOG_FUNCTION ),
269+ FUNCTION (tps6594 , pdog , TPS6594_PINCTRL_PDOG_FUNCTION ),
270+ FUNCTION (tps6594 , syncclkin , TPS6594_PINCTRL_SYNCCLKIN_FUNCTION ),
271+ };
272+
273+ static const struct tps6594_pinctrl_function tps65224_pinctrl_functions [] = {
274+ FUNCTION (tps65224 , gpio , TPS6594_PINCTRL_GPIO_FUNCTION ),
275+ FUNCTION (tps65224 , sda_i2c2_sdo_spi , TPS65224_PINCTRL_SDA_I2C2_SDO_SPI_FUNCTION ),
276+ FUNCTION (tps65224 , nsleep2 , TPS65224_PINCTRL_NSLEEP2_FUNCTION ),
277+ FUNCTION (tps65224 , nint , TPS65224_PINCTRL_NINT_FUNCTION ),
278+ FUNCTION (tps65224 , scl_i2c2_cs_spi , TPS65224_PINCTRL_SCL_I2C2_CS_SPI_FUNCTION ),
279+ FUNCTION (tps65224 , nsleep1 , TPS65224_PINCTRL_NSLEEP1_FUNCTION ),
280+ FUNCTION (tps65224 , trig_wdog , TPS65224_PINCTRL_TRIG_WDOG_FUNCTION ),
281+ FUNCTION (tps65224 , vmon1 , TPS65224_PINCTRL_VMON1_FUNCTION ),
282+ FUNCTION (tps65224 , pb , TPS65224_PINCTRL_PB_FUNCTION ),
283+ FUNCTION (tps65224 , vmon2 , TPS65224_PINCTRL_VMON2_FUNCTION ),
284+ FUNCTION (tps65224 , adc_in , TPS65224_PINCTRL_ADC_IN_FUNCTION ),
285+ FUNCTION (tps65224 , wkup , TPS65224_PINCTRL_WKUP_FUNCTION ),
286+ FUNCTION (tps65224 , syncclkin , TPS65224_PINCTRL_SYNCCLKIN_FUNCTION ),
287+ FUNCTION (tps65224 , nerr_mcu , TPS65224_PINCTRL_NERR_MCU_FUNCTION ),
170288};
171289
172290struct tps6594_pinctrl {
@@ -175,6 +293,31 @@ struct tps6594_pinctrl {
175293 struct pinctrl_dev * pctl_dev ;
176294 const struct tps6594_pinctrl_function * funcs ;
177295 const struct pinctrl_pin_desc * pins ;
296+ int func_cnt ;
297+ int num_pins ;
298+ u8 mux_sel_mask ;
299+ unsigned int remap_cnt ;
300+ struct muxval_remap * remap ;
301+ };
302+
303+ static struct tps6594_pinctrl tps65224_template_pinctrl = {
304+ .funcs = tps65224_pinctrl_functions ,
305+ .func_cnt = ARRAY_SIZE (tps65224_pinctrl_functions ),
306+ .pins = tps65224_pins ,
307+ .num_pins = ARRAY_SIZE (tps65224_pins ),
308+ .mux_sel_mask = TPS65224_MASK_GPIO_SEL ,
309+ .remap = tps65224_muxval_remap ,
310+ .remap_cnt = ARRAY_SIZE (tps65224_muxval_remap ),
311+ };
312+
313+ static struct tps6594_pinctrl tps6594_template_pinctrl = {
314+ .funcs = pinctrl_functions ,
315+ .func_cnt = ARRAY_SIZE (pinctrl_functions ),
316+ .pins = tps6594_pins ,
317+ .num_pins = ARRAY_SIZE (tps6594_pins ),
318+ .mux_sel_mask = TPS6594_MASK_GPIO_SEL ,
319+ .remap = tps6594_muxval_remap ,
320+ .remap_cnt = ARRAY_SIZE (tps6594_muxval_remap ),
178321};
179322
180323static int tps6594_gpio_regmap_xlate (struct gpio_regmap * gpio ,
@@ -201,7 +344,9 @@ static int tps6594_gpio_regmap_xlate(struct gpio_regmap *gpio,
201344
202345static int tps6594_pmx_func_cnt (struct pinctrl_dev * pctldev )
203346{
204- return ARRAY_SIZE (pinctrl_functions );
347+ struct tps6594_pinctrl * pinctrl = pinctrl_dev_get_drvdata (pctldev );
348+
349+ return pinctrl -> func_cnt ;
205350}
206351
207352static const char * tps6594_pmx_func_name (struct pinctrl_dev * pctldev ,
@@ -229,27 +374,31 @@ static int tps6594_pmx_set(struct tps6594_pinctrl *pinctrl, unsigned int pin,
229374 u8 muxval )
230375{
231376 u8 mux_sel_val = muxval << TPS6594_OFFSET_GPIO_SEL ;
377+ u8 mux_sel_mask = pinctrl -> mux_sel_mask ;
378+
379+ if (pinctrl -> tps -> chip_id == TPS65224 && pin == 5 ) {
380+ /* GPIO6 has a different mask in TPS65224*/
381+ mux_sel_mask = TPS65224_MASK_GPIO_SEL_GPIO6 ;
382+ }
232383
233384 return regmap_update_bits (pinctrl -> tps -> regmap ,
234385 TPS6594_REG_GPIOX_CONF (pin ),
235- TPS6594_MASK_GPIO_SEL , mux_sel_val );
386+ mux_sel_mask , mux_sel_val );
236387}
237388
238389static int tps6594_pmx_set_mux (struct pinctrl_dev * pctldev ,
239390 unsigned int function , unsigned int group )
240391{
241392 struct tps6594_pinctrl * pinctrl = pinctrl_dev_get_drvdata (pctldev );
242393 u8 muxval = pinctrl -> funcs [function ].muxval ;
243-
244- /* Some pins don't have the same muxval for the same function... */
245- if (group == 8 ) {
246- if (muxval == TPS6594_PINCTRL_DISABLE_WDOG_FUNCTION )
247- muxval = TPS6594_PINCTRL_DISABLE_WDOG_FUNCTION_GPIO8 ;
248- else if (muxval == TPS6594_PINCTRL_SYNCCLKOUT_FUNCTION )
249- muxval = TPS6594_PINCTRL_SYNCCLKOUT_FUNCTION_GPIO8 ;
250- } else if (group == 9 ) {
251- if (muxval == TPS6594_PINCTRL_CLK32KOUT_FUNCTION )
252- muxval = TPS6594_PINCTRL_CLK32KOUT_FUNCTION_GPIO9 ;
394+ unsigned int remap_cnt = pinctrl -> remap_cnt ;
395+ struct muxval_remap * remap = pinctrl -> remap ;
396+
397+ for (unsigned int i = 0 ; i < remap_cnt ; i ++ ) {
398+ if (group == remap [i ].group && muxval == remap [i ].muxval ) {
399+ muxval = remap [i ].remap ;
400+ break ;
401+ }
253402 }
254403
255404 return tps6594_pmx_set (pinctrl , group , muxval );
@@ -276,7 +425,9 @@ static const struct pinmux_ops tps6594_pmx_ops = {
276425
277426static int tps6594_groups_cnt (struct pinctrl_dev * pctldev )
278427{
279- return ARRAY_SIZE (tps6594_pins );
428+ struct tps6594_pinctrl * pinctrl = pinctrl_dev_get_drvdata (pctldev );
429+
430+ return pinctrl -> num_pins ;
280431}
281432
282433static int tps6594_group_pins (struct pinctrl_dev * pctldev ,
@@ -318,33 +469,54 @@ static int tps6594_pinctrl_probe(struct platform_device *pdev)
318469 pctrl_desc = devm_kzalloc (dev , sizeof (* pctrl_desc ), GFP_KERNEL );
319470 if (!pctrl_desc )
320471 return - ENOMEM ;
321- pctrl_desc -> name = dev_name (dev );
322- pctrl_desc -> owner = THIS_MODULE ;
323- pctrl_desc -> pins = tps6594_pins ;
324- pctrl_desc -> npins = ARRAY_SIZE (tps6594_pins );
325- pctrl_desc -> pctlops = & tps6594_pctrl_ops ;
326- pctrl_desc -> pmxops = & tps6594_pmx_ops ;
327472
328473 pinctrl = devm_kzalloc (dev , sizeof (* pinctrl ), GFP_KERNEL );
329474 if (!pinctrl )
330475 return - ENOMEM ;
331- pinctrl -> tps = dev_get_drvdata (dev -> parent );
332- pinctrl -> funcs = pinctrl_functions ;
333- pinctrl -> pins = tps6594_pins ;
334- pinctrl -> pctl_dev = devm_pinctrl_register (dev , pctrl_desc , pinctrl );
335- if (IS_ERR (pinctrl -> pctl_dev ))
336- return dev_err_probe (dev , PTR_ERR (pinctrl -> pctl_dev ),
337- "Couldn't register pinctrl driver\n" );
476+
477+ switch (tps -> chip_id ) {
478+ case TPS65224 :
479+ pctrl_desc -> pins = tps65224_pins ;
480+ pctrl_desc -> npins = ARRAY_SIZE (tps65224_pins );
481+
482+ * pinctrl = tps65224_template_pinctrl ;
483+
484+ config .ngpio = ARRAY_SIZE (tps65224_gpio_func_group_names );
485+ config .ngpio_per_reg = TPS65224_NGPIO_PER_REG ;
486+ break ;
487+ case TPS6593 :
488+ case TPS6594 :
489+ pctrl_desc -> pins = tps6594_pins ;
490+ pctrl_desc -> npins = ARRAY_SIZE (tps6594_pins );
491+
492+ * pinctrl = tps6594_template_pinctrl ;
493+
494+ config .ngpio = ARRAY_SIZE (tps6594_gpio_func_group_names );
495+ config .ngpio_per_reg = TPS6594_NGPIO_PER_REG ;
496+ break ;
497+ default :
498+ break ;
499+ }
500+
501+ pinctrl -> tps = tps ;
502+
503+ pctrl_desc -> name = dev_name (dev );
504+ pctrl_desc -> owner = THIS_MODULE ;
505+ pctrl_desc -> pctlops = & tps6594_pctrl_ops ;
506+ pctrl_desc -> pmxops = & tps6594_pmx_ops ;
338507
339508 config .parent = tps -> dev ;
340509 config .regmap = tps -> regmap ;
341- config .ngpio = TPS6594_PINCTRL_PINS_NB ;
342- config .ngpio_per_reg = 8 ;
343510 config .reg_dat_base = TPS6594_REG_GPIO_IN_1 ;
344511 config .reg_set_base = TPS6594_REG_GPIO_OUT_1 ;
345512 config .reg_dir_out_base = TPS6594_REG_GPIOX_CONF (0 );
346513 config .reg_mask_xlate = tps6594_gpio_regmap_xlate ;
347514
515+ pinctrl -> pctl_dev = devm_pinctrl_register (dev , pctrl_desc , pinctrl );
516+ if (IS_ERR (pinctrl -> pctl_dev ))
517+ return dev_err_probe (dev , PTR_ERR (pinctrl -> pctl_dev ),
518+ "Couldn't register pinctrl driver\n" );
519+
348520 pinctrl -> gpio_regmap = devm_gpio_regmap_register (dev , & config );
349521 if (IS_ERR (pinctrl -> gpio_regmap ))
350522 return dev_err_probe (dev , PTR_ERR (pinctrl -> gpio_regmap ),
@@ -369,5 +541,6 @@ static struct platform_driver tps6594_pinctrl_driver = {
369541module_platform_driver (tps6594_pinctrl_driver );
370542
371543MODULE_AUTHOR ("Esteban Blanc <eblanc@baylibre.com>" );
544+ MODULE_AUTHOR ("Nirmala Devi Mal Nadar <m.nirmaladevi@ltts.com>" );
372545MODULE_DESCRIPTION ("TPS6594 pinctrl and GPIO driver" );
373546MODULE_LICENSE ("GPL" );
0 commit comments