Skip to content

Commit

Permalink
device property: Implement device_is_big_endian()
Browse files Browse the repository at this point in the history
Some users want to use the struct device pointer to see if the
device is big endian in terms of Open Firmware specifications,
i.e. if it has a "big-endian" property, or if the kernel was
compiled for BE *and* the device has a "native-endian" property.

Provide inline helper for the users.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Link: https://lore.kernel.org/r/20231025184259.250588-2-andriy.shevchenko@linux.intel.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
Andy Shevchenko authored and Greg Kroah-Hartman committed Dec 15, 2023
1 parent 2cc14f5 commit 826a5d8
Showing 1 changed file with 26 additions and 0 deletions.
26 changes: 26 additions & 0 deletions include/linux/property.h
Original file line number Diff line number Diff line change
Expand Up @@ -80,12 +80,38 @@ int fwnode_property_match_string(const struct fwnode_handle *fwnode,

bool fwnode_device_is_available(const struct fwnode_handle *fwnode);

static inline bool fwnode_device_is_big_endian(const struct fwnode_handle *fwnode)
{
if (fwnode_property_present(fwnode, "big-endian"))
return true;
if (IS_ENABLED(CONFIG_CPU_BIG_ENDIAN) &&
fwnode_property_present(fwnode, "native-endian"))
return true;
return false;
}

static inline
bool fwnode_device_is_compatible(const struct fwnode_handle *fwnode, const char *compat)
{
return fwnode_property_match_string(fwnode, "compatible", compat) >= 0;
}

/**
* device_is_big_endian - check if a device has BE registers
* @dev: Pointer to the struct device
*
* Returns: true if the device has a "big-endian" property, or if the kernel
* was compiled for BE *and* the device has a "native-endian" property.
* Returns false otherwise.
*
* Callers would nominally use ioread32be/iowrite32be if
* device_is_big_endian() == true, or readl/writel otherwise.
*/
static inline bool device_is_big_endian(const struct device *dev)
{
return fwnode_device_is_big_endian(dev_fwnode(dev));
}

/**
* device_is_compatible - match 'compatible' property of the device with a given string
* @dev: Pointer to the struct device
Expand Down

0 comments on commit 826a5d8

Please sign in to comment.