ODROID N1: Fix bit calculation more clearly (CLK, IOMUX, PUPD)
Change-Id: I861fd27201099e4b65bbb783a93a2c2dfff05817
This commit is contained in:
@@ -180,21 +180,21 @@ static int getModeToGpio (int mode, int pin)
|
|||||||
/*----------------------------------------------------------------------------*/
|
/*----------------------------------------------------------------------------*/
|
||||||
static void setClkState (int pin, int state)
|
static void setClkState (int pin, int state)
|
||||||
{
|
{
|
||||||
uint32_t target = GPIO_CON_REGS_PROG;
|
uint32_t target = 0;
|
||||||
int bank = pin / 32;
|
uint8_t bank = pin / 32;
|
||||||
int shift = bank < 2 ? bank + 2 : bank + 1;
|
uint8_t shift = bank < 2 ? bank + 2 : bank + 1;
|
||||||
|
|
||||||
|
target |= (1 << (shift + 16));
|
||||||
|
|
||||||
switch (state) {
|
switch (state) {
|
||||||
case CLK_ENABLE:
|
case CLK_ENABLE:
|
||||||
if (bank < 2) {
|
if (bank < 2) {
|
||||||
target |= *(cru[0] + (PMUCRU_GPIO_CLK_OFFSET >> 2));
|
target |= *(cru[0] + (PMUCRU_GPIO_CLK_OFFSET >> 2));
|
||||||
target &= ~(1 << shift);
|
target &= ~(1 << shift);
|
||||||
|
|
||||||
*(cru[0] + (PMUCRU_GPIO_CLK_OFFSET >> 2)) = target;
|
*(cru[0] + (PMUCRU_GPIO_CLK_OFFSET >> 2)) = target;
|
||||||
} else {
|
} else {
|
||||||
target |= *(cru[1] + (CRU_GPIO_CLK_OFFSET >> 2));
|
target |= *(cru[1] + (CRU_GPIO_CLK_OFFSET >> 2));
|
||||||
target &= ~(1 << shift);
|
target &= ~(1 << shift);
|
||||||
|
|
||||||
*(cru[1] + (CRU_GPIO_CLK_OFFSET >> 2)) = target;
|
*(cru[1] + (CRU_GPIO_CLK_OFFSET >> 2)) = target;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -202,12 +202,10 @@ static void setClkState (int pin, int state)
|
|||||||
if (bank < 2) {
|
if (bank < 2) {
|
||||||
target |= *(cru[0] + (PMUCRU_GPIO_CLK_OFFSET >> 2));
|
target |= *(cru[0] + (PMUCRU_GPIO_CLK_OFFSET >> 2));
|
||||||
target |= (1 << shift);
|
target |= (1 << shift);
|
||||||
|
|
||||||
*(cru[0] + (PMUCRU_GPIO_CLK_OFFSET >> 2)) = target;
|
*(cru[0] + (PMUCRU_GPIO_CLK_OFFSET >> 2)) = target;
|
||||||
} else {
|
} else {
|
||||||
target |= *(cru[1] + (CRU_GPIO_CLK_OFFSET >> 2));
|
target |= *(cru[1] + (CRU_GPIO_CLK_OFFSET >> 2));
|
||||||
target |= (1 << shift);
|
target |= (1 << shift);
|
||||||
|
|
||||||
*(cru[1] + (CRU_GPIO_CLK_OFFSET >> 2)) = target;
|
*(cru[1] + (CRU_GPIO_CLK_OFFSET >> 2)) = target;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -229,11 +227,14 @@ static void setIomuxMode (int pin, int mode)
|
|||||||
bank = pin / 32;
|
bank = pin / 32;
|
||||||
group = (pin - bank * 32) / 8;
|
group = (pin - bank * 32) / 8;
|
||||||
offset = 0x10 * (bank > 1 ? bank - 2 : bank) + 0x4 * group;
|
offset = 0x10 * (bank > 1 ? bank - 2 : bank) + 0x4 * group;
|
||||||
target = GPIO_CON_REGS_PROG;
|
target = 0;
|
||||||
|
|
||||||
|
target |= (1 << (gpioToShiftGReg(pin) * 2 + 17));
|
||||||
|
target |= (1 << (gpioToShiftGReg(pin) * 2 + 16));
|
||||||
|
|
||||||
switch (mode) {
|
switch (mode) {
|
||||||
case FUNC_GPIO:
|
case FUNC_GPIO:
|
||||||
// Common IOMUX Funtion 1 : GPIO
|
// Common IOMUX Funtion 1 : GPIO (0b00)
|
||||||
if (bank < 2) {
|
if (bank < 2) {
|
||||||
offset += PMUGRF_IOMUX_OFFSET;
|
offset += PMUGRF_IOMUX_OFFSET;
|
||||||
|
|
||||||
@@ -315,7 +316,6 @@ static int getAlt (int pin)
|
|||||||
bank = pin / 32;
|
bank = pin / 32;
|
||||||
group = (pin - bank * 32) / 8;
|
group = (pin - bank * 32) / 8;
|
||||||
offset = 0x10 * (bank > 1 ? bank - 2 : bank) + 0x4 * group;
|
offset = 0x10 * (bank > 1 ? bank - 2 : bank) + 0x4 * group;
|
||||||
target = GPIO_CON_REGS_PROG;
|
|
||||||
|
|
||||||
setClkState(pin, CLK_ENABLE);
|
setClkState(pin, CLK_ENABLE);
|
||||||
|
|
||||||
@@ -354,7 +354,10 @@ static void pullUpDnControl (int pin, int pud)
|
|||||||
bank = pin / 32;
|
bank = pin / 32;
|
||||||
group = (pin - bank * 32) / 8;
|
group = (pin - bank * 32) / 8;
|
||||||
offset = 0x10 * (bank > 1 ? bank - 2 : bank) + 0x4 * group;
|
offset = 0x10 * (bank > 1 ? bank - 2 : bank) + 0x4 * group;
|
||||||
target = GPIO_CON_REGS_PROG;
|
target = 0;
|
||||||
|
|
||||||
|
target |= (1 << (gpioToShiftGReg(pin) * 2 + 17));
|
||||||
|
target |= (1 << (gpioToShiftGReg(pin) * 2 + 16));
|
||||||
|
|
||||||
setClkState(pin, CLK_ENABLE);
|
setClkState(pin, CLK_ENABLE);
|
||||||
|
|
||||||
@@ -372,7 +375,6 @@ static void pullUpDnControl (int pin, int pud)
|
|||||||
offset += GRF_PUPD_OFFSET;
|
offset += GRF_PUPD_OFFSET;
|
||||||
|
|
||||||
target |= *(grf[1] + (offset >> 2));
|
target |= *(grf[1] + (offset >> 2));
|
||||||
|
|
||||||
if (bank == 2 && group >= 2) {
|
if (bank == 2 && group >= 2) {
|
||||||
target |= (1 << (gpioToShiftGReg(pin) * 2 + 1));
|
target |= (1 << (gpioToShiftGReg(pin) * 2 + 1));
|
||||||
target |= (1 << (gpioToShiftGReg(pin) * 2));
|
target |= (1 << (gpioToShiftGReg(pin) * 2));
|
||||||
@@ -397,7 +399,6 @@ static void pullUpDnControl (int pin, int pud)
|
|||||||
offset += GRF_PUPD_OFFSET;
|
offset += GRF_PUPD_OFFSET;
|
||||||
|
|
||||||
target |= *(grf[1] + (offset >> 2));
|
target |= *(grf[1] + (offset >> 2));
|
||||||
|
|
||||||
if (bank == 2 && group >= 2) {
|
if (bank == 2 && group >= 2) {
|
||||||
target &= ~(1 << (gpioToShiftGReg(pin) * 2 + 1));
|
target &= ~(1 << (gpioToShiftGReg(pin) * 2 + 1));
|
||||||
target |= (1 << (gpioToShiftGReg(pin) * 2));
|
target |= (1 << (gpioToShiftGReg(pin) * 2));
|
||||||
|
|||||||
@@ -40,9 +40,6 @@
|
|||||||
#define CLK_ENABLE 0b0
|
#define CLK_ENABLE 0b0
|
||||||
#define CLK_DISABLE 0b1
|
#define CLK_DISABLE 0b1
|
||||||
|
|
||||||
// Control IOMUX, PU/PD, CLK
|
|
||||||
#define GPIO_CON_REGS_PROG 0xFFFF0000 // To make GRF/CRU register programmable
|
|
||||||
|
|
||||||
// Only for Linux kernel for now. Edit to 0 for Android
|
// Only for Linux kernel for now. Edit to 0 for Android
|
||||||
#define GPIO_PIN_BASE 1000
|
#define GPIO_PIN_BASE 1000
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user