109f455dcSMasahiro Yamada /* 209f455dcSMasahiro Yamada * Copyright (c) 2011 The Chromium OS Authors. 309f455dcSMasahiro Yamada * 409f455dcSMasahiro Yamada * SPDX-License-Identifier: GPL-2.0+ 509f455dcSMasahiro Yamada */ 609f455dcSMasahiro Yamada 709f455dcSMasahiro Yamada /* Tegra20 high-level function multiplexing */ 809f455dcSMasahiro Yamada #include <common.h> 909f455dcSMasahiro Yamada #include <asm/arch/clock.h> 1009f455dcSMasahiro Yamada #include <asm/arch/funcmux.h> 1109f455dcSMasahiro Yamada #include <asm/arch/pinmux.h> 1209f455dcSMasahiro Yamada 1309f455dcSMasahiro Yamada /* 1409f455dcSMasahiro Yamada * The PINMUX macro is used to set up pinmux tables. 1509f455dcSMasahiro Yamada */ 1609f455dcSMasahiro Yamada #define PINMUX(grp, mux, pupd, tri) \ 1709f455dcSMasahiro Yamada {PMUX_PINGRP_##grp, PMUX_FUNC_##mux, PMUX_PULL_##pupd, PMUX_TRI_##tri} 1809f455dcSMasahiro Yamada 1909f455dcSMasahiro Yamada static const struct pmux_pingrp_config disp1_default[] = { 2009f455dcSMasahiro Yamada PINMUX(LDI, DISPA, NORMAL, NORMAL), 2109f455dcSMasahiro Yamada PINMUX(LHP0, DISPA, NORMAL, NORMAL), 2209f455dcSMasahiro Yamada PINMUX(LHP1, DISPA, NORMAL, NORMAL), 2309f455dcSMasahiro Yamada PINMUX(LHP2, DISPA, NORMAL, NORMAL), 2409f455dcSMasahiro Yamada PINMUX(LHS, DISPA, NORMAL, NORMAL), 2509f455dcSMasahiro Yamada PINMUX(LM0, RSVD4, NORMAL, NORMAL), 2609f455dcSMasahiro Yamada PINMUX(LPP, DISPA, NORMAL, NORMAL), 2709f455dcSMasahiro Yamada PINMUX(LPW0, DISPA, NORMAL, NORMAL), 2809f455dcSMasahiro Yamada PINMUX(LPW2, DISPA, NORMAL, NORMAL), 2909f455dcSMasahiro Yamada PINMUX(LSC0, DISPA, NORMAL, NORMAL), 3009f455dcSMasahiro Yamada PINMUX(LSPI, DISPA, NORMAL, NORMAL), 3109f455dcSMasahiro Yamada PINMUX(LVP1, DISPA, NORMAL, NORMAL), 3209f455dcSMasahiro Yamada PINMUX(LVS, DISPA, NORMAL, NORMAL), 3309f455dcSMasahiro Yamada PINMUX(SLXD, SPDIF, NORMAL, NORMAL), 3409f455dcSMasahiro Yamada }; 3509f455dcSMasahiro Yamada 3609f455dcSMasahiro Yamada 3709f455dcSMasahiro Yamada int funcmux_select(enum periph_id id, int config) 3809f455dcSMasahiro Yamada { 3909f455dcSMasahiro Yamada int bad_config = config != FUNCMUX_DEFAULT; 4009f455dcSMasahiro Yamada 4109f455dcSMasahiro Yamada switch (id) { 4209f455dcSMasahiro Yamada case PERIPH_ID_UART1: 4309f455dcSMasahiro Yamada switch (config) { 4409f455dcSMasahiro Yamada case FUNCMUX_UART1_IRRX_IRTX: 4509f455dcSMasahiro Yamada pinmux_set_func(PMUX_PINGRP_IRRX, PMUX_FUNC_UARTA); 4609f455dcSMasahiro Yamada pinmux_set_func(PMUX_PINGRP_IRTX, PMUX_FUNC_UARTA); 4709f455dcSMasahiro Yamada pinmux_tristate_disable(PMUX_PINGRP_IRRX); 4809f455dcSMasahiro Yamada pinmux_tristate_disable(PMUX_PINGRP_IRTX); 4909f455dcSMasahiro Yamada break; 5009f455dcSMasahiro Yamada case FUNCMUX_UART1_UAA_UAB: 5109f455dcSMasahiro Yamada pinmux_set_func(PMUX_PINGRP_UAA, PMUX_FUNC_UARTA); 5209f455dcSMasahiro Yamada pinmux_set_func(PMUX_PINGRP_UAB, PMUX_FUNC_UARTA); 5309f455dcSMasahiro Yamada pinmux_tristate_disable(PMUX_PINGRP_UAA); 5409f455dcSMasahiro Yamada pinmux_tristate_disable(PMUX_PINGRP_UAB); 5509f455dcSMasahiro Yamada bad_config = 0; 5609f455dcSMasahiro Yamada break; 5709f455dcSMasahiro Yamada case FUNCMUX_UART1_GPU: 5809f455dcSMasahiro Yamada pinmux_set_func(PMUX_PINGRP_GPU, PMUX_FUNC_UARTA); 5909f455dcSMasahiro Yamada pinmux_tristate_disable(PMUX_PINGRP_GPU); 6009f455dcSMasahiro Yamada bad_config = 0; 6109f455dcSMasahiro Yamada break; 6209f455dcSMasahiro Yamada case FUNCMUX_UART1_SDIO1: 6309f455dcSMasahiro Yamada pinmux_set_func(PMUX_PINGRP_SDIO1, PMUX_FUNC_UARTA); 6409f455dcSMasahiro Yamada pinmux_tristate_disable(PMUX_PINGRP_SDIO1); 6509f455dcSMasahiro Yamada bad_config = 0; 6609f455dcSMasahiro Yamada break; 6709f455dcSMasahiro Yamada } 6809f455dcSMasahiro Yamada if (!bad_config) { 6909f455dcSMasahiro Yamada /* 7009f455dcSMasahiro Yamada * Tegra appears to boot with function UARTA pre- 7109f455dcSMasahiro Yamada * selected on mux group SDB. If two mux groups are 7209f455dcSMasahiro Yamada * both set to the same function, it's unclear which 7309f455dcSMasahiro Yamada * group's pins drive the RX signals into the HW. 7409f455dcSMasahiro Yamada * For UARTA, SDB certainly overrides group IRTX in 7509f455dcSMasahiro Yamada * practice. To solve this, configure some alternative 7609f455dcSMasahiro Yamada * function on SDB to avoid the conflict. Also, tri- 7709f455dcSMasahiro Yamada * state the group to avoid driving any signal onto it 7809f455dcSMasahiro Yamada * until we know what's connected. 7909f455dcSMasahiro Yamada */ 8009f455dcSMasahiro Yamada pinmux_tristate_enable(PMUX_PINGRP_SDB); 8109f455dcSMasahiro Yamada pinmux_set_func(PMUX_PINGRP_SDB, PMUX_FUNC_SDIO3); 8209f455dcSMasahiro Yamada } 8309f455dcSMasahiro Yamada break; 8409f455dcSMasahiro Yamada 8509f455dcSMasahiro Yamada case PERIPH_ID_UART2: 8609f455dcSMasahiro Yamada if (config == FUNCMUX_UART2_UAD) { 8709f455dcSMasahiro Yamada pinmux_set_func(PMUX_PINGRP_UAD, PMUX_FUNC_UARTB); 8809f455dcSMasahiro Yamada pinmux_tristate_disable(PMUX_PINGRP_UAD); 8909f455dcSMasahiro Yamada } 9009f455dcSMasahiro Yamada break; 9109f455dcSMasahiro Yamada 9209f455dcSMasahiro Yamada case PERIPH_ID_UART4: 9309f455dcSMasahiro Yamada if (config == FUNCMUX_UART4_GMC) { 9409f455dcSMasahiro Yamada pinmux_set_func(PMUX_PINGRP_GMC, PMUX_FUNC_UARTD); 9509f455dcSMasahiro Yamada pinmux_tristate_disable(PMUX_PINGRP_GMC); 9609f455dcSMasahiro Yamada } 9709f455dcSMasahiro Yamada break; 9809f455dcSMasahiro Yamada 9909f455dcSMasahiro Yamada case PERIPH_ID_DVC_I2C: 10009f455dcSMasahiro Yamada /* there is only one selection, pinmux_config is ignored */ 10109f455dcSMasahiro Yamada if (config == FUNCMUX_DVC_I2CP) { 10209f455dcSMasahiro Yamada pinmux_set_func(PMUX_PINGRP_I2CP, PMUX_FUNC_I2C); 10309f455dcSMasahiro Yamada pinmux_tristate_disable(PMUX_PINGRP_I2CP); 10409f455dcSMasahiro Yamada } 10509f455dcSMasahiro Yamada break; 10609f455dcSMasahiro Yamada 10709f455dcSMasahiro Yamada case PERIPH_ID_I2C1: 10809f455dcSMasahiro Yamada /* support pinmux_config of 0 for now, */ 10909f455dcSMasahiro Yamada if (config == FUNCMUX_I2C1_RM) { 11009f455dcSMasahiro Yamada pinmux_set_func(PMUX_PINGRP_RM, PMUX_FUNC_I2C); 11109f455dcSMasahiro Yamada pinmux_tristate_disable(PMUX_PINGRP_RM); 11209f455dcSMasahiro Yamada } 11309f455dcSMasahiro Yamada break; 11409f455dcSMasahiro Yamada case PERIPH_ID_I2C2: /* I2C2 */ 11509f455dcSMasahiro Yamada switch (config) { 11609f455dcSMasahiro Yamada case FUNCMUX_I2C2_DDC: /* DDC pin group, select I2C2 */ 11709f455dcSMasahiro Yamada pinmux_set_func(PMUX_PINGRP_DDC, PMUX_FUNC_I2C2); 11809f455dcSMasahiro Yamada /* PTA to HDMI */ 11909f455dcSMasahiro Yamada pinmux_set_func(PMUX_PINGRP_PTA, PMUX_FUNC_HDMI); 12009f455dcSMasahiro Yamada pinmux_tristate_disable(PMUX_PINGRP_DDC); 12109f455dcSMasahiro Yamada break; 12209f455dcSMasahiro Yamada case FUNCMUX_I2C2_PTA: /* PTA pin group, select I2C2 */ 12309f455dcSMasahiro Yamada pinmux_set_func(PMUX_PINGRP_PTA, PMUX_FUNC_I2C2); 12409f455dcSMasahiro Yamada /* set DDC_SEL to RSVDx (RSVD2 works for now) */ 12509f455dcSMasahiro Yamada pinmux_set_func(PMUX_PINGRP_DDC, PMUX_FUNC_RSVD2); 12609f455dcSMasahiro Yamada pinmux_tristate_disable(PMUX_PINGRP_PTA); 12709f455dcSMasahiro Yamada bad_config = 0; 12809f455dcSMasahiro Yamada break; 12909f455dcSMasahiro Yamada } 13009f455dcSMasahiro Yamada break; 13109f455dcSMasahiro Yamada case PERIPH_ID_I2C3: /* I2C3 */ 13209f455dcSMasahiro Yamada /* support pinmux_config of 0 for now */ 13309f455dcSMasahiro Yamada if (config == FUNCMUX_I2C3_DTF) { 13409f455dcSMasahiro Yamada pinmux_set_func(PMUX_PINGRP_DTF, PMUX_FUNC_I2C3); 13509f455dcSMasahiro Yamada pinmux_tristate_disable(PMUX_PINGRP_DTF); 13609f455dcSMasahiro Yamada } 13709f455dcSMasahiro Yamada break; 13809f455dcSMasahiro Yamada 13909f455dcSMasahiro Yamada case PERIPH_ID_SDMMC1: 14009f455dcSMasahiro Yamada if (config == FUNCMUX_SDMMC1_SDIO1_4BIT) { 14109f455dcSMasahiro Yamada pinmux_set_func(PMUX_PINGRP_SDIO1, PMUX_FUNC_SDIO1); 14209f455dcSMasahiro Yamada pinmux_tristate_disable(PMUX_PINGRP_SDIO1); 14309f455dcSMasahiro Yamada } 14409f455dcSMasahiro Yamada break; 14509f455dcSMasahiro Yamada 14609f455dcSMasahiro Yamada case PERIPH_ID_SDMMC2: 14709f455dcSMasahiro Yamada if (config == FUNCMUX_SDMMC2_DTA_DTD_8BIT) { 14809f455dcSMasahiro Yamada pinmux_set_func(PMUX_PINGRP_DTA, PMUX_FUNC_SDIO2); 14909f455dcSMasahiro Yamada pinmux_set_func(PMUX_PINGRP_DTD, PMUX_FUNC_SDIO2); 15009f455dcSMasahiro Yamada 15109f455dcSMasahiro Yamada pinmux_tristate_disable(PMUX_PINGRP_DTA); 15209f455dcSMasahiro Yamada pinmux_tristate_disable(PMUX_PINGRP_DTD); 15309f455dcSMasahiro Yamada } 15409f455dcSMasahiro Yamada break; 15509f455dcSMasahiro Yamada 15609f455dcSMasahiro Yamada case PERIPH_ID_SDMMC3: 15709f455dcSMasahiro Yamada switch (config) { 15809f455dcSMasahiro Yamada case FUNCMUX_SDMMC3_SDB_SLXA_8BIT: 15909f455dcSMasahiro Yamada pinmux_set_func(PMUX_PINGRP_SLXA, PMUX_FUNC_SDIO3); 16009f455dcSMasahiro Yamada pinmux_set_func(PMUX_PINGRP_SLXC, PMUX_FUNC_SDIO3); 16109f455dcSMasahiro Yamada pinmux_set_func(PMUX_PINGRP_SLXD, PMUX_FUNC_SDIO3); 16209f455dcSMasahiro Yamada pinmux_set_func(PMUX_PINGRP_SLXK, PMUX_FUNC_SDIO3); 16309f455dcSMasahiro Yamada 16409f455dcSMasahiro Yamada pinmux_tristate_disable(PMUX_PINGRP_SLXA); 16509f455dcSMasahiro Yamada pinmux_tristate_disable(PMUX_PINGRP_SLXC); 16609f455dcSMasahiro Yamada pinmux_tristate_disable(PMUX_PINGRP_SLXD); 16709f455dcSMasahiro Yamada pinmux_tristate_disable(PMUX_PINGRP_SLXK); 16809f455dcSMasahiro Yamada /* fall through */ 16909f455dcSMasahiro Yamada 17009f455dcSMasahiro Yamada case FUNCMUX_SDMMC3_SDB_4BIT: 17109f455dcSMasahiro Yamada pinmux_set_func(PMUX_PINGRP_SDB, PMUX_FUNC_SDIO3); 17209f455dcSMasahiro Yamada pinmux_set_func(PMUX_PINGRP_SDC, PMUX_FUNC_SDIO3); 17309f455dcSMasahiro Yamada pinmux_set_func(PMUX_PINGRP_SDD, PMUX_FUNC_SDIO3); 17409f455dcSMasahiro Yamada 17509f455dcSMasahiro Yamada pinmux_tristate_disable(PMUX_PINGRP_SDB); 17609f455dcSMasahiro Yamada pinmux_tristate_disable(PMUX_PINGRP_SDC); 17709f455dcSMasahiro Yamada pinmux_tristate_disable(PMUX_PINGRP_SDD); 17809f455dcSMasahiro Yamada bad_config = 0; 17909f455dcSMasahiro Yamada break; 18009f455dcSMasahiro Yamada } 18109f455dcSMasahiro Yamada break; 18209f455dcSMasahiro Yamada 18309f455dcSMasahiro Yamada case PERIPH_ID_SDMMC4: 18409f455dcSMasahiro Yamada switch (config) { 18509f455dcSMasahiro Yamada case FUNCMUX_SDMMC4_ATC_ATD_8BIT: 18609f455dcSMasahiro Yamada pinmux_set_func(PMUX_PINGRP_ATC, PMUX_FUNC_SDIO4); 18709f455dcSMasahiro Yamada pinmux_set_func(PMUX_PINGRP_ATD, PMUX_FUNC_SDIO4); 18809f455dcSMasahiro Yamada 18909f455dcSMasahiro Yamada pinmux_tristate_disable(PMUX_PINGRP_ATC); 19009f455dcSMasahiro Yamada pinmux_tristate_disable(PMUX_PINGRP_ATD); 19109f455dcSMasahiro Yamada break; 19209f455dcSMasahiro Yamada 19309f455dcSMasahiro Yamada case FUNCMUX_SDMMC4_ATB_GMA_GME_8_BIT: 19409f455dcSMasahiro Yamada pinmux_set_func(PMUX_PINGRP_GME, PMUX_FUNC_SDIO4); 19509f455dcSMasahiro Yamada pinmux_tristate_disable(PMUX_PINGRP_GME); 19609f455dcSMasahiro Yamada /* fall through */ 19709f455dcSMasahiro Yamada 19809f455dcSMasahiro Yamada case FUNCMUX_SDMMC4_ATB_GMA_4_BIT: 19909f455dcSMasahiro Yamada pinmux_set_func(PMUX_PINGRP_ATB, PMUX_FUNC_SDIO4); 20009f455dcSMasahiro Yamada pinmux_set_func(PMUX_PINGRP_GMA, PMUX_FUNC_SDIO4); 20109f455dcSMasahiro Yamada 20209f455dcSMasahiro Yamada pinmux_tristate_disable(PMUX_PINGRP_ATB); 20309f455dcSMasahiro Yamada pinmux_tristate_disable(PMUX_PINGRP_GMA); 20409f455dcSMasahiro Yamada bad_config = 0; 20509f455dcSMasahiro Yamada break; 20609f455dcSMasahiro Yamada } 20709f455dcSMasahiro Yamada break; 20809f455dcSMasahiro Yamada 20909f455dcSMasahiro Yamada case PERIPH_ID_KBC: 21009f455dcSMasahiro Yamada if (config == FUNCMUX_DEFAULT) { 21109f455dcSMasahiro Yamada enum pmux_pingrp grp[] = {PMUX_PINGRP_KBCA, 21209f455dcSMasahiro Yamada PMUX_PINGRP_KBCB, PMUX_PINGRP_KBCC, 21309f455dcSMasahiro Yamada PMUX_PINGRP_KBCD, PMUX_PINGRP_KBCE, 21409f455dcSMasahiro Yamada PMUX_PINGRP_KBCF}; 21509f455dcSMasahiro Yamada int i; 21609f455dcSMasahiro Yamada 21709f455dcSMasahiro Yamada for (i = 0; i < ARRAY_SIZE(grp); i++) { 21809f455dcSMasahiro Yamada pinmux_tristate_disable(grp[i]); 21909f455dcSMasahiro Yamada pinmux_set_func(grp[i], PMUX_FUNC_KBC); 22009f455dcSMasahiro Yamada pinmux_set_pullupdown(grp[i], PMUX_PULL_UP); 22109f455dcSMasahiro Yamada } 22209f455dcSMasahiro Yamada } 22309f455dcSMasahiro Yamada break; 22409f455dcSMasahiro Yamada 22509f455dcSMasahiro Yamada case PERIPH_ID_USB2: 22609f455dcSMasahiro Yamada if (config == FUNCMUX_USB2_ULPI) { 22709f455dcSMasahiro Yamada pinmux_set_func(PMUX_PINGRP_UAA, PMUX_FUNC_ULPI); 22809f455dcSMasahiro Yamada pinmux_set_func(PMUX_PINGRP_UAB, PMUX_FUNC_ULPI); 22909f455dcSMasahiro Yamada pinmux_set_func(PMUX_PINGRP_UDA, PMUX_FUNC_ULPI); 23009f455dcSMasahiro Yamada 23109f455dcSMasahiro Yamada pinmux_tristate_disable(PMUX_PINGRP_UAA); 23209f455dcSMasahiro Yamada pinmux_tristate_disable(PMUX_PINGRP_UAB); 23309f455dcSMasahiro Yamada pinmux_tristate_disable(PMUX_PINGRP_UDA); 23409f455dcSMasahiro Yamada } 23509f455dcSMasahiro Yamada break; 23609f455dcSMasahiro Yamada 23709f455dcSMasahiro Yamada case PERIPH_ID_SPI1: 23809f455dcSMasahiro Yamada if (config == FUNCMUX_SPI1_GMC_GMD) { 23909f455dcSMasahiro Yamada pinmux_set_func(PMUX_PINGRP_GMC, PMUX_FUNC_SFLASH); 24009f455dcSMasahiro Yamada pinmux_set_func(PMUX_PINGRP_GMD, PMUX_FUNC_SFLASH); 24109f455dcSMasahiro Yamada 24209f455dcSMasahiro Yamada pinmux_tristate_disable(PMUX_PINGRP_GMC); 24309f455dcSMasahiro Yamada pinmux_tristate_disable(PMUX_PINGRP_GMD); 24409f455dcSMasahiro Yamada } 24509f455dcSMasahiro Yamada break; 24609f455dcSMasahiro Yamada 24709f455dcSMasahiro Yamada case PERIPH_ID_NDFLASH: 24809f455dcSMasahiro Yamada switch (config) { 24909f455dcSMasahiro Yamada case FUNCMUX_NDFLASH_ATC: 25009f455dcSMasahiro Yamada pinmux_set_func(PMUX_PINGRP_ATC, PMUX_FUNC_NAND); 25109f455dcSMasahiro Yamada pinmux_tristate_disable(PMUX_PINGRP_ATC); 25209f455dcSMasahiro Yamada break; 25309f455dcSMasahiro Yamada case FUNCMUX_NDFLASH_KBC_8_BIT: 25409f455dcSMasahiro Yamada pinmux_set_func(PMUX_PINGRP_KBCA, PMUX_FUNC_NAND); 255*9b219d4dSLucas Stach pinmux_set_func(PMUX_PINGRP_KBCB, PMUX_FUNC_NAND); 25609f455dcSMasahiro Yamada pinmux_set_func(PMUX_PINGRP_KBCC, PMUX_FUNC_NAND); 25709f455dcSMasahiro Yamada pinmux_set_func(PMUX_PINGRP_KBCD, PMUX_FUNC_NAND); 25809f455dcSMasahiro Yamada pinmux_set_func(PMUX_PINGRP_KBCE, PMUX_FUNC_NAND); 25909f455dcSMasahiro Yamada pinmux_set_func(PMUX_PINGRP_KBCF, PMUX_FUNC_NAND); 26009f455dcSMasahiro Yamada 26109f455dcSMasahiro Yamada pinmux_tristate_disable(PMUX_PINGRP_KBCA); 262*9b219d4dSLucas Stach pinmux_tristate_disable(PMUX_PINGRP_KBCB); 26309f455dcSMasahiro Yamada pinmux_tristate_disable(PMUX_PINGRP_KBCC); 26409f455dcSMasahiro Yamada pinmux_tristate_disable(PMUX_PINGRP_KBCD); 26509f455dcSMasahiro Yamada pinmux_tristate_disable(PMUX_PINGRP_KBCE); 26609f455dcSMasahiro Yamada pinmux_tristate_disable(PMUX_PINGRP_KBCF); 26709f455dcSMasahiro Yamada 26809f455dcSMasahiro Yamada bad_config = 0; 26909f455dcSMasahiro Yamada break; 27009f455dcSMasahiro Yamada } 27109f455dcSMasahiro Yamada break; 27209f455dcSMasahiro Yamada case PERIPH_ID_DISP1: 27309f455dcSMasahiro Yamada if (config == FUNCMUX_DEFAULT) { 27409f455dcSMasahiro Yamada int i; 27509f455dcSMasahiro Yamada 27609f455dcSMasahiro Yamada for (i = PMUX_PINGRP_LD0; i <= PMUX_PINGRP_LD17; i++) { 27709f455dcSMasahiro Yamada pinmux_set_func(i, PMUX_FUNC_DISPA); 27809f455dcSMasahiro Yamada pinmux_tristate_disable(i); 27909f455dcSMasahiro Yamada pinmux_set_pullupdown(i, PMUX_PULL_NORMAL); 28009f455dcSMasahiro Yamada } 28109f455dcSMasahiro Yamada pinmux_config_pingrp_table(disp1_default, 28209f455dcSMasahiro Yamada ARRAY_SIZE(disp1_default)); 28309f455dcSMasahiro Yamada } 28409f455dcSMasahiro Yamada break; 28509f455dcSMasahiro Yamada 28609f455dcSMasahiro Yamada default: 28709f455dcSMasahiro Yamada debug("%s: invalid periph_id %d", __func__, id); 28809f455dcSMasahiro Yamada return -1; 28909f455dcSMasahiro Yamada } 29009f455dcSMasahiro Yamada 29109f455dcSMasahiro Yamada if (bad_config) { 29209f455dcSMasahiro Yamada debug("%s: invalid config %d for periph_id %d", __func__, 29309f455dcSMasahiro Yamada config, id); 29409f455dcSMasahiro Yamada return -1; 29509f455dcSMasahiro Yamada } 29609f455dcSMasahiro Yamada 29709f455dcSMasahiro Yamada return 0; 29809f455dcSMasahiro Yamada } 299