1 // SPDX-License-Identifier: GPL-2.0+ 2 /* 3 * Copyright (C) 2010 Thomas Chou <thomas@wytron.com.tw> 4 */ 5 6 #include <common.h> 7 #include <dm.h> 8 #include <errno.h> 9 #include <misc.h> 10 11 /* 12 * Implement a miscellaneous uclass for those do not fit other more 13 * general classes. A set of generic read, write and ioctl methods may 14 * be used to access the device. 15 */ 16 17 int misc_read(struct udevice *dev, int offset, void *buf, int size) 18 { 19 const struct misc_ops *ops = device_get_ops(dev); 20 21 if (!ops->read) 22 return -ENOSYS; 23 24 return ops->read(dev, offset, buf, size); 25 } 26 27 int misc_write(struct udevice *dev, int offset, void *buf, int size) 28 { 29 const struct misc_ops *ops = device_get_ops(dev); 30 31 if (!ops->write) 32 return -ENOSYS; 33 34 return ops->write(dev, offset, buf, size); 35 } 36 37 int misc_ioctl(struct udevice *dev, unsigned long request, void *buf) 38 { 39 const struct misc_ops *ops = device_get_ops(dev); 40 41 if (!ops->ioctl) 42 return -ENOSYS; 43 44 return ops->ioctl(dev, request, buf); 45 } 46 47 int misc_call(struct udevice *dev, int msgid, void *tx_msg, int tx_size, 48 void *rx_msg, int rx_size) 49 { 50 const struct misc_ops *ops = device_get_ops(dev); 51 52 if (!ops->call) 53 return -ENOSYS; 54 55 return ops->call(dev, msgid, tx_msg, tx_size, rx_msg, rx_size); 56 } 57 58 int misc_set_enabled(struct udevice *dev, bool val) 59 { 60 const struct misc_ops *ops = device_get_ops(dev); 61 62 if (!ops->set_enabled) 63 return -ENOSYS; 64 65 return ops->set_enabled(dev, val); 66 } 67 68 UCLASS_DRIVER(misc) = { 69 .id = UCLASS_MISC, 70 .name = "misc", 71 #if CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA) 72 .post_bind = dm_scan_fdt_dev, 73 #endif 74 }; 75