/*
 * This file is part of the coreboot project.
 *
 * Copyright 2013 Google Inc.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; version 2 of the License.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
 */

#include <arch/acpi.h>
#include <console/console.h>
#include <device/device.h>
#include <device/pci.h>
#include <device/pci_ids.h>
#include <stdint.h>
#include <reg_script.h>

#include <baytrail/iomap.h>
#include <baytrail/iosf.h>
#include <baytrail/pci_devs.h>
#include <baytrail/pmc.h>
#include <baytrail/ramstage.h>
#include <baytrail/ehci.h>
#include <baytrail/xhci.h>
#include <baytrail/iosf.h>

#include "chip.h"

static const struct reg_script ehci_init_script[] = {
	/* Enable S0 PLL shutdown
	 * D29:F0:7A[12,10,7,6,4,3,2,1]=11111111b */
	REG_PCI_OR16(0x7a, 0x14de),
	/* Enable SB local clock gating
	 * D29:F0:7C[14,3,2]=111b (14 set in clock gating step) */
	REG_PCI_OR32(0x7c, 0x0000000c),
	REG_PCI_OR32(0x8c, 0x00000001),
	/* Enable dynamic clock gating 0x4001=0xCE */
	REG_IOSF_RMW(IOSF_PORT_USBPHY, 0x4001, 0xFFFFFF00, 0xCE),
	/* Magic RCBA register set sequence */
	/* RCBA + 0x200=0x1 */
	REG_MMIO_WRITE32(RCBA_BASE_ADDRESS + 0x200, 0x00000001),
	/* RCBA + 0x204=0x2 */
	REG_MMIO_WRITE32(RCBA_BASE_ADDRESS + 0x204, 0x00000002),
	/* RCBA + 0x208=0x0 */
	REG_MMIO_WRITE32(RCBA_BASE_ADDRESS + 0x208, 0x00000000),
	/* RCBA + 0x240[4,3,2,1,0]=00000b */
	REG_MMIO_RMW32(RCBA_BASE_ADDRESS + 0x240, ~0x0000001f, 0),
	/* RCBA + 0x318[9,8,6,5,4,3,2,1,0]=000000111b */
	REG_MMIO_RMW32(RCBA_BASE_ADDRESS + 0x318, ~0x00000378, 0x00000007),
	/* RCBA + 0x31c[3,2,1,0]=0011b */
	REG_MMIO_RMW32(RCBA_BASE_ADDRESS + 0x31c, ~0x0000000c, 0x00000003),
	REG_SCRIPT_END
};

static const struct reg_script ehci_clock_gating_script[] = {
	/* Enable SB local clock gating */
	REG_PCI_OR32(0x7c, 0x00004000),
	/* RCBA + 0x284=0xbe (step B0+) */
	REG_MMIO_WRITE32(RCBA_BASE_ADDRESS + 0x284, 0x000000be),
	REG_SCRIPT_END
};

static const struct reg_script ehci_disable_script[] = {
	/* Clear Run/Stop Bit */
	REG_RES_RMW32(PCI_BASE_ADDRESS_0, USB2CMD, ~USB2CMD_RS, 0),
	/* Wait for HC Halted */
	REG_RES_POLL32(PCI_BASE_ADDRESS_0, USB2STS,
		       USB2STS_HCHALT, USB2STS_HCHALT, 10000),
	/* Disable Interrupts */
	REG_PCI_OR32(EHCI_CMD_STS, INTRDIS),
	/* Disable Asynchronous and Periodic Scheduler */
	REG_RES_RMW32(PCI_BASE_ADDRESS_0, USB2CMD,
		      ~(USB2CMD_ASE | USB2CMD_PSE), 0),
	/* Disable port wake */
	REG_PCI_RMW32(EHCI_SBRN_FLA_PWC, ~(PORTWKIMP | PORTWKCAPMASK), 0),
	/* Set Function Disable bit in RCBA */
	REG_MMIO_OR32(RCBA_BASE_ADDRESS + RCBA_FUNC_DIS, RCBA_EHCI_DIS),
	REG_SCRIPT_END
};

static const struct reg_script ehci_hc_reset[] = {
	REG_RES_OR16(PCI_BASE_ADDRESS_0, USB2CMD, USB2CMD_HCRESET),
	REG_SCRIPT_END
};

static void usb2_phy_init(device_t dev)
{
	struct soc_intel_baytrail_config *config = dev->chip_info;
	u32 usb2_comp_bg = (config->usb2_comp_bg == 0 ?
			    0x4700 : config->usb2_comp_bg);
	struct reg_script usb2_phy_script[] = {
		/* USB3PHYInit() */
		REG_IOSF_WRITE(IOSF_PORT_USBPHY, USBPHY_COMPBG,
			       usb2_comp_bg),
		/* Per port phy settings, set in devicetree.cb */
		REG_IOSF_WRITE(IOSF_PORT_USBPHY, USBPHY_PER_PORT_LANE0,
			       config->usb2_per_port_lane0),
		REG_IOSF_WRITE(IOSF_PORT_USBPHY,
			       USBPHY_PER_PORT_RCOMP_HS_PULLUP0,
			       config->usb2_per_port_rcomp_hs_pullup0),
		REG_IOSF_WRITE(IOSF_PORT_USBPHY, USBPHY_PER_PORT_LANE1,
			       config->usb2_per_port_lane1),
		REG_IOSF_WRITE(IOSF_PORT_USBPHY,
			       USBPHY_PER_PORT_RCOMP_HS_PULLUP1,
			       config->usb2_per_port_rcomp_hs_pullup1),
		REG_IOSF_WRITE(IOSF_PORT_USBPHY, USBPHY_PER_PORT_LANE2,
			       config->usb2_per_port_lane2),
		REG_IOSF_WRITE(IOSF_PORT_USBPHY,
			       USBPHY_PER_PORT_RCOMP_HS_PULLUP2,
			       config->usb2_per_port_rcomp_hs_pullup2),
		REG_IOSF_WRITE(IOSF_PORT_USBPHY, USBPHY_PER_PORT_LANE3,
			       config->usb2_per_port_lane3),
		REG_IOSF_WRITE(IOSF_PORT_USBPHY,
			       USBPHY_PER_PORT_RCOMP_HS_PULLUP3,
			       config->usb2_per_port_rcomp_hs_pullup3),
		REG_SCRIPT_END
	};
	reg_script_run(usb2_phy_script);
}

void byt_usb_wa(void)
{
	u8 i;
	u32 orig, per_port;

	static const struct reg_script \
		usb_workaround_script[BYTM_USB2_PORT_COUNT][8] = {
		{
			REG_IOSF_WRITE(IOSF_PORT_USBPHY, 0x4113, 0x8),
			REG_IOSF_WRITE(IOSF_PORT_USBPHY, 0x4123, 0x7f13),
			REG_IOSF_WRITE(IOSF_PORT_USBPHY, 0x4123, 0x13),
			REG_IOSF_WRITE(IOSF_PORT_USBPHY, 0x4123, 0x4011),
			REG_IOSF_WRITE(IOSF_PORT_USBPHY, 0x4113, 0x108),
			REG_IOSF_WRITE(IOSF_PORT_USBPHY, 0x4113, 0x8),
			REG_IOSF_WRITE(IOSF_PORT_USBPHY, 0x4113, 0x0),
			REG_SCRIPT_END
		},
		{
			REG_IOSF_WRITE(IOSF_PORT_USBPHY, 0x4213, 0x8),
			REG_IOSF_WRITE(IOSF_PORT_USBPHY, 0x4223, 0x7f13),
			REG_IOSF_WRITE(IOSF_PORT_USBPHY, 0x4223, 0x13),
			REG_IOSF_WRITE(IOSF_PORT_USBPHY, 0x4223, 0x4011),
			REG_IOSF_WRITE(IOSF_PORT_USBPHY, 0x4213, 0x108),
			REG_IOSF_WRITE(IOSF_PORT_USBPHY, 0x4213, 0x8),
			REG_IOSF_WRITE(IOSF_PORT_USBPHY, 0x4213, 0x0),
			REG_SCRIPT_END
		},
		{
			REG_IOSF_WRITE(IOSF_PORT_USBPHY, 0x4313, 0x8),
			REG_IOSF_WRITE(IOSF_PORT_USBPHY, 0x4323, 0x7f13),
			REG_IOSF_WRITE(IOSF_PORT_USBPHY, 0x4323, 0x13),
			REG_IOSF_WRITE(IOSF_PORT_USBPHY, 0x4323, 0x4011),
			REG_IOSF_WRITE(IOSF_PORT_USBPHY, 0x4313, 0x108),
			REG_IOSF_WRITE(IOSF_PORT_USBPHY, 0x4313, 0x8),
			REG_IOSF_WRITE(IOSF_PORT_USBPHY, 0x4313, 0x0),
			REG_SCRIPT_END
		},
		{
			REG_IOSF_WRITE(IOSF_PORT_USBPHY, 0x4413, 0x8),
			REG_IOSF_WRITE(IOSF_PORT_USBPHY, 0x4423, 0x7f13),
			REG_IOSF_WRITE(IOSF_PORT_USBPHY, 0x4423, 0x13),
			REG_IOSF_WRITE(IOSF_PORT_USBPHY, 0x4423, 0x4011),
			REG_IOSF_WRITE(IOSF_PORT_USBPHY, 0x4413, 0x108),
			REG_IOSF_WRITE(IOSF_PORT_USBPHY, 0x4413, 0x8),
			REG_IOSF_WRITE(IOSF_PORT_USBPHY, 0x4413, 0x0),
			REG_SCRIPT_END
		}
	};

	if (acpi_slp_type == 3 || \
		(iosf_dunit_read(PMSTS) & PMSTS_WRO_MASK) > 0) {
		printk(BIOS_DEBUG, "warm reset/S3 resume detected \
				  , skip USB WA \n");
		return;
	}

	printk(BIOS_DEBUG, "Start USB WA for BYT\n");
	for (i = 0; i < BYTM_USB2_PORT_COUNT; i++) {
		/*
		 * The below reg_script_run is for steps 1 ~ 7 in the Tech Advisory
		 * for each port
		 */
		reg_script_run(usb_workaround_script[i]);

		/*
		 * The below programing is for steps 8 ~ 12 in the Tech Advisory
		 * for each port
		 */
		per_port = 0x4126 + i * 0x100;
		orig = iosf_usbphy_read(per_port);
		iosf_usbphy_write(per_port, 0x1c);
		iosf_usbphy_write(per_port, 0x0);
		iosf_usbphy_write(per_port, 0x11c);
		iosf_usbphy_write(per_port, orig);
	}
}

static void ehci_init(device_t dev)
{
	struct soc_intel_baytrail_config *config = dev->chip_info;
	struct reg_script ehci_hc_init[] = {
		/* Controller init */
		REG_SCRIPT_NEXT(ehci_init_script),
		/* Enable clock gating */
		REG_SCRIPT_NEXT(ehci_clock_gating_script),
		/*
		 * Disable ports if requested
		 */
		/* Open per-port disable control override */
		REG_IO_RMW16(ACPI_BASE_ADDRESS + UPRWC, ~0, UPRWC_WR_EN),
		REG_PCI_WRITE8(EHCI_USB2PDO, config->usb2_port_disable_mask),
		/* Close per-port disable control override */
		REG_IO_RMW16(ACPI_BASE_ADDRESS + UPRWC, ~UPRWC_WR_EN, 0),
		REG_SCRIPT_END
	};

	/* Don't reset controller in S3 resume path */
	if (acpi_slp_type != 3)
		reg_script_run_on_dev(dev, ehci_hc_reset);

	/* Disable controller if ports are routed to XHCI */
	if (config->usb_route_to_xhci) {
		/* Disable controller */
		reg_script_run_on_dev(dev, ehci_disable_script);

		/* Hide device with southcluster function */
		dev->enabled = 0;
		southcluster_enable_dev(dev);
	} else {
		/* Initialize EHCI controller */
		reg_script_run_on_dev(dev, ehci_hc_init);
	}

	/* Setup USB2 PHY based on board config */
	usb2_phy_init(dev);
}

static struct device_operations ehci_device_ops = {
	.read_resources		= pci_dev_read_resources,
	.set_resources		= pci_dev_set_resources,
	.enable_resources	= pci_dev_enable_resources,
	.init			= ehci_init,
	.ops_pci		= &soc_pci_ops,
};

static const struct pci_driver baytrail_ehci __pci_driver = {
	.ops    = &ehci_device_ops,
	.vendor	= PCI_VENDOR_ID_INTEL,
	.device = EHCI_DEVID
};
