diff options
Diffstat (limited to 'drivers/misc')
| -rw-r--r-- | drivers/misc/Kconfig | 1 | ||||
| -rw-r--r-- | drivers/misc/ab8500-pwm.c | 2 | ||||
| -rw-r--r-- | drivers/misc/fsa9480.c | 4 | ||||
| -rw-r--r-- | drivers/misc/lis3lv02d/lis3lv02d.c | 14 | ||||
| -rw-r--r-- | drivers/misc/pti.c | 14 | ||||
| -rw-r--r-- | drivers/misc/ti-st/st_core.c | 10 | ||||
| -rw-r--r-- | drivers/misc/ti-st/st_kim.c | 33 | ||||
| -rw-r--r-- | drivers/misc/ti-st/st_ll.c | 19 | 
8 files changed, 80 insertions, 17 deletions
diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig index 0a4d86c6c4a..2d6423c2d19 100644 --- a/drivers/misc/Kconfig +++ b/drivers/misc/Kconfig @@ -146,6 +146,7 @@ config PHANTOM  config INTEL_MID_PTI  	tristate "Parallel Trace Interface for MIPI P1149.7 cJTAG standard" +	depends on PCI  	default n  	help  	  The PTI (Parallel Trace Interface) driver directs diff --git a/drivers/misc/ab8500-pwm.c b/drivers/misc/ab8500-pwm.c index 54e3d05b63c..35903154ca2 100644 --- a/drivers/misc/ab8500-pwm.c +++ b/drivers/misc/ab8500-pwm.c @@ -164,5 +164,5 @@ subsys_initcall(ab8500_pwm_init);  module_exit(ab8500_pwm_exit);  MODULE_AUTHOR("Arun MURTHY <arun.murthy@stericsson.com>");  MODULE_DESCRIPTION("AB8500 Pulse Width Modulation Driver"); -MODULE_ALIAS("AB8500 PWM driver"); +MODULE_ALIAS("platform:ab8500-pwm");  MODULE_LICENSE("GPL v2"); diff --git a/drivers/misc/fsa9480.c b/drivers/misc/fsa9480.c index 5325a7e70dc..27dc0d21aaf 100644 --- a/drivers/misc/fsa9480.c +++ b/drivers/misc/fsa9480.c @@ -455,7 +455,7 @@ static int __devinit fsa9480_probe(struct i2c_client *client,  fail2:  	if (client->irq) -		free_irq(client->irq, NULL); +		free_irq(client->irq, usbsw);  fail1:  	i2c_set_clientdata(client, NULL);  	kfree(usbsw); @@ -466,7 +466,7 @@ static int __devexit fsa9480_remove(struct i2c_client *client)  {  	struct fsa9480_usbsw *usbsw = i2c_get_clientdata(client);  	if (client->irq) -		free_irq(client->irq, NULL); +		free_irq(client->irq, usbsw);  	i2c_set_clientdata(client, NULL);  	sysfs_remove_group(&client->dev.kobj, &fsa9480_group); diff --git a/drivers/misc/lis3lv02d/lis3lv02d.c b/drivers/misc/lis3lv02d/lis3lv02d.c index b928bc14e97..8b51cd62d06 100644 --- a/drivers/misc/lis3lv02d/lis3lv02d.c +++ b/drivers/misc/lis3lv02d/lis3lv02d.c @@ -375,12 +375,14 @@ void lis3lv02d_poweron(struct lis3lv02d *lis3)  	 *      both have been read. So the value read will always be correct.  	 * Set BOOT bit to refresh factory tuning values.  	 */ -	lis3->read(lis3, CTRL_REG2, ®); -	if (lis3->whoami ==  WAI_12B) -		reg |= CTRL2_BDU | CTRL2_BOOT; -	else -		reg |= CTRL2_BOOT_8B; -	lis3->write(lis3, CTRL_REG2, reg); +	if (lis3->pdata) { +		lis3->read(lis3, CTRL_REG2, ®); +		if (lis3->whoami ==  WAI_12B) +			reg |= CTRL2_BDU | CTRL2_BOOT; +		else +			reg |= CTRL2_BOOT_8B; +		lis3->write(lis3, CTRL_REG2, reg); +	}  	/* LIS3 power on delay is quite long */  	msleep(lis3->pwron_delay / lis3lv02d_get_odr()); diff --git a/drivers/misc/pti.c b/drivers/misc/pti.c index 8653bd0b1a3..0b56e3f4357 100644 --- a/drivers/misc/pti.c +++ b/drivers/misc/pti.c @@ -33,6 +33,8 @@  #include <linux/mutex.h>  #include <linux/miscdevice.h>  #include <linux/pti.h> +#include <linux/slab.h> +#include <linux/uaccess.h>  #define DRIVERNAME		"pti"  #define PCINAME			"pciPTI" @@ -163,6 +165,11 @@ static void pti_write_to_aperture(struct pti_masterchannel *mc,  static void pti_control_frame_built_and_sent(struct pti_masterchannel *mc,  					     const char *thread_name)  { +	/* +	 * Since we access the comm member in current's task_struct, we only +	 * need to be as large as what 'comm' in that structure is. +	 */ +	char comm[TASK_COMM_LEN];  	struct pti_masterchannel mccontrol = {.master = CONTROL_ID,  					      .channel = 0};  	const char *thread_name_p; @@ -170,13 +177,6 @@ static void pti_control_frame_built_and_sent(struct pti_masterchannel *mc,  	u8 control_frame[CONTROL_FRAME_LEN];  	if (!thread_name) { -		/* -		 * Since we access the comm member in current's task_struct, -		 * we only need to be as large as what 'comm' in that -		 * structure is. -		 */ -		char comm[TASK_COMM_LEN]; -  		if (!in_interrupt())  			get_task_comm(comm, current);  		else diff --git a/drivers/misc/ti-st/st_core.c b/drivers/misc/ti-st/st_core.c index 54c91ffe4a9..ba168a7d54d 100644 --- a/drivers/misc/ti-st/st_core.c +++ b/drivers/misc/ti-st/st_core.c @@ -338,6 +338,12 @@ void st_int_recv(void *disc_data,  			/* Unknow packet? */  		default:  			type = *ptr; +			if (st_gdata->list[type] == NULL) { +				pr_err("chip/interface misbehavior dropping" +					" frame starting with 0x%02x", type); +				goto done; + +			}  			st_gdata->rx_skb = alloc_skb(  					st_gdata->list[type]->max_frame_size,  					GFP_ATOMIC); @@ -354,6 +360,7 @@ void st_int_recv(void *disc_data,  		ptr++;  		count--;  	} +done:  	spin_unlock_irqrestore(&st_gdata->lock, flags);  	pr_debug("done %s", __func__);  	return; @@ -717,9 +724,10 @@ static void st_tty_close(struct tty_struct *tty)  	 */  	spin_lock_irqsave(&st_gdata->lock, flags);  	for (i = ST_BT; i < ST_MAX_CHANNELS; i++) { -		if (st_gdata->list[i] != NULL) +		if (st_gdata->is_registered[i] == true)  			pr_err("%d not un-registered", i);  		st_gdata->list[i] = NULL; +		st_gdata->is_registered[i] = false;  	}  	st_gdata->protos_registered = 0;  	spin_unlock_irqrestore(&st_gdata->lock, flags); diff --git a/drivers/misc/ti-st/st_kim.c b/drivers/misc/ti-st/st_kim.c index 38fd2f04c07..3a3580566df 100644 --- a/drivers/misc/ti-st/st_kim.c +++ b/drivers/misc/ti-st/st_kim.c @@ -68,6 +68,7 @@ void validate_firmware_response(struct kim_data_s *kim_gdata)  	if (unlikely(skb->data[5] != 0)) {  		pr_err("no proper response during fw download");  		pr_err("data6 %x", skb->data[5]); +		kfree_skb(skb);  		return;		/* keep waiting for the proper response */  	}  	/* becos of all the script being downloaded */ @@ -210,6 +211,7 @@ static long read_local_version(struct kim_data_s *kim_gdata, char *bts_scr_name)  		pr_err(" waiting for ver info- timed out ");  		return -ETIMEDOUT;  	} +	INIT_COMPLETION(kim_gdata->kim_rcvd);  	version =  		MAKEWORD(kim_gdata->resp_buffer[13], @@ -298,6 +300,7 @@ static long download_firmware(struct kim_data_s *kim_gdata)  		switch (((struct bts_action *)ptr)->type) {  		case ACTION_SEND_COMMAND:	/* action send */ +			pr_debug("S");  			action_ptr = &(((struct bts_action *)ptr)->data[0]);  			if (unlikely  			    (((struct hci_command *)action_ptr)->opcode == @@ -335,6 +338,10 @@ static long download_firmware(struct kim_data_s *kim_gdata)  				release_firmware(kim_gdata->fw_entry);  				return -ETIMEDOUT;  			} +			/* reinit completion before sending for the +			 * relevant wait +			 */ +			INIT_COMPLETION(kim_gdata->kim_rcvd);  			/*  			 * Free space found in uart buffer, call st_int_write @@ -361,6 +368,7 @@ static long download_firmware(struct kim_data_s *kim_gdata)  			}  			break;  		case ACTION_WAIT_EVENT:  /* wait */ +			pr_debug("W");  			if (!wait_for_completion_timeout  					(&kim_gdata->kim_rcvd,  					 msecs_to_jiffies(CMD_RESP_TIME))) { @@ -434,11 +442,17 @@ long st_kim_start(void *kim_data)  {  	long err = 0;  	long retry = POR_RETRY_COUNT; +	struct ti_st_plat_data	*pdata;  	struct kim_data_s	*kim_gdata = (struct kim_data_s *)kim_data;  	pr_info(" %s", __func__); +	pdata = kim_gdata->kim_pdev->dev.platform_data;  	do { +		/* platform specific enabling code here */ +		if (pdata->chip_enable) +			pdata->chip_enable(kim_gdata); +  		/* Configure BT nShutdown to HIGH state */  		gpio_set_value(kim_gdata->nshutdown, GPIO_LOW);  		mdelay(5);	/* FIXME: a proper toggle */ @@ -460,6 +474,12 @@ long st_kim_start(void *kim_data)  			pr_info("ldisc_install = 0");  			sysfs_notify(&kim_gdata->kim_pdev->dev.kobj,  					NULL, "install"); +			/* the following wait is never going to be completed, +			 * since the ldisc was never installed, hence serving +			 * as a mdelay of LDISC_TIME msecs */ +			err = wait_for_completion_timeout +				(&kim_gdata->ldisc_installed, +				 msecs_to_jiffies(LDISC_TIME));  			err = -ETIMEDOUT;  			continue;  		} else { @@ -472,6 +492,13 @@ long st_kim_start(void *kim_data)  				pr_info("ldisc_install = 0");  				sysfs_notify(&kim_gdata->kim_pdev->dev.kobj,  						NULL, "install"); +				/* this wait might be completed, though in the +				 * tty_close() since the ldisc is already +				 * installed */ +				err = wait_for_completion_timeout +					(&kim_gdata->ldisc_installed, +					 msecs_to_jiffies(LDISC_TIME)); +				err = -EINVAL;  				continue;  			} else {	/* on success don't retry */  				break; @@ -489,6 +516,8 @@ long st_kim_stop(void *kim_data)  {  	long err = 0;  	struct kim_data_s	*kim_gdata = (struct kim_data_s *)kim_data; +	struct ti_st_plat_data	*pdata = +		kim_gdata->kim_pdev->dev.platform_data;  	INIT_COMPLETION(kim_gdata->ldisc_installed); @@ -515,6 +544,10 @@ long st_kim_stop(void *kim_data)  	gpio_set_value(kim_gdata->nshutdown, GPIO_HIGH);  	mdelay(1);  	gpio_set_value(kim_gdata->nshutdown, GPIO_LOW); + +	/* platform specific disable */ +	if (pdata->chip_disable) +		pdata->chip_disable(kim_gdata);  	return err;  } diff --git a/drivers/misc/ti-st/st_ll.c b/drivers/misc/ti-st/st_ll.c index 3f249513885..1ff460a8e9c 100644 --- a/drivers/misc/ti-st/st_ll.c +++ b/drivers/misc/ti-st/st_ll.c @@ -22,6 +22,7 @@  #define pr_fmt(fmt) "(stll) :" fmt  #include <linux/skbuff.h>  #include <linux/module.h> +#include <linux/platform_device.h>  #include <linux/ti_wilink_st.h>  /**********************************************************************/ @@ -37,6 +38,9 @@ static void send_ll_cmd(struct st_data_s *st_data,  static void ll_device_want_to_sleep(struct st_data_s *st_data)  { +	struct kim_data_s	*kim_data; +	struct ti_st_plat_data	*pdata; +  	pr_debug("%s", __func__);  	/* sanity check */  	if (st_data->ll_state != ST_LL_AWAKE) @@ -46,10 +50,19 @@ static void ll_device_want_to_sleep(struct st_data_s *st_data)  	send_ll_cmd(st_data, LL_SLEEP_ACK);  	/* update state */  	st_data->ll_state = ST_LL_ASLEEP; + +	/* communicate to platform about chip asleep */ +	kim_data = st_data->kim_data; +	pdata = kim_data->kim_pdev->dev.platform_data; +	if (pdata->chip_asleep) +		pdata->chip_asleep(NULL);  }  static void ll_device_want_to_wakeup(struct st_data_s *st_data)  { +	struct kim_data_s	*kim_data; +	struct ti_st_plat_data	*pdata; +  	/* diff actions in diff states */  	switch (st_data->ll_state) {  	case ST_LL_ASLEEP: @@ -70,6 +83,12 @@ static void ll_device_want_to_wakeup(struct st_data_s *st_data)  	}  	/* update state */  	st_data->ll_state = ST_LL_AWAKE; + +	/* communicate to platform about chip wakeup */ +	kim_data = st_data->kim_data; +	pdata = kim_data->kim_pdev->dev.platform_data; +	if (pdata->chip_asleep) +		pdata->chip_awake(NULL);  }  /**********************************************************************/  |