Lines Matching +full:slave +full:- +full:dev

1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
4 * Copyright (c) 2019-2020 Vladimir Kondratyev <wulf@FreeBSD.org>
39 #include <contrib/dev/acpica/include/acpi.h>
40 #include <contrib/dev/acpica/include/accommon.h>
41 #include <contrib/dev/acpica/include/amlcode.h>
42 #include <dev/acpica/acpivar.h>
44 #include <dev/iicbus/iiconf.h>
45 #include <dev/iicbus/iicbus.h>
85 return (res->Type == ACPI_RESOURCE_TYPE_SERIAL_BUS && in acpi_resource_is_i2c_serialbus()
86 res->Data.CommonSerialBus.Type == ACPI_RESOURCE_SERIAL_TYPE_I2C); in acpi_resource_is_i2c_serialbus()
93 acpi_iicbus_sendb(device_t dev, u_char slave, char byte) in acpi_iicbus_sendb() argument
96 { slave, IIC_M_WR, 1, &byte }, in acpi_iicbus_sendb()
99 return (iicbus_transfer(dev, msgs, nitems(msgs))); in acpi_iicbus_sendb()
103 acpi_iicbus_recvb(device_t dev, u_char slave, char *byte) in acpi_iicbus_recvb() argument
107 { slave, IIC_M_RD, 1, &buf }, in acpi_iicbus_recvb()
111 error = iicbus_transfer(dev, msgs, nitems(msgs)); in acpi_iicbus_recvb()
119 acpi_iicbus_write(device_t dev, u_char slave, char cmd, void *buf, in acpi_iicbus_write() argument
123 { slave, IIC_M_WR | IIC_M_NOSTOP, 1, &cmd }, in acpi_iicbus_write()
124 { slave, IIC_M_WR | IIC_M_NOSTART, buflen, buf }, in acpi_iicbus_write()
127 return (iicbus_transfer(dev, msgs, nitems(msgs))); in acpi_iicbus_write()
131 acpi_iicbus_read(device_t dev, u_char slave, char cmd, void *buf, in acpi_iicbus_read() argument
136 { slave, IIC_M_WR | IIC_M_NOSTOP, 1, &cmd }, in acpi_iicbus_read()
137 { slave, IIC_M_RD, buflen, NULL }, in acpi_iicbus_read()
145 error = iicbus_transfer(dev, msgs, nitems(msgs)); in acpi_iicbus_read()
155 acpi_iicbus_bwrite(device_t dev, u_char slave, char cmd, u_char count, char *buf) in acpi_iicbus_bwrite() argument
159 { slave, IIC_M_WR | IIC_M_NOSTOP, nitems(bytes), bytes }, in acpi_iicbus_bwrite()
160 { slave, IIC_M_WR | IIC_M_NOSTART, count, buf }, in acpi_iicbus_bwrite()
166 return (iicbus_transfer(dev, msgs, nitems(msgs))); in acpi_iicbus_bwrite()
170 acpi_iicbus_bread(device_t dev, u_char slave, char cmd, u_char *count, char *buf) in acpi_iicbus_bread() argument
175 { slave, IIC_M_WR | IIC_M_NOSTOP, 1, &cmd }, in acpi_iicbus_bread()
176 { slave, IIC_M_RD | IIC_M_NOSTOP, 1, &len }, in acpi_iicbus_bread()
179 { slave, IIC_M_RD | IIC_M_NOSTART, 0, NULL }, in acpi_iicbus_bread()
181 device_t parent = device_get_parent(dev); in acpi_iicbus_bread()
185 error = iicbus_request_bus(parent, dev, IIC_WAIT); in acpi_iicbus_bread()
187 error = iicbus_transfer(dev, msgs, nitems(msgs)); in acpi_iicbus_bread()
190 * If the slave offers an empty reply, in acpi_iicbus_bread()
201 error = iicbus_transfer(dev, block_msg, nitems(block_msg)); in acpi_iicbus_bread()
211 (void)iicbus_release_bus(parent, dev); in acpi_iicbus_bread()
221 device_t dev; in acpi_iicbus_space_handler() local
233 s = AcpiBufferToResource(info->Connection, info->Length, &res); in acpi_iicbus_space_handler()
242 sb = &res->Data.I2cSerialBus; in acpi_iicbus_space_handler()
245 if (sb->AccessMode == ACPI_I2C_10BIT_MODE) { in acpi_iicbus_space_handler()
255 dev = sc->super_sc.dev; in acpi_iicbus_space_handler()
258 sb->SlaveAddress <<= 1; in acpi_iicbus_space_handler()
262 val = acpi_iicbus_recvb(dev, sb->SlaveAddress, gsb->data); in acpi_iicbus_space_handler()
266 val = acpi_iicbus_sendb(dev, sb->SlaveAddress, gsb->data[0]); in acpi_iicbus_space_handler()
270 val = acpi_iicbus_read(dev, sb->SlaveAddress, Address, in acpi_iicbus_space_handler()
271 gsb->data, 1); in acpi_iicbus_space_handler()
275 val = acpi_iicbus_write(dev, sb->SlaveAddress, Address, in acpi_iicbus_space_handler()
276 gsb->data, 1); in acpi_iicbus_space_handler()
280 val = acpi_iicbus_read(dev, sb->SlaveAddress, Address, in acpi_iicbus_space_handler()
281 gsb->data, 2); in acpi_iicbus_space_handler()
285 val = acpi_iicbus_write(dev, sb->SlaveAddress, Address, in acpi_iicbus_space_handler()
286 gsb->data, 2); in acpi_iicbus_space_handler()
290 val = acpi_iicbus_bread(dev, sb->SlaveAddress, Address, in acpi_iicbus_space_handler()
291 &gsb->len, gsb->data); in acpi_iicbus_space_handler()
295 val = acpi_iicbus_bwrite(dev, sb->SlaveAddress, Address, in acpi_iicbus_space_handler()
296 gsb->len, gsb->data); in acpi_iicbus_space_handler()
300 val = acpi_iicbus_read(dev, sb->SlaveAddress, Address, in acpi_iicbus_space_handler()
301 gsb->data, info->AccessLength); in acpi_iicbus_space_handler()
305 val = acpi_iicbus_write(dev, sb->SlaveAddress, Address, in acpi_iicbus_space_handler()
306 gsb->data, info->AccessLength); in acpi_iicbus_space_handler()
310 device_printf(dev, "protocol(0x%04x) is not supported.\n", in acpi_iicbus_space_handler()
316 gsb->status = val; in acpi_iicbus_space_handler()
330 handle = acpi_get_handle(device_get_parent(sc->super_sc.dev)); in acpi_iicbus_install_address_space_handler()
332 &acpi_iicbus_space_handler, NULL, &sc->space_handler_info); in acpi_iicbus_install_address_space_handler()
334 device_printf(sc->super_sc.dev, in acpi_iicbus_install_address_space_handler()
348 handle = acpi_get_handle(device_get_parent(sc->super_sc.dev)); in acpi_iicbus_remove_address_space_handler()
352 device_printf(sc->super_sc.dev, in acpi_iicbus_remove_address_space_handler()
369 res->Data.I2cSerialBus.ResourceSource.StringPtr, &handle); in acpi_iicbus_get_i2cres_cb()
372 memcpy(sb, &res->Data.I2cSerialBus, in acpi_iicbus_get_i2cres_cb()
378 sb->ResourceSource_Handle = handle; in acpi_iicbus_get_i2cres_cb()
380 } else if (res->Type == ACPI_RESOURCE_TYPE_END_TAG) in acpi_iicbus_get_i2cres_cb()
397 device_t dev = context; in acpi_iicbus_parse_resources_cb() local
398 struct iicbus_ivar *super_devi = device_get_ivars(dev); in acpi_iicbus_parse_resources_cb()
399 struct resource_list *rl = &super_devi->rl; in acpi_iicbus_parse_resources_cb()
402 switch(res->Type) { in acpi_iicbus_parse_resources_cb()
404 if (res->Data.ExtendedIrq.InterruptCount > 0) { in acpi_iicbus_parse_resources_cb()
405 irq = res->Data.ExtendedIrq.Interrupts[0]; in acpi_iicbus_parse_resources_cb()
413 if (res->Data.Gpio.ConnectionType == in acpi_iicbus_parse_resources_cb()
416 gpio_pin = res->Data.Gpio.PinTable[0]; in acpi_iicbus_parse_resources_cb()
430 acpi_iicbus_parse_resources(ACPI_HANDLE handle, device_t dev) in acpi_iicbus_parse_resources() argument
434 acpi_iicbus_parse_resources_cb, dev)); in acpi_iicbus_parse_resources()
438 acpi_iicbus_dump_res(device_t dev, ACPI_IICBUS_RESOURCE_I2C_SERIALBUS *sb) in acpi_iicbus_dump_res() argument
440 device_printf(dev, "found ACPI child\n"); in acpi_iicbus_dump_res()
441 printf(" SlaveAddress: 0x%04hx\n", sb->SlaveAddress); in acpi_iicbus_dump_res()
442 printf(" ConnectionSpeed: %uHz\n", sb->ConnectionSpeed); in acpi_iicbus_dump_res()
444 sb->SlaveMode == ACPI_CONTROLLER_INITIATED ? in acpi_iicbus_dump_res()
446 printf(" AddressingMode: %uBit\n", sb->AccessMode == 0 ? 7 : 10); in acpi_iicbus_dump_res()
447 printf(" ConnectionSharing: %s\n", sb->ConnectionSharing == 0 ? in acpi_iicbus_dump_res()
452 acpi_iicbus_add_child(device_t dev, u_int order, const char *name, int unit) in acpi_iicbus_add_child() argument
456 dev, order, name, unit, sizeof(struct acpi_iicbus_ivars))); in acpi_iicbus_add_child()
497 /* Find out speed of the slowest slave */ in acpi_iicbus_enumerate_child()
498 if (super_sc->bus_freq == 0 || super_sc->bus_freq > sb.ConnectionSpeed) in acpi_iicbus_enumerate_child()
499 super_sc->bus_freq = sb.ConnectionSpeed; in acpi_iicbus_enumerate_child()
526 * Update ACPI-CA to use the IIC enumerated device_t for this handle. in acpi_iicbus_enumerate_child()
530 printf("WARNING: Unable to attach object data to %s - %s\n", in acpi_iicbus_enumerate_child()
537 acpi_iicbus_enumerate_children(device_t dev) in acpi_iicbus_enumerate_children() argument
541 ACPI_UINT32_MAX, acpi_iicbus_enumerate_child, NULL, dev, NULL)); in acpi_iicbus_enumerate_children()
545 acpi_iicbus_set_power_children(device_t dev, int state, bool all_children) in acpi_iicbus_set_power_children() argument
550 if (device_get_children(dev, &devlist, &numdevs) != 0) in acpi_iicbus_set_power_children()
561 acpi_iicbus_probe(device_t dev) in acpi_iicbus_probe() argument
569 controller = device_get_parent(dev); in acpi_iicbus_probe()
577 device_set_desc(dev, "Philips I2C bus (ACPI-hinted)"); in acpi_iicbus_probe()
582 acpi_iicbus_attach(device_t dev) in acpi_iicbus_attach() argument
584 struct acpi_iicbus_softc *sc = device_get_softc(dev); in acpi_iicbus_attach()
587 if (ACPI_FAILURE(acpi_iicbus_enumerate_children(dev))) in acpi_iicbus_attach()
588 device_printf(dev, "children enumeration failed\n"); in acpi_iicbus_attach()
590 acpi_iicbus_set_power_children(dev, ACPI_STATE_D0, true); in acpi_iicbus_attach()
591 error = iicbus_attach_common(dev, sc->super_sc.bus_freq); in acpi_iicbus_attach()
594 sc->space_handler_installed = true; in acpi_iicbus_attach()
600 acpi_iicbus_detach(device_t dev) in acpi_iicbus_detach() argument
602 struct acpi_iicbus_softc *sc = device_get_softc(dev); in acpi_iicbus_detach()
604 if (sc->space_handler_installed) in acpi_iicbus_detach()
606 acpi_iicbus_set_power_children(dev, ACPI_STATE_D3, false); in acpi_iicbus_detach()
608 return (iicbus_detach(dev)); in acpi_iicbus_detach()
612 acpi_iicbus_suspend(device_t dev) in acpi_iicbus_suspend() argument
616 error = bus_generic_suspend(dev); in acpi_iicbus_suspend()
618 acpi_iicbus_set_power_children(dev, ACPI_STATE_D3, false); in acpi_iicbus_suspend()
624 acpi_iicbus_resume(device_t dev) in acpi_iicbus_resume() argument
627 acpi_iicbus_set_power_children(dev, ACPI_STATE_D0, false); in acpi_iicbus_resume()
629 return (bus_generic_resume(dev)); in acpi_iicbus_resume()
648 acpi_iicbus_driver_added(device_t dev, driver_t *driver) in acpi_iicbus_driver_added() argument
653 DEVICE_IDENTIFY(driver, dev); in acpi_iicbus_driver_added()
654 if (device_get_children(dev, &devlist, &numdevs) != 0) in acpi_iicbus_driver_added()
673 if (acpi_get_device(devi->handle) == child) in acpi_iicbus_child_deleted()
674 AcpiDetachData(devi->handle, acpi_fake_objhandler); in acpi_iicbus_child_deleted()
684 *res = (uintptr_t)devi->handle; in acpi_iicbus_read_ivar()
700 if (devi->handle != NULL) in acpi_iicbus_write_ivar()
702 devi->handle = (ACPI_HANDLE)val; in acpi_iicbus_write_ivar()
724 if (devi->handle != NULL) in acpi_iicbus_child_location()
725 sbuf_printf(sb, " handle=%s", acpi_name(devi->handle)); in acpi_iicbus_child_location()
742 if (devi->handle == NULL) in acpi_iicbus_child_pnpinfo()
745 error = acpi_pnpinfo(devi->handle, sb); in acpi_iicbus_child_pnpinfo()