#include <linux/delay.h>
 
 #include <asm/mpc52xx.h>
+#include <asm/mpc85xx.h>
 #include <sysdev/fsl_soc.h>
 
 #define DRV_NAME "mpc-i2c"
        return val;
 }
 
+static u32 mpc_i2c_get_prescaler_8xxx(void)
+{
+       /* mpc83xx and mpc82xx all have prescaler 1 */
+       u32 prescaler = 1;
+
+       /* mpc85xx */
+       if (pvr_version_is(PVR_VER_E500V1) || pvr_version_is(PVR_VER_E500V2)
+               || pvr_version_is(PVR_VER_E500MC)
+               || pvr_version_is(PVR_VER_E5500)
+               || pvr_version_is(PVR_VER_E6500)) {
+               unsigned int svr = mfspr(SPRN_SVR);
+
+               if ((SVR_SOC_VER(svr) == SVR_8540)
+                       || (SVR_SOC_VER(svr) == SVR_8541)
+                       || (SVR_SOC_VER(svr) == SVR_8560)
+                       || (SVR_SOC_VER(svr) == SVR_8555)
+                       || (SVR_SOC_VER(svr) == SVR_8610))
+                       /* the above 85xx SoCs have prescaler 1 */
+                       prescaler = 1;
+               else
+                       /* all the other 85xx have prescaler 2 */
+                       prescaler = 2;
+       }
+
+       return prescaler;
+}
+
 static int mpc_i2c_get_fdr_8xxx(struct device_node *node, u32 clock,
                                          u32 prescaler, u32 *real_clk)
 {
        if (of_device_is_compatible(node, "fsl,mpc8544-i2c"))
                prescaler = mpc_i2c_get_sec_cfg_8xxx() ? 3 : 2;
        if (!prescaler)
-               prescaler = 1;
+               prescaler = mpc_i2c_get_prescaler_8xxx();
 
        divider = fsl_get_sys_freq() / clock / prescaler;