⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 spi.h

📁 omap3 linux 2.6 用nocc去除了冗余代码
💻 H
📖 第 1 页 / 共 2 页
字号:
	const void	*tx_buf;	void		*rx_buf;	unsigned	len;	dma_addr_t	tx_dma;	dma_addr_t	rx_dma;	unsigned	cs_change:1;	u8		bits_per_word;	u16		delay_usecs;	u32		speed_hz;	struct list_head transfer_list;};/** * struct spi_message - one multi-segment SPI transaction * @transfers: list of transfer segments in this transaction * @spi: SPI device to which the transaction is queued * @is_dma_mapped: if true, the caller provided both dma and cpu virtual *	addresses for each transfer buffer * @complete: called to report transaction completions * @context: the argument to complete() when it's called * @actual_length: the total number of bytes that were transferred in all *	successful segments * @status: zero for success, else negative errno * @queue: for use by whichever driver currently owns the message * @state: for use by whichever driver currently owns the message * * A @spi_message is used to execute an atomic sequence of data transfers, * each represented by a struct spi_transfer.  The sequence is "atomic" * in the sense that no other spi_message may use that SPI bus until that * sequence completes.  On some systems, many such sequences can execute as * as single programmed DMA transfer.  On all systems, these messages are * queued, and might complete after transactions to other devices.  Messages * sent to a given spi_device are alway executed in FIFO order. * * The code that submits an spi_message (and its spi_transfers) * to the lower layers is responsible for managing its memory. * Zero-initialize every field you don't set up explicitly, to * insulate against future API updates.  After you submit a message * and its transfers, ignore them until its completion callback. */struct spi_message {	struct list_head	transfers;	struct spi_device	*spi;	unsigned		is_dma_mapped:1;	/* REVISIT:  we might want a flag affecting the behavior of the	 * last transfer ... allowing things like "read 16 bit length L"	 * immediately followed by "read L bytes".  Basically imposing	 * a specific message scheduling algorithm.	 *	 * Some controller drivers (message-at-a-time queue processing)	 * could provide that as their default scheduling algorithm.  But	 * others (with multi-message pipelines) could need a flag to	 * tell them about such special cases.	 */	/* completion is reported through a callback */	void			(*complete)(void *context);	void			*context;	unsigned		actual_length;	int			status;	/* for optional use by whatever driver currently owns the	 * spi_message ...  between calls to spi_async and then later	 * complete(), that's the spi controller driver.	 */	struct list_head	queue;	void			*state;};static inline void spi_message_init(struct spi_message *m){	memset(m, 0, sizeof *m);	INIT_LIST_HEAD(&m->transfers);}static inline voidspi_message_add_tail(struct spi_transfer *t, struct spi_message *m){	list_add_tail(&t->transfer_list, &m->transfers);}static inline voidspi_transfer_del(struct spi_transfer *t){	list_del(&t->transfer_list);}/* It's fine to embed message and transaction structures in other data * structures so long as you don't free them while they're in use. */static inline struct spi_message *spi_message_alloc(unsigned ntrans, gfp_t flags){	struct spi_message *m;	m = kzalloc(sizeof(struct spi_message)			+ ntrans * sizeof(struct spi_transfer),			flags);	if (m) {		int i;		struct spi_transfer *t = (struct spi_transfer *)(m + 1);		INIT_LIST_HEAD(&m->transfers);		for (i = 0; i < ntrans; i++, t++)			spi_message_add_tail(t, m);	}	return m;}static inline void spi_message_free(struct spi_message *m){	kfree(m);}/** * spi_setup - setup SPI mode and clock rate * @spi: the device whose settings are being modified * Context: can sleep, and no requests are queued to the device * * SPI protocol drivers may need to update the transfer mode if the * device doesn't work with its default.  They may likewise need * to update clock rates or word sizes from initial values.  This function * changes those settings, and must be called from a context that can sleep. * Except for SPI_CS_HIGH, which takes effect immediately, the changes take * effect the next time the device is selected and data is transferred to * or from it.  When this function returns, the spi device is deselected. * * Note that this call will fail if the protocol driver specifies an option * that the underlying controller or its driver does not support.  For * example, not all hardware supports wire transfers using nine bit words, * LSB-first wire encoding, or active-high chipselects. */static inline intspi_setup(struct spi_device *spi){	return spi->master->setup(spi);}/** * spi_async - asynchronous SPI transfer * @spi: device with which data will be exchanged * @message: describes the data transfers, including completion callback * Context: any (irqs may be blocked, etc) * * This call may be used in_irq and other contexts which can't sleep, * as well as from task contexts which can sleep. * * The completion callback is invoked in a context which can't sleep. * Before that invocation, the value of message->status is undefined. * When the callback is issued, message->status holds either zero (to * indicate complete success) or a negative error code.  After that * callback returns, the driver which issued the transfer request may * deallocate the associated memory; it's no longer in use by any SPI * core or controller driver code. * * Note that although all messages to a spi_device are handled in * FIFO order, messages may go to different devices in other orders. * Some device might be higher priority, or have various "hard" access * time requirements, for example. * * On detection of any fault during the transfer, processing of * the entire message is aborted, and the device is deselected. * Until returning from the associated message completion callback, * no other spi_message queued to that device will be processed. * (This rule applies equally to all the synchronous transfer calls, * which are wrappers around this core asynchronous primitive.) */static inline intspi_async(struct spi_device *spi, struct spi_message *message){	message->spi = spi;	return spi->master->transfer(spi, message);}/*---------------------------------------------------------------------------*//* All these synchronous SPI transfer routines are utilities layered * over the core async transfer primitive.  Here, "synchronous" means * they will sleep uninterruptibly until the async transfer completes. */extern int spi_sync(struct spi_device *spi, struct spi_message *message);/** * spi_write - SPI synchronous write * @spi: device to which data will be written * @buf: data buffer * @len: data buffer size * Context: can sleep * * This writes the buffer and returns zero or a negative error code. * Callable only from contexts that can sleep. */static inline intspi_write(struct spi_device *spi, const u8 *buf, size_t len){	struct spi_transfer	t = {			.tx_buf		= buf,			.len		= len,		};	struct spi_message	m;	spi_message_init(&m);	spi_message_add_tail(&t, &m);	return spi_sync(spi, &m);}/** * spi_read - SPI synchronous read * @spi: device from which data will be read * @buf: data buffer * @len: data buffer size * Context: can sleep * * This reads the buffer and returns zero or a negative error code. * Callable only from contexts that can sleep. */static inline intspi_read(struct spi_device *spi, u8 *buf, size_t len){	struct spi_transfer	t = {			.rx_buf		= buf,			.len		= len,		};	struct spi_message	m;	spi_message_init(&m);	spi_message_add_tail(&t, &m);	return spi_sync(spi, &m);}/* this copies txbuf and rxbuf data; for small transfers only! */extern int spi_write_then_read(struct spi_device *spi,		const u8 *txbuf, unsigned n_tx,		u8 *rxbuf, unsigned n_rx);/** * spi_w8r8 - SPI synchronous 8 bit write followed by 8 bit read * @spi: device with which data will be exchanged * @cmd: command to be written before data is read back * Context: can sleep * * This returns the (unsigned) eight bit number returned by the * device, or else a negative error code.  Callable only from * contexts that can sleep. */static inline ssize_t spi_w8r8(struct spi_device *spi, u8 cmd){	ssize_t			status;	u8			result;	status = spi_write_then_read(spi, &cmd, 1, &result, 1);	/* return negative errno or unsigned value */	return (status < 0) ? status : result;}/** * spi_w8r16 - SPI synchronous 8 bit write followed by 16 bit read * @spi: device with which data will be exchanged * @cmd: command to be written before data is read back * Context: can sleep * * This returns the (unsigned) sixteen bit number returned by the * device, or else a negative error code.  Callable only from * contexts that can sleep. * * The number is returned in wire-order, which is at least sometimes * big-endian. */static inline ssize_t spi_w8r16(struct spi_device *spi, u8 cmd){	ssize_t			status;	u16			result;	status = spi_write_then_read(spi, &cmd, 1, (u8 *) &result, 2);	/* return negative errno or unsigned value */	return (status < 0) ? status : result;}/*---------------------------------------------------------------------------*//* * INTERFACE between board init code and SPI infrastructure. * * No SPI driver ever sees these SPI device table segments, but * it's how the SPI core (or adapters that get hotplugged) grows * the driver model tree. * * As a rule, SPI devices can't be probed.  Instead, board init code * provides a table listing the devices which are present, with enough * information to bind and set up the device's driver.  There's basic * support for nonstatic configurations too; enough to handle adding * parport adapters, or microcontrollers acting as USB-to-SPI bridges. *//* board-specific information about each SPI device */struct spi_board_info {	/* the device name and module name are coupled, like platform_bus;	 * "modalias" is normally the driver name.	 *	 * platform_data goes to spi_device.dev.platform_data,	 * controller_data goes to spi_device.controller_data,	 * irq is copied too	 */	char		modalias[KOBJ_NAME_LEN];	const void	*platform_data;	void		*controller_data;	int		irq;	/* slower signaling on noisy or low voltage boards */	u32		max_speed_hz;	/* bus_num is board specific and matches the bus_num of some	 * spi that will probably be registered later.	 *	 * chip_select reflects how this chip is wired to that master;	 * it's less than num_chipselect.	 */	u16		bus_num;	u16		chip_select;	/* mode becomes spi_device.mode, and is essential for chips	 * where the default of SPI_CS_HIGH = 0 is wrong.	 */	u8		mode;	/* ... may need additional spi_device chip config data here.	 * avoid stuff protocol drivers can set; but include stuff	 * needed to behave without being bound to a driver:	 *  - quirks like clock rate mattering when not selected	 */};/* board init code may ignore whether SPI is configured or not */static inline intspi_register_board_info(struct spi_board_info const *info, unsigned n)	{ return 0; }/* If you're hotplugging an adapter with devices (parport, usb, etc) * use spi_new_device() to describe each device.  You can also call * spi_unregister_device() to start making that device vanish, but * normally that would be handled by spi_unregister_master(). */extern struct spi_device *spi_new_device(struct spi *, struct spi_board_info *);static inline voidspi_unregister_device(struct spi_device *spi){	if (spi)		device_unregister(&spi->dev);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -