mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-08-28 01:43:47 -04:00
i3c: master: Add helper to query bus wakeup requirements
Add i3c_master_has_wakeup_enabled_devs(), which iterates over the devices on an I3C bus and reports whether any of them are enabled for system wakeup and have IBI enabled. Controller drivers can use this helper to determine whether wakeup support must remain available while the system is suspended. Acked-by : Mukesh Savaliya <mukesh.savaliya@oss.qualcomm.com> Signed-off-by: Adrian Hunter <adrian.hunter@intel.com> Reviewed-by: Frank Li <Frank.Li@nxp.com> Link: https://patch.msgid.link/20260807145638.168865-11-adrian.hunter@intel.com Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
This commit is contained in:
committed by
Alexandre Belloni
parent
ff2b20f8f1
commit
60ff731f06
@@ -2147,6 +2147,41 @@ static void i3c_master_reg_work_fn(struct work_struct *work)
|
||||
i3c_master_register_new_i3c_devs(master);
|
||||
}
|
||||
|
||||
/**
|
||||
* i3c_master_has_wakeup_enabled_devs() - check if any device can wake the system
|
||||
* @master: I3C master controller
|
||||
*
|
||||
* Iterate over devices on the bus and return true if any device has
|
||||
* system wakeup enabled and IBI enabled.
|
||||
*
|
||||
* Whether a device is enabled for system wakeup is user space policy,
|
||||
* settable at any time through the device's power/wakeup sysfs attribute,
|
||||
* so the answer is only stable once user space is frozen. Call this from
|
||||
* a system suspend callback.
|
||||
*
|
||||
* Return: true if any device may wake the system via IBI, false otherwise.
|
||||
*/
|
||||
bool i3c_master_has_wakeup_enabled_devs(struct i3c_master_controller *master)
|
||||
{
|
||||
struct i3c_dev_desc *desc;
|
||||
bool wakeup = false;
|
||||
|
||||
i3c_bus_normaluse_lock(&master->bus);
|
||||
i3c_bus_for_each_i3cdev(&master->bus, desc) {
|
||||
if (!desc->dev || desc == master->this || !device_may_wakeup(&desc->dev->dev))
|
||||
continue;
|
||||
guard(mutex)(&desc->ibi_lock);
|
||||
if (desc->ibi && desc->ibi->enabled) {
|
||||
wakeup = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
i3c_bus_normaluse_unlock(&master->bus);
|
||||
|
||||
return wakeup;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(i3c_master_has_wakeup_enabled_devs);
|
||||
|
||||
/**
|
||||
* i3c_master_dma_map_single() - Map buffer for single DMA transfer
|
||||
* @dev: device object of a device doing DMA
|
||||
|
||||
@@ -765,6 +765,7 @@ void i3c_generic_ibi_recycle_slot(struct i3c_generic_ibi_pool *pool,
|
||||
struct i3c_ibi_slot *slot);
|
||||
|
||||
void i3c_master_queue_ibi(struct i3c_dev_desc *dev, struct i3c_ibi_slot *slot);
|
||||
bool i3c_master_has_wakeup_enabled_devs(struct i3c_master_controller *master);
|
||||
|
||||
struct i3c_ibi_slot *i3c_master_get_free_ibi_slot(struct i3c_dev_desc *dev);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user