Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+29 −0
Original line number Diff line number Diff line
@@ -95,6 +95,8 @@ static void tpci200_unregister(struct tpci200_board *tpci200)
		tpci200->slots[i].io_phys.size = 0;
		tpci200->slots[i].id_phys.address = NULL;
		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.size = 0;
	}
@@ -331,6 +333,11 @@ static int tpci200_register(struct tpci200_board *tpci200)
			TPCI200_ID_SPACE_OFF + TPCI200_ID_SPACE_GAP*i;
		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 =
			(void __iomem *)mem_base + TPCI200_MEM8_GAP*i;
		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)
		}
		virt_addr_space = &dev->id_space;
		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:
		if (dev->mem_space.address == NULL) {
			dev_info(&dev->dev,
@@ -460,6 +476,19 @@ static int tpci200_slot_map_space(struct ipack_device *dev,
		phys_address = tpci200->slots[dev->slot].id_phys.address;
		size_to_map = tpci200->slots[dev->slot].id_phys.size;
		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:
		if (dev->mem_space.address != NULL) {
			dev_err(&dev->dev,
+2 −0
Original line number Diff line number Diff line
@@ -132,6 +132,7 @@ struct slot_irq {
 * @irq		Slot IRQ infos
 * @io_phys	IO 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
 *
 */
@@ -139,6 +140,7 @@ struct tpci200_slot {
	struct slot_irq		*irq;
	struct ipack_addr_space io_phys;
	struct ipack_addr_space id_phys;
	struct ipack_addr_space int_phys;
	struct ipack_addr_space mem_phys;
};

+2 −0
Original line number Diff line number Diff line
@@ -35,6 +35,7 @@ enum ipack_space {
	IPACK_IO_SPACE    = 0,
	IPACK_ID_SPACE    = 1,
	IPACK_MEM_SPACE   = 2,
	IPACK_INT_SPACE,
};

/**
@@ -71,6 +72,7 @@ struct ipack_device {
	struct ipack_bus_device *bus;
	struct ipack_addr_space id_space;
	struct ipack_addr_space io_space;
	struct ipack_addr_space int_space;
	struct ipack_addr_space mem_space;
	struct device dev;
	u8                      *id;