void tegra_init_speedo_data(void)
{
	u32 reg, val;
	int i, bit, rev;
	int sku = tegra_sku_id();
	void __iomem *apb_misc = IO_ADDRESS(TEGRA_APB_MISC_BASE);

	reg = readl(apb_misc + CHIP_ID);
	rev = (reg & CHIP_MINOR_MASK) >> CHIP_MINOR_SHIFT;
	if (SPEEDO_ID_SELECT_0(rev))
		soc_speedo_id = 0;
	else if (SPEEDO_ID_SELECT_1(sku))
		soc_speedo_id = 1;
	else
		soc_speedo_id = 2;
	BUG_ON(soc_speedo_id >= ARRAY_SIZE(cpu_process_speedos));
	BUG_ON(soc_speedo_id >= ARRAY_SIZE(core_process_speedos));

	val = 0;
	for (bit = CPU_SPEEDO_MSBIT; bit >= CPU_SPEEDO_LSBIT; bit--) {
		reg = tegra_spare_fuse(bit) |
			tegra_spare_fuse(bit + CPU_SPEEDO_REDUND_OFFS);
		val = (val << 1) | (reg & 0x1);
	}
	val = val * SPEEDO_MULT;
	pr_debug("%s CPU speedo level %u\n", __func__, val);

	for (i = 0; i < (PROCESS_CORNERS_NUM - 1); i++) {
		if (val <= cpu_process_speedos[soc_speedo_id][i])
			break;
	}
	cpu_process_id = i;

	val = 0;
	for (bit = CORE_SPEEDO_MSBIT; bit >= CORE_SPEEDO_LSBIT; bit--) {
		reg = tegra_spare_fuse(bit) |
			tegra_spare_fuse(bit + CORE_SPEEDO_REDUND_OFFS);
		val = (val << 1) | (reg & 0x1);
	}
	val = val * SPEEDO_MULT;
	pr_debug("%s Core speedo level %u\n", __func__, val);

	for (i = 0; i < (PROCESS_CORNERS_NUM - 1); i++) {
		if (val <= core_process_speedos[soc_speedo_id][i])
			break;
	}
	core_process_id = i;

	pr_info("Tegra SKU: %d Rev: A%.2d CPU Process: %d Core Process: %d"
		" Speedo ID: %d\n", sku, rev, cpu_process_id, core_process_id,
		soc_speedo_id);
}
static void rev_sku_to_speedo_ids(int rev, int sku)
{
	int can_boost = tegra_spare_fuse(60); /* FIXME: boost board check */

	if (rev == TEGRA_REVISION_A01) {
		cpu_speedo_id = 0;
		soc_speedo_id = 0;
		gpu_speedo_id = 0;
		threshold_index = 0;
	} else if (rev == TEGRA_REVISION_A02) {
		switch (sku) {
		case 0x00: /* Engg sku */
			cpu_speedo_id = 1;
			soc_speedo_id = 0;
			gpu_speedo_id = 1;
			threshold_index = 0;
			break;
		default:
			pr_warn("Tegra13: Unknown SKU %d\n", sku);
			cpu_speedo_id = 1;
			soc_speedo_id = 0;
			gpu_speedo_id = 0;
			threshold_index = 0;
			break;
		}
	}
}
static int get_speedo_rev(void)
{
	return (tegra_spare_fuse(4) << 2) |
		(tegra_spare_fuse(3) << 1) |
		(tegra_spare_fuse(2) << 0);
}