About Kernel Documentation Linux Kernel Contact Linux Resources Linux Blog

Documentation / spi / ep93xx_spi




Custom Search

Based on kernel version 3.16. Page generated on 2014-08-06 21:41 EST.

1	Cirrus EP93xx SPI controller driver HOWTO
2	=========================================
3	
4	ep93xx_spi driver brings SPI master support for EP93xx SPI controller.  Chip
5	selects are implemented with GPIO lines.
6	
7	NOTE: If possible, don't use SFRMOUT (SFRM1) signal as a chip select. It will
8	not work correctly (it cannot be controlled by software). Use GPIO lines
9	instead.
10	
11	Sample configuration
12	====================
13	
14	Typically driver configuration is done in platform board files (the files under
15	arch/arm/mach-ep93xx/*.c). In this example we configure MMC over SPI through
16	this driver on TS-7260 board. You can adapt the code to suit your needs.
17	
18	This example uses EGPIO9 as SD/MMC card chip select (this is wired in DIO1
19	header on the board).
20	
21	You need to select CONFIG_MMC_SPI to use mmc_spi driver.
22	
23	arch/arm/mach-ep93xx/ts72xx.c:
24	
25	...
26	#include <linux/gpio.h>
27	#include <linux/spi/spi.h>
28	
29	#include <linux/platform_data/spi-ep93xx.h>
30	
31	/* this is our GPIO line used for chip select */
32	#define MMC_CHIP_SELECT_GPIO EP93XX_GPIO_LINE_EGPIO9
33	
34	static int ts72xx_mmc_spi_setup(struct spi_device *spi)
35	{
36		int err;
37	
38		err = gpio_request(MMC_CHIP_SELECT_GPIO, spi->modalias);
39		if (err)
40			return err;
41	
42		gpio_direction_output(MMC_CHIP_SELECT_GPIO, 1);
43	
44		return 0;
45	}
46	
47	static void ts72xx_mmc_spi_cleanup(struct spi_device *spi)
48	{
49		gpio_set_value(MMC_CHIP_SELECT_GPIO, 1);
50		gpio_direction_input(MMC_CHIP_SELECT_GPIO);
51		gpio_free(MMC_CHIP_SELECT_GPIO);
52	}
53	
54	static void ts72xx_mmc_spi_cs_control(struct spi_device *spi, int value)
55	{
56		gpio_set_value(MMC_CHIP_SELECT_GPIO, value);
57	}
58	
59	static struct ep93xx_spi_chip_ops ts72xx_mmc_spi_ops = {
60		.setup		= ts72xx_mmc_spi_setup,
61		.cleanup	= ts72xx_mmc_spi_cleanup,
62		.cs_control	= ts72xx_mmc_spi_cs_control,
63	};
64	
65	static struct spi_board_info ts72xx_spi_devices[] __initdata = {
66		{
67			.modalias		= "mmc_spi",
68			.controller_data	= &ts72xx_mmc_spi_ops,
69			/*
70			 * We use 10 MHz even though the maximum is 7.4 MHz. The driver
71			 * will limit it automatically to max. frequency.
72			 */
73			.max_speed_hz		= 10 * 1000 * 1000,
74			.bus_num		= 0,
75			.chip_select		= 0,
76			.mode			= SPI_MODE_0,
77		},
78	};
79	
80	static struct ep93xx_spi_info ts72xx_spi_info = {
81		.num_chipselect	= ARRAY_SIZE(ts72xx_spi_devices),
82	};
83	
84	static void __init ts72xx_init_machine(void)
85	{
86		...
87		ep93xx_register_spi(&ts72xx_spi_info, ts72xx_spi_devices,
88				    ARRAY_SIZE(ts72xx_spi_devices));
89	}
90	
91	The driver can use DMA for the transfers also. In this case ts72xx_spi_info
92	becomes:
93	
94	static struct ep93xx_spi_info ts72xx_spi_info = {
95		.num_chipselect	= ARRAY_SIZE(ts72xx_spi_devices),
96		.use_dma	= true;
97	};
98	
99	Note that CONFIG_EP93XX_DMA should be enabled as well.
100	
101	Thanks to
102	=========
103	Martin Guy, H. Hartley Sweeten and others who helped me during development of
104	the driver. Simplemachines.it donated me a Sim.One board which I used testing
105	the driver on EP9307.
Hide Line Numbers
About Kernel Documentation Linux Kernel Contact Linux Resources Linux Blog

Information is copyright its respective author. All material is available from the Linux Kernel Source distributed under a GPL License. This page is provided as a free service by mjmwired.net.