11394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu/* 296f1050d3df105c9ae6c6ac224f370199ea82fcdRobin Getz * Copyright 2006-2009 Analog Devices Inc. 31394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu * 496f1050d3df105c9ae6c6ac224f370199ea82fcdRobin Getz * Licensed under the GPL-2 or later. 51394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu */ 61394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu 71394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu#ifndef __ARCH_BLACKFIN_GPIO_H__ 81394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu#define __ARCH_BLACKFIN_GPIO_H__ 91394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu 10812ae98f0849fbceb32c6d21bcdda42b40264c82Mike Frysinger#define gpio_bank(x) ((x) >> 4) 11812ae98f0849fbceb32c6d21bcdda42b40264c82Mike Frysinger#define gpio_bit(x) (1<<((x) & 0xF)) 12812ae98f0849fbceb32c6d21bcdda42b40264c82Mike Frysinger#define gpio_sub_n(x) ((x) & 0xF) 131394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu 14812ae98f0849fbceb32c6d21bcdda42b40264c82Mike Frysinger#define GPIO_BANKSIZE 16 15812ae98f0849fbceb32c6d21bcdda42b40264c82Mike Frysinger#define GPIO_BANK_NUM DIV_ROUND_UP(MAX_BLACKFIN_GPIOS, GPIO_BANKSIZE) 161394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu 17983e1016050e3bb9d64bde0f7d4792a6fcb248d8Michael Hennerich#include <mach/gpio.h> 18983e1016050e3bb9d64bde0f7d4792a6fcb248d8Michael Hennerich 191394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu#define PERIPHERAL_USAGE 1 201394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu#define GPIO_USAGE 0 211394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu 2201f8e34c9855e5aa4f56a73b8d5ea8f7613dbb7eMike Frysinger#ifndef BFIN_GPIO_PINT 2301f8e34c9855e5aa4f56a73b8d5ea8f7613dbb7eMike Frysinger# define BFIN_GPIO_PINT 0 2401f8e34c9855e5aa4f56a73b8d5ea8f7613dbb7eMike Frysinger#endif 2501f8e34c9855e5aa4f56a73b8d5ea8f7613dbb7eMike Frysinger 261394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu#ifndef __ASSEMBLY__ 271394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu 28ffb7fc0f6d2d630cb9e6e37e67993aaa342819f1Sonic Zhang#ifndef CONFIG_PINCTRL 29ffb7fc0f6d2d630cb9e6e37e67993aaa342819f1Sonic Zhang 307f4f69f991146fa976cbc914a50285b2afc0ad93Joachim Eastwood#include <linux/compiler.h> 31ffb7fc0f6d2d630cb9e6e37e67993aaa342819f1Sonic Zhang#include <asm/blackfin.h> 32ffb7fc0f6d2d630cb9e6e37e67993aaa342819f1Sonic Zhang#include <asm/portmux.h> 33ffb7fc0f6d2d630cb9e6e37e67993aaa342819f1Sonic Zhang#include <asm/irq_handler.h> 347f4f69f991146fa976cbc914a50285b2afc0ad93Joachim Eastwood 351394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu/*********************************************************** 361394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu* 371394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu* FUNCTIONS: Blackfin General Purpose Ports Access Functions 381394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu* 391394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu* INPUTS/OUTPUTS: 401394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu* gpio - GPIO Number between 0 and MAX_BLACKFIN_GPIOS 411394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu* 421394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu* 431394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu* DESCRIPTION: These functions abstract direct register access 441394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu* to Blackfin processor General Purpose 451394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu* Ports Regsiters 461394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu* 471394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu* CAUTION: These functions do not belong to the GPIO Driver API 481394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu************************************************************* 491394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu* MODIFICATION HISTORY : 501394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu**************************************************************/ 511394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu 52a2c8cfef6abb33ee49d80c58391ebfc4f94221efMichael Hennerichvoid set_gpio_dir(unsigned, unsigned short); 53a2c8cfef6abb33ee49d80c58391ebfc4f94221efMichael Hennerichvoid set_gpio_inen(unsigned, unsigned short); 54a2c8cfef6abb33ee49d80c58391ebfc4f94221efMichael Hennerichvoid set_gpio_polar(unsigned, unsigned short); 55a2c8cfef6abb33ee49d80c58391ebfc4f94221efMichael Hennerichvoid set_gpio_edge(unsigned, unsigned short); 56a2c8cfef6abb33ee49d80c58391ebfc4f94221efMichael Hennerichvoid set_gpio_both(unsigned, unsigned short); 57a2c8cfef6abb33ee49d80c58391ebfc4f94221efMichael Hennerichvoid set_gpio_data(unsigned, unsigned short); 58a2c8cfef6abb33ee49d80c58391ebfc4f94221efMichael Hennerichvoid set_gpio_maska(unsigned, unsigned short); 59a2c8cfef6abb33ee49d80c58391ebfc4f94221efMichael Hennerichvoid set_gpio_maskb(unsigned, unsigned short); 60a2c8cfef6abb33ee49d80c58391ebfc4f94221efMichael Hennerichvoid set_gpio_toggle(unsigned); 61a2c8cfef6abb33ee49d80c58391ebfc4f94221efMichael Hennerichvoid set_gpiop_dir(unsigned, unsigned short); 62a2c8cfef6abb33ee49d80c58391ebfc4f94221efMichael Hennerichvoid set_gpiop_inen(unsigned, unsigned short); 63a2c8cfef6abb33ee49d80c58391ebfc4f94221efMichael Hennerichvoid set_gpiop_polar(unsigned, unsigned short); 64a2c8cfef6abb33ee49d80c58391ebfc4f94221efMichael Hennerichvoid set_gpiop_edge(unsigned, unsigned short); 65a2c8cfef6abb33ee49d80c58391ebfc4f94221efMichael Hennerichvoid set_gpiop_both(unsigned, unsigned short); 66a2c8cfef6abb33ee49d80c58391ebfc4f94221efMichael Hennerichvoid set_gpiop_data(unsigned, unsigned short); 67a2c8cfef6abb33ee49d80c58391ebfc4f94221efMichael Hennerichvoid set_gpiop_maska(unsigned, unsigned short); 68a2c8cfef6abb33ee49d80c58391ebfc4f94221efMichael Hennerichvoid set_gpiop_maskb(unsigned, unsigned short); 69a2c8cfef6abb33ee49d80c58391ebfc4f94221efMichael Hennerichunsigned short get_gpio_dir(unsigned); 70a2c8cfef6abb33ee49d80c58391ebfc4f94221efMichael Hennerichunsigned short get_gpio_inen(unsigned); 71a2c8cfef6abb33ee49d80c58391ebfc4f94221efMichael Hennerichunsigned short get_gpio_polar(unsigned); 72a2c8cfef6abb33ee49d80c58391ebfc4f94221efMichael Hennerichunsigned short get_gpio_edge(unsigned); 73a2c8cfef6abb33ee49d80c58391ebfc4f94221efMichael Hennerichunsigned short get_gpio_both(unsigned); 74a2c8cfef6abb33ee49d80c58391ebfc4f94221efMichael Hennerichunsigned short get_gpio_maska(unsigned); 75a2c8cfef6abb33ee49d80c58391ebfc4f94221efMichael Hennerichunsigned short get_gpio_maskb(unsigned); 76a2c8cfef6abb33ee49d80c58391ebfc4f94221efMichael Hennerichunsigned short get_gpio_data(unsigned); 77a2c8cfef6abb33ee49d80c58391ebfc4f94221efMichael Hennerichunsigned short get_gpiop_dir(unsigned); 78a2c8cfef6abb33ee49d80c58391ebfc4f94221efMichael Hennerichunsigned short get_gpiop_inen(unsigned); 79a2c8cfef6abb33ee49d80c58391ebfc4f94221efMichael Hennerichunsigned short get_gpiop_polar(unsigned); 80a2c8cfef6abb33ee49d80c58391ebfc4f94221efMichael Hennerichunsigned short get_gpiop_edge(unsigned); 81a2c8cfef6abb33ee49d80c58391ebfc4f94221efMichael Hennerichunsigned short get_gpiop_both(unsigned); 82a2c8cfef6abb33ee49d80c58391ebfc4f94221efMichael Hennerichunsigned short get_gpiop_maska(unsigned); 83a2c8cfef6abb33ee49d80c58391ebfc4f94221efMichael Hennerichunsigned short get_gpiop_maskb(unsigned); 84a2c8cfef6abb33ee49d80c58391ebfc4f94221efMichael Hennerichunsigned short get_gpiop_data(unsigned); 851394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu 861394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wustruct gpio_port_t { 871394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu unsigned short data; 881394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu unsigned short dummy1; 891394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu unsigned short data_clear; 901394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu unsigned short dummy2; 911394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu unsigned short data_set; 921394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu unsigned short dummy3; 931394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu unsigned short toggle; 941394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu unsigned short dummy4; 951394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu unsigned short maska; 961394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu unsigned short dummy5; 971394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu unsigned short maska_clear; 981394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu unsigned short dummy6; 991394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu unsigned short maska_set; 1001394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu unsigned short dummy7; 1011394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu unsigned short maska_toggle; 1021394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu unsigned short dummy8; 1031394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu unsigned short maskb; 1041394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu unsigned short dummy9; 1051394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu unsigned short maskb_clear; 1061394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu unsigned short dummy10; 1071394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu unsigned short maskb_set; 1081394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu unsigned short dummy11; 1091394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu unsigned short maskb_toggle; 1101394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu unsigned short dummy12; 1111394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu unsigned short dir; 1121394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu unsigned short dummy13; 1131394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu unsigned short polar; 1141394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu unsigned short dummy14; 1151394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu unsigned short edge; 1161394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu unsigned short dummy15; 1171394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu unsigned short both; 1181394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu unsigned short dummy16; 1191394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu unsigned short inen; 1201394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu}; 1211394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu 122621dd2474399237ca556a54037c3b8557e80d021Michael Hennerich#ifdef BFIN_SPECIAL_GPIO_BANKS 123621dd2474399237ca556a54037c3b8557e80d021Michael Hennerichvoid bfin_special_gpio_free(unsigned gpio); 124621dd2474399237ca556a54037c3b8557e80d021Michael Hennerichint bfin_special_gpio_request(unsigned gpio, const char *label); 1259466a0510a5445d81eaf33affc20e2f7e2e718fbMike Frysinger# ifdef CONFIG_PM 1269466a0510a5445d81eaf33affc20e2f7e2e718fbMike Frysingervoid bfin_special_gpio_pm_hibernate_restore(void); 1279466a0510a5445d81eaf33affc20e2f7e2e718fbMike Frysingervoid bfin_special_gpio_pm_hibernate_suspend(void); 1289466a0510a5445d81eaf33affc20e2f7e2e718fbMike Frysinger# endif 129621dd2474399237ca556a54037c3b8557e80d021Michael Hennerich#endif 130621dd2474399237ca556a54037c3b8557e80d021Michael Hennerich 1311394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu#ifdef CONFIG_PM 132ffb7fc0f6d2d630cb9e6e37e67993aaa342819f1Sonic Zhangvoid bfin_gpio_pm_hibernate_restore(void); 133ffb7fc0f6d2d630cb9e6e37e67993aaa342819f1Sonic Zhangvoid bfin_gpio_pm_hibernate_suspend(void); 134ffb7fc0f6d2d630cb9e6e37e67993aaa342819f1Sonic Zhangint bfin_gpio_pm_wakeup_ctrl(unsigned gpio, unsigned ctrl); 135ffb7fc0f6d2d630cb9e6e37e67993aaa342819f1Sonic Zhangint bfin_gpio_pm_standby_ctrl(unsigned ctrl); 1361efc80b53eb54770139219f99657abd92595fc86Michael Hennerich 137bb84dbf69b0730fcc78c275f900ed74b2b8453a5Michael Hennerichstatic inline int bfin_pm_standby_setup(void) 138bb84dbf69b0730fcc78c275f900ed74b2b8453a5Michael Hennerich{ 139ffb7fc0f6d2d630cb9e6e37e67993aaa342819f1Sonic Zhang return bfin_gpio_pm_standby_ctrl(1); 140bb84dbf69b0730fcc78c275f900ed74b2b8453a5Michael Hennerich} 141bb84dbf69b0730fcc78c275f900ed74b2b8453a5Michael Hennerich 142bb84dbf69b0730fcc78c275f900ed74b2b8453a5Michael Hennerichstatic inline void bfin_pm_standby_restore(void) 143bb84dbf69b0730fcc78c275f900ed74b2b8453a5Michael Hennerich{ 144ffb7fc0f6d2d630cb9e6e37e67993aaa342819f1Sonic Zhang bfin_gpio_pm_standby_ctrl(0); 145bb84dbf69b0730fcc78c275f900ed74b2b8453a5Michael Hennerich} 1461efc80b53eb54770139219f99657abd92595fc86Michael Hennerich 1471394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu 1481394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wustruct gpio_port_s { 1491394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu unsigned short data; 1501394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu unsigned short maska; 1511394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu unsigned short maskb; 1521394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu unsigned short dir; 1531394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu unsigned short polar; 1541394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu unsigned short edge; 1551394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu unsigned short both; 1561394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu unsigned short inen; 1571394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu 1581394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu unsigned short fer; 159581d62ab304fb43d2ae4de06527676661b171cf6Michael Hennerich unsigned short reserved; 1601efc80b53eb54770139219f99657abd92595fc86Michael Hennerich unsigned short mux; 1611394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu}; 1621394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu#endif /*CONFIG_PM*/ 16301f8e34c9855e5aa4f56a73b8d5ea8f7613dbb7eMike Frysinger 1641394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu/*********************************************************** 1651394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu* 1661394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu* FUNCTIONS: Blackfin GPIO Driver 1671394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu* 1681394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu* INPUTS/OUTPUTS: 1691394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu* gpio - GPIO Number between 0 and MAX_BLACKFIN_GPIOS 1701394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu* 1711394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu* 1721394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu* DESCRIPTION: Blackfin GPIO Driver API 1731394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu* 1741394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu* CAUTION: 1751394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu************************************************************* 1761394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu* MODIFICATION HISTORY : 1771394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu**************************************************************/ 1789570ff4af6920c5992eb91141d71fc94127d864bGraf Yangint bfin_gpio_irq_request(unsigned gpio, const char *label); 1799570ff4af6920c5992eb91141d71fc94127d864bGraf Yangvoid bfin_gpio_irq_free(unsigned gpio); 180ffb7fc0f6d2d630cb9e6e37e67993aaa342819f1Sonic Zhangvoid bfin_gpio_irq_prepare(unsigned gpio); 181ffb7fc0f6d2d630cb9e6e37e67993aaa342819f1Sonic Zhang 182ffb7fc0f6d2d630cb9e6e37e67993aaa342819f1Sonic Zhangstatic inline int irq_to_gpio(unsigned irq) 183ffb7fc0f6d2d630cb9e6e37e67993aaa342819f1Sonic Zhang{ 184ffb7fc0f6d2d630cb9e6e37e67993aaa342819f1Sonic Zhang return irq - GPIO_IRQ_BASE; 185ffb7fc0f6d2d630cb9e6e37e67993aaa342819f1Sonic Zhang} 186ffb7fc0f6d2d630cb9e6e37e67993aaa342819f1Sonic Zhang#endif /* CONFIG_PINCTRL */ 1871394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu 1887f4f69f991146fa976cbc914a50285b2afc0ad93Joachim Eastwood#include <asm/irq.h> 1897f4f69f991146fa976cbc914a50285b2afc0ad93Joachim Eastwood#include <asm/errno.h> 1907f4f69f991146fa976cbc914a50285b2afc0ad93Joachim Eastwood 191a4f0b32c331a3da1dd1336f1691504268c63fc14Michael Hennerich#include <asm-generic/gpio.h> /* cansleep wrappers */ 192a4f0b32c331a3da1dd1336f1691504268c63fc14Michael Hennerich 193a4f0b32c331a3da1dd1336f1691504268c63fc14Michael Hennerichstatic inline int gpio_get_value(unsigned int gpio) 194a4f0b32c331a3da1dd1336f1691504268c63fc14Michael Hennerich{ 195ffb7fc0f6d2d630cb9e6e37e67993aaa342819f1Sonic Zhang return __gpio_get_value(gpio); 196a4f0b32c331a3da1dd1336f1691504268c63fc14Michael Hennerich} 197a4f0b32c331a3da1dd1336f1691504268c63fc14Michael Hennerich 198a4f0b32c331a3da1dd1336f1691504268c63fc14Michael Hennerichstatic inline void gpio_set_value(unsigned int gpio, int value) 199a4f0b32c331a3da1dd1336f1691504268c63fc14Michael Hennerich{ 200ffb7fc0f6d2d630cb9e6e37e67993aaa342819f1Sonic Zhang __gpio_set_value(gpio, value); 201a4f0b32c331a3da1dd1336f1691504268c63fc14Michael Hennerich} 202a4f0b32c331a3da1dd1336f1691504268c63fc14Michael Hennerich 203a4f0b32c331a3da1dd1336f1691504268c63fc14Michael Hennerichstatic inline int gpio_cansleep(unsigned int gpio) 204a4f0b32c331a3da1dd1336f1691504268c63fc14Michael Hennerich{ 205a4f0b32c331a3da1dd1336f1691504268c63fc14Michael Hennerich return __gpio_cansleep(gpio); 206a4f0b32c331a3da1dd1336f1691504268c63fc14Michael Hennerich} 207a4f0b32c331a3da1dd1336f1691504268c63fc14Michael Hennerich 2087f4f69f991146fa976cbc914a50285b2afc0ad93Joachim Eastwoodstatic inline int gpio_to_irq(unsigned gpio) 2097f4f69f991146fa976cbc914a50285b2afc0ad93Joachim Eastwood{ 2107f4f69f991146fa976cbc914a50285b2afc0ad93Joachim Eastwood return __gpio_to_irq(gpio); 2117f4f69f991146fa976cbc914a50285b2afc0ad93Joachim Eastwood} 2121394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu#endif /* __ASSEMBLY__ */ 2131394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu 2141394f03221790a988afc3e4b3cb79f2e477246a9Bryan Wu#endif /* __ARCH_BLACKFIN_GPIO_H__ */ 215