| /* |
| * arch/arm/mach-tegra/fuse.c |
| * |
| * Copyright (C) 2010 Google, Inc. |
| * |
| * Author: |
| * Colin Cross <ccross@android.com> |
| * |
| * This software is licensed under the terms of the GNU General Public |
| * License version 2, as published by the Free Software Foundation, and |
| * may be copied, distributed, and modified under those terms. |
| * |
| * This program is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| * GNU General Public License for more details. |
| * |
| */ |
| |
| #include <linux/kernel.h> |
| #include <linux/io.h> |
| |
| #include <mach/iomap.h> |
| |
| #include "fuse.h" |
| |
| #define FUSE_UID_LOW 0x108 |
| #define FUSE_UID_HIGH 0x10c |
| #define FUSE_SKU_INFO 0x110 |
| #define FUSE_SPARE_BIT 0x200 |
| |
| static inline u32 fuse_readl(unsigned long offset) |
| { |
| return readl(IO_TO_VIRT(TEGRA_FUSE_BASE + offset)); |
| } |
| |
| static inline void fuse_writel(u32 value, unsigned long offset) |
| { |
| writel(value, IO_TO_VIRT(TEGRA_FUSE_BASE + offset)); |
| } |
| |
| void tegra_init_fuse(void) |
| { |
| u32 reg = readl(IO_TO_VIRT(TEGRA_CLK_RESET_BASE + 0x48)); |
| reg |= 1 << 28; |
| writel(reg, IO_TO_VIRT(TEGRA_CLK_RESET_BASE + 0x48)); |
| |
| pr_info("Tegra SKU: %d CPU Process: %d Core Process: %d\n", |
| tegra_sku_id(), tegra_cpu_process_id(), |
| tegra_core_process_id()); |
| } |
| |
| unsigned long long tegra_chip_uid(void) |
| { |
| unsigned long long lo, hi; |
| |
| lo = fuse_readl(FUSE_UID_LOW); |
| hi = fuse_readl(FUSE_UID_HIGH); |
| return (hi << 32ull) | lo; |
| } |
| |
| int tegra_sku_id(void) |
| { |
| int sku_id; |
| u32 reg = fuse_readl(FUSE_SKU_INFO); |
| sku_id = reg & 0xFF; |
| return sku_id; |
| } |
| |
| int tegra_cpu_process_id(void) |
| { |
| int cpu_process_id; |
| u32 reg = fuse_readl(FUSE_SPARE_BIT); |
| cpu_process_id = (reg >> 6) & 3; |
| return cpu_process_id; |
| } |
| |
| int tegra_core_process_id(void) |
| { |
| int core_process_id; |
| u32 reg = fuse_readl(FUSE_SPARE_BIT); |
| core_process_id = (reg >> 12) & 3; |
| return core_process_id; |
| } |