mirror of
https://github.com/tbsdtv/linux_media.git
synced 2025-07-23 12:43:29 +02:00
i2c: replace i2c_new_probed_device with an ERR_PTR variant
In the general move to have i2c_new_*_device functions which return ERR_PTR instead of NULL, this patch converts i2c_new_probed_device(). There are only few users, so this patch converts the I2C core and all users in one go. The function gets renamed to i2c_new_scanned_device() so out-of-tree users will get a build failure to understand they need to adapt their error checking code. Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com> Reviewed-by: Luca Ceresoli <luca@lucaceresoli.net> Reviewed-by: Max Staudt <max@enpas.org> Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
This commit is contained in:
committed by
Wolfram Sang
parent
1b00ff6159
commit
c1d084759c
@@ -123,7 +123,7 @@ present or not (for example for an optional feature which is not present
|
|||||||
on cheap variants of a board but you have no way to tell them apart), or
|
on cheap variants of a board but you have no way to tell them apart), or
|
||||||
it may have different addresses from one board to the next (manufacturer
|
it may have different addresses from one board to the next (manufacturer
|
||||||
changing its design without notice). In this case, you can call
|
changing its design without notice). In this case, you can call
|
||||||
i2c_new_probed_device() instead of i2c_new_device().
|
i2c_new_scanned_device() instead of i2c_new_device().
|
||||||
|
|
||||||
Example (from the nxp OHCI driver)::
|
Example (from the nxp OHCI driver)::
|
||||||
|
|
||||||
@@ -139,8 +139,8 @@ Example (from the nxp OHCI driver)::
|
|||||||
i2c_adap = i2c_get_adapter(2);
|
i2c_adap = i2c_get_adapter(2);
|
||||||
memset(&i2c_info, 0, sizeof(struct i2c_board_info));
|
memset(&i2c_info, 0, sizeof(struct i2c_board_info));
|
||||||
strscpy(i2c_info.type, "isp1301_nxp", sizeof(i2c_info.type));
|
strscpy(i2c_info.type, "isp1301_nxp", sizeof(i2c_info.type));
|
||||||
isp1301_i2c_client = i2c_new_probed_device(i2c_adap, &i2c_info,
|
isp1301_i2c_client = i2c_new_scanned_device(i2c_adap, &i2c_info,
|
||||||
normal_i2c, NULL);
|
normal_i2c, NULL);
|
||||||
i2c_put_adapter(i2c_adap);
|
i2c_put_adapter(i2c_adap);
|
||||||
(...)
|
(...)
|
||||||
}
|
}
|
||||||
@@ -153,14 +153,14 @@ simply gives up.
|
|||||||
The driver which instantiated the I2C device is responsible for destroying
|
The driver which instantiated the I2C device is responsible for destroying
|
||||||
it on cleanup. This is done by calling i2c_unregister_device() on the
|
it on cleanup. This is done by calling i2c_unregister_device() on the
|
||||||
pointer that was earlier returned by i2c_new_device() or
|
pointer that was earlier returned by i2c_new_device() or
|
||||||
i2c_new_probed_device().
|
i2c_new_scanned_device().
|
||||||
|
|
||||||
|
|
||||||
Method 3: Probe an I2C bus for certain devices
|
Method 3: Probe an I2C bus for certain devices
|
||||||
----------------------------------------------
|
----------------------------------------------
|
||||||
|
|
||||||
Sometimes you do not have enough information about an I2C device, not even
|
Sometimes you do not have enough information about an I2C device, not even
|
||||||
to call i2c_new_probed_device(). The typical case is hardware monitoring
|
to call i2c_new_scanned_device(). The typical case is hardware monitoring
|
||||||
chips on PC mainboards. There are several dozen models, which can live
|
chips on PC mainboards. There are several dozen models, which can live
|
||||||
at 25 different addresses. Given the huge number of mainboards out there,
|
at 25 different addresses. Given the huge number of mainboards out there,
|
||||||
it is next to impossible to build an exhaustive list of the hardware
|
it is next to impossible to build an exhaustive list of the hardware
|
||||||
|
@@ -185,14 +185,14 @@ Sometimes you know that a device is connected to a given I2C bus, but you
|
|||||||
don't know the exact address it uses. This happens on TV adapters for
|
don't know the exact address it uses. This happens on TV adapters for
|
||||||
example, where the same driver supports dozens of slightly different
|
example, where the same driver supports dozens of slightly different
|
||||||
models, and I2C device addresses change from one model to the next. In
|
models, and I2C device addresses change from one model to the next. In
|
||||||
that case, you can use the i2c_new_probed_device() variant, which is
|
that case, you can use the i2c_new_scanned_device() variant, which is
|
||||||
similar to i2c_new_device(), except that it takes an additional list of
|
similar to i2c_new_device(), except that it takes an additional list of
|
||||||
possible I2C addresses to probe. A device is created for the first
|
possible I2C addresses to probe. A device is created for the first
|
||||||
responsive address in the list. If you expect more than one device to be
|
responsive address in the list. If you expect more than one device to be
|
||||||
present in the address range, simply call i2c_new_probed_device() that
|
present in the address range, simply call i2c_new_scanned_device() that
|
||||||
many times.
|
many times.
|
||||||
|
|
||||||
The call to i2c_new_device() or i2c_new_probed_device() typically happens
|
The call to i2c_new_device() or i2c_new_scanned_device() typically happens
|
||||||
in the I2C bus driver. You may want to save the returned i2c_client
|
in the I2C bus driver. You may want to save the returned i2c_client
|
||||||
reference for later use.
|
reference for later use.
|
||||||
|
|
||||||
@@ -237,7 +237,7 @@ Device Deletion
|
|||||||
---------------
|
---------------
|
||||||
|
|
||||||
Each I2C device which has been created using i2c_new_device() or
|
Each I2C device which has been created using i2c_new_device() or
|
||||||
i2c_new_probed_device() can be unregistered by calling
|
i2c_new_scanned_device() can be unregistered by calling
|
||||||
i2c_unregister_device(). If you don't call it explicitly, it will be
|
i2c_unregister_device(). If you don't call it explicitly, it will be
|
||||||
called automatically before the underlying I2C bus itself is removed, as a
|
called automatically before the underlying I2C bus itself is removed, as a
|
||||||
device can't survive its parent in the device driver model.
|
device can't survive its parent in the device driver model.
|
||||||
|
@@ -2245,10 +2245,10 @@ int i2c_probe_func_quick_read(struct i2c_adapter *adap, unsigned short addr)
|
|||||||
EXPORT_SYMBOL_GPL(i2c_probe_func_quick_read);
|
EXPORT_SYMBOL_GPL(i2c_probe_func_quick_read);
|
||||||
|
|
||||||
struct i2c_client *
|
struct i2c_client *
|
||||||
i2c_new_probed_device(struct i2c_adapter *adap,
|
i2c_new_scanned_device(struct i2c_adapter *adap,
|
||||||
struct i2c_board_info *info,
|
struct i2c_board_info *info,
|
||||||
unsigned short const *addr_list,
|
unsigned short const *addr_list,
|
||||||
int (*probe)(struct i2c_adapter *adap, unsigned short addr))
|
int (*probe)(struct i2c_adapter *adap, unsigned short addr))
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
@@ -2278,11 +2278,24 @@ i2c_new_probed_device(struct i2c_adapter *adap,
|
|||||||
|
|
||||||
if (addr_list[i] == I2C_CLIENT_END) {
|
if (addr_list[i] == I2C_CLIENT_END) {
|
||||||
dev_dbg(&adap->dev, "Probing failed, no device found\n");
|
dev_dbg(&adap->dev, "Probing failed, no device found\n");
|
||||||
return NULL;
|
return ERR_PTR(-ENODEV);
|
||||||
}
|
}
|
||||||
|
|
||||||
info->addr = addr_list[i];
|
info->addr = addr_list[i];
|
||||||
return i2c_new_device(adap, info);
|
return i2c_new_client_device(adap, info);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(i2c_new_scanned_device);
|
||||||
|
|
||||||
|
struct i2c_client *
|
||||||
|
i2c_new_probed_device(struct i2c_adapter *adap,
|
||||||
|
struct i2c_board_info *info,
|
||||||
|
unsigned short const *addr_list,
|
||||||
|
int (*probe)(struct i2c_adapter *adap, unsigned short addr))
|
||||||
|
{
|
||||||
|
struct i2c_client *client;
|
||||||
|
|
||||||
|
client = i2c_new_scanned_device(adap, info, addr_list, probe);
|
||||||
|
return IS_ERR(client) ? NULL : client;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(i2c_new_probed_device);
|
EXPORT_SYMBOL_GPL(i2c_new_probed_device);
|
||||||
|
|
||||||
|
@@ -452,10 +452,16 @@ i2c_new_client_device(struct i2c_adapter *adap, struct i2c_board_info const *inf
|
|||||||
* a default probing method is used.
|
* a default probing method is used.
|
||||||
*/
|
*/
|
||||||
extern struct i2c_client *
|
extern struct i2c_client *
|
||||||
|
i2c_new_scanned_device(struct i2c_adapter *adap,
|
||||||
|
struct i2c_board_info *info,
|
||||||
|
unsigned short const *addr_list,
|
||||||
|
int (*probe)(struct i2c_adapter *adap, unsigned short addr));
|
||||||
|
|
||||||
|
extern struct i2c_client *
|
||||||
i2c_new_probed_device(struct i2c_adapter *adap,
|
i2c_new_probed_device(struct i2c_adapter *adap,
|
||||||
struct i2c_board_info *info,
|
struct i2c_board_info *info,
|
||||||
unsigned short const *addr_list,
|
unsigned short const *addr_list,
|
||||||
int (*probe)(struct i2c_adapter *adap, unsigned short addr));
|
int (*probe)(struct i2c_adapter *adap, unsigned short addr));
|
||||||
|
|
||||||
/* Common custom probe functions */
|
/* Common custom probe functions */
|
||||||
extern int i2c_probe_func_quick_read(struct i2c_adapter *adap, unsigned short addr);
|
extern int i2c_probe_func_quick_read(struct i2c_adapter *adap, unsigned short addr);
|
||||||
|
Reference in New Issue
Block a user