Changeset 31117 for trunk


Ignore:
Timestamp:
2012-03-27T21:38:15+02:00 (4 years ago)
Author:
juhosg
Message:

ar71xx: improve SPI flash read/write performance

mtd_speedtest results:

page write speed

old new delta

DB120 209 KiB/s 226 KiB/s +8.13%
TL-WR1043ND v1 122 KiB/s 148 KiB/s +21.31%
TL-WR703N v1 153 KiB/s 194 KiB/s +26.80%
TL-MR3220 v1 130 KiB/s 156 KiB/s +20.00%
TL-WR2543ND v1 158 KiB/s 202 KiB/s +27.85%
TL-WR741ND v2 122 KiB/s 152 KiB/s +24.59%
ALFA AP96 229 KiB/s 260 KiB/s +13.54%
WNDR3700 202 KiB/s 223 KiB/s +10.40%

page read speed

old new delta

DB120 691 KiB/s 929 KiB/s +34.44%
TL-WR1043ND v1 372 KiB/s 754 KiB/s +102.69%
TL-WR703N v1 375 KiB/s 745 KiB/s +98.67%
TL-MR3220 v1 372 KiB/s 752 KiB/s +102.15%
TL-WR2543ND v1 307 KiB/s 564 KiB/s +83.71%
TL-WR741ND v2 315 KiB/s 525 KiB/s +66.67%
ALFA AP96 515 KiB/s 702 KiB/s +36.31%
WNDR3700 515 KiB/s 697 KiB/s +35.34%

Location:
trunk/target/linux/ar71xx
Files:
2 added
2 deleted
12 edited
2 moved

Legend:

Unmodified
Added
Removed
  • trunk/target/linux/ar71xx/patches-3.2/201-spi-ath79-add-delay-between-SCK-changes.patch

    r29868 r31117  
    1 From 48b7e765e6e097d20d809fadd17a4355d26ad6d5 Mon Sep 17 00:00:00 2001 
     1From 8e948c035dd7983eccc3a889f2497e64044f3a31 Mon Sep 17 00:00:00 2001 
    22From: Gabor Juhos <juhosg@openwrt.org> 
    33Date: Wed, 11 Jan 2012 20:06:35 +0100 
     
    1313Signed-off-by: Gabor Juhos <juhosg@openwrt.org> 
    1414--- 
    15  drivers/spi/spi-ath79.c |    8 ++++++++ 
    16  1 files changed, 8 insertions(+), 0 deletions(-) 
     15 drivers/spi/spi-ath79.c |   44 +++++++++++++++++++++++++++++++++++++++++++- 
     16 1 files changed, 43 insertions(+), 1 deletions(-) 
    1717 
    1818--- a/drivers/spi/spi-ath79.c 
    1919+++ b/drivers/spi/spi-ath79.c 
    20 @@ -52,6 +52,12 @@ static inline struct ath79_spi *ath79_sp 
     20@@ -24,17 +24,24 @@ 
     21 #include <linux/spi/spi_bitbang.h> 
     22 #include <linux/bitops.h> 
     23 #include <linux/gpio.h> 
     24+#include <linux/clk.h> 
     25+#include <linux/err.h> 
     26  
     27 #include <asm/mach-ath79/ar71xx_regs.h> 
     28 #include <asm/mach-ath79/ath79_spi_platform.h> 
     29  
     30 #define DRV_NAME       "ath79-spi" 
     31  
     32+#define ATH79_SPI_RRW_DELAY_FACTOR     12000 
     33+#define MHZ                            (1000 * 1000) 
     34+ 
     35 struct ath79_spi { 
     36        struct spi_bitbang      bitbang; 
     37        u32                     ioc_base; 
     38        u32                     reg_ctrl; 
     39        void __iomem            *base; 
     40+       struct clk              *clk; 
     41+       unsigned                rrw_delay; 
     42 }; 
     43  
     44 static inline u32 ath79_spi_rr(struct ath79_spi *sp, unsigned reg) 
     45@@ -52,6 +59,12 @@ static inline struct ath79_spi *ath79_sp 
    2146        return spi_master_get_devdata(spi->master); 
    2247 } 
    2348  
    24 +static inline void ath79_spi_delay(unsigned nsecs) 
     49+static inline void ath79_spi_delay(struct ath79_spi *sp, unsigned nsecs) 
    2550+{ 
    26 +       if (nsecs) 
    27 +               ndelay(nsecs); 
     51+       if (nsecs > sp->rrw_delay) 
     52+               ndelay(nsecs - sp->rrw_delay); 
    2853+} 
    2954+ 
     
    3156 { 
    3257        struct ath79_spi *sp = ath79_spidev_to_sp(spi); 
    33 @@ -184,7 +190,9 @@ static u32 ath79_spi_txrx_mode0(struct s 
     58@@ -184,7 +197,9 @@ static u32 ath79_spi_txrx_mode0(struct s 
    3459  
    3560                /* setup MSB (to slave) on trailing edge */ 
    3661                ath79_spi_wr(sp, AR71XX_SPI_REG_IOC, out); 
    37 +               ath79_spi_delay(nsecs); 
     62+               ath79_spi_delay(sp, nsecs); 
    3863                ath79_spi_wr(sp, AR71XX_SPI_REG_IOC, out | AR71XX_SPI_IOC_CLK); 
    39 +               ath79_spi_delay(nsecs); 
     64+               ath79_spi_delay(sp, nsecs); 
    4065  
    4166                word <<= 1; 
    4267        } 
     68@@ -198,6 +213,7 @@ static __devinit int ath79_spi_probe(str 
     69        struct ath79_spi *sp; 
     70        struct ath79_spi_platform_data *pdata; 
     71        struct resource *r; 
     72+       unsigned long rate; 
     73        int ret; 
     74  
     75        master = spi_alloc_master(&pdev->dev, sizeof(*sp)); 
     76@@ -239,12 +255,36 @@ static __devinit int ath79_spi_probe(str 
     77                goto err_put_master; 
     78        } 
     79  
     80+       sp->clk = clk_get(&pdev->dev, "ahb"); 
     81+       if (IS_ERR(sp->clk)) { 
     82+               ret = PTR_ERR(sp->clk); 
     83+               goto err_unmap; 
     84+       } 
     85+ 
     86+       ret = clk_enable(sp->clk); 
     87+       if (ret) 
     88+               goto err_clk_put; 
     89+ 
     90+       rate = DIV_ROUND_UP(clk_get_rate(sp->clk), MHZ); 
     91+       if (!rate) { 
     92+               ret = -EINVAL; 
     93+               goto err_clk_disable; 
     94+       } 
     95+ 
     96+       sp->rrw_delay = ATH79_SPI_RRW_DELAY_FACTOR / rate; 
     97+       dev_dbg(&pdev->dev, "register read/write delay is %u nsecs\n", 
     98+               sp->rrw_delay); 
     99+ 
     100        ret = spi_bitbang_start(&sp->bitbang); 
     101        if (ret) 
     102-               goto err_unmap; 
     103+               goto err_clk_disable; 
     104  
     105        return 0; 
     106  
     107+err_clk_disable: 
     108+       clk_disable(sp->clk); 
     109+err_clk_put: 
     110+       clk_put(sp->clk); 
     111 err_unmap: 
     112        iounmap(sp->base); 
     113 err_put_master: 
     114@@ -259,6 +299,8 @@ static __devexit int ath79_spi_remove(st 
     115        struct ath79_spi *sp = platform_get_drvdata(pdev); 
     116  
     117        spi_bitbang_stop(&sp->bitbang); 
     118+       clk_disable(sp->clk); 
     119+       clk_put(sp->clk); 
     120        iounmap(sp->base); 
     121        platform_set_drvdata(pdev, NULL); 
     122        spi_master_put(sp->bitbang.master); 
  • trunk/target/linux/ar71xx/patches-3.2/202-spi-ath79-add-missing-HIGH-LOW-SCK-transition.patch

    r29868 r31117  
    1 From 0ad8cbbb978bc01de08eadd3357ea188302b83ce Mon Sep 17 00:00:00 2001 
     1From ea7e40aedae58b7a0f0ccd8658063de499734874 Mon Sep 17 00:00:00 2001 
    22From: Gabor Juhos <juhosg@openwrt.org> 
    33Date: Wed, 11 Jan 2012 20:33:41 +0100 
     
    66Signed-off-by: Gabor Juhos <juhosg@openwrt.org> 
    77--- 
    8  drivers/spi/spi-ath79.c |    1 + 
    9  1 files changed, 1 insertions(+), 0 deletions(-) 
     8 drivers/spi/spi-ath79.c |    2 ++ 
     9 1 files changed, 2 insertions(+), 0 deletions(-) 
    1010 
    1111--- a/drivers/spi/spi-ath79.c 
    1212+++ b/drivers/spi/spi-ath79.c 
    13 @@ -193,6 +193,7 @@ static u32 ath79_spi_txrx_mode0(struct s 
    14                 ath79_spi_delay(nsecs); 
     13@@ -200,6 +200,8 @@ static u32 ath79_spi_txrx_mode0(struct s 
     14                ath79_spi_delay(sp, nsecs); 
    1515                ath79_spi_wr(sp, AR71XX_SPI_REG_IOC, out | AR71XX_SPI_IOC_CLK); 
    16                 ath79_spi_delay(nsecs); 
    17 +               ath79_spi_wr(sp, AR71XX_SPI_REG_IOC, out); 
     16                ath79_spi_delay(sp, nsecs); 
     17+               if (bits == 1) 
     18+                       ath79_spi_wr(sp, AR71XX_SPI_REG_IOC, out); 
    1819  
    1920                word <<= 1; 
  • trunk/target/linux/ar71xx/patches-3.2/203-spi-ath79-remove-superfluous-chip-select-code.patch

    r29868 r31117  
    1 From 7385ff2cb72d6a0107890760466b9564aa5204c1 Mon Sep 17 00:00:00 2001 
     1From ecf57a64feb737dec1da72aab21dccd30a88ba19 Mon Sep 17 00:00:00 2001 
    22From: Gabor Juhos <juhosg@openwrt.org> 
    33Date: Mon, 9 Jan 2012 15:03:28 +0100 
     
    1616--- a/drivers/spi/spi-ath79.c 
    1717+++ b/drivers/spi/spi-ath79.c 
    18 @@ -121,12 +121,6 @@ static int ath79_spi_setup_cs(struct spi 
     18@@ -128,12 +128,6 @@ static int ath79_spi_setup_cs(struct spi 
    1919                        gpio_free(cdata->gpio); 
    2020                        return status; 
  • trunk/target/linux/ar71xx/patches-3.2/204-spi-ath79-use-gpio_request_one.patch

    r29934 r31117  
    1 From c5bfb0c760a5d8de7ffc3a6acfb8c782be6af1a5 Mon Sep 17 00:00:00 2001 
     1From dd5b424b0b3f0370f9b63594ad53c16989b6ad78 Mon Sep 17 00:00:00 2001 
    22From: Gabor Juhos <juhosg@openwrt.org> 
    33Date: Mon, 9 Jan 2012 15:04:21 +0100 
     
    1313--- a/drivers/spi/spi-ath79.c 
    1414+++ b/drivers/spi/spi-ath79.c 
    15 @@ -93,6 +93,7 @@ static int ath79_spi_setup_cs(struct spi 
     15@@ -100,6 +100,7 @@ static int ath79_spi_setup_cs(struct spi 
    1616 { 
    1717        struct ath79_spi *sp = ath79_spidev_to_sp(spi); 
     
    2121        cdata = spi->controller_data; 
    2222        if (spi->chip_select && !cdata) 
    23 @@ -108,22 +109,21 @@ static int ath79_spi_setup_cs(struct spi 
     23@@ -115,22 +116,21 @@ static int ath79_spi_setup_cs(struct spi 
    2424        /* TODO: setup speed? */ 
    2525        ath79_spi_wr(sp, AR71XX_SPI_REG_CTRL, 0x43); 
  • trunk/target/linux/ar71xx/patches-3.2/205-spi-ath79-avoid-multiple-initialization-of-the-SPI-c.patch

    r31116 r31117  
    1 From 4518ae06e5fc953abfd9c2b66c6155fc2b2696ce Mon Sep 17 00:00:00 2001 
     1From 25e681989198e94656eab9df22b8b761abd2ae26 Mon Sep 17 00:00:00 2001 
    22From: Gabor Juhos <juhosg@openwrt.org> 
    33Date: Mon, 9 Jan 2012 15:00:46 +0100 
    4 Subject: [PATCH 5/7] spi/ath79: introduce ath79_spi_{en,dis}able helpers 
     4Subject: [PATCH 5/7] spi/ath79: avoid multiple initialization of the SPI controller 
    55 
     6Currently we are initializing the SPI controller in 
     7the chip select line function, and that function is 
     8called once for each SPI device on the bus. If a 
     9board has multiple SPI devices, the controller will 
     10be initialized multiple times. 
     11 
     12Introduce ath79_spi_{en,dis}able helper functions, 
     13and call those from probe/response in order to avoid 
     14the mutliple initialization of the controller. 
     15 
     16Signed-off-by: Gabor Juhos <juhosg@openwrt.org> 
    617--- 
    7  drivers/spi/spi-ath79.c |   41 +++++++++++++++++++++++++---------------- 
    8  1 files changed, 25 insertions(+), 16 deletions(-) 
     18 drivers/spi/spi-ath79.c |   41 ++++++++++++++++++++++++----------------- 
     19 1 files changed, 24 insertions(+), 17 deletions(-) 
    920 
    1021--- a/drivers/spi/spi-ath79.c 
    1122+++ b/drivers/spi/spi-ath79.c 
    12 @@ -89,16 +89,8 @@ static void ath79_spi_chipselect(struct 
     23@@ -96,16 +96,8 @@ static void ath79_spi_chipselect(struct 
    1324  
    1425 } 
     
    2839        ath79_spi_wr(sp, AR71XX_SPI_REG_FS, AR71XX_SPI_FS_GPIO); 
    2940  
    30 @@ -108,6 +100,24 @@ static int ath79_spi_setup_cs(struct spi 
     41@@ -115,6 +107,24 @@ static int ath79_spi_setup_cs(struct spi 
    3142  
    3243        /* TODO: setup speed? */ 
     
    5364        status = 0; 
    5465        if (spi->chip_select) { 
    55 @@ -128,17 +138,10 @@ static int ath79_spi_setup_cs(struct spi 
     66@@ -135,17 +145,10 @@ static int ath79_spi_setup_cs(struct spi 
    5667  
    5768 static void ath79_spi_cleanup_cs(struct spi_device *spi) 
     
    7182  
    7283 static int ath79_spi_setup(struct spi_device *spi) 
    73 @@ -242,13 +245,15 @@ static __devinit int ath79_spi_probe(str 
    74                 goto err_put_master; 
    75         } 
     84@@ -271,12 +274,15 @@ static __devinit int ath79_spi_probe(str 
     85        dev_dbg(&pdev->dev, "register read/write delay is %u nsecs\n", 
     86                sp->rrw_delay); 
    7687  
    7788+       ath79_spi_enable(sp); 
    7889        ret = spi_bitbang_start(&sp->bitbang); 
    7990        if (ret) 
    80 -               goto err_unmap; 
     91-               goto err_clk_disable; 
    8192+               goto err_disable; 
    8293  
    8394        return 0; 
    8495  
    85 -err_unmap: 
    8696+err_disable: 
    8797+       ath79_spi_disable(sp); 
    88         iounmap(sp->base); 
    89  err_put_master: 
    90         platform_set_drvdata(pdev, NULL); 
    91 @@ -262,6 +267,7 @@ static __devexit int ath79_spi_remove(st 
     98 err_clk_disable: 
     99        clk_disable(sp->clk); 
     100 err_clk_put: 
     101@@ -295,6 +301,7 @@ static __devexit int ath79_spi_remove(st 
    92102        struct ath79_spi *sp = platform_get_drvdata(pdev); 
    93103  
    94104        spi_bitbang_stop(&sp->bitbang); 
    95105+       ath79_spi_disable(sp); 
     106        clk_disable(sp->clk); 
     107        clk_put(sp->clk); 
    96108        iounmap(sp->base); 
    97         platform_set_drvdata(pdev, NULL); 
    98         spi_master_put(sp->bitbang.master); 
  • trunk/target/linux/ar71xx/patches-3.2/206-spi-ath79-add-shutdown-handler.patch

    r30391 r31117  
    1 From 1025bfbe327b3f9f7227e781c71751d5251803cb Mon Sep 17 00:00:00 2001 
     1From e01dcc2835017b55e936bd150ddab29bfcf2c63c Mon Sep 17 00:00:00 2001 
    22From: Gabor Juhos <juhosg@openwrt.org> 
    33Date: Wed, 11 Jan 2012 22:19:32 +0100 
     
    1111--- a/drivers/spi/spi-ath79.c 
    1212+++ b/drivers/spi/spi-ath79.c 
    13 @@ -262,7 +262,7 @@ err_put_master: 
     13@@ -296,7 +296,7 @@ err_put_master: 
    1414        return ret; 
    1515 } 
     
    2020        struct ath79_spi *sp = platform_get_drvdata(pdev); 
    2121  
    22 @@ -271,13 +271,23 @@ static __devexit int ath79_spi_remove(st 
     22@@ -307,13 +307,23 @@ static __devexit int ath79_spi_remove(st 
    2323        iounmap(sp->base); 
    2424        platform_set_drvdata(pdev, NULL); 
  • trunk/target/linux/ar71xx/patches-3.2/207-spi-ath79-make-chipselect-logic-more-flexible.patch

    r30391 r31117  
    1 From b875f877d06acb852342636db4c3d1e6c9fe01ba Mon Sep 17 00:00:00 2001 
     1From bdbd9b2861ba73557795915598bb276a8568d130 Mon Sep 17 00:00:00 2001 
    22From: Gabor Juhos <juhosg@openwrt.org> 
    33Date: Wed, 11 Jan 2012 22:25:11 +0100 
     
    66Signed-off-by: Gabor Juhos <juhosg@openwrt.org> 
    77--- 
     8 arch/mips/ath79/mach-ap121.c                       |    6 ++ 
     9 arch/mips/ath79/mach-ap81.c                        |    6 ++ 
     10 arch/mips/ath79/mach-pb44.c                        |    6 ++ 
     11 arch/mips/ath79/mach-ubnt-xm.c                     |    6 ++ 
    812 .../include/asm/mach-ath79/ath79_spi_platform.h    |    8 ++- 
    9  drivers/spi/spi-ath79.c                            |   65 +++++++++++-------- 
    10  2 files changed, 45 insertions(+), 28 deletions(-) 
     13 drivers/spi/spi-ath79.c                            |   63 ++++++++++++-------- 
     14 6 files changed, 69 insertions(+), 26 deletions(-) 
    1115 
     16--- a/arch/mips/ath79/mach-ap121.c 
     17+++ b/arch/mips/ath79/mach-ap121.c 
     18@@ -58,12 +58,18 @@ static struct gpio_keys_button ap121_gpi 
     19        } 
     20 }; 
     21  
     22+static struct ath79_spi_controller_data ap121_spi0_data = { 
     23+       .cs_type = ATH79_SPI_CS_TYPE_INTERNAL, 
     24+       .cs_line = 0, 
     25+}; 
     26+ 
     27 static struct spi_board_info ap121_spi_info[] = { 
     28        { 
     29                .bus_num        = 0, 
     30                .chip_select    = 0, 
     31                .max_speed_hz   = 25000000, 
     32                .modalias       = "mx25l1606e", 
     33+               .controller_data = &ap121_spi0_data, 
     34        } 
     35 }; 
     36  
     37--- a/arch/mips/ath79/mach-ap81.c 
     38+++ b/arch/mips/ath79/mach-ap81.c 
     39@@ -67,12 +67,18 @@ static struct gpio_keys_button ap81_gpio 
     40        } 
     41 }; 
     42  
     43+static struct ath79_spi_controller_data ap81_spi0_data = { 
     44+       .cs_type = ATH79_SPI_CS_TYPE_INTERNAL, 
     45+       .cs_line = 0, 
     46+}; 
     47+ 
     48 static struct spi_board_info ap81_spi_info[] = { 
     49        { 
     50                .bus_num        = 0, 
     51                .chip_select    = 0, 
     52                .max_speed_hz   = 25000000, 
     53                .modalias       = "m25p64", 
     54+               .controller_data = &ap81_spi0_data, 
     55        } 
     56 }; 
     57  
     58--- a/arch/mips/ath79/mach-pb44.c 
     59+++ b/arch/mips/ath79/mach-pb44.c 
     60@@ -87,12 +87,18 @@ static struct gpio_keys_button pb44_gpio 
     61        } 
     62 }; 
     63  
     64+static struct ath79_spi_controller_data pb44_spi0_data = { 
     65+       .cs_type = ATH79_SPI_CS_TYPE_INTERNAL, 
     66+       .cs_line = 0, 
     67+}; 
     68+ 
     69 static struct spi_board_info pb44_spi_info[] = { 
     70        { 
     71                .bus_num        = 0, 
     72                .chip_select    = 0, 
     73                .max_speed_hz   = 25000000, 
     74                .modalias       = "m25p64", 
     75+               .controller_data = &pb44_spi0_data, 
     76        }, 
     77 }; 
     78  
     79--- a/arch/mips/ath79/mach-ubnt-xm.c 
     80+++ b/arch/mips/ath79/mach-ubnt-xm.c 
     81@@ -65,12 +65,18 @@ static struct gpio_keys_button ubnt_xm_g 
     82        } 
     83 }; 
     84  
     85+static struct ath79_spi_controller_data ubnt_xm_spi0_data = { 
     86+       .cs_type = ATH79_SPI_CS_TYPE_INTERNAL, 
     87+       .cs_line = 0, 
     88+}; 
     89+ 
     90 static struct spi_board_info ubnt_xm_spi_info[] = { 
     91        { 
     92                .bus_num        = 0, 
     93                .chip_select    = 0, 
     94                .max_speed_hz   = 25000000, 
     95                .modalias       = "mx25l6405d", 
     96+               .controller_data = &ubnt_xm_spi0_data, 
     97        } 
     98 }; 
     99  
    12100--- a/arch/mips/include/asm/mach-ath79/ath79_spi_platform.h 
    13101+++ b/arch/mips/include/asm/mach-ath79/ath79_spi_platform.h 
     
    30118--- a/drivers/spi/spi-ath79.c 
    31119+++ b/drivers/spi/spi-ath79.c 
    32 @@ -30,6 +30,8 @@ 
    33   
    34  #define DRV_NAME       "ath79-spi" 
    35   
    36 +#define ATH79_SPI_CS_LINE_MAX  2 
     120@@ -35,6 +35,8 @@ 
     121 #define ATH79_SPI_RRW_DELAY_FACTOR     12000 
     122 #define MHZ                            (1000 * 1000) 
     123  
     124+#define ATH79_SPI_CS_LINE_MAX          2 
    37125+ 
    38126 struct ath79_spi { 
    39127        struct spi_bitbang      bitbang; 
    40128        u32                     ioc_base; 
    41 @@ -62,6 +64,7 @@ static void ath79_spi_chipselect(struct 
     129@@ -69,6 +71,7 @@ static void ath79_spi_chipselect(struct 
    42130 { 
    43131        struct ath79_spi *sp = ath79_spidev_to_sp(spi); 
     
    47135        if (is_active) { 
    48136                /* set initial clock polarity */ 
    49 @@ -73,20 +76,21 @@ static void ath79_spi_chipselect(struct 
     137@@ -80,20 +83,21 @@ static void ath79_spi_chipselect(struct 
    50138                ath79_spi_wr(sp, AR71XX_SPI_REG_IOC, sp->ioc_base); 
    51139        } 
     
    78166  
    79167 static void ath79_spi_enable(struct ath79_spi *sp) 
    80 @@ -113,24 +117,30 @@ static void ath79_spi_disable(struct ath 
     168@@ -120,24 +124,30 @@ static void ath79_spi_disable(struct ath 
    81169 static int ath79_spi_setup_cs(struct spi_device *spi) 
    82170 { 
     
    113201  
    114202        return status; 
    115 @@ -138,9 +148,15 @@ static int ath79_spi_setup_cs(struct spi 
     203@@ -145,9 +155,15 @@ static int ath79_spi_setup_cs(struct spi 
    116204  
    117205 static void ath79_spi_cleanup_cs(struct spi_device *spi) 
     
    132220 } 
    133221  
    134 @@ -206,6 +222,10 @@ static __devinit int ath79_spi_probe(str 
    135         struct resource *r; 
     222@@ -215,6 +231,10 @@ static __devinit int ath79_spi_probe(str 
     223        unsigned long rate; 
    136224        int ret; 
    137225  
     
    143231        if (master == NULL) { 
    144232                dev_err(&pdev->dev, "failed to allocate spi master\n"); 
    145 @@ -215,17 +235,10 @@ static __devinit int ath79_spi_probe(str 
     233@@ -224,17 +244,10 @@ static __devinit int ath79_spi_probe(str 
    146234        sp = spi_master_get_devdata(master); 
    147235        platform_set_drvdata(pdev, sp); 
  • trunk/target/linux/ar71xx/patches-3.3/201-spi-ath79-add-delay-between-SCK-changes.patch

    r30410 r31117  
    1 From 48b7e765e6e097d20d809fadd17a4355d26ad6d5 Mon Sep 17 00:00:00 2001 
     1From 8e948c035dd7983eccc3a889f2497e64044f3a31 Mon Sep 17 00:00:00 2001 
    22From: Gabor Juhos <juhosg@openwrt.org> 
    33Date: Wed, 11 Jan 2012 20:06:35 +0100 
     
    1313Signed-off-by: Gabor Juhos <juhosg@openwrt.org> 
    1414--- 
    15  drivers/spi/spi-ath79.c |    8 ++++++++ 
    16  1 files changed, 8 insertions(+), 0 deletions(-) 
     15 drivers/spi/spi-ath79.c |   44 +++++++++++++++++++++++++++++++++++++++++++- 
     16 1 files changed, 43 insertions(+), 1 deletions(-) 
    1717 
    1818--- a/drivers/spi/spi-ath79.c 
    1919+++ b/drivers/spi/spi-ath79.c 
    20 @@ -52,6 +52,12 @@ static inline struct ath79_spi *ath79_sp 
     20@@ -24,17 +24,24 @@ 
     21 #include <linux/spi/spi_bitbang.h> 
     22 #include <linux/bitops.h> 
     23 #include <linux/gpio.h> 
     24+#include <linux/clk.h> 
     25+#include <linux/err.h> 
     26  
     27 #include <asm/mach-ath79/ar71xx_regs.h> 
     28 #include <asm/mach-ath79/ath79_spi_platform.h> 
     29  
     30 #define DRV_NAME       "ath79-spi" 
     31  
     32+#define ATH79_SPI_RRW_DELAY_FACTOR     12000 
     33+#define MHZ                            (1000 * 1000) 
     34+ 
     35 struct ath79_spi { 
     36        struct spi_bitbang      bitbang; 
     37        u32                     ioc_base; 
     38        u32                     reg_ctrl; 
     39        void __iomem            *base; 
     40+       struct clk              *clk; 
     41+       unsigned                rrw_delay; 
     42 }; 
     43  
     44 static inline u32 ath79_spi_rr(struct ath79_spi *sp, unsigned reg) 
     45@@ -52,6 +59,12 @@ static inline struct ath79_spi *ath79_sp 
    2146        return spi_master_get_devdata(spi->master); 
    2247 } 
    2348  
    24 +static inline void ath79_spi_delay(unsigned nsecs) 
     49+static inline void ath79_spi_delay(struct ath79_spi *sp, unsigned nsecs) 
    2550+{ 
    26 +       if (nsecs) 
    27 +               ndelay(nsecs); 
     51+       if (nsecs > sp->rrw_delay) 
     52+               ndelay(nsecs - sp->rrw_delay); 
    2853+} 
    2954+ 
     
    3156 { 
    3257        struct ath79_spi *sp = ath79_spidev_to_sp(spi); 
    33 @@ -184,7 +190,9 @@ static u32 ath79_spi_txrx_mode0(struct s 
     58@@ -184,7 +197,9 @@ static u32 ath79_spi_txrx_mode0(struct s 
    3459  
    3560                /* setup MSB (to slave) on trailing edge */ 
    3661                ath79_spi_wr(sp, AR71XX_SPI_REG_IOC, out); 
    37 +               ath79_spi_delay(nsecs); 
     62+               ath79_spi_delay(sp, nsecs); 
    3863                ath79_spi_wr(sp, AR71XX_SPI_REG_IOC, out | AR71XX_SPI_IOC_CLK); 
    39 +               ath79_spi_delay(nsecs); 
     64+               ath79_spi_delay(sp, nsecs); 
    4065  
    4166                word <<= 1; 
    4267        } 
     68@@ -198,6 +213,7 @@ static __devinit int ath79_spi_probe(str 
     69        struct ath79_spi *sp; 
     70        struct ath79_spi_platform_data *pdata; 
     71        struct resource *r; 
     72+       unsigned long rate; 
     73        int ret; 
     74  
     75        master = spi_alloc_master(&pdev->dev, sizeof(*sp)); 
     76@@ -239,12 +255,36 @@ static __devinit int ath79_spi_probe(str 
     77                goto err_put_master; 
     78        } 
     79  
     80+       sp->clk = clk_get(&pdev->dev, "ahb"); 
     81+       if (IS_ERR(sp->clk)) { 
     82+               ret = PTR_ERR(sp->clk); 
     83+               goto err_unmap; 
     84+       } 
     85+ 
     86+       ret = clk_enable(sp->clk); 
     87+       if (ret) 
     88+               goto err_clk_put; 
     89+ 
     90+       rate = DIV_ROUND_UP(clk_get_rate(sp->clk), MHZ); 
     91+       if (!rate) { 
     92+               ret = -EINVAL; 
     93+               goto err_clk_disable; 
     94+       } 
     95+ 
     96+       sp->rrw_delay = ATH79_SPI_RRW_DELAY_FACTOR / rate; 
     97+       dev_dbg(&pdev->dev, "register read/write delay is %u nsecs\n", 
     98+               sp->rrw_delay); 
     99+ 
     100        ret = spi_bitbang_start(&sp->bitbang); 
     101        if (ret) 
     102-               goto err_unmap; 
     103+               goto err_clk_disable; 
     104  
     105        return 0; 
     106  
     107+err_clk_disable: 
     108+       clk_disable(sp->clk); 
     109+err_clk_put: 
     110+       clk_put(sp->clk); 
     111 err_unmap: 
     112        iounmap(sp->base); 
     113 err_put_master: 
     114@@ -259,6 +299,8 @@ static __devexit int ath79_spi_remove(st 
     115        struct ath79_spi *sp = platform_get_drvdata(pdev); 
     116  
     117        spi_bitbang_stop(&sp->bitbang); 
     118+       clk_disable(sp->clk); 
     119+       clk_put(sp->clk); 
     120        iounmap(sp->base); 
     121        platform_set_drvdata(pdev, NULL); 
     122        spi_master_put(sp->bitbang.master); 
  • trunk/target/linux/ar71xx/patches-3.3/202-spi-ath79-add-missing-HIGH-LOW-SCK-transition.patch

    r30410 r31117  
    1 From 0ad8cbbb978bc01de08eadd3357ea188302b83ce Mon Sep 17 00:00:00 2001 
     1From ea7e40aedae58b7a0f0ccd8658063de499734874 Mon Sep 17 00:00:00 2001 
    22From: Gabor Juhos <juhosg@openwrt.org> 
    33Date: Wed, 11 Jan 2012 20:33:41 +0100 
     
    66Signed-off-by: Gabor Juhos <juhosg@openwrt.org> 
    77--- 
    8  drivers/spi/spi-ath79.c |    1 + 
    9  1 files changed, 1 insertions(+), 0 deletions(-) 
     8 drivers/spi/spi-ath79.c |    2 ++ 
     9 1 files changed, 2 insertions(+), 0 deletions(-) 
    1010 
    1111--- a/drivers/spi/spi-ath79.c 
    1212+++ b/drivers/spi/spi-ath79.c 
    13 @@ -193,6 +193,7 @@ static u32 ath79_spi_txrx_mode0(struct s 
    14                 ath79_spi_delay(nsecs); 
     13@@ -200,6 +200,8 @@ static u32 ath79_spi_txrx_mode0(struct s 
     14                ath79_spi_delay(sp, nsecs); 
    1515                ath79_spi_wr(sp, AR71XX_SPI_REG_IOC, out | AR71XX_SPI_IOC_CLK); 
    16                 ath79_spi_delay(nsecs); 
    17 +               ath79_spi_wr(sp, AR71XX_SPI_REG_IOC, out); 
     16                ath79_spi_delay(sp, nsecs); 
     17+               if (bits == 1) 
     18+                       ath79_spi_wr(sp, AR71XX_SPI_REG_IOC, out); 
    1819  
    1920                word <<= 1; 
  • trunk/target/linux/ar71xx/patches-3.3/203-spi-ath79-remove-superfluous-chip-select-code.patch

    r30410 r31117  
    1 From 7385ff2cb72d6a0107890760466b9564aa5204c1 Mon Sep 17 00:00:00 2001 
     1From ecf57a64feb737dec1da72aab21dccd30a88ba19 Mon Sep 17 00:00:00 2001 
    22From: Gabor Juhos <juhosg@openwrt.org> 
    33Date: Mon, 9 Jan 2012 15:03:28 +0100 
     
    1616--- a/drivers/spi/spi-ath79.c 
    1717+++ b/drivers/spi/spi-ath79.c 
    18 @@ -121,12 +121,6 @@ static int ath79_spi_setup_cs(struct spi 
     18@@ -128,12 +128,6 @@ static int ath79_spi_setup_cs(struct spi 
    1919                        gpio_free(cdata->gpio); 
    2020                        return status; 
  • trunk/target/linux/ar71xx/patches-3.3/204-spi-ath79-use-gpio_request_one.patch

    r30410 r31117  
    1 From c5bfb0c760a5d8de7ffc3a6acfb8c782be6af1a5 Mon Sep 17 00:00:00 2001 
     1From dd5b424b0b3f0370f9b63594ad53c16989b6ad78 Mon Sep 17 00:00:00 2001 
    22From: Gabor Juhos <juhosg@openwrt.org> 
    33Date: Mon, 9 Jan 2012 15:04:21 +0100 
     
    1313--- a/drivers/spi/spi-ath79.c 
    1414+++ b/drivers/spi/spi-ath79.c 
    15 @@ -93,6 +93,7 @@ static int ath79_spi_setup_cs(struct spi 
     15@@ -100,6 +100,7 @@ static int ath79_spi_setup_cs(struct spi 
    1616 { 
    1717        struct ath79_spi *sp = ath79_spidev_to_sp(spi); 
     
    2121        cdata = spi->controller_data; 
    2222        if (spi->chip_select && !cdata) 
    23 @@ -108,22 +109,21 @@ static int ath79_spi_setup_cs(struct spi 
     23@@ -115,22 +116,21 @@ static int ath79_spi_setup_cs(struct spi 
    2424        /* TODO: setup speed? */ 
    2525        ath79_spi_wr(sp, AR71XX_SPI_REG_CTRL, 0x43); 
  • trunk/target/linux/ar71xx/patches-3.3/205-spi-ath79-avoid-multiple-initialization-of-the-SPI-c.patch

    r31116 r31117  
    1 From 4518ae06e5fc953abfd9c2b66c6155fc2b2696ce Mon Sep 17 00:00:00 2001 
     1From 25e681989198e94656eab9df22b8b761abd2ae26 Mon Sep 17 00:00:00 2001 
    22From: Gabor Juhos <juhosg@openwrt.org> 
    33Date: Mon, 9 Jan 2012 15:00:46 +0100 
    4 Subject: [PATCH 5/7] spi/ath79: introduce ath79_spi_{en,dis}able helpers 
     4Subject: [PATCH 5/7] spi/ath79: avoid multiple initialization of the SPI controller 
    55 
     6Currently we are initializing the SPI controller in 
     7the chip select line function, and that function is 
     8called once for each SPI device on the bus. If a 
     9board has multiple SPI devices, the controller will 
     10be initialized multiple times. 
     11 
     12Introduce ath79_spi_{en,dis}able helper functions, 
     13and call those from probe/response in order to avoid 
     14the mutliple initialization of the controller. 
     15 
     16Signed-off-by: Gabor Juhos <juhosg@openwrt.org> 
    617--- 
    7  drivers/spi/spi-ath79.c |   41 +++++++++++++++++++++++++---------------- 
    8  1 files changed, 25 insertions(+), 16 deletions(-) 
     18 drivers/spi/spi-ath79.c |   41 ++++++++++++++++++++++++----------------- 
     19 1 files changed, 24 insertions(+), 17 deletions(-) 
    920 
    1021--- a/drivers/spi/spi-ath79.c 
    1122+++ b/drivers/spi/spi-ath79.c 
    12 @@ -89,16 +89,8 @@ static void ath79_spi_chipselect(struct 
     23@@ -96,16 +96,8 @@ static void ath79_spi_chipselect(struct 
    1324  
    1425 } 
     
    2839        ath79_spi_wr(sp, AR71XX_SPI_REG_FS, AR71XX_SPI_FS_GPIO); 
    2940  
    30 @@ -108,6 +100,24 @@ static int ath79_spi_setup_cs(struct spi 
     41@@ -115,6 +107,24 @@ static int ath79_spi_setup_cs(struct spi 
    3142  
    3243        /* TODO: setup speed? */ 
     
    5364        status = 0; 
    5465        if (spi->chip_select) { 
    55 @@ -128,17 +138,10 @@ static int ath79_spi_setup_cs(struct spi 
     66@@ -135,17 +145,10 @@ static int ath79_spi_setup_cs(struct spi 
    5667  
    5768 static void ath79_spi_cleanup_cs(struct spi_device *spi) 
     
    7182  
    7283 static int ath79_spi_setup(struct spi_device *spi) 
    73 @@ -242,13 +245,15 @@ static __devinit int ath79_spi_probe(str 
    74                 goto err_put_master; 
    75         } 
     84@@ -271,12 +274,15 @@ static __devinit int ath79_spi_probe(str 
     85        dev_dbg(&pdev->dev, "register read/write delay is %u nsecs\n", 
     86                sp->rrw_delay); 
    7687  
    7788+       ath79_spi_enable(sp); 
    7889        ret = spi_bitbang_start(&sp->bitbang); 
    7990        if (ret) 
    80 -               goto err_unmap; 
     91-               goto err_clk_disable; 
    8192+               goto err_disable; 
    8293  
    8394        return 0; 
    8495  
    85 -err_unmap: 
    8696+err_disable: 
    8797+       ath79_spi_disable(sp); 
    88         iounmap(sp->base); 
    89  err_put_master: 
    90         platform_set_drvdata(pdev, NULL); 
    91 @@ -262,6 +267,7 @@ static __devexit int ath79_spi_remove(st 
     98 err_clk_disable: 
     99        clk_disable(sp->clk); 
     100 err_clk_put: 
     101@@ -295,6 +301,7 @@ static __devexit int ath79_spi_remove(st 
    92102        struct ath79_spi *sp = platform_get_drvdata(pdev); 
    93103  
    94104        spi_bitbang_stop(&sp->bitbang); 
    95105+       ath79_spi_disable(sp); 
     106        clk_disable(sp->clk); 
     107        clk_put(sp->clk); 
    96108        iounmap(sp->base); 
    97         platform_set_drvdata(pdev, NULL); 
    98         spi_master_put(sp->bitbang.master); 
  • trunk/target/linux/ar71xx/patches-3.3/206-spi-ath79-add-shutdown-handler.patch

    r30410 r31117  
    1 From 1025bfbe327b3f9f7227e781c71751d5251803cb Mon Sep 17 00:00:00 2001 
     1From e01dcc2835017b55e936bd150ddab29bfcf2c63c Mon Sep 17 00:00:00 2001 
    22From: Gabor Juhos <juhosg@openwrt.org> 
    33Date: Wed, 11 Jan 2012 22:19:32 +0100 
     
    1111--- a/drivers/spi/spi-ath79.c 
    1212+++ b/drivers/spi/spi-ath79.c 
    13 @@ -262,7 +262,7 @@ err_put_master: 
     13@@ -296,7 +296,7 @@ err_put_master: 
    1414        return ret; 
    1515 } 
     
    2020        struct ath79_spi *sp = platform_get_drvdata(pdev); 
    2121  
    22 @@ -271,13 +271,23 @@ static __devexit int ath79_spi_remove(st 
     22@@ -307,13 +307,23 @@ static __devexit int ath79_spi_remove(st 
    2323        iounmap(sp->base); 
    2424        platform_set_drvdata(pdev, NULL); 
  • trunk/target/linux/ar71xx/patches-3.3/207-spi-ath79-make-chipselect-logic-more-flexible.patch

    r30410 r31117  
    1 From b875f877d06acb852342636db4c3d1e6c9fe01ba Mon Sep 17 00:00:00 2001 
     1From bdbd9b2861ba73557795915598bb276a8568d130 Mon Sep 17 00:00:00 2001 
    22From: Gabor Juhos <juhosg@openwrt.org> 
    33Date: Wed, 11 Jan 2012 22:25:11 +0100 
     
    66Signed-off-by: Gabor Juhos <juhosg@openwrt.org> 
    77--- 
     8 arch/mips/ath79/mach-ap121.c                       |    6 ++ 
     9 arch/mips/ath79/mach-ap81.c                        |    6 ++ 
     10 arch/mips/ath79/mach-pb44.c                        |    6 ++ 
     11 arch/mips/ath79/mach-ubnt-xm.c                     |    6 ++ 
    812 .../include/asm/mach-ath79/ath79_spi_platform.h    |    8 ++- 
    9  drivers/spi/spi-ath79.c                            |   65 +++++++++++-------- 
    10  2 files changed, 45 insertions(+), 28 deletions(-) 
     13 drivers/spi/spi-ath79.c                            |   63 ++++++++++++-------- 
     14 6 files changed, 69 insertions(+), 26 deletions(-) 
    1115 
     16--- a/arch/mips/ath79/mach-ap121.c 
     17+++ b/arch/mips/ath79/mach-ap121.c 
     18@@ -58,12 +58,18 @@ static struct gpio_keys_button ap121_gpi 
     19        } 
     20 }; 
     21  
     22+static struct ath79_spi_controller_data ap121_spi0_data = { 
     23+       .cs_type = ATH79_SPI_CS_TYPE_INTERNAL, 
     24+       .cs_line = 0, 
     25+}; 
     26+ 
     27 static struct spi_board_info ap121_spi_info[] = { 
     28        { 
     29                .bus_num        = 0, 
     30                .chip_select    = 0, 
     31                .max_speed_hz   = 25000000, 
     32                .modalias       = "mx25l1606e", 
     33+               .controller_data = &ap121_spi0_data, 
     34        } 
     35 }; 
     36  
     37--- a/arch/mips/ath79/mach-ap81.c 
     38+++ b/arch/mips/ath79/mach-ap81.c 
     39@@ -67,12 +67,18 @@ static struct gpio_keys_button ap81_gpio 
     40        } 
     41 }; 
     42  
     43+static struct ath79_spi_controller_data ap81_spi0_data = { 
     44+       .cs_type = ATH79_SPI_CS_TYPE_INTERNAL, 
     45+       .cs_line = 0, 
     46+}; 
     47+ 
     48 static struct spi_board_info ap81_spi_info[] = { 
     49        { 
     50                .bus_num        = 0, 
     51                .chip_select    = 0, 
     52                .max_speed_hz   = 25000000, 
     53                .modalias       = "m25p64", 
     54+               .controller_data = &ap81_spi0_data, 
     55        } 
     56 }; 
     57  
     58--- a/arch/mips/ath79/mach-pb44.c 
     59+++ b/arch/mips/ath79/mach-pb44.c 
     60@@ -87,12 +87,18 @@ static struct gpio_keys_button pb44_gpio 
     61        } 
     62 }; 
     63  
     64+static struct ath79_spi_controller_data pb44_spi0_data = { 
     65+       .cs_type = ATH79_SPI_CS_TYPE_INTERNAL, 
     66+       .cs_line = 0, 
     67+}; 
     68+ 
     69 static struct spi_board_info pb44_spi_info[] = { 
     70        { 
     71                .bus_num        = 0, 
     72                .chip_select    = 0, 
     73                .max_speed_hz   = 25000000, 
     74                .modalias       = "m25p64", 
     75+               .controller_data = &pb44_spi0_data, 
     76        }, 
     77 }; 
     78  
     79--- a/arch/mips/ath79/mach-ubnt-xm.c 
     80+++ b/arch/mips/ath79/mach-ubnt-xm.c 
     81@@ -65,12 +65,18 @@ static struct gpio_keys_button ubnt_xm_g 
     82        } 
     83 }; 
     84  
     85+static struct ath79_spi_controller_data ubnt_xm_spi0_data = { 
     86+       .cs_type = ATH79_SPI_CS_TYPE_INTERNAL, 
     87+       .cs_line = 0, 
     88+}; 
     89+ 
     90 static struct spi_board_info ubnt_xm_spi_info[] = { 
     91        { 
     92                .bus_num        = 0, 
     93                .chip_select    = 0, 
     94                .max_speed_hz   = 25000000, 
     95                .modalias       = "mx25l6405d", 
     96+               .controller_data = &ubnt_xm_spi0_data, 
     97        } 
     98 }; 
     99  
    12100--- a/arch/mips/include/asm/mach-ath79/ath79_spi_platform.h 
    13101+++ b/arch/mips/include/asm/mach-ath79/ath79_spi_platform.h 
     
    30118--- a/drivers/spi/spi-ath79.c 
    31119+++ b/drivers/spi/spi-ath79.c 
    32 @@ -30,6 +30,8 @@ 
    33   
    34  #define DRV_NAME       "ath79-spi" 
    35   
    36 +#define ATH79_SPI_CS_LINE_MAX  2 
     120@@ -35,6 +35,8 @@ 
     121 #define ATH79_SPI_RRW_DELAY_FACTOR     12000 
     122 #define MHZ                            (1000 * 1000) 
     123  
     124+#define ATH79_SPI_CS_LINE_MAX          2 
    37125+ 
    38126 struct ath79_spi { 
    39127        struct spi_bitbang      bitbang; 
    40128        u32                     ioc_base; 
    41 @@ -62,6 +64,7 @@ static void ath79_spi_chipselect(struct 
     129@@ -69,6 +71,7 @@ static void ath79_spi_chipselect(struct 
    42130 { 
    43131        struct ath79_spi *sp = ath79_spidev_to_sp(spi); 
     
    47135        if (is_active) { 
    48136                /* set initial clock polarity */ 
    49 @@ -73,20 +76,21 @@ static void ath79_spi_chipselect(struct 
     137@@ -80,20 +83,21 @@ static void ath79_spi_chipselect(struct 
    50138                ath79_spi_wr(sp, AR71XX_SPI_REG_IOC, sp->ioc_base); 
    51139        } 
     
    78166  
    79167 static void ath79_spi_enable(struct ath79_spi *sp) 
    80 @@ -113,24 +117,30 @@ static void ath79_spi_disable(struct ath 
     168@@ -120,24 +124,30 @@ static void ath79_spi_disable(struct ath 
    81169 static int ath79_spi_setup_cs(struct spi_device *spi) 
    82170 { 
     
    113201  
    114202        return status; 
    115 @@ -138,9 +148,15 @@ static int ath79_spi_setup_cs(struct spi 
     203@@ -145,9 +155,15 @@ static int ath79_spi_setup_cs(struct spi 
    116204  
    117205 static void ath79_spi_cleanup_cs(struct spi_device *spi) 
     
    132220 } 
    133221  
    134 @@ -206,6 +222,10 @@ static __devinit int ath79_spi_probe(str 
    135         struct resource *r; 
     222@@ -215,6 +231,10 @@ static __devinit int ath79_spi_probe(str 
     223        unsigned long rate; 
    136224        int ret; 
    137225  
     
    143231        if (master == NULL) { 
    144232                dev_err(&pdev->dev, "failed to allocate spi master\n"); 
    145 @@ -215,17 +235,10 @@ static __devinit int ath79_spi_probe(str 
     233@@ -224,17 +244,10 @@ static __devinit int ath79_spi_probe(str 
    146234        sp = spi_master_get_devdata(master); 
    147235        platform_set_drvdata(pdev, sp); 
Note: See TracChangeset for help on using the changeset viewer.