1 // SPDX-License-Identifier: GPL-2.0-or-later 2 /* 3 * i2c-smbus.c - SMBus extensions to the I2C protocol 4 * 5 * Copyright (C) 2008 David Brownell 6 * Copyright (C) 2010-2019 Jean Delvare <jdelvare@suse.de> 7 */ 8 9 #include <linux/device.h> 10 #include <linux/dmi.h> 11 #include <linux/i2c.h> 12 #include <linux/i2c-smbus.h> 13 #include <linux/interrupt.h> 14 #include <linux/kernel.h> 15 #include <linux/module.h> 16 #include <linux/property.h> 17 #include <linux/slab.h> 18 #include <linux/workqueue.h> 19 20 struct i2c_smbus_alert { 21 struct work_struct alert; 22 struct i2c_client *ara; /* Alert response address */ 23 }; 24 25 struct alert_data { 26 unsigned short addr; 27 enum i2c_alert_protocol type; 28 unsigned int data; 29 }; 30 31 /* If this is the alerting device, notify its driver */ 32 static int smbus_do_alert(struct device *dev, void *addrp) 33 { 34 struct i2c_client *client = i2c_verify_client(dev); 35 struct alert_data *data = addrp; 36 struct i2c_driver *driver; 37 38 if (!client || client->addr != data->addr) 39 return 0; 40 if (client->flags & I2C_CLIENT_TEN) 41 return 0; 42 43 /* 44 * Drivers should either disable alerts, or provide at least 45 * a minimal handler. Lock so the driver won't change. 46 */ 47 device_lock(dev); 48 if (client->dev.driver) { 49 driver = to_i2c_driver(client->dev.driver); 50 if (driver->alert) 51 driver->alert(client, data->type, data->data); 52 else 53 dev_warn(&client->dev, "no driver alert()!\n"); 54 } else 55 dev_dbg(&client->dev, "alert with no driver\n"); 56 device_unlock(dev); 57 58 /* Stop iterating after we find the device */ 59 return -EBUSY; 60 } 61 62 /* 63 * The alert IRQ handler needs to hand work off to a task which can issue 64 * SMBus calls, because those sleeping calls can't be made in IRQ context. 65 */ 66 static irqreturn_t smbus_alert(int irq, void *d) 67 { 68 struct i2c_smbus_alert *alert = d; 69 struct i2c_client *ara; 70 71 ara = alert->ara; 72 73 for (;;) { 74 s32 status; 75 struct alert_data data; 76 77 /* 78 * Devices with pending alerts reply in address order, low 79 * to high, because of slave transmit arbitration. After 80 * responding, an SMBus device stops asserting SMBALERT#. 81 * 82 * Note that SMBus 2.0 reserves 10-bit addresses for future 83 * use. We neither handle them, nor try to use PEC here. 84 */ 85 status = i2c_smbus_read_byte(ara); 86 if (status < 0) 87 break; 88 89 data.data = status & 1; 90 data.addr = status >> 1; 91 data.type = I2C_PROTOCOL_SMBUS_ALERT; 92 93 dev_dbg(&ara->dev, "SMBALERT# from dev 0x%02x, flag %d\n", 94 data.addr, data.data); 95 96 /* Notify driver for the device which issued the alert */ 97 device_for_each_child(&ara->adapter->dev, &data, 98 smbus_do_alert); 99 } 100 101 return IRQ_HANDLED; 102 } 103 104 static void smbalert_work(struct work_struct *work) 105 { 106 struct i2c_smbus_alert *alert; 107 108 alert = container_of(work, struct i2c_smbus_alert, alert); 109 110 smbus_alert(0, alert); 111 112 } 113 114 /* Setup SMBALERT# infrastructure */ 115 static int smbalert_probe(struct i2c_client *ara) 116 { 117 struct i2c_smbus_alert_setup *setup = dev_get_platdata(&ara->dev); 118 struct i2c_smbus_alert *alert; 119 struct i2c_adapter *adapter = ara->adapter; 120 int res, irq; 121 122 alert = devm_kzalloc(&ara->dev, sizeof(struct i2c_smbus_alert), 123 GFP_KERNEL); 124 if (!alert) 125 return -ENOMEM; 126 127 if (setup) { 128 irq = setup->irq; 129 } else { 130 irq = fwnode_irq_get_byname(dev_fwnode(adapter->dev.parent), 131 "smbus_alert"); 132 if (irq <= 0) 133 return irq; 134 } 135 136 INIT_WORK(&alert->alert, smbalert_work); 137 alert->ara = ara; 138 139 if (irq > 0) { 140 res = devm_request_threaded_irq(&ara->dev, irq, 141 NULL, smbus_alert, 142 IRQF_SHARED | IRQF_ONESHOT, 143 "smbus_alert", alert); 144 if (res) 145 return res; 146 } 147 148 i2c_set_clientdata(ara, alert); 149 dev_info(&adapter->dev, "supports SMBALERT#\n"); 150 151 return 0; 152 } 153 154 /* IRQ and memory resources are managed so they are freed automatically */ 155 static void smbalert_remove(struct i2c_client *ara) 156 { 157 struct i2c_smbus_alert *alert = i2c_get_clientdata(ara); 158 159 cancel_work_sync(&alert->alert); 160 } 161 162 static const struct i2c_device_id smbalert_ids[] = { 163 { "smbus_alert", 0 }, 164 { /* LIST END */ } 165 }; 166 MODULE_DEVICE_TABLE(i2c, smbalert_ids); 167 168 static struct i2c_driver smbalert_driver = { 169 .driver = { 170 .name = "smbus_alert", 171 }, 172 .probe_new = smbalert_probe, 173 .remove = smbalert_remove, 174 .id_table = smbalert_ids, 175 }; 176 177 /** 178 * i2c_handle_smbus_alert - Handle an SMBus alert 179 * @ara: the ARA client on the relevant adapter 180 * Context: can't sleep 181 * 182 * Helper function to be called from an I2C bus driver's interrupt 183 * handler. It will schedule the alert work, in turn calling the 184 * corresponding I2C device driver's alert function. 185 * 186 * It is assumed that ara is a valid i2c client previously returned by 187 * i2c_new_smbus_alert_device(). 188 */ 189 int i2c_handle_smbus_alert(struct i2c_client *ara) 190 { 191 struct i2c_smbus_alert *alert = i2c_get_clientdata(ara); 192 193 return schedule_work(&alert->alert); 194 } 195 EXPORT_SYMBOL_GPL(i2c_handle_smbus_alert); 196 197 module_i2c_driver(smbalert_driver); 198 199 #if IS_ENABLED(CONFIG_I2C_SLAVE) 200 #define SMBUS_HOST_NOTIFY_LEN 3 201 struct i2c_slave_host_notify_status { 202 u8 index; 203 u8 addr; 204 }; 205 206 static int i2c_slave_host_notify_cb(struct i2c_client *client, 207 enum i2c_slave_event event, u8 *val) 208 { 209 struct i2c_slave_host_notify_status *status = client->dev.platform_data; 210 211 switch (event) { 212 case I2C_SLAVE_WRITE_RECEIVED: 213 /* We only retrieve the first byte received (addr) 214 * since there is currently no support to retrieve the data 215 * parameter from the client. 216 */ 217 if (status->index == 0) 218 status->addr = *val; 219 if (status->index < U8_MAX) 220 status->index++; 221 break; 222 case I2C_SLAVE_STOP: 223 if (status->index == SMBUS_HOST_NOTIFY_LEN) 224 i2c_handle_smbus_host_notify(client->adapter, 225 status->addr); 226 fallthrough; 227 case I2C_SLAVE_WRITE_REQUESTED: 228 status->index = 0; 229 break; 230 case I2C_SLAVE_READ_REQUESTED: 231 case I2C_SLAVE_READ_PROCESSED: 232 *val = 0xff; 233 break; 234 } 235 236 return 0; 237 } 238 239 /** 240 * i2c_new_slave_host_notify_device - get a client for SMBus host-notify support 241 * @adapter: the target adapter 242 * Context: can sleep 243 * 244 * Setup handling of the SMBus host-notify protocol on a given I2C bus segment. 245 * 246 * Handling is done by creating a device and its callback and handling data 247 * received via the SMBus host-notify address (0x8) 248 * 249 * This returns the client, which should be ultimately freed using 250 * i2c_free_slave_host_notify_device(); or an ERRPTR to indicate an error. 251 */ 252 struct i2c_client *i2c_new_slave_host_notify_device(struct i2c_adapter *adapter) 253 { 254 struct i2c_board_info host_notify_board_info = { 255 I2C_BOARD_INFO("smbus_host_notify", 0x08), 256 .flags = I2C_CLIENT_SLAVE, 257 }; 258 struct i2c_slave_host_notify_status *status; 259 struct i2c_client *client; 260 int ret; 261 262 status = kzalloc(sizeof(struct i2c_slave_host_notify_status), 263 GFP_KERNEL); 264 if (!status) 265 return ERR_PTR(-ENOMEM); 266 267 host_notify_board_info.platform_data = status; 268 269 client = i2c_new_client_device(adapter, &host_notify_board_info); 270 if (IS_ERR(client)) { 271 kfree(status); 272 return client; 273 } 274 275 ret = i2c_slave_register(client, i2c_slave_host_notify_cb); 276 if (ret) { 277 i2c_unregister_device(client); 278 kfree(status); 279 return ERR_PTR(ret); 280 } 281 282 return client; 283 } 284 EXPORT_SYMBOL_GPL(i2c_new_slave_host_notify_device); 285 286 /** 287 * i2c_free_slave_host_notify_device - free the client for SMBus host-notify 288 * support 289 * @client: the client to free 290 * Context: can sleep 291 * 292 * Free the i2c_client allocated via i2c_new_slave_host_notify_device 293 */ 294 void i2c_free_slave_host_notify_device(struct i2c_client *client) 295 { 296 if (IS_ERR_OR_NULL(client)) 297 return; 298 299 i2c_slave_unregister(client); 300 kfree(client->dev.platform_data); 301 i2c_unregister_device(client); 302 } 303 EXPORT_SYMBOL_GPL(i2c_free_slave_host_notify_device); 304 #endif 305 306 /* 307 * SPD is not part of SMBus but we include it here for convenience as the 308 * target systems are the same. 309 * Restrictions to automatic SPD instantiation: 310 * - Only works if all filled slots have the same memory type 311 * - Only works for DDR2, DDR3 and DDR4 for now 312 * - Only works on systems with 1 to 4 memory slots 313 */ 314 #if IS_ENABLED(CONFIG_DMI) 315 void i2c_register_spd(struct i2c_adapter *adap) 316 { 317 int n, slot_count = 0, dimm_count = 0; 318 u16 handle; 319 u8 common_mem_type = 0x0, mem_type; 320 u64 mem_size; 321 const char *name; 322 323 while ((handle = dmi_memdev_handle(slot_count)) != 0xffff) { 324 slot_count++; 325 326 /* Skip empty slots */ 327 mem_size = dmi_memdev_size(handle); 328 if (!mem_size) 329 continue; 330 331 /* Skip undefined memory type */ 332 mem_type = dmi_memdev_type(handle); 333 if (mem_type <= 0x02) /* Invalid, Other, Unknown */ 334 continue; 335 336 if (!common_mem_type) { 337 /* First filled slot */ 338 common_mem_type = mem_type; 339 } else { 340 /* Check that all filled slots have the same type */ 341 if (mem_type != common_mem_type) { 342 dev_warn(&adap->dev, 343 "Different memory types mixed, not instantiating SPD\n"); 344 return; 345 } 346 } 347 dimm_count++; 348 } 349 350 /* No useful DMI data, bail out */ 351 if (!dimm_count) 352 return; 353 354 dev_info(&adap->dev, "%d/%d memory slots populated (from DMI)\n", 355 dimm_count, slot_count); 356 357 if (slot_count > 4) { 358 dev_warn(&adap->dev, 359 "Systems with more than 4 memory slots not supported yet, not instantiating SPD\n"); 360 return; 361 } 362 363 /* 364 * Memory types could be found at section 7.18.2 (Memory Device — Type), table 78 365 * https://www.dmtf.org/sites/default/files/standards/documents/DSP0134_3.6.0.pdf 366 */ 367 switch (common_mem_type) { 368 case 0x12: /* DDR */ 369 case 0x13: /* DDR2 */ 370 case 0x18: /* DDR3 */ 371 case 0x1B: /* LPDDR */ 372 case 0x1C: /* LPDDR2 */ 373 case 0x1D: /* LPDDR3 */ 374 name = "spd"; 375 break; 376 case 0x1A: /* DDR4 */ 377 case 0x1E: /* LPDDR4 */ 378 name = "ee1004"; 379 break; 380 default: 381 dev_info(&adap->dev, 382 "Memory type 0x%02x not supported yet, not instantiating SPD\n", 383 common_mem_type); 384 return; 385 } 386 387 /* 388 * We don't know in which slots the memory modules are. We could 389 * try to guess from the slot names, but that would be rather complex 390 * and unreliable, so better probe all possible addresses until we 391 * have found all memory modules. 392 */ 393 for (n = 0; n < slot_count && dimm_count; n++) { 394 struct i2c_board_info info; 395 unsigned short addr_list[2]; 396 397 memset(&info, 0, sizeof(struct i2c_board_info)); 398 strscpy(info.type, name, I2C_NAME_SIZE); 399 addr_list[0] = 0x50 + n; 400 addr_list[1] = I2C_CLIENT_END; 401 402 if (!IS_ERR(i2c_new_scanned_device(adap, &info, addr_list, NULL))) { 403 dev_info(&adap->dev, 404 "Successfully instantiated SPD at 0x%hx\n", 405 addr_list[0]); 406 dimm_count--; 407 } 408 } 409 } 410 EXPORT_SYMBOL_GPL(i2c_register_spd); 411 #endif 412 413 MODULE_AUTHOR("Jean Delvare <jdelvare@suse.de>"); 414 MODULE_DESCRIPTION("SMBus protocol extensions support"); 415 MODULE_LICENSE("GPL"); 416