/* SPDX-License-Identifier: GPL-2.0-or-later */

#include <acpi/acpigen.h>
#include <acpi/acpi_device.h>

#include "chip.h"

static const char *usb_hub_acpi_name(const struct device *dev)
{
	const char *pattern;
	struct drivers_usb_hub_config *config = dev->chip_info;

	if (config->acpi_name[0] != 0)
		return config->acpi_name;

	/* USB ACPI driver does not have acpi_name operation defined. Hence return
	   the ACPI name for both the hub and any downstream facing ports. */
	switch (dev->path.usb.port_type) {
	case 0:
		return "EHUB";
	case 2:
		pattern = "HS%02d";
		break;
	case 3:
		pattern = "SS%02d";
		break;
	default:
		return NULL;
	}

	snprintf(config->acpi_name, sizeof(config->acpi_name), pattern,
		 dev->path.usb.port_id + 1);

	return config->acpi_name;
}

static void usb_hub_add_ports(const struct device *dev)
{
	const struct drivers_usb_hub_config *config = config_of(dev);
	struct device *port = NULL;
	unsigned int child_count = 0;

	while ((port = dev_bus_each_child(dev->downstream, port)) != NULL) {
		if (child_count++ >= config->port_count) {
			printk(BIOS_WARNING, "%s cannot be added. Port Count limit reached.\n",
			       dev_name(port));
			continue;
		}
		acpigen_write_device(usb_hub_acpi_name(port));
		acpigen_write_name_byte("_ADR", port->path.usb.port_id + 1);
		acpigen_write_device_end();
	}
}

static void usb_hub_acpi_fill_ssdt(const struct device *dev)
{
	const struct drivers_usb_hub_config *config = config_of(dev);
	const char *scope = acpi_device_scope(dev);
	const char *name = acpi_device_name(dev);

	acpigen_write_scope(scope);
	acpigen_write_device(name);
	acpigen_write_ADR(0);
	if (config->name)
		acpigen_write_name_string("_DDN", config->name);
	if (config->desc)
		acpigen_write_name_unicode("_STR", config->desc);
	usb_hub_add_ports(dev);
	acpigen_write_device_end();
	acpigen_write_scope_end();
}

static struct device_operations usb_hub_ops = {
	.read_resources	= noop_read_resources,
	.set_resources	= noop_set_resources,
	.scan_bus	= scan_static_bus,
	.acpi_fill_ssdt	= usb_hub_acpi_fill_ssdt,
	.acpi_name	= usb_hub_acpi_name
};

static void usb_hub_acpi_enable(struct device *dev)
{
	dev->ops = &usb_hub_ops;
}

struct chip_operations drivers_usb_hub_ops = {
	 .name = "USB Hub",
	.enable_dev = usb_hub_acpi_enable
};
