diff --git a/include/hw/sd/sd.h b/include/hw/sd/sd.h
index f6994e61f2..dc9d697c12 100644
--- a/include/hw/sd/sd.h
+++ b/include/hw/sd/sd.h
@@ -51,6 +51,7 @@ struct SDBus {
 };
 
 /* Functions to be used by qdevified callers */
+SDBus *sdbus_create_bus(DeviceState *parent, const char *name);
 int sdbus_do_command(SDBus *sd, SDRequest *req, uint8_t *response);
 void sdbus_write_data(SDBus *sd, uint8_t value);
 uint8_t sdbus_read_data(SDBus *sd);
diff --git a/include/hw/sd/sdhci.h b/include/hw/sd/sdhci.h
index e6644e6e7d..579e0ea644 100644
--- a/include/hw/sd/sdhci.h
+++ b/include/hw/sd/sdhci.h
@@ -39,7 +39,8 @@ typedef struct SDHCIState {
     };
 
     /*< public >*/
-    SDBus sdbus;
+    char *bus_name;
+    SDBus *sdbus;
     MemoryRegion iomem;
     MemoryRegion *dma_mr;
     AddressSpace dma_as;
diff --git a/hw/arm/bcm2835_peripherals.c b/hw/arm/bcm2835_peripherals.c
index 7f30f19c4c..60a0eec4d1 100644
--- a/hw/arm/bcm2835_peripherals.c
+++ b/hw/arm/bcm2835_peripherals.c
@@ -310,7 +310,7 @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
 
     /* GPIO */
     object_property_add_const_link(OBJECT(&s->gpio), "sdbus-sdhci",
-                                   OBJECT(&s->sdhci.sdbus), &error_abort);
+                                   OBJECT(s->sdhci.sdbus), &error_abort);
     object_property_add_const_link(OBJECT(&s->gpio), "sdbus-sdhost",
                                    OBJECT(&s->sdhost.sdbus), &error_abort);
     object_property_set_bool(OBJECT(&s->gpio), true, "realized", &err);
diff --git a/hw/sd/core.c b/hw/sd/core.c
index eda595973b..021a8d7258 100644
--- a/hw/sd/core.c
+++ b/hw/sd/core.c
@@ -187,3 +187,8 @@ static void sd_bus_register_types(void)
 }
 
 type_init(sd_bus_register_types)
+
+SDBus *sdbus_create_bus(DeviceState *parent, const char *name)
+{
+    return SD_BUS(qbus_create(TYPE_SD_BUS, parent, name));
+}
diff --git a/hw/sd/sdhci.c b/hw/sd/sdhci.c
index 5f8064c59b..40596f6ebe 100644
--- a/hw/sd/sdhci.c
+++ b/hw/sd/sdhci.c
@@ -186,8 +186,8 @@ static void sdhci_reset(SDHCIState *s)
     memset(&s->sdmasysad, 0, (uintptr_t)&s->capareg - (uintptr_t)&s->sdmasysad);
 
     /* Reset other state based on current card insertion/readonly status */
-    sdhci_set_inserted(dev, sdbus_get_inserted(&s->sdbus));
-    sdhci_set_readonly(dev, sdbus_get_readonly(&s->sdbus));
+    sdhci_set_inserted(dev, sdbus_get_inserted(s->sdbus));
+    sdhci_set_readonly(dev, sdbus_get_readonly(s->sdbus));
 
     s->data_count = 0;
     s->stopped_state = sdhc_not_stopped;
@@ -223,7 +223,7 @@ static void sdhci_send_command(SDHCIState *s)
     request.arg = s->argument;
 
     trace_sdhci_send_command(request.cmd, request.arg);
-    rlen = sdbus_do_command(&s->sdbus, &request, response);
+    rlen = sdbus_do_command(s->sdbus, &request, response);
 
     if (s->cmdreg & SDHC_CMD_RESPONSE) {
         if (rlen == 4) {
@@ -278,7 +278,7 @@ static void sdhci_end_transfer(SDHCIState *s)
         request.cmd = 0x0C;
         request.arg = 0;
         trace_sdhci_end_transfer(request.cmd, request.arg);
-        sdbus_do_command(&s->sdbus, &request, response);
+        sdbus_do_command(s->sdbus, &request, response);
         /* Auto CMD12 response goes to the upper Response register */
         s->rspreg[3] = (response[0] << 24) | (response[1] << 16) |
                 (response[2] << 8) | response[3];
@@ -310,7 +310,7 @@ static void sdhci_read_block_from_card(SDHCIState *s)
     }
 
     for (index = 0; index < (s->blksize & 0x0fff); index++) {
-        s->fifo_buffer[index] = sdbus_read_data(&s->sdbus);
+        s->fifo_buffer[index] = sdbus_read_data(s->sdbus);
     }
 
     /* New data now available for READ through Buffer Port Register */
@@ -402,7 +402,7 @@ static void sdhci_write_block_to_card(SDHCIState *s)
     }
 
     for (index = 0; index < (s->blksize & 0x0fff); index++) {
-        sdbus_write_data(&s->sdbus, s->fifo_buffer[index]);
+        sdbus_write_data(s->sdbus, s->fifo_buffer[index]);
     }
 
     /* Next data can be written through BUFFER DATORT register */
@@ -488,7 +488,7 @@ static void sdhci_sdma_transfer_multi_blocks(SDHCIState *s)
         while (s->blkcnt) {
             if (s->data_count == 0) {
                 for (n = 0; n < block_size; n++) {
-                    s->fifo_buffer[n] = sdbus_read_data(&s->sdbus);
+                    s->fifo_buffer[n] = sdbus_read_data(s->sdbus);
                 }
             }
             begin = s->data_count;
@@ -529,7 +529,7 @@ static void sdhci_sdma_transfer_multi_blocks(SDHCIState *s)
             s->sdmasysad += s->data_count - begin;
             if (s->data_count == block_size) {
                 for (n = 0; n < block_size; n++) {
-                    sdbus_write_data(&s->sdbus, s->fifo_buffer[n]);
+                    sdbus_write_data(s->sdbus, s->fifo_buffer[n]);
                 }
                 s->data_count = 0;
                 if (s->trnmod & SDHC_TRNS_BLK_CNT_EN) {
@@ -560,7 +560,7 @@ static void sdhci_sdma_transfer_single_block(SDHCIState *s)
 
     if (s->trnmod & SDHC_TRNS_READ) {
         for (n = 0; n < datacnt; n++) {
-            s->fifo_buffer[n] = sdbus_read_data(&s->sdbus);
+            s->fifo_buffer[n] = sdbus_read_data(s->sdbus);
         }
         dma_memory_write(&address_space_memory, s->sdmasysad, s->fifo_buffer,
                          datacnt);
@@ -568,7 +568,7 @@ static void sdhci_sdma_transfer_single_block(SDHCIState *s)
         dma_memory_read(&address_space_memory, s->sdmasysad, s->fifo_buffer,
                         datacnt);
         for (n = 0; n < datacnt; n++) {
-            sdbus_write_data(&s->sdbus, s->fifo_buffer[n]);
+            sdbus_write_data(s->sdbus, s->fifo_buffer[n]);
         }
     }
     s->blkcnt--;
@@ -659,7 +659,7 @@ static void sdhci_do_adma(SDHCIState *s)
                 while (length) {
                     if (s->data_count == 0) {
                         for (n = 0; n < block_size; n++) {
-                            s->fifo_buffer[n] = sdbus_read_data(&s->sdbus);
+                            s->fifo_buffer[n] = sdbus_read_data(s->sdbus);
                         }
                     }
                     begin = s->data_count;
@@ -700,7 +700,7 @@ static void sdhci_do_adma(SDHCIState *s)
                     dscr.addr += s->data_count - begin;
                     if (s->data_count == block_size) {
                         for (n = 0; n < block_size; n++) {
-                            sdbus_write_data(&s->sdbus, s->fifo_buffer[n]);
+                            sdbus_write_data(s->sdbus, s->fifo_buffer[n]);
                         }
                         s->data_count = 0;
                         if (s->trnmod & SDHC_TRNS_BLK_CNT_EN) {
@@ -807,7 +807,7 @@ static void sdhci_data_transfer(void *opaque)
             break;
         }
     } else {
-        if ((s->trnmod & SDHC_TRNS_READ) && sdbus_data_ready(&s->sdbus)) {
+        if ((s->trnmod & SDHC_TRNS_READ) && sdbus_data_ready(s->sdbus)) {
             s->prnsts |= SDHC_DOING_READ | SDHC_DATA_INHIBIT |
                     SDHC_DAT_LINE_ACTIVE;
             sdhci_read_block_from_card(s);
@@ -1156,15 +1156,14 @@ static inline unsigned int sdhci_get_fifolen(SDHCIState *s)
 
 static void sdhci_initfn(SDHCIState *s)
 {
-    qbus_create_inplace(&s->sdbus, sizeof(s->sdbus),
-                        TYPE_SDHCI_BUS, DEVICE(s), "sd-bus");
-
     s->insert_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, sdhci_raise_insertion_irq, s);
     s->transfer_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, sdhci_data_transfer, s);
 }
 
 static void sdhci_realizefn(SDHCIState *s, Error **errp)
 {
+    const char *name = s->bus_name ? s->bus_name : "sd-bus";
+
     sdhci_init_capareg(s, errp);
 
     s->buf_maxsz = sdhci_get_fifolen(s);
@@ -1177,10 +1176,14 @@ static void sdhci_realizefn(SDHCIState *s, Error **errp)
     address_space_init(&s->dma_as,
                        s->dma_mr ? s->dma_mr : get_system_memory(),
                        "sdhci-dma");
+
+    s->sdbus = sdbus_create_bus(DEVICE(s), name);
 }
 
 static void sdhci_unrealizefn(SDHCIState *s, Error **errp)
 {
+    g_free(s->sdbus);
+
     if (s->dma_mr) {
         address_space_destroy(&s->dma_as);
         object_unparent(OBJECT(&s->dma_mr));
@@ -1269,6 +1272,7 @@ static Property sdhci_properties[] = {
                      false),
     DEFINE_PROP_LINK("dma-memory", SDHCIState, dma_mr,
                      TYPE_MEMORY_REGION, MemoryRegion *),
+    DEFINE_PROP_STRING("sd-bus-name", SDHCIState, bus_name),
     DEFINE_PROP_END_OF_LIST(),
 };
 
