[linux-yocto] [PATCH 14/87] arch/arm/mach-axxia/axxia.c: Chip select control for SPI devices.
Bruce Ashfield
bruce.ashfield at windriver.com
Mon May 27 11:08:07 PDT 2013
On 13-05-27 12:55 PM, Paul Butler wrote:
> Signed-off-by: Paul Butler <paul.butler at windriver.com>
Why is this separate from the patch that introduces mach-axxia ?
Bruce
> ---
> arch/arm/mach-axxia/axxia.c | 51 ++++++++++++++++++++++++++++++++++-----------
> 1 file changed, 39 insertions(+), 12 deletions(-)
>
> diff --git a/arch/arm/mach-axxia/axxia.c b/arch/arm/mach-axxia/axxia.c
> index 623957e..777f998 100644
> --- a/arch/arm/mach-axxia/axxia.c
> +++ b/arch/arm/mach-axxia/axxia.c
> @@ -48,6 +48,7 @@
> #include <mach/timers.h>
> #include "axxia.h"
> #include "pci.h"
> +#include "i2c.h"
>
> static const char *axxia_dt_match[] __initconst = {
> "lsi,axm5516", /* AXM5516 */
> @@ -157,19 +158,41 @@ static struct of_dev_auxdata axxia_auxdata_lookup[] __initdata = {
> {}
> };
>
> -struct pl022_config_chip spi_eeprom = {
> - .iface = SSP_INTERFACE_MOTOROLA_SPI,
> - .clk_freq = {
> - .cpsdvsr = 0, /* value from 2 to 254 (even only!) */
> - .scr = 0, /* value from 0 to 255 */
> - },
> - .com_mode = POLLING_TRANSFER,
> +static inline void
> +spidev_chip_select(u32 control, unsigned n)
> +{
> + if (control == SSP_CHIP_SELECT)
> + writel(~(1<<n) & 0x1F, ssp_base+0x30);
> + else
> + writel(0x1F, ssp_base+0x30);
> +}
> +
> +static void spi_cs_eeprom0(u32 control) { spidev_chip_select(control, 0); }
> +static void spi_cs_eeprom1(u32 control) { spidev_chip_select(control, 1); }
> +static void spi_cs_eeprom2(u32 control) { spidev_chip_select(control, 2); }
> +
> +struct pl022_config_chip spi_eeprom0 = {
> + .iface = SSP_INTERFACE_MOTOROLA_SPI,
> + .com_mode = POLLING_TRANSFER,
> + .cs_control = spi_cs_eeprom0
> +};
> +
> +struct pl022_config_chip spi_eeprom1 = {
> + .iface = SSP_INTERFACE_MOTOROLA_SPI,
> + .com_mode = POLLING_TRANSFER,
> + .cs_control = spi_cs_eeprom1
> +};
> +
> +struct pl022_config_chip spi_eeprom2 = {
> + .iface = SSP_INTERFACE_MOTOROLA_SPI,
> + .com_mode = POLLING_TRANSFER,
> + .cs_control = spi_cs_eeprom2
> };
>
> static struct spi_board_info spi_devs[] __initdata = {
> {
> .modalias = "spidev",
> - .controller_data = &spi_eeprom,
> + .controller_data = &spi_eeprom0,
> .bus_num = 0,
> .chip_select = 0,
> .max_speed_hz = 12000000,
> @@ -177,7 +200,7 @@ static struct spi_board_info spi_devs[] __initdata = {
> },
> {
> .modalias = "spidev",
> - .controller_data = &spi_eeprom,
> + .controller_data = &spi_eeprom1,
> .bus_num = 0,
> .chip_select = 1,
> .max_speed_hz = 12000000,
> @@ -185,7 +208,7 @@ static struct spi_board_info spi_devs[] __initdata = {
> },
> {
> .modalias = "spidev",
> - .controller_data = &spi_eeprom,
> + .controller_data = &spi_eeprom2,
> .bus_num = 0,
> .chip_select = 2,
> .max_speed_hz = 12000000,
> @@ -208,11 +231,15 @@ void __init axxia_dt_init(void)
> ssp_base =
> of_iomap(of_find_compatible_node(NULL, NULL, "arm,pl022"), 0);
> if (!WARN_ON(ssp_base == NULL)) {
> - printk(KERN_INFO "SSPCSR = %08x\n", readl(ssp_base+0x30));
> - writel((0x1F << 8) | (0<<5) | (0x1F<<0), ssp_base+0x30);
> + /* Use legacy mode, bits 0..4 control nCS[0..4] pins */
> + writel(0x1F, ssp_base+0x30);
> }
>
> axxia_pcie_init();
> +
> +#ifdef CONFIG_I2C
> + axxia_register_i2c_busses();
> +#endif
> }
>
> static void axxia_restart(char str, const char *cmd)
>
More information about the linux-yocto
mailing list