source: trunk/target/linux/lantiq/patches-3.3/0052-MIPS-lantiq-make-GPIO3-work-on-AR9.patch @ 31307

Last change on this file since 31307 was 31307, checked in by blogic, 4 years ago

[lantiq] adds 3.3 patches and files

File size: 8.3 KB
  • arch/mips/include/asm/mach-lantiq/xway/lantiq_soc.h

    From 85859883ce603bf0db782c03294873dad39176e5 Mon Sep 17 00:00:00 2001
    From: John Crispin <blogic@openwrt.org>
    Date: Sat, 13 Aug 2011 13:59:50 +0200
    Subject: [PATCH 52/70] MIPS: lantiq: make GPIO3 work on AR9
    
    There are 3 16bit and 1 8bit gpio ports on AR9. The gpio driver needs a hack
    at 2 places to make the different register layout of the GPIO3 work properly
    with the driver. Before only GPIO0-2 were supported. As the GPIO number scheme
    clashes with the new size, we also move the other gpio chips to new offsets.
    
    Signed-off-by: John Crispin <blogic@openwrt.org>
    Signed-off-by: Thomas Langer <thomas.langer@lantiq.com>
    ---
     .../mips/include/asm/mach-lantiq/xway/lantiq_soc.h |    2 +
     arch/mips/lantiq/xway/devices.c                    |    3 +
     arch/mips/lantiq/xway/gpio.c                       |   84 ++++++++++++++++----
     arch/mips/lantiq/xway/gpio_ebu.c                   |    3 +-
     arch/mips/lantiq/xway/gpio_stp.c                   |    3 +-
     5 files changed, 75 insertions(+), 20 deletions(-)
    
    diff --git a/arch/mips/include/asm/mach-lantiq/xway/lantiq_soc.h b/arch/mips/include/asm/mach-lantiq/xway/lantiq_soc.h
    index d1b8cc8..bfdeb16 100644
    a b  
    126126#define LTQ_GPIO0_BASE_ADDR     0x1E100B10 
    127127#define LTQ_GPIO1_BASE_ADDR     0x1E100B40 
    128128#define LTQ_GPIO2_BASE_ADDR     0x1E100B70 
     129#define LTQ_GPIO3_BASE_ADDR     0x1E100BA0 
    129130#define LTQ_GPIO_SIZE           0x30 
     131#define LTQ_GPIO3_SIZE          0x10 
    130132 
    131133/* SSC */ 
    132134#define LTQ_SSC_BASE_ADDR       0x1e100800 
  • arch/mips/lantiq/xway/devices.c

    diff --git a/arch/mips/lantiq/xway/devices.c b/arch/mips/lantiq/xway/devices.c
    index 5efa4f3..e6d45bc 100644
    a b static struct resource ltq_gpio_resource[] = { 
    3434        MEM_RES("gpio0", LTQ_GPIO0_BASE_ADDR, LTQ_GPIO_SIZE), 
    3535        MEM_RES("gpio1", LTQ_GPIO1_BASE_ADDR, LTQ_GPIO_SIZE), 
    3636        MEM_RES("gpio2", LTQ_GPIO2_BASE_ADDR, LTQ_GPIO_SIZE), 
     37        MEM_RES("gpio3", LTQ_GPIO3_BASE_ADDR, LTQ_GPIO3_SIZE), 
    3738}; 
    3839 
    3940void __init ltq_register_gpio(void) 
    void __init ltq_register_gpio(void) 
    4748        if (ltq_is_ar9() || ltq_is_vr9()) { 
    4849                platform_device_register_simple("ltq_gpio", 2, 
    4950                        &ltq_gpio_resource[2], 1); 
     51                platform_device_register_simple("ltq_gpio", 3, 
     52                        &ltq_gpio_resource[3], 1); 
    5053        } 
    5154} 
    5255 
  • arch/mips/lantiq/xway/gpio.c

    diff --git a/arch/mips/lantiq/xway/gpio.c b/arch/mips/lantiq/xway/gpio.c
    index 54ec6c9..375329b 100644
    a b  
    2323#define LTQ_GPIO_OD             0x14 
    2424#define LTQ_GPIO_PUDSEL         0x1C 
    2525#define LTQ_GPIO_PUDEN          0x20 
     26#define LTQ_GPIO3_OD            0x24 
     27#define LTQ_GPIO3_ALTSEL1       0x24 
     28#define LTQ_GPIO3_PUDSEL        0x28 
     29#define LTQ_GPIO3_PUDEN         0x2C 
    2630 
     31/* PORT3 only has 8 pins and its register layout 
     32   is slightly different */ 
    2733#define PINS_PER_PORT           16 
    28 #define MAX_PORTS               3 
     34#define PINS_PORT3              8 
     35#define MAX_PORTS               4 
     36#define MAX_PIN                 56 
    2937 
    3038#define ltq_gpio_getbit(m, r, p)        (!!(ltq_r32(m + r) & (1 << p))) 
    3139#define ltq_gpio_setbit(m, r, p)        ltq_w32_mask(0, (1 << p), m + r) 
    int ltq_gpio_request(struct device *dev, unsigned int pin, unsigned int mux, 
    5563{ 
    5664        int id = 0; 
    5765 
    58         if (pin >= (MAX_PORTS * PINS_PER_PORT)) 
     66        if (pin >= MAX_PIN) 
    5967                return -EINVAL; 
    6068        if (devm_gpio_request(dev, pin, name)) { 
    6169                pr_err("failed to setup lantiq gpio: %s\n", name); 
    int ltq_gpio_request(struct device *dev, unsigned int pin, unsigned int mux, 
    7583        else 
    7684                ltq_gpio_clearbit(ltq_gpio_port[id].membase, 
    7785                        LTQ_GPIO_ALTSEL0, pin); 
    78         if (mux & 0x1) 
    79                 ltq_gpio_setbit(ltq_gpio_port[id].membase, 
    80                         LTQ_GPIO_ALTSEL1, pin); 
    81         else 
    82                 ltq_gpio_clearbit(ltq_gpio_port[id].membase, 
    83                         LTQ_GPIO_ALTSEL1, pin); 
     86        if (id == 3) { 
     87                if (mux & 0x1) 
     88                        ltq_gpio_setbit(ltq_gpio_port[1].membase, 
     89                                LTQ_GPIO3_ALTSEL1, pin); 
     90                else 
     91                        ltq_gpio_clearbit(ltq_gpio_port[1].membase, 
     92                                LTQ_GPIO3_ALTSEL1, pin); 
     93        } else { 
     94                if (mux & 0x1) 
     95                        ltq_gpio_setbit(ltq_gpio_port[id].membase, 
     96                                LTQ_GPIO_ALTSEL1, pin); 
     97                else 
     98                        ltq_gpio_clearbit(ltq_gpio_port[id].membase, 
     99                                LTQ_GPIO_ALTSEL1, pin); 
     100        } 
    84101        return 0; 
    85102} 
    86103EXPORT_SYMBOL(ltq_gpio_request); 
    static int ltq_gpio_direction_input(struct gpio_chip *chip, unsigned int offset) 
    106123{ 
    107124        struct ltq_gpio *ltq_gpio = container_of(chip, struct ltq_gpio, chip); 
    108125 
    109         ltq_gpio_clearbit(ltq_gpio->membase, LTQ_GPIO_OD, offset); 
     126        if (chip->ngpio == PINS_PORT3) { 
     127                ltq_gpio_clearbit(ltq_gpio_port[0].membase, 
     128                                LTQ_GPIO3_OD, offset); 
     129                ltq_gpio_setbit(ltq_gpio_port[0].membase, 
     130                                LTQ_GPIO3_PUDSEL, offset); 
     131                ltq_gpio_setbit(ltq_gpio_port[0].membase, 
     132                                LTQ_GPIO3_PUDEN, offset); 
     133        } else { 
     134                ltq_gpio_clearbit(ltq_gpio->membase, LTQ_GPIO_OD, offset); 
     135                ltq_gpio_setbit(ltq_gpio->membase, LTQ_GPIO_PUDSEL, offset); 
     136                ltq_gpio_setbit(ltq_gpio->membase, LTQ_GPIO_PUDEN, offset); 
     137        } 
    110138        ltq_gpio_clearbit(ltq_gpio->membase, LTQ_GPIO_DIR, offset); 
    111         ltq_gpio_setbit(ltq_gpio->membase, LTQ_GPIO_PUDSEL, offset); 
    112         ltq_gpio_setbit(ltq_gpio->membase, LTQ_GPIO_PUDEN, offset); 
    113139 
    114140        return 0; 
    115141} 
    static int ltq_gpio_direction_output(struct gpio_chip *chip, 
    119145{ 
    120146        struct ltq_gpio *ltq_gpio = container_of(chip, struct ltq_gpio, chip); 
    121147 
    122         ltq_gpio_setbit(ltq_gpio->membase, LTQ_GPIO_OD, offset); 
     148        if (chip->ngpio == PINS_PORT3) { 
     149                ltq_gpio_setbit(ltq_gpio_port[0].membase, 
     150                                LTQ_GPIO3_OD, offset); 
     151                ltq_gpio_clearbit(ltq_gpio_port[0].membase, 
     152                                LTQ_GPIO3_PUDSEL, offset); 
     153                ltq_gpio_clearbit(ltq_gpio_port[0].membase, 
     154                                LTQ_GPIO3_PUDEN, offset); 
     155        } else { 
     156                ltq_gpio_setbit(ltq_gpio->membase, LTQ_GPIO_OD, offset); 
     157                ltq_gpio_clearbit(ltq_gpio->membase, LTQ_GPIO_PUDSEL, offset); 
     158                ltq_gpio_clearbit(ltq_gpio->membase, LTQ_GPIO_PUDEN, offset); 
     159        } 
    123160        ltq_gpio_setbit(ltq_gpio->membase, LTQ_GPIO_DIR, offset); 
    124         ltq_gpio_clearbit(ltq_gpio->membase, LTQ_GPIO_PUDSEL, offset); 
    125         ltq_gpio_clearbit(ltq_gpio->membase, LTQ_GPIO_PUDEN, offset); 
    126161        ltq_gpio_set(chip, offset, value); 
    127162 
    128163        return 0; 
    static int ltq_gpio_req(struct gpio_chip *chip, unsigned offset) 
    133168        struct ltq_gpio *ltq_gpio = container_of(chip, struct ltq_gpio, chip); 
    134169 
    135170        ltq_gpio_clearbit(ltq_gpio->membase, LTQ_GPIO_ALTSEL0, offset); 
    136         ltq_gpio_clearbit(ltq_gpio->membase, LTQ_GPIO_ALTSEL1, offset); 
     171        if (chip->ngpio == PINS_PORT3) 
     172                ltq_gpio_clearbit(ltq_gpio_port[1].membase, 
     173                                LTQ_GPIO3_ALTSEL1, offset); 
     174        else 
     175                ltq_gpio_clearbit(ltq_gpio->membase, LTQ_GPIO_ALTSEL1, offset); 
    137176        return 0; 
    138177} 
    139178 
    static int ltq_gpio_probe(struct platform_device *pdev) 
    146185                        pdev->id); 
    147186                return -EINVAL; 
    148187        } 
     188 
     189        /* dirty hack - The registers of port3 are not mapped linearly. 
     190           Port 3 may only load if Port 1/2 are mapped */ 
     191        if ((pdev->id == 3) && (!ltq_gpio_port[1].membase 
     192                                        || !ltq_gpio_port[2].membase)) { 
     193                dev_err(&pdev->dev, 
     194                        "ports 1/2 need to be loaded before port 3 works\n"); 
     195                return -ENOMEM; 
     196        } 
     197 
    149198        res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 
    150199        if (!res) { 
    151200                dev_err(&pdev->dev, "failed to get memory for gpio port %d\n", 
    static int ltq_gpio_probe(struct platform_device *pdev) 
    175224        ltq_gpio_port[pdev->id].chip.set = ltq_gpio_set; 
    176225        ltq_gpio_port[pdev->id].chip.request = ltq_gpio_req; 
    177226        ltq_gpio_port[pdev->id].chip.base = PINS_PER_PORT * pdev->id; 
    178         ltq_gpio_port[pdev->id].chip.ngpio = PINS_PER_PORT; 
     227        if (pdev->id == 3) 
     228                ltq_gpio_port[pdev->id].chip.ngpio = PINS_PORT3; 
     229        else 
     230                ltq_gpio_port[pdev->id].chip.ngpio = PINS_PER_PORT; 
    179231        platform_set_drvdata(pdev, &ltq_gpio_port[pdev->id]); 
    180232        return gpiochip_add(&ltq_gpio_port[pdev->id].chip); 
    181233} 
  • arch/mips/lantiq/xway/gpio_ebu.c

    diff --git a/arch/mips/lantiq/xway/gpio_ebu.c b/arch/mips/lantiq/xway/gpio_ebu.c
    index b91c7f1..bc5696b 100644
    a b static struct gpio_chip ltq_ebu_chip = { 
    6161        .label = "ltq_ebu", 
    6262        .direction_output = ltq_ebu_direction_output, 
    6363        .set = ltq_ebu_set, 
    64         .base = 72, 
     64        .base = 100, 
    6565        .ngpio = 16, 
    66         .can_sleep = 1, 
    6766        .owner = THIS_MODULE, 
    6867}; 
    6968 
  • arch/mips/lantiq/xway/gpio_stp.c

    diff --git a/arch/mips/lantiq/xway/gpio_stp.c b/arch/mips/lantiq/xway/gpio_stp.c
    index da91c5e..9610c10 100644
    a b static struct gpio_chip ltq_stp_chip = { 
    7474        .label = "ltq_stp", 
    7575        .direction_output = ltq_stp_direction_output, 
    7676        .set = ltq_stp_set, 
    77         .base = 48, 
     77        .base = 200, 
    7878        .ngpio = 24, 
    79         .can_sleep = 1, 
    8079        .owner = THIS_MODULE, 
    8180}; 
    8281 
Note: See TracBrowser for help on using the repository browser.