]>
Commit | Line | Data |
---|---|---|
5d889ae7 GH |
1 | /* |
2 | * Copyright (C) 2012 | |
3 | * Gabriel Huau <contact@huau-gabriel.fr> | |
4 | * | |
1a459660 | 5 | * SPDX-License-Identifier: GPL-2.0+ |
5d889ae7 GH |
6 | */ |
7 | #include <common.h> | |
8 | #include <asm/arch/s3c2440.h> | |
9 | #include <asm/gpio.h> | |
10 | #include <asm/io.h> | |
13cfd101 | 11 | #include <errno.h> |
5d889ae7 GH |
12 | |
13 | #define GPIO_INPUT 0x0 | |
14 | #define GPIO_OUTPUT 0x1 | |
15 | ||
13cfd101 MV |
16 | #define S3C_GPIO_CON 0x0 |
17 | #define S3C_GPIO_DAT 0x4 | |
5d889ae7 | 18 | |
13cfd101 MV |
19 | static uint32_t s3c_gpio_get_bank_addr(unsigned gpio) |
20 | { | |
21 | /* There is up to 16 pins per bank, one bank is 0x10 big. */ | |
22 | uint32_t addr = gpio & ~0xf; | |
23 | ||
24 | if (addr >= 0x80 && addr != 0xd0) { /* Wrong GPIO bank. */ | |
25 | printf("Invalid GPIO bank (bank %02x)\n", addr); | |
26 | return 0xffffffff; | |
27 | } | |
28 | ||
29 | return addr | S3C24X0_GPIO_BASE; | |
30 | } | |
5d889ae7 GH |
31 | |
32 | int gpio_set_value(unsigned gpio, int value) | |
33 | { | |
13cfd101 MV |
34 | uint32_t addr = s3c_gpio_get_bank_addr(gpio); |
35 | ||
36 | if (addr == 0xffffffff) | |
37 | return -EINVAL; | |
5d889ae7 GH |
38 | |
39 | if (value) | |
13cfd101 | 40 | setbits_le32(addr | S3C_GPIO_DAT, 1 << (gpio & 0xf)); |
5d889ae7 | 41 | else |
13cfd101 | 42 | clrbits_le32(addr | S3C_GPIO_DAT, 1 << (gpio & 0xf)); |
5d889ae7 | 43 | |
13cfd101 | 44 | return 0; |
5d889ae7 GH |
45 | } |
46 | ||
47 | int gpio_get_value(unsigned gpio) | |
48 | { | |
13cfd101 MV |
49 | uint32_t addr = s3c_gpio_get_bank_addr(gpio); |
50 | ||
51 | if (addr == 0xffffffff) | |
52 | return -EINVAL; | |
5d889ae7 | 53 | |
13cfd101 | 54 | return !!(readl(addr | S3C_GPIO_DAT) & (1 << (gpio & 0xf))); |
5d889ae7 GH |
55 | } |
56 | ||
57 | int gpio_request(unsigned gpio, const char *label) | |
58 | { | |
59 | return 0; | |
60 | } | |
61 | ||
62 | int gpio_free(unsigned gpio) | |
63 | { | |
64 | return 0; | |
65 | } | |
66 | ||
13cfd101 MV |
67 | static int s3c_gpio_direction(unsigned gpio, uint8_t dir) |
68 | { | |
69 | uint32_t addr = s3c_gpio_get_bank_addr(gpio); | |
70 | const uint32_t mask = 0x3 << ((gpio & 0xf) << 1); | |
71 | const uint32_t dirm = dir << ((gpio & 0xf) << 1); | |
72 | ||
73 | if (addr == 0xffffffff) | |
74 | return -EINVAL; | |
75 | ||
76 | clrsetbits_le32(addr | S3C_GPIO_CON, mask, dirm); | |
77 | return 0; | |
78 | } | |
79 | ||
5d889ae7 GH |
80 | int gpio_direction_input(unsigned gpio) |
81 | { | |
13cfd101 | 82 | return s3c_gpio_direction(gpio, GPIO_INPUT); |
5d889ae7 GH |
83 | } |
84 | ||
85 | int gpio_direction_output(unsigned gpio, int value) | |
86 | { | |
13cfd101 | 87 | return s3c_gpio_direction(gpio, GPIO_OUTPUT); |
5d889ae7 | 88 | } |