void mt_gpio_set_power(void) { #if 0 u32 val; val = GPIO_RD32(GPIO_BASE+0x510); if(((val & 0x100)>>8) == 1){ GPIO_WR32(IO_CFG_L_BASE+0x48, 0x8000); } if(((val & 0x200)>>9) == 1){ GPIO_WR32(IO_CFG_L_BASE+0x48, 0x10000); } #endif }
void mt_gpio_set_dsel(u8 bpi_1v8) { GPIO_REGS *pReg = (GPIO_REGS*)(GPIO_BASE); if (bpi_1v8 == GPIO_VIO18) { /*bpi_ctrl[9:4] = b`000000, [3:0] = b`0000*/ GPIO_WR32(&pReg->bpi_ctrl[0].rst, 0x3FF); } else if (bpi_1v8 == GPIO_VIO28){ /*bpi_ctrl[9:4] = b`001100, [3:0] = b`0101*/ GPIO_WR32(&pReg->bpi_ctrl[0].set, 0xC5); GPIO_WR32(&pReg->bpi_ctrl[0].rst, 0x33A); } GPIOVER("BPI 0x%x\n",GPIO_RD32(&pReg->bpi_ctrl[0].val)); }
/*---------------------------------------------------------------------------*/ int mt_set_gpio_dir_base(unsigned long pin, unsigned long dir) { unsigned long bit; if (pin >= MAX_GPIO_PIN) return -ERINVAL; if (dir >= GPIO_DIR_MAX) return -ERINVAL; /* GPIOERR("before pin:%ld, dir:%ld\n",pin,dir); */ /* pos = pin / MAX_GPIO_REG_BITS; */ bit = DIR_offset[pin].offset; #ifdef GPIO_BRINGUP reg = GPIO_RD32(DIR_addr[pin].addr); if (dir == GPIO_DIR_IN) reg &= (~(1 << bit)); else reg |= (1 << bit); GPIO_WR32(DIR_addr[pin].addr, reg); #else if (dir == GPIO_DIR_IN) GPIO_SET_BITS((1L << bit), DIR_addr[pin].addr + 8); else GPIO_SET_BITS((1L << bit), DIR_addr[pin].addr + 4); #endif /* GPIOERR("%s:pin:%ld, dir:%ld, value:0x%x\n",__FUNCTION__, pin, dir, GPIO_RD32(DIR_addr[pin].addr)); */ return RSUCCESS; }
void mt_gpio_set_avoid_leakage(void) { #if 0 #ifdef MTK_EMMC_SUPPORT GPIO_WR32(IO_CFG_B_BASE+0x58, 0x220000); #endif #endif }
void mt_gpio_set_default_chip(void) { GPIO_REGS *pReg = (GPIO_REGS*)(GPIO_BASE); unsigned int idx; u32 val; for (idx = 0; idx < sizeof(pReg->dir)/sizeof(pReg->dir[0]); idx++){ val = gpio_init_dir_data[idx]; GPIO_WR32(&pReg->dir[idx],val); } for (idx = 0; idx < sizeof(pReg->pullen)/sizeof(pReg->pullen[0]); idx++){ val = gpio_init_pullen_data[idx]; GPIO_WR32(&pReg->pullen[idx],val); } for (idx = 0; idx < sizeof(pReg->pullsel)/sizeof(pReg->pullsel[0]); idx++){ val = gpio_init_pullsel_data[idx]; GPIO_WR32(&pReg->pullsel[idx],val); } /*for keypad special register*/ mt_set_gpio_pull_select(GPIO74, GPIO74_PULL); mt_set_gpio_pull_select(GPIO75, GPIO75_PULL); mt_set_gpio_pull_select(GPIO92, GPIO92_PULL); mt_set_gpio_pull_select(GPIO93, GPIO93_PULL); mt_set_gpio_pull_select(GPIO167, GPIO167_PULL); mt_set_gpio_pull_select(GPIO168, GPIO168_PULL); for (idx = 0; idx < sizeof(pReg->dout)/sizeof(pReg->dout[0]); idx++) { val = gpio_init_dout_data[idx]; GPIO_WR32(&pReg->dout[idx],val); } for (idx = 0; idx < sizeof(pReg->mode)/sizeof(pReg->mode[0]); idx++) { val = gpio_init_mode_data[idx]; GPIO_WR32(&pReg->mode[idx],val); } for (idx = 0; idx < sizeof(pReg->smt)/sizeof(pReg->smt[0]); idx++) { val = gpio_init_smt_data[idx]; GPIO_WR32(&pReg->smt[idx],val); } /*for msdc special smt */ mt_set_gpio_smt(GPIO_SMT_GRP25, GPIO_SMT_GROUP_25); mt_set_gpio_smt(GPIO_SMT_GRP26, GPIO_SMT_GROUP_26); mt_set_gpio_smt(GPIO_SMT_GRP27, GPIO_SMT_GROUP_27); mt_set_gpio_smt(GPIO_SMT_GRP28, GPIO_SMT_GROUP_28); mt_set_gpio_smt(GPIO_SMT_GRP29, GPIO_SMT_GROUP_29); mt_set_gpio_smt(GPIO_SMT_GRP30, GPIO_SMT_GROUP_30); mt_set_gpio_smt(GPIO_SMT_GRP31, GPIO_SMT_GROUP_31); mt_set_gpio_smt(GPIO_SMT_GRP32, GPIO_SMT_GROUP_32); mt_set_gpio_smt(GPIO_SMT_GRP33, GPIO_SMT_GROUP_33); //set BSI driving 2ma->4ma: 0x10005B30[7:4]=0x2 GPIO_WR32(&pReg->drv_mode[3].set, 0x20); GPIOVER("mt_gpio_set_default() done\n"); }
void mt_gpio_set_driving(void) { #if 0 u32 val; u32 mask; /* [MT6571] for MD BSI request */ mask = 0x3000; val = GPIO_RD32(IO_CFG_T_BASE+0xF0); val &= ~(mask); val |= (0x0000 & mask); GPIO_WR32(IO_CFG_T_BASE+0xF0, val); /* [MT6571] end */ /* [MT6571] for desense request (AUD IO) */ mask = 0x30; val = GPIO_RD32(IO_CFG_L_BASE+0xA0); val &= ~(mask); val |= (0x00 & mask); GPIO_WR32(IO_CFG_L_BASE+0xA0, val); /* [MT6571] end */ #endif }
void mt_gpio_set_default_chip(void) { u32 idx; u32 val; u32 mask; for (idx = 0; idx < sizeof(gpio_init_value)/((sizeof(UINT32))*(MASK_BIT+1)); idx++){ mask = gpio_init_value[idx][MASK_BIT]; val = GPIO_RD32(gpio_init_value[idx][ADDR_BIT]); val &= ~(mask); val |= ((gpio_init_value[idx][VAL_BIT])&mask); GPIO_WR32(gpio_init_value[idx][ADDR_BIT],val); } //GPIOVER("mt_gpio_set_default() done\n"); }
/*---------------------------------------------------------------------------*/ int mt_set_gpio_mode_base(unsigned long pin, unsigned long mode) { unsigned long pos; unsigned long bit; unsigned long data; unsigned long mask = (1L << GPIO_MODE_BITS) - 1; GPIO_REGS *reg = gpio_reg; pos = pin / MAX_GPIO_MODE_PER_REG; bit = pin % MAX_GPIO_MODE_PER_REG; data = GPIO_RD32(®->mode[pos].val); data &= ~(mask << (GPIO_MODE_BITS*bit)); data |= (mode << (GPIO_MODE_BITS*bit)); GPIO_WR32(®->mode[pos].val, data); return RSUCCESS; }
/*---------------------------------------------------------------------------*/ int mt_set_gpio_smt_base(unsigned long pin, unsigned long enable) { /* unsigned long flags; */ if (pin >= MAX_GPIO_PIN) return -ERINVAL; #ifdef GPIO_BRINGUP if (SMT_offset[pin].offset == -1) { return GPIO_SMT_UNSUPPORTED; } else { bit = SMT_offset[pin].offset; reg = GPIO_RD32(SMT_addr[pin].addr); if (enable == GPIO_SMT_DISABLE) reg &= (~(1 << bit)); else reg |= (1 << bit); } /* printk("SMT addr(%x),value(%x)\n",SMT_addr[pin].addr,GPIO_RD32(SMT_addr[pin].addr)); */ GPIO_WR32(SMT_addr[pin].addr, reg); #else if (SMT_offset[pin].offset == -1) { gpio_smt_unsupport[pin] = -1; return GPIO_SMT_UNSUPPORTED; } if (enable == GPIO_SMT_DISABLE) GPIO_SET_BITS((1L << (SMT_offset[pin].offset)), SMT_addr[pin].addr + 8); else GPIO_SET_BITS((1L << (SMT_offset[pin].offset)), SMT_addr[pin].addr + 4); #endif /* GPIOERR("%s:pin:%ld, enable:%ld, value:0x%x\n",__FUNCTION__, pin, enable, GPIO_RD32(SMT_addr[pin].addr)); */ return RSUCCESS; }
/*---------------------------------------------------------------------------*/ int mt_set_gpio_pull_enable_base(unsigned long pin, unsigned long enable) { if (pin >= MAX_GPIO_PIN) return -ERINVAL; #ifdef GPIO_BRINGUP bit = PULLEN_offset[pin].offset; if (PULLEN_offset[pin].offset == -1) return GPIO_PULL_EN_UNSUPPORTED; reg = GPIO_RD32(PULLEN_addr[pin].addr); if (enable == GPIO_PULL_DISABLE) reg &= (~(1 << bit)); else reg |= (1 << bit); GPIO_WR32(PULLEN_addr[pin].addr, reg); #else if (PULLEN_offset[pin].offset == -1) { gpio_pullen_unsupport[pin] = -1; return GPIO_PULL_EN_UNSUPPORTED; } if (enable == GPIO_PULL_DISABLE) GPIO_SET_BITS((1L << (PULLEN_offset[pin].offset)), PULLEN_addr[pin].addr + 8); else GPIO_SET_BITS((1L << (PULLEN_offset[pin].offset)), PULLEN_addr[pin].addr + 4); #endif return RSUCCESS; }
void mt_gpio_set_dsel(u8 nml2_1v8,u8 bsi_1v8,u8 bpi_1v8) { #if 0 u32 mask; u32 val; u32 bit; #define TDSEL_1V8 0x0 #define TDSEL_3V3 0x5 #define RDSEL_1V8 0x0 #define RDSEL_3V3 0xC #define GPIO_NML2_OFFSET 0x730 #define GPIO_NML2_PWMR_OFFSET 0x740 #define GPIO_BSI_OFFSET 0x750 #define GPIO_BPI_OFFSET 0x740 //set NML2 UART val = GPIO_RD32(GPIO_BASE + GPIO_NML2_OFFSET); mask = (1L << 4) - 1; bit = 8; val &= ~(mask << (bit)); val |= (nml2_1v8?TDSEL_1V8:TDSEL_3V3)<<bit; GPIO_WR32(GPIO_BASE + GPIO_NML2_OFFSET, val); val = GPIO_RD32(GPIO_BASE + GPIO_NML2_OFFSET); mask = (1L << 6) - 1; bit = 16; val &= ~(mask << (bit)); val |= (nml2_1v8?RDSEL_1V8:RDSEL_3V3)<<bit; GPIO_WR32(GPIO_BASE + GPIO_NML2_OFFSET, val); //set NML2 PWM val = GPIO_RD32(GPIO_BASE + GPIO_NML2_OFFSET); mask = (1L << 4) - 1; bit = 24; val &= ~(mask << (bit)); val |= (nml2_1v8?TDSEL_1V8:TDSEL_3V3)<<bit; GPIO_WR32(GPIO_BASE + GPIO_NML2_OFFSET, val); val = GPIO_RD32(GPIO_BASE + GPIO_NML2_PWMR_OFFSET); mask = (1L << 6) - 1; bit = 0; val &= ~(mask << (bit)); val |= (nml2_1v8?RDSEL_1V8:RDSEL_3V3)<<bit; GPIO_WR32(GPIO_BASE + GPIO_NML2_PWMR_OFFSET, val); //set BPI val = GPIO_RD32(GPIO_BASE + GPIO_BPI_OFFSET); mask = (1L << 4) - 1; bit = 8; val &= ~(mask << (bit)); val |= (bpi_1v8?TDSEL_1V8:TDSEL_3V3)<<bit; GPIO_WR32(GPIO_BASE + GPIO_BPI_OFFSET, val); val = GPIO_RD32(GPIO_BASE + GPIO_BPI_OFFSET ); mask = (1L << 6) - 1; bit = 16; val &= ~(mask << (bit)); val |= (bpi_1v8?RDSEL_1V8:RDSEL_3V3)<<bit; GPIO_WR32(GPIO_BASE + GPIO_BPI_OFFSET, val); //set BSI val = GPIO_RD32(GPIO_BASE + GPIO_BSI_OFFSET); mask = (1L << 4) - 1; bit = 0; val &= ~(mask << (bit)); val |= (bsi_1v8?TDSEL_1V8:TDSEL_3V3)<<bit; GPIO_WR32(GPIO_BASE + GPIO_BSI_OFFSET, val); val = GPIO_RD32(GPIO_BASE + GPIO_BSI_OFFSET ); mask = (1L << 6) - 1; bit = 8; val &= ~(mask << (bit)); val |= (bsi_1v8?RDSEL_1V8:RDSEL_3V3)<<bit; GPIO_WR32(GPIO_BASE + GPIO_BSI_OFFSET, val); GPIOVER("NML2 0x%x,BPI 0x%x, BSI 0x%x\n",GPIO_RD32(GPIO_BASE + GPIO_NML2_OFFSET),GPIO_RD32(GPIO_BASE + GPIO_BPI_OFFSET),GPIO_RD32(GPIO_BASE + GPIO_BSI_OFFSET)); #endif }
/*---------------------------------------------------------------------------*/ int mt_set_gpio_pull_select_base(unsigned long pin, unsigned long select) { /* unsigned long flags; */ unsigned long bit = 0; /*u32 mask = (1L << 4) - 1;*/ if (pin >= MAX_GPIO_PIN) return -ERINVAL; if (pin == 5) { pr_err("XXX MSDC SD CD PIN be touched!\n"); dump_stack(); } #ifdef GPIO_BRINGUP if (PULL_offset[pin].offset == -1 && pupd_offset[pin].offset == -1) return GPIO_PULL_UNSUPPORTED; if (pin >= 160 && pin <= 165) { bit = pupd_offset[pin].offset; reg = GPIO_RD32(pupd_addr[pin].addr); if (select == GPIO_PULL_UP) { /* 0x2 pull up */ reg &= (~(mask << bit)); reg |= (0x2 << bit); } else { /* 0x6 pull down */ reg &= (~(mask << bit)); reg |= (0x6 << bit); } /* printk("fwq pullset pin=%d,3.............\n",pin); */ GPIO_WR32(pupd_addr[pin].addr, reg); return RSUCCESS; } /* printk("fwq pullset pin=%d,select(%d)\n",pin,select); */ if (PULL_offset[pin].offset != -1) { bit = PULL_offset[pin].offset; reg = GPIO_RD32(PULL_addr[pin].addr); if (select == GPIO_PULL_DOWN) reg &= (~(1 << bit)); else reg |= (1 << bit); /* printk("fwq pullset pin=%d,2.............\n",pin); */ GPIO_WR32(PULL_addr[pin].addr, reg); } else { bit = pupd_offset[pin].offset + 2; reg = GPIO_RD32(pupd_addr[pin].addr); if (select == GPIO_PULL_UP) reg &= (~(1 << bit)); else reg |= (1 << bit); /* printk("fwq pullset pin=%d,3.............\n",pin); */ GPIO_WR32(pupd_addr[pin].addr, reg); } #else if ((PULL_offset[pin].offset == -1) && (pupd_offset[pin].offset == -1)) { gpio_pull_select_unsupport[pin] = -1; return GPIO_PULL_UNSUPPORTED; } /* printk("fwq pullset pin=%ld,1.............\n",pin); */ if (pin >= 160 && pin <= 165) { if (select == GPIO_PULL_UP) { /* 0x2 pull up */ /* reg &= (~(mask << bit)); */ /* reg |= (0x2 << bit); */ GPIO_SET_BITS((2L << (pupd_offset[pin].offset)), pupd_addr[pin].addr + 4); } else { /* 0x6 pull down */ /* reg &= (~(mask << bit)); */ /* reg |= (0x6 << bit); */ GPIO_SET_BITS((6L << (pupd_offset[pin].offset)), pupd_addr[pin].addr + 4); } return RSUCCESS; } /* printk("fwq pullset pin=%ld,2.............\n",pin); */ /* printk("fwq pullset pin=%d,select(%d)\n",pin,select); */ if (PULL_offset[pin].offset != -1) { bit = PULL_offset[pin].offset; /* reg = GPIO_RD32(PULL_addr[pin].addr); */ if (select == GPIO_PULL_DOWN) GPIO_SET_BITS((1L << bit), PULL_addr[pin].addr + 8); else GPIO_SET_BITS((1L << bit), PULL_addr[pin].addr + 4); /* printk("fwq pullset pin=%d,2.............\n",pin); */ } else { bit = pupd_offset[pin].offset + 2; /* reg = GPIO_RD32(pupd_addr[pin].addr); */ if (select == GPIO_PULL_UP) GPIO_SET_BITS((1L << (bit)), pupd_addr[pin].addr + 8); else GPIO_SET_BITS((1L << (bit)), pupd_addr[pin].addr + 4); } #endif /* GPIOERR("%s:pin:%ld, select:%ld, value:0x%x\n",__FUNCTION__, pin, select, GPIO_RD32(PULL_addr[pin].addr)); */ return RSUCCESS; }