dm: implement a Miscellaneous uclass
authorThomas Chou <thomas@wytron.com.tw>
Wed, 7 Oct 2015 12:20:51 +0000 (20:20 +0800)
committerThomas Chou <thomas@wytron.com.tw>
Thu, 22 Oct 2015 23:37:03 +0000 (07:37 +0800)
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 <thomas@wytron.com.tw>
Acked-by: Simon Glass <sjg@chromium.org>
drivers/misc/Kconfig
drivers/misc/Makefile
drivers/misc/misc-uclass.c [new file with mode: 0644]
include/dm/uclass-id.h
include/misc.h [new file with mode: 0644]

index 8b38a84..031b4d8 100644 (file)
@@ -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
index 8d0fc3c..7e76b12 100644 (file)
@@ -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 (file)
index 0000000..13a6ea5
--- /dev/null
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2010 Thomas Chou <thomas@wytron.com.tw>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+#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, 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",
+};
index 330ecd2..886a44c 100644 (file)
@@ -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 (file)
index 0000000..7e9badf
--- /dev/null
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2015 Thomas Chou <thomas@wytron.com.tw>
+ *
+ * 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_ */