Lines Matching +full:dynamic +full:- +full:mode
1 // SPDX-License-Identifier: GPL-2.0
27 * i3c_bus_maintenance_lock - Lock the bus for a maintenance operation
32 * - enabling/disabling slave events
33 * - re-triggering DAA
34 * - changing the dynamic address of a device
35 * - relinquishing mastership
36 * - ...
44 down_write(&bus->lock); in i3c_bus_maintenance_lock()
48 * i3c_bus_maintenance_unlock - Release the bus lock after a maintenance
58 up_write(&bus->lock); in i3c_bus_maintenance_unlock()
62 * i3c_bus_normaluse_lock - Lock the bus for a normal operation
66 * operation (see i3c_bus_maintenance_lock() for a non-exhaustive list of
69 * state or I3C dynamic address).
74 * sure two different communications are not inter-mixed, or access to the
79 down_read(&bus->lock); in i3c_bus_normaluse_lock()
83 * i3c_bus_normaluse_unlock - Release the bus lock after a normal operation
92 up_read(&bus->lock); in i3c_bus_normaluse_unlock()
112 if (dev->type == &i3c_device_type) in dev_to_i3cbus()
113 return dev_to_i3cdev(dev)->bus; in dev_to_i3cbus()
117 return &master->bus; in dev_to_i3cbus()
124 if (dev->type == &i3c_device_type) in dev_to_i3cdesc()
125 return dev_to_i3cdev(dev)->desc; in dev_to_i3cdesc()
129 return master->this; in dev_to_i3cdesc()
142 ret = sprintf(buf, "%x\n", desc->info.bcr); in bcr_show()
159 ret = sprintf(buf, "%x\n", desc->info.dcr); in dcr_show()
176 ret = sprintf(buf, "%llx\n", desc->info.pid); in pid_show()
193 ret = sprintf(buf, "%02x\n", desc->info.dyn_addr); in dynamic_address_show()
201 "hdr-ddr", "hdr-tsp", "hdr-tsl",
212 int mode; in hdrcap_show() local
216 caps = desc->info.hdr_cap; in hdrcap_show()
217 for_each_set_bit(mode, &caps, 8) { in hdrcap_show()
218 if (mode >= ARRAY_SIZE(hdrcap_strings)) in hdrcap_show()
221 if (!hdrcap_strings[mode]) in hdrcap_show()
225 hdrcap_strings[mode]); in hdrcap_show()
283 if (i3cdev->desc) in i3c_device_uevent()
284 devinfo = i3cdev->desc->info; in i3c_device_uevent()
308 if (dev->type != &i3c_device_type) in i3c_device_match()
313 if (i3c_device_match_id(i3cdev, i3cdrv->id_table)) in i3c_device_match()
322 struct i3c_driver *driver = drv_to_i3cdrv(dev->driver); in i3c_device_probe()
324 return driver->probe(i3cdev); in i3c_device_probe()
330 struct i3c_driver *driver = drv_to_i3cdrv(dev->driver); in i3c_device_remove()
332 if (driver->remove) in i3c_device_remove()
333 driver->remove(i3cdev); in i3c_device_remove()
354 status = bus->addrslots[bitpos / BITS_PER_LONG]; in i3c_bus_get_addr_slot_status_mask()
375 ptr = bus->addrslots + (bitpos / BITS_PER_LONG); in i3c_bus_set_addr_slot_status_mask()
404 * sending it out to the I3C bus. This means that a 7-bit dynamic address needs to be allocated
408 * typically specified by the DT-'s assigned-address property. Lower addresses having higher IBI
411 * the "init_dyn_addr" to switch to its "init_dyn_addr" when it hot-joins the I3C bus. Otherwise,
437 return -ENOMEM; in i3c_bus_get_free_addr()
462 idr_remove(&i3c_bus_idr, i3cbus->id); in i3c_bus_cleanup()
468 int ret, start, end, id = -1; in i3c_bus_init()
470 init_rwsem(&i3cbus->lock); in i3c_bus_init()
471 INIT_LIST_HEAD(&i3cbus->devs.i2c); in i3c_bus_init()
472 INIT_LIST_HEAD(&i3cbus->devs.i3c); in i3c_bus_init()
474 i3cbus->mode = I3C_BUS_MODE_PURE; in i3c_bus_init()
494 i3cbus->id = ret; in i3c_bus_init()
501 [I3C_BUS_MODE_MIXED_FAST] = "mixed-fast",
502 [I3C_BUS_MODE_MIXED_LIMITED] = "mixed-limited",
503 [I3C_BUS_MODE_MIXED_SLOW] = "mixed-slow",
514 if (i3cbus->mode < 0 || in mode_show()
515 i3cbus->mode >= ARRAY_SIZE(i3c_bus_mode_strings) || in mode_show()
516 !i3c_bus_mode_strings[i3cbus->mode]) in mode_show()
519 ret = sprintf(buf, "%s\n", i3c_bus_mode_strings[i3cbus->mode]); in mode_show()
524 static DEVICE_ATTR_RO(mode);
534 ret = sprintf(buf, "%d-%llx\n", i3cbus->id, in current_master_show()
535 i3cbus->cur_master->info.pid); in current_master_show()
550 ret = sprintf(buf, "%ld\n", i3cbus->scl_rate.i3c); in i3c_scl_frequency_show()
565 ret = sprintf(buf, "%ld\n", i3cbus->scl_rate.i2c); in i2c_scl_frequency_show()
576 if (!master || !master->ops) in i3c_set_hotjoin()
577 return -EINVAL; in i3c_set_hotjoin()
579 if (!master->ops->enable_hotjoin || !master->ops->disable_hotjoin) in i3c_set_hotjoin()
580 return -EINVAL; in i3c_set_hotjoin()
582 i3c_bus_normaluse_lock(&master->bus); in i3c_set_hotjoin()
585 ret = master->ops->enable_hotjoin(master); in i3c_set_hotjoin()
587 ret = master->ops->disable_hotjoin(master); in i3c_set_hotjoin()
589 master->hotjoin = enable; in i3c_set_hotjoin()
591 i3c_bus_normaluse_unlock(&master->bus); in i3c_set_hotjoin()
603 if (!i3cbus->cur_master) in hotjoin_store()
604 return -EINVAL; in hotjoin_store()
607 return -EINVAL; in hotjoin_store()
609 ret = i3c_set_hotjoin(i3cbus->cur_master->common.master, res); in hotjoin_store()
617 * i3c_master_enable_hotjoin - Enable hotjoin
629 * i3c_master_disable_hotjoin - Disable hotjoin
646 ret = sysfs_emit(buf, "%d\n", i3cbus->cur_master->common.master->hotjoin); in hotjoin_show()
674 if (master->wq) in i3c_masterdev_release()
675 destroy_workqueue(master->wq); in i3c_masterdev_release()
677 WARN_ON(!list_empty(&bus->devs.i2c) || !list_empty(&bus->devs.i3c)); in i3c_masterdev_release()
680 of_node_put(dev->of_node); in i3c_masterdev_release()
687 static int i3c_bus_set_mode(struct i3c_bus *i3cbus, enum i3c_bus_mode mode, in i3c_bus_set_mode() argument
692 i3cbus->mode = mode; in i3c_bus_set_mode()
694 switch (i3cbus->mode) { in i3c_bus_set_mode()
696 if (!i3cbus->scl_rate.i3c) in i3c_bus_set_mode()
697 i3cbus->scl_rate.i3c = I3C_BUS_TYP_I3C_SCL_RATE; in i3c_bus_set_mode()
701 if (!i3cbus->scl_rate.i3c) in i3c_bus_set_mode()
702 i3cbus->scl_rate.i3c = I3C_BUS_TYP_I3C_SCL_RATE; in i3c_bus_set_mode()
703 if (!i3cbus->scl_rate.i2c) in i3c_bus_set_mode()
704 i3cbus->scl_rate.i2c = max_i2c_scl_rate; in i3c_bus_set_mode()
707 if (!i3cbus->scl_rate.i2c) in i3c_bus_set_mode()
708 i3cbus->scl_rate.i2c = max_i2c_scl_rate; in i3c_bus_set_mode()
709 if (!i3cbus->scl_rate.i3c || in i3c_bus_set_mode()
710 i3cbus->scl_rate.i3c > i3cbus->scl_rate.i2c) in i3c_bus_set_mode()
711 i3cbus->scl_rate.i3c = i3cbus->scl_rate.i2c; in i3c_bus_set_mode()
714 return -EINVAL; in i3c_bus_set_mode()
717 dev_dbg(&master->dev, "i2c-scl = %ld Hz i3c-scl = %ld Hz\n", in i3c_bus_set_mode()
718 i3cbus->scl_rate.i2c, i3cbus->scl_rate.i3c); in i3c_bus_set_mode()
721 * I3C/I2C frequency may have been overridden, check that user-provided in i3c_bus_set_mode()
724 if (i3cbus->scl_rate.i3c > I3C_BUS_MAX_I3C_SCL_RATE || in i3c_bus_set_mode()
725 i3cbus->scl_rate.i2c > I3C_BUS_I2C_FM_PLUS_SCL_RATE) in i3c_bus_set_mode()
726 return -EINVAL; in i3c_bus_set_mode()
740 return &master->i2c; in i3c_master_to_i2c_adapter()
756 return ERR_PTR(-ENOMEM); in i3c_master_alloc_i2c_dev()
758 dev->common.master = master; in i3c_master_alloc_i2c_dev()
759 dev->addr = addr; in i3c_master_alloc_i2c_dev()
760 dev->lvr = lvr; in i3c_master_alloc_i2c_dev()
768 dest->addr = addr; in i3c_ccc_cmd_dest_init()
769 dest->payload.len = payloadlen; in i3c_ccc_cmd_dest_init()
771 dest->payload.data = kzalloc(payloadlen, GFP_KERNEL); in i3c_ccc_cmd_dest_init()
773 dest->payload.data = NULL; in i3c_ccc_cmd_dest_init()
775 return dest->payload.data; in i3c_ccc_cmd_dest_init()
780 kfree(dest->payload.data); in i3c_ccc_cmd_dest_cleanup()
787 cmd->rnw = rnw ? 1 : 0; in i3c_ccc_cmd_init()
788 cmd->id = id; in i3c_ccc_cmd_init()
789 cmd->dests = dests; in i3c_ccc_cmd_init()
790 cmd->ndests = ndests; in i3c_ccc_cmd_init()
791 cmd->err = I3C_ERROR_UNKNOWN; in i3c_ccc_cmd_init()
800 return -EINVAL; in i3c_master_send_ccc_cmd_locked()
802 if (WARN_ON(master->init_done && in i3c_master_send_ccc_cmd_locked()
803 !rwsem_is_locked(&master->bus.lock))) in i3c_master_send_ccc_cmd_locked()
804 return -EINVAL; in i3c_master_send_ccc_cmd_locked()
806 if (!master->ops->send_ccc_cmd) in i3c_master_send_ccc_cmd_locked()
807 return -ENOTSUPP; in i3c_master_send_ccc_cmd_locked()
809 if ((cmd->id & I3C_CCC_DIRECT) && (!cmd->dests || !cmd->ndests)) in i3c_master_send_ccc_cmd_locked()
810 return -EINVAL; in i3c_master_send_ccc_cmd_locked()
812 if (master->ops->supports_ccc_cmd && in i3c_master_send_ccc_cmd_locked()
813 !master->ops->supports_ccc_cmd(master, cmd)) in i3c_master_send_ccc_cmd_locked()
814 return -ENOTSUPP; in i3c_master_send_ccc_cmd_locked()
816 ret = master->ops->send_ccc_cmd(master, cmd); in i3c_master_send_ccc_cmd_locked()
818 if (cmd->err != I3C_ERROR_UNKNOWN) in i3c_master_send_ccc_cmd_locked()
819 return cmd->err; in i3c_master_send_ccc_cmd_locked()
833 i3c_bus_for_each_i2cdev(&master->bus, dev) { in i3c_master_find_i2c_dev_by_addr()
834 if (dev->addr == addr) in i3c_master_find_i2c_dev_by_addr()
842 * i3c_master_get_free_addr() - get a free address on the bus
846 * This function must be called with the bus lock held in write mode.
848 * Return: the first free address starting at @start_addr (included) or -ENOMEM
854 return i3c_bus_get_free_addr(&master->bus, start_addr); in i3c_master_get_free_addr()
862 WARN_ON(i3cdev->desc); in i3c_device_release()
864 of_node_put(i3cdev->dev.of_node); in i3c_device_release()
881 return ERR_PTR(-ENOMEM); in i3c_master_alloc_i3c_dev()
883 dev->common.master = master; in i3c_master_alloc_i3c_dev()
884 dev->info = *info; in i3c_master_alloc_i3c_dev()
885 mutex_init(&dev->ibi_lock); in i3c_master_alloc_i3c_dev()
899 return -EINVAL; in i3c_master_rstdaa_locked()
901 addrstat = i3c_bus_get_addr_slot_status(&master->bus, addr); in i3c_master_rstdaa_locked()
903 return -EINVAL; in i3c_master_rstdaa_locked()
916 * i3c_master_entdaa_locked() - start a DAA (Dynamic Address Assignment)
923 * behind dynamic address assignment has to be handled in the I3C master
926 * This function must be called with the bus lock held in write mode.
956 return -ENOMEM; in i3c_master_enec_disec_locked()
958 events->events = evts; in i3c_master_enec_disec_locked()
971 * i3c_master_disec_locked() - send a DISEC CCC command
979 * This function must be called with the bus lock held in write mode.
992 * i3c_master_enec_locked() - send an ENEC CCC command
1000 * This function must be called with the bus lock held in write mode.
1013 * i3c_master_defslvs_locked() - send a DEFSLVS CCC command
1022 * &i3c_master_controller_ops->bus_init().
1023 * It should also be called if a master ACKed an Hot-Join request and assigned
1024 * a dynamic address to the device joining the bus.
1026 * This function must be called with the bus lock held in write mode.
1044 return -EINVAL; in i3c_master_defslvs_locked()
1050 if (i3cdev == master->this) in i3c_master_defslvs_locked()
1053 if (I3C_BCR_DEVICE_ROLE(i3cdev->info.bcr) == in i3c_master_defslvs_locked()
1067 ndevs - 1)); in i3c_master_defslvs_locked()
1069 return -ENOMEM; in i3c_master_defslvs_locked()
1071 defslvs->count = ndevs; in i3c_master_defslvs_locked()
1072 defslvs->master.bcr = master->this->info.bcr; in i3c_master_defslvs_locked()
1073 defslvs->master.dcr = master->this->info.dcr; in i3c_master_defslvs_locked()
1074 defslvs->master.dyn_addr = master->this->info.dyn_addr << 1; in i3c_master_defslvs_locked()
1075 defslvs->master.static_addr = I3C_BROADCAST_ADDR << 1; in i3c_master_defslvs_locked()
1077 desc = defslvs->slaves; in i3c_master_defslvs_locked()
1079 desc->lvr = i2cdev->lvr; in i3c_master_defslvs_locked()
1080 desc->static_addr = i2cdev->addr << 1; in i3c_master_defslvs_locked()
1086 if (i3cdev == master->this) in i3c_master_defslvs_locked()
1089 desc->bcr = i3cdev->info.bcr; in i3c_master_defslvs_locked()
1090 desc->dcr = i3cdev->info.dcr; in i3c_master_defslvs_locked()
1091 desc->dyn_addr = i3cdev->info.dyn_addr << 1; in i3c_master_defslvs_locked()
1092 desc->static_addr = i3cdev->info.static_addr << 1; in i3c_master_defslvs_locked()
1113 return -EINVAL; in i3c_master_setda_locked()
1117 return -ENOMEM; in i3c_master_setda_locked()
1119 setda->addr = newaddr << 1; in i3c_master_setda_locked()
1149 mrl = i3c_ccc_cmd_dest_init(&dest, info->dyn_addr, sizeof(*mrl)); in i3c_master_getmrl_locked()
1151 return -ENOMEM; in i3c_master_getmrl_locked()
1157 if (!(info->bcr & I3C_BCR_IBI_PAYLOAD)) in i3c_master_getmrl_locked()
1158 dest.payload.len -= 1; in i3c_master_getmrl_locked()
1167 info->max_ibi_len = mrl->ibi_len; in i3c_master_getmrl_locked()
1170 info->max_read_len = be16_to_cpu(mrl->read_len); in i3c_master_getmrl_locked()
1173 ret = -EIO; in i3c_master_getmrl_locked()
1191 mwl = i3c_ccc_cmd_dest_init(&dest, info->dyn_addr, sizeof(*mwl)); in i3c_master_getmwl_locked()
1193 return -ENOMEM; in i3c_master_getmwl_locked()
1201 ret = -EIO; in i3c_master_getmwl_locked()
1205 info->max_write_len = be16_to_cpu(mwl->len); in i3c_master_getmwl_locked()
1221 getmaxds = i3c_ccc_cmd_dest_init(&dest, info->dyn_addr, in i3c_master_getmxds_locked()
1224 return -ENOMEM; in i3c_master_getmxds_locked()
1232 ret = -EIO; in i3c_master_getmxds_locked()
1236 info->max_read_ds = getmaxds->maxrd; in i3c_master_getmxds_locked()
1237 info->max_write_ds = getmaxds->maxwr; in i3c_master_getmxds_locked()
1239 info->max_read_turnaround = getmaxds->maxrdturn[0] | in i3c_master_getmxds_locked()
1240 ((u32)getmaxds->maxrdturn[1] << 8) | in i3c_master_getmxds_locked()
1241 ((u32)getmaxds->maxrdturn[2] << 16); in i3c_master_getmxds_locked()
1257 gethdrcap = i3c_ccc_cmd_dest_init(&dest, info->dyn_addr, in i3c_master_gethdrcap_locked()
1260 return -ENOMEM; in i3c_master_gethdrcap_locked()
1268 ret = -EIO; in i3c_master_gethdrcap_locked()
1272 info->hdr_cap = gethdrcap->modes; in i3c_master_gethdrcap_locked()
1288 getpid = i3c_ccc_cmd_dest_init(&dest, info->dyn_addr, sizeof(*getpid)); in i3c_master_getpid_locked()
1290 return -ENOMEM; in i3c_master_getpid_locked()
1297 info->pid = 0; in i3c_master_getpid_locked()
1298 for (i = 0; i < sizeof(getpid->pid); i++) { in i3c_master_getpid_locked()
1299 int sft = (sizeof(getpid->pid) - i - 1) * 8; in i3c_master_getpid_locked()
1301 info->pid |= (u64)getpid->pid[i] << sft; in i3c_master_getpid_locked()
1318 getbcr = i3c_ccc_cmd_dest_init(&dest, info->dyn_addr, sizeof(*getbcr)); in i3c_master_getbcr_locked()
1320 return -ENOMEM; in i3c_master_getbcr_locked()
1327 info->bcr = getbcr->bcr; in i3c_master_getbcr_locked()
1343 getdcr = i3c_ccc_cmd_dest_init(&dest, info->dyn_addr, sizeof(*getdcr)); in i3c_master_getdcr_locked()
1345 return -ENOMEM; in i3c_master_getdcr_locked()
1352 info->dcr = getdcr->dcr; in i3c_master_getdcr_locked()
1366 if (!dev->info.dyn_addr) in i3c_master_retrieve_dev_info()
1367 return -EINVAL; in i3c_master_retrieve_dev_info()
1369 slot_status = i3c_bus_get_addr_slot_status(&master->bus, in i3c_master_retrieve_dev_info()
1370 dev->info.dyn_addr); in i3c_master_retrieve_dev_info()
1373 return -EINVAL; in i3c_master_retrieve_dev_info()
1375 ret = i3c_master_getpid_locked(master, &dev->info); in i3c_master_retrieve_dev_info()
1379 ret = i3c_master_getbcr_locked(master, &dev->info); in i3c_master_retrieve_dev_info()
1383 ret = i3c_master_getdcr_locked(master, &dev->info); in i3c_master_retrieve_dev_info()
1387 if (dev->info.bcr & I3C_BCR_MAX_DATA_SPEED_LIM) { in i3c_master_retrieve_dev_info()
1388 ret = i3c_master_getmxds_locked(master, &dev->info); in i3c_master_retrieve_dev_info()
1393 if (dev->info.bcr & I3C_BCR_IBI_PAYLOAD) in i3c_master_retrieve_dev_info()
1394 dev->info.max_ibi_len = 1; in i3c_master_retrieve_dev_info()
1396 i3c_master_getmrl_locked(master, &dev->info); in i3c_master_retrieve_dev_info()
1397 i3c_master_getmwl_locked(master, &dev->info); in i3c_master_retrieve_dev_info()
1399 if (dev->info.bcr & I3C_BCR_HDR_CAP) { in i3c_master_retrieve_dev_info()
1400 ret = i3c_master_gethdrcap_locked(master, &dev->info); in i3c_master_retrieve_dev_info()
1412 if (dev->info.static_addr) in i3c_master_put_i3c_addrs()
1413 i3c_bus_set_addr_slot_status(&master->bus, in i3c_master_put_i3c_addrs()
1414 dev->info.static_addr, in i3c_master_put_i3c_addrs()
1417 if (dev->info.dyn_addr) in i3c_master_put_i3c_addrs()
1418 i3c_bus_set_addr_slot_status(&master->bus, dev->info.dyn_addr, in i3c_master_put_i3c_addrs()
1421 if (dev->boardinfo && dev->boardinfo->init_dyn_addr) in i3c_master_put_i3c_addrs()
1422 i3c_bus_set_addr_slot_status(&master->bus, dev->boardinfo->init_dyn_addr, in i3c_master_put_i3c_addrs()
1431 if (!dev->info.static_addr && !dev->info.dyn_addr) in i3c_master_get_i3c_addrs()
1434 if (dev->info.static_addr) { in i3c_master_get_i3c_addrs()
1435 status = i3c_bus_get_addr_slot_status(&master->bus, in i3c_master_get_i3c_addrs()
1436 dev->info.static_addr); in i3c_master_get_i3c_addrs()
1437 /* Since static address and assigned dynamic address can be in i3c_master_get_i3c_addrs()
1441 dev->info.static_addr != dev->boardinfo->init_dyn_addr) in i3c_master_get_i3c_addrs()
1442 return -EBUSY; in i3c_master_get_i3c_addrs()
1444 i3c_bus_set_addr_slot_status(&master->bus, in i3c_master_get_i3c_addrs()
1445 dev->info.static_addr, in i3c_master_get_i3c_addrs()
1450 * ->init_dyn_addr should have been reserved before that, so, if we're in i3c_master_get_i3c_addrs()
1451 * trying to apply a pre-reserved dynamic address, we should not try in i3c_master_get_i3c_addrs()
1454 if (dev->info.dyn_addr && in i3c_master_get_i3c_addrs()
1455 (!dev->boardinfo || in i3c_master_get_i3c_addrs()
1456 dev->boardinfo->init_dyn_addr != dev->info.dyn_addr)) { in i3c_master_get_i3c_addrs()
1457 status = i3c_bus_get_addr_slot_status(&master->bus, in i3c_master_get_i3c_addrs()
1458 dev->info.dyn_addr); in i3c_master_get_i3c_addrs()
1462 i3c_bus_set_addr_slot_status(&master->bus, dev->info.dyn_addr, in i3c_master_get_i3c_addrs()
1469 if (dev->info.static_addr) in i3c_master_get_i3c_addrs()
1470 i3c_bus_set_addr_slot_status(&master->bus, in i3c_master_get_i3c_addrs()
1471 dev->info.static_addr, in i3c_master_get_i3c_addrs()
1474 return -EBUSY; in i3c_master_get_i3c_addrs()
1486 if (!dev->info.static_addr && !dev->info.dyn_addr) in i3c_master_attach_i3c_dev()
1494 if (master->this != dev && master->ops->attach_i3c_dev) { in i3c_master_attach_i3c_dev()
1495 ret = master->ops->attach_i3c_dev(dev); in i3c_master_attach_i3c_dev()
1502 list_add_tail(&dev->common.node, &master->bus.devs.i3c); in i3c_master_attach_i3c_dev()
1513 if (dev->info.dyn_addr != old_dyn_addr) { in i3c_master_reattach_i3c_dev()
1514 i3c_bus_set_addr_slot_status(&master->bus, in i3c_master_reattach_i3c_dev()
1515 dev->info.dyn_addr, in i3c_master_reattach_i3c_dev()
1518 i3c_bus_set_addr_slot_status(&master->bus, old_dyn_addr, in i3c_master_reattach_i3c_dev()
1522 if (master->ops->reattach_i3c_dev) { in i3c_master_reattach_i3c_dev()
1523 ret = master->ops->reattach_i3c_dev(dev, old_dyn_addr); in i3c_master_reattach_i3c_dev()
1538 if (master->this != dev && master->ops->detach_i3c_dev) in i3c_master_detach_i3c_dev()
1539 master->ops->detach_i3c_dev(dev); in i3c_master_detach_i3c_dev()
1542 list_del(&dev->common.node); in i3c_master_detach_i3c_dev()
1550 if (master->ops->attach_i2c_dev) { in i3c_master_attach_i2c_dev()
1551 ret = master->ops->attach_i2c_dev(dev); in i3c_master_attach_i2c_dev()
1556 list_add_tail(&dev->common.node, &master->bus.devs.i2c); in i3c_master_attach_i2c_dev()
1565 list_del(&dev->common.node); in i3c_master_detach_i2c_dev()
1567 if (master->ops->detach_i2c_dev) in i3c_master_detach_i2c_dev()
1568 master->ops->detach_i2c_dev(dev); in i3c_master_detach_i2c_dev()
1575 .static_addr = boardinfo->static_addr, in i3c_master_early_i3c_dev_add()
1576 .pid = boardinfo->pid, in i3c_master_early_i3c_dev_add()
1583 return -ENOMEM; in i3c_master_early_i3c_dev_add()
1585 i3cdev->boardinfo = boardinfo; in i3c_master_early_i3c_dev_add()
1591 ret = i3c_master_setdasa_locked(master, i3cdev->info.static_addr, in i3c_master_early_i3c_dev_add()
1592 i3cdev->boardinfo->init_dyn_addr); in i3c_master_early_i3c_dev_add()
1596 i3cdev->info.dyn_addr = i3cdev->boardinfo->init_dyn_addr; in i3c_master_early_i3c_dev_add()
1608 i3c_master_rstdaa_locked(master, i3cdev->boardinfo->init_dyn_addr); in i3c_master_early_i3c_dev_add()
1623 if (!master->init_done) in i3c_master_register_new_i3c_devs()
1626 i3c_bus_for_each_i3cdev(&master->bus, desc) { in i3c_master_register_new_i3c_devs()
1627 if (desc->dev || !desc->info.dyn_addr || desc == master->this) in i3c_master_register_new_i3c_devs()
1630 desc->dev = kzalloc(sizeof(*desc->dev), GFP_KERNEL); in i3c_master_register_new_i3c_devs()
1631 if (!desc->dev) in i3c_master_register_new_i3c_devs()
1634 desc->dev->bus = &master->bus; in i3c_master_register_new_i3c_devs()
1635 desc->dev->desc = desc; in i3c_master_register_new_i3c_devs()
1636 desc->dev->dev.parent = &master->dev; in i3c_master_register_new_i3c_devs()
1637 desc->dev->dev.type = &i3c_device_type; in i3c_master_register_new_i3c_devs()
1638 desc->dev->dev.bus = &i3c_bus_type; in i3c_master_register_new_i3c_devs()
1639 desc->dev->dev.release = i3c_device_release; in i3c_master_register_new_i3c_devs()
1640 dev_set_name(&desc->dev->dev, "%d-%llx", master->bus.id, in i3c_master_register_new_i3c_devs()
1641 desc->info.pid); in i3c_master_register_new_i3c_devs()
1643 if (desc->boardinfo) in i3c_master_register_new_i3c_devs()
1644 desc->dev->dev.of_node = desc->boardinfo->of_node; in i3c_master_register_new_i3c_devs()
1646 ret = device_register(&desc->dev->dev); in i3c_master_register_new_i3c_devs()
1648 dev_err(&master->dev, in i3c_master_register_new_i3c_devs()
1650 put_device(&desc->dev->dev); in i3c_master_register_new_i3c_devs()
1656 * i3c_master_do_daa() - do a DAA (Dynamic Address Assignment)
1666 * This function must be called with the bus lock held in write mode.
1674 i3c_bus_maintenance_lock(&master->bus); in i3c_master_do_daa()
1675 ret = master->ops->do_daa(master); in i3c_master_do_daa()
1676 i3c_bus_maintenance_unlock(&master->bus); in i3c_master_do_daa()
1681 i3c_bus_normaluse_lock(&master->bus); in i3c_master_do_daa()
1683 i3c_bus_normaluse_unlock(&master->bus); in i3c_master_do_daa()
1690 * i3c_master_set_info() - set master device information
1695 * &i3c_master_controller_ops->bus_init().
1700 * - &i3c_device_info->dyn_addr
1701 * - &i3c_device_info->bcr
1702 * - &i3c_device_info->dcr
1703 * - &i3c_device_info->pid
1704 * - &i3c_device_info->hdr_cap if %I3C_BCR_HDR_CAP bit is set in
1705 * &i3c_device_info->bcr
1707 * This function must be called with the bus lock held in maintenance mode.
1710 * information can be checked, but we can at least make sure @info->dyn_addr
1711 * and @info->bcr are correct), -EINVAL otherwise.
1719 if (!i3c_bus_dev_addr_is_avail(&master->bus, info->dyn_addr)) in i3c_master_set_info()
1720 return -EINVAL; in i3c_master_set_info()
1722 if (I3C_BCR_DEVICE_ROLE(info->bcr) == I3C_BCR_I3C_MASTER && in i3c_master_set_info()
1723 master->secondary) in i3c_master_set_info()
1724 return -EINVAL; in i3c_master_set_info()
1726 if (master->this) in i3c_master_set_info()
1727 return -EINVAL; in i3c_master_set_info()
1733 master->this = i3cdev; in i3c_master_set_info()
1734 master->bus.cur_master = master->this; in i3c_master_set_info()
1754 list_for_each_entry_safe(i3cdev, i3ctmp, &master->bus.devs.i3c, in i3c_master_detach_free_devs()
1758 if (i3cdev->boardinfo && i3cdev->boardinfo->init_dyn_addr) in i3c_master_detach_free_devs()
1759 i3c_bus_set_addr_slot_status(&master->bus, in i3c_master_detach_free_devs()
1760 i3cdev->boardinfo->init_dyn_addr, in i3c_master_detach_free_devs()
1766 list_for_each_entry_safe(i2cdev, i2ctmp, &master->bus.devs.i2c, in i3c_master_detach_free_devs()
1769 i3c_bus_set_addr_slot_status(&master->bus, in i3c_master_detach_free_devs()
1770 i2cdev->addr, in i3c_master_detach_free_devs()
1777 * i3c_master_bus_init() - initialize an I3C bus
1786 * 2. Call &i3c_master_controller_ops->bus_init() method to initialize
1787 * the master controller. That's usually where the bus mode is selected
1790 * 3. Instruct all devices on the bus to drop their dynamic address. This is
1797 * also have static_addr, try to pre-assign dynamic addresses requested by
1801 * 6. Do a DAA (Dynamic Address Assignment) to assign dynamic addresses to all
1820 list_for_each_entry(i2cboardinfo, &master->boardinfo.i2c, node) { in i3c_master_bus_init()
1821 status = i3c_bus_get_addr_slot_status(&master->bus, in i3c_master_bus_init()
1822 i2cboardinfo->base.addr); in i3c_master_bus_init()
1824 ret = -EBUSY; in i3c_master_bus_init()
1828 i3c_bus_set_addr_slot_status(&master->bus, in i3c_master_bus_init()
1829 i2cboardinfo->base.addr, in i3c_master_bus_init()
1833 i2cboardinfo->base.addr, in i3c_master_bus_init()
1834 i2cboardinfo->lvr); in i3c_master_bus_init()
1848 * Now execute the controller specific ->bus_init() routine, which in i3c_master_bus_init()
1851 ret = master->ops->bus_init(master); in i3c_master_bus_init()
1856 * The master device should have been instantiated in ->bus_init(), in i3c_master_bus_init()
1859 if (!master->this) { in i3c_master_bus_init()
1860 dev_err(&master->dev, in i3c_master_bus_init()
1861 "master_set_info() was not called in ->bus_init()\n"); in i3c_master_bus_init()
1862 ret = -EINVAL; in i3c_master_bus_init()
1866 if (master->ops->set_speed) { in i3c_master_bus_init()
1867 ret = master->ops->set_speed(master, I3C_OPEN_DRAIN_SLOW_SPEED); in i3c_master_bus_init()
1873 * Reset all dynamic address that may have been assigned before in i3c_master_bus_init()
1880 if (master->ops->set_speed) { in i3c_master_bus_init()
1881 ret = master->ops->set_speed(master, I3C_OPEN_DRAIN_NORMAL_SPEED); in i3c_master_bus_init()
1894 * Reserve init_dyn_addr first, and then try to pre-assign dynamic in i3c_master_bus_init()
1896 * In case pre-assign dynamic address fails, setting dynamic address to in i3c_master_bus_init()
1900 list_for_each_entry(i3cboardinfo, &master->boardinfo.i3c, node) { in i3c_master_bus_init()
1903 * We don't reserve a dynamic address for devices that in i3c_master_bus_init()
1906 if (!i3cboardinfo->init_dyn_addr) in i3c_master_bus_init()
1909 ret = i3c_bus_get_addr_slot_status(&master->bus, in i3c_master_bus_init()
1910 i3cboardinfo->init_dyn_addr); in i3c_master_bus_init()
1912 ret = -EBUSY; in i3c_master_bus_init()
1917 i3c_bus_set_addr_slot_status_mask(&master->bus, in i3c_master_bus_init()
1918 i3cboardinfo->init_dyn_addr, in i3c_master_bus_init()
1925 * DAA happens, and the requested dynamic address will in i3c_master_bus_init()
1930 if (i3cboardinfo->static_addr) in i3c_master_bus_init()
1944 if (master->ops->bus_cleanup) in i3c_master_bus_init()
1945 master->ops->bus_cleanup(master); in i3c_master_bus_init()
1955 if (master->ops->bus_cleanup) in i3c_master_bus_cleanup()
1956 master->ops->bus_cleanup(master); in i3c_master_bus_cleanup()
1963 struct i3c_master_controller *master = i3cdev->common.master; in i3c_master_attach_boardinfo()
1966 list_for_each_entry(i3cboardinfo, &master->boardinfo.i3c, node) { in i3c_master_attach_boardinfo()
1967 if (i3cdev->info.pid != i3cboardinfo->pid) in i3c_master_attach_boardinfo()
1970 i3cdev->boardinfo = i3cboardinfo; in i3c_master_attach_boardinfo()
1971 i3cdev->info.static_addr = i3cboardinfo->static_addr; in i3c_master_attach_boardinfo()
1982 i3c_bus_for_each_i3cdev(&master->bus, i3cdev) { in i3c_master_search_i3c_dev_duplicate()
1983 if (i3cdev != refdev && i3cdev->info.pid == refdev->info.pid) in i3c_master_search_i3c_dev_duplicate()
1991 * i3c_master_add_i3c_dev_locked() - add an I3C slave to the bus
1993 * @addr: I3C slave dynamic address assigned to the device
2002 * This function must be called with the bus lock held in write mode.
2017 return -EINVAL; in i3c_master_add_i3c_dev_locked()
2035 newdev->dev = olddev->dev; in i3c_master_add_i3c_dev_locked()
2036 if (newdev->dev) in i3c_master_add_i3c_dev_locked()
2037 newdev->dev->desc = newdev; in i3c_master_add_i3c_dev_locked()
2045 mutex_lock(&olddev->ibi_lock); in i3c_master_add_i3c_dev_locked()
2046 if (olddev->ibi) { in i3c_master_add_i3c_dev_locked()
2047 ibireq.handler = olddev->ibi->handler; in i3c_master_add_i3c_dev_locked()
2048 ibireq.max_payload_len = olddev->ibi->max_payload_len; in i3c_master_add_i3c_dev_locked()
2049 ibireq.num_slots = olddev->ibi->num_slots; in i3c_master_add_i3c_dev_locked()
2051 if (olddev->ibi->enabled) in i3c_master_add_i3c_dev_locked()
2057 * So, update the olddev->ibi->enabled flag to false in i3c_master_add_i3c_dev_locked()
2060 olddev->ibi->enabled = false; in i3c_master_add_i3c_dev_locked()
2063 mutex_unlock(&olddev->ibi_lock); in i3c_master_add_i3c_dev_locked()
2065 old_dyn_addr = olddev->info.dyn_addr; in i3c_master_add_i3c_dev_locked()
2072 * Depending on our previous state, the expected dynamic address might in i3c_master_add_i3c_dev_locked()
2074 * - if the device already had a dynamic address assigned, let's try to in i3c_master_add_i3c_dev_locked()
2075 * re-apply this one in i3c_master_add_i3c_dev_locked()
2076 * - if the device did not have a dynamic address and the firmware in i3c_master_add_i3c_dev_locked()
2078 * - in any other case, keep the address automatically assigned by the in i3c_master_add_i3c_dev_locked()
2081 if (old_dyn_addr && old_dyn_addr != newdev->info.dyn_addr) in i3c_master_add_i3c_dev_locked()
2083 else if (newdev->boardinfo && newdev->boardinfo->init_dyn_addr) in i3c_master_add_i3c_dev_locked()
2084 expected_dyn_addr = newdev->boardinfo->init_dyn_addr; in i3c_master_add_i3c_dev_locked()
2086 expected_dyn_addr = newdev->info.dyn_addr; in i3c_master_add_i3c_dev_locked()
2088 if (newdev->info.dyn_addr != expected_dyn_addr && in i3c_master_add_i3c_dev_locked()
2089 i3c_bus_get_addr_slot_status(&master->bus, expected_dyn_addr) == I3C_ADDR_SLOT_FREE) { in i3c_master_add_i3c_dev_locked()
2091 * Try to apply the expected dynamic address. If it fails, keep in i3c_master_add_i3c_dev_locked()
2095 newdev->info.dyn_addr, in i3c_master_add_i3c_dev_locked()
2098 old_dyn_addr = newdev->info.dyn_addr; in i3c_master_add_i3c_dev_locked()
2099 newdev->info.dyn_addr = expected_dyn_addr; in i3c_master_add_i3c_dev_locked()
2102 dev_err(&master->dev, in i3c_master_add_i3c_dev_locked()
2104 master->bus.id, newdev->info.pid); in i3c_master_add_i3c_dev_locked()
2116 mutex_lock(&newdev->ibi_lock); in i3c_master_add_i3c_dev_locked()
2119 dev_err(&master->dev, in i3c_master_add_i3c_dev_locked()
2120 "Failed to request IBI on device %d-%llx", in i3c_master_add_i3c_dev_locked()
2121 master->bus.id, newdev->info.pid); in i3c_master_add_i3c_dev_locked()
2125 dev_err(&master->dev, in i3c_master_add_i3c_dev_locked()
2126 "Failed to re-enable IBI on device %d-%llx", in i3c_master_add_i3c_dev_locked()
2127 master->bus.id, newdev->info.pid); in i3c_master_add_i3c_dev_locked()
2129 mutex_unlock(&newdev->ibi_lock); in i3c_master_add_i3c_dev_locked()
2135 if (newdev->dev && newdev->dev->desc) in i3c_master_add_i3c_dev_locked()
2136 newdev->dev->desc = NULL; in i3c_master_add_i3c_dev_locked()
2154 struct device *dev = &master->dev; in of_i3c_master_add_i2c_boardinfo()
2159 return -ENOMEM; in of_i3c_master_add_i2c_boardinfo()
2161 ret = of_i2c_get_board_info(dev, node, &boardinfo->base); in of_i3c_master_add_i2c_boardinfo()
2166 * The I3C Specification does not clearly say I2C devices with 10-bit in of_i3c_master_add_i2c_boardinfo()
2170 if (boardinfo->base.flags & I2C_CLIENT_TEN) { in of_i3c_master_add_i2c_boardinfo()
2172 return -ENOTSUPP; in of_i3c_master_add_i2c_boardinfo()
2176 boardinfo->lvr = reg[2]; in of_i3c_master_add_i2c_boardinfo()
2178 list_add_tail(&boardinfo->node, &master->boardinfo.i2c); in of_i3c_master_add_i2c_boardinfo()
2189 struct device *dev = &master->dev; in of_i3c_master_add_i3c_boardinfo()
2195 return -ENOMEM; in of_i3c_master_add_i3c_boardinfo()
2199 return -EINVAL; in of_i3c_master_add_i3c_boardinfo()
2201 addrstatus = i3c_bus_get_addr_slot_status(&master->bus, in of_i3c_master_add_i3c_boardinfo()
2204 return -EINVAL; in of_i3c_master_add_i3c_boardinfo()
2207 boardinfo->static_addr = reg[0]; in of_i3c_master_add_i3c_boardinfo()
2209 if (!of_property_read_u32(node, "assigned-address", &init_dyn_addr)) { in of_i3c_master_add_i3c_boardinfo()
2211 return -EINVAL; in of_i3c_master_add_i3c_boardinfo()
2213 addrstatus = i3c_bus_get_addr_slot_status(&master->bus, in of_i3c_master_add_i3c_boardinfo()
2216 return -EINVAL; in of_i3c_master_add_i3c_boardinfo()
2219 boardinfo->pid = ((u64)reg[1] << 32) | reg[2]; in of_i3c_master_add_i3c_boardinfo()
2221 if ((boardinfo->pid & GENMASK_ULL(63, 48)) || in of_i3c_master_add_i3c_boardinfo()
2222 I3C_PID_RND_LOWER_32BITS(boardinfo->pid)) in of_i3c_master_add_i3c_boardinfo()
2223 return -EINVAL; in of_i3c_master_add_i3c_boardinfo()
2225 boardinfo->init_dyn_addr = init_dyn_addr; in of_i3c_master_add_i3c_boardinfo()
2226 boardinfo->of_node = of_node_get(node); in of_i3c_master_add_i3c_boardinfo()
2227 list_add_tail(&boardinfo->node, &master->boardinfo.i3c); in of_i3c_master_add_i3c_boardinfo()
2239 return -EINVAL; in of_i3c_master_add_dev()
2259 struct device *dev = &master->dev; in of_populate_i3c_bus()
2260 struct device_node *i3cbus_np = dev->of_node; in of_populate_i3c_bus()
2281 if (!of_property_read_u32(i3cbus_np, "i2c-scl-hz", &val)) in of_populate_i3c_bus()
2282 master->bus.scl_rate.i2c = val; in of_populate_i3c_bus()
2284 if (!of_property_read_u32(i3cbus_np, "i3c-scl-hz", &val)) in of_populate_i3c_bus()
2285 master->bus.scl_rate.i3c = val; in of_populate_i3c_bus()
2299 return -EINVAL; in i3c_master_i2c_adapter_xfer()
2301 if (!master->ops->i2c_xfers) in i3c_master_i2c_adapter_xfer()
2302 return -ENOTSUPP; in i3c_master_i2c_adapter_xfer()
2308 return -ENOTSUPP; in i3c_master_i2c_adapter_xfer()
2311 i3c_bus_normaluse_lock(&master->bus); in i3c_master_i2c_adapter_xfer()
2314 ret = -ENOENT; in i3c_master_i2c_adapter_xfer()
2316 ret = master->ops->i2c_xfers(dev, xfers, nxfers); in i3c_master_i2c_adapter_xfer()
2317 i3c_bus_normaluse_unlock(&master->bus); in i3c_master_i2c_adapter_xfer()
2329 /* Fall back to no spike filters and FM bus mode. */ in i3c_master_i2c_get_lvr()
2332 if (client->dev.of_node) { in i3c_master_i2c_get_lvr()
2335 if (!of_property_read_u32_array(client->dev.of_node, "reg", in i3c_master_i2c_get_lvr()
2351 if (i3c_master_find_i2c_dev_by_addr(master, client->addr)) in i3c_master_i2c_attach()
2354 status = i3c_bus_get_addr_slot_status(&master->bus, client->addr); in i3c_master_i2c_attach()
2356 return -EBUSY; in i3c_master_i2c_attach()
2358 i3c_bus_set_addr_slot_status(&master->bus, client->addr, in i3c_master_i2c_attach()
2361 i2cdev = i3c_master_alloc_i2c_dev(master, client->addr, in i3c_master_i2c_attach()
2377 i3c_bus_set_addr_slot_status(&master->bus, client->addr, in i3c_master_i2c_attach()
2388 dev = i3c_master_find_i2c_dev_by_addr(master, client->addr); in i3c_master_i2c_detach()
2390 return -ENODEV; in i3c_master_i2c_detach()
2393 i3c_bus_set_addr_slot_status(&master->bus, dev->addr, in i3c_master_i2c_detach()
2414 if (dev->type != &i2c_client_type) in i3c_i2c_notifier_call()
2418 adap = client->adapter; in i3c_i2c_notifier_call()
2420 if (adap->algo != &i3c_master_i2c_algo) in i3c_i2c_notifier_call()
2425 i3c_bus_maintenance_lock(&master->bus); in i3c_i2c_notifier_call()
2434 i3c_bus_maintenance_unlock(&master->bus); in i3c_i2c_notifier_call()
2450 adap->dev.parent = master->dev.parent; in i3c_master_i2c_adapter_init()
2451 adap->owner = master->dev.parent->driver->owner; in i3c_master_i2c_adapter_init()
2452 adap->algo = &i3c_master_i2c_algo; in i3c_master_i2c_adapter_init()
2453 strncpy(adap->name, dev_name(master->dev.parent), sizeof(adap->name)); in i3c_master_i2c_adapter_init()
2456 adap->timeout = 1000; in i3c_master_i2c_adapter_init()
2457 adap->retries = 3; in i3c_master_i2c_adapter_init()
2467 list_for_each_entry(i2cboardinfo, &master->boardinfo.i2c, node) { in i3c_master_i2c_adapter_init()
2469 i2cboardinfo->base.addr); in i3c_master_i2c_adapter_init()
2472 i2cdev->dev = i2c_new_client_device(adap, &i2cboardinfo->base); in i3c_master_i2c_adapter_init()
2482 i2c_del_adapter(&master->i2c); in i3c_master_i2c_adapter_cleanup()
2484 i3c_bus_for_each_i2cdev(&master->bus, i2cdev) in i3c_master_i2c_adapter_cleanup()
2485 i2cdev->dev = NULL; in i3c_master_i2c_adapter_cleanup()
2492 i3c_bus_for_each_i3cdev(&master->bus, i3cdev) { in i3c_master_unregister_i3c_devs()
2493 if (!i3cdev->dev) in i3c_master_unregister_i3c_devs()
2496 i3cdev->dev->desc = NULL; in i3c_master_unregister_i3c_devs()
2497 if (device_is_registered(&i3cdev->dev->dev)) in i3c_master_unregister_i3c_devs()
2498 device_unregister(&i3cdev->dev->dev); in i3c_master_unregister_i3c_devs()
2500 put_device(&i3cdev->dev->dev); in i3c_master_unregister_i3c_devs()
2501 i3cdev->dev = NULL; in i3c_master_unregister_i3c_devs()
2506 * i3c_master_queue_ibi() - Queue an IBI
2515 atomic_inc(&dev->ibi->pending_ibis); in i3c_master_queue_ibi()
2516 queue_work(dev->common.master->wq, &slot->work); in i3c_master_queue_ibi()
2524 struct i3c_dev_desc *dev = slot->dev; in i3c_master_handle_ibi()
2528 payload.data = slot->data; in i3c_master_handle_ibi()
2529 payload.len = slot->len; in i3c_master_handle_ibi()
2531 if (dev->dev) in i3c_master_handle_ibi()
2532 dev->ibi->handler(dev->dev, &payload); in i3c_master_handle_ibi()
2534 master->ops->recycle_ibi_slot(dev, slot); in i3c_master_handle_ibi()
2535 if (atomic_dec_and_test(&dev->ibi->pending_ibis)) in i3c_master_handle_ibi()
2536 complete(&dev->ibi->all_ibis_handled); in i3c_master_handle_ibi()
2542 slot->dev = dev; in i3c_master_init_ibi_slot()
2543 INIT_WORK(&slot->work, i3c_master_handle_ibi); in i3c_master_init_ibi_slot()
2561 * i3c_generic_ibi_free_pool() - Free a generic IBI pool
2571 while (!list_empty(&pool->free_slots)) { in i3c_generic_ibi_free_pool()
2572 slot = list_first_entry(&pool->free_slots, in i3c_generic_ibi_free_pool()
2574 list_del(&slot->node); in i3c_generic_ibi_free_pool()
2582 WARN_ON(nslots != pool->num_slots); in i3c_generic_ibi_free_pool()
2584 kfree(pool->payload_buf); in i3c_generic_ibi_free_pool()
2585 kfree(pool->slots); in i3c_generic_ibi_free_pool()
2591 * i3c_generic_ibi_alloc_pool() - Create a generic IBI pool
2610 return ERR_PTR(-ENOMEM); in i3c_generic_ibi_alloc_pool()
2612 spin_lock_init(&pool->lock); in i3c_generic_ibi_alloc_pool()
2613 INIT_LIST_HEAD(&pool->free_slots); in i3c_generic_ibi_alloc_pool()
2614 INIT_LIST_HEAD(&pool->pending); in i3c_generic_ibi_alloc_pool()
2616 pool->slots = kcalloc(req->num_slots, sizeof(*slot), GFP_KERNEL); in i3c_generic_ibi_alloc_pool()
2617 if (!pool->slots) { in i3c_generic_ibi_alloc_pool()
2618 ret = -ENOMEM; in i3c_generic_ibi_alloc_pool()
2622 if (req->max_payload_len) { in i3c_generic_ibi_alloc_pool()
2623 pool->payload_buf = kcalloc(req->num_slots, in i3c_generic_ibi_alloc_pool()
2624 req->max_payload_len, GFP_KERNEL); in i3c_generic_ibi_alloc_pool()
2625 if (!pool->payload_buf) { in i3c_generic_ibi_alloc_pool()
2626 ret = -ENOMEM; in i3c_generic_ibi_alloc_pool()
2631 for (i = 0; i < req->num_slots; i++) { in i3c_generic_ibi_alloc_pool()
2632 slot = &pool->slots[i]; in i3c_generic_ibi_alloc_pool()
2633 i3c_master_init_ibi_slot(dev, &slot->base); in i3c_generic_ibi_alloc_pool()
2635 if (req->max_payload_len) in i3c_generic_ibi_alloc_pool()
2636 slot->base.data = pool->payload_buf + in i3c_generic_ibi_alloc_pool()
2637 (i * req->max_payload_len); in i3c_generic_ibi_alloc_pool()
2639 list_add_tail(&slot->node, &pool->free_slots); in i3c_generic_ibi_alloc_pool()
2640 pool->num_slots++; in i3c_generic_ibi_alloc_pool()
2652 * i3c_generic_ibi_get_free_slot() - Get a free slot from a generic IBI pool
2667 spin_lock_irqsave(&pool->lock, flags); in i3c_generic_ibi_get_free_slot()
2668 slot = list_first_entry_or_null(&pool->free_slots, in i3c_generic_ibi_get_free_slot()
2671 list_del(&slot->node); in i3c_generic_ibi_get_free_slot()
2672 spin_unlock_irqrestore(&pool->lock, flags); in i3c_generic_ibi_get_free_slot()
2674 return slot ? &slot->base : NULL; in i3c_generic_ibi_get_free_slot()
2679 * i3c_generic_ibi_recycle_slot() - Return a slot to a generic IBI pool
2684 * master driver struct_master_controller_ops->recycle_ibi() method.
2696 spin_lock_irqsave(&pool->lock, flags); in i3c_generic_ibi_recycle_slot()
2697 list_add_tail(&slot->node, &pool->free_slots); in i3c_generic_ibi_recycle_slot()
2698 spin_unlock_irqrestore(&pool->lock, flags); in i3c_generic_ibi_recycle_slot()
2704 if (!ops || !ops->bus_init || !ops->priv_xfers || in i3c_master_check_ops()
2705 !ops->send_ccc_cmd || !ops->do_daa || !ops->i2c_xfers) in i3c_master_check_ops()
2706 return -EINVAL; in i3c_master_check_ops()
2708 if (ops->request_ibi && in i3c_master_check_ops()
2709 (!ops->enable_ibi || !ops->disable_ibi || !ops->free_ibi || in i3c_master_check_ops()
2710 !ops->recycle_ibi_slot)) in i3c_master_check_ops()
2711 return -EINVAL; in i3c_master_check_ops()
2717 * i3c_master_register() - register an I3C master
2723 * -ENOTSUPP if set to true since secondary masters are not yet
2728 * - creates and initializes the I3C bus
2729 * - populates the bus with static I2C devs if @parent->of_node is not
2731 * - registers all I3C devices added by the controller during bus
2733 * - registers the I2C adapter and all I2C devices
2744 enum i3c_bus_mode mode = I3C_BUS_MODE_PURE; in i3c_master_register() local
2750 return -ENOTSUPP; in i3c_master_register()
2756 master->dev.parent = parent; in i3c_master_register()
2757 master->dev.of_node = of_node_get(parent->of_node); in i3c_master_register()
2758 master->dev.bus = &i3c_bus_type; in i3c_master_register()
2759 master->dev.type = &i3c_masterdev_type; in i3c_master_register()
2760 master->dev.release = i3c_masterdev_release; in i3c_master_register()
2761 master->ops = ops; in i3c_master_register()
2762 master->secondary = secondary; in i3c_master_register()
2763 INIT_LIST_HEAD(&master->boardinfo.i2c); in i3c_master_register()
2764 INIT_LIST_HEAD(&master->boardinfo.i3c); in i3c_master_register()
2766 ret = i3c_bus_init(i3cbus, master->dev.of_node); in i3c_master_register()
2770 device_initialize(&master->dev); in i3c_master_register()
2771 dev_set_name(&master->dev, "i3c-%d", i3cbus->id); in i3c_master_register()
2777 list_for_each_entry(i2cbi, &master->boardinfo.i2c, node) { in i3c_master_register()
2778 switch (i2cbi->lvr & I3C_LVR_I2C_INDEX_MASK) { in i3c_master_register()
2780 if (mode < I3C_BUS_MODE_MIXED_FAST) in i3c_master_register()
2781 mode = I3C_BUS_MODE_MIXED_FAST; in i3c_master_register()
2784 if (mode < I3C_BUS_MODE_MIXED_LIMITED) in i3c_master_register()
2785 mode = I3C_BUS_MODE_MIXED_LIMITED; in i3c_master_register()
2788 if (mode < I3C_BUS_MODE_MIXED_SLOW) in i3c_master_register()
2789 mode = I3C_BUS_MODE_MIXED_SLOW; in i3c_master_register()
2792 ret = -EINVAL; in i3c_master_register()
2796 if (i2cbi->lvr & I3C_LVR_I2C_FM_MODE) in i3c_master_register()
2800 ret = i3c_bus_set_mode(i3cbus, mode, i2c_scl_rate); in i3c_master_register()
2804 master->wq = alloc_workqueue("%s", 0, 0, dev_name(parent)); in i3c_master_register()
2805 if (!master->wq) { in i3c_master_register()
2806 ret = -ENOMEM; in i3c_master_register()
2814 ret = device_add(&master->dev); in i3c_master_register()
2830 master->init_done = true; in i3c_master_register()
2831 i3c_bus_normaluse_lock(&master->bus); in i3c_master_register()
2833 i3c_bus_normaluse_unlock(&master->bus); in i3c_master_register()
2838 device_del(&master->dev); in i3c_master_register()
2844 put_device(&master->dev); in i3c_master_register()
2851 * i3c_master_unregister() - unregister an I3C master
2861 device_unregister(&master->dev); in i3c_master_unregister()
2870 return -ENOENT; in i3c_dev_setdasa_locked()
2874 return -EINVAL; in i3c_dev_setdasa_locked()
2876 if (!dev->boardinfo || !dev->boardinfo->init_dyn_addr || in i3c_dev_setdasa_locked()
2877 !dev->boardinfo->static_addr) in i3c_dev_setdasa_locked()
2878 return -EINVAL; in i3c_dev_setdasa_locked()
2880 return i3c_master_setdasa_locked(master, dev->info.static_addr, in i3c_dev_setdasa_locked()
2881 dev->boardinfo->init_dyn_addr); in i3c_dev_setdasa_locked()
2891 return -ENOENT; in i3c_dev_do_priv_xfers_locked()
2895 return -EINVAL; in i3c_dev_do_priv_xfers_locked()
2897 if (!master->ops->priv_xfers) in i3c_dev_do_priv_xfers_locked()
2898 return -ENOTSUPP; in i3c_dev_do_priv_xfers_locked()
2900 return master->ops->priv_xfers(dev, xfers, nxfers); in i3c_dev_do_priv_xfers_locked()
2908 if (!dev->ibi) in i3c_dev_disable_ibi_locked()
2909 return -EINVAL; in i3c_dev_disable_ibi_locked()
2912 ret = master->ops->disable_ibi(dev); in i3c_dev_disable_ibi_locked()
2916 reinit_completion(&dev->ibi->all_ibis_handled); in i3c_dev_disable_ibi_locked()
2917 if (atomic_read(&dev->ibi->pending_ibis)) in i3c_dev_disable_ibi_locked()
2918 wait_for_completion(&dev->ibi->all_ibis_handled); in i3c_dev_disable_ibi_locked()
2920 dev->ibi->enabled = false; in i3c_dev_disable_ibi_locked()
2930 if (!dev->ibi) in i3c_dev_enable_ibi_locked()
2931 return -EINVAL; in i3c_dev_enable_ibi_locked()
2933 ret = master->ops->enable_ibi(dev); in i3c_dev_enable_ibi_locked()
2935 dev->ibi->enabled = true; in i3c_dev_enable_ibi_locked()
2947 if (!master->ops->request_ibi) in i3c_dev_request_ibi_locked()
2948 return -ENOTSUPP; in i3c_dev_request_ibi_locked()
2950 if (dev->ibi) in i3c_dev_request_ibi_locked()
2951 return -EBUSY; in i3c_dev_request_ibi_locked()
2955 return -ENOMEM; in i3c_dev_request_ibi_locked()
2957 atomic_set(&ibi->pending_ibis, 0); in i3c_dev_request_ibi_locked()
2958 init_completion(&ibi->all_ibis_handled); in i3c_dev_request_ibi_locked()
2959 ibi->handler = req->handler; in i3c_dev_request_ibi_locked()
2960 ibi->max_payload_len = req->max_payload_len; in i3c_dev_request_ibi_locked()
2961 ibi->num_slots = req->num_slots; in i3c_dev_request_ibi_locked()
2963 dev->ibi = ibi; in i3c_dev_request_ibi_locked()
2964 ret = master->ops->request_ibi(dev, req); in i3c_dev_request_ibi_locked()
2967 dev->ibi = NULL; in i3c_dev_request_ibi_locked()
2977 if (!dev->ibi) in i3c_dev_free_ibi_locked()
2980 if (WARN_ON(dev->ibi->enabled)) in i3c_dev_free_ibi_locked()
2983 master->ops->free_ibi(dev); in i3c_dev_free_ibi_locked()
2984 kfree(dev->ibi); in i3c_dev_free_ibi_locked()
2985 dev->ibi = NULL; in i3c_dev_free_ibi_locked()