From 4395e06eb9907e22869cfe3bf6259a0f0cefca13 Mon Sep 17 00:00:00 2001 From: Thomas Chou Date: Wed, 7 Oct 2015 20:20:51 +0800 Subject: [PATCH] dm: implement a Miscellaneous uclass Implement a Miscellaneous uclass with generic read or write operations. This class is used only for those do not fit other more general classes. Signed-off-by: Thomas Chou Acked-by: Simon Glass --- drivers/misc/Kconfig | 9 +++++ drivers/misc/Makefile | 1 + drivers/misc/misc-uclass.c | 51 ++++++++++++++++++++++++ include/dm/uclass-id.h | 1 + include/misc.h | 79 ++++++++++++++++++++++++++++++++++++++ 5 files changed, 141 insertions(+) create mode 100644 drivers/misc/misc-uclass.c create mode 100644 include/misc.h diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig index 8b38a84de6..031b4d8e78 100644 --- a/drivers/misc/Kconfig +++ b/drivers/misc/Kconfig @@ -4,6 +4,15 @@ menu "Multifunction device drivers" +config MISC + bool "Enable Driver Model for Misc drivers" + depends on DM + help + Enable driver model for miscellaneous devices. This class is + used only 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. + config CMD_CROS_EC bool "Enable crosec command" depends on CROS_EC diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile index 8d0fc3c5cb..7e76b12ccb 100644 --- a/drivers/misc/Makefile +++ b/drivers/misc/Makefile @@ -5,6 +5,7 @@ # SPDX-License-Identifier: GPL-2.0+ # +obj-$(CONFIG_MISC) += misc-uclass.o obj-$(CONFIG_ALI152X) += ali512x.o obj-$(CONFIG_DS4510) += ds4510.o obj-$(CONFIG_CBMEM_CONSOLE) += cbmem_console.o diff --git a/drivers/misc/misc-uclass.c b/drivers/misc/misc-uclass.c new file mode 100644 index 0000000000..13a6ea508b --- /dev/null +++ b/drivers/misc/misc-uclass.c @@ -0,0 +1,51 @@ +/* + * Copyright (C) 2010 Thomas Chou + * + * SPDX-License-Identifier: GPL-2.0+ + */ + +#include +#include +#include +#include + +/* + * 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, 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); +} + +UCLASS_DRIVER(misc) = { + .id = UCLASS_MISC, + .name = "misc", +}; diff --git a/include/dm/uclass-id.h b/include/dm/uclass-id.h index 330ecd2388..886a44c134 100644 --- a/include/dm/uclass-id.h +++ b/include/dm/uclass-id.h @@ -39,6 +39,7 @@ enum uclass_id { UCLASS_LED, /* Light-emitting diode (LED) */ UCLASS_LPC, /* x86 'low pin count' interface */ UCLASS_MASS_STORAGE, /* Mass storage device */ + UCLASS_MISC, /* Miscellaneous device */ UCLASS_MMC, /* SD / MMC card or chip */ UCLASS_MOD_EXP, /* RSA Mod Exp device */ UCLASS_PCH, /* x86 platform controller hub */ diff --git a/include/misc.h b/include/misc.h new file mode 100644 index 0000000000..7e9badfabd --- /dev/null +++ b/include/misc.h @@ -0,0 +1,79 @@ +/* + * Copyright (C) 2015 Thomas Chou + * + * SPDX-License-Identifier: GPL-2.0+ + */ + +#ifndef _MISC_H_ +#define _MISC_H_ + +/* + * Read the device to buffer, optional. + * + * @dev: the device + * @offset: offset to read the device + * @buf: pointer to data buffer + * @size: data size in bytes to read the device + * @return: 0 if OK, -ve on error + */ +int misc_read(struct udevice *dev, int offset, void *buf, int size); +/* + * Write buffer to the device, optional. + * + * @dev: the device + * @offset: offset to write the device + * @buf: pointer to data buffer + * @size: data size in bytes to write the device + * @return: 0 if OK, -ve on error + */ +int misc_write(struct udevice *dev, int offset, void *buf, int size); +/* + * Assert command to the device, optional. + * + * @dev: the device + * @request: command to be sent to the device + * @buf: pointer to buffer related to the requset + * @return: 0 if OK, -ve on error + */ +int misc_ioctl(struct udevice *dev, unsigned long request, void *buf); + +/* + * struct misc_ops - Driver model Misc operations + * + * The uclass interface is implemented by all miscellaneous devices which + * use driver model. + */ +struct misc_ops { + /* + * Read the device to buffer, optional. + * + * @dev: the device + * @offset: offset to read the device + * @buf: pointer to data buffer + * @size: data size in bytes to read the device + * @return: 0 if OK, -ve on error + */ + int (*read)(struct udevice *dev, int offset, void *buf, int size); + /* + * Write buffer to the device, optional. + * + * @dev: the device + * @offset: offset to write the device + * @buf: pointer to data buffer + * @size: data size in bytes to write the device + * @return: 0 if OK, -ve on error + */ + int (*write)(struct udevice *dev, int offset, const void *buf, + int size); + /* + * Assert command to the device, optional. + * + * @dev: the device + * @request: command to be sent to the device + * @buf: pointer to buffer related to the requset + * @return: 0 if OK, -ve on error + */ + int (*ioctl)(struct udevice *dev, unsigned long request, void *buf); +}; + +#endif /* _MISC_H_ */ -- 2.39.5