Linux kernel staging patches
 help / color / mirror / Atom feed
* [PATCH v2] staging: greybus: remove driver depending on nonexistent config option
@ 2026-09-15  2:02 Ethan Nelson-Moore
  2026-10-01  9:19 ` Greg Kroah-Hartman
  0 siblings, 1 reply; 3+ messages in thread
From: Ethan Nelson-Moore @ 2026-09-15  2:02 UTC (permalink / raw)
  To: Jakub Kicinski, Namjae Jeon, Hisam Mehboob,
	Martin Kepplinger-Novaković, greybus-dev, linux-staging
  Cc: Agatha Isabelle Moreira, Ethan Nelson-Moore, Johan Hovold,
	Alex Elder, Greg Kroah-Hartman

The Greybus Arche Platform driver depends on the config options
USB_HSIC_USB3613 or COMPILE_TEST. USB_HSIC_USB3613 has never existed in
mainline Linux, and COMPILE_TEST is intended to enable the compilation
of drivers on platforms that can't support them to improve code
coverage and ease testing of trivial or tree-wide changes. Therefore,
it is impossible for anyone to be using this driver with unmodified
mainline kernels. Remove it and move the former maintainer to the
CREDITS file.

Signed-off-by: Ethan Nelson-Moore <enelsonmoore@gmail.com>
---
Changes in v2: Clarify commit message - mention COMPILE_TEST

 CREDITS                                  |   4 +
 MAINTAINERS                              |   7 -
 drivers/staging/greybus/Kconfig          |   9 -
 drivers/staging/greybus/Makefile         |   6 -
 drivers/staging/greybus/arche-apb-ctrl.c | 490 -----------------
 drivers/staging/greybus/arche-platform.c | 653 -----------------------
 drivers/staging/greybus/arche_platform.h |  28 -
 7 files changed, 4 insertions(+), 1193 deletions(-)
 delete mode 100644 drivers/staging/greybus/arche-apb-ctrl.c
 delete mode 100644 drivers/staging/greybus/arche-platform.c
 delete mode 100644 drivers/staging/greybus/arche_platform.h

diff --git a/CREDITS b/CREDITS
index a0bd941ca5dd..9f74318ac0da 100644
--- a/CREDITS
+++ b/CREDITS
@@ -1717,6 +1717,10 @@ S: Talstr. 1
 S: D - 72072 Tuebingen
 S: Germany
 
+N: Vaibhav Hiremath
+E: hvaibhav.linux@gmail.com
+D: Greybus Arche Platform driver
+
 N: Richard Hirst
 E: richard@sleepie.demon.co.uk
 E: rhirst@linuxcare.com
diff --git a/MAINTAINERS b/MAINTAINERS
index c2414447892c..ade7c36f9318 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -11315,13 +11315,6 @@ M:	Bryan O'Donoghue <pure.logic@nexus-software.ie>
 S:	Maintained
 F:	drivers/staging/greybus/loopback.c
 
-GREYBUS PLATFORM DRIVERS
-M:	Vaibhav Hiremath <hvaibhav.linux@gmail.com>
-S:	Maintained
-F:	drivers/staging/greybus/arche-apb-ctrl.c
-F:	drivers/staging/greybus/arche-platform.c
-F:	drivers/staging/greybus/arche_platform.h
-
 GREYBUS SDIO/GPIO/SPI PROTOCOLS DRIVERS
 M:	Rui Miguel Silva <rmfrfs@gmail.com>
 S:	Maintained
diff --git a/drivers/staging/greybus/Kconfig b/drivers/staging/greybus/Kconfig
index 7635f3e850fa..c25da61570eb 100644
--- a/drivers/staging/greybus/Kconfig
+++ b/drivers/staging/greybus/Kconfig
@@ -204,13 +204,4 @@ config GREYBUS_USB
 
 endif	# GREYBUS_BRIDGED_PHY
 
-config GREYBUS_ARCHE
-	tristate "Greybus Arche Platform driver"
-	depends on USB_HSIC_USB3613 || COMPILE_TEST
-	help
-	  Select this option if you have an Arche device.
-
-	  To compile this code as a module, chose M here: the module
-	  will be called gb-arche.ko
-
 endif	# GREYBUS
diff --git a/drivers/staging/greybus/Makefile b/drivers/staging/greybus/Makefile
index 7c5e89622334..7b9807f8a1a3 100644
--- a/drivers/staging/greybus/Makefile
+++ b/drivers/staging/greybus/Makefile
@@ -65,9 +65,3 @@ obj-$(CONFIG_GREYBUS_SDIO)		+= gb-sdio.o
 obj-$(CONFIG_GREYBUS_SPI)		+= gb-spi.o gb-spilib.o
 obj-$(CONFIG_GREYBUS_UART)		+= gb-uart.o
 obj-$(CONFIG_GREYBUS_USB)		+= gb-usb.o
-
-
-# Greybus Platform driver
-gb-arche-y	:= arche-platform.o arche-apb-ctrl.o
-
-obj-$(CONFIG_GREYBUS_ARCHE)	+= gb-arche.o
diff --git a/drivers/staging/greybus/arche-apb-ctrl.c b/drivers/staging/greybus/arche-apb-ctrl.c
deleted file mode 100644
index 4302c2226126..000000000000
--- a/drivers/staging/greybus/arche-apb-ctrl.c
+++ /dev/null
@@ -1,490 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Arche Platform driver to control APB.
- *
- * Copyright 2014-2015 Google Inc.
- * Copyright 2014-2015 Linaro Ltd.
- */
-
-#include <linux/clk.h>
-#include <linux/delay.h>
-#include <linux/gpio/consumer.h>
-#include <linux/interrupt.h>
-#include <linux/module.h>
-#include <linux/pinctrl/consumer.h>
-#include <linux/platform_device.h>
-#include <linux/pm.h>
-#include <linux/property.h>
-#include <linux/regulator/consumer.h>
-#include <linux/spinlock.h>
-#include "arche_platform.h"
-
-static void apb_bootret_deassert(struct device *dev);
-
-struct arche_apb_ctrl_drvdata {
-	/* Control GPIO signals to and from AP <=> AP Bridges */
-	struct gpio_desc *resetn;
-	struct gpio_desc *boot_ret;
-	struct gpio_desc *pwroff;
-	struct gpio_desc *wake_in;
-	struct gpio_desc *wake_out;
-	struct gpio_desc *pwrdn;
-
-	enum arche_platform_state state;
-	bool init_disabled;
-
-	struct regulator *vcore;
-	struct regulator *vio;
-
-	struct gpio_desc *clk_en;
-	struct clk *clk;
-
-	struct pinctrl *pinctrl;
-	struct pinctrl_state *pin_default;
-
-	/* V2: SPI Bus control  */
-	struct gpio_desc *spi_en;
-	bool spi_en_polarity_high;
-};
-
-/*
- * Note that these low level api's are active high
- */
-static inline void deassert_reset(struct gpio_desc *gpio)
-{
-	gpiod_set_raw_value(gpio, 1);
-}
-
-static inline void assert_reset(struct gpio_desc *gpio)
-{
-	gpiod_set_raw_value(gpio, 0);
-}
-
-/*
- * Note: Please do not modify the below sequence, as it is as per the spec
- */
-static int coldboot_seq(struct platform_device *pdev)
-{
-	struct device *dev = &pdev->dev;
-	struct arche_apb_ctrl_drvdata *apb = platform_get_drvdata(pdev);
-	int ret;
-
-	if (apb->init_disabled ||
-	    apb->state == ARCHE_PLATFORM_STATE_ACTIVE)
-		return 0;
-
-	/* Hold APB in reset state */
-	assert_reset(apb->resetn);
-
-	if (apb->state == ARCHE_PLATFORM_STATE_FW_FLASHING && apb->spi_en)
-		devm_gpiod_put(dev, apb->spi_en);
-
-	/* Enable power to APB */
-	if (!IS_ERR(apb->vcore)) {
-		ret = regulator_enable(apb->vcore);
-		if (ret) {
-			dev_err(dev, "failed to enable core regulator\n");
-			return ret;
-		}
-	}
-
-	if (!IS_ERR(apb->vio)) {
-		ret = regulator_enable(apb->vio);
-		if (ret) {
-			dev_err(dev, "failed to enable IO regulator\n");
-			return ret;
-		}
-	}
-
-	apb_bootret_deassert(dev);
-
-	/* On DB3 clock was not mandatory */
-	if (apb->clk_en)
-		gpiod_set_value(apb->clk_en, 1);
-
-	usleep_range(100, 200);
-
-	/* deassert reset to APB : Active-low signal */
-	deassert_reset(apb->resetn);
-
-	apb->state = ARCHE_PLATFORM_STATE_ACTIVE;
-
-	return 0;
-}
-
-static int fw_flashing_seq(struct platform_device *pdev)
-{
-	struct device *dev = &pdev->dev;
-	struct arche_apb_ctrl_drvdata *apb = platform_get_drvdata(pdev);
-	int ret;
-
-	if (apb->init_disabled ||
-	    apb->state == ARCHE_PLATFORM_STATE_FW_FLASHING)
-		return 0;
-
-	ret = regulator_enable(apb->vcore);
-	if (ret) {
-		dev_err(dev, "failed to enable core regulator\n");
-		return ret;
-	}
-
-	ret = regulator_enable(apb->vio);
-	if (ret) {
-		dev_err(dev, "failed to enable IO regulator\n");
-		return ret;
-	}
-
-	if (apb->spi_en) {
-		unsigned long flags;
-
-		if (apb->spi_en_polarity_high)
-			flags = GPIOD_OUT_HIGH;
-		else
-			flags = GPIOD_OUT_LOW;
-
-		apb->spi_en = devm_gpiod_get(dev, "spi-en", flags);
-		if (IS_ERR(apb->spi_en)) {
-			ret = PTR_ERR(apb->spi_en);
-			dev_err(dev, "Failed requesting SPI bus en GPIO: %d\n",
-				ret);
-			return ret;
-		}
-	}
-
-	/* for flashing device should be in reset state */
-	assert_reset(apb->resetn);
-	apb->state = ARCHE_PLATFORM_STATE_FW_FLASHING;
-
-	return 0;
-}
-
-static int standby_boot_seq(struct platform_device *pdev)
-{
-	struct device *dev = &pdev->dev;
-	struct arche_apb_ctrl_drvdata *apb = platform_get_drvdata(pdev);
-
-	if (apb->init_disabled)
-		return 0;
-
-	/*
-	 * Even if it is in OFF state,
-	 * then we do not want to change the state
-	 */
-	if (apb->state == ARCHE_PLATFORM_STATE_STANDBY ||
-	    apb->state == ARCHE_PLATFORM_STATE_OFF)
-		return 0;
-
-	if (apb->state == ARCHE_PLATFORM_STATE_FW_FLASHING && apb->spi_en)
-		devm_gpiod_put(dev, apb->spi_en);
-
-	/*
-	 * As per WDM spec, do nothing
-	 *
-	 * Pasted from WDM spec,
-	 *  - A falling edge on POWEROFF_L is detected (a)
-	 *  - WDM enters standby mode, but no output signals are changed
-	 */
-
-	/* TODO: POWEROFF_L is input to WDM module  */
-	apb->state = ARCHE_PLATFORM_STATE_STANDBY;
-	return 0;
-}
-
-static void poweroff_seq(struct platform_device *pdev)
-{
-	struct device *dev = &pdev->dev;
-	struct arche_apb_ctrl_drvdata *apb = platform_get_drvdata(pdev);
-
-	if (apb->init_disabled || apb->state == ARCHE_PLATFORM_STATE_OFF)
-		return;
-
-	if (apb->state == ARCHE_PLATFORM_STATE_FW_FLASHING && apb->spi_en)
-		devm_gpiod_put(dev, apb->spi_en);
-
-	/* disable the clock */
-	if (apb->clk_en)
-		gpiod_set_value(apb->clk_en, 0);
-
-	if (!IS_ERR(apb->vcore) && regulator_is_enabled(apb->vcore) > 0)
-		regulator_disable(apb->vcore);
-
-	if (!IS_ERR(apb->vio) && regulator_is_enabled(apb->vio) > 0)
-		regulator_disable(apb->vio);
-
-	/* As part of exit, put APB back in reset state */
-	assert_reset(apb->resetn);
-	apb->state = ARCHE_PLATFORM_STATE_OFF;
-
-	/* TODO: May have to send an event to SVC about this exit */
-}
-
-static void apb_bootret_deassert(struct device *dev)
-{
-	struct arche_apb_ctrl_drvdata *apb = dev_get_drvdata(dev);
-
-	gpiod_set_value(apb->boot_ret, 0);
-}
-
-int apb_ctrl_coldboot(struct device *dev)
-{
-	return coldboot_seq(to_platform_device(dev));
-}
-
-int apb_ctrl_fw_flashing(struct device *dev)
-{
-	return fw_flashing_seq(to_platform_device(dev));
-}
-
-int apb_ctrl_standby_boot(struct device *dev)
-{
-	return standby_boot_seq(to_platform_device(dev));
-}
-
-void apb_ctrl_poweroff(struct device *dev)
-{
-	poweroff_seq(to_platform_device(dev));
-}
-
-static ssize_t state_store(struct device *dev,
-			   struct device_attribute *attr,
-			   const char *buf, size_t count)
-{
-	struct platform_device *pdev = to_platform_device(dev);
-	struct arche_apb_ctrl_drvdata *apb = platform_get_drvdata(pdev);
-	int ret = 0;
-	bool is_disabled;
-
-	if (sysfs_streq(buf, "off")) {
-		if (apb->state == ARCHE_PLATFORM_STATE_OFF)
-			return count;
-
-		poweroff_seq(pdev);
-	} else if (sysfs_streq(buf, "active")) {
-		if (apb->state == ARCHE_PLATFORM_STATE_ACTIVE)
-			return count;
-
-		poweroff_seq(pdev);
-		is_disabled = apb->init_disabled;
-		apb->init_disabled = false;
-		ret = coldboot_seq(pdev);
-		if (ret)
-			apb->init_disabled = is_disabled;
-	} else if (sysfs_streq(buf, "standby")) {
-		if (apb->state == ARCHE_PLATFORM_STATE_STANDBY)
-			return count;
-
-		ret = standby_boot_seq(pdev);
-	} else if (sysfs_streq(buf, "fw_flashing")) {
-		if (apb->state == ARCHE_PLATFORM_STATE_FW_FLASHING)
-			return count;
-
-		/*
-		 * First we want to make sure we power off everything
-		 * and then enter FW flashing state
-		 */
-		poweroff_seq(pdev);
-		ret = fw_flashing_seq(pdev);
-	} else {
-		dev_err(dev, "unknown state\n");
-		ret = -EINVAL;
-	}
-
-	return ret ? ret : count;
-}
-
-static ssize_t state_show(struct device *dev,
-			  struct device_attribute *attr, char *buf)
-{
-	struct arche_apb_ctrl_drvdata *apb = dev_get_drvdata(dev);
-
-	switch (apb->state) {
-	case ARCHE_PLATFORM_STATE_OFF:
-		return sysfs_emit(buf, "off%s\n",
-				apb->init_disabled ? ",disabled" : "");
-	case ARCHE_PLATFORM_STATE_ACTIVE:
-		return sysfs_emit(buf, "active\n");
-	case ARCHE_PLATFORM_STATE_STANDBY:
-		return sysfs_emit(buf, "standby\n");
-	case ARCHE_PLATFORM_STATE_FW_FLASHING:
-		return sysfs_emit(buf, "fw_flashing\n");
-	default:
-		return sysfs_emit(buf, "unknown state\n");
-	}
-}
-
-static DEVICE_ATTR_RW(state);
-
-static int apb_ctrl_get_fw_data(struct platform_device *pdev,
-				struct arche_apb_ctrl_drvdata *apb)
-{
-	struct device *dev = &pdev->dev;
-	int ret;
-
-	apb->resetn = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW);
-	if (IS_ERR(apb->resetn)) {
-		ret = PTR_ERR(apb->resetn);
-		dev_err(dev, "Failed requesting reset GPIO: %d\n", ret);
-		return ret;
-	}
-
-	apb->boot_ret = devm_gpiod_get(dev, "boot-ret", GPIOD_OUT_LOW);
-	if (IS_ERR(apb->boot_ret)) {
-		ret = PTR_ERR(apb->boot_ret);
-		dev_err(dev, "Failed requesting bootret GPIO: %d\n", ret);
-		return ret;
-	}
-
-	/* It's not mandatory to support power management interface */
-	apb->pwroff = devm_gpiod_get_optional(dev, "pwr-off", GPIOD_IN);
-	if (IS_ERR(apb->pwroff)) {
-		ret = PTR_ERR(apb->pwroff);
-		dev_err(dev, "Failed requesting pwroff_n GPIO: %d\n", ret);
-		return ret;
-	}
-
-	/* Do not make clock mandatory as of now (for DB3) */
-	apb->clk_en = devm_gpiod_get_optional(dev, "clock-en", GPIOD_OUT_LOW);
-	if (IS_ERR(apb->clk_en)) {
-		ret = PTR_ERR(apb->clk_en);
-		dev_err(dev, "Failed requesting APB clock en GPIO: %d\n", ret);
-		return ret;
-	}
-
-	apb->pwrdn = devm_gpiod_get(dev, "pwr-down", GPIOD_OUT_LOW);
-	if (IS_ERR(apb->pwrdn)) {
-		ret = PTR_ERR(apb->pwrdn);
-		dev_warn(dev, "Failed requesting power down GPIO: %d\n", ret);
-		return ret;
-	}
-
-	/* Regulators are optional, as we may have fixed supply coming in */
-	apb->vcore = devm_regulator_get(dev, "vcore");
-	if (IS_ERR(apb->vcore))
-		dev_warn(dev, "no core regulator found\n");
-
-	apb->vio = devm_regulator_get(dev, "vio");
-	if (IS_ERR(apb->vio))
-		dev_warn(dev, "no IO regulator found\n");
-
-	apb->pinctrl = devm_pinctrl_get(&pdev->dev);
-	if (IS_ERR(apb->pinctrl)) {
-		dev_err(&pdev->dev, "could not get pinctrl handle\n");
-		return PTR_ERR(apb->pinctrl);
-	}
-	apb->pin_default = pinctrl_lookup_state(apb->pinctrl, "default");
-	if (IS_ERR(apb->pin_default)) {
-		dev_err(&pdev->dev, "could not get default pin state\n");
-		return PTR_ERR(apb->pin_default);
-	}
-
-	/* Only applicable for platform >= V2 */
-	if (device_property_read_bool(&pdev->dev, "gb,spi-en-active-high"))
-		apb->spi_en_polarity_high = true;
-
-	return 0;
-}
-
-static int arche_apb_ctrl_probe(struct platform_device *pdev)
-{
-	int ret;
-	struct arche_apb_ctrl_drvdata *apb;
-	struct device *dev = &pdev->dev;
-
-	apb = devm_kzalloc(&pdev->dev, sizeof(*apb), GFP_KERNEL);
-	if (!apb)
-		return -ENOMEM;
-
-	ret = apb_ctrl_get_fw_data(pdev, apb);
-	if (ret) {
-		dev_err(dev, "failed to get apb devicetree data %d\n", ret);
-		return ret;
-	}
-
-	/* Initially set APB to OFF state */
-	apb->state = ARCHE_PLATFORM_STATE_OFF;
-	/* Check whether device needs to be enabled on boot */
-	if (device_property_read_bool(&pdev->dev, "arche,init-disable"))
-		apb->init_disabled = true;
-
-	platform_set_drvdata(pdev, apb);
-
-	/* Create sysfs interface to allow user to change state dynamically */
-	ret = device_create_file(dev, &dev_attr_state);
-	if (ret) {
-		dev_err(dev, "failed to create state file in sysfs\n");
-		return ret;
-	}
-
-	dev_info(&pdev->dev, "Device registered successfully\n");
-	return 0;
-}
-
-static void arche_apb_ctrl_remove(struct platform_device *pdev)
-{
-	device_remove_file(&pdev->dev, &dev_attr_state);
-	poweroff_seq(pdev);
-	platform_set_drvdata(pdev, NULL);
-}
-
-static int __maybe_unused arche_apb_ctrl_suspend(struct device *dev)
-{
-	/*
-	 * If timing profile permits, we may shutdown bridge
-	 * completely
-	 *
-	 * TODO: sequence ??
-	 *
-	 * Also, need to make sure we meet precondition for unipro suspend
-	 * Precondition: Definition ???
-	 */
-	return 0;
-}
-
-static int __maybe_unused arche_apb_ctrl_resume(struct device *dev)
-{
-	/*
-	 * At least for ES2 we have to meet the delay requirement between
-	 * unipro switch and AP bridge init, depending on whether bridge is in
-	 * OFF state or standby state.
-	 *
-	 * Based on whether bridge is in standby or OFF state we may have to
-	 * assert multiple signals. Please refer to WDM spec, for more info.
-	 *
-	 */
-	return 0;
-}
-
-static void arche_apb_ctrl_shutdown(struct platform_device *pdev)
-{
-	apb_ctrl_poweroff(&pdev->dev);
-}
-
-static SIMPLE_DEV_PM_OPS(arche_apb_ctrl_pm_ops, arche_apb_ctrl_suspend,
-			 arche_apb_ctrl_resume);
-
-static const struct of_device_id arche_apb_ctrl_of_match[] = {
-	{ .compatible = "usbffff,2", },
-	{ },
-};
-MODULE_DEVICE_TABLE(of, arche_apb_ctrl_of_match);
-
-static struct platform_driver arche_apb_ctrl_device_driver = {
-	.probe		= arche_apb_ctrl_probe,
-	.remove		= arche_apb_ctrl_remove,
-	.shutdown	= arche_apb_ctrl_shutdown,
-	.driver		= {
-		.name	= "arche-apb-ctrl",
-		.pm	= &arche_apb_ctrl_pm_ops,
-		.of_match_table = arche_apb_ctrl_of_match,
-	}
-};
-
-int __init arche_apb_init(void)
-{
-	return platform_driver_register(&arche_apb_ctrl_device_driver);
-}
-
-void __exit arche_apb_exit(void)
-{
-	platform_driver_unregister(&arche_apb_ctrl_device_driver);
-}
diff --git a/drivers/staging/greybus/arche-platform.c b/drivers/staging/greybus/arche-platform.c
deleted file mode 100644
index de5de59ea8ab..000000000000
--- a/drivers/staging/greybus/arche-platform.c
+++ /dev/null
@@ -1,653 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Arche Platform driver to enable Unipro link.
- *
- * Copyright 2014-2015 Google Inc.
- * Copyright 2014-2015 Linaro Ltd.
- */
-
-#include <linux/clk.h>
-#include <linux/delay.h>
-#include <linux/gpio/consumer.h>
-#include <linux/init.h>
-#include <linux/module.h>
-#include <linux/of_platform.h>
-#include <linux/pinctrl/consumer.h>
-#include <linux/platform_device.h>
-#include <linux/pm.h>
-#include <linux/interrupt.h>
-#include <linux/irq.h>
-#include <linux/suspend.h>
-#include <linux/time.h>
-#include <linux/greybus.h>
-#include <linux/of.h>
-#include "arche_platform.h"
-
-#if IS_ENABLED(CONFIG_USB_HSIC_USB3613)
-#include <linux/usb/usb3613.h>
-#else
-static inline int usb3613_hub_mode_ctrl(bool unused)
-{
-	return 0;
-}
-#endif
-
-#define WD_COLDBOOT_PULSE_WIDTH_MS	30
-
-enum svc_wakedetect_state {
-	WD_STATE_IDLE,			/* Default state = pulled high/low */
-	WD_STATE_BOOT_INIT,		/* WD = falling edge (low) */
-	WD_STATE_COLDBOOT_TRIG,		/* WD = rising edge (high), > 30msec */
-	WD_STATE_STANDBYBOOT_TRIG,	/* As of now not used ?? */
-	WD_STATE_COLDBOOT_START,	/* Cold boot process started */
-	WD_STATE_STANDBYBOOT_START,	/* Not used */
-};
-
-struct arche_platform_drvdata {
-	/* Control GPIO signals to and from AP <=> SVC */
-	struct gpio_desc *svc_reset;
-	bool is_reset_act_hi;
-	struct gpio_desc *svc_sysboot;
-	struct gpio_desc *wake_detect; /* bi-dir,maps to WAKE_MOD & WAKE_FRAME signals */
-
-	enum arche_platform_state state;
-
-	struct gpio_desc *svc_refclk_req;
-	struct clk *svc_ref_clk;
-
-	struct pinctrl *pinctrl;
-	struct pinctrl_state *pin_default;
-
-	int num_apbs;
-
-	enum svc_wakedetect_state wake_detect_state;
-	int wake_detect_irq;
-	spinlock_t wake_lock;			/* Protect wake_detect_state */
-	struct mutex platform_state_mutex;	/* Protect state */
-	unsigned long wake_detect_start;
-	struct notifier_block pm_notifier;
-
-	struct device *dev;
-};
-
-/* Requires calling context to hold arche_pdata->platform_state_mutex */
-static void arche_platform_set_state(struct arche_platform_drvdata *arche_pdata,
-				     enum arche_platform_state state)
-{
-	arche_pdata->state = state;
-}
-
-/* Requires arche_pdata->wake_lock is held by calling context */
-static void arche_platform_set_wake_detect_state(struct arche_platform_drvdata *arche_pdata,
-						 enum svc_wakedetect_state state)
-{
-	arche_pdata->wake_detect_state = state;
-}
-
-static inline void svc_reset_onoff(struct gpio_desc *gpio, bool onoff)
-{
-	gpiod_set_raw_value(gpio, onoff);
-}
-
-static int apb_cold_boot(struct device *dev, void *data)
-{
-	int ret;
-
-	ret = apb_ctrl_coldboot(dev);
-	if (ret)
-		dev_warn(dev, "failed to coldboot\n");
-
-	/*Child nodes are independent, so do not exit coldboot operation */
-	return 0;
-}
-
-static int apb_poweroff(struct device *dev, void *data)
-{
-	apb_ctrl_poweroff(dev);
-
-	/* Enable HUB3613 into HUB mode. */
-	if (usb3613_hub_mode_ctrl(false))
-		dev_warn(dev, "failed to control hub device\n");
-
-	return 0;
-}
-
-static void arche_platform_wd_irq_en(struct arche_platform_drvdata *arche_pdata)
-{
-	/* Enable interrupt here, to read event back from SVC */
-	enable_irq(arche_pdata->wake_detect_irq);
-}
-
-static irqreturn_t arche_platform_wd_irq_thread(int irq, void *devid)
-{
-	struct arche_platform_drvdata *arche_pdata = devid;
-	unsigned long flags;
-
-	spin_lock_irqsave(&arche_pdata->wake_lock, flags);
-	if (arche_pdata->wake_detect_state != WD_STATE_COLDBOOT_TRIG) {
-		/* Something is wrong */
-		spin_unlock_irqrestore(&arche_pdata->wake_lock, flags);
-		return IRQ_HANDLED;
-	}
-
-	arche_platform_set_wake_detect_state(arche_pdata,
-					     WD_STATE_COLDBOOT_START);
-	spin_unlock_irqrestore(&arche_pdata->wake_lock, flags);
-
-	/* It should complete power cycle, so first make sure it is poweroff */
-	device_for_each_child(arche_pdata->dev, NULL, apb_poweroff);
-
-	/* Bring APB out of reset: cold boot sequence */
-	device_for_each_child(arche_pdata->dev, NULL, apb_cold_boot);
-
-	/* Enable HUB3613 into HUB mode. */
-	if (usb3613_hub_mode_ctrl(true))
-		dev_warn(arche_pdata->dev, "failed to control hub device\n");
-
-	spin_lock_irqsave(&arche_pdata->wake_lock, flags);
-	arche_platform_set_wake_detect_state(arche_pdata, WD_STATE_IDLE);
-	spin_unlock_irqrestore(&arche_pdata->wake_lock, flags);
-
-	return IRQ_HANDLED;
-}
-
-static irqreturn_t arche_platform_wd_irq(int irq, void *devid)
-{
-	struct arche_platform_drvdata *arche_pdata = devid;
-	unsigned long flags;
-
-	spin_lock_irqsave(&arche_pdata->wake_lock, flags);
-
-	if (gpiod_get_value(arche_pdata->wake_detect)) {
-		/* wake/detect rising */
-
-		/*
-		 * If wake/detect line goes high after low, within less than
-		 * 30msec, then standby boot sequence is initiated, which is not
-		 * supported/implemented as of now. So ignore it.
-		 */
-		if (arche_pdata->wake_detect_state == WD_STATE_BOOT_INIT) {
-			if (time_before(jiffies,
-					arche_pdata->wake_detect_start +
-					msecs_to_jiffies(WD_COLDBOOT_PULSE_WIDTH_MS))) {
-				arche_platform_set_wake_detect_state(arche_pdata,
-								     WD_STATE_IDLE);
-			} else {
-				/*
-				 * Check we are not in middle of irq thread
-				 * already
-				 */
-				if (arche_pdata->wake_detect_state !=
-						WD_STATE_COLDBOOT_START) {
-					arche_platform_set_wake_detect_state(arche_pdata,
-									     WD_STATE_COLDBOOT_TRIG);
-					spin_unlock_irqrestore(&arche_pdata->wake_lock,
-							       flags);
-					return IRQ_WAKE_THREAD;
-				}
-			}
-		}
-	} else {
-		/* wake/detect falling */
-		if (arche_pdata->wake_detect_state == WD_STATE_IDLE) {
-			arche_pdata->wake_detect_start = jiffies;
-			/*
-			 * In the beginning, when wake/detect goes low
-			 * (first time), we assume it is meant for coldboot
-			 * and set the flag. If wake/detect line stays low
-			 * beyond 30msec, then it is coldboot else fallback
-			 * to standby boot.
-			 */
-			arche_platform_set_wake_detect_state(arche_pdata,
-							     WD_STATE_BOOT_INIT);
-		}
-	}
-
-	spin_unlock_irqrestore(&arche_pdata->wake_lock, flags);
-
-	return IRQ_HANDLED;
-}
-
-/*
- * Requires arche_pdata->platform_state_mutex to be held
- */
-static int
-arche_platform_coldboot_seq(struct arche_platform_drvdata *arche_pdata)
-{
-	int ret;
-
-	if (arche_pdata->state == ARCHE_PLATFORM_STATE_ACTIVE)
-		return 0;
-
-	dev_info(arche_pdata->dev, "Booting from cold boot state\n");
-
-	svc_reset_onoff(arche_pdata->svc_reset, arche_pdata->is_reset_act_hi);
-
-	gpiod_set_value(arche_pdata->svc_sysboot, 0);
-	usleep_range(100, 200);
-
-	ret = clk_prepare_enable(arche_pdata->svc_ref_clk);
-	if (ret) {
-		dev_err(arche_pdata->dev, "failed to enable svc_ref_clk: %d\n",
-			ret);
-		return ret;
-	}
-
-	/* bring SVC out of reset */
-	svc_reset_onoff(arche_pdata->svc_reset, !arche_pdata->is_reset_act_hi);
-
-	arche_platform_set_state(arche_pdata, ARCHE_PLATFORM_STATE_ACTIVE);
-
-	return 0;
-}
-
-/*
- * Requires arche_pdata->platform_state_mutex to be held
- */
-static int
-arche_platform_fw_flashing_seq(struct arche_platform_drvdata *arche_pdata)
-{
-	int ret;
-
-	if (arche_pdata->state == ARCHE_PLATFORM_STATE_FW_FLASHING)
-		return 0;
-
-	dev_info(arche_pdata->dev, "Switching to FW flashing state\n");
-
-	svc_reset_onoff(arche_pdata->svc_reset, arche_pdata->is_reset_act_hi);
-
-	gpiod_set_value(arche_pdata->svc_sysboot, 1);
-
-	usleep_range(100, 200);
-
-	ret = clk_prepare_enable(arche_pdata->svc_ref_clk);
-	if (ret) {
-		dev_err(arche_pdata->dev, "failed to enable svc_ref_clk: %d\n",
-			ret);
-		return ret;
-	}
-
-	svc_reset_onoff(arche_pdata->svc_reset,	!arche_pdata->is_reset_act_hi);
-
-	arche_platform_set_state(arche_pdata, ARCHE_PLATFORM_STATE_FW_FLASHING);
-
-	return 0;
-}
-
-/*
- * Requires arche_pdata->platform_state_mutex to be held
- */
-static void
-arche_platform_poweroff_seq(struct arche_platform_drvdata *arche_pdata)
-{
-	unsigned long flags;
-
-	if (arche_pdata->state == ARCHE_PLATFORM_STATE_OFF)
-		return;
-
-	/* If in fw_flashing mode, then no need to repeate things again */
-	if (arche_pdata->state != ARCHE_PLATFORM_STATE_FW_FLASHING) {
-		disable_irq(arche_pdata->wake_detect_irq);
-
-		spin_lock_irqsave(&arche_pdata->wake_lock, flags);
-		arche_platform_set_wake_detect_state(arche_pdata,
-						     WD_STATE_IDLE);
-		spin_unlock_irqrestore(&arche_pdata->wake_lock, flags);
-	}
-
-	clk_disable_unprepare(arche_pdata->svc_ref_clk);
-
-	/* As part of exit, put APB back in reset state */
-	svc_reset_onoff(arche_pdata->svc_reset,	arche_pdata->is_reset_act_hi);
-
-	arche_platform_set_state(arche_pdata, ARCHE_PLATFORM_STATE_OFF);
-}
-
-static ssize_t state_store(struct device *dev,
-			   struct device_attribute *attr,
-			   const char *buf, size_t count)
-{
-	struct arche_platform_drvdata *arche_pdata = dev_get_drvdata(dev);
-	int ret = 0;
-
-	mutex_lock(&arche_pdata->platform_state_mutex);
-
-	if (sysfs_streq(buf, "off")) {
-		if (arche_pdata->state == ARCHE_PLATFORM_STATE_OFF)
-			goto exit;
-
-		/*  If SVC goes down, bring down APB's as well */
-		device_for_each_child(arche_pdata->dev, NULL, apb_poweroff);
-
-		arche_platform_poweroff_seq(arche_pdata);
-
-	} else if (sysfs_streq(buf, "active")) {
-		if (arche_pdata->state == ARCHE_PLATFORM_STATE_ACTIVE)
-			goto exit;
-
-		/* First we want to make sure we power off everything
-		 * and then activate back again
-		 */
-		device_for_each_child(arche_pdata->dev, NULL, apb_poweroff);
-		arche_platform_poweroff_seq(arche_pdata);
-
-		arche_platform_wd_irq_en(arche_pdata);
-		ret = arche_platform_coldboot_seq(arche_pdata);
-		if (ret)
-			goto exit;
-
-	} else if (sysfs_streq(buf, "standby")) {
-		if (arche_pdata->state == ARCHE_PLATFORM_STATE_STANDBY)
-			goto exit;
-
-		dev_warn(arche_pdata->dev, "standby state not supported\n");
-	} else if (sysfs_streq(buf, "fw_flashing")) {
-		if (arche_pdata->state == ARCHE_PLATFORM_STATE_FW_FLASHING)
-			goto exit;
-
-		/*
-		 * Here we only control SVC.
-		 *
-		 * In case of FW_FLASHING mode we do not want to control
-		 * APBs, as in case of V2, SPI bus is shared between both
-		 * the APBs. So let user chose which APB he wants to flash.
-		 */
-		arche_platform_poweroff_seq(arche_pdata);
-
-		ret = arche_platform_fw_flashing_seq(arche_pdata);
-		if (ret)
-			goto exit;
-	} else {
-		dev_err(arche_pdata->dev, "unknown state\n");
-		ret = -EINVAL;
-	}
-
-exit:
-	mutex_unlock(&arche_pdata->platform_state_mutex);
-	return ret ? ret : count;
-}
-
-static ssize_t state_show(struct device *dev,
-			  struct device_attribute *attr, char *buf)
-{
-	struct arche_platform_drvdata *arche_pdata = dev_get_drvdata(dev);
-
-	switch (arche_pdata->state) {
-	case ARCHE_PLATFORM_STATE_OFF:
-		return sysfs_emit(buf, "off\n");
-	case ARCHE_PLATFORM_STATE_ACTIVE:
-		return sysfs_emit(buf, "active\n");
-	case ARCHE_PLATFORM_STATE_STANDBY:
-		return sysfs_emit(buf, "standby\n");
-	case ARCHE_PLATFORM_STATE_FW_FLASHING:
-		return sysfs_emit(buf, "fw_flashing\n");
-	default:
-		return sysfs_emit(buf, "unknown state\n");
-	}
-}
-
-static DEVICE_ATTR_RW(state);
-
-static int arche_platform_pm_notifier(struct notifier_block *notifier,
-				      unsigned long pm_event, void *unused)
-{
-	struct arche_platform_drvdata *arche_pdata =
-		container_of(notifier, struct arche_platform_drvdata,
-			     pm_notifier);
-	int ret = NOTIFY_DONE;
-
-	mutex_lock(&arche_pdata->platform_state_mutex);
-	switch (pm_event) {
-	case PM_SUSPEND_PREPARE:
-		if (arche_pdata->state != ARCHE_PLATFORM_STATE_ACTIVE) {
-			ret = NOTIFY_STOP;
-			break;
-		}
-		device_for_each_child(arche_pdata->dev, NULL, apb_poweroff);
-		arche_platform_poweroff_seq(arche_pdata);
-		break;
-	case PM_POST_SUSPEND:
-		if (arche_pdata->state != ARCHE_PLATFORM_STATE_OFF)
-			break;
-
-		arche_platform_wd_irq_en(arche_pdata);
-		arche_platform_coldboot_seq(arche_pdata);
-		break;
-	default:
-		break;
-	}
-	mutex_unlock(&arche_pdata->platform_state_mutex);
-
-	return ret;
-}
-
-static int arche_platform_probe(struct platform_device *pdev)
-{
-	struct arche_platform_drvdata *arche_pdata;
-	struct device *dev = &pdev->dev;
-	struct device_node *np = dev->of_node;
-	int ret;
-	unsigned int flags;
-
-	arche_pdata = devm_kzalloc(&pdev->dev, sizeof(*arche_pdata),
-				   GFP_KERNEL);
-	if (!arche_pdata)
-		return -ENOMEM;
-
-	/* setup svc reset gpio */
-	arche_pdata->is_reset_act_hi = of_property_read_bool(np,
-							     "svc,reset-active-high");
-	if (arche_pdata->is_reset_act_hi)
-		flags = GPIOD_OUT_HIGH;
-	else
-		flags = GPIOD_OUT_LOW;
-
-	arche_pdata->svc_reset = devm_gpiod_get(dev, "svc,reset", flags);
-	if (IS_ERR(arche_pdata->svc_reset)) {
-		ret = PTR_ERR(arche_pdata->svc_reset);
-		dev_err(dev, "failed to request svc-reset GPIO: %d\n", ret);
-		return ret;
-	}
-	arche_platform_set_state(arche_pdata, ARCHE_PLATFORM_STATE_OFF);
-
-	arche_pdata->svc_sysboot = devm_gpiod_get(dev, "svc,sysboot",
-						  GPIOD_OUT_LOW);
-	if (IS_ERR(arche_pdata->svc_sysboot)) {
-		ret = PTR_ERR(arche_pdata->svc_sysboot);
-		dev_err(dev, "failed to request sysboot0 GPIO: %d\n", ret);
-		return ret;
-	}
-
-	/* setup the clock request gpio first */
-	arche_pdata->svc_refclk_req = devm_gpiod_get(dev, "svc,refclk-req",
-						     GPIOD_IN);
-	if (IS_ERR(arche_pdata->svc_refclk_req)) {
-		ret = PTR_ERR(arche_pdata->svc_refclk_req);
-		dev_err(dev, "failed to request svc-clk-req GPIO: %d\n", ret);
-		return ret;
-	}
-
-	/* setup refclk2 to follow the pin */
-	arche_pdata->svc_ref_clk = devm_clk_get(dev, "svc_ref_clk");
-	if (IS_ERR(arche_pdata->svc_ref_clk)) {
-		ret = PTR_ERR(arche_pdata->svc_ref_clk);
-		dev_err(dev, "failed to get svc_ref_clk: %d\n", ret);
-		return ret;
-	}
-
-	platform_set_drvdata(pdev, arche_pdata);
-
-	arche_pdata->num_apbs = of_get_child_count(np);
-	dev_dbg(dev, "Number of APB's available - %d\n", arche_pdata->num_apbs);
-
-	arche_pdata->wake_detect = devm_gpiod_get(dev, "svc,wake-detect",
-						  GPIOD_IN);
-	if (IS_ERR(arche_pdata->wake_detect)) {
-		ret = PTR_ERR(arche_pdata->wake_detect);
-		dev_err(dev, "Failed requesting wake_detect GPIO: %d\n", ret);
-		return ret;
-	}
-
-	arche_platform_set_wake_detect_state(arche_pdata, WD_STATE_IDLE);
-
-	arche_pdata->dev = &pdev->dev;
-
-	spin_lock_init(&arche_pdata->wake_lock);
-	mutex_init(&arche_pdata->platform_state_mutex);
-	arche_pdata->wake_detect_irq =
-		gpiod_to_irq(arche_pdata->wake_detect);
-
-	ret = devm_request_threaded_irq(dev, arche_pdata->wake_detect_irq,
-					arche_platform_wd_irq,
-					arche_platform_wd_irq_thread,
-					IRQF_TRIGGER_FALLING |
-					IRQF_TRIGGER_RISING | IRQF_ONESHOT,
-					dev_name(dev), arche_pdata);
-	if (ret) {
-		dev_err(dev, "failed to request wake detect IRQ %d\n", ret);
-		return ret;
-	}
-	disable_irq(arche_pdata->wake_detect_irq);
-
-	ret = device_create_file(dev, &dev_attr_state);
-	if (ret) {
-		dev_err(dev, "failed to create state file in sysfs\n");
-		return ret;
-	}
-
-	ret = of_platform_populate(np, NULL, NULL, dev);
-	if (ret) {
-		dev_err(dev, "failed to populate child nodes %d\n", ret);
-		goto err_device_remove;
-	}
-
-	arche_pdata->pm_notifier.notifier_call = arche_platform_pm_notifier;
-	ret = register_pm_notifier(&arche_pdata->pm_notifier);
-	if (ret) {
-		dev_err(dev, "failed to register pm notifier %d\n", ret);
-		goto err_depopulate;
-	}
-
-	/* Explicitly power off if requested */
-	if (!of_property_read_bool(pdev->dev.of_node, "arche,init-off")) {
-		mutex_lock(&arche_pdata->platform_state_mutex);
-		ret = arche_platform_coldboot_seq(arche_pdata);
-		if (ret) {
-			mutex_unlock(&arche_pdata->platform_state_mutex);
-			dev_err(dev, "Failed to cold boot svc %d\n", ret);
-			goto err_unregister_pm_notifier;
-		}
-		arche_platform_wd_irq_en(arche_pdata);
-		mutex_unlock(&arche_pdata->platform_state_mutex);
-	}
-
-	dev_info(dev, "Device registered successfully\n");
-	return 0;
-
-err_unregister_pm_notifier:
-	unregister_pm_notifier(&arche_pdata->pm_notifier);
-err_depopulate:
-	of_platform_depopulate(dev);
-err_device_remove:
-	device_remove_file(&pdev->dev, &dev_attr_state);
-	return ret;
-}
-
-static void arche_platform_remove(struct platform_device *pdev)
-{
-	struct arche_platform_drvdata *arche_pdata = platform_get_drvdata(pdev);
-
-	unregister_pm_notifier(&arche_pdata->pm_notifier);
-	device_remove_file(&pdev->dev, &dev_attr_state);
-	of_platform_depopulate(&pdev->dev);
-	arche_platform_poweroff_seq(arche_pdata);
-
-	if (usb3613_hub_mode_ctrl(false))
-		dev_warn(arche_pdata->dev, "failed to control hub device\n");
-}
-
-static __maybe_unused int arche_platform_suspend(struct device *dev)
-{
-	/*
-	 * If timing profile permits, we may shutdown bridge
-	 * completely
-	 *
-	 * TODO: define shutdown sequence
-	 *
-	 * Also, need to make sure we meet precondition for unipro suspend
-	 * Precondition: Definition ???
-	 */
-	return 0;
-}
-
-static __maybe_unused int arche_platform_resume(struct device *dev)
-{
-	/*
-	 * At least for ES2 we have to meet the delay requirement between
-	 * unipro switch and AP bridge init, depending on whether bridge is in
-	 * OFF state or standby state.
-	 *
-	 * Based on whether bridge is in standby or OFF state we may have to
-	 * assert multiple signals. Please refer to WDM spec, for more info.
-	 *
-	 */
-	return 0;
-}
-
-static void arche_platform_shutdown(struct platform_device *pdev)
-{
-	struct arche_platform_drvdata *arche_pdata = platform_get_drvdata(pdev);
-
-	arche_platform_poweroff_seq(arche_pdata);
-
-	usb3613_hub_mode_ctrl(false);
-}
-
-static SIMPLE_DEV_PM_OPS(arche_platform_pm_ops,
-			arche_platform_suspend,
-			arche_platform_resume);
-
-static const struct of_device_id arche_platform_of_match[] = {
-	/* Use PID/VID of SVC device */
-	{ .compatible = "google,arche-platform", },
-	{ },
-};
-MODULE_DEVICE_TABLE(of, arche_platform_of_match);
-
-static struct platform_driver arche_platform_device_driver = {
-	.probe		= arche_platform_probe,
-	.remove		= arche_platform_remove,
-	.shutdown	= arche_platform_shutdown,
-	.driver		= {
-		.name	= "arche-platform-ctrl",
-		.pm	= &arche_platform_pm_ops,
-		.of_match_table = arche_platform_of_match,
-	}
-};
-
-static int __init arche_init(void)
-{
-	int retval;
-
-	retval = platform_driver_register(&arche_platform_device_driver);
-	if (retval)
-		return retval;
-
-	retval = arche_apb_init();
-	if (retval)
-		platform_driver_unregister(&arche_platform_device_driver);
-
-	return retval;
-}
-module_init(arche_init);
-
-static void __exit arche_exit(void)
-{
-	arche_apb_exit();
-	platform_driver_unregister(&arche_platform_device_driver);
-}
-module_exit(arche_exit);
-
-MODULE_LICENSE("GPL v2");
-MODULE_AUTHOR("Vaibhav Hiremath <vaibhav.hiremath@linaro.org>");
-MODULE_DESCRIPTION("Arche Platform Driver");
diff --git a/drivers/staging/greybus/arche_platform.h b/drivers/staging/greybus/arche_platform.h
deleted file mode 100644
index 9d997f2d6517..000000000000
--- a/drivers/staging/greybus/arche_platform.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Arche Platform driver to enable Unipro link.
- *
- * Copyright 2015-2016 Google Inc.
- * Copyright 2015-2016 Linaro Ltd.
- */
-
-#ifndef __ARCHE_PLATFORM_H
-#define __ARCHE_PLATFORM_H
-
-enum arche_platform_state {
-	ARCHE_PLATFORM_STATE_OFF,
-	ARCHE_PLATFORM_STATE_ACTIVE,
-	ARCHE_PLATFORM_STATE_STANDBY,
-	ARCHE_PLATFORM_STATE_FW_FLASHING,
-};
-
-int __init arche_apb_init(void);
-void __exit arche_apb_exit(void);
-
-/* Operational states for the APB device */
-int apb_ctrl_coldboot(struct device *dev);
-int apb_ctrl_fw_flashing(struct device *dev);
-int apb_ctrl_standby_boot(struct device *dev);
-void apb_ctrl_poweroff(struct device *dev);
-
-#endif	/* __ARCHE_PLATFORM_H */
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2026-10-01 20:44 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-09-15  2:02 [PATCH v2] staging: greybus: remove driver depending on nonexistent config option Ethan Nelson-Moore
2026-10-01  9:19 ` Greg Kroah-Hartman
2026-10-01 20:44   ` Alex Elder

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox