18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * Maxtor Shared Storage II Board Setup
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci * Maintainer: Sylver Bruneau <sylver.bruneau@googlemail.com>
68c2ecf20Sopenharmony_ci */
78c2ecf20Sopenharmony_ci
88c2ecf20Sopenharmony_ci#include <linux/kernel.h>
98c2ecf20Sopenharmony_ci#include <linux/init.h>
108c2ecf20Sopenharmony_ci#include <linux/platform_device.h>
118c2ecf20Sopenharmony_ci#include <linux/pci.h>
128c2ecf20Sopenharmony_ci#include <linux/irq.h>
138c2ecf20Sopenharmony_ci#include <asm/mach-types.h>
148c2ecf20Sopenharmony_ci#include <asm/mach/arch.h>
158c2ecf20Sopenharmony_ci#include <asm/mach/pci.h>
168c2ecf20Sopenharmony_ci#include "orion5x.h"
178c2ecf20Sopenharmony_ci#include "bridge-regs.h"
188c2ecf20Sopenharmony_ci#include "common.h"
198c2ecf20Sopenharmony_ci
208c2ecf20Sopenharmony_ci/*****************************************************************************
218c2ecf20Sopenharmony_ci * Maxtor Shared Storage II Info
228c2ecf20Sopenharmony_ci ****************************************************************************/
238c2ecf20Sopenharmony_ci
248c2ecf20Sopenharmony_ci/****************************************************************************
258c2ecf20Sopenharmony_ci * PCI setup
268c2ecf20Sopenharmony_ci ****************************************************************************/
278c2ecf20Sopenharmony_cistatic int __init mss2_pci_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
288c2ecf20Sopenharmony_ci{
298c2ecf20Sopenharmony_ci	int irq;
308c2ecf20Sopenharmony_ci
318c2ecf20Sopenharmony_ci	/*
328c2ecf20Sopenharmony_ci	 * Check for devices with hard-wired IRQs.
338c2ecf20Sopenharmony_ci	 */
348c2ecf20Sopenharmony_ci	irq = orion5x_pci_map_irq(dev, slot, pin);
358c2ecf20Sopenharmony_ci	if (irq != -1)
368c2ecf20Sopenharmony_ci		return irq;
378c2ecf20Sopenharmony_ci
388c2ecf20Sopenharmony_ci	return -1;
398c2ecf20Sopenharmony_ci}
408c2ecf20Sopenharmony_ci
418c2ecf20Sopenharmony_cistatic struct hw_pci mss2_pci __initdata = {
428c2ecf20Sopenharmony_ci	.nr_controllers = 2,
438c2ecf20Sopenharmony_ci	.setup		= orion5x_pci_sys_setup,
448c2ecf20Sopenharmony_ci	.scan		= orion5x_pci_sys_scan_bus,
458c2ecf20Sopenharmony_ci	.map_irq	= mss2_pci_map_irq,
468c2ecf20Sopenharmony_ci};
478c2ecf20Sopenharmony_ci
488c2ecf20Sopenharmony_cistatic int __init mss2_pci_init(void)
498c2ecf20Sopenharmony_ci{
508c2ecf20Sopenharmony_ci	if (machine_is_mss2())
518c2ecf20Sopenharmony_ci		pci_common_init(&mss2_pci);
528c2ecf20Sopenharmony_ci
538c2ecf20Sopenharmony_ci	return 0;
548c2ecf20Sopenharmony_ci}
558c2ecf20Sopenharmony_cisubsys_initcall(mss2_pci_init);
568c2ecf20Sopenharmony_ci
578c2ecf20Sopenharmony_ci/*****************************************************************************
588c2ecf20Sopenharmony_ci * MSS2 power off method
598c2ecf20Sopenharmony_ci ****************************************************************************/
608c2ecf20Sopenharmony_ci/*
618c2ecf20Sopenharmony_ci * On the Maxtor Shared Storage II, the shutdown process is the following :
628c2ecf20Sopenharmony_ci * - Userland modifies U-boot env to tell U-boot to go idle at next boot
638c2ecf20Sopenharmony_ci * - The board reboots
648c2ecf20Sopenharmony_ci * - U-boot starts and go into an idle mode until the user press "power"
658c2ecf20Sopenharmony_ci */
668c2ecf20Sopenharmony_cistatic void mss2_power_off(void)
678c2ecf20Sopenharmony_ci{
688c2ecf20Sopenharmony_ci	u32 reg;
698c2ecf20Sopenharmony_ci
708c2ecf20Sopenharmony_ci	/*
718c2ecf20Sopenharmony_ci	 * Enable and issue soft reset
728c2ecf20Sopenharmony_ci	 */
738c2ecf20Sopenharmony_ci	reg = readl(RSTOUTn_MASK);
748c2ecf20Sopenharmony_ci	reg |= 1 << 2;
758c2ecf20Sopenharmony_ci	writel(reg, RSTOUTn_MASK);
768c2ecf20Sopenharmony_ci
778c2ecf20Sopenharmony_ci	reg = readl(CPU_SOFT_RESET);
788c2ecf20Sopenharmony_ci	reg |= 1;
798c2ecf20Sopenharmony_ci	writel(reg, CPU_SOFT_RESET);
808c2ecf20Sopenharmony_ci}
818c2ecf20Sopenharmony_ci
828c2ecf20Sopenharmony_civoid __init mss2_init(void)
838c2ecf20Sopenharmony_ci{
848c2ecf20Sopenharmony_ci	/* register mss2 specific power-off method */
858c2ecf20Sopenharmony_ci	pm_power_off = mss2_power_off;
868c2ecf20Sopenharmony_ci}
87