summaryrefslogtreecommitdiff
path: root/drivers/misc
diff options
context:
space:
mode:
authorPrathima <Prathima.Lk@amd.com>2026-07-10 16:46:38 +0530
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2026-07-17 15:50:48 +0200
commitba27ea7abd35d260e3b489f985ec2b4113c0fd85 (patch)
tree6ed29851df5f04659ce2b20d43eb505dfd62564d /drivers/misc
parentd4f8babf8e8ffb8cd75d12d1003d2a2c17a53420 (diff)
downloadlinux-next-ba27ea7abd35d260e3b489f985ec2b4113c0fd85.tar.gz
linux-next-ba27ea7abd35d260e3b489f985ec2b4113c0fd85.zip
misc: amd-sbi: Consolidate Common SBTSI Probe Path
Refactor shared probe procedures into sbtsi_probe_common() to ensure that I2C and I3C probes focus solely on bus-specific allocation and device configuration. The utility function reads the configuration register via sbtsi_xfer(), initializes ext_range_mode and read_order, assigns the driver data, and registers the hwmon auxiliary device. Routing register access through sbtsi_xfer() keeps the probe path bus-agnostic, so no transfer logic has to be duplicated when SB-TSI over I3C support is added in a later patch. Reviewed-by: Akshay Gupta <Akshay.Gupta@amd.com> Signed-off-by: Prathima <Prathima.Lk@amd.com> Link: https://patch.msgid.link/20260710111642.850022-5-Akshay.Gupta@amd.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/misc')
-rw-r--r--drivers/misc/amd-sbi/tsi.c26
1 files changed, 18 insertions, 8 deletions
diff --git a/drivers/misc/amd-sbi/tsi.c b/drivers/misc/amd-sbi/tsi.c
index 67d08df28429..35b9f40741e7 100644
--- a/drivers/misc/amd-sbi/tsi.c
+++ b/drivers/misc/amd-sbi/tsi.c
@@ -79,31 +79,41 @@ static int sbtsi_create_hwmon_adev(struct device *dev, u8 dev_addr)
return devm_add_action_or_reset(dev, sbtsi_unregister_hwmon_adev, adev);
}
+static int sbtsi_probe_common(struct device *dev, struct sbtsi_data *data)
+{
+ u8 val;
+ int err;
+
+ err = sbtsi_xfer(data, SBTSI_REG_CONFIG, &val, true);
+ if (err)
+ return err;
+
+ data->ext_range_mode = FIELD_GET(BIT(SBTSI_CONFIG_EXT_RANGE_SHIFT), val);
+ data->read_order = FIELD_GET(BIT(SBTSI_CONFIG_READ_ORDER_SHIFT), val);
+
+ dev_set_drvdata(dev, data);
+ return sbtsi_create_hwmon_adev(dev, data->dev_addr);
+}
+
static int sbtsi_i2c_probe(struct i2c_client *client)
{
struct device *dev = &client->dev;
struct sbtsi_data *data;
- int err;
data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL);
if (!data)
return -ENOMEM;
data->client = client;
- err = i2c_smbus_read_byte_data(data->client, SBTSI_REG_CONFIG);
- if (err < 0)
- return err;
- data->ext_range_mode = FIELD_GET(BIT(SBTSI_CONFIG_EXT_RANGE_SHIFT), err);
- data->read_order = FIELD_GET(BIT(SBTSI_CONFIG_READ_ORDER_SHIFT), err);
- dev_set_drvdata(dev, data);
/* In a multi-socket system, devices that are otherwise identical do not
* share the same static address; each instance resides at a unique I2C
* client address on the same or different bus. Use the I2C client
* address as the auxiliary device instance ID to ensure each socket
* receives a distinct auxiliary device name.
*/
- return sbtsi_create_hwmon_adev(dev, client->addr);
+ data->dev_addr = client->addr;
+ return sbtsi_probe_common(dev, data);
}
static const struct i2c_device_id sbtsi_id[] = {