/* 
 * Copyright (C) 2014 Rockchip Corporation.
 *
 * This software is licensed under the terms of the GNU General Public
 * License version 2, as published by the Free Software Foundation, and
 * may be copied, distributed, and modified under those terms.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 */
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/init.h>
#include <linux/delay.h>
#include <linux/pm.h>
#include <linux/i2c.h>
#include <linux/spi/spi.h>
#include <linux/platform_device.h>
#include <linux/errno.h>
#include <linux/err.h>
#include <linux/debugfs.h>
#include <linux/of_gpio.h>
#include <linux/gpio.h>
#include <linux/iio/consumer.h>
#include <linux/of.h>
#include "nkio.h"

/* Debug */
#if 1
#define DBG(x...) printk(x)
#else
#define DBG(x...) do { } while (0)
#endif

struct nk_io_pdata *NKpdata_info;
u32 op0_enable,op1_enable,op2_enable,op3_enable,op4_enable,op5_enable,mic_enable;
u32 ip0_enable,ip1_enable,ip2_enable,ip3_enable,ip4_enable,ip5_enable;
u32 module_enable;
//static struct class *nk_class;


#if 0

 void mic_switch_control(int i)
{
if(i==11){
	gpio_direction_output(NKpdata_info->mic_switch_gpio, 1);
	printk("mic_switch_control ENABLE------andy\n");
}else{
	gpio_direction_output(NKpdata_info->mic_switch_gpio, 0);
	printk("mic_switch_control DISABLE------andy\n");
}
}




static ssize_t mic_switch_store(struct class *class,struct class_attribute *attr, const char *buf, size_t count)
{	
		sscanf(buf, "%d", &mic_enable);
		printk("MIC_SWITCH enable =%d\n",mic_enable);

	if (mic_enable)
		{
			printk("store_MIC_SWITCH ENABLE------andy\n");
			mic_switch_control(11);
		}
		else {
			mic_switch_control(0);
			printk("store_MIC_SWITCH DISABLE------andy\n");
		}
		return count;
}

static ssize_t mic_switch_show(struct class *class,struct class_attribute *attr, char *buf)
{
return snprintf(buf, 3, "%d\n",mic_enable);
}

static CLASS_ATTR(mic_switch, 0664, mic_switch_show, mic_switch_store);


 
  void Audio_SET(int i)
 {
	 if(i==11){
		 gpio_direction_output(NKpdata_info->audio_switch_gpio, 1);
		 printk("Audio_SET ENABLE------andy\n");
	 }else{
		 gpio_direction_output(NKWpdata_info->audio_switch_gpio, 0);
		 printk("Audio_SET DISABLE------andy\n");
	 }
 }
  EXPORT_SYMBOL_GPL(Audio_SET);



static void LED_SET(int i)
{
	if(i==11){
		gpio_direction_output(NKpdata_info->led_gpio, 1);
	}else{
		gpio_direction_output(NKpdata_info->led_gpio, 0);
	}
}



static ssize_t led_display_store(struct class *class,struct class_attribute *attr, const char *buf, size_t count)
{	
		sscanf(buf, "%d", &enable);
		printk("store_led enable =%d\n",enable);

	if (enable)
		{
			printk("store_led ENABLE------andy\n");
			LED_SET(11);
		}
		else {
			LED_SET(0);
			printk("store_led DISABLE------andy\n");
		}
		return count;
}

static ssize_t led_display_show(struct class *class,struct class_attribute *attr, char *buf)
{
return snprintf(buf, 3, "%d\n",enable);
}

static CLASS_ATTR(led_display, 0664, led_display_show, led_display_store);

#endif

void MODULE_SET(int i)
{
	if(i==11){
		gpio_direction_output(NKpdata_info->en_4g_gpio, 1);
	}else{
		gpio_direction_output(NKpdata_info->en_4g_gpio, 0);
	}
}

EXPORT_SYMBOL_GPL(MODULE_SET);


void LED_SET(int i)
{
	if(i==11){
		gpio_direction_output(NKpdata_info->led_gpio, 1);
	}else{
		gpio_direction_output(NKpdata_info->led_gpio, 0);
	}
}

EXPORT_SYMBOL_GPL(LED_SET);


void Audio_SET(int i);

  void Audio_SET(int i)
 {
	 if(i==11){
		 gpio_direction_output(NKpdata_info->audio_switch_gpio, 1);
		 printk("Audio_SET ENABLE------andy\n");
	 }else{
		 gpio_direction_output(NKpdata_info->audio_switch_gpio, 0);
		 printk("Audio_SET DISABLE------andy\n");
	 }
 }
  EXPORT_SYMBOL_GPL(Audio_SET);


//6 in 6 out-s
static void GPIO_IO_SET(int i)
{
	if(i==11){
		gpio_direction_output(NKpdata_info->gpio_op0, 1);
	}
	else if(i==10){
		gpio_direction_output(NKpdata_info->gpio_op0, 0);
	}
	else if(i==21){
		gpio_direction_output(NKpdata_info->gpio_op1, 1);
	}
	else if(i==20){
		gpio_direction_output(NKpdata_info->gpio_op1, 0);
	}
	else if(i==31){
		gpio_direction_output(NKpdata_info->gpio_op2, 1);
	}
	else if(i==30){
		gpio_direction_output(NKpdata_info->gpio_op2, 0);
	}
	else if(i==41){
		gpio_direction_output(NKpdata_info->gpio_op3, 1);
	}
	else if(i==40){
		gpio_direction_output(NKpdata_info->gpio_op3, 0);
	}
	else if(i==51){
		gpio_direction_output(NKpdata_info->gpio_op4, 1);
	}
	else if(i==50){
		gpio_direction_output(NKpdata_info->gpio_op4, 0);
	}
	else if(i==61){
		gpio_direction_output(NKpdata_info->gpio_op5, 1);
	}
	else if(i==60){
		gpio_direction_output(NKpdata_info->gpio_op5, 0);
	}
	/*
		else if(i==51){
		gpio_direction_output(NKpdata_info->gpio_ip0, 1);
	}
		else if(i==50){
		gpio_direction_output(NKpdata_info->gpio_ip0, 0);
	}
		else if(i==61){
		gpio_direction_output(NKpdata_info->gpio_ip1, 1);
	}
		else if(i==60){
		gpio_direction_output(NKpdata_info->gpio_ip1, 0);
	}
		else if(i==71){
		gpio_direction_output(NKpdata_info->gpio_ip2, 1);
	}
		else if(i==70){
		gpio_direction_output(NKpdata_info->gpio_ip2, 0);
	}
		else if(i==81){
		gpio_direction_output(NKpdata_info->gpio_ip3, 1);
	}
		else if(i==80){
		gpio_direction_output(NKpdata_info->gpio_ip3, 0);
	}
	*/	
		
}

EXPORT_SYMBOL_GPL(GPIO_IO_SET);

#if 0
static ssize_t en_4g_gpio_store(struct class *class,struct class_attribute *attr, const char *buf, size_t count)
{	
		sscanf(buf, "%d", &module_enable);
		printk("store en_4g_gpio ouput =%d\n",module_enable);

	if (module_enable)
		{
			printk("store en_4g_gpio output High \n");
			MODULE_SET(11);
		}
		else {
			MODULE_SET(10);
			printk("store en_4g_gpio output Low \n");
			
		}
		return count;
}

static ssize_t en_4g_gpio_show(struct class *class,struct class_attribute *attr, char *buf)
{
	module_enable = gpio_get_value(NKpdata_info->en_4g_gpio);
    return snprintf(buf,3,"%d\n",module_enable);
}



static ssize_t gpio_op0_store(struct class *class,struct class_attribute *attr, const char *buf, size_t count)
{	
		sscanf(buf, "%d", &op0_enable);
		printk("store_gpio_op0 ouput =%d\n",op0_enable);

	if (op0_enable)
		{
			printk("store_gpio_op0 output High------konby\n");
			GPIO_IO_SET(11);
		}
		else {
			GPIO_IO_SET(10);
			printk("tore_gpio_op0 output Low------konby\n");
			
		}
		return count;
}

static ssize_t gpio_op0_show(struct class *class,struct class_attribute *attr, char *buf)
{
	op0_enable = gpio_get_value(NKpdata_info->gpio_op0);
    return snprintf(buf,3,"%d\n",op0_enable);
}

static ssize_t gpio_op1_store(struct class *class,struct class_attribute *attr, const char *buf, size_t count)
{	
		sscanf(buf, "%d", &op1_enable);
		printk("store_gpio_op1 ouput =%d\n",op1_enable);

	if (op1_enable)
		{
			printk("store_gpio_op1 output High------konby\n");
			GPIO_IO_SET(21);
		}
		else {
			GPIO_IO_SET(20);
			printk("tore_gpio_op1 output Low------konby\n");
			
		}
		return count;
}

static ssize_t gpio_op1_show(struct class *class,struct class_attribute *attr, char *buf)
{
	op1_enable = gpio_get_value(NKpdata_info->gpio_op1);
    return snprintf(buf,3,"%d\n",op1_enable);
}

static ssize_t gpio_op2_store(struct class *class,struct class_attribute *attr, const char *buf, size_t count)
{	
		sscanf(buf, "%d", &op2_enable);
		printk("store_gpio_op2 ouput =%d\n",op2_enable);

	if (op2_enable)
		{
			printk("store_gpio_op2 output High------konby\n");
			GPIO_IO_SET(31);
		}
		else {
			GPIO_IO_SET(30);
			printk("tore_gpio_op2 output Low------konby\n");
			
		}
		return count;
}

static ssize_t gpio_op2_show(struct class *class,struct class_attribute *attr, char *buf)
{
	op2_enable = gpio_get_value(NKpdata_info->gpio_op2);
    return snprintf(buf,3,"%d\n",op2_enable);
}

static ssize_t gpio_op3_store(struct class *class,struct class_attribute *attr, const char *buf, size_t count)
{	
		sscanf(buf, "%d", &op3_enable);
		printk("store_gpio_op3 ouput =%d\n",op3_enable);

	if (op3_enable)
		{
			printk("store_gpio_op3 output High------konby\n");
			GPIO_IO_SET(41);
		}
		else {
			GPIO_IO_SET(40);
			printk("tore_gpio_op3 output Low------konby\n");
			
		}
		return count;
}

static ssize_t gpio_op3_show(struct class *class,struct class_attribute *attr, char *buf)
{
	op3_enable = gpio_get_value(NKpdata_info->gpio_op3);
    return snprintf(buf,3,"%d\n",op3_enable);
}

static ssize_t gpio_op4_store(struct class *class,struct class_attribute *attr, const char *buf, size_t count)
{	
		sscanf(buf, "%d", &op4_enable);
		printk("store_gpio_op3 ouput =%d\n",op4_enable);

	if (op4_enable)
		{
			printk("store_gpio_op4 output High------konby\n");
			GPIO_IO_SET(51);
		}
		else {
			GPIO_IO_SET(50);
			printk("tore_gpio_op4 output Low------konby\n");
			
		}
		return count;
}

static ssize_t gpio_op4_show(struct class *class,struct class_attribute *attr, char *buf)
{
	op4_enable = gpio_get_value(NKpdata_info->gpio_op4);
    return snprintf(buf,3,"%d\n",op4_enable);
}

static ssize_t gpio_op5_store(struct class *class,struct class_attribute *attr, const char *buf, size_t count)
{	
		sscanf(buf, "%d", &op5_enable);
		printk("store_gpio_op5 ouput =%d\n",op5_enable);

	if (op5_enable)
		{
			printk("store_gpio_op5 output High------konby\n");
			GPIO_IO_SET(61);
		}
		else {
			GPIO_IO_SET(60);
			printk("tore_gpio_op5 output Low------konby\n");
			
		}
		return count;
}

static ssize_t gpio_op5_show(struct class *class,struct class_attribute *attr, char *buf)
{
	op5_enable = gpio_get_value(NKpdata_info->gpio_op5);
    return snprintf(buf,3,"%d\n",op5_enable);
}




static ssize_t gpio_ip0_show(struct class *class,struct class_attribute *attr, char *buf)
{
	ip0_enable = gpio_get_value(NKpdata_info->gpio_ip0);
    return snprintf(buf,3,"%d\n",ip0_enable);

}

static ssize_t gpio_ip1_show(struct class *class,struct class_attribute *attr, char *buf)
{
	ip1_enable = gpio_get_value(NKpdata_info->gpio_ip1);
    return snprintf(buf,3,"%d\n",ip1_enable);
}

static ssize_t gpio_ip2_show(struct class *class,struct class_attribute *attr, char *buf)
{
	ip2_enable = gpio_get_value(NKpdata_info->gpio_ip2);
    return snprintf(buf,3,"%d\n",ip2_enable);
}

static ssize_t gpio_ip3_show(struct class *class,struct class_attribute *attr, char *buf)
{
	ip3_enable = gpio_get_value(NKpdata_info->gpio_ip3);
    return snprintf(buf,3,"%d\n",ip3_enable);
}

static ssize_t gpio_ip4_show(struct class *class,struct class_attribute *attr, char *buf)
{
	ip4_enable = gpio_get_value(NKpdata_info->gpio_ip4);
    return snprintf(buf,3,"%d\n",ip4_enable);
}

static ssize_t gpio_ip5_show(struct class *class,struct class_attribute *attr, char *buf)
{
	ip5_enable = gpio_get_value(NKpdata_info->gpio_ip5);
    return snprintf(buf,3,"%d\n",ip5_enable);
}
#endif


#if 0
static ssize_t gpio_ip0_store(struct class *class,struct class_attribute *attr, const char *buf, size_t count)
{	
		sscanf(buf, "%d", &ip0_enable);
		printk("store_gpio_op3 ouput =%d\n",ip0_enable);

	if (ip0_enable)
		{
			printk("store_gpio_op3 output High------konby\n");
			GPIO_IO_SET(51);
		}
		else {
			GPIO_IO_SET(50);
			printk("tore_gpio_op3 output Low------konby\n");
			
		}
		return count;
}

static ssize_t gpio_ip1_store(struct class *class,struct class_attribute *attr, const char *buf, size_t count)
{	
		sscanf(buf, "%d", &ip1_enable);
		printk("store_gpio_op3 ouput =%d\n",ip1_enable);

	if (ip1_enable)
		{
			printk("store_gpio_op3 output High------konby\n");
			GPIO_IO_SET(61);
		}
		else {
			GPIO_IO_SET(60);
			printk("tore_gpio_op3 output Low------konby\n");
			
		}
		return count;
}

static ssize_t gpio_ip2_store(struct class *class,struct class_attribute *attr, const char *buf, size_t count)
{	
		sscanf(buf, "%d", &ip2_enable);
		printk("store_gpio_op3 ouput =%d\n",ip2_enable);

	if (ip2_enable)
		{
			printk("store_gpio_op3 output High------konby\n");
			GPIO_IO_SET(71);
		}
		else {
			GPIO_IO_SET(70);
			printk("tore_gpio_op3 output Low------konby\n");
			
		}
		return count;
}

static ssize_t gpio_ip3_store(struct class *class,struct class_attribute *attr, const char *buf, size_t count)
{	
		sscanf(buf, "%d", &ip3_enable);
		printk("store_gpio_op3 ouput =%d\n",ip3_enable);

	if (ip3_enable)
		{
			printk("store_gpio_op3 output High------konby\n");
			GPIO_IO_SET(81);
		}
		else {
			GPIO_IO_SET(80);
			printk("tore_gpio_op3 output Low------konby\n");
			
		}
		return count;
}

#endif



#if 0

//static CLASS_ATTR(en_4g_gpio, 0666, module_show, module_store);
static CLASS_ATTR_RW(en_4g_gpio);


//static CLASS_ATTR(gpio_op0, 0666, gpio_op0_show, gpio_op0_store);
static CLASS_ATTR_RW(gpio_op0);
//static CLASS_ATTR(gpio_op1, 0666, gpio_op1_show, gpio_op1_store);
static CLASS_ATTR_RW(gpio_op1);
//static CLASS_ATTR(gpio_op2, 0666, gpio_op2_show, gpio_op2_store);
static CLASS_ATTR_RW(gpio_op2);
//static CLASS_ATTR(gpio_op3, 0666, gpio_op3_show, gpio_op3_store);
static CLASS_ATTR_RW(gpio_op3);
//static CLASS_ATTR(gpio_op4, 0666, gpio_op4_show, gpio_op4_store);
static CLASS_ATTR_RW(gpio_op4);
//static CLASS_ATTR(gpio_op5, 0666, gpio_op5_show, gpio_op5_store);
static CLASS_ATTR_RW(gpio_op5);



//static CLASS_ATTR(gpio_ip0, 0666, gpio_ip0_show, NULL);
static CLASS_ATTR_RO(gpio_ip0);
//static CLASS_ATTR(gpio_ip1, 0666, gpio_ip1_show, NULL);
static CLASS_ATTR_RO(gpio_ip1);
//static CLASS_ATTR(gpio_ip2, 0666, gpio_ip2_show, NULL);
static CLASS_ATTR_RO(gpio_ip2);
//static CLASS_ATTR(gpio_ip3, 0666, gpio_ip3_show, NULL);
static CLASS_ATTR_RO(gpio_ip3);
//static CLASS_ATTR(gpio_ip4, 0666, gpio_ip4_show, NULL);
static CLASS_ATTR_RO(gpio_ip4);
//static CLASS_ATTR(gpio_ip5, 0666, gpio_ip5_show, NULL);
static CLASS_ATTR_RO(gpio_ip5);


#endif




//ben
static int nk_io_control_probe(struct platform_device *pdev)
{
	struct device_node *node = pdev->dev.of_node;
	struct nk_io_pdata *pdata;	
	int gpio0, gpio1, gpio2, gpio3, reset_pin, ch342_reset;
	int ret;
        int lvds_index;
        int i=0;
        static int lvds_gpio[4] ;

	enum of_gpio_flags flags;
	
	printk(" #######nk_io_control_probe####### \n");

	pdata = kzalloc(sizeof(struct nk_io_pdata), GFP_KERNEL);
	if (pdata == NULL) {
		printk("%s failed to allocate driver data\n",__FUNCTION__);
		return -ENOMEM;
	}
	memset(pdata,0,sizeof(struct nk_io_pdata));
	
	//vcc_5v_io
#if 0
	ret = of_get_named_gpio_flags(node, "vcc_5v_io", 0, &flags);
	if (ret < 0) {
		printk("%s() Can not read property vcc_5v_io\n", __FUNCTION__);
		goto err;
	} else {
		pdata->vcc_5v_io = ret;
		ret = devm_gpio_request(&pdev->dev, pdata->vcc_5v_io, "vcc_5v_io");
		if(ret < 0){
			printk("%s() devm_gpio_request vcc_5v_io request ERROR\n", __FUNCTION__);
			goto err;
		}

		ret = gpio_direction_output(pdata->vcc_5v_io,1); 
		if(ret < 0){
			printk("%s() gpio_direction_input vcc_5v_io set ERROR\n", __FUNCTION__);
			goto err;
		}
	}
#endif
	//tp_enable
	ret = of_get_named_gpio_flags(node, "tp_enable", 0, &flags);
	if (ret < 0) {
		printk("%s() Can not read property tp_enable\n", __FUNCTION__);
		goto err;
	} else {
		pdata->tp_enable = ret;
		ret = devm_gpio_request(&pdev->dev, pdata->tp_enable, "tp_enable");
		if(ret < 0){
			printk("%s() devm_gpio_request tp_enable request ERROR\n", __FUNCTION__);
			goto err;
		}

		ret = gpio_direction_output(pdata->tp_enable,1); 
		if(ret < 0){
			printk("%s() gpio_direction_output tp_enable set ERROR\n", __FUNCTION__);
			goto err;
		}
	}

	//vcc_12v_io
	ret = of_get_named_gpio_flags(node, "vcc_12v_io", 0, &flags);
	if (ret < 0) {
		printk("%s() Can not read property vcc_12v_io\n", __FUNCTION__);
		goto err;
	} else {
		pdata->vcc_12v_io = ret;
		ret = devm_gpio_request(&pdev->dev, pdata->vcc_12v_io, "vcc_12v_io");
		if(ret < 0){
			printk("%s() devm_gpio_request vcc_12v_io request ERROR\n", __FUNCTION__);
			goto err;
		}

		ret = gpio_direction_output(pdata->vcc_12v_io,1); 
		if(ret < 0){
			printk("%s() gpio_direction_input vcc_12v_io set ERROR\n", __FUNCTION__);
			goto err;
		}
	}
	
	//hub_hos2_5V_gpio
	ret = of_get_named_gpio_flags(node, "hub_host2_5v_gpio", 0, &flags);
	if (ret < 0) {
		printk("%s() Can not read property hub_host2_5v_gpio\n", __FUNCTION__);
		goto err;
	} else {
		pdata->hub_host2_5v_gpio = ret;
		gpio_free(ret);
		ret = devm_gpio_request(&pdev->dev, pdata->hub_host2_5v_gpio, "hub_host2_5v_gpio");
		if(ret < 0){
			printk("%s() devm_gpio_request hub_host2_5v_gpio request ERROR\n", __FUNCTION__);
			goto err;
		}

		ret = gpio_direction_output(pdata->hub_host2_5v_gpio,1); 
		if(ret < 0){
			printk("%s() gpio_direction_input hub_host2_5v_gpio set ERROR\n", __FUNCTION__);
			goto err;
		}
	}

	//hub_host2_5V_rest_gpio
	ret = of_get_named_gpio_flags(node, "hub_host2_5V_rest_gpio", 0, &flags);
	if (ret < 0) {
		printk("%s() Can not read property hub_host2_5V_rest_gpio\n", __FUNCTION__);
		goto err;
	} else {
		pdata->hub_host2_5V_rest_gpio = ret;
		ret = devm_gpio_request(&pdev->dev, pdata->hub_host2_5V_rest_gpio, "hub_host2_5V_rest_gpio");
		if(ret < 0){
			printk("%s() devm_gpio_request hub_host2_5V_rest_gpio request ERROR\n", __FUNCTION__);
			goto err;
		}

		ret = gpio_direction_output(pdata->hub_host2_5V_rest_gpio,0); 
		if(ret < 0){
			printk("%s() gpio_direction_input hub_host2_5V_rest_gpio set ERROR\n", __FUNCTION__);
			goto err;
		}
		msleep(800);
		ret = gpio_direction_output(pdata->hub_host2_5V_rest_gpio,1); 
		if(ret < 0){
			printk("%s() gpio_direction_input hub_host2_5V_rest_gpio set ERROR\n", __FUNCTION__);
			goto err;
		}
	}

	//hub_hos3_5V_gpio
	ret = of_get_named_gpio_flags(node, "hub_host3_5v_gpio", 0, &flags);
	if (ret < 0) {
		printk("%s() Can not read property hub_host3_5v_gpio\n", __FUNCTION__);
		goto err;
	} else {
		pdata->hub_host3_5v_gpio = ret;
		gpio_free(ret);
		ret = devm_gpio_request(&pdev->dev, pdata->hub_host3_5v_gpio, "hub_host3_5v_gpio");
		if(ret < 0){
			printk("%s() devm_gpio_request hub_host3_5v_gpio request ERROR\n", __FUNCTION__);
			goto err;
		}

		ret = gpio_direction_output(pdata->hub_host3_5v_gpio,1); 
		if(ret < 0){
			printk("%s() gpio_direction_input hub_host3_5v_gpio set ERROR\n", __FUNCTION__);
			goto err;
		}
	}

	//hub_host3_5V_rest_gpio
	ret = of_get_named_gpio_flags(node, "hub_host3_5V_rest_gpio", 0, &flags);
	if (ret < 0) {
		printk("%s() Can not read property hub_host3_5V_rest_gpio\n", __FUNCTION__);
		goto err;
	} else {
		pdata->hub_host3_5V_rest_gpio = ret;
		ret = devm_gpio_request(&pdev->dev, pdata->hub_host3_5V_rest_gpio, "hub_host3_5V_rest_gpio");
		if(ret < 0){
			printk("%s() devm_gpio_request hub_host3_5V_rest_gpio request ERROR\n", __FUNCTION__);
			goto err;
		}

		ret = gpio_direction_output(pdata->hub_host3_5V_rest_gpio,0); 
		if(ret < 0){
			printk("%s() gpio_direction_input hub_host3_5V_rest_gpio set ERROR\n", __FUNCTION__);
			goto err;
		}
		msleep(800);
		ret = gpio_direction_output(pdata->hub_host3_5V_rest_gpio,1); 
		if(ret < 0){
			printk("%s() gpio_direction_input hub_host3_5V_rest_gpio set ERROR\n", __FUNCTION__);
			goto err;
		}
	}

	//wake_4g_gpio
	   ret = of_get_named_gpio_flags(node, "wake_4g_gpio", 0, &flags);
	   if (ret < 0) {
	           printk("%s() Can not read property wake_4g_gpio\n", __FUNCTION__);
	   } else {
	           pdata->wake_4g_gpio = ret;

	           ret = devm_gpio_request(&pdev->dev, pdata->wake_4g_gpio, "wake_4g_gpio");
	           if(ret < 0){
	                   printk("%s() devm_gpio_request wake_4g_gpio request ERROR\n", __FUNCTION__);
	           }
	           ret = gpio_direction_output(pdata->wake_4g_gpio,0);
	           if(ret < 0){
	                   printk("%s() gpio_direction_input wake_4g_gpio set ERROR\n", __FUNCTION__);
	           }
	   }

#if 0
	   //reset_4g_gpio
	   ret = of_get_named_gpio_flags(node, "reset_4g_gpio", 0, &flags);
	   if (ret < 0) {
	           printk("%s() Can not read property reset_4g_gpio\n", __FUNCTION__);
	   } else {
	           pdata->reset_4g_gpio = ret;

	           ret = devm_gpio_request(&pdev->dev, pdata->reset_4g_gpio, "reset_4g_gpio");
	           if(ret < 0){
	                   printk("%s() devm_gpio_request reset_4g_gpio request ERROR\n", __FUNCTION__);
	           }
	           ret = gpio_direction_output(pdata->reset_4g_gpio,0);
	           if(ret < 0){
	                   printk("%s() gpio_direction_input reset_4g_gpio set ERROR\n", __FUNCTION__);
	           }
	   }

	   //en_4g_gpio
	   ret = of_get_named_gpio_flags(node, "en_4g_gpio", 0, &flags);
	   if (ret < 0) {
	           printk("%s() Can not read property en_4g_gpio\n", __FUNCTION__);
	   } else {
	           pdata->en_4g_gpio = ret;

	           ret = devm_gpio_request(&pdev->dev, pdata->en_4g_gpio, "en_4g_gpio");
	           if(ret < 0){
	                   printk("%s() devm_gpio_request en_4g_gpio request ERROR\n", __FUNCTION__);
	           }
	           ret = gpio_direction_output(pdata->en_4g_gpio,1);
	           if(ret < 0){
	                   printk("%s() gpio_direction_input en_4g_gpio set ERROR\n", __FUNCTION__);
	           }
	   }


	   //air_mode_4g_gpio
	   ret = of_get_named_gpio_flags(node, "air_mode_4g_gpio", 0, &flags);
	   if (ret < 0) {
	           printk("%s() Can not read property air_mode_4g_gpio\n", __FUNCTION__);
	   } else {
	           pdata->air_mode_4g_gpio = ret;

	           ret = devm_gpio_request(&pdev->dev, pdata->air_mode_4g_gpio, "air_mode_4g_gpio");
	           if(ret < 0){
	                   printk("%s() devm_gpio_request air_mode_4g_gpio request ERROR\n", __FUNCTION__);
	           }
	           ret = gpio_direction_output(pdata->air_mode_4g_gpio,0);
	           if(ret < 0){
	                   printk("%s() gpio_direction_input air_mode_4g_gpio set ERROR\n", __FUNCTION__);
	           }
	   }

#endif	  
/*
	//edp_power_supply_gpio;
	ret = of_get_named_gpio_flags(node, "edp_power_supply_gpio", 0, &flags);
	if (ret < 0) {
		printk("%s() Can not read property edp_power_supply_gpio\n", __FUNCTION__);
	} else {
		pdata->edp_power_supply_gpio = ret;

		ret = devm_gpio_request(&pdev->dev, pdata->edp_power_supply_gpio, "edp_power_supply_gpio");
		if(ret < 0){
			printk("%s() devm_gpio_request edp_power_supply_gpio request ERROR\n", __FUNCTION__);
		}
		
		ret = gpio_direction_output(pdata->edp_power_supply_gpio,1);
		if(ret < 0){
			printk("%s() gpio_direction_input edp_power_supply_gpio set ERROR\n", __FUNCTION__);
		}
	}
*/	
   //edp_enable-gpio;
#if 0
	ret = of_get_named_gpio_flags(node, "edp_enable_gpio", 0, &flags);
	if (ret < 0) {
		printk("%s() Can not read property edp_enable_gpio\n", __FUNCTION__);
	} else {
		pdata->edp_enable_gpio = ret;

		ret = devm_gpio_request(&pdev->dev, pdata->edp_enable_gpio, "edp_enable_gpio");
		if(ret < 0){
			printk("%s() devm_gpio_request edp_enable_gpio request ERROR\n", __FUNCTION__);
		}
		
		ret = gpio_direction_output(pdata->edp_enable_gpio,1);
		if(ret < 0){
			printk("%s() gpio_direction_input edp_enable_gpio set ERROR\n", __FUNCTION__);
		}
	} 
  
#endif
   //ch342_enable-gpio;
	ret = of_get_named_gpio_flags(node, "ch342_power", 0, &flags);
	if (ret < 0) {
		printk("%s() Can not read property ch342_gpio\n", __FUNCTION__);
	} else {
		pdata->ch342_power = ret;

		ret = devm_gpio_request(&pdev->dev, pdata->ch342_power, "ch342_power");
		if(ret < 0){
			printk("%s() devm_gpio_request ch342_power request ERROR\n", __FUNCTION__);
		}
		
		ret = gpio_direction_output(pdata->ch342_power,1);
		if(ret < 0){
			printk("%s() gpio_direction_input ch342_power set ERROR\n", __FUNCTION__);
		}
	}   


        //edp_set_pixel-s
         ret = of_get_named_gpio_flags(node, "edp_reset", 0, &flags);
    if (ret < 0) {
        printk("%s() Can not read property edp_reset\n", __FUNCTION__);
        goto err;
    }

    reset_pin = ret;

	   // ch342_reset
	   ret = of_get_named_gpio_flags(node, "ch342_reset", 0, &flags);
	   if (ret < 0) {
	           printk("%s() Can not read property ch342_reset\n", __FUNCTION__);
	   } else {
	           pdata->reset_ch342_gpio = ret;

	           ret = devm_gpio_request(&pdev->dev, pdata->reset_ch342_gpio, "ch342_reset");
	           if(ret < 0){
	                   printk("%s() devm_gpio_request ch342_reset request ERROR\n", __FUNCTION__);
	           }
	           ret = gpio_direction_output(pdata->reset_ch342_gpio,1);
	           if(ret < 0){
	                   printk("%s() gpio_direction_output ch342_reset set ERROR\n", __FUNCTION__);
	           }
//    		 ch342_reset = ret;
	   }


// enable lvds
     ret = of_get_named_gpio_flags(node, "edp_gpio0", 0, &flags);
    if (ret < 0) {
        printk("%s() Can not read property edp_gpio0\n", __FUNCTION__);
        goto err;
    }
	 gpio0 = ret;



    ret = of_get_named_gpio_flags(node, "edp_gpio1", 0, &flags);
    if (ret < 0) {
        printk("%s() Can not read property edp_gpio1\n", __FUNCTION__);
        goto err;
    }

        gpio1 = ret;

    ret = of_get_named_gpio_flags(node, "edp_gpio2", 0, &flags);
    if (ret < 0) {
        printk("%s() Can not read property edp_gpio2\n", __FUNCTION__);
        goto err;
    }

    gpio2 = ret;

    ret = of_get_named_gpio_flags(node, "edp_gpio3", 0, &flags);
    if (ret < 0) {
        printk("%s() Can not read property edp_gpio3\n", __FUNCTION__);
        goto err;
    }

    gpio3 = ret;


	 ret = devm_gpio_request(&pdev->dev, reset_pin, "edp_reset");
    if(ret < 0){
        printk("%s() devm_gpio_request edp_reset request ERROR\n", __FUNCTION__);
        goto err;
    }


    ret = devm_gpio_request(&pdev->dev, gpio0, "edp_gpio0");
    if(ret < 0){
        printk("%s() devm_gpio_request edp_gpio0 request ERROR\n", __FUNCTION__);
        goto err;
    }

    ret = devm_gpio_request(&pdev->dev, gpio1, "edp_gpio1");
    if(ret < 0){
        printk("%s() devm_gpio_request edp_gpio1 request ERROR\n", __FUNCTION__);
        goto err;
    }

    ret = devm_gpio_request(&pdev->dev, gpio2, "edp_gpio2");
    if(ret < 0){
        printk("%s() devm_gpio_request edp_gpio2 request ERROR\n", __FUNCTION__);
        goto err;
    }

    ret = devm_gpio_request(&pdev->dev, gpio3, "edp_gpio3");
    if(ret < 0){
        printk("%s() devm_gpio_request edp_gpio3 request ERROR\n", __FUNCTION__);
        goto err;
    }
	
	   ret = of_property_read_u32(node, "nodka_lvds", &lvds_index);
        if (ret < 0){
                printk("%s() Can not read property nodka_lvds\n", __FUNCTION__);
        }

        printk("nodka_lvds_index = %d\n",lvds_index);

        while ( i < 4 ){
                if ( lvds_index > 0)
                        lvds_gpio[i] = lvds_index%2;
                else
                        lvds_gpio[i] = 0;
                printk("lvds_gpio[%d]=%d\n",i,lvds_gpio[i]);
                lvds_index = lvds_index/2;
                i++;
        }

    gpio_direction_output(reset_pin, 0);
    usleep_range(80000, 100000);
    gpio_direction_output(reset_pin, 1);
    usleep_range(80000, 100000);

//    gpio_direction_output(ch342_reset, 0);
//   usleep_range(80000, 100000);
//    gpio_direction_output(ch342_reset, 1);
//    usleep_range(80000, 100000);

/*
      //gpio_op0
         ret = of_get_named_gpio_flags(node, "gpio_op0", 0, &flags);
    if (ret < 0) {
        printk("%s() Can not read property gpio_op0\n", __FUNCTION__);
        goto err;
    }

    pdata->gpio_op0 = ret;

         ret = devm_gpio_request(&pdev->dev, pdata->gpio_op0, "gpio_op0");
    if(ret < 0){
        printk("%s() devm_gpio_request gpio_op0 request ERROR\n", __FUNCTION__);
        goto err;
    }

	gpio_direction_output(pdata->gpio_op0, 1);
*/
	
	gpio_direction_output(gpio0, lvds_gpio[0]);
	gpio_direction_output(gpio1, lvds_gpio[1]);
	gpio_direction_output(gpio2, lvds_gpio[2]);
	gpio_direction_output(gpio3, lvds_gpio[3]);
	
	printk(" #######nk_io_control_probe end####### \n");
	return 0;
	
err:
	kfree(pdata);
	return ret;	
}	

//6 in 6 out-e
#if 0 
static int nk_io_control_probe1(struct platform_device *pdev)
{
	struct device_node *node = pdev->dev.of_node;
	struct nk_io_pdata *pdata;
	int ret;
	int gpio0, gpio1, gpio2, gpio3, reset_pin;
	enum of_gpio_flags flags;
	printk(" #######nk_io_control_probe####### \n");
	//enable = 0 ;


//	ret = gpio_direction_output(74,0); 
//	if(ret < 0){
//		printk("fuwei %s() gpio_direction_input vcc_12v_io set ERROR\n", __FUNCTION__);
//		goto err;
//	}


	pdata = kzalloc(sizeof(struct nk_io_pdata), GFP_KERNEL);
	if (pdata == NULL) {
		printk("%s failed to allocate driver data\n",__FUNCTION__);
		return -ENOMEM;
	}
	memset(pdata,0,sizeof(struct nk_io_pdata));


	//edp_set_pixel-s
	 ret = of_get_named_gpio_flags(node, "edp_reset", 0, &flags);
    if (ret < 0) {
        printk("%s() Can not read property edp_reset\n", __FUNCTION__);
        goto err;
    }

    reset_pin = ret;

	ret = of_get_named_gpio_flags(node, "edp_gpio0", 0, &flags);
    if (ret < 0) {
        printk("%s() Can not read property edp_gpio0\n", __FUNCTION__);
        goto err;
    } 

    gpio0 = ret;

    ret = of_get_named_gpio_flags(node, "edp_gpio1", 0, &flags);
    if (ret < 0) {
        printk("%s() Can not read property edp_gpio1\n", __FUNCTION__);
        goto err;
    }

	gpio1 = ret;

    ret = of_get_named_gpio_flags(node, "edp_gpio2", 0, &flags);
    if (ret < 0) {
        printk("%s() Can not read property edp_gpio2\n", __FUNCTION__);
        goto err;
    }

    gpio2 = ret;

    ret = of_get_named_gpio_flags(node, "edp_gpio3", 0, &flags);
    if (ret < 0) {
        printk("%s() Can not read property edp_gpio3\n", __FUNCTION__);
        goto err;
    }

    gpio3 = ret;

    ret = devm_gpio_request(&pdev->dev, reset_pin, "edp_reset");
    if(ret < 0){
        printk("%s() devm_gpio_request edp_reset request ERROR\n", __FUNCTION__);
        goto err;
    }

    ret = devm_gpio_request(&pdev->dev, gpio0, "edp_gpio0");
    if(ret < 0){
        printk("%s() devm_gpio_request edp_gpio0 request ERROR\n", __FUNCTION__);
        goto err;
    }

    ret = devm_gpio_request(&pdev->dev, gpio1, "edp_gpio1");
    if(ret < 0){
        printk("%s() devm_gpio_request edp_gpio1 request ERROR\n", __FUNCTION__);
        goto err;
    }

    ret = devm_gpio_request(&pdev->dev, gpio2, "edp_gpio2");
    if(ret < 0){
        printk("%s() devm_gpio_request edp_gpio2 request ERROR\n", __FUNCTION__);
        goto err;
    }

    ret = devm_gpio_request(&pdev->dev, gpio3, "edp_gpio3");
    if(ret < 0){
        printk("%s() devm_gpio_request edp_gpio3 request ERROR\n", __FUNCTION__);
        goto err;
    }

    gpio_direction_output(reset_pin, 0); 
    usleep_range(80000, 100000);
    gpio_direction_output(reset_pin, 1); 
    usleep_range(80000, 100000);

    gpio_direction_output(gpio0, 0); 
    gpio_direction_output(gpio1, 1); 
    gpio_direction_output(gpio2, 1); 
    gpio_direction_output(gpio3, 0); 
	printk("edp set pixels success.\r\n");

	//edp_set_pixel-e

	//6 in 6 out-s	
	//gpio_op0
	 ret = of_get_named_gpio_flags(node, "gpio_op0", 0, &flags);
    if (ret < 0) {
        printk("%s() Can not read property gpio_op0\n", __FUNCTION__);
        goto err;
    }

    pdata->gpio_op0 = ret;

	 ret = devm_gpio_request(&pdev->dev, pdata->gpio_op0, "gpio_op0");
    if(ret < 0){
        printk("%s() devm_gpio_request gpio_op0 request ERROR\n", __FUNCTION__);
        goto err;
    }


	//gpio_op1
	 ret = of_get_named_gpio_flags(node, "gpio_op1", 0, &flags);
    if (ret < 0) {
        printk("%s() Can not read property gpio_op1\n", __FUNCTION__);
        goto err;
    }

    pdata->gpio_op1 = ret;

	 ret = devm_gpio_request(&pdev->dev, pdata->gpio_op1, "gpio_op1");
    if(ret < 0){
        printk("%s() devm_gpio_request gpio_op1 request ERROR\n", __FUNCTION__);
        goto err;
    }


	//gpio_op2
	 ret = of_get_named_gpio_flags(node, "gpio_op2", 0, &flags);
    if (ret < 0) {
        printk("%s() Can not read property gpio_op2\n", __FUNCTION__);
        goto err;
    }

    pdata->gpio_op2 = ret;

	 ret = devm_gpio_request(&pdev->dev, pdata->gpio_op2, "gpio_op2");
    if(ret < 0){
        printk("%s() devm_gpio_request gpio_op2 request ERROR\n", __FUNCTION__);
        goto err;
    }



	//gpio_op3
	 ret = of_get_named_gpio_flags(node, "gpio_op3", 0, &flags);
    if (ret < 0) {
        printk("%s() Can not read property gpio_op3\n", __FUNCTION__);
        goto err;
    }

    pdata->gpio_op3 = ret;

	 ret = devm_gpio_request(&pdev->dev, pdata->gpio_op3, "gpio_op3");
    if(ret < 0){
        printk("%s() devm_gpio_request gpio_op3 request ERROR\n", __FUNCTION__);
        goto err;
    }

	//gpio_op4
	 ret = of_get_named_gpio_flags(node, "gpio_op4", 0, &flags);
    if (ret < 0) {
        printk("%s() Can not read property gpio_op4\n", __FUNCTION__);
        goto err;
    }

    pdata->gpio_op4 = ret;

	 ret = devm_gpio_request(&pdev->dev, pdata->gpio_op4, "gpio_op4");
    if(ret < 0){
        printk("%s() devm_gpio_request gpio_op4 request ERROR\n", __FUNCTION__);
        goto err;
    }

	//gpio_op5
	 ret = of_get_named_gpio_flags(node, "gpio_op5", 0, &flags);
    if (ret < 0) {
        printk("%s() Can not read property gpio_op5\n", __FUNCTION__);
        goto err;
    }

    pdata->gpio_op5 = ret;

	 ret = devm_gpio_request(&pdev->dev, pdata->gpio_op5, "gpio_op5");
    if(ret < 0){
        printk("%s() devm_gpio_request gpio_op5 request ERROR\n", __FUNCTION__);
        goto err;
    }
	

	//d4 low
	gpio_direction_output(pdata->gpio_op0, 1);
	gpio_direction_output(pdata->gpio_op1, 1);
	gpio_direction_output(pdata->gpio_op2, 1);
	gpio_direction_output(pdata->gpio_op3, 1);
	gpio_direction_output(pdata->gpio_op4, 1);
	gpio_direction_output(pdata->gpio_op5, 1);

	



	//gpio_ip0
	 ret = of_get_named_gpio_flags(node, "gpio_ip0", 0, &flags);
    if (ret < 0) {
        printk("%s() Can not read property gpio_ip0\n", __FUNCTION__);
        goto err;
    }

    pdata->gpio_ip0 = ret;

	 ret = devm_gpio_request(&pdev->dev, pdata->gpio_ip0, "gpio_ip0");
    if(ret < 0){
        printk("%s() devm_gpio_request gpio_ip0 request ERROR\n", __FUNCTION__);
        goto err;
    }

	//gpio_ip1
	 ret = of_get_named_gpio_flags(node, "gpio_ip1", 0, &flags);
    if (ret < 0) {
        printk("%s() Can not read property gpio_ip1\n", __FUNCTION__);
        goto err;
    }

    pdata->gpio_ip1 = ret;

	 ret = devm_gpio_request(&pdev->dev, pdata->gpio_ip1, "gpio_ip1");
    if(ret < 0){
        printk("%s() devm_gpio_request gpio_ip1 request ERROR\n", __FUNCTION__);
        goto err;
    }

	//gpio_ip2
	 ret = of_get_named_gpio_flags(node, "gpio_ip2", 0, &flags);
    if (ret < 0) {
        printk("%s() Can not read property gpio_ip2\n", __FUNCTION__);
        goto err;
    }

    pdata->gpio_ip2 = ret;

	 ret = devm_gpio_request(&pdev->dev, pdata->gpio_ip2, "gpio_ip2");
    if(ret < 0){
        printk("%s() devm_gpio_request gpio_ip2 request ERROR\n", __FUNCTION__);
        goto err;
    }

	//gpio_ip3
	 ret = of_get_named_gpio_flags(node, "gpio_ip3", 0, &flags);
    if (ret < 0) {
        printk("%s() Can not read property gpio_ip3\n", __FUNCTION__);
        goto err;
    }

    pdata->gpio_ip3 = ret;

	 ret = devm_gpio_request(&pdev->dev, pdata->gpio_ip3, "gpio_ip3");
    if(ret < 0){
        printk("%s() devm_gpio_request gpio_ip3 request ERROR\n", __FUNCTION__);
        goto err;
    }

	//gpio_ip4
	 ret = of_get_named_gpio_flags(node, "gpio_ip4", 0, &flags);
    if (ret < 0) {
        printk("%s() Can not read property gpio_ip4\n", __FUNCTION__);
        goto err;
    }

    pdata->gpio_ip4 = ret;

	 ret = devm_gpio_request(&pdev->dev, pdata->gpio_ip4, "gpio_ip4");
    if(ret < 0){
        printk("%s() devm_gpio_request gpio_ip4 request ERROR\n", __FUNCTION__);
        goto err;
    }

	//gpio_ip5
	 ret = of_get_named_gpio_flags(node, "gpio_ip5", 0, &flags);
    if (ret < 0) {
        printk("%s() Can not read property gpio_ip5\n", __FUNCTION__);
        goto err;
    }

    pdata->gpio_ip5 = ret;

	 ret = devm_gpio_request(&pdev->dev, pdata->gpio_ip5, "gpio_ip3");
    if(ret < 0){
        printk("%s() devm_gpio_request gpio_ip5 request ERROR\n", __FUNCTION__);
        goto err;
    }

	//d4 low
	gpio_direction_input(pdata->gpio_ip0);
	gpio_direction_input(pdata->gpio_ip1);
	gpio_direction_input(pdata->gpio_ip2);
	gpio_direction_input(pdata->gpio_ip3);
	gpio_direction_input(pdata->gpio_ip4);
	gpio_direction_input(pdata->gpio_ip5);


	//6 in 6 out-e


	   //wake_4g_gpio
	   ret = of_get_named_gpio_flags(node, "wake_4g_gpio", 0, &flags);
	   if (ret < 0) {
	           printk("%s() Can not read property wake_4g_gpio\n", __FUNCTION__);
	   } else {
	           pdata->wake_4g_gpio = ret;

	           ret = devm_gpio_request(&pdev->dev, pdata->wake_4g_gpio, "wake_4g_gpio");
	           if(ret < 0){
	                   printk("%s() devm_gpio_request wake_4g_gpio request ERROR\n", __FUNCTION__);
	           }
	           ret = gpio_direction_output(pdata->wake_4g_gpio,0);
	           if(ret < 0){
	                   printk("%s() gpio_direction_input wake_4g_gpio set ERROR\n", __FUNCTION__);
	           }
	   }


	   //reset_4g_gpio
	   ret = of_get_named_gpio_flags(node, "reset_4g_gpio", 0, &flags);
	   if (ret < 0) {
	           printk("%s() Can not read property reset_4g_gpio\n", __FUNCTION__);
	   } else {
	           pdata->reset_4g_gpio = ret;

	           ret = devm_gpio_request(&pdev->dev, pdata->reset_4g_gpio, "reset_4g_gpio");
	           if(ret < 0){
	                   printk("%s() devm_gpio_request reset_4g_gpio request ERROR\n", __FUNCTION__);
	           }
	           ret = gpio_direction_output(pdata->reset_4g_gpio,0);
	           if(ret < 0){
	                   printk("%s() gpio_direction_input reset_4g_gpio set ERROR\n", __FUNCTION__);
	           }
	   }

	   //en_4g_gpio
	   ret = of_get_named_gpio_flags(node, "en_4g_gpio", 0, &flags);
	   if (ret < 0) {
	           printk("%s() Can not read property en_4g_gpio\n", __FUNCTION__);
	   } else {
	           pdata->en_4g_gpio = ret;

	           ret = devm_gpio_request(&pdev->dev, pdata->en_4g_gpio, "en_4g_gpio");
	           if(ret < 0){
	                   printk("%s() devm_gpio_request en_4g_gpio request ERROR\n", __FUNCTION__);
	           }
	           ret = gpio_direction_output(pdata->en_4g_gpio,1);
	           if(ret < 0){
	                   printk("%s() gpio_direction_input en_4g_gpio set ERROR\n", __FUNCTION__);
	           }
	   }


	   //air_mode_4g_gpio
	   ret = of_get_named_gpio_flags(node, "air_mode_4g_gpio", 0, &flags);
	   if (ret < 0) {
	           printk("%s() Can not read property air_mode_4g_gpio\n", __FUNCTION__);
	   } else {
	           pdata->air_mode_4g_gpio = ret;

	           ret = devm_gpio_request(&pdev->dev, pdata->air_mode_4g_gpio, "air_mode_4g_gpio");
	           if(ret < 0){
	                   printk("%s() devm_gpio_request air_mode_4g_gpio request ERROR\n", __FUNCTION__);
	           }
	           ret = gpio_direction_output(pdata->air_mode_4g_gpio,0);
	           if(ret < 0){
	                   printk("%s() gpio_direction_input air_mode_4g_gpio set ERROR\n", __FUNCTION__);
	           }
	   }


       
	

	//mic_switch_gpio
		ret = of_get_named_gpio_flags(node, "mic_switch_gpio", 0, &flags);
		if (ret < 0) {
				printk("%s() Can not read property mic_switch_gpio\n", __FUNCTION__);
				goto err;
		} else {
				pdata->mic_switch_gpio = ret;
				ret = devm_gpio_request(&pdev->dev, pdata->mic_switch_gpio, "mic_switch_gpio");
				if(ret < 0){
						printk("%s() devm_gpio_request mic_switch_gpio request ERROR\n", __FUNCTION__);
						goto err;
				}
				ret = gpio_direction_output(pdata->mic_switch_gpio,0); 
				mic_enable = 0;
				if(ret < 0){
				printk("%s() gpio_direction_input mic_switch_gpio set ERROR\n", __FUNCTION__);
				goto err;
		}
				}
#if 0
	//vcc_5v_io
	ret = of_get_named_gpio_flags(node, "vcc_5v_io", 0, &flags);
	if (ret < 0) {
		printk("%s() Can not read property vcc_5v_io\n", __FUNCTION__);
		goto err;
	} else {
		pdata->vcc_5v_io = ret;
		ret = devm_gpio_request(&pdev->dev, pdata->vcc_5v_io, "vcc_5v_io");
		if(ret < 0){
			printk("%s() devm_gpio_request vcc_5v_io request ERROR\n", __FUNCTION__);
			goto err;
		}

		ret = gpio_direction_output(pdata->vcc_5v_io,1); 
		if(ret < 0){
			printk("%s() gpio_direction_input vcc_5v_io set ERROR\n", __FUNCTION__);
			goto err;
		}
	}
#endif
	//vcc_3.3v_io
	ret = of_get_named_gpio_flags(node, "vcc_3_3v_io", 0, &flags);
	if (ret < 0) {
		printk("%s() Can not read property vcc_3_3v_io\n", __FUNCTION__);
		goto err;
	} else {
		pdata->vcc_3_3v_io = ret;
		ret = devm_gpio_request(&pdev->dev, pdata->vcc_3_3v_io, "vcc_3_3v_io");
		if(ret < 0){
			printk("%s() devm_gpio_request vcc_3_3v_io request ERROR\n", __FUNCTION__);
			goto err;
		}

		ret = gpio_direction_output(pdata->vcc_3_3v_io,1); 
		if(ret < 0){
			printk("%s() gpio_direction_input vcc_3_3v_io set ERROR\n", __FUNCTION__);
			goto err;
		}
	}

		//vcc_12v_io
	ret = of_get_named_gpio_flags(node, "vcc_12v_io", 0, &flags);
	if (ret < 0) {
		printk("%s() Can not read property vcc_12v_io\n", __FUNCTION__);
		goto err;
	} else {
		pdata->vcc_12v_io = ret;
		ret = devm_gpio_request(&pdev->dev, pdata->vcc_12v_io, "vcc_12v_io");
		if(ret < 0){
			printk("%s() devm_gpio_request vcc_12v_io request ERROR\n", __FUNCTION__);
			goto err;
		}

		ret = gpio_direction_output(pdata->vcc_12v_io,1); 
		if(ret < 0){
			printk("%s() gpio_direction_input vcc_12v_io set ERROR\n", __FUNCTION__);
			goto err;
		}
	}
	
		//hub_5V_gpio
	ret = of_get_named_gpio_flags(node, "hub_5V_gpio", 0, &flags);
	if (ret < 0) {
		printk("%s() Can not read property hub_5V_gpio\n", __FUNCTION__);
		goto err;
	} else {
		
		pdata->hub_5V_gpio = ret;
		gpio_free(ret);
		ret = devm_gpio_request(&pdev->dev, pdata->hub_5V_gpio, "hub_5V_gpio");
		if(ret < 0){
			printk("%s() devm_gpio_request hub_5V_gpio request ERROR\n", __FUNCTION__);
			goto err;
		}

		ret = gpio_direction_output(pdata->hub_5V_gpio,1); 
		if(ret < 0){
			printk("%s() gpio_direction_input hub_5V_gpio set ERROR\n", __FUNCTION__);
			goto err;
		}
	}


	//hub_5V_rest_gpio
	ret = of_get_named_gpio_flags(node, "hub_5V_rest_gpio", 0, &flags);
	if (ret < 0) {
		printk("%s() Can not read property hub_5V_rest_gpio\n", __FUNCTION__);
		goto err;
	} else {
		pdata->hub_5V_rest_gpio = ret;
		ret = devm_gpio_request(&pdev->dev, pdata->hub_5V_rest_gpio, "hub_5V_rest_gpio");
		if(ret < 0){
			printk("%s() devm_gpio_request hub_5V_rest_gpio request ERROR\n", __FUNCTION__);
			goto err;
		}

		ret = gpio_direction_output(pdata->hub_5V_rest_gpio,0); 
		if(ret < 0){
			printk("%s() gpio_direction_input hub_5V_rest_gpio set ERROR\n", __FUNCTION__);
			goto err;
		}
		msleep(800);
		ret = gpio_direction_output(pdata->hub_5V_rest_gpio,1); 
		if(ret < 0){
			printk("%s() gpio_direction_input hub_5V_rest_gpio set ERROR\n", __FUNCTION__);
			goto err;
		}
	}
	
		//audio_switch_gpio
	ret = of_get_named_gpio_flags(node, "audio_switch_gpio", 0, &flags);
	if (ret < 0) {
		printk("%s() Can not read property audio_switch_gpio\n", __FUNCTION__);
		goto err;
	} else {
		pdata->audio_switch_gpio = ret;
		ret = devm_gpio_request(&pdev->dev, pdata->audio_switch_gpio, "audio_switch_gpio");
		if(ret < 0){
			printk("%s() devm_gpio_request audio_switch_gpio request ERROR\n", __FUNCTION__);
			goto err;
		}
            ret = gpio_direction_output(pdata->audio_switch_gpio, !flags); 
		if(ret < 0){
		printk("%s() gpio_direction_input audio_switch_gpio set ERROR\n", __FUNCTION__);
		goto err;
	}
		}

	//led_ctl
		ret = of_get_named_gpio_flags(node, "led_ctl", 0, &flags);
		if (ret < 0) {
			printk("%s() Can not read property usb_5v_gpio\n", __FUNCTION__);
			goto err;
		} else {
			pdata->led_gpio = ret;
			ret = devm_gpio_request(&pdev->dev, pdata->led_gpio, "led_ctl");
			if(ret < 0){
				printk("%s() devm_gpio_request led_gpio request ERROR\n", __FUNCTION__);
				goto err;
			}
	
			ret = gpio_direction_output(pdata->led_gpio,0); 
			if(ret < 0){
				printk("%s() gpio_direction_input led_gpio set ERROR\n", __FUNCTION__);
				goto err;
			}
		}
		
		   

    printk("edp_bl_on ....\r\n"); 
    ret = of_get_named_gpio_flags(node, "edp_bl_on", 0, &flags);
    if (ret < 0) {
        printk("%s() Can not read property edp_bl_on\n", __FUNCTION__);
        goto err;
    } else {
        int gpio = ret;
        ret = devm_gpio_request(&pdev->dev, gpio, "edp_bl_on");
        if(ret < 0){
            printk("%s() devm_gpio_request edp_b1_on request ERROR\n", __FUNCTION__);
            goto err;
        }

        ret = gpio_direction_output(gpio, !flags); 
        if(ret < 0){
            printk("%s() gpio_direction_input edp_bl_on set ERROR\n", __FUNCTION__);
            goto err;
        }
    }
    printk("edp_bl_on ....ok!\r\n"); 

    printk("edp_bl_en ....\r\n"); 
    ret = of_get_named_gpio_flags(node, "edp_bl_en", 0, &flags);
    if (ret < 0) {
        printk("%s() Can not read property edp_bl_en\n", __FUNCTION__);
        goto err;
    } else {
        int gpio = ret;
        ret = devm_gpio_request(&pdev->dev, gpio, "edp_bl_en");
        if(ret < 0){
            printk("%s() devm_gpio_request edp_bl_en  request ERROR\n", __FUNCTION__);
            goto err;
        }
        ret = gpio_direction_output(gpio, !flags); 
        if(ret < 0){
            printk("%s() gpio_direction_input edp_bl_en set ERROR\n", __FUNCTION__);
            goto err;
        }
    }
    printk("edp_bl_en ....ok!\r\n"); 

    printk("fan_io_en ....\r\n"); 
    ret = of_get_named_gpio_flags(node, "fan_io_en", 0, &flags);
    if (ret < 0) {
        printk("%s() Can not read property fan_io_en\n", __FUNCTION__);
        goto err;
    } else {
        int gpio = ret;
        ret = devm_gpio_request(&pdev->dev, gpio, "fan_io_en");
        if(ret < 0){
            printk("%s() devm_gpio_request fan_io_en request ERROR\n", __FUNCTION__);
            goto err;
        }

        ret = gpio_direction_output(gpio, !flags); 
        if(ret < 0){
            printk("%s() gpio_direction_input fan_io_en set ERROR\n", __FUNCTION__);
            goto err;
        }
    }
    printk("fan_io_en ....ok!\r\n"); 


    //pcie_wakeup for ap6256 BT_wake
    /* Rfkill-bt.c bt driver config and set this pin already
    printk("pcie_wakeup ....\r\n"); 

	ret = of_get_named_gpio_flags(node, "pcie_wakeup", 0, &flags);
	if (ret < 0) {
		printk("%s() Can not read property pcie_wakeup\n", __FUNCTION__);
		goto err;
	} else {
        int gpio = ret;
		ret = devm_gpio_request(&pdev->dev, gpio, "pcie_wakeup");
		if(ret < 0){
			printk("%s() devm_gpio_request pcie_wakeup request ERROR\n", __FUNCTION__);
			goto err;
		}

		ret = gpio_direction_output(gpio, 1); 
		if(ret < 0){
			printk("%s() gpio_direction_input pcie_wakeup set ERROR\n", __FUNCTION__);
			goto err;
		}
	}
    printk("pcie_wakeup ....ok!\r\n"); 
	*/


	nk_class = class_create(THIS_MODULE, "io_control");
#if 0
	ret = class_create_file(nk_class, &class_attr_en_4g_gpio);
	if (ret) {
		printk(KERN_ERR "%s:Fail to creat en_4g_gpio class file\n", __func__);
		return ret;
	}else
	printk("class_create io_control en_4g_gpio OK !!!!\n");
	
	ret = class_create_file(nk_class, &class_attr_gpio_op0);
	if (ret) {
		printk(KERN_ERR "%s:Fail to creat gpio_op0 class file\n", __func__);
		return ret;
	}else
	printk("class_create io_control gpio_op0 OK !!!!\n");

	ret = class_create_file(nk_class, &class_attr_gpio_op1);
	if (ret) {
		printk(KERN_ERR "%s:Fail to creat gpio_op1 class file\n", __func__);
		return ret;
	}else
	printk("class_create io_control gpio_op1 OK !!!!\n");

	ret = class_create_file(nk_class, &class_attr_gpio_op2);
	if (ret) {
		printk(KERN_ERR "%s:Fail to creat gpio_op2 class file\n", __func__);
		return ret;
	}else
	printk("class_create io_control gpio_op2 OK !!!!\n");

	ret = class_create_file(nk_class, &class_attr_gpio_op3);
	if (ret) {
		printk(KERN_ERR "%s:Fail to creat gpio_op3 class file\n", __func__);
		return ret;
	}else
	printk("class_create io_control gpio_op3 OK !!!!\n");

	ret = class_create_file(nk_class, &class_attr_gpio_op4);
	if (ret) {
		printk(KERN_ERR "%s:Fail to creat gpio_op4 class file\n", __func__);
		return ret;
	}else
	printk("class_create io_control gpio_op4 OK !!!!\n");

	ret = class_create_file(nk_class, &class_attr_gpio_op5);
	if (ret) {
		printk(KERN_ERR "%s:Fail to creat gpio_op5 class file\n", __func__);
		return ret;
	}else
	printk("class_create io_control gpio_op5 OK !!!!\n");

	ret = class_create_file(nk_class, &class_attr_gpio_ip0);
	if (ret) {
		printk(KERN_ERR "%s:Fail to creat gpio_ip0 class file\n", __func__);
		return ret;
	}else
	printk("class_create io_control gpio_ip0 OK !!!!\n");

	ret = class_create_file(nk_class, &class_attr_gpio_ip1);
	if (ret) {
		printk(KERN_ERR "%s:Fail to creat gpio_ip1 class file\n", __func__);
		return ret;
	}else
	printk("class_create io_control gpio_ip1 OK !!!!\n");

	ret = class_create_file(nk_class, &class_attr_gpio_ip2);
	if (ret) {
		printk(KERN_ERR "%s:Fail to creat gpio_ip2 class file\n", __func__);
		return ret;
	}else
	printk("class_create io_control gpio_ip2 OK !!!!\n");

	ret = class_create_file(nk_class, &class_attr_gpio_ip3);
	if (ret) {
		printk(KERN_ERR "%s:Fail to creat gpio_ip3 class file\n", __func__);
		return ret;
	}else
	printk("class_create io_control gpio_ip3 OK !!!!\n");

	ret = class_create_file(nk_class, &class_attr_gpio_ip4);
	if (ret) {
		printk(KERN_ERR "%s:Fail to creat gpio_ip4 class file\n", __func__);
		return ret;
	}else
	printk("class_create io_control gpio_ip4 OK !!!!\n");

	ret = class_create_file(nk_class, &class_attr_gpio_ip5);
	if (ret) {
		printk(KERN_ERR "%s:Fail to creat gpio_ip5 class file\n", __func__);
		return ret;
	}else
	printk("class_create io_control gpio_ip5 OK !!!!\n");
	
	ret = class_create_file(nk_class, &class_attr_led_display);
	if (ret) {
		printk(KERN_ERR "%s:Fail to creat led_display class file\n", __func__);
		return ret;
	}else
	printk("class_create nk_io_control led OK !!!!\n");	

   ret = class_create_file(nk_class, &class_attr_mic_switch);
   if (ret) {
           printk(KERN_ERR "%s:Fail to creat mic_switch class file\n", __func__);
           return ret;
   }else
   printk("class_create nk_io_control mic OK !!!!\n");	
#endif
		   
	NKpdata_info = pdata;

	printk(" #######nk_io_control_probe end####### \n");
	return 0;
err:
	kfree(pdata);
	return ret;
}
#endif

static int nk_io_control_remove(struct platform_device *pdev)
{
	if(NKpdata_info)
		kfree(NKpdata_info);
	return 0;
}

static int nk_io_control_suspend(struct platform_device *pdev, pm_message_t state)
{
	printk("LED_early_suspend LED_early_suspend LED_early_suspend !!!!\n");

	//enable = 0;
	//LED_SET(0);
	return 0;
}

static int nk_io_control_resume(struct platform_device *pdev)
{
	int ret,reset_pin;
	printk("nk_io resume !!!!\n");
	ret = gpio_get_value(120);
	printk("edp_reset gpio value : %d\n",ret);

        usleep_range(80000, 100000);
	gpio_set_value(120,0);
//    	gpio_direction_output(120, 0);
        usleep_range(80000, 100000);
	ret = gpio_get_value(120);
	printk("edp_reset gpio value : %d\n",ret);
//    	gpio_direction_output(120, 1);
	gpio_set_value(120,1);
    	usleep_range(80000, 100000);
	ret = gpio_get_value(120);
	printk("edp_reset gpio value : %d\n",ret);

	//enable = 1;
    	//LED_SET(11);
	return 0;
}

static const struct of_device_id nk_io_control_of_match[] = {
        { .compatible = "nk_io_control", },
        {},
};
MODULE_DEVICE_TABLE(of, nk_io_control_of_match);

static struct platform_driver nk_io_control_driver = {
	.probe	= nk_io_control_probe,
	.remove = nk_io_control_remove,
	.resume = 	nk_io_control_resume,	
	.suspend = 	nk_io_control_suspend,	
	.driver	= {
		.name	= "nk_io_control",
		.owner	= THIS_MODULE,
		.of_match_table = of_match_ptr(nk_io_control_of_match),		
	},
};

static int __init nk_io_control_init(void)
{
	platform_driver_register(&nk_io_control_driver);
	return 0;
}

static void __exit nk_io_control_exit(void)
{
	platform_driver_unregister(&nk_io_control_driver);
}

subsys_initcall(nk_io_control_init);

//late_initcall(nk_io_control_init);
MODULE_DESCRIPTION("nk io Core Driver");
MODULE_LICENSE("GPL");
