To recap, then:
The device driver registers itself with parport.
A low-level driver finds a parallel port and registers it with parport (these first two things can happen in either order). This registration creates a struct parport which is linked onto a list of known ports.
parport calls the attach function of each registered device driver, passing it the pointer to the new struct parport.
The device driver gets a handle from parport, for use with parport_claim/release. This handle takes the form of a pointer to a struct pardevice, representing a particular device on the parallel port, and is acquired using parport_register_device.
The device driver claims the port using parport_claim (or function_claim_or_block).
Then it goes ahead and uses the port. When finished it releases the port.
The purpose of the low-level drivers, then, is to detect parallel ports and provide methods of accessing them (i.e. implementing the operations in struct parport_operations).
A more complete description of which operation is supposed to do what is available in Documentation/parport-lowlevel.txt.