return gic_read_count();
 }
 
+static u64 gic_hpt_read_multicluster(struct clocksource *cs)
+{
+       unsigned int hi, hi2, lo;
+       u64 count;
+
+       mips_cm_lock_other(0, 0, 0, CM_GCR_Cx_OTHER_BLOCK_GLOBAL);
+
+       if (mips_cm_is64) {
+               count = read_gic_redir_counter();
+               goto out;
+       }
+
+       hi = read_gic_redir_counter_32h();
+       while (true) {
+               lo = read_gic_redir_counter_32l();
+
+               /* If hi didn't change then lo didn't wrap & we're done */
+               hi2 = read_gic_redir_counter_32h();
+               if (hi2 == hi)
+                       break;
+
+               /* Otherwise, repeat with the latest hi value */
+               hi = hi2;
+       }
+
+       count = (((u64)hi) << 32) + lo;
+out:
+       mips_cm_unlock_other();
+       return count;
+}
+
 static struct clocksource gic_clocksource = {
        .name                   = "GIC",
        .read                   = gic_hpt_read,
                gic_clocksource.rating = 200;
        gic_clocksource.rating += clamp(gic_frequency / 10000000, 0, 99);
 
+       if (mips_cps_multicluster_cpus()) {
+               gic_clocksource.read = &gic_hpt_read_multicluster;
+               gic_clocksource.vdso_clock_mode = VDSO_CLOCKMODE_NONE;
+       }
+
        ret = clocksource_register_hz(&gic_clocksource, gic_frequency);
        if (ret < 0)
                pr_warn("Unable to register clocksource\n");
         * stable CPU frequency or on the platforms with CM3 and CPU frequency
         * change performed by the CPC core clocks divider.
         */
-       if (mips_cm_revision() >= CM_REV_CM3 || !IS_ENABLED(CONFIG_CPU_FREQ)) {
+       if ((mips_cm_revision() >= CM_REV_CM3 || !IS_ENABLED(CONFIG_CPU_FREQ)) &&
+            !mips_cps_multicluster_cpus()) {
                sched_clock_register(mips_cm_is64 ?
                                     gic_read_count_64 : gic_read_count_2x32,
                                     gic_count_width, gic_frequency);