lynxpoint: Add a function to set an individual GPIO

This will be used in a later commit to do some specific
power sequencing.

Change-Id: Id7f033bb80aed915c2498ea910cb3ac7290da37f
Signed-off-by: Duncan Laurie <dlaurie@chromium.org>
Reviewed-on: https://gerrit.chromium.org/gerrit/48947
Reviewed-by: Aaron Durbin <adurbin@chromium.org>
Reviewed-on: http://review.coreboot.org/4137
Tested-by: build bot (Jenkins)
Reviewed-by: Alexandru Gagniuc <mr.nuke.me@gmail.com>
This commit is contained in:
Duncan Laurie 2013-04-23 13:44:37 -07:00 committed by Alexandru Gagniuc
parent 55ad972432
commit 15de7cb422
3 changed files with 37 additions and 0 deletions

View File

@ -109,3 +109,22 @@ unsigned get_gpios(const int *gpio_num_array)
} }
return vector; return vector;
} }
void set_gpio(int gpio_num, int value)
{
static const int gpio_reg_offsets[] = {0xc, 0x38, 0x48};
u16 gpio_base = get_gpio_base();
int index, bit;
u32 config;
if (gpio_num > MAX_GPIO_NUMBER)
return; /* Just ignore wrong gpio numbers. */
index = gpio_num / 32;
bit = gpio_num % 32;
config = inl(gpio_base + gpio_reg_offsets[index]);
config &= ~(1 << bit);
config |= value << bit;
outl(config, gpio_base + gpio_reg_offsets[index]);
}

View File

@ -107,3 +107,17 @@ unsigned get_gpios(const int *gpio_num_array)
} }
return vector; return vector;
} }
void set_gpio(int gpio_num, int value)
{
u16 gpio_base = get_gpio_base();
u32 conf0;
if (gpio_num > MAX_GPIO_NUMBER)
return;
conf0 = inl(gpio_base + GPIO_CONFIG0(gpio_num));
conf0 &= ~GPO_LEVEL_MASK;
conf0 |= value << GPO_LEVEL_SHIFT;
outl(conf0, gpio_base + GPIO_CONFIG0(gpio_num));
}

View File

@ -193,6 +193,10 @@ int get_gpio(int gpio_num);
* the array of gpio pin numbers to scan, terminated by -1. * the array of gpio pin numbers to scan, terminated by -1.
*/ */
unsigned get_gpios(const int *gpio_num_array); unsigned get_gpios(const int *gpio_num_array);
/*
* set GPIO pin value
*/
void set_gpio(int gpio_num, int value);
#endif #endif
#define MAINBOARD_POWER_OFF 0 #define MAINBOARD_POWER_OFF 0