dprintk("processor_get_pstate\n");
 
-       retval = ia64_pal_get_pstate(&pstate_index);
+       retval = ia64_pal_get_pstate(&pstate_index,
+                                    PAL_GET_PSTATE_TYPE_INSTANT);
        *value = (u32) pstate_index;
 
        if (retval)
        dprintk("extract_clock\n");
 
        for (i = 0; i < data->acpi_data.state_count; i++) {
-               if (value >= data->acpi_data.states[i].control)
+               if (value == data->acpi_data.states[i].status)
                        return data->acpi_data.states[i].core_frequency;
        }
        return data->acpi_data.states[i-1].core_frequency;
                goto migrate_end;
        }
 
-       /*
-        * processor_get_pstate gets the average frequency since the
-        * last get. So, do two PAL_get_freq()...
-        */
-       ret = processor_get_pstate(&value);
+       /* processor_get_pstate gets the instantaneous frequency */
        ret = processor_get_pstate(&value);
 
        if (ret) {
 
 #define PAL_SET_PSTATE         263     /* set the P-state */
 #define PAL_BRAND_INFO         274     /* Processor branding information */
 
+#define PAL_GET_PSTATE_TYPE_LASTSET    0
+#define PAL_GET_PSTATE_TYPE_AVGANDRESET        1
+#define PAL_GET_PSTATE_TYPE_AVGNORESET 2
+#define PAL_GET_PSTATE_TYPE_INSTANT    3
+
 #ifndef __ASSEMBLY__
 
 #include <linux/types.h>
 
 /* Get the current P-state information */
 static inline s64
-ia64_pal_get_pstate (u64 *pstate_index)
+ia64_pal_get_pstate (u64 *pstate_index, unsigned long type)
 {
        struct ia64_pal_retval iprv;
-       PAL_CALL_STK(iprv, PAL_GET_PSTATE, 0, 0, 0);
+       PAL_CALL_STK(iprv, PAL_GET_PSTATE, type, 0, 0);
        *pstate_index = iprv.v0;
        return iprv.status;
 }