void s3c_setup_cdmauart_cfg_gpio(unsigned char port)
{
	if (port == 1)
	{
		s3c_gpio_cfgpin(GPIO_CDMADATA_RXD, S3C_GPIO_SFN(GPIO_CDMADATA_RXD_AF));
        	s3c_gpio_setpull(GPIO_CDMADATA_RXD, S3C_GPIO_PULL_UP);
		s3c_gpio_slp_cfgpin(GPIO_CDMADATA_RXD, 		S3C_GPIO_SLP_INPUT);  
		s3c_gpio_slp_setpull_updown(GPIO_CDMADATA_RXD, S3C_GPIO_PULL_UP);
	
		s3c_gpio_cfgpin(GPIO_CDMADATA_TXD, S3C_GPIO_SFN(GPIO_CDMADATA_TXD_AF));
        	s3c_gpio_setpull(GPIO_CDMADATA_TXD, S3C_GPIO_PULL_UP);

		//s3c_gpio_slp_cfgpin(GPIO_CDMADATA_TXD, S3C_GPIO_SLP_OUT1);  
		//s3c_gpio_slp_setpull_updown(GPIO_CDMADATA_TXD, S3C_GPIO_PULL_NONE);

		s3c_gpio_cfgpin(GPIO_CDMADATA_CTS, S3C_GPIO_SFN(GPIO_CDMADATA_CTS_AF));
		s3c_gpio_setpull(GPIO_CDMADATA_CTS, S3C_GPIO_PULL_NONE);
		s3c_gpio_cfgpin(GPIO_CDMADATA_RTS, S3C_GPIO_SFN(GPIO_CDMADATA_RTS_AF));
		s3c_gpio_setpull(GPIO_CDMADATA_RTS, S3C_GPIO_PULL_NONE);
	}
	else if (port == 3)
	{
		s3c_gpio_cfgpin(GPIO_CDMACTRL_RXD, S3C_GPIO_SFN(GPIO_CDMACTRL_RXD_AF));
		s3c_gpio_setpull(GPIO_CDMACTRL_RXD, S3C_GPIO_PULL_NONE);
		s3c_gpio_slp_cfgpin(GPIO_CDMACTRL_RXD, 		S3C_GPIO_SLP_INPUT);  
		s3c_gpio_slp_setpull_updown(GPIO_CDMACTRL_RXD, S3C_GPIO_PULL_UP);
		s3c_gpio_cfgpin(GPIO_CDMACTRL_TXD, S3C_GPIO_SFN(GPIO_CDMACTRL_TXD_AF));
		s3c_gpio_setpull(GPIO_CDMACTRL_TXD, S3C_GPIO_PULL_UP);
    	}
}
示例#2
0
s3c_setup_keypad_cfg_gpio_sleep(int rows, int columns)
{
	unsigned int gpio;
	unsigned int end;

	/* set KBR */
	end = S5PV210_GPH3(rows);
	for (gpio = S5PV210_GPH3(0); gpio < end; gpio++) {
		s3c_gpio_cfgpin(gpio, S3C_GPIO_INPUT);
		s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE);
	}

	/* set KBC */
	/* KEYPAD SCAN/COLUMN */
	columns -= 2 ;	/* except scan[6~7] */
	end = S5PV210_GPH2(columns);
	for (gpio = S5PV210_GPH2(0); gpio < end; gpio++) {
		s3c_gpio_cfgpin(gpio, S3C_GPIO_INPUT);
		s3c_gpio_setpull(gpio, S3C_GPIO_PULL_UP);
	}

	
	s3c_gpio_slp_cfgpin(GPIO_KEYSCAN6, S3C_GPIO_SLP_OUT1);
	s3c_gpio_slp_setpull_updown(GPIO_KEYSCAN6, S3C_GPIO_PULL_NONE);

	s3c_gpio_slp_cfgpin(GPIO_KEYSCAN7, S3C_GPIO_SLP_OUT1);
	s3c_gpio_slp_setpull_updown(GPIO_KEYSCAN7, S3C_GPIO_PULL_NONE);

}
示例#3
0
void s3c_config_gpio_table(int array_size, int (*gpio_table)[6])
{
	u32 i, gpio;

	pr_debug("%s: ++\n", __func__);
	for (i = 0; i < array_size; i++) {
		gpio = gpio_table[i][0];
		if (gpio < S3C64XX_GPIO_ALIVE_PART_BASE) { /* Off Part */
			pr_debug("%s: Off gpio=%d,%d\n", __func__, gpio, 
					S3C64XX_GPIO_ALIVE_PART_BASE);
			s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(gpio_table[i][1]));
			s3c_gpio_setpull(gpio, gpio_table[i][3]);
			s3c_gpio_slp_cfgpin(gpio, gpio_table[i][4]);
			s3c_gpio_slp_setpull_updown(gpio, gpio_table[i][5]);
			if (gpio_table[i][2] != GPIO_LEVEL_NONE)
				gpio_set_value(gpio, gpio_table[i][2]);
		} else if (gpio < S3C64XX_GPIO_MEM_PART_BASE) { /* Alive Part */
			pr_debug("%s: Alive gpio=%d\n", __func__, gpio);
			s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(gpio_table[i][1]));
			s3c_gpio_setpull(gpio, gpio_table[i][3]);
			if (gpio_table[i][2] != GPIO_LEVEL_NONE)
				gpio_set_value(gpio, gpio_table[i][2]);
		} else { /* Memory Part */
			pr_debug("%s: Memory gpio=%d\n", __func__, gpio);
			s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(gpio_table[i][1]));
			s3c_gpio_setpull(gpio, gpio_table[i][3]);
			s3c_gpio_slp_cfgpin(gpio, gpio_table[i][4]);
			s3c_gpio_slp_setpull_updown(gpio, gpio_table[i][5]);
			if (gpio_table[i][2] != GPIO_LEVEL_NONE)
				gpio_set_value(gpio, gpio_table[i][2]);
		}
	}
	pr_debug("%s: --\n", __func__);
}
示例#4
0
static int lcd_power_on(void *ld, int enable)
{
	int ret = 0;

	pr_info("%s: enable=%d\n", __func__, enable);

#ifdef CONFIG_FB_SUPPORT_ALPM
	if (enable) {
		if (get_alpm_mode()) {
			pr_info("%s : skip lcd power on : alpm mode : on\n", __func__);
			alpm_status = LCD_STATUS_ALPM_LCD_ON;
		} else {
			pr_info("%s : panel on\n", __func__);
			if (alpm_status == LCD_STATUS_OFF) {
				pr_info("%s power on include reset\n", __func__);
				ret = s6e63j0x03_power_on();
				reset_lcd();
			} else if (alpm_status == LCD_STATUS_KNOWN) {
				pr_info("%s power on not include reset\n", __func__);
				ret = s6e63j0x03_power_on();
			}
			alpm_status = LCD_STATUS_ON;
		}

	} else {
		if (get_alpm_mode()) {
			pr_info("%s : skip lcd power off : alpm mode : on\n", __func__);
			alpm_status = LCD_STATUS_ALPM_LCD_OFF;
			/*To keep high in sleep mode when alpm on */
			s3c_gpio_slp_cfgpin(GPIO_MLCD_RST, S3C_GPIO_SLP_OUT1);
			s3c_gpio_slp_setpull_updown(GPIO_MLCD_RST, S3C_GPIO_PULL_NONE);
		} else {
			pr_info("%s : panel off\n", __func__);
			ret = s6e63j0x03_power_off();
			s3c_gpio_slp_cfgpin(GPIO_MLCD_RST, S3C_GPIO_SLP_INPUT);
			s3c_gpio_slp_setpull_updown(GPIO_MLCD_RST, S3C_GPIO_PULL_DOWN);
			alpm_status = LCD_STATUS_OFF;
		}
	}
#else
	if (enable)
		ret = s6e63j0x03_power_on();
	else
		ret = s6e63j0x03_power_off();
#endif

	return ret;
}
示例#5
0
int mic_set_path(int path)
{
	/* NLAS3158 - H : MAIN, L : SUB */
	if (path == AK4671_MIC_PATH_MAIN) {
		P("MIC PATH : MAIN(1)");
		gpio_set_value(GPIO_MIC_SEL, 1);
		s3c_gpio_slp_cfgpin(GPIO_MIC_SEL, S3C_GPIO_SLP_OUT1);
		s3c_gpio_slp_setpull_updown(GPIO_MIC_SEL, S3C_GPIO_PULL_NONE);
	} else {
		P("MIC PATH : SUB(0)");
		gpio_set_value(GPIO_MIC_SEL, 0);
		s3c_gpio_slp_cfgpin(GPIO_MIC_SEL, S3C_GPIO_SLP_OUT0);
		s3c_gpio_slp_setpull_updown(GPIO_MIC_SEL, S3C_GPIO_PULL_NONE);
	}

	return 0;
}
示例#6
0
static void config_sleep_gpio_table(int array_size,
				    unsigned int (*gpio_table)[3])
{
	u32 i, gpio;

	for (i = 0; i < array_size; i++) {
		gpio = gpio_table[i][0];
		s3c_gpio_slp_cfgpin(gpio, gpio_table[i][1]);
		s3c_gpio_slp_setpull_updown(gpio, gpio_table[i][2]);
	}
}
示例#7
0
static int __init aries_init_touchkey_led(void)
{
	int i;
	int ret = 0;
	u32 gpio;

    down(&i2c_sem);

	if (!machine_is_aries() || !aries_is_tft_dev())
		return 0;

	for (i = 0; i < ARRAY_SIZE(led_gpios); i++) {
		gpio = S5PV210_GPJ3(led_gpios[i]);
		ret = gpio_request(gpio, "touchkey led");
		if (ret) {
			pr_err("Failed to request touchkey led gpio %d\n", i);
			goto err_req;
		}
        s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE);
        s3c_gpio_slp_cfgpin(gpio, S3C_GPIO_SLP_PREV);
        s3c_gpio_slp_setpull_updown(gpio, S3C_GPIO_PULL_NONE);
	}

	aries_touchkey_led_onoff(1);

	register_early_suspend(&early_suspend);

#ifdef CONFIG_BLD
  register_bld_implementation(&aries_touchkey_bld);
#endif


	if (misc_register(&bl_led_device))
		printk("%s misc_register(%s) failed\n", __FUNCTION__, bl_led_device.name);
	else {
		if (sysfs_create_group(&bl_led_device.this_device->kobj, &bl_led_group) < 0)
            pr_err("failed to create sysfs group for device %s\n", bl_led_device.name);
	}

    /* Initialize wake locks */
    wake_lock_init(&sBlinkWakeLock, WAKE_LOCK_SUSPEND, "blink_wake");

    setup_timer(&blink_timer, blink_timer_callback, 0);

    up(&i2c_sem);
	return 0;

err_req:
	while (--i >= 0)
		gpio_free(S5PV210_GPJ3(led_gpios[i]));
    up(&i2c_sem);
	return ret;
}
示例#8
0
BOOLEAN hwGPIOInit(void)
{
	ENTER;
	
	// Init each pin -> set function and pull disable
	s3c_gpio_cfgpin(WIMAX_WAKEUP, S3C_GPIO_SFN(1));	// set MEM0 interface
	s3c_gpio_setpull(WIMAX_WAKEUP, S3C_GPIO_PULL_NONE);

	s3c_gpio_cfgpin(WIMAX_IF_MODE0, S3C_GPIO_SFN(1));
	s3c_gpio_setpull(WIMAX_IF_MODE0, S3C_GPIO_PULL_NONE);

	s3c_gpio_cfgpin(WIMAX_IF_MODE1, S3C_GPIO_SFN(1));
	s3c_gpio_setpull(WIMAX_IF_MODE1, S3C_GPIO_PULL_NONE);
	gpio_set_value(WIMAX_IF_MODE1, GPIO_LEVEL_LOW);
	
	s3c_gpio_cfgpin(WIMAX_CON0, S3C_GPIO_INPUT);
	s3c_gpio_setpull(WIMAX_CON0, S3C_GPIO_PULL_NONE);

	s3c_gpio_cfgpin(WIMAX_CON2, S3C_GPIO_SFN(1));
	s3c_gpio_setpull(WIMAX_CON2, S3C_GPIO_PULL_NONE);
	gpio_set_value(WIMAX_CON2, GPIO_LEVEL_HIGH);	// the other PDA active for cmc730 int.

	// WIMAX_INT set Input and Pull up
	s3c_gpio_cfgpin(WIMAX_INT, S3C_GPIO_INPUT);
	s3c_gpio_setpull(WIMAX_INT, S3C_GPIO_PULL_NONE);

	// Set Interface
	hwSetInterface();

	// PDA Active
	s3c_gpio_cfgpin(WIMAX_CON1, S3C_GPIO_OUTPUT);
	s3c_gpio_setpull(WIMAX_CON1, S3C_GPIO_PULL_NONE);
	gpio_set_value(WIMAX_CON1, GPIO_LEVEL_HIGH);

	// gpio sleep status
	s3c_gpio_slp_cfgpin(WIMAX_WAKEUP, S3C_GPIO_SLP_PREV);
	s3c_gpio_slp_setpull_updown(WIMAX_WAKEUP, S3C_GPIO_PULL_NONE);

	s3c_gpio_slp_cfgpin(WIMAX_IF_MODE0, S3C_GPIO_SLP_PREV);
	s3c_gpio_slp_setpull_updown(WIMAX_IF_MODE0, S3C_GPIO_PULL_NONE);

	s3c_gpio_slp_cfgpin(WIMAX_IF_MODE1, S3C_GPIO_SLP_PREV);		// not used
	s3c_gpio_slp_setpull_updown(WIMAX_IF_MODE1, S3C_GPIO_PULL_NONE);

	s3c_gpio_slp_cfgpin(WIMAX_CON0, S3C_GPIO_SLP_PREV);
	s3c_gpio_slp_setpull_updown(WIMAX_CON0, S3C_GPIO_PULL_NONE);

	s3c_gpio_slp_cfgpin(WIMAX_CON1, S3C_GPIO_SLP_OUT0);	// PDA Active low
	s3c_gpio_slp_setpull_updown(WIMAX_CON1, S3C_GPIO_PULL_NONE);

	s3c_gpio_slp_cfgpin(WIMAX_CON2, S3C_GPIO_SLP_OUT0);	// Active Low PDA sleep int. (Make modem goes to idle or VI)
	s3c_gpio_slp_setpull_updown(WIMAX_CON2, S3C_GPIO_PULL_NONE);

	LEAVE;
	return TRUE;
}
static int cdma_manager_suspend(struct platform_device *dev, pm_message_t state) {

	printk("cdma suspend,disable cdma power\n");
	mx100_cdma_sleep(0);//not used now
	//ril_set_wakeup(0); 
	
	//s3c_setup_cdmauart_cfg_gpio(1);
	//s3c_setup_cdmauart_cfg_gpio(3);
        
   	s3c_gpio_slp_cfgpin(GPIO_CDMA_RESET_OUT, S3C_GPIO_SLP_OUT1);  
	s3c_gpio_slp_setpull_updown(GPIO_CDMA_RESET_OUT, S3C_GPIO_PULL_NONE);

	printk("__%s done \n", __func__);
	msleep(100);		
	return 0;
}
void bt_uart_rts_ctrl(int flag)
{
	if (!gpio_get_value(GPIO_BT_EN))
		return;
	if (flag) {
		/* BT RTS Set to HIGH */
		s3c_gpio_cfgpin(EXYNOS4_GPA0(3), S3C_GPIO_OUTPUT);
		s3c_gpio_setpull(EXYNOS4_GPA0(3), S3C_GPIO_PULL_NONE);
		gpio_set_value(EXYNOS4_GPA0(3), 1);
		s3c_gpio_slp_cfgpin(EXYNOS4_GPA0(3), S3C_GPIO_SLP_OUT0);
		s3c_gpio_slp_setpull_updown(EXYNOS4_GPA0(3), S3C_GPIO_PULL_NONE);
	} else {
		/* BT RTS Set to LOW */
		s3c_gpio_cfgpin(EXYNOS4_GPA0(3), S3C_GPIO_OUTPUT);
		gpio_set_value(EXYNOS4_GPA0(3), 0);
		s3c_gpio_cfgpin(EXYNOS4_GPA0(3), S3C_GPIO_SFN(2));
		s3c_gpio_setpull(EXYNOS4_GPA0(3), S3C_GPIO_PULL_NONE);
	}
}
示例#11
0
void gt3_config_sleep_gpio_table(void)
{
	int i;
	int index = min(ARRAY_SIZE(gt3_sleep_table), system_rev + 1);

	for (i = 0; i < index; i++) {
		if (gt3_sleep_table[i].ptr == NULL)
			continue;

		config_sleep_gpio_table(gt3_sleep_table[i].size,
				gt3_sleep_table[i].ptr);
	}
#if defined(CONFIG_TARGET_TAB3_WIFI8) || defined(CONFIG_TARGET_TAB3_3G8) || \
	defined(CONFIG_TARGET_TAB3_LTE8)
	if (system_rev > 5) {
		s3c_gpio_slp_cfgpin(EXYNOS4_GPX1(4), S3C_GPIO_INPUT);
		s3c_gpio_slp_setpull_updown(EXYNOS4_GPX1(4), S3C_GPIO_PULL_DOWN);
	}
#endif
}
static void config_sleep_gpio_table(int array_size,
				    unsigned int (*gpio_table)[3])
{
	u32 i, gpio;

	for (i = 0; i < array_size; i++) {
		gpio = gpio_table[i][0];
		s3c_gpio_slp_cfgpin(gpio, gpio_table[i][1]);
		s3c_gpio_slp_setpull_updown(gpio, gpio_table[i][2]);
	}

	/* GPX GPIO setting */
	s3c_gpio_cfgpin(EXYNOS4_GPX1(7), S3C_GPIO_INPUT);
	s3c_gpio_setpull(EXYNOS4_GPX1(7), S3C_GPIO_PULL_DOWN);

#if defined(CONFIG_MACH_Q1_CMCC_BD)
	s3c_gpio_cfgpin(EXYNOS4_GPX0(5), S3C_GPIO_OUTPUT);
	s3c_gpio_setpull(EXYNOS4_GPX0(5), S3C_GPIO_PULL_NONE);
	gpio_set_value(EXYNOS4_GPX0(5), GPIO_LEVEL_LOW);
#endif
}
static int __init herring_init_touchkey_led(void)
{
	int i;
	int ret = 0;
	u32 gpio;

	if (!machine_is_herring() || !herring_is_tft_dev())
		return 0;

	for (i = 0; i < ARRAY_SIZE(led_gpios); i++) {
		gpio = S5PV210_GPJ3(led_gpios[i]);
		ret = gpio_request(gpio, "touchkey led");
		if (ret) {
			pr_err("Failed to request touchkey led gpio %d\n", i);
			goto err_req;
		}
		s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE);
		s3c_gpio_slp_cfgpin(gpio, S3C_GPIO_SLP_PREV);
		s3c_gpio_slp_setpull_updown(gpio, S3C_GPIO_PULL_NONE);
	}

	herring_touchkey_led_onoff(1);

	register_early_suspend(&early_suspend);

#ifdef CONFIG_GENERIC_BLN
	register_bln_implementation(&herring_touchkey_bln);
#endif

#ifdef CONFIG_BLD
	register_bld_implementation(&herring_touchkey_bld);
#endif

	return 0;

err_req:
	while (--i >= 0)
		gpio_free(S5PV210_GPJ3(led_gpios[i]));
	return ret;
}
void bt_uart_rts_ctrl(int flag)
{
	if(!gpio_get_value(GPIO_BT_nRST))
		return;

	if(flag) {
		// BT RTS Set to HIGH
		s3c_gpio_cfgpin(S5PV210_GPA0(3), S3C_GPIO_OUTPUT);
		s3c_gpio_setpull(S5PV210_GPA0(3), S3C_GPIO_PULL_NONE);
		gpio_set_value(S5PV210_GPA0(3), 1);

                s3c_gpio_slp_cfgpin(S5PV210_GPA0(3), S3C_GPIO_SLP_OUT0);
		s3c_gpio_slp_setpull_updown(S5PV210_GPA0(3), S3C_GPIO_PULL_NONE);
	}
	else {
		// BT RTS Set to LOW
		s3c_gpio_cfgpin(S5PV210_GPA0(3), S3C_GPIO_OUTPUT);
		gpio_set_value(S5PV210_GPA0(3), 0);

		s3c_gpio_cfgpin(S5PV210_GPA0(3), S3C_GPIO_SFN(2));
		s3c_gpio_setpull(S5PV210_GPA0(3), S3C_GPIO_PULL_NONE);
	}
}
示例#15
0
BOOLEAN hwGPIODeInit()
{
	ENTER;
	
	// Init each pin -> set function output, low, and pull disable
	s3c_gpio_cfgpin(WIMAX_WAKEUP, S3C_GPIO_SFN(1));
	gpio_set_value(WIMAX_WAKEUP, GPIO_LEVEL_LOW);	
	s3c_gpio_setpull(WIMAX_WAKEUP, S3C_GPIO_PULL_NONE);

	s3c_gpio_cfgpin(WIMAX_IF_MODE0, S3C_GPIO_SFN(1));
	gpio_set_value(WIMAX_IF_MODE0, GPIO_LEVEL_LOW);	
	s3c_gpio_setpull(WIMAX_IF_MODE0, S3C_GPIO_PULL_NONE);

	s3c_gpio_cfgpin(WIMAX_IF_MODE1, S3C_GPIO_SFN(1));
	gpio_set_value(WIMAX_IF_MODE1, GPIO_LEVEL_LOW);	
	s3c_gpio_setpull(WIMAX_IF_MODE1, S3C_GPIO_PULL_NONE);
	
	s3c_gpio_cfgpin(WIMAX_CON0, S3C_GPIO_SFN(1));
	gpio_set_value(WIMAX_CON0, GPIO_LEVEL_LOW);	
	s3c_gpio_setpull(WIMAX_CON0, S3C_GPIO_PULL_NONE);

	s3c_gpio_cfgpin(WIMAX_CON1, S3C_GPIO_SFN(1));
	gpio_set_value(WIMAX_CON1, GPIO_LEVEL_LOW);	
	s3c_gpio_setpull(WIMAX_CON1, S3C_GPIO_PULL_NONE);

	s3c_gpio_cfgpin(WIMAX_CON2, S3C_GPIO_SFN(1));
	gpio_set_value(WIMAX_CON2, GPIO_LEVEL_LOW);	
	s3c_gpio_setpull(WIMAX_CON2, S3C_GPIO_PULL_NONE);

	s3c_gpio_setpull(WIMAX_INT, S3C_GPIO_PULL_NONE);
	gpio_set_value(WIMAX_INT, GPIO_LEVEL_LOW);	
	s3c_gpio_cfgpin(WIMAX_INT, S3C_GPIO_SFN(1));

	// gpio sleep status
	s3c_gpio_slp_cfgpin(WIMAX_WAKEUP, S3C_GPIO_SLP_OUT0);
	s3c_gpio_slp_setpull_updown(WIMAX_WAKEUP, S3C_GPIO_PULL_NONE);

	s3c_gpio_slp_cfgpin(WIMAX_IF_MODE0, S3C_GPIO_SLP_OUT0);
	s3c_gpio_slp_setpull_updown(WIMAX_IF_MODE0, S3C_GPIO_PULL_NONE);

	s3c_gpio_slp_cfgpin(WIMAX_IF_MODE1, S3C_GPIO_SLP_OUT0);		// not used
	s3c_gpio_slp_setpull_updown(WIMAX_IF_MODE1, S3C_GPIO_PULL_NONE);

	s3c_gpio_slp_cfgpin(WIMAX_CON0, S3C_GPIO_SLP_OUT0);
	s3c_gpio_slp_setpull_updown(WIMAX_CON0, S3C_GPIO_PULL_NONE);

	s3c_gpio_slp_cfgpin(WIMAX_CON1, S3C_GPIO_SLP_OUT0);	// PDA Active low
	s3c_gpio_slp_setpull_updown(WIMAX_CON1, S3C_GPIO_PULL_NONE);

	s3c_gpio_slp_cfgpin(WIMAX_CON2, S3C_GPIO_SLP_OUT0);	// not used
	s3c_gpio_slp_setpull_updown(WIMAX_CON2, S3C_GPIO_PULL_NONE);

	// wimax_i2c_con
	if (system_rev < 8)
	{
		s3c_gpio_cfgpin(I2C_SEL, S3C_GPIO_SFN(1));
		gpio_set_value(I2C_SEL, GPIO_LEVEL_LOW);			// active path to cmc730
		s3c_gpio_slp_cfgpin(I2C_SEL, S3C_GPIO_SLP_OUT1);	// suspend path to ap
	}
	else
	{
		s3c_gpio_cfgpin(I2C_SEL, S3C_GPIO_SFN(1));
		gpio_set_value(I2C_SEL, GPIO_LEVEL_HIGH);			// active path to cmc730
		s3c_gpio_slp_cfgpin(I2C_SEL, S3C_GPIO_SLP_OUT0);	// suspend path to ap
	}

	LEAVE;
	return TRUE;
}
示例#16
0
static int s5pc11x_pm_enter(suspend_state_t state)
{
    unsigned long regs_save[16];
    unsigned int tmp;


#ifdef CONFIG_HAS_WAKELOCK
    //wake_unlock(&pm_wake_lock);
#endif

    /* ensure the debug is initialised (if enabled) */
    DBG("s5pc11x_pm_enter(%d)\n", state);

    if (pm_cpu_prep == NULL || pm_cpu_sleep == NULL) {
        printk(KERN_ERR PFX "error: no cpu sleep functions set\n");
        return -EINVAL;
    }

#ifdef CONFIG_CPU_FREQ
    s5pc110_pm_target(BOOT_ARM_CLK);
#endif

    /* store the physical address of the register recovery block */
    s5pc110_sleep_save_phys = virt_to_phys(regs_save);

    DBG("s5pc11x_sleep_save_phys=0x%08lx\n", s5pc110_sleep_save_phys);

    s5pc11x_pm_do_save(gpio_save, ARRAY_SIZE(gpio_save));
#ifdef S5PC11X_ALIVEGPIO_STORE
    s5pc11x_pm_do_save(gpio_save_alive, ARRAY_SIZE(gpio_save_alive));
#endif
    s5pc11x_pm_do_save(irq_save, ARRAY_SIZE(irq_save));
    s5pc11x_pm_do_save(core_save, ARRAY_SIZE(core_save));
    s5pc11x_pm_do_save(sromc_save, ARRAY_SIZE(sromc_save));
    s5pc11x_pm_do_save(uart_save, ARRAY_SIZE(uart_save));


    /* ensure INF_REG0  has the resume address */
    __raw_writel(virt_to_phys(s5pc110_cpu_resume), S5P_INFORM0);

    /* call cpu specific preperation */
    pm_cpu_prep();

    /* flush cache back to ram */
    flush_cache_all();

#if 0		// To preserve 24MHz clock.
    /* USB & OSC Clock pad Enable */
    tmp = __raw_readl(S5P_SLEEP_CFG);
    //tmp |= (S5P_SLEEP_CFG_OSC_EN | S5P_SLEEP_CFG_USBOSC_EN);
    tmp &= ~(S5P_SLEEP_CFG_OSC_EN | S5P_SLEEP_CFG_USBOSC_EN);
    __raw_writel(tmp , S5P_SLEEP_CFG);
#endif
    __raw_writel(0xffffffff , S5P_EINT_WAKEUP_MASK);

    /* Power mode Config setting */
    tmp = __raw_readl(S5P_PWR_CFG);
    tmp &= S5P_CFG_WFI_CLEAN;
    tmp |= S5P_CFG_WFI_SLEEP;
    __raw_writel(tmp,S5P_PWR_CFG);

    if (!hw_version_check()) {
        /* Set wakeup mask regsiter */
        __raw_writel(0xFFED, S5P_WAKEUP_MASK);
    } else {
        __raw_writel(0xFFFD, S5P_WAKEUP_MASK); //0xFFFD:, RTC_ALARM
//		__raw_writel(0xFFDD, S5P_WAKEUP_MASK); //0xFFDD:key, RTC_ALARM
    }

    __raw_writel(0xffffffff, S5PC110_VIC0REG(VIC_INT_ENABLE_CLEAR));
    __raw_writel(0xffffffff, S5PC110_VIC1REG(VIC_INT_ENABLE_CLEAR));
    __raw_writel(0xffffffff, S5PC110_VIC2REG(VIC_INT_ENABLE_CLEAR));
    __raw_writel(0xffffffff, S5PC110_VIC3REG(VIC_INT_ENABLE_CLEAR));
    __raw_writel(0xffffffff, S5PC110_VIC0REG(VIC_INT_SOFT_CLEAR));
    __raw_writel(0xffffffff, S5PC110_VIC1REG(VIC_INT_SOFT_CLEAR));
    __raw_writel(0xffffffff, S5PC110_VIC2REG(VIC_INT_SOFT_CLEAR));
    __raw_writel(0xffffffff, S5PC110_VIC3REG(VIC_INT_SOFT_CLEAR));

    /* SYSC INT Disable */
    tmp = __raw_readl(S5P_OTHERS);
    tmp |= (S5P_OTHER_SYSC_INTOFF);
    __raw_writel(tmp,S5P_OTHERS);

    /* Clear WAKEUP_STAT register for next wakeup */
    tmp = __raw_readl(S5P_WAKEUP_STAT);
    __raw_writel(tmp, S5P_WAKEUP_STAT);

    /* Wake up source setting */
    //s5pc11x_pm_configure_extint();

    // key pad direction control for evt0
    //s5pc11x_set_keypad_sleep_gpio();

    /*Set EINT 22 as wake up source*/

    //hojun_kim 100526 [
    if(system_rev >= 0x08)
    {
        s5pc11x_pm_set_eint(5, 0x4); //Hall SW
    }
    //hojun_kim ]

    s5pc11x_pm_set_eint(11, 0x2);
    s5pc11x_pm_set_eint(22, 0x2);
//	s5pc11x_pm_set_eint(21, 0x4);
    s5pc11x_pm_set_eint(7,  0x02);		//PMIC
    s5pc11x_pm_set_eint(6, 0x4); //det_3.5
    s5pc11x_pm_set_eint(30, 0x4); //suik_Fix 	//short_sendend pin
    s5pc11x_pm_set_eint(4, 0x4);


    if(system_rev >= 0x08) //seonha
    {
        s5pc11x_pm_set_eint(2, 0x4); //suik_Fix 	//open_sendend pin
    }

    if(gp2a_get_proximity_enable())
    {
        if(system_rev >= 0x0A) //jihyon.82.kim for victory rev 10
        {
            s5pc11x_pm_set_eint(1, 0x4);
        }
    }

    s5pc11x_pm_set_eint(3, 0x3);//WiFi SecFeature.Victory
    s5pc11x_pm_set_eint(23, 0x2);//microusb.. 20100517_inchul

    //gpio key
//	if(HWREV >= 0xB)
//	{
    s5pc11x_pm_set_eint(24, 0x4);
    s5pc11x_pm_set_eint(25, 0x4);
//	}

    if (!hw_version_check()) {
        /*Set keypad as EINT for EVT0 wake up workaround*/
        s5pc11x_pm_set_eint(24, 0x2);
        s5pc11x_pm_set_eint(25, 0x2);
        s5pc11x_pm_set_eint(26, 0x2);
        s5pc11x_pm_set_eint(27, 0x2);

        /*Column pull down enabled*/
        tmp = readl(S5PC11X_GPH2PUD);
        tmp &= ~(0xFF);
        tmp |= 0x55;
        writel(tmp, S5PC11X_GPH2PUD);
    }

#if 1	//cky 20100416 WiMAX ext-interrupt
    if (gpio_get_value(GPIO_WIMAX_EN))
    {
        DBG("WIMAX POWER ON!! Set WIMAX_INT as Ext-Int.\n");
        s5pc11x_pm_set_eint(14, 0x0);	// WIMAX_INT: GPH1(6); LOW LEVEL DETECT
    }
#endif

    s3c_config_sleep_gpio();

    s3c_gpio_slp_cfgpin(S5PC11X_MP03(3),  S3C_GPIO_SLP_OUT0);
    s3c_gpio_slp_setpull_updown(S5PC11X_MP03(3),  S3C_GPIO_SLP_OUT0);
#if 0
    tmp = __raw_readl(S5P_OTHERS);
    tmp &= ~(3 << 8);
    tmp |= (3 << 8);
    __raw_writel(tmp, S5P_OTHERS);

    __raw_writel(0,S5P_MIE_CONTROL);
    __raw_writel(0,S5P_HDMI_CONTROL);
    __raw_writel(0,S5P_USB_PHY_CONTROL);
    __raw_writel(0,S5P_DAC_CONTROL);
    __raw_writel(0,S5P_MIPI_PHY_CONTROL);
    __raw_writel(0,S5P_ADC_CONTROL);
    __raw_writel(0,S5P_PSHOLD_CONTROL);
#endif

#if (!(defined CONFIG_ARIES_VER_B0) && !(defined CONFIG_ARIES_VER_B4) && !(defined CONFIG_ARIES_VER_B5))
// Enable PS_HOLD pin to avoid reset failure */
    __raw_writel((0x5 << 12 | 0x1<<9 | 0x1<<8 | 0x1<<0),S5P_PSHOLD_CONTROL);
#endif

    /* s5pc11x_cpu_save will also act as our return point from when
     * we resume as it saves its own register state, so use the return
     * code to differentiate return from save and return from sleep */

    if (s5pc110_cpu_save(regs_save) == 0) {
        flush_cache_all();
        if (!hw_version_check()) {
            /* This function for Chip bug on EVT0 */
            tmp = __raw_readl(S5P_EINT_WAKEUP_MASK + 4); //PWR_MODE
            tmp |= (1 << 2);
            __raw_writel(tmp , S5P_EINT_WAKEUP_MASK + 4);
            // end mod
        }
        pm_cpu_sleep();
    }

    /* restore the cpu state */
    cpu_init();

#ifdef __DEBUG_PRINT_EINT_WAKEUP_STATUS
    int eintcon[4],eintmask[4],eintpend[4];
    int eint_wakeup_mask;
    int i;

    for(i=0; i<4; i++) {
        eint_wakeup_mask = readl(S5P_EINT_WAKEUP_MASK);
        eintcon[i] = __raw_readl(S5PC11X_EINTCON(i));
        eintmask[i] = __raw_readl(S5PC11X_EINTMASK(i));
        eintpend[i] = __raw_readl(S5PC11X_EINTPEND(i));
    }
#endif

    s5pc11x_pm_do_restore(gpio_save, ARRAY_SIZE(gpio_save));
#ifdef S5PC11X_ALIVEGPIO_STORE
    s5pc11x_pm_do_restore_alive(gpio_save_alive, ARRAY_SIZE(gpio_save_alive));
#endif
    s5pc11x_pm_do_restore(irq_save, ARRAY_SIZE(irq_save));
    __raw_writel(0x0, S3C24XX_VA_UART2+S3C2410_UCON);
    __raw_writel(0xf, S3C24XX_VA_UART2+S5P_UINTP);
    __raw_writel(0xf, S3C24XX_VA_UART2+S5P_UINTSP);
    __raw_writel(0xf, S3C24XX_VA_UART2+S5P_UINTM);

    /*		Temporary workaround to protect lockup by UART	- 20100316	*/
    __raw_writel(0x0, S3C24XX_VA_UART3+S3C2410_UCON);
    __raw_writel(0xf, S3C24XX_VA_UART3+S5P_UINTM);
    __raw_writel(0xf, S3C24XX_VA_UART3+S5P_UINTSP);
    __raw_writel(0xf, S3C24XX_VA_UART3+S5P_UINTP);
    __raw_writel(0x0, S3C24XX_VA_UART2+S3C2410_UCON);
    __raw_writel(0xf, S3C24XX_VA_UART2+S5P_UINTM);
    __raw_writel(0xf, S3C24XX_VA_UART2+S5P_UINTSP);
    __raw_writel(0xf, S3C24XX_VA_UART2+S5P_UINTP);
    __raw_writel(0x0, S3C24XX_VA_UART1+S3C2410_UCON);
    __raw_writel(0xf, S3C24XX_VA_UART1+S5P_UINTM);
    __raw_writel(0xf, S3C24XX_VA_UART1+S5P_UINTSP);
    __raw_writel(0xf, S3C24XX_VA_UART1+S5P_UINTP);
    __raw_writel(0x0, S3C24XX_VA_UART0+S3C2410_UCON);
    __raw_writel(0xf, S3C24XX_VA_UART0+S5P_UINTM);
    __raw_writel(0xf, S3C24XX_VA_UART0+S5P_UINTSP);
    __raw_writel(0xf, S3C24XX_VA_UART0+S5P_UINTP);


    s5pc11x_pm_do_restore(uart_save, ARRAY_SIZE(uart_save));
    s5pc11x_pm_do_restore(core_save, ARRAY_SIZE(core_save));
    s5pc11x_pm_do_restore(sromc_save, ARRAY_SIZE(sromc_save));

    /*enable gpio, uart, mmc*/
    tmp = __raw_readl(S5P_OTHERS);
#if ((defined CONFIG_ARIES_VER_B0) || (defined CONFIG_ARIES_VER_B4) || (defined CONFIG_ARIES_VER_B5))
    tmp |= (1<<31) | (1<<28) | (1<<29);
#else
    tmp |= (1<<31) | (0x1<<30) | (1<<28) | (1<<29);
#endif
    __raw_writel(tmp, S5P_OTHERS);

    /* EINT22 Pending clear */
    //s5pc11x_pm_clear_eint(22); //<= do action in s3c-keypad.c
//	s5pc11x_pm_clear_eint(21);
    if (!hw_version_check()) {
        // for evt 0 keypad wakeup workaround
        s5pc11x_pm_clear_eint(24);
        s5pc11x_pm_clear_eint(25);
        s5pc11x_pm_clear_eint(26);
        s5pc11x_pm_clear_eint(27);
        s5pc11x_pm_clear_eint(21);
        s5pc11x_pm_clear_eint(20);
    } else {
        /* Clear WAKEUP_STAT register for next wakeup */
        tmp = __raw_readl(S5P_WAKEUP_STAT);
        __raw_writel(tmp, S5P_WAKEUP_STAT);
#if 0
        /* 	This is for LCD wakeup if key is pressed		*/
        tmp=(unsigned int)S5PC11X_EINTPEND(3);
        tmp &= 0x07;
        printk("wakeup source is 0x%x  \n", tmp);
        if (tmp)
            key_wakeup_state=1;
        else
            key_wakeup_state=0;
        writel(tmp, S5PC11X_EINTPEND(3));
#else
        printk("wakeup source is 0x%x  \n", tmp);
#endif
    }

#ifdef __DEBUG_PRINT_EINT_WAKEUP_STATUS
    // if woken up by external interrupt print eint registers
    if(tmp&0x1) {
        printk("EINT_WAKEUP_MASK(%08X)\n", eint_wakeup_mask);
        for(i=0; i<4; i++) {
            printk("EINT%dCON(%08X) EINT%dMASK(%08X) EINT%dPEND(%08X)\n"
                   ,i,eintcon[i]
                   ,i,eintmask[i]
                   ,i,eintpend[i]);
        }
    }
#endif

#if 1	//cky 20100513 ext-int for wimax
    if (gpio_get_value(GPIO_WIMAX_EN))
    {
        DBG("WIMAX POWER ON!! Set WIMAX_INT: INPUT.\n");
        s5pc11x_pm_clear_eint(14);

        s3c_gpio_cfgpin(GPIO_WIMAX_INT, S3C_GPIO_INPUT);
        s3c_gpio_setpull(GPIO_WIMAX_INT, S3C_GPIO_PULL_NONE);
    }
#endif

    DBG("\npost sleep, preparing to return 2\n");

    s5pc11x_pm_check_restore();

#ifdef CONFIG_HAS_WAKELOCK
    //wake_lock_timeout(&pm_wake_lock, 5 * HZ);
#endif

    /* ok, let's return from sleep */
    DBG("S5PC110 PM Resume (post-restore)\n");

    return 0;
}
示例#17
0
static int bluetooth_set_power(void *data, enum rfkill_state state)
{
    unsigned int ret = 0;
    switch (state) {

    case RFKILL_STATE_UNBLOCKED:
#ifdef CONFIG_MACH_INSTINCTQ
        printk("[BT] Device Powering ON \n");
#else
        printk(KERN_DEBUG "[BT] Device Powering ON \n");
#endif /* #ifdef CONFIG_MACH_INSTINCTQ */
        s3c_setup_uart_cfg_gpio(1);

        if (gpio_is_valid(GPIO_BT_WLAN_REG_ON))
        {
            ret = gpio_request(GPIO_BT_WLAN_REG_ON, S3C_GPIO_LAVEL(GPIO_BT_WLAN_REG_ON));
            if (ret < 0) {
#ifdef CONFIG_MACH_INSTINCTQ
                printk("[BT] Failed to request GPIO_BT_WLAN_REG_ON!\n");
#else
                printk(KERN_ERR "[BT] Failed to request GPIO_BT_WLAN_REG_ON!\n");
#endif /* #ifdef CONFIG_MACH_INSTINCTQ */
                return ret;
            }
            gpio_direction_output(GPIO_BT_WLAN_REG_ON, GPIO_LEVEL_HIGH);
        }

        if (gpio_is_valid(GPIO_BT_RST_N))
        {
            ret = gpio_request(GPIO_BT_RST_N, S3C_GPIO_LAVEL(GPIO_BT_RST_N));
            if (ret < 0) {
                gpio_free(GPIO_BT_WLAN_REG_ON);
#ifdef CONFIG_MACH_INSTINCTQ
                printk("[BT] Failed to request GPIO_BT_RST_N!\n");
#else
                printk(KERN_ERR "[BT] Failed to request GPIO_BT_RST_N!\n");
#endif /* #ifdef CONFIG_MACH_INSTINCTQ */
                return ret;
            }
            gpio_direction_output(GPIO_BT_RST_N, GPIO_LEVEL_LOW);
        }

        /* Set GPIO_BT_WLAN_REG_ON high */
        s3c_gpio_setpull(GPIO_BT_WLAN_REG_ON, S3C_GPIO_PULL_NONE);
        gpio_set_value(GPIO_BT_WLAN_REG_ON, GPIO_LEVEL_HIGH);

        s3c_gpio_slp_cfgpin(GPIO_BT_WLAN_REG_ON, S3C_GPIO_SLP_OUT1);
        s3c_gpio_slp_setpull_updown(GPIO_BT_WLAN_REG_ON, S3C_GPIO_PULL_NONE);

#ifdef CONFIG_MACH_INSTINCTQ
        printk("[BT] GPIO_BT_WLAN_REG_ON = %d\n", gpio_get_value(GPIO_BT_WLAN_REG_ON));

        mdelay(150);  // 100msec, delay  between reg_on & rst. (bcm4325 powerup sequence)
#else
        printk(KERN_DEBUG "[BT] GPIO_BT_WLAN_REG_ON = %d\n", gpio_get_value(GPIO_BT_WLAN_REG_ON));

        msleep(150);  // 100msec, delay  between reg_on & rst. (bcm4325 powerup sequence)
#endif /* #ifdef CONFIG_MACH_INSTINCTQ */



        /* Set GPIO_BT_RST_N high */
        s3c_gpio_setpull(GPIO_BT_RST_N, S3C_GPIO_PULL_NONE);
        gpio_set_value(GPIO_BT_RST_N, GPIO_LEVEL_HIGH);

        s3c_gpio_slp_cfgpin(GPIO_BT_RST_N, S3C_GPIO_SLP_OUT1);
        s3c_gpio_slp_setpull_updown(GPIO_BT_RST_N, S3C_GPIO_PULL_NONE);

#ifdef CONFIG_MACH_INSTINCTQ
        printk("[BT] GPIO_BT_RST_N = %d\n", gpio_get_value(GPIO_BT_RST_N));
#else
        printk(KERN_DEBUG "[BT] GPIO_BT_RST_N = %d\n", gpio_get_value(GPIO_BT_RST_N));
#endif /* #ifdef CONFIG_MACH_INSTINCTQ */

        gpio_free(GPIO_BT_RST_N);
        gpio_free(GPIO_BT_WLAN_REG_ON);

        break;

    case RFKILL_STATE_SOFT_BLOCKED:
#ifdef CONFIG_MACH_INSTINCTQ
        printk("[BT] Device Powering OFF \n");
#else
        printk(KERN_DEBUG "[BT] Device Powering OFF \n");
#endif /* #ifdef CONFIG_MACH_INSTINCTQ */
        s3c_reset_uart_cfg_gpio(1);

        s3c_gpio_setpull(GPIO_BT_RST_N, S3C_GPIO_PULL_NONE);
        gpio_set_value(GPIO_BT_RST_N, GPIO_LEVEL_LOW);

        s3c_gpio_slp_cfgpin(GPIO_BT_RST_N, S3C_GPIO_SLP_OUT0);
        s3c_gpio_slp_setpull_updown(GPIO_BT_RST_N, S3C_GPIO_PULL_NONE);
#ifdef CONFIG_MACH_INSTINCTQ
        printk("[BT] GPIO_BT_RST_N = %d\n",gpio_get_value(GPIO_BT_RST_N));
#else
        printk(KERN_DEBUG "[BT] GPIO_BT_RST_N = %d\n",gpio_get_value(GPIO_BT_RST_N));
#endif /* #ifdef CONFIG_MACH_INSTINCTQ */

        if(gpio_get_value(GPIO_WLAN_RST_N) == 0)
        {
            s3c_gpio_setpull(GPIO_BT_WLAN_REG_ON, S3C_GPIO_PULL_NONE);
            gpio_set_value(GPIO_BT_WLAN_REG_ON, GPIO_LEVEL_LOW);

            s3c_gpio_slp_cfgpin(GPIO_BT_WLAN_REG_ON, S3C_GPIO_SLP_OUT0);
            s3c_gpio_slp_setpull_updown(GPIO_BT_WLAN_REG_ON, S3C_GPIO_PULL_NONE);

#ifdef CONFIG_MACH_INSTINCTQ
            printk("[BT] GPIO_BT_WLAN_REG_ON = %d\n", gpio_get_value(GPIO_BT_WLAN_REG_ON));
#else
            printk(KERN_DEBUG "[BT] GPIO_BT_WLAN_REG_ON = %d\n", gpio_get_value(GPIO_BT_WLAN_REG_ON));
#endif /* #ifdef CONFIG_MACH_INSTINCTQ */
        }

        gpio_free(GPIO_BT_RST_N);
        gpio_free(GPIO_BT_WLAN_REG_ON);

        break;

    default:
        printk(KERN_ERR "[BT] Bad bluetooth rfkill state %d\n", state);
    }

    return 0;
}
示例#18
0
static int bluetooth_set_power(void *data, enum rfkill_user_states state)
{
	int ret = 0;
	int irq;
	/* BT Host Wake IRQ */
	irq = IRQ_WLAN_BT_HOST_WAKE;

	switch (state) {

	case RFKILL_USER_STATE_UNBLOCKED:
		printk("[BT] Device Powering ON \n");//pr_debug

		if (!loaded)
			break;

		/* Bluetooth over SDIO */
		m8_bt_power(1, sdio);
		msleep(100);
		if (sdio && m8_checkse())
			sdhci_s3c_force_presence_change(&s3c_device_hsmmc0);

		msleep(100);
		if (!sdio)
			s3c_setup_uart_cfg_gpio(1);
#if 0 // uart not work now

		if (gpio_is_valid(GPIO_WLAN_BT_EN)) {
			printk("[BT] gpio_is_valid(GPIO_WLAN_BT_EN)\n");
			gpio_direction_output(GPIO_WLAN_BT_EN, GPIO_LEVEL_HIGH);
			}

		if (gpio_is_valid(GPIO_BT_nRST)) {
			gpio_direction_output(GPIO_BT_nRST, GPIO_LEVEL_LOW);
						printk("[BT] gpio_is_valid(GPIO_BT_nRST)\n");
			}

		printk("[BT] GPIO_BT_nRST = %d\n",
				gpio_get_value(GPIO_BT_nRST));//pr_debug

		/* Set GPIO_BT_WLAN_REG_ON high */
		s3c_gpio_setpull(GPIO_WLAN_BT_EN, S3C_GPIO_PULL_NONE);
		gpio_set_value(GPIO_WLAN_BT_EN, GPIO_LEVEL_HIGH);

		s3c_gpio_slp_cfgpin(GPIO_WLAN_BT_EN, S3C_GPIO_SLP_OUT1);
		s3c_gpio_slp_setpull_updown(GPIO_WLAN_BT_EN,
				S3C_GPIO_PULL_NONE);

		printk("[BT] GPIO_WLAN_BT_EN = %d\n",
				gpio_get_value(GPIO_WLAN_BT_EN));
		/*
		 * FIXME sleep should be enabled disabled since the device is
		 * not booting if its enabled
		 */
		/*
		 * 100msec, delay between reg_on & rst.
		 * (powerup sequence)
		 */
		msleep(500);//100);

		/* Set GPIO_BT_nRST high */
		s3c_gpio_setpull(GPIO_BT_nRST, S3C_GPIO_PULL_NONE);
		gpio_set_value(GPIO_BT_nRST, GPIO_LEVEL_HIGH);

		s3c_gpio_slp_cfgpin(GPIO_BT_nRST, S3C_GPIO_SLP_OUT1);
		s3c_gpio_slp_setpull_updown(GPIO_BT_nRST, S3C_GPIO_PULL_NONE);

		printk("[BT] GPIO_BT_nRST = %d\n",
				gpio_get_value(GPIO_BT_nRST));//pr_debug

		/*
		 * 50msec, delay after bt rst
		 * (libertas powerup sequence)
		 */
		msleep(200);//50);

		//ret = enable_irq_wake(irq);
		//if (ret < 0)
		//	pr_err("[BT] set wakeup src failed\n");
#endif

		enable_irq(irq);
		break;

	case RFKILL_USER_STATE_SOFT_BLOCKED:
		printk("[BT] Device Powering OFF\n");

		if (!loaded)
			break;

		/* Bluetooth over SDIO */
		m8_bt_power(0, sdio);
		msleep(100);
		if (sdio && m8_checkse())
			sdhci_s3c_force_presence_change(&s3c_device_hsmmc0);

		//if (!sdio)
		//	s3c_reset_uart_cfg_gpio(1);

		//ret = disable_irq_wake(irq);
		//if (ret < 0)
		//	pr_err("[BT] unset wakeup src failed\n");

		disable_irq(irq);
		wake_unlock(&rfkill_wake_lock);
		printk("[BT] wake_unlock rfkill_wake_lock\n");

#if 0 // UART
		s3c_gpio_setpull(GPIO_BT_nRST, S3C_GPIO_PULL_NONE);
		gpio_set_value(GPIO_BT_nRST, GPIO_LEVEL_LOW);

		s3c_gpio_slp_cfgpin(GPIO_BT_nRST, S3C_GPIO_SLP_OUT0);
		s3c_gpio_slp_setpull_updown(GPIO_BT_nRST, S3C_GPIO_PULL_NONE);

		printk("[BT] GPIO_BT_nRST = %d\n",
				gpio_get_value(GPIO_BT_nRST));//pr_debug

		if (gpio_get_value(GPIO_BT_nRST) == 0) { //GPIO_WLAN_nRST
			s3c_gpio_setpull(GPIO_WLAN_BT_EN, S3C_GPIO_PULL_NONE);
			gpio_set_value(GPIO_WLAN_BT_EN, GPIO_LEVEL_LOW);

			s3c_gpio_slp_cfgpin(GPIO_WLAN_BT_EN, S3C_GPIO_SLP_OUT0);
			s3c_gpio_slp_setpull_updown(GPIO_WLAN_BT_EN,
					S3C_GPIO_PULL_NONE);

			printk("[BT] GPIO_WLAN_BT_EN = %d\n",
					gpio_get_value(GPIO_WLAN_BT_EN));
		}
#endif
		break;

	default:
		printk(KERN_ERR "[BT] Bad bluetooth rfkill state %d\n", state);//pr_err
	}

	return 0;
}
示例#19
0
static int s5pc11x_pm_enter(suspend_state_t state)
{
	unsigned long regs_save[16];
	unsigned int tmp;


#ifdef CONFIG_HAS_WAKELOCK
	//wake_unlock(&pm_wake_lock);
#endif

	/* ensure the debug is initialised (if enabled) */
	DBG("s5pc11x_pm_enter(%d)\n", state);

	if (pm_cpu_prep == NULL || pm_cpu_sleep == NULL) {
		printk(KERN_ERR PFX "error: no cpu sleep functions set\n");
		return -EINVAL;
	}

#ifdef CONFIG_CPU_FREQ
	s5pc110_pm_target(BOOT_ARM_CLK);
#endif

	/* store the physical address of the register recovery block */
	s5pc110_sleep_save_phys = virt_to_phys(regs_save);

	DBG("s5pc11x_sleep_save_phys=0x%08lx\n", s5pc110_sleep_save_phys);

	s5pc11x_pm_do_save(gpio_save, ARRAY_SIZE(gpio_save));
#ifdef S5PC11X_ALIVEGPIO_STORE
	s5pc11x_pm_do_save(gpio_save_alive, ARRAY_SIZE(gpio_save_alive));
#endif
	s5pc11x_pm_do_save(irq_save, ARRAY_SIZE(irq_save));
	s5pc11x_pm_do_save(core_save, ARRAY_SIZE(core_save));
	s5pc11x_pm_do_save(sromc_save, ARRAY_SIZE(sromc_save));
	s5pc11x_pm_do_save(uart_save, ARRAY_SIZE(uart_save));


	/* ensure INF_REG0  has the resume address */
	__raw_writel(virt_to_phys(s5pc110_cpu_resume), S5P_INFORM0);

	/* call cpu specific preperation */
	pm_cpu_prep();

	/* flush cache back to ram */
	flush_cache_all();

#if 0		// To preserve 24MHz clock.
	/* USB & OSC Clock pad Enable */
	tmp = __raw_readl(S5P_SLEEP_CFG);
	//tmp |= (S5P_SLEEP_CFG_OSC_EN | S5P_SLEEP_CFG_USBOSC_EN);
	tmp &= ~(S5P_SLEEP_CFG_OSC_EN | S5P_SLEEP_CFG_USBOSC_EN);
	__raw_writel(tmp , S5P_SLEEP_CFG);
#endif
	__raw_writel(0xffffffff , S5P_EINT_WAKEUP_MASK);

	/* Power mode Config setting */
	tmp = __raw_readl(S5P_PWR_CFG);
	tmp &= S5P_CFG_WFI_CLEAN;
	tmp |= S5P_CFG_WFI_SLEEP;
	__raw_writel(tmp,S5P_PWR_CFG);

	if (!hw_version_check()) {
	/* Set wakeup mask regsiter */
	__raw_writel(0xFFED, S5P_WAKEUP_MASK); 
	} else {

		if((is_calling_or_playing & IS_VOICE_CALL_2G) || (is_calling_or_playing & IS_VOICE_CALL_3G) || (is_calling_or_playing & IS_DATA_CALL)){
			__raw_writel(0xFFDD, S5P_WAKEUP_MASK); //0xFFDD:key, RTC_ALARM	
		}else{
		__raw_writel(0xFFFD, S5P_WAKEUP_MASK); //0xFFDD:key, RTC_ALARM	
	}
	}

	__raw_writel(0xffffffff, S5PC110_VIC0REG(VIC_INT_ENABLE_CLEAR));
	__raw_writel(0xffffffff, S5PC110_VIC1REG(VIC_INT_ENABLE_CLEAR));
	__raw_writel(0xffffffff, S5PC110_VIC2REG(VIC_INT_ENABLE_CLEAR));
	__raw_writel(0xffffffff, S5PC110_VIC3REG(VIC_INT_ENABLE_CLEAR));
	__raw_writel(0xffffffff, S5PC110_VIC0REG(VIC_INT_SOFT_CLEAR));
	__raw_writel(0xffffffff, S5PC110_VIC1REG(VIC_INT_SOFT_CLEAR));
	__raw_writel(0xffffffff, S5PC110_VIC2REG(VIC_INT_SOFT_CLEAR));
	__raw_writel(0xffffffff, S5PC110_VIC3REG(VIC_INT_SOFT_CLEAR));

	/* SYSC INT Disable */
	tmp = __raw_readl(S5P_OTHERS);
	tmp |= (S5P_OTHER_SYSC_INTOFF);
	__raw_writel(tmp,S5P_OTHERS);

	 /* Clear WAKEUP_STAT register for next wakeup */
        tmp = __raw_readl(S5P_WAKEUP_STAT);
        __raw_writel(tmp, S5P_WAKEUP_STAT);

	/* Wake up source setting */
        //s5pc11x_pm_configure_extint();

	// key pad direction control for evt0
	//s5pc11x_set_keypad_sleep_gpio();
	
	/*Set EINT 22 as wake up source*/
	s5pc11x_pm_set_eint(11, 0x2);
	s5pc11x_pm_set_eint(22, 0x2);
	s5pc11x_pm_set_eint(15, 0x4);
	s5pc11x_pm_set_eint(21, 0x4);
	s5pc11x_pm_set_eint(7,  0x02);		//PMIC	
	s5pc11x_pm_set_eint(6, 0x4); //det_3.5

	s5pc11x_pm_set_eint(28, 0x4);	// T_FLASH_DETECT
//[hdlnc_bp_ytkwon : 20100326
	#ifdef CONFIG_KEPLER_AUDIO_A1026
		if(HWREV!=0x08)
		{
    			if(get_headset_status() & SEC_HEADSET_4_POLE_DEVICE)
			{
				s5pc11x_pm_set_eint(30, 0x4); //sendend
				s5pc11x_pm_set_eint(18, 0x4); //sendend 2.5
			}
   			else
   			{
       			s5pc11x_pm_clear_eint(30);
	   			s5pc11x_pm_clear_eint(18);
   			}
		}
	#else
		if(HWREV==0x0a ||HWREV==0x0c)
		{
   			if(get_headset_status() & SEC_HEADSET_4_POLE_DEVICE)
			{
				s5pc11x_pm_set_eint(30, 0x4); //sendend
			}
			else
   			{
     			s5pc11x_pm_clear_eint(30);
       		}
			
		}
		else
		{
   			if(get_headset_status() & SEC_HEADSET_4_POLE_DEVICE)
			{
				s5pc11x_pm_set_eint(30, 0x4); //sendend
				s5pc11x_pm_set_eint(18, 0x4); //sendend 2.5
			}
   			else
   			{
	   			s5pc11x_pm_clear_eint(30);
       			s5pc11x_pm_clear_eint(18);
  			}
		}
	#endif
//]hdlnc_bp_ytkwon : 20100326
		
	if(gp2a_get_proximity_enable())
	{
	    s5pc11x_pm_set_eint(2, 0x4);//proximity
	}
	s5pc11x_pm_set_eint(20, 0x3);//WiFi
	s5pc11x_pm_set_eint(23, 0x2);//microusb

#if defined CONFIG_T959_VER_B0
	s5pc11x_pm_set_eint(29, 0x4);
// [[junghyunseok edit for fuel_int interrupt control of fuel_gauge 20100504
#elif defined CONFIG_KEPLER_VER_B0
#elif defined(CONFIG_KEPLER_VER_B2) || defined(CONFIG_T959_VER_B5)
	s5pc11x_pm_set_eint(27, 0x2);
// ]]junghyunseok edit for fuel_int interrupt control of fuel_gauge 20100504
#else	
	//gpio key
	if(HWREV >= 0xB)
	{
		s5pc11x_pm_set_eint(27, 0x4);
		s5pc11x_pm_set_eint(29, 0x4);
	}
#endif
	
	if (!hw_version_check()) {
	/*Set keypad as EINT for EVT0 wake up workaround*/
	s5pc11x_pm_set_eint(24, 0x2);
	s5pc11x_pm_set_eint(25, 0x2);
	s5pc11x_pm_set_eint(26, 0x2);
	s5pc11x_pm_set_eint(27, 0x2);

	/*Column pull down enabled*/
	tmp = readl(S5PC11X_GPH2PUD);
	tmp &= ~(0xFF);
	tmp |= 0x55;	
	writel(tmp, S5PC11X_GPH2PUD);
	}

	s3c_config_sleep_gpio();

	s3c_gpio_slp_cfgpin(S5PC11X_MP03(3),  S3C_GPIO_SLP_OUT0);
	s3c_gpio_slp_setpull_updown(S5PC11X_MP03(3),  S3C_GPIO_SLP_OUT0);
#if 0
        tmp = __raw_readl(S5P_OTHERS);
        tmp &= ~(3 << 8);
        tmp |= (3 << 8);
        __raw_writel(tmp, S5P_OTHERS);

        __raw_writel(0,S5P_MIE_CONTROL);
        __raw_writel(0,S5P_HDMI_CONTROL);
        __raw_writel(0,S5P_USB_PHY_CONTROL);
        __raw_writel(0,S5P_DAC_CONTROL);
        __raw_writel(0,S5P_MIPI_PHY_CONTROL);
        __raw_writel(0,S5P_ADC_CONTROL);
        __raw_writel(0,S5P_PSHOLD_CONTROL);
#endif

#if (!(defined CONFIG_ARIES_VER_B0) && !(defined CONFIG_ARIES_VER_B4) && !(defined CONFIG_ARIES_VER_B5))
// Enable PS_HOLD pin to avoid reset failure */
        __raw_writel((0x5 << 12 | 0x1<<9 | 0x1<<8 | 0x1<<0),S5P_PSHOLD_CONTROL);
#endif

	/* s5pc11x_cpu_save will also act as our return point from when
	 * we resume as it saves its own register state, so use the return
	 * code to differentiate return from save and return from sleep */

	if (s5pc110_cpu_save(regs_save) == 0) {
		flush_cache_all();
		if (!hw_version_check()) {		
		/* This function for Chip bug on EVT0 */
		tmp = __raw_readl(S5P_EINT_WAKEUP_MASK + 4); //PWR_MODE
		tmp |= (1 << 2);
		__raw_writel(tmp , S5P_EINT_WAKEUP_MASK + 4);
		// end mod
		}
		pm_cpu_sleep();
	}

	/* restore the cpu state */
	cpu_init();

	s5pc11x_pm_do_restore(gpio_save, ARRAY_SIZE(gpio_save));
#ifdef S5PC11X_ALIVEGPIO_STORE
	s5pc11x_pm_do_restore_alive(gpio_save_alive, ARRAY_SIZE(gpio_save_alive));
#endif
	s5pc11x_pm_do_restore(irq_save, ARRAY_SIZE(irq_save));
	__raw_writel(0x0, S3C24XX_VA_UART2+S3C2410_UCON);
	__raw_writel(0xf, S3C24XX_VA_UART2+S5P_UINTP);
	__raw_writel(0xf, S3C24XX_VA_UART2+S5P_UINTSP);
	__raw_writel(0xf, S3C24XX_VA_UART2+S5P_UINTM);

	/*		Temporary workaround to protect lockup by UART	- 20100316	*/
	    __raw_writel(0x0, S3C24XX_VA_UART3+S3C2410_UCON);
	    __raw_writel(0xf, S3C24XX_VA_UART3+S5P_UINTM);
	    __raw_writel(0xf, S3C24XX_VA_UART3+S5P_UINTSP);
	    __raw_writel(0xf, S3C24XX_VA_UART3+S5P_UINTP);
	    __raw_writel(0x0, S3C24XX_VA_UART2+S3C2410_UCON);
	    __raw_writel(0xf, S3C24XX_VA_UART2+S5P_UINTM);
	    __raw_writel(0xf, S3C24XX_VA_UART2+S5P_UINTSP);
	    __raw_writel(0xf, S3C24XX_VA_UART2+S5P_UINTP);
	    __raw_writel(0x0, S3C24XX_VA_UART1+S3C2410_UCON);
	    __raw_writel(0xf, S3C24XX_VA_UART1+S5P_UINTM);
	    __raw_writel(0xf, S3C24XX_VA_UART1+S5P_UINTSP);
	    __raw_writel(0xf, S3C24XX_VA_UART1+S5P_UINTP);
	    __raw_writel(0x0, S3C24XX_VA_UART0+S3C2410_UCON);
	    __raw_writel(0xf, S3C24XX_VA_UART0+S5P_UINTM);
	    __raw_writel(0xf, S3C24XX_VA_UART0+S5P_UINTSP);
	    __raw_writel(0xf, S3C24XX_VA_UART0+S5P_UINTP);


	s5pc11x_pm_do_restore(uart_save, ARRAY_SIZE(uart_save));
	s5pc11x_pm_do_restore(core_save, ARRAY_SIZE(core_save));
	s5pc11x_pm_do_restore(sromc_save, ARRAY_SIZE(sromc_save));

	/*enable gpio, uart, mmc*/
        tmp = __raw_readl(S5P_OTHERS);
#if ((defined CONFIG_ARIES_VER_B0) || (defined CONFIG_ARIES_VER_B4) || (defined CONFIG_ARIES_VER_B5))
        tmp |= (1<<31) | (1<<28) | (1<<29);
#else
        tmp |= (1<<31) | (0x1<<30) | (1<<28) | (1<<29);
#endif
        __raw_writel(tmp, S5P_OTHERS);

	/* EINT22 Pending clear */ 
	//s5pc11x_pm_clear_eint(22); //<= do action in s3c-keypad.c
//	s5pc11x_pm_clear_eint(21);
	if (!hw_version_check()) {
	// for evt 0 keypad wakeup workaround
		s5pc11x_pm_clear_eint(24);
		s5pc11x_pm_clear_eint(25);
		s5pc11x_pm_clear_eint(26);
		s5pc11x_pm_clear_eint(27);
	        s5pc11x_pm_clear_eint(21);
	} else {
		 /* Clear WAKEUP_STAT register for next wakeup */
		tmp = __raw_readl(S5P_WAKEUP_STAT);
		__raw_writel(tmp, S5P_WAKEUP_STAT);	

		printk("wakeup source is 0x%x  \n", tmp);
		printk(" EXT_INT_0_PEND       %x \n", __raw_readl(S5PC11X_EINTPEND(0)));
		printk(" EXT_INT_1_PEND       %x \n", __raw_readl(S5PC11X_EINTPEND(1)));
		printk(" EXT_INT_2_PEND       %x \n", __raw_readl(S5PC11X_EINTPEND(2)));
		printk(" EXT_INT_3_PEND       %x \n", __raw_readl(S5PC11X_EINTPEND(3)));
	}

	DBG("\npost sleep, preparing to return 2\n");

	s5pc11x_pm_check_restore();

#ifdef CONFIG_HAS_WAKELOCK
        //wake_lock_timeout(&pm_wake_lock, 5 * HZ);
#endif

	/* ok, let's return from sleep */
	DBG("S5PC110 PM Resume (post-restore)\n");

	return 0;
}
示例#20
0
static int bluetooth_set_power(void *data, enum rfkill_user_states state)
{
	int ret = 0;
	int irq;
	/* BT Host Wake IRQ */
	irq = IRQ_BT_HOST_WAKE;

	switch (state) {

	case RFKILL_USER_STATE_UNBLOCKED:
		pr_debug("[BT] Device Powering ON\n");

		s3c_setup_uart_cfg_gpio(0);

		if (gpio_is_valid(GPIO_WLAN_BT_EN))
			gpio_direction_output(GPIO_WLAN_BT_EN, GPIO_LEVEL_HIGH);

		if (gpio_is_valid(GPIO_BT_nRST))
			gpio_direction_output(GPIO_BT_nRST, GPIO_LEVEL_LOW);

		pr_debug("[BT] GPIO_BT_nRST = %d\n",
				gpio_get_value(GPIO_BT_nRST));

		/* Set GPIO_BT_WLAN_REG_ON high */
		s3c_gpio_setpull(GPIO_WLAN_BT_EN, S3C_GPIO_PULL_NONE);
		gpio_set_value(GPIO_WLAN_BT_EN, GPIO_LEVEL_HIGH);

		s3c_gpio_slp_cfgpin(GPIO_WLAN_BT_EN, S3C_GPIO_SLP_OUT1);
		s3c_gpio_slp_setpull_updown(GPIO_WLAN_BT_EN,
				S3C_GPIO_PULL_NONE);

		pr_debug("[BT] GPIO_WLAN_BT_EN = %d\n",
				gpio_get_value(GPIO_WLAN_BT_EN));
		/*
		 * FIXME sleep should be enabled disabled since the device is
		 * not booting if its enabled
		 */
		/*
		 * 100msec, delay between reg_on & rst.
		 * (bcm4329 powerup sequence)
		 */
		msleep(100);

		/* Set GPIO_BT_nRST high */
		s3c_gpio_setpull(GPIO_BT_nRST, S3C_GPIO_PULL_NONE);
		gpio_set_value(GPIO_BT_nRST, GPIO_LEVEL_HIGH);

		s3c_gpio_slp_cfgpin(GPIO_BT_nRST, S3C_GPIO_SLP_OUT1);
		s3c_gpio_slp_setpull_updown(GPIO_BT_nRST, S3C_GPIO_PULL_NONE);

		pr_debug("[BT] GPIO_BT_nRST = %d\n",
				gpio_get_value(GPIO_BT_nRST));

		/*
		 * 50msec, delay after bt rst
		 * (bcm4329 powerup sequence)
		 */
		msleep(50);

		ret = enable_irq_wake(irq);
		if (ret < 0)
			pr_err("[BT] set wakeup src failed\n");

		enable_irq(irq);
		break;

	case RFKILL_USER_STATE_SOFT_BLOCKED:
		pr_debug("[BT] Device Powering OFF\n");

		ret = disable_irq_wake(irq);
		if (ret < 0)
			pr_err("[BT] unset wakeup src failed\n");

		disable_irq(irq);
		wake_unlock(&rfkill_wake_lock);

		s3c_gpio_setpull(GPIO_BT_nRST, S3C_GPIO_PULL_NONE);
		gpio_set_value(GPIO_BT_nRST, GPIO_LEVEL_LOW);

		s3c_gpio_slp_cfgpin(GPIO_BT_nRST, S3C_GPIO_SLP_OUT0);
		s3c_gpio_slp_setpull_updown(GPIO_BT_nRST, S3C_GPIO_PULL_NONE);

		pr_debug("[BT] GPIO_BT_nRST = %d\n",
				gpio_get_value(GPIO_BT_nRST));

		if (gpio_get_value(GPIO_WLAN_nRST) == 0) {
			s3c_gpio_setpull(GPIO_WLAN_BT_EN, S3C_GPIO_PULL_NONE);
			gpio_set_value(GPIO_WLAN_BT_EN, GPIO_LEVEL_LOW);

			s3c_gpio_slp_cfgpin(GPIO_WLAN_BT_EN, S3C_GPIO_SLP_OUT0);
			s3c_gpio_slp_setpull_updown(GPIO_WLAN_BT_EN,
					S3C_GPIO_PULL_NONE);

			pr_debug("[BT] GPIO_WLAN_BT_EN = %d\n",
					gpio_get_value(GPIO_WLAN_BT_EN));
		}

		break;

	default:
		pr_err("[BT] Bad bluetooth rfkill state %d\n", state);
	}

	return 0;
}
示例#21
0
static int bluetooth_set_power(void *data, enum rfkill_user_states state)
{
	unsigned int ret = 0;
	switch (state) {

		case RFKILL_USER_STATE_UNBLOCKED:
			printk(KERN_DEBUG "[BT] Device Powering ON \n");
			s3c_setup_uart_cfg_gpio(0);

			if (gpio_is_valid(GPIO_WLAN_BT_EN))
			{
				ret = gpio_request(GPIO_WLAN_BT_EN, "GPB");
				if (ret < 0) {
					printk(KERN_ERR "[BT] Failed to request GPIO_WLAN_BT_EN!\n");
					return ret;
				}
				gpio_direction_output(GPIO_WLAN_BT_EN, GPIO_LEVEL_HIGH);
			}

			if (gpio_is_valid(GPIO_BT_nRST))
			{
				ret = gpio_request(GPIO_BT_nRST, "GPB");
				if (ret < 0) {
					gpio_free(GPIO_WLAN_BT_EN);
					printk(KERN_ERR "[BT] Failed to request GPIO_BT_nRST\n");
					return ret;
				}
				gpio_direction_output(GPIO_BT_nRST, GPIO_LEVEL_LOW);
			}
			printk(KERN_DEBUG "[BT] GPIO_BT_nRST = %d\n", gpio_get_value(GPIO_BT_nRST));

			/* Set GPIO_BT_WLAN_REG_ON high */
			s3c_gpio_setpull(GPIO_WLAN_BT_EN, S3C_GPIO_PULL_NONE);
			gpio_set_value(GPIO_WLAN_BT_EN, GPIO_LEVEL_HIGH);

			s3c_gpio_slp_cfgpin(GPIO_WLAN_BT_EN, S3C_GPIO_SLP_OUT1);
			s3c_gpio_slp_setpull_updown(GPIO_WLAN_BT_EN, S3C_GPIO_PULL_NONE);

			printk( "[BT] GPIO_WLAN_BT_EN = %d\n", gpio_get_value(GPIO_WLAN_BT_EN));
			/*FIXME sleep should be enabled disabled since the device is not booting
			 * 			if its enabled*/
			msleep(100);  // 100msec, delay  between reg_on & rst. (bcm4329 powerup sequence)

			/* Set GPIO_BT_nRST high */
			s3c_gpio_setpull(GPIO_BT_nRST, S3C_GPIO_PULL_NONE);
			gpio_set_value(GPIO_BT_nRST, GPIO_LEVEL_HIGH);

			s3c_gpio_slp_cfgpin(GPIO_BT_nRST, S3C_GPIO_SLP_OUT1);
			s3c_gpio_slp_setpull_updown(GPIO_BT_nRST, S3C_GPIO_PULL_NONE);

			printk("[BT] GPIO_BT_nRST = %d\n", gpio_get_value(GPIO_BT_nRST));

			gpio_free(GPIO_BT_nRST);
			gpio_free(GPIO_WLAN_BT_EN);

			break;

		case RFKILL_USER_STATE_SOFT_BLOCKED:
			printk(KERN_DEBUG "[BT] Device Powering OFF \n");
//			s3c_reset_uart_cfg_gpio(0);

			s3c_gpio_setpull(GPIO_BT_nRST, S3C_GPIO_PULL_NONE);
			gpio_set_value(GPIO_BT_nRST, GPIO_LEVEL_LOW);

			s3c_gpio_slp_cfgpin(GPIO_BT_nRST, S3C_GPIO_SLP_OUT0);
			s3c_gpio_slp_setpull_updown(GPIO_BT_nRST, S3C_GPIO_PULL_NONE);

			printk("[BT] GPIO_BT_nRST = %d\n",gpio_get_value(GPIO_BT_nRST));

			if(gpio_get_value(GPIO_WLAN_nRST) == 0)
			{
				s3c_gpio_setpull(GPIO_WLAN_BT_EN, S3C_GPIO_PULL_NONE);
				gpio_set_value(GPIO_WLAN_BT_EN, GPIO_LEVEL_LOW);

				s3c_gpio_slp_cfgpin(GPIO_WLAN_BT_EN, S3C_GPIO_SLP_OUT0);
				s3c_gpio_slp_setpull_updown(GPIO_WLAN_BT_EN, S3C_GPIO_PULL_NONE);

				printk("[BT] GPIO_WLAN_BT_EN = %d\n", gpio_get_value(GPIO_WLAN_BT_EN));
			}

			gpio_free(GPIO_BT_nRST);
			gpio_free(GPIO_WLAN_BT_EN);

			break;

		default:
			printk(KERN_ERR "[BT] Bad bluetooth rfkill state %d\n", state);
	}

	return 0;
}
示例#22
0
static int bluetooth_set_power(void *data, enum rfkill_user_states state)
{
	unsigned int ret = 0; 
	switch (state) {

		case RFKILL_USER_STATE_UNBLOCKED:
			printk("[BT] Device Powering ON \n");
			s3c_setup_uart_cfg_gpio(1);
			//wake_unlock(&bt_wake_lock); 

			if (gpio_is_valid(GPIO_BT_WLAN_REG_ON))
			{
				ret = gpio_request(GPIO_BT_WLAN_REG_ON, S3C_GPIO_LAVEL(GPIO_BT_WLAN_REG_ON));
				if (ret < 0) {
					printk("[BT] Failed to request GPIO_BT_WLAN_REG_ON!\n");
					return ret;
				}
				gpio_direction_output(GPIO_BT_WLAN_REG_ON, GPIO_LEVEL_HIGH);
			}

			if (gpio_is_valid(GPIO_BT_RST_N))
			{
				ret = gpio_request(GPIO_BT_RST_N, S3C_GPIO_LAVEL(GPIO_BT_RST_N));
				if (ret < 0) {
					gpio_free(GPIO_BT_WLAN_REG_ON);
					printk("[BT] Failed to request GPIO_BT_RST_N!\n");
					return ret;			
				}
				gpio_direction_output(GPIO_BT_RST_N, GPIO_LEVEL_LOW);
			}

			/* Set GPIO_BT_WLAN_REG_ON high */ 
			s3c_gpio_setpull(GPIO_BT_WLAN_REG_ON, S3C_GPIO_PULL_NONE);
			gpio_set_value(GPIO_BT_WLAN_REG_ON, GPIO_LEVEL_HIGH);

			s3c_gpio_slp_cfgpin(GPIO_BT_WLAN_REG_ON, S3C_GPIO_SLP_OUT1);  
			s3c_gpio_slp_setpull_updown(GPIO_BT_WLAN_REG_ON, S3C_GPIO_PULL_NONE);

			printk("[BT] GPIO_BT_WLAN_REG_ON = %d\n", gpio_get_value(GPIO_BT_WLAN_REG_ON));		

			mdelay(150);  // 100msec, delay  between reg_on & rst. (bcm4325 powerup sequence)

			/* Set GPIO_BT_RST_N high */
			s3c_gpio_setpull(GPIO_BT_RST_N, S3C_GPIO_PULL_NONE);
			gpio_set_value(GPIO_BT_RST_N, GPIO_LEVEL_HIGH);

			s3c_gpio_slp_cfgpin(GPIO_BT_RST_N, S3C_GPIO_SLP_OUT1);
			s3c_gpio_slp_setpull_updown(GPIO_BT_RST_N, S3C_GPIO_PULL_NONE);

			printk("[BT] GPIO_BT_RST_N = %d\n", gpio_get_value(GPIO_BT_RST_N));

			gpio_free(GPIO_BT_RST_N);
			gpio_free(GPIO_BT_WLAN_REG_ON);

			break;

		case RFKILL_USER_STATE_SOFT_BLOCKED:
			printk("[BT] Device Powering OFF \n");
			//wake_unlock(&bt_wake_lock);  //if not, it doesn't go to sleep after BT on->off. There's lock somewhere.
			s3c_reset_uart_cfg_gpio(1); 

			s3c_gpio_setpull(GPIO_BT_RST_N, S3C_GPIO_PULL_NONE);
			gpio_set_value(GPIO_BT_RST_N, GPIO_LEVEL_LOW);

			s3c_gpio_slp_cfgpin(GPIO_BT_RST_N, S3C_GPIO_SLP_OUT0);
			s3c_gpio_slp_setpull_updown(GPIO_BT_RST_N, S3C_GPIO_PULL_NONE);

			printk("[BT] GPIO_BT_RST_N = %d\n",gpio_get_value(GPIO_BT_RST_N));

			if(gpio_get_value(GPIO_WLAN_RST_N) == 0)
			{		
				s3c_gpio_setpull(GPIO_BT_WLAN_REG_ON, S3C_GPIO_PULL_NONE);
				gpio_set_value(GPIO_BT_WLAN_REG_ON, GPIO_LEVEL_LOW);

				s3c_gpio_slp_cfgpin(GPIO_BT_WLAN_REG_ON, S3C_GPIO_SLP_OUT0);
				s3c_gpio_slp_setpull_updown(GPIO_BT_WLAN_REG_ON, S3C_GPIO_PULL_NONE);

				printk("[BT] GPIO_BT_WLAN_REG_ON = %d\n", gpio_get_value(GPIO_BT_WLAN_REG_ON));
			}

			gpio_free(GPIO_BT_RST_N);
			gpio_free(GPIO_BT_WLAN_REG_ON);

			break;

		default:
			printk(KERN_ERR "[BT] Bad bluetooth rfkill state %d\n", state);
	}

	return 0;
}
void s5pv310_setup_sdhci3_cfg_gpio(struct platform_device *dev, int width)
{
	unsigned int gpio;

#if defined(CONFIG_WIMAX_CMC) && defined(CONFIG_TARGET_LOCALE_NA)

if(gpio_get_value(GPIO_WIMAX_EN))
{
	/* Set all the necessary GPK1[0:1] pins to special-function 2 */
	for (gpio = S5PV310_GPK3(0); gpio < S5PV310_GPK3(2); gpio++) {
		s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2));
		s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE);
	}

	/* Data pin GPK1[3:6] to special-function 2 */
	for (gpio = S5PV310_GPK3(3); gpio <= S5PV310_GPK3(6); gpio++) {
		s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2));
		s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE);
	}
	//__raw_writel(0x3FFF, GPK3DRV);
	__raw_writel(0x2AAA, GPK3DRV); // for sdio noise

	for (gpio = S5PV310_GPK3(0); gpio < S5PV310_GPK3(2); gpio++) {

		s3c_gpio_slp_cfgpin(gpio,S3C_GPIO_SLP_INPUT );
                s3c_gpio_slp_setpull_updown(gpio,S3C_GPIO_PULL_NONE );

	}

	for (gpio = S5PV310_GPK3(3); gpio < S5PV310_GPK3(6); gpio++) {

                s3c_gpio_slp_cfgpin(gpio,S3C_GPIO_SLP_INPUT );
                s3c_gpio_slp_setpull_updown(gpio,S3C_GPIO_PULL_NONE );

        }


}
else
{
	  /* Set all the necessary GPK1[0:1] to Input pull down for power saving */
        for (gpio = S5PV310_GPK3(0); gpio < S5PV310_GPK3(2); gpio++) {
                s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(0));
                s3c_gpio_setpull(gpio, S3C_GPIO_PULL_DOWN);
        }

        /* Data pin GPK1[3:6] to Input pull down for power saving */
        for (gpio = S5PV310_GPK3(3); gpio <= S5PV310_GPK3(6); gpio++) {
                s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(0));
                s3c_gpio_setpull(gpio, S3C_GPIO_PULL_DOWN);
        }


	for (gpio = S5PV310_GPK3(0); gpio < S5PV310_GPK3(2); gpio++) {

                s3c_gpio_slp_cfgpin(gpio,S3C_GPIO_SLP_INPUT );
                s3c_gpio_slp_setpull_updown(gpio,S3C_GPIO_PULL_DOWN );

        }

        for (gpio = S5PV310_GPK3(3); gpio < S5PV310_GPK3(6); gpio++) {

                s3c_gpio_slp_cfgpin(gpio,S3C_GPIO_SLP_INPUT );
                s3c_gpio_slp_setpull_updown(gpio,S3C_GPIO_PULL_DOWN );

        }




}

#else

	/* Set all the necessary GPK1[0:1] pins to special-function 2 */
	for (gpio = S5PV310_GPK3(0); gpio < S5PV310_GPK3(2); gpio++) {
		s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2));
		s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE);
	}

	/* Data pin GPK1[3:6] to special-function 2 */
	for (gpio = S5PV310_GPK3(3); gpio <= S5PV310_GPK3(6); gpio++) {
		s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2));
		s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE);
	}
	//__raw_writel(0x3FFF, GPK3DRV);
	__raw_writel(0x2AAA, GPK3DRV); // for sdio noise

#endif

}
示例#24
0
static int bt_set_power(void *data, enum rfkill_user_states state)
{
	int ret = 0;
	int wl_ret =0;
	int irq;

	/* BT Host Wake IRQ */
	irq = gpio_to_irq(BT_HOST_WAKE);

	switch (state) {
	case RFKILL_USER_STATE_UNBLOCKED:
		
		pr_info("[BT] Device Powering ON\n");
		
		/* config uart0 */ 
		s3c_setup_uart_cfg_gpio(0);
		
		/* set gpio direction */
		if (gpio_is_valid(BT_POWER))
			gpio_direction_output(BT_POWER, GPIO_LEVEL_HIGH);
		
		//request gpio wl_power when use it
		wl_ret = gpio_request(WL_POWER, "gpio_wl_power"); 
		if (gpio_is_valid(WL_POWER))
			gpio_direction_output(WL_POWER, GPIO_LEVEL_HIGH);		
		if (gpio_is_valid(BT_RESET))
			gpio_direction_output(BT_RESET, GPIO_LEVEL_LOW);

		
		/* Set BT_POWER high */
		s3c_gpio_setpull(BT_POWER, S3C_GPIO_PULL_NONE);
		gpio_set_value(BT_POWER, GPIO_LEVEL_HIGH);
		s3c_gpio_slp_cfgpin(BT_POWER, S3C_GPIO_SLP_OUT1);
		s3c_gpio_slp_setpull_updown(BT_POWER, S3C_GPIO_PULL_NONE);
		
		/* Set WL_POWER high */
		s3c_gpio_setpull(WL_POWER, S3C_GPIO_PULL_NONE);
		gpio_set_value(WL_POWER, GPIO_LEVEL_HIGH);
		s3c_gpio_slp_cfgpin(WL_POWER, S3C_GPIO_SLP_OUT1);
		s3c_gpio_slp_setpull_updown(WL_POWER,	S3C_GPIO_PULL_NONE);		
		if (wl_ret == 0) {						
			gpio_free(WL_POWER);		//free wl_power 
		}
		
		/*
		 * FIXME sleep should be enabled disabled since the device is
		 * not booting if its enabled ?
		 */
		 
		/*
		 *  at least 100 msec delay,  between reg_on & rst.
		 * (bcm4329 powerup sequence)
		 */
		msleep(100);	//default 50; lvcha

		/* Set BT_RESET high */
		s3c_gpio_setpull(BT_RESET, S3C_GPIO_PULL_NONE);
		gpio_set_value(BT_RESET, GPIO_LEVEL_HIGH);
		s3c_gpio_slp_cfgpin(BT_RESET, S3C_GPIO_SLP_OUT1);
		s3c_gpio_slp_setpull_updown(BT_RESET, S3C_GPIO_PULL_NONE);
	
		/*
		 * at least 50 msec  delay,  after bt rst
		 * (bcm4329 powerup sequence)
		 */
		msleep(50);

		gpio_set_value(BT_WAKE, GPIO_LEVEL_HIGH);

		ret = enable_irq_wake(irq);
		if (ret < 0)
			pr_err("[BT] set wakeup src failed\n");

		enable_irq(irq);
		break;

	case RFKILL_USER_STATE_SOFT_BLOCKED:
		
		pr_info("[BT] Device Powering OFF\n");
		
		/* Set irq */
		ret = disable_irq_wake(irq);
		if (ret < 0)
			pr_err("[BT] unset wakeup src failed\n");

		disable_irq(irq);

		/* Unlock wake lock */
		wake_unlock(&rfkill_wake_lock);

		gpio_set_value(BT_WAKE, GPIO_LEVEL_LOW);

		/* Set BT_RESET low */
		s3c_gpio_setpull(BT_RESET, S3C_GPIO_PULL_NONE);
		gpio_set_value(BT_RESET, GPIO_LEVEL_LOW);
		s3c_gpio_slp_cfgpin(BT_RESET, S3C_GPIO_SLP_OUT0);
		s3c_gpio_slp_setpull_updown(BT_RESET, S3C_GPIO_PULL_NONE);
		
		/* Check WL_RESET */
		if (gpio_get_value(WL_RESET) == 0) {
			/* Set WL_POWER low */
			s3c_gpio_setpull(WL_POWER, S3C_GPIO_PULL_NONE);
			gpio_set_value(WL_POWER, GPIO_LEVEL_LOW);
			s3c_gpio_slp_cfgpin(WL_POWER, S3C_GPIO_SLP_OUT0);
			s3c_gpio_slp_setpull_updown(WL_POWER,	S3C_GPIO_PULL_NONE);

			/* Set BT_POWER low */
			s3c_gpio_setpull(BT_POWER, S3C_GPIO_PULL_NONE);
			gpio_set_value(BT_POWER, GPIO_LEVEL_LOW);
			s3c_gpio_slp_cfgpin(BT_POWER, S3C_GPIO_SLP_OUT0);
			s3c_gpio_slp_setpull_updown(BT_POWER,	S3C_GPIO_PULL_NONE);	
		}
		break;

	default:
		pr_err("[BT] Bad bluetooth rfkill state %d\n", state);
	}

	return 0;
}
static int bluetooth_set_power(void *data, enum rfkill_user_states state)
{
	unsigned int ret = 0;
	static int on_off = 0;
	switch (state) {

		case RFKILL_USER_STATE_UNBLOCKED:
			printk(KERN_DEBUG "[BT] Device Powering ON \n");
			s3c_setup_uart_cfg_gpio(0);
			if(on_off) return ret; //shiks_DF03 temp for AP sleep issue //just 1 time //FROYO MERGE

			if (gpio_is_valid(GPIO_WLAN_BT_EN))
			{
				ret = gpio_request(GPIO_WLAN_BT_EN, "GPB");
				if (ret < 0) {
					printk(KERN_ERR "[BT] Failed to request GPIO_WLAN_BT_EN!\n");
					return ret;
				}
				gpio_direction_output(GPIO_WLAN_BT_EN, GPIO_LEVEL_HIGH);
			}
			//SecFeature shiks_DJ18 start
			enable_irq(IRQ_BT_HOST_WAKE);//for sleep surrent when wifi goes to sleep mode
			//SecFeature shiks_DJ18 end
			if (gpio_is_valid(GPIO_BT_nRST))
			{
				ret = gpio_request(GPIO_BT_nRST, "GPB");
				if (ret < 0) {
					gpio_free(GPIO_WLAN_BT_EN);
					printk(KERN_ERR "[BT] Failed to request GPIO_BT_nRST\n");
					return ret;
				}
				gpio_direction_output(GPIO_BT_nRST, GPIO_LEVEL_LOW);
			}
			printk(KERN_DEBUG "[BT] GPIO_BT_nRST = %d\n", gpio_get_value(GPIO_BT_nRST));

			/* Set GPIO_BT_WLAN_REG_ON high */
			s3c_gpio_setpull(GPIO_WLAN_BT_EN, S3C_GPIO_PULL_NONE);
			gpio_set_value(GPIO_WLAN_BT_EN, GPIO_LEVEL_HIGH);

			s3c_gpio_slp_cfgpin(GPIO_WLAN_BT_EN, S3C_GPIO_SLP_PREV);
			s3c_gpio_slp_setpull_updown(GPIO_WLAN_BT_EN, S3C_GPIO_PULL_NONE);

			printk( "[BT] GPIO_WLAN_BT_EN = %d\n", gpio_get_value(GPIO_WLAN_BT_EN));
			/*FIXME sleep should be enabled disabled since the device is not booting
			 * 			if its enabled*/
			msleep(200);  // 100msec, delay  between reg_on & rst. (bcm4329 powerup sequence)

			/* Set GPIO_BT_nRST high */
			s3c_gpio_setpull(GPIO_BT_nRST, S3C_GPIO_PULL_NONE);
			gpio_set_value(GPIO_BT_nRST, GPIO_LEVEL_HIGH);

			s3c_gpio_slp_cfgpin(GPIO_BT_nRST, S3C_GPIO_SLP_OUT1);
			s3c_gpio_slp_setpull_updown(GPIO_BT_nRST, S3C_GPIO_PULL_NONE);

			printk("[BT] GPIO_BT_nRST = %d\n", gpio_get_value(GPIO_BT_nRST));

            on_off =1;
			gpio_free(GPIO_BT_nRST);
			gpio_free(GPIO_WLAN_BT_EN);

			break;

		case RFKILL_USER_STATE_SOFT_BLOCKED:
			printk(KERN_DEBUG "[BT] Device Powering OFF \n");
//			s3c_reset_uart_cfg_gpio(0);

			s3c_gpio_setpull(GPIO_BT_nRST, S3C_GPIO_PULL_NONE);
			gpio_set_value(GPIO_BT_nRST, GPIO_LEVEL_LOW);

			s3c_gpio_slp_cfgpin(GPIO_BT_nRST, S3C_GPIO_SLP_PREV);
			s3c_gpio_slp_setpull_updown(GPIO_BT_nRST, S3C_GPIO_PULL_NONE);

			printk("[BT] GPIO_BT_nRST = %d\n",gpio_get_value(GPIO_BT_nRST));
			//SecFeature shiks_DJ18 start
			disable_irq(IRQ_BT_HOST_WAKE);//for sleep surrent when wifi goes to sleep mode
			//SecFeature shiks_DJ18 end
			if(gpio_get_value(GPIO_WLAN_nRST) == 0)
			{
				s3c_gpio_setpull(GPIO_WLAN_BT_EN, S3C_GPIO_PULL_NONE);
				gpio_set_value(GPIO_WLAN_BT_EN, GPIO_LEVEL_LOW);

				s3c_gpio_slp_cfgpin(GPIO_WLAN_BT_EN, S3C_GPIO_SLP_PREV);
				s3c_gpio_slp_setpull_updown(GPIO_WLAN_BT_EN, S3C_GPIO_PULL_NONE);

				printk("[BT] GPIO_WLAN_BT_EN = %d\n", gpio_get_value(GPIO_WLAN_BT_EN));
			}
            on_off = 0;
			gpio_free(GPIO_BT_nRST);
			gpio_free(GPIO_WLAN_BT_EN);

			break;

		default:
			printk(KERN_ERR "[BT] Bad bluetooth rfkill state %d\n", state);
	}

	return 0;
}
示例#26
0
void exynos4_setup_sdhci3_cfg_gpio(struct platform_device *dev, int width)
{
    struct s3c_sdhci_platdata *pdata = dev->dev.platform_data;
    unsigned int gpio;

#if defined(CONFIG_WIMAX_CMC) /* && defined(CONFIG_TARGET_LOCALE_NA) */

    if (gpio_get_value(GPIO_WIMAX_EN)) {
        for (gpio = EXYNOS4_GPK3(0); gpio < EXYNOS4_GPK3(2); gpio++) {
            s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2));
            s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE);
            s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV2);
        }
        for (gpio = EXYNOS4_GPK3(3); gpio <= EXYNOS4_GPK3(6); gpio++) {
            s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2));
            s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE);
            s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV2);
        }
        for (gpio = EXYNOS4_GPK3(0); gpio < EXYNOS4_GPK3(2); gpio++) {
            s3c_gpio_slp_cfgpin(gpio, S3C_GPIO_SLP_INPUT);
            s3c_gpio_slp_setpull_updown(gpio, S3C_GPIO_PULL_NONE);
        }
        for (gpio = EXYNOS4_GPK3(3); gpio <= EXYNOS4_GPK3(6); gpio++) {
            s3c_gpio_slp_cfgpin(gpio, S3C_GPIO_SLP_INPUT);
            s3c_gpio_slp_setpull_updown(gpio, S3C_GPIO_PULL_NONE);
        }
    } else {
        for (gpio = EXYNOS4_GPK3(0); gpio < EXYNOS4_GPK3(2); gpio++) {
            s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(0));
            s3c_gpio_setpull(gpio, S3C_GPIO_PULL_DOWN);
        }
        for (gpio = EXYNOS4_GPK3(3); gpio <= EXYNOS4_GPK3(6); gpio++) {
            s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(0));
            s3c_gpio_setpull(gpio, S3C_GPIO_PULL_DOWN);
        }
        for (gpio = EXYNOS4_GPK3(0); gpio < EXYNOS4_GPK3(2); gpio++) {
            s3c_gpio_slp_cfgpin(gpio, S3C_GPIO_SLP_INPUT);
            s3c_gpio_slp_setpull_updown(gpio, S3C_GPIO_PULL_DOWN);
        }
        for (gpio = EXYNOS4_GPK3(3); gpio <= EXYNOS4_GPK3(6); gpio++) {
            s3c_gpio_slp_cfgpin(gpio, S3C_GPIO_SLP_INPUT);
            s3c_gpio_slp_setpull_updown(gpio, S3C_GPIO_PULL_DOWN);
        }
    }
#else
    /* Set all the necessary GPK3[0:1] pins to special-function 2 */
    for (gpio = EXYNOS4_GPK3(0); gpio < EXYNOS4_GPK3(2); gpio++) {
        s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2));
#ifdef CONFIG_MACH_U1
        s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE);
        s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV2);
#elif defined(CONFIG_MACH_MIDAS)
        s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE);
        s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4);
#elif defined(CONFIG_MACH_PX)
        s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE);
        s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4);
#else
        s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE);
        s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4);
#endif
    }

#if defined(CONFIG_MACH_PX)
    s3c_gpio_setpull(EXYNOS4_GPK3(1), S3C_GPIO_PULL_UP);
#endif

    for (gpio = EXYNOS4_GPK3(3); gpio <= EXYNOS4_GPK3(6); gpio++) {
        /* Data pin GPK3[3:6] to special-function 2 */
        s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2));
#ifdef CONFIG_MACH_U1
        s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE);
        s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV2);
#elif defined(CONFIG_MACH_MIDAS)
        s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE);
        s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4);
#elif defined(CONFIG_MACH_PX)
        s3c_gpio_setpull(gpio, S3C_GPIO_PULL_UP);
        s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4);
#else
        s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE);
        s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4);
#endif
    }

    if (pdata->cd_type == S3C_SDHCI_CD_INTERNAL) {
        s3c_gpio_cfgpin(EXYNOS4_GPK3(2), S3C_GPIO_SFN(2));
        s3c_gpio_setpull(EXYNOS4_GPK3(2), S3C_GPIO_PULL_NONE);
        s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV2);
    }
#endif
}