On Tue, 29 Nov 2005, Steve Toth wrote: > I know, it's a problem. That's why I asked for implementation suggestions > late last week. > > Two very different parts of the kernel need to use the same PLL. When you're > inside the cx22702 driver it's a no brainer, you can toggle the gate. When > you're outside of the 702 driver, in tuner.ko, you have no concept of the > 702, you only have an I2C bus to operate on. I could not see a nice solution > to the problem without a lot of re-engineering.of the kernel tuner support in > V4L. > > Please, I'm open to ideas. For me the i2c-gate of the demod is a virtual i2c-bus. When I attach the tuner I give it the gated-i2c-bus (I received from the demod) as i2c-bus to use for communication. And then the main i2c-master/i2c-adapter is in charge for opening/closing the gate of a gate-keeper. Two small graphs: Tuner || || Demod Decoder | | +----+--------+ | | main_I2C Maybe a future device :) Tuner Tuner || || || || Demod Demod | | +----+------+ | | main_I2C (just the i2c-bus - no IF-connection) - || is the virtual gated-i2c-bus main_I2C is the i2c-master for the main i2c bus and is also in charge for submitting messages to the device behind the gate. When data is transferred from or to the device behind the gate, main_I2C has to take care that there is only one gate open at a time and that it is the correct one - for some tuners it is even necessary to close the gate before writing something else on the i2c-bus or when accessing the other tuner behind the second demod, which can have the same i2c-address. pseudo code ahead: ==== init demod = init_demod(main_i2c) gated_i2c = get_virtual_i2c_bus_controlled_by_the_demod(demod); tuner = init_tuner(gated_i2c); ==== i2c-transfer function // called when gated_i2c is getting a transfer demod_i2c_transfer(i2c_adap,msg) { demod = i2c_adap->priv; msg->need_gate = 1; msg->gate_keeper = demod->gate_keeper; return main_i2c_transfer(demod->i2c_adap,msg); } main_i2c_transfer(i2c_adap, msg) { take_mutex(); close_gate_if_open_and different_i2c_address(); if (msg->need_gate) open_gate(msg->gate_keeper,msg->i2c_addr); do_actual_transfer(); release_mutex(); } === end of pseudo code I did it like this for our local drivers inspired by i2c-structures of the kernel. When I will have the time, I will create such a thing at least for the devices I have access to for v4l-dvb, but I'm not sure when this will be. (Maybe during the next 2 weeks). On the other hand I don't want to keep back any ideas which are needed now. Please ask if I'm unclear (I'm sure I am). best regards, Patrick. -- Mail: patrick.boettcher@xxxxxxx WWW: http://www.wi-bw.tfh-wildau.de/~pboettch/