Device-side enqueuing requires kernel code to be represented as block syntax. Block syntax allows you to pass arguments declared to be a pointer to local memory. Khronos's OpenCL C spec shows few examples regarding this in the section "Enqueuing Kernels->Arguments that are a pointer type to local address space".
To reuse the kernel code, one can wrap a kernel inside a block and then enqueue the block to the device. However, an interesting point is, you can't wrap a kernel inside a block if the kernel defines some local variables. For more details, you may check this forum thread Device-side enqueue, block syntax, and local kernel variables. On that thread, the user has shared a very good workaround for this problem.
If you are looking for something else, it would be good if you can share some more details in this context. A sample code may be more helpful to discuss.