blob: 89fd8c43825d512dc2271676ca321681339232ff [file] [log] [blame]
/*
* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
/*
* dev: abstraction for a character device (or mock, proxy, &c).
*
* A dev is the raw character device that underlies a qmidev.
* The qmidev reads and writes QMI messages from and to the dev, and can
* open and close it at will.
* Right now, there are two implementations of dev: file (for an actual file)
* and mock (for testing purposes).
*/
#ifndef LIBQMI_DEV_H
#define LIBQMI_DEV_H
#include <stddef.h>
struct dev;
/* TODO: Pass dev->priv directly to callbacks, and get rid of dev_priv? */
/**
* Operations that can be performed on a device.
*
* All of these ops return zero on success, non-zero on error.
*
* All of these ops except destroy can block; it is expected that read will
* only be called when the qmidev knows the device has data to read, and the
* other calls will be "fast enough".
*/
struct dev_ops {
/**
* Called to open dev.
*
* open will only be called while dev is closed.
* If open succeeds, dev is now considered open.
*/
int (*open)(struct dev *dev);
/**
* Called to read len bytes from dev into buf.
*
* This read operation cannot succeed partially; if backed by one that
* can, it should retry until the entire buffer has been filled, or
* return an error if it will never be filled.
*
* read will only be called while dev is open.
*/
int (*read)(struct dev *dev, void *buf, size_t len);
/**
* Called to write len bytes from buf to dev.
*
* This write operation cannot succeed partially; if backed by one
* that can, it shold retry until the entire buffer has been written,
* or return an error if it will never be written.
*
* write will only be called while dev is open.
*/
int (*write)(struct dev *dev, const void *buf, size_t len);
/**
* Called to close dev.
*
* close will only be called while dev is open.
* If close succeeds, dev is now considered closed.
*/
int (*close)(struct dev *dev);
/**
* Called to destroy dev.
*
* destroy will only be called while dev is closed.
* destroy must succeed; once it does, the device layer will no longer
* call any callbacks on dev.
*/
void (*destroy)(struct dev *dev);
};
/* Allocates a new device object with a given set of ops and priv pointer. */
struct dev *dev_new(struct dev_ops *ops, void *priv);
/* Destroys a device object (calls ops->destroy and frees the device). */
void dev_destroy(struct dev *dev);
/**
* Gets the priv pointer of the device object.
* (Intended for use by dev_ops callbacks.)
*/
void *dev_priv(struct dev *dev);
/* Opens dev. */
int dev_open(struct dev *dev);
/* Reads len bytes from dev into buf. */
int dev_read(struct dev *dev, void *buf, size_t len);
/* Writes len bytes from buf to dev. */
int dev_write(struct dev *dev, const void *buf, size_t len);
/* Closes dev. */
int dev_close(struct dev *dev);
#endif /* LIBQMI_DEV_H */