Yes, you can use any set of 3D values (e.g. procedural texture) you want (note that this means you can't use image textures. This is because you need the texture to be defined in 3D, and of course a image texture is 2D.
See the wiki for a list of cycles textures with descriptions.
The density is controlled by the value (brightness) of the texture.
Consider this node setup:
Where the texture is white (
1), the density will be
1. Where it is black (
0), the density will be
Because a density of 1 is still very faint, I have added a multiply node to scale the white portions of the texture to
20 instead of 1:
As an example for non-procedural texture information, this setup will make the density based on the global X location of the object (with some math nodes to avoid volumes with negative density):