Let bus drivers handle custom commands

This commit is contained in:
Pierre Pronchery 2018-07-15 03:35:59 +02:00
parent 67f9ed2698
commit 164fc9c5d5
4 changed files with 28 additions and 0 deletions

View File

@ -6,6 +6,7 @@
#ifndef UKERNEL_DRIVERS_BUS_H
# define UKERNEL_DRIVERS_BUS_H
# include <stdarg.h>
# include <stdint.h>
@ -30,10 +31,19 @@ struct _ukBus
int (*write16)(ukBus * bus, ukBusAddress address, uint16_t value);
int (*write32)(ukBus * bus, ukBusAddress address, uint32_t value);
int (*command)(ukBus * bus, uint32_t command, va_list ap);
ukBusData * data;
};
/* constants */
typedef enum _ukBusCommand
{
BUS_COMMAND_WAIT
} ukBusCommand;
/* prototypes */
ukBus * bus_init(ukBus * parent, char const * name);

View File

@ -57,6 +57,7 @@ CMOSBus cmos_bus =
_cmos_bus_write8,
_cmos_bus_write16,
_cmos_bus_write32,
NULL,
NULL
};

View File

@ -30,6 +30,7 @@ static int _ioport_bus_write16(IOPortBus * bus, ukBusAddress address,
uint16_t value);
static int _ioport_bus_write32(IOPortBus * bus, ukBusAddress address,
uint32_t value);
static int _ioport_bus_command(IOPortBus * bus, uint32_t command, va_list ap);
/* variables */
@ -44,6 +45,7 @@ IOPortBus ioport_bus =
_ioport_bus_write8,
_ioport_bus_write16,
_ioport_bus_write32,
_ioport_bus_command,
NULL
};
@ -130,4 +132,18 @@ static int _ioport_bus_write32(IOPortBus * bus, ukBusAddress address,
errno = ENOTSUP;
return -1;
}
/* ioport_bus_command */
static int _ioport_bus_command(IOPortBus * bus, uint32_t command, va_list ap)
{
switch(command)
{
case BUS_COMMAND_WAIT:
return iowait();
default:
errno = ENOTSUP;
return -1;
}
}
#endif

View File

@ -47,6 +47,7 @@ TTYBus tty_bus =
_tty_bus_write8,
_tty_bus_write16,
_tty_bus_write32,
NULL,
NULL
};