Andrew de Quincey wrote: > Hi, Manu and I were just discussing this, and we think we have come up with an > idea. See the attached patch. > > Note: this is just an idea - it needs completed. The patch is just > illustrative - it won't tune or anything. > > Anyway: if you look at the frontend_init() code. Instead of calling the attach > methods (eg. stv0299_attach()) directly, we instead define something like the > macros I have added (e.g. STV0299_ATTACH). > > These use symbol_get() to dynamically get the address of the XXX_attach() > method and, if found, call it. Otherwise they fake a NULL return, and the > normal frontend failure code comes into effect. > > This method (suprisingly!) seems to work really well - dmesg for my test card > in this machine when I modprobed the modified budget-ci module: > > saa7146: register extension 'budget_ci dvb'. > ACPI: PCI Interrupt 0000:05:06.0[A] -> Link [APC1] -> GSI 16 (level, low) -> > IRQ 66 > saa7146: found saa7146 @ mem ffffc20010d04000 (revision 1, irq 66) > (0x13c2,0x100f). > saa7146 (0): dma buffer size 192512 > DVB: registering new adapter (TT-Budget/WinTV-NOVA-CI PCI). > adapter has MAC addr = 00:d0:5c:21:10:f5 > input: Budget-CI dvb ir receiver saa7146 (0) as /class/input/input6 > DVB: registering frontend 0 (ST STV0299 DVB-S)... > > The only DVB modules loaded are however: > budget_ci > budget_core > saa7146 > ttpci_eeprom > stv0299 > dvb_core > > Can anyone see anything fundamentally wrong with doing it this way? Due to the > frontend refactoring a while back, we already have these nice tables of > function pointers everywhere anyway. > > We do have a few static function calls to deal with - I just hacked 'em out in > the patch. With the PLL refactoring (see my other post) more of these are > going away anyway, so the few remaining ones can be dealt with in some neater > manner. Hey, this is a great idea! And surprisingly simple. No more loading of frontend drivers which are not required! Does request_module() log a message if the module cannot be loaded? If yes, fine. If no, a message should be logged by the DVB_ATTACH macro: #define DVB_ATTACH(RESULT, MODULE, FUNCTION,ARGS...) \ do { \ typeof(&FUNCTION) __a; \ request_module(MODULE); \ __a = symbol_get(FUNCTION); \ if (__a) \ RESULT = __a(ARGS); \ else { \ printk("unable to load %s\n", MODULE); \ RESULT = NULL; \ } \ } while(0); Looks perfect otherise. Great idea! CU Oliver -- -------------------------------------------------------- VDR Remote Plugin available at http://www.escape-edv.de/endriss/vdr/ -------------------------------------------------------- _______________________________________________ linux-dvb@xxxxxxxxxxx http://www.linuxtv.org/cgi-bin/mailman/listinfo/linux-dvb