From 1244fb5669b9871f69d88b680270c67a71eaec47 Mon Sep 17 00:00:00 2001 From: Kartik Date: Thu, 20 Oct 2022 11:18:35 +0000 Subject: [PATCH] soc/tegra: fuse-helper: add tegra_fuse_control_read() Various downstream drivers require reading fuse offsets < 0x100. Add tegra_fuse_control_read(), which uses upstream tegra_fuse_readl() to allow reading fuse offsets < 0x100. Bug 3777983 Change-Id: I71c9a726eb748665923ed9547dd495073b89a9dc Signed-off-by: Kartik Reviewed-on: https://git-master.nvidia.com/r/c/linux-nvidia/+/2795612 Reviewed-by: Laxman Dewangan Reviewed-by: Jonathan Hunter Reviewed-on: https://git-master.nvidia.com/r/c/linux-nv-oot/+/2894846 GVS: Gerrit_Virtual_Submit Tested-by: Laxman Dewangan --- include/soc/tegra/fuse-helper.h | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/include/soc/tegra/fuse-helper.h b/include/soc/tegra/fuse-helper.h index fde88999..02fd432a 100644 --- a/include/soc/tegra/fuse-helper.h +++ b/include/soc/tegra/fuse-helper.h @@ -3,9 +3,11 @@ * Copyright (c) 2022-2023, NVIDIA CORPORATION. All rights reserved. */ +#include #include -#define FUSE_SKU_INFO 0x10 +#define FUSE_SKU_INFO 0x10 +#define FUSE_BEGIN 0x100 static inline u32 tegra_get_sku_id(void) { @@ -32,4 +34,32 @@ static inline bool tegra_platform_is_sim(void) return false; } +/* + * tegra_fuse_control_read() - allows reading fuse offsets < 0x100. + * @offset: Offset to be read. + * @value: Pointer to an unsigned integer where the value is stored. + * + * Function tegra_fuse_control_read() allows reading fuse_offsets < 0x100 + * by using the already upstreamed tegra_fuse_readl() function. + * + * Return: Returns a negative integer in case of error, 0 in case + * of success. + */ +static inline int tegra_fuse_control_read(unsigned long offset, u32 *value) +{ + /* + * Allow reading offsets between 0x0 - 0xff. + * For offsets > 0xff, use tegra_fuse_readl instead. + */ + if (WARN_ON(offset > 0xff)) + return -EINVAL; + + /* + * This will overflow the offset value, which is safe as + * tegra_fuse_readl() would again add 0x100 to it. + */ + offset -= FUSE_BEGIN; + + return tegra_fuse_readl(offset, value); +} #endif /* CONFIG_TEGRA_FUSE_UPSTREAM */