forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
spi/ep93xx: implemented driver for Cirrus EP93xx SPI controller
This patch adds an SPI master driver for the Cirrus EP93xx SPI controller found in EP93xx chips. Signed-off-by: Mika Westerberg <[email protected]> Signed-off-by: H Hartley Sweeten <[email protected]> Acked-by: H Hartley Sweeten <[email protected]> Signed-off-by: Grant Likely <[email protected]>
- Loading branch information
Showing
5 changed files
with
1,071 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,95 @@ | ||
Cirrus EP93xx SPI controller driver HOWTO | ||
========================================= | ||
|
||
ep93xx_spi driver brings SPI master support for EP93xx SPI controller. Chip | ||
selects are implemented with GPIO lines. | ||
|
||
NOTE: If possible, don't use SFRMOUT (SFRM1) signal as a chip select. It will | ||
not work correctly (it cannot be controlled by software). Use GPIO lines | ||
instead. | ||
|
||
Sample configuration | ||
==================== | ||
|
||
Typically driver configuration is done in platform board files (the files under | ||
arch/arm/mach-ep93xx/*.c). In this example we configure MMC over SPI through | ||
this driver on TS-7260 board. You can adapt the code to suit your needs. | ||
|
||
This example uses EGPIO9 as SD/MMC card chip select (this is wired in DIO1 | ||
header on the board). | ||
|
||
You need to select CONFIG_MMC_SPI to use mmc_spi driver. | ||
|
||
arch/arm/mach-ep93xx/ts72xx.c: | ||
|
||
... | ||
#include <linux/gpio.h> | ||
#include <linux/spi/spi.h> | ||
|
||
#include <mach/ep93xx_spi.h> | ||
|
||
/* this is our GPIO line used for chip select */ | ||
#define MMC_CHIP_SELECT_GPIO EP93XX_GPIO_LINE_EGPIO9 | ||
|
||
static int ts72xx_mmc_spi_setup(struct spi_device *spi) | ||
{ | ||
int err; | ||
|
||
err = gpio_request(MMC_CHIP_SELECT_GPIO, spi->modalias); | ||
if (err) | ||
return err; | ||
|
||
gpio_direction_output(MMC_CHIP_SELECT_GPIO, 1); | ||
|
||
return 0; | ||
} | ||
|
||
static void ts72xx_mmc_spi_cleanup(struct spi_device *spi) | ||
{ | ||
gpio_set_value(MMC_CHIP_SELECT_GPIO, 1); | ||
gpio_direction_input(MMC_CHIP_SELECT_GPIO); | ||
gpio_free(MMC_CHIP_SELECT_GPIO); | ||
} | ||
|
||
static void ts72xx_mmc_spi_cs_control(struct spi_device *spi, int value) | ||
{ | ||
gpio_set_value(MMC_CHIP_SELECT_GPIO, value); | ||
} | ||
|
||
static struct ep93xx_spi_chip_ops ts72xx_mmc_spi_ops = { | ||
.setup = ts72xx_mmc_spi_setup, | ||
.cleanup = ts72xx_mmc_spi_cleanup, | ||
.cs_control = ts72xx_mmc_spi_cs_control, | ||
}; | ||
|
||
static struct spi_board_info ts72xx_spi_devices[] __initdata = { | ||
{ | ||
.modalias = "mmc_spi", | ||
.controller_data = &ts72xx_mmc_spi_ops, | ||
/* | ||
* We use 10 MHz even though the maximum is 7.4 MHz. The driver | ||
* will limit it automatically to max. frequency. | ||
*/ | ||
.max_speed_hz = 10 * 1000 * 1000, | ||
.bus_num = 0, | ||
.chip_select = 0, | ||
.mode = SPI_MODE_0, | ||
}, | ||
}; | ||
|
||
static struct ep93xx_spi_info ts72xx_spi_info = { | ||
.num_chipselect = ARRAY_SIZE(ts72xx_spi_devices), | ||
}; | ||
|
||
static void __init ts72xx_init_machine(void) | ||
{ | ||
... | ||
ep93xx_register_spi(&ts72xx_spi_info, ts72xx_spi_devices, | ||
ARRAY_SIZE(ts72xx_spi_devices)); | ||
} | ||
|
||
Thanks to | ||
========= | ||
Martin Guy, H. Hartley Sweeten and others who helped me during development of | ||
the driver. Simplemachines.it donated me a Sim.One board which I used testing | ||
the driver on EP9307. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
#ifndef __ASM_MACH_EP93XX_SPI_H | ||
#define __ASM_MACH_EP93XX_SPI_H | ||
|
||
struct spi_device; | ||
|
||
/** | ||
* struct ep93xx_spi_info - EP93xx specific SPI descriptor | ||
* @num_chipselect: number of chip selects on this board, must be | ||
* at least one | ||
*/ | ||
struct ep93xx_spi_info { | ||
int num_chipselect; | ||
}; | ||
|
||
/** | ||
* struct ep93xx_spi_chip_ops - operation callbacks for SPI slave device | ||
* @setup: setup the chip select mechanism | ||
* @cleanup: cleanup the chip select mechanism | ||
* @cs_control: control the device chip select | ||
*/ | ||
struct ep93xx_spi_chip_ops { | ||
int (*setup)(struct spi_device *spi); | ||
void (*cleanup)(struct spi_device *spi); | ||
void (*cs_control)(struct spi_device *spi, int value); | ||
}; | ||
|
||
#endif /* __ASM_MACH_EP93XX_SPI_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.