Ejemplo n.º 1
0
static int mcs6000_ts_probe(struct i2c_client *client, const struct i2c_device_id *id)
{
	int err = 0;
	struct touch_platform_data *ts_pdata;
	struct mcs6000_ts_device *dev;
	unsigned char fw_ver, hw_ver;

	DMSG("%s: start...\n", __FUNCTION__);

	ts_pdata = client->dev.platform_data;

#ifdef LG_FW_MULTI_TOUCH
	input_set_abs_params(mcs6000_ts_input, ABS_MT_POSITION_X, ts_pdata->ts_x_min, ts_pdata->ts_x_max, 0, 0);
	input_set_abs_params(mcs6000_ts_input, ABS_MT_POSITION_Y, ts_pdata->ts_y_min, ts_pdata->ts_y_max, 0, 0);
#else	
	input_set_abs_params(mcs6000_ts_input, ABS_X, ts_pdata->ts_x_min, ts_pdata->ts_x_max, 0, 0);
	input_set_abs_params(mcs6000_ts_input, ABS_Y, ts_pdata->ts_y_min, ts_pdata->ts_y_max, 0, 0);
#endif

	dev = &mcs6000_ts_dev;

	INIT_DELAYED_WORK(&dev->work, mcs6000_work);

	dev->power = ts_pdata->power;	
	dev->num_irq = client->irq;
	dev->intr_gpio	= (client->irq) - NR_MSM_IRQS ;
	dev->sda_gpio = ts_pdata->sda;
	dev->scl_gpio  = ts_pdata->scl;

#ifndef REVD_I2C_PROX_ECOM
	if(lge_bd_rev < LGE_REV_D)
	{
		KEY_MENU_TOUCHED 		= 2; 
		KEY_HOME_TOUCHED 		= 3;
		KEY_BACK_TOUCHED 		= 1;
		KEY_SEARCH_TOUCHED	= 4;
	}
	else
#endif
	{
		KEY_MENU_TOUCHED 		= 1; 
		KEY_HOME_TOUCHED 		= 2;
		KEY_BACK_TOUCHED 		= 3;
		KEY_SEARCH_TOUCHED	= 4;		
	}

#ifdef LG_FW_HARDKEY_BLOCK
	hrtimer_init(&dev->touch_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
	dev->touch_timer.function = timed_touch_timer_func;
#endif

	dev->input_dev = mcs6000_ts_input;
	DMSG("mcs6000 dev->num_irq is %d , dev->intr_gpio is %d\n", dev->num_irq,dev->intr_gpio);

	dev->client = client;
	i2c_set_clientdata(client, dev);

	if (!(err = i2c_check_functionality(client->adapter, I2C_FUNC_I2C))) {
		printk(KERN_ERR "%s: fucntionality check failed\n",
				__FUNCTION__);
		return err;
	}

	err = gpio_direction_input(dev->intr_gpio);
	if (err < 0) {
		printk(KERN_ERR "%s: gpio input direction fail\n", __FUNCTION__);
		return err;
	}

	/* TODO: You have try to change this driver's architecture using request_threaded_irq()
	 * So, I will change this to request_threaded_irq()
	 */
	err = request_threaded_irq(dev->num_irq, NULL, mcs6000_ts_irq_handler,
			IRQF_TRIGGER_LOW | IRQF_ONESHOT, "mcs6000_ts", dev);

	if (err < 0) {
		printk(KERN_ERR "%s: request_irq failed\n", __FUNCTION__);
		return err;
	}

	disable_irq(dev->num_irq);
	mcs6000_ts_on();
	enable_irq(dev->num_irq);

#ifdef CONFIG_HAS_EARLYSUSPEND
	ts_early_suspend.suspend = mcs6000_early_suspend;
	ts_early_suspend.resume = mcs6000_late_resume;
	ts_early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN - 40;
	register_early_suspend(&ts_early_suspend);
#endif
#ifdef LGE_MELFAS_UPDATE_ENABLE
	mcs6000_firmware_info(&fw_ver, &hw_ver);
#endif
	mcs6000_create_file(mcs6000_ts_input);  
	DMSG(KERN_INFO "%s: ts driver probed\n", __FUNCTION__);

	return 0;
}
Ejemplo n.º 2
0
static int mcs6000_ts_probe(struct i2c_client *client, const struct i2c_device_id *id)
{
	int err = 0;
	struct mcs6000_ts_device *dev;

	DMSG("[sub]%s: start...\n", __FUNCTION__);

	ts_sub_pdata = client->dev.platform_data;
#ifdef SLIDE_SUPPORT
	slider_state = 1;
	spin_lock_init(&mcs6000_slider_lock);
#endif
 
	input_set_abs_params(mcs6000_ts_input, ABS_X, ts_sub_pdata->ts_x_min, ts_sub_pdata->ts_x_max, 0, 0);
	input_set_abs_params(mcs6000_ts_input, ABS_Y, ts_sub_pdata->ts_y_min, ts_sub_pdata->ts_y_max, 0, 0);
#ifdef LG_FW_MULTI_TOUCH
	input_set_abs_params(mcs6000_ts_input, ABS_MT_POSITION_X, ts_sub_pdata->ts_x_min, ts_sub_pdata->ts_x_max, 0, 0);
	input_set_abs_params(mcs6000_ts_input, ABS_MT_POSITION_Y, ts_sub_pdata->ts_y_min, ts_sub_pdata->ts_y_max, 0, 0);
 #endif

	dev = &mcs6000_ts_dev;

	INIT_DELAYED_WORK(&dev->work, mcs6000_work);

	dev->power = ts_sub_pdata->power;	
	dev->num_irq = ts_sub_pdata->irq;
	dev->intr_gpio = ts_sub_pdata->gpio_int;
	dev->hw_i2c =  ts_sub_pdata->hw_i2c;
	dev->sda_gpio = ts_sub_pdata->sda;
	dev->scl_gpio  = ts_sub_pdata->scl;
	dev->ce_gpio  = ts_sub_pdata->ce;
	
	printk(KERN_DEBUG "Sub TS Power On. \n");
	dev->power(ON);
	
	dev->input_dev = mcs6000_ts_input;
	DMSG("[sub]mcs6000 dev->num_irq is %d , dev->intr_gpio is %d\n", dev->num_irq,dev->intr_gpio);

	dev->client = client;
	i2c_set_clientdata(client, dev);

	if (!(err = i2c_check_functionality(client->adapter, I2C_FUNC_I2C))) {
		printk(KERN_ERR "[sub]%s: fucntionality check failed\n",
				__FUNCTION__);
		return err;
	}

	gpio_request(dev->intr_gpio, "mcs6000_ts_sub interrupt");
	err = gpio_direction_input(dev->intr_gpio);
	if (err < 0) {
		printk(KERN_ERR "[sub]%s: gpio input direction fail\n", __FUNCTION__);
		return err;
	}

	// LGE_CHANGE [[email protected]] 2010-07-20, use request_irq for quick response
	/* TODO: You have try to change this driver's architecture using request_threaded_irq()
	 * So, I will change this to request_threaded_irq()
	 */
	/*
	err = request_threaded_irq(dev->num_irq, NULL, mcs6000_ts_irq_handler,
			IRQF_TRIGGER_LOW | IRQF_ONESHOT, "mcs6000_ts", dev);
	*/
	err = request_irq(dev->num_irq, mcs6000_ts_irq_handler,
			IRQF_TRIGGER_FALLING, "mcs6000_ts_sub", dev);

	if (err < 0) {
		printk(KERN_ERR "[sub]%s: request_irq failed\n", __FUNCTION__);
		return err;
	}

	disable_irq(dev->num_irq);
	if (gpio_request(dev->ce_gpio, "sub_touch_ce"))
		printk("Failed to request  SUB GPIO_TOUCH_EN!\n");
	gpio_direction_output(dev->ce_gpio, 1);
	msleep(10);
	enable_irq(dev->num_irq);

#ifdef CONFIG_HAS_EARLYSUSPEND
	ts_early_suspend.suspend = mcs6000_early_suspend;
	ts_early_suspend.resume = mcs6000_late_resume;
	ts_early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN - 40;
	register_early_suspend(&ts_early_suspend);
#endif

#ifdef SLIDE_SUPPORT
	err = input_register_handler(&mcs6000_sld_input_handler);
	DMSG(KERN_INFO "[sub] slider input_register_handler: %d.\n", err);
#endif

	mcs6000_firmware_info();
	mcs6000_create_file(mcs6000_ts_input);  
	DMSG(KERN_INFO "[sub]%s: ts driver probed\n", __FUNCTION__);

#ifdef DISABLE_SUB_TOUCH
	mcs6000_ts_onoff(0);
#endif

	return 0;
}