// SPDX-License-Identifier: GPL-2.0-or-later /* * Copyright (C) 2024 PHYTEC Messtechnik GmbH * Author: Primoz Fiser */ #include #include #include #include #include #include "imx93_som_detection.h" extern struct phytec_eeprom_data eeprom_data; #if IS_ENABLED(CONFIG_PHYTEC_IMX93_SOM_DETECTION) /* Check if the SoM is actually one of the following products: * - i.MX93 * * Returns 0 in case it's a known SoM. Otherwise, returns 1. */ u8 __maybe_unused phytec_imx93_detect(struct phytec_eeprom_data *data) { u8 som; if (!data) data = &eeprom_data; /* Early API revisions are not supported */ if (!data->valid || data->payload.api_rev < PHYTEC_API_REV2) return 1; som = data->payload.data.data_api2.som_no; debug("%s: som id: %u\n", __func__, som); if (som == PHYTEC_IMX93_SOM && is_imx93()) return 0; pr_err("%s: SoM ID does not match. Wrong EEPROM data?\n", __func__); return 1; } /* * Filter PHYTEC i.MX93 SoM options by option index * * Returns: * - option value * - PHYTEC_EEPROM_INVAL when the data is invalid * */ u8 __maybe_unused phytec_imx93_get_opt(struct phytec_eeprom_data *data, enum phytec_imx93_option_index idx) { char *opt; u8 opt_id; if (!data) data = &eeprom_data; if (!data->valid || data->payload.api_rev < PHYTEC_API_REV2) return PHYTEC_EEPROM_INVAL; opt = phytec_get_opt(data); if (opt) opt_id = PHYTEC_GET_OPTION(opt[idx]); else opt_id = PHYTEC_EEPROM_INVAL; debug("%s: opt[%d] id: %u\n", __func__, idx, opt_id); return opt_id; } /* * Filter PHYTEC i.MX93 SoM voltage * * Returns: * - PHYTEC_IMX93_VOLTAGE_1V8 or PHYTEC_IMX93_VOLTAGE_3V3 * - PHYTEC_EEPROM_INVAL when the data is invalid * */ enum phytec_imx93_voltage __maybe_unused phytec_imx93_get_voltage(struct phytec_eeprom_data *data) { u8 option = phytec_imx93_get_opt(data, PHYTEC_IMX93_OPT_FEAT); if (option == PHYTEC_EEPROM_INVAL) return PHYTEC_IMX93_VOLTAGE_INVALID; return (option & 0x01) ? PHYTEC_IMX93_VOLTAGE_1V8 : PHYTEC_IMX93_VOLTAGE_3V3; } #else inline u8 __maybe_unused phytec_imx93_detect(struct phytec_eeprom_data *data) { return 1; } inline u8 __maybe_unused phytec_imx93_get_opt(struct phytec_eeprom_data *data, enum phytec_imx93_option_index idx) { return PHYTEC_EEPROM_INVAL; } inline enum phytec_imx93_voltage __maybe_unused phytec_imx93_get_voltage (struct phytec_eeprom_data *data) { return PHYTEC_EEPROM_INVAL; } #endif /* IS_ENABLED(CONFIG_PHYTEC_IMX93_SOM_DETECTION) */