dpio
dpio_t *dpio;
dpio = minor->kminor_data.kminor_dpio;
mutex_enter(&dpio->dpio_mutex);
if ((dpio->dpio_flags & DPIO_F_KERNEL) != 0 &&
mutex_exit(&dpio->dpio_mutex);
mutex_exit(&dpio->dpio_mutex);
if ((dpio->dpio_status & DPIO_S_EXCL) != 0) {
mutex_exit(&dpio->dpio_mutex);
if ((dpio->dpio_status & DPIO_S_OPEN) != 0) {
mutex_exit(&dpio->dpio_mutex);
dpio->dpio_status |= DPIO_S_EXCL;
dpio->dpio_status |= DPIO_S_OPEN;
mutex_exit(&dpio->dpio_mutex);
for (dpio_t *dpio = list_head(&kgpio_g_dpios); dpio != NULL;
dpio = list_next(&kgpio_g_dpios, dpio)) {
if (dpio->dpio_kgpio == kgpio &&
dpio->dpio_gpio_num == kgu.kgu_id) {
for (dpio_t *dpio = list_head(&kgpio_g_dpios); dpio != NULL;
dpio = list_next(&kgpio_g_dpios, dpio)) {
if (dpio->dpio_kgpio == kgpio &&
dpio->dpio_gpio_num == create.kdc_id) {
if (strcmp(name, dpio->dpio_name) == 0) {
dpio_t *dpio = kmem_zalloc(sizeof (dpio_t), KM_NOSLEEP_LAZY);
if (dpio == NULL) {
dpio->dpio_kgpio = kgpio;
dpio->dpio_gpio_num = create.kdc_id;
dpio->dpio_caps = caps;
dpio->dpio_flags |= DPIO_F_KERNEL;
bcopy(name, dpio->dpio_name, namelen);
mutex_init(&dpio->dpio_mutex, NULL, MUTEX_DRIVER, NULL);
dpio->dpio_minor.kminor_id = id_alloc_nosleep(kgpio_g_ids);
if (dpio->dpio_minor.kminor_id == -1) {
kgpio_dpio_cleanup(dpio);
dpio->dpio_minor.kminor_type = KGPIO_MINOR_T_DPIO;
dpio->dpio_minor.kminor_data.kminor_dpio = dpio;
if (ddi_create_minor_node(kgpio_g_dip, dpio->dpio_name, S_IFCHR,
(minor_t)dpio->dpio_minor.kminor_id, DDI_NT_GPIO_DPIO, 0) !=
kgpio_dpio_cleanup(dpio);
list_insert_tail(&kgpio_g_dpios, dpio);
avl_add(&kgpio_g_minors, &dpio->dpio_minor);
dpio_t *dpio;
for (dpio = list_head(&kgpio_g_dpios); dpio != NULL;
dpio = list_next(&kgpio_g_dpios, dpio)) {
if (dpio->dpio_kgpio == kgpio &&
dpio->dpio_gpio_num == destroy.kdd_id) {
if (dpio == NULL) {
if ((dpio->dpio_status & DPIO_S_OPEN) != 0) {
list_remove(&kgpio_g_dpios, dpio);
avl_remove(&kgpio_g_minors, &dpio->dpio_minor);
kgpio_dpio_cleanup(dpio);
kgpio_ioctl_dpio_info_common(const dpio_t *dpio, dpio_info_t *infop,
bcopy(dpio->dpio_kgpio->kgpio_mname, infop->dpi_ctrl,
sizeof (dpio->dpio_kgpio->kgpio_mname));
infop->dpi_gpio = dpio->dpio_gpio_num;
infop->dpi_caps = dpio->dpio_caps;
infop->dpi_flags = dpio->dpio_flags;
kgpio_ioctl_dpio_info_specific(dpio_t *dpio, intptr_t arg, int mode)
ASSERT(MUTEX_HELD(&dpio->dpio_mutex));
bcopy(dpio->dpio_name, info.dpi_dpio, sizeof (dpio->dpio_name));
return (kgpio_ioctl_dpio_info_common(dpio, &info, arg, mode));
kgpio_ioctl_dpio_time(dpio_t *dpio, intptr_t arg, int mode)
ASSERT(MUTEX_HELD(&dpio->dpio_mutex));
time.dpt_last_input_intr = dpio->dpio_last_intr;
time.dpt_last_write = dpio->dpio_last_write;
kgpio_ioctl_dpio_curout(dpio_t *dpio, intptr_t arg, int mode)
kgpio_t *kgpio = dpio->dpio_kgpio;
ASSERT(MUTEX_HELD(&dpio->dpio_mutex));
if ((dpio->dpio_caps & DPIO_C_WRITE) == 0) {
mutex_exit(&dpio->dpio_mutex);
dpio->dpio_gpio_num, &curout.dps_curout);
mutex_enter(&dpio->dpio_mutex);
for (dpio_t *dpio = list_head(&kgpio_g_dpios); dpio != NULL;
dpio = list_next(&kgpio_g_dpios, dpio)) {
if (strcmp(dpio->dpio_name, info.dpi_dpio) == 0) {
return (kgpio_ioctl_dpio_info_common(dpio, &info, arg,
dpio_t *dpio;
dpio = minor->kminor_data.kminor_dpio;
VERIFY3P(dpio, !=, NULL);
mutex_enter(&dpio->dpio_mutex);
ret = kgpio_ioctl_dpio_info_specific(dpio, arg, mode);
ret = kgpio_ioctl_dpio_time(dpio, arg, mode);
ret = kgpio_ioctl_dpio_curout(dpio, arg, mode);
mutex_exit(&dpio->dpio_mutex);
dpio_t *dpio;
dpio = minor->kminor_data.kminor_dpio;
VERIFY3P(dpio, !=, NULL);
if ((dpio->dpio_caps & DPIO_C_READ) == 0) {
kgpio = dpio->dpio_kgpio;
ret = kgpio->kgpio_ops->kgo_input(kgpio->kgpio_drv, dpio->dpio_gpio_num,
dpio_t *dpio;
dpio = minor->kminor_data.kminor_dpio;
VERIFY3P(dpio, !=, NULL);
if ((dpio->dpio_caps & DPIO_C_WRITE) == 0) {
kgpio = dpio->dpio_kgpio;
dpio->dpio_gpio_num, output);
mutex_enter(&dpio->dpio_mutex);
dpio->dpio_last_write = gethrtime();
mutex_exit(&dpio->dpio_mutex);
dpio_t *dpio;
dpio = minor->kminor_data.kminor_dpio;
VERIFY3P(dpio, !=, NULL);
mutex_enter(&dpio->dpio_mutex);
dpio->dpio_status &= ~(DPIO_S_EXCL | DPIO_S_OPEN);
mutex_exit(&dpio->dpio_mutex);
struct dpio;
struct dpio *kminor_dpio;
kgpio_dpio_cleanup(dpio_t *dpio)
if (dpio->dpio_minor.kminor_id > 0) {
id_free(kgpio_g_ids, dpio->dpio_minor.kminor_id);
dpio->dpio_minor.kminor_id = 0;
ddi_remove_minor_node(kgpio_g_dip, dpio->dpio_name);
mutex_destroy(&dpio->dpio_mutex);
kmem_free(dpio, sizeof (dpio_t));