bfin_gpio.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637
  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. * Number BF537/6/4 BF561 BF533/2/1
  31. *
  32. * GPIO_0 PF0 PF0 PF0
  33. * GPIO_1 PF1 PF1 PF1
  34. * GPIO_2 PF2 PF2 PF2
  35. * GPIO_3 PF3 PF3 PF3
  36. * GPIO_4 PF4 PF4 PF4
  37. * GPIO_5 PF5 PF5 PF5
  38. * GPIO_6 PF6 PF6 PF6
  39. * GPIO_7 PF7 PF7 PF7
  40. * GPIO_8 PF8 PF8 PF8
  41. * GPIO_9 PF9 PF9 PF9
  42. * GPIO_10 PF10 PF10 PF10
  43. * GPIO_11 PF11 PF11 PF11
  44. * GPIO_12 PF12 PF12 PF12
  45. * GPIO_13 PF13 PF13 PF13
  46. * GPIO_14 PF14 PF14 PF14
  47. * GPIO_15 PF15 PF15 PF15
  48. * GPIO_16 PG0 PF16
  49. * GPIO_17 PG1 PF17
  50. * GPIO_18 PG2 PF18
  51. * GPIO_19 PG3 PF19
  52. * GPIO_20 PG4 PF20
  53. * GPIO_21 PG5 PF21
  54. * GPIO_22 PG6 PF22
  55. * GPIO_23 PG7 PF23
  56. * GPIO_24 PG8 PF24
  57. * GPIO_25 PG9 PF25
  58. * GPIO_26 PG10 PF26
  59. * GPIO_27 PG11 PF27
  60. * GPIO_28 PG12 PF28
  61. * GPIO_29 PG13 PF29
  62. * GPIO_30 PG14 PF30
  63. * GPIO_31 PG15 PF31
  64. * GPIO_32 PH0 PF32
  65. * GPIO_33 PH1 PF33
  66. * GPIO_34 PH2 PF34
  67. * GPIO_35 PH3 PF35
  68. * GPIO_36 PH4 PF36
  69. * GPIO_37 PH5 PF37
  70. * GPIO_38 PH6 PF38
  71. * GPIO_39 PH7 PF39
  72. * GPIO_40 PH8 PF40
  73. * GPIO_41 PH9 PF41
  74. * GPIO_42 PH10 PF42
  75. * GPIO_43 PH11 PF43
  76. * GPIO_44 PH12 PF44
  77. * GPIO_45 PH13 PF45
  78. * GPIO_46 PH14 PF46
  79. * GPIO_47 PH15 PF47
  80. */
  81. #include <linux/module.h>
  82. #include <linux/err.h>
  83. #include <asm/blackfin.h>
  84. #include <asm/gpio.h>
  85. #include <linux/irq.h>
  86. #ifdef BF533_FAMILY
  87. static struct gpio_port_t *gpio_bankb[gpio_bank(MAX_BLACKFIN_GPIOS)] = {
  88. (struct gpio_port_t *) FIO_FLAG_D,
  89. };
  90. #endif
  91. #ifdef BF537_FAMILY
  92. static struct gpio_port_t *gpio_bankb[gpio_bank(MAX_BLACKFIN_GPIOS)] = {
  93. (struct gpio_port_t *) PORTFIO,
  94. (struct gpio_port_t *) PORTGIO,
  95. (struct gpio_port_t *) PORTHIO,
  96. };
  97. static unsigned short *port_fer[gpio_bank(MAX_BLACKFIN_GPIOS)] = {
  98. (unsigned short *) PORTF_FER,
  99. (unsigned short *) PORTG_FER,
  100. (unsigned short *) PORTH_FER,
  101. };
  102. #endif
  103. #ifdef BF561_FAMILY
  104. static struct gpio_port_t *gpio_bankb[gpio_bank(MAX_BLACKFIN_GPIOS)] = {
  105. (struct gpio_port_t *) FIO0_FLAG_D,
  106. (struct gpio_port_t *) FIO1_FLAG_D,
  107. (struct gpio_port_t *) FIO2_FLAG_D,
  108. };
  109. #endif
  110. static unsigned short reserved_map[gpio_bank(MAX_BLACKFIN_GPIOS)];
  111. #ifdef CONFIG_PM
  112. static unsigned short wakeup_map[gpio_bank(MAX_BLACKFIN_GPIOS)];
  113. static unsigned char wakeup_flags_map[MAX_BLACKFIN_GPIOS];
  114. static struct gpio_port_s gpio_bank_saved[gpio_bank(MAX_BLACKFIN_GPIOS)];
  115. #ifdef BF533_FAMILY
  116. static unsigned int sic_iwr_irqs[gpio_bank(MAX_BLACKFIN_GPIOS)] = {IRQ_PROG_INTB};
  117. #endif
  118. #ifdef BF537_FAMILY
  119. static unsigned int sic_iwr_irqs[gpio_bank(MAX_BLACKFIN_GPIOS)] = {IRQ_PROG_INTB, IRQ_PORTG_INTB, IRQ_MAC_TX};
  120. #endif
  121. #ifdef BF561_FAMILY
  122. static unsigned int sic_iwr_irqs[gpio_bank(MAX_BLACKFIN_GPIOS)] = {IRQ_PROG0_INTB, IRQ_PROG1_INTB, IRQ_PROG2_INTB};
  123. #endif
  124. #endif /* CONFIG_PM */
  125. inline int check_gpio(unsigned short gpio)
  126. {
  127. if (gpio > MAX_BLACKFIN_GPIOS)
  128. return -EINVAL;
  129. return 0;
  130. }
  131. #ifdef BF537_FAMILY
  132. void port_setup(unsigned short gpio, unsigned short usage)
  133. {
  134. if (usage == GPIO_USAGE) {
  135. if (*port_fer[gpio_bank(gpio)] & gpio_bit(gpio))
  136. printk(KERN_WARNING "bfin-gpio: Possible Conflict with Peripheral "
  137. "usage and GPIO %d detected!\n", gpio);
  138. *port_fer[gpio_bank(gpio)] &= ~gpio_bit(gpio);
  139. } else
  140. *port_fer[gpio_bank(gpio)] |= gpio_bit(gpio);
  141. SSYNC();
  142. }
  143. #else
  144. # define port_setup(...) do { } while (0)
  145. #endif
  146. void default_gpio(unsigned short gpio)
  147. {
  148. unsigned short bank,bitmask;
  149. bank = gpio_bank(gpio);
  150. bitmask = gpio_bit(gpio);
  151. gpio_bankb[bank]->maska_clear = bitmask;
  152. gpio_bankb[bank]->maskb_clear = bitmask;
  153. SSYNC();
  154. gpio_bankb[bank]->inen &= ~bitmask;
  155. gpio_bankb[bank]->dir &= ~bitmask;
  156. gpio_bankb[bank]->polar &= ~bitmask;
  157. gpio_bankb[bank]->both &= ~bitmask;
  158. gpio_bankb[bank]->edge &= ~bitmask;
  159. }
  160. int __init bfin_gpio_init(void)
  161. {
  162. int i;
  163. printk(KERN_INFO "Blackfin GPIO Controller\n");
  164. for (i = 0; i < MAX_BLACKFIN_GPIOS; i+=GPIO_BANKSIZE)
  165. reserved_map[gpio_bank(i)] = 0;
  166. #if defined(BF537_FAMILY) && (defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE))
  167. # if defined(CONFIG_BFIN_MAC_RMII)
  168. reserved_map[PORT_H] = 0xC373;
  169. # else
  170. reserved_map[PORT_H] = 0xFFFF;
  171. # endif
  172. #endif
  173. return 0;
  174. }
  175. arch_initcall(bfin_gpio_init);
  176. /***********************************************************
  177. *
  178. * FUNCTIONS: Blackfin General Purpose Ports Access Functions
  179. *
  180. * INPUTS/OUTPUTS:
  181. * gpio - GPIO Number between 0 and MAX_BLACKFIN_GPIOS
  182. *
  183. *
  184. * DESCRIPTION: These functions abstract direct register access
  185. * to Blackfin processor General Purpose
  186. * Ports Regsiters
  187. *
  188. * CAUTION: These functions do not belong to the GPIO Driver API
  189. *************************************************************
  190. * MODIFICATION HISTORY :
  191. **************************************************************/
  192. /* Set a specific bit */
  193. #define SET_GPIO(name) \
  194. void set_gpio_ ## name(unsigned short gpio, unsigned short arg) \
  195. { \
  196. unsigned long flags; \
  197. BUG_ON(!(reserved_map[gpio_bank(gpio)] & gpio_bit(gpio))); \
  198. local_irq_save(flags); \
  199. if (arg) \
  200. gpio_bankb[gpio_bank(gpio)]->name |= gpio_bit(gpio); \
  201. else \
  202. gpio_bankb[gpio_bank(gpio)]->name &= ~gpio_bit(gpio); \
  203. local_irq_restore(flags); \
  204. } \
  205. EXPORT_SYMBOL(set_gpio_ ## name);
  206. SET_GPIO(dir)
  207. SET_GPIO(inen)
  208. SET_GPIO(polar)
  209. SET_GPIO(edge)
  210. SET_GPIO(both)
  211. #define SET_GPIO_SC(name) \
  212. void set_gpio_ ## name(unsigned short gpio, unsigned short arg) \
  213. { \
  214. BUG_ON(!(reserved_map[gpio_bank(gpio)] & gpio_bit(gpio))); \
  215. if (arg) \
  216. gpio_bankb[gpio_bank(gpio)]->name ## _set = gpio_bit(gpio); \
  217. else \
  218. gpio_bankb[gpio_bank(gpio)]->name ## _clear = gpio_bit(gpio); \
  219. } \
  220. EXPORT_SYMBOL(set_gpio_ ## name);
  221. SET_GPIO_SC(maska)
  222. SET_GPIO_SC(maskb)
  223. #if defined(ANOMALY_05000311)
  224. void set_gpio_data(unsigned short gpio, unsigned short arg)
  225. {
  226. unsigned long flags;
  227. BUG_ON(!(reserved_map[gpio_bank(gpio)] & gpio_bit(gpio)));
  228. local_irq_save(flags);
  229. if (arg)
  230. gpio_bankb[gpio_bank(gpio)]->data_set = gpio_bit(gpio);
  231. else
  232. gpio_bankb[gpio_bank(gpio)]->data_clear = gpio_bit(gpio);
  233. bfin_read_CHIPID();
  234. local_irq_restore(flags);
  235. }
  236. EXPORT_SYMBOL(set_gpio_data);
  237. #else
  238. SET_GPIO_SC(data)
  239. #endif
  240. #if defined(ANOMALY_05000311)
  241. void set_gpio_toggle(unsigned short gpio)
  242. {
  243. unsigned long flags;
  244. BUG_ON(!(reserved_map[gpio_bank(gpio)] & gpio_bit(gpio)));
  245. local_irq_save(flags);
  246. gpio_bankb[gpio_bank(gpio)]->toggle = gpio_bit(gpio);
  247. bfin_read_CHIPID();
  248. local_irq_restore(flags);
  249. }
  250. #else
  251. void set_gpio_toggle(unsigned short gpio)
  252. {
  253. BUG_ON(!(reserved_map[gpio_bank(gpio)] & gpio_bit(gpio)));
  254. gpio_bankb[gpio_bank(gpio)]->toggle = gpio_bit(gpio);
  255. }
  256. #endif
  257. EXPORT_SYMBOL(set_gpio_toggle);
  258. /*Set current PORT date (16-bit word)*/
  259. #define SET_GPIO_P(name) \
  260. void set_gpiop_ ## name(unsigned short gpio, unsigned short arg) \
  261. { \
  262. gpio_bankb[gpio_bank(gpio)]->name = arg; \
  263. } \
  264. EXPORT_SYMBOL(set_gpiop_ ## name);
  265. SET_GPIO_P(dir)
  266. SET_GPIO_P(inen)
  267. SET_GPIO_P(polar)
  268. SET_GPIO_P(edge)
  269. SET_GPIO_P(both)
  270. SET_GPIO_P(maska)
  271. SET_GPIO_P(maskb)
  272. #if defined(ANOMALY_05000311)
  273. void set_gpiop_data(unsigned short gpio, unsigned short arg)
  274. {
  275. unsigned long flags;
  276. local_irq_save(flags);
  277. gpio_bankb[gpio_bank(gpio)]->data = arg;
  278. bfin_read_CHIPID();
  279. local_irq_restore(flags);
  280. }
  281. EXPORT_SYMBOL(set_gpiop_data);
  282. #else
  283. SET_GPIO_P(data)
  284. #endif
  285. /* Get a specific bit */
  286. #define GET_GPIO(name) \
  287. unsigned short get_gpio_ ## name(unsigned short gpio) \
  288. { \
  289. return (0x01 & (gpio_bankb[gpio_bank(gpio)]->name >> gpio_sub_n(gpio))); \
  290. } \
  291. EXPORT_SYMBOL(get_gpio_ ## name);
  292. GET_GPIO(dir)
  293. GET_GPIO(inen)
  294. GET_GPIO(polar)
  295. GET_GPIO(edge)
  296. GET_GPIO(both)
  297. GET_GPIO(maska)
  298. GET_GPIO(maskb)
  299. #if defined(ANOMALY_05000311)
  300. unsigned short get_gpio_data(unsigned short gpio)
  301. {
  302. unsigned long flags;
  303. unsigned short ret;
  304. BUG_ON(!(reserved_map[gpio_bank(gpio)] & gpio_bit(gpio)));
  305. local_irq_save(flags);
  306. ret = 0x01 & (gpio_bankb[gpio_bank(gpio)]->data >> gpio_sub_n(gpio));
  307. bfin_read_CHIPID();
  308. local_irq_restore(flags);
  309. return ret;
  310. }
  311. EXPORT_SYMBOL(get_gpio_data);
  312. #else
  313. GET_GPIO(data)
  314. #endif
  315. /*Get current PORT date (16-bit word)*/
  316. #define GET_GPIO_P(name) \
  317. unsigned short get_gpiop_ ## name(unsigned short gpio) \
  318. { \
  319. return (gpio_bankb[gpio_bank(gpio)]->name);\
  320. } \
  321. EXPORT_SYMBOL(get_gpiop_ ## name);
  322. GET_GPIO_P(dir)
  323. GET_GPIO_P(inen)
  324. GET_GPIO_P(polar)
  325. GET_GPIO_P(edge)
  326. GET_GPIO_P(both)
  327. GET_GPIO_P(maska)
  328. GET_GPIO_P(maskb)
  329. #if defined(ANOMALY_05000311)
  330. unsigned short get_gpiop_data(unsigned short gpio)
  331. {
  332. unsigned long flags;
  333. unsigned short ret;
  334. local_irq_save(flags);
  335. ret = gpio_bankb[gpio_bank(gpio)]->data;
  336. bfin_read_CHIPID();
  337. local_irq_restore(flags);
  338. return ret;
  339. }
  340. EXPORT_SYMBOL(get_gpiop_data);
  341. #else
  342. GET_GPIO_P(data)
  343. #endif
  344. #ifdef CONFIG_PM
  345. /***********************************************************
  346. *
  347. * FUNCTIONS: Blackfin PM Setup API
  348. *
  349. * INPUTS/OUTPUTS:
  350. * gpio - GPIO Number between 0 and MAX_BLACKFIN_GPIOS
  351. * type -
  352. * PM_WAKE_RISING
  353. * PM_WAKE_FALLING
  354. * PM_WAKE_HIGH
  355. * PM_WAKE_LOW
  356. * PM_WAKE_BOTH_EDGES
  357. *
  358. * DESCRIPTION: Blackfin PM Driver API
  359. *
  360. * CAUTION:
  361. *************************************************************
  362. * MODIFICATION HISTORY :
  363. **************************************************************/
  364. int gpio_pm_wakeup_request(unsigned short gpio, unsigned char type)
  365. {
  366. unsigned long flags;
  367. if ((check_gpio(gpio) < 0) || !type)
  368. return -EINVAL;
  369. local_irq_save(flags);
  370. wakeup_map[gpio_bank(gpio)] |= gpio_bit(gpio);
  371. wakeup_flags_map[gpio] = type;
  372. local_irq_restore(flags);
  373. return 0;
  374. }
  375. EXPORT_SYMBOL(gpio_pm_wakeup_request);
  376. void gpio_pm_wakeup_free(unsigned short gpio)
  377. {
  378. unsigned long flags;
  379. if (check_gpio(gpio) < 0)
  380. return;
  381. local_irq_save(flags);
  382. wakeup_map[gpio_bank(gpio)] &= ~gpio_bit(gpio);
  383. local_irq_restore(flags);
  384. }
  385. EXPORT_SYMBOL(gpio_pm_wakeup_free);
  386. static int bfin_gpio_wakeup_type(unsigned short gpio, unsigned char type)
  387. {
  388. port_setup(gpio, GPIO_USAGE);
  389. set_gpio_dir(gpio, 0);
  390. set_gpio_inen(gpio, 1);
  391. if (type & (PM_WAKE_RISING | PM_WAKE_FALLING))
  392. set_gpio_edge(gpio, 1);
  393. else
  394. set_gpio_edge(gpio, 0);
  395. if ((type & (PM_WAKE_BOTH_EDGES)) == (PM_WAKE_BOTH_EDGES))
  396. set_gpio_both(gpio, 1);
  397. else
  398. set_gpio_both(gpio, 0);
  399. if ((type & (PM_WAKE_FALLING | PM_WAKE_LOW)))
  400. set_gpio_polar(gpio, 1);
  401. else
  402. set_gpio_polar(gpio, 0);
  403. SSYNC();
  404. return 0;
  405. }
  406. u32 gpio_pm_setup(void)
  407. {
  408. u32 sic_iwr = 0;
  409. u16 bank, mask, i, gpio;
  410. for (i = 0; i < MAX_BLACKFIN_GPIOS; i+=GPIO_BANKSIZE) {
  411. mask = wakeup_map[gpio_bank(i)];
  412. bank = gpio_bank(i);
  413. gpio_bank_saved[bank].maskb = gpio_bankb[bank]->maskb;
  414. gpio_bankb[bank]->maskb = 0;
  415. if (mask) {
  416. #ifdef BF537_FAMILY
  417. gpio_bank_saved[bank].fer = *port_fer[bank];
  418. #endif
  419. gpio_bank_saved[bank].inen = gpio_bankb[bank]->inen;
  420. gpio_bank_saved[bank].polar = gpio_bankb[bank]->polar;
  421. gpio_bank_saved[bank].dir = gpio_bankb[bank]->dir;
  422. gpio_bank_saved[bank].edge = gpio_bankb[bank]->edge;
  423. gpio_bank_saved[bank].both = gpio_bankb[bank]->both;
  424. gpio = i;
  425. while (mask) {
  426. if (mask & 1) {
  427. bfin_gpio_wakeup_type(gpio, wakeup_flags_map[gpio]);
  428. set_gpio_data(gpio, 0); /*Clear*/
  429. }
  430. gpio++;
  431. mask >>= 1;
  432. }
  433. sic_iwr |= 1 << (sic_iwr_irqs[bank] - (IRQ_CORETMR + 1));
  434. gpio_bankb[bank]->maskb_set = wakeup_map[gpio_bank(i)];
  435. }
  436. }
  437. if (sic_iwr)
  438. return sic_iwr;
  439. else
  440. return IWR_ENABLE_ALL;
  441. }
  442. void gpio_pm_restore(void)
  443. {
  444. u16 bank, mask, i;
  445. for (i = 0; i < MAX_BLACKFIN_GPIOS; i+=GPIO_BANKSIZE) {
  446. mask = wakeup_map[gpio_bank(i)];
  447. bank = gpio_bank(i);
  448. if (mask) {
  449. #ifdef BF537_FAMILY
  450. *port_fer[bank] = gpio_bank_saved[bank].fer;
  451. #endif
  452. gpio_bankb[bank]->inen = gpio_bank_saved[bank].inen;
  453. gpio_bankb[bank]->dir = gpio_bank_saved[bank].dir;
  454. gpio_bankb[bank]->polar = gpio_bank_saved[bank].polar;
  455. gpio_bankb[bank]->edge = gpio_bank_saved[bank].edge;
  456. gpio_bankb[bank]->both = gpio_bank_saved[bank].both;
  457. }
  458. gpio_bankb[bank]->maskb = gpio_bank_saved[bank].maskb;
  459. }
  460. }
  461. #endif
  462. /***********************************************************
  463. *
  464. * FUNCTIONS: Blackfin GPIO Driver
  465. *
  466. * INPUTS/OUTPUTS:
  467. * gpio - GPIO Number between 0 and MAX_BLACKFIN_GPIOS
  468. *
  469. *
  470. * DESCRIPTION: Blackfin GPIO Driver API
  471. *
  472. * CAUTION:
  473. *************************************************************
  474. * MODIFICATION HISTORY :
  475. **************************************************************/
  476. int gpio_request(unsigned short gpio, const char *label)
  477. {
  478. unsigned long flags;
  479. if (check_gpio(gpio) < 0)
  480. return -EINVAL;
  481. local_irq_save(flags);
  482. if (unlikely(reserved_map[gpio_bank(gpio)] & gpio_bit(gpio))) {
  483. printk(KERN_ERR "bfin-gpio: GPIO %d is already reserved!\n", gpio);
  484. dump_stack();
  485. local_irq_restore(flags);
  486. return -EBUSY;
  487. }
  488. reserved_map[gpio_bank(gpio)] |= gpio_bit(gpio);
  489. local_irq_restore(flags);
  490. port_setup(gpio, GPIO_USAGE);
  491. return 0;
  492. }
  493. EXPORT_SYMBOL(gpio_request);
  494. void gpio_free(unsigned short gpio)
  495. {
  496. unsigned long flags;
  497. if (check_gpio(gpio) < 0)
  498. return;
  499. local_irq_save(flags);
  500. if (unlikely(!(reserved_map[gpio_bank(gpio)] & gpio_bit(gpio)))) {
  501. printk(KERN_ERR "bfin-gpio: GPIO %d wasn't reserved!\n", gpio);
  502. dump_stack();
  503. local_irq_restore(flags);
  504. return;
  505. }
  506. default_gpio(gpio);
  507. reserved_map[gpio_bank(gpio)] &= ~gpio_bit(gpio);
  508. local_irq_restore(flags);
  509. }
  510. EXPORT_SYMBOL(gpio_free);
  511. void gpio_direction_input(unsigned short gpio)
  512. {
  513. unsigned long flags;
  514. BUG_ON(!(reserved_map[gpio_bank(gpio)] & gpio_bit(gpio)));
  515. local_irq_save(flags);
  516. gpio_bankb[gpio_bank(gpio)]->dir &= ~gpio_bit(gpio);
  517. gpio_bankb[gpio_bank(gpio)]->inen |= gpio_bit(gpio);
  518. local_irq_restore(flags);
  519. }
  520. EXPORT_SYMBOL(gpio_direction_input);
  521. void gpio_direction_output(unsigned short gpio)
  522. {
  523. unsigned long flags;
  524. BUG_ON(!(reserved_map[gpio_bank(gpio)] & gpio_bit(gpio)));
  525. local_irq_save(flags);
  526. gpio_bankb[gpio_bank(gpio)]->inen &= ~gpio_bit(gpio);
  527. gpio_bankb[gpio_bank(gpio)]->dir |= gpio_bit(gpio);
  528. local_irq_restore(flags);
  529. }
  530. EXPORT_SYMBOL(gpio_direction_output);