Lines Matching +full:peci +full:- +full:controller
1 // SPDX-License-Identifier: GPL-2.0-only
2 // Copyright (c) 2018-2021 Intel Corporation
5 #include <linux/peci.h>
6 #include <linux/peci-cpu.h>
12 * PECI device can be removed using sysfs, but the removal can also happen as
13 * a result of controller being removed.
14 * Mutex is used to protect PECI device from being double-deleted.
29 * PECI device may be in a state where it is unable to return a proper in peci_get_revision()
37 return -EIO; in peci_get_revision()
103 device->info.family = peci_x86_cpu_family(cpu_id); in peci_device_info_init()
104 device->info.model = peci_x86_cpu_model(cpu_id); in peci_device_info_init()
109 device->info.peci_revision = revision; in peci_device_info_init()
111 device->info.socket_id = device->addr - PECI_BASE_ADDR; in peci_device_info_init()
116 static int peci_detect(struct peci_controller *controller, u8 addr) in peci_detect() argument
119 * PECI Ping is a command encoded by tx_len = 0, rx_len = 0. in peci_detect()
126 mutex_lock(&controller->bus_lock); in peci_detect()
127 ret = controller->ops->xfer(controller, addr, &req); in peci_detect()
128 mutex_unlock(&controller->bus_lock); in peci_detect()
143 if (device->addr == *addr) in peci_dev_exists()
144 return -EBUSY; in peci_dev_exists()
149 int peci_device_create(struct peci_controller *controller, u8 addr) in peci_device_create() argument
155 return -EINVAL; in peci_device_create()
158 ret = device_for_each_child(&controller->dev, &addr, peci_dev_exists); in peci_device_create()
162 ret = peci_detect(controller, addr); in peci_device_create()
168 if (ret == -EIO || ret == -ETIMEDOUT) in peci_device_create()
176 return -ENOMEM; in peci_device_create()
178 device_initialize(&device->dev); in peci_device_create()
180 device->addr = addr; in peci_device_create()
181 device->dev.parent = &controller->dev; in peci_device_create()
182 device->dev.bus = &peci_bus_type; in peci_device_create()
183 device->dev.type = &peci_device_type; in peci_device_create()
189 ret = dev_set_name(&device->dev, "%d-%02x", controller->id, device->addr); in peci_device_create()
193 ret = device_add(&device->dev); in peci_device_create()
200 put_device(&device->dev); in peci_device_create()
208 if (!device->deleted) { in peci_device_destroy()
209 device_unregister(&device->dev); in peci_device_destroy()
210 device->deleted = true; in peci_device_destroy()
218 driver->driver.bus = &peci_bus_type; in __peci_driver_register()
219 driver->driver.owner = owner; in __peci_driver_register()
220 driver->driver.mod_name = mod_name; in __peci_driver_register()
222 if (!driver->probe) { in __peci_driver_register()
223 pr_err("peci: trying to register driver without probe callback\n"); in __peci_driver_register()
224 return -EINVAL; in __peci_driver_register()
227 if (!driver->id_table) { in __peci_driver_register()
228 pr_err("peci: trying to register driver without device id table\n"); in __peci_driver_register()
229 return -EINVAL; in __peci_driver_register()
232 return driver_register(&driver->driver); in __peci_driver_register()
234 EXPORT_SYMBOL_NS_GPL(__peci_driver_register, PECI);
238 driver_unregister(&driver->driver); in peci_driver_unregister()
240 EXPORT_SYMBOL_NS_GPL(peci_driver_unregister, PECI);