When I say built-in module, I meant to say the driver module is going to be part of kernel itself, i.e. the module is compiled as part of kernel and not explicitly loaded later.
The __init macros are applicable only for these modules that are initialized as part of the kernel boot process.
At the end of the boot process, the kernel identifies all these memory areas that are part of the init section that were required only during initialization phase, and will continue to free these memory region to re-use.
If you have a linux machine, you can do a dmesg to see this memory freeing message that looks something something like:
" [1.011596] Freeing unused kernel memory: 664k freed "
This is exactly the freeing of all __init data sections from different drivers/modules that were part of the kernel image. The freeing was done at the end of the boot process, after they had been used.
On the other hand, any other kernel module that you load using insmod or modprobe comes after this stage, wherein the kernel was already booted, and hence, no memory area of __init will ever be freed.
Regards,
-Amar