1e0dadc1eSPeter Maydell /* 2e0dadc1eSPeter Maydell * auxbus.h 3e0dadc1eSPeter Maydell * 4e0dadc1eSPeter Maydell * Copyright (C)2014 : GreenSocs Ltd 5e0dadc1eSPeter Maydell * http://www.greensocs.com/ , email: info@greensocs.com 6e0dadc1eSPeter Maydell * 7e0dadc1eSPeter Maydell * Developed by : 8e0dadc1eSPeter Maydell * Frederic Konrad <fred.konrad@greensocs.com> 9e0dadc1eSPeter Maydell * 10e0dadc1eSPeter Maydell * This program is free software; you can redistribute it and/or modify 11e0dadc1eSPeter Maydell * it under the terms of the GNU General Public License as published by 12e0dadc1eSPeter Maydell * the Free Software Foundation, either version 2 of the License, or 13e0dadc1eSPeter Maydell * (at your option)any later version. 14e0dadc1eSPeter Maydell * 15e0dadc1eSPeter Maydell * This program is distributed in the hope that it will be useful, 16e0dadc1eSPeter Maydell * but WITHOUT ANY WARRANTY; without even the implied warranty of 17e0dadc1eSPeter Maydell * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18e0dadc1eSPeter Maydell * GNU General Public License for more details. 19e0dadc1eSPeter Maydell * 20e0dadc1eSPeter Maydell * You should have received a copy of the GNU General Public License along 21e0dadc1eSPeter Maydell * with this program; if not, see <http://www.gnu.org/licenses/>. 22e0dadc1eSPeter Maydell * 23e0dadc1eSPeter Maydell */ 24e0dadc1eSPeter Maydell 25121d0712SMarkus Armbruster #ifndef HW_MISC_AUXBUS_H 26121d0712SMarkus Armbruster #define HW_MISC_AUXBUS_H 27e0dadc1eSPeter Maydell 28d4842052SMarkus Armbruster #include "exec/memory.h" 29a27bd6c7SMarkus Armbruster #include "hw/qdev-core.h" 30db1015e9SEduardo Habkost #include "qom/object.h" 31e0dadc1eSPeter Maydell 32e0dadc1eSPeter Maydell typedef struct AUXSlave AUXSlave; 33e0dadc1eSPeter Maydell typedef enum AUXCommand AUXCommand; 34e0dadc1eSPeter Maydell typedef enum AUXReply AUXReply; 35cb8cf86bSEduardo Habkost 36cb8cf86bSEduardo Habkost #define TYPE_AUXTOI2C "aux-to-i2c-bridge" 378063396bSEduardo Habkost OBJECT_DECLARE_SIMPLE_TYPE(AUXTOI2CState, AUXTOI2C) 38e0dadc1eSPeter Maydell 39e0dadc1eSPeter Maydell enum AUXCommand { 40e0dadc1eSPeter Maydell WRITE_I2C = 0, 41e0dadc1eSPeter Maydell READ_I2C = 1, 42e0dadc1eSPeter Maydell WRITE_I2C_STATUS = 2, 43e0dadc1eSPeter Maydell WRITE_I2C_MOT = 4, 44e0dadc1eSPeter Maydell READ_I2C_MOT = 5, 45e0dadc1eSPeter Maydell WRITE_AUX = 8, 46e0dadc1eSPeter Maydell READ_AUX = 9 47e0dadc1eSPeter Maydell }; 48e0dadc1eSPeter Maydell 49e0dadc1eSPeter Maydell enum AUXReply { 50e0dadc1eSPeter Maydell AUX_I2C_ACK = 0, 51e0dadc1eSPeter Maydell AUX_NACK = 1, 52e0dadc1eSPeter Maydell AUX_DEFER = 2, 53e0dadc1eSPeter Maydell AUX_I2C_NACK = 4, 54e0dadc1eSPeter Maydell AUX_I2C_DEFER = 8 55e0dadc1eSPeter Maydell }; 56e0dadc1eSPeter Maydell 57e0dadc1eSPeter Maydell #define TYPE_AUX_BUS "aux-bus" 588063396bSEduardo Habkost OBJECT_DECLARE_SIMPLE_TYPE(AUXBus, AUX_BUS) 59e0dadc1eSPeter Maydell 60e0dadc1eSPeter Maydell struct AUXBus { 61e0dadc1eSPeter Maydell /* < private > */ 62e0dadc1eSPeter Maydell BusState qbus; 63e0dadc1eSPeter Maydell 64e0dadc1eSPeter Maydell /* < public > */ 65e0dadc1eSPeter Maydell AUXSlave *current_dev; 66e0dadc1eSPeter Maydell AUXSlave *dev; 67e0dadc1eSPeter Maydell uint32_t last_i2c_address; 68e0dadc1eSPeter Maydell AUXCommand last_transaction; 69e0dadc1eSPeter Maydell 70e0dadc1eSPeter Maydell AUXTOI2CState *bridge; 71e0dadc1eSPeter Maydell 72e0dadc1eSPeter Maydell MemoryRegion *aux_io; 73e0dadc1eSPeter Maydell AddressSpace aux_addr_space; 74e0dadc1eSPeter Maydell }; 75e0dadc1eSPeter Maydell 76e0dadc1eSPeter Maydell #define TYPE_AUX_SLAVE "aux-slave" 778063396bSEduardo Habkost OBJECT_DECLARE_SIMPLE_TYPE(AUXSlave, AUX_SLAVE) 78e0dadc1eSPeter Maydell 79e0dadc1eSPeter Maydell struct AUXSlave { 80e0dadc1eSPeter Maydell /* < private > */ 81e0dadc1eSPeter Maydell DeviceState parent_obj; 82e0dadc1eSPeter Maydell 83e0dadc1eSPeter Maydell /* < public > */ 84e0dadc1eSPeter Maydell MemoryRegion *mmio; 85e0dadc1eSPeter Maydell }; 86e0dadc1eSPeter Maydell 87e0dadc1eSPeter Maydell /** 88dbe4070eSMarkus Armbruster * aux_bus_init: Initialize an AUX bus. 89e0dadc1eSPeter Maydell * 90e0dadc1eSPeter Maydell * Returns the new AUX bus created. 91e0dadc1eSPeter Maydell * 92e0dadc1eSPeter Maydell * @parent The device where this bus is located. 93e0dadc1eSPeter Maydell * @name The name of the bus. 94e0dadc1eSPeter Maydell */ 95dbe4070eSMarkus Armbruster AUXBus *aux_bus_init(DeviceState *parent, const char *name); 96e0dadc1eSPeter Maydell 97b7a1b548SMarkus Armbruster /** 98b7a1b548SMarkus Armbruster * aux_bus_realize: Realize an AUX bus. 99b7a1b548SMarkus Armbruster * 100b7a1b548SMarkus Armbruster * @bus: The AUX bus. 101b7a1b548SMarkus Armbruster */ 102b7a1b548SMarkus Armbruster void aux_bus_realize(AUXBus *bus); 103b7a1b548SMarkus Armbruster 104e0dadc1eSPeter Maydell /* 105e0dadc1eSPeter Maydell * aux_request: Make a request on the bus. 106e0dadc1eSPeter Maydell * 107e0dadc1eSPeter Maydell * Returns the reply of the request. 108e0dadc1eSPeter Maydell * 1098fa21b80SMichael Tokarev * @bus The bus where the request happen. 110e0dadc1eSPeter Maydell * @cmd The command requested. 111e0dadc1eSPeter Maydell * @address The 20bits address of the slave. 112e0dadc1eSPeter Maydell * @len The length of the read or write. 113e0dadc1eSPeter Maydell * @data The data array which will be filled or read during transfer. 114e0dadc1eSPeter Maydell */ 115e0dadc1eSPeter Maydell AUXReply aux_request(AUXBus *bus, AUXCommand cmd, uint32_t address, 116e0dadc1eSPeter Maydell uint8_t len, uint8_t *data); 117e0dadc1eSPeter Maydell 118e0dadc1eSPeter Maydell /* 119e0dadc1eSPeter Maydell * aux_get_i2c_bus: Get the i2c bus for I2C over AUX command. 120e0dadc1eSPeter Maydell * 121e0dadc1eSPeter Maydell * Returns the i2c bus associated to this AUX bus. 122e0dadc1eSPeter Maydell * 123e0dadc1eSPeter Maydell * @bus The AUX bus. 124e0dadc1eSPeter Maydell */ 125e0dadc1eSPeter Maydell I2CBus *aux_get_i2c_bus(AUXBus *bus); 126e0dadc1eSPeter Maydell 127e0dadc1eSPeter Maydell /* 128e0dadc1eSPeter Maydell * aux_init_mmio: Init an mmio for an AUX slave. 129e0dadc1eSPeter Maydell * 130e0dadc1eSPeter Maydell * @aux_slave The AUX slave. 131e0dadc1eSPeter Maydell * @mmio The mmio to be registered. 132e0dadc1eSPeter Maydell */ 133e0dadc1eSPeter Maydell void aux_init_mmio(AUXSlave *aux_slave, MemoryRegion *mmio); 134e0dadc1eSPeter Maydell 135fe04f0b4SPaolo Bonzini /* aux_map_slave: Map the mmio for an AUX slave on the bus. 136fe04f0b4SPaolo Bonzini * 137fe04f0b4SPaolo Bonzini * @dev The AUX slave. 138fe04f0b4SPaolo Bonzini * @addr The address for the slave's mmio. 139fe04f0b4SPaolo Bonzini */ 140fe04f0b4SPaolo Bonzini void aux_map_slave(AUXSlave *dev, hwaddr addr); 141e0dadc1eSPeter Maydell 142121d0712SMarkus Armbruster #endif /* HW_MISC_AUXBUS_H */ 143