[2.6] Add command function to struct i2c_adapter]
Subsystems (8)
Re: [PATCH][2.6] Add command function to struct i2c_adapter
In reply to Michael HunoldHi Michael,
See my various questions inline.
Quoted 3 lines
the attached patch adds a command function to struct
i2c_adapter, similar to the command function that is already there for structi2c_client.
I didne't even know that. Is this command function in struct i2c_client used somewhere? What for?
Quoted 8 lines
The reason behind this is as follows:
In the DVB subsystem, the tuners are accessed via normal kernel i2c drivers. One big problem is, that tuners can be wired very differently depending on the surrounding hardware. Currently, we need to keep specific settings which are unique to a hardware design in the independent i2c tuner driver. This is both very ugly and makes it impossible to support DVB drivers which are not in the official Linux kernel tree, but could otherwise use in-kernel frontend driver.
What is the i2c tuner driver "independent" of? Do you simply mean that it holds the common code for all DVB adapters?
Quoted 4 lines
If the struct
i2c_adapterhas a command function, it would be possible to get additional informations from the adapter in the i2c client'sattach_adapter()function *before* probing the device and guessing things like i2c addresses or other hardware settings.
I see what you want to do, but I don't exactly see how it solves your problem. Your new command callback function will provide an adapter-specific interface to adapter internal data. You will have to fill the data before you can access it, so there still is hardware-specific data involved. Is your point that this data would be located in (and split among) adapter drivers instead of the common tuner driver as is now?
I am interested in your proposal because we (the sensors side of the i2c bus) are facing a similar problem with hardware monitoring chips on motherboads. The same chip can be wired differently on various motherboads, and most of the time there is no way to guess (either because the hardware just doesn't provide any way, or because the BIOS failed to do its job properly). We have not come to any solution yet, and most of the time users have to use user-space tools (such as i2cset) prior to loading the drivers. Looks like the problem you are dealing with is of similar nature.
My initial thoughts about this were that we could use DMI data and/or PCI information to identify systems, and trigger motherboard-specific code whenever needed. It's really just a wild guess, I don't know if it is the correct way. Wouldn't it work for you as well?
I would appreciate if you could show us some (pseudo)code with explanations on what you have for now, and what you would have after the change. I have some difficulties to understand what the change would actually change, most probably because the video and sensors sides of the i2c subsystem work rather differently.
On a completely different matter, what about the i2c subsystem class flags and checking mechanism? You had come with a first step some months ago (adding a class member to i2c clients), and your proposal (generalized check of i2c client class against adapter class) looked very good to me, but then we did not finish the job. What about it? I am willing to help on the sensors front if you are going into this again someday. If I remember correctly, step 2 was about clearing manual class checks and filling all class members, and step 3 was about implementing the generalized check in i2c-core. Am I right?
Thanks.
Signature · 2 lines
Jean Delvare http://khali.linux-fr.org/
Re: [PATCH][2.6] Add command function to struct i2c_adapter
Hi,
(because I think this will be an in-depth discussion I trimmed the CC list a litte bit)
Quoted 6 lines · Jean Delvare
Quoted 3 lines
the attached patch adds a command function to struct
i2c_adapter, similar to the command function that is already there for structi2c_client.I didne't even know that. Is this command function in struct
i2c_clientused somewhere? What for?
Please have a look at Video4Linux driver drivers/media/video/mxb.c. This driver needs various helper chipsets: tuner, tea6145c, tea6420, tda9840, saa7111.
For example the tea6415c is a simple video matrix chipset. If the user request a change of the input, the video matrix needs to be re-programmed.
For this, the tea6415 driver has the TEA6415C_SWITCH ioctl function, which is called through the i2c_client command() function.
Quoted 1 line
mxb->tea6415c->driver->command(mxb->tea6415c,TEA6415C_SWITCH, &vm);
Otherwise there would be no way the mxb driver could tell the tea6415c that the configuration should be changed.
Quoted 11 lines
Quoted 8 lines
The reason behind this is as follows:
In the DVB subsystem, the tuners are accessed via normal kernel i2c drivers. One big problem is, that tuners can be wired very differently depending on the surrounding hardware. Currently, we need to keep specific settings which are unique to a hardware design in the independent i2c tuner driver. This is both very ugly and makes it impossible to support DVB drivers which are not in the official Linux kernel tree, but could otherwise use in-kernel frontend driver.What is the i2c tuner driver "independent" of? Do you simply mean that it holds the common code for all DVB adapters?
The tuner is called frontend in dvb terms, because it holds more that just a simple tuner.
Some parts are hardware-independent and are in the right place in the frontend drivers. But manufacturers are free to use different plls (the actual tuners). Unfortunately, they nearly all sit on the same i2c address, are really dumb, write only and therefore not very distinguishable.
Currently the frontend drivers do a strcmp() on the adapter name. If it is "SkyStar2" for example, then it is a TechniSat card with a Samsung TBMU24112IMB pll.
With that solution, it's not possible to support dvb drivers outside of the kernel which could theoretically use the in-kernel frontend drivers, because h/w dependend things need to coded into every frontend driver.
Quoted 8 lines
Quoted 4 lines
If the struct
i2c_adapterhas a command function, it would be possible to get additional informations from the adapter in the i2c client'sattach_adapter()function *before* probing the device and guessing things like i2c addresses or other hardware settings.I see what you want to do, but I don't exactly see how it solves your problem. Your new command callback function will provide an adapter-specific interface to adapter internal data.
Not adapter internal data, but frontend specific data, that only the manufacturer knows (which can be distinguished by subsystem pci ids).
Quoted 6 lines
You will have to fill the data before you can access
it, so there still is hardware-specific data involved. Is your point that this
data would be located in (and split among) adapter drivers instead of the
common tuner driver as is now?
Yes. With that approach, it's possible to support dvb drivers outside of the kernel, because all necessary information about the frontends is inside the dvb driver, not the frontend driver.
Quoted 8 lines
I am interested in your proposal because we (the sensors side of the i2c bus) are facing a similar problem with hardware monitoring chips on motherboads. The same chip can be wired differently on various motherboads, and most of the time there is no way to guess (either because the hardware just doesn't provide any way, or because the BIOS failed to do its job properly). We have not come to any solution yet, and most of the time users have to use user-space tools (such as i2cset) prior to loading the drivers. Looks like the problem you are dealing with is of similar nature.
Yes, it's basically the same.
Quoted 4 lines
My initial thoughts about this were that we could use DMI data and/or PCI information to identify systems, and trigger motherboard-specific code whenever needed. It's really just a wild guess, I don't know if it is the correct way. Wouldn't it work for you as well?
This is how it will work. In our case, we only need pci ids, but it's possible to use other information sources as well.
Let's say the user loads the stv0299 frontend driver and later the dvb-ttpci device driver.
The dvb-ttpci driver exports an i2c_adapter, the stv0299 i2c_attach_adapter() function will be called. Ideally, if this isn't a bus from the digitial tv subsystem, then bail out (This needs to be implemented, see below).
If we are on a digital tv i2c bus the stv0299 uses the i2c adapter command() callback and asks the i2c adapter, if this frontend can be on that bus at all and asks for further informations.
dvb-ttpci knows the pci ids and can tell different hardware versions. For example, cable dvb cards have different pci ids than satellite dvb cards. The stv0299 is a satellite frontend, so if the bus is on a dvb cable card then dvb-ttpci can simply tell the stv0299 driver not to do anything.
If the stv0299 can be found on that system in theory, either the correct hardware stv0299 dependent informations are supplied completely or probing informations are supplied.
Quoted 5 lines
I would appreciate if you could show us some (pseudo)code with explanations on what you have for now, and what you would have after the change. I have some difficulties to understand what the change would actually change, most probably because the video and sensors sides of the i2c subsystem work rather differently.
Please have a look at drivers/media/dvb/frontends/stv0299.c
At the top you'll notice a lot of defines:
#define PHILIPS_SU1278_TUA 3 // SU1278 with TUA6100 synth
In lots of functions there are switch/case statements to distinguish different plls, for example in pll_set_tv_freq(). stv0299_init() is ugly, too. The init-data for different hardware is hardcoded into the frontend driver. *shiver*
With the command() function, probe_tuner() with the ugly strcmp() stuff and i2c probing can be killed completely.
In other places, common i2c_adapter commands can be used to pull frontend device specific data from the dvb device (for example frequency boundaries) or trigger h/w dependend thinks that only the dvb driver knows, like setting a frequency in the pll with command(SET_PLL).
Sorry, I just have some proof-of-concept code, that doesn't use all the things I explained above. Some dvb people would like to give up the strong separation due to the kernel i2c interface and have something more "dvbish".
Quoted 8 lines
On a completely different matter, what about the i2c subsystem class flags and checking mechanism? You had come with a first step some months ago (adding a class member to i2c clients), and your proposal (generalized check of i2c client class against adapter class) looked very good to me, but then we did not finish the job. What about it? I am willing to help on the sensors front if you are going into this again someday. If I remember correctly, step 2 was about clearing manual class checks and filling all class members, and step 3 was about implementing the generalized check in i2c-core. Am I right?
I'll answer that in a separate mail.
Quoted 1 line
Thanks.
CU
Michael.
Adding .class field to struct i2c_client (was Re: [PATCH][2.6] Add command function to struct i2c_adapter
In reply to Jean DelvareHi,
Quoted 5 lines · Jean Delvare
On a completely different matter, what about the i2c subsystem class flags and checking mechanism? You had come with a first step some months ago (adding a class member to i2c clients), and your proposal (generalized check of i2c client class against adapter class) looked very good to me, but then we did not finish the job. What about it?
I was unsure about the .class entries for some of the clients, then didn't find the time to investigate further and from then on the patches are bit-rotting on my harddisc. ;-(
Quoted 4 lines
I am willing to help on the sensors front
if you are going into this again someday. If I remember correctly, step 2 was about clearing manual class checks and filling all class members, and step 3 was about implementing the generalized check in i2c-core. Am I right?
Yes, right. I've cleaned up the patches and attached them to this mail. Unfortunately, they only apply to 2.6.8(.1), but not 2.6.9-rc2-mm1. This is because SMBUS has been renamed to HWMON IIRC.
Please have a look and tell me what you think. The big problem will be, that we cannot test all configurations, so it's possible that some devices won't be recognized anymore, because the .class entries don't match.
Patches 1-3 are straight forward. For patches 4-7 I once created the following list:
==>4
#drivers/ieee1394/pcilynx.c => I2C_CLASS_NONE #drivers/macintosh/therm_adt746x.c => I2C_CLASS_HWMON #drivers/macintosh/therm_pm72.c => I2C_CLASS_HWMON #drivers/macintosh/therm_windtunnel.c => I2C_CLASS_HWMON #drivers/acorn/char/pcf8583.c => I2C_CLASS_ALL #drivers/acorn/char/i2c.c => I2C_CLASS_ALL #drivers/i2c/busses/i2c-keywest.c: => I2C_CLASS_HWMON | I2C_CLASS_SOUND; #sound/ppc/keywest.c => I2C_CLASS_SOUND #sound/oss/dmasound/dac3550a.c => I2C_CLASS_SOUND #sound/oss/dmasound/tas_common.c => I2C_CLASS_SOUND
==>5
#drivers/i2c/algos/i2c-algo-pcf.c => I2C_CLASS_ALL #drivers/i2c/busses/i2c-elektor.c => I2C_CLASS_ALL #drivers/video/aty/radeon_i2c.c => I2C_CLASS_NONE #drivers/video/matrox/i2c-matroxfb.c => I2C_CLASS_DDC and I2C_CLASS_TV_ANALOG #drivers/video/matrox/matroxfb_maven.c => I2C_CLASS_TV_ANALOG #drivers/media/video/zoran_card.c => I2C_CLASS_TV_ANALOG #drivers/media/video/ir-kbd-i2c.c => I2C_CLASS_TV_ANALOG | I2C_CLASS_TV_DIGITAL #drivers/media/dvb/bt8xx/dvb-bt8xx.c => I2C_CLASS_ALL
==>6
#drivers/i2c/busses/i2c-ibm_iic.c: => I2C_CLASS_ALL #drivers/i2c/busses/i2c-iop3xx.c:=> I2C_CLASS_ALL #drivers/i2c/busses/scx200_i2c.c => I2C_CLASS_ALL #drivers/i2c/busses/i2c-ite.c => I2C_CLASS_ALL (drivers/i2c/algos/i2c-algo-ite.c:)
==>7
#drivers/i2c/busses/i2c-frodo.c => I2C_CLASS_ALL #drivers/i2c/busses/i2c-i810.c => I2C_CLASS_ALL + I2C_CLASS_DDC #drivers/i2c/busses/i2c-prosavage.c => I2C_CLASS_ALL + I2C_CLASS_DDC #drivers/i2c/busses/i2c-savage4.c => I2C_CLASS_ALL #drivers/i2c/busses/i2c-ixp4xx.c => I2C_CLASS_ALL, doesn't compile!? #drivers/i2c/busses/i2c-hydra.c => I2C_CLASS_HWMON
Quoted 1 line
Thanks.
CU
Michael.
drivers/media/video/adv7170.c +1 -0
@@ -516,6 +516,7 @@ .id = I2C_DRIVERID_ADV7170, .flags = I2C_DF_NOTIFY, + .class = I2C_CLASS_TV_ANALOG, .attach_adapter = adv7170_attach_adapter, .detach_client = adv7170_detach_client,
drivers/media/video/adv7175.c +1 -0
@@ -538,6 +538,7 @@ .id = I2C_DRIVERID_ADV7175, .flags = I2C_DF_NOTIFY, + .class = I2C_CLASS_TV_ANALOG, .attach_adapter = adv7175_attach_adapter, .detach_client = adv7175_detach_client,
drivers/media/video/bt819.c +1 -0
@@ -642,6 +642,7 @@ .id = I2C_DRIVERID_BT819, .flags = I2C_DF_NOTIFY, + .class = I2C_CLASS_TV_ANALOG, .attach_adapter = bt819_attach_adapter, .detach_client = bt819_detach_client,
drivers/media/video/bt856.c +1 -0
@@ -423,6 +423,7 @@ .id = I2C_DRIVERID_BT856, .flags = I2C_DF_NOTIFY, + .class = I2C_CLASS_TV_ANALOG, .attach_adapter = bt856_attach_adapter, .detach_client = bt856_detach_client,
drivers/media/video/saa7110.c +1 -0
@@ -599,6 +599,7 @@ .id = I2C_DRIVERID_SAA7110, .flags = I2C_DF_NOTIFY, + .class = I2C_CLASS_TV_ANALOG, .attach_adapter = saa7110_attach_adapter, .detach_client = saa7110_detach_client,
drivers/media/video/saa7111.c +2 -1
@@ -608,7 +608,8 @@ .id = I2C_DRIVERID_SAA7111A, .flags = I2C_DF_NOTIFY, - + .class = I2C_CLASS_TV_ANALOG, + .attach_adapter = saa7111_attach_adapter, .detach_client = saa7111_detach_client, .command = saa7111_command,
drivers/media/video/saa7114.c +1 -0
@@ -1222,6 +1222,7 @@ .id = I2C_DRIVERID_SAA7114, .flags = I2C_DF_NOTIFY, + .class = I2C_CLASS_TV_ANALOG, .attach_adapter = saa7114_attach_adapter, .detach_client = saa7114_detach_client,
drivers/media/video/saa7185.c +1 -0
@@ -505,6 +505,7 @@ .id = I2C_DRIVERID_SAA7185B, .flags = I2C_DF_NOTIFY, + .class = I2C_CLASS_TV_ANALOG, .attach_adapter = saa7185_attach_adapter, .detach_client = saa7185_detach_client,
drivers/media/video/tda9840.c +1 -0
@@ -263,6 +263,7 @@ .name = "tda9840 driver", .id = I2C_DRIVERID_TDA9840, .flags = I2C_DF_NOTIFY, + .class = I2C_CLASS_TV_ANALOG, .attach_adapter = tda9840_attach, .detach_client = tda9840_detach, .command = tda9840_command,
drivers/media/video/tea6415c.c +1 -0
@@ -212,6 +212,7 @@ .name = "tea6415c driver", .id = I2C_DRIVERID_TEA6415C, .flags = I2C_DF_NOTIFY, + .class = I2C_CLASS_TV_ANALOG, .attach_adapter = tea6415c_attach, .detach_client = tea6415c_detach, .command = tea6415c_command,
drivers/media/video/tea6420.c +2 -1
@@ -192,8 +192,9 @@ .name = "tea6420 driver", .id = I2C_DRIVERID_TEA6420, .flags = I2C_DF_NOTIFY, - .attach_adapter = tea6420_attach, + .class = I2C_CLASS_TV_ANALOG, + .attach_adapter = tea6420_attach, .detach_client = tea6420_detach, .command = tea6420_command, };
drivers/media/video/tuner-3036.c +2 -2
@@ -185,6 +185,7 @@ .name = "sab3036", .id = I2C_DRIVERID_SAB3036, .flags = I2C_DF_NOTIFY, + .class = I2C_CLASS_TV_ANALOG, .attach_adapter = tuner_probe, .detach_client = tuner_detach, .command = tuner_command
@@ -200,8 +201,7 @@int __init tuner3036_init (void ) { -i2c_add_driver (&i2c_driver_tuner); -return 0 ; +return i2c_add_driver (&i2c_driver_tuner); }void __exit
drivers/media/video/vpx3220.c +1 -0
@@ -731,6 +731,7 @@ .id = I2C_DRIVERID_VPX3220, .flags = I2C_DF_NOTIFY, + .class = I2C_CLASS_TV_ANALOG, .attach_adapter = vpx3220_attach_adapter, .detach_client = vpx3220_detach_client,
drivers/media/video/bt832.c +3 -5
@@ -197,9 +197,7 @@static int bt832_probe (struct i2c_adapter *adap) { -if (adap->class &I2C_CLASS_TV_ANALOG ) -return i2c_probe (adap, &addr_data, bt832_attach); -return 0 ; +return i2c_probe (adap, &addr_data, bt832_attach); }static int bt832_detach (struct i2c_client *client)
@@ -243,6 +241,7 @@ .name = "i2c bt832 driver", .id = -1, /* FIXME */ .flags = I2C_DF_NOTIFY, + .class = I2C_CLASS_TV_ANALOG, .attach_adapter = bt832_probe, .detach_client = bt832_detach, .command = bt832_command,
@@ -257,8 +256,7 @@int bt832_init_module (void ) { -i2c_add_driver (&driver); -return 0 ; +return i2c_add_driver (&driver); }static void bt832_cleanup_module (void )
drivers/media/video/msp3400.c +3 -15
@@ -1222,6 +1222,7 @@ .name = "i2c msp3400 driver", .id = I2C_DRIVERID_MSP3400, .flags = I2C_DF_NOTIFY, + .class = I2C_CLASS_TV_ANALOG, .attach_adapter = msp_probe, .detach_client = msp_detach, .command = msp_command,
@@ -1353,19 +1354,7 @@static int msp_probe (struct i2c_adapter *adap) { -#ifdef I2C_CLASS_TV_ANALOG -if (adap->class &I2C_CLASS_TV_ANALOG ) -return i2c_probe (adap, &addr_data, msp_attach); -#else -switch (adap->id) { -case I2C_ALGO_BIT |I2C_HW_SMBUS_VOODOO3 : -case I2C_ALGO_BIT |I2C_HW_B_BT848 : -//case I2C_ALGO_SAA7134: -return i2c_probe (adap, &addr_data, msp_attach); -break ; - } -#endif -return 0 ; +return i2c_probe (adap, &addr_data, msp_attach); }static void msp_wake_thread (struct i2c_client *client)
@@ -1558,8 +1547,7 @@static int msp3400_init_module (void ) { -i2c_add_driver (&driver); -return 0 ; +return i2c_add_driver (&driver); }static void msp3400_cleanup_module (void )
drivers/media/video/saa5246a.c +2 -3
@@ -143,9 +143,7 @@*/ static int saa5246a_probe (struct i2c_adapter *adap) { -if (adap->class &I2C_CLASS_TV_ANALOG ) -return i2c_probe (adap, &addr_data, saa5246a_attach); -return 0 ; +return i2c_probe (adap, &addr_data, saa5246a_attach); }static int saa5246a_detach (struct i2c_client *client)
@@ -174,6 +172,7 @@ .name = IF_NAME, /* name */ .id = I2C_DRIVERID_SAA5249, /* in i2c.h */ .flags = I2C_DF_NOTIFY, + .class = I2C_CLASS_TV_ANALOG, .attach_adapter = saa5246a_probe, .detach_client = saa5246a_detach, .command = saa5246a_command
drivers/media/video/saa5249.c +2 -3
@@ -219,9 +219,7 @@static int saa5249_probe (struct i2c_adapter *adap) { -if (adap->class &I2C_CLASS_TV_ANALOG ) -return i2c_probe (adap, &addr_data, saa5249_attach); -return 0 ; +return i2c_probe (adap, &addr_data, saa5249_attach); }static int saa5249_detach (struct i2c_client *client)
@@ -249,6 +247,7 @@ .name = IF_NAME, /* name */ .id = I2C_DRIVERID_SAA5249, /* in i2c.h */ .flags = I2C_DF_NOTIFY, + .class = I2C_CLASS_TV_ANALOG, .attach_adapter = saa5249_probe, .detach_client = saa5249_detach, .command = saa5249_command
drivers/media/video/saa7134/saa6752hs.c +3 -5
@@ -335,9 +335,7 @@static int saa6752hs_probe (struct i2c_adapter *adap) { -if (adap->class &I2C_CLASS_TV_ANALOG ) -return i2c_probe (adap, &addr_data, saa6752hs_attach); -return 0 ; +return i2c_probe (adap, &addr_data, saa6752hs_attach); }static int saa6752hs_detach (struct i2c_client *client)
@@ -376,6 +373,7 @@ .name = "i2c saa6752hs MPEG encoder", .id = I2C_DRIVERID_SAA6752HS, .flags = I2C_DF_NOTIFY, + .class = I2C_CLASS_TV_ANALOG, .attach_adapter = saa6752hs_probe, .detach_client = saa6752hs_detach, .command = saa6752hs_command,
@@ -390,8 +388,7 @@static int saa6752hs_init_module (void ) { -i2c_add_driver (&driver); -return 0 ; +return i2c_add_driver (&driver); }static void saa6752hs_cleanup_module (void )
drivers/media/video/tda7432.c +3 -10
@@ -338,14 +338,7 @@static int tda7432_probe (struct i2c_adapter *adap) { -#ifdef I2C_CLASS_TV_ANALOG -if (adap->class &I2C_CLASS_TV_ANALOG ) -return i2c_probe (adap, &addr_data, tda7432_attach); -#else -if (adap->id == (I2C_ALGO_BIT |I2C_HW_B_BT848 )) -return i2c_probe (adap, &addr_data, tda7432_attach); -#endif -return 0 ; +return i2c_probe (adap, &addr_data, tda7432_attach); }static int tda7432_detach (struct i2c_client *client)
@@ -520,6 +513,7 @@ .name = "i2c tda7432 driver", .id = I2C_DRIVERID_TDA7432, .flags = I2C_DF_NOTIFY, + .class = I2C_CLASS_TV_ANALOG, .attach_adapter = tda7432_probe, .detach_client = tda7432_detach, .command = tda7432_command,
@@ -538,8 +532,7 @@printk (KERN_ERR "tda7432: loudness parameter must be between 0 and 15\n" );return -EINVAL ; } -i2c_add_driver (&driver); -return 0 ; +return i2c_add_driver (&driver); }static void tda7432_fini (void )
drivers/media/video/tda9875.c +3 -10
@@ -272,14 +272,7 @@static int tda9875_probe (struct i2c_adapter *adap) { -#ifdef I2C_CLASS_TV_ANALOG -if (adap->class &I2C_CLASS_TV_ANALOG ) -return i2c_probe (adap, &addr_data, tda9875_attach); -#else -if (adap->id == (I2C_ALGO_BIT |I2C_HW_B_BT848 )) -return i2c_probe (adap, &addr_data, tda9875_attach); -#endif -return 0 ; +return i2c_probe (adap, &addr_data, tda9875_attach); }static int tda9875_detach (struct i2c_client *client)
@@ -391,6 +384,7 @@ .name = "i2c tda9875 driver", .id = I2C_DRIVERID_TDA9875, .flags = I2C_DF_NOTIFY, + .class = I2C_CLASS_TV_ANALOG, .attach_adapter = tda9875_probe, .detach_client = tda9875_detach, .command = tda9875_command,
@@ -405,8 +399,7 @@static int tda9875_init (void ) { -i2c_add_driver (&driver); -return 0 ; +return i2c_add_driver (&driver); }static void tda9875_fini (void )
drivers/media/video/tda9887.c +3 -15
@@ -370,19 +370,7 @@static int tda9887_probe (struct i2c_adapter *adap) { -#ifdef I2C_CLASS_TV_ANALOG -if (adap->class &I2C_CLASS_TV_ANALOG ) -return i2c_probe (adap, &addr_data, tda9887_attach); -#else -switch (adap->id) { -case I2C_ALGO_BIT |I2C_HW_B_BT848 : -case I2C_ALGO_BIT |I2C_HW_B_RIVA : -case I2C_ALGO_SAA7134 : -return i2c_probe (adap, &addr_data, tda9887_attach); -break ; - } -#endif -return 0 ; +return i2c_probe (adap, &addr_data, tda9887_attach); }static int tda9887_detach (struct i2c_client *client)
@@ -447,6 +435,7 @@ .name = "i2c tda9887 driver", .id = -1, /* FIXME */ .flags = I2C_DF_NOTIFY, + .class = I2C_CLASS_TV_ANALOG, .attach_adapter = tda9887_probe, .detach_client = tda9887_detach, .command = tda9887_command,
@@ -460,8 +449,7 @@static int tda9887_init_module (void ) { -i2c_add_driver (&driver); -return 0 ; +return i2c_add_driver (&driver); }static void tda9887_cleanup_module (void )
drivers/media/video/tuner.c +3 -17
@@ -1067,21 +1067,7 @@ } this_adap =0 ; -#ifdef I2C_CLASS_TV_ANALOG -if (adap->class &I2C_CLASS_TV_ANALOG ) -return i2c_probe (adap, &addr_data, tuner_attach); -#else -switch (adap->id) { -case I2C_ALGO_BIT |I2C_HW_SMBUS_VOODOO3 : -case I2C_ALGO_BIT |I2C_HW_B_BT848 : -case I2C_ALGO_BIT |I2C_HW_B_RIVA : -case I2C_ALGO_SAA7134 : -case I2C_ALGO_SAA7146 : -return i2c_probe (adap, &addr_data, tuner_attach); -break ; - } -#endif -return 0 ; +return i2c_probe (adap, &addr_data, tuner_attach); }static int tuner_detach (struct i2c_client *client)
@@ -1184,6 +1170,7 @@ .name = "i2c TV tuner driver", .id = I2C_DRIVERID_TUNER, .flags = I2C_DF_NOTIFY, + .class = I2C_CLASS_TV_ANALOG, .attach_adapter = tuner_probe, .detach_client = tuner_detach, .command = tuner_command,
@@ -1197,8 +1184,7 @@static int tuner_init_module (void ) { -i2c_add_driver (&driver); -return 0 ; +return i2c_add_driver (&driver); }static void tuner_cleanup_module (void )
drivers/media/video/tvaudio.c +3 -14
@@ -1497,18 +1497,7 @@static int chip_probe (struct i2c_adapter *adap) { -#ifdef I2C_CLASS_TV_ANALOG -if (adap->class &I2C_CLASS_TV_ANALOG ) -return i2c_probe (adap, &addr_data, chip_attach); -#else -switch (adap->id) { -case I2C_ALGO_BIT |I2C_HW_B_BT848 : -case I2C_ALGO_BIT |I2C_HW_B_RIVA : -case I2C_ALGO_SAA7134 : -return i2c_probe (adap, &addr_data, chip_attach); - } -#endif -return 0 ; +return i2c_probe (adap, &addr_data, chip_attach); }static int chip_detach (struct i2c_client *client)
@@ -1639,6 +1628,7 @@ .name = "generic i2c audio driver", .id = I2C_DRIVERID_TVAUDIO, .flags = I2C_DF_NOTIFY, + .class = I2C_CLASS_TV_ANALOG, .attach_adapter = chip_probe, .detach_client = chip_detach, .command = chip_command,
@@ -1659,8 +1649,7 @@for (desc = chiplist; desc->name !=NULL ; desc++)printk ("%s%s" , (desc == chiplist) ?"" :"," ,desc->name);printk ("\n" ); -i2c_add_driver (&driver); -return 0 ; +return i2c_add_driver (&driver); }static void audiochip_cleanup_module (void )
drivers/media/video/tvmixer.c +2 -19
@@ -232,6 +232,7 @@ .flags = I2C_DF_NOTIFY, .detach_adapter = tvmixer_adapters, #endif + .class = I2C_CLASS_TV_ANALOG, .attach_adapter = tvmixer_adapters, .detach_client = tvmixer_clients, };
@@ -263,23 +264,6 @@struct video_audio va;int i,minor; -#ifdef I2C_CLASS_TV_ANALOG -if (!(client->adapter->class &I2C_CLASS_TV_ANALOG )) -return -1 ; -#else -/* TV card ??? */ -switch (client->adapter->id) { -case I2C_ALGO_BIT |I2C_HW_SMBUS_VOODOO3 : -case I2C_ALGO_BIT |I2C_HW_B_BT848 : -case I2C_ALGO_BIT |I2C_HW_B_RIVA : -/* ok, have a look ... */ -break ; -default : -/* ignore that one */ -return -1 ; - } -#endif -/* unregister ?? */ for (i =0 ; i <DEV_MAX ; i++) {if (devices[i].dev == client) {
@@ -334,8 +318,7 @@for (i =0 ; i <DEV_MAX ; i++) devices[i].minor =-1 ; -i2c_add_driver (&driver); -return 0 ; +return i2c_add_driver (&driver); }static void tvmixer_cleanup_module (void )
drivers/i2c/chips/adm1021.c +1 -2
@@ -144,6 +144,7 @@ .name = "adm1021", .id = I2C_DRIVERID_ADM1021, .flags = I2C_DF_NOTIFY, + .class = I2C_CLASS_HWMON, .attach_adapter = adm1021_attach_adapter, .detach_client = adm1021_detach_client, };
@@ -200,8 +201,6 @@static int adm1021_attach_adapter (struct i2c_adapter *adapter) { -if (!(adapter->class &I2C_CLASS_HWMON )) -return 0 ;return i2c_detect (adapter, &addr_data, adm1021_detect); }
drivers/i2c/chips/asb100.c +1 -2
@@ -233,6 +233,7 @@ .name = "asb100", .id = I2C_DRIVERID_ASB100, .flags = I2C_DF_NOTIFY, + .class = I2C_CLASS_HWMON, .attach_adapter = asb100_attach_adapter, .detach_client = asb100_detach_client, };
@@ -609,8 +610,6 @@*/ static int asb100_attach_adapter (struct i2c_adapter *adapter) { -if (!(adapter->class &I2C_CLASS_HWMON )) -return 0 ;return i2c_detect (adapter, &addr_data, asb100_detect); }
drivers/i2c/chips/ds1621.c +1 -0
@@ -92,6 +92,7 @@ .name = "ds1621", .id = I2C_DRIVERID_DS1621, .flags = I2C_DF_NOTIFY, + .class = I2C_CLASS_HWMON, .attach_adapter = ds1621_attach_adapter, .detach_client = ds1621_detach_client, };
drivers/i2c/chips/eeprom.c +1 -0
@@ -82,6 +82,7 @@ .name = "eeprom", .id = I2C_DRIVERID_EEPROM, .flags = I2C_DF_NOTIFY, + .class = I2C_CLASS_HWMON, .attach_adapter = eeprom_attach_adapter, .detach_client = eeprom_detach_client, };
drivers/i2c/chips/fscher.c +1 -2
@@ -124,6 +124,7 @@ .name = "fscher", .id = I2C_DRIVERID_FSCHER, .flags = I2C_DF_NOTIFY, + .class = I2C_CLASS_HWMON, .attach_adapter = fscher_attach_adapter, .detach_client = fscher_detach_client, };
@@ -293,8 +294,6 @@static int fscher_attach_adapter (struct i2c_adapter *adapter) { -if (!(adapter->class &I2C_CLASS_HWMON )) -return 0 ;return i2c_detect (adapter, &addr_data, fscher_detect); }
drivers/i2c/chips/gl518sm.c +1 -2
@@ -156,6 +156,7 @@ .name = "gl518sm", .id = I2C_DRIVERID_GL518, .flags = I2C_DF_NOTIFY, + .class = I2C_CLASS_HWMON, .attach_adapter = gl518_attach_adapter, .detach_client = gl518_detach_client, };
@@ -335,8 +336,6 @@static int gl518_attach_adapter (struct i2c_adapter *adapter) { -if (!(adapter->class &I2C_CLASS_HWMON )) -return 0 ;return i2c_detect (adapter, &addr_data, gl518_detect); }
drivers/i2c/chips/it87.c +1 -2
@@ -173,6 +173,7 @@ .name = "it87", .id = I2C_DRIVERID_IT87, .flags = I2C_DF_NOTIFY, + .class = I2C_CLASS_HWMON, .attach_adapter = it87_attach_adapter, .detach_client = it87_detach_client, };
@@ -500,8 +501,6 @@* when a new adapter is inserted (and it87_driver is still present) */ static int it87_attach_adapter (struct i2c_adapter *adapter) { -if (!(adapter->class &I2C_CLASS_HWMON )) -return 0 ;return i2c_detect (adapter, &addr_data, it87_detect); }
drivers/i2c/chips/lm78.c +1 -2
@@ -229,6 +229,7 @@ .name = "lm78", .id = I2C_DRIVERID_LM78, .flags = I2C_DF_NOTIFY, + .class = I2C_CLASS_HWMON, .attach_adapter = lm78_attach_adapter, .detach_client = lm78_detach_client, };
@@ -488,8 +489,6 @@* when a new adapter is inserted (and lm78_driver is still present) */ static int lm78_attach_adapter (struct i2c_adapter *adapter) { -if (!(adapter->class &I2C_CLASS_HWMON )) -return 0 ;return i2c_detect (adapter, &addr_data, lm78_detect); }
drivers/i2c/chips/lm80.c +1 -2
@@ -156,6 +156,7 @@ .name = "lm80", .id = I2C_DRIVERID_LM80, .flags = I2C_DF_NOTIFY, + .class = I2C_CLASS_HWMON, .attach_adapter = lm80_attach_adapter, .detach_client = lm80_detach_client, };
@@ -376,8 +377,6 @@static int lm80_attach_adapter (struct i2c_adapter *adapter) { -if (!(adapter->class &I2C_CLASS_HWMON )) -return 0 ;return i2c_detect (adapter, &addr_data, lm80_detect); }
drivers/i2c/chips/lm83.c +1 -2
@@ -125,6 +125,7 @@ .name = "lm83", .id = I2C_DRIVERID_LM83, .flags = I2C_DF_NOTIFY, + .class = I2C_CLASS_HWMON, .attach_adapter = lm83_attach_adapter, .detach_client = lm83_detach_client, };
@@ -216,8 +217,6 @@static int lm83_attach_adapter (struct i2c_adapter *adapter) { -if (!(adapter->class &I2C_CLASS_HWMON )) -return 0 ;return i2c_detect (adapter, &addr_data, lm83_detect); }
drivers/i2c/chips/lm85.c +1 -0
@@ -403,6 +403,7 @@ .name = "lm85", .id = I2C_DRIVERID_LM85, .flags = I2C_DF_NOTIFY, + .class = I2C_CLASS_HWMON, .attach_adapter = lm85_attach_adapter, .detach_client = lm85_detach_client, };
drivers/i2c/chips/lm90.c +1 -2
@@ -146,6 +146,7 @@ .name = "lm90", .id = I2C_DRIVERID_LM90, .flags = I2C_DF_NOTIFY, + .class = I2C_CLASS_HWMON, .attach_adapter = lm90_attach_adapter, .detach_client = lm90_detach_client, };
@@ -274,8 +275,6 @@static int lm90_attach_adapter (struct i2c_adapter *adapter) { -if (!(adapter->class &I2C_CLASS_HWMON )) -return 0 ;return i2c_detect (adapter, &addr_data, lm90_detect); }
drivers/i2c/chips/pcf8574.c +1 -0
@@ -73,6 +73,7 @@ .name = "pcf8574", .id = I2C_DRIVERID_PCF8574, .flags = I2C_DF_NOTIFY, + .class = I2C_CLASS_HWMON, .attach_adapter = pcf8574_attach_adapter, .detach_client = pcf8574_detach_client, };
drivers/i2c/chips/pcf8591.c +1 -0
@@ -95,6 +95,7 @@ .name = "pcf8591", .id = I2C_DRIVERID_PCF8591, .flags = I2C_DF_NOTIFY, + .class = I2C_CLASS_HWMON, .attach_adapter = pcf8591_attach_adapter, .detach_client = pcf8591_detach_client, };
drivers/i2c/chips/via686a.c +1 -2
@@ -586,6 +586,7 @@ .name = "via686a", .id = I2C_DRIVERID_VIA686A, .flags = I2C_DF_NOTIFY, + .class = I2C_CLASS_HWMON, .attach_adapter = via686a_attach_adapter, .detach_client = via686a_detach_client, };
@@ -594,8 +595,6 @@/* This is called when the module is loaded */ static int via686a_attach_adapter (struct i2c_adapter *adapter) { -if (!(adapter->class &I2C_CLASS_HWMON )) -return 0 ;return i2c_detect (adapter, &addr_data, via686a_detect); }
drivers/i2c/chips/w83627hf.c +1 -0
@@ -331,6 +331,7 @@ .name = "w83627hf", .id = I2C_DRIVERID_W83627HF, .flags = I2C_DF_NOTIFY, + .class = I2C_CLASS_HWMON, .attach_adapter = w83627hf_attach_adapter, .detach_client = w83627hf_detach_client, };
drivers/i2c/chips/w83781d.c +1 -2
@@ -281,6 +281,7 @@ .name = "w83781d", .id = I2C_DRIVERID_W83781D, .flags = I2C_DF_NOTIFY, + .class = I2C_CLASS_HWMON, .attach_adapter = w83781d_attach_adapter, .detach_client = w83781d_detach_client, };
@@ -905,8 +906,6 @@static int w83781d_attach_adapter (struct i2c_adapter *adapter) { -if (!(adapter->class &I2C_CLASS_HWMON )) -return 0 ;return i2c_detect (adapter, &addr_data, w83781d_detect); }
drivers/i2c/chips/w83l785ts.c +1 -2
@@ -96,6 +96,7 @@ .name = "w83l785ts", .id = I2C_DRIVERID_W83L785TS, .flags = I2C_DF_NOTIFY, + .class = I2C_CLASS_HWMON, .attach_adapter = w83l785ts_attach_adapter, .detach_client = w83l785ts_detach_client, };
@@ -145,8 +146,6 @@static int w83l785ts_attach_adapter (struct i2c_adapter *adapter) { -if (!(adapter->class &I2C_CLASS_HWMON )) -return 0 ;return i2c_detect (adapter, &addr_data, w83l785ts_detect); }
drivers/i2c/i2c-dev.c +1 -0
@@ -500,6 +500,7 @@ .name = "dev_driver", .id = I2C_DRIVERID_I2CDEV, .flags = I2C_DF_NOTIFY, + .class = I2C_CLASS_ALL, .attach_adapter = i2cdev_attach_adapter, .detach_adapter = i2cdev_detach_adapter, .detach_client = i2cdev_detach_client,
drivers/acorn/char/i2c.c +1 -0
@@ -345,6 +345,7 @@static struct i2c_adapter ioc_ops = { .id =I2C_HW_B_IOC , .algo_data = &ioc_data, + .class =I2C_CLASS_ALL , .client_register = ioc_client_reg, .client_unregister = ioc_client_unreg, };
drivers/acorn/char/pcf8583.c +1 -0
@@ -227,6 +227,7 @@ .name = "PCF8583", .id = I2C_DRIVERID_PCF8583, .flags = I2C_DF_NOTIFY, + .class = I2C_CLASS_ALL, /* fixme: add another I2C_CLASS_xxx entry for Acorn? */ .attach_adapter = pcf8583_probe, .detach_client = pcf8583_detach, .command = pcf8583_command
drivers/i2c/busses/i2c-keywest.c +1 -0
@@ -619,6 +619,7 @@ chan->iface = iface; chan->chan_no = i; chan->adapter.id =I2C_ALGO_SMBUS ; + chan->adapter.class =I2C_CLASS_HWMON |I2C_CLASS_SOUND ; chan->adapter.algo = &keywest_algorithm; chan->adapter.algo_data =NULL ; chan->adapter.client_register =NULL ;
drivers/ieee1394/pcilynx.c +1 -0
@@ -1799,6 +1799,7 @@ i2c_adapter = bit_ops; i2c_adapter_data = bit_data; i2c_adapter.algo_data = &i2c_adapter_data; + i2c_adapter.class =I2C_CLASS_NONE ; i2c_adapter_data.data = lynx; PRINTD(KERN_DEBUG, lynx->id,"original eeprom control: %d",
drivers/macintosh/therm_adt746x.c +1 -0
@@ -164,6 +164,7 @@ .name ="Apple Thermostat ADT746x", .id =0xDEAD7467, .flags =I2C_DF_NOTIFY, + .class =I2C_CLASS_HWMON, .attach_adapter =&attach_thermostat, .detach_adapter =&detach_thermostat, };
drivers/macintosh/therm_pm72.c +1 -0
@@ -142,6 +142,7 @@ .name = "therm_pm72", .id = 0xDEADBEEF, .flags = I2C_DF_NOTIFY, + .class = I2C_CLASS_HWMON, .attach_adapter = therm_pm72_attach, .detach_adapter = therm_pm72_detach, };
drivers/macintosh/therm_windtunnel.c +1 -0
@@ -357,6 +357,7 @@ .name = "Apple G4 Thermostat/Fan", .id = I2C_DRIVERID_G4FAN, .flags = I2C_DF_NOTIFY, + .class = I2C_CLASS_HWMON, .attach_adapter = &do_attach, .detach_client = &do_detach, .command = NULL,
include/linux/i2c.h +2 -1
@@ -285,7 +285,8 @@#define I2C_CLIENT_TEN 0x10/* we have a ten bit chip address */ /* Must equal I2C_M_TEN below */ -/* i2c adapter classes (bitmask) */ +/* i2c classes (bitmask) */ +#define I2C_CLASS_NONE 0/* none, don't use */ #define I2C_CLASS_HWMON (1<<0)/* lm_sensors, ... */ #define I2C_CLASS_TV_ANALOG (1<<1)/* bttv + friends */ #define I2C_CLASS_TV_DIGITAL (1<<2)/* dvb cards */
sound/oss/dmasound/dac3550a.c +1 -0
@@ -47,6 +47,7 @@ .name = "DAC3550A driver V " DACA_VERSION, .id = I2C_DRIVERID_DACA, .flags = I2C_DF_NOTIFY, + .class = I2C_CLASS_SOUND, .attach_adapter = daca_attach_adapter, .detach_client = daca_detach_client, };
sound/oss/dmasound/tas_common.c +1 -0
@@ -50,6 +50,7 @@ .owner = THIS_MODULE, .name = "tas", .flags = I2C_DF_NOTIFY, + .class = I2C_CLASS_SOUND, .attach_adapter = tas_attach_adapter, .detach_client = tas_detach_client, };
sound/ppc/keywest.c +1 -0
@@ -44,6 +44,7 @@ .name = "PMac Keywest Audio", .id = I2C_DRIVERID_KEYWEST, .flags = I2C_DF_NOTIFY, + .class = I2C_CLASS_SOUND, .attach_adapter = &keywest_attach_adapter, .detach_client = &keywest_detach_client, };
drivers/i2c/algos/i2c-algo-pcf.c +2 -1
@@ -449,7 +449,8 @@ adap->id |= pcf_algo.id; adap->algo = &pcf_algo; - + adap->class =I2C_CLASS_ALL ; + adap->timeout =100 ;/* default values, should */ adap->retries =3 ;/* be replaced by defines */
drivers/i2c/busses/i2c-elektor.c +1 -0
@@ -171,6 +171,7 @@ .owner = THIS_MODULE, .id = I2C_HW_P_ELEK, .algo_data = &pcf_isa_data, + .class = I2C_CLASS_ALL, .name = "PCF8584 ISA adapter", };
drivers/media/dvb/bt8xx/dvb-bt8xx.c +5 -0
@@ -261,6 +261,11 @@ .name = "dvb_bt8xx", .id = I2C_DRIVERID_DVB_BT878A, .flags = I2C_DF_NOTIFY, +/* ugly, but necessary: bt8x8 based budget dvb cards are handled by bttv on the +lowest level and we fake a i2c client to get to know all bt8x8 based +cards when they have been registered by bttv. +we do a check for adap->id in order to find the right cards */ + .class = I2C_CLASS_ALL, .attach_adapter = dvb_bt8xx_attach, .detach_adapter = dvb_bt8xx_detach, };
drivers/media/video/ir-kbd-i2c.c +1 -0
@@ -247,6 +247,7 @@ .name = "ir remote kbd driver", .id = I2C_DRIVERID_EXP3, /* FIXME */ .flags =I2C_DF_NOTIFY , + .class = I2C_CLASS_TV_ANALOG | I2C_CLASS_TV_DIGITAL; .attach_adapter = ir_probe, .detach_client = ir_detach, };
drivers/media/video/zoran_card.c +1 -0
@@ -740,6 +740,7 @@ I2C_DEVNAME("zr36057"), .id = I2C_HW_B_ZR36067, .algo = NULL, + .class = I2C_CLASS_TV_ANALOG, .client_register = zoran_i2c_client_register, .client_unregister = zoran_i2c_client_unregister, };
drivers/video/aty/radeon_i2c.c +1 -0
@@ -78,6 +78,7 @@ chan->adapter.id =I2C_ALGO_ATI ; chan->adapter.algo_data = &chan->algo; chan->adapter.dev.parent = &chan->rinfo->pdev->dev; + chan->adapter.class =I2C_CLASS_NONE ; chan->algo.setsda = radeon_gpio_setsda; chan->algo.setscl = radeon_gpio_setscl; chan->algo.getsda = radeon_gpio_getsda;
drivers/video/matrox/i2c-matroxfb.c +6 -5
@@ -104,13 +104,14 @@ };static int i2c_bus_reg (struct i2c_bit_adapter * b,struct matrox_fb_info * minfo, -unsigned int data,unsigned int clock,const char * name) { +unsigned int data,unsigned int clock,const char * name,unsigned int class) {int err; b->minfo = minfo; b->mask.data = data; b->mask.clock = clock; b->adapter = matrox_i2c_adapter_template; + b->class = class;snprintf (b->adapter.name,I2C_NAME_SIZE , name, minfo->fbcon.node);i2c_set_adapdata (&b->adapter, b);
@@ -160,22 +161,22 @@switch (ACCESS_FBINFO (chip)) {case MGA_2064 :case MGA_2164 : - err =i2c_bus_reg (&m2info->ddc1, minfo,DDC1B_DATA ,DDC1B_CLK ,"DDC:fb%u #0" ); + err =i2c_bus_reg (&m2info->ddc1, minfo,DDC1B_DATA ,DDC1B_CLK ,"DDC:fb%u #0" ,I2C_CLASS_DDC );break ;default : - err =i2c_bus_reg (&m2info->ddc1, minfo,DDC1_DATA ,DDC1_CLK ,"DDC:fb%u #0" ); + err =i2c_bus_reg (&m2info->ddc1, minfo,DDC1_DATA ,DDC1_CLK ,"DDC:fb%u #0" ,I2C_CLASS_DDC );break ; }if (err) goto fail_ddc1;if (ACCESS_FBINFO (devflags.dualhead)) { - err =i2c_bus_reg (&m2info->ddc2, minfo,DDC2_DATA ,DDC2_CLK ,"DDC:fb%u #1" ); + err =i2c_bus_reg (&m2info->ddc2, minfo,DDC2_DATA ,DDC2_CLK ,"DDC:fb%u #1" ,I2C_CLASS_DDC );if (err == -ENODEV ) {printk (KERN_INFO "i2c-matroxfb: VGA->TV plug detected, DDC unavailable.\n" ); }else if (err)printk (KERN_INFO "i2c-matroxfb: Could not register secondary output i2c bus. Continuing anyway.\n" );/* Register maven bus even on G450/G550 */ - err =i2c_bus_reg (&m2info->maven, minfo,MAT_DATA ,MAT_CLK ,"MAVEN:fb%u" ); + err =i2c_bus_reg (&m2info->maven, minfo,MAT_DATA ,MAT_CLK ,"MAVEN:fb%u" ,I2C_CLASS_TV_ANALOG );if (err)printk (KERN_INFO "i2c-matroxfb: Could not register Maven i2c bus. Continuing anyway.\n" ); }
drivers/video/matrox/matroxfb_maven.c +1 -0
@@ -1297,6 +1297,7 @@ .name = "maven", .id = I2C_DRIVERID_MGATVO, .flags = I2C_DF_NOTIFY, + .class = I2C_CLASS_TV_ANALOG, .attach_adapter = maven_attach_adapter, .detach_client = maven_detach_client, .command = maven_command,
drivers/i2c/busses/i2c-ibm_iic.c +1 -0
@@ -607,6 +607,7 @@i2c_set_adapdata (adap, dev); adap->id =I2C_HW_OCP | iic_algo.id; adap->algo = &iic_algo; + adap->class =I2C_CLASS_ALL ; adap->client_register =NULL ; adap->client_unregister =NULL ; adap->timeout =1 ;
drivers/i2c/busses/i2c-iop3xx.c +15 -2
@@ -507,18 +507,31 @@ .name = ADAPTER_NAME_ROOT "0", .id = I2C_HW_IOP321, .algo_data = &algo_iop3xx_data0, + .class = I2C_CLASS_ALL, };static struct i2c_adapter iop3xx_ops1 = { .owner =THIS_MODULE , .name =ADAPTER_NAME_ROOT "1" , .id =I2C_HW_IOP321 , .algo_data = &algo_iop3xx_data1, + .class =I2C_CLASS_ALL , };static int __init i2c_iop3xx_init (void ) { -return i2c_iop3xx_add_bus (&iop3xx_ops0) || -i2c_iop3xx_add_bus (&iop3xx_ops1); +int ret; + + ret =i2c_iop3xx_add_bus (&iop3xx_ops0); +if (ret) +return ret; + + ret =i2c_iop3xx_add_bus (&iop3xx_ops1); +if (ret) { +i2c_iop3xx_del_bus (&iop3xx_ops0); +return ret; + } + +return 0 ; } static void __exit i2c_iop3xx_exit (void)
drivers/i2c/busses/i2c-ite.c +1 -0
@@ -192,6 +192,7 @@ .owner = THIS_MODULE, .id = I2C_HW_I_IIC, .algo_data = &iic_ite_data, + .class = I2C_CLASS_ALL, .dev = { .name = "ITE IIC adapter", },
drivers/i2c/busses/scx200_i2c.c +1 -0
@@ -84,6 +84,7 @@static struct i2c_adapter scx200_i2c_ops = { .owner =THIS_MODULE , .algo_data = &scx200_i2c_data, + .class =I2C_CLASS_ALL , .name ="NatSemi SCx200 I2C" , };
drivers/i2c/busses/i2c-frodo.c +1 -0
@@ -62,6 +62,7 @@ .owner = THIS_MODULE, .id = I2C_HW_B_FRODO, .algo_data = &bit_frodo_data, + .class = I2C_CLASS_ALL, .dev = { .name = "Frodo adapter driver", },
drivers/i2c/busses/i2c-hydra.c +1 -0
@@ -107,6 +107,7 @@ .owner = THIS_MODULE, .name = "Hydra i2c", .id = I2C_HW_B_HYDRA, + .class = I2C_CLASS_HWMON, .algo_data = &hydra_bit_data, };
drivers/i2c/busses/i2c-i810.c +2 -0
@@ -173,6 +173,7 @@static struct i2c_adapter i810_i2c_adapter = { .owner =THIS_MODULE , .name ="I810/I815 I2C Adapter" , + .class =I2C_CLASS_ALL ,/* fixme, what's the correct class? */ .algo_data = &i810_i2c_bit_data, };
@@ -189,6 +190,7 @@static struct i2c_adapter i810_ddc_adapter = { .owner =THIS_MODULE , .name ="I810/I815 DDC Adapter" , + .class =I2C_CLASS_DDC , .algo_data = &i810_ddc_bit_data, };
drivers/i2c/busses/i2c-ixp4xx.c +3 -2
@@ -133,8 +133,9 @@ drv_data->algo_data.mdelay =10 ; drv_data->algo_data.timeout =100 ; - drv_data->adapter.id =I2C_HW_B_IXP4XX , - drv_data->adapter.algo_data = &drv_data->algo_data, + drv_data->adapter.id =I2C_HW_B_IXP4XX ; + drv_data->adapter.algo_data = &drv_data->algo_data; + drv_data->adapter.class =I2C_CLASS_ALL ; drv_data->adapter.dev.parent = &plat_dev->dev;
drivers/i2c/busses/i2c-prosavage.c +4 -3
@@ -181,12 +181,13 @@/* * adapter initialisation */ -static int i2c_register_bus (struct pci_dev *dev,struct s_i2c_bus *p,u8 *mmvga,u32 i2c_reg) +static int i2c_register_bus (struct pci_dev *dev,struct s_i2c_bus *p,u8 *mmvga,u32 i2c_reg,unsigned int class) {int ret; p->adap.owner =THIS_MODULE ; p->adap.id =I2C_HW_B_S3VIA ; p->adap.algo_data = &p->algo; + p->adap.class = class; p->adap.dev.parent = &dev->dev; p->algo.setsda = bit_s3via_setsda; p->algo.setscl = bit_s3via_setscl;
@@ -281,7 +282,7 @@snprintf (bus->adap.name,sizeof (bus->adap.name),"ProSavage I2C bus at %02x:%02x.%x" , dev->bus->number,PCI_SLOT (dev->devfn),PCI_FUNC (dev->devfn)); - ret =i2c_register_bus (dev, bus, chip->mmio +0x8000 ,CR_SERIAL1 ); + ret =i2c_register_bus (dev, bus, chip->mmio +0x8000 ,CR_SERIAL1 ,I2C_CLASS_ALL );if (ret) { goto err_adap; }
@@ -292,7 +293,7 @@snprintf (bus->adap.name,sizeof (bus->adap.name),"ProSavage DDC bus at %02x:%02x.%x" , dev->bus->number,PCI_SLOT (dev->devfn),PCI_FUNC (dev->devfn)); - ret =i2c_register_bus (dev, bus, chip->mmio +0x8000 ,CR_SERIAL2 ); + ret =i2c_register_bus (dev, bus, chip->mmio +0x8000 ,CR_SERIAL2 ,I2C_CLASS_DDC );if (ret) { goto err_adap; }
drivers/i2c/busses/i2c-savage4.c +1 -0
@@ -149,6 +149,7 @@ .owner = THIS_MODULE, .name = "I2C Savage4 adapter", .algo_data = &sav_i2c_bit_data, + .class = I2C_CLASS_ALL, /* fixme: correct class entry? */ };static struct pci_device_id savage4_ids[]__devinitdata = {
drivers/i2c/i2c-core.c +9 -3
@@ -148,8 +148,11 @@list_for_each (item,&drivers) { driver = list_entry(item, struct i2c_driver, list);if (driver->flags &I2C_DF_NOTIFY ) -/* We ignore the return code; if it fails, too bad */ - driver->attach_adapter (adap); +if (adap->class & driver->class) +/* We ignore the return code; if it fails, too bad */ + driver->attach_adapter (adap); +else +printk ("i2c-core: skipping driver '%s' on adapter '%s' (class mismatch)\n" ,driver->name, adap->name); }up (&core_lists);
@@ -247,7 +250,10 @@if (driver->flags &I2C_DF_NOTIFY ) {list_for_each (item,&adapters) { adapter = list_entry(item, struct i2c_adapter, list); - driver->attach_adapter (adapter); +if (adapter->class & driver->class) + driver->attach_adapter (adapter); +else +printk ("i2c-core: skipping driver '%s' on adapter '%s' (class mismatch)\n" ,driver->name, adap->name); } }
Re: Adding .class field to struct i2c_client (was Re: [PATCH][2.6] Add command function to struct i2c_adapter
An addition to the class idea would be for clients to have priorities. That would let me mark the bus as being for DDC. The highest priority client would be the DDC driver. If the DDC driver can't find valid EDID it could then fall back to letting the EEPROM driver try to find the chip.
Something like this is important if we get a new EDID standard that the DDC driver doesn't recognize. By letting the EEPROM driver load at a lower priority you could still easily get to the ROM contents. Or does it bother people if we let both EEPROM and DDC load on DDC class buses?
Signature · 2 lines
Jon Smirl [email protected]
Re: Adding .class field to struct i2c_client (was Re: [PATCH][2.6] Add command function to struct i2c_adapter
In reply to Michael HunoldQuoted 3 lines · Michael Hunold
Please have a look and tell me what you think. The big problem will be, that we cannot test all configurations, so it's possible that some devices won't be recognized anymore, because the .class entries don't match.
I like the patches. If you get them in a state you like (and drop the printk(), and use dev_dbg() instead), and send them 1 patch per file with the Signed-off-by: line, I'll be glad to apply them.
thanks,
greg k-h
Re: Adding .class field to struct i2c_client (was Re: [PATCH][2.6] Add command function to struct i2c_adapter
Hi,
Quoted 6 lines · Greg KH
Quoted 1 line · Michael Hunold
Please have a look and tell me what you think. The big problem will be, that we cannot test all configurations, so it's possible that some devices won't be recognized anymore, because the .class entries don't match.
I like the patches. If you get them in a state you like (and drop the
printk(), and usedev_dbg()instead),
Ok.
Quoted 2 lines
and send them 1 patch per file
with the Signed-off-by: line, I'll be glad to apply them.
I'll re-create them against 2.6.9-rc2-mm2.
Do you really mean one patch per file, ie. about 50 separate patches? (I don't care, I simply write a script that splits them up)
Quoted 2 lines
thanks,
greg k-h
CU
Michael.
Re: Adding .class field to struct i2c_client (was Re: [PATCH][2.6] Add command function to struct i2c_adapter
Quoted 15 lines · Michael Hunold
Hi,
Quoted 9 lines · Greg KH
Quoted 4 lines · Michael Hunold
Please have a look and tell me what you think. The big problem will be, that we cannot test all configurations, so it's possible that some devices won't be recognized anymore, because the .class entries don't match.
I like the patches. If you get them in a state you like (and drop the
printk(), and usedev_dbg()instead),Ok.
Quoted 7 lines
Quoted 2 lines
and send them 1 patch per file
with the Signed-off-by: line, I'll be glad to apply them.I'll re-create them against 2.6.9-rc2-mm2.
Do you really mean one patch per file, ie. about 50 separate patches? (I don't care, I simply write a script that splits them up)
Sorry, I ment one email per patch (you sent more than one patch in that email.)
thanks,
greg k-h
PATCH 1/1 [2.6] Add command function to struct i2c_adapter]
Hi,
sorry I forgot to CC the sensors/i2c mailing list. Comments welcome!
Regards
Michael Hunold.
-------------- next part --------------
An embedded message was scrubbed...
From: Michael Hunold <[email protected]>
Subject: [PATCH][2.6] Add command function to struct i2c_adapter
Date: Mon, 20 Sep 2004 19:19:24 +0200
Size: 2880
Url: http://lists.lm-sensors.org/pipermail/lm-sensors/attachments/20040921/88091fbb/PATCH2.mht