blob: 4a30564358fd43206dbca8ff2fcd87a312fbb89e [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
Thomas Chou5dbb29f2010-12-27 10:46:01 +080013#define ALTERA_PIO_WIDTH LED_PIO_WIDTH
Thomas Chouf6a59cb2010-04-30 11:34:15 +080014#define ALTERA_PIO_DATA (ALTERA_PIO_BASE + 0)
15#define ALTERA_PIO_DIR (ALTERA_PIO_BASE + 4)
16static u32 pio_data_reg;
17static u32 pio_dir_reg;
18
Thomas Chou5ae05c52010-06-09 09:51:09 +080019int gpio_request(unsigned gpio, const char *label)
20{
21 return 0;
22}
23
Thomas Chouc259ec82010-12-24 15:19:44 +080024int gpio_free(unsigned gpio)
25{
26 return 0;
27}
28
Thomas Chouf6a59cb2010-04-30 11:34:15 +080029int gpio_direction_input(unsigned gpio)
30{
31 u32 mask = 1 << gpio;
32 writel(pio_dir_reg &= ~mask, ALTERA_PIO_DIR);
33 return 0;
34}
35
36int gpio_direction_output(unsigned gpio, int value)
37{
38 u32 mask = 1 << gpio;
39 if (value)
40 pio_data_reg |= mask;
41 else
42 pio_data_reg &= ~mask;
43 writel(pio_data_reg, ALTERA_PIO_DATA);
44 writel(pio_dir_reg |= mask, ALTERA_PIO_DIR);
45 return 0;
46}
47
48int gpio_get_value(unsigned gpio)
49{
50 u32 mask = 1 << gpio;
51 if (pio_dir_reg & mask)
52 return (pio_data_reg & mask) ? 1 : 0;
53 else
54 return (readl(ALTERA_PIO_DATA) & mask) ? 1 : 0;
55}
56
57void gpio_set_value(unsigned gpio, int value)
58{
59 u32 mask = 1 << gpio;
60 if (value)
61 pio_data_reg |= mask;
62 else
63 pio_data_reg &= ~mask;
64 writel(pio_data_reg, ALTERA_PIO_DATA);
65}
Thomas Chou5dbb29f2010-12-27 10:46:01 +080066
67int gpio_is_valid(int number)
68{
69 return ((unsigned)number) < ALTERA_PIO_WIDTH;
70}
Thomas Chouf6a59cb2010-04-30 11:34:15 +080071#endif