* [PATCH 0/8] Remove remaining AMD Elan drivers
@ 2026-05-06 14:42 Sean Young
2026-05-06 14:42 ` [PATCH 1/8] x86/platform: Remove Technology Systems 5500 board Sean Young
` (8 more replies)
0 siblings, 9 replies; 20+ messages in thread
From: Sean Young @ 2026-05-06 14:42 UTC (permalink / raw)
To: linux-kernel
Now that AMD Elan support has been removed[1], remove the AMD Elan specific
drivers too. I had a Technology Systems 5500 back in the early 2000's and
it was pretty slow back then - no need to support such ancient slow
device. I wrote and patched some of these drivers so nice to see them
removed at the end of their life cycle.
1. commit 8b793a92d862 ("x86/cpu: Remove M486/M486SX/ELAN support")
Sean Young (8):
x86/platform: Remove Technology Systems 5500 board
mtd: ts5500_flash: Remove mapping since board is no longer supported
mtd: netsc520: Remove mapping since board is no longer supported
mtd: sc520cdp: Remove mapping since board is no longer supported
gpio: ts5500: Remove gpio driver as board no longer supported
watchdog: sc520: Drop AMD Elan SC520 support
cpufreq: sc520_freq: Drop support for AMD Elan SC520
cpufreq: elanfreq: Drop support for AMD Elan SC4*
.../ABI/testing/sysfs-platform-ts5500 | 54 ---
.../watchdog/watchdog-parameters.rst | 9 -
MAINTAINERS | 5 -
arch/x86/Kconfig | 9 -
arch/x86/platform/Makefile | 1 -
arch/x86/platform/ts5500/Makefile | 2 -
arch/x86/platform/ts5500/ts5500.c | 341 -------------
drivers/cpufreq/Kconfig.x86 | 26 -
drivers/cpufreq/Makefile | 2 -
drivers/cpufreq/elanfreq.c | 226 ---------
drivers/cpufreq/sc520_freq.c | 136 ------
drivers/gpio/Kconfig | 9 -
drivers/gpio/Makefile | 1 -
drivers/gpio/gpio-ts5500.c | 446 ------------------
drivers/mtd/maps/Kconfig | 34 --
drivers/mtd/maps/Makefile | 3 -
drivers/mtd/maps/netsc520.c | 127 -----
drivers/mtd/maps/sc520cdp.c | 294 ------------
drivers/mtd/maps/ts5500_flash.c | 108 -----
drivers/watchdog/Kconfig | 13 -
drivers/watchdog/Makefile | 1 -
drivers/watchdog/sc520_wdt.c | 430 -----------------
22 files changed, 2277 deletions(-)
delete mode 100644 Documentation/ABI/testing/sysfs-platform-ts5500
delete mode 100644 arch/x86/platform/ts5500/Makefile
delete mode 100644 arch/x86/platform/ts5500/ts5500.c
delete mode 100644 drivers/cpufreq/elanfreq.c
delete mode 100644 drivers/cpufreq/sc520_freq.c
delete mode 100644 drivers/gpio/gpio-ts5500.c
delete mode 100644 drivers/mtd/maps/netsc520.c
delete mode 100644 drivers/mtd/maps/sc520cdp.c
delete mode 100644 drivers/mtd/maps/ts5500_flash.c
delete mode 100644 drivers/watchdog/sc520_wdt.c
--
2.54.0
^ permalink raw reply [flat|nested] 20+ messages in thread
* [PATCH 1/8] x86/platform: Remove Technology Systems 5500 board
2026-05-06 14:42 [PATCH 0/8] Remove remaining AMD Elan drivers Sean Young
@ 2026-05-06 14:42 ` Sean Young
2026-05-06 14:42 ` Sean Young
` (7 subsequent siblings)
8 siblings, 0 replies; 20+ messages in thread
From: Sean Young @ 2026-05-06 14:42 UTC (permalink / raw)
To: linux-kernel, Thomas Gleixner, Ingo Molnar, Borislav Petkov,
Dave Hansen, x86, H. Peter Anvin
Since commit 8b793a92d862 ("x86/cpu: Remove M486/M486SX/ELAN support"),
this board is no longer supported. Remove the platform support too.
Signed-off-by: Sean Young <sean@mess.org>
---
.../ABI/testing/sysfs-platform-ts5500 | 54 ---
MAINTAINERS | 5 -
arch/x86/Kconfig | 9 -
arch/x86/platform/Makefile | 1 -
arch/x86/platform/ts5500/Makefile | 2 -
arch/x86/platform/ts5500/ts5500.c | 341 ------------------
6 files changed, 412 deletions(-)
delete mode 100644 Documentation/ABI/testing/sysfs-platform-ts5500
delete mode 100644 arch/x86/platform/ts5500/Makefile
delete mode 100644 arch/x86/platform/ts5500/ts5500.c
diff --git a/Documentation/ABI/testing/sysfs-platform-ts5500 b/Documentation/ABI/testing/sysfs-platform-ts5500
deleted file mode 100644
index e685957caa12..000000000000
--- a/Documentation/ABI/testing/sysfs-platform-ts5500
+++ /dev/null
@@ -1,54 +0,0 @@
-What: /sys/devices/platform/ts5500/adc
-Date: January 2013
-KernelVersion: 3.7
-Contact: "Savoir-faire Linux Inc." <kernel@savoirfairelinux.com>
-Description:
- Indicates the presence of an A/D Converter. If it is present,
- it will display "1", otherwise "0".
-
-What: /sys/devices/platform/ts5500/ereset
-Date: January 2013
-KernelVersion: 3.7
-Contact: "Savoir-faire Linux Inc." <kernel@savoirfairelinux.com>
-Description:
- Indicates the presence of an external reset. If it is present,
- it will display "1", otherwise "0".
-
-What: /sys/devices/platform/ts5500/id
-Date: January 2013
-KernelVersion: 3.7
-Contact: "Savoir-faire Linux Inc." <kernel@savoirfairelinux.com>
-Description:
- Product ID of the TS board. TS-5500 ID is 0x60.
-
-What: /sys/devices/platform/ts5500/jumpers
-Date: January 2013
-KernelVersion: 3.7
-Contact: "Savoir-faire Linux Inc." <kernel@savoirfairelinux.com>
-Description:
- Bitfield showing the jumpers' state. If a jumper is present,
- the corresponding bit is set. For instance, 0x0e means jumpers
- 2, 3 and 4 are set.
-
-What: /sys/devices/platform/ts5500/name
-Date: July 2014
-KernelVersion: 3.16
-Contact: "Savoir-faire Linux Inc." <kernel@savoirfairelinux.com>
-Description:
- Model name of the TS board, e.g. "TS-5500".
-
-What: /sys/devices/platform/ts5500/rs485
-Date: January 2013
-KernelVersion: 3.7
-Contact: "Savoir-faire Linux Inc." <kernel@savoirfairelinux.com>
-Description:
- Indicates the presence of the RS485 option. If it is present,
- it will display "1", otherwise "0".
-
-What: /sys/devices/platform/ts5500/sram
-Date: January 2013
-KernelVersion: 3.7
-Contact: "Savoir-faire Linux Inc." <kernel@savoirfairelinux.com>
-Description:
- Indicates the presence of the SRAM option. If it is present,
- it will display "1", otherwise "0".
diff --git a/MAINTAINERS b/MAINTAINERS
index 882214b0e7db..b526739b9947 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -26182,11 +26182,6 @@ S: Maintained
F: Documentation/process/contribution-maturity-model.rst
F: Documentation/process/researcher-guidelines.rst
-TECHNOLOGIC SYSTEMS TS-5500 PLATFORM SUPPORT
-M: "Savoir-faire Linux Inc." <kernel@savoirfairelinux.com>
-S: Maintained
-F: arch/x86/platform/ts5500/
-
TECHNOTREND USB IR RECEIVER
M: Sean Young <sean@mess.org>
L: linux-media@vger.kernel.org
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
index f3f7cb01d69d..4ea5465a9d93 100644
--- a/arch/x86/Kconfig
+++ b/arch/x86/Kconfig
@@ -3100,15 +3100,6 @@ config GEOS
help
This option enables system support for the Traverse Technologies GEOS.
-config TS5500
- bool "Technologic Systems TS-5500 platform support"
- depends on MELAN
- select CHECK_SIGNATURE
- select NEW_LEDS
- select LEDS_CLASS
- help
- This option enables system support for the Technologic Systems TS-5500.
-
endif # X86_32
config AMD_NB
diff --git a/arch/x86/platform/Makefile b/arch/x86/platform/Makefile
index 3ed03a2552d0..727b92d0ca25 100644
--- a/arch/x86/platform/Makefile
+++ b/arch/x86/platform/Makefile
@@ -10,5 +10,4 @@ obj-y += intel-mid/
obj-y += intel-quark/
obj-y += olpc/
obj-y += scx200/
-obj-y += ts5500/
obj-y += uv/
diff --git a/arch/x86/platform/ts5500/Makefile b/arch/x86/platform/ts5500/Makefile
deleted file mode 100644
index 910fe9e3ffb4..000000000000
--- a/arch/x86/platform/ts5500/Makefile
+++ /dev/null
@@ -1,2 +0,0 @@
-# SPDX-License-Identifier: GPL-2.0-only
-obj-$(CONFIG_TS5500) += ts5500.o
diff --git a/arch/x86/platform/ts5500/ts5500.c b/arch/x86/platform/ts5500/ts5500.c
deleted file mode 100644
index 0b67da056fd9..000000000000
--- a/arch/x86/platform/ts5500/ts5500.c
+++ /dev/null
@@ -1,341 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-or-later
-/*
- * Technologic Systems TS-5500 Single Board Computer support
- *
- * Copyright (C) 2013-2014 Savoir-faire Linux Inc.
- * Vivien Didelot <vivien.didelot@savoirfairelinux.com>
- *
- * This driver registers the Technologic Systems TS-5500 Single Board Computer
- * (SBC) and its devices, and exposes information to userspace such as jumpers'
- * state or available options. For further information about sysfs entries, see
- * Documentation/ABI/testing/sysfs-platform-ts5500.
- *
- * This code may be extended to support similar x86-based platforms.
- * Actually, the TS-5500 and TS-5400 are supported.
- */
-
-#include <linux/delay.h>
-#include <linux/io.h>
-#include <linux/kernel.h>
-#include <linux/leds.h>
-#include <linux/init.h>
-#include <linux/platform_data/max197.h>
-#include <linux/platform_device.h>
-#include <linux/slab.h>
-
-/* Product code register */
-#define TS5500_PRODUCT_CODE_ADDR 0x74
-#define TS5500_PRODUCT_CODE 0x60 /* TS-5500 product code */
-#define TS5400_PRODUCT_CODE 0x40 /* TS-5400 product code */
-
-/* SRAM/RS-485/ADC options, and RS-485 RTS/Automatic RS-485 flags register */
-#define TS5500_SRAM_RS485_ADC_ADDR 0x75
-#define TS5500_SRAM BIT(0) /* SRAM option */
-#define TS5500_RS485 BIT(1) /* RS-485 option */
-#define TS5500_ADC BIT(2) /* A/D converter option */
-#define TS5500_RS485_RTS BIT(6) /* RTS for RS-485 */
-#define TS5500_RS485_AUTO BIT(7) /* Automatic RS-485 */
-
-/* External Reset/Industrial Temperature Range options register */
-#define TS5500_ERESET_ITR_ADDR 0x76
-#define TS5500_ERESET BIT(0) /* External Reset option */
-#define TS5500_ITR BIT(1) /* Indust. Temp. Range option */
-
-/* LED/Jumpers register */
-#define TS5500_LED_JP_ADDR 0x77
-#define TS5500_LED BIT(0) /* LED flag */
-#define TS5500_JP1 BIT(1) /* Automatic CMOS */
-#define TS5500_JP2 BIT(2) /* Enable Serial Console */
-#define TS5500_JP3 BIT(3) /* Write Enable Drive A */
-#define TS5500_JP4 BIT(4) /* Fast Console (115K baud) */
-#define TS5500_JP5 BIT(5) /* User Jumper */
-#define TS5500_JP6 BIT(6) /* Console on COM1 (req. JP2) */
-#define TS5500_JP7 BIT(7) /* Undocumented (Unused) */
-
-/* A/D Converter registers */
-#define TS5500_ADC_CONV_BUSY_ADDR 0x195 /* Conversion state register */
-#define TS5500_ADC_CONV_BUSY BIT(0)
-#define TS5500_ADC_CONV_INIT_LSB_ADDR 0x196 /* Start conv. / LSB register */
-#define TS5500_ADC_CONV_MSB_ADDR 0x197 /* MSB register */
-#define TS5500_ADC_CONV_DELAY 12 /* usec */
-
-/**
- * struct ts5500_sbc - TS-5500 board description
- * @name: Board model name.
- * @id: Board product ID.
- * @sram: Flag for SRAM option.
- * @rs485: Flag for RS-485 option.
- * @adc: Flag for Analog/Digital converter option.
- * @ereset: Flag for External Reset option.
- * @itr: Flag for Industrial Temperature Range option.
- * @jumpers: Bitfield for jumpers' state.
- */
-struct ts5500_sbc {
- const char *name;
- int id;
- bool sram;
- bool rs485;
- bool adc;
- bool ereset;
- bool itr;
- u8 jumpers;
-};
-
-/* Board signatures in BIOS shadow RAM */
-static const struct {
- const char * const string;
- const ssize_t offset;
-} ts5500_signatures[] __initconst = {
- { "TS-5x00 AMD Elan", 0xb14 },
-};
-
-static int __init ts5500_check_signature(void)
-{
- void __iomem *bios;
- int i, ret = -ENODEV;
-
- bios = ioremap(0xf0000, 0x10000);
- if (!bios)
- return -ENOMEM;
-
- for (i = 0; i < ARRAY_SIZE(ts5500_signatures); i++) {
- if (check_signature(bios + ts5500_signatures[i].offset,
- ts5500_signatures[i].string,
- strlen(ts5500_signatures[i].string))) {
- ret = 0;
- break;
- }
- }
-
- iounmap(bios);
- return ret;
-}
-
-static int __init ts5500_detect_config(struct ts5500_sbc *sbc)
-{
- u8 tmp;
- int ret = 0;
-
- if (!request_region(TS5500_PRODUCT_CODE_ADDR, 4, "ts5500"))
- return -EBUSY;
-
- sbc->id = inb(TS5500_PRODUCT_CODE_ADDR);
- if (sbc->id == TS5500_PRODUCT_CODE) {
- sbc->name = "TS-5500";
- } else if (sbc->id == TS5400_PRODUCT_CODE) {
- sbc->name = "TS-5400";
- } else {
- pr_err("ts5500: unknown product code 0x%x\n", sbc->id);
- ret = -ENODEV;
- goto cleanup;
- }
-
- tmp = inb(TS5500_SRAM_RS485_ADC_ADDR);
- sbc->sram = tmp & TS5500_SRAM;
- sbc->rs485 = tmp & TS5500_RS485;
- sbc->adc = tmp & TS5500_ADC;
-
- tmp = inb(TS5500_ERESET_ITR_ADDR);
- sbc->ereset = tmp & TS5500_ERESET;
- sbc->itr = tmp & TS5500_ITR;
-
- tmp = inb(TS5500_LED_JP_ADDR);
- sbc->jumpers = tmp & ~TS5500_LED;
-
-cleanup:
- release_region(TS5500_PRODUCT_CODE_ADDR, 4);
- return ret;
-}
-
-static ssize_t name_show(struct device *dev, struct device_attribute *attr,
- char *buf)
-{
- struct ts5500_sbc *sbc = dev_get_drvdata(dev);
-
- return sprintf(buf, "%s\n", sbc->name);
-}
-static DEVICE_ATTR_RO(name);
-
-static ssize_t id_show(struct device *dev, struct device_attribute *attr,
- char *buf)
-{
- struct ts5500_sbc *sbc = dev_get_drvdata(dev);
-
- return sprintf(buf, "0x%.2x\n", sbc->id);
-}
-static DEVICE_ATTR_RO(id);
-
-static ssize_t jumpers_show(struct device *dev, struct device_attribute *attr,
- char *buf)
-{
- struct ts5500_sbc *sbc = dev_get_drvdata(dev);
-
- return sprintf(buf, "0x%.2x\n", sbc->jumpers >> 1);
-}
-static DEVICE_ATTR_RO(jumpers);
-
-#define TS5500_ATTR_BOOL(_field) \
- static ssize_t _field##_show(struct device *dev, \
- struct device_attribute *attr, char *buf) \
- { \
- struct ts5500_sbc *sbc = dev_get_drvdata(dev); \
- \
- return sprintf(buf, "%d\n", sbc->_field); \
- } \
- static DEVICE_ATTR_RO(_field)
-
-TS5500_ATTR_BOOL(sram);
-TS5500_ATTR_BOOL(rs485);
-TS5500_ATTR_BOOL(adc);
-TS5500_ATTR_BOOL(ereset);
-TS5500_ATTR_BOOL(itr);
-
-static struct attribute *ts5500_attributes[] = {
- &dev_attr_id.attr,
- &dev_attr_name.attr,
- &dev_attr_jumpers.attr,
- &dev_attr_sram.attr,
- &dev_attr_rs485.attr,
- &dev_attr_adc.attr,
- &dev_attr_ereset.attr,
- &dev_attr_itr.attr,
- NULL
-};
-
-static const struct attribute_group ts5500_attr_group = {
- .attrs = ts5500_attributes,
-};
-
-static struct resource ts5500_dio1_resource[] = {
- DEFINE_RES_IRQ_NAMED(7, "DIO1 interrupt"),
-};
-
-static struct platform_device ts5500_dio1_pdev = {
- .name = "ts5500-dio1",
- .id = -1,
- .resource = ts5500_dio1_resource,
- .num_resources = 1,
-};
-
-static struct resource ts5500_dio2_resource[] = {
- DEFINE_RES_IRQ_NAMED(6, "DIO2 interrupt"),
-};
-
-static struct platform_device ts5500_dio2_pdev = {
- .name = "ts5500-dio2",
- .id = -1,
- .resource = ts5500_dio2_resource,
- .num_resources = 1,
-};
-
-static void ts5500_led_set(struct led_classdev *led_cdev,
- enum led_brightness brightness)
-{
- outb(!!brightness, TS5500_LED_JP_ADDR);
-}
-
-static enum led_brightness ts5500_led_get(struct led_classdev *led_cdev)
-{
- return (inb(TS5500_LED_JP_ADDR) & TS5500_LED) ? LED_FULL : LED_OFF;
-}
-
-static struct led_classdev ts5500_led_cdev = {
- .name = "ts5500:green:",
- .brightness_set = ts5500_led_set,
- .brightness_get = ts5500_led_get,
-};
-
-static int ts5500_adc_convert(u8 ctrl)
-{
- u8 lsb, msb;
-
- /* Start conversion (ensure the 3 MSB are set to 0) */
- outb(ctrl & 0x1f, TS5500_ADC_CONV_INIT_LSB_ADDR);
-
- /*
- * The platform has CPLD logic driving the A/D converter.
- * The conversion must complete within 11 microseconds,
- * otherwise we have to re-initiate a conversion.
- */
- udelay(TS5500_ADC_CONV_DELAY);
- if (inb(TS5500_ADC_CONV_BUSY_ADDR) & TS5500_ADC_CONV_BUSY)
- return -EBUSY;
-
- /* Read the raw data */
- lsb = inb(TS5500_ADC_CONV_INIT_LSB_ADDR);
- msb = inb(TS5500_ADC_CONV_MSB_ADDR);
-
- return (msb << 8) | lsb;
-}
-
-static struct max197_platform_data ts5500_adc_pdata = {
- .convert = ts5500_adc_convert,
-};
-
-static struct platform_device ts5500_adc_pdev = {
- .name = "max197",
- .id = -1,
- .dev = {
- .platform_data = &ts5500_adc_pdata,
- },
-};
-
-static int __init ts5500_init(void)
-{
- struct platform_device *pdev;
- struct ts5500_sbc *sbc;
- int err;
-
- /*
- * There is no DMI available or PCI bridge subvendor info,
- * only the BIOS provides a 16-bit identification call.
- * It is safer to find a signature in the BIOS shadow RAM.
- */
- err = ts5500_check_signature();
- if (err)
- return err;
-
- pdev = platform_device_register_simple("ts5500", -1, NULL, 0);
- if (IS_ERR(pdev))
- return PTR_ERR(pdev);
-
- sbc = devm_kzalloc(&pdev->dev, sizeof(struct ts5500_sbc), GFP_KERNEL);
- if (!sbc) {
- err = -ENOMEM;
- goto error;
- }
-
- err = ts5500_detect_config(sbc);
- if (err)
- goto error;
-
- platform_set_drvdata(pdev, sbc);
-
- err = sysfs_create_group(&pdev->dev.kobj, &ts5500_attr_group);
- if (err)
- goto error;
-
- if (sbc->id == TS5500_PRODUCT_CODE) {
- ts5500_dio1_pdev.dev.parent = &pdev->dev;
- if (platform_device_register(&ts5500_dio1_pdev))
- dev_warn(&pdev->dev, "DIO1 block registration failed\n");
- ts5500_dio2_pdev.dev.parent = &pdev->dev;
- if (platform_device_register(&ts5500_dio2_pdev))
- dev_warn(&pdev->dev, "DIO2 block registration failed\n");
- }
-
- if (led_classdev_register(&pdev->dev, &ts5500_led_cdev))
- dev_warn(&pdev->dev, "LED registration failed\n");
-
- if (sbc->adc) {
- ts5500_adc_pdev.dev.parent = &pdev->dev;
- if (platform_device_register(&ts5500_adc_pdev))
- dev_warn(&pdev->dev, "ADC registration failed\n");
- }
-
- return 0;
-error:
- platform_device_unregister(pdev);
- return err;
-}
-device_initcall(ts5500_init);
--
2.54.0
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 2/8] mtd: ts5500_flash: Remove mapping since board is no longer supported
2026-05-06 14:42 [PATCH 0/8] Remove remaining AMD Elan drivers Sean Young
@ 2026-05-06 14:42 ` Sean Young
2026-05-06 14:42 ` Sean Young
` (7 subsequent siblings)
8 siblings, 0 replies; 20+ messages in thread
From: Sean Young @ 2026-05-06 14:42 UTC (permalink / raw)
To: linux-kernel, Miquel Raynal, Richard Weinberger,
Vignesh Raghavendra
Cc: linux-mtd
Since commit 8b793a92d862 ("x86/cpu: Remove M486/M486SX/ELAN support"),
this board is no longer supported. Remove the mtd map too.
Signed-off-by: Sean Young <sean@mess.org>
---
drivers/mtd/maps/Kconfig | 18 ------
drivers/mtd/maps/Makefile | 1 -
drivers/mtd/maps/ts5500_flash.c | 108 --------------------------------
3 files changed, 127 deletions(-)
delete mode 100644 drivers/mtd/maps/ts5500_flash.c
diff --git a/drivers/mtd/maps/Kconfig b/drivers/mtd/maps/Kconfig
index 99d5ff9a1fbe..e48221e97f8d 100644
--- a/drivers/mtd/maps/Kconfig
+++ b/drivers/mtd/maps/Kconfig
@@ -141,24 +141,6 @@ config MTD_NETSC520
demonstration board. If you have one of these boards and would like
to use the flash chips on it, say 'Y'.
-config MTD_TS5500
- tristate "JEDEC Flash device mapped on Technologic Systems TS-5500"
- depends on TS5500 || COMPILE_TEST
- select MTD_JEDECPROBE
- select MTD_CFI_AMDSTD
- help
- This provides a driver for the on-board flash of the Technologic
- System's TS-5500 board. The 2MB flash is split into 3 partitions
- which are accessed as separate MTD devices.
-
- mtd0 and mtd2 are the two BIOS drives, which use the resident
- flash disk (RFD) flash translation layer.
-
- mtd1 allows you to reprogram your BIOS. BE VERY CAREFUL.
-
- Note that jumper 3 ("Write Enable Drive A") must be set
- otherwise detection won't succeed.
-
config MTD_SBC_GXX
tristate "CFI Flash device mapped on Arcom SBC-GXx boards"
depends on X86 && MTD_CFI_INTELEXT && MTD_COMPLEX_MAPPINGS
diff --git a/drivers/mtd/maps/Makefile b/drivers/mtd/maps/Makefile
index 51af1d2ebd52..46ff278006a7 100644
--- a/drivers/mtd/maps/Makefile
+++ b/drivers/mtd/maps/Makefile
@@ -28,7 +28,6 @@ obj-$(CONFIG_MTD_SA1100) += sa1100-flash.o
obj-$(CONFIG_MTD_SBC_GXX) += sbc_gxx.o
obj-$(CONFIG_MTD_SC520CDP) += sc520cdp.o
obj-$(CONFIG_MTD_NETSC520) += netsc520.o
-obj-$(CONFIG_MTD_TS5500) += ts5500_flash.o
obj-$(CONFIG_MTD_SUN_UFLASH) += sun_uflash.o
obj-$(CONFIG_MTD_SCx200_DOCFLASH)+= scx200_docflash.o
obj-$(CONFIG_MTD_SOLUTIONENGINE)+= solutionengine.o
diff --git a/drivers/mtd/maps/ts5500_flash.c b/drivers/mtd/maps/ts5500_flash.c
deleted file mode 100644
index 70d6e865f555..000000000000
--- a/drivers/mtd/maps/ts5500_flash.c
+++ /dev/null
@@ -1,108 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-or-later
-/*
- * ts5500_flash.c -- MTD map driver for Technology Systems TS-5500 board
- *
- * Copyright (C) 2004 Sean Young <sean@mess.org>
- *
- * Note:
- * - In order for detection to work, jumper 3 must be set.
- * - Drive A and B use the resident flash disk (RFD) flash translation layer.
- * - If you have created your own jffs file system and the bios overwrites
- * it during boot, try disabling Drive A: and B: in the boot order.
- */
-
-#include <linux/init.h>
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/mtd/map.h>
-#include <linux/mtd/mtd.h>
-#include <linux/mtd/partitions.h>
-#include <linux/types.h>
-
-
-#define WINDOW_ADDR 0x09400000
-#define WINDOW_SIZE 0x00200000
-
-static struct map_info ts5500_map = {
- .name = "TS-5500 Flash",
- .size = WINDOW_SIZE,
- .bankwidth = 1,
- .phys = WINDOW_ADDR
-};
-
-static const struct mtd_partition ts5500_partitions[] = {
- {
- .name = "Drive A",
- .offset = 0,
- .size = 0x0e0000
- },
- {
- .name = "BIOS",
- .offset = 0x0e0000,
- .size = 0x020000,
- },
- {
- .name = "Drive B",
- .offset = 0x100000,
- .size = 0x100000
- }
-};
-
-#define NUM_PARTITIONS ARRAY_SIZE(ts5500_partitions)
-
-static struct mtd_info *mymtd;
-
-static int __init init_ts5500_map(void)
-{
- int rc = 0;
-
- ts5500_map.virt = ioremap(ts5500_map.phys, ts5500_map.size);
-
- if (!ts5500_map.virt) {
- printk(KERN_ERR "Failed to ioremap\n");
- rc = -EIO;
- goto err2;
- }
-
- simple_map_init(&ts5500_map);
-
- mymtd = do_map_probe("jedec_probe", &ts5500_map);
- if (!mymtd)
- mymtd = do_map_probe("map_rom", &ts5500_map);
-
- if (!mymtd) {
- rc = -ENXIO;
- goto err1;
- }
-
- mymtd->owner = THIS_MODULE;
- mtd_device_register(mymtd, ts5500_partitions, NUM_PARTITIONS);
-
- return 0;
-
-err1:
- iounmap(ts5500_map.virt);
-err2:
- return rc;
-}
-
-static void __exit cleanup_ts5500_map(void)
-{
- if (mymtd) {
- mtd_device_unregister(mymtd);
- map_destroy(mymtd);
- }
-
- if (ts5500_map.virt) {
- iounmap(ts5500_map.virt);
- ts5500_map.virt = NULL;
- }
-}
-
-module_init(init_ts5500_map);
-module_exit(cleanup_ts5500_map);
-
-MODULE_LICENSE("GPL");
-MODULE_AUTHOR("Sean Young <sean@mess.org>");
-MODULE_DESCRIPTION("MTD map driver for Technology Systems TS-5500 board");
-
--
2.54.0
______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 2/8] mtd: ts5500_flash: Remove mapping since board is no longer supported
@ 2026-05-06 14:42 ` Sean Young
0 siblings, 0 replies; 20+ messages in thread
From: Sean Young @ 2026-05-06 14:42 UTC (permalink / raw)
To: linux-kernel, Miquel Raynal, Richard Weinberger,
Vignesh Raghavendra
Cc: linux-mtd
Since commit 8b793a92d862 ("x86/cpu: Remove M486/M486SX/ELAN support"),
this board is no longer supported. Remove the mtd map too.
Signed-off-by: Sean Young <sean@mess.org>
---
drivers/mtd/maps/Kconfig | 18 ------
drivers/mtd/maps/Makefile | 1 -
drivers/mtd/maps/ts5500_flash.c | 108 --------------------------------
3 files changed, 127 deletions(-)
delete mode 100644 drivers/mtd/maps/ts5500_flash.c
diff --git a/drivers/mtd/maps/Kconfig b/drivers/mtd/maps/Kconfig
index 99d5ff9a1fbe..e48221e97f8d 100644
--- a/drivers/mtd/maps/Kconfig
+++ b/drivers/mtd/maps/Kconfig
@@ -141,24 +141,6 @@ config MTD_NETSC520
demonstration board. If you have one of these boards and would like
to use the flash chips on it, say 'Y'.
-config MTD_TS5500
- tristate "JEDEC Flash device mapped on Technologic Systems TS-5500"
- depends on TS5500 || COMPILE_TEST
- select MTD_JEDECPROBE
- select MTD_CFI_AMDSTD
- help
- This provides a driver for the on-board flash of the Technologic
- System's TS-5500 board. The 2MB flash is split into 3 partitions
- which are accessed as separate MTD devices.
-
- mtd0 and mtd2 are the two BIOS drives, which use the resident
- flash disk (RFD) flash translation layer.
-
- mtd1 allows you to reprogram your BIOS. BE VERY CAREFUL.
-
- Note that jumper 3 ("Write Enable Drive A") must be set
- otherwise detection won't succeed.
-
config MTD_SBC_GXX
tristate "CFI Flash device mapped on Arcom SBC-GXx boards"
depends on X86 && MTD_CFI_INTELEXT && MTD_COMPLEX_MAPPINGS
diff --git a/drivers/mtd/maps/Makefile b/drivers/mtd/maps/Makefile
index 51af1d2ebd52..46ff278006a7 100644
--- a/drivers/mtd/maps/Makefile
+++ b/drivers/mtd/maps/Makefile
@@ -28,7 +28,6 @@ obj-$(CONFIG_MTD_SA1100) += sa1100-flash.o
obj-$(CONFIG_MTD_SBC_GXX) += sbc_gxx.o
obj-$(CONFIG_MTD_SC520CDP) += sc520cdp.o
obj-$(CONFIG_MTD_NETSC520) += netsc520.o
-obj-$(CONFIG_MTD_TS5500) += ts5500_flash.o
obj-$(CONFIG_MTD_SUN_UFLASH) += sun_uflash.o
obj-$(CONFIG_MTD_SCx200_DOCFLASH)+= scx200_docflash.o
obj-$(CONFIG_MTD_SOLUTIONENGINE)+= solutionengine.o
diff --git a/drivers/mtd/maps/ts5500_flash.c b/drivers/mtd/maps/ts5500_flash.c
deleted file mode 100644
index 70d6e865f555..000000000000
--- a/drivers/mtd/maps/ts5500_flash.c
+++ /dev/null
@@ -1,108 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-or-later
-/*
- * ts5500_flash.c -- MTD map driver for Technology Systems TS-5500 board
- *
- * Copyright (C) 2004 Sean Young <sean@mess.org>
- *
- * Note:
- * - In order for detection to work, jumper 3 must be set.
- * - Drive A and B use the resident flash disk (RFD) flash translation layer.
- * - If you have created your own jffs file system and the bios overwrites
- * it during boot, try disabling Drive A: and B: in the boot order.
- */
-
-#include <linux/init.h>
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/mtd/map.h>
-#include <linux/mtd/mtd.h>
-#include <linux/mtd/partitions.h>
-#include <linux/types.h>
-
-
-#define WINDOW_ADDR 0x09400000
-#define WINDOW_SIZE 0x00200000
-
-static struct map_info ts5500_map = {
- .name = "TS-5500 Flash",
- .size = WINDOW_SIZE,
- .bankwidth = 1,
- .phys = WINDOW_ADDR
-};
-
-static const struct mtd_partition ts5500_partitions[] = {
- {
- .name = "Drive A",
- .offset = 0,
- .size = 0x0e0000
- },
- {
- .name = "BIOS",
- .offset = 0x0e0000,
- .size = 0x020000,
- },
- {
- .name = "Drive B",
- .offset = 0x100000,
- .size = 0x100000
- }
-};
-
-#define NUM_PARTITIONS ARRAY_SIZE(ts5500_partitions)
-
-static struct mtd_info *mymtd;
-
-static int __init init_ts5500_map(void)
-{
- int rc = 0;
-
- ts5500_map.virt = ioremap(ts5500_map.phys, ts5500_map.size);
-
- if (!ts5500_map.virt) {
- printk(KERN_ERR "Failed to ioremap\n");
- rc = -EIO;
- goto err2;
- }
-
- simple_map_init(&ts5500_map);
-
- mymtd = do_map_probe("jedec_probe", &ts5500_map);
- if (!mymtd)
- mymtd = do_map_probe("map_rom", &ts5500_map);
-
- if (!mymtd) {
- rc = -ENXIO;
- goto err1;
- }
-
- mymtd->owner = THIS_MODULE;
- mtd_device_register(mymtd, ts5500_partitions, NUM_PARTITIONS);
-
- return 0;
-
-err1:
- iounmap(ts5500_map.virt);
-err2:
- return rc;
-}
-
-static void __exit cleanup_ts5500_map(void)
-{
- if (mymtd) {
- mtd_device_unregister(mymtd);
- map_destroy(mymtd);
- }
-
- if (ts5500_map.virt) {
- iounmap(ts5500_map.virt);
- ts5500_map.virt = NULL;
- }
-}
-
-module_init(init_ts5500_map);
-module_exit(cleanup_ts5500_map);
-
-MODULE_LICENSE("GPL");
-MODULE_AUTHOR("Sean Young <sean@mess.org>");
-MODULE_DESCRIPTION("MTD map driver for Technology Systems TS-5500 board");
-
--
2.54.0
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 3/8] mtd: netsc520: Remove mapping since board is no longer supported
2026-05-06 14:42 [PATCH 0/8] Remove remaining AMD Elan drivers Sean Young
@ 2026-05-06 14:42 ` Sean Young
2026-05-06 14:42 ` Sean Young
` (7 subsequent siblings)
8 siblings, 0 replies; 20+ messages in thread
From: Sean Young @ 2026-05-06 14:42 UTC (permalink / raw)
To: linux-kernel, Miquel Raynal, Richard Weinberger,
Vignesh Raghavendra
Cc: linux-mtd
Since commit 8b793a92d862 ("x86/cpu: Remove M486/M486SX/ELAN support"),
this board is no longer supported. Remove the mtd map too.
Signed-off-by: Sean Young <sean@mess.org>
---
drivers/mtd/maps/Kconfig | 8 ---
drivers/mtd/maps/Makefile | 1 -
drivers/mtd/maps/netsc520.c | 127 ------------------------------------
3 files changed, 136 deletions(-)
delete mode 100644 drivers/mtd/maps/netsc520.c
diff --git a/drivers/mtd/maps/Kconfig b/drivers/mtd/maps/Kconfig
index e48221e97f8d..b34f3c34c626 100644
--- a/drivers/mtd/maps/Kconfig
+++ b/drivers/mtd/maps/Kconfig
@@ -133,14 +133,6 @@ config MTD_SC520CDP
Dual-in-line JEDEC chip. This 'mapping' driver supports that
arrangement, implementing three MTD devices.
-config MTD_NETSC520
- tristate "CFI Flash device mapped on AMD NetSc520"
- depends on (MELAN || COMPILE_TEST) && MTD_CFI
- help
- This enables access routines for the flash chips on the AMD NetSc520
- demonstration board. If you have one of these boards and would like
- to use the flash chips on it, say 'Y'.
-
config MTD_SBC_GXX
tristate "CFI Flash device mapped on Arcom SBC-GXx boards"
depends on X86 && MTD_CFI_INTELEXT && MTD_COMPLEX_MAPPINGS
diff --git a/drivers/mtd/maps/Makefile b/drivers/mtd/maps/Makefile
index 46ff278006a7..e8b5caa17ccc 100644
--- a/drivers/mtd/maps/Makefile
+++ b/drivers/mtd/maps/Makefile
@@ -27,7 +27,6 @@ obj-$(CONFIG_MTD_PCMCIA) += pcmciamtd.o
obj-$(CONFIG_MTD_SA1100) += sa1100-flash.o
obj-$(CONFIG_MTD_SBC_GXX) += sbc_gxx.o
obj-$(CONFIG_MTD_SC520CDP) += sc520cdp.o
-obj-$(CONFIG_MTD_NETSC520) += netsc520.o
obj-$(CONFIG_MTD_SUN_UFLASH) += sun_uflash.o
obj-$(CONFIG_MTD_SCx200_DOCFLASH)+= scx200_docflash.o
obj-$(CONFIG_MTD_SOLUTIONENGINE)+= solutionengine.o
diff --git a/drivers/mtd/maps/netsc520.c b/drivers/mtd/maps/netsc520.c
deleted file mode 100644
index 0bb651624f05..000000000000
--- a/drivers/mtd/maps/netsc520.c
+++ /dev/null
@@ -1,127 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-or-later
-/* netsc520.c -- MTD map driver for AMD NetSc520 Demonstration Board
- *
- * Copyright (C) 2001 Mark Langsdorf (mark.langsdorf@amd.com)
- * based on sc520cdp.c by Sysgo Real-Time Solutions GmbH
- *
- * The NetSc520 is a demonstration board for the Elan Sc520 processor available
- * from AMD. It has a single back of 16 megs of 32-bit Flash ROM and another
- * 16 megs of SDRAM.
- */
-
-#include <linux/module.h>
-#include <linux/types.h>
-#include <linux/kernel.h>
-#include <linux/init.h>
-#include <asm/io.h>
-#include <linux/mtd/mtd.h>
-#include <linux/mtd/map.h>
-#include <linux/mtd/partitions.h>
-
-
-/*
-** The single, 16 megabyte flash bank is divided into four virtual
-** partitions. The first partition is 768 KiB and is intended to
-** store the kernel image loaded by the bootstrap loader. The second
-** partition is 256 KiB and holds the BIOS image. The third
-** partition is 14.5 MiB and is intended for the flash file system
-** image. The last partition is 512 KiB and contains another copy
-** of the BIOS image and the reset vector.
-**
-** Only the third partition should be mounted. The first partition
-** should not be mounted, but it can erased and written to using the
-** MTD character routines. The second and fourth partitions should
-** not be touched - it is possible to corrupt the BIOS image by
-** mounting these partitions, and potentially the board will not be
-** recoverable afterwards.
-*/
-
-/* partition_info gives details on the logical partitions that the split the
- * single flash device into. If the size if zero we use up to the end of the
- * device. */
-static const struct mtd_partition partition_info[] = {
- {
- .name = "NetSc520 boot kernel",
- .offset = 0,
- .size = 0xc0000
- },
- {
- .name = "NetSc520 Low BIOS",
- .offset = 0xc0000,
- .size = 0x40000
- },
- {
- .name = "NetSc520 file system",
- .offset = 0x100000,
- .size = 0xe80000
- },
- {
- .name = "NetSc520 High BIOS",
- .offset = 0xf80000,
- .size = 0x80000
- },
-};
-#define NUM_PARTITIONS ARRAY_SIZE(partition_info)
-
-#define WINDOW_SIZE 0x00100000
-#define WINDOW_ADDR 0x00200000
-
-static struct map_info netsc520_map = {
- .name = "netsc520 Flash Bank",
- .size = WINDOW_SIZE,
- .bankwidth = 4,
- .phys = WINDOW_ADDR,
-};
-
-#define NUM_FLASH_BANKS ARRAY_SIZE(netsc520_map)
-
-static struct mtd_info *mymtd;
-
-static int __init init_netsc520(void)
-{
- printk(KERN_NOTICE "NetSc520 flash device: 0x%Lx at 0x%Lx\n",
- (unsigned long long)netsc520_map.size,
- (unsigned long long)netsc520_map.phys);
- netsc520_map.virt = ioremap(netsc520_map.phys, netsc520_map.size);
-
- if (!netsc520_map.virt) {
- printk("Failed to ioremap\n");
- return -EIO;
- }
-
- simple_map_init(&netsc520_map);
-
- mymtd = do_map_probe("cfi_probe", &netsc520_map);
- if(!mymtd)
- mymtd = do_map_probe("map_ram", &netsc520_map);
- if(!mymtd)
- mymtd = do_map_probe("map_rom", &netsc520_map);
-
- if (!mymtd) {
- iounmap(netsc520_map.virt);
- return -ENXIO;
- }
-
- mymtd->owner = THIS_MODULE;
- mtd_device_register(mymtd, partition_info, NUM_PARTITIONS);
- return 0;
-}
-
-static void __exit cleanup_netsc520(void)
-{
- if (mymtd) {
- mtd_device_unregister(mymtd);
- map_destroy(mymtd);
- }
- if (netsc520_map.virt) {
- iounmap(netsc520_map.virt);
- netsc520_map.virt = NULL;
- }
-}
-
-module_init(init_netsc520);
-module_exit(cleanup_netsc520);
-
-MODULE_LICENSE("GPL");
-MODULE_AUTHOR("Mark Langsdorf <mark.langsdorf@amd.com>");
-MODULE_DESCRIPTION("MTD map driver for AMD NetSc520 Demonstration Board");
--
2.54.0
______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 3/8] mtd: netsc520: Remove mapping since board is no longer supported
@ 2026-05-06 14:42 ` Sean Young
0 siblings, 0 replies; 20+ messages in thread
From: Sean Young @ 2026-05-06 14:42 UTC (permalink / raw)
To: linux-kernel, Miquel Raynal, Richard Weinberger,
Vignesh Raghavendra
Cc: linux-mtd
Since commit 8b793a92d862 ("x86/cpu: Remove M486/M486SX/ELAN support"),
this board is no longer supported. Remove the mtd map too.
Signed-off-by: Sean Young <sean@mess.org>
---
drivers/mtd/maps/Kconfig | 8 ---
drivers/mtd/maps/Makefile | 1 -
drivers/mtd/maps/netsc520.c | 127 ------------------------------------
3 files changed, 136 deletions(-)
delete mode 100644 drivers/mtd/maps/netsc520.c
diff --git a/drivers/mtd/maps/Kconfig b/drivers/mtd/maps/Kconfig
index e48221e97f8d..b34f3c34c626 100644
--- a/drivers/mtd/maps/Kconfig
+++ b/drivers/mtd/maps/Kconfig
@@ -133,14 +133,6 @@ config MTD_SC520CDP
Dual-in-line JEDEC chip. This 'mapping' driver supports that
arrangement, implementing three MTD devices.
-config MTD_NETSC520
- tristate "CFI Flash device mapped on AMD NetSc520"
- depends on (MELAN || COMPILE_TEST) && MTD_CFI
- help
- This enables access routines for the flash chips on the AMD NetSc520
- demonstration board. If you have one of these boards and would like
- to use the flash chips on it, say 'Y'.
-
config MTD_SBC_GXX
tristate "CFI Flash device mapped on Arcom SBC-GXx boards"
depends on X86 && MTD_CFI_INTELEXT && MTD_COMPLEX_MAPPINGS
diff --git a/drivers/mtd/maps/Makefile b/drivers/mtd/maps/Makefile
index 46ff278006a7..e8b5caa17ccc 100644
--- a/drivers/mtd/maps/Makefile
+++ b/drivers/mtd/maps/Makefile
@@ -27,7 +27,6 @@ obj-$(CONFIG_MTD_PCMCIA) += pcmciamtd.o
obj-$(CONFIG_MTD_SA1100) += sa1100-flash.o
obj-$(CONFIG_MTD_SBC_GXX) += sbc_gxx.o
obj-$(CONFIG_MTD_SC520CDP) += sc520cdp.o
-obj-$(CONFIG_MTD_NETSC520) += netsc520.o
obj-$(CONFIG_MTD_SUN_UFLASH) += sun_uflash.o
obj-$(CONFIG_MTD_SCx200_DOCFLASH)+= scx200_docflash.o
obj-$(CONFIG_MTD_SOLUTIONENGINE)+= solutionengine.o
diff --git a/drivers/mtd/maps/netsc520.c b/drivers/mtd/maps/netsc520.c
deleted file mode 100644
index 0bb651624f05..000000000000
--- a/drivers/mtd/maps/netsc520.c
+++ /dev/null
@@ -1,127 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-or-later
-/* netsc520.c -- MTD map driver for AMD NetSc520 Demonstration Board
- *
- * Copyright (C) 2001 Mark Langsdorf (mark.langsdorf@amd.com)
- * based on sc520cdp.c by Sysgo Real-Time Solutions GmbH
- *
- * The NetSc520 is a demonstration board for the Elan Sc520 processor available
- * from AMD. It has a single back of 16 megs of 32-bit Flash ROM and another
- * 16 megs of SDRAM.
- */
-
-#include <linux/module.h>
-#include <linux/types.h>
-#include <linux/kernel.h>
-#include <linux/init.h>
-#include <asm/io.h>
-#include <linux/mtd/mtd.h>
-#include <linux/mtd/map.h>
-#include <linux/mtd/partitions.h>
-
-
-/*
-** The single, 16 megabyte flash bank is divided into four virtual
-** partitions. The first partition is 768 KiB and is intended to
-** store the kernel image loaded by the bootstrap loader. The second
-** partition is 256 KiB and holds the BIOS image. The third
-** partition is 14.5 MiB and is intended for the flash file system
-** image. The last partition is 512 KiB and contains another copy
-** of the BIOS image and the reset vector.
-**
-** Only the third partition should be mounted. The first partition
-** should not be mounted, but it can erased and written to using the
-** MTD character routines. The second and fourth partitions should
-** not be touched - it is possible to corrupt the BIOS image by
-** mounting these partitions, and potentially the board will not be
-** recoverable afterwards.
-*/
-
-/* partition_info gives details on the logical partitions that the split the
- * single flash device into. If the size if zero we use up to the end of the
- * device. */
-static const struct mtd_partition partition_info[] = {
- {
- .name = "NetSc520 boot kernel",
- .offset = 0,
- .size = 0xc0000
- },
- {
- .name = "NetSc520 Low BIOS",
- .offset = 0xc0000,
- .size = 0x40000
- },
- {
- .name = "NetSc520 file system",
- .offset = 0x100000,
- .size = 0xe80000
- },
- {
- .name = "NetSc520 High BIOS",
- .offset = 0xf80000,
- .size = 0x80000
- },
-};
-#define NUM_PARTITIONS ARRAY_SIZE(partition_info)
-
-#define WINDOW_SIZE 0x00100000
-#define WINDOW_ADDR 0x00200000
-
-static struct map_info netsc520_map = {
- .name = "netsc520 Flash Bank",
- .size = WINDOW_SIZE,
- .bankwidth = 4,
- .phys = WINDOW_ADDR,
-};
-
-#define NUM_FLASH_BANKS ARRAY_SIZE(netsc520_map)
-
-static struct mtd_info *mymtd;
-
-static int __init init_netsc520(void)
-{
- printk(KERN_NOTICE "NetSc520 flash device: 0x%Lx at 0x%Lx\n",
- (unsigned long long)netsc520_map.size,
- (unsigned long long)netsc520_map.phys);
- netsc520_map.virt = ioremap(netsc520_map.phys, netsc520_map.size);
-
- if (!netsc520_map.virt) {
- printk("Failed to ioremap\n");
- return -EIO;
- }
-
- simple_map_init(&netsc520_map);
-
- mymtd = do_map_probe("cfi_probe", &netsc520_map);
- if(!mymtd)
- mymtd = do_map_probe("map_ram", &netsc520_map);
- if(!mymtd)
- mymtd = do_map_probe("map_rom", &netsc520_map);
-
- if (!mymtd) {
- iounmap(netsc520_map.virt);
- return -ENXIO;
- }
-
- mymtd->owner = THIS_MODULE;
- mtd_device_register(mymtd, partition_info, NUM_PARTITIONS);
- return 0;
-}
-
-static void __exit cleanup_netsc520(void)
-{
- if (mymtd) {
- mtd_device_unregister(mymtd);
- map_destroy(mymtd);
- }
- if (netsc520_map.virt) {
- iounmap(netsc520_map.virt);
- netsc520_map.virt = NULL;
- }
-}
-
-module_init(init_netsc520);
-module_exit(cleanup_netsc520);
-
-MODULE_LICENSE("GPL");
-MODULE_AUTHOR("Mark Langsdorf <mark.langsdorf@amd.com>");
-MODULE_DESCRIPTION("MTD map driver for AMD NetSc520 Demonstration Board");
--
2.54.0
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 4/8] mtd: sc520cdp: Remove mapping since board is no longer supported
2026-05-06 14:42 [PATCH 0/8] Remove remaining AMD Elan drivers Sean Young
@ 2026-05-06 14:42 ` Sean Young
2026-05-06 14:42 ` Sean Young
` (7 subsequent siblings)
8 siblings, 0 replies; 20+ messages in thread
From: Sean Young @ 2026-05-06 14:42 UTC (permalink / raw)
To: linux-kernel, Miquel Raynal, Richard Weinberger,
Vignesh Raghavendra
Cc: linux-mtd
Since commit 8b793a92d862 ("x86/cpu: Remove M486/M486SX/ELAN support"),
this board is no longer supported. Remove the mtd map too.
Signed-off-by: Sean Young <sean@mess.org>
---
drivers/mtd/maps/Kconfig | 8 -
drivers/mtd/maps/Makefile | 1 -
drivers/mtd/maps/sc520cdp.c | 294 ------------------------------------
3 files changed, 303 deletions(-)
delete mode 100644 drivers/mtd/maps/sc520cdp.c
diff --git a/drivers/mtd/maps/Kconfig b/drivers/mtd/maps/Kconfig
index b34f3c34c626..db63b5af4b39 100644
--- a/drivers/mtd/maps/Kconfig
+++ b/drivers/mtd/maps/Kconfig
@@ -125,14 +125,6 @@ config MTD_SUN_UFLASH
Sun Microsystems boardsets. This driver will require CFI support
in the kernel, so if you did not enable CFI previously, do that now.
-config MTD_SC520CDP
- tristate "CFI Flash device mapped on AMD SC520 CDP"
- depends on (MELAN || COMPILE_TEST) && MTD_CFI
- help
- The SC520 CDP board has two banks of CFI-compliant chips and one
- Dual-in-line JEDEC chip. This 'mapping' driver supports that
- arrangement, implementing three MTD devices.
-
config MTD_SBC_GXX
tristate "CFI Flash device mapped on Arcom SBC-GXx boards"
depends on X86 && MTD_CFI_INTELEXT && MTD_COMPLEX_MAPPINGS
diff --git a/drivers/mtd/maps/Makefile b/drivers/mtd/maps/Makefile
index e8b5caa17ccc..c545d1e68e91 100644
--- a/drivers/mtd/maps/Makefile
+++ b/drivers/mtd/maps/Makefile
@@ -26,7 +26,6 @@ obj-$(CONFIG_MTD_PISMO) += pismo.o
obj-$(CONFIG_MTD_PCMCIA) += pcmciamtd.o
obj-$(CONFIG_MTD_SA1100) += sa1100-flash.o
obj-$(CONFIG_MTD_SBC_GXX) += sbc_gxx.o
-obj-$(CONFIG_MTD_SC520CDP) += sc520cdp.o
obj-$(CONFIG_MTD_SUN_UFLASH) += sun_uflash.o
obj-$(CONFIG_MTD_SCx200_DOCFLASH)+= scx200_docflash.o
obj-$(CONFIG_MTD_SOLUTIONENGINE)+= solutionengine.o
diff --git a/drivers/mtd/maps/sc520cdp.c b/drivers/mtd/maps/sc520cdp.c
deleted file mode 100644
index 8ef7aec634c7..000000000000
--- a/drivers/mtd/maps/sc520cdp.c
+++ /dev/null
@@ -1,294 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-or-later
-/* sc520cdp.c -- MTD map driver for AMD SC520 Customer Development Platform
- *
- * Copyright (C) 2001 Sysgo Real-Time Solutions GmbH
- *
- * The SC520CDP is an evaluation board for the Elan SC520 processor available
- * from AMD. It has two banks of 32-bit Flash ROM, each 8 Megabytes in size,
- * and up to 512 KiB of 8-bit DIL Flash ROM.
- * For details see https://www.amd.com/products/epd/desiging/evalboards/18.elansc520/520_cdp_brief/index.html
- */
-
-#include <linux/module.h>
-#include <linux/types.h>
-#include <linux/kernel.h>
-#include <linux/init.h>
-#include <asm/io.h>
-#include <linux/mtd/mtd.h>
-#include <linux/mtd/map.h>
-#include <linux/mtd/concat.h>
-
-/*
-** The Embedded Systems BIOS decodes the first FLASH starting at
-** 0x8400000. This is a *terrible* place for it because accessing
-** the flash at this location causes the A22 address line to be high
-** (that's what 0x8400000 binary's ought to be). But this is the highest
-** order address line on the raw flash devices themselves!!
-** This causes the top HALF of the flash to be accessed first. Beyond
-** the physical limits of the flash, the flash chip aliases over (to
-** 0x880000 which causes the bottom half to be accessed. This splits the
-** flash into two and inverts it! If you then try to access this from another
-** program that does NOT do this insanity, then you *will* access the
-** first half of the flash, but not find what you expect there. That
-** stuff is in the *second* half! Similarly, the address used by the
-** BIOS for the second FLASH bank is also quite a bad choice.
-** If REPROGRAM_PAR is defined below (the default), then this driver will
-** choose more useful addresses for the FLASH banks by reprogramming the
-** responsible PARxx registers in the SC520's MMCR region. This will
-** cause the settings to be incompatible with the BIOS's settings, which
-** shouldn't be a problem since you are running Linux, (i.e. the BIOS is
-** not much use anyway). However, if you need to be compatible with
-** the BIOS for some reason, just undefine REPROGRAM_PAR.
-*/
-#define REPROGRAM_PAR
-
-
-
-#ifdef REPROGRAM_PAR
-
-/* These are the addresses we want.. */
-#define WINDOW_ADDR_0 0x08800000
-#define WINDOW_ADDR_1 0x09000000
-#define WINDOW_ADDR_2 0x09800000
-
-/* .. and these are the addresses the BIOS gives us */
-#define WINDOW_ADDR_0_BIOS 0x08400000
-#define WINDOW_ADDR_1_BIOS 0x08c00000
-#define WINDOW_ADDR_2_BIOS 0x09400000
-
-#else
-
-#define WINDOW_ADDR_0 0x08400000
-#define WINDOW_ADDR_1 0x08C00000
-#define WINDOW_ADDR_2 0x09400000
-
-#endif
-
-#define WINDOW_SIZE_0 0x00800000
-#define WINDOW_SIZE_1 0x00800000
-#define WINDOW_SIZE_2 0x00080000
-
-
-static struct map_info sc520cdp_map[] = {
- {
- .name = "SC520CDP Flash Bank #0",
- .size = WINDOW_SIZE_0,
- .bankwidth = 4,
- .phys = WINDOW_ADDR_0
- },
- {
- .name = "SC520CDP Flash Bank #1",
- .size = WINDOW_SIZE_1,
- .bankwidth = 4,
- .phys = WINDOW_ADDR_1
- },
- {
- .name = "SC520CDP DIL Flash",
- .size = WINDOW_SIZE_2,
- .bankwidth = 1,
- .phys = WINDOW_ADDR_2
- },
-};
-
-#define NUM_FLASH_BANKS ARRAY_SIZE(sc520cdp_map)
-
-static struct mtd_info *mymtd[NUM_FLASH_BANKS];
-static struct mtd_info *merged_mtd;
-
-#ifdef REPROGRAM_PAR
-
-/*
-** The SC520 MMCR (memory mapped control register) region resides
-** at 0xFFFEF000. The 16 Programmable Address Region (PAR) registers
-** are at offset 0x88 in the MMCR:
-*/
-#define SC520_MMCR_BASE 0xFFFEF000
-#define SC520_MMCR_EXTENT 0x1000
-#define SC520_PAR(x) ((0x88/sizeof(unsigned long)) + (x))
-#define NUM_SC520_PAR 16 /* total number of PAR registers */
-
-/*
-** The highest three bits in a PAR register determine what target
-** device is controlled by this PAR. Here, only ROMCS? and BOOTCS
-** devices are of interest.
-*/
-#define SC520_PAR_BOOTCS (0x4<<29)
-#define SC520_PAR_ROMCS0 (0x5<<29)
-#define SC520_PAR_ROMCS1 (0x6<<29)
-#define SC520_PAR_TRGDEV (0x7<<29)
-
-/*
-** Bits 28 thru 26 determine some attributes for the
-** region controlled by the PAR. (We only use non-cacheable)
-*/
-#define SC520_PAR_WRPROT (1<<26) /* write protected */
-#define SC520_PAR_NOCACHE (1<<27) /* non-cacheable */
-#define SC520_PAR_NOEXEC (1<<28) /* code execution denied */
-
-
-/*
-** Bit 25 determines the granularity: 4K or 64K
-*/
-#define SC520_PAR_PG_SIZ4 (0<<25)
-#define SC520_PAR_PG_SIZ64 (1<<25)
-
-/*
-** Build a value to be written into a PAR register.
-** We only need ROM entries, 64K page size:
-*/
-#define SC520_PAR_ENTRY(trgdev, address, size) \
- ((trgdev) | SC520_PAR_NOCACHE | SC520_PAR_PG_SIZ64 | \
- (address) >> 16 | (((size) >> 16) - 1) << 14)
-
-struct sc520_par_table
-{
- unsigned long trgdev;
- unsigned long new_par;
- unsigned long default_address;
-};
-
-static const struct sc520_par_table par_table[NUM_FLASH_BANKS] =
-{
- { /* Flash Bank #0: selected by ROMCS0 */
- SC520_PAR_ROMCS0,
- SC520_PAR_ENTRY(SC520_PAR_ROMCS0, WINDOW_ADDR_0, WINDOW_SIZE_0),
- WINDOW_ADDR_0_BIOS
- },
- { /* Flash Bank #1: selected by ROMCS1 */
- SC520_PAR_ROMCS1,
- SC520_PAR_ENTRY(SC520_PAR_ROMCS1, WINDOW_ADDR_1, WINDOW_SIZE_1),
- WINDOW_ADDR_1_BIOS
- },
- { /* DIL (BIOS) Flash: selected by BOOTCS */
- SC520_PAR_BOOTCS,
- SC520_PAR_ENTRY(SC520_PAR_BOOTCS, WINDOW_ADDR_2, WINDOW_SIZE_2),
- WINDOW_ADDR_2_BIOS
- }
-};
-
-
-static void sc520cdp_setup_par(void)
-{
- unsigned long __iomem *mmcr;
- unsigned long mmcr_val;
- int i, j;
-
- /* map in SC520's MMCR area */
- mmcr = ioremap(SC520_MMCR_BASE, SC520_MMCR_EXTENT);
- if(!mmcr) { /* ioremap failed: skip the PAR reprogramming */
- /* force physical address fields to BIOS defaults: */
- for(i = 0; i < NUM_FLASH_BANKS; i++)
- sc520cdp_map[i].phys = par_table[i].default_address;
- return;
- }
-
- /*
- ** Find the PARxx registers that are responsible for activating
- ** ROMCS0, ROMCS1 and BOOTCS. Reprogram each of these with a
- ** new value from the table.
- */
- for(i = 0; i < NUM_FLASH_BANKS; i++) { /* for each par_table entry */
- for(j = 0; j < NUM_SC520_PAR; j++) { /* for each PAR register */
- mmcr_val = readl(&mmcr[SC520_PAR(j)]);
- /* if target device field matches, reprogram the PAR */
- if((mmcr_val & SC520_PAR_TRGDEV) == par_table[i].trgdev)
- {
- writel(par_table[i].new_par, &mmcr[SC520_PAR(j)]);
- break;
- }
- }
- if(j == NUM_SC520_PAR)
- { /* no matching PAR found: try default BIOS address */
- printk(KERN_NOTICE "Could not find PAR responsible for %s\n",
- sc520cdp_map[i].name);
- printk(KERN_NOTICE "Trying default address 0x%lx\n",
- par_table[i].default_address);
- sc520cdp_map[i].phys = par_table[i].default_address;
- }
- }
- iounmap(mmcr);
-}
-#endif
-
-
-static int __init init_sc520cdp(void)
-{
- int i, j, devices_found = 0;
-
-#ifdef REPROGRAM_PAR
- /* reprogram PAR registers so flash appears at the desired addresses */
- sc520cdp_setup_par();
-#endif
-
- for (i = 0; i < NUM_FLASH_BANKS; i++) {
- printk(KERN_NOTICE "SC520 CDP flash device: 0x%Lx at 0x%Lx\n",
- (unsigned long long)sc520cdp_map[i].size,
- (unsigned long long)sc520cdp_map[i].phys);
-
- sc520cdp_map[i].virt = ioremap(sc520cdp_map[i].phys, sc520cdp_map[i].size);
-
- if (!sc520cdp_map[i].virt) {
- printk("Failed to ioremap\n");
- for (j = 0; j < i; j++) {
- if (mymtd[j]) {
- map_destroy(mymtd[j]);
- iounmap(sc520cdp_map[j].virt);
- }
- }
- return -EIO;
- }
-
- simple_map_init(&sc520cdp_map[i]);
-
- mymtd[i] = do_map_probe("cfi_probe", &sc520cdp_map[i]);
- if(!mymtd[i])
- mymtd[i] = do_map_probe("jedec_probe", &sc520cdp_map[i]);
- if(!mymtd[i])
- mymtd[i] = do_map_probe("map_rom", &sc520cdp_map[i]);
-
- if (mymtd[i]) {
- mymtd[i]->owner = THIS_MODULE;
- ++devices_found;
- }
- else {
- iounmap(sc520cdp_map[i].virt);
- }
- }
- if(devices_found >= 2) {
- /* Combine the two flash banks into a single MTD device & register it: */
- merged_mtd = mtd_concat_create(mymtd, 2, "SC520CDP Flash Banks #0 and #1");
- if(merged_mtd)
- mtd_device_register(merged_mtd, NULL, 0);
- }
- if(devices_found == 3) /* register the third (DIL-Flash) device */
- mtd_device_register(mymtd[2], NULL, 0);
- return(devices_found ? 0 : -ENXIO);
-}
-
-static void __exit cleanup_sc520cdp(void)
-{
- int i;
-
- if (merged_mtd) {
- mtd_device_unregister(merged_mtd);
- mtd_concat_destroy(merged_mtd);
- }
- if (mymtd[2])
- mtd_device_unregister(mymtd[2]);
-
- for (i = 0; i < NUM_FLASH_BANKS; i++) {
- if (mymtd[i])
- map_destroy(mymtd[i]);
- if (sc520cdp_map[i].virt) {
- iounmap(sc520cdp_map[i].virt);
- sc520cdp_map[i].virt = NULL;
- }
- }
-}
-
-module_init(init_sc520cdp);
-module_exit(cleanup_sc520cdp);
-
-MODULE_LICENSE("GPL");
-MODULE_AUTHOR("Sysgo Real-Time Solutions GmbH");
-MODULE_DESCRIPTION("MTD map driver for AMD SC520 Customer Development Platform");
--
2.54.0
______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 4/8] mtd: sc520cdp: Remove mapping since board is no longer supported
@ 2026-05-06 14:42 ` Sean Young
0 siblings, 0 replies; 20+ messages in thread
From: Sean Young @ 2026-05-06 14:42 UTC (permalink / raw)
To: linux-kernel, Miquel Raynal, Richard Weinberger,
Vignesh Raghavendra
Cc: linux-mtd
Since commit 8b793a92d862 ("x86/cpu: Remove M486/M486SX/ELAN support"),
this board is no longer supported. Remove the mtd map too.
Signed-off-by: Sean Young <sean@mess.org>
---
drivers/mtd/maps/Kconfig | 8 -
drivers/mtd/maps/Makefile | 1 -
drivers/mtd/maps/sc520cdp.c | 294 ------------------------------------
3 files changed, 303 deletions(-)
delete mode 100644 drivers/mtd/maps/sc520cdp.c
diff --git a/drivers/mtd/maps/Kconfig b/drivers/mtd/maps/Kconfig
index b34f3c34c626..db63b5af4b39 100644
--- a/drivers/mtd/maps/Kconfig
+++ b/drivers/mtd/maps/Kconfig
@@ -125,14 +125,6 @@ config MTD_SUN_UFLASH
Sun Microsystems boardsets. This driver will require CFI support
in the kernel, so if you did not enable CFI previously, do that now.
-config MTD_SC520CDP
- tristate "CFI Flash device mapped on AMD SC520 CDP"
- depends on (MELAN || COMPILE_TEST) && MTD_CFI
- help
- The SC520 CDP board has two banks of CFI-compliant chips and one
- Dual-in-line JEDEC chip. This 'mapping' driver supports that
- arrangement, implementing three MTD devices.
-
config MTD_SBC_GXX
tristate "CFI Flash device mapped on Arcom SBC-GXx boards"
depends on X86 && MTD_CFI_INTELEXT && MTD_COMPLEX_MAPPINGS
diff --git a/drivers/mtd/maps/Makefile b/drivers/mtd/maps/Makefile
index e8b5caa17ccc..c545d1e68e91 100644
--- a/drivers/mtd/maps/Makefile
+++ b/drivers/mtd/maps/Makefile
@@ -26,7 +26,6 @@ obj-$(CONFIG_MTD_PISMO) += pismo.o
obj-$(CONFIG_MTD_PCMCIA) += pcmciamtd.o
obj-$(CONFIG_MTD_SA1100) += sa1100-flash.o
obj-$(CONFIG_MTD_SBC_GXX) += sbc_gxx.o
-obj-$(CONFIG_MTD_SC520CDP) += sc520cdp.o
obj-$(CONFIG_MTD_SUN_UFLASH) += sun_uflash.o
obj-$(CONFIG_MTD_SCx200_DOCFLASH)+= scx200_docflash.o
obj-$(CONFIG_MTD_SOLUTIONENGINE)+= solutionengine.o
diff --git a/drivers/mtd/maps/sc520cdp.c b/drivers/mtd/maps/sc520cdp.c
deleted file mode 100644
index 8ef7aec634c7..000000000000
--- a/drivers/mtd/maps/sc520cdp.c
+++ /dev/null
@@ -1,294 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-or-later
-/* sc520cdp.c -- MTD map driver for AMD SC520 Customer Development Platform
- *
- * Copyright (C) 2001 Sysgo Real-Time Solutions GmbH
- *
- * The SC520CDP is an evaluation board for the Elan SC520 processor available
- * from AMD. It has two banks of 32-bit Flash ROM, each 8 Megabytes in size,
- * and up to 512 KiB of 8-bit DIL Flash ROM.
- * For details see https://www.amd.com/products/epd/desiging/evalboards/18.elansc520/520_cdp_brief/index.html
- */
-
-#include <linux/module.h>
-#include <linux/types.h>
-#include <linux/kernel.h>
-#include <linux/init.h>
-#include <asm/io.h>
-#include <linux/mtd/mtd.h>
-#include <linux/mtd/map.h>
-#include <linux/mtd/concat.h>
-
-/*
-** The Embedded Systems BIOS decodes the first FLASH starting at
-** 0x8400000. This is a *terrible* place for it because accessing
-** the flash at this location causes the A22 address line to be high
-** (that's what 0x8400000 binary's ought to be). But this is the highest
-** order address line on the raw flash devices themselves!!
-** This causes the top HALF of the flash to be accessed first. Beyond
-** the physical limits of the flash, the flash chip aliases over (to
-** 0x880000 which causes the bottom half to be accessed. This splits the
-** flash into two and inverts it! If you then try to access this from another
-** program that does NOT do this insanity, then you *will* access the
-** first half of the flash, but not find what you expect there. That
-** stuff is in the *second* half! Similarly, the address used by the
-** BIOS for the second FLASH bank is also quite a bad choice.
-** If REPROGRAM_PAR is defined below (the default), then this driver will
-** choose more useful addresses for the FLASH banks by reprogramming the
-** responsible PARxx registers in the SC520's MMCR region. This will
-** cause the settings to be incompatible with the BIOS's settings, which
-** shouldn't be a problem since you are running Linux, (i.e. the BIOS is
-** not much use anyway). However, if you need to be compatible with
-** the BIOS for some reason, just undefine REPROGRAM_PAR.
-*/
-#define REPROGRAM_PAR
-
-
-
-#ifdef REPROGRAM_PAR
-
-/* These are the addresses we want.. */
-#define WINDOW_ADDR_0 0x08800000
-#define WINDOW_ADDR_1 0x09000000
-#define WINDOW_ADDR_2 0x09800000
-
-/* .. and these are the addresses the BIOS gives us */
-#define WINDOW_ADDR_0_BIOS 0x08400000
-#define WINDOW_ADDR_1_BIOS 0x08c00000
-#define WINDOW_ADDR_2_BIOS 0x09400000
-
-#else
-
-#define WINDOW_ADDR_0 0x08400000
-#define WINDOW_ADDR_1 0x08C00000
-#define WINDOW_ADDR_2 0x09400000
-
-#endif
-
-#define WINDOW_SIZE_0 0x00800000
-#define WINDOW_SIZE_1 0x00800000
-#define WINDOW_SIZE_2 0x00080000
-
-
-static struct map_info sc520cdp_map[] = {
- {
- .name = "SC520CDP Flash Bank #0",
- .size = WINDOW_SIZE_0,
- .bankwidth = 4,
- .phys = WINDOW_ADDR_0
- },
- {
- .name = "SC520CDP Flash Bank #1",
- .size = WINDOW_SIZE_1,
- .bankwidth = 4,
- .phys = WINDOW_ADDR_1
- },
- {
- .name = "SC520CDP DIL Flash",
- .size = WINDOW_SIZE_2,
- .bankwidth = 1,
- .phys = WINDOW_ADDR_2
- },
-};
-
-#define NUM_FLASH_BANKS ARRAY_SIZE(sc520cdp_map)
-
-static struct mtd_info *mymtd[NUM_FLASH_BANKS];
-static struct mtd_info *merged_mtd;
-
-#ifdef REPROGRAM_PAR
-
-/*
-** The SC520 MMCR (memory mapped control register) region resides
-** at 0xFFFEF000. The 16 Programmable Address Region (PAR) registers
-** are at offset 0x88 in the MMCR:
-*/
-#define SC520_MMCR_BASE 0xFFFEF000
-#define SC520_MMCR_EXTENT 0x1000
-#define SC520_PAR(x) ((0x88/sizeof(unsigned long)) + (x))
-#define NUM_SC520_PAR 16 /* total number of PAR registers */
-
-/*
-** The highest three bits in a PAR register determine what target
-** device is controlled by this PAR. Here, only ROMCS? and BOOTCS
-** devices are of interest.
-*/
-#define SC520_PAR_BOOTCS (0x4<<29)
-#define SC520_PAR_ROMCS0 (0x5<<29)
-#define SC520_PAR_ROMCS1 (0x6<<29)
-#define SC520_PAR_TRGDEV (0x7<<29)
-
-/*
-** Bits 28 thru 26 determine some attributes for the
-** region controlled by the PAR. (We only use non-cacheable)
-*/
-#define SC520_PAR_WRPROT (1<<26) /* write protected */
-#define SC520_PAR_NOCACHE (1<<27) /* non-cacheable */
-#define SC520_PAR_NOEXEC (1<<28) /* code execution denied */
-
-
-/*
-** Bit 25 determines the granularity: 4K or 64K
-*/
-#define SC520_PAR_PG_SIZ4 (0<<25)
-#define SC520_PAR_PG_SIZ64 (1<<25)
-
-/*
-** Build a value to be written into a PAR register.
-** We only need ROM entries, 64K page size:
-*/
-#define SC520_PAR_ENTRY(trgdev, address, size) \
- ((trgdev) | SC520_PAR_NOCACHE | SC520_PAR_PG_SIZ64 | \
- (address) >> 16 | (((size) >> 16) - 1) << 14)
-
-struct sc520_par_table
-{
- unsigned long trgdev;
- unsigned long new_par;
- unsigned long default_address;
-};
-
-static const struct sc520_par_table par_table[NUM_FLASH_BANKS] =
-{
- { /* Flash Bank #0: selected by ROMCS0 */
- SC520_PAR_ROMCS0,
- SC520_PAR_ENTRY(SC520_PAR_ROMCS0, WINDOW_ADDR_0, WINDOW_SIZE_0),
- WINDOW_ADDR_0_BIOS
- },
- { /* Flash Bank #1: selected by ROMCS1 */
- SC520_PAR_ROMCS1,
- SC520_PAR_ENTRY(SC520_PAR_ROMCS1, WINDOW_ADDR_1, WINDOW_SIZE_1),
- WINDOW_ADDR_1_BIOS
- },
- { /* DIL (BIOS) Flash: selected by BOOTCS */
- SC520_PAR_BOOTCS,
- SC520_PAR_ENTRY(SC520_PAR_BOOTCS, WINDOW_ADDR_2, WINDOW_SIZE_2),
- WINDOW_ADDR_2_BIOS
- }
-};
-
-
-static void sc520cdp_setup_par(void)
-{
- unsigned long __iomem *mmcr;
- unsigned long mmcr_val;
- int i, j;
-
- /* map in SC520's MMCR area */
- mmcr = ioremap(SC520_MMCR_BASE, SC520_MMCR_EXTENT);
- if(!mmcr) { /* ioremap failed: skip the PAR reprogramming */
- /* force physical address fields to BIOS defaults: */
- for(i = 0; i < NUM_FLASH_BANKS; i++)
- sc520cdp_map[i].phys = par_table[i].default_address;
- return;
- }
-
- /*
- ** Find the PARxx registers that are responsible for activating
- ** ROMCS0, ROMCS1 and BOOTCS. Reprogram each of these with a
- ** new value from the table.
- */
- for(i = 0; i < NUM_FLASH_BANKS; i++) { /* for each par_table entry */
- for(j = 0; j < NUM_SC520_PAR; j++) { /* for each PAR register */
- mmcr_val = readl(&mmcr[SC520_PAR(j)]);
- /* if target device field matches, reprogram the PAR */
- if((mmcr_val & SC520_PAR_TRGDEV) == par_table[i].trgdev)
- {
- writel(par_table[i].new_par, &mmcr[SC520_PAR(j)]);
- break;
- }
- }
- if(j == NUM_SC520_PAR)
- { /* no matching PAR found: try default BIOS address */
- printk(KERN_NOTICE "Could not find PAR responsible for %s\n",
- sc520cdp_map[i].name);
- printk(KERN_NOTICE "Trying default address 0x%lx\n",
- par_table[i].default_address);
- sc520cdp_map[i].phys = par_table[i].default_address;
- }
- }
- iounmap(mmcr);
-}
-#endif
-
-
-static int __init init_sc520cdp(void)
-{
- int i, j, devices_found = 0;
-
-#ifdef REPROGRAM_PAR
- /* reprogram PAR registers so flash appears at the desired addresses */
- sc520cdp_setup_par();
-#endif
-
- for (i = 0; i < NUM_FLASH_BANKS; i++) {
- printk(KERN_NOTICE "SC520 CDP flash device: 0x%Lx at 0x%Lx\n",
- (unsigned long long)sc520cdp_map[i].size,
- (unsigned long long)sc520cdp_map[i].phys);
-
- sc520cdp_map[i].virt = ioremap(sc520cdp_map[i].phys, sc520cdp_map[i].size);
-
- if (!sc520cdp_map[i].virt) {
- printk("Failed to ioremap\n");
- for (j = 0; j < i; j++) {
- if (mymtd[j]) {
- map_destroy(mymtd[j]);
- iounmap(sc520cdp_map[j].virt);
- }
- }
- return -EIO;
- }
-
- simple_map_init(&sc520cdp_map[i]);
-
- mymtd[i] = do_map_probe("cfi_probe", &sc520cdp_map[i]);
- if(!mymtd[i])
- mymtd[i] = do_map_probe("jedec_probe", &sc520cdp_map[i]);
- if(!mymtd[i])
- mymtd[i] = do_map_probe("map_rom", &sc520cdp_map[i]);
-
- if (mymtd[i]) {
- mymtd[i]->owner = THIS_MODULE;
- ++devices_found;
- }
- else {
- iounmap(sc520cdp_map[i].virt);
- }
- }
- if(devices_found >= 2) {
- /* Combine the two flash banks into a single MTD device & register it: */
- merged_mtd = mtd_concat_create(mymtd, 2, "SC520CDP Flash Banks #0 and #1");
- if(merged_mtd)
- mtd_device_register(merged_mtd, NULL, 0);
- }
- if(devices_found == 3) /* register the third (DIL-Flash) device */
- mtd_device_register(mymtd[2], NULL, 0);
- return(devices_found ? 0 : -ENXIO);
-}
-
-static void __exit cleanup_sc520cdp(void)
-{
- int i;
-
- if (merged_mtd) {
- mtd_device_unregister(merged_mtd);
- mtd_concat_destroy(merged_mtd);
- }
- if (mymtd[2])
- mtd_device_unregister(mymtd[2]);
-
- for (i = 0; i < NUM_FLASH_BANKS; i++) {
- if (mymtd[i])
- map_destroy(mymtd[i]);
- if (sc520cdp_map[i].virt) {
- iounmap(sc520cdp_map[i].virt);
- sc520cdp_map[i].virt = NULL;
- }
- }
-}
-
-module_init(init_sc520cdp);
-module_exit(cleanup_sc520cdp);
-
-MODULE_LICENSE("GPL");
-MODULE_AUTHOR("Sysgo Real-Time Solutions GmbH");
-MODULE_DESCRIPTION("MTD map driver for AMD SC520 Customer Development Platform");
--
2.54.0
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 5/8] gpio: ts5500: Remove gpio driver as board no longer supported
2026-05-06 14:42 [PATCH 0/8] Remove remaining AMD Elan drivers Sean Young
` (3 preceding siblings ...)
2026-05-06 14:42 ` Sean Young
@ 2026-05-06 14:42 ` Sean Young
2026-05-07 8:06 ` Bartosz Golaszewski
2026-05-06 14:42 ` [PATCH 6/8] watchdog: sc520: Drop AMD Elan SC520 support Sean Young
` (3 subsequent siblings)
8 siblings, 1 reply; 20+ messages in thread
From: Sean Young @ 2026-05-06 14:42 UTC (permalink / raw)
To: linux-kernel, Linus Walleij, Bartosz Golaszewski; +Cc: linux-gpio
Since commit 8b793a92d862 ("x86/cpu: Remove M486/M486SX/ELAN support"),
this board is no longer supported. Remove the gpio driver too.
Signed-off-by: Sean Young <sean@mess.org>
---
drivers/gpio/Kconfig | 9 -
drivers/gpio/Makefile | 1 -
drivers/gpio/gpio-ts5500.c | 446 -------------------------------------
3 files changed, 456 deletions(-)
delete mode 100644 drivers/gpio/gpio-ts5500.c
diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig
index 020e51e30317..359a21cb093e 100644
--- a/drivers/gpio/Kconfig
+++ b/drivers/gpio/Kconfig
@@ -1093,15 +1093,6 @@ config GPIO_SCH311X
To compile this driver as a module, choose M here: the module will
be called gpio-sch311x.
-config GPIO_TS5500
- tristate "TS-5500 DIO blocks and compatibles"
- depends on TS5500 || COMPILE_TEST
- help
- This driver supports Digital I/O exposed by pin blocks found on some
- Technologic Systems platforms. It includes, but is not limited to, 3
- blocks of the TS-5500: DIO1, DIO2 and the LCD port, and the TS-5600
- LCD port.
-
config GPIO_WINBOND
tristate "Winbond Super I/O GPIO support"
select ISA_BUS_API
diff --git a/drivers/gpio/Makefile b/drivers/gpio/Makefile
index b267598b517d..dc9d1106e75f 100644
--- a/drivers/gpio/Makefile
+++ b/drivers/gpio/Makefile
@@ -194,7 +194,6 @@ obj-$(CONFIG_GPIO_TPS68470) += gpio-tps68470.o
obj-$(CONFIG_GPIO_TQMX86) += gpio-tqmx86.o
obj-$(CONFIG_GPIO_TS4800) += gpio-ts4800.o
obj-$(CONFIG_GPIO_TS4900) += gpio-ts4900.o
-obj-$(CONFIG_GPIO_TS5500) += gpio-ts5500.o
obj-$(CONFIG_GPIO_TWL4030) += gpio-twl4030.o
obj-$(CONFIG_GPIO_TWL6040) += gpio-twl6040.o
obj-$(CONFIG_GPIO_UNIPHIER) += gpio-uniphier.o
diff --git a/drivers/gpio/gpio-ts5500.c b/drivers/gpio/gpio-ts5500.c
deleted file mode 100644
index 3c7f2efe10fd..000000000000
--- a/drivers/gpio/gpio-ts5500.c
+++ /dev/null
@@ -1,446 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Digital I/O driver for Technologic Systems TS-5500
- *
- * Copyright (c) 2012 Savoir-faire Linux Inc.
- * Vivien Didelot <vivien.didelot@savoirfairelinux.com>
- *
- * Technologic Systems platforms have pin blocks, exposing several Digital
- * Input/Output lines (DIO). This driver aims to support single pin blocks.
- * In that sense, the support is not limited to the TS-5500 blocks.
- * Actually, the following platforms have DIO support:
- *
- * TS-5500:
- * Documentation: https://docs.embeddedts.com/TS-5500
- * Blocks: DIO1, DIO2 and LCD port.
- *
- * TS-5600:
- * Documentation: https://docs.embeddedts.com/TS-5600
- * Blocks: LCD port (identical to TS-5500 LCD).
- */
-
-#include <linux/bitops.h>
-#include <linux/gpio/driver.h>
-#include <linux/io.h>
-#include <linux/module.h>
-#include <linux/platform_device.h>
-#include <linux/slab.h>
-
-/* List of supported Technologic Systems platforms DIO blocks */
-enum ts5500_blocks { TS5500_DIO1, TS5500_DIO2, TS5500_LCD, TS5600_LCD };
-
-struct ts5500_priv {
- const struct ts5500_dio *pinout;
- struct gpio_chip gpio_chip;
- spinlock_t lock;
- bool strap;
- u8 hwirq;
-};
-
-/*
- * Hex 7D is used to control several blocks (e.g. DIO2 and LCD port).
- * This flag ensures that the region has been requested by this driver.
- */
-static bool hex7d_reserved;
-
-/*
- * This structure is used to describe capabilities of DIO lines,
- * such as available directions and connected interrupt (if any).
- */
-struct ts5500_dio {
- const u8 value_addr;
- const u8 value_mask;
- const u8 control_addr;
- const u8 control_mask;
- const bool no_input;
- const bool no_output;
- const u8 irq;
-};
-
-#define TS5500_DIO_IN_OUT(vaddr, vbit, caddr, cbit) \
- { \
- .value_addr = vaddr, \
- .value_mask = BIT(vbit), \
- .control_addr = caddr, \
- .control_mask = BIT(cbit), \
- }
-
-#define TS5500_DIO_IN(addr, bit) \
- { \
- .value_addr = addr, \
- .value_mask = BIT(bit), \
- .no_output = true, \
- }
-
-#define TS5500_DIO_IN_IRQ(addr, bit, _irq) \
- { \
- .value_addr = addr, \
- .value_mask = BIT(bit), \
- .no_output = true, \
- .irq = _irq, \
- }
-
-#define TS5500_DIO_OUT(addr, bit) \
- { \
- .value_addr = addr, \
- .value_mask = BIT(bit), \
- .no_input = true, \
- }
-
-/*
- * Input/Output DIO lines are programmed in groups of 4. Their values are
- * available through 4 consecutive bits in a value port, whereas the direction
- * of these 4 lines is driven by only 1 bit in a control port.
- */
-#define TS5500_DIO_GROUP(vaddr, vbitfrom, caddr, cbit) \
- TS5500_DIO_IN_OUT(vaddr, vbitfrom + 0, caddr, cbit), \
- TS5500_DIO_IN_OUT(vaddr, vbitfrom + 1, caddr, cbit), \
- TS5500_DIO_IN_OUT(vaddr, vbitfrom + 2, caddr, cbit), \
- TS5500_DIO_IN_OUT(vaddr, vbitfrom + 3, caddr, cbit)
-
-/*
- * TS-5500 DIO1 block
- *
- * value control dir hw
- * addr bit addr bit in out irq name pin offset
- *
- * 0x7b 0 0x7a 0 x x DIO1_0 1 0
- * 0x7b 1 0x7a 0 x x DIO1_1 3 1
- * 0x7b 2 0x7a 0 x x DIO1_2 5 2
- * 0x7b 3 0x7a 0 x x DIO1_3 7 3
- * 0x7b 4 0x7a 1 x x DIO1_4 9 4
- * 0x7b 5 0x7a 1 x x DIO1_5 11 5
- * 0x7b 6 0x7a 1 x x DIO1_6 13 6
- * 0x7b 7 0x7a 1 x x DIO1_7 15 7
- * 0x7c 0 0x7a 5 x x DIO1_8 4 8
- * 0x7c 1 0x7a 5 x x DIO1_9 6 9
- * 0x7c 2 0x7a 5 x x DIO1_10 8 10
- * 0x7c 3 0x7a 5 x x DIO1_11 10 11
- * 0x7c 4 x DIO1_12 12 12
- * 0x7c 5 x 7 DIO1_13 14 13
- */
-static const struct ts5500_dio ts5500_dio1[] = {
- TS5500_DIO_GROUP(0x7b, 0, 0x7a, 0),
- TS5500_DIO_GROUP(0x7b, 4, 0x7a, 1),
- TS5500_DIO_GROUP(0x7c, 0, 0x7a, 5),
- TS5500_DIO_IN(0x7c, 4),
- TS5500_DIO_IN_IRQ(0x7c, 5, 7),
-};
-
-/*
- * TS-5500 DIO2 block
- *
- * value control dir hw
- * addr bit addr bit in out irq name pin offset
- *
- * 0x7e 0 0x7d 0 x x DIO2_0 1 0
- * 0x7e 1 0x7d 0 x x DIO2_1 3 1
- * 0x7e 2 0x7d 0 x x DIO2_2 5 2
- * 0x7e 3 0x7d 0 x x DIO2_3 7 3
- * 0x7e 4 0x7d 1 x x DIO2_4 9 4
- * 0x7e 5 0x7d 1 x x DIO2_5 11 5
- * 0x7e 6 0x7d 1 x x DIO2_6 13 6
- * 0x7e 7 0x7d 1 x x DIO2_7 15 7
- * 0x7f 0 0x7d 5 x x DIO2_8 4 8
- * 0x7f 1 0x7d 5 x x DIO2_9 6 9
- * 0x7f 2 0x7d 5 x x DIO2_10 8 10
- * 0x7f 3 0x7d 5 x x DIO2_11 10 11
- * 0x7f 4 x 6 DIO2_13 14 12
- */
-static const struct ts5500_dio ts5500_dio2[] = {
- TS5500_DIO_GROUP(0x7e, 0, 0x7d, 0),
- TS5500_DIO_GROUP(0x7e, 4, 0x7d, 1),
- TS5500_DIO_GROUP(0x7f, 0, 0x7d, 5),
- TS5500_DIO_IN_IRQ(0x7f, 4, 6),
-};
-
-/*
- * TS-5500 LCD port used as DIO block
- * TS-5600 LCD port is identical
- *
- * value control dir hw
- * addr bit addr bit in out irq name pin offset
- *
- * 0x72 0 0x7d 2 x x LCD_0 8 0
- * 0x72 1 0x7d 2 x x LCD_1 7 1
- * 0x72 2 0x7d 2 x x LCD_2 10 2
- * 0x72 3 0x7d 2 x x LCD_3 9 3
- * 0x72 4 0x7d 3 x x LCD_4 12 4
- * 0x72 5 0x7d 3 x x LCD_5 11 5
- * 0x72 6 0x7d 3 x x LCD_6 14 6
- * 0x72 7 0x7d 3 x x LCD_7 13 7
- * 0x73 0 x LCD_EN 5 8
- * 0x73 6 x LCD_WR 6 9
- * 0x73 7 x 1 LCD_RS 3 10
- */
-static const struct ts5500_dio ts5500_lcd[] = {
- TS5500_DIO_GROUP(0x72, 0, 0x7d, 2),
- TS5500_DIO_GROUP(0x72, 4, 0x7d, 3),
- TS5500_DIO_OUT(0x73, 0),
- TS5500_DIO_IN(0x73, 6),
- TS5500_DIO_IN_IRQ(0x73, 7, 1),
-};
-
-static inline void ts5500_set_mask(u8 mask, u8 addr)
-{
- u8 val = inb(addr);
- val |= mask;
- outb(val, addr);
-}
-
-static inline void ts5500_clear_mask(u8 mask, u8 addr)
-{
- u8 val = inb(addr);
- val &= ~mask;
- outb(val, addr);
-}
-
-static int ts5500_gpio_input(struct gpio_chip *chip, unsigned offset)
-{
- struct ts5500_priv *priv = gpiochip_get_data(chip);
- const struct ts5500_dio line = priv->pinout[offset];
- unsigned long flags;
-
- if (line.no_input)
- return -ENXIO;
-
- if (line.no_output)
- return 0;
-
- spin_lock_irqsave(&priv->lock, flags);
- ts5500_clear_mask(line.control_mask, line.control_addr);
- spin_unlock_irqrestore(&priv->lock, flags);
-
- return 0;
-}
-
-static int ts5500_gpio_get(struct gpio_chip *chip, unsigned offset)
-{
- struct ts5500_priv *priv = gpiochip_get_data(chip);
- const struct ts5500_dio line = priv->pinout[offset];
-
- return !!(inb(line.value_addr) & line.value_mask);
-}
-
-static int ts5500_gpio_output(struct gpio_chip *chip, unsigned offset, int val)
-{
- struct ts5500_priv *priv = gpiochip_get_data(chip);
- const struct ts5500_dio line = priv->pinout[offset];
- unsigned long flags;
-
- if (line.no_output)
- return -ENXIO;
-
- spin_lock_irqsave(&priv->lock, flags);
- if (!line.no_input)
- ts5500_set_mask(line.control_mask, line.control_addr);
-
- if (val)
- ts5500_set_mask(line.value_mask, line.value_addr);
- else
- ts5500_clear_mask(line.value_mask, line.value_addr);
- spin_unlock_irqrestore(&priv->lock, flags);
-
- return 0;
-}
-
-static int ts5500_gpio_set(struct gpio_chip *chip, unsigned offset, int val)
-{
- struct ts5500_priv *priv = gpiochip_get_data(chip);
- const struct ts5500_dio line = priv->pinout[offset];
- unsigned long flags;
-
- spin_lock_irqsave(&priv->lock, flags);
- if (val)
- ts5500_set_mask(line.value_mask, line.value_addr);
- else
- ts5500_clear_mask(line.value_mask, line.value_addr);
- spin_unlock_irqrestore(&priv->lock, flags);
-
- return 0;
-}
-
-static int ts5500_gpio_to_irq(struct gpio_chip *chip, unsigned offset)
-{
- struct ts5500_priv *priv = gpiochip_get_data(chip);
- const struct ts5500_dio *block = priv->pinout;
- const struct ts5500_dio line = block[offset];
-
- /* Only one pin is connected to an interrupt */
- if (line.irq)
- return line.irq;
-
- /* As this pin is input-only, we may strap it to another in/out pin */
- if (priv->strap)
- return priv->hwirq;
-
- return -ENXIO;
-}
-
-static int ts5500_enable_irq(struct ts5500_priv *priv)
-{
- int ret = 0;
- unsigned long flags;
-
- spin_lock_irqsave(&priv->lock, flags);
- if (priv->hwirq == 7)
- ts5500_set_mask(BIT(7), 0x7a); /* DIO1_13 on IRQ7 */
- else if (priv->hwirq == 6)
- ts5500_set_mask(BIT(7), 0x7d); /* DIO2_13 on IRQ6 */
- else if (priv->hwirq == 1)
- ts5500_set_mask(BIT(6), 0x7d); /* LCD_RS on IRQ1 */
- else
- ret = -EINVAL;
- spin_unlock_irqrestore(&priv->lock, flags);
-
- return ret;
-}
-
-static void ts5500_disable_irq(struct ts5500_priv *priv)
-{
- unsigned long flags;
-
- spin_lock_irqsave(&priv->lock, flags);
- if (priv->hwirq == 7)
- ts5500_clear_mask(BIT(7), 0x7a); /* DIO1_13 on IRQ7 */
- else if (priv->hwirq == 6)
- ts5500_clear_mask(BIT(7), 0x7d); /* DIO2_13 on IRQ6 */
- else if (priv->hwirq == 1)
- ts5500_clear_mask(BIT(6), 0x7d); /* LCD_RS on IRQ1 */
- else
- dev_err(priv->gpio_chip.parent, "invalid hwirq %d\n",
- priv->hwirq);
- spin_unlock_irqrestore(&priv->lock, flags);
-}
-
-static int ts5500_dio_probe(struct platform_device *pdev)
-{
- enum ts5500_blocks block = platform_get_device_id(pdev)->driver_data;
- struct device *dev = &pdev->dev;
- const char *name = dev_name(dev);
- struct ts5500_priv *priv;
- unsigned long flags;
- int ret;
-
- ret = platform_get_irq(pdev, 0);
- if (ret < 0)
- return ret;
-
- priv = devm_kzalloc(dev, sizeof(struct ts5500_priv), GFP_KERNEL);
- if (!priv)
- return -ENOMEM;
-
- platform_set_drvdata(pdev, priv);
- priv->hwirq = ret;
- spin_lock_init(&priv->lock);
-
- priv->gpio_chip.owner = THIS_MODULE;
- priv->gpio_chip.label = name;
- priv->gpio_chip.parent = dev;
- priv->gpio_chip.direction_input = ts5500_gpio_input;
- priv->gpio_chip.direction_output = ts5500_gpio_output;
- priv->gpio_chip.get = ts5500_gpio_get;
- priv->gpio_chip.set = ts5500_gpio_set;
- priv->gpio_chip.to_irq = ts5500_gpio_to_irq;
- priv->gpio_chip.base = -1;
-
- switch (block) {
- case TS5500_DIO1:
- priv->pinout = ts5500_dio1;
- priv->gpio_chip.ngpio = ARRAY_SIZE(ts5500_dio1);
-
- if (!devm_request_region(dev, 0x7a, 3, name)) {
- dev_err(dev, "failed to request %s ports\n", name);
- return -EBUSY;
- }
- break;
- case TS5500_DIO2:
- priv->pinout = ts5500_dio2;
- priv->gpio_chip.ngpio = ARRAY_SIZE(ts5500_dio2);
-
- if (!devm_request_region(dev, 0x7e, 2, name)) {
- dev_err(dev, "failed to request %s ports\n", name);
- return -EBUSY;
- }
-
- if (hex7d_reserved)
- break;
-
- if (!devm_request_region(dev, 0x7d, 1, name)) {
- dev_err(dev, "failed to request %s 7D\n", name);
- return -EBUSY;
- }
-
- hex7d_reserved = true;
- break;
- case TS5500_LCD:
- case TS5600_LCD:
- priv->pinout = ts5500_lcd;
- priv->gpio_chip.ngpio = ARRAY_SIZE(ts5500_lcd);
-
- if (!devm_request_region(dev, 0x72, 2, name)) {
- dev_err(dev, "failed to request %s ports\n", name);
- return -EBUSY;
- }
-
- if (!hex7d_reserved) {
- if (!devm_request_region(dev, 0x7d, 1, name)) {
- dev_err(dev, "failed to request %s 7D\n", name);
- return -EBUSY;
- }
-
- hex7d_reserved = true;
- }
-
- /* Ensure usage of LCD port as DIO */
- spin_lock_irqsave(&priv->lock, flags);
- ts5500_clear_mask(BIT(4), 0x7d);
- spin_unlock_irqrestore(&priv->lock, flags);
- break;
- }
-
- ret = devm_gpiochip_add_data(dev, &priv->gpio_chip, priv);
- if (ret) {
- dev_err(dev, "failed to register the gpio chip\n");
- return ret;
- }
-
- ret = ts5500_enable_irq(priv);
- if (ret) {
- dev_err(dev, "invalid interrupt %d\n", priv->hwirq);
- return ret;
- }
-
- return 0;
-}
-
-static void ts5500_dio_remove(struct platform_device *pdev)
-{
- struct ts5500_priv *priv = platform_get_drvdata(pdev);
-
- ts5500_disable_irq(priv);
-}
-
-static const struct platform_device_id ts5500_dio_ids[] = {
- { "ts5500-dio1", TS5500_DIO1 },
- { "ts5500-dio2", TS5500_DIO2 },
- { "ts5500-dio-lcd", TS5500_LCD },
- { "ts5600-dio-lcd", TS5600_LCD },
- { }
-};
-MODULE_DEVICE_TABLE(platform, ts5500_dio_ids);
-
-static struct platform_driver ts5500_dio_driver = {
- .driver = {
- .name = "ts5500-dio",
- },
- .probe = ts5500_dio_probe,
- .remove = ts5500_dio_remove,
- .id_table = ts5500_dio_ids,
-};
-
-module_platform_driver(ts5500_dio_driver);
-
-MODULE_LICENSE("GPL");
-MODULE_AUTHOR("Savoir-faire Linux Inc. <kernel@savoirfairelinux.com>");
-MODULE_DESCRIPTION("Technologic Systems TS-5500 Digital I/O driver");
--
2.54.0
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 6/8] watchdog: sc520: Drop AMD Elan SC520 support
2026-05-06 14:42 [PATCH 0/8] Remove remaining AMD Elan drivers Sean Young
` (4 preceding siblings ...)
2026-05-06 14:42 ` [PATCH 5/8] gpio: ts5500: Remove gpio driver as board " Sean Young
@ 2026-05-06 14:42 ` Sean Young
2026-05-06 14:51 ` Guenter Roeck
2026-05-06 14:42 ` [PATCH 7/8] cpufreq: sc520_freq: Drop support for AMD Elan SC520 Sean Young
` (2 subsequent siblings)
8 siblings, 1 reply; 20+ messages in thread
From: Sean Young @ 2026-05-06 14:42 UTC (permalink / raw)
To: linux-kernel, Wim Van Sebroeck, Guenter Roeck, Jonathan Corbet,
Shuah Khan
Cc: linux-watchdog, linux-doc
Since commit 8b793a92d862 ("x86/cpu: Remove M486/M486SX/ELAN support"),
this board is no longer supported. Remove the watchdog too.
Signed-off-by: Sean Young <sean@mess.org>
---
.../watchdog/watchdog-parameters.rst | 9 -
drivers/watchdog/Kconfig | 13 -
drivers/watchdog/Makefile | 1 -
drivers/watchdog/sc520_wdt.c | 430 ------------------
4 files changed, 453 deletions(-)
delete mode 100644 drivers/watchdog/sc520_wdt.c
diff --git a/Documentation/watchdog/watchdog-parameters.rst b/Documentation/watchdog/watchdog-parameters.rst
index 773241ed9986..638b972e0b16 100644
--- a/Documentation/watchdog/watchdog-parameters.rst
+++ b/Documentation/watchdog/watchdog-parameters.rst
@@ -532,15 +532,6 @@ sc1200wdt:
-------------------------------------------------
-sc520_wdt:
- timeout:
- Watchdog timeout in seconds. (1 <= timeout <= 3600, default=30)
- nowayout:
- Watchdog cannot be stopped once started
- (default=kernel config parameter)
-
--------------------------------------------------
-
sch311x_wdt:
force_id:
Override the detected device ID
diff --git a/drivers/watchdog/Kconfig b/drivers/watchdog/Kconfig
index dc78729ba2a5..4e36e4b5bf39 100644
--- a/drivers/watchdog/Kconfig
+++ b/drivers/watchdog/Kconfig
@@ -1270,19 +1270,6 @@ config GEODE_WDT
You can compile this driver directly into the kernel, or use
it as a module. The module will be called geodewdt.
-config SC520_WDT
- tristate "AMD Elan SC520 processor Watchdog"
- depends on MELAN || COMPILE_TEST
- help
- This is the driver for the hardware watchdog built in to the
- AMD "Elan" SC520 microcomputer commonly used in embedded systems.
- This watchdog simply watches your kernel to make sure it doesn't
- freeze, and if it does, it reboots your computer after a certain
- amount of time.
-
- You can compile this driver directly into the kernel, or use
- it as a module. The module will be called sc520_wdt.
-
config SBC_FITPC2_WATCHDOG
tristate "Compulab SBC-FITPC2 watchdog"
depends on (X86 || COMPILE_TEST) && HAS_IOPORT
diff --git a/drivers/watchdog/Makefile b/drivers/watchdog/Makefile
index d2fb16b9f9ce..1daeab5b2473 100644
--- a/drivers/watchdog/Makefile
+++ b/drivers/watchdog/Makefile
@@ -116,7 +116,6 @@ obj-$(CONFIG_EXAR_WDT) += exar_wdt.o
obj-$(CONFIG_F71808E_WDT) += f71808e_wdt.o
obj-$(CONFIG_SP5100_TCO) += sp5100_tco.o
obj-$(CONFIG_GEODE_WDT) += geodewdt.o
-obj-$(CONFIG_SC520_WDT) += sc520_wdt.o
obj-$(CONFIG_SBC_FITPC2_WATCHDOG) += sbc_fitpc2_wdt.o
obj-$(CONFIG_EUROTECH_WDT) += eurotechwdt.o
obj-$(CONFIG_IB700_WDT) += ib700wdt.o
diff --git a/drivers/watchdog/sc520_wdt.c b/drivers/watchdog/sc520_wdt.c
deleted file mode 100644
index 005f62e4a4fb..000000000000
--- a/drivers/watchdog/sc520_wdt.c
+++ /dev/null
@@ -1,430 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-or-later
-/*
- * AMD Elan SC520 processor Watchdog Timer driver
- *
- * Based on acquirewdt.c by Alan Cox,
- * and sbc60xxwdt.c by Jakob Oestergaard <jakob@unthought.net>
- *
- * The authors do NOT admit liability nor provide warranty for
- * any of this software. This material is provided "AS-IS" in
- * the hope that it may be useful for others.
- *
- * (c) Copyright 2001 Scott Jennings <linuxdrivers@oro.net>
- * 9/27 - 2001 [Initial release]
- *
- * Additional fixes Alan Cox
- * - Fixed formatting
- * - Removed debug printks
- * - Fixed SMP built kernel deadlock
- * - Switched to private locks not lock_kernel
- * - Used ioremap/writew/readw
- * - Added NOWAYOUT support
- * 4/12 - 2002 Changes by Rob Radez <rob@osinvestor.com>
- * - Change comments
- * - Eliminate fop_llseek
- * - Change CONFIG_WATCHDOG_NOWAYOUT semantics
- * - Add KERN_* tags to printks
- * - fix possible wdt_is_open race
- * - Report proper capabilities in watchdog_info
- * - Add WDIOC_{GETSTATUS, GETBOOTSTATUS, SETTIMEOUT,
- * GETTIMEOUT, SETOPTIONS} ioctls
- * 09/8 - 2003 Changes by Wim Van Sebroeck <wim@iguana.be>
- * - cleanup of trailing spaces
- * - added extra printk's for startup problems
- * - use module_param
- * - made timeout (the emulated heartbeat) a module_param
- * - made the keepalive ping an internal subroutine
- * 3/27 - 2004 Changes by Sean Young <sean@mess.org>
- * - set MMCR_BASE to 0xfffef000
- * - CBAR does not need to be read
- * - removed debugging printks
- *
- * This WDT driver is different from most other Linux WDT
- * drivers in that the driver will ping the watchdog by itself,
- * because this particular WDT has a very short timeout (1.6
- * seconds) and it would be insane to count on any userspace
- * daemon always getting scheduled within that time frame.
- *
- * This driver uses memory mapped IO, and spinlock.
- */
-
-#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
-
-#include <linux/module.h>
-#include <linux/moduleparam.h>
-#include <linux/types.h>
-#include <linux/timer.h>
-#include <linux/miscdevice.h>
-#include <linux/watchdog.h>
-#include <linux/fs.h>
-#include <linux/ioport.h>
-#include <linux/notifier.h>
-#include <linux/reboot.h>
-#include <linux/init.h>
-#include <linux/jiffies.h>
-#include <linux/io.h>
-#include <linux/uaccess.h>
-
-
-/*
- * The AMD Elan SC520 timeout value is 492us times a power of 2 (0-7)
- *
- * 0: 492us 2: 1.01s 4: 4.03s 6: 16.22s
- * 1: 503ms 3: 2.01s 5: 8.05s 7: 32.21s
- *
- * We will program the SC520 watchdog for a timeout of 2.01s.
- * If we reset the watchdog every ~250ms we should be safe.
- */
-
-#define WDT_INTERVAL (HZ/4+1)
-
-/*
- * We must not require too good response from the userspace daemon.
- * Here we require the userspace daemon to send us a heartbeat
- * char to /dev/watchdog every 30 seconds.
- */
-
-#define WATCHDOG_TIMEOUT 30 /* 30 sec default timeout */
-/* in seconds, will be multiplied by HZ to get seconds to wait for a ping */
-static int timeout = WATCHDOG_TIMEOUT;
-module_param(timeout, int, 0);
-MODULE_PARM_DESC(timeout,
- "Watchdog timeout in seconds. (1 <= timeout <= 3600, default="
- __MODULE_STRING(WATCHDOG_TIMEOUT) ")");
-
-static bool nowayout = WATCHDOG_NOWAYOUT;
-module_param(nowayout, bool, 0);
-MODULE_PARM_DESC(nowayout,
- "Watchdog cannot be stopped once started (default="
- __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
-
-/*
- * AMD Elan SC520 - Watchdog Timer Registers
- */
-#define MMCR_BASE 0xfffef000 /* The default base address */
-#define OFFS_WDTMRCTL 0xCB0 /* Watchdog Timer Control Register */
-
-/* WDT Control Register bit definitions */
-#define WDT_EXP_SEL_01 0x0001 /* [01] Time-out = 496 us (with 33 Mhz clk). */
-#define WDT_EXP_SEL_02 0x0002 /* [02] Time-out = 508 ms (with 33 Mhz clk). */
-#define WDT_EXP_SEL_03 0x0004 /* [03] Time-out = 1.02 s (with 33 Mhz clk). */
-#define WDT_EXP_SEL_04 0x0008 /* [04] Time-out = 2.03 s (with 33 Mhz clk). */
-#define WDT_EXP_SEL_05 0x0010 /* [05] Time-out = 4.07 s (with 33 Mhz clk). */
-#define WDT_EXP_SEL_06 0x0020 /* [06] Time-out = 8.13 s (with 33 Mhz clk). */
-#define WDT_EXP_SEL_07 0x0040 /* [07] Time-out = 16.27s (with 33 Mhz clk). */
-#define WDT_EXP_SEL_08 0x0080 /* [08] Time-out = 32.54s (with 33 Mhz clk). */
-#define WDT_IRQ_FLG 0x1000 /* [12] Interrupt Request Flag */
-#define WDT_WRST_ENB 0x4000 /* [14] Watchdog Timer Reset Enable */
-#define WDT_ENB 0x8000 /* [15] Watchdog Timer Enable */
-
-static __u16 __iomem *wdtmrctl;
-
-static void wdt_timer_ping(struct timer_list *);
-static DEFINE_TIMER(timer, wdt_timer_ping);
-static unsigned long next_heartbeat;
-static unsigned long wdt_is_open;
-static char wdt_expect_close;
-static DEFINE_SPINLOCK(wdt_spinlock);
-
-/*
- * Whack the dog
- */
-
-static void wdt_timer_ping(struct timer_list *unused)
-{
- /* If we got a heartbeat pulse within the WDT_US_INTERVAL
- * we agree to ping the WDT
- */
- if (time_before(jiffies, next_heartbeat)) {
- /* Ping the WDT */
- spin_lock(&wdt_spinlock);
- writew(0xAAAA, wdtmrctl);
- writew(0x5555, wdtmrctl);
- spin_unlock(&wdt_spinlock);
-
- /* Re-set the timer interval */
- mod_timer(&timer, jiffies + WDT_INTERVAL);
- } else
- pr_warn("Heartbeat lost! Will not ping the watchdog\n");
-}
-
-/*
- * Utility routines
- */
-
-static void wdt_config(int writeval)
-{
- unsigned long flags;
-
- /* buy some time (ping) */
- spin_lock_irqsave(&wdt_spinlock, flags);
- readw(wdtmrctl); /* ensure write synchronization */
- writew(0xAAAA, wdtmrctl);
- writew(0x5555, wdtmrctl);
- /* unlock WDT = make WDT configuration register writable one time */
- writew(0x3333, wdtmrctl);
- writew(0xCCCC, wdtmrctl);
- /* write WDT configuration register */
- writew(writeval, wdtmrctl);
- spin_unlock_irqrestore(&wdt_spinlock, flags);
-}
-
-static int wdt_startup(void)
-{
- next_heartbeat = jiffies + (timeout * HZ);
-
- /* Start the timer */
- mod_timer(&timer, jiffies + WDT_INTERVAL);
-
- /* Start the watchdog */
- wdt_config(WDT_ENB | WDT_WRST_ENB | WDT_EXP_SEL_04);
-
- pr_info("Watchdog timer is now enabled\n");
- return 0;
-}
-
-static int wdt_turnoff(void)
-{
- /* Stop the timer */
- timer_delete_sync(&timer);
-
- /* Stop the watchdog */
- wdt_config(0);
-
- pr_info("Watchdog timer is now disabled...\n");
- return 0;
-}
-
-static int wdt_keepalive(void)
-{
- /* user land ping */
- next_heartbeat = jiffies + (timeout * HZ);
- return 0;
-}
-
-static int wdt_set_heartbeat(int t)
-{
- if ((t < 1) || (t > 3600)) /* arbitrary upper limit */
- return -EINVAL;
-
- timeout = t;
- return 0;
-}
-
-/*
- * /dev/watchdog handling
- */
-
-static ssize_t fop_write(struct file *file, const char __user *buf,
- size_t count, loff_t *ppos)
-{
- /* See if we got the magic character 'V' and reload the timer */
- if (count) {
- if (!nowayout) {
- size_t ofs;
-
- /* note: just in case someone wrote the magic character
- * five months ago... */
- wdt_expect_close = 0;
-
- /* now scan */
- for (ofs = 0; ofs != count; ofs++) {
- char c;
- if (get_user(c, buf + ofs))
- return -EFAULT;
- if (c == 'V')
- wdt_expect_close = 42;
- }
- }
-
- /* Well, anyhow someone wrote to us, we should
- return that favour */
- wdt_keepalive();
- }
- return count;
-}
-
-static int fop_open(struct inode *inode, struct file *file)
-{
- /* Just in case we're already talking to someone... */
- if (test_and_set_bit(0, &wdt_is_open))
- return -EBUSY;
- if (nowayout)
- __module_get(THIS_MODULE);
-
- /* Good, fire up the show */
- wdt_startup();
- return stream_open(inode, file);
-}
-
-static int fop_close(struct inode *inode, struct file *file)
-{
- if (wdt_expect_close == 42)
- wdt_turnoff();
- else {
- pr_crit("Unexpected close, not stopping watchdog!\n");
- wdt_keepalive();
- }
- clear_bit(0, &wdt_is_open);
- wdt_expect_close = 0;
- return 0;
-}
-
-static long fop_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
-{
- void __user *argp = (void __user *)arg;
- int __user *p = argp;
- static const struct watchdog_info ident = {
- .options = WDIOF_KEEPALIVEPING | WDIOF_SETTIMEOUT
- | WDIOF_MAGICCLOSE,
- .firmware_version = 1,
- .identity = "SC520",
- };
-
- switch (cmd) {
- case WDIOC_GETSUPPORT:
- return copy_to_user(argp, &ident, sizeof(ident)) ? -EFAULT : 0;
- case WDIOC_GETSTATUS:
- case WDIOC_GETBOOTSTATUS:
- return put_user(0, p);
- case WDIOC_SETOPTIONS:
- {
- int new_options, retval = -EINVAL;
-
- if (get_user(new_options, p))
- return -EFAULT;
-
- if (new_options & WDIOS_DISABLECARD) {
- wdt_turnoff();
- retval = 0;
- }
-
- if (new_options & WDIOS_ENABLECARD) {
- wdt_startup();
- retval = 0;
- }
-
- return retval;
- }
- case WDIOC_KEEPALIVE:
- wdt_keepalive();
- return 0;
- case WDIOC_SETTIMEOUT:
- {
- int new_timeout;
-
- if (get_user(new_timeout, p))
- return -EFAULT;
-
- if (wdt_set_heartbeat(new_timeout))
- return -EINVAL;
-
- wdt_keepalive();
- }
- fallthrough;
- case WDIOC_GETTIMEOUT:
- return put_user(timeout, p);
- default:
- return -ENOTTY;
- }
-}
-
-static const struct file_operations wdt_fops = {
- .owner = THIS_MODULE,
- .write = fop_write,
- .open = fop_open,
- .release = fop_close,
- .unlocked_ioctl = fop_ioctl,
- .compat_ioctl = compat_ptr_ioctl,
-};
-
-static struct miscdevice wdt_miscdev = {
- .minor = WATCHDOG_MINOR,
- .name = "watchdog",
- .fops = &wdt_fops,
-};
-
-/*
- * Notifier for system down
- */
-
-static int wdt_notify_sys(struct notifier_block *this, unsigned long code,
- void *unused)
-{
- if (code == SYS_DOWN || code == SYS_HALT)
- wdt_turnoff();
- return NOTIFY_DONE;
-}
-
-/*
- * The WDT needs to learn about soft shutdowns in order to
- * turn the timebomb registers off.
- */
-
-static struct notifier_block wdt_notifier = {
- .notifier_call = wdt_notify_sys,
-};
-
-static void __exit sc520_wdt_unload(void)
-{
- if (!nowayout)
- wdt_turnoff();
-
- /* Deregister */
- misc_deregister(&wdt_miscdev);
- unregister_reboot_notifier(&wdt_notifier);
- iounmap(wdtmrctl);
-}
-
-static int __init sc520_wdt_init(void)
-{
- int rc = -EBUSY;
-
- /* Check that the timeout value is within it's range ;
- if not reset to the default */
- if (wdt_set_heartbeat(timeout)) {
- wdt_set_heartbeat(WATCHDOG_TIMEOUT);
- pr_info("timeout value must be 1 <= timeout <= 3600, using %d\n",
- WATCHDOG_TIMEOUT);
- }
-
- wdtmrctl = ioremap(MMCR_BASE + OFFS_WDTMRCTL, 2);
- if (!wdtmrctl) {
- pr_err("Unable to remap memory\n");
- rc = -ENOMEM;
- goto err_out_region2;
- }
-
- rc = register_reboot_notifier(&wdt_notifier);
- if (rc) {
- pr_err("cannot register reboot notifier (err=%d)\n", rc);
- goto err_out_ioremap;
- }
-
- rc = misc_register(&wdt_miscdev);
- if (rc) {
- pr_err("cannot register miscdev on minor=%d (err=%d)\n",
- WATCHDOG_MINOR, rc);
- goto err_out_notifier;
- }
-
- pr_info("WDT driver for SC520 initialised. timeout=%d sec (nowayout=%d)\n",
- timeout, nowayout);
-
- return 0;
-
-err_out_notifier:
- unregister_reboot_notifier(&wdt_notifier);
-err_out_ioremap:
- iounmap(wdtmrctl);
-err_out_region2:
- return rc;
-}
-
-module_init(sc520_wdt_init);
-module_exit(sc520_wdt_unload);
-
-MODULE_AUTHOR("Scott and Bill Jennings");
-MODULE_DESCRIPTION(
- "Driver for watchdog timer in AMD \"Elan\" SC520 uProcessor");
-MODULE_LICENSE("GPL");
--
2.54.0
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 7/8] cpufreq: sc520_freq: Drop support for AMD Elan SC520
2026-05-06 14:42 [PATCH 0/8] Remove remaining AMD Elan drivers Sean Young
` (5 preceding siblings ...)
2026-05-06 14:42 ` [PATCH 6/8] watchdog: sc520: Drop AMD Elan SC520 support Sean Young
@ 2026-05-06 14:42 ` Sean Young
2026-05-07 4:44 ` Zhongqiu Han
2026-05-07 6:35 ` Viresh Kumar
2026-05-06 14:42 ` [PATCH 8/8] cpufreq: elanfreq: Drop support for AMD Elan SC4* Sean Young
2026-05-27 9:05 ` [PATCH 0/8] Remove remaining AMD Elan drivers Miquel Raynal
8 siblings, 2 replies; 20+ messages in thread
From: Sean Young @ 2026-05-06 14:42 UTC (permalink / raw)
To: linux-kernel, Rafael J. Wysocki, Viresh Kumar; +Cc: linux-pm
Since commit 8b793a92d862 ("x86/cpu: Remove M486/M486SX/ELAN support"),
the AMD Elan SC520 is no longer supported, so the cpu frequency
driver is no longer needed.
Signed-off-by: Sean Young <sean@mess.org>
---
drivers/cpufreq/Kconfig.x86 | 11 ---
drivers/cpufreq/Makefile | 1 -
drivers/cpufreq/sc520_freq.c | 136 -----------------------------------
3 files changed, 148 deletions(-)
delete mode 100644 drivers/cpufreq/sc520_freq.c
diff --git a/drivers/cpufreq/Kconfig.x86 b/drivers/cpufreq/Kconfig.x86
index 027e6ea2e038..865b290b01ff 100644
--- a/drivers/cpufreq/Kconfig.x86
+++ b/drivers/cpufreq/Kconfig.x86
@@ -141,17 +141,6 @@ config ELAN_CPUFREQ
If in doubt, say N.
-config SC520_CPUFREQ
- tristate "AMD Elan SC520"
- depends on MELAN
- help
- This adds the CPUFreq driver for AMD Elan SC520 processor.
-
- For details, take a look at <file:Documentation/cpu-freq/>.
-
- If in doubt, say N.
-
-
config X86_POWERNOW_K6
tristate "AMD Mobile K6-2/K6-3 PowerNow!"
depends on X86_32
diff --git a/drivers/cpufreq/Makefile b/drivers/cpufreq/Makefile
index 385c9fcc65c6..96196edf79d5 100644
--- a/drivers/cpufreq/Makefile
+++ b/drivers/cpufreq/Makefile
@@ -41,7 +41,6 @@ obj-$(CONFIG_X86_POWERNOW_K7) += powernow-k7.o
obj-$(CONFIG_X86_LONGHAUL) += longhaul.o
obj-$(CONFIG_X86_E_POWERSAVER) += e_powersaver.o
obj-$(CONFIG_ELAN_CPUFREQ) += elanfreq.o
-obj-$(CONFIG_SC520_CPUFREQ) += sc520_freq.o
obj-$(CONFIG_X86_LONGRUN) += longrun.o
obj-$(CONFIG_X86_GX_SUSPMOD) += gx-suspmod.o
obj-$(CONFIG_X86_SPEEDSTEP_ICH) += speedstep-ich.o
diff --git a/drivers/cpufreq/sc520_freq.c b/drivers/cpufreq/sc520_freq.c
deleted file mode 100644
index b360f03a116f..000000000000
--- a/drivers/cpufreq/sc520_freq.c
+++ /dev/null
@@ -1,136 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-or-later
-/*
- * sc520_freq.c: cpufreq driver for the AMD Elan sc520
- *
- * Copyright (C) 2005 Sean Young <sean@mess.org>
- *
- * Based on elanfreq.c
- *
- * 2005-03-30: - initial revision
- */
-
-#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
-
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/init.h>
-
-#include <linux/delay.h>
-#include <linux/cpufreq.h>
-#include <linux/timex.h>
-#include <linux/io.h>
-
-#include <asm/cpu_device_id.h>
-
-#define MMCR_BASE 0xfffef000 /* The default base address */
-#define OFFS_CPUCTL 0x2 /* CPU Control Register */
-
-static __u8 __iomem *cpuctl;
-
-static struct cpufreq_frequency_table sc520_freq_table[] = {
- {0, 0x01, 100000},
- {0, 0x02, 133000},
- {0, 0, CPUFREQ_TABLE_END},
-};
-
-static unsigned int sc520_freq_get_cpu_frequency(unsigned int cpu)
-{
- u8 clockspeed_reg = *cpuctl;
-
- switch (clockspeed_reg & 0x03) {
- default:
- pr_err("error: cpuctl register has unexpected value %02x\n",
- clockspeed_reg);
- fallthrough;
- case 0x01:
- return 100000;
- case 0x02:
- return 133000;
- }
-}
-
-static int sc520_freq_target(struct cpufreq_policy *policy, unsigned int state)
-{
-
- u8 clockspeed_reg;
-
- local_irq_disable();
-
- clockspeed_reg = *cpuctl & ~0x03;
- *cpuctl = clockspeed_reg | sc520_freq_table[state].driver_data;
-
- local_irq_enable();
-
- return 0;
-}
-
-/*
- * Module init and exit code
- */
-
-static int sc520_freq_cpu_init(struct cpufreq_policy *policy)
-{
- struct cpuinfo_x86 *c = &cpu_data(0);
-
- /* capability check */
- if (c->x86_vendor != X86_VENDOR_AMD ||
- c->x86 != 4 || c->x86_model != 9)
- return -ENODEV;
-
- /* cpuinfo and default policy values */
- policy->cpuinfo.transition_latency = 1000000; /* 1ms */
- policy->freq_table = sc520_freq_table;
-
- return 0;
-}
-
-
-static struct cpufreq_driver sc520_freq_driver = {
- .get = sc520_freq_get_cpu_frequency,
- .verify = cpufreq_generic_frequency_table_verify,
- .target_index = sc520_freq_target,
- .init = sc520_freq_cpu_init,
- .name = "sc520_freq",
-};
-
-static const struct x86_cpu_id sc520_ids[] = {
- X86_MATCH_VENDOR_FAM_MODEL(AMD, 4, 9, NULL),
- {}
-};
-MODULE_DEVICE_TABLE(x86cpu, sc520_ids);
-
-static int __init sc520_freq_init(void)
-{
- int err;
-
- if (!x86_match_cpu(sc520_ids))
- return -ENODEV;
-
- cpuctl = ioremap((unsigned long)(MMCR_BASE + OFFS_CPUCTL), 1);
- if (!cpuctl) {
- pr_err("sc520_freq: error: failed to remap memory\n");
- return -ENOMEM;
- }
-
- err = cpufreq_register_driver(&sc520_freq_driver);
- if (err)
- iounmap(cpuctl);
-
- return err;
-}
-
-
-static void __exit sc520_freq_exit(void)
-{
- cpufreq_unregister_driver(&sc520_freq_driver);
- iounmap(cpuctl);
-}
-
-
-MODULE_LICENSE("GPL");
-MODULE_AUTHOR("Sean Young <sean@mess.org>");
-MODULE_DESCRIPTION("cpufreq driver for AMD's Elan sc520 CPU");
-
-module_init(sc520_freq_init);
-module_exit(sc520_freq_exit);
-
--
2.54.0
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 8/8] cpufreq: elanfreq: Drop support for AMD Elan SC4*
2026-05-06 14:42 [PATCH 0/8] Remove remaining AMD Elan drivers Sean Young
` (6 preceding siblings ...)
2026-05-06 14:42 ` [PATCH 7/8] cpufreq: sc520_freq: Drop support for AMD Elan SC520 Sean Young
@ 2026-05-06 14:42 ` Sean Young
2026-05-07 4:50 ` Zhongqiu Han
2026-05-07 6:35 ` Viresh Kumar
2026-05-27 9:05 ` [PATCH 0/8] Remove remaining AMD Elan drivers Miquel Raynal
8 siblings, 2 replies; 20+ messages in thread
From: Sean Young @ 2026-05-06 14:42 UTC (permalink / raw)
To: linux-kernel, Rafael J. Wysocki, Viresh Kumar; +Cc: linux-pm
Since commit 8b793a92d862 ("x86/cpu: Remove M486/M486SX/ELAN support"),
the AMD Elan SC4* is no longer supported, so the cpu frequency
driver is no longer needed.
Signed-off-by: Sean Young <sean@mess.org>
---
drivers/cpufreq/Kconfig.x86 | 15 ---
drivers/cpufreq/Makefile | 1 -
drivers/cpufreq/elanfreq.c | 226 ------------------------------------
3 files changed, 242 deletions(-)
delete mode 100644 drivers/cpufreq/elanfreq.c
diff --git a/drivers/cpufreq/Kconfig.x86 b/drivers/cpufreq/Kconfig.x86
index 865b290b01ff..c42dd39e0b2a 100644
--- a/drivers/cpufreq/Kconfig.x86
+++ b/drivers/cpufreq/Kconfig.x86
@@ -126,21 +126,6 @@ config X86_ACPI_CPUFREQ_CPB
By enabling this option the acpi_cpufreq driver provides the old
entry in addition to the new boost ones, for compatibility reasons.
-config ELAN_CPUFREQ
- tristate "AMD Elan SC400 and SC410"
- depends on MELAN
- help
- This adds the CPUFreq driver for AMD Elan SC400 and SC410
- processors.
-
- You need to specify the processor maximum speed as boot
- parameter: elanfreq=maxspeed (in kHz) or as module
- parameter "max_freq".
-
- For details, take a look at <file:Documentation/cpu-freq/>.
-
- If in doubt, say N.
-
config X86_POWERNOW_K6
tristate "AMD Mobile K6-2/K6-3 PowerNow!"
depends on X86_32
diff --git a/drivers/cpufreq/Makefile b/drivers/cpufreq/Makefile
index 96196edf79d5..6c7a39b7f8d2 100644
--- a/drivers/cpufreq/Makefile
+++ b/drivers/cpufreq/Makefile
@@ -40,7 +40,6 @@ obj-$(CONFIG_X86_POWERNOW_K6) += powernow-k6.o
obj-$(CONFIG_X86_POWERNOW_K7) += powernow-k7.o
obj-$(CONFIG_X86_LONGHAUL) += longhaul.o
obj-$(CONFIG_X86_E_POWERSAVER) += e_powersaver.o
-obj-$(CONFIG_ELAN_CPUFREQ) += elanfreq.o
obj-$(CONFIG_X86_LONGRUN) += longrun.o
obj-$(CONFIG_X86_GX_SUSPMOD) += gx-suspmod.o
obj-$(CONFIG_X86_SPEEDSTEP_ICH) += speedstep-ich.o
diff --git a/drivers/cpufreq/elanfreq.c b/drivers/cpufreq/elanfreq.c
deleted file mode 100644
index fc5a58088b35..000000000000
--- a/drivers/cpufreq/elanfreq.c
+++ /dev/null
@@ -1,226 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-or-later
-/*
- * elanfreq: cpufreq driver for the AMD ELAN family
- *
- * (c) Copyright 2002 Robert Schwebel <r.schwebel@pengutronix.de>
- *
- * Parts of this code are (c) Sven Geggus <sven@geggus.net>
- *
- * All Rights Reserved.
- *
- * 2002-02-13: - initial revision for 2.4.18-pre9 by Robert Schwebel
- */
-
-#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
-
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/init.h>
-
-#include <linux/delay.h>
-#include <linux/cpufreq.h>
-
-#include <asm/cpu_device_id.h>
-#include <linux/timex.h>
-#include <linux/io.h>
-
-#define REG_CSCIR 0x22 /* Chip Setup and Control Index Register */
-#define REG_CSCDR 0x23 /* Chip Setup and Control Data Register */
-
-/* Module parameter */
-static int max_freq;
-
-struct s_elan_multiplier {
- int clock; /* frequency in kHz */
- int val40h; /* PMU Force Mode register */
- int val80h; /* CPU Clock Speed Register */
-};
-
-/*
- * It is important that the frequencies
- * are listed in ascending order here!
- */
-static struct s_elan_multiplier elan_multiplier[] = {
- {1000, 0x02, 0x18},
- {2000, 0x02, 0x10},
- {4000, 0x02, 0x08},
- {8000, 0x00, 0x00},
- {16000, 0x00, 0x02},
- {33000, 0x00, 0x04},
- {66000, 0x01, 0x04},
- {99000, 0x01, 0x05}
-};
-
-static struct cpufreq_frequency_table elanfreq_table[] = {
- {0, 0, 1000},
- {0, 1, 2000},
- {0, 2, 4000},
- {0, 3, 8000},
- {0, 4, 16000},
- {0, 5, 33000},
- {0, 6, 66000},
- {0, 7, 99000},
- {0, 0, CPUFREQ_TABLE_END},
-};
-
-
-/**
- * elanfreq_get_cpu_frequency: determine current cpu speed
- *
- * Finds out at which frequency the CPU of the Elan SOC runs
- * at the moment. Frequencies from 1 to 33 MHz are generated
- * the normal way, 66 and 99 MHz are called "Hyperspeed Mode"
- * and have the rest of the chip running with 33 MHz.
- */
-
-static unsigned int elanfreq_get_cpu_frequency(unsigned int cpu)
-{
- u8 clockspeed_reg; /* Clock Speed Register */
-
- local_irq_disable();
- outb_p(0x80, REG_CSCIR);
- clockspeed_reg = inb_p(REG_CSCDR);
- local_irq_enable();
-
- if ((clockspeed_reg & 0xE0) == 0xE0)
- return 0;
-
- /* Are we in CPU clock multiplied mode (66/99 MHz)? */
- if ((clockspeed_reg & 0xE0) == 0xC0) {
- if ((clockspeed_reg & 0x01) == 0)
- return 66000;
- else
- return 99000;
- }
-
- /* 33 MHz is not 32 MHz... */
- if ((clockspeed_reg & 0xE0) == 0xA0)
- return 33000;
-
- return (1<<((clockspeed_reg & 0xE0) >> 5)) * 1000;
-}
-
-
-static int elanfreq_target(struct cpufreq_policy *policy,
- unsigned int state)
-{
- /*
- * Access to the Elan's internal registers is indexed via
- * 0x22: Chip Setup & Control Register Index Register (CSCI)
- * 0x23: Chip Setup & Control Register Data Register (CSCD)
- *
- */
-
- /*
- * 0x40 is the Power Management Unit's Force Mode Register.
- * Bit 6 enables Hyperspeed Mode (66/100 MHz core frequency)
- */
-
- local_irq_disable();
- outb_p(0x40, REG_CSCIR); /* Disable hyperspeed mode */
- outb_p(0x00, REG_CSCDR);
- local_irq_enable(); /* wait till internal pipelines and */
- udelay(1000); /* buffers have cleaned up */
-
- local_irq_disable();
-
- /* now, set the CPU clock speed register (0x80) */
- outb_p(0x80, REG_CSCIR);
- outb_p(elan_multiplier[state].val80h, REG_CSCDR);
-
- /* now, the hyperspeed bit in PMU Force Mode Register (0x40) */
- outb_p(0x40, REG_CSCIR);
- outb_p(elan_multiplier[state].val40h, REG_CSCDR);
- udelay(10000);
- local_irq_enable();
-
- return 0;
-}
-/*
- * Module init and exit code
- */
-
-static int elanfreq_cpu_init(struct cpufreq_policy *policy)
-{
- struct cpuinfo_x86 *c = &cpu_data(0);
- struct cpufreq_frequency_table *pos;
-
- /* capability check */
- if ((c->x86_vendor != X86_VENDOR_AMD) ||
- (c->x86 != 4) || (c->x86_model != 10))
- return -ENODEV;
-
- /* max freq */
- if (!max_freq)
- max_freq = elanfreq_get_cpu_frequency(0);
-
- /* table init */
- cpufreq_for_each_entry(pos, elanfreq_table)
- if (pos->frequency > max_freq)
- pos->frequency = CPUFREQ_ENTRY_INVALID;
-
- policy->freq_table = elanfreq_table;
- return 0;
-}
-
-
-#ifndef MODULE
-/**
- * elanfreq_setup - elanfreq command line parameter parsing
- *
- * elanfreq command line parameter. Use:
- * elanfreq=66000
- * to set the maximum CPU frequency to 66 MHz. Note that in
- * case you do not give this boot parameter, the maximum
- * frequency will fall back to _current_ CPU frequency which
- * might be lower. If you build this as a module, use the
- * max_freq module parameter instead.
- */
-static int __init elanfreq_setup(char *str)
-{
- max_freq = simple_strtoul(str, &str, 0);
- pr_warn("You're using the deprecated elanfreq command line option. Use elanfreq.max_freq instead, please!\n");
- return 1;
-}
-__setup("elanfreq=", elanfreq_setup);
-#endif
-
-
-static struct cpufreq_driver elanfreq_driver = {
- .get = elanfreq_get_cpu_frequency,
- .flags = CPUFREQ_NO_AUTO_DYNAMIC_SWITCHING,
- .verify = cpufreq_generic_frequency_table_verify,
- .target_index = elanfreq_target,
- .init = elanfreq_cpu_init,
- .name = "elanfreq",
-};
-
-static const struct x86_cpu_id elan_id[] = {
- X86_MATCH_VENDOR_FAM_MODEL(AMD, 4, 10, NULL),
- {}
-};
-MODULE_DEVICE_TABLE(x86cpu, elan_id);
-
-static int __init elanfreq_init(void)
-{
- if (!x86_match_cpu(elan_id))
- return -ENODEV;
- return cpufreq_register_driver(&elanfreq_driver);
-}
-
-
-static void __exit elanfreq_exit(void)
-{
- cpufreq_unregister_driver(&elanfreq_driver);
-}
-
-
-module_param(max_freq, int, 0444);
-
-MODULE_LICENSE("GPL");
-MODULE_AUTHOR("Robert Schwebel <r.schwebel@pengutronix.de>, "
- "Sven Geggus <sven@geggus.net>");
-MODULE_DESCRIPTION("cpufreq driver for AMD's Elan CPUs");
-
-module_init(elanfreq_init);
-module_exit(elanfreq_exit);
--
2.54.0
^ permalink raw reply related [flat|nested] 20+ messages in thread
* Re: [PATCH 6/8] watchdog: sc520: Drop AMD Elan SC520 support
2026-05-06 14:42 ` [PATCH 6/8] watchdog: sc520: Drop AMD Elan SC520 support Sean Young
@ 2026-05-06 14:51 ` Guenter Roeck
0 siblings, 0 replies; 20+ messages in thread
From: Guenter Roeck @ 2026-05-06 14:51 UTC (permalink / raw)
To: Sean Young, linux-kernel, Wim Van Sebroeck, Jonathan Corbet,
Shuah Khan
Cc: linux-watchdog, linux-doc
On 5/6/26 07:42, Sean Young wrote:
> Since commit 8b793a92d862 ("x86/cpu: Remove M486/M486SX/ELAN support"),
> this board is no longer supported. Remove the watchdog too.
>
> Signed-off-by: Sean Young <sean@mess.org>
I already submitted the same patch yesterday and applied it to my
watchdog-next branch.
Guenter
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 7/8] cpufreq: sc520_freq: Drop support for AMD Elan SC520
2026-05-06 14:42 ` [PATCH 7/8] cpufreq: sc520_freq: Drop support for AMD Elan SC520 Sean Young
@ 2026-05-07 4:44 ` Zhongqiu Han
2026-05-07 6:35 ` Viresh Kumar
1 sibling, 0 replies; 20+ messages in thread
From: Zhongqiu Han @ 2026-05-07 4:44 UTC (permalink / raw)
To: Sean Young, linux-kernel, Rafael J. Wysocki, Viresh Kumar
Cc: linux-pm, zhongqiu.han
On 5/6/2026 10:42 PM, Sean Young wrote:
> Since commit 8b793a92d862 ("x86/cpu: Remove M486/M486SX/ELAN support"),
> the AMD Elan SC520 is no longer supported, so the cpu frequency
> driver is no longer needed.
>
> Signed-off-by: Sean Young <sean@mess.org>
Reviewed-by: Zhongqiu Han <zhongqiu.han@oss.qualcomm.com>
> ---
> drivers/cpufreq/Kconfig.x86 | 11 ---
> drivers/cpufreq/Makefile | 1 -
> drivers/cpufreq/sc520_freq.c | 136 -----------------------------------
> 3 files changed, 148 deletions(-)
> delete mode 100644 drivers/cpufreq/sc520_freq.c
>
> diff --git a/drivers/cpufreq/Kconfig.x86 b/drivers/cpufreq/Kconfig.x86
> index 027e6ea2e038..865b290b01ff 100644
> --- a/drivers/cpufreq/Kconfig.x86
> +++ b/drivers/cpufreq/Kconfig.x86
> @@ -141,17 +141,6 @@ config ELAN_CPUFREQ
>
> If in doubt, say N.
>
> -config SC520_CPUFREQ
> - tristate "AMD Elan SC520"
> - depends on MELAN
> - help
> - This adds the CPUFreq driver for AMD Elan SC520 processor.
> -
> - For details, take a look at <file:Documentation/cpu-freq/>.
> -
> - If in doubt, say N.
> -
> -
> config X86_POWERNOW_K6
> tristate "AMD Mobile K6-2/K6-3 PowerNow!"
> depends on X86_32
> diff --git a/drivers/cpufreq/Makefile b/drivers/cpufreq/Makefile
> index 385c9fcc65c6..96196edf79d5 100644
> --- a/drivers/cpufreq/Makefile
> +++ b/drivers/cpufreq/Makefile
> @@ -41,7 +41,6 @@ obj-$(CONFIG_X86_POWERNOW_K7) += powernow-k7.o
> obj-$(CONFIG_X86_LONGHAUL) += longhaul.o
> obj-$(CONFIG_X86_E_POWERSAVER) += e_powersaver.o
> obj-$(CONFIG_ELAN_CPUFREQ) += elanfreq.o
> -obj-$(CONFIG_SC520_CPUFREQ) += sc520_freq.o
> obj-$(CONFIG_X86_LONGRUN) += longrun.o
> obj-$(CONFIG_X86_GX_SUSPMOD) += gx-suspmod.o
> obj-$(CONFIG_X86_SPEEDSTEP_ICH) += speedstep-ich.o
> diff --git a/drivers/cpufreq/sc520_freq.c b/drivers/cpufreq/sc520_freq.c
> deleted file mode 100644
> index b360f03a116f..000000000000
> --- a/drivers/cpufreq/sc520_freq.c
> +++ /dev/null
> @@ -1,136 +0,0 @@
> -// SPDX-License-Identifier: GPL-2.0-or-later
> -/*
> - * sc520_freq.c: cpufreq driver for the AMD Elan sc520
> - *
> - * Copyright (C) 2005 Sean Young <sean@mess.org>
> - *
> - * Based on elanfreq.c
> - *
> - * 2005-03-30: - initial revision
> - */
> -
> -#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
> -
> -#include <linux/kernel.h>
> -#include <linux/module.h>
> -#include <linux/init.h>
> -
> -#include <linux/delay.h>
> -#include <linux/cpufreq.h>
> -#include <linux/timex.h>
> -#include <linux/io.h>
> -
> -#include <asm/cpu_device_id.h>
> -
> -#define MMCR_BASE 0xfffef000 /* The default base address */
> -#define OFFS_CPUCTL 0x2 /* CPU Control Register */
> -
> -static __u8 __iomem *cpuctl;
> -
> -static struct cpufreq_frequency_table sc520_freq_table[] = {
> - {0, 0x01, 100000},
> - {0, 0x02, 133000},
> - {0, 0, CPUFREQ_TABLE_END},
> -};
> -
> -static unsigned int sc520_freq_get_cpu_frequency(unsigned int cpu)
> -{
> - u8 clockspeed_reg = *cpuctl;
> -
> - switch (clockspeed_reg & 0x03) {
> - default:
> - pr_err("error: cpuctl register has unexpected value %02x\n",
> - clockspeed_reg);
> - fallthrough;
> - case 0x01:
> - return 100000;
> - case 0x02:
> - return 133000;
> - }
> -}
> -
> -static int sc520_freq_target(struct cpufreq_policy *policy, unsigned int state)
> -{
> -
> - u8 clockspeed_reg;
> -
> - local_irq_disable();
> -
> - clockspeed_reg = *cpuctl & ~0x03;
> - *cpuctl = clockspeed_reg | sc520_freq_table[state].driver_data;
> -
> - local_irq_enable();
> -
> - return 0;
> -}
> -
> -/*
> - * Module init and exit code
> - */
> -
> -static int sc520_freq_cpu_init(struct cpufreq_policy *policy)
> -{
> - struct cpuinfo_x86 *c = &cpu_data(0);
> -
> - /* capability check */
> - if (c->x86_vendor != X86_VENDOR_AMD ||
> - c->x86 != 4 || c->x86_model != 9)
> - return -ENODEV;
> -
> - /* cpuinfo and default policy values */
> - policy->cpuinfo.transition_latency = 1000000; /* 1ms */
> - policy->freq_table = sc520_freq_table;
> -
> - return 0;
> -}
> -
> -
> -static struct cpufreq_driver sc520_freq_driver = {
> - .get = sc520_freq_get_cpu_frequency,
> - .verify = cpufreq_generic_frequency_table_verify,
> - .target_index = sc520_freq_target,
> - .init = sc520_freq_cpu_init,
> - .name = "sc520_freq",
> -};
> -
> -static const struct x86_cpu_id sc520_ids[] = {
> - X86_MATCH_VENDOR_FAM_MODEL(AMD, 4, 9, NULL),
> - {}
> -};
> -MODULE_DEVICE_TABLE(x86cpu, sc520_ids);
> -
> -static int __init sc520_freq_init(void)
> -{
> - int err;
> -
> - if (!x86_match_cpu(sc520_ids))
> - return -ENODEV;
> -
> - cpuctl = ioremap((unsigned long)(MMCR_BASE + OFFS_CPUCTL), 1);
> - if (!cpuctl) {
> - pr_err("sc520_freq: error: failed to remap memory\n");
> - return -ENOMEM;
> - }
> -
> - err = cpufreq_register_driver(&sc520_freq_driver);
> - if (err)
> - iounmap(cpuctl);
> -
> - return err;
> -}
> -
> -
> -static void __exit sc520_freq_exit(void)
> -{
> - cpufreq_unregister_driver(&sc520_freq_driver);
> - iounmap(cpuctl);
> -}
> -
> -
> -MODULE_LICENSE("GPL");
> -MODULE_AUTHOR("Sean Young <sean@mess.org>");
> -MODULE_DESCRIPTION("cpufreq driver for AMD's Elan sc520 CPU");
> -
> -module_init(sc520_freq_init);
> -module_exit(sc520_freq_exit);
> -
--
Thx and BRs,
Zhongqiu Han
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 8/8] cpufreq: elanfreq: Drop support for AMD Elan SC4*
2026-05-06 14:42 ` [PATCH 8/8] cpufreq: elanfreq: Drop support for AMD Elan SC4* Sean Young
@ 2026-05-07 4:50 ` Zhongqiu Han
2026-05-07 8:58 ` Sean Young
2026-05-07 6:35 ` Viresh Kumar
1 sibling, 1 reply; 20+ messages in thread
From: Zhongqiu Han @ 2026-05-07 4:50 UTC (permalink / raw)
To: Sean Young, linux-kernel, Rafael J. Wysocki, Viresh Kumar
Cc: linux-pm, zhongqiu.han
On 5/6/2026 10:42 PM, Sean Young wrote:
> Since commit 8b793a92d862 ("x86/cpu: Remove M486/M486SX/ELAN support"),
> the AMD Elan SC4* is no longer supported, so the cpu frequency
> driver is no longer needed.
>
> Signed-off-by: Sean Young <sean@mess.org>
> ---
> drivers/cpufreq/Kconfig.x86 | 15 ---
> drivers/cpufreq/Makefile | 1 -
> drivers/cpufreq/elanfreq.c | 226 ------------------------------------
> 3 files changed, 242 deletions(-)
> delete mode 100644 drivers/cpufreq/elanfreq.c
>
Thanks Sean,
One minor nit: now that the elanfreq driver and its setup code are
removed, should the corresponding elanfreq= entry in
Documentation/admin-guide/kernel-parameters.txt be dropped as well?
https://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git/tree/Documentation/admin-guide/kernel-parameters.txt?h=linux-next#n1671
> diff --git a/drivers/cpufreq/Kconfig.x86 b/drivers/cpufreq/Kconfig.x86
> index 865b290b01ff..c42dd39e0b2a 100644
> --- a/drivers/cpufreq/Kconfig.x86
> +++ b/drivers/cpufreq/Kconfig.x86
> @@ -126,21 +126,6 @@ config X86_ACPI_CPUFREQ_CPB
> By enabling this option the acpi_cpufreq driver provides the old
> entry in addition to the new boost ones, for compatibility reasons.
>
> -config ELAN_CPUFREQ
> - tristate "AMD Elan SC400 and SC410"
> - depends on MELAN
> - help
> - This adds the CPUFreq driver for AMD Elan SC400 and SC410
> - processors.
> -
> - You need to specify the processor maximum speed as boot
> - parameter: elanfreq=maxspeed (in kHz) or as module
> - parameter "max_freq".
> -
> - For details, take a look at <file:Documentation/cpu-freq/>.
> -
> - If in doubt, say N.
> -
> config X86_POWERNOW_K6
> tristate "AMD Mobile K6-2/K6-3 PowerNow!"
> depends on X86_32
> diff --git a/drivers/cpufreq/Makefile b/drivers/cpufreq/Makefile
> index 96196edf79d5..6c7a39b7f8d2 100644
> --- a/drivers/cpufreq/Makefile
> +++ b/drivers/cpufreq/Makefile
> @@ -40,7 +40,6 @@ obj-$(CONFIG_X86_POWERNOW_K6) += powernow-k6.o
> obj-$(CONFIG_X86_POWERNOW_K7) += powernow-k7.o
> obj-$(CONFIG_X86_LONGHAUL) += longhaul.o
> obj-$(CONFIG_X86_E_POWERSAVER) += e_powersaver.o
> -obj-$(CONFIG_ELAN_CPUFREQ) += elanfreq.o
> obj-$(CONFIG_X86_LONGRUN) += longrun.o
> obj-$(CONFIG_X86_GX_SUSPMOD) += gx-suspmod.o
> obj-$(CONFIG_X86_SPEEDSTEP_ICH) += speedstep-ich.o
> diff --git a/drivers/cpufreq/elanfreq.c b/drivers/cpufreq/elanfreq.c
> deleted file mode 100644
> index fc5a58088b35..000000000000
> --- a/drivers/cpufreq/elanfreq.c
> +++ /dev/null
> @@ -1,226 +0,0 @@
> -// SPDX-License-Identifier: GPL-2.0-or-later
> -/*
> - * elanfreq: cpufreq driver for the AMD ELAN family
> - *
> - * (c) Copyright 2002 Robert Schwebel <r.schwebel@pengutronix.de>
> - *
> - * Parts of this code are (c) Sven Geggus <sven@geggus.net>
> - *
> - * All Rights Reserved.
> - *
> - * 2002-02-13: - initial revision for 2.4.18-pre9 by Robert Schwebel
> - */
> -
> -#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
> -
> -#include <linux/kernel.h>
> -#include <linux/module.h>
> -#include <linux/init.h>
> -
> -#include <linux/delay.h>
> -#include <linux/cpufreq.h>
> -
> -#include <asm/cpu_device_id.h>
> -#include <linux/timex.h>
> -#include <linux/io.h>
> -
> -#define REG_CSCIR 0x22 /* Chip Setup and Control Index Register */
> -#define REG_CSCDR 0x23 /* Chip Setup and Control Data Register */
> -
> -/* Module parameter */
> -static int max_freq;
> -
> -struct s_elan_multiplier {
> - int clock; /* frequency in kHz */
> - int val40h; /* PMU Force Mode register */
> - int val80h; /* CPU Clock Speed Register */
> -};
> -
> -/*
> - * It is important that the frequencies
> - * are listed in ascending order here!
> - */
> -static struct s_elan_multiplier elan_multiplier[] = {
> - {1000, 0x02, 0x18},
> - {2000, 0x02, 0x10},
> - {4000, 0x02, 0x08},
> - {8000, 0x00, 0x00},
> - {16000, 0x00, 0x02},
> - {33000, 0x00, 0x04},
> - {66000, 0x01, 0x04},
> - {99000, 0x01, 0x05}
> -};
> -
> -static struct cpufreq_frequency_table elanfreq_table[] = {
> - {0, 0, 1000},
> - {0, 1, 2000},
> - {0, 2, 4000},
> - {0, 3, 8000},
> - {0, 4, 16000},
> - {0, 5, 33000},
> - {0, 6, 66000},
> - {0, 7, 99000},
> - {0, 0, CPUFREQ_TABLE_END},
> -};
> -
> -
> -/**
> - * elanfreq_get_cpu_frequency: determine current cpu speed
> - *
> - * Finds out at which frequency the CPU of the Elan SOC runs
> - * at the moment. Frequencies from 1 to 33 MHz are generated
> - * the normal way, 66 and 99 MHz are called "Hyperspeed Mode"
> - * and have the rest of the chip running with 33 MHz.
> - */
> -
> -static unsigned int elanfreq_get_cpu_frequency(unsigned int cpu)
> -{
> - u8 clockspeed_reg; /* Clock Speed Register */
> -
> - local_irq_disable();
> - outb_p(0x80, REG_CSCIR);
> - clockspeed_reg = inb_p(REG_CSCDR);
> - local_irq_enable();
> -
> - if ((clockspeed_reg & 0xE0) == 0xE0)
> - return 0;
> -
> - /* Are we in CPU clock multiplied mode (66/99 MHz)? */
> - if ((clockspeed_reg & 0xE0) == 0xC0) {
> - if ((clockspeed_reg & 0x01) == 0)
> - return 66000;
> - else
> - return 99000;
> - }
> -
> - /* 33 MHz is not 32 MHz... */
> - if ((clockspeed_reg & 0xE0) == 0xA0)
> - return 33000;
> -
> - return (1<<((clockspeed_reg & 0xE0) >> 5)) * 1000;
> -}
> -
> -
> -static int elanfreq_target(struct cpufreq_policy *policy,
> - unsigned int state)
> -{
> - /*
> - * Access to the Elan's internal registers is indexed via
> - * 0x22: Chip Setup & Control Register Index Register (CSCI)
> - * 0x23: Chip Setup & Control Register Data Register (CSCD)
> - *
> - */
> -
> - /*
> - * 0x40 is the Power Management Unit's Force Mode Register.
> - * Bit 6 enables Hyperspeed Mode (66/100 MHz core frequency)
> - */
> -
> - local_irq_disable();
> - outb_p(0x40, REG_CSCIR); /* Disable hyperspeed mode */
> - outb_p(0x00, REG_CSCDR);
> - local_irq_enable(); /* wait till internal pipelines and */
> - udelay(1000); /* buffers have cleaned up */
> -
> - local_irq_disable();
> -
> - /* now, set the CPU clock speed register (0x80) */
> - outb_p(0x80, REG_CSCIR);
> - outb_p(elan_multiplier[state].val80h, REG_CSCDR);
> -
> - /* now, the hyperspeed bit in PMU Force Mode Register (0x40) */
> - outb_p(0x40, REG_CSCIR);
> - outb_p(elan_multiplier[state].val40h, REG_CSCDR);
> - udelay(10000);
> - local_irq_enable();
> -
> - return 0;
> -}
> -/*
> - * Module init and exit code
> - */
> -
> -static int elanfreq_cpu_init(struct cpufreq_policy *policy)
> -{
> - struct cpuinfo_x86 *c = &cpu_data(0);
> - struct cpufreq_frequency_table *pos;
> -
> - /* capability check */
> - if ((c->x86_vendor != X86_VENDOR_AMD) ||
> - (c->x86 != 4) || (c->x86_model != 10))
> - return -ENODEV;
> -
> - /* max freq */
> - if (!max_freq)
> - max_freq = elanfreq_get_cpu_frequency(0);
> -
> - /* table init */
> - cpufreq_for_each_entry(pos, elanfreq_table)
> - if (pos->frequency > max_freq)
> - pos->frequency = CPUFREQ_ENTRY_INVALID;
> -
> - policy->freq_table = elanfreq_table;
> - return 0;
> -}
> -
> -
> -#ifndef MODULE
> -/**
> - * elanfreq_setup - elanfreq command line parameter parsing
> - *
> - * elanfreq command line parameter. Use:
> - * elanfreq=66000
> - * to set the maximum CPU frequency to 66 MHz. Note that in
> - * case you do not give this boot parameter, the maximum
> - * frequency will fall back to _current_ CPU frequency which
> - * might be lower. If you build this as a module, use the
> - * max_freq module parameter instead.
> - */
> -static int __init elanfreq_setup(char *str)
> -{
> - max_freq = simple_strtoul(str, &str, 0);
> - pr_warn("You're using the deprecated elanfreq command line option. Use elanfreq.max_freq instead, please!\n");
> - return 1;
> -}
> -__setup("elanfreq=", elanfreq_setup);
> -#endif
> -
> -
> -static struct cpufreq_driver elanfreq_driver = {
> - .get = elanfreq_get_cpu_frequency,
> - .flags = CPUFREQ_NO_AUTO_DYNAMIC_SWITCHING,
> - .verify = cpufreq_generic_frequency_table_verify,
> - .target_index = elanfreq_target,
> - .init = elanfreq_cpu_init,
> - .name = "elanfreq",
> -};
> -
> -static const struct x86_cpu_id elan_id[] = {
> - X86_MATCH_VENDOR_FAM_MODEL(AMD, 4, 10, NULL),
> - {}
> -};
> -MODULE_DEVICE_TABLE(x86cpu, elan_id);
> -
> -static int __init elanfreq_init(void)
> -{
> - if (!x86_match_cpu(elan_id))
> - return -ENODEV;
> - return cpufreq_register_driver(&elanfreq_driver);
> -}
> -
> -
> -static void __exit elanfreq_exit(void)
> -{
> - cpufreq_unregister_driver(&elanfreq_driver);
> -}
> -
> -
> -module_param(max_freq, int, 0444);
> -
> -MODULE_LICENSE("GPL");
> -MODULE_AUTHOR("Robert Schwebel <r.schwebel@pengutronix.de>, "
> - "Sven Geggus <sven@geggus.net>");
> -MODULE_DESCRIPTION("cpufreq driver for AMD's Elan CPUs");
> -
> -module_init(elanfreq_init);
> -module_exit(elanfreq_exit);
--
Thx and BRs,
Zhongqiu Han
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 7/8] cpufreq: sc520_freq: Drop support for AMD Elan SC520
2026-05-06 14:42 ` [PATCH 7/8] cpufreq: sc520_freq: Drop support for AMD Elan SC520 Sean Young
2026-05-07 4:44 ` Zhongqiu Han
@ 2026-05-07 6:35 ` Viresh Kumar
1 sibling, 0 replies; 20+ messages in thread
From: Viresh Kumar @ 2026-05-07 6:35 UTC (permalink / raw)
To: Sean Young; +Cc: linux-kernel, Rafael J. Wysocki, linux-pm
On 06-05-26, 15:42, Sean Young wrote:
> Since commit 8b793a92d862 ("x86/cpu: Remove M486/M486SX/ELAN support"),
> the AMD Elan SC520 is no longer supported, so the cpu frequency
> driver is no longer needed.
>
> Signed-off-by: Sean Young <sean@mess.org>
> ---
> drivers/cpufreq/Kconfig.x86 | 11 ---
> drivers/cpufreq/Makefile | 1 -
> drivers/cpufreq/sc520_freq.c | 136 -----------------------------------
> 3 files changed, 148 deletions(-)
> delete mode 100644 drivers/cpufreq/sc520_freq.c
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>
--
viresh
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 8/8] cpufreq: elanfreq: Drop support for AMD Elan SC4*
2026-05-06 14:42 ` [PATCH 8/8] cpufreq: elanfreq: Drop support for AMD Elan SC4* Sean Young
2026-05-07 4:50 ` Zhongqiu Han
@ 2026-05-07 6:35 ` Viresh Kumar
1 sibling, 0 replies; 20+ messages in thread
From: Viresh Kumar @ 2026-05-07 6:35 UTC (permalink / raw)
To: Sean Young; +Cc: linux-kernel, Rafael J. Wysocki, linux-pm
On 06-05-26, 15:42, Sean Young wrote:
> Since commit 8b793a92d862 ("x86/cpu: Remove M486/M486SX/ELAN support"),
> the AMD Elan SC4* is no longer supported, so the cpu frequency
> driver is no longer needed.
>
> Signed-off-by: Sean Young <sean@mess.org>
> ---
> drivers/cpufreq/Kconfig.x86 | 15 ---
> drivers/cpufreq/Makefile | 1 -
> drivers/cpufreq/elanfreq.c | 226 ------------------------------------
> 3 files changed, 242 deletions(-)
> delete mode 100644 drivers/cpufreq/elanfreq.c
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>
--
viresh
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 5/8] gpio: ts5500: Remove gpio driver as board no longer supported
2026-05-06 14:42 ` [PATCH 5/8] gpio: ts5500: Remove gpio driver as board " Sean Young
@ 2026-05-07 8:06 ` Bartosz Golaszewski
0 siblings, 0 replies; 20+ messages in thread
From: Bartosz Golaszewski @ 2026-05-07 8:06 UTC (permalink / raw)
To: Sean Young; +Cc: linux-gpio, linux-kernel, Linus Walleij, Bartosz Golaszewski
On Wed, 6 May 2026 16:42:50 +0200, Sean Young <sean@mess.org> said:
> Since commit 8b793a92d862 ("x86/cpu: Remove M486/M486SX/ELAN support"),
> this board is no longer supported. Remove the gpio driver too.
>
> Signed-off-by: Sean Young <sean@mess.org>
> ---
Acked-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 8/8] cpufreq: elanfreq: Drop support for AMD Elan SC4*
2026-05-07 4:50 ` Zhongqiu Han
@ 2026-05-07 8:58 ` Sean Young
0 siblings, 0 replies; 20+ messages in thread
From: Sean Young @ 2026-05-07 8:58 UTC (permalink / raw)
To: Zhongqiu Han; +Cc: linux-kernel, Rafael J. Wysocki, Viresh Kumar, linux-pm
On Thu, May 07, 2026 at 12:50:55PM +0800, Zhongqiu Han wrote:
> On 5/6/2026 10:42 PM, Sean Young wrote:
> > Since commit 8b793a92d862 ("x86/cpu: Remove M486/M486SX/ELAN support"),
> > the AMD Elan SC4* is no longer supported, so the cpu frequency
> > driver is no longer needed.
> >
> > Signed-off-by: Sean Young <sean@mess.org>
> > ---
> > drivers/cpufreq/Kconfig.x86 | 15 ---
> > drivers/cpufreq/Makefile | 1 -
> > drivers/cpufreq/elanfreq.c | 226 ------------------------------------
> > 3 files changed, 242 deletions(-)
> > delete mode 100644 drivers/cpufreq/elanfreq.c
> >
>
> Thanks Sean,
>
> One minor nit: now that the elanfreq driver and its setup code are
> removed, should the corresponding elanfreq= entry in
> Documentation/admin-guide/kernel-parameters.txt be dropped as well?
>
> https://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git/tree/Documentation/admin-guide/kernel-parameters.txt?h=linux-next#n1671
Yes, good catch. I'll send out a v2 shortly.
Thanks,
Sean
>
>
> > diff --git a/drivers/cpufreq/Kconfig.x86 b/drivers/cpufreq/Kconfig.x86
> > index 865b290b01ff..c42dd39e0b2a 100644
> > --- a/drivers/cpufreq/Kconfig.x86
> > +++ b/drivers/cpufreq/Kconfig.x86
> > @@ -126,21 +126,6 @@ config X86_ACPI_CPUFREQ_CPB
> > By enabling this option the acpi_cpufreq driver provides the old
> > entry in addition to the new boost ones, for compatibility reasons.
> > -config ELAN_CPUFREQ
> > - tristate "AMD Elan SC400 and SC410"
> > - depends on MELAN
> > - help
> > - This adds the CPUFreq driver for AMD Elan SC400 and SC410
> > - processors.
> > -
> > - You need to specify the processor maximum speed as boot
> > - parameter: elanfreq=maxspeed (in kHz) or as module
> > - parameter "max_freq".
> > -
> > - For details, take a look at <file:Documentation/cpu-freq/>.
> > -
> > - If in doubt, say N.
> > -
> > config X86_POWERNOW_K6
> > tristate "AMD Mobile K6-2/K6-3 PowerNow!"
> > depends on X86_32
> > diff --git a/drivers/cpufreq/Makefile b/drivers/cpufreq/Makefile
> > index 96196edf79d5..6c7a39b7f8d2 100644
> > --- a/drivers/cpufreq/Makefile
> > +++ b/drivers/cpufreq/Makefile
> > @@ -40,7 +40,6 @@ obj-$(CONFIG_X86_POWERNOW_K6) += powernow-k6.o
> > obj-$(CONFIG_X86_POWERNOW_K7) += powernow-k7.o
> > obj-$(CONFIG_X86_LONGHAUL) += longhaul.o
> > obj-$(CONFIG_X86_E_POWERSAVER) += e_powersaver.o
> > -obj-$(CONFIG_ELAN_CPUFREQ) += elanfreq.o
> > obj-$(CONFIG_X86_LONGRUN) += longrun.o
> > obj-$(CONFIG_X86_GX_SUSPMOD) += gx-suspmod.o
> > obj-$(CONFIG_X86_SPEEDSTEP_ICH) += speedstep-ich.o
> > diff --git a/drivers/cpufreq/elanfreq.c b/drivers/cpufreq/elanfreq.c
> > deleted file mode 100644
> > index fc5a58088b35..000000000000
> > --- a/drivers/cpufreq/elanfreq.c
> > +++ /dev/null
> > @@ -1,226 +0,0 @@
> > -// SPDX-License-Identifier: GPL-2.0-or-later
> > -/*
> > - * elanfreq: cpufreq driver for the AMD ELAN family
> > - *
> > - * (c) Copyright 2002 Robert Schwebel <r.schwebel@pengutronix.de>
> > - *
> > - * Parts of this code are (c) Sven Geggus <sven@geggus.net>
> > - *
> > - * All Rights Reserved.
> > - *
> > - * 2002-02-13: - initial revision for 2.4.18-pre9 by Robert Schwebel
> > - */
> > -
> > -#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
> > -
> > -#include <linux/kernel.h>
> > -#include <linux/module.h>
> > -#include <linux/init.h>
> > -
> > -#include <linux/delay.h>
> > -#include <linux/cpufreq.h>
> > -
> > -#include <asm/cpu_device_id.h>
> > -#include <linux/timex.h>
> > -#include <linux/io.h>
> > -
> > -#define REG_CSCIR 0x22 /* Chip Setup and Control Index Register */
> > -#define REG_CSCDR 0x23 /* Chip Setup and Control Data Register */
> > -
> > -/* Module parameter */
> > -static int max_freq;
> > -
> > -struct s_elan_multiplier {
> > - int clock; /* frequency in kHz */
> > - int val40h; /* PMU Force Mode register */
> > - int val80h; /* CPU Clock Speed Register */
> > -};
> > -
> > -/*
> > - * It is important that the frequencies
> > - * are listed in ascending order here!
> > - */
> > -static struct s_elan_multiplier elan_multiplier[] = {
> > - {1000, 0x02, 0x18},
> > - {2000, 0x02, 0x10},
> > - {4000, 0x02, 0x08},
> > - {8000, 0x00, 0x00},
> > - {16000, 0x00, 0x02},
> > - {33000, 0x00, 0x04},
> > - {66000, 0x01, 0x04},
> > - {99000, 0x01, 0x05}
> > -};
> > -
> > -static struct cpufreq_frequency_table elanfreq_table[] = {
> > - {0, 0, 1000},
> > - {0, 1, 2000},
> > - {0, 2, 4000},
> > - {0, 3, 8000},
> > - {0, 4, 16000},
> > - {0, 5, 33000},
> > - {0, 6, 66000},
> > - {0, 7, 99000},
> > - {0, 0, CPUFREQ_TABLE_END},
> > -};
> > -
> > -
> > -/**
> > - * elanfreq_get_cpu_frequency: determine current cpu speed
> > - *
> > - * Finds out at which frequency the CPU of the Elan SOC runs
> > - * at the moment. Frequencies from 1 to 33 MHz are generated
> > - * the normal way, 66 and 99 MHz are called "Hyperspeed Mode"
> > - * and have the rest of the chip running with 33 MHz.
> > - */
> > -
> > -static unsigned int elanfreq_get_cpu_frequency(unsigned int cpu)
> > -{
> > - u8 clockspeed_reg; /* Clock Speed Register */
> > -
> > - local_irq_disable();
> > - outb_p(0x80, REG_CSCIR);
> > - clockspeed_reg = inb_p(REG_CSCDR);
> > - local_irq_enable();
> > -
> > - if ((clockspeed_reg & 0xE0) == 0xE0)
> > - return 0;
> > -
> > - /* Are we in CPU clock multiplied mode (66/99 MHz)? */
> > - if ((clockspeed_reg & 0xE0) == 0xC0) {
> > - if ((clockspeed_reg & 0x01) == 0)
> > - return 66000;
> > - else
> > - return 99000;
> > - }
> > -
> > - /* 33 MHz is not 32 MHz... */
> > - if ((clockspeed_reg & 0xE0) == 0xA0)
> > - return 33000;
> > -
> > - return (1<<((clockspeed_reg & 0xE0) >> 5)) * 1000;
> > -}
> > -
> > -
> > -static int elanfreq_target(struct cpufreq_policy *policy,
> > - unsigned int state)
> > -{
> > - /*
> > - * Access to the Elan's internal registers is indexed via
> > - * 0x22: Chip Setup & Control Register Index Register (CSCI)
> > - * 0x23: Chip Setup & Control Register Data Register (CSCD)
> > - *
> > - */
> > -
> > - /*
> > - * 0x40 is the Power Management Unit's Force Mode Register.
> > - * Bit 6 enables Hyperspeed Mode (66/100 MHz core frequency)
> > - */
> > -
> > - local_irq_disable();
> > - outb_p(0x40, REG_CSCIR); /* Disable hyperspeed mode */
> > - outb_p(0x00, REG_CSCDR);
> > - local_irq_enable(); /* wait till internal pipelines and */
> > - udelay(1000); /* buffers have cleaned up */
> > -
> > - local_irq_disable();
> > -
> > - /* now, set the CPU clock speed register (0x80) */
> > - outb_p(0x80, REG_CSCIR);
> > - outb_p(elan_multiplier[state].val80h, REG_CSCDR);
> > -
> > - /* now, the hyperspeed bit in PMU Force Mode Register (0x40) */
> > - outb_p(0x40, REG_CSCIR);
> > - outb_p(elan_multiplier[state].val40h, REG_CSCDR);
> > - udelay(10000);
> > - local_irq_enable();
> > -
> > - return 0;
> > -}
> > -/*
> > - * Module init and exit code
> > - */
> > -
> > -static int elanfreq_cpu_init(struct cpufreq_policy *policy)
> > -{
> > - struct cpuinfo_x86 *c = &cpu_data(0);
> > - struct cpufreq_frequency_table *pos;
> > -
> > - /* capability check */
> > - if ((c->x86_vendor != X86_VENDOR_AMD) ||
> > - (c->x86 != 4) || (c->x86_model != 10))
> > - return -ENODEV;
> > -
> > - /* max freq */
> > - if (!max_freq)
> > - max_freq = elanfreq_get_cpu_frequency(0);
> > -
> > - /* table init */
> > - cpufreq_for_each_entry(pos, elanfreq_table)
> > - if (pos->frequency > max_freq)
> > - pos->frequency = CPUFREQ_ENTRY_INVALID;
> > -
> > - policy->freq_table = elanfreq_table;
> > - return 0;
> > -}
> > -
> > -
> > -#ifndef MODULE
> > -/**
> > - * elanfreq_setup - elanfreq command line parameter parsing
> > - *
> > - * elanfreq command line parameter. Use:
> > - * elanfreq=66000
> > - * to set the maximum CPU frequency to 66 MHz. Note that in
> > - * case you do not give this boot parameter, the maximum
> > - * frequency will fall back to _current_ CPU frequency which
> > - * might be lower. If you build this as a module, use the
> > - * max_freq module parameter instead.
> > - */
> > -static int __init elanfreq_setup(char *str)
> > -{
> > - max_freq = simple_strtoul(str, &str, 0);
> > - pr_warn("You're using the deprecated elanfreq command line option. Use elanfreq.max_freq instead, please!\n");
> > - return 1;
> > -}
> > -__setup("elanfreq=", elanfreq_setup);
> > -#endif
> > -
> > -
> > -static struct cpufreq_driver elanfreq_driver = {
> > - .get = elanfreq_get_cpu_frequency,
> > - .flags = CPUFREQ_NO_AUTO_DYNAMIC_SWITCHING,
> > - .verify = cpufreq_generic_frequency_table_verify,
> > - .target_index = elanfreq_target,
> > - .init = elanfreq_cpu_init,
> > - .name = "elanfreq",
> > -};
> > -
> > -static const struct x86_cpu_id elan_id[] = {
> > - X86_MATCH_VENDOR_FAM_MODEL(AMD, 4, 10, NULL),
> > - {}
> > -};
> > -MODULE_DEVICE_TABLE(x86cpu, elan_id);
> > -
> > -static int __init elanfreq_init(void)
> > -{
> > - if (!x86_match_cpu(elan_id))
> > - return -ENODEV;
> > - return cpufreq_register_driver(&elanfreq_driver);
> > -}
> > -
> > -
> > -static void __exit elanfreq_exit(void)
> > -{
> > - cpufreq_unregister_driver(&elanfreq_driver);
> > -}
> > -
> > -
> > -module_param(max_freq, int, 0444);
> > -
> > -MODULE_LICENSE("GPL");
> > -MODULE_AUTHOR("Robert Schwebel <r.schwebel@pengutronix.de>, "
> > - "Sven Geggus <sven@geggus.net>");
> > -MODULE_DESCRIPTION("cpufreq driver for AMD's Elan CPUs");
> > -
> > -module_init(elanfreq_init);
> > -module_exit(elanfreq_exit);
>
>
> --
> Thx and BRs,
> Zhongqiu Han
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 0/8] Remove remaining AMD Elan drivers
2026-05-06 14:42 [PATCH 0/8] Remove remaining AMD Elan drivers Sean Young
` (7 preceding siblings ...)
2026-05-06 14:42 ` [PATCH 8/8] cpufreq: elanfreq: Drop support for AMD Elan SC4* Sean Young
@ 2026-05-27 9:05 ` Miquel Raynal
8 siblings, 0 replies; 20+ messages in thread
From: Miquel Raynal @ 2026-05-27 9:05 UTC (permalink / raw)
To: linux-kernel, Sean Young; +Cc: Miquel Raynal
On Wed, 06 May 2026 15:42:45 +0100, Sean Young wrote:
> Now that AMD Elan support has been removed[1], remove the AMD Elan specific
> drivers too. I had a Technology Systems 5500 back in the early 2000's and
> it was pretty slow back then - no need to support such ancient slow
> device. I wrote and patched some of these drivers so nice to see them
> removed at the end of their life cycle.
>
> 1. commit 8b793a92d862 ("x86/cpu: Remove M486/M486SX/ELAN support")
>
> [...]
Applied to mtd/next, thanks!
[1/8] x86/platform: Remove Technology Systems 5500 board
(no commit info)
[2/8] mtd: ts5500_flash: Remove mapping since board is no longer supported
commit: 801f11633d5eb2021dd1a4b6a4c14479c54af244
[3/8] mtd: netsc520: Remove mapping since board is no longer supported
commit: b60e5b5738d86735ebdb8b952054194b636b1cf6
[4/8] mtd: sc520cdp: Remove mapping since board is no longer supported
commit: f4aeb151b8b025202a3cc55fabc45234700ed470
[5/8] gpio: ts5500: Remove gpio driver as board no longer supported
(no commit info)
[6/8] watchdog: sc520: Drop AMD Elan SC520 support
(no commit info)
[7/8] cpufreq: sc520_freq: Drop support for AMD Elan SC520
(no commit info)
[8/8] cpufreq: elanfreq: Drop support for AMD Elan SC4*
(no commit info)
Patche(s) should be available on mtd/linux.git and will be
part of the next PR (provided that no robot complains by then).
Kind regards,
Miquèl
^ permalink raw reply [flat|nested] 20+ messages in thread
end of thread, other threads:[~2026-05-27 9:05 UTC | newest]
Thread overview: 20+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-05-06 14:42 [PATCH 0/8] Remove remaining AMD Elan drivers Sean Young
2026-05-06 14:42 ` [PATCH 1/8] x86/platform: Remove Technology Systems 5500 board Sean Young
2026-05-06 14:42 ` [PATCH 2/8] mtd: ts5500_flash: Remove mapping since board is no longer supported Sean Young
2026-05-06 14:42 ` Sean Young
2026-05-06 14:42 ` [PATCH 3/8] mtd: netsc520: " Sean Young
2026-05-06 14:42 ` Sean Young
2026-05-06 14:42 ` [PATCH 4/8] mtd: sc520cdp: " Sean Young
2026-05-06 14:42 ` Sean Young
2026-05-06 14:42 ` [PATCH 5/8] gpio: ts5500: Remove gpio driver as board " Sean Young
2026-05-07 8:06 ` Bartosz Golaszewski
2026-05-06 14:42 ` [PATCH 6/8] watchdog: sc520: Drop AMD Elan SC520 support Sean Young
2026-05-06 14:51 ` Guenter Roeck
2026-05-06 14:42 ` [PATCH 7/8] cpufreq: sc520_freq: Drop support for AMD Elan SC520 Sean Young
2026-05-07 4:44 ` Zhongqiu Han
2026-05-07 6:35 ` Viresh Kumar
2026-05-06 14:42 ` [PATCH 8/8] cpufreq: elanfreq: Drop support for AMD Elan SC4* Sean Young
2026-05-07 4:50 ` Zhongqiu Han
2026-05-07 8:58 ` Sean Young
2026-05-07 6:35 ` Viresh Kumar
2026-05-27 9:05 ` [PATCH 0/8] Remove remaining AMD Elan drivers Miquel Raynal
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.