Re: [PATCH v2 1/2] hwmon: (ucd9000) Add gpio chip interface

From: kbuild test robot
Date: Fri Mar 16 2018 - 01:26:57 EST


Hi Christopher,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on linus/master]
[also build test ERROR on v4.16-rc5 next-20180315]
[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/Eddie-James/hwmon-ucd9000-Add-gpio-and-debugfs-interfaces/20180316-125048
config: x86_64-randconfig-x019-201810 (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=x86_64

All error/warnings (new ones prefixed by >>):

>> drivers/hwmon/pmbus/ucd9000.c:69:19: error: field 'gpio' has incomplete type
struct gpio_chip gpio;
^~~~
drivers/hwmon/pmbus/ucd9000.c: In function 'ucd9000_gpio_get':
>> drivers/hwmon/pmbus/ucd9000.c:184:31: error: implicit declaration of function 'gpiochip_get_data'; did you mean 'gpio_get_value'? [-Werror=implicit-function-declaration]
struct i2c_client *client = gpiochip_get_data(gc);
^~~~~~~~~~~~~~~~~
gpio_get_value
>> drivers/hwmon/pmbus/ucd9000.c:184:31: warning: initialization makes pointer from integer without a cast [-Wint-conversion]
drivers/hwmon/pmbus/ucd9000.c: In function 'ucd9000_gpio_set':
drivers/hwmon/pmbus/ucd9000.c:197:30: warning: initialization makes pointer from integer without a cast [-Wint-conversion]
struct i2c_client *client = gpiochip_get_data(gc);
^~~~~~~~~~~~~~~~~
drivers/hwmon/pmbus/ucd9000.c: In function 'ucd9000_gpio_get_direction':
drivers/hwmon/pmbus/ucd9000.c:240:30: warning: initialization makes pointer from integer without a cast [-Wint-conversion]
struct i2c_client *client = gpiochip_get_data(gc);
^~~~~~~~~~~~~~~~~
drivers/hwmon/pmbus/ucd9000.c: In function 'ucd9000_gpio_set_direction':
drivers/hwmon/pmbus/ucd9000.c:254:30: warning: initialization makes pointer from integer without a cast [-Wint-conversion]
struct i2c_client *client = gpiochip_get_data(gc);
^~~~~~~~~~~~~~~~~
drivers/hwmon/pmbus/ucd9000.c: In function 'ucd9000_probe':
>> drivers/hwmon/pmbus/ucd9000.c:460:9: error: implicit declaration of function 'devm_gpiochip_add_data'; did you mean 'devm_gpio_request'? [-Werror=implicit-function-declaration]
ret = devm_gpiochip_add_data(&client->dev, &data->gpio,
^~~~~~~~~~~~~~~~~~~~~~
devm_gpio_request
cc1: some warnings being treated as errors

vim +/gpio +69 drivers/hwmon/pmbus/ucd9000.c

65
66 struct ucd9000_data {
67 u8 fan_data[UCD9000_NUM_FAN][I2C_SMBUS_BLOCK_MAX];
68 struct pmbus_driver_info info;
> 69 struct gpio_chip gpio;
70 };
71 #define to_ucd9000_data(_info) container_of(_info, struct ucd9000_data, info)
72
73 static int ucd9000_get_fan_config(struct i2c_client *client, int fan)
74 {
75 int fan_config = 0;
76 struct ucd9000_data *data
77 = to_ucd9000_data(pmbus_get_driver_info(client));
78
79 if (data->fan_data[fan][3] & 1)
80 fan_config |= PB_FAN_2_INSTALLED; /* Use lower bit position */
81
82 /* Pulses/revolution */
83 fan_config |= (data->fan_data[fan][3] & 0x06) >> 1;
84
85 return fan_config;
86 }
87
88 static int ucd9000_read_byte_data(struct i2c_client *client, int page, int reg)
89 {
90 int ret = 0;
91 int fan_config;
92
93 switch (reg) {
94 case PMBUS_FAN_CONFIG_12:
95 if (page > 0)
96 return -ENXIO;
97
98 ret = ucd9000_get_fan_config(client, 0);
99 if (ret < 0)
100 return ret;
101 fan_config = ret << 4;
102 ret = ucd9000_get_fan_config(client, 1);
103 if (ret < 0)
104 return ret;
105 fan_config |= ret;
106 ret = fan_config;
107 break;
108 case PMBUS_FAN_CONFIG_34:
109 if (page > 0)
110 return -ENXIO;
111
112 ret = ucd9000_get_fan_config(client, 2);
113 if (ret < 0)
114 return ret;
115 fan_config = ret << 4;
116 ret = ucd9000_get_fan_config(client, 3);
117 if (ret < 0)
118 return ret;
119 fan_config |= ret;
120 ret = fan_config;
121 break;
122 default:
123 ret = -ENODATA;
124 break;
125 }
126 return ret;
127 }
128
129 static const struct i2c_device_id ucd9000_id[] = {
130 {"ucd9000", ucd9000},
131 {"ucd90120", ucd90120},
132 {"ucd90124", ucd90124},
133 {"ucd90160", ucd90160},
134 {"ucd9090", ucd9090},
135 {"ucd90910", ucd90910},
136 {}
137 };
138 MODULE_DEVICE_TABLE(i2c, ucd9000_id);
139
140 static const struct of_device_id ucd9000_of_match[] = {
141 {
142 .compatible = "ti,ucd9000",
143 .data = (void *)ucd9000
144 },
145 {
146 .compatible = "ti,ucd90120",
147 .data = (void *)ucd90120
148 },
149 {
150 .compatible = "ti,ucd90124",
151 .data = (void *)ucd90124
152 },
153 {
154 .compatible = "ti,ucd90160",
155 .data = (void *)ucd90160
156 },
157 {
158 .compatible = "ti,ucd9090",
159 .data = (void *)ucd9090
160 },
161 {
162 .compatible = "ti,ucd90910",
163 .data = (void *)ucd90910
164 },
165 { },
166 };
167 MODULE_DEVICE_TABLE(of, ucd9000_of_match);
168
169 static int ucd9000_gpio_read_config(struct i2c_client *client,
170 unsigned int offset)
171 {
172 int ret;
173
174 /* No page set required */
175 ret = i2c_smbus_write_byte_data(client, UCD9000_GPIO_SELECT, offset);
176 if (ret < 0)
177 return ret;
178
179 return i2c_smbus_read_byte_data(client, UCD9000_GPIO_CONFIG);
180 }
181
182 static int ucd9000_gpio_get(struct gpio_chip *gc, unsigned int offset)
183 {
> 184 struct i2c_client *client = gpiochip_get_data(gc);
185 int ret;
186
187 ret = ucd9000_gpio_read_config(client, offset);
188 if (ret < 0)
189 return ret;
190
191 return !!(ret & UCD9000_GPIO_CONFIG_STATUS);
192 }
193
194 static void ucd9000_gpio_set(struct gpio_chip *gc, unsigned int offset,
195 int value)
196 {
197 struct i2c_client *client = gpiochip_get_data(gc);
198 int ret;
199
200 ret = ucd9000_gpio_read_config(client, offset);
201 if (ret < 0) {
202 dev_dbg(&client->dev, "failed to read GPIO %d config: %d\n",
203 offset, ret);
204 return;
205 }
206
207 if (value) {
208 if (ret & UCD9000_GPIO_CONFIG_STATUS)
209 return;
210
211 ret |= UCD9000_GPIO_CONFIG_STATUS;
212 } else {
213 if (!(ret & UCD9000_GPIO_CONFIG_STATUS))
214 return;
215
216 ret &= ~UCD9000_GPIO_CONFIG_STATUS;
217 }
218
219 ret |= UCD9000_GPIO_CONFIG_ENABLE;
220
221 /* Page set not required */
222 ret = i2c_smbus_write_byte_data(client, UCD9000_GPIO_CONFIG, ret);
223 if (ret < 0) {
224 dev_dbg(&client->dev, "Failed to write GPIO %d config: %d\n",
225 offset, ret);
226 return;
227 }
228
229 ret &= ~UCD9000_GPIO_CONFIG_ENABLE;
230
231 ret = i2c_smbus_write_byte_data(client, UCD9000_GPIO_CONFIG, ret);
232 if (ret < 0)
233 dev_dbg(&client->dev, "Failed to write GPIO %d config: %d\n",
234 offset, ret);
235 }
236
237 static int ucd9000_gpio_get_direction(struct gpio_chip *gc,
238 unsigned int offset)
239 {
> 240 struct i2c_client *client = gpiochip_get_data(gc);
241 int ret;
242
243 ret = ucd9000_gpio_read_config(client, offset);
244 if (ret < 0)
245 return ret;
246
247 return !(ret & UCD9000_GPIO_CONFIG_OUT_ENABLE);
248 }
249

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

Attachment: .config.gz
Description: application/gzip