On 11/06/2012 01:28 AM, Antonio Ospite wrote:
Some devices need to issue a pre-initialization command sequence via i2c in order to "enable" the communication with some adapter components. This happens for instance in the vp7049 USB DVB-T stick on which the frontend cannot be detected without first sending a certain sequence of commands via i2c.
I looked patch 3 and it is not I2C communication but direct M9206 memory access you did. I could guess it is GPIO sequence to reset & power demod and tuner. Due to that, correct place for this kind of initialization is inside demod and tuner attach.
With a USB power meter, some trial & error testing, and maybe fw disasm you could even detect those GPIOS :)
Signed-off-by: Antonio Ospite <ospite@xxxxxxxxxxxxxxxxx> --- If this approach is OK I can send a similar patch for dvb-usb-v2.
There is already such callbacks - but no callback between I2C init and FE attach. There is read_config() which is called first, good place to make probing device and detect hw config. Another new callback is .init() which is called after demod and tuner attach. Stuff like USB interface config should remain here. On USB power management case reset_resume() that function is called too in order re-configure reseted USB IF.
I don't see need yet another new callback.
Are all the dvb-usb drivers going to be ported to dvb-usb-v2 eventually?
There is still quite many drivers to convert, so maybe it is not happen anytime soon or even later. Feel free to convert that driver. For bonus you will get for example power-management support for free.
drivers/media/usb/dvb-usb/dvb-usb.h | 5 +++++ drivers/media/usb/dvb-usb/dvb-usb-init.c | 6 ++++++ 2 files changed, 11 insertions(+) diff --git a/drivers/media/usb/dvb-usb/dvb-usb.h b/drivers/media/usb/dvb-usb/dvb-usb.h index aab0f99..1fcea68 100644 --- a/drivers/media/usb/dvb-usb/dvb-usb.h +++ b/drivers/media/usb/dvb-usb/dvb-usb.h @@ -233,6 +233,9 @@ enum dvb_usb_mode { * @size_of_priv: how many bytes shall be allocated for the private field * of struct dvb_usb_device. * + * @pre_init: function executed after i2c initialization but + * before the adapters get initialized + * * @power_ctrl: called to enable/disable power of the device. * @read_mac_address: called to read the MAC address of the device. * @identify_state: called to determine the state (cold or warm), when it @@ -274,6 +277,8 @@ struct dvb_usb_device_properties { int size_of_priv; + int (*pre_init) (struct dvb_usb_device *); + int num_adapters; struct dvb_usb_adapter_properties adapter[MAX_NO_OF_ADAPTER_PER_DEVICE]; diff --git a/drivers/media/usb/dvb-usb/dvb-usb-init.c b/drivers/media/usb/dvb-usb/dvb-usb-init.c index 169196e..8ab916e 100644 --- a/drivers/media/usb/dvb-usb/dvb-usb-init.c +++ b/drivers/media/usb/dvb-usb/dvb-usb-init.c @@ -31,6 +31,12 @@ static int dvb_usb_adapter_init(struct dvb_usb_device *d, short *adapter_nrs) struct dvb_usb_adapter *adap; int ret, n, o; + if (d->props.pre_init) { + ret = d->props.pre_init(d); + if (ret < 0) + return ret; + } + for (n = 0; n < d->props.num_adapters; n++) { adap = &d->adapter[n]; adap->dev = d;
regards Antti -- http://palosaari.fi/ -- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html