From 835dba384b961097a8196ef96907fd1fcd216455 Mon Sep 17 00:00:00 2001 From: CTCaer Date: Sun, 22 Jun 2025 13:00:01 +0300 Subject: [PATCH] bdk: bm92t: add version check --- bdk/power/bm92t36.c | 28 +++++++++++++++++++++++++--- bdk/power/bm92t36.h | 1 + 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/bdk/power/bm92t36.c b/bdk/power/bm92t36.c index 371ed04d..a95730bb 100644 --- a/bdk/power/bm92t36.c +++ b/bdk/power/bm92t36.c @@ -1,7 +1,7 @@ /* * USB-PD driver for Nintendo Switch's TI BM92T36 * - * Copyright (c) 2020-2023 CTCaer + * Copyright (c) 2020-2025 CTCaer * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, @@ -54,6 +54,10 @@ #define STATUS1_INSERT BIT(7) // Cable inserted. +#define VER_36 0x36 +#define MAX_ROHM 0x4B5 +#define DEV_BM92T 0x3B0 + typedef struct _pd_object_t { unsigned int amp:10; unsigned int volt:10; @@ -63,9 +67,29 @@ typedef struct _pd_object_t { static int _bm92t36_read_reg(u8 *buf, u32 size, u32 reg) { + memset(buf, 0, size); return i2c_recv_buf_big(buf, size, I2C_1, BM92T36_I2C_ADDR, reg); } +int bm92t36_get_version(u32 *value) +{ + u8 buf[2]; + u16 version, man, dev; + _bm92t36_read_reg(buf, 2, FW_TYPE_REG); + version = (buf[0] << 4) | buf[1]; + _bm92t36_read_reg(buf, 2, MAN_ID_REG); + man = (buf[1] << 8) | buf[0]; + _bm92t36_read_reg(buf, 2, DEV_ID_REG); + dev = (buf[1] << 8) | buf[0]; + if (value) + *value = (dev << 16) | version; + + if (version == VER_36 && man == MAX_ROHM && dev == DEV_BM92T) + return 0; + else + return -1; +} + void bm92t36_get_sink_info(bool *inserted, usb_pd_objects_t *usb_pd) { u8 buf[32]; @@ -73,14 +97,12 @@ void bm92t36_get_sink_info(bool *inserted, usb_pd_objects_t *usb_pd) if (inserted) { - memset(buf, 0, sizeof(buf)); _bm92t36_read_reg(buf, 2, STATUS1_REG); *inserted = (buf[0] & STATUS1_INSERT) ? true : false; } if (usb_pd) { - memset(buf, 0, sizeof(buf)); _bm92t36_read_reg(buf, 29, READ_PDOS_SRC_REG); memcpy(pdos, &buf[1], 28); diff --git a/bdk/power/bm92t36.h b/bdk/power/bm92t36.h index e6740d8d..c288a6fc 100644 --- a/bdk/power/bm92t36.h +++ b/bdk/power/bm92t36.h @@ -36,6 +36,7 @@ typedef struct _usb_pd_objects_t usb_pd_object_t selected_pdo; } usb_pd_objects_t; +int bm92t36_get_version(u32 *value); void bm92t36_get_sink_info(bool *inserted, usb_pd_objects_t *usb_pd); #endif