xref: /openbsd-src/sys/dev/ic/dwiicvar.h (revision e19effeb8f23532cc679da26121ad035e0904cf5)
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