Re: [PATCH 1/2] thermal: imx_sc: add i.MX system controller thermal support

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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


[Index of Archives]     [Device Tree Compilter]     [Device Tree Spec]     [Linux Driver Backports]     [Video for Linux]     [Linux USB Devel]     [Linux PCI Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [XFree86]     [Yosemite Backpacking]


  Powered by Linux