1
2
3
4
5
6
7
8
9
10
11
12#include <linux/init.h>
13#include <linux/module.h>
14#include <linux/io.h>
15#include <linux/slab.h>
16#include <linux/err.h>
17#include <linux/list.h>
18#include <linux/interrupt.h>
19
20#include <linux/irqchip/chained_irq.h>
21
22#include <linux/of.h>
23#include <linux/of_device.h>
24#include <linux/of_address.h>
25#include <linux/of_irq.h>
26
27#include <linux/pinctrl/pinctrl.h>
28#include <linux/pinctrl/pinmux.h>
29#include <linux/pinctrl/pinconf-generic.h>
30
31#include <linux/platform_data/pinctrl-single.h>
32
33#include "core.h"
34#include "devicetree.h"
35#include "pinconf.h"
36#include "pinmux.h"
37
38#define DRIVER_NAME "pinctrl-single"
39#define PCS_OFF_DISABLED ~0U
40
41
42
43
44
45
46
47struct pcs_func_vals {
48 void __iomem *reg;
49 unsigned val;
50 unsigned mask;
51};
52
53
54
55
56
57
58
59
60
61
62struct pcs_conf_vals {
63 enum pin_config_param param;
64 unsigned val;
65 unsigned enable;
66 unsigned disable;
67 unsigned mask;
68};
69
70
71
72
73
74
75struct pcs_conf_type {
76 const char *name;
77 enum pin_config_param param;
78};
79
80
81
82
83
84
85
86
87
88
89
90
91struct pcs_function {
92 const char *name;
93 struct pcs_func_vals *vals;
94 unsigned nvals;
95 const char **pgnames;
96 int npgnames;
97 struct pcs_conf_vals *conf;
98 int nconfs;
99 struct list_head node;
100};
101
102
103
104
105
106
107
108
109struct pcs_gpiofunc_range {
110 unsigned offset;
111 unsigned npins;
112 unsigned gpiofunc;
113 struct list_head node;
114};
115
116
117
118
119
120
121
122
123
124
125struct pcs_data {
126 struct pinctrl_pin_desc *pa;
127 int cur;
128};
129
130
131
132
133
134
135
136
137
138struct pcs_soc_data {
139 unsigned flags;
140 int irq;
141 unsigned irq_enable_mask;
142 unsigned irq_status_mask;
143 void (*rearm)(void);
144};
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176struct pcs_device {
177 struct resource *res;
178 void __iomem *base;
179 void *saved_vals;
180 unsigned size;
181 struct device *dev;
182 struct device_node *np;
183 struct pinctrl_dev *pctl;
184 unsigned flags;
185#define PCS_CONTEXT_LOSS_OFF (1 << 3)
186#define PCS_QUIRK_SHARED_IRQ (1 << 2)
187#define PCS_FEAT_IRQ (1 << 1)
188#define PCS_FEAT_PINCONF (1 << 0)
189 struct property *missing_nr_pinctrl_cells;
190 struct pcs_soc_data socdata;
191 raw_spinlock_t lock;
192 struct mutex mutex;
193 unsigned width;
194 unsigned fmask;
195 unsigned fshift;
196 unsigned foff;
197 unsigned fmax;
198 bool bits_per_mux;
199 unsigned bits_per_pin;
200 struct pcs_data pins;
201 struct list_head gpiofuncs;
202 struct list_head irqs;
203 struct irq_chip chip;
204 struct irq_domain *domain;
205 struct pinctrl_desc desc;
206 unsigned (*read)(void __iomem *reg);
207 void (*write)(unsigned val, void __iomem *reg);
208};
209
210#define PCS_QUIRK_HAS_SHARED_IRQ (pcs->flags & PCS_QUIRK_SHARED_IRQ)
211#define PCS_HAS_IRQ (pcs->flags & PCS_FEAT_IRQ)
212#define PCS_HAS_PINCONF (pcs->flags & PCS_FEAT_PINCONF)
213
214static int pcs_pinconf_get(struct pinctrl_dev *pctldev, unsigned pin,
215 unsigned long *config);
216static int pcs_pinconf_set(struct pinctrl_dev *pctldev, unsigned pin,
217 unsigned long *configs, unsigned num_configs);
218
219static enum pin_config_param pcs_bias[] = {
220 PIN_CONFIG_BIAS_PULL_DOWN,
221 PIN_CONFIG_BIAS_PULL_UP,
222};
223
224
225
226
227
228
229static struct lock_class_key pcs_lock_class;
230
231
232static struct lock_class_key pcs_request_class;
233
234
235
236
237
238
239
240
241
242
243static unsigned __maybe_unused pcs_readb(void __iomem *reg)
244{
245 return readb(reg);
246}
247
248static unsigned __maybe_unused pcs_readw(void __iomem *reg)
249{
250 return readw(reg);
251}
252
253static unsigned __maybe_unused pcs_readl(void __iomem *reg)
254{
255 return readl(reg);
256}
257
258static void __maybe_unused pcs_writeb(unsigned val, void __iomem *reg)
259{
260 writeb(val, reg);
261}
262
263static void __maybe_unused pcs_writew(unsigned val, void __iomem *reg)
264{
265 writew(val, reg);
266}
267
268static void __maybe_unused pcs_writel(unsigned val, void __iomem *reg)
269{
270 writel(val, reg);
271}
272
273static unsigned int pcs_pin_reg_offset_get(struct pcs_device *pcs,
274 unsigned int pin)
275{
276 unsigned int mux_bytes = pcs->width / BITS_PER_BYTE;
277
278 if (pcs->bits_per_mux) {
279 unsigned int pin_offset_bytes;
280
281 pin_offset_bytes = (pcs->bits_per_pin * pin) / BITS_PER_BYTE;
282 return (pin_offset_bytes / mux_bytes) * mux_bytes;
283 }
284
285 return pin * mux_bytes;
286}
287
288static unsigned int pcs_pin_shift_reg_get(struct pcs_device *pcs,
289 unsigned int pin)
290{
291 return (pin % (pcs->width / pcs->bits_per_pin)) * pcs->bits_per_pin;
292}
293
294static void pcs_pin_dbg_show(struct pinctrl_dev *pctldev,
295 struct seq_file *s,
296 unsigned pin)
297{
298 struct pcs_device *pcs;
299 unsigned int val;
300 unsigned long offset;
301 size_t pa;
302
303 pcs = pinctrl_dev_get_drvdata(pctldev);
304
305 offset = pcs_pin_reg_offset_get(pcs, pin);
306 val = pcs->read(pcs->base + offset);
307
308 if (pcs->bits_per_mux)
309 val &= pcs->fmask << pcs_pin_shift_reg_get(pcs, pin);
310
311 pa = pcs->res->start + offset;
312
313 seq_printf(s, "%zx %08x %s ", pa, val, DRIVER_NAME);
314}
315
316static void pcs_dt_free_map(struct pinctrl_dev *pctldev,
317 struct pinctrl_map *map, unsigned num_maps)
318{
319 struct pcs_device *pcs;
320
321 pcs = pinctrl_dev_get_drvdata(pctldev);
322 devm_kfree(pcs->dev, map);
323}
324
325static int pcs_dt_node_to_map(struct pinctrl_dev *pctldev,
326 struct device_node *np_config,
327 struct pinctrl_map **map, unsigned *num_maps);
328
329static const struct pinctrl_ops pcs_pinctrl_ops = {
330 .get_groups_count = pinctrl_generic_get_group_count,
331 .get_group_name = pinctrl_generic_get_group_name,
332 .get_group_pins = pinctrl_generic_get_group_pins,
333 .pin_dbg_show = pcs_pin_dbg_show,
334 .dt_node_to_map = pcs_dt_node_to_map,
335 .dt_free_map = pcs_dt_free_map,
336};
337
338static int pcs_get_function(struct pinctrl_dev *pctldev, unsigned pin,
339 struct pcs_function **func)
340{
341 struct pcs_device *pcs = pinctrl_dev_get_drvdata(pctldev);
342 struct pin_desc *pdesc = pin_desc_get(pctldev, pin);
343 const struct pinctrl_setting_mux *setting;
344 struct function_desc *function;
345 unsigned fselector;
346
347
348 setting = pdesc->mux_setting;
349 if (!setting)
350 return -ENOTSUPP;
351 fselector = setting->func;
352 function = pinmux_generic_get_function(pctldev, fselector);
353 *func = function->data;
354 if (!(*func)) {
355 dev_err(pcs->dev, "%s could not find function%i\n",
356 __func__, fselector);
357 return -ENOTSUPP;
358 }
359 return 0;
360}
361
362static int pcs_set_mux(struct pinctrl_dev *pctldev, unsigned fselector,
363 unsigned group)
364{
365 struct pcs_device *pcs;
366 struct function_desc *function;
367 struct pcs_function *func;
368 int i;
369
370 pcs = pinctrl_dev_get_drvdata(pctldev);
371
372 if (!pcs->fmask)
373 return 0;
374 function = pinmux_generic_get_function(pctldev, fselector);
375 func = function->data;
376 if (!func)
377 return -EINVAL;
378
379 dev_dbg(pcs->dev, "enabling %s function%i\n",
380 func->name, fselector);
381
382 for (i = 0; i < func->nvals; i++) {
383 struct pcs_func_vals *vals;
384 unsigned long flags;
385 unsigned val, mask;
386
387 vals = &func->vals[i];
388 raw_spin_lock_irqsave(&pcs->lock, flags);
389 val = pcs->read(vals->reg);
390
391 if (pcs->bits_per_mux)
392 mask = vals->mask;
393 else
394 mask = pcs->fmask;
395
396 val &= ~mask;
397 val |= (vals->val & mask);
398 pcs->write(val, vals->reg);
399 raw_spin_unlock_irqrestore(&pcs->lock, flags);
400 }
401
402 return 0;
403}
404
405static int pcs_request_gpio(struct pinctrl_dev *pctldev,
406 struct pinctrl_gpio_range *range, unsigned pin)
407{
408 struct pcs_device *pcs = pinctrl_dev_get_drvdata(pctldev);
409 struct pcs_gpiofunc_range *frange = NULL;
410 struct list_head *pos, *tmp;
411 unsigned data;
412
413
414 if (!pcs->fmask)
415 return -ENOTSUPP;
416
417 list_for_each_safe(pos, tmp, &pcs->gpiofuncs) {
418 u32 offset;
419
420 frange = list_entry(pos, struct pcs_gpiofunc_range, node);
421 if (pin >= frange->offset + frange->npins
422 || pin < frange->offset)
423 continue;
424
425 offset = pcs_pin_reg_offset_get(pcs, pin);
426
427 if (pcs->bits_per_mux) {
428 int pin_shift = pcs_pin_shift_reg_get(pcs, pin);
429
430 data = pcs->read(pcs->base + offset);
431 data &= ~(pcs->fmask << pin_shift);
432 data |= frange->gpiofunc << pin_shift;
433 pcs->write(data, pcs->base + offset);
434 } else {
435 data = pcs->read(pcs->base + offset);
436 data &= ~pcs->fmask;
437 data |= frange->gpiofunc;
438 pcs->write(data, pcs->base + offset);
439 }
440 break;
441 }
442 return 0;
443}
444
445static const struct pinmux_ops pcs_pinmux_ops = {
446 .get_functions_count = pinmux_generic_get_function_count,
447 .get_function_name = pinmux_generic_get_function_name,
448 .get_function_groups = pinmux_generic_get_function_groups,
449 .set_mux = pcs_set_mux,
450 .gpio_request_enable = pcs_request_gpio,
451};
452
453
454static void pcs_pinconf_clear_bias(struct pinctrl_dev *pctldev, unsigned pin)
455{
456 unsigned long config;
457 int i;
458 for (i = 0; i < ARRAY_SIZE(pcs_bias); i++) {
459 config = pinconf_to_config_packed(pcs_bias[i], 0);
460 pcs_pinconf_set(pctldev, pin, &config, 1);
461 }
462}
463
464
465
466
467
468static bool pcs_pinconf_bias_disable(struct pinctrl_dev *pctldev, unsigned pin)
469{
470 unsigned long config;
471 int i;
472
473 for (i = 0; i < ARRAY_SIZE(pcs_bias); i++) {
474 config = pinconf_to_config_packed(pcs_bias[i], 0);
475 if (!pcs_pinconf_get(pctldev, pin, &config))
476 goto out;
477 }
478 return true;
479out:
480 return false;
481}
482
483static int pcs_pinconf_get(struct pinctrl_dev *pctldev,
484 unsigned pin, unsigned long *config)
485{
486 struct pcs_device *pcs = pinctrl_dev_get_drvdata(pctldev);
487 struct pcs_function *func;
488 enum pin_config_param param;
489 unsigned offset = 0, data = 0, i, j, ret;
490
491 ret = pcs_get_function(pctldev, pin, &func);
492 if (ret)
493 return ret;
494
495 for (i = 0; i < func->nconfs; i++) {
496 param = pinconf_to_config_param(*config);
497 if (param == PIN_CONFIG_BIAS_DISABLE) {
498 if (pcs_pinconf_bias_disable(pctldev, pin)) {
499 *config = 0;
500 return 0;
501 } else {
502 return -ENOTSUPP;
503 }
504 } else if (param != func->conf[i].param) {
505 continue;
506 }
507
508 offset = pin * (pcs->width / BITS_PER_BYTE);
509 data = pcs->read(pcs->base + offset) & func->conf[i].mask;
510 switch (func->conf[i].param) {
511
512 case PIN_CONFIG_BIAS_PULL_DOWN:
513 case PIN_CONFIG_BIAS_PULL_UP:
514 case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
515 if ((data != func->conf[i].enable) ||
516 (data == func->conf[i].disable))
517 return -ENOTSUPP;
518 *config = 0;
519 break;
520
521 case PIN_CONFIG_INPUT_SCHMITT:
522 for (j = 0; j < func->nconfs; j++) {
523 switch (func->conf[j].param) {
524 case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
525 if (data != func->conf[j].enable)
526 return -ENOTSUPP;
527 break;
528 default:
529 break;
530 }
531 }
532 *config = data;
533 break;
534 case PIN_CONFIG_DRIVE_STRENGTH:
535 case PIN_CONFIG_SLEW_RATE:
536 case PIN_CONFIG_MODE_LOW_POWER:
537 case PIN_CONFIG_INPUT_ENABLE:
538 default:
539 *config = data;
540 break;
541 }
542 return 0;
543 }
544 return -ENOTSUPP;
545}
546
547static int pcs_pinconf_set(struct pinctrl_dev *pctldev,
548 unsigned pin, unsigned long *configs,
549 unsigned num_configs)
550{
551 struct pcs_device *pcs = pinctrl_dev_get_drvdata(pctldev);
552 struct pcs_function *func;
553 unsigned offset = 0, shift = 0, i, data, ret;
554 u32 arg;
555 int j;
556
557 ret = pcs_get_function(pctldev, pin, &func);
558 if (ret)
559 return ret;
560
561 for (j = 0; j < num_configs; j++) {
562 for (i = 0; i < func->nconfs; i++) {
563 if (pinconf_to_config_param(configs[j])
564 != func->conf[i].param)
565 continue;
566
567 offset = pin * (pcs->width / BITS_PER_BYTE);
568 data = pcs->read(pcs->base + offset);
569 arg = pinconf_to_config_argument(configs[j]);
570 switch (func->conf[i].param) {
571
572 case PIN_CONFIG_INPUT_SCHMITT:
573 case PIN_CONFIG_DRIVE_STRENGTH:
574 case PIN_CONFIG_SLEW_RATE:
575 case PIN_CONFIG_MODE_LOW_POWER:
576 case PIN_CONFIG_INPUT_ENABLE:
577 shift = ffs(func->conf[i].mask) - 1;
578 data &= ~func->conf[i].mask;
579 data |= (arg << shift) & func->conf[i].mask;
580 break;
581
582 case PIN_CONFIG_BIAS_DISABLE:
583 pcs_pinconf_clear_bias(pctldev, pin);
584 break;
585 case PIN_CONFIG_BIAS_PULL_DOWN:
586 case PIN_CONFIG_BIAS_PULL_UP:
587 if (arg)
588 pcs_pinconf_clear_bias(pctldev, pin);
589 fallthrough;
590 case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
591 data &= ~func->conf[i].mask;
592 if (arg)
593 data |= func->conf[i].enable;
594 else
595 data |= func->conf[i].disable;
596 break;
597 default:
598 return -ENOTSUPP;
599 }
600 pcs->write(data, pcs->base + offset);
601
602 break;
603 }
604 if (i >= func->nconfs)
605 return -ENOTSUPP;
606 }
607
608 return 0;
609}
610
611static int pcs_pinconf_group_get(struct pinctrl_dev *pctldev,
612 unsigned group, unsigned long *config)
613{
614 const unsigned *pins;
615 unsigned npins, old = 0;
616 int i, ret;
617
618 ret = pinctrl_generic_get_group_pins(pctldev, group, &pins, &npins);
619 if (ret)
620 return ret;
621 for (i = 0; i < npins; i++) {
622 if (pcs_pinconf_get(pctldev, pins[i], config))
623 return -ENOTSUPP;
624
625 if (i && (old != *config))
626 return -ENOTSUPP;
627 old = *config;
628 }
629 return 0;
630}
631
632static int pcs_pinconf_group_set(struct pinctrl_dev *pctldev,
633 unsigned group, unsigned long *configs,
634 unsigned num_configs)
635{
636 const unsigned *pins;
637 unsigned npins;
638 int i, ret;
639
640 ret = pinctrl_generic_get_group_pins(pctldev, group, &pins, &npins);
641 if (ret)
642 return ret;
643 for (i = 0; i < npins; i++) {
644 if (pcs_pinconf_set(pctldev, pins[i], configs, num_configs))
645 return -ENOTSUPP;
646 }
647 return 0;
648}
649
650static void pcs_pinconf_dbg_show(struct pinctrl_dev *pctldev,
651 struct seq_file *s, unsigned pin)
652{
653}
654
655static void pcs_pinconf_group_dbg_show(struct pinctrl_dev *pctldev,
656 struct seq_file *s, unsigned selector)
657{
658}
659
660static void pcs_pinconf_config_dbg_show(struct pinctrl_dev *pctldev,
661 struct seq_file *s,
662 unsigned long config)
663{
664 pinconf_generic_dump_config(pctldev, s, config);
665}
666
667static const struct pinconf_ops pcs_pinconf_ops = {
668 .pin_config_get = pcs_pinconf_get,
669 .pin_config_set = pcs_pinconf_set,
670 .pin_config_group_get = pcs_pinconf_group_get,
671 .pin_config_group_set = pcs_pinconf_group_set,
672 .pin_config_dbg_show = pcs_pinconf_dbg_show,
673 .pin_config_group_dbg_show = pcs_pinconf_group_dbg_show,
674 .pin_config_config_dbg_show = pcs_pinconf_config_dbg_show,
675 .is_generic = true,
676};
677
678
679
680
681
682
683static int pcs_add_pin(struct pcs_device *pcs, unsigned int offset)
684{
685 struct pcs_soc_data *pcs_soc = &pcs->socdata;
686 struct pinctrl_pin_desc *pin;
687 int i;
688
689 i = pcs->pins.cur;
690 if (i >= pcs->desc.npins) {
691 dev_err(pcs->dev, "too many pins, max %i\n",
692 pcs->desc.npins);
693 return -ENOMEM;
694 }
695
696 if (pcs_soc->irq_enable_mask) {
697 unsigned val;
698
699 val = pcs->read(pcs->base + offset);
700 if (val & pcs_soc->irq_enable_mask) {
701 dev_dbg(pcs->dev, "irq enabled at boot for pin at %lx (%x), clearing\n",
702 (unsigned long)pcs->res->start + offset, val);
703 val &= ~pcs_soc->irq_enable_mask;
704 pcs->write(val, pcs->base + offset);
705 }
706 }
707
708 pin = &pcs->pins.pa[i];
709 pin->number = i;
710 pcs->pins.cur++;
711
712 return i;
713}
714
715
716
717
718
719
720
721
722
723
724static int pcs_allocate_pin_table(struct pcs_device *pcs)
725{
726 int mux_bytes, nr_pins, i;
727
728 mux_bytes = pcs->width / BITS_PER_BYTE;
729
730 if (pcs->bits_per_mux) {
731 pcs->bits_per_pin = fls(pcs->fmask);
732 nr_pins = (pcs->size * BITS_PER_BYTE) / pcs->bits_per_pin;
733 } else {
734 nr_pins = pcs->size / mux_bytes;
735 }
736
737 dev_dbg(pcs->dev, "allocating %i pins\n", nr_pins);
738 pcs->pins.pa = devm_kcalloc(pcs->dev,
739 nr_pins, sizeof(*pcs->pins.pa),
740 GFP_KERNEL);
741 if (!pcs->pins.pa)
742 return -ENOMEM;
743
744 pcs->desc.pins = pcs->pins.pa;
745 pcs->desc.npins = nr_pins;
746
747 for (i = 0; i < pcs->desc.npins; i++) {
748 unsigned offset;
749 int res;
750
751 offset = pcs_pin_reg_offset_get(pcs, i);
752 res = pcs_add_pin(pcs, offset);
753 if (res < 0) {
754 dev_err(pcs->dev, "error adding pins: %i\n", res);
755 return res;
756 }
757 }
758
759 return 0;
760}
761
762
763
764
765
766
767
768
769
770
771
772
773
774static int pcs_add_function(struct pcs_device *pcs,
775 struct pcs_function **fcn,
776 const char *name,
777 struct pcs_func_vals *vals,
778 unsigned int nvals,
779 const char **pgnames,
780 unsigned int npgnames)
781{
782 struct pcs_function *function;
783 int selector;
784
785 function = devm_kzalloc(pcs->dev, sizeof(*function), GFP_KERNEL);
786 if (!function)
787 return -ENOMEM;
788
789 function->vals = vals;
790 function->nvals = nvals;
791 function->name = name;
792
793 selector = pinmux_generic_add_function(pcs->pctl, name,
794 pgnames, npgnames,
795 function);
796 if (selector < 0) {
797 devm_kfree(pcs->dev, function);
798 *fcn = NULL;
799 } else {
800 *fcn = function;
801 }
802
803 return selector;
804}
805
806
807
808
809
810
811
812
813static int pcs_get_pin_by_offset(struct pcs_device *pcs, unsigned offset)
814{
815 unsigned index;
816
817 if (offset >= pcs->size) {
818 dev_err(pcs->dev, "mux offset out of range: 0x%x (0x%x)\n",
819 offset, pcs->size);
820 return -EINVAL;
821 }
822
823 if (pcs->bits_per_mux)
824 index = (offset * BITS_PER_BYTE) / pcs->bits_per_pin;
825 else
826 index = offset / (pcs->width / BITS_PER_BYTE);
827
828 return index;
829}
830
831
832
833
834
835
836static int pcs_config_match(unsigned data, unsigned enable, unsigned disable)
837{
838 int ret = -EINVAL;
839
840 if (data == enable)
841 ret = 1;
842 else if (data == disable)
843 ret = 0;
844 return ret;
845}
846
847static void add_config(struct pcs_conf_vals **conf, enum pin_config_param param,
848 unsigned value, unsigned enable, unsigned disable,
849 unsigned mask)
850{
851 (*conf)->param = param;
852 (*conf)->val = value;
853 (*conf)->enable = enable;
854 (*conf)->disable = disable;
855 (*conf)->mask = mask;
856 (*conf)++;
857}
858
859static void add_setting(unsigned long **setting, enum pin_config_param param,
860 unsigned arg)
861{
862 **setting = pinconf_to_config_packed(param, arg);
863 (*setting)++;
864}
865
866
867static void pcs_add_conf2(struct pcs_device *pcs, struct device_node *np,
868 const char *name, enum pin_config_param param,
869 struct pcs_conf_vals **conf, unsigned long **settings)
870{
871 unsigned value[2], shift;
872 int ret;
873
874 ret = of_property_read_u32_array(np, name, value, 2);
875 if (ret)
876 return;
877
878 value[0] &= value[1];
879 shift = ffs(value[1]) - 1;
880
881 add_config(conf, param, value[0], 0, 0, value[1]);
882 add_setting(settings, param, value[0] >> shift);
883}
884
885
886static void pcs_add_conf4(struct pcs_device *pcs, struct device_node *np,
887 const char *name, enum pin_config_param param,
888 struct pcs_conf_vals **conf, unsigned long **settings)
889{
890 unsigned value[4];
891 int ret;
892
893
894 ret = of_property_read_u32_array(np, name, value, 4);
895 if (ret)
896 return;
897 if (!value[3]) {
898 dev_err(pcs->dev, "mask field of the property can't be 0\n");
899 return;
900 }
901 value[0] &= value[3];
902 value[1] &= value[3];
903 value[2] &= value[3];
904 ret = pcs_config_match(value[0], value[1], value[2]);
905 if (ret < 0)
906 dev_dbg(pcs->dev, "failed to match enable or disable bits\n");
907 add_config(conf, param, value[0], value[1], value[2], value[3]);
908 add_setting(settings, param, ret);
909}
910
911static int pcs_parse_pinconf(struct pcs_device *pcs, struct device_node *np,
912 struct pcs_function *func,
913 struct pinctrl_map **map)
914
915{
916 struct pinctrl_map *m = *map;
917 int i = 0, nconfs = 0;
918 unsigned long *settings = NULL, *s = NULL;
919 struct pcs_conf_vals *conf = NULL;
920 static const struct pcs_conf_type prop2[] = {
921 { "pinctrl-single,drive-strength", PIN_CONFIG_DRIVE_STRENGTH, },
922 { "pinctrl-single,slew-rate", PIN_CONFIG_SLEW_RATE, },
923 { "pinctrl-single,input-enable", PIN_CONFIG_INPUT_ENABLE, },
924 { "pinctrl-single,input-schmitt", PIN_CONFIG_INPUT_SCHMITT, },
925 { "pinctrl-single,low-power-mode", PIN_CONFIG_MODE_LOW_POWER, },
926 };
927 static const struct pcs_conf_type prop4[] = {
928 { "pinctrl-single,bias-pullup", PIN_CONFIG_BIAS_PULL_UP, },
929 { "pinctrl-single,bias-pulldown", PIN_CONFIG_BIAS_PULL_DOWN, },
930 { "pinctrl-single,input-schmitt-enable",
931 PIN_CONFIG_INPUT_SCHMITT_ENABLE, },
932 };
933
934
935 if (!PCS_HAS_PINCONF)
936 return -ENOTSUPP;
937
938
939 for (i = 0; i < ARRAY_SIZE(prop2); i++) {
940 if (of_find_property(np, prop2[i].name, NULL))
941 nconfs++;
942 }
943 for (i = 0; i < ARRAY_SIZE(prop4); i++) {
944 if (of_find_property(np, prop4[i].name, NULL))
945 nconfs++;
946 }
947 if (!nconfs)
948 return -ENOTSUPP;
949
950 func->conf = devm_kcalloc(pcs->dev,
951 nconfs, sizeof(struct pcs_conf_vals),
952 GFP_KERNEL);
953 if (!func->conf)
954 return -ENOMEM;
955 func->nconfs = nconfs;
956 conf = &(func->conf[0]);
957 m++;
958 settings = devm_kcalloc(pcs->dev, nconfs, sizeof(unsigned long),
959 GFP_KERNEL);
960 if (!settings)
961 return -ENOMEM;
962 s = &settings[0];
963
964 for (i = 0; i < ARRAY_SIZE(prop2); i++)
965 pcs_add_conf2(pcs, np, prop2[i].name, prop2[i].param,
966 &conf, &s);
967 for (i = 0; i < ARRAY_SIZE(prop4); i++)
968 pcs_add_conf4(pcs, np, prop4[i].name, prop4[i].param,
969 &conf, &s);
970 m->type = PIN_MAP_TYPE_CONFIGS_GROUP;
971 m->data.configs.group_or_pin = np->name;
972 m->data.configs.configs = settings;
973 m->data.configs.num_configs = nconfs;
974 return 0;
975}
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996static int pcs_parse_one_pinctrl_entry(struct pcs_device *pcs,
997 struct device_node *np,
998 struct pinctrl_map **map,
999 unsigned *num_maps,
1000 const char **pgnames)
1001{
1002 const char *name = "pinctrl-single,pins";
1003 struct pcs_func_vals *vals;
1004 int rows, *pins, found = 0, res = -ENOMEM, i, fsel, gsel;
1005 struct pcs_function *function = NULL;
1006
1007 rows = pinctrl_count_index_with_args(np, name);
1008 if (rows <= 0) {
1009 dev_err(pcs->dev, "Invalid number of rows: %d\n", rows);
1010 return -EINVAL;
1011 }
1012
1013 vals = devm_kcalloc(pcs->dev, rows, sizeof(*vals), GFP_KERNEL);
1014 if (!vals)
1015 return -ENOMEM;
1016
1017 pins = devm_kcalloc(pcs->dev, rows, sizeof(*pins), GFP_KERNEL);
1018 if (!pins)
1019 goto free_vals;
1020
1021 for (i = 0; i < rows; i++) {
1022 struct of_phandle_args pinctrl_spec;
1023 unsigned int offset;
1024 int pin;
1025
1026 res = pinctrl_parse_index_with_args(np, name, i, &pinctrl_spec);
1027 if (res)
1028 return res;
1029
1030 if (pinctrl_spec.args_count < 2 || pinctrl_spec.args_count > 3) {
1031 dev_err(pcs->dev, "invalid args_count for spec: %i\n",
1032 pinctrl_spec.args_count);
1033 break;
1034 }
1035
1036 offset = pinctrl_spec.args[0];
1037 vals[found].reg = pcs->base + offset;
1038
1039 switch (pinctrl_spec.args_count) {
1040 case 2:
1041 vals[found].val = pinctrl_spec.args[1];
1042 break;
1043 case 3:
1044 vals[found].val = (pinctrl_spec.args[1] | pinctrl_spec.args[2]);
1045 break;
1046 }
1047
1048 dev_dbg(pcs->dev, "%pOFn index: 0x%x value: 0x%x\n",
1049 pinctrl_spec.np, offset, vals[found].val);
1050
1051 pin = pcs_get_pin_by_offset(pcs, offset);
1052 if (pin < 0) {
1053 dev_err(pcs->dev,
1054 "could not add functions for %pOFn %ux\n",
1055 np, offset);
1056 break;
1057 }
1058 pins[found++] = pin;
1059 }
1060
1061 pgnames[0] = np->name;
1062 mutex_lock(&pcs->mutex);
1063 fsel = pcs_add_function(pcs, &function, np->name, vals, found,
1064 pgnames, 1);
1065 if (fsel < 0) {
1066 res = fsel;
1067 goto free_pins;
1068 }
1069
1070 gsel = pinctrl_generic_add_group(pcs->pctl, np->name, pins, found, pcs);
1071 if (gsel < 0) {
1072 res = gsel;
1073 goto free_function;
1074 }
1075
1076 (*map)->type = PIN_MAP_TYPE_MUX_GROUP;
1077 (*map)->data.mux.group = np->name;
1078 (*map)->data.mux.function = np->name;
1079
1080 if (PCS_HAS_PINCONF && function) {
1081 res = pcs_parse_pinconf(pcs, np, function, map);
1082 if (res == 0)
1083 *num_maps = 2;
1084 else if (res == -ENOTSUPP)
1085 *num_maps = 1;
1086 else
1087 goto free_pingroups;
1088 } else {
1089 *num_maps = 1;
1090 }
1091 mutex_unlock(&pcs->mutex);
1092
1093 return 0;
1094
1095free_pingroups:
1096 pinctrl_generic_remove_group(pcs->pctl, gsel);
1097 *num_maps = 1;
1098free_function:
1099 pinmux_generic_remove_function(pcs->pctl, fsel);
1100free_pins:
1101 mutex_unlock(&pcs->mutex);
1102 devm_kfree(pcs->dev, pins);
1103
1104free_vals:
1105 devm_kfree(pcs->dev, vals);
1106
1107 return res;
1108}
1109
1110static int pcs_parse_bits_in_pinctrl_entry(struct pcs_device *pcs,
1111 struct device_node *np,
1112 struct pinctrl_map **map,
1113 unsigned *num_maps,
1114 const char **pgnames)
1115{
1116 const char *name = "pinctrl-single,bits";
1117 struct pcs_func_vals *vals;
1118 int rows, *pins, found = 0, res = -ENOMEM, i, fsel;
1119 int npins_in_row;
1120 struct pcs_function *function = NULL;
1121
1122 rows = pinctrl_count_index_with_args(np, name);
1123 if (rows <= 0) {
1124 dev_err(pcs->dev, "Invalid number of rows: %d\n", rows);
1125 return -EINVAL;
1126 }
1127
1128 if (PCS_HAS_PINCONF) {
1129 dev_err(pcs->dev, "pinconf not supported\n");
1130 return -ENOTSUPP;
1131 }
1132
1133 npins_in_row = pcs->width / pcs->bits_per_pin;
1134
1135 vals = devm_kzalloc(pcs->dev,
1136 array3_size(rows, npins_in_row, sizeof(*vals)),
1137 GFP_KERNEL);
1138 if (!vals)
1139 return -ENOMEM;
1140
1141 pins = devm_kzalloc(pcs->dev,
1142 array3_size(rows, npins_in_row, sizeof(*pins)),
1143 GFP_KERNEL);
1144 if (!pins)
1145 goto free_vals;
1146
1147 for (i = 0; i < rows; i++) {
1148 struct of_phandle_args pinctrl_spec;
1149 unsigned offset, val;
1150 unsigned mask, bit_pos, val_pos, mask_pos, submask;
1151 unsigned pin_num_from_lsb;
1152 int pin;
1153
1154 res = pinctrl_parse_index_with_args(np, name, i, &pinctrl_spec);
1155 if (res)
1156 return res;
1157
1158 if (pinctrl_spec.args_count < 3) {
1159 dev_err(pcs->dev, "invalid args_count for spec: %i\n",
1160 pinctrl_spec.args_count);
1161 break;
1162 }
1163
1164
1165 offset = pinctrl_spec.args[0];
1166 val = pinctrl_spec.args[1];
1167 mask = pinctrl_spec.args[2];
1168
1169 dev_dbg(pcs->dev, "%pOFn index: 0x%x value: 0x%x mask: 0x%x\n",
1170 pinctrl_spec.np, offset, val, mask);
1171
1172
1173 while (mask) {
1174 bit_pos = __ffs(mask);
1175 pin_num_from_lsb = bit_pos / pcs->bits_per_pin;
1176 mask_pos = ((pcs->fmask) << bit_pos);
1177 val_pos = val & mask_pos;
1178 submask = mask & mask_pos;
1179
1180 if ((mask & mask_pos) == 0) {
1181 dev_err(pcs->dev,
1182 "Invalid mask for %pOFn at 0x%x\n",
1183 np, offset);
1184 break;
1185 }
1186
1187 mask &= ~mask_pos;
1188
1189 if (submask != mask_pos) {
1190 dev_warn(pcs->dev,
1191 "Invalid submask 0x%x for %pOFn at 0x%x\n",
1192 submask, np, offset);
1193 continue;
1194 }
1195
1196 vals[found].mask = submask;
1197 vals[found].reg = pcs->base + offset;
1198 vals[found].val = val_pos;
1199
1200 pin = pcs_get_pin_by_offset(pcs, offset);
1201 if (pin < 0) {
1202 dev_err(pcs->dev,
1203 "could not add functions for %pOFn %ux\n",
1204 np, offset);
1205 break;
1206 }
1207 pins[found++] = pin + pin_num_from_lsb;
1208 }
1209 }
1210
1211 pgnames[0] = np->name;
1212 mutex_lock(&pcs->mutex);
1213 fsel = pcs_add_function(pcs, &function, np->name, vals, found,
1214 pgnames, 1);
1215 if (fsel < 0) {
1216 res = fsel;
1217 goto free_pins;
1218 }
1219
1220 res = pinctrl_generic_add_group(pcs->pctl, np->name, pins, found, pcs);
1221 if (res < 0)
1222 goto free_function;
1223
1224 (*map)->type = PIN_MAP_TYPE_MUX_GROUP;
1225 (*map)->data.mux.group = np->name;
1226 (*map)->data.mux.function = np->name;
1227
1228 *num_maps = 1;
1229 mutex_unlock(&pcs->mutex);
1230
1231 return 0;
1232
1233free_function:
1234 pinmux_generic_remove_function(pcs->pctl, fsel);
1235free_pins:
1236 mutex_unlock(&pcs->mutex);
1237 devm_kfree(pcs->dev, pins);
1238
1239free_vals:
1240 devm_kfree(pcs->dev, vals);
1241
1242 return res;
1243}
1244
1245
1246
1247
1248
1249
1250
1251static int pcs_dt_node_to_map(struct pinctrl_dev *pctldev,
1252 struct device_node *np_config,
1253 struct pinctrl_map **map, unsigned *num_maps)
1254{
1255 struct pcs_device *pcs;
1256 const char **pgnames;
1257 int ret;
1258
1259 pcs = pinctrl_dev_get_drvdata(pctldev);
1260
1261
1262 *map = devm_kcalloc(pcs->dev, 2, sizeof(**map), GFP_KERNEL);
1263 if (!*map)
1264 return -ENOMEM;
1265
1266 *num_maps = 0;
1267
1268 pgnames = devm_kzalloc(pcs->dev, sizeof(*pgnames), GFP_KERNEL);
1269 if (!pgnames) {
1270 ret = -ENOMEM;
1271 goto free_map;
1272 }
1273
1274 if (pcs->bits_per_mux) {
1275 ret = pcs_parse_bits_in_pinctrl_entry(pcs, np_config, map,
1276 num_maps, pgnames);
1277 if (ret < 0) {
1278 dev_err(pcs->dev, "no pins entries for %pOFn\n",
1279 np_config);
1280 goto free_pgnames;
1281 }
1282 } else {
1283 ret = pcs_parse_one_pinctrl_entry(pcs, np_config, map,
1284 num_maps, pgnames);
1285 if (ret < 0) {
1286 dev_err(pcs->dev, "no pins entries for %pOFn\n",
1287 np_config);
1288 goto free_pgnames;
1289 }
1290 }
1291
1292 return 0;
1293
1294free_pgnames:
1295 devm_kfree(pcs->dev, pgnames);
1296free_map:
1297 devm_kfree(pcs->dev, *map);
1298
1299 return ret;
1300}
1301
1302
1303
1304
1305
1306static void pcs_irq_free(struct pcs_device *pcs)
1307{
1308 struct pcs_soc_data *pcs_soc = &pcs->socdata;
1309
1310 if (pcs_soc->irq < 0)
1311 return;
1312
1313 if (pcs->domain)
1314 irq_domain_remove(pcs->domain);
1315
1316 if (PCS_QUIRK_HAS_SHARED_IRQ)
1317 free_irq(pcs_soc->irq, pcs_soc);
1318 else
1319 irq_set_chained_handler(pcs_soc->irq, NULL);
1320}
1321
1322
1323
1324
1325
1326static void pcs_free_resources(struct pcs_device *pcs)
1327{
1328 pcs_irq_free(pcs);
1329 pinctrl_unregister(pcs->pctl);
1330
1331#if IS_BUILTIN(CONFIG_PINCTRL_SINGLE)
1332 if (pcs->missing_nr_pinctrl_cells)
1333 of_remove_property(pcs->np, pcs->missing_nr_pinctrl_cells);
1334#endif
1335}
1336
1337static int pcs_add_gpio_func(struct device_node *node, struct pcs_device *pcs)
1338{
1339 const char *propname = "pinctrl-single,gpio-range";
1340 const char *cellname = "#pinctrl-single,gpio-range-cells";
1341 struct of_phandle_args gpiospec;
1342 struct pcs_gpiofunc_range *range;
1343 int ret, i;
1344
1345 for (i = 0; ; i++) {
1346 ret = of_parse_phandle_with_args(node, propname, cellname,
1347 i, &gpiospec);
1348
1349 if (ret) {
1350 ret = 0;
1351 break;
1352 }
1353 range = devm_kzalloc(pcs->dev, sizeof(*range), GFP_KERNEL);
1354 if (!range) {
1355 ret = -ENOMEM;
1356 break;
1357 }
1358 range->offset = gpiospec.args[0];
1359 range->npins = gpiospec.args[1];
1360 range->gpiofunc = gpiospec.args[2];
1361 mutex_lock(&pcs->mutex);
1362 list_add_tail(&range->node, &pcs->gpiofuncs);
1363 mutex_unlock(&pcs->mutex);
1364 }
1365 return ret;
1366}
1367
1368
1369
1370
1371
1372
1373
1374
1375struct pcs_interrupt {
1376 void __iomem *reg;
1377 irq_hw_number_t hwirq;
1378 unsigned int irq;
1379 struct list_head node;
1380};
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391static inline void pcs_irq_set(struct pcs_soc_data *pcs_soc,
1392 int irq, const bool enable)
1393{
1394 struct pcs_device *pcs;
1395 struct list_head *pos;
1396 unsigned mask;
1397
1398 pcs = container_of(pcs_soc, struct pcs_device, socdata);
1399 list_for_each(pos, &pcs->irqs) {
1400 struct pcs_interrupt *pcswi;
1401 unsigned soc_mask;
1402
1403 pcswi = list_entry(pos, struct pcs_interrupt, node);
1404 if (irq != pcswi->irq)
1405 continue;
1406
1407 soc_mask = pcs_soc->irq_enable_mask;
1408 raw_spin_lock(&pcs->lock);
1409 mask = pcs->read(pcswi->reg);
1410 if (enable)
1411 mask |= soc_mask;
1412 else
1413 mask &= ~soc_mask;
1414 pcs->write(mask, pcswi->reg);
1415
1416
1417 mask = pcs->read(pcswi->reg);
1418 raw_spin_unlock(&pcs->lock);
1419 }
1420
1421 if (pcs_soc->rearm)
1422 pcs_soc->rearm();
1423}
1424
1425
1426
1427
1428
1429static void pcs_irq_mask(struct irq_data *d)
1430{
1431 struct pcs_soc_data *pcs_soc = irq_data_get_irq_chip_data(d);
1432
1433 pcs_irq_set(pcs_soc, d->irq, false);
1434}
1435
1436
1437
1438
1439
1440static void pcs_irq_unmask(struct irq_data *d)
1441{
1442 struct pcs_soc_data *pcs_soc = irq_data_get_irq_chip_data(d);
1443
1444 pcs_irq_set(pcs_soc, d->irq, true);
1445}
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455static int pcs_irq_set_wake(struct irq_data *d, unsigned int state)
1456{
1457 if (state)
1458 pcs_irq_unmask(d);
1459 else
1460 pcs_irq_mask(d);
1461
1462 return 0;
1463}
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473static int pcs_irq_handle(struct pcs_soc_data *pcs_soc)
1474{
1475 struct pcs_device *pcs;
1476 struct list_head *pos;
1477 int count = 0;
1478
1479 pcs = container_of(pcs_soc, struct pcs_device, socdata);
1480 list_for_each(pos, &pcs->irqs) {
1481 struct pcs_interrupt *pcswi;
1482 unsigned mask;
1483
1484 pcswi = list_entry(pos, struct pcs_interrupt, node);
1485 raw_spin_lock(&pcs->lock);
1486 mask = pcs->read(pcswi->reg);
1487 raw_spin_unlock(&pcs->lock);
1488 if (mask & pcs_soc->irq_status_mask) {
1489 generic_handle_domain_irq(pcs->domain,
1490 pcswi->hwirq);
1491 count++;
1492 }
1493 }
1494
1495 return count;
1496}
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506static irqreturn_t pcs_irq_handler(int irq, void *d)
1507{
1508 struct pcs_soc_data *pcs_soc = d;
1509
1510 return pcs_irq_handle(pcs_soc) ? IRQ_HANDLED : IRQ_NONE;
1511}
1512
1513
1514
1515
1516
1517
1518
1519
1520static void pcs_irq_chain_handler(struct irq_desc *desc)
1521{
1522 struct pcs_soc_data *pcs_soc = irq_desc_get_handler_data(desc);
1523 struct irq_chip *chip;
1524
1525 chip = irq_desc_get_chip(desc);
1526 chained_irq_enter(chip, desc);
1527 pcs_irq_handle(pcs_soc);
1528
1529 chained_irq_exit(chip, desc);
1530}
1531
1532static int pcs_irqdomain_map(struct irq_domain *d, unsigned int irq,
1533 irq_hw_number_t hwirq)
1534{
1535 struct pcs_soc_data *pcs_soc = d->host_data;
1536 struct pcs_device *pcs;
1537 struct pcs_interrupt *pcswi;
1538
1539 pcs = container_of(pcs_soc, struct pcs_device, socdata);
1540 pcswi = devm_kzalloc(pcs->dev, sizeof(*pcswi), GFP_KERNEL);
1541 if (!pcswi)
1542 return -ENOMEM;
1543
1544 pcswi->reg = pcs->base + hwirq;
1545 pcswi->hwirq = hwirq;
1546 pcswi->irq = irq;
1547
1548 mutex_lock(&pcs->mutex);
1549 list_add_tail(&pcswi->node, &pcs->irqs);
1550 mutex_unlock(&pcs->mutex);
1551
1552 irq_set_chip_data(irq, pcs_soc);
1553 irq_set_chip_and_handler(irq, &pcs->chip,
1554 handle_level_irq);
1555 irq_set_lockdep_class(irq, &pcs_lock_class, &pcs_request_class);
1556 irq_set_noprobe(irq);
1557
1558 return 0;
1559}
1560
1561static const struct irq_domain_ops pcs_irqdomain_ops = {
1562 .map = pcs_irqdomain_map,
1563 .xlate = irq_domain_xlate_onecell,
1564};
1565
1566
1567
1568
1569
1570
1571static int pcs_irq_init_chained_handler(struct pcs_device *pcs,
1572 struct device_node *np)
1573{
1574 struct pcs_soc_data *pcs_soc = &pcs->socdata;
1575 const char *name = "pinctrl";
1576 int num_irqs;
1577
1578 if (!pcs_soc->irq_enable_mask ||
1579 !pcs_soc->irq_status_mask) {
1580 pcs_soc->irq = -1;
1581 return -EINVAL;
1582 }
1583
1584 INIT_LIST_HEAD(&pcs->irqs);
1585 pcs->chip.name = name;
1586 pcs->chip.irq_ack = pcs_irq_mask;
1587 pcs->chip.irq_mask = pcs_irq_mask;
1588 pcs->chip.irq_unmask = pcs_irq_unmask;
1589 pcs->chip.irq_set_wake = pcs_irq_set_wake;
1590
1591 if (PCS_QUIRK_HAS_SHARED_IRQ) {
1592 int res;
1593
1594 res = request_irq(pcs_soc->irq, pcs_irq_handler,
1595 IRQF_SHARED | IRQF_NO_SUSPEND |
1596 IRQF_NO_THREAD,
1597 name, pcs_soc);
1598 if (res) {
1599 pcs_soc->irq = -1;
1600 return res;
1601 }
1602 } else {
1603 irq_set_chained_handler_and_data(pcs_soc->irq,
1604 pcs_irq_chain_handler,
1605 pcs_soc);
1606 }
1607
1608
1609
1610
1611
1612
1613
1614 num_irqs = pcs->size;
1615
1616 pcs->domain = irq_domain_add_simple(np, num_irqs, 0,
1617 &pcs_irqdomain_ops,
1618 pcs_soc);
1619 if (!pcs->domain) {
1620 irq_set_chained_handler(pcs_soc->irq, NULL);
1621 return -EINVAL;
1622 }
1623
1624 return 0;
1625}
1626
1627#ifdef CONFIG_PM
1628static int pcs_save_context(struct pcs_device *pcs)
1629{
1630 int i, mux_bytes;
1631 u64 *regsl;
1632 u32 *regsw;
1633 u16 *regshw;
1634
1635 mux_bytes = pcs->width / BITS_PER_BYTE;
1636
1637 if (!pcs->saved_vals) {
1638 pcs->saved_vals = devm_kzalloc(pcs->dev, pcs->size, GFP_ATOMIC);
1639 if (!pcs->saved_vals)
1640 return -ENOMEM;
1641 }
1642
1643 switch (pcs->width) {
1644 case 64:
1645 regsl = pcs->saved_vals;
1646 for (i = 0; i < pcs->size; i += mux_bytes)
1647 *regsl++ = pcs->read(pcs->base + i);
1648 break;
1649 case 32:
1650 regsw = pcs->saved_vals;
1651 for (i = 0; i < pcs->size; i += mux_bytes)
1652 *regsw++ = pcs->read(pcs->base + i);
1653 break;
1654 case 16:
1655 regshw = pcs->saved_vals;
1656 for (i = 0; i < pcs->size; i += mux_bytes)
1657 *regshw++ = pcs->read(pcs->base + i);
1658 break;
1659 }
1660
1661 return 0;
1662}
1663
1664static void pcs_restore_context(struct pcs_device *pcs)
1665{
1666 int i, mux_bytes;
1667 u64 *regsl;
1668 u32 *regsw;
1669 u16 *regshw;
1670
1671 mux_bytes = pcs->width / BITS_PER_BYTE;
1672
1673 switch (pcs->width) {
1674 case 64:
1675 regsl = pcs->saved_vals;
1676 for (i = 0; i < pcs->size; i += mux_bytes)
1677 pcs->write(*regsl++, pcs->base + i);
1678 break;
1679 case 32:
1680 regsw = pcs->saved_vals;
1681 for (i = 0; i < pcs->size; i += mux_bytes)
1682 pcs->write(*regsw++, pcs->base + i);
1683 break;
1684 case 16:
1685 regshw = pcs->saved_vals;
1686 for (i = 0; i < pcs->size; i += mux_bytes)
1687 pcs->write(*regshw++, pcs->base + i);
1688 break;
1689 }
1690}
1691
1692static int pinctrl_single_suspend(struct platform_device *pdev,
1693 pm_message_t state)
1694{
1695 struct pcs_device *pcs;
1696
1697 pcs = platform_get_drvdata(pdev);
1698 if (!pcs)
1699 return -EINVAL;
1700
1701 if (pcs->flags & PCS_CONTEXT_LOSS_OFF) {
1702 int ret;
1703
1704 ret = pcs_save_context(pcs);
1705 if (ret < 0)
1706 return ret;
1707 }
1708
1709 return pinctrl_force_sleep(pcs->pctl);
1710}
1711
1712static int pinctrl_single_resume(struct platform_device *pdev)
1713{
1714 struct pcs_device *pcs;
1715
1716 pcs = platform_get_drvdata(pdev);
1717 if (!pcs)
1718 return -EINVAL;
1719
1720 if (pcs->flags & PCS_CONTEXT_LOSS_OFF)
1721 pcs_restore_context(pcs);
1722
1723 return pinctrl_force_default(pcs->pctl);
1724}
1725#endif
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737static int pcs_quirk_missing_pinctrl_cells(struct pcs_device *pcs,
1738 struct device_node *np,
1739 int cells)
1740{
1741 struct property *p;
1742 const char *name = "#pinctrl-cells";
1743 int error;
1744 u32 val;
1745
1746 error = of_property_read_u32(np, name, &val);
1747 if (!error)
1748 return 0;
1749
1750 dev_warn(pcs->dev, "please update dts to use %s = <%i>\n",
1751 name, cells);
1752
1753 p = devm_kzalloc(pcs->dev, sizeof(*p), GFP_KERNEL);
1754 if (!p)
1755 return -ENOMEM;
1756
1757 p->length = sizeof(__be32);
1758 p->value = devm_kzalloc(pcs->dev, sizeof(__be32), GFP_KERNEL);
1759 if (!p->value)
1760 return -ENOMEM;
1761 *(__be32 *)p->value = cpu_to_be32(cells);
1762
1763 p->name = devm_kstrdup(pcs->dev, name, GFP_KERNEL);
1764 if (!p->name)
1765 return -ENOMEM;
1766
1767 pcs->missing_nr_pinctrl_cells = p;
1768
1769#if IS_BUILTIN(CONFIG_PINCTRL_SINGLE)
1770 error = of_add_property(np, pcs->missing_nr_pinctrl_cells);
1771#endif
1772
1773 return error;
1774}
1775
1776static int pcs_probe(struct platform_device *pdev)
1777{
1778 struct device_node *np = pdev->dev.of_node;
1779 struct pcs_pdata *pdata;
1780 struct resource *res;
1781 struct pcs_device *pcs;
1782 const struct pcs_soc_data *soc;
1783 int ret;
1784
1785 soc = of_device_get_match_data(&pdev->dev);
1786 if (WARN_ON(!soc))
1787 return -EINVAL;
1788
1789 pcs = devm_kzalloc(&pdev->dev, sizeof(*pcs), GFP_KERNEL);
1790 if (!pcs)
1791 return -ENOMEM;
1792
1793 pcs->dev = &pdev->dev;
1794 pcs->np = np;
1795 raw_spin_lock_init(&pcs->lock);
1796 mutex_init(&pcs->mutex);
1797 INIT_LIST_HEAD(&pcs->gpiofuncs);
1798 pcs->flags = soc->flags;
1799 memcpy(&pcs->socdata, soc, sizeof(*soc));
1800
1801 ret = of_property_read_u32(np, "pinctrl-single,register-width",
1802 &pcs->width);
1803 if (ret) {
1804 dev_err(pcs->dev, "register width not specified\n");
1805
1806 return ret;
1807 }
1808
1809 ret = of_property_read_u32(np, "pinctrl-single,function-mask",
1810 &pcs->fmask);
1811 if (!ret) {
1812 pcs->fshift = __ffs(pcs->fmask);
1813 pcs->fmax = pcs->fmask >> pcs->fshift;
1814 } else {
1815
1816 pcs->fmask = 0;
1817 pcs->fshift = 0;
1818 pcs->fmax = 0;
1819 }
1820
1821 ret = of_property_read_u32(np, "pinctrl-single,function-off",
1822 &pcs->foff);
1823 if (ret)
1824 pcs->foff = PCS_OFF_DISABLED;
1825
1826 pcs->bits_per_mux = of_property_read_bool(np,
1827 "pinctrl-single,bit-per-mux");
1828 ret = pcs_quirk_missing_pinctrl_cells(pcs, np,
1829 pcs->bits_per_mux ? 2 : 1);
1830 if (ret) {
1831 dev_err(&pdev->dev, "unable to patch #pinctrl-cells\n");
1832
1833 return ret;
1834 }
1835
1836 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1837 if (!res) {
1838 dev_err(pcs->dev, "could not get resource\n");
1839 return -ENODEV;
1840 }
1841
1842 pcs->res = devm_request_mem_region(pcs->dev, res->start,
1843 resource_size(res), DRIVER_NAME);
1844 if (!pcs->res) {
1845 dev_err(pcs->dev, "could not get mem_region\n");
1846 return -EBUSY;
1847 }
1848
1849 pcs->size = resource_size(pcs->res);
1850 pcs->base = devm_ioremap(pcs->dev, pcs->res->start, pcs->size);
1851 if (!pcs->base) {
1852 dev_err(pcs->dev, "could not ioremap\n");
1853 return -ENODEV;
1854 }
1855
1856 platform_set_drvdata(pdev, pcs);
1857
1858 switch (pcs->width) {
1859 case 8:
1860 pcs->read = pcs_readb;
1861 pcs->write = pcs_writeb;
1862 break;
1863 case 16:
1864 pcs->read = pcs_readw;
1865 pcs->write = pcs_writew;
1866 break;
1867 case 32:
1868 pcs->read = pcs_readl;
1869 pcs->write = pcs_writel;
1870 break;
1871 default:
1872 break;
1873 }
1874
1875 pcs->desc.name = DRIVER_NAME;
1876 pcs->desc.pctlops = &pcs_pinctrl_ops;
1877 pcs->desc.pmxops = &pcs_pinmux_ops;
1878 if (PCS_HAS_PINCONF)
1879 pcs->desc.confops = &pcs_pinconf_ops;
1880 pcs->desc.owner = THIS_MODULE;
1881
1882 ret = pcs_allocate_pin_table(pcs);
1883 if (ret < 0)
1884 goto free;
1885
1886 ret = pinctrl_register_and_init(&pcs->desc, pcs->dev, pcs, &pcs->pctl);
1887 if (ret) {
1888 dev_err(pcs->dev, "could not register single pinctrl driver\n");
1889 goto free;
1890 }
1891
1892 ret = pcs_add_gpio_func(np, pcs);
1893 if (ret < 0)
1894 goto free;
1895
1896 pcs->socdata.irq = irq_of_parse_and_map(np, 0);
1897 if (pcs->socdata.irq)
1898 pcs->flags |= PCS_FEAT_IRQ;
1899
1900
1901 pdata = dev_get_platdata(&pdev->dev);
1902 if (pdata) {
1903 if (pdata->rearm)
1904 pcs->socdata.rearm = pdata->rearm;
1905 if (pdata->irq) {
1906 pcs->socdata.irq = pdata->irq;
1907 pcs->flags |= PCS_FEAT_IRQ;
1908 }
1909 }
1910
1911 if (PCS_HAS_IRQ) {
1912 ret = pcs_irq_init_chained_handler(pcs, np);
1913 if (ret < 0)
1914 dev_warn(pcs->dev, "initialized with no interrupts\n");
1915 }
1916
1917 dev_info(pcs->dev, "%i pins, size %u\n", pcs->desc.npins, pcs->size);
1918
1919 return pinctrl_enable(pcs->pctl);
1920
1921free:
1922 pcs_free_resources(pcs);
1923
1924 return ret;
1925}
1926
1927static int pcs_remove(struct platform_device *pdev)
1928{
1929 struct pcs_device *pcs = platform_get_drvdata(pdev);
1930
1931 if (!pcs)
1932 return 0;
1933
1934 pcs_free_resources(pcs);
1935
1936 return 0;
1937}
1938
1939static const struct pcs_soc_data pinctrl_single_omap_wkup = {
1940 .flags = PCS_QUIRK_SHARED_IRQ,
1941 .irq_enable_mask = (1 << 14),
1942 .irq_status_mask = (1 << 15),
1943};
1944
1945static const struct pcs_soc_data pinctrl_single_dra7 = {
1946 .irq_enable_mask = (1 << 24),
1947 .irq_status_mask = (1 << 25),
1948};
1949
1950static const struct pcs_soc_data pinctrl_single_am437x = {
1951 .flags = PCS_QUIRK_SHARED_IRQ | PCS_CONTEXT_LOSS_OFF,
1952 .irq_enable_mask = (1 << 29),
1953 .irq_status_mask = (1 << 30),
1954};
1955
1956static const struct pcs_soc_data pinctrl_single = {
1957};
1958
1959static const struct pcs_soc_data pinconf_single = {
1960 .flags = PCS_FEAT_PINCONF,
1961};
1962
1963static const struct of_device_id pcs_of_match[] = {
1964 { .compatible = "ti,omap3-padconf", .data = &pinctrl_single_omap_wkup },
1965 { .compatible = "ti,omap4-padconf", .data = &pinctrl_single_omap_wkup },
1966 { .compatible = "ti,omap5-padconf", .data = &pinctrl_single_omap_wkup },
1967 { .compatible = "ti,dra7-padconf", .data = &pinctrl_single_dra7 },
1968 { .compatible = "ti,am437-padconf", .data = &pinctrl_single_am437x },
1969 { .compatible = "pinctrl-single", .data = &pinctrl_single },
1970 { .compatible = "pinconf-single", .data = &pinconf_single },
1971 { },
1972};
1973MODULE_DEVICE_TABLE(of, pcs_of_match);
1974
1975static struct platform_driver pcs_driver = {
1976 .probe = pcs_probe,
1977 .remove = pcs_remove,
1978 .driver = {
1979 .name = DRIVER_NAME,
1980 .of_match_table = pcs_of_match,
1981 },
1982#ifdef CONFIG_PM
1983 .suspend = pinctrl_single_suspend,
1984 .resume = pinctrl_single_resume,
1985#endif
1986};
1987
1988module_platform_driver(pcs_driver);
1989
1990MODULE_AUTHOR("Tony Lindgren <tony@atomide.com>");
1991MODULE_DESCRIPTION("One-register-per-pin type device tree based pinctrl driver");
1992MODULE_LICENSE("GPL v2");
1993