Commit 1ffcc8d4 authored by Heiner Kallweit's avatar Heiner Kallweit Committed by David S. Miller
Browse files

r8169: add support for the temperature sensor being available from RTL8125B



This adds support for the temperature sensor being available from
RTL8125B. Register information was taken from r8125 vendor driver.

Signed-off-by: default avatarHeiner Kallweit <hkallweit1@gmail.com>
Reviewed-by: default avatarSimon Horman <horms@kernel.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 2a80d892
Loading
Loading
Loading
Loading
+44 −0
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@
#include <linux/clk.h>
#include <linux/delay.h>
#include <linux/ethtool.h>
#include <linux/hwmon.h>
#include <linux/phy.h>
#include <linux/if_vlan.h>
#include <linux/in.h>
@@ -5363,6 +5364,43 @@ static bool rtl_aspm_is_safe(struct rtl8169_private *tp)
	return false;
}

static umode_t r8169_hwmon_is_visible(const void *drvdata,
				      enum hwmon_sensor_types type,
				      u32 attr, int channel)
{
	return 0444;
}

static int r8169_hwmon_read(struct device *dev, enum hwmon_sensor_types type,
			    u32 attr, int channel, long *val)
{
	struct rtl8169_private *tp = dev_get_drvdata(dev);
	int val_raw;

	val_raw = phy_read_paged(tp->phydev, 0xbd8, 0x12) & 0x3ff;
	if (val_raw >= 512)
		val_raw -= 1024;

	*val = 1000 * val_raw / 2;

	return 0;
}

static const struct hwmon_ops r8169_hwmon_ops = {
	.is_visible =  r8169_hwmon_is_visible,
	.read = r8169_hwmon_read,
};

static const struct hwmon_channel_info * const r8169_hwmon_info[] = {
	HWMON_CHANNEL_INFO(temp, HWMON_T_INPUT),
	NULL
};

static const struct hwmon_chip_info r8169_hwmon_chip_info = {
	.ops = &r8169_hwmon_ops,
	.info = r8169_hwmon_info,
};

static int rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
{
	struct rtl8169_private *tp;
@@ -5537,6 +5575,12 @@ static int rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
	if (rc)
		return rc;

	/* The temperature sensor is available from RTl8125B */
	if (IS_REACHABLE(CONFIG_HWMON) && tp->mac_version >= RTL_GIGA_MAC_VER_63)
		/* ignore errors */
		devm_hwmon_device_register_with_info(&pdev->dev, "nic_temp", tp,
						     &r8169_hwmon_chip_info,
						     NULL);
	rc = register_netdev(dev);
	if (rc)
		return rc;