Commit 9fc6adfa authored by Jean Delvare's avatar Jean Delvare Committed by Greg Kroah-Hartman

[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: default avatarJean Delvare <khali@linux-fr.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 5cb80229
...@@ -53,7 +53,6 @@ static struct i2c_client_address_data addr_data = { ...@@ -53,7 +53,6 @@ static struct i2c_client_address_data addr_data = {
.normal_i2c = normal_addr, .normal_i2c = normal_addr,
.probe = ignore, .probe = ignore,
.ignore = ignore, .ignore = ignore,
.force = ignore,
}; };
static ulong ds1374_read_rtc(void) static ulong ds1374_read_rtc(void)
......
...@@ -42,7 +42,6 @@ static struct i2c_client_address_data addr_data = { ...@@ -42,7 +42,6 @@ static struct i2c_client_address_data addr_data = {
.normal_i2c = normal_addr, .normal_i2c = normal_addr,
.probe = ignore, .probe = ignore,
.ignore = ignore, .ignore = ignore,
.force = ignore,
}; };
ulong ulong
......
...@@ -67,7 +67,6 @@ static struct i2c_client_address_data addr_data = { ...@@ -67,7 +67,6 @@ static struct i2c_client_address_data addr_data = {
.normal_i2c = normal_addr, .normal_i2c = normal_addr,
.probe = ignore, .probe = ignore,
.ignore = ignore, .ignore = ignore,
.force = ignore,
}; };
static int rtc8564_read_mem(struct i2c_client *client, struct mem *mem); static int rtc8564_read_mem(struct i2c_client *client, struct mem *mem);
......
...@@ -662,6 +662,28 @@ int i2c_control(struct i2c_client *client, ...@@ -662,6 +662,28 @@ int i2c_control(struct i2c_client *client,
* Will not work for 10-bit addresses! * 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, int i2c_probe(struct i2c_adapter *adapter,
struct i2c_client_address_data *address_data, struct i2c_client_address_data *address_data,
int (*found_proc) (struct i2c_adapter *, int, int)) int (*found_proc) (struct i2c_adapter *, int, int))
...@@ -683,19 +705,15 @@ int i2c_probe(struct i2c_adapter *adapter, ...@@ -683,19 +705,15 @@ int i2c_probe(struct i2c_adapter *adapter,
at all */ at all */
found = 0; found = 0;
for (i = 0; !found && (address_data->force[i] != I2C_CLIENT_END); i += 2) { if (address_data->forces) {
if (((adap_id == address_data->force[i]) || int kind = i2c_probe_forces(adapter, addr,
(address_data->force[i] == ANY_I2C_BUS)) && address_data->forces);
(addr == address_data->force[i+1])) { if (kind >= 0) { /* force found */
dev_dbg(&adapter->dev, "found force parameter for adapter %d, addr %04x\n", if ((err = found_proc(adapter, addr, kind)))
adap_id, addr);
if ((err = found_proc(adapter,addr,0)))
return err; return err;
found = 1; continue;
} }
} }
if (found)
continue;
/* If this address is in one of the ignores, we can forget about /* If this address is in one of the ignores, we can forget about
it right now */ it right now */
......
...@@ -391,7 +391,6 @@ static struct i2c_client_address_data addr_data = { ...@@ -391,7 +391,6 @@ static struct i2c_client_address_data addr_data = {
.normal_i2c = normal_i2c, .normal_i2c = normal_i2c,
.probe = &ignore, .probe = &ignore,
.ignore = &ignore, .ignore = &ignore,
.force = &ignore,
}; };
static struct i2c_driver i2c_driver_adv7170; static struct i2c_driver i2c_driver_adv7170;
......
...@@ -441,7 +441,6 @@ static struct i2c_client_address_data addr_data = { ...@@ -441,7 +441,6 @@ static struct i2c_client_address_data addr_data = {
.normal_i2c = normal_i2c, .normal_i2c = normal_i2c,
.probe = &ignore, .probe = &ignore,
.ignore = &ignore, .ignore = &ignore,
.force = &ignore,
}; };
static struct i2c_driver i2c_driver_adv7175; static struct i2c_driver i2c_driver_adv7175;
......
...@@ -507,7 +507,6 @@ static struct i2c_client_address_data addr_data = { ...@@ -507,7 +507,6 @@ static struct i2c_client_address_data addr_data = {
.normal_i2c = normal_i2c, .normal_i2c = normal_i2c,
.probe = &ignore, .probe = &ignore,
.ignore = &ignore, .ignore = &ignore,
.force = &ignore,
}; };
static struct i2c_driver i2c_driver_bt819; static struct i2c_driver i2c_driver_bt819;
......
...@@ -295,7 +295,6 @@ static struct i2c_client_address_data addr_data = { ...@@ -295,7 +295,6 @@ static struct i2c_client_address_data addr_data = {
.normal_i2c = normal_i2c, .normal_i2c = normal_i2c,
.probe = &ignore, .probe = &ignore,
.ignore = &ignore, .ignore = &ignore,
.force = &ignore,
}; };
static struct i2c_driver i2c_driver_bt856; static struct i2c_driver i2c_driver_bt856;
......
...@@ -470,7 +470,6 @@ static struct i2c_client_address_data addr_data = { ...@@ -470,7 +470,6 @@ static struct i2c_client_address_data addr_data = {
.normal_i2c = normal_i2c, .normal_i2c = normal_i2c,
.probe = &ignore, .probe = &ignore,
.ignore = &ignore, .ignore = &ignore,
.force = &ignore,
}; };
static struct i2c_driver i2c_driver_saa7110; static struct i2c_driver i2c_driver_saa7110;
......
...@@ -489,7 +489,6 @@ static struct i2c_client_address_data addr_data = { ...@@ -489,7 +489,6 @@ static struct i2c_client_address_data addr_data = {
.normal_i2c = normal_i2c, .normal_i2c = normal_i2c,
.probe = &ignore, .probe = &ignore,
.ignore = &ignore, .ignore = &ignore,
.force = &ignore,
}; };
static struct i2c_driver i2c_driver_saa7111; static struct i2c_driver i2c_driver_saa7111;
......
...@@ -827,7 +827,6 @@ static struct i2c_client_address_data addr_data = { ...@@ -827,7 +827,6 @@ static struct i2c_client_address_data addr_data = {
.normal_i2c = normal_i2c, .normal_i2c = normal_i2c,
.probe = &ignore, .probe = &ignore,
.ignore = &ignore, .ignore = &ignore,
.force = &ignore,
}; };
static struct i2c_driver i2c_driver_saa7114; static struct i2c_driver i2c_driver_saa7114;
......
...@@ -387,7 +387,6 @@ static struct i2c_client_address_data addr_data = { ...@@ -387,7 +387,6 @@ static struct i2c_client_address_data addr_data = {
.normal_i2c = normal_i2c, .normal_i2c = normal_i2c,
.probe = &ignore, .probe = &ignore,
.ignore = &ignore, .ignore = &ignore,
.force = &ignore,
}; };
static struct i2c_driver i2c_driver_saa7185; static struct i2c_driver i2c_driver_saa7185;
......
...@@ -41,7 +41,6 @@ static struct i2c_client_address_data addr_data = { ...@@ -41,7 +41,6 @@ static struct i2c_client_address_data addr_data = {
.normal_i2c = normal_i2c, .normal_i2c = normal_i2c,
.probe = &ignore, .probe = &ignore,
.ignore = &ignore, .ignore = &ignore,
.force = &ignore,
}; };
/* ---------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- */
......
...@@ -576,7 +576,6 @@ static struct i2c_client_address_data addr_data = { ...@@ -576,7 +576,6 @@ static struct i2c_client_address_data addr_data = {
.normal_i2c = normal_i2c, .normal_i2c = normal_i2c,
.probe = &ignore, .probe = &ignore,
.ignore = &ignore, .ignore = &ignore,
.force = &ignore,
}; };
static struct i2c_driver vpx3220_i2c_driver; static struct i2c_driver vpx3220_i2c_driver;
......
...@@ -48,7 +48,6 @@ struct i2c_algorithm; ...@@ -48,7 +48,6 @@ struct i2c_algorithm;
struct i2c_adapter; struct i2c_adapter;
struct i2c_client; struct i2c_client;
struct i2c_driver; struct i2c_driver;
struct i2c_client_address_data;
union i2c_smbus_data; union i2c_smbus_data;
/* /*
...@@ -301,7 +300,7 @@ struct i2c_client_address_data { ...@@ -301,7 +300,7 @@ struct i2c_client_address_data {
unsigned short *normal_i2c; unsigned short *normal_i2c;
unsigned short *probe; unsigned short *probe;
unsigned short *ignore; unsigned short *ignore;
unsigned short *force; unsigned short **forces;
}; };
/* Internal numbers to terminate lists */ /* Internal numbers to terminate lists */
...@@ -575,11 +574,15 @@ union i2c_smbus_data { ...@@ -575,11 +574,15 @@ union i2c_smbus_data {
I2C_CLIENT_MODULE_PARM(force, \ I2C_CLIENT_MODULE_PARM(force, \
"List of adapter,address pairs to boldly assume " \ "List of adapter,address pairs to boldly assume " \
"to be present"); \ "to be present"); \
static unsigned short *addr_forces[] = { \
force, \
NULL \
}; \
static struct i2c_client_address_data addr_data = { \ static struct i2c_client_address_data addr_data = { \
.normal_i2c = normal_i2c, \ .normal_i2c = normal_i2c, \
.probe = probe, \ .probe = probe, \
.ignore = ignore, \ .ignore = ignore, \
.force = force, \ .forces = addr_forces, \
} }
#endif /* _LINUX_I2C_H */ #endif /* _LINUX_I2C_H */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment