File: wcxb_spi.h

package info (click to toggle)
dahdi-linux 1%3A2.11.1.0.20170917~dfsg-8.4
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 12,400 kB
  • sloc: ansic: 125,097; perl: 2,395; sh: 1,132; makefile: 427; xml: 24
file content (116 lines) | stat: -rw-r--r-- 2,780 bytes parent folder | download | duplicates (11)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
/*
 * wcxb SPI library
 *
 * Copyright (C) 2013 Digium, Inc.
 *
 * All rights reserved.
 *
 */

/*
 * See http://www.asterisk.org for more information about
 * the Asterisk project. Please do not directly contact
 * any of the maintainers of this project for assistance;
 * the project provides a web site, mailing lists and IRC
 * channels for your use.
 *
 * This program is free software, distributed under the terms of
 * the GNU General Public License Version 2 as published by the
 * Free Software Foundation. See the LICENSE file included with
 * this program for more details.
 */

#ifndef __WCXB_SPI_H
#define __WCXB_SPI_H

#include <linux/spi/spi.h>
#include <stdbool.h>

struct wcxb_spi_transfer {
	const void	*tx_buf;
	void		*rx_buf;
	u32		len:16;
	u16		delay_usecs;
	struct list_head node;
};

struct wcxb_spi_message {
	struct list_head transfers;
	struct list_head node;
	struct wcxb_spi_device *spi;
	void (*complete)(void *arg);
	void *arg;
	int status;
};

struct wcxb_spi_master;

struct wcxb_spi_device {
	struct wcxb_spi_master *master;
	u16 chip_select;
};

extern struct wcxb_spi_master *wcxb_spi_master_create(struct device *parent,
					void __iomem *base, bool auto_cs);
extern void wcxb_spi_master_destroy(struct wcxb_spi_master *master);
extern int wcxb_spi_sync(struct wcxb_spi_device *spi,
			 struct wcxb_spi_message *message);
extern int wcxb_spi_async(struct wcxb_spi_device *spi,
			  struct wcxb_spi_message *message);
extern void wcxb_spi_handle_interrupt(struct wcxb_spi_master *master);

static inline struct wcxb_spi_device *
wcxb_spi_device_create(struct wcxb_spi_master *master, u16 chip_select)
{
	struct wcxb_spi_device *spi = kzalloc(sizeof(*spi), GFP_KERNEL);
	if (!spi)
		return NULL;
	spi->master = master;
	spi->chip_select = chip_select;
	return spi;
}

static inline void wcxb_spi_device_destroy(struct wcxb_spi_device *spi)
{
	kfree(spi);
}

static inline void wcxb_spi_message_init(struct wcxb_spi_message *m)
{
	memset(m, 0, sizeof(*m));
	INIT_LIST_HEAD(&m->transfers);
}

static inline void wcxb_spi_message_add_tail(struct wcxb_spi_transfer *t,
					     struct wcxb_spi_message *m)
{
	list_add_tail(&t->node, &m->transfers);
}

static inline int
wcxb_spi_write(struct wcxb_spi_device *spi, const void *buffer, size_t len)
{
	struct wcxb_spi_transfer	t = {
			.tx_buf		= buffer,
			.len		= len,
		};
	struct wcxb_spi_message	m;
	wcxb_spi_message_init(&m);
	wcxb_spi_message_add_tail(&t, &m);
	return wcxb_spi_sync(spi, &m);
}

static inline int
wcxb_spi_read(struct wcxb_spi_device *spi, void *buffer, size_t len)
{
	struct wcxb_spi_transfer	t = {
			.rx_buf		= buffer,
			.len		= len,
		};
	struct wcxb_spi_message	m;
	wcxb_spi_message_init(&m);
	wcxb_spi_message_add_tail(&t, &m);
	return wcxb_spi_sync(spi, &m);
}

#endif