linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
From: chris@techworks.ie (Christian Gagneraud)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH RFC 2/3] AT91: SPI: Split SPI controller device and SPI device
Date: Tue, 31 May 2011 17:04:22 +0100	[thread overview]
Message-ID: <1306857863-13424-3-git-send-email-chris@techworks.ie> (raw)
In-Reply-To: <1306857863-13424-1-git-send-email-chris@techworks.ie>

Add a new atmel_spi_data structure to allow platform specific GPIO handling.
Make at91_add_device_spi(), a function to add a SPI controller device.
Plaform's SPI devices are now simply added by calling
spi_register_board_info() from the board file.

Signed-off-by: Christian Gagneraud <chris@techworks.ie>
---
 arch/arm/mach-at91/at91sam9260_devices.c |   60 ++++++++++++++----------------
 arch/arm/mach-at91/include/mach/board.h  |   11 +++++-
 2 files changed, 38 insertions(+), 33 deletions(-)

diff --git a/arch/arm/mach-at91/at91sam9260_devices.c b/arch/arm/mach-at91/at91sam9260_devices.c
index 07eb7b0..e34225f 100644
--- a/arch/arm/mach-at91/at91sam9260_devices.c
+++ b/arch/arm/mach-at91/at91sam9260_devices.c
@@ -545,7 +545,12 @@ static struct platform_device at91sam9260_spi0_device = {
 	.num_resources	= ARRAY_SIZE(spi0_resources),
 };
 
-static const unsigned spi0_standard_cs[4] = { AT91_PIN_PA3, AT91_PIN_PC11, AT91_PIN_PC16, AT91_PIN_PC17 };
+static struct gpio spi0_standard_cs_pins[] = {
+	{ .gpio = AT91_PIN_PA3,  },
+	{ .gpio = AT91_PIN_PC11, },
+	{ .gpio = AT91_PIN_PC16, },
+	{ .gpio = AT91_PIN_PC17, },
+};
 
 static struct resource spi1_resources[] = {
 	[0] = {
@@ -571,53 +576,44 @@ static struct platform_device at91sam9260_spi1_device = {
 	.num_resources	= ARRAY_SIZE(spi1_resources),
 };
 
-static const unsigned spi1_standard_cs[4] = { AT91_PIN_PB3, AT91_PIN_PC5, AT91_PIN_PC4, AT91_PIN_PC3 };
+static struct gpio spi1_standard_cs_pins[] = {
+	{ .gpio = AT91_PIN_PB3, },
+	{ .gpio = AT91_PIN_PC5, },
+	{ .gpio = AT91_PIN_PC4, },
+	{ .gpio = AT91_PIN_PC3, },
+};
 
-void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices)
+void __init at91_add_device_spi(struct atmel_spi_data *data)
 {
 	int i;
-	unsigned long cs_pin;
-	short enable_spi0 = 0;
-	short enable_spi1 = 0;
-
-	/* Choose SPI chip-selects */
-	for (i = 0; i < nr_devices; i++) {
-		if (devices[i].controller_data)
-			cs_pin = (unsigned long) devices[i].controller_data;
-		else if (devices[i].bus_num == 0)
-			cs_pin = spi0_standard_cs[devices[i].chip_select];
-		else
-			cs_pin = spi1_standard_cs[devices[i].chip_select];
-
-		if (devices[i].bus_num == 0)
-			enable_spi0 = 1;
-		else
-			enable_spi1 = 1;
-
-		/* enable chip-select pin */
-		at91_set_gpio_output(cs_pin, 1);
-
-		/* pass chip-select pin to driver */
-		devices[i].controller_data = (void *) cs_pin;
-	}
 
-	spi_register_board_info(devices, nr_devices);
+	if (data->bus_num == 0) {
+		/* enable chip-select pins */
+		if (!data->cs_pins)
+			data->cs_pins = spi0_standard_cs_pins;
+		for (i = 0; i < data->num_cs_pin; i++)
+			at91_set_gpio_output(data->cs_pins[i].gpio, 1);
 
-	/* Configure SPI bus(es) */
-	if (enable_spi0) {
 		at91_set_A_periph(AT91_PIN_PA0, 0);	/* SPI0_MISO */
 		at91_set_A_periph(AT91_PIN_PA1, 0);	/* SPI0_MOSI */
 		at91_set_A_periph(AT91_PIN_PA2, 0);	/* SPI1_SPCK */
 
 		at91_clock_associate("spi0_clk", &at91sam9260_spi0_device.dev, "spi_clk");
+		platform_set_drvdata(&at91sam9260_spi0_device, data);
 		platform_device_register(&at91sam9260_spi0_device);
-	}
-	if (enable_spi1) {
+	} else if (data->bus_num == 1) {
+		/* enable chip-select pins */
+		if (!data->cs_pins)
+			data->cs_pins = spi1_standard_cs_pins;
+		for (i = 0; i < data->num_cs_pin; i++)
+			at91_set_gpio_output(data->cs_pins[i].gpio, 1);
+
 		at91_set_A_periph(AT91_PIN_PB0, 0);	/* SPI1_MISO */
 		at91_set_A_periph(AT91_PIN_PB1, 0);	/* SPI1_MOSI */
 		at91_set_A_periph(AT91_PIN_PB2, 0);	/* SPI1_SPCK */
 
 		at91_clock_associate("spi1_clk", &at91sam9260_spi1_device.dev, "spi_clk");
+		platform_set_drvdata(&at91sam9260_spi1_device, data);
 		platform_device_register(&at91sam9260_spi1_device);
 	}
 }
diff --git a/arch/arm/mach-at91/include/mach/board.h b/arch/arm/mach-at91/include/mach/board.h
index 2b499eb..d7cc95f 100644
--- a/arch/arm/mach-at91/include/mach/board.h
+++ b/arch/arm/mach-at91/include/mach/board.h
@@ -124,7 +124,16 @@ extern void __init at91_add_device_i2c(struct i2c_board_info *devices, int nr_de
 #endif
 
  /* SPI */
-extern void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices);
+struct atmel_spi_data {
+	unsigned	bus_num;
+	unsigned	num_cs_pin;
+	struct gpio	*cs_pins;
+	unsigned	flags;
+#define ATMEL_SPI_CS_DEC	0x01	/* The CS pins are decoded to
+					   (2^num_cs_pin)-1 logical CS
+					   lines */
+};
+extern void __init at91_add_device_spi(struct atmel_spi_data *data);
 
  /* Serial */
 #define ATMEL_UART_CTS	0x01
-- 
1.7.4.1

  parent reply	other threads:[~2011-05-31 16:04 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-05-31 16:04 [PATCH RFC 0/3] AT91: SPI: Add peripheral chip select decoding Christian Gagneraud
2011-05-31 16:04 ` [PATCH RFC 1/3] AT91: SPI: Add CS decode support Christian Gagneraud
2011-05-31 16:04 ` Christian Gagneraud [this message]
2011-05-31 16:04 ` [PATCH RFC 3/3] AT91: SPI: Add example of platform specific CS/GPIO usage Christian Gagneraud

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1306857863-13424-3-git-send-email-chris@techworks.ie \
    --to=chris@techworks.ie \
    --cc=linux-arm-kernel@lists.infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).