Blackfin arch: gpio pinmux and resource allocation API required by BF537 on chip...
[safe/jmp/linux-2.6] / arch / blackfin / kernel / bfin_gpio.c
1 /*
2  * File:         arch/blackfin/kernel/bfin_gpio.c
3  * Based on:
4  * Author:       Michael Hennerich (hennerich@blackfin.uclinux.org)
5  *
6  * Created:
7  * Description:  GPIO Abstraction Layer
8  *
9  * Modified:
10  *               Copyright 2006 Analog Devices Inc.
11  *
12  * Bugs:         Enter bugs at http://blackfin.uclinux.org/
13  *
14  * This program is free software; you can redistribute it and/or modify
15  * it under the terms of the GNU General Public License as published by
16  * the Free Software Foundation; either version 2 of the License, or
17  * (at your option) any later version.
18  *
19  * This program is distributed in the hope that it will be useful,
20  * but WITHOUT ANY WARRANTY; without even the implied warranty of
21  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22  * GNU General Public License for more details.
23  *
24  * You should have received a copy of the GNU General Public License
25  * along with this program; if not, see the file COPYING, or write
26  * to the Free Software Foundation, Inc.,
27  * 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
28  */
29
30 /*
31 *  Number     BF537/6/4    BF561    BF533/2/1
32 *
33 *  GPIO_0       PF0         PF0        PF0
34 *  GPIO_1       PF1         PF1        PF1
35 *  GPIO_2       PF2         PF2        PF2
36 *  GPIO_3       PF3         PF3        PF3
37 *  GPIO_4       PF4         PF4        PF4
38 *  GPIO_5       PF5         PF5        PF5
39 *  GPIO_6       PF6         PF6        PF6
40 *  GPIO_7       PF7         PF7        PF7
41 *  GPIO_8       PF8         PF8        PF8
42 *  GPIO_9       PF9         PF9        PF9
43 *  GPIO_10      PF10        PF10       PF10
44 *  GPIO_11      PF11        PF11       PF11
45 *  GPIO_12      PF12        PF12       PF12
46 *  GPIO_13      PF13        PF13       PF13
47 *  GPIO_14      PF14        PF14       PF14
48 *  GPIO_15      PF15        PF15       PF15
49 *  GPIO_16      PG0         PF16
50 *  GPIO_17      PG1         PF17
51 *  GPIO_18      PG2         PF18
52 *  GPIO_19      PG3         PF19
53 *  GPIO_20      PG4         PF20
54 *  GPIO_21      PG5         PF21
55 *  GPIO_22      PG6         PF22
56 *  GPIO_23      PG7         PF23
57 *  GPIO_24      PG8         PF24
58 *  GPIO_25      PG9         PF25
59 *  GPIO_26      PG10        PF26
60 *  GPIO_27      PG11        PF27
61 *  GPIO_28      PG12        PF28
62 *  GPIO_29      PG13        PF29
63 *  GPIO_30      PG14        PF30
64 *  GPIO_31      PG15        PF31
65 *  GPIO_32      PH0         PF32
66 *  GPIO_33      PH1         PF33
67 *  GPIO_34      PH2         PF34
68 *  GPIO_35      PH3         PF35
69 *  GPIO_36      PH4         PF36
70 *  GPIO_37      PH5         PF37
71 *  GPIO_38      PH6         PF38
72 *  GPIO_39      PH7         PF39
73 *  GPIO_40      PH8         PF40
74 *  GPIO_41      PH9         PF41
75 *  GPIO_42      PH10        PF42
76 *  GPIO_43      PH11        PF43
77 *  GPIO_44      PH12        PF44
78 *  GPIO_45      PH13        PF45
79 *  GPIO_46      PH14        PF46
80 *  GPIO_47      PH15        PF47
81 */
82
83 #include <linux/module.h>
84 #include <linux/err.h>
85 #include <asm/blackfin.h>
86 #include <asm/gpio.h>
87 #include <asm/portmux.h>
88 #include <linux/irq.h>
89
90 #ifdef BF533_FAMILY
91 static struct gpio_port_t *gpio_bankb[gpio_bank(MAX_BLACKFIN_GPIOS)] = {
92         (struct gpio_port_t *) FIO_FLAG_D,
93 };
94 #endif
95
96 #ifdef BF537_FAMILY
97 static struct gpio_port_t *gpio_bankb[gpio_bank(MAX_BLACKFIN_GPIOS)] = {
98         (struct gpio_port_t *) PORTFIO,
99         (struct gpio_port_t *) PORTGIO,
100         (struct gpio_port_t *) PORTHIO,
101 };
102
103 static unsigned short *port_fer[gpio_bank(MAX_BLACKFIN_GPIOS)] = {
104         (unsigned short *) PORTF_FER,
105         (unsigned short *) PORTG_FER,
106         (unsigned short *) PORTH_FER,
107 };
108
109 #endif
110
111 #ifdef BF561_FAMILY
112 static struct gpio_port_t *gpio_bankb[gpio_bank(MAX_BLACKFIN_GPIOS)] = {
113         (struct gpio_port_t *) FIO0_FLAG_D,
114         (struct gpio_port_t *) FIO1_FLAG_D,
115         (struct gpio_port_t *) FIO2_FLAG_D,
116 };
117 #endif
118
119 static unsigned short reserved_gpio_map[gpio_bank(MAX_BLACKFIN_GPIOS)];
120 static unsigned short reserved_peri_map[gpio_bank(MAX_BLACKFIN_GPIOS + 16)];
121 char *str_ident = NULL;
122
123 #define RESOURCE_LABEL_SIZE 16
124
125 #ifdef CONFIG_PM
126 static unsigned short wakeup_map[gpio_bank(MAX_BLACKFIN_GPIOS)];
127 static unsigned char wakeup_flags_map[MAX_BLACKFIN_GPIOS];
128 static struct gpio_port_s gpio_bank_saved[gpio_bank(MAX_BLACKFIN_GPIOS)];
129
130 #ifdef BF533_FAMILY
131 static unsigned int sic_iwr_irqs[gpio_bank(MAX_BLACKFIN_GPIOS)] = {IRQ_PROG_INTB};
132 #endif
133
134 #ifdef BF537_FAMILY
135 static unsigned int sic_iwr_irqs[gpio_bank(MAX_BLACKFIN_GPIOS)] = {IRQ_PROG_INTB, IRQ_PORTG_INTB, IRQ_MAC_TX};
136 #endif
137
138 #ifdef BF561_FAMILY
139 static unsigned int sic_iwr_irqs[gpio_bank(MAX_BLACKFIN_GPIOS)] = {IRQ_PROG0_INTB, IRQ_PROG1_INTB, IRQ_PROG2_INTB};
140 #endif
141
142 #endif /* CONFIG_PM */
143
144 inline int check_gpio(unsigned short gpio)
145 {
146         if (gpio >= MAX_BLACKFIN_GPIOS)
147                 return -EINVAL;
148         return 0;
149 }
150
151 static void set_label(unsigned short ident, const char *label)
152 {
153
154         if (label && str_ident) {
155                 strncpy(str_ident + ident * RESOURCE_LABEL_SIZE, label,
156                          RESOURCE_LABEL_SIZE);
157                 str_ident[ident * RESOURCE_LABEL_SIZE +
158                          RESOURCE_LABEL_SIZE - 1] = 0;
159         }
160 }
161
162 static char *get_label(unsigned short ident)
163 {
164         if (!str_ident)
165                 return "UNKNOWN";
166
167         return (str_ident[ident * RESOURCE_LABEL_SIZE] ?
168                 (str_ident + ident * RESOURCE_LABEL_SIZE) : "UNKNOWN");
169 }
170
171 static int cmp_label(unsigned short ident, const char *label)
172 {
173         if (label && str_ident)
174                 return strncmp(str_ident + ident * RESOURCE_LABEL_SIZE,
175                                  label, strlen(label));
176         else
177                 return -EINVAL;
178 }
179
180 #ifdef BF537_FAMILY
181 static void port_setup(unsigned short gpio, unsigned short usage)
182 {
183         if (usage == GPIO_USAGE) {
184                 *port_fer[gpio_bank(gpio)] &= ~gpio_bit(gpio);
185         } else
186                 *port_fer[gpio_bank(gpio)] |= gpio_bit(gpio);
187         SSYNC();
188 }
189 #else
190 # define port_setup(...)  do { } while (0)
191 #endif
192
193 #ifdef BF537_FAMILY
194
195 #define PMUX_LUT_RES            0
196 #define PMUX_LUT_OFFSET         1
197 #define PMUX_LUT_ENTRIES        41
198 #define PMUX_LUT_SIZE           2
199
200 static unsigned short port_mux_lut[PMUX_LUT_ENTRIES][PMUX_LUT_SIZE] = {
201         {P_PPI0_D13, 11}, {P_PPI0_D14, 11}, {P_PPI0_D15, 11},
202         {P_SPORT1_TFS, 11}, {P_SPORT1_TSCLK, 11}, {P_SPORT1_DTPRI, 11},
203         {P_PPI0_D10, 10}, {P_PPI0_D11, 10}, {P_PPI0_D12, 10},
204         {P_SPORT1_RSCLK, 10}, {P_SPORT1_RFS, 10}, {P_SPORT1_DRPRI, 10},
205         {P_PPI0_D8, 9}, {P_PPI0_D9, 9}, {P_SPORT1_DRSEC, 9},
206         {P_SPORT1_DTSEC, 9}, {P_TMR2, 8}, {P_PPI0_FS3, 8}, {P_TMR3, 7},
207         {P_SPI0_SSEL4, 7}, {P_TMR4, 6}, {P_SPI0_SSEL5, 6}, {P_TMR5, 5},
208         {P_SPI0_SSEL6, 5}, {P_UART1_RX, 4}, {P_UART1_TX, 4}, {P_TMR6, 4},
209         {P_TMR7, 4}, {P_UART0_RX, 3}, {P_UART0_TX, 3}, {P_DMAR0, 3},
210         {P_DMAR1, 3}, {P_SPORT0_DTSEC, 1}, {P_SPORT0_DRSEC, 1},
211         {P_CAN0_RX, 1}, {P_CAN0_TX, 1}, {P_SPI0_SSEL7, 1},
212         {P_SPORT0_TFS, 0}, {P_SPORT0_DTPRI, 0}, {P_SPI0_SSEL2, 0},
213         {P_SPI0_SSEL3, 0}
214 };
215
216 static void portmux_setup(unsigned short per, unsigned short function)
217 {
218         u16 y, muxreg, offset;
219
220         for (y = 0; y < PMUX_LUT_ENTRIES; y++) {
221                 if (port_mux_lut[y][PMUX_LUT_RES] == per) {
222
223                         /* SET PORTMUX REG */
224
225                         offset = port_mux_lut[y][PMUX_LUT_OFFSET];
226                         muxreg = bfin_read_PORT_MUX();
227
228                         if (offset != 1) {
229                                 muxreg &= ~(1 << offset);
230                         } else {
231                                 muxreg &= ~(3 << 1);
232                         }
233
234                         muxreg |= (function << offset);
235                         bfin_write_PORT_MUX(muxreg);
236                 }
237         }
238 }
239
240 #else
241 # define portmux_setup(...)  do { } while (0)
242 #endif
243
244 static void default_gpio(unsigned short gpio)
245 {
246         unsigned short bank, bitmask;
247
248         bank = gpio_bank(gpio);
249         bitmask = gpio_bit(gpio);
250
251         gpio_bankb[bank]->maska_clear = bitmask;
252         gpio_bankb[bank]->maskb_clear = bitmask;
253         SSYNC();
254         gpio_bankb[bank]->inen &= ~bitmask;
255         gpio_bankb[bank]->dir &= ~bitmask;
256         gpio_bankb[bank]->polar &= ~bitmask;
257         gpio_bankb[bank]->both &= ~bitmask;
258         gpio_bankb[bank]->edge &= ~bitmask;
259 }
260
261 static int __init bfin_gpio_init(void)
262 {
263
264         str_ident = kzalloc(RESOURCE_LABEL_SIZE * 256, GFP_KERNEL);
265         if (!str_ident)
266                 return -ENOMEM;
267
268         printk(KERN_INFO "Blackfin GPIO Controller\n");
269
270         return 0;
271
272 }
273
274 arch_initcall(bfin_gpio_init);
275
276
277 /***********************************************************
278 *
279 * FUNCTIONS: Blackfin General Purpose Ports Access Functions
280 *
281 * INPUTS/OUTPUTS:
282 * gpio - GPIO Number between 0 and MAX_BLACKFIN_GPIOS
283 *
284 *
285 * DESCRIPTION: These functions abstract direct register access
286 *              to Blackfin processor General Purpose
287 *              Ports Regsiters
288 *
289 * CAUTION: These functions do not belong to the GPIO Driver API
290 *************************************************************
291 * MODIFICATION HISTORY :
292 **************************************************************/
293
294 /* Set a specific bit */
295
296 #define SET_GPIO(name) \
297 void set_gpio_ ## name(unsigned short gpio, unsigned short arg) \
298 { \
299         unsigned long flags; \
300         BUG_ON(!(reserved_gpio_map[gpio_bank(gpio)] & gpio_bit(gpio))); \
301         local_irq_save(flags); \
302         if (arg) \
303                 gpio_bankb[gpio_bank(gpio)]->name |= gpio_bit(gpio); \
304         else \
305                 gpio_bankb[gpio_bank(gpio)]->name &= ~gpio_bit(gpio); \
306         local_irq_restore(flags); \
307 } \
308 EXPORT_SYMBOL(set_gpio_ ## name);
309
310 SET_GPIO(dir)
311 SET_GPIO(inen)
312 SET_GPIO(polar)
313 SET_GPIO(edge)
314 SET_GPIO(both)
315
316
317 #define SET_GPIO_SC(name) \
318 void set_gpio_ ## name(unsigned short gpio, unsigned short arg) \
319 { \
320         BUG_ON(!(reserved_gpio_map[gpio_bank(gpio)] & gpio_bit(gpio))); \
321         if (arg) \
322                 gpio_bankb[gpio_bank(gpio)]->name ## _set = gpio_bit(gpio); \
323         else \
324                 gpio_bankb[gpio_bank(gpio)]->name ## _clear = gpio_bit(gpio); \
325 } \
326 EXPORT_SYMBOL(set_gpio_ ## name);
327
328 SET_GPIO_SC(maska)
329 SET_GPIO_SC(maskb)
330
331 #if defined(ANOMALY_05000311)
332 void set_gpio_data(unsigned short gpio, unsigned short arg)
333 {
334         unsigned long flags;
335         BUG_ON(!(reserved_gpio_map[gpio_bank(gpio)] & gpio_bit(gpio)));
336         local_irq_save(flags);
337         if (arg)
338                 gpio_bankb[gpio_bank(gpio)]->data_set = gpio_bit(gpio);
339         else
340                 gpio_bankb[gpio_bank(gpio)]->data_clear = gpio_bit(gpio);
341         bfin_read_CHIPID();
342         local_irq_restore(flags);
343 }
344 EXPORT_SYMBOL(set_gpio_data);
345 #else
346 SET_GPIO_SC(data)
347 #endif
348
349
350 #if defined(ANOMALY_05000311)
351 void set_gpio_toggle(unsigned short gpio)
352 {
353         unsigned long flags;
354         BUG_ON(!(reserved_gpio_map[gpio_bank(gpio)] & gpio_bit(gpio)));
355         local_irq_save(flags);
356         gpio_bankb[gpio_bank(gpio)]->toggle = gpio_bit(gpio);
357         bfin_read_CHIPID();
358         local_irq_restore(flags);
359 }
360 #else
361 void set_gpio_toggle(unsigned short gpio)
362 {
363         BUG_ON(!(reserved_gpio_map[gpio_bank(gpio)] & gpio_bit(gpio)));
364         gpio_bankb[gpio_bank(gpio)]->toggle = gpio_bit(gpio);
365 }
366 #endif
367 EXPORT_SYMBOL(set_gpio_toggle);
368
369
370 /*Set current PORT date (16-bit word)*/
371
372 #define SET_GPIO_P(name) \
373 void set_gpiop_ ## name(unsigned short gpio, unsigned short arg) \
374 { \
375         gpio_bankb[gpio_bank(gpio)]->name = arg; \
376 } \
377 EXPORT_SYMBOL(set_gpiop_ ## name);
378
379 SET_GPIO_P(dir)
380 SET_GPIO_P(inen)
381 SET_GPIO_P(polar)
382 SET_GPIO_P(edge)
383 SET_GPIO_P(both)
384 SET_GPIO_P(maska)
385 SET_GPIO_P(maskb)
386
387
388 #if defined(ANOMALY_05000311)
389 void set_gpiop_data(unsigned short gpio, unsigned short arg)
390 {
391         unsigned long flags;
392         local_irq_save(flags);
393         gpio_bankb[gpio_bank(gpio)]->data = arg;
394         bfin_read_CHIPID();
395         local_irq_restore(flags);
396 }
397 EXPORT_SYMBOL(set_gpiop_data);
398 #else
399 SET_GPIO_P(data)
400 #endif
401
402
403
404 /* Get a specific bit */
405
406 #define GET_GPIO(name) \
407 unsigned short get_gpio_ ## name(unsigned short gpio) \
408 { \
409         return (0x01 & (gpio_bankb[gpio_bank(gpio)]->name >> gpio_sub_n(gpio))); \
410 } \
411 EXPORT_SYMBOL(get_gpio_ ## name);
412
413 GET_GPIO(dir)
414 GET_GPIO(inen)
415 GET_GPIO(polar)
416 GET_GPIO(edge)
417 GET_GPIO(both)
418 GET_GPIO(maska)
419 GET_GPIO(maskb)
420
421
422 #if defined(ANOMALY_05000311)
423 unsigned short get_gpio_data(unsigned short gpio)
424 {
425         unsigned long flags;
426         unsigned short ret;
427         BUG_ON(!(reserved_gpio_map[gpio_bank(gpio)] & gpio_bit(gpio)));
428         local_irq_save(flags);
429         ret = 0x01 & (gpio_bankb[gpio_bank(gpio)]->data >> gpio_sub_n(gpio));
430         bfin_read_CHIPID();
431         local_irq_restore(flags);
432         return ret;
433 }
434 EXPORT_SYMBOL(get_gpio_data);
435 #else
436 GET_GPIO(data)
437 #endif
438
439 /*Get current PORT date (16-bit word)*/
440
441 #define GET_GPIO_P(name) \
442 unsigned short get_gpiop_ ## name(unsigned short gpio) \
443 { \
444         return (gpio_bankb[gpio_bank(gpio)]->name);\
445 } \
446 EXPORT_SYMBOL(get_gpiop_ ## name);
447
448 GET_GPIO_P(dir)
449 GET_GPIO_P(inen)
450 GET_GPIO_P(polar)
451 GET_GPIO_P(edge)
452 GET_GPIO_P(both)
453 GET_GPIO_P(maska)
454 GET_GPIO_P(maskb)
455
456 #if defined(ANOMALY_05000311)
457 unsigned short get_gpiop_data(unsigned short gpio)
458 {
459         unsigned long flags;
460         unsigned short ret;
461         local_irq_save(flags);
462         ret = gpio_bankb[gpio_bank(gpio)]->data;
463         bfin_read_CHIPID();
464         local_irq_restore(flags);
465         return ret;
466 }
467 EXPORT_SYMBOL(get_gpiop_data);
468 #else
469 GET_GPIO_P(data)
470 #endif
471
472 #ifdef CONFIG_PM
473 /***********************************************************
474 *
475 * FUNCTIONS: Blackfin PM Setup API
476 *
477 * INPUTS/OUTPUTS:
478 * gpio - GPIO Number between 0 and MAX_BLACKFIN_GPIOS
479 * type -
480 *       PM_WAKE_RISING
481 *       PM_WAKE_FALLING
482 *       PM_WAKE_HIGH
483 *       PM_WAKE_LOW
484 *       PM_WAKE_BOTH_EDGES
485 *
486 * DESCRIPTION: Blackfin PM Driver API
487 *
488 * CAUTION:
489 *************************************************************
490 * MODIFICATION HISTORY :
491 **************************************************************/
492 int gpio_pm_wakeup_request(unsigned short gpio, unsigned char type)
493 {
494         unsigned long flags;
495
496         if ((check_gpio(gpio) < 0) || !type)
497                 return -EINVAL;
498
499         local_irq_save(flags);
500
501         wakeup_map[gpio_bank(gpio)] |= gpio_bit(gpio);
502         wakeup_flags_map[gpio] = type;
503         local_irq_restore(flags);
504
505         return 0;
506 }
507 EXPORT_SYMBOL(gpio_pm_wakeup_request);
508
509 void gpio_pm_wakeup_free(unsigned short gpio)
510 {
511         unsigned long flags;
512
513         if (check_gpio(gpio) < 0)
514                 return;
515
516         local_irq_save(flags);
517
518         wakeup_map[gpio_bank(gpio)] &= ~gpio_bit(gpio);
519
520         local_irq_restore(flags);
521 }
522 EXPORT_SYMBOL(gpio_pm_wakeup_free);
523
524 static int bfin_gpio_wakeup_type(unsigned short gpio, unsigned char type)
525 {
526         port_setup(gpio, GPIO_USAGE);
527         set_gpio_dir(gpio, 0);
528         set_gpio_inen(gpio, 1);
529
530         if (type & (PM_WAKE_RISING | PM_WAKE_FALLING))
531                 set_gpio_edge(gpio, 1);
532          else
533                 set_gpio_edge(gpio, 0);
534
535         if ((type & (PM_WAKE_BOTH_EDGES)) == (PM_WAKE_BOTH_EDGES))
536                 set_gpio_both(gpio, 1);
537         else
538                 set_gpio_both(gpio, 0);
539
540         if ((type & (PM_WAKE_FALLING | PM_WAKE_LOW)))
541                 set_gpio_polar(gpio, 1);
542         else
543                 set_gpio_polar(gpio, 0);
544
545         SSYNC();
546
547         return 0;
548 }
549
550 u32 gpio_pm_setup(void)
551 {
552         u32 sic_iwr = 0;
553         u16 bank, mask, i, gpio;
554
555         for (i = 0; i < MAX_BLACKFIN_GPIOS; i += GPIO_BANKSIZE) {
556                 mask = wakeup_map[gpio_bank(i)];
557                 bank = gpio_bank(i);
558
559                 gpio_bank_saved[bank].maskb = gpio_bankb[bank]->maskb;
560                 gpio_bankb[bank]->maskb = 0;
561
562                 if (mask) {
563 #ifdef BF537_FAMILY
564                         gpio_bank_saved[bank].fer   = *port_fer[bank];
565 #endif
566                         gpio_bank_saved[bank].inen  = gpio_bankb[bank]->inen;
567                         gpio_bank_saved[bank].polar = gpio_bankb[bank]->polar;
568                         gpio_bank_saved[bank].dir   = gpio_bankb[bank]->dir;
569                         gpio_bank_saved[bank].edge  = gpio_bankb[bank]->edge;
570                         gpio_bank_saved[bank].both  = gpio_bankb[bank]->both;
571                         gpio_bank_saved[bank].reserved =
572                                                 reserved_gpio_map[bank];
573
574                         gpio = i;
575
576                         while (mask) {
577                                 if (mask & 1) {
578                                         reserved_gpio_map[gpio_bank(gpio)] |=
579                                                         gpio_bit(gpio);
580                                         bfin_gpio_wakeup_type(gpio,
581                                                 wakeup_flags_map[gpio]);
582                                         set_gpio_data(gpio, 0); /*Clear*/
583                                 }
584                                 gpio++;
585                                 mask >>= 1;
586                         }
587
588                         sic_iwr |= 1 <<
589                                 (sic_iwr_irqs[bank] - (IRQ_CORETMR + 1));
590                         gpio_bankb[bank]->maskb_set = wakeup_map[gpio_bank(i)];
591                 }
592         }
593
594         if (sic_iwr)
595                 return sic_iwr;
596         else
597                 return IWR_ENABLE_ALL;
598 }
599
600 void gpio_pm_restore(void)
601 {
602         u16 bank, mask, i;
603
604         for (i = 0; i < MAX_BLACKFIN_GPIOS; i += GPIO_BANKSIZE) {
605                 mask = wakeup_map[gpio_bank(i)];
606                 bank = gpio_bank(i);
607
608                 if (mask) {
609 #ifdef BF537_FAMILY
610                         *port_fer[bank]         = gpio_bank_saved[bank].fer;
611 #endif
612                         gpio_bankb[bank]->inen  = gpio_bank_saved[bank].inen;
613                         gpio_bankb[bank]->dir   = gpio_bank_saved[bank].dir;
614                         gpio_bankb[bank]->polar = gpio_bank_saved[bank].polar;
615                         gpio_bankb[bank]->edge  = gpio_bank_saved[bank].edge;
616                         gpio_bankb[bank]->both  = gpio_bank_saved[bank].both;
617
618                         reserved_gpio_map[bank] =
619                                         gpio_bank_saved[bank].reserved;
620
621                 }
622
623                 gpio_bankb[bank]->maskb = gpio_bank_saved[bank].maskb;
624         }
625 }
626
627 #endif
628
629
630
631
632 int peripheral_request(unsigned short per, const char *label)
633 {
634         unsigned long flags;
635         unsigned short ident = P_IDENT(per);
636
637         /*
638          * Don't cares are pins with only one dedicated function
639          */
640
641         if (per & P_DONTCARE)
642                 return 0;
643
644         if (!(per & P_DEFINED))
645                 return -ENODEV;
646
647         if (check_gpio(ident) < 0)
648                 return -EINVAL;
649
650         local_irq_save(flags);
651
652         if (unlikely(reserved_gpio_map[gpio_bank(ident)] & gpio_bit(ident))) {
653                 printk(KERN_ERR
654                        "%s: Peripheral %d is already reserved as GPIO by %s !\n",
655                        __FUNCTION__, ident, get_label(ident));
656                 dump_stack();
657                 local_irq_restore(flags);
658                 return -EBUSY;
659         }
660
661         if (unlikely(reserved_peri_map[gpio_bank(ident)] & gpio_bit(ident))) {
662
663         /*
664          * Pin functions like AMC address strobes my
665          * be requested and used by several drivers
666          */
667
668         if (!(per & P_MAYSHARE)) {
669
670         /*
671          * Allow that the identical pin function can
672          * be requested from the same driver twice
673          */
674
675                 if (cmp_label(ident, label) == 0)
676                         goto anyway;
677
678                         printk(KERN_ERR
679                                "%s: Peripheral %d function %d is already"
680                                "reserved by %s !\n",
681                                __FUNCTION__, ident, P_FUNCT2MUX(per),
682                                 get_label(ident));
683                         dump_stack();
684                         local_irq_restore(flags);
685                         return -EBUSY;
686                 }
687
688         }
689
690 anyway:
691
692
693         portmux_setup(per, P_FUNCT2MUX(per));
694
695         port_setup(ident, PERIPHERAL_USAGE);
696
697         reserved_peri_map[gpio_bank(ident)] |= gpio_bit(ident);
698         local_irq_restore(flags);
699         set_label(ident, label);
700
701         return 0;
702 }
703 EXPORT_SYMBOL(peripheral_request);
704
705 int peripheral_request_list(unsigned short per[], const char *label)
706 {
707         u16 cnt;
708         int ret;
709
710         for (cnt = 0; per[cnt] != 0; cnt++) {
711                 ret = peripheral_request(per[cnt], label);
712                 if (ret < 0)
713                         return ret;
714         }
715
716         return 0;
717 }
718 EXPORT_SYMBOL(peripheral_request_list);
719
720 void peripheral_free(unsigned short per)
721 {
722         unsigned long flags;
723         unsigned short ident = P_IDENT(per);
724
725         if (per & P_DONTCARE)
726                 return;
727
728         if (!(per & P_DEFINED))
729                 return;
730
731         if (check_gpio(ident) < 0)
732                 return;
733
734         local_irq_save(flags);
735
736         if (unlikely(!(reserved_peri_map[gpio_bank(ident)]
737                          & gpio_bit(ident)))) {
738                 local_irq_restore(flags);
739                 return;
740         }
741
742         if (!(per & P_MAYSHARE)) {
743                 port_setup(ident, GPIO_USAGE);
744         }
745
746         reserved_peri_map[gpio_bank(ident)] &= ~gpio_bit(ident);
747
748         local_irq_restore(flags);
749 }
750 EXPORT_SYMBOL(peripheral_free);
751
752 void peripheral_free_list(unsigned short per[])
753 {
754         u16 cnt;
755
756         for (cnt = 0; per[cnt] != 0; cnt++) {
757                 peripheral_free(per[cnt]);
758         }
759
760 }
761 EXPORT_SYMBOL(peripheral_free_list);
762
763 /***********************************************************
764 *
765 * FUNCTIONS: Blackfin GPIO Driver
766 *
767 * INPUTS/OUTPUTS:
768 * gpio - GPIO Number between 0 and MAX_BLACKFIN_GPIOS
769 *
770 *
771 * DESCRIPTION: Blackfin GPIO Driver API
772 *
773 * CAUTION:
774 *************************************************************
775 * MODIFICATION HISTORY :
776 **************************************************************/
777
778 int gpio_request(unsigned short gpio, const char *label)
779 {
780         unsigned long flags;
781
782         if (check_gpio(gpio) < 0)
783                 return -EINVAL;
784
785         local_irq_save(flags);
786
787         if (unlikely(reserved_gpio_map[gpio_bank(gpio)] & gpio_bit(gpio))) {
788                 printk(KERN_ERR "bfin-gpio: GPIO %d is already reserved!\n", gpio);
789                 dump_stack();
790                 local_irq_restore(flags);
791                 return -EBUSY;
792         }
793         reserved_gpio_map[gpio_bank(gpio)] |= gpio_bit(gpio);
794
795         local_irq_restore(flags);
796
797         port_setup(gpio, GPIO_USAGE);
798
799         return 0;
800 }
801 EXPORT_SYMBOL(gpio_request);
802
803 void gpio_free(unsigned short gpio)
804 {
805         unsigned long flags;
806
807         if (check_gpio(gpio) < 0)
808                 return;
809
810         local_irq_save(flags);
811
812         if (unlikely(!(reserved_gpio_map[gpio_bank(gpio)] & gpio_bit(gpio)))) {
813                 printk(KERN_ERR "bfin-gpio: GPIO %d wasn't reserved!\n", gpio);
814                 dump_stack();
815                 local_irq_restore(flags);
816                 return;
817         }
818
819         default_gpio(gpio);
820
821         reserved_gpio_map[gpio_bank(gpio)] &= ~gpio_bit(gpio);
822
823         local_irq_restore(flags);
824 }
825 EXPORT_SYMBOL(gpio_free);
826
827 void gpio_direction_input(unsigned short gpio)
828 {
829         unsigned long flags;
830
831         BUG_ON(!(reserved_gpio_map[gpio_bank(gpio)] & gpio_bit(gpio)));
832
833         local_irq_save(flags);
834         gpio_bankb[gpio_bank(gpio)]->dir &= ~gpio_bit(gpio);
835         gpio_bankb[gpio_bank(gpio)]->inen |= gpio_bit(gpio);
836         local_irq_restore(flags);
837 }
838 EXPORT_SYMBOL(gpio_direction_input);
839
840 void gpio_direction_output(unsigned short gpio)
841 {
842         unsigned long flags;
843
844         BUG_ON(!(reserved_gpio_map[gpio_bank(gpio)] & gpio_bit(gpio)));
845
846         local_irq_save(flags);
847         gpio_bankb[gpio_bank(gpio)]->inen &= ~gpio_bit(gpio);
848         gpio_bankb[gpio_bank(gpio)]->dir |= gpio_bit(gpio);
849         local_irq_restore(flags);
850 }
851 EXPORT_SYMBOL(gpio_direction_output);