15dd85b4bSPeter Maydell /* 25dd85b4bSPeter Maydell * ARM CMSDK APB timer emulation 35dd85b4bSPeter Maydell * 45dd85b4bSPeter Maydell * Copyright (c) 2017 Linaro Limited 55dd85b4bSPeter Maydell * Written by Peter Maydell 65dd85b4bSPeter Maydell * 75dd85b4bSPeter Maydell * This program is free software; you can redistribute it and/or modify 85dd85b4bSPeter Maydell * it under the terms of the GNU General Public License version 2 or 95dd85b4bSPeter Maydell * (at your option) any later version. 105dd85b4bSPeter Maydell */ 115dd85b4bSPeter Maydell 125dd85b4bSPeter Maydell #ifndef CMSDK_APB_TIMER_H 135dd85b4bSPeter Maydell #define CMSDK_APB_TIMER_H 145dd85b4bSPeter Maydell 15a27bd6c7SMarkus Armbruster #include "hw/qdev-properties.h" 165dd85b4bSPeter Maydell #include "hw/sysbus.h" 175dd85b4bSPeter Maydell #include "hw/ptimer.h" 18db1015e9SEduardo Habkost #include "qom/object.h" 195dd85b4bSPeter Maydell 205dd85b4bSPeter Maydell #define TYPE_CMSDK_APB_TIMER "cmsdk-apb-timer" 21*b56d351eSPeter Maydell OBJECT_DECLARE_SIMPLE_TYPE(CMSDKAPBTimer, CMSDK_APB_TIMER) 225dd85b4bSPeter Maydell 23*b56d351eSPeter Maydell struct CMSDKAPBTimer { 245dd85b4bSPeter Maydell /*< private >*/ 255dd85b4bSPeter Maydell SysBusDevice parent_obj; 265dd85b4bSPeter Maydell 275dd85b4bSPeter Maydell /*< public >*/ 285dd85b4bSPeter Maydell MemoryRegion iomem; 295dd85b4bSPeter Maydell qemu_irq timerint; 305dd85b4bSPeter Maydell uint32_t pclk_frq; 315dd85b4bSPeter Maydell struct ptimer_state *timer; 325dd85b4bSPeter Maydell 335dd85b4bSPeter Maydell uint32_t ctrl; 345dd85b4bSPeter Maydell uint32_t value; 355dd85b4bSPeter Maydell uint32_t reload; 365dd85b4bSPeter Maydell uint32_t intstatus; 37db1015e9SEduardo Habkost }; 385dd85b4bSPeter Maydell 395dd85b4bSPeter Maydell /** 405dd85b4bSPeter Maydell * cmsdk_apb_timer_create - convenience function to create TYPE_CMSDK_APB_TIMER 415dd85b4bSPeter Maydell * @addr: location in system memory to map registers 425dd85b4bSPeter Maydell * @pclk_frq: frequency in Hz of the PCLK clock (used for calculating baud rate) 435dd85b4bSPeter Maydell */ 445dd85b4bSPeter Maydell static inline DeviceState *cmsdk_apb_timer_create(hwaddr addr, 455dd85b4bSPeter Maydell qemu_irq timerint, 465dd85b4bSPeter Maydell uint32_t pclk_frq) 475dd85b4bSPeter Maydell { 485dd85b4bSPeter Maydell DeviceState *dev; 495dd85b4bSPeter Maydell SysBusDevice *s; 505dd85b4bSPeter Maydell 513e80f690SMarkus Armbruster dev = qdev_new(TYPE_CMSDK_APB_TIMER); 525dd85b4bSPeter Maydell s = SYS_BUS_DEVICE(dev); 535dd85b4bSPeter Maydell qdev_prop_set_uint32(dev, "pclk-frq", pclk_frq); 543c6ef471SMarkus Armbruster sysbus_realize_and_unref(s, &error_fatal); 555dd85b4bSPeter Maydell sysbus_mmio_map(s, 0, addr); 565dd85b4bSPeter Maydell sysbus_connect_irq(s, 0, timerint); 575dd85b4bSPeter Maydell return dev; 585dd85b4bSPeter Maydell } 595dd85b4bSPeter Maydell 605dd85b4bSPeter Maydell #endif 61