devicetree.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Andy Shevchenko <andy.shevchenko@gmail.com>
To: Luka Kovacic <luka.kovacic@sartura.hr>
Cc: "Linux Kernel Mailing List" <linux-kernel@vger.kernel.org>,
	linux-hwmon@vger.kernel.org,
	"Linux LED Subsystem" <linux-leds@vger.kernel.org>,
	devicetree <devicetree@vger.kernel.org>,
	"Lee Jones" <lee.jones@linaro.org>, "Pavel Machek" <pavel@ucw.cz>,
	"Dan Murphy" <dmurphy@ti.com>, "Rob Herring" <robh+dt@kernel.org>,
	"Jean Delvare" <jdelvare@suse.com>,
	"Guenter Roeck" <linux@roeck-us.net>,
	"Marek Behún" <marek.behun@nic.cz>,
	luka.perkov@sartura.hr, robert.marko@sartura.hr
Subject: Re: [PATCH v6 3/6] drivers: hwmon: Add the iEi WT61P803 PUZZLE HWMON driver
Date: Tue, 20 Oct 2020 12:00:47 +0300	[thread overview]
Message-ID: <CAHp75VdnOJKwvZUOsj3bbT8tK9uZN=NufDrdhUvS886bNUpWhA@mail.gmail.com> (raw)
In-Reply-To: <20201019221859.56680-4-luka.kovacic@sartura.hr>

On Tue, Oct 20, 2020 at 1:19 AM Luka Kovacic <luka.kovacic@sartura.hr> wrote:
>
> Add the iEi WT61P803 PUZZLE HWMON driver, that handles the fan speed
> control via PWM, reading fan speed and reading on-board temperature
> sensors.
>
> The driver registers a HWMON device and a simple thermal cooling device to
> enable in-kernel fan management.
>
> This driver depends on the iEi WT61P803 PUZZLE MFD driver.

...

> +// SPDX-License-Identifier: GPL-2.0-only
> +/* iEi WT61P803 PUZZLE MCU HWMON Driver

Shouldn't be
/*
 * IEI ...

?

...

> +/**
> + * struct iei_wt61p803_puzzle_thermal_cooling_device - Thermal cooling device instance

> + *

Please, remove all these blank lines in kernel doc descriptions.

> + * @mcu_hwmon:         MCU HWMON struct pointer
> + * @tcdev:             Thermal cooling device pointer
> + * @name:              Thermal cooling device name
> + * @pwm_channel:       PWM channel (0 or 1)
> + * @cooling_levels:    Thermal cooling device cooling levels
> + */

...

> +struct iei_wt61p803_puzzle_hwmon {
> +       struct iei_wt61p803_puzzle *mcu;
> +       unsigned char *response_buffer;
> +       bool thermal_cooling_dev_present[IEI_WT61P803_PUZZLE_HWMON_MAX_PWM_NUM];
> +       struct iei_wt61p803_puzzle_thermal_cooling_device
> +               *cdev[IEI_WT61P803_PUZZLE_HWMON_MAX_PWM_NUM];

Isn't this constant a bit too long? Perhaps drop NUM (MAX would
suffice I think) for a starter.

> +};

...

> +       static unsigned char temp_sensor_ntc_cmd[4] = {
> +               IEI_WT61P803_PUZZLE_CMD_HEADER_START,
> +               IEI_WT61P803_PUZZLE_CMD_TEMP,
> +               IEI_WT61P803_PUZZLE_CMD_TEMP_ALL

+ comma.

> +       };

Why not to be consistent with the rest assignments, choose either
above form, or like you have done in the below functions.
Also, why 4?

> +       size_t reply_size = 0;

How is it used in all these functions?

> +       int ret;
> +
> +       ret = iei_wt61p803_puzzle_write_command(mcu_hwmon->mcu, temp_sensor_ntc_cmd,
> +                                               sizeof(temp_sensor_ntc_cmd), resp_buf,
> +                                               &reply_size);
> +
> +       if (ret)
> +               return ret;
> +
> +       /* Check the number of NTC values (should be 0x32/'2') */

> +       if (resp_buf[3] != 0x32)

Instead of comment in the parentheses, just do it here
" != '2')"

> +               return -EIO;

...

> +static int iei_wt61p803_puzzle_read(struct device *dev, enum hwmon_sensor_types type,
> +                                   u32 attr, int channel, long *val)
> +{
> +       struct iei_wt61p803_puzzle_hwmon *mcu_hwmon = dev_get_drvdata(dev->parent);
> +       int ret;
> +
> +       switch (type) {
> +       case hwmon_pwm:

> +               ret = iei_wt61p803_puzzle_read_pwm_channel(mcu_hwmon, channel, val);
> +               return ret;

  return iei_...(...);
in all such cases.

> +       case hwmon_fan:
> +               ret = iei_wt61p803_puzzle_read_fan_speed(mcu_hwmon, channel, val);
> +               return ret;
> +       case hwmon_temp:
> +               ret = iei_wt61p803_puzzle_read_temp_sensor(mcu_hwmon, channel, val);
> +               return ret;
> +       default:
> +               return -EINVAL;
> +       }
> +}

...

> +static umode_t iei_wt61p803_puzzle_is_visible(const void *data, enum hwmon_sensor_types type,
> +                                             u32 attr, int channel)
> +{
> +       switch (type) {
> +       case hwmon_pwm:

> +               switch (attr) {
> +               case hwmon_pwm_input:
> +                       return 0644;
> +               default:
> +                       return 0;
> +               }

Isn't too long for
  if (attr == ...)
    return 0644;
  break;

...see below...

> +       case hwmon_fan:
> +               switch (attr) {
> +               case hwmon_fan_input:
> +                       return 0444;
> +               default:
> +                       return 0;
> +               }
> +       case hwmon_temp:
> +               switch (attr) {
> +               case hwmon_temp_input:
> +                       return 0444;
> +               default:
> +                       return 0;
> +               }

> +       default:
> +               return 0;

break;

> +       }

return 0;

?

> +}

...

> +       mcu_hwmon->thermal_cooling_dev_present[pwm_channel] = true;
> +

> +       num_levels = fwnode_property_read_u8_array(child, "cooling-levels", NULL, 0);

fwnode_property_count_u8()

> +       if (num_levels > 0) {

You can improve readability by reducing indentation level via
replacement to negative conditional.

> +               cdev = devm_kzalloc(dev, sizeof(*cdev), GFP_KERNEL);
> +               if (!cdev)
> +                       return -ENOMEM;
> +
> +               cdev->cooling_levels = devm_kzalloc(dev, num_levels, GFP_KERNEL);

For the sake of cleaness, shouldn't it be devm_kmalloc_array() ?
(Note, zeroing is not needed if you read entire array)

> +               if (!cdev->cooling_levels)
> +                       return -ENOMEM;
> +
> +               ret = fwnode_property_read_u8_array(child, "cooling-levels",
> +                                                   cdev->cooling_levels,
> +                                                   num_levels);
> +               if (ret) {
> +                       dev_err(dev, "Couldn't read property 'cooling-levels'");
> +                       return ret;
> +               }
> +
> +               snprintf(cdev->name, THERMAL_NAME_LENGTH, "iei_wt61p803_puzzle_%d", pwm_channel);
> +
> +               cdev->tcdev = devm_thermal_of_cooling_device_register(dev, NULL,
> +                               cdev->name, cdev, &iei_wt61p803_puzzle_cooling_ops);
> +               if (IS_ERR(cdev->tcdev))
> +                       return PTR_ERR(cdev->tcdev);
> +
> +               cdev->mcu_hwmon = mcu_hwmon;
> +               cdev->pwm_channel = pwm_channel;
> +
> +               mcu_hwmon->cdev[pwm_channel] = cdev;
> +       }
> +       return 0;
> +}

-- 
With Best Regards,
Andy Shevchenko

  reply	other threads:[~2020-10-20  9:00 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-10-19 22:18 [PATCH v6 0/6] Add support for the iEi WT61P803 PUZZLE MCU Luka Kovacic
2020-10-19 22:18 ` [PATCH v6 1/6] dt-bindings: Add iEi vendor prefix and iEi WT61P803 PUZZLE driver bindings Luka Kovacic
2020-10-20 15:24   ` Rob Herring
2020-10-20 15:30   ` Rob Herring
2020-10-23 21:54     ` Luka Kovacic
2020-10-19 22:18 ` [PATCH v6 2/6] drivers: mfd: Add a driver for iEi WT61P803 PUZZLE MCU Luka Kovacic
2020-10-20  2:19   ` kernel test robot
2020-11-04 15:22     ` Lee Jones
2020-11-10 20:14       ` Luka Kovacic
2020-10-19 22:18 ` [PATCH v6 3/6] drivers: hwmon: Add the iEi WT61P803 PUZZLE HWMON driver Luka Kovacic
2020-10-20  9:00   ` Andy Shevchenko [this message]
2020-10-23 21:47     ` Luka Kovacic
2020-10-25  1:26       ` Luka Kovacic
2020-10-19 22:18 ` [PATCH v6 4/6] drivers: leds: Add the iEi WT61P803 PUZZLE LED driver Luka Kovacic
2020-10-19 22:18 ` [PATCH v6 5/6] Documentation/ABI: Add iei-wt61p803-puzzle driver sysfs interface documentation Luka Kovacic
2020-10-19 22:18 ` [PATCH v6 6/6] MAINTAINERS: Add an entry for the iEi WT61P803 PUZZLE driver Luka Kovacic

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CAHp75VdnOJKwvZUOsj3bbT8tK9uZN=NufDrdhUvS886bNUpWhA@mail.gmail.com' \
    --to=andy.shevchenko@gmail.com \
    --cc=devicetree@vger.kernel.org \
    --cc=dmurphy@ti.com \
    --cc=jdelvare@suse.com \
    --cc=lee.jones@linaro.org \
    --cc=linux-hwmon@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-leds@vger.kernel.org \
    --cc=linux@roeck-us.net \
    --cc=luka.kovacic@sartura.hr \
    --cc=luka.perkov@sartura.hr \
    --cc=marek.behun@nic.cz \
    --cc=pavel@ucw.cz \
    --cc=robert.marko@sartura.hr \
    --cc=robh+dt@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).