Commit e4af9497 authored by Jens Taprogge's avatar Jens Taprogge Committed by Greg Kroah-Hartman

Staging: ipack: Add IPACK_INT_SPACE memory space.

This will allow us to correctly access the IPack INT space.
Signed-off-by: default avatarJens Taprogge <jens.taprogge@taprogge.org>
Signed-off-by: default avatarSamuel Iglesias Gonsalvez <siglesias@igalia.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 75058176
...@@ -95,6 +95,8 @@ static void tpci200_unregister(struct tpci200_board *tpci200) ...@@ -95,6 +95,8 @@ static void tpci200_unregister(struct tpci200_board *tpci200)
tpci200->slots[i].io_phys.size = 0; tpci200->slots[i].io_phys.size = 0;
tpci200->slots[i].id_phys.address = NULL; tpci200->slots[i].id_phys.address = NULL;
tpci200->slots[i].id_phys.size = 0; tpci200->slots[i].id_phys.size = 0;
tpci200->slots[i].int_phys.address = NULL;
tpci200->slots[i].int_phys.size = 0;
tpci200->slots[i].mem_phys.address = NULL; tpci200->slots[i].mem_phys.address = NULL;
tpci200->slots[i].mem_phys.size = 0; tpci200->slots[i].mem_phys.size = 0;
} }
...@@ -331,6 +333,11 @@ static int tpci200_register(struct tpci200_board *tpci200) ...@@ -331,6 +333,11 @@ static int tpci200_register(struct tpci200_board *tpci200)
TPCI200_ID_SPACE_OFF + TPCI200_ID_SPACE_GAP*i; TPCI200_ID_SPACE_OFF + TPCI200_ID_SPACE_GAP*i;
tpci200->slots[i].id_phys.size = TPCI200_ID_SPACE_SIZE; tpci200->slots[i].id_phys.size = TPCI200_ID_SPACE_SIZE;
tpci200->slots[i].int_phys.address =
(void __iomem *)ioidint_base +
TPCI200_INT_SPACE_OFF + TPCI200_INT_SPACE_GAP * i;
tpci200->slots[i].int_phys.size = TPCI200_INT_SPACE_SIZE;
tpci200->slots[i].mem_phys.address = tpci200->slots[i].mem_phys.address =
(void __iomem *)mem_base + TPCI200_MEM8_GAP*i; (void __iomem *)mem_base + TPCI200_MEM8_GAP*i;
tpci200->slots[i].mem_phys.size = TPCI200_MEM8_SIZE; tpci200->slots[i].mem_phys.size = TPCI200_MEM8_SIZE;
...@@ -391,6 +398,15 @@ static int tpci200_slot_unmap_space(struct ipack_device *dev, int space) ...@@ -391,6 +398,15 @@ static int tpci200_slot_unmap_space(struct ipack_device *dev, int space)
} }
virt_addr_space = &dev->id_space; virt_addr_space = &dev->id_space;
break; break;
case IPACK_INT_SPACE:
if (dev->int_space.address == NULL) {
dev_info(&dev->dev,
"Slot [%d:%d] INT space not mapped !\n",
dev->bus_nr, dev->slot);
goto out_unlock;
}
virt_addr_space = &dev->int_space;
break;
case IPACK_MEM_SPACE: case IPACK_MEM_SPACE:
if (dev->mem_space.address == NULL) { if (dev->mem_space.address == NULL) {
dev_info(&dev->dev, dev_info(&dev->dev,
...@@ -460,6 +476,19 @@ static int tpci200_slot_map_space(struct ipack_device *dev, ...@@ -460,6 +476,19 @@ static int tpci200_slot_map_space(struct ipack_device *dev,
phys_address = tpci200->slots[dev->slot].id_phys.address; phys_address = tpci200->slots[dev->slot].id_phys.address;
size_to_map = tpci200->slots[dev->slot].id_phys.size; size_to_map = tpci200->slots[dev->slot].id_phys.size;
break; break;
case IPACK_INT_SPACE:
if (dev->int_space.address != NULL) {
dev_err(&dev->dev,
"Slot [%d:%d] INT space already mapped !\n",
tpci200->number, dev->slot);
res = -EINVAL;
goto out_unlock;
}
virt_addr_space = &dev->int_space;
phys_address = tpci200->slots[dev->slot].int_phys.address;
size_to_map = tpci200->slots[dev->slot].int_phys.size;
break;
case IPACK_MEM_SPACE: case IPACK_MEM_SPACE:
if (dev->mem_space.address != NULL) { if (dev->mem_space.address != NULL) {
dev_err(&dev->dev, dev_err(&dev->dev,
......
...@@ -132,6 +132,7 @@ struct slot_irq { ...@@ -132,6 +132,7 @@ struct slot_irq {
* @irq Slot IRQ infos * @irq Slot IRQ infos
* @io_phys IO physical base address register of the slot * @io_phys IO physical base address register of the slot
* @id_phys ID physical base address register of the slot * @id_phys ID physical base address register of the slot
* @int_phys INT physical base address register of the slot
* @mem_phys MEM physical base address register of the slot * @mem_phys MEM physical base address register of the slot
* *
*/ */
...@@ -139,6 +140,7 @@ struct tpci200_slot { ...@@ -139,6 +140,7 @@ struct tpci200_slot {
struct slot_irq *irq; struct slot_irq *irq;
struct ipack_addr_space io_phys; struct ipack_addr_space io_phys;
struct ipack_addr_space id_phys; struct ipack_addr_space id_phys;
struct ipack_addr_space int_phys;
struct ipack_addr_space mem_phys; struct ipack_addr_space mem_phys;
}; };
......
...@@ -35,6 +35,7 @@ enum ipack_space { ...@@ -35,6 +35,7 @@ enum ipack_space {
IPACK_IO_SPACE = 0, IPACK_IO_SPACE = 0,
IPACK_ID_SPACE = 1, IPACK_ID_SPACE = 1,
IPACK_MEM_SPACE = 2, IPACK_MEM_SPACE = 2,
IPACK_INT_SPACE,
}; };
/** /**
...@@ -71,6 +72,7 @@ struct ipack_device { ...@@ -71,6 +72,7 @@ struct ipack_device {
struct ipack_bus_device *bus; struct ipack_bus_device *bus;
struct ipack_addr_space id_space; struct ipack_addr_space id_space;
struct ipack_addr_space io_space; struct ipack_addr_space io_space;
struct ipack_addr_space int_space;
struct ipack_addr_space mem_space; struct ipack_addr_space mem_space;
struct device dev; struct device dev;
u8 *id; u8 *id;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment