Hi Anson,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on soc-thermal/next]
[also build test ERROR on v4.20-rc4 next-20181126]
[if your patch is applied to the wrong git tree, please drop us a note to help 
improve the system]

url:    
https://github.com/0day-ci/linux/commits/Anson-Huang/thermal-imx_sc-add-i-MX-system-controller-thermal-support/20181127-141933
base:   
https://git.kernel.org/pub/scm/linux/kernel/git/evalenti/linux-soc-thermal.git 
next
config: i386-allmodconfig (attached as .config)
compiler: gcc-7 (Debian 7.3.0-1) 7.3.0
reproduce:
        # save the attached .config to linux build tree
        make ARCH=i386 

All errors (new ones prefixed by >>):

>> drivers/thermal/imx_sc_thermal.c:12:10: fatal error: 
>> linux/firmware/imx/sci.h: No such file or directory
    #include <linux/firmware/imx/sci.h>
             ^~~~~~~~~~~~~~~~~~~~~~~~~~
   compilation terminated.

coccinelle warnings: (new ones prefixed by >>)

>> drivers/thermal/imx_sc_thermal.c:197:1-6: WARNING: invalid free of devm_ 
>> allocated data
   drivers/thermal/imx_sc_thermal.c:199:1-6: WARNING: invalid free of devm_ 
allocated data
--
>> drivers/thermal/imx_sc_thermal.c:173:6-25: WARNING: Unsigned expression 
>> compared with zero: sensor -> resource_id < 0

vim +12 drivers/thermal/imx_sc_thermal.c

  > 12  #include <linux/firmware/imx/sci.h>
    13  #include <linux/module.h>
    14  #include <linux/of.h>
    15  #include <linux/of_device.h>
    16  #include <linux/platform_device.h>
    17  #include <linux/slab.h>
    18  #include <linux/thermal.h>
    19  
    20  #include "thermal_core.h"
    21  
    22  #define IMX_SC_MISC_FUNC_GET_TEMP       13
    23  #define IMX_SC_C_TEMP                   0
    24  
    25  struct imx_sc_ipc *thermal_ipc_handle;
    26  
    27  struct imx_sc_sensor {
    28          struct thermal_zone_device *tzd;
    29          unsigned int resource_id;
    30  };
    31  
    32  struct imx_sc_thermal_data {
    33          struct imx_sc_sensor *sensor;
    34  };
    35  
    36  struct imx_sc_msg_req_misc_get_temp {
    37          struct imx_sc_rpc_msg hdr;
    38          u16 resource_id;
    39          u8 type;
    40  } __packed;
    41  
    42  struct imx_sc_msg_resp_misc_get_temp {
    43          struct imx_sc_rpc_msg hdr;
    44          u16 celsius;
    45          u8 tenths;
    46  } __packed;
    47  
    48  static int imx_sc_thermal_get_temp(void *data, int *temp)
    49  {
    50          struct imx_sc_msg_resp_misc_get_temp *resp;
    51          struct imx_sc_msg_req_misc_get_temp msg;
    52          struct imx_sc_rpc_msg *hdr = &msg.hdr;
    53          struct imx_sc_sensor *sensor = data;
    54          int ret;
    55  
    56          msg.resource_id = sensor->resource_id;
    57          msg.type = IMX_SC_C_TEMP;
    58  
    59          hdr->ver = IMX_SC_RPC_VERSION;
    60          hdr->svc = IMX_SC_RPC_SVC_MISC;
    61          hdr->func = IMX_SC_MISC_FUNC_GET_TEMP;
    62          hdr->size = 2;
    63  
    64          ret = imx_scu_call_rpc(thermal_ipc_handle, &msg, true);
    65          if (ret) {
    66                  pr_err("read temp sensor %d failed, ret %d\n",
    67                          sensor->resource_id, ret);
    68                  return ret;
    69          }
    70  
    71          resp = (struct imx_sc_msg_resp_misc_get_temp *)&msg;
    72          *temp = resp->celsius * 1000 + resp->tenths * 100;
    73  
    74          return 0;
    75  }
    76  
    77  static const struct thermal_zone_of_device_ops imx_sc_thermal_ops = {
    78          .get_temp = imx_sc_thermal_get_temp,
    79  };
    80  
    81  static int imx_sc_thermal_register_sensor(struct platform_device *pdev,
    82                                            struct imx_sc_sensor *sensor)
    83  {
    84          struct thermal_zone_device *tzd;
    85  
    86          tzd = devm_thermal_zone_of_sensor_register(&pdev->dev,
    87                                                     sensor->resource_id,
    88                                                     sensor,
    89                                                     &imx_sc_thermal_ops);
    90          if (IS_ERR(tzd)) {
    91                  dev_err(&pdev->dev, "failed to register sensor: %d\n",
    92                          sensor->resource_id);
    93                  return -EINVAL;
    94          }
    95  
    96          sensor->tzd = tzd;
    97  
    98          return 0;
    99  }
   100  
   101  static int imx_sc_thermal_get_sensor_id(struct device_node *sensor_np)
   102  {
   103          struct of_phandle_args sensor_specs;
   104          int ret;
   105  
   106          ret = of_parse_phandle_with_args(sensor_np, "thermal-sensors",
   107                          "#thermal-sensor-cells",
   108                          0, &sensor_specs);
   109          if (ret)
   110                  return ret;
   111  
   112          if (sensor_specs.args_count >= 1) {
   113                  ret = sensor_specs.args[0];
   114                  WARN(sensor_specs.args_count > 1,
   115                                  "%pOFn: too many cells in sensor 
specifier %d\n",
   116                                  sensor_specs.np, 
sensor_specs.args_count);
   117          } else {
   118                  ret = 0;
   119          }
   120  
   121          return ret;
   122  }
   123  
   124  static int imx_sc_thermal_probe(struct platform_device *pdev)
   125  {
   126          struct device_node *np = pdev->dev.of_node;
   127          struct device_node *sensor_np = NULL;
   128          struct imx_sc_thermal_data *data;
   129          struct imx_sc_sensor *sensors;
   130          u32 sensor_num;
   131          int ret, i;
   132  
   133          ret = imx_scu_get_handle(&thermal_ipc_handle);
   134          if (ret) {
   135                  if (ret == -EPROBE_DEFER)
   136                          return ret;
   137  
   138                  dev_err(&pdev->dev, "failed to get ipc handle: %d!\n", 
ret);
   139                  return ret;
   140          }
   141  
   142          data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL);
   143          if (!data)
   144                  return -ENOMEM;
   145  
   146          ret = of_property_read_u32(np, "tsens-num", &sensor_num);
   147          if (ret || !sensor_num) {
   148                  dev_err(&pdev->dev, "failed to get valid temp sensor 
number!\n");
   149                  ret = -EINVAL;
   150                  goto free_data;
   151          }
   152  
   153          sensors = devm_kzalloc(&pdev->dev, sizeof(*data->sensor) * 
sensor_num,
   154                                 GFP_KERNEL);
   155          if (!sensors) {
   156                  ret = -ENOMEM;
   157                  goto free_data;
   158          }
   159  
   160          data->sensor = sensors;
   161  
   162          np = of_find_node_by_name(NULL, "thermal-zones");
   163          if (!np) {
   164                  ret = -ENODEV;
   165                  goto free_sensors;
   166          }
   167  
   168          for (i = 0; i < sensor_num; i++) {
   169                  struct imx_sc_sensor *sensor = &data->sensor[i];
   170  
   171                  sensor_np = of_get_next_child(np, sensor_np);
   172                  sensor->resource_id = 
imx_sc_thermal_get_sensor_id(sensor_np);
 > 173                  if (sensor->resource_id < 0) {
   174                          dev_err(&pdev->dev, "invalid sensor resource 
id: %d\n",
   175                                  sensor->resource_id);
   176                          ret = sensor->resource_id;
   177                          goto put_node;
   178                  }
   179  
   180                  ret = imx_sc_thermal_register_sensor(pdev, sensor);
   181                  if (ret) {
   182                          dev_err(&pdev->dev, "failed to register thermal 
sensor: %d\n",
   183                                  ret);
   184                          goto put_node;
   185                  }
   186          }
   187  
   188          of_node_put(sensor_np);
   189          of_node_put(np);
   190  
   191          return 0;
   192  
   193  put_node:
   194          of_node_put(np);
   195          of_node_put(sensor_np);
   196  free_sensors:
 > 197          kfree(sensors);
   198  free_data:
   199          kfree(data);
   200  
   201          return ret;
   202  }
   203  

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

Attachment: .config.gz
Description: application/gzip

Reply via email to