Message ID | 20230815045658.80494-11-michael.chan@broadcom.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | bnxt_en: Update for net-next | expand |
On Mon, Aug 14, 2023 at 09:56:56PM -0700, Michael Chan wrote: > From: Kalesh AP <kalesh-anakkur.purayil@broadcom.com> > > The use of hwmon_device_register_with_groups() is deprecated. > Modified the driver to use hwmon_device_register_with_info(). > > Driver currently exports only temp1_input through hwmon sysfs > interface. But FW has been modified to report more threshold > temperatures and driver want to report them through the > hwmon interface. > > Cc: Jean Delvare <jdelvare@suse.com> > Cc: Guenter Roeck <linux@roeck-us.net> > Cc: linux-hwmon@vger.kernel.org > Signed-off-by: Kalesh AP <kalesh-anakkur.purayil@broadcom.com> > Signed-off-by: Michael Chan <michael.chan@broadcom.com> > --- > .../net/ethernet/broadcom/bnxt/bnxt_hwmon.c | 72 ++++++++++++++----- > 1 file changed, 56 insertions(+), 16 deletions(-) > > diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_hwmon.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_hwmon.c > index 476616d97071..20381b7b1d78 100644 > --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_hwmon.c > +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_hwmon.c > @@ -18,34 +18,74 @@ > #include "bnxt_hwrm.h" > #include "bnxt_hwmon.h" > > -static ssize_t bnxt_show_temp(struct device *dev, > - struct device_attribute *devattr, char *buf) > +static int bnxt_hwrm_temp_query(struct bnxt *bp, u8 *temp) > { > struct hwrm_temp_monitor_query_output *resp; > struct hwrm_temp_monitor_query_input *req; > - struct bnxt *bp = dev_get_drvdata(dev); > - u32 len = 0; > int rc; > > rc = hwrm_req_init(bp, req, HWRM_TEMP_MONITOR_QUERY); > if (rc) > return rc; > resp = hwrm_req_hold(bp, req); > - rc = hwrm_req_send(bp, req); > - if (!rc) > - len = sprintf(buf, "%u\n", resp->temp * 1000); /* display millidegree */ > - hwrm_req_drop(bp, req); > + rc = hwrm_req_send_silent(bp, req); > if (rc) > + goto err; > + > + if (temp) > + *temp = resp->temp; Why this NULL pointer check ? This is a static function, and it is never called with a NULL pointer. > +err: > + hwrm_req_drop(bp, req); > + return rc; > +} > + > +static umode_t bnxt_hwmon_is_visible(const void *_data, enum hwmon_sensor_types type, > + u32 attr, int channel) > +{ > + if (type != hwmon_temp) > + return 0; > + > + switch (attr) { > + case hwmon_temp_input: > + return 0444; > + default: > + return 0; > + } > +} > + > +static int bnxt_hwmon_read(struct device *dev, enum hwmon_sensor_types type, u32 attr, > + int channel, long *val) > +{ > + struct bnxt *bp = dev_get_drvdata(dev); > + u8 temp = 0; > + int rc; > + > + switch (attr) { > + case hwmon_temp_input: > + rc = bnxt_hwrm_temp_query(bp, &temp); > + if (!rc) > + *val = temp * 1000; > return rc; > - return len; > + default: > + return -EOPNOTSUPP; > + } > } > -static SENSOR_DEVICE_ATTR(temp1_input, 0444, bnxt_show_temp, NULL, 0); > > -static struct attribute *bnxt_attrs[] = { > - &sensor_dev_attr_temp1_input.dev_attr.attr, > +static const struct hwmon_channel_info *bnxt_hwmon_info[] = { > + HWMON_CHANNEL_INFO(temp, > + HWMON_T_INPUT), Nit: Unnecessary continuation line > NULL > }; > -ATTRIBUTE_GROUPS(bnxt); > + > +static const struct hwmon_ops bnxt_hwmon_ops = { > + .is_visible = bnxt_hwmon_is_visible, > + .read = bnxt_hwmon_read, > +}; > + > +static const struct hwmon_chip_info bnxt_hwmon_chip_info = { > + .ops = &bnxt_hwmon_ops, > + .info = bnxt_hwmon_info, > +}; > > void bnxt_hwmon_uninit(struct bnxt *bp) > { > @@ -72,9 +112,9 @@ void bnxt_hwmon_init(struct bnxt *bp) > if (bp->hwmon_dev) > return; > > - bp->hwmon_dev = hwmon_device_register_with_groups(&pdev->dev, > - DRV_MODULE_NAME, bp, > - bnxt_groups); > + bp->hwmon_dev = hwmon_device_register_with_info(&pdev->dev, > + DRV_MODULE_NAME, bp, > + &bnxt_hwmon_chip_info, NULL); > if (IS_ERR(bp->hwmon_dev)) { > bp->hwmon_dev = NULL; > dev_warn(&pdev->dev, "Cannot register hwmon device\n"); > -- > 2.30.1 >
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_hwmon.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_hwmon.c index 476616d97071..20381b7b1d78 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_hwmon.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_hwmon.c @@ -18,34 +18,74 @@ #include "bnxt_hwrm.h" #include "bnxt_hwmon.h" -static ssize_t bnxt_show_temp(struct device *dev, - struct device_attribute *devattr, char *buf) +static int bnxt_hwrm_temp_query(struct bnxt *bp, u8 *temp) { struct hwrm_temp_monitor_query_output *resp; struct hwrm_temp_monitor_query_input *req; - struct bnxt *bp = dev_get_drvdata(dev); - u32 len = 0; int rc; rc = hwrm_req_init(bp, req, HWRM_TEMP_MONITOR_QUERY); if (rc) return rc; resp = hwrm_req_hold(bp, req); - rc = hwrm_req_send(bp, req); - if (!rc) - len = sprintf(buf, "%u\n", resp->temp * 1000); /* display millidegree */ - hwrm_req_drop(bp, req); + rc = hwrm_req_send_silent(bp, req); if (rc) + goto err; + + if (temp) + *temp = resp->temp; +err: + hwrm_req_drop(bp, req); + return rc; +} + +static umode_t bnxt_hwmon_is_visible(const void *_data, enum hwmon_sensor_types type, + u32 attr, int channel) +{ + if (type != hwmon_temp) + return 0; + + switch (attr) { + case hwmon_temp_input: + return 0444; + default: + return 0; + } +} + +static int bnxt_hwmon_read(struct device *dev, enum hwmon_sensor_types type, u32 attr, + int channel, long *val) +{ + struct bnxt *bp = dev_get_drvdata(dev); + u8 temp = 0; + int rc; + + switch (attr) { + case hwmon_temp_input: + rc = bnxt_hwrm_temp_query(bp, &temp); + if (!rc) + *val = temp * 1000; return rc; - return len; + default: + return -EOPNOTSUPP; + } } -static SENSOR_DEVICE_ATTR(temp1_input, 0444, bnxt_show_temp, NULL, 0); -static struct attribute *bnxt_attrs[] = { - &sensor_dev_attr_temp1_input.dev_attr.attr, +static const struct hwmon_channel_info *bnxt_hwmon_info[] = { + HWMON_CHANNEL_INFO(temp, + HWMON_T_INPUT), NULL }; -ATTRIBUTE_GROUPS(bnxt); + +static const struct hwmon_ops bnxt_hwmon_ops = { + .is_visible = bnxt_hwmon_is_visible, + .read = bnxt_hwmon_read, +}; + +static const struct hwmon_chip_info bnxt_hwmon_chip_info = { + .ops = &bnxt_hwmon_ops, + .info = bnxt_hwmon_info, +}; void bnxt_hwmon_uninit(struct bnxt *bp) { @@ -72,9 +112,9 @@ void bnxt_hwmon_init(struct bnxt *bp) if (bp->hwmon_dev) return; - bp->hwmon_dev = hwmon_device_register_with_groups(&pdev->dev, - DRV_MODULE_NAME, bp, - bnxt_groups); + bp->hwmon_dev = hwmon_device_register_with_info(&pdev->dev, + DRV_MODULE_NAME, bp, + &bnxt_hwmon_chip_info, NULL); if (IS_ERR(bp->hwmon_dev)) { bp->hwmon_dev = NULL; dev_warn(&pdev->dev, "Cannot register hwmon device\n");