Hi Vijai, Thank you for the patch! Yet something to improve: [auto build test ERROR on chanwoo-extcon/extcon-next] [also build test ERROR on v5.0-rc2] [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/Vijai-Kumar-K/drivers-extcon-Add-support-for-ptn5150/20190122-041153 base: https://git.kernel.org/pub/scm/linux/kernel/git/chanwoo/extcon.git extcon-next config: sh-allyesconfig (attached as .config) compiler: sh4-linux-gnu-gcc (Debian 8.2.0-11) 8.2.0 reproduce: wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # save the attached .config to linux build tree GCC_VERSION=8.2.0 make.cross ARCH=sh All error/warnings (new ones prefixed by >>): drivers//extcon/extcon-ptn5150.c: In function 'ptn5150_irq_work': >> drivers//extcon/extcon-ptn5150.c:93:5: error: implicit declaration of function 'extcon_set_state_sync'; did you mean 'extcon_get_state'? [-Werror=implicit-function-declaration] extcon_set_state_sync(info->edev, ^~~~~~~~~~~~~~~~~~~~~ extcon_get_state drivers//extcon/extcon-ptn5150.c: In function 'ptn5150_i2c_probe': >> drivers//extcon/extcon-ptn5150.c:255:15: error: implicit declaration of function 'devm_extcon_dev_allocate'; did you mean 'extcon_get_state'? [-Werror=implicit-function-declaration] info->edev = devm_extcon_dev_allocate(info->dev, ptn5150_extcon_cable); ^~~~~~~~~~~~~~~~~~~~~~~~ extcon_get_state >> drivers//extcon/extcon-ptn5150.c:255:13: warning: assignment to 'struct extcon_dev *' from 'int' makes pointer from integer without a cast [-Wint-conversion] info->edev = devm_extcon_dev_allocate(info->dev, ptn5150_extcon_cable); ^ >> drivers//extcon/extcon-ptn5150.c:262:8: error: implicit declaration of function 'devm_extcon_dev_register'; did you mean 'devm_pinctrl_register'? [-Werror=implicit-function-declaration] ret = devm_extcon_dev_register(info->dev, info->edev); ^~~~~~~~~~~~~~~~~~~~~~~~ devm_pinctrl_register cc1: some warnings being treated as errors vim +93 drivers//extcon/extcon-ptn5150.c 51 52 static void ptn5150_irq_work(struct work_struct *work) 53 { 54 struct ptn5150_info *info = container_of(work, 55 struct ptn5150_info, irq_work); 56 int ret = 0; 57 unsigned int reg_data; 58 unsigned int port_status; 59 unsigned int vbus; 60 unsigned int cable_attach; 61 unsigned int int_status; 62 63 if (!info->edev) 64 return; 65 66 mutex_lock(&info->mutex); 67 68 ret = regmap_read(info->regmap, PTN5150_REG_CC_STATUS, ®_data); 69 if (ret) { 70 dev_err(info->dev, 71 "failed to read CC STATUS %d\n", ret); 72 mutex_unlock(&info->mutex); 73 return; 74 } 75 /* Clear interrupt. Read would clear the register */ 76 ret = regmap_read(info->regmap, PTN5150_REG_INT_STATUS, &int_status); 77 if (ret) { 78 dev_err(info->dev, 79 "failed to read INT STATUS %d\n", ret); 80 mutex_unlock(&info->mutex); 81 return; 82 } 83 84 if (int_status) { 85 cable_attach = int_status & PTN5150_REG_INT_CABLE_ATTACH_MASK; 86 if (cable_attach) { 87 port_status = ((reg_data & 88 PTN5150_REG_CC_PORT_ATTACHMENT_MASK) >> 89 PTN5150_REG_CC_PORT_ATTACHMENT_SHIFT); 90 91 switch (port_status) { 92 case PTN5150_DFP_ATTACHED: > 93 extcon_set_state_sync(info->edev, 94 EXTCON_USB_HOST, false); 95 gpiod_set_value(info->vbus_gpiod, 0); 96 extcon_set_state_sync(info->edev, EXTCON_USB, 97 true); 98 break; 99 case PTN5150_UFP_ATTACHED: 100 extcon_set_state_sync(info->edev, EXTCON_USB, 101 false); 102 vbus = ((reg_data & 103 PTN5150_REG_CC_VBUS_DETECTION_MASK) >> 104 PTN5150_REG_CC_VBUS_DETECTION_SHIFT); 105 if (vbus) 106 gpiod_set_value(info->vbus_gpiod, 0); 107 else 108 gpiod_set_value(info->vbus_gpiod, 1); 109 110 extcon_set_state_sync(info->edev, 111 EXTCON_USB_HOST, true); 112 break; 113 default: 114 dev_err(info->dev, 115 "Unknown Port status : %x\n", 116 port_status); 117 break; 118 } 119 } else { 120 extcon_set_state_sync(info->edev, 121 EXTCON_USB_HOST, false); 122 extcon_set_state_sync(info->edev, 123 EXTCON_USB, false); 124 gpiod_set_value(info->vbus_gpiod, 0); 125 } 126 } 127 128 /* Clear interrupt. Read would clear the register */ 129 ret = regmap_read(info->regmap, PTN5150_REG_INT_REG_STATUS, 130 &int_status); 131 if (ret) { 132 dev_err(info->dev, 133 "failed to read INT REG STATUS %d\n", ret); 134 mutex_unlock(&info->mutex); 135 return; 136 } 137 138 139 mutex_unlock(&info->mutex); 140 } 141 142 143 static irqreturn_t ptn5150_irq_handler(int irq, void *data) 144 { 145 struct ptn5150_info *info = data; 146 147 schedule_work(&info->irq_work); 148 149 return IRQ_HANDLED; 150 } 151 152 static int ptn5150_init_dev_type(struct ptn5150_info *info) 153 { 154 unsigned int reg_data, vendor_id, version_id; 155 int ret; 156 157 ret = regmap_read(info->regmap, PTN5150_REG_DEVICE_ID, ®_data); 158 if (ret) { 159 dev_err(info->dev, "failed to read DEVICE_ID %d\n", ret); 160 return -EINVAL; 161 } 162 163 vendor_id = ((reg_data & PTN5150_REG_DEVICE_ID_VENDOR_MASK) >> 164 PTN5150_REG_DEVICE_ID_VENDOR_SHIFT); 165 version_id = ((reg_data & PTN5150_REG_DEVICE_ID_VERSION_MASK) >> 166 PTN5150_REG_DEVICE_ID_VERSION_SHIFT); 167 168 dev_info(info->dev, "Device type: version: 0x%x, vendor: 0x%x\n", 169 version_id, vendor_id); 170 171 /* Clear any existing interrupts */ 172 ret = regmap_read(info->regmap, PTN5150_REG_INT_STATUS, ®_data); 173 if (ret) { 174 dev_err(info->dev, 175 "failed to read PTN5150_REG_INT_STATUS %d\n", 176 ret); 177 return -EINVAL; 178 } 179 180 ret = regmap_read(info->regmap, PTN5150_REG_INT_REG_STATUS, ®_data); 181 if (ret) { 182 dev_err(info->dev, 183 "failed to read PTN5150_REG_INT_REG_STATUS %d\n", ret); 184 return -EINVAL; 185 } 186 187 return 0; 188 } 189 190 static int ptn5150_i2c_probe(struct i2c_client *i2c, 191 const struct i2c_device_id *id) 192 { 193 struct device *dev = &i2c->dev; 194 struct device_node *np = i2c->dev.of_node; 195 struct ptn5150_info *info; 196 int ret; 197 198 if (!np) 199 return -EINVAL; 200 201 info = devm_kzalloc(&i2c->dev, sizeof(*info), GFP_KERNEL); 202 if (!info) 203 return -ENOMEM; 204 i2c_set_clientdata(i2c, info); 205 206 info->dev = &i2c->dev; 207 info->i2c = i2c; 208 info->int_gpiod = devm_gpiod_get(&i2c->dev, "int", GPIOD_IN); 209 if (!info->int_gpiod) { 210 dev_err(dev, "failed to get INT GPIO\n"); 211 return -EINVAL; 212 } 213 info->vbus_gpiod = devm_gpiod_get(&i2c->dev, "vbus", GPIOD_IN); 214 if (!info->vbus_gpiod) { 215 dev_err(dev, "failed to get VBUS GPIO\n"); 216 return -EINVAL; 217 } 218 ret = gpiod_direction_output(info->vbus_gpiod, 0); 219 if (ret) { 220 dev_err(dev, "failed to set VBUS GPIO direction\n"); 221 return -EINVAL; 222 } 223 224 mutex_init(&info->mutex); 225 226 INIT_WORK(&info->irq_work, ptn5150_irq_work); 227 228 info->regmap = devm_regmap_init_i2c(i2c, &ptn5150_regmap_config); 229 if (IS_ERR(info->regmap)) { 230 ret = PTR_ERR(info->regmap); 231 dev_err(info->dev, "failed to allocate register map: %d\n", 232 ret); 233 return ret; 234 } 235 236 if (info->int_gpiod) { 237 info->irq = gpiod_to_irq(info->int_gpiod); 238 if (info->irq < 0) { 239 dev_err(dev, "failed to get INTB IRQ\n"); 240 return info->irq; 241 } 242 243 ret = devm_request_threaded_irq(dev, info->irq, NULL, 244 ptn5150_irq_handler, 245 IRQF_TRIGGER_FALLING | 246 IRQF_ONESHOT, 247 i2c->name, info); 248 if (ret < 0) { 249 dev_err(dev, "failed to request handler for INTB IRQ\n"); 250 return ret; 251 } 252 } 253 254 /* Allocate extcon device */ > 255 info->edev = devm_extcon_dev_allocate(info->dev, ptn5150_extcon_cable); 256 if (IS_ERR(info->edev)) { 257 dev_err(info->dev, "failed to allocate memory for extcon\n"); 258 return -ENOMEM; 259 } 260 261 /* Register extcon device */ > 262 ret = devm_extcon_dev_register(info->dev, info->edev); 263 if (ret) { 264 dev_err(info->dev, "failed to register extcon device\n"); 265 return ret; 266 } 267 268 /* Initialize PTN5150 device and print vendor id and version id */ 269 ret = ptn5150_init_dev_type(info); 270 if (ret) 271 return -EINVAL; 272 273 return 0; 274 } 275 --- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation