/* 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;
}