コード例 #1
0
int eddy_gpio_ioctl(struct inode *inode, struct file *flip,
		unsigned int command, unsigned long arg)
{
	int ret=0;
	int tmp = 0;
	int copy_size =0;

	void __user *argp = (void __user *)arg;

	switch (command) {
		case INIT_PRODUCT:
			productID = get_productID();	
			/* all common setting */

			/* ready led set mode out */
			at91_set_gpio_output(AT91_PIN_PC4,GPIO_HIGH);
			/* reset swith read */
			at91_set_gpio_input(AT91_PIN_PC16,PULLUP_ENABLE);
			/* hardware reset */
			/* each product dependent setting */ 
			init_product();
			break;
		case GET_PRODUCTID:
			if(productID == 0x00)
			{
				productID = get_productID();	
			}
			return productID;	
			break;
		case COMRXON:
			/* receive enable */
			at91_set_gpio_value(AT91_PIN_PC16,GPIO_HIGH);
			/* transmit disable */
			at91_set_gpio_value(AT91_PIN_PC17,GPIO_HIGH);
			break;
		case COMTXON:
			/* receive disable */
			at91_set_gpio_value(AT91_PIN_PC16,GPIO_LOW);
			/* transmit enable */
			at91_set_gpio_value(AT91_PIN_PC17,GPIO_LOW);
			break;
		case RDY_LED_ON:
			/* ready LED on */
			//	printk("ready led on\n");
			at91_set_gpio_value(AT91_PIN_PC4,GPIO_HIGH);
			break;
		case RDY_LED_OFF:
			//	printk("ready led off\n");
			/* ready LED off */
			at91_set_gpio_value(AT91_PIN_PC4,GPIO_LOW);
			break;
		case RESET_READ:
			/* reset switch read */	
			//	ret = at91_get_gpio_value(AT91_PIN_PC16);
			ret = 1;

			break;
		case HW_RESET:
			/* Hardware reset */
			at91_set_gpio_value(AT91_PIN_PB19,GPIO_HIGH);
			udelay(100);
			at91_set_gpio_value(AT91_PIN_PB19,GPIO_HIGH);
			udelay(100);
			at91_set_gpio_value(AT91_PIN_PB19,GPIO_HIGH);
			udelay(100);
			break;	
		case SETGPIOMODEIN:
			if(copy_from_user(&tmp, (void *) arg, sizeof(int)))
			{
				return -EFAULT;
			}
			else
			{
				if(productID == EDDY_CPU)
				{
					tmp += AT91_PIN_PC16 ;
				}
				if(productID == EDDY_S1_PIN || productID == EDDY_S1_PIN_C || productID == EDDY_S2_M || productID == EDDY_S2_M_C)
				{
					tmp += AT91_PIN_PC28 ;
				}
				if(productID == EDDY_DK_C)
				{
					tmp += AT91_PIN_PC20 ;
				}

			}
			ret = check_gpio_num(tmp);
			//printk("set gpio mode in ret = %d, tmp = %d \n",ret,tmp);
			if(ret < 0)
			{
				break;
			}
			else
			{
				ret = at91_set_gpio_input(tmp,PULLUP_ENABLE);
				break;
			}
		case SETGPIOMODEOUT:
			if(copy_from_user(&tmp, (void *) arg, sizeof(int)))
			{
				return -EFAULT;
			}
			else
			{
				if(productID == EDDY_CPU)
				{
					//printk("set gpio mode out Eddy_CPU\n");
					tmp += AT91_PIN_PC16 ;
				}
				if(productID == EDDY_S1_PIN || productID == EDDY_S1_PIN_C || productID == EDDY_S2_M || productID == EDDY_S2_M_C)
				{
					//printk("set gpio mode out Eddy_S1_PIN\n");
					tmp += AT91_PIN_PC28 ;
				}
				if(productID == EDDY_DK_C)
				{
					tmp += AT91_PIN_PC20 ;
				}

			}
			ret = check_gpio_num(tmp);
			if(ret < 0)
			{
				break;
			}
			else
			{
				ret = at91_set_gpio_output(tmp,GPIO_HIGH);
				break;
			}
		case GETGPIOMODE:
			if(copy_from_user(&tmp, (void *) arg, sizeof(int)))
			{
				return -EFAULT;
			}
			else
			{
				if(productID == EDDY_CPU)
				{
					tmp += AT91_PIN_PC16 ;
				}
				if(productID == EDDY_S1_PIN || productID == EDDY_S1_PIN_C || productID == EDDY_S2_M || productID == EDDY_S2_M_C)
				{
					tmp += AT91_PIN_PC28 ;
				}
				if(productID == EDDY_DK_C)
				{
					tmp += AT91_PIN_PC20 ;
				}

			}
			ret = check_gpio_num(tmp);
			//printk("get gpio mode ret = %d, tmp = %d \n",ret,tmp);
			if(ret < 0)
			{
				break;
			}
			else
			{
				ret = at91_get_gpio_mode(tmp);
				break;
			}
		case SETGPIOVALUEHIGH:
			if(copy_from_user(&tmp, (void *) arg, sizeof(int)))
			{
				return -EFAULT;
			}
			else
			{
				if(productID == EDDY_CPU)
				{
					tmp += AT91_PIN_PC16 ;
				}
				if(productID == EDDY_S1_PIN || productID == EDDY_S1_PIN_C || productID == EDDY_S2_M || productID == EDDY_S2_M_C)
				{
					tmp += AT91_PIN_PC28 ;
				}
				if(productID == EDDY_DK_C)
				{
					tmp += AT91_PIN_PC20 ;
				}

			}
			ret = check_gpio_num(tmp);
			if(ret < 0)
			{
				break;
			}
			else
			{
				ret = at91_set_gpio_value(tmp,GPIO_HIGH);
				//	printk("set gpio value high = %d \n",tmp);
				break;
			}
		case SETGPIOVALUELOW:
			//printk("\n");
			if(copy_from_user(&tmp, (void *) arg, sizeof(int)))

			{
				return -EFAULT;
			}
			else
			{
				//	printk("set gpio value low 1 = %d \n",tmp);
				if(productID == EDDY_CPU)
				{
					tmp += AT91_PIN_PC16 ;
				}
				if(productID == EDDY_S1_PIN || productID == EDDY_S1_PIN_C || productID == EDDY_S2_M || productID == EDDY_S2_M_C)
				{
					tmp += AT91_PIN_PC28 ;
				}
				if(productID == EDDY_DK_C)
				{
					tmp += AT91_PIN_PC20 ;
				}

			}
			ret = check_gpio_num(tmp);
			//	printk("set gpio value low 2 = %d \n",tmp);
			if(ret < 0)
			{
				break;
			}
			else
			{
				ret = at91_set_gpio_value(tmp,GPIO_LOW);
				//		printk("set gpio value low 3 = %d \n",tmp);
				break;
			}
		case GETGPIOVALUE:
			//printk("\n");
			if(copy_from_user(&tmp, (void *) arg, sizeof(int)))
			{
				return -EFAULT;
			}
			else
			{
				if(productID == EDDY_CPU)
				{
					tmp += AT91_PIN_PC16 ;
				}
				if(productID == EDDY_S1_PIN || productID == EDDY_S1_PIN_C || productID == EDDY_S2_M || productID == EDDY_S2_M_C)
				{
					tmp += AT91_PIN_PC28 ;
				}
				if(productID == EDDY_DK_C)
				{
					tmp += AT91_PIN_PC20 ;
				}

			}
			ret = check_gpio_num(tmp);
			if(ret < 0)
			{
				break;
			}
			else
			{
				ret = at91_get_gpio_value(tmp);
				//		printk("get gpio value = %d \n",tmp);
				break;
			}
		case GPIO_CHIP:
			//	printk("gpio chip check\n");
			ret = system_process();
			break;
	}

	switch (tmp)
	{
		case SETGPIOINIT_LM	:		
			copy_size = sizeof(tmp_gpio_l);
			if (copy_from_user(&tmp_gpio_l, argp, copy_size))
			{
				return -EFAULT;
			}

			set_lowlevel_gpio_info(PIOM,SETGPIOMOD);
			set_lowlevel_gpio_info(PIOM,PIO_SODR);

			return ret;
	
			
		case SETGPIOMOD_LM	:		

			copy_size = sizeof(unsigned int);
			copy_size *= 3;
			if (copy_from_user(&tmp_gpio_l.mode[0], argp, copy_size))
			{
				return -EFAULT;
			}

			ret = set_lowlevel_gpio_info(PIOM,SETGPIOMOD);

			return ret;


		case GETGPIOMOD_LM	:	

			ret = get_lowlevel_gpio_info(PIOM, PIO_OSR);
			copy_size = sizeof(unsigned int);
			copy_size *= 3;
			if (copy_to_user(argp, &tmp_gpio_l.mode[0],copy_size))
			{
				return -EFAULT;
			}
			return ret;

		case SETGPIOVAL_LM	:

			copy_size = sizeof(unsigned int);
			copy_size *= 3;
			if (copy_from_user(&tmp_gpio_l.value[0], argp, copy_size))
			{
				return -EFAULT;
			}

			ret = set_lowlevel_gpio_info(PIOM,PIO_SODR);

			return ret;

		case GETGPIOVAL_LM	:	
			ret = 0;
			ret = get_lowlevel_gpio_info(PIOM, PIO_ODSR);
			copy_size = sizeof(unsigned int);
			copy_size *= 3;
			if (copy_to_user(argp, &tmp_gpio_l.value[0],copy_size))
			{
				return -EFAULT;
			}
			return 0;

		case SETGPIOPUL_LM	:
			copy_size = sizeof(unsigned int);
			copy_size *= 3;
			if (copy_from_user(&tmp_gpio_l.pullup[0], argp, copy_size))
			{
				return -EFAULT;
			}

			ret = set_lowlevel_gpio_info(PIOM,SETGPIOPUL);
			return ret;

		case GETGPIOPUL_LM	:
			ret = get_lowlevel_gpio_info(PIOM, PIO_PUSR);
			copy_size = sizeof(unsigned int);
			copy_size *= 3;
			if (copy_to_user(argp, &tmp_gpio_l.pullup[0],copy_size))
			{
				return -EFAULT;
			}
			return ret;

		case SETGPIOMOD_LA	:
			copy_size = sizeof(unsigned int);
			if (copy_from_user(&tmp_gpio_l.mode[0], argp, copy_size))
			{
				return -EFAULT;
			}

			ret = set_lowlevel_gpio_info(PIOA,SETGPIOMOD);
			return ret;

		case GETGPIOMOD_LA	:
			ret = get_lowlevel_gpio_info(PIOA, PIO_OSR);
			copy_size = sizeof(unsigned int);
			if (copy_to_user(argp, &tmp_gpio_l.mode[0],copy_size))
			{
				return -EFAULT;
			}
			return ret;

		case SETGPIOVAL_LA	:
			copy_size = sizeof(unsigned int);
			if (copy_from_user(&tmp_gpio_l.value[0], argp, copy_size))
			{
				return -EFAULT;
			}

			iowrite32(tmp_gpio_l.value[0], gpio_membase + PIO_SODR);
			tmp_gpio_l.value[0] = ~(tmp_gpio_l.value[0]) & eddy_gpio_l.en_gpio[0];
			iowrite32(tmp_gpio_l.value[0], gpio_membase + PIO_SODR);

			return 0;
		case GETGPIOVAL_LA	:
			ret = get_lowlevel_gpio_info(PIOA, PIO_ODSR);
			copy_size = sizeof(unsigned int);
			if (copy_to_user(argp, &tmp_gpio_l.value[0],copy_size))
			{
				return -EFAULT;
			}
			return ret;
		case SETGPIOPUL_LA	:
			copy_size = sizeof(unsigned int);
			if (copy_from_user(&tmp_gpio_l.pullup[0], argp, copy_size))
			{
				return -EFAULT;
			}

			ret = set_lowlevel_gpio_info(PIOA,SETGPIOPUL);
			return ret;
		case GETGPIOPUL_LA	:
			ret = 0;
			ret = get_lowlevel_gpio_info(PIOA, PIO_PUSR);
			copy_size = sizeof(unsigned int);
			copy_size *= 3;
			if (copy_to_user(argp, &tmp_gpio_l.pullup[0],copy_size))
			{
				return -EFAULT;
			}
			return ret;
		case SETGPIOMOD_LB	:
			copy_size = sizeof(unsigned int);
			if (copy_from_user(&tmp_gpio_l.mode[1], argp, copy_size))
			{
				return -EFAULT;
			}

			ret = set_lowlevel_gpio_info(PIOB,SETGPIOMOD);

			return ret;

		case GETGPIOMOD_LB	:
			ret = get_lowlevel_gpio_info(PIOB, PIO_OSR);
			copy_size = sizeof(unsigned int);
			if (copy_to_user(argp, &tmp_gpio_l.mode[1],copy_size))
			{
				return -EFAULT;
			}
			return ret;
		case SETGPIOVAL_LB	:
			copy_size = sizeof(unsigned int);
			if (copy_from_user(&tmp_gpio_l.value[1], argp, copy_size))
			{
				return -EFAULT;
			}

			iowrite32(tmp_gpio_l.value[1], gpio_membase + pio[1] + PIO_SODR);
			tmp_gpio_l.value[1] = ~(tmp_gpio_l.value[1]) & eddy_gpio_l.en_gpio[1];
			iowrite32(tmp_gpio_l.value[1], gpio_membase + pio[1] + PIO_SODR);

			return 0;

		case GETGPIOVAL_LB	:
			ret = get_lowlevel_gpio_info(PIOB, PIO_ODSR);
			copy_size = sizeof(unsigned int);
			if (copy_to_user(argp, &tmp_gpio_l.value[1],copy_size))
			{
				return -EFAULT;
			}
			return ret;
		case SETGPIOPUL_LB	:
			copy_size = sizeof(unsigned int);
			if (copy_from_user(&tmp_gpio_l.pullup[1], argp, copy_size))
			{
				return -EFAULT;
			}

			ret = set_lowlevel_gpio_info(PIOB,SETGPIOPUL);
			return ret;
		case GETGPIOPUL_LB	:
			ret = get_lowlevel_gpio_info(PIOB, PIO_PUSR);
			copy_size = sizeof(unsigned int);
			if (copy_to_user(argp, &tmp_gpio_l.pullup[1],copy_size))
			{
				return -EFAULT;
			}
			return ret;
		case SETGPIOMOD_LC	:
			copy_size = sizeof(unsigned int);
			if (copy_from_user(&tmp_gpio_l.mode[2], argp, copy_size))
			{
				return -EFAULT;
			}

			ret = set_lowlevel_gpio_info(PIOC,SETGPIOMOD);

			return ret;

		case GETGPIOMOD_LC	:
			ret = get_lowlevel_gpio_info(PIOC, PIO_OSR);
			copy_size = sizeof(unsigned int);
			if (copy_to_user(argp, &tmp_gpio_l.mode[2],copy_size))
			{
				return -EFAULT;
			}
			return ret;
		case SETGPIOVAL_LC	:
			copy_size = sizeof(unsigned int);
			if (copy_from_user(&tmp_gpio_l.value[2], argp, copy_size))
			{
				return -EFAULT;
			}

			iowrite32(tmp_gpio_l.value[2], gpio_membase + pio[2] + PIO_SODR);
			tmp_gpio_l.value[2] = ~(tmp_gpio_l.value[2]) & eddy_gpio_l.en_gpio[2];
			iowrite32(tmp_gpio_l.value[2], gpio_membase + pio[2] + PIO_SODR);

			return 0;
		case GETGPIOVAL_LC	:
			ret = get_lowlevel_gpio_info(PIOC, PIO_ODSR);
			copy_size = sizeof(unsigned int);
			if (copy_to_user(argp, &tmp_gpio_l.value[2],copy_size))
			{
				return -EFAULT;
			}
			return ret;
		case SETGPIOPUL_LC	:
			copy_size = sizeof(unsigned int);
			if (copy_from_user(&tmp_gpio_l.pullup[2], argp, copy_size))
			{
				return -EFAULT;
			}

			ret = set_lowlevel_gpio_info(PIOC,SETGPIOPUL);
			return ret;
		case GETGPIOPUL_LC	:
			ret = get_lowlevel_gpio_info(PIOC, PIO_PUSR);
			copy_size = sizeof(unsigned int);
			if (copy_to_user(argp, &tmp_gpio_l.pullup[2],copy_size))
			{
				return -EFAULT;
			}
			return ret;

		case SETGPIOMOD		:
		case GETGPIOMOD		:
		case SETGPIOVAL		:
		case GETGPIOVAL		:
		case SETGPIOPUL		:	
		case GETGPIOPUL		:
		case SETGPIOMOD_M	:
		case GETGPIOMOD_M	:
		case SETGPIOVAL_M	:
		case GETGPIOVAL_M	:
		case SETGPIOPUL_M	:
		case GETGPIOPUL_M	:
		default : 
			return 0;
	}
	return ret;

}
コード例 #2
0
int eddy_gpio_ioctl(struct inode *inode, struct file *flip,
		unsigned int command, unsigned long arg)
{
	int ret=0;
	int copy_size =0;

	void __user *argp = (void __user *)arg;

	switch (command) {

		case INIT_PRODUCT:
			/* ready led set mode out */
			at91_set_gpio_output(AT91_PIN_PC4,GPIO_HIGH);
			/* reset swith read */
			at91_set_gpio_input(AT91_PIN_PC16,PULLUP_ENABLE);
			break;

		case GET_PRODUCTID:
			productID = get_productID();	
			return productID;	
			break;
		case RDY_LED_ON:
			/* ready LED on */
			at91_set_gpio_value(AT91_PIN_PC4,GPIO_HIGH);
			break;
		case RDY_LED_OFF:
			/* ready LED off */
			at91_set_gpio_value(AT91_PIN_PC4,GPIO_LOW);
			break;
		case RESET_READ:
			/* reset switch read */	
			ret = at91_get_gpio_value(AT91_PIN_PC16);
			break;

		case SETGPIOINIT:		
			copy_size = sizeof(tmp_gpio_l);
			if (copy_from_user(&tmp_gpio_l, argp, copy_size))
			{
				return -EFAULT;
			}
			memcpy(&eddy_gpio_l,&tmp_gpio_l,copy_size);
			
			set_lowlevel_gpio_info(PIOM,SETGPIOENABLE);
			set_lowlevel_gpio_info(PIOM,SETGPIOMOD);
			set_lowlevel_gpio_info(PIOM,SETGPIOPUL);
			set_lowlevel_gpio_info(PIOM,SETGPIOVAL);

			return ret;

		case SETGPIOMOD_LM	:		

			copy_size = sizeof(unsigned int);
			copy_size *= 3;
			if (copy_from_user(&tmp_gpio_l.mode[0], argp, copy_size))
			{
				return -EFAULT;
			}
			ret = set_lowlevel_gpio_info(PIOM,SETGPIOMOD);
			return ret;


		case GETGPIOMOD_LM	:	

			ret = get_lowlevel_gpio_info(PIOM, PIO_OSR);
			copy_size = sizeof(unsigned int);
			copy_size *= 3;
			if (copy_to_user(argp, &tmp_gpio_l.mode[0],copy_size))
			{
				return -EFAULT;
			}
			return ret;

		case SETGPIOVAL_LM	:

			copy_size = sizeof(unsigned int);
			copy_size *= 3;
			if (copy_from_user(&tmp_gpio_l.value[0], argp, copy_size))
			{
				return -EFAULT;
			}
			ret = set_lowlevel_gpio_info(PIOM,SETGPIOVAL);

			return ret;

		case GETGPIOVAL_LM	:	
			ret = 0;
			ret = get_lowlevel_gpio_info(PIOM, PIO_PDSR);
			copy_size = sizeof(unsigned int);
			copy_size *= 3;
			if (copy_to_user(argp, &tmp_gpio_l.value[0],copy_size))
			{
				return -EFAULT;
			}
			return 0;

		case SETGPIOPUL_LM	:
			copy_size = sizeof(unsigned int);
			copy_size *= 3;
			if (copy_from_user(&tmp_gpio_l.pullup[0], argp, copy_size))
			{
				return -EFAULT;
			}

			ret = set_lowlevel_gpio_info(PIOM,SETGPIOPUL);
			return ret;

		case GETGPIOPUL_LM	:
			ret = get_lowlevel_gpio_info(PIOM, PIO_PUSR);
			copy_size = sizeof(unsigned int);
			copy_size *= 3;
			if (copy_to_user(argp, &tmp_gpio_l.pullup[0],copy_size))
			{
				return -EFAULT;
			}
			return ret;

		case SETGPIOMOD_LA	:
			copy_size = sizeof(unsigned int);
			if (copy_from_user(&tmp_gpio_l.mode[0], argp, copy_size))
			{
				return -EFAULT;
			}

			ret = set_lowlevel_gpio_info(PIOA,SETGPIOMOD);
			return ret;

		case GETGPIOMOD_LA	:
			ret = get_lowlevel_gpio_info(PIOA, PIO_OSR);
			copy_size = sizeof(unsigned int);
			if (copy_to_user(argp, &tmp_gpio_l.mode[0],copy_size))
			{
				return -EFAULT;
			}
			return ret;

		case SETGPIOVAL_LA	:
			copy_size = sizeof(unsigned int);
			if (copy_from_user(&tmp_gpio_l.value[0], argp, copy_size))
			{
				return -EFAULT;
			}
			eddy_gpio_l.value[0] = tmp_gpio_l.value[0];
			__raw_writel(tmp_gpio_l.value[0], gpio_membase + PIO_SODR);
			tmp_gpio_l.value[0] = ~(tmp_gpio_l.value[0]) & eddy_gpio_l.en_gpio[0];
			__raw_writel(tmp_gpio_l.value[0], gpio_membase + PIO_CODR);

			return 0;
		case GETGPIOVAL_LA	:
			ret = get_lowlevel_gpio_info(PIOA, PIO_PDSR);
			copy_size = sizeof(unsigned int);
			if (copy_to_user(argp, &tmp_gpio_l.value[0],copy_size))
			{
				return -EFAULT;
			}
			return ret;
		case SETGPIOPUL_LA	:
			copy_size = sizeof(unsigned int);
			if (copy_from_user(&tmp_gpio_l.pullup[0], argp, copy_size))
			{
				return -EFAULT;
			}

			ret = set_lowlevel_gpio_info(PIOA,SETGPIOPUL);
			return ret;
		case GETGPIOPUL_LA	:
			ret = 0;
			ret = get_lowlevel_gpio_info(PIOA, PIO_PUSR);
			copy_size = sizeof(unsigned int);
			copy_size *= 3;
			if (copy_to_user(argp, &tmp_gpio_l.pullup[0],copy_size))
			{
				return -EFAULT;
			}
			return ret;
		case SETGPIOMOD_LB	:
			copy_size = sizeof(unsigned int);
			if (copy_from_user(&tmp_gpio_l.mode[1], argp, copy_size))
			{
				return -EFAULT;
			}

			ret = set_lowlevel_gpio_info(PIOB,SETGPIOMOD);

			return ret;

		case GETGPIOMOD_LB	:
			ret = get_lowlevel_gpio_info(PIOB, PIO_OSR);
			copy_size = sizeof(unsigned int);
			if (copy_to_user(argp, &tmp_gpio_l.mode[1],copy_size))
			{
				return -EFAULT;
			}
			return ret;
		case SETGPIOVAL_LB	:
			copy_size = sizeof(unsigned int);
			if (copy_from_user(&tmp_gpio_l.value[1], argp, copy_size))
			{
				return -EFAULT;
			}

			eddy_gpio_l.value[1] = tmp_gpio_l.value[1];
			__raw_writel(tmp_gpio_l.value[1], gpio_membase + pio[1] + PIO_SODR);
			tmp_gpio_l.value[1] = ~(tmp_gpio_l.value[1]) & eddy_gpio_l.en_gpio[1];
			__raw_writel(tmp_gpio_l.value[1], gpio_membase + pio[1] + PIO_CODR);

			return 0;

		case GETGPIOVAL_LB	:
			ret = get_lowlevel_gpio_info(PIOB, PIO_PDSR);
			copy_size = sizeof(unsigned int);
			if (copy_to_user(argp, &tmp_gpio_l.value[1],copy_size))
			{
				return -EFAULT;
			}
			return ret;
		case SETGPIOPUL_LB	:
			copy_size = sizeof(unsigned int);
			if (copy_from_user(&tmp_gpio_l.pullup[1], argp, copy_size))
			{
				return -EFAULT;
			}

			ret = set_lowlevel_gpio_info(PIOB,SETGPIOPUL);
			return ret;
		case GETGPIOPUL_LB	:
			ret = get_lowlevel_gpio_info(PIOB, PIO_PUSR);
			copy_size = sizeof(unsigned int);
			if (copy_to_user(argp, &tmp_gpio_l.pullup[1],copy_size))
			{
				return -EFAULT;
			}
			return ret;
		case SETGPIOMOD_LC	:
			copy_size = sizeof(unsigned int);
			if (copy_from_user(&tmp_gpio_l.mode[2], argp, copy_size))
			{
				return -EFAULT;
			}

			ret = set_lowlevel_gpio_info(PIOC,SETGPIOMOD);

			return ret;

		case GETGPIOMOD_LC	:
			ret = get_lowlevel_gpio_info(PIOC, PIO_OSR);
			copy_size = sizeof(unsigned int);
			if (copy_to_user(argp, &tmp_gpio_l.mode[2],copy_size))
			{
				return -EFAULT;
			}
			return ret;
		case SETGPIOVAL_LC	:
			copy_size = sizeof(unsigned int);
			if (copy_from_user(&tmp_gpio_l.value[2], argp, copy_size))
			{
				return -EFAULT;
			}

			eddy_gpio_l.value[2] = tmp_gpio_l.value[2];
			__raw_writel(tmp_gpio_l.value[2], gpio_membase + pio[2] + PIO_SODR);
			tmp_gpio_l.value[2] = ~(tmp_gpio_l.value[2]) & eddy_gpio_l.en_gpio[2];
			__raw_writel(tmp_gpio_l.value[2], gpio_membase + pio[2] + PIO_CODR);

			return 0;
		case GETGPIOVAL_LC	:
			ret = get_lowlevel_gpio_info(PIOC, PIO_PDSR);
			copy_size = sizeof(unsigned int);
			if (copy_to_user(argp, &tmp_gpio_l.value[2],copy_size))
			{
				return -EFAULT;
			}
			return ret;
		case SETGPIOPUL_LC	:
			copy_size = sizeof(unsigned int);
			if (copy_from_user(&tmp_gpio_l.pullup[2], argp, copy_size))
			{
				return -EFAULT;
			}

			ret = set_lowlevel_gpio_info(PIOC,SETGPIOPUL);
			return ret;
		case GETGPIOPUL_LC	:
			ret = get_lowlevel_gpio_info(PIOC, PIO_PUSR);
			copy_size = sizeof(unsigned int);
			if (copy_to_user(argp, &tmp_gpio_l.pullup[2],copy_size))
			{
				return -EFAULT;
			}
			return ret;

		default : 
			return 0;
	}
	return ret;

}