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 <thomas@wytron.com.tw>
Acked-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Thomas Chou 2015-10-07 20:20:51 +08:00
parent 2e2da4c67d
commit 4395e06eb9
5 changed files with 141 additions and 0 deletions

View 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

View 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

View File

@ -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",
};

View 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 */

79
include/misc.h Normal file
View File

@ -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_ */