예제 #1
0
static void ws2401_dpi_mcde_panel_late_resume(
    struct early_suspend *earlysuspend)
{
    struct ws2401_dpi *lcd = container_of(earlysuspend,
                                          struct ws2401_dpi,
                                          earlysuspend);

#ifdef ESD_OPERATION
    if (lcd->lcd_connected)
        enable_irq(GPIO_TO_IRQ(lcd->esd_port));
#endif

    if (prcmu_qos_add_requirement(PRCMU_QOS_APE_OPP,
                                  "codina_lcd_dpi", 100)) {
        pr_info("pcrm_qos_add APE failed\n");
    }

    ws2401_dpi_mcde_panel_resume(lcd->mdd);

    if (lcd->pd->bl_ctrl)
        lcd->bd_enable = TRUE;
#ifdef ESD_OPERATION
    if (lcd->lcd_connected) {
        set_irq_type(GPIO_TO_IRQ(lcd->esd_port), IRQF_TRIGGER_RISING);
        lcd->esd_enable = 1;
        pr_info("%s change lcd->esd_enable :%d", __func__,
                lcd->esd_enable);
    } else
        pr_info("%s lcd_connected : %d", lcd->lcd_connected);
#endif
}
예제 #2
0
static void ws2401_dpi_mcde_panel_early_suspend(
    struct early_suspend *earlysuspend)
{
    struct ws2401_dpi *lcd = container_of(earlysuspend,
                                          struct ws2401_dpi,
                                          earlysuspend);
    pm_message_t dummy;

    if (lcd->pd->bl_ctrl)
        lcd->bd_enable = FALSE;
#ifdef ESD_OPERATION
    if (lcd->esd_enable) {

        lcd->esd_enable = 0;
        set_irq_type(GPIO_TO_IRQ(lcd->esd_port), IRQF_TRIGGER_NONE);
        disable_irq_nosync(GPIO_TO_IRQ(lcd->esd_port));

        if (!list_empty(&(lcd->esd_work.entry))) {
            cancel_work_sync(&(lcd->esd_work));
            pr_info("%s cancel_work_sync", __func__);
        }

        pr_info("%s change lcd->esd_enable :%d", __func__,
                lcd->esd_enable);
    }
#endif

    ws2401_dpi_mcde_panel_suspend(lcd->mdd, dummy);

    prcmu_qos_remove_requirement(PRCMU_QOS_APE_OPP,
                                 "codina_lcd_dpi");
}
예제 #3
0
static int __init mot_setup_mdm6600_usb_ipc(int irq)
{
	if (irq) {
		gpio_request(irq, "mdm6600_usb_wakeup");
		gpio_direction_input(irq);
		mdm6600_resources[0].start = GPIO_TO_IRQ(irq);
		mdm6600_resources[0].end = GPIO_TO_IRQ(irq);
	}
	return platform_device_register(&mdm6600_usb_platform_device);
}
static int __devinit synaptics_ts_init(void)
{
	printk("[TSP] %s\n", __func__ );

	gpio_request(TSP_INT, "ts_irq");
	gpio_direction_input(TSP_INT);
	//bcm_gpio_pull_up(TSP_INT, true);
	//bcm_gpio_pull_up_down_enable(TSP_INT, true);
	set_irq_type(GPIO_TO_IRQ(TSP_INT), IRQF_TRIGGER_FALLING);
    
	//disable BB internal pulls for touch int, scl, sda pin
    bcm_gpio_pull_up_down_enable(TSP_INT, 0);
	bcm_gpio_pull_up_down_enable(TSP_SCL, 0);
	bcm_gpio_pull_up_down_enable(TSP_SDA, 0);

	#if USE_THREADED_IRQ

	#else
	synaptics_wq = create_singlethread_workqueue("synaptics_wq");
	if (!synaptics_wq)
		return -ENOMEM;
	#endif

	check_ic_wq = create_singlethread_workqueue("check_ic_wq");	

	if (!check_ic_wq)
		return -ENOMEM;

	touch_regulator = regulator_get(NULL,"touch_vcc");
	return i2c_add_driver(&synaptics_ts_driver);
}
/* that function will returns :
    1) return :  Host gpio interrupt number per customer platform
    2) irq_flags_ptr : Type of Host interrupt as Level or Edge

    NOTE :
    Customer should check his platform definitions
    and hist Host Interrupt  spec
    to figure out the proper setting for his platform.
    BRCM provides just reference settings as example.

*/
int dhd_customer_oob_irq_map(unsigned long *irq_flags_ptr)
{
	int  host_oob_irq = 0;

#if defined(CUSTOM_OOB_GPIO_NUM)
	if (dhd_oob_gpio_num < 0) {
		dhd_oob_gpio_num = CUSTOM_OOB_GPIO_NUM;
	}
#endif

	if (dhd_oob_gpio_num < 0) {
		WL_ERROR(("%s: ERROR customer specific Host GPIO is NOT defined \n",
			__FUNCTION__));
		return (dhd_oob_gpio_num);
	}

	WL_ERROR(("%s: customer specific Host GPIO number is (%d), flag=0x%X\n",
	         __FUNCTION__, dhd_oob_gpio_num, (unsigned int)*irq_flags_ptr));

#ifdef CONFIG_MACH_SAMSUNG_P3
	host_oob_irq = gpio_to_irq(dhd_oob_gpio_num);
#elif defined(CONFIG_MACH_U8500)
	host_oob_irq =  GPIO_TO_IRQ(dhd_oob_gpio_num);
#elif defined(SYSLSI_SPECIFIC)
	host_oob_irq = dhd_oob_gpio_num;
#elif defined(CONFIG_WIFI_CONTROL_FUNC)
	host_oob_irq = wifi_get_irq_number(irq_flags_ptr);
#endif

	return (host_oob_irq);
}
예제 #6
0
/****************************************************************************
*
*   This function sets all the GPIO Rows input and request to register the IRQ
*
***************************************************************************/
static int SetRowInput( int array[], int row_count, struct CBLK *bcm_kp )
{
    int i, gpio;
    int ret;
    
    for(i=0;i< row_count; i++ )
    {
        gpio = array[i];
        if( gpio != BCM_NO_COLUMN )
        {
            reg_gpio_set_pull_up_down(gpio, 1);
            reg_gpio_set_pull_up_down_enable(gpio);
            reg_gpio_set_debounce_value_enable( gpio, GPIO_DEBOUNCE_16_MS );
            ret = request_irq( GPIO_TO_IRQ(gpio), keypad_gpio_irq, ( IRQF_SHARED | IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING ), \
                "GPIO Keypad", bcm_kp);
            if(ret < 0)
            {
                printk(KERN_ERR "%s(%s:%u)::GPIO %d request_irq failed IRQ %d\n",  __FUNCTION__, __FILE__, __LINE__, gpio, GPIO_TO_IRQ(gpio));
                return ret;
            }
        }
    } 
   
    return(0);
}
예제 #7
0
static void est_test_timer_func(unsigned long data)
{
	pr_info("%s\n", __func__);

	if (list_empty(&(pdsi->esd_work.entry))) {
		disable_irq_nosync(GPIO_TO_IRQ(pdsi->esd_port));
		queue_work(pdsi->esd_workqueue, &(pdsi->esd_work));
		pr_info("%s invoked\n", __func__);
	}

	mod_timer(&pdsi->esd_test_timer,  jiffies + (10*HZ));
}
예제 #8
0
/****************************************************************************
*
*   This function free the IRQ for the GPIO interrupt
*
***************************************************************************/
static void free_all_irqs( struct CBLK *bcm_kp )
{
    int i;

    for(i=0;i<bcm_kp->row_count;i++)
    {
        if( bcm_kp->keyRowArray[i] != BCM_NO_COLUMN )
            free_irq( GPIO_TO_IRQ(bcm_kp->keyRowArray[i]), (void *)bcm_kp );
    }

	return;
}
static int __devinit synaptics_ts_init(void)
{
#if defined (CONFIG_TOUCHSCREEN_MMS128_TASSCOOPER)
	Synaptics_Loaded = 1;
    printk("[TSP][Synaptics][%s] %s\n", __func__,"Init Func Called");

    if(Is_MMS128_Connected() == 1)
    {
        printk("[TSP][Synaptics][%s] %s\n", __func__,"Melfas already detected !!");

        return -ENXIO;
    }

	if(Is_MMS128_Loaded() == 0)
	{
#endif

	printk("[TSP] %s\n", __func__ );

	gpio_request(TSP_INT, "ts_irq");
	gpio_direction_input(TSP_INT);
	bcm_gpio_pull_up(TSP_INT, true);
	bcm_gpio_pull_up_down_enable(TSP_INT, true);
	set_irq_type(GPIO_TO_IRQ(TSP_INT), IRQF_TRIGGER_FALLING);

//#if defined (CONFIG_TOUCHSCREEN_MMS128_TASSCOOPER)
    //disable BB internal pulls for touch int, scl, sda pin
    bcm_gpio_pull_up_down_enable(TSP_INT, 0);
    bcm_gpio_pull_up_down_enable(TSP_SCL, 0);
    bcm_gpio_pull_up_down_enable(TSP_SDA, 0);
 //#endif
#if defined (CONFIG_TOUCHSCREEN_MMS128_TASSCOOPER)	
	}
#endif
 
 
	#if USE_THREADED_IRQ

	#else	
	synaptics_wq = create_singlethread_workqueue("synaptics_wq");
	if (!synaptics_wq)
		return -ENOMEM;
#endif

	touch_regulator = regulator_get(NULL,"touch_vcc");
	return i2c_add_driver(&synaptics_ts_driver);
}
static int __devinit synaptics_ts_init(void)
{
	printk("[TSP] %s\n", __func__ );

    	gpio_request(TSP_INT, "ts_irq");
	gpio_direction_input(TSP_INT);
	bcm_gpio_pull_up(TSP_INT, true);
	bcm_gpio_pull_up_down_enable(TSP_INT, true);
	set_irq_type(GPIO_TO_IRQ(TSP_INT), IRQF_TRIGGER_FALLING);
    
	synaptics_wq = create_singlethread_workqueue("synaptics_wq");
	if (!synaptics_wq)
		return -ENOMEM;

	touch_regulator = regulator_get(NULL,"touch_vcc");
	return i2c_add_driver(&synaptics_ts_driver);
}
예제 #11
0
static void ws2401_dpi_mcde_panel_shutdown(struct mcde_display_device *ddev)
{
    struct ws2401_dpi *lcd = dev_get_drvdata(&ddev->dev);

    dev_dbg(&ddev->dev, "Invoked %s\n", __func__);
    if (lcd->pd->bl_ctrl)
        lcd->bd_enable = FALSE;

#ifdef ESD_OPERATION
    if (lcd->esd_enable) {

        lcd->esd_enable = 0;
        disable_irq_nosync(GPIO_TO_IRQ(lcd->esd_port));

        if (!list_empty(&(lcd->esd_work.entry))) {
            cancel_work_sync(&(lcd->esd_work));
            pr_info("%s cancel_work_sync", __func__);
        }

        destroy_workqueue(lcd->esd_workqueue);
    }
#endif

    ws2401_dpi_power(lcd, FB_BLANK_POWERDOWN);

    if (lcd->pd->bl_ctrl)
        backlight_device_unregister(lcd->bd);

    spi_unregister_driver(&lcd->spi_drv);

#ifdef CONFIG_HAS_EARLYSUSPEND
    unregister_early_suspend(&lcd->earlysuspend);
#endif

    kfree(lcd);

    dev_dbg(&ddev->dev, "end %s\n", __func__);
}
static irqreturn_t slave_ready_irq(int irq, void *dev)
{
	struct ipc_link_context *context = (struct ipc_link_context *)dev;
	struct modem_m6718_spi_link_platform_data *link = context->link;
	struct spi_device *sdev = context->sdev;

	if (irq != GPIO_TO_IRQ(link->gpio.int_pin)) {
		dev_err(&sdev->dev,
			"link %d error: spurious slave irq!", link->id);
		return IRQ_NONE;
	}

#ifdef WORKAROUND_DUPLICATED_IRQ
	if (pl022_tfr_in_progress(sdev)) {
		dev_warn(&sdev->dev,
			"link %d warning: slave irq while transfer "
			"is active! discarding event\n", link->id);
		return IRQ_HANDLED;
	}
#endif
	ipc_sm_kick(IPC_SM_RUN_SLAVE_IRQ, context);
	return IRQ_HANDLED;
}
예제 #13
0
	},
#if defined(CONFIG_TEGRA_ODM_OLYMPUS)
	{
		/*  ISL 29030 (prox/ALS) driver */
		I2C_BOARD_INFO(LD_ISL29030_NAME, 0x44),
		.platform_data = &isl29030_als_ir_data_Olympus,
		.irq = 180,
	},
#endif
};
static struct i2c_board_info tegra_i2c_bus2_board_info[] = {
	{
	/* only exists on Etna P2+; probe will gracefully fail if HW doesn't exist */
		I2C_BOARD_INFO(L3G4200D_NAME, 0x68),
		.platform_data = &tegra_gyro_pdata,
		.irq = GPIO_TO_IRQ(TEGRA_GPIO_PH2),
	},
};
static struct i2c_board_info tegra_i2c_bus3_board_info[] = {
	{
		I2C_BOARD_INFO("akm8975", 0x0C),
		.platform_data = &akm8975_data,
		.irq = GPIO_TO_IRQ(TEGRA_GPIO_PE2),
	},
	{
		I2C_BOARD_INFO("kxtf9", 0x0F),
		.platform_data = &kxtf9_data,
	},
#if defined(CONFIG_TEGRA_ODM_ETNA)
	{
		/*  ISL 29030 (prox/ALS) driver */
예제 #14
0
	int size = ARRAY_SIZE(brcm_wlan_translate_custom_table);
	int i;

	if (!ccode)
		return NULL;

	for (i = 0; i < size; i++)
		if (strcmp(ccode, brcm_wlan_translate_custom_table[i].iso_abbrev) == 0)
			return &brcm_wlan_translate_custom_table[i];
	return &brcm_wlan_translate_custom_table[0];
}

static struct resource brcm_wlan_resources[] = {
	[0] = {
		.name	= "bcmdhd_wlan_irq",
		.start	= GPIO_TO_IRQ(WL_HOST_WAKE_GOLDEN_BRINGUP),
		.end	= GPIO_TO_IRQ(WL_HOST_WAKE_GOLDEN_BRINGUP),
//chanyun 12.21		.flags	= IORESOURCE_IRQ | IORESOURCE_IRQ_LOWEDGE,
		.flags = IORESOURCE_IRQ | IRQF_TRIGGER_FALLING /*IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL | IORESOURCE_IRQ_SHAREABLE*/,
	},
};

static struct wifi_platform_data brcm_wlan_control = {
	.set_power	= brcm_wlan_power,
	.set_reset	= brcm_wlan_reset,
	.set_carddetect	= brcm_set_carddetect,
#ifdef CONFIG_BROADCOM_WIFI_RESERVED_MEM
	.mem_prealloc	= brcm_wlan_mem_prealloc,
#endif
	.get_country_code = brcm_wlan_get_country_code,
};
void ux500_suspend_dbg_remove_wake_on_uart(void)
{
	irq_set_irq_wake(GPIO_TO_IRQ(ux500_console_uart_gpio_pin), 0);
}
void ux500_suspend_dbg_add_wake_on_uart(void)
{
	irq_set_irq_wake(GPIO_TO_IRQ(ux500_console_uart_gpio_pin), 1);
	irq_set_irq_type(GPIO_TO_IRQ(ux500_console_uart_gpio_pin),
			 IRQ_TYPE_EDGE_BOTH);
}
	.name_a = "lsm303dlh.0",
	.name_m = "lsm303dlh.1",
	.axis_map_x = 1,
	.axis_map_y = 0,
	.axis_map_z = 2,
	.negative_x = 0,
	.negative_y = 0,
	.negative_z = 1,
};

/*
 * Touchscreen
 */

static struct synaptics_rmi4_platform_data rmi4_i2c_platformdata = {
	.irq_number	= GPIO_TO_IRQ(179),
	.irq_type	= (IRQF_TRIGGER_FALLING | IRQF_SHARED),
#if defined(CONFIG_DISPLAY_GENERIC_DSI_PRIMARY_ROTATION_ANGLE) &&      \
			CONFIG_DISPLAY_GENERIC_DSI_PRIMARY_ROTATION_ANGLE == 270
	.x_flip		= true,
	.y_flip		= false,
#else
	.x_flip		= false,
	.y_flip		= true,
#endif
	.regulator_en	= true,
};

static struct av8100_platform_data av8100_plat_data = {
	.irq = GPIO_TO_IRQ(223),
	.reset = 225,
예제 #18
0
		else
			wlan_static_skb[i] = dev_alloc_skb(8192);
		}
	for (i = 0; (i < PREALLOC_WLAN_NUMBER_OF_SECTIONS); i++) {
		wifi_mem_array[i].mem_ptr = kmalloc(wifi_mem_array[i].size,
			GFP_KERNEL);
		if (wifi_mem_array[i].mem_ptr == NULL)
			return -ENOMEM;
	}
return 0;
 }

static struct resource mot_wifi_resources[] = {
	[0] = {
		.name	= "bcm4329_wlan_irq",
		.start	= GPIO_TO_IRQ(WLAN_IRQ_GPIO),
		.end	= GPIO_TO_IRQ(WLAN_IRQ_GPIO),
		.flags	= IORESOURCE_IRQ | IORESOURCE_IRQ_LOWLEVEL
			| IORESOURCE_IRQ_SHAREABLE,
	},
 };

 static int mot_wifi_cd; /* WIFI virtual 'card detect' status */
 static void (*wifi_status_cb)(int card_present, void *dev_id);
 static void *wifi_status_cb_devid;

 int mot_wifi_set_carddetect(int val)
 {
	pr_debug("%s: %d\n", __func__, val);
	mot_wifi_cd = val;
	sdhci_tegra_wlan_detect();
예제 #19
0
int __flash_gpio_to_irq(int gpio)
{

	return GPIO_TO_IRQ(gpio);
}
예제 #20
0
	int size = ARRAY_SIZE(brcm_wlan_translate_custom_table);
	int i;

	if (!ccode)
		return NULL;

	for (i = 0; i < size; i++)
		if (strcmp(ccode, brcm_wlan_translate_custom_table[i].iso_abbrev) == 0)
			return &brcm_wlan_translate_custom_table[i];
	return &brcm_wlan_translate_custom_table[0];
}

static struct resource brcm_wlan_resources[] = {
	[0] = {
		.name	= "bcmdhd_wlan_irq",
		.start	= GPIO_TO_IRQ(WL_HOST_WAKE_CODINA_R0_0),
		.end	= GPIO_TO_IRQ(WL_HOST_WAKE_CODINA_R0_0),
//chanyun 12.21		.flags	= IORESOURCE_IRQ | IORESOURCE_IRQ_LOWEDGE,
		.flags = IORESOURCE_IRQ | IRQF_TRIGGER_FALLING /*IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL | IORESOURCE_IRQ_SHAREABLE*/,
	},
};

static struct wifi_platform_data brcm_wlan_control = {
	.set_power	= brcm_wlan_power,
	.set_reset	= brcm_wlan_reset,
	.set_carddetect	= brcm_set_carddetect,
#ifdef CONFIG_BROADCOM_WIFI_RESERVED_MEM
	.mem_prealloc	= brcm_wlan_mem_prealloc,
#endif
	.get_country_code = brcm_wlan_get_country_code,
};
/**
 * db5500_keypad_probe() - Initialze the the keypad driver
 * @pdev: pointer to platform device structure
 *
 * This function will allocate and initialize the instance
 * data and request the irq and register to input subsystem driver.
 */
static int __devinit db5500_keypad_probe(struct platform_device *pdev)
{
	struct db5500_keypad_platform_data *plat;
	struct db5500_keypad *keypad;
	struct resource *res;
	struct input_dev *input;
	void __iomem *base;
	struct clk *clk;
	int ret;
	int irq;
	int i;

	plat = pdev->dev.platform_data;
	if (!plat) {
		dev_err(&pdev->dev, "invalid keypad platform data\n");
		ret = -EINVAL;
		goto out_ret;
	}

	irq = platform_get_irq(pdev, 0);
	if (irq < 0) {
		dev_err(&pdev->dev, "failed to get keypad irq\n");
		ret = -EINVAL;
		goto out_ret;
	}

	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	if (res == NULL) {
		dev_err(&pdev->dev, "missing platform resources\n");
		ret = -EINVAL;
		goto out_ret;
	}

	res = request_mem_region(res->start, resource_size(res), pdev->name);
	if (!res) {
		dev_err(&pdev->dev, "failed to request I/O memory\n");
		ret = -EBUSY;
		goto out_ret;
	}

	base = ioremap(res->start, resource_size(res));
	if (!base) {
		dev_err(&pdev->dev, "failed to remap I/O memory\n");
		ret = -ENXIO;
		goto out_freerequest_memregions;
	}

	clk = clk_get(&pdev->dev, NULL);
	if (IS_ERR(clk)) {
		dev_err(&pdev->dev, "failed to clk_get\n");
		ret = PTR_ERR(clk);
		goto out_iounmap;
	}

	keypad = kzalloc(sizeof(struct db5500_keypad), GFP_KERNEL);
	if (!keypad) {
		dev_err(&pdev->dev, "failed to allocate keypad memory\n");
		ret = -ENOMEM;
		goto out_freeclk;
	}

	input = input_allocate_device();
	if (!input) {
		dev_err(&pdev->dev, "failed to input_allocate_device\n");
		ret = -ENOMEM;
		goto out_freekeypad;
	}

	keypad->regulator = regulator_get(&pdev->dev, "v-ape");
	if (IS_ERR(keypad->regulator)) {
		dev_err(&pdev->dev, "regulator_get failed\n");
		keypad->regulator = NULL;
		ret = -EINVAL;
		goto out_regulator_get;
	} else {
		ret = regulator_enable(keypad->regulator);
		if (ret < 0) {
			dev_err(&pdev->dev, "regulator_enable failed\n");
			goto out_regulator_enable;
		}
	}

	input->id.bustype = BUS_HOST;
	input->name = "db5500-keypad";
	input->dev.parent = &pdev->dev;

	input->keycode = keypad->keymap;
	input->keycodesize = sizeof(keypad->keymap[0]);
	input->keycodemax = ARRAY_SIZE(keypad->keymap);

	input_set_capability(input, EV_MSC, MSC_SCAN);

	__set_bit(EV_KEY, input->evbit);
	if (!plat->no_autorepeat)
		__set_bit(EV_REP, input->evbit);

	matrix_keypad_build_keymap(plat->keymap_data, KEYPAD_ROW_SHIFT,
				   input->keycode, input->keybit);

	ret = input_register_device(input);
	if (ret) {
		dev_err(&pdev->dev,
			"unable to register input device: %d\n", ret);
		goto out_freeinput;
	}

	keypad->irq	= irq;
	keypad->board	= plat;
	keypad->input	= input;
	keypad->base	= base;
	keypad->clk	= clk;

	INIT_DELAYED_WORK(&keypad->switch_work, db5500_gpio_switch_work);
	INIT_DELAYED_WORK(&keypad->gpio_work, db5500_gpio_release_work);

	clk_enable(keypad->clk);
if (!keypad->board->init) {
		dev_err(&pdev->dev, "init funtion not defined\n");
		ret = -EINVAL;
		goto out_unregisterinput;
	}

	if (keypad->board->init() < 0) {
		dev_err(&pdev->dev, "keyboard init config failed\n");
		ret = -EINVAL;
		goto out_unregisterinput;
	}

	if (!keypad->board->exit) {
		dev_err(&pdev->dev, "exit funtion not defined\n");
		ret = -EINVAL;
		goto out_unregisterinput;
	}

	if (keypad->board->exit() < 0) {
		dev_err(&pdev->dev,  "keyboard exit config failed\n");
		ret = -EINVAL;
		goto out_unregisterinput;
	}

	for (i = 0; i < keypad->board->krow; i++) {
		keypad->db5500_rows[i] = *plat->gpio_input_pins;
		keypad->gpio_input_irq[i] =
				GPIO_TO_IRQ(keypad->db5500_rows[i]);
		plat->gpio_input_pins++;
	}

	for (i = 0; i < keypad->board->kcol; i++) {
		keypad->db5500_cols[i] = *plat->gpio_output_pins;
		plat->gpio_output_pins++;
	}

	for (i = 0; i < keypad->board->krow; i++) {
		ret =  request_threaded_irq(keypad->gpio_input_irq[i],
				NULL, db5500_keypad_gpio_irq,
				IRQF_TRIGGER_FALLING | IRQF_NO_SUSPEND,
				"db5500-keypad-gpio", keypad);
		if (ret) {
			dev_err(&pdev->dev, "allocate gpio irq %d failed\n",
						keypad->gpio_input_irq[i]);
			goto out_unregisterinput;
		}
		enable_irq_wake(keypad->gpio_input_irq[i]);
	}

	ret = request_threaded_irq(keypad->irq, NULL, db5500_keypad_irq,
				   IRQF_ONESHOT, "db5500-keypad", keypad);
	if (ret) {
		dev_err(&pdev->dev, "allocate irq %d failed\n", keypad->irq);
		goto out_unregisterinput;
	}

	platform_set_drvdata(pdev, keypad);

	clk_disable(keypad->clk);
	regulator_disable(keypad->regulator);
	return 0;

out_unregisterinput:
	input_unregister_device(input);
	input = NULL;
	clk_disable(keypad->clk);
out_freeinput:
	input_free_device(input);
out_regulator_enable:
	regulator_put(keypad->regulator);
out_regulator_get:
	input_free_device(input);
out_freekeypad:
	kfree(keypad);
out_freeclk:
	clk_put(clk);
out_iounmap:
	iounmap(base);
out_freerequest_memregions:
	release_mem_region(res->start, resource_size(res));
out_ret:
	return ret;
}
	.init           = ske_kp_init,
	.exit           = ske_kp_exit,
	.gpio_input_pins = ske_kp_rows,
	.gpio_output_pins = ske_kp_cols,
	.keymap_data    = &ux500_keymap_data,
	.no_autorepeat  = true,
	.krow           = SKE_KPD_MAX_ROWS,     /* 8x8 matrix */
	.kcol           = SKE_KPD_MAX_COLS,
	.debounce_ms    = 20,                   /* in timeout period */
	.switch_delay	= 200,			/* in jiffies */
};

static struct av8100_platform_data av8100_plat_data = {
	.init = av8100_plat_init,
	.exit = av8100_plat_exit,
	.irq = GPIO_TO_IRQ(192),
	.reset = 196,
	.inputclk_id = "sysclk2",
	.regulator_pwr_id = "hdmi_1v8",
	.alt_powerupseq = false,
	.mclk_freq = 3, /* MCLK_RNG_31_38 */
};

/*
 * TC35892 Expander
 */

static struct tc35892_gpio_platform_data tc35892_gpio_platform_data = {
	.gpio_base = U8500_NR_GPIO,
};
예제 #23
0
	int size = ARRAY_SIZE(brcm_wlan_translate_custom_table);
	int i;

	if (!ccode)
		return NULL;

	for (i = 0; i < size; i++)
		if (strcmp(ccode, brcm_wlan_translate_custom_table[i].iso_abbrev) == 0)
			return &brcm_wlan_translate_custom_table[i];
	return &brcm_wlan_translate_custom_table[0];
}

static struct resource brcm_wlan_resources[] = {
	[0] = {
		.name	= "bcmdhd_wlan_irq",
		.start	= GPIO_TO_IRQ(WL_HOST_WAKE_SKOMER_BRINGUP),
		.end	= GPIO_TO_IRQ(WL_HOST_WAKE_SKOMER_BRINGUP),
//chanyun 12.21		.flags	= IORESOURCE_IRQ | IORESOURCE_IRQ_LOWEDGE,
		.flags = IORESOURCE_IRQ | IRQF_TRIGGER_FALLING /*IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL | IORESOURCE_IRQ_SHAREABLE*/,
	},
};

static struct wifi_platform_data brcm_wlan_control = {
	.set_power	= brcm_wlan_power,
	.set_reset	= brcm_wlan_reset,
	.set_carddetect	= brcm_set_carddetect,
#ifdef CONFIG_BROADCOM_WIFI_RESERVED_MEM
	.mem_prealloc	= brcm_wlan_mem_prealloc,
#endif
	.get_country_code = brcm_wlan_get_country_code,
};
#include <mach/cw1200_plat.h>
#include <linux/clk.h>

static void cw1200_release(struct device *dev);
static int cw1200_clk_ctrl(const struct cw1200_platform_data *pdata,
		bool enable);

static struct resource cw1200_pdp_resources[] = {
	{
		.start = 20,
		.end = 20,
		.flags = IORESOURCE_IO,
		.name = "cw1200_reset",
	},
	{
		.start = GPIO_TO_IRQ(169),
		.end = GPIO_TO_IRQ(169),
		.flags = IORESOURCE_IRQ,
		.name = "cw1200_irq",
	},
};


static struct cw1200_platform_data cw1200_platform_data = {
	.clk_ctrl = cw1200_clk_ctrl,
};

static struct platform_device cw1200_device = {
	.name = "cw1200_wlan",
	.dev = {
		.platform_data = &cw1200_platform_data,
예제 #25
0
static int __init ws2401_dpi_spi_probe(struct spi_device *spi)
{
    int ret = 0;
    struct ws2401_dpi *lcd = container_of(spi->dev.driver,
                                          struct ws2401_dpi, spi_drv.driver);

    dev_dbg(&spi->dev, "panel ws2401_dpi spi being probed\n");

    dev_set_drvdata(&spi->dev, lcd);

    /* ws2401_dpi lcd panel uses 3-wire 9bits SPI Mode. */
    spi->bits_per_word = 9;

    ret = spi_setup(spi);
    if (ret < 0) {
        dev_err(&spi->dev, "spi setup failed.\n");
        goto out;
    }

    lcd->spi = spi;

    /*
     * if lcd panel was on from bootloader like u-boot then
     * do not lcd on.
     */
    if (!lcd->pd->platform_enabled) {
        /*
         * if lcd panel was off from bootloader then
         * current lcd status is powerdown and then
         * it enables lcd panel.
         */
        lcd->power = FB_BLANK_POWERDOWN;

        ws2401_dpi_power(lcd, FB_BLANK_UNBLANK);
    } else {
        lcd->power = FB_BLANK_UNBLANK;
        lcd->ldi_state = LDI_STATE_ON;
    }


#ifdef ESD_OPERATION
    lcd->esd_workqueue = create_singlethread_workqueue("esd_workqueue");

    if (!lcd->esd_workqueue) {
        dev_info(lcd->dev, "esd_workqueue create fail\n");
        return -ENOMEM;
    }

    INIT_WORK(&(lcd->esd_work), esd_work_func);

    lcd->esd_port = ESD_PORT_NUM;

    if (request_threaded_irq(GPIO_TO_IRQ(lcd->esd_port), NULL,
                             esd_interrupt_handler, IRQF_TRIGGER_RISING, "esd_interrupt", lcd)) {
        dev_info(lcd->dev, "esd irq request fail\n");
        free_irq(GPIO_TO_IRQ(lcd->esd_port), NULL);
        lcd->lcd_connected = 0;
    } else {
        /* low is normal. On PBA esd_port coule be HIGH */
        if (!gpio_get_value(lcd->esd_port)) {
            dev_info(lcd->dev, "esd irq enabled on booting\n");
            lcd->esd_enable = 1;
            lcd->lcd_connected = 1;
        } else {
            dev_info(lcd->dev, "esd irq disabled on booting\n");
            disable_irq(GPIO_TO_IRQ(lcd->esd_port));
            lcd->esd_enable = 0;
            lcd->lcd_connected = 0;
        }
    }

    dev_info(lcd->dev, "%s esd work success\n");

#ifdef ESD_TEST
    pdpi = lcd;
    setup_timer(&lcd->esd_test_timer, est_test_timer_func, 0);
    mod_timer(&lcd->esd_test_timer,  jiffies + (3*HZ));
#endif
#endif

    dev_dbg(&spi->dev, "ws2401_dpi spi has been probed.\n");

out:
    return ret;
}