Hi Hans, kernel test robot noticed the following build errors: [auto build test ERROR on linus/master] [also build test ERROR on v6.7] [cannot apply to wsa/i2c/for-next next-20240108] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/Hans-de-Goede/platform-x86-dell-smo8800-Only-load-on-Dell-laptops/20231225-152720 base: linus/master patch link: https://lore.kernel.org/r/20231224213629.395741-4-hdegoede%40redhat.com patch subject: [PATCH 3/6] platform/x86: dell-smo8800: Move instantiation of lis3lv02d i2c_client from i2c-i801 to dell-smo8800 config: i386-randconfig-003-20240106 (https://download.01.org/0day-ci/archive/20240108/202401081755.B1WHdRuF-lkp@xxxxxxxxx/config) compiler: gcc-7 (Ubuntu 7.5.0-6ubuntu2) 7.5.0 reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240108/202401081755.B1WHdRuF-lkp@xxxxxxxxx/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@xxxxxxxxx> | Closes: https://lore.kernel.org/oe-kbuild-all/202401081755.B1WHdRuF-lkp@xxxxxxxxx/ All errors (new ones prefixed by >>): ld: drivers/platform/x86/dell/dell-smo8800.o: in function `smo8800_remove': >> drivers/platform/x86/dell/dell-smo8800.c:278: undefined reference to `i2c_unregister_device' ld: drivers/platform/x86/dell/dell-smo8800.o: in function `smo8800_instantiate_i2c_client': >> drivers/platform/x86/dell/dell-smo8800.c:179: undefined reference to `i2c_bus_type' >> ld: drivers/platform/x86/dell/dell-smo8800.c:211: undefined reference to `i2c_put_adapter' ld: drivers/platform/x86/dell/dell-smo8800.o: in function `smo8800_probe': drivers/platform/x86/dell/dell-smo8800.c:267: undefined reference to `i2c_unregister_device' ld: drivers/platform/x86/dell/dell-smo8800.o: in function `smo8800_instantiate_i2c_client': drivers/platform/x86/dell/dell-smo8800.c:201: undefined reference to `i2c_new_client_device' ld: drivers/platform/x86/dell/dell-smo8800.o: in function `smo8800_find_i801': >> drivers/platform/x86/dell/dell-smo8800.c:126: undefined reference to `i2c_verify_adapter' >> ld: drivers/platform/x86/dell/dell-smo8800.c:140: undefined reference to `i2c_get_adapter' vim +278 drivers/platform/x86/dell/dell-smo8800.c 111 112 static int smo8800_find_i801(struct device *dev, void *data) 113 { 114 static const u16 i801_idf_pci_device_ids[] = { 115 0x1d70, /* Patsburg (PCH) */ 116 0x1d71, /* Patsburg (PCH) */ 117 0x1d72, /* Patsburg (PCH) */ 118 0x8d7d, /* Wellsburg (PCH) */ 119 0x8d7e, /* Wellsburg (PCH) */ 120 0x8d7f, /* Wellsburg (PCH) */ 121 }; 122 struct i2c_adapter *adap, **adap_ret = data; 123 struct pci_dev *pdev; 124 int i; 125 > 126 adap = i2c_verify_adapter(dev); 127 if (!adap) 128 return 0; 129 130 if (!strstarts(adap->name, "SMBus I801 adapter")) 131 return 0; 132 133 /* The parent of an I801 adapter is always a PCI device */ 134 pdev = to_pci_dev(adap->dev.parent); 135 for (i = 0; i < ARRAY_SIZE(i801_idf_pci_device_ids); i++) { 136 if (pdev->device == i801_idf_pci_device_ids[i]) 137 return 0; /* Only register client on main SMBus channel */ 138 } 139 > 140 *adap_ret = i2c_get_adapter(adap->nr); 141 return 1; 142 } 143 144 /* 145 * Accelerometer's I2C address is not specified in DMI nor ACPI, 146 * so it is needed to define mapping table based on DMI product names. 147 */ 148 static const struct { 149 const char *dmi_product_name; 150 unsigned short i2c_addr; 151 } dell_lis3lv02d_devices[] = { 152 /* 153 * Dell platform team told us that these Latitude devices have 154 * ST microelectronics accelerometer at I2C address 0x29. 155 */ 156 { "Latitude E5250", 0x29 }, 157 { "Latitude E5450", 0x29 }, 158 { "Latitude E5550", 0x29 }, 159 { "Latitude E6440", 0x29 }, 160 { "Latitude E6440 ATG", 0x29 }, 161 { "Latitude E6540", 0x29 }, 162 /* 163 * Additional individual entries were added after verification. 164 */ 165 { "Latitude 5480", 0x29 }, 166 { "Latitude E6330", 0x29 }, 167 { "Vostro V131", 0x1d }, 168 { "Vostro 5568", 0x29 }, 169 }; 170 171 static void smo8800_instantiate_i2c_client(struct smo8800_device *smo8800) 172 { 173 struct i2c_board_info info = { }; 174 struct i2c_adapter *adap = NULL; 175 const char *dmi_product_name; 176 u8 addr = 0; 177 int i; 178 > 179 bus_for_each_dev(&i2c_bus_type, NULL, &adap, smo8800_find_i801); 180 if (!adap) 181 return; 182 183 dmi_product_name = dmi_get_system_info(DMI_PRODUCT_NAME); 184 for (i = 0; i < ARRAY_SIZE(dell_lis3lv02d_devices); ++i) { 185 if (strcmp(dmi_product_name, 186 dell_lis3lv02d_devices[i].dmi_product_name) == 0) { 187 addr = dell_lis3lv02d_devices[i].i2c_addr; 188 break; 189 } 190 } 191 192 if (!addr) { 193 dev_warn(smo8800->dev, 194 "Accelerometer lis3lv02d is present on SMBus but its address is unknown, skipping registration\n"); 195 goto put_adapter; 196 } 197 198 info.addr = addr; 199 strscpy(info.type, "lis3lv02d", I2C_NAME_SIZE); 200 201 smo8800->i2c_dev = i2c_new_client_device(adap, &info); 202 if (IS_ERR(smo8800->i2c_dev)) { 203 dev_err_probe(smo8800->dev, PTR_ERR(smo8800->i2c_dev), 204 "registering accel i2c_client\n"); 205 smo8800->i2c_dev = NULL; 206 } else { 207 dev_info(smo8800->dev, "Registered %s accelerometer on address 0x%02x\n", 208 info.type, info.addr); 209 } 210 put_adapter: > 211 i2c_put_adapter(adap); 212 } 213 214 static int smo8800_probe(struct platform_device *device) 215 { 216 int err; 217 struct smo8800_device *smo8800; 218 219 if (!dmi_match(DMI_SYS_VENDOR, "Dell Inc.")) 220 return false; 221 222 smo8800 = devm_kzalloc(&device->dev, sizeof(*smo8800), GFP_KERNEL); 223 if (!smo8800) { 224 dev_err(&device->dev, "failed to allocate device data\n"); 225 return -ENOMEM; 226 } 227 228 smo8800->dev = &device->dev; 229 smo8800->miscdev.minor = MISC_DYNAMIC_MINOR; 230 smo8800->miscdev.name = "freefall"; 231 smo8800->miscdev.fops = &smo8800_misc_fops; 232 233 init_waitqueue_head(&smo8800->misc_wait); 234 235 err = platform_get_irq(device, 0); 236 if (err < 0) 237 return err; 238 smo8800->irq = err; 239 240 smo8800_instantiate_i2c_client(smo8800); 241 242 err = misc_register(&smo8800->miscdev); 243 if (err) { 244 dev_err(&device->dev, "failed to register misc dev: %d\n", err); 245 goto error_unregister_i2c_client; 246 } 247 248 err = request_threaded_irq(smo8800->irq, smo8800_interrupt_quick, 249 smo8800_interrupt_thread, 250 IRQF_TRIGGER_RISING | IRQF_ONESHOT, 251 DRIVER_NAME, smo8800); 252 if (err) { 253 dev_err(&device->dev, 254 "failed to request thread for IRQ %d: %d\n", 255 smo8800->irq, err); 256 goto error; 257 } 258 259 dev_dbg(&device->dev, "device /dev/freefall registered with IRQ %d\n", 260 smo8800->irq); 261 platform_set_drvdata(device, smo8800); 262 return 0; 263 264 error: 265 misc_deregister(&smo8800->miscdev); 266 error_unregister_i2c_client: 267 i2c_unregister_device(smo8800->i2c_dev); 268 return err; 269 } 270 271 static void smo8800_remove(struct platform_device *device) 272 { 273 struct smo8800_device *smo8800 = platform_get_drvdata(device); 274 275 free_irq(smo8800->irq, smo8800); 276 misc_deregister(&smo8800->miscdev); 277 dev_dbg(&device->dev, "device /dev/freefall unregistered\n"); > 278 i2c_unregister_device(smo8800->i2c_dev); 279 } 280 -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki