spi: s3c64xx: add support for exynos7 SPI controller
Subsystems (4)
PATCH 1/1 spi: s3c64xx: add support for exynos7 SPI controller
Exynos7 SPI controller supports only the auto Selection of CS toggle mode and Exynos7 SoC includes six SPI controllers. Add support for these changes in Exynos7 SPI controller driver.
--- .../devicetree/bindings/spi/spi-samsung.txt | 2 +- drivers/spi/Kconfig | 2 +- drivers/spi/spi-s3c64xx.c | 32 ++++++++++++++++--- 3 files changed, 29 insertions(+), 7 deletions(-)
Documentation/devicetree/bindings/spi/spi-samsung.txt +1 -1
@@ -9,7 +9,7 @@ Required SoC Specific Properties: - samsung,s3c2443-spi: for s3c2443, s3c2416 and s3c2450 platforms - samsung,s3c6410-spi: for s3c6410 platforms - samsung,s5pv210-spi: for s5pv210 and s5pc110 platforms - - samsung,exynos4210-spi: for exynos4 and exynos5 platforms + - samsung,exynos7-spi: for exynos7 platforms - reg: physical base address of the controller and length of memory mapped region.
drivers/spi/Kconfig +1 -1
@@ -444,7 +444,7 @@ config SPI_S3C24XX_FIQ config SPI_S3C64XX tristate "Samsung S3C64XX series type SPI" - depends on PLAT_SAMSUNG + depends on (PLAT_SAMSUNG || ARCH_EXYNOS) select S3C64XX_PL080 if ARCH_S3C64XX help SPI driver for Samsung S3C64XX and newer SoCs.
drivers/spi/spi-s3c64xx.c +27 -5
@@ -33,8 +33,9 @@#include <linux/platform_data/spi-s3c64xx.h> -#define MAX_SPI_PORTS 3 +#define MAX_SPI_PORTS 6#define S3C64XX_SPI_QUIRK_POLL (1 << 0) +#define S3C64XX_SPI_QUIRK_CS_AUTO (1 << 1)/* Registers and bit-fields */
@@ -78,6 +79,7 @@#define S3C64XX_SPI_SLAVE_AUTO (1<<1)#define S3C64XX_SPI_SLAVE_SIG_INACT (1<<0) +#define S3C64XX_SPI_SLAVE_NSC_CNT_2 (2<<4)#define S3C64XX_SPI_INT_TRAILING_EN (1<<6)#define S3C64XX_SPI_INT_RX_OVERRUN_EN (1<<5)
@@ -717,7 +719,12 @@ static int s3c64xx_spi_transfer_one(struct spi_master *master,enable_datapath (sdd, spi, xfer, use_dma);/* Start the signals */ -writel (0 , sdd->regs +S3C64XX_SPI_SLAVE_SEL ); +if (!(sdd->port_conf->quirks &S3C64XX_SPI_QUIRK_CS_AUTO )) +writel (0 , sdd->regs +S3C64XX_SPI_SLAVE_SEL ); +else +writel (readl (sdd->regs +S3C64XX_SPI_SLAVE_SEL ) + |S3C64XX_SPI_SLAVE_AUTO |S3C64XX_SPI_SLAVE_NSC_CNT_2 , + sdd->regs +S3C64XX_SPI_SLAVE_SEL );spin_unlock_irqrestore (&sdd->lock, flags);
@@ -866,13 +873,15 @@ static int s3c64xx_spi_setup(struct spi_device *spi) }pm_runtime_put (&sdd->pdev->dev); -writel (S3C64XX_SPI_SLAVE_SIG_INACT , sdd->regs +S3C64XX_SPI_SLAVE_SEL ); +if (!(sdd->port_conf->quirks &S3C64XX_SPI_QUIRK_CS_AUTO )) +writel (S3C64XX_SPI_SLAVE_SIG_INACT , sdd->regs +S3C64XX_SPI_SLAVE_SEL );return 0 ; setup_exit:pm_runtime_put (&sdd->pdev->dev);/* setup() returns with device de-selected */ -writel (S3C64XX_SPI_SLAVE_SIG_INACT , sdd->regs +S3C64XX_SPI_SLAVE_SEL ); +if (!(sdd->port_conf->quirks &S3C64XX_SPI_QUIRK_CS_AUTO )) +writel (S3C64XX_SPI_SLAVE_SIG_INACT , sdd->regs +S3C64XX_SPI_SLAVE_SEL );if (gpio_is_valid (spi->cs_gpio))gpio_free (spi->cs_gpio);
@@ -946,7 +955,8 @@ static void s3c64xx_spi_hwinit(struct s3c64xx_spi_driver_data *sdd, int channel) sdd->cur_speed =0 ; -writel (S3C64XX_SPI_SLAVE_SIG_INACT , sdd->regs +S3C64XX_SPI_SLAVE_SEL ); +if (!(sdd->port_conf->quirks &S3C64XX_SPI_QUIRK_CS_AUTO )) +writel (S3C64XX_SPI_SLAVE_SIG_INACT , sdd->regs +S3C64XX_SPI_SLAVE_SEL );/* Disable Interrupts - we use Polling if not DMA mode */ writel (0 , regs +S3C64XX_SPI_INT_EN );
@@ -1341,6 +1351,15 @@ static struct s3c64xx_spi_port_config exynos5440_spi_port_config = { .quirks = S3C64XX_SPI_QUIRK_POLL, }; +static struct s3c64xx_spi_port_config exynos7_spi_port_config = { + .fifo_lvl_mask = {0x1ff ,0x7F ,0x7F ,0x7F ,0x7F ,0x1ff }, + .rx_lvl_offset =15 , + .tx_st_done =25 , + .high_speed = true, + .clk_from_cmu = true, + .quirks =S3C64XX_SPI_QUIRK_CS_AUTO , +}; +static struct platform_device_id s3c64xx_spi_driver_ids[] = { { .name ="s3c2443-spi" ,
@@ -1374,6 +1393,9 @@ static const struct of_device_id s3c64xx_spi_dt_match[] = { { .compatible = "samsung,exynos5440-spi", .data = (void *)&exynos5440_spi_port_config, }, + { .compatible = "samsung,exynos7-spi", + .data = (void *)&exynos7_spi_port_config, + }, { }, };MODULE_DEVICE_TABLE (of, s3c64xx_spi_dt_match);
Signature · 1 line
1.7.4.4
Mark Brown
maintainerPATCH 1/1 spi: s3c64xx: add support for exynos7 SPI controller
Quoted 3 lines · Padmavathi Venna
Exynos7 SPI controller supports only the auto Selection of CS toggle mode and Exynos7 SoC includes six SPI controllers. Add support for these changes in Exynos7 SPI controller driver.
Could you give a bit more detail on what the "auto selection of CS toggle mode" is - in the diff it looks like it's not an existing mode. I'm a bit worried that it's not going to function well with devices that send more than one transfer per message.
Quoted 1 line
Signed-off-by Padmavathi Venna <[email protected]>
It's better if your signoff is using the same e-maill address as
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 473 bytes
Desc: Digital signature
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20141106/c9b3884b/attachment.sig>
PATCH 1/1 spi: s3c64xx: add support for exynos7 SPI controller
Hi Mark,
CCing Kukjin Kim.
Quoted 9 lines · Mark Brown
Quoted 3 lines · Padmavathi Venna
Exynos7 SPI controller supports only the auto Selection of CS toggle mode and Exynos7 SoC includes six SPI controllers. Add support for these changes in Exynos7 SPI controller driver.
Could you give a bit more detail on what the "auto selection of CS toggle mode" is - in the diff it looks like it's not an existing mode. I'm a bit worried that it's not going to function well with devices that send more than one transfer per message.
There is a bit AUTO_N_MANUAL(as per manual) in the spi CS_CFG register(as per manual, in the driver it is S3C64XX_SPI_SLAVE_SEL) to control the CS toggle mode either manually or automatically. If CS has to be controlled manually the AUTO_N_MANUAL should be set to 0 which the driver is doing in the s3c64xx_spi_transfer_one function by writing 0 in the S3C64XX_SPI_SLAVE_SEL. When it is handled manually NSSOUT as per the manual(in the driver it is S3C64XX_SPI_SLAVE_SIG_INACT) controls the level of CS which when set deactivates the signal and reset activates.
CS can also be controlled automatically by setting AUTO_N_MANUAL to 1 in CS_CFG. When it is auto CS automatically toggles between packet to packet. NCS_TIME_COUNT in CS_CFG controls the inactive period. The driver by default uses manual mode. But on exynos7 the manual mode is removed.
I tested the driver with wm5110 codec.
Quoted 4 lines
Quoted 2 lines
Signed-off-by Padmavathi Venna <[email protected]>It's better if your signoff is using the same e-maill address as
ok. I will take care of this.
Quoted 1 line
Thanks
Padma
Mark Brown
maintainerPATCH 1/1 spi: s3c64xx: add support for exynos7 SPI controller
Quoted 5 lines · Padma Venkat
CS can also be controlled automatically by setting
AUTO_N_MANUALto 1 inCS_CFG. When it is auto CS automatically toggles between packet to packet.NCS_TIME_COUNTinCS_CFGcontrols the inactive period. The driver by default uses manual mode. But on exynos7 the manual mode is removed.
OK, but what's a packet here?
Quoted 1 line
I tested the driver with wm5110 codec.
Did you try firmware downloads or something else that generates multiple
transfers in a message? Normal register writes will use a single
transfer so I'd expect them to just work.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 473 bytes
Desc: Digital signature
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20141107/83c9de90/attachment.sig>
PATCH 1/1 spi: s3c64xx: add support for exynos7 SPI controller
Hi Mark,
Quoted 9 lines · Mark Brown
Quoted 5 lines · Padma Venkat
CS can also be controlled automatically by setting
AUTO_N_MANUALto 1 inCS_CFG. When it is auto CS automatically toggles between packet to packet.NCS_TIME_COUNTinCS_CFGcontrols the inactive period. The driver by default uses manual mode. But on exynos7 the manual mode is removed.OK, but what's a packet here?
Packet is either 1 byte or 4 bytes size depends on width of the SPI channel.
Quoted 7 lines
Quoted 2 lines
I tested the driver with wm5110 codec.
Did you try firmware downloads or something else that generates multiple transfers in a message? Normal register writes will use a single transfer so I'd expect them to just work.
OK. I don't have provision to test on this board. I will try to test on older boards by disabling manual mode.
Thanks
padma
PATCH 1/1 spi: s3c64xx: add support for exynos7 SPI controller
Hi Mark,
Quoted 19 lines · Padma Venkat
Hi Mark,
Quoted 9 lines · Mark Brown
Quoted 5 lines · Padma Venkat
CS can also be controlled automatically by setting
AUTO_N_MANUALto 1 inCS_CFG. When it is auto CS automatically toggles between packet to packet.NCS_TIME_COUNTinCS_CFGcontrols the inactive period. The driver by default uses manual mode. But on exynos7 the manual mode is removed.OK, but what's a packet here?
Packet is either 1 byte or 4 bytes size depends on width of the SPI channel.
Quoted 3 lines
Quoted 2 lines
I tested the driver with wm5110 codec.
Quoted 8 lines
Quoted 4 lines
Did you try firmware downloads or something else that generates multiple transfers in a message? Normal register writes will use a single transfer so I'd expect them to just work.
OK. I don't have provision to test on this board. I will try to test on older boards by disabling manual mode.
I tested on exynos5420 peach-pit by enabling auto mode. I used dd command to read 1MB data from spi flash and I compared the result with manual mode. Both are same.
Quoted 3 lines
Thanks
padma
PATCH 1/1 spi: s3c64xx: add support for exynos7 SPI controller
Hi Mark,
Quoted 19 lines
Quoted 19 lines
Quoted 7 lines
Quoted 5 lines
CS can also be controlled automatically by setting
AUTO_N_MANUALto 1 inCS_CFG. When it is auto CS automatically toggles between packet to packet.NCS_TIME_COUNTinCS_CFGcontrols the inactive period. The driver by default uses manual mode. But on exynos7 the manual mode is removed.OK, but what's a packet here?
Packet is either 1 byte or 4 bytes size depends on width of the SPI channel.
Quoted 7 lines
Quoted 2 lines
I tested the driver with wm5110 codec.
Did you try firmware downloads or something else that generates multiple transfers in a message? Normal register writes will use a single transfer so I'd expect them to just work.
Quoted 7 lines
Quoted 3 lines
OK. I don't have provision to test on this board. I will try to test on older boards by disabling manual mode.
I tested on exynos5420 peach-pit by enabling auto mode. I used dd command to read 1MB data from spi flash and I compared the result with manual mode. Both are same.
I also tested this patch with Javier Martinez Canillas patches for enabling spidev nodes from
http://www.spinics.net/lists/linux-samsung-soc/msg39057.html.
I read 4MB flashdata from spi by enabling auto mode and compared the result. They look same.
Quoted 5 lines
Quoted 4 lines
Thanks
padma
PATCH 1/1 spi: s3c64xx: add support for exynos7 SPI controller
Hi Mark,
Quoted 8 lines
Quoted 7 lines
Quoted 3 lines
OK. I don't have provision to test on this board. I will try to test on older boards by disabling manual mode.
I tested on exynos5420 peach-pit by enabling auto mode. I used dd command to read 1MB data from spi flash and I compared the result with manual mode. Both are same.
Quoted 6 lines
I also tested this patch with Javier Martinez Canillas patches for enabling spidev nodes from
http://www.spinics.net/lists/linux-samsung-soc/msg39057.html.I read 4MB flashdata from spi by enabling auto mode and compared the result. They look same.
Do want some extra tests need to be done for this patch or is it okey?
Quoted 7 lines
Quoted 6 lines
Quoted 5 lines
Thanks
padma
Mark Brown
maintainerPATCH 1/1 spi: s3c64xx: add support for exynos7 SPI controller
In reply to Padmavathi VennaQuoted 3 lines · Padmavathi Venna
Exynos7 SPI controller supports only the auto Selection of CS toggle mode and Exynos7 SoC includes six SPI controllers. Add support for these changes in Exynos7 SPI controller driver.
Applied, thanks. It does seem like these controllers are getting more
restricted in functionality which seems a bit of a shame.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 473 bytes
Desc: Digital signature
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20141126/5edae93c/attachment.sig>