From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:55890) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bCUiT-0006Sb-Kg for qemu-devel@nongnu.org; Mon, 13 Jun 2016 12:28:02 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bCUiS-0000yr-GI for qemu-devel@nongnu.org; Mon, 13 Jun 2016 12:27:57 -0400 Received: from greensocs.com ([193.104.36.180]:57947) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bCUiS-0000yV-5b for qemu-devel@nongnu.org; Mon, 13 Jun 2016 12:27:56 -0400 From: fred.konrad@greensocs.com Date: Mon, 13 Jun 2016 18:27:39 +0200 Message-Id: <1465835259-21449-12-git-send-email-fred.konrad@greensocs.com> In-Reply-To: <1465835259-21449-1-git-send-email-fred.konrad@greensocs.com> References: <1465835259-21449-1-git-send-email-fred.konrad@greensocs.com> Subject: [Qemu-devel] [RFC PATCH 11/11] zynqmp: add reference clock List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: peter.maydell@linaro.org, edgar.iglesias@xilinx.com, alistair.francis@xilinx.com, mark.burton@greensocs.com, fred.konrad@greensocs.com From: KONRAD Frederic This adds some fixed reference clock to the zynqmp platform. They will feed the zynqmp_crf block. Signed-off-by: KONRAD Frederic --- hw/arm/xlnx-zynqmp.c | 42 ++++++++++++++++++++++++++++++++++++++++++ include/hw/arm/xlnx-zynqmp.h | 6 ++++++ 2 files changed, 48 insertions(+) diff --git a/hw/arm/xlnx-zynqmp.c b/hw/arm/xlnx-zynqmp.c index a8b7669..68f924f 100644 --- a/hw/arm/xlnx-zynqmp.c +++ b/hw/arm/xlnx-zynqmp.c @@ -22,6 +22,7 @@ #include "hw/arm/xlnx-zynqmp.h" #include "hw/intc/arm_gic_common.h" #include "exec/address-spaces.h" +#include "qemu/qemu-clock.h" #define GIC_NUM_SPI_INTR 160 @@ -140,6 +141,22 @@ static void xlnx_zynqmp_init(Object *obj) qdev_set_parent_bus(DEVICE(s->crf), sysbus_get_default()); object_property_add_child(obj, "xlnx.zynqmp_crf", OBJECT(s->crf), &error_abort); + + s->pss_ref_clk = object_new(TYPE_FIXED_CLOCK); + object_property_add_child(obj, "pss_ref_clk", s->pss_ref_clk, + &error_abort); + object_property_set_int(s->pss_ref_clk, 50000000, "rate", &error_abort); + s->video_clk = object_new(TYPE_FIXED_CLOCK); + object_property_add_child(obj, "video_clk", s->video_clk, &error_abort); + object_property_set_int(s->video_clk, 27000000, "rate", &error_abort); + s->pss_alt_ref_clk = object_new(TYPE_FIXED_CLOCK); + object_property_add_child(obj, "pss_alt_ref_clk", s->pss_alt_ref_clk, + &error_abort); + s->aux_refclk = object_new(TYPE_FIXED_CLOCK); + object_property_add_child(obj, "aux_refclk", s->aux_refclk, &error_abort); + s->gt_crx_ref_clk = object_new(TYPE_FIXED_CLOCK); + object_property_add_child(obj, "gt_crx_ref_clk", s->gt_crx_ref_clk, + &error_abort); } static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp) @@ -373,6 +390,31 @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp) } sysbus_mmio_map(SYS_BUS_DEVICE(s->crf), 0, 0xFD1A0000); + + /* Bound the clock */ + qemu_clk_bound_clock(qemu_clk_get_pin(DEVICE(s->pss_ref_clk), "clk_out"), + qemu_clk_get_pin(DEVICE(s->crf), "pss_ref_clk")); + + qemu_clk_bound_clock(qemu_clk_get_pin(DEVICE(s->video_clk), "clk_out"), + qemu_clk_get_pin(DEVICE(s->crf), "video_clk")); + + qemu_clk_bound_clock(qemu_clk_get_pin(DEVICE(s->pss_alt_ref_clk), + "clk_out"), + qemu_clk_get_pin(DEVICE(s->crf), "pss_alt_ref_clk")); + + qemu_clk_bound_clock(qemu_clk_get_pin(DEVICE(s->aux_refclk), "clk_out"), + qemu_clk_get_pin(DEVICE(s->crf), "aux_refclk")); + + qemu_clk_bound_clock(qemu_clk_get_pin(DEVICE(s->gt_crx_ref_clk), + "clk_out"), + qemu_clk_get_pin(DEVICE(s->crf), "gt_crx_ref_clk")); + + object_property_set_bool(s->crf, true, "realized", &err); + object_property_set_bool(s->pss_ref_clk, true, "realized", &err); + object_property_set_bool(s->video_clk, true, "realized", &err); + object_property_set_bool(s->pss_alt_ref_clk, true, "realized", &err); + object_property_set_bool(s->aux_refclk, true, "realized", &err); + object_property_set_bool(s->gt_crx_ref_clk, true, "realized", &err); } static Property xlnx_zynqmp_props[] = { diff --git a/include/hw/arm/xlnx-zynqmp.h b/include/hw/arm/xlnx-zynqmp.h index 78fed6e..536e4a1 100644 --- a/include/hw/arm/xlnx-zynqmp.h +++ b/include/hw/arm/xlnx-zynqmp.h @@ -26,6 +26,7 @@ #include "hw/ide/ahci.h" #include "hw/sd/sdhci.h" #include "hw/ssi/xilinx_spips.h" +#include "hw/misc/fixed-clock.h" #define TYPE_XLNX_ZYNQMP "xlnx,zynqmp" #define XLNX_ZYNQMP(obj) OBJECT_CHECK(XlnxZynqMPState, (obj), \ @@ -81,6 +82,11 @@ typedef struct XlnxZynqMPState { SysbusAHCIState sata; SDHCIState sdhci[XLNX_ZYNQMP_NUM_SDHCI]; XilinxSPIPS spi[XLNX_ZYNQMP_NUM_SPIS]; + Object *pss_ref_clk; + Object *video_clk; + Object *pss_alt_ref_clk; + Object *aux_refclk; + Object *gt_crx_ref_clk; Object *crf; char *boot_cpu; -- 2.5.5