mirror of https://gitee.com/openkylin/qemu.git
tusb6010: Convert to qdev
Convert the tusb6010 to qdev. Signed-off-by: Juha Riihimäki <juha.riihimaki@nokia.com> [Riku Voipio: Fixes and restructuring patchset] Signed-off-by: Riku Voipio <riku.voipio@iki.fi> [Peter Maydell: More fixes and cleanups for upstream submission] Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Edgar E. Iglesias <edgar.iglesias@gmail.com>
This commit is contained in:
parent
f0fb8b7180
commit
bdc76462ac
31
hw/nseries.c
31
hw/nseries.c
|
@ -32,7 +32,6 @@
|
|||
#include "bt.h"
|
||||
#include "loader.h"
|
||||
#include "blockdev.h"
|
||||
#include "tusb6010.h"
|
||||
#include "sysbus.h"
|
||||
|
||||
/* Nokia N8x0 support */
|
||||
|
@ -50,7 +49,7 @@ struct n800_s {
|
|||
int keymap[0x80];
|
||||
DeviceState *kbd;
|
||||
|
||||
TUSBState *usb;
|
||||
DeviceState *usb;
|
||||
void *retu;
|
||||
void *tahvo;
|
||||
DeviceState *nand;
|
||||
|
@ -765,25 +764,21 @@ static void n8x0_uart_setup(struct n800_s *s)
|
|||
omap_uart_attach(s->cpu->uart[BT_UART], radio);
|
||||
}
|
||||
|
||||
static void n8x0_usb_power_cb(void *opaque, int line, int level)
|
||||
{
|
||||
struct n800_s *s = opaque;
|
||||
|
||||
tusb6010_power(s->usb, level);
|
||||
}
|
||||
|
||||
static void n8x0_usb_setup(struct n800_s *s)
|
||||
{
|
||||
qemu_irq tusb_irq = qdev_get_gpio_in(s->cpu->gpio, N8X0_TUSB_INT_GPIO);
|
||||
qemu_irq tusb_pwr = qemu_allocate_irqs(n8x0_usb_power_cb, s, 1)[0];
|
||||
TUSBState *tusb = tusb6010_init(tusb_irq);
|
||||
|
||||
SysBusDevice *dev;
|
||||
s->usb = qdev_create(NULL, "tusb6010");
|
||||
dev = sysbus_from_qdev(s->usb);
|
||||
qdev_init_nofail(s->usb);
|
||||
sysbus_connect_irq(dev, 0,
|
||||
qdev_get_gpio_in(s->cpu->gpio, N8X0_TUSB_INT_GPIO));
|
||||
/* Using the NOR interface */
|
||||
omap_gpmc_attach(s->cpu->gpmc, N8X0_USB_ASYNC_CS, tusb6010_async_io(tusb));
|
||||
omap_gpmc_attach(s->cpu->gpmc, N8X0_USB_SYNC_CS, tusb6010_sync_io(tusb));
|
||||
|
||||
s->usb = tusb;
|
||||
qdev_connect_gpio_out(s->cpu->gpio, N8X0_TUSB_ENABLE_GPIO, tusb_pwr);
|
||||
omap_gpmc_attach(s->cpu->gpmc, N8X0_USB_ASYNC_CS,
|
||||
sysbus_mmio_get_region(dev, 0));
|
||||
omap_gpmc_attach(s->cpu->gpmc, N8X0_USB_SYNC_CS,
|
||||
sysbus_mmio_get_region(dev, 1));
|
||||
qdev_connect_gpio_out(s->cpu->gpio, N8X0_TUSB_ENABLE_GPIO,
|
||||
qdev_get_gpio_in(s->usb, 0)); /* tusb_pwr */
|
||||
}
|
||||
|
||||
/* Setup done before the main bootloader starts by some early setup code
|
||||
|
|
123
hw/tusb6010.c
123
hw/tusb6010.c
|
@ -23,9 +23,11 @@
|
|||
#include "usb.h"
|
||||
#include "omap.h"
|
||||
#include "irq.h"
|
||||
#include "tusb6010.h"
|
||||
#include "devices.h"
|
||||
#include "sysbus.h"
|
||||
|
||||
struct TUSBState {
|
||||
typedef struct TUSBState {
|
||||
SysBusDevice busdev;
|
||||
MemoryRegion iomem[2];
|
||||
qemu_irq irq;
|
||||
MUSBState *musb;
|
||||
|
@ -59,7 +61,7 @@ struct TUSBState {
|
|||
uint32_t pullup[2];
|
||||
uint32_t control_config;
|
||||
uint32_t otg_timer_val;
|
||||
};
|
||||
} TUSBState;
|
||||
|
||||
#define TUSB_DEVCLOCK 60000000 /* 60 MHz */
|
||||
|
||||
|
@ -234,16 +236,6 @@ struct TUSBState {
|
|||
#define TUSB_EP_CONFIG_XFR_SIZE(v) ((v) & 0x7fffffff)
|
||||
#define TUSB_PROD_TEST_RESET_VAL 0xa596
|
||||
|
||||
MemoryRegion *tusb6010_sync_io(TUSBState *s)
|
||||
{
|
||||
return &s->iomem[0];
|
||||
}
|
||||
|
||||
MemoryRegion *tusb6010_async_io(TUSBState *s)
|
||||
{
|
||||
return &s->iomem[1];
|
||||
}
|
||||
|
||||
static void tusb_intr_update(TUSBState *s)
|
||||
{
|
||||
if (s->control_config & TUSB_INT_CTRL_CONF_INT_POLARITY)
|
||||
|
@ -723,9 +715,33 @@ static void tusb_musb_core_intr(void *opaque, int source, int level)
|
|||
}
|
||||
}
|
||||
|
||||
TUSBState *tusb6010_init(qemu_irq intr)
|
||||
static void tusb6010_power(TUSBState *s, int on)
|
||||
{
|
||||
TUSBState *s = g_malloc0(sizeof(*s));
|
||||
if (!on) {
|
||||
s->power = 0;
|
||||
} else if (!s->power && on) {
|
||||
s->power = 1;
|
||||
/* Pull the interrupt down after TUSB6010 comes up. */
|
||||
s->intr_ok = 0;
|
||||
tusb_intr_update(s);
|
||||
qemu_mod_timer(s->pwr_timer,
|
||||
qemu_get_clock_ns(vm_clock) + get_ticks_per_sec() / 2);
|
||||
}
|
||||
}
|
||||
|
||||
static void tusb6010_irq(void *opaque, int source, int level)
|
||||
{
|
||||
if (source) {
|
||||
tusb_musb_core_intr(opaque, source - 1, level);
|
||||
} else {
|
||||
tusb6010_power(opaque, level);
|
||||
}
|
||||
}
|
||||
|
||||
static void tusb6010_reset(DeviceState *dev)
|
||||
{
|
||||
TUSBState *s = FROM_SYSBUS(TUSBState, sysbus_from_qdev(dev));
|
||||
int i;
|
||||
|
||||
s->test_reset = TUSB_PROD_TEST_RESET_VAL;
|
||||
s->host_mode = 0;
|
||||
|
@ -735,28 +751,59 @@ TUSBState *tusb6010_init(qemu_irq intr)
|
|||
s->mask = 0xffffffff;
|
||||
s->intr = 0x00000000;
|
||||
s->otg_timer_val = 0;
|
||||
memory_region_init_io(&s->iomem[1], &tusb_async_ops, s, "tusb-async",
|
||||
UINT32_MAX);
|
||||
s->irq = intr;
|
||||
s->otg_timer = qemu_new_timer_ns(vm_clock, tusb_otg_tick, s);
|
||||
s->pwr_timer = qemu_new_timer_ns(vm_clock, tusb_power_tick, s);
|
||||
s->musb = musb_init(qemu_allocate_irqs(tusb_musb_core_intr, s,
|
||||
__musb_irq_max));
|
||||
|
||||
return s;
|
||||
}
|
||||
|
||||
void tusb6010_power(TUSBState *s, int on)
|
||||
{
|
||||
if (!on)
|
||||
s->power = 0;
|
||||
else if (!s->power && on) {
|
||||
s->power = 1;
|
||||
|
||||
/* Pull the interrupt down after TUSB6010 comes up. */
|
||||
s->intr_ok = 0;
|
||||
tusb_intr_update(s);
|
||||
qemu_mod_timer(s->pwr_timer,
|
||||
qemu_get_clock_ns(vm_clock) + get_ticks_per_sec() / 2);
|
||||
s->scratch = 0;
|
||||
s->prcm_config = 0;
|
||||
s->prcm_mngmt = 0;
|
||||
s->intr_ok = 0;
|
||||
s->usbip_intr = 0;
|
||||
s->usbip_mask = 0;
|
||||
s->gpio_intr = 0;
|
||||
s->gpio_mask = 0;
|
||||
s->gpio_config = 0;
|
||||
s->dma_intr = 0;
|
||||
s->dma_mask = 0;
|
||||
s->dma_map = 0;
|
||||
s->dma_config = 0;
|
||||
s->ep0_config = 0;
|
||||
s->wkup_mask = 0;
|
||||
s->pullup[0] = s->pullup[1] = 0;
|
||||
s->control_config = 0;
|
||||
for (i = 0; i < 15; i++) {
|
||||
s->rx_config[i] = s->tx_config[i] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
static int tusb6010_init(SysBusDevice *dev)
|
||||
{
|
||||
TUSBState *s = FROM_SYSBUS(TUSBState, dev);
|
||||
qemu_irq *musb_irqs;
|
||||
int i;
|
||||
s->otg_timer = qemu_new_timer_ns(vm_clock, tusb_otg_tick, s);
|
||||
s->pwr_timer = qemu_new_timer_ns(vm_clock, tusb_power_tick, s);
|
||||
memory_region_init_io(&s->iomem[1], &tusb_async_ops, s, "tusb-async",
|
||||
UINT32_MAX);
|
||||
sysbus_init_mmio_region(dev, &s->iomem[0]);
|
||||
sysbus_init_mmio_region(dev, &s->iomem[1]);
|
||||
sysbus_init_irq(dev, &s->irq);
|
||||
qdev_init_gpio_in(&dev->qdev, tusb6010_irq, __musb_irq_max + 1);
|
||||
musb_irqs = g_new0(qemu_irq, __musb_irq_max);
|
||||
for (i = 0; i < __musb_irq_max; i++) {
|
||||
musb_irqs[i] = qdev_get_gpio_in(&dev->qdev, i + 1);
|
||||
}
|
||||
s->musb = musb_init(musb_irqs);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static SysBusDeviceInfo tusb6010_info = {
|
||||
.init = tusb6010_init,
|
||||
.qdev.name = "tusb6010",
|
||||
.qdev.size = sizeof(TUSBState),
|
||||
.qdev.reset = tusb6010_reset,
|
||||
};
|
||||
|
||||
static void tusb6010_register_device(void)
|
||||
{
|
||||
sysbus_register_withprop(&tusb6010_info);
|
||||
}
|
||||
|
||||
device_init(tusb6010_register_device)
|
||||
|
|
|
@ -1,28 +0,0 @@
|
|||
/*
|
||||
* tusb6010 interfaces
|
||||
*
|
||||
* Copyright 2011 Red Hat, Inc. and/or its affiliates
|
||||
*
|
||||
* Authors:
|
||||
* Avi Kivity <avi@redhat.com>
|
||||
*
|
||||
* Derived from hw/devices.h.
|
||||
*
|
||||
* This work is licensed under the terms of the GNU GPL, version 2. See
|
||||
* the COPYING file in the top-level directory.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef TUSB6010_H
|
||||
#define TUSB6010_H
|
||||
|
||||
#include "targphys.h"
|
||||
#include "memory.h"
|
||||
|
||||
typedef struct TUSBState TUSBState;
|
||||
TUSBState *tusb6010_init(qemu_irq intr);
|
||||
MemoryRegion *tusb6010_sync_io(TUSBState *s);
|
||||
MemoryRegion *tusb6010_async_io(TUSBState *s);
|
||||
void tusb6010_power(TUSBState *s, int on);
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue