This adds the bcm2835_sdhost and bcm2835_gpio to the BCM2835 platform.
The bcm2835_gpio has a link to both the sdhci and sdhost controllers for
supporting the alternate function of GPIOs 48-53 (SD controller selection)
Signed-off-by: Clement Deschamps
---
hw/arm/bcm2835_peripherals.c | 44
include/hw/arm/bcm2835_peripherals.h | 4
2 files changed, 48 insertions(+)
diff --git a/hw/arm/bcm2835_peripherals.c b/hw/arm/bcm2835_peripherals.c
index 2e641a3989..adc419dfcf 100644
--- a/hw/arm/bcm2835_peripherals.c
+++ b/hw/arm/bcm2835_peripherals.c
@@ -91,6 +91,11 @@ static void bcm2835_peripherals_init(Object *obj)
object_property_add_child(obj, "sdhci", OBJECT(>sdhci), NULL);
qdev_set_parent_bus(DEVICE(>sdhci), sysbus_get_default());
+/* SDHOST */
+object_initialize(>sdhost, sizeof(s->sdhost), TYPE_BCM2835_SDHOST);
+object_property_add_child(obj, "sdhost", OBJECT(>sdhost), NULL);
+qdev_set_parent_bus(DEVICE(>sdhost), sysbus_get_default());
+
/* DMA Channels */
object_initialize(>dma, sizeof(s->dma), TYPE_BCM2835_DMA);
object_property_add_child(obj, "dma", OBJECT(>dma), NULL);
@@ -98,6 +103,16 @@ static void bcm2835_peripherals_init(Object *obj)
object_property_add_const_link(OBJECT(>dma), "dma-mr",
OBJECT(>gpu_bus_mr), _abort);
+
+/* GPIO */
+object_initialize(>gpio, sizeof(s->gpio), TYPE_BCM2835_GPIO);
+object_property_add_child(obj, "gpio", OBJECT(>gpio), NULL);
+qdev_set_parent_bus(DEVICE(>gpio), sysbus_get_default());
+
+object_property_add_const_link(OBJECT(>gpio), "sdhci",
+ OBJECT(>sdhci), _abort);
+object_property_add_const_link(OBJECT(>gpio), "sdhost",
+ OBJECT(>sdhost), _abort);
}
static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
@@ -259,6 +274,25 @@ static void bcm2835_peripherals_realize(DeviceState *dev,
Error **errp)
return;
}
+/* SDHOST */
+object_property_set_bool(OBJECT(>sdhost), true, "realized", );
+if (err) {
+error_propagate(errp, err);
+return;
+}
+
+memory_region_add_subregion(>peri_mr, MMCI0_OFFSET,
+sysbus_mmio_get_region(SYS_BUS_DEVICE(>sdhost), 0));
+sysbus_connect_irq(SYS_BUS_DEVICE(>sdhost), 0,
+qdev_get_gpio_in_named(DEVICE(>ic), BCM2835_IC_GPU_IRQ,
+ INTERRUPT_SDIO));
+object_property_add_alias(OBJECT(s), "sd-bus-2", OBJECT(>sdhost),
+ "sd-bus", );
+if (err) {
+error_propagate(errp, err);
+return;
+}
+
/* DMA Channels */
object_property_set_bool(OBJECT(>dma), true, "realized", );
if (err) {
@@ -277,6 +311,16 @@ static void bcm2835_peripherals_realize(DeviceState *dev,
Error **errp)
BCM2835_IC_GPU_IRQ,
INTERRUPT_DMA0 + n));
}
+
+/* GPIO */
+object_property_set_bool(OBJECT(>gpio), true, "realized", );
+if (err) {
+error_propagate(errp, err);
+return;
+}
+
+memory_region_add_subregion(>peri_mr, GPIO_OFFSET,
+sysbus_mmio_get_region(SYS_BUS_DEVICE(>gpio), 0));
}
static void bcm2835_peripherals_class_init(ObjectClass *oc, void *data)
diff --git a/include/hw/arm/bcm2835_peripherals.h
b/include/hw/arm/bcm2835_peripherals.h
index e12ae3721a..4c87859e31 100644
--- a/include/hw/arm/bcm2835_peripherals.h
+++ b/include/hw/arm/bcm2835_peripherals.h
@@ -21,6 +21,8 @@
#include "hw/misc/bcm2835_property.h"
#include "hw/misc/bcm2835_mbox.h"
#include "hw/sd/sdhci.h"
+#include "hw/sd/bcm2835_sdhost.h"
+#include "hw/gpio/bcm2835_gpio.h"
#define TYPE_BCM2835_PERIPHERALS "bcm2835-peripherals"
#define BCM2835_PERIPHERALS(obj) \
@@ -43,6 +45,8 @@ typedef struct BCM2835PeripheralState {
BCM2835PropertyState property;
BCM2835MboxState mboxes;
SDHCIState sdhci;
+BCM2835SDHostState sdhost;
+BCM2835GpioState gpio;
} BCM2835PeripheralState;
#endif /* BCM2835_PERIPHERALS_H */
--
2.11.1