What is your frequency on GCLK0? If it is higher than 8 MHz, then you are overclocking the ADC. You need to use the divider to slow down the clock.
The code looks reasonable otherwise.
And yes, calibration data will help, but without it you would be getting just 0, not random values.