blob: 8c639ce360ab702a80ddf8e5975196df48fa54b4 [file] [log] [blame]
Thomas Chouf6a59cb2010-04-30 11:34:15 +08001/*
2 * board gpio driver
3 *
4 * Copyright (C) 2010 Thomas Chou <thomas@wytron.com.tw>
5 * Licensed under the GPL-2 or later.
6 */
7#include <common.h>
8#include <asm/io.h>
9
10#ifndef CONFIG_SYS_GPIO_BASE
11
12#define ALTERA_PIO_BASE LED_PIO_BASE
13#define ALTERA_PIO_DATA (ALTERA_PIO_BASE + 0)
14#define ALTERA_PIO_DIR (ALTERA_PIO_BASE + 4)
15static u32 pio_data_reg;
16static u32 pio_dir_reg;
17
Thomas Chou5ae05c52010-06-09 09:51:09 +080018int gpio_request(unsigned gpio, const char *label)
19{
20 return 0;
21}
22
Thomas Chouc259ec82010-12-24 15:19:44 +080023int gpio_free(unsigned gpio)
24{
25 return 0;
26}
27
Thomas Chouf6a59cb2010-04-30 11:34:15 +080028int gpio_direction_input(unsigned gpio)
29{
30 u32 mask = 1 << gpio;
31 writel(pio_dir_reg &= ~mask, ALTERA_PIO_DIR);
32 return 0;
33}
34
35int gpio_direction_output(unsigned gpio, int value)
36{
37 u32 mask = 1 << gpio;
38 if (value)
39 pio_data_reg |= mask;
40 else
41 pio_data_reg &= ~mask;
42 writel(pio_data_reg, ALTERA_PIO_DATA);
43 writel(pio_dir_reg |= mask, ALTERA_PIO_DIR);
44 return 0;
45}
46
47int gpio_get_value(unsigned gpio)
48{
49 u32 mask = 1 << gpio;
50 if (pio_dir_reg & mask)
51 return (pio_data_reg & mask) ? 1 : 0;
52 else
53 return (readl(ALTERA_PIO_DATA) & mask) ? 1 : 0;
54}
55
56void gpio_set_value(unsigned gpio, int value)
57{
58 u32 mask = 1 << gpio;
59 if (value)
60 pio_data_reg |= mask;
61 else
62 pio_data_reg &= ~mask;
63 writel(pio_data_reg, ALTERA_PIO_DATA);
64}
65#endif