Branch data Line data Source code
1 : : // SPDX-License-Identifier: GPL-2.0-only 2 : : /* Copyright (C) 2014-2019 aQuantia Corporation. */ 3 : : 4 : : /* File aq_drvinfo.c: Definition of common code for firmware info in sys.*/ 5 : : 6 : : #include <linux/init.h> 7 : : #include <linux/kobject.h> 8 : : #include <linux/module.h> 9 : : #include <linux/stat.h> 10 : : #include <linux/string.h> 11 : : #include <linux/hwmon.h> 12 : : #include <linux/uaccess.h> 13 : : 14 : : #include "aq_drvinfo.h" 15 : : 16 : : #if IS_REACHABLE(CONFIG_HWMON) 17 : 0 : static int aq_hwmon_read(struct device *dev, enum hwmon_sensor_types type, 18 : : u32 attr, int channel, long *value) 19 : : { 20 [ # # ]: 0 : struct aq_nic_s *aq_nic = dev_get_drvdata(dev); 21 : 0 : int temp; 22 : 0 : int err; 23 : : 24 [ # # ]: 0 : if (!aq_nic) 25 : : return -EIO; 26 : : 27 [ # # ]: 0 : if (type != hwmon_temp) 28 : : return -EOPNOTSUPP; 29 : : 30 [ # # ]: 0 : if (!aq_nic->aq_fw_ops->get_phy_temp) 31 : : return -EOPNOTSUPP; 32 : : 33 [ # # ]: 0 : switch (attr) { 34 : 0 : case hwmon_temp_input: 35 : 0 : err = aq_nic->aq_fw_ops->get_phy_temp(aq_nic->aq_hw, &temp); 36 : 0 : *value = temp; 37 : 0 : return err; 38 : : default: 39 : : return -EOPNOTSUPP; 40 : : } 41 : : } 42 : : 43 : 0 : static int aq_hwmon_read_string(struct device *dev, 44 : : enum hwmon_sensor_types type, 45 : : u32 attr, int channel, const char **str) 46 : : { 47 [ # # ]: 0 : struct aq_nic_s *aq_nic = dev_get_drvdata(dev); 48 : : 49 [ # # ]: 0 : if (!aq_nic) 50 : : return -EIO; 51 : : 52 [ # # ]: 0 : if (type != hwmon_temp) 53 : : return -EOPNOTSUPP; 54 : : 55 [ # # ]: 0 : if (!aq_nic->aq_fw_ops->get_phy_temp) 56 : : return -EOPNOTSUPP; 57 : : 58 [ # # ]: 0 : switch (attr) { 59 : 0 : case hwmon_temp_label: 60 : 0 : *str = "PHY Temperature"; 61 : 0 : return 0; 62 : : default: 63 : : return -EOPNOTSUPP; 64 : : } 65 : : } 66 : : 67 : 66 : static umode_t aq_hwmon_is_visible(const void *data, 68 : : enum hwmon_sensor_types type, 69 : : u32 attr, int channel) 70 : : { 71 [ + - ]: 66 : if (type != hwmon_temp) 72 : : return 0; 73 : : 74 [ - + ]: 66 : switch (attr) { 75 : : case hwmon_temp_input: 76 : : case hwmon_temp_label: 77 : : return 0444; 78 : 0 : default: 79 : 0 : return 0; 80 : : } 81 : : } 82 : : 83 : : static const struct hwmon_ops aq_hwmon_ops = { 84 : : .is_visible = aq_hwmon_is_visible, 85 : : .read = aq_hwmon_read, 86 : : .read_string = aq_hwmon_read_string, 87 : : }; 88 : : 89 : : static u32 aq_hwmon_temp_config[] = { 90 : : HWMON_T_INPUT | HWMON_T_LABEL, 91 : : 0, 92 : : }; 93 : : 94 : : static const struct hwmon_channel_info aq_hwmon_temp = { 95 : : .type = hwmon_temp, 96 : : .config = aq_hwmon_temp_config, 97 : : }; 98 : : 99 : : static const struct hwmon_channel_info *aq_hwmon_info[] = { 100 : : &aq_hwmon_temp, 101 : : NULL, 102 : : }; 103 : : 104 : : static const struct hwmon_chip_info aq_hwmon_chip_info = { 105 : : .ops = &aq_hwmon_ops, 106 : : .info = aq_hwmon_info, 107 : : }; 108 : : 109 : 33 : int aq_drvinfo_init(struct net_device *ndev) 110 : : { 111 : 33 : struct aq_nic_s *aq_nic = netdev_priv(ndev); 112 : 33 : struct device *dev = &aq_nic->pdev->dev; 113 : 33 : struct device *hwmon_dev; 114 : 33 : int err = 0; 115 : : 116 : 33 : hwmon_dev = devm_hwmon_device_register_with_info(dev, 117 : 33 : ndev->name, 118 : : aq_nic, 119 : : &aq_hwmon_chip_info, 120 : : NULL); 121 : : 122 [ - + ]: 33 : if (IS_ERR(hwmon_dev)) 123 : 0 : err = PTR_ERR(hwmon_dev); 124 : : 125 : 33 : return err; 126 : : } 127 : : 128 : : #else 129 : : int aq_drvinfo_init(struct net_device *ndev) { return 0; } 130 : : #endif