1*e19effebSkettenis /* $OpenBSD: dwiicvar.h,v 1.6 2023/08/29 12:09:40 kettenis Exp $ */ 2c6df0db7Sjcs /* 3c6df0db7Sjcs * Synopsys DesignWare I2C controller 4c6df0db7Sjcs * 5c6df0db7Sjcs * Copyright (c) 2015, 2016 joshua stein <jcs@openbsd.org> 6c6df0db7Sjcs * 7c6df0db7Sjcs * Permission to use, copy, modify, and/or distribute this software for any 8c6df0db7Sjcs * purpose with or without fee is hereby granted, provided that the above 9c6df0db7Sjcs * copyright notice and this permission notice appear in all copies. 10c6df0db7Sjcs * 11c6df0db7Sjcs * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 12c6df0db7Sjcs * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 13c6df0db7Sjcs * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 14c6df0db7Sjcs * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 15c6df0db7Sjcs * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 16c6df0db7Sjcs * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 17c6df0db7Sjcs * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 18c6df0db7Sjcs */ 19c6df0db7Sjcs 20c6df0db7Sjcs #include <sys/param.h> 21c6df0db7Sjcs #include <sys/systm.h> 22c6df0db7Sjcs #include <sys/kernel.h> 23c6df0db7Sjcs 24*e19effebSkettenis #ifdef __HAVE_ACPI 25*e19effebSkettenis #include "acpi.h" 26c6df0db7Sjcs #include <dev/acpi/acpireg.h> 27c6df0db7Sjcs #include <dev/acpi/acpivar.h> 28c6df0db7Sjcs #include <dev/acpi/acpidev.h> 29c6df0db7Sjcs #include <dev/acpi/amltypes.h> 30c6df0db7Sjcs #include <dev/acpi/dsdt.h> 31*e19effebSkettenis #endif 32c6df0db7Sjcs 33c6df0db7Sjcs #include <dev/pci/pcivar.h> 34c6df0db7Sjcs 35c6df0db7Sjcs #include <dev/i2c/i2cvar.h> 36c6df0db7Sjcs 37c6df0db7Sjcs #include <dev/ic/dwiicreg.h> 38c6df0db7Sjcs 39c6df0db7Sjcs /* #define DWIIC_DEBUG */ 40c6df0db7Sjcs 41c6df0db7Sjcs #ifdef DWIIC_DEBUG 42c6df0db7Sjcs #define DPRINTF(x) printf x 43c6df0db7Sjcs #else 44c6df0db7Sjcs #define DPRINTF(x) 45c6df0db7Sjcs #endif 46c6df0db7Sjcs 47c6df0db7Sjcs struct dwiic_softc { 48c6df0db7Sjcs struct device sc_dev; 49c6df0db7Sjcs 50c6df0db7Sjcs bus_space_tag_t sc_iot; 51c6df0db7Sjcs bus_space_handle_t sc_ioh; 52c6df0db7Sjcs 53c6df0db7Sjcs struct acpi_softc *sc_acpi; 54c6df0db7Sjcs struct aml_node *sc_devnode; 55c6df0db7Sjcs char sc_hid[16]; 56c6df0db7Sjcs void *sc_ih; 57c6df0db7Sjcs 58c6df0db7Sjcs struct pci_attach_args sc_paa; 59c6df0db7Sjcs 60c6df0db7Sjcs struct i2cbus_attach_args sc_iba; 61c6df0db7Sjcs struct device *sc_iic; 62c6df0db7Sjcs 63c6df0db7Sjcs u_int32_t sc_caps; 64c6df0db7Sjcs int sc_poll; 65c6df0db7Sjcs int sc_poll_ihidev; 66c6df0db7Sjcs int sc_busy; 67c6df0db7Sjcs int sc_readwait; 68c6df0db7Sjcs int sc_writewait; 69c6df0db7Sjcs 70c6df0db7Sjcs uint32_t master_cfg; 71c6df0db7Sjcs uint16_t ss_hcnt, ss_lcnt, fs_hcnt, fs_lcnt; 72c6df0db7Sjcs uint32_t sda_hold_time; 73c6df0db7Sjcs int tx_fifo_depth; 74c6df0db7Sjcs int rx_fifo_depth; 75c6df0db7Sjcs 76c6df0db7Sjcs struct i2c_controller sc_i2c_tag; 77c6df0db7Sjcs struct rwlock sc_i2c_lock; 78c6df0db7Sjcs struct { 79c6df0db7Sjcs i2c_op_t op; 80c6df0db7Sjcs void *buf; 81c6df0db7Sjcs size_t len; 82c6df0db7Sjcs int flags; 83c6df0db7Sjcs volatile int error; 84c6df0db7Sjcs } sc_i2c_xfer; 85c6df0db7Sjcs }; 86c6df0db7Sjcs 87c6df0db7Sjcs int dwiic_activate(struct device *, int); 88c6df0db7Sjcs int dwiic_init(struct dwiic_softc *); 89c6df0db7Sjcs void dwiic_enable(struct dwiic_softc *, int); 90c6df0db7Sjcs int dwiic_intr(void *); 91c6df0db7Sjcs 92c6df0db7Sjcs void * dwiic_i2c_intr_establish(void *, void *, int, 93c6df0db7Sjcs int (*)(void *), void *, const char *); 94d3689130Skettenis void dwiic_i2c_intr_disestablish(void *, void *); 95c6df0db7Sjcs const char * dwiic_i2c_intr_string(void *, void *); 96c6df0db7Sjcs int dwiic_i2c_print(void *, const char *); 97c6df0db7Sjcs 98c6df0db7Sjcs int dwiic_i2c_acquire_bus(void *, int); 99c6df0db7Sjcs void dwiic_i2c_release_bus(void *, int); 100c6df0db7Sjcs uint32_t dwiic_read(struct dwiic_softc *, int); 101c6df0db7Sjcs void dwiic_write(struct dwiic_softc *, int, uint32_t); 102c6df0db7Sjcs int dwiic_i2c_exec(void *, i2c_op_t, i2c_addr_t, const void *, 103c6df0db7Sjcs size_t, void *, size_t, int); 104c6df0db7Sjcs 1051a953bdbSjcs #if NACPI > 0 1061a953bdbSjcs int dwiic_acpi_found_hid(struct aml_node *, void *); 1071a953bdbSjcs void dwiic_acpi_get_params(struct dwiic_softc *, char *, uint16_t *, 1081a953bdbSjcs uint16_t *, uint32_t *); 1091a953bdbSjcs #endif 110