Generalise three-wire interface to generic SPI interface.
[gpxe.git] / src / drivers / nvs / threewire.c
1 /*
2  * Copyright (C) 2006 Michael Brown <mbrown@fensystems.co.uk>.
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License as
6  * published by the Free Software Foundation; either version 2 of the
7  * License, or any later version.
8  *
9  * This program is distributed in the hope that it will be useful, but
10  * WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17  */
18
19 #include <stddef.h>
20 #include <byteswap.h>
21 #include <gpxe/spi.h>
22 #include <gpxe/threewire.h>
23
24 /** @file
25  *
26  * Three-wire serial devices
27  *
28  */
29
30 /**
31  * Read from a three-wire device
32  *
33  * @v three     Three-wire device
34  * @v address   Address
35  * @ret data    Data
36  */
37 unsigned long threewire_read ( struct threewire_device *three,
38                                unsigned long address ) {
39         struct spi_interface *spi = three->spi;
40         uint32_t data;
41
42         /* Activate chip select line */
43         spi->select_slave ( spi, three->slave );
44
45         /* Send command and address */
46         data = cpu_to_le32 ( threewire_cmd_read ( three, address ) );
47         spi->transfer ( spi, &data, NULL, threewire_cmd_len ( three ) );
48         
49         /* Read back data */
50         data = 0;
51         spi->transfer ( spi, NULL, &data, three->datasize );
52
53         /* Deactivate chip select line */
54         spi->deselect_slave ( spi );
55
56         return le32_to_cpu ( data );;
57 }