NetBSD/sys/dev/spi/spivar.h
rmind b1d9d10d78 - Use IPL_BIO (instead of IPL_SERIAL) for SPI.
- Convert simple_lock/ltsleep to mutex/condvar.
2011-06-08 23:05:48 +00:00

149 lines
4.8 KiB
C

/* $NetBSD: spivar.h,v 1.4 2011/06/08 23:05:48 rmind Exp $ */
/*-
* Copyright (c) 2006 Urbana-Champaign Independent Media Center.
* Copyright (c) 2006 Garrett D'Amore.
* All rights reserved.
*
* Portions of this code were written by Garrett D'Amore for the
* Champaign-Urbana Community Wireless Network Project.
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the following
* conditions are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
* 3. All advertising materials mentioning features or use of this
* software must display the following acknowledgements:
* This product includes software developed by the Urbana-Champaign
* Independent Media Center.
* This product includes software developed by Garrett D'Amore.
* 4. Urbana-Champaign Independent Media Center's name and Garrett
* D'Amore's name may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE URBANA-CHAMPAIGN INDEPENDENT
* MEDIA CENTER AND GARRETT D'AMORE ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE URBANA-CHAMPAIGN INDEPENDENT
* MEDIA CENTER OR GARRETT D'AMORE BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef _DEV_SPI_SPIVAR_H_
#define _DEV_SPI_SPIVAR_H_
#include <sys/queue.h>
#include <sys/simplelock.h>
/*
* Serial Peripheral Interface bus. This is a 4-wire bus common for
* connecting flash, clocks, sensors, and various other low-speed
* peripherials.
*/
struct spi_handle;
struct spi_transfer;
/*
* De facto standard latching modes.
*/
#define SPI_MODE_0 0 /* CPOL = 0, CPHA = 0 */
#define SPI_MODE_1 1 /* CPOL = 0, CPHA = 1 */
#define SPI_MODE_2 2 /* CPOL = 1, CPHA = 0 */
#define SPI_MODE_3 3 /* CPOL = 1, CPHA = 1 */
/* Philips' Microwire is just Mode 0 */
#define SPI_MODE_MICROWIRE SPI_MODE_0
struct spi_controller {
void *sct_cookie; /* controller private data */
int sct_nslaves;
int (*sct_configure)(void *, int, int, int);
int (*sct_transfer)(void *, struct spi_transfer *);
};
int spibus_print(void *, const char *);
/* one per chip select */
struct spibus_attach_args {
struct spi_controller *sba_controller;
};
struct spi_attach_args {
struct spi_handle *sa_handle;
};
/*
* This is similar in some respects to struct buf, but we cannot use
* that structure because it was not designed to support full-duplex
* IO.
*/
struct spi_chunk {
struct spi_chunk *chunk_next;
int chunk_count;
uint8_t *chunk_read;
const uint8_t *chunk_write;
/* for private use by framework and bus driver */
uint8_t *chunk_rptr;
const uint8_t *chunk_wptr;
int chunk_rresid;
int chunk_wresid;
};
struct spi_transfer {
struct spi_chunk *st_chunks; /* chained bufs */
SIMPLEQ_ENTRY(spi_transfer) st_chain; /* chain of submitted jobs */
int st_flags;
int st_errno;
int st_slave;
void *st_private;
void (*st_done)(struct spi_transfer *);
kmutex_t st_lock;
kcondvar_t st_cv;
void *st_busprivate;
};
/* declare a list of transfers */
SIMPLEQ_HEAD(spi_transq, spi_transfer);
#define spi_transq_init(q) \
SIMPLEQ_INIT(q)
#define spi_transq_enqueue(q, trans) \
SIMPLEQ_INSERT_TAIL(q, trans, st_chain)
#define spi_transq_dequeue(q) \
SIMPLEQ_REMOVE_HEAD(q, st_chain)
#define spi_transq_first(q) \
SIMPLEQ_FIRST(q)
#define SPI_F_DONE 0x0001
#define SPI_F_ERROR 0x0002
int spi_configure(struct spi_handle *, int mode, int speed);
int spi_transfer(struct spi_handle *, struct spi_transfer *);
void spi_transfer_init(struct spi_transfer *);
void spi_chunk_init(struct spi_chunk *, int, const uint8_t *, uint8_t *);
void spi_transfer_add(struct spi_transfer *, struct spi_chunk *);
void spi_wait(struct spi_transfer *);
void spi_done(struct spi_transfer *, int);
/* convenience wrappers */
int spi_send(struct spi_handle *, int, const uint8_t *);
int spi_recv(struct spi_handle *, int, uint8_t *);
int spi_send_recv(struct spi_handle *, int, const uint8_t *, int, uint8_t *);
#endif /* _DEV_SPI_SPIVAR_H_ */