@@ -276,8 +276,8 @@ static int tegra_pinctrl_set_mux(struct pinctrl_dev *pctldev,
276
276
return 0 ;
277
277
}
278
278
279
- static const struct tegra_pingroup * tegra_pinctrl_get_group (struct pinctrl_dev * pctldev ,
280
- unsigned int offset )
279
+ static int tegra_pinctrl_get_group_index (struct pinctrl_dev * pctldev ,
280
+ unsigned int offset )
281
281
{
282
282
struct tegra_pmx * pmx = pinctrl_dev_get_drvdata (pctldev );
283
283
unsigned int group , num_pins , j ;
@@ -290,12 +290,35 @@ static const struct tegra_pingroup *tegra_pinctrl_get_group(struct pinctrl_dev *
290
290
continue ;
291
291
for (j = 0 ; j < num_pins ; j ++ ) {
292
292
if (offset == pins [j ])
293
- return & pmx -> soc -> groups [ group ] ;
293
+ return group ;
294
294
}
295
295
}
296
296
297
- dev_err (pctldev -> dev , "Pingroup not found for pin %u\n" , offset );
298
- return NULL ;
297
+ return - EINVAL ;
298
+ }
299
+
300
+ static const struct tegra_pingroup * tegra_pinctrl_get_group (struct pinctrl_dev * pctldev ,
301
+ unsigned int offset ,
302
+ int group_index )
303
+ {
304
+ struct tegra_pmx * pmx = pinctrl_dev_get_drvdata (pctldev );
305
+
306
+ if (group_index < 0 || group_index > pmx -> soc -> ngroups )
307
+ return NULL ;
308
+
309
+ return & pmx -> soc -> groups [group_index ];
310
+ }
311
+
312
+ static struct tegra_pingroup_config * tegra_pinctrl_get_group_config (struct pinctrl_dev * pctldev ,
313
+ unsigned int offset ,
314
+ int group_index )
315
+ {
316
+ struct tegra_pmx * pmx = pinctrl_dev_get_drvdata (pctldev );
317
+
318
+ if (group_index < 0 )
319
+ return NULL ;
320
+
321
+ return & pmx -> pingroup_configs [group_index ];
299
322
}
300
323
301
324
static int tegra_pinctrl_gpio_request_enable (struct pinctrl_dev * pctldev ,
@@ -304,20 +327,27 @@ static int tegra_pinctrl_gpio_request_enable(struct pinctrl_dev *pctldev,
304
327
{
305
328
struct tegra_pmx * pmx = pinctrl_dev_get_drvdata (pctldev );
306
329
const struct tegra_pingroup * group ;
330
+ struct tegra_pingroup_config * config ;
331
+ int group_index ;
307
332
u32 value ;
308
333
309
334
if (!pmx -> soc -> sfsel_in_mux )
310
335
return 0 ;
311
336
312
- group = tegra_pinctrl_get_group (pctldev , offset );
337
+ group_index = tegra_pinctrl_get_group_index (pctldev , offset );
338
+ group = tegra_pinctrl_get_group (pctldev , offset , group_index );
313
339
314
340
if (!group )
315
341
return - EINVAL ;
316
342
317
343
if (group -> mux_reg < 0 || group -> sfsel_bit < 0 )
318
344
return - EINVAL ;
319
345
346
+ config = tegra_pinctrl_get_group_config (pctldev , offset , group_index );
347
+ if (!config )
348
+ return - EINVAL ;
320
349
value = pmx_readl (pmx , group -> mux_bank , group -> mux_reg );
350
+ config -> is_sfsel = (value & BIT (group -> sfsel_bit )) != 0 ;
321
351
value &= ~BIT (group -> sfsel_bit );
322
352
pmx_writel (pmx , value , group -> mux_bank , group -> mux_reg );
323
353
@@ -330,21 +360,28 @@ static void tegra_pinctrl_gpio_disable_free(struct pinctrl_dev *pctldev,
330
360
{
331
361
struct tegra_pmx * pmx = pinctrl_dev_get_drvdata (pctldev );
332
362
const struct tegra_pingroup * group ;
363
+ struct tegra_pingroup_config * config ;
364
+ int group_index ;
333
365
u32 value ;
334
366
335
367
if (!pmx -> soc -> sfsel_in_mux )
336
368
return ;
337
369
338
- group = tegra_pinctrl_get_group (pctldev , offset );
370
+ group_index = tegra_pinctrl_get_group_index (pctldev , offset );
371
+ group = tegra_pinctrl_get_group (pctldev , offset , group_index );
339
372
340
373
if (!group )
341
374
return ;
342
375
343
376
if (group -> mux_reg < 0 || group -> sfsel_bit < 0 )
344
377
return ;
345
378
379
+ config = tegra_pinctrl_get_group_config (pctldev , offset , group_index );
380
+ if (!config )
381
+ return ;
346
382
value = pmx_readl (pmx , group -> mux_bank , group -> mux_reg );
347
- value |= BIT (group -> sfsel_bit );
383
+ if (config -> is_sfsel )
384
+ value |= BIT (group -> sfsel_bit );
348
385
pmx_writel (pmx , value , group -> mux_bank , group -> mux_reg );
349
386
}
350
387
@@ -799,6 +836,12 @@ int tegra_pinctrl_probe(struct platform_device *pdev,
799
836
pmx -> dev = & pdev -> dev ;
800
837
pmx -> soc = soc_data ;
801
838
839
+ pmx -> pingroup_configs = devm_kcalloc (& pdev -> dev ,
840
+ pmx -> soc -> ngroups , sizeof (* pmx -> pingroup_configs ),
841
+ GFP_KERNEL );
842
+ if (!pmx -> pingroup_configs )
843
+ return - ENOMEM ;
844
+
802
845
/*
803
846
* Each mux group will appear in 4 functions' list of groups.
804
847
* This over-allocates slightly, since not all groups are mux groups.
0 commit comments