/* read gpio expander reg */ int gpio_expander_register_debug(unsigned int num, int reg) { int ret; struct i2c_client *client = NULL; if(num >= GPIO_I2C_EXPANDER_NUM || (reg >= 8)) { gpio_print_error("para is error, num = %d, reg = 0x%x.\n", num, reg); return -1; } client = gpio_expander_client[num]; if (num < 2) ret = i2c_smbus_read_byte_data(client, reg); else ret = i2c_smbus_read_word_data(client, reg << 1); if (ret < 0) { gpio_print_error("failed reading register.\n"); return ret; } gpio_print_info("reg(0x%x) is 0x%x.\n", reg, ret); return 0; }
/***************************************************************************** * 函 数 名 : bsp_gpio_init * * 功能描述 : GPIO初始化接口 * * 输入参数 : 无 * * 返 回 值 : 无 * * 修改记录 : 2012年11月27日 *****************************************************************************/ s32 bsp_gpio_init(void) { u32 i = 0; int ret = 0; char gpio_clk_name[40] = ""; char node_name[NAME_LENTH] = ""; char *base_addr = NULL; struct clk *gpio_clk = NULL; struct device_node *dev_node = NULL; if (GPIO_DEF_RUNNING == g_u32GpioRunning) { return GPIO_OK; } spin_lock_init(&g_gpio_spinlock); for(i = 0; i < GPIO_MAX_BANK_NUM; i++) { (void)snprintf_s(node_name,NAME_LENTH,NAME_LENTH,"hisilicon,gpio%d",i); dev_node = of_find_compatible_node(NULL,NULL,node_name); if(!dev_node) { gpio_print_error("get gpio%d node failed!\n",i); return ERROR; } /* 内存映射,获得基址 */ base_addr = (char *)of_iomap(dev_node, 0); if (NULL == base_addr) { gpio_print_error("gpio%d iomap fail\n",i); return ERROR; } s_u32GpioBaseAddr[i] = (u32)base_addr; (void)memset_s(gpio_clk_name, 40, 0 , 40); (void)snprintf_s(gpio_clk_name, 40, 40, "gpio%d_clk", i); /*lint !e119*/ gpio_clk = (struct clk *)clk_get(NULL, gpio_clk_name); if(IS_ERR(gpio_clk)) { gpio_print_error("gpio%d clk cannot get, 0x%x.\n", i, gpio_clk); return ERROR; } ret = clk_enable(gpio_clk); } gpio_print_info("gpio init ok.\n"); g_u32GpioRunning = GPIO_DEF_RUNNING; return ret; }
/*i2c gpio expander*/ static int __devinit gpio_i2c_expander_init(void) { unsigned int i = 0; struct i2c_adapter *adapter = NULL; //gpio_i2c_expander_reset();/* just for v7r2 test*/ adapter = i2c_get_adapter(GPIO_I2C_EXPANDER_ADP); if (!adapter) { gpio_print_error("i2c_get_adapter failed.\n"); return -1; } for(i = 0;i < GPIO_I2C_EXPANDER_NUM;i++) { gpio_expander_client[i] = i2c_new_device(adapter, &expander_board_info[i]); if (!gpio_expander_client[i]) { gpio_print_error("i2c_new_device failed, i = %d, addr = 0x%x.\n", i, expander_board_info[i].addr); return -1; } } #if 0 ret = i2c_register_board_info(GPIO_I2C_EXPANDER_ADP, expander_board_info, sizeof(expander_board_info)/sizeof(struct i2c_board_info)); if(ret < 0) { gpio_print_error("i2c_register_board_info is fail,ret = %d.\n", ret); return -1; } #endif gpio_print_info("gpio ex init ok.\n"); return 0; }