diff options
Diffstat (limited to 'target')
32 files changed, 15983 insertions, 31 deletions
diff --git a/target/config/Config.in.binutils b/target/config/Config.in.binutils index 3e141d4d6..0beb783f7 100644 --- a/target/config/Config.in.binutils +++ b/target/config/Config.in.binutils @@ -10,13 +10,17 @@ default ADK_TOOLCHAIN_BINUTILS_KVX if ADK_TARGET_ARCH_KVX default ADK_TOOLCHAIN_BINUTILS_NDS32 if ADK_TARGET_ARCH_NDS32 default ADK_TOOLCHAIN_BINUTILS_2_26 if ADK_TARGET_ARCH_BFIN && ADK_TARGET_BINFMT_FDPIC default ADK_TOOLCHAIN_BINUTILS_2_43_1 if ADK_TARGET_ARCH_NIOS2 -default ADK_TOOLCHAIN_BINUTILS_2_43_1 if ADK_TARGET_ARCH_X86_64 -default ADK_TOOLCHAIN_BINUTILS_2_44 +default ADK_TOOLCHAIN_BINUTILS_2_45 config ADK_TOOLCHAIN_BINUTILS_GIT bool "git" depends on !ADK_TARGET_ARCH_AVR32 +config ADK_TOOLCHAIN_BINUTILS_2_45 + bool "2.45" + depends on !ADK_TARGET_ARCH_AVR32 + depends on !ADK_TARGET_ARCH_NIOS2 + config ADK_TOOLCHAIN_BINUTILS_2_44 bool "2.44" depends on !ADK_TARGET_ARCH_AVR32 diff --git a/target/config/Config.in.compiler b/target/config/Config.in.compiler index 57dcf54e3..be0ce72ff 100644 --- a/target/config/Config.in.compiler +++ b/target/config/Config.in.compiler @@ -37,19 +37,19 @@ config ADK_TOOLCHAIN_GCC_15 depends on !ADK_TARGET_ARCH_METAG config ADK_TOOLCHAIN_GCC_14 - bool "14.2.0" + bool "14.3.0" depends on !ADK_TARGET_ARCH_AVR32 depends on !ADK_TARGET_ARCH_CRIS depends on !ADK_TARGET_ARCH_METAG config ADK_TOOLCHAIN_GCC_13 - bool "13.3.0" + bool "13.4.0" depends on !ADK_TARGET_ARCH_AVR32 depends on !ADK_TARGET_ARCH_CRIS depends on !ADK_TARGET_ARCH_METAG config ADK_TOOLCHAIN_GCC_12 - bool "12.4.0" + bool "12.5.0" depends on !ADK_TARGET_ARCH_AVR32 depends on !ADK_TARGET_ARCH_CRIS depends on !ADK_TARGET_ARCH_METAG diff --git a/target/config/Config.in.cpu b/target/config/Config.in.cpu index aea2b04b7..e0a91b003 100644 --- a/target/config/Config.in.cpu +++ b/target/config/Config.in.cpu @@ -1207,6 +1207,14 @@ config ADK_TARGET_CPU_PPC64_POWERPC64 depends on ADK_TARGET_BIG_ENDIAN # riscv +config ADK_TARGET_CPU_RISCV32_RV32IMADC + bool "rv32imadc" + select ADK_TARGET_SUPPORTS_THREADS + select ADK_TARGET_SUPPORTS_NPTL if ADK_TARGET_WITH_MMU + select ADK_TARGET_SUPPORTS_LT + select ADK_TARGET_ABI_ILP32D + depends on ADK_TARGET_ARCH_RISCV32 + config ADK_TARGET_CPU_RISCV32_RV32IMAC bool "rv32imac" select ADK_TARGET_SUPPORTS_THREADS @@ -1231,14 +1239,6 @@ config ADK_TARGET_CPU_RISCV32_RV32IMAFC select ADK_TARGET_ABI_ILP32F depends on ADK_TARGET_ARCH_RISCV32 -config ADK_TARGET_CPU_RISCV32_RV32IMADC - bool "rv32imadc" - select ADK_TARGET_SUPPORTS_THREADS - select ADK_TARGET_SUPPORTS_NPTL if ADK_TARGET_WITH_MMU - select ADK_TARGET_SUPPORTS_LT - select ADK_TARGET_ABI_ILP32D - depends on ADK_TARGET_ARCH_RISCV32 - config ADK_TARGET_CPU_RISCV32_RV32IMAFDC bool "rv32imafdc" select ADK_TARGET_SUPPORTS_THREADS if ADK_TARGET_WITH_MMU @@ -1246,6 +1246,14 @@ config ADK_TARGET_CPU_RISCV32_RV32IMAFDC select ADK_TARGET_SUPPORTS_LT if ADK_TARGET_WITH_MMU depends on ADK_TARGET_ARCH_RISCV32 +config ADK_TARGET_CPU_RISCV64_RV64IMADC + bool "rv64imadc" + select ADK_TARGET_SUPPORTS_THREADS + select ADK_TARGET_SUPPORTS_NPTL if ADK_TARGET_WITH_MMU + select ADK_TARGET_SUPPORTS_LT + select ADK_TARGET_ABI_LP64D + depends on ADK_TARGET_ARCH_RISCV64 + config ADK_TARGET_CPU_RISCV64_RV64IMAC bool "rv64imac" select ADK_TARGET_SUPPORTS_THREADS @@ -1270,14 +1278,6 @@ config ADK_TARGET_CPU_RISCV64_RV64IMAFC select ADK_TARGET_ABI_LP64F depends on ADK_TARGET_ARCH_RISCV64 -config ADK_TARGET_CPU_RISCV64_RV64IMADC - bool "rv64imadc" - select ADK_TARGET_SUPPORTS_THREADS - select ADK_TARGET_SUPPORTS_NPTL if ADK_TARGET_WITH_MMU - select ADK_TARGET_SUPPORTS_LT - select ADK_TARGET_ABI_LP64D - depends on ADK_TARGET_ARCH_RISCV64 - config ADK_TARGET_CPU_RISCV64_RV64IMAFDC bool "rv64imafdc" select ADK_TARGET_SUPPORTS_THREADS if ADK_TARGET_WITH_MMU diff --git a/target/config/Config.in.libc b/target/config/Config.in.libc index 7f3157976..8b942b372 100644 --- a/target/config/Config.in.libc +++ b/target/config/Config.in.libc @@ -148,16 +148,16 @@ choice prompt "Target C library version" depends on !ADK_TARGET_CHOOSE_ARCH -config ADK_TARGET_LIB_UCLIBC_NG_1_0_52 - bool "1.0.52" +config ADK_TARGET_LIB_UCLIBC_NG_1_0_54 + bool "1.0.54" depends on ADK_TARGET_LIB_UCLIBC_NG config ADK_TARGET_LIB_UCLIBC_NG_GIT bool "git" depends on ADK_TARGET_LIB_UCLIBC_NG && ADK_EXPERIMENTAL -config ADK_TARGET_LIB_GLIBC_2_41 - bool "2.41" +config ADK_TARGET_LIB_GLIBC_2_42 + bool "2.42" depends on ADK_TARGET_LIB_GLIBC config ADK_TARGET_LIB_GLIBC_GIT @@ -198,9 +198,9 @@ config ADK_TARGET_LIBC config ADK_LIBC_VERSION string - default "1.0.52" if ADK_TARGET_LIB_UCLIBC_NG_1_0_52 + default "1.0.54" if ADK_TARGET_LIB_UCLIBC_NG_1_0_54 default "1.2.5" if ADK_TARGET_LIB_MUSL_1_2_5 - default "2.41" if ADK_TARGET_LIB_GLIBC_2_40 + default "2.42" if ADK_TARGET_LIB_GLIBC_2_42 default "4.4.0" if ADK_TARGET_LIB_NEWLIB_4_4_0 default "git" if ADK_TARGET_LIB_UCLIBC_NG_GIT || \ ADK_TARGET_LIB_MUSL_GIT || \ diff --git a/target/config/Config.in.runtime b/target/config/Config.in.runtime index e1a5600f6..4f2b135c0 100644 --- a/target/config/Config.in.runtime +++ b/target/config/Config.in.runtime @@ -314,6 +314,7 @@ config ADK_RUNTIME_GETTY_VGA default y if ADK_TARGET_SYSTEM_SOLIDRUN_IMX6 default y if ADK_TARGET_SYSTEM_LEMOTE_YEELONG default y if ADK_TARGET_SYSTEM_ARANYM_M68K + default y if ADK_TARGET_SYSTEM_HP_JORNADA default y if ADK_TARGET_MODEL_PCENGINES_ALIX1C default n help @@ -367,6 +368,7 @@ config ADK_RUNTIME_CONSOLE_SERIAL_DEVICE || ADK_TARGET_SYSTEM_QEMU_AARCH64 default "ttyARC0" if ADK_TARGET_SYSTEM_SYNOPSYS_NSIM && ADK_TARGET_CPU_ARC_ARC700 default "ttySC1" if ADK_TARGET_SYSTEM_QEMU_SH + default "ttySC1" if ADK_TARGET_SYSTEM_HP_JORNADA default "ttySC0" if ADK_TARGET_SYSTEM_SIM_H8300H default "ttySC2" if ADK_TARGET_SYSTEM_HITACHI_EDOSK2674 default "ttySIF0" if ADK_TARGET_SYSTEM_SIPEED_MAIX_BIT diff --git a/target/config/Config.in.subsystem b/target/config/Config.in.subsystem index ce43f391c..1a8c46348 100644 --- a/target/config/Config.in.subsystem +++ b/target/config/Config.in.subsystem @@ -2,6 +2,18 @@ # material, please see the LICENCE file in the top-level directory. choice +prompt "HP Jornada model" +depends on ADK_TARGET_SYSTEM_HP_JORNADA + +config ADK_TARGET_MODEL_HP_JORNADA_690 + bool "HP Jornada 690" + +config ADK_TARGET_MODEL_HP_JORNADA_680 + bool "HP Jornada 680" + +endchoice + +choice prompt "PCengines ALIX model" depends on ADK_TARGET_SYSTEM_PCENGINES_ALIX diff --git a/target/cris/systems/axis-89-device-server b/target/cris/systems/axis-89-device-server new file mode 100644 index 000000000..80449caea --- /dev/null +++ b/target/cris/systems/axis-89-device-server @@ -0,0 +1,10 @@ +config ADK_TARGET_SYSTEM_AXIS_89_DEVICE_SERVER + bool "Axis 89 Device Server" + select ADK_TARGET_CPU_CRIS_CRISV32 + select ADK_TARGET_WITH_MTD + select ADK_TARGET_WITH_NETDEVICE + select ADK_TARGET_KERNEL_ZIMAGE + select ADK_TARGET_KERNEL_WITH_COMPRESSION + help + Axis 89 Device Server + diff --git a/target/linux/Config.in b/target/linux/Config.in index fb9d1810e..3709af90e 100644 --- a/target/linux/Config.in +++ b/target/linux/Config.in @@ -29,3 +29,4 @@ source target/linux/config/Config.in.kvm source target/linux/config/Config.in.virtio source target/linux/config/Config.in.debug source target/linux/config/Config.in.compat +source target/linux/config/Config.in.hpjornada diff --git a/target/linux/Config.in.kernelcfg b/target/linux/Config.in.kernelcfg index f8d33d5b7..d848147fc 100644 --- a/target/linux/Config.in.kernelcfg +++ b/target/linux/Config.in.kernelcfg @@ -72,6 +72,8 @@ config ADK_TARGET_LINUX_KERNEL_DEFCONFIG default "default_defconfig" if ADK_TARGET_ARCH_KVX default "ci20_defconfig" if ADK_TARGET_SYSTEM_IMGTEC_CI20 default "lemote2f_defconfig" if ADK_TARGET_SYSTEM_LEMOTE_FULOONG + default "etraxfs_defconfig" if ADK_TARGET_SYSTEM_AXIS_89_DEVICE_SERVER + default "hp6xx_defconfig" if ADK_TARGET_SYSTEM_HP_JORNADA default "" config ADK_TARGET_LINUX_KERNEL_CUSTOMCONFIG_PATH diff --git a/target/linux/Config.in.kernelversion b/target/linux/Config.in.kernelversion index c4399e070..372bb524e 100644 --- a/target/linux/Config.in.kernelversion +++ b/target/linux/Config.in.kernelversion @@ -39,8 +39,8 @@ config ADK_TARGET_LINUX_KERNEL_VERSION_GIT depends on !ADK_TARGET_ARCH_NDS32 select ADK_HOST_NEED_LZ4 if ADK_TARGET_SYSTEM_PHYTEC_WEGA && ADK_TARGET_LINUX_KERNEL_VERSION_GIT -config ADK_TARGET_LINUX_KERNEL_VERSION_6_14 - bool "6.14.4" +config ADK_TARGET_LINUX_KERNEL_VERSION_6_15 + bool "6.15.6" depends on !ADK_TARGET_ARCH_AVR32 depends on !ADK_TARGET_ARCH_BFIN depends on !ADK_TARGET_ARCH_C6X @@ -51,7 +51,7 @@ config ADK_TARGET_LINUX_KERNEL_VERSION_6_14 depends on !ADK_TARGET_ARCH_NDS32 config ADK_TARGET_LINUX_KERNEL_VERSION_6_12 - bool "6.12.25" + bool "6.12.37" depends on !ADK_TARGET_ARCH_AVR32 depends on !ADK_TARGET_ARCH_BFIN depends on !ADK_TARGET_ARCH_C6X @@ -105,7 +105,7 @@ config ADK_TARGET_LINUX_KERNEL_VERSION_5_10 depends on !ADK_TARGET_SYSTEM_SIPEED_MAIX_BIT config ADK_TARGET_LINUX_KERNEL_VERSION_5_4 - bool "5.4.289" + bool "5.4.292" depends on !ADK_TARGET_ARCH_AVR32 depends on !ADK_TARGET_ARCH_BFIN depends on !ADK_TARGET_ARCH_CRIS diff --git a/target/linux/config/Config.in.hpjornada b/target/linux/config/Config.in.hpjornada new file mode 100644 index 000000000..fc46c316f --- /dev/null +++ b/target/linux/config/Config.in.hpjornada @@ -0,0 +1,12 @@ +# This file is part of the OpenADK project. OpenADK is copyrighted +# material, please see the LICENCE file in the top-level directory. + +config ADK_LINUX_KERNEL_MEMORY_SIZE + hex + default "0x2000000" + depends on ADK_TARGET_MODEL_HP_JORNADA_690 + +config ADK_LINUX_KERNEL_MEMORY_SIZE + hex + default "0x1000000" + depends on ADK_TARGET_MODEL_HP_JORNADA_680 diff --git a/target/linux/patches/5.4.289/arc.patch b/target/linux/patches/5.4.292/arc.patch index 20810ce64..20810ce64 100644 --- a/target/linux/patches/5.4.289/arc.patch +++ b/target/linux/patches/5.4.292/arc.patch diff --git a/target/linux/patches/5.4.289/arm-nommu.patch b/target/linux/patches/5.4.292/arm-nommu.patch index fdcec3f09..fdcec3f09 100644 --- a/target/linux/patches/5.4.289/arm-nommu.patch +++ b/target/linux/patches/5.4.292/arm-nommu.patch diff --git a/target/linux/patches/5.4.289/darwin-dtc.patch b/target/linux/patches/5.4.292/darwin-dtc.patch index 0cdc23ab4..0cdc23ab4 100644 --- a/target/linux/patches/5.4.289/darwin-dtc.patch +++ b/target/linux/patches/5.4.292/darwin-dtc.patch diff --git a/target/linux/patches/5.4.289/dtc-noyaml.patch b/target/linux/patches/5.4.292/dtc-noyaml.patch index 759bb01f7..759bb01f7 100644 --- a/target/linux/patches/5.4.289/dtc-noyaml.patch +++ b/target/linux/patches/5.4.292/dtc-noyaml.patch diff --git a/target/linux/patches/5.4.289/macsonic.patch b/target/linux/patches/5.4.292/macsonic.patch index 75a6fcad2..75a6fcad2 100644 --- a/target/linux/patches/5.4.289/macsonic.patch +++ b/target/linux/patches/5.4.292/macsonic.patch diff --git a/target/linux/patches/5.4.289/or1k-more-ram.patch b/target/linux/patches/5.4.292/or1k-more-ram.patch index 540dc43b5..540dc43b5 100644 --- a/target/linux/patches/5.4.289/or1k-more-ram.patch +++ b/target/linux/patches/5.4.292/or1k-more-ram.patch diff --git a/target/linux/patches/5.4.289/relocs.patch b/target/linux/patches/5.4.292/relocs.patch index 5bcd974c7..5bcd974c7 100644 --- a/target/linux/patches/5.4.289/relocs.patch +++ b/target/linux/patches/5.4.292/relocs.patch diff --git a/target/linux/patches/5.4.289/sh4.patch b/target/linux/patches/5.4.292/sh4.patch index 8ae79d49d..8ae79d49d 100644 --- a/target/linux/patches/5.4.289/sh4.patch +++ b/target/linux/patches/5.4.292/sh4.patch diff --git a/target/linux/patches/5.4.289/startup.patch b/target/linux/patches/5.4.292/startup.patch index 081aa103a..081aa103a 100644 --- a/target/linux/patches/5.4.289/startup.patch +++ b/target/linux/patches/5.4.292/startup.patch diff --git a/target/linux/patches/6.12.25/armnommu-versatile.patch b/target/linux/patches/6.12.37/armnommu-versatile.patch index f8f10f50b..f8f10f50b 100644 --- a/target/linux/patches/6.12.25/armnommu-versatile.patch +++ b/target/linux/patches/6.12.37/armnommu-versatile.patch diff --git a/target/linux/patches/6.12.25/hppa-cross-compile.patch b/target/linux/patches/6.12.37/hppa-cross-compile.patch index 51c24fff2..51c24fff2 100644 --- a/target/linux/patches/6.12.25/hppa-cross-compile.patch +++ b/target/linux/patches/6.12.37/hppa-cross-compile.patch diff --git a/target/linux/patches/6.12.25/macsonic.patch b/target/linux/patches/6.12.37/macsonic.patch index 51e76113b..51e76113b 100644 --- a/target/linux/patches/6.12.25/macsonic.patch +++ b/target/linux/patches/6.12.37/macsonic.patch diff --git a/target/linux/patches/6.12.37/mips-vdso-gcc15.patch b/target/linux/patches/6.12.37/mips-vdso-gcc15.patch new file mode 100644 index 000000000..c18bc6c92 --- /dev/null +++ b/target/linux/patches/6.12.37/mips-vdso-gcc15.patch @@ -0,0 +1,12 @@ +diff -Nur linux-6.12.25.orig/arch/mips/vdso/Makefile linux-6.12.25/arch/mips/vdso/Makefile +--- linux-6.12.25.orig/arch/mips/vdso/Makefile 2025-04-25 10:48:08.000000000 +0200 ++++ linux-6.12.25/arch/mips/vdso/Makefile 2025-04-30 19:42:08.538362252 +0200 +@@ -30,7 +30,7 @@ + -O3 -g -fPIC -fno-strict-aliasing -fno-common -fno-builtin -G 0 \ + -mrelax-pic-calls $(call cc-option, -mexplicit-relocs) \ + -fno-stack-protector -fno-jump-tables -DDISABLE_BRANCH_PROFILING \ +- $(call cc-option, -fno-asynchronous-unwind-tables) ++ $(call cc-option, -fno-asynchronous-unwind-tables) -std=gnu11 + aflags-vdso := $(ccflags-vdso) \ + -D__ASSEMBLY__ -Wa,-gdwarf-2 + diff --git a/target/linux/patches/6.15.6/0001-pcmcia-Add-Hitachi-HD6446x-PCMCIA-socket-support.patch b/target/linux/patches/6.15.6/0001-pcmcia-Add-Hitachi-HD6446x-PCMCIA-socket-support.patch new file mode 100644 index 000000000..5c46fe5e4 --- /dev/null +++ b/target/linux/patches/6.15.6/0001-pcmcia-Add-Hitachi-HD6446x-PCMCIA-socket-support.patch @@ -0,0 +1,720 @@ +From b6ffbcb525539139a9b2255b992622f92757ea37 Mon Sep 17 00:00:00 2001 +From: Artur Rojek <contact@artur-rojek.eu> +Date: Fri, 1 Aug 2025 22:52:22 +0200 +Subject: [PATCH] pcmcia: Add Hitachi HD6446x PCMCIA socket support + +Introduce support for the PC Card Controller part of the Hitachi HD6446x +series of Intelligent Peripheral Controllers. + +WIP code. DO NOT UPSTREAM! +--- + arch/sh/boards/mach-hp6xx/setup.c | 45 ++- + arch/sh/cchips/hd6446x/hd64461.c | 56 +++- + arch/sh/include/asm/hd64461.h | 6 +- + drivers/pcmcia/Kconfig | 7 + + drivers/pcmcia/Makefile | 1 + + drivers/pcmcia/hd6446x_pcc.c | 453 ++++++++++++++++++++++++++++++ + include/pcmcia/hd6446x_pcc.h | 9 + + 7 files changed, 569 insertions(+), 8 deletions(-) + create mode 100644 drivers/pcmcia/hd6446x_pcc.c + create mode 100644 include/pcmcia/hd6446x_pcc.h + +diff --git a/arch/sh/boards/mach-hp6xx/setup.c b/arch/sh/boards/mach-hp6xx/setup.c +index 2ceead68d7bf..c697b8e1f5ac 100644 +--- a/arch/sh/boards/mach-hp6xx/setup.c ++++ b/arch/sh/boards/mach-hp6xx/setup.c +@@ -18,19 +18,23 @@ + #include <mach/hp6xx.h> + #include <cpu/dac.h> + ++#include <pcmcia/hd6446x_pcc.h> ++ + #define SCPCR 0xa4000116 + #define SCPDR 0xa4000136 + ++#define CF_MEM_ATTR (0x15000000 - 0) ++ + /* CF Slot */ + static struct resource cf_ide_resources[] = { + [0] = { +- .start = 0x15000000 + 0x1f0, +- .end = 0x15000000 + 0x1f0 + 0x08 - 0x01, ++ .start = CF_MEM_ATTR + 0x1f0, ++ .end = CF_MEM_ATTR + 0x1f0 + 0x08 - 0x01, + .flags = IORESOURCE_MEM, + }, + [1] = { +- .start = 0x15000000 + 0x1fe, +- .end = 0x15000000 + 0x1fe + 0x01, ++ .start = CF_MEM_ATTR + 0x1fe, ++ .end = CF_MEM_ATTR + 0x1fe + 0x01, + .flags = IORESOURCE_MEM, + }, + [2] = { +@@ -51,6 +55,36 @@ static struct platform_device jornadakbd_device = { + .id = -1, + }; + ++static struct resource hd6446x_pcc_resources[] = { ++ [0] = { ++ .start = HD64461_PCC0ISR, ++ .end = HD64461_PCC0ISR + 0x10, ++ .flags = IORESOURCE_MEM, ++ }, ++ [1] = { ++ .start = HD64461_PCC0_BASE, ++ .end = HD64461_PCC0_BASE + 0x4000000, ++ .flags = IORESOURCE_MEM, ++ }, ++ [2] = { ++ .start = HD64461_IRQ_PCC0, ++ .flags = IORESOURCE_IRQ, ++ }, ++}; ++ ++static struct hd6446x_pcc_plat_data hd6446x_pcc_platform_data = { ++ .slot_id = 1, ++ .io_support = true, ++}; ++ ++static struct platform_device hp6446x_pcc_device = { ++ .name = "hd6446x_pcc", ++ .id = -1, ++ .num_resources = ARRAY_SIZE(hd6446x_pcc_resources), ++ .resource = hd6446x_pcc_resources, ++ .dev.platform_data = &hd6446x_pcc_platform_data, ++}; ++ + static void dac_audio_start(struct dac_audio_pdata *pdata) + { + u16 v; +@@ -108,6 +142,7 @@ static struct platform_device *hp6xx_devices[] __initdata = { + &cf_ide_device, + &jornadakbd_device, + &dac_audio_device, ++ &hp6446x_pcc_device, + }; + + static void __init hp6xx_init_irq(void) +@@ -126,6 +161,8 @@ static void __init hp6xx_setup(char **cmdline_p) + u8 v8; + u16 v; + ++ __set_io_port_base(0); ++ + v = inw(HD64461_STBCR); + v |= HD64461_STBCR_SURTST | HD64461_STBCR_SIRST | + HD64461_STBCR_STM1ST | HD64461_STBCR_STM0ST | +diff --git a/arch/sh/cchips/hd6446x/hd64461.c b/arch/sh/cchips/hd6446x/hd64461.c +index 81764882d87d..965486584ee5 100644 +--- a/arch/sh/cchips/hd6446x/hd64461.c ++++ b/arch/sh/cchips/hd6446x/hd64461.c +@@ -4,7 +4,9 @@ + * Hitachi HD64461 companion chip support + */ + ++#include <linux/clkdev.h> + #include <linux/sched.h> ++#include <linux/sh_clk.h> + #include <linux/module.h> + #include <linux/kernel.h> + #include <linux/param.h> +@@ -45,7 +47,7 @@ static void hd64461_mask_and_ack_irq(struct irq_data *data) + hd64461_mask_irq(data); + + #ifdef CONFIG_HD64461_ENABLER +- if (data->irq == HD64461_IRQBASE + 13) ++ if (data->irq == HD64461_IRQ_PCC1) + __raw_writeb(0x00, HD64461_PCC1CSCR); + #endif + } +@@ -72,6 +74,51 @@ static void hd64461_irq_demux(struct irq_desc *desc) + } + } + ++static int hd64461_clk_enable(struct clk *clk) ++{ ++ u16 reg = __raw_readw(HD64461_STBCR); ++ ++ printk("clk enable: %d\n", clk->enable_bit); ++ ++ __raw_writew(reg & ~(1 << clk->enable_bit), HD64461_STBCR); ++ ++ return 0; ++} ++ ++static void hd64461_clk_disable(struct clk *clk) ++{ ++ u16 reg = __raw_readw(HD64461_STBCR); ++ ++ printk("clk disable: %d\n", clk->enable_bit); ++ //panic("clk disable: %d\n", clk->enable_bit); ++ ++ ++ __raw_writew(reg | (1 << clk->enable_bit), HD64461_STBCR); ++} ++ ++static struct sh_clk_ops hd64461_clk_ops = { ++ .enable = hd64461_clk_enable, ++ .disable = hd64461_clk_disable, ++}; ++ ++static struct clk hd64461_clk[] = { ++ { ++ .enable_bit = 5, ++ .ops = &hd64461_clk_ops, ++ .flags = CLK_ENABLE_ON_INIT, ++ }, ++ { ++ .enable_bit = 6, ++ .ops = &hd64461_clk_ops, ++ .flags = CLK_ENABLE_ON_INIT, ++ }, ++}; ++ ++static struct clk_lookup hd64461_clk_lookup[] = { ++ CLKDEV_CON_ID("pcc1", &hd64461_clk[0]), ++ CLKDEV_CON_ID("pcc0", &hd64461_clk[1]), ++}; ++ + static int __init setup_hd64461(void) + { + int irq_base, i; +@@ -106,6 +153,13 @@ static int __init setup_hd64461(void) + __raw_writeb(0x00, HD64461_PCC1CSCR); + #endif + ++// for (i = 0; i < ARRAY_SIZE(hd64461_clk); i++) ++// clk_register(&hd64461_clk[i]); ++ clk_register(&hd64461_clk[1]); ++ clkdev_add_table(hd64461_clk_lookup, ARRAY_SIZE(hd64461_clk_lookup)); ++ ++ printk("done with clk setup\n"); ++ + return 0; + } + +diff --git a/arch/sh/include/asm/hd64461.h b/arch/sh/include/asm/hd64461.h +index d2c485fa333b..91823ec07f79 100644 +--- a/arch/sh/include/asm/hd64461.h ++++ b/arch/sh/include/asm/hd64461.h +@@ -17,9 +17,9 @@ + #define HD64461_IOBASE 0xb0000000 + #define HD64461_IO_OFFSET(x) (HD64461_IOBASE + (x)) + #define HD64461_PCC0_BASE HD64461_IO_OFFSET(0x8000000) +-#define HD64461_PCC0_ATTR (HD64461_PCC0_BASE) /* 0xb80000000 */ +-#define HD64461_PCC0_COMM (HD64461_PCC0_BASE+HD64461_PCC_WINDOW) /* 0xb90000000 */ +-#define HD64461_PCC0_IO (HD64461_PCC0_BASE+2*HD64461_PCC_WINDOW) /* 0xba0000000 */ ++#define HD64461_PCC0_ATTR (HD64461_PCC0_BASE) /* 0xb8000000 */ ++#define HD64461_PCC0_COMM (HD64461_PCC0_BASE+HD64461_PCC_WINDOW) /* 0xb9000000 */ ++#define HD64461_PCC0_IO (HD64461_PCC0_BASE+2*HD64461_PCC_WINDOW) /* 0xba000000 */ + + /* Area 5 - Slot 1 - memory card only */ + #define HD64461_PCC1_BASE HD64461_IO_OFFSET(0x4000000) +diff --git a/drivers/pcmcia/Kconfig b/drivers/pcmcia/Kconfig +index dddb235dd020..f2434ca15c8e 100644 +--- a/drivers/pcmcia/Kconfig ++++ b/drivers/pcmcia/Kconfig +@@ -159,6 +159,13 @@ config PCMCIA_ALCHEMY_DEVBOARD + + This driver is also available as a module called db1xxx_ss.ko + ++config PCMCIA_HD6446X_PCC ++ tristate "Hitachi HD6446x PCMCIA socket support" ++ depends on PCMCIA && HD6446X_SERIES ++ help ++ Say Y here to include support for the PC Card Controller part of ++ the Hitachi HD6446x series of Intelligent Peripheral Controllers. ++ + config PCMCIA_XXS1500 + tristate "MyCable XXS1500 PCMCIA socket support" + depends on PCMCIA && MIPS_XXS1500 +diff --git a/drivers/pcmcia/Makefile b/drivers/pcmcia/Makefile +index c9d51b150682..764df19be544 100644 +--- a/drivers/pcmcia/Makefile ++++ b/drivers/pcmcia/Makefile +@@ -33,6 +33,7 @@ obj-$(CONFIG_OMAP_CF) += omap_cf.o + obj-$(CONFIG_ELECTRA_CF) += electra_cf.o + obj-$(CONFIG_PCMCIA_ALCHEMY_DEVBOARD) += db1xxx_ss.o + obj-$(CONFIG_PCMCIA_MAX1600) += max1600.o ++obj-$(CONFIG_PCMCIA_HD6446X_PCC) += hd6446x_pcc.o + + sa1111_cs-y += sa1111_generic.o + sa1111_cs-$(CONFIG_ASSABET_NEPONSET) += sa1111_neponset.o +diff --git a/drivers/pcmcia/hd6446x_pcc.c b/drivers/pcmcia/hd6446x_pcc.c +new file mode 100644 +index 000000000000..31074f93b55b +--- /dev/null ++++ b/drivers/pcmcia/hd6446x_pcc.c +@@ -0,0 +1,453 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* ++ * PC Card Controller driver for the Hitachi HD6446x series of Intelligent ++ * Peripheral Controllers. ++ * ++ * Copyright (c) 2023 - 2024 Artur Rojek <contact@artur-rojek.eu> ++ */ ++ ++#include <linux/clk.h> ++#include <linux/interrupt.h> ++#include <linux/of.h> ++#include <linux/platform_device.h> ++#include <pcmcia/hd6446x_pcc.h> ++#include <pcmcia/ss.h> ++#include <asm/hd64461.h> ++ ++#include "mach-common/mach/hp6xx.h" ++ ++#define HD6446X_PCC_ISR 0x00 ++#define HD6446X_PCC_GCR 0x02 ++#define HD6446X_PCC_CSCR 0x04 ++#define HD6446X_PCC_CSCIER 0x06 ++#define HD6446X_PCC_SCR 0x08 ++ ++#define HD6446X_PCC_ISR_CD (BIT(2) | BIT(3)) ++#define HD6446X_PCC_ISR_VS1 BIT(4) ++#define HD6446X_PCC_ISR_VS2 BIT(5) ++#define HD6446X_PCC_ISR_MWP BIT(6) ++#define HD6446X_PCC_ISR_READY BIT(7) ++ ++#define HD6446X_PCC_GCR_PMMOD BIT(3) ++#define HD6446X_PCC_GCR_VCC0 BIT(4) ++#define HD6446X_PCC_GCR_PCCT BIT(5) ++#define HD6446X_PCC_GCR_PCCR BIT(6) ++#define HD6446X_PCC_GCR_DRV BIT(7) ++ ++#define HD6446X_PCC_CSCR_BD BIT(0) ++#define HD6446X_PCC_CSCR_BW BIT(1) ++#define HD6446X_PCC_CSCR_RC BIT(2) ++#define HD6446X_PCC_CSCR_CDC BIT(3) ++#define HD6446X_PCC_CSCR_SC BIT(4) ++#define HD6446X_PCC_CSCR_IREQ BIT(5) ++#define HD6446X_PCC_CSCR_SCDI BIT(7) ++ ++#define HD6446X_PCC_CSCIER_BDE BIT(0) ++#define HD6446X_PCC_CSCIER_BWE BIT(1) ++#define HD6446X_PCC_CSCIER_RE BIT(2) ++#define HD6446X_PCC_CSCIER_CDE BIT(3) ++#define HD6446X_PCC_CSCIER_SCE BIT(4) ++#define HD6446X_PCC_CSCIER_IREQE_FALLING BIT(6) ++ ++#define HD6446X_PCC_SCR_VCC1 BIT(1) ++ ++#define HD6446X_PCC_WINDOW 0x1000000 /* 16 MiB */ ++ ++struct hd6446x_pcc { ++ const struct hd6446x_pcc_plat_data *pdata; ++ void __iomem *reg; ++ void __iomem *base; ++ struct clk *clk; ++ struct pcmcia_socket socket; ++ struct socket_state_t state; ++ bool memory_card; ++}; ++ ++static int hd64461_pcmcia_socket_set_voltage(struct hd6446x_pcc *pcc, int Vcc) ++{ ++ int gcr, scr, stbcr; ++ ++ gcr = readb(pcc->reg + HD6446X_PCC_GCR); ++ scr = readb(pcc->reg + HD6446X_PCC_SCR); ++ ++ switch (Vcc) { ++ case 0: ++ gcr |= HD6446X_PCC_GCR_VCC0; ++ scr |= HD6446X_PCC_SCR_VCC1; ++ break; ++ case 33: ++ gcr |= HD6446X_PCC_GCR_VCC0; ++ scr &= ~HD6446X_PCC_SCR_VCC1; ++ break; ++ case 50: ++ gcr &= ~HD6446X_PCC_GCR_VCC0; ++ scr &= ~HD6446X_PCC_SCR_VCC1; ++ break; ++ default: ++ printk("Unsupported voltage: %d\n", Vcc); ++ return -EINVAL; ++ } ++ ++ writeb(gcr, pcc->reg + HD6446X_PCC_GCR); ++ writeb(scr, pcc->reg + HD6446X_PCC_SCR); ++ ++// stbcr = readw(HD64461_STBCR); ++ ++ if (Vcc > 0) ++ clk_enable(pcc->clk); ++// stbcr &= ~HD64461_STBCR_SPC0ST; ++ else ++ clk_disable(pcc->clk); ++// stbcr |= HD64461_STBCR_SPC0ST; ++ ++// writew(stbcr, HD64461_STBCR); ++ ++ return 0; ++} ++ ++static int hd64461_pcmcia_socket_init(struct pcmcia_socket *sock) ++{ ++ struct hd6446x_pcc *pcc = sock->driver_data; ++ int reg; ++ ++ printk("socket_init\n"); ++ ++// printk("init BCR1: %04x\n", readw(0xffffff60)); ++ ++ (void)hd64461_pcmcia_socket_set_voltage(pcc, 0); ++ ++ reg = readb(HD64461_GPADR); ++ reg &= ~HD64461_GPADR_PCMCIA0; ++ writeb(reg, HD64461_GPADR); ++ ++ return 0; ++} ++ ++static int hd64461_pcmcia_socket_get_status(struct pcmcia_socket *sock, ++ unsigned int *value) ++{ ++// struct hd64461_pcmcia_socket *socket = sock->driver_data; ++ struct hd6446x_pcc *pcc = sock->driver_data; ++ unsigned int status = 0; ++ int reg; ++ ++ printk("get_status\n"); ++ ++ reg = readb(pcc->reg + HD6446X_PCC_ISR); ++< |