| // SPDX-License-Identifier: GPL-2.0+ | |
| /* | |
| * Copyright (C) 2010 Thomas Chou <thomas@wytron.com.tw> | |
| */ | |
| #define LOG_CATEGORY UCLASS_MISC | |
| #include <dm.h> | |
| #include <errno.h> | |
| #include <misc.h> | |
| /* | |
| * Implement a miscellaneous uclass for those do not fit other more | |
| * general classes. A set of generic read, write and ioctl methods may | |
| * be used to access the device. | |
| */ | |
| int misc_read(struct udevice *dev, int offset, void *buf, int size) | |
| { | |
| const struct misc_ops *ops = device_get_ops(dev); | |
| if (!ops->read) | |
| return -ENOSYS; | |
| return ops->read(dev, offset, buf, size); | |
| } | |
| int misc_write(struct udevice *dev, int offset, const void *buf, int size) | |
| { | |
| const struct misc_ops *ops = device_get_ops(dev); | |
| if (!ops->write) | |
| return -ENOSYS; | |
| return ops->write(dev, offset, buf, size); | |
| } | |
| int misc_ioctl(struct udevice *dev, unsigned long request, void *buf) | |
| { | |
| const struct misc_ops *ops = device_get_ops(dev); | |
| if (!ops->ioctl) | |
| return -ENOSYS; | |
| return ops->ioctl(dev, request, buf); | |
| } | |
| int misc_call(struct udevice *dev, int msgid, void *tx_msg, int tx_size, | |
| void *rx_msg, int rx_size) | |
| { | |
| const struct misc_ops *ops = device_get_ops(dev); | |
| if (!ops->call) | |
| return -ENOSYS; | |
| return ops->call(dev, msgid, tx_msg, tx_size, rx_msg, rx_size); | |
| } | |
| int misc_set_enabled(struct udevice *dev, bool val) | |
| { | |
| const struct misc_ops *ops = device_get_ops(dev); | |
| if (!ops->set_enabled) | |
| return -ENOSYS; | |
| return ops->set_enabled(dev, val); | |
| } | |
| UCLASS_DRIVER(misc) = { | |
| .id = UCLASS_MISC, | |
| .name = "misc", | |
| #if CONFIG_IS_ENABLED(OF_REAL) | |
| .post_bind = dm_scan_fdt_dev, | |
| #endif | |
| }; |