[PATCH] hwmon: hwmon vs i2c, second round (01/11)
Add support for kind-forced addresses to i2c_probe, like i2c_detect has for (essentially) hardware monitoring drivers. Note that this change will slightly increase the size of the drivers using I2C_CLIENT_INSMOD, with no immediate benefit. This is a requirement if we want to merge i2c_probe and i2c_detect though, and seems a reasonable price to pay in comparison with the previous cleanups which saved much more than that (such as the i2c-isa cleanup or the i2c address ranges removal.) Signed-off-by: Jean Delvare <khali@linux-fr.org> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
parent
5cb802293e
commit
9fc6adfa9a
15 changed files with 34 additions and 26 deletions
|
@ -53,7 +53,6 @@ static struct i2c_client_address_data addr_data = {
|
|||
.normal_i2c = normal_addr,
|
||||
.probe = ignore,
|
||||
.ignore = ignore,
|
||||
.force = ignore,
|
||||
};
|
||||
|
||||
static ulong ds1374_read_rtc(void)
|
||||
|
|
|
@ -42,7 +42,6 @@ static struct i2c_client_address_data addr_data = {
|
|||
.normal_i2c = normal_addr,
|
||||
.probe = ignore,
|
||||
.ignore = ignore,
|
||||
.force = ignore,
|
||||
};
|
||||
|
||||
ulong
|
||||
|
|
|
@ -67,7 +67,6 @@ static struct i2c_client_address_data addr_data = {
|
|||
.normal_i2c = normal_addr,
|
||||
.probe = ignore,
|
||||
.ignore = ignore,
|
||||
.force = ignore,
|
||||
};
|
||||
|
||||
static int rtc8564_read_mem(struct i2c_client *client, struct mem *mem);
|
||||
|
|
|
@ -662,6 +662,28 @@ int i2c_control(struct i2c_client *client,
|
|||
* Will not work for 10-bit addresses!
|
||||
* ----------------------------------------------------
|
||||
*/
|
||||
/* Return: kind (>= 0) if force found, -1 if not found */
|
||||
static inline int i2c_probe_forces(struct i2c_adapter *adapter, int addr,
|
||||
unsigned short **forces)
|
||||
{
|
||||
unsigned short kind;
|
||||
int j, adap_id = i2c_adapter_id(adapter);
|
||||
|
||||
for (kind = 0; forces[kind]; kind++) {
|
||||
for (j = 0; forces[kind][j] != I2C_CLIENT_END; j += 2) {
|
||||
if ((forces[kind][j] == adap_id ||
|
||||
forces[kind][j] == ANY_I2C_BUS)
|
||||
&& forces[kind][j + 1] == addr) {
|
||||
dev_dbg(&adapter->dev, "found force parameter, "
|
||||
"addr 0x%02x, kind %u\n", addr, kind);
|
||||
return kind;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
int i2c_probe(struct i2c_adapter *adapter,
|
||||
struct i2c_client_address_data *address_data,
|
||||
int (*found_proc) (struct i2c_adapter *, int, int))
|
||||
|
@ -683,19 +705,15 @@ int i2c_probe(struct i2c_adapter *adapter,
|
|||
at all */
|
||||
found = 0;
|
||||
|
||||
for (i = 0; !found && (address_data->force[i] != I2C_CLIENT_END); i += 2) {
|
||||
if (((adap_id == address_data->force[i]) ||
|
||||
(address_data->force[i] == ANY_I2C_BUS)) &&
|
||||
(addr == address_data->force[i+1])) {
|
||||
dev_dbg(&adapter->dev, "found force parameter for adapter %d, addr %04x\n",
|
||||
adap_id, addr);
|
||||
if ((err = found_proc(adapter,addr,0)))
|
||||
if (address_data->forces) {
|
||||
int kind = i2c_probe_forces(adapter, addr,
|
||||
address_data->forces);
|
||||
if (kind >= 0) { /* force found */
|
||||
if ((err = found_proc(adapter, addr, kind)))
|
||||
return err;
|
||||
found = 1;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if (found)
|
||||
continue;
|
||||
|
||||
/* If this address is in one of the ignores, we can forget about
|
||||
it right now */
|
||||
|
|
|
@ -391,7 +391,6 @@ static struct i2c_client_address_data addr_data = {
|
|||
.normal_i2c = normal_i2c,
|
||||
.probe = &ignore,
|
||||
.ignore = &ignore,
|
||||
.force = &ignore,
|
||||
};
|
||||
|
||||
static struct i2c_driver i2c_driver_adv7170;
|
||||
|
|
|
@ -441,7 +441,6 @@ static struct i2c_client_address_data addr_data = {
|
|||
.normal_i2c = normal_i2c,
|
||||
.probe = &ignore,
|
||||
.ignore = &ignore,
|
||||
.force = &ignore,
|
||||
};
|
||||
|
||||
static struct i2c_driver i2c_driver_adv7175;
|
||||
|
|
|
@ -507,7 +507,6 @@ static struct i2c_client_address_data addr_data = {
|
|||
.normal_i2c = normal_i2c,
|
||||
.probe = &ignore,
|
||||
.ignore = &ignore,
|
||||
.force = &ignore,
|
||||
};
|
||||
|
||||
static struct i2c_driver i2c_driver_bt819;
|
||||
|
|
|
@ -295,7 +295,6 @@ static struct i2c_client_address_data addr_data = {
|
|||
.normal_i2c = normal_i2c,
|
||||
.probe = &ignore,
|
||||
.ignore = &ignore,
|
||||
.force = &ignore,
|
||||
};
|
||||
|
||||
static struct i2c_driver i2c_driver_bt856;
|
||||
|
|
|
@ -470,7 +470,6 @@ static struct i2c_client_address_data addr_data = {
|
|||
.normal_i2c = normal_i2c,
|
||||
.probe = &ignore,
|
||||
.ignore = &ignore,
|
||||
.force = &ignore,
|
||||
};
|
||||
|
||||
static struct i2c_driver i2c_driver_saa7110;
|
||||
|
|
|
@ -489,7 +489,6 @@ static struct i2c_client_address_data addr_data = {
|
|||
.normal_i2c = normal_i2c,
|
||||
.probe = &ignore,
|
||||
.ignore = &ignore,
|
||||
.force = &ignore,
|
||||
};
|
||||
|
||||
static struct i2c_driver i2c_driver_saa7111;
|
||||
|
|
|
@ -827,7 +827,6 @@ static struct i2c_client_address_data addr_data = {
|
|||
.normal_i2c = normal_i2c,
|
||||
.probe = &ignore,
|
||||
.ignore = &ignore,
|
||||
.force = &ignore,
|
||||
};
|
||||
|
||||
static struct i2c_driver i2c_driver_saa7114;
|
||||
|
|
|
@ -387,7 +387,6 @@ static struct i2c_client_address_data addr_data = {
|
|||
.normal_i2c = normal_i2c,
|
||||
.probe = &ignore,
|
||||
.ignore = &ignore,
|
||||
.force = &ignore,
|
||||
};
|
||||
|
||||
static struct i2c_driver i2c_driver_saa7185;
|
||||
|
|
|
@ -41,7 +41,6 @@ static struct i2c_client_address_data addr_data = {
|
|||
.normal_i2c = normal_i2c,
|
||||
.probe = &ignore,
|
||||
.ignore = &ignore,
|
||||
.force = &ignore,
|
||||
};
|
||||
|
||||
/* ---------------------------------------------------------------------- */
|
||||
|
|
|
@ -576,7 +576,6 @@ static struct i2c_client_address_data addr_data = {
|
|||
.normal_i2c = normal_i2c,
|
||||
.probe = &ignore,
|
||||
.ignore = &ignore,
|
||||
.force = &ignore,
|
||||
};
|
||||
|
||||
static struct i2c_driver vpx3220_i2c_driver;
|
||||
|
|
|
@ -48,7 +48,6 @@ struct i2c_algorithm;
|
|||
struct i2c_adapter;
|
||||
struct i2c_client;
|
||||
struct i2c_driver;
|
||||
struct i2c_client_address_data;
|
||||
union i2c_smbus_data;
|
||||
|
||||
/*
|
||||
|
@ -301,7 +300,7 @@ struct i2c_client_address_data {
|
|||
unsigned short *normal_i2c;
|
||||
unsigned short *probe;
|
||||
unsigned short *ignore;
|
||||
unsigned short *force;
|
||||
unsigned short **forces;
|
||||
};
|
||||
|
||||
/* Internal numbers to terminate lists */
|
||||
|
@ -575,11 +574,15 @@ union i2c_smbus_data {
|
|||
I2C_CLIENT_MODULE_PARM(force, \
|
||||
"List of adapter,address pairs to boldly assume " \
|
||||
"to be present"); \
|
||||
static unsigned short *addr_forces[] = { \
|
||||
force, \
|
||||
NULL \
|
||||
}; \
|
||||
static struct i2c_client_address_data addr_data = { \
|
||||
.normal_i2c = normal_i2c, \
|
||||
.probe = probe, \
|
||||
.ignore = ignore, \
|
||||
.force = force, \
|
||||
.forces = addr_forces, \
|
||||
}
|
||||
|
||||
#endif /* _LINUX_I2C_H */
|
||||
|
|
Loading…
Reference in a new issue