diff options
| -rw-r--r-- | Documentation/i2c/instantiating-devices | 2 | ||||
| -rw-r--r-- | drivers/i2c/i2c-core.c | 16 | ||||
| -rw-r--r-- | drivers/macintosh/therm_windtunnel.c | 4 | ||||
| -rw-r--r-- | drivers/media/video/bt8xx/bttv-i2c.c | 2 | ||||
| -rw-r--r-- | drivers/media/video/cx18/cx18-i2c.c | 3 | ||||
| -rw-r--r-- | drivers/media/video/em28xx/em28xx-cards.c | 2 | ||||
| -rw-r--r-- | drivers/media/video/ivtv/ivtv-i2c.c | 9 | ||||
| -rw-r--r-- | drivers/media/video/v4l2-common.c | 3 | ||||
| -rw-r--r-- | drivers/usb/host/ohci-pnx4008.c | 2 | ||||
| -rw-r--r-- | drivers/video/matrox/i2c-matroxfb.c | 2 | ||||
| -rw-r--r-- | include/linux/i2c.h | 7 | 
11 files changed, 31 insertions, 21 deletions
diff --git a/Documentation/i2c/instantiating-devices b/Documentation/i2c/instantiating-devices index e89490270ab..87da405a859 100644 --- a/Documentation/i2c/instantiating-devices +++ b/Documentation/i2c/instantiating-devices @@ -102,7 +102,7 @@ static int __devinit usb_hcd_pnx4008_probe(struct platform_device *pdev)  	memset(&i2c_info, 0, sizeof(struct i2c_board_info));  	strlcpy(i2c_info.name, "isp1301_pnx", I2C_NAME_SIZE);  	isp1301_i2c_client = i2c_new_probed_device(i2c_adap, &i2c_info, -						   normal_i2c); +						   normal_i2c, NULL);  	i2c_put_adapter(i2c_adap);  	(...)  } diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c index df937df845e..cf14ca06318 100644 --- a/drivers/i2c/i2c-core.c +++ b/drivers/i2c/i2c-core.c @@ -1464,14 +1464,18 @@ static int i2c_detect(struct i2c_adapter *adapter, struct i2c_driver *driver)  struct i2c_client *  i2c_new_probed_device(struct i2c_adapter *adap,  		      struct i2c_board_info *info, -		      unsigned short const *addr_list) +		      unsigned short const *addr_list, +		      int (*probe)(struct i2c_adapter *, unsigned short addr))  {  	int i; -	/* Stop here if the bus doesn't support probing */ -	if (!i2c_check_functionality(adap, I2C_FUNC_SMBUS_READ_BYTE)) { -		dev_err(&adap->dev, "Probing not supported\n"); -		return NULL; +	if (!probe) { +		/* Stop here if the bus doesn't support probing */ +		if (!i2c_check_functionality(adap, I2C_FUNC_SMBUS_READ_BYTE)) { +			dev_err(&adap->dev, "Probing not supported\n"); +			return NULL; +		} +		probe = i2c_default_probe;  	}  	for (i = 0; addr_list[i] != I2C_CLIENT_END; i++) { @@ -1490,7 +1494,7 @@ i2c_new_probed_device(struct i2c_adapter *adap,  		}  		/* Test address responsiveness */ -		if (i2c_default_probe(adap, addr_list[i])) +		if (probe(adap, addr_list[i]))  			break;  	} diff --git a/drivers/macintosh/therm_windtunnel.c b/drivers/macintosh/therm_windtunnel.c index 5c9367acf0c..7d1bfeb6a82 100644 --- a/drivers/macintosh/therm_windtunnel.c +++ b/drivers/macintosh/therm_windtunnel.c @@ -322,10 +322,10 @@ do_attach( struct i2c_adapter *adapter )  		memset(&info, 0, sizeof(struct i2c_board_info));  		strlcpy(info.type, "therm_ds1775", I2C_NAME_SIZE); -		i2c_new_probed_device(adapter, &info, scan_ds1775); +		i2c_new_probed_device(adapter, &info, scan_ds1775, NULL);  		strlcpy(info.type, "therm_adm1030", I2C_NAME_SIZE); -		i2c_new_probed_device(adapter, &info, scan_adm1030); +		i2c_new_probed_device(adapter, &info, scan_adm1030, NULL);  		if( x.thermostat && x.fan ) {  			x.running = 1; diff --git a/drivers/media/video/bt8xx/bttv-i2c.c b/drivers/media/video/bt8xx/bttv-i2c.c index 407fa61e4cd..685d6597ee7 100644 --- a/drivers/media/video/bt8xx/bttv-i2c.c +++ b/drivers/media/video/bt8xx/bttv-i2c.c @@ -411,7 +411,7 @@ void __devinit init_bttv_i2c_ir(struct bttv *btv)  		memset(&info, 0, sizeof(struct i2c_board_info));  		strlcpy(info.type, "ir_video", I2C_NAME_SIZE); -		i2c_new_probed_device(&btv->c.i2c_adap, &info, addr_list); +		i2c_new_probed_device(&btv->c.i2c_adap, &info, addr_list, NULL);  	}  } diff --git a/drivers/media/video/cx18/cx18-i2c.c b/drivers/media/video/cx18/cx18-i2c.c index 809f7d37129..73ce90c2f57 100644 --- a/drivers/media/video/cx18/cx18-i2c.c +++ b/drivers/media/video/cx18/cx18-i2c.c @@ -117,7 +117,8 @@ static int cx18_i2c_new_ir(struct cx18 *cx, struct i2c_adapter *adap, u32 hw,  		break;  	} -	return i2c_new_probed_device(adap, &info, addr_list) == NULL ? -1 : 0; +	return i2c_new_probed_device(adap, &info, addr_list, NULL) == NULL ? +	       -1 : 0;  }  int cx18_i2c_register(struct cx18 *cx, unsigned idx) diff --git a/drivers/media/video/em28xx/em28xx-cards.c b/drivers/media/video/em28xx/em28xx-cards.c index ffbe544e30f..e7efb4bffab 100644 --- a/drivers/media/video/em28xx/em28xx-cards.c +++ b/drivers/media/video/em28xx/em28xx-cards.c @@ -2385,7 +2385,7 @@ void em28xx_register_i2c_ir(struct em28xx *dev)  	if (dev->init_data.name)  		info.platform_data = &dev->init_data; -	i2c_new_probed_device(&dev->i2c_adap, &info, addr_list); +	i2c_new_probed_device(&dev->i2c_adap, &info, addr_list, NULL);  }  void em28xx_card_setup(struct em28xx *dev) diff --git a/drivers/media/video/ivtv/ivtv-i2c.c b/drivers/media/video/ivtv/ivtv-i2c.c index d391bbdb0b8..a74fa099c56 100644 --- a/drivers/media/video/ivtv/ivtv-i2c.c +++ b/drivers/media/video/ivtv/ivtv-i2c.c @@ -183,8 +183,8 @@ static int ivtv_i2c_new_ir(struct ivtv *itv, u32 hw, const char *type, u8 addr)  			return -1;  		memset(&info, 0, sizeof(struct i2c_board_info));  		strlcpy(info.type, type, I2C_NAME_SIZE); -		return i2c_new_probed_device(adap, &info, addr_list) == NULL -								     ? -1 : 0; +		return i2c_new_probed_device(adap, &info, addr_list, NULL) +							   == NULL ? -1 : 0;  	}  	/* Only allow one IR receiver to be registered per board */ @@ -221,7 +221,8 @@ static int ivtv_i2c_new_ir(struct ivtv *itv, u32 hw, const char *type, u8 addr)  	info.platform_data = init_data;  	strlcpy(info.type, type, I2C_NAME_SIZE); -	return i2c_new_probed_device(adap, &info, addr_list) == NULL ? -1 : 0; +	return i2c_new_probed_device(adap, &info, addr_list, NULL) == NULL ? +	       -1 : 0;  }  /* Instantiate the IR receiver device using probing -- undesirable */ @@ -249,7 +250,7 @@ struct i2c_client *ivtv_i2c_new_ir_legacy(struct ivtv *itv)  	memset(&info, 0, sizeof(struct i2c_board_info));  	strlcpy(info.type, "ir_video", I2C_NAME_SIZE); -	return i2c_new_probed_device(&itv->i2c_adap, &info, addr_list); +	return i2c_new_probed_device(&itv->i2c_adap, &info, addr_list, NULL);  }  int ivtv_i2c_register(struct ivtv *itv, unsigned idx) diff --git a/drivers/media/video/v4l2-common.c b/drivers/media/video/v4l2-common.c index 3ce7c64e578..8ee1179be92 100644 --- a/drivers/media/video/v4l2-common.c +++ b/drivers/media/video/v4l2-common.c @@ -381,7 +381,8 @@ struct v4l2_subdev *v4l2_i2c_new_subdev_board(struct v4l2_device *v4l2_dev,  	/* Create the i2c client */  	if (info->addr == 0 && probe_addrs) -		client = i2c_new_probed_device(adapter, info, probe_addrs); +		client = i2c_new_probed_device(adapter, info, probe_addrs, +					       NULL);  	else  		client = i2c_new_device(adapter, info); diff --git a/drivers/usb/host/ohci-pnx4008.c b/drivers/usb/host/ohci-pnx4008.c index cd74bbdd007..653d6a60edb 100644 --- a/drivers/usb/host/ohci-pnx4008.c +++ b/drivers/usb/host/ohci-pnx4008.c @@ -329,7 +329,7 @@ static int __devinit usb_hcd_pnx4008_probe(struct platform_device *pdev)  	memset(&i2c_info, 0, sizeof(struct i2c_board_info));  	strlcpy(i2c_info.type, "isp1301_pnx", I2C_NAME_SIZE);  	isp1301_i2c_client = i2c_new_probed_device(i2c_adap, &i2c_info, -						   normal_i2c); +						   normal_i2c, NULL);  	i2c_put_adapter(i2c_adap);  	if (!isp1301_i2c_client) {  		err("failed to connect I2C to ISP1301 USB Transceiver"); diff --git a/drivers/video/matrox/i2c-matroxfb.c b/drivers/video/matrox/i2c-matroxfb.c index 403b14445a7..0fb280ead3d 100644 --- a/drivers/video/matrox/i2c-matroxfb.c +++ b/drivers/video/matrox/i2c-matroxfb.c @@ -191,7 +191,7 @@ static void* i2c_matroxfb_probe(struct matrox_fb_info* minfo) {  			};  			i2c_new_probed_device(&m2info->maven.adapter, -					      &maven_info, addr_list); +					      &maven_info, addr_list, NULL);  		}  	}  	return m2info; diff --git a/include/linux/i2c.h b/include/linux/i2c.h index 38dd4025aa4..59a9f3cdc0b 100644 --- a/include/linux/i2c.h +++ b/include/linux/i2c.h @@ -284,12 +284,15 @@ i2c_new_device(struct i2c_adapter *adap, struct i2c_board_info const *info);  /* If you don't know the exact address of an I2C device, use this variant   * instead, which can probe for device presence in a list of possible - * addresses. + * addresses. The "probe" callback function is optional. If it is provided, + * it must return 1 on successful probe, 0 otherwise. If it is not provided, + * a default probing method is used.   */  extern struct i2c_client *  i2c_new_probed_device(struct i2c_adapter *adap,  		      struct i2c_board_info *info, -		      unsigned short const *addr_list); +		      unsigned short const *addr_list, +		      int (*probe)(struct i2c_adapter *, unsigned short addr));  /* For devices that use several addresses, use i2c_new_dummy() to make   * client handles for the extra addresses.  |