Problem mapping GPIO regs on ppc440gx

2006-05-23 Thread Travis B. Sawyer
Greetings:

We've been using a 2.4.30 kernel (with numerous patches) on a AMCC 440gx
custom built board for quite some time now.

We're building some new hardware that forces us to go to a 2.6 kernel.
So, I've downloaded 2.6.16.16 from kernel.org and am porting everything
forward from our 2.4.30 kernel.

The problem lies in mapping the GPIO regs of the 440 to user space using
/dev/mem:

gpio_fd = open(/dev/mem, O_RDWR | O_SYNC);

if (0  gpio_fd) {
perror(mbGpioGet(): Unable to open gpio);
return(-1);
}

addr = (ppc440_gpio_regs_t *)mmap(0, getpagesize() * 2,
  PROT_READ | PROT_WRITE,
  MAP_SHARED, gpio_fd,
  (off_t)(0x4000));

if (MAP_FAILED == addr) {
perror(mbGpioGet(): map error);
close(gpio_fd);
return(-1);
}

pGpioRegs = (ppc440_gpio_regs_t *)((uint32_t)addr + 0x700);

data = pGpioRegs-in  (MB_GPIO_PRI_N_K | MB_GPIO_SEC_PRES_K);

munmap(0, sizeof(ppc440_gpio_regs_t));
close(gpio_fd);

The data I get back is 0.  Always.  /SEC_PRES_K should be 1 in this case.

(gdb) print /x addr
$7 = 0x30015000
(gdb) print /x pGpioRegs
$8 = 0x30015700


Checking /proc/PID/map shows the mapping:
30015000-30019000 rw-p 30015000 00:00 0


On a board running the 2.4.30 kernel, I show the SAME entry in 
/proc/PID/map
but I do get data back.

Any idea what I'm doing wrong here?

TIA,

Travis Sawyer




Problem mapping GPIO regs on ppc440gx

2006-05-23 Thread Travis B. Sawyer
Answering my own question here...

Travis B. Sawyer wrote:

Greetings:

We've been using a 2.4.30 kernel (with numerous patches) on a AMCC 440gx
custom built board for quite some time now.

We're building some new hardware that forces us to go to a 2.6 kernel.
So, I've downloaded 2.6.16.16 from kernel.org and am porting everything
forward from our 2.4.30 kernel.

The problem lies in mapping the GPIO regs of the 440 to user space using
/dev/mem:

gpio_fd = open(/dev/mem, O_RDWR | O_SYNC);

if (0  gpio_fd) {
perror(mbGpioGet(): Unable to open gpio);
return(-1);
}

addr = (ppc440_gpio_regs_t *)mmap(0, getpagesize() * 2,
  PROT_READ | PROT_WRITE,
  MAP_SHARED, gpio_fd,
  (off_t)(0x4000));

  

The above mmap call worked for 2.4.30, but for 2.6.16 I needed to change 
the offset
to be a multiple of page size, so:
(off_t)(0x4000/getpagesize());

-travis