| /* |
| * auxbus.h |
| * |
| * Copyright (C)2014 : GreenSocs Ltd |
| * http://www.greensocs.com/ , email: info@greensocs.com |
| * |
| * Developed by : |
| * Frederic Konrad <fred.konrad@greensocs.com> |
| * |
| * This program is free software; you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License as published by |
| * the Free Software Foundation, either version 2 of the License, or |
| * (at your option)any later version. |
| * |
| * This program is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| * GNU General Public License for more details. |
| * |
| * You should have received a copy of the GNU General Public License along |
| * with this program; if not, see <http://www.gnu.org/licenses/>. |
| * |
| */ |
| |
| #ifndef HW_MISC_AUXBUS_H |
| #define HW_MISC_AUXBUS_H |
| |
| #include "hw/qdev.h" |
| |
| typedef struct AUXBus AUXBus; |
| typedef struct AUXSlave AUXSlave; |
| typedef enum AUXCommand AUXCommand; |
| typedef enum AUXReply AUXReply; |
| typedef struct AUXTOI2CState AUXTOI2CState; |
| |
| enum AUXCommand { |
| WRITE_I2C = 0, |
| READ_I2C = 1, |
| WRITE_I2C_STATUS = 2, |
| WRITE_I2C_MOT = 4, |
| READ_I2C_MOT = 5, |
| WRITE_AUX = 8, |
| READ_AUX = 9 |
| }; |
| |
| enum AUXReply { |
| AUX_I2C_ACK = 0, |
| AUX_NACK = 1, |
| AUX_DEFER = 2, |
| AUX_I2C_NACK = 4, |
| AUX_I2C_DEFER = 8 |
| }; |
| |
| #define TYPE_AUX_BUS "aux-bus" |
| #define AUX_BUS(obj) OBJECT_CHECK(AUXBus, (obj), TYPE_AUX_BUS) |
| |
| struct AUXBus { |
| /* < private > */ |
| BusState qbus; |
| |
| /* < public > */ |
| AUXSlave *current_dev; |
| AUXSlave *dev; |
| uint32_t last_i2c_address; |
| AUXCommand last_transaction; |
| |
| AUXTOI2CState *bridge; |
| |
| MemoryRegion *aux_io; |
| AddressSpace aux_addr_space; |
| }; |
| |
| #define TYPE_AUX_SLAVE "aux-slave" |
| #define AUX_SLAVE(obj) \ |
| OBJECT_CHECK(AUXSlave, (obj), TYPE_AUX_SLAVE) |
| |
| struct AUXSlave { |
| /* < private > */ |
| DeviceState parent_obj; |
| |
| /* < public > */ |
| MemoryRegion *mmio; |
| }; |
| |
| /** |
| * aux_init_bus: Initialize an AUX bus. |
| * |
| * Returns the new AUX bus created. |
| * |
| * @parent The device where this bus is located. |
| * @name The name of the bus. |
| */ |
| AUXBus *aux_init_bus(DeviceState *parent, const char *name); |
| |
| /* |
| * aux_request: Make a request on the bus. |
| * |
| * Returns the reply of the request. |
| * |
| * @bus Ths bus where the request happen. |
| * @cmd The command requested. |
| * @address The 20bits address of the slave. |
| * @len The length of the read or write. |
| * @data The data array which will be filled or read during transfer. |
| */ |
| AUXReply aux_request(AUXBus *bus, AUXCommand cmd, uint32_t address, |
| uint8_t len, uint8_t *data); |
| |
| /* |
| * aux_get_i2c_bus: Get the i2c bus for I2C over AUX command. |
| * |
| * Returns the i2c bus associated to this AUX bus. |
| * |
| * @bus The AUX bus. |
| */ |
| I2CBus *aux_get_i2c_bus(AUXBus *bus); |
| |
| /* |
| * aux_init_mmio: Init an mmio for an AUX slave. |
| * |
| * @aux_slave The AUX slave. |
| * @mmio The mmio to be registered. |
| */ |
| void aux_init_mmio(AUXSlave *aux_slave, MemoryRegion *mmio); |
| |
| /* aux_create_slave: Create a new device on an AUX bus |
| * |
| * @bus The AUX bus for the new device. |
| * @name The type of the device to be created. |
| */ |
| DeviceState *aux_create_slave(AUXBus *bus, const char *name); |
| |
| /* aux_map_slave: Map the mmio for an AUX slave on the bus. |
| * |
| * @dev The AUX slave. |
| * @addr The address for the slave's mmio. |
| */ |
| void aux_map_slave(AUXSlave *dev, hwaddr addr); |
| |
| #endif /* HW_MISC_AUXBUS_H */ |