Merge tag 'soc-arm-7.4' of git://git.kernel.org/pub/scm/linux/kernel/git/soc/soc

Pull ARM SoC board file updates from Arnd Bergmann:
 "These are mostly smaller cleanups for the remaining platform code in
  arch/arm/, the most notable one being the conversion of the
  s3c/crag6410 board to use software nodes for GPIO references in place
  of plain GPIO numbers.

  The earlier plan was to drop the deprecated (since 7.3) board files
  here, which would have been a much larger set of changes, but that is
  now deferred to 7.5"

* tag 'soc-arm-7.4' of git://git.kernel.org/pub/scm/linux/kernel/git/soc/soc:
  MAINTAINERS: Drop arm64 dts/intel path from ARM/SOCFPGA ARCHITECTURE
  ARM: tegra: Fix Trun -> Turn typo
  ARM: vexpress: fix device_node refcount leak in vexpress_smp_dt_prepare_cpus()
  ARM: vexpress: fix device_node refcount leak in vexpress_flags_set()
  MAINTAINERS: Change ARM Visconti5 architecture maintenance status to Odd Fixes
  ARM: mvebu: fix Cortex-A9 errata selection for Armada 38x
  ARM: OMAP2+: remove unused ctrl_module_wkup_44xx.h header
  ARM: EXYNOS: Replace __ASSEMBLY__ with __ASSEMBLER__
  ARM: s3c: crag6410: use software nodes/properties to set up GPIO keys
  Input: samsung-keypad - remove support for platform data
  ARM: s3c: crag6410: switch keypad device to software properties
  ARM: s3c: register and attach software nodes for Samsung gpio_chips
  Input: samsung-keypad - handle compact binding
  dt-bindings: input: samsung,s3c6410-keypad: introduce compact binding
  ARM: imx6q: remove KSZ9021 PHY fixup
  ARM: imx: Fix suspend/resume crash with Clang CFI
  ARM: OMAP2+: Replace __ASSEMBLY__ with __ASSEMBLER__
  soc: imx: Replace __ASSEMBLY__ with __ASSEMBLER__ in header file
  ARM: imx: Replace __ASSEMBLY__ with __ASSEMBLER__
  MAINTAINERS: Add git tree for TI K3 ARCHITECTURE
This commit is contained in:
Linus Torvalds committed 2026-10-22 07:56:27 -10:00
commit aad73b807c
32 files changed
+376 -448

No files matched your search

@@ -37,6 +37,10 @@ properties:
wakeup-source: true
keypad,num-columns: true
keypad,num-rows: true
linux,keymap: true
linux,input-no-autorepeat:
type: boolean
description:
@@ -81,12 +85,33 @@ patternProperties:
- keypad,row
- linux,code
dependencies:
linux,keymap: [ "keypad,num-columns", "keypad,num-rows" ]
required:
- compatible
- reg
- interrupts
- samsung,keypad-num-columns
- samsung,keypad-num-rows
allOf:
- $ref: input.yaml#
- $ref: matrix-keymap.yaml#
- if:
required:
- linux,keymap
then:
properties:
samsung,keypad-num-columns: false
samsung,keypad-num-rows: false
patternProperties:
'^key-[0-9a-z]+$': false
else:
properties:
keypad,num-columns: false
keypad,num-rows: false
required:
- samsung,keypad-num-columns
- samsung,keypad-num-rows
additionalProperties: false
@@ -94,8 +119,9 @@ examples:
- |
#include <dt-bindings/clock/exynos4.h>
#include <dt-bindings/interrupt-controller/arm-gic.h>
#include <dt-bindings/input/input.h>
keypad@100a0000 {
keypad1@100a0000 {
compatible = "samsung,s5pv210-keypad";
reg = <0x100a0000 0x100>;
interrupts = <GIC_SPI 109 IRQ_TYPE_LEVEL_HIGH>;
@@ -119,3 +145,24 @@ examples:
linux,code = <3>;
};
};
- |
#include <dt-bindings/clock/exynos4.h>
#include <dt-bindings/interrupt-controller/arm-gic.h>
#include <dt-bindings/input/input.h>
keypad2@100a0000 {
compatible = "samsung,s5pv210-keypad";
reg = <0x100a0000 0x100>;
interrupts = <GIC_SPI 109 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&clock CLK_KEYIF>;
clock-names = "keypad";
keypad,num-rows = <2>;
keypad,num-columns = <8>;
linux,keymap = <
MATRIX_KEY(0, 3, 2)
MATRIX_KEY(0, 4, 3)
>;
linux,input-no-autorepeat;
wakeup-source;
};
+2 -2
View File
@@ -3639,7 +3639,6 @@ F: arch/arm/boot/dts/intel/socfpga/
F: arch/arm/configs/socfpga_defconfig
F: arch/arm/mach-socfpga/
F: arch/arm64/boot/dts/altera/
F: arch/arm64/boot/dts/intel/
ARM/SOCFPGA CLOCK FRAMEWORK SUPPORT
M: Dinh Nguyen <dinguyen@kernel.org>
@@ -3802,6 +3801,7 @@ M: Vignesh Raghavendra <vigneshr@ti.com>
M: Tero Kristo <kristo@kernel.org>
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
S: Supported
T: git git://git.kernel.org/pub/scm/linux/kernel/git/ti/linux.git
F: Documentation/devicetree/bindings/arm/ti/k3.yaml
F: Documentation/devicetree/bindings/hwinfo/ti,k3-socinfo.yaml
F: arch/arm64/boot/dts/ti/Makefile
@@ -3819,7 +3819,7 @@ F: arch/arm/boot/dts/nspire/
ARM/TOSHIBA VISCONTI ARCHITECTURE
M: Nobuhiro Iwamatsu <nobuhiro.iwamatsu.x90@mail.toshiba>
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
S: Supported
S: Odd Fixes
T: git git://git.kernel.org/pub/scm/linux/kernel/git/iwamatsu/linux-visconti.git
F: Documentation/devicetree/bindings/arm/toshiba.yaml
F: Documentation/devicetree/bindings/clock/toshiba,tmpv770x-pipllct.yaml
+29
View File
@@ -9,4 +9,33 @@
.type name, %function; \
END(name)
#ifdef __ASSEMBLY__
/*
* Variants of SYM_TYPED_START/SYM_TYPED_FUNC_START that align the
* function entry itself instead of the kCFI type hash preceding it,
* for functions whose entry point must meet an alignment requirement,
* such as the 8-byte alignment fncpy() demands of its source.
*/
#ifdef CONFIG_CFI
#define SYM_TYPED_START_ALIGNED(name, linkage, align) \
linkage(name) ASM_NL \
.balign align ASM_NL \
.fill (align) - 4, 1, 0 ASM_NL \
__CFI_TYPE(name) ASM_NL \
name:
#else /* CONFIG_CFI */
#define SYM_TYPED_START_ALIGNED(name, linkage, align) \
SYM_START(name, linkage, .balign align)
#endif /* CONFIG_CFI */
#define SYM_TYPED_FUNC_START_ALIGNED(name, align) \
SYM_TYPED_START_ALIGNED(name, SYM_L_GLOBAL, align)
#endif /* __ASSEMBLY__ */
#endif
+2 -2
View File
@@ -32,11 +32,11 @@
#define SMC_REG_CLASS_SFR_W (0x1 << 30)
#define SMC_REG_ID_SFR_W(addr) (SMC_REG_CLASS_SFR_W | ((addr) >> 2))
#ifndef __ASSEMBLY__
#ifndef __ASSEMBLER__
extern void exynos_smc(u32 cmd, u32 arg1, u32 arg2, u32 arg3);
#endif /* __ASSEMBLY__ */
#endif /* __ASSEMBLER__ */
/* op type for SMC_CMD_SAVE and SMC_CMD_SHUTDOWN */
#define OP_TYPE_CORE 0x0
+1 -1
View File
@@ -7,7 +7,7 @@
#ifndef __ASM_ARCH_MXC_HARDWARE_H__
#define __ASM_ARCH_MXC_HARDWARE_H__
#ifndef __ASSEMBLY__
#ifndef __ASSEMBLER__
#include <asm/io.h>
#include <soc/imx/revision.h>
#endif
-30
View File
@@ -20,26 +20,6 @@
#include "cpuidle.h"
#include "hardware.h"
/* For imx6q sabrelite board: set KSZ9021RN RGMII pad skew */
static int ksz9021rn_phy_fixup(struct phy_device *phydev)
{
if (IS_BUILTIN(CONFIG_PHYLIB)) {
/* min rx data delay */
phy_write(phydev, MICREL_KSZ9021_EXTREG_CTRL,
0x8000 | MICREL_KSZ9021_RGMII_RX_DATA_PAD_SCEW);
phy_write(phydev, MICREL_KSZ9021_EXTREG_DATA_WRITE, 0x0000);
/* max rx/tx clock delay, min rx/tx control delay */
phy_write(phydev, MICREL_KSZ9021_EXTREG_CTRL,
0x8000 | MICREL_KSZ9021_RGMII_CLK_CTRL_PAD_SCEW);
phy_write(phydev, MICREL_KSZ9021_EXTREG_DATA_WRITE, 0xf0f0);
phy_write(phydev, MICREL_KSZ9021_EXTREG_CTRL,
MICREL_KSZ9021_RGMII_CLK_CTRL_PAD_SCEW);
}
return 0;
}
/*
* fixup for PLX PEX8909 bridge to configure GPIO1-7 as output High
* as they are used for slots1-7 PERST#
@@ -68,14 +48,6 @@ DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_PLX, 0x8609, ventana_pciesw_early_fixup);
DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_PLX, 0x8606, ventana_pciesw_early_fixup);
DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_PLX, 0x8604, ventana_pciesw_early_fixup);
static void __init imx6q_enet_phy_init(void)
{
if (IS_BUILTIN(CONFIG_PHYLIB)) {
phy_register_fixup_for_uid(PHY_ID_KSZ9021, MICREL_PHY_ID_MASK,
ksz9021rn_phy_fixup);
}
}
static void __init imx6q_1588_init(void)
{
struct device_node *np;
@@ -179,8 +151,6 @@ static void __init imx6q_init_machine(void)
imx_print_silicon_rev(cpu_is_imx6dl() ? "i.MX6DL" : "i.MX6Q",
imx_get_soc_revision());
imx6q_enet_phy_init();
of_platform_default_populate(NULL, NULL, NULL);
imx_anatop_init();
+1 -1
View File
@@ -16,7 +16,7 @@
#define IMX_DDR_TYPE_LPDDR2 1
#ifndef __ASSEMBLY__
#ifndef __ASSEMBLER__
#ifdef CONFIG_SOC_IMX6SL
static inline bool cpu_is_imx6sl(void)
+23 -3
View File
@@ -4,6 +4,8 @@
* Copyright 2011 Linaro Ltd.
*/
#include <linux/build_bug.h>
#include <linux/cfi.h>
#include <linux/clk/imx.h>
#include <linux/delay.h>
#include <linux/init.h>
@@ -18,6 +20,7 @@
#include <linux/of_platform.h>
#include <linux/platform_device.h>
#include <linux/regmap.h>
#include <linux/stddef.h>
#include <linux/suspend.h>
#include <asm/cacheflush.h>
#include <asm/fncpy.h>
@@ -61,9 +64,9 @@
#define MX6Q_SUSPEND_OCRAM_SIZE 0x1000
#define MX6_MAX_MMDC_IO_NUM 33
static void __iomem *ccm_base;
static void __iomem *suspend_ocram_base;
static void (*imx6_suspend_in_ocram_fn)(void __iomem *ocram_vbase);
static void __iomem *ccm_base __ro_after_init;
static void __iomem *suspend_ocram_base __ro_after_init;
static void (*imx6_suspend_in_ocram_fn)(void __iomem *ocram_vbase) __ro_after_init;
/*
* suspend ocram space layout:
@@ -229,8 +232,18 @@ struct imx6_cpu_pm_info {
struct imx6_pm_base l2_base;
u32 mmdc_io_num; /* Number of MMDC IOs which need saved/restored. */
u32 mmdc_io_val[MX6_MAX_MMDC_IO_NUM][2]; /* To save offset and value */
u32 cfi_type; /* kCFI type hash of imx6_suspend() */
} __aligned(8);
/*
* The ocram copy of imx6_suspend() starts right after struct imx6_cpu_pm_info,
* and the CFI check on the indirect call reads the kCFI type hash from the
* four bytes preceding the function entry, so cfi_type must occupy the last
* four bytes of the struct, i.e. fit into its tail padding.
*/
static_assert(offsetofend(struct imx6_cpu_pm_info, cfi_type) ==
sizeof(struct imx6_cpu_pm_info));
void imx6_set_int_mem_clk_lpm(bool enable)
{
u32 val = readl_relaxed(ccm_base + CGPR);
@@ -568,6 +581,13 @@ static int __init imx6q_suspend_init(const struct imx6_pm_socdata *socdata)
mmdc_offset_array[i]);
}
/*
* Mask out the Thumb bit, as cfi_get_func_hash() expects the
* function's actual start address. Returns 0 if CONFIG_CFI=n.
*/
pm_info->cfi_type =
cfi_get_func_hash((void *)((uintptr_t)&imx6_suspend & ~1UL));
imx6_suspend_in_ocram_fn = fncpy(
suspend_ocram_base + sizeof(*pm_info),
&imx6_suspend,
+4 -2
View File
@@ -3,6 +3,7 @@
* Copyright 2014 Freescale Semiconductor, Inc.
*/
#include <linux/cfi_types.h>
#include <linux/linkage.h>
#include <asm/assembler.h>
#include <asm/asm-offsets.h>
@@ -148,7 +149,8 @@
.endm
ENTRY(imx6_suspend)
/* fncpy() requires an 8-byte-aligned entry; see arch/arm/include/asm/fncpy.h */
SYM_TYPED_FUNC_START_ALIGNED(imx6_suspend, 8)
ldr r1, [r0, #PM_INFO_PBASE_OFFSET]
ldr r2, [r0, #PM_INFO_RESUME_ADDR_OFFSET]
ldr r3, [r0, #PM_INFO_DDR_TYPE_OFFSET]
@@ -329,4 +331,4 @@ resume:
resume_mmdc
ret lr
ENDPROC(imx6_suspend)
SYM_FUNC_END(imx6_suspend)
+3 -1
View File
@@ -55,7 +55,9 @@ config MACH_ARMADA_375
config MACH_ARMADA_38X
bool "Marvell Armada 380/385 boards"
depends on ARCH_MULTI_V7
select ARM_ERRATA_720789
select ARM_ERRATA_754322
select ARM_ERRATA_764319
select ARM_ERRATA_764369 if SMP
select PL310_ERRATA_753970
select ARM_GIC
select ARM_GLOBAL_TIMER
+4 -4
View File
@@ -18,7 +18,7 @@
#include "am33xx.h"
#ifndef __ASSEMBLY__
#ifndef __ASSEMBLER__
#define OMAP242X_CTRL_REGADDR(reg) \
OMAP2_L4_IO_ADDRESS(OMAP242X_CTRL_BASE + (reg))
#define OMAP243X_CTRL_REGADDR(reg) \
@@ -36,7 +36,7 @@
OMAP2_L4_IO_ADDRESS(OMAP343X_CTRL_BASE + (reg))
#define AM33XX_CTRL_REGADDR(reg) \
AM33XX_L4_WK_IO_ADDRESS(AM33XX_SCM_BASE + (reg))
#endif /* __ASSEMBLY__ */
#endif /* __ASSEMBLER__ */
/*
* As elsewhere, the "OMAP2_" prefix indicates that the macro is valid for
@@ -503,7 +503,7 @@
#define FEAT_NEON_NONE 1
#ifndef __ASSEMBLY__
#ifndef __ASSEMBLER__
#ifdef CONFIG_ARCH_OMAP2PLUS
extern u8 omap_ctrl_readb(u16 offset);
extern u16 omap_ctrl_readw(u16 offset);
@@ -534,7 +534,7 @@ int omap_control_init(void);
#define omap_ctrl_writel(x, y) WARN_ON(1)
#define omap4_ctrl_pad_writel(x, y) WARN_ON(1)
#endif
#endif /* __ASSEMBLY__ */
#endif /* __ASSEMBLER__ */
#endif /* __ARCH_ARM_MACH_OMAP2_CONTROL_H */
@@ -1,89 +0,0 @@
/* SPDX-License-Identifier: GPL-2.0-only */
/*
* OMAP44xx CTRL_MODULE_WKUP registers and bitfields
*
* Copyright (C) 2009-2010 Texas Instruments, Inc.
*
* Benoit Cousson (b-cousson@ti.com)
* Santosh Shilimkar (santosh.shilimkar@ti.com)
*
* This file is automatically generated from the OMAP hardware databases.
* We respectfully ask that any modifications to this file be coordinated
* with the public linux-omap@vger.kernel.org mailing list and the
* authors above to ensure that the autogeneration scripts are kept
* up-to-date with the file contents.
*/
#ifndef __ARCH_ARM_MACH_OMAP2_CTRL_MODULE_WKUP_44XX_H
#define __ARCH_ARM_MACH_OMAP2_CTRL_MODULE_WKUP_44XX_H
/* Base address */
#define OMAP4_CTRL_MODULE_WKUP 0x4a30c000
/* Registers offset */
#define OMAP4_CTRL_MODULE_WKUP_IP_REVISION 0x0000
#define OMAP4_CTRL_MODULE_WKUP_IP_HWINFO 0x0004
#define OMAP4_CTRL_MODULE_WKUP_IP_SYSCONFIG 0x0010
#define OMAP4_CTRL_MODULE_WKUP_CONF_DEBUG_SEL_TST_0 0x0460
#define OMAP4_CTRL_MODULE_WKUP_CONF_DEBUG_SEL_TST_1 0x0464
#define OMAP4_CTRL_MODULE_WKUP_CONF_DEBUG_SEL_TST_2 0x0468
#define OMAP4_CTRL_MODULE_WKUP_CONF_DEBUG_SEL_TST_3 0x046c
#define OMAP4_CTRL_MODULE_WKUP_CONF_DEBUG_SEL_TST_4 0x0470
#define OMAP4_CTRL_MODULE_WKUP_CONF_DEBUG_SEL_TST_5 0x0474
#define OMAP4_CTRL_MODULE_WKUP_CONF_DEBUG_SEL_TST_6 0x0478
#define OMAP4_CTRL_MODULE_WKUP_CONF_DEBUG_SEL_TST_7 0x047c
#define OMAP4_CTRL_MODULE_WKUP_CONF_DEBUG_SEL_TST_8 0x0480
#define OMAP4_CTRL_MODULE_WKUP_CONF_DEBUG_SEL_TST_9 0x0484
#define OMAP4_CTRL_MODULE_WKUP_CONF_DEBUG_SEL_TST_10 0x0488
#define OMAP4_CTRL_MODULE_WKUP_CONF_DEBUG_SEL_TST_11 0x048c
#define OMAP4_CTRL_MODULE_WKUP_CONF_DEBUG_SEL_TST_12 0x0490
#define OMAP4_CTRL_MODULE_WKUP_CONF_DEBUG_SEL_TST_13 0x0494
#define OMAP4_CTRL_MODULE_WKUP_CONF_DEBUG_SEL_TST_14 0x0498
#define OMAP4_CTRL_MODULE_WKUP_CONF_DEBUG_SEL_TST_15 0x049c
#define OMAP4_CTRL_MODULE_WKUP_CONF_DEBUG_SEL_TST_16 0x04a0
#define OMAP4_CTRL_MODULE_WKUP_CONF_DEBUG_SEL_TST_17 0x04a4
#define OMAP4_CTRL_MODULE_WKUP_CONF_DEBUG_SEL_TST_18 0x04a8
#define OMAP4_CTRL_MODULE_WKUP_CONF_DEBUG_SEL_TST_19 0x04ac
#define OMAP4_CTRL_MODULE_WKUP_CONF_DEBUG_SEL_TST_20 0x04b0
#define OMAP4_CTRL_MODULE_WKUP_CONF_DEBUG_SEL_TST_21 0x04b4
#define OMAP4_CTRL_MODULE_WKUP_CONF_DEBUG_SEL_TST_22 0x04b8
#define OMAP4_CTRL_MODULE_WKUP_CONF_DEBUG_SEL_TST_23 0x04bc
#define OMAP4_CTRL_MODULE_WKUP_CONF_DEBUG_SEL_TST_24 0x04c0
#define OMAP4_CTRL_MODULE_WKUP_CONF_DEBUG_SEL_TST_25 0x04c4
#define OMAP4_CTRL_MODULE_WKUP_CONF_DEBUG_SEL_TST_26 0x04c8
#define OMAP4_CTRL_MODULE_WKUP_CONF_DEBUG_SEL_TST_27 0x04cc
#define OMAP4_CTRL_MODULE_WKUP_CONF_DEBUG_SEL_TST_28 0x04d0
#define OMAP4_CTRL_MODULE_WKUP_CONF_DEBUG_SEL_TST_29 0x04d4
#define OMAP4_CTRL_MODULE_WKUP_CONF_DEBUG_SEL_TST_30 0x04d8
#define OMAP4_CTRL_MODULE_WKUP_CONF_DEBUG_SEL_TST_31 0x04dc
/* Registers shifts and masks */
/* IP_REVISION */
#define OMAP4_IP_REV_SCHEME_SHIFT 30
#define OMAP4_IP_REV_SCHEME_MASK (0x3 << 30)
#define OMAP4_IP_REV_FUNC_SHIFT 16
#define OMAP4_IP_REV_FUNC_MASK (0xfff << 16)
#define OMAP4_IP_REV_RTL_SHIFT 11
#define OMAP4_IP_REV_RTL_MASK (0x1f << 11)
#define OMAP4_IP_REV_MAJOR_SHIFT 8
#define OMAP4_IP_REV_MAJOR_MASK (0x7 << 8)
#define OMAP4_IP_REV_CUSTOM_SHIFT 6
#define OMAP4_IP_REV_CUSTOM_MASK (0x3 << 6)
#define OMAP4_IP_REV_MINOR_SHIFT 0
#define OMAP4_IP_REV_MINOR_MASK (0x3f << 0)
/* IP_HWINFO */
#define OMAP4_IP_HWINFO_SHIFT 0
#define OMAP4_IP_HWINFO_MASK (0xffffffff << 0)
/* IP_SYSCONFIG */
#define OMAP4_IP_SYSCONFIG_IDLEMODE_SHIFT 2
#define OMAP4_IP_SYSCONFIG_IDLEMODE_MASK (0x3 << 2)
/* CONF_DEBUG_SEL_TST_0 */
#define OMAP4_WKUP_MODE_SHIFT 0
#define OMAP4_WKUP_MODE_MASK (1 << 0)
#endif
+2 -2
View File
@@ -19,7 +19,7 @@
#include "am33xx.h"
#include "omap54xx.h"
#ifndef __ASSEMBLY__
#ifndef __ASSEMBLER__
#include <linux/bitops.h>
#include <linux/of.h>
@@ -501,4 +501,4 @@ level(__##fn);
#define cpu_is_ti816x() soc_is_ti816x()
#define cpu_is_ti81xx() soc_is_ti81xx()
#endif /* __ASSEMBLY__ */
#endif /* __ASSEMBLER__ */
+2 -2
View File
@@ -3,7 +3,7 @@
* Interface for functions that need to be run in internal SRAM
*/
#ifndef __ASSEMBLY__
#ifndef __ASSEMBLER__
extern void omap2_sram_ddr_init(u32 *slow_dll_ctrl, u32 fast_dll_ctrl,
u32 base_cs, u32 force_unlock);
@@ -48,7 +48,7 @@ extern void omap_push_sram_idle(void);
static inline void omap_push_sram_idle(void) {}
#endif /* CONFIG_PM */
#endif /* __ASSEMBLY__ */
#endif /* __ASSEMBLER__ */
/*
* OMAP2+: define the SRAM PA addresses.
-5
View File
@@ -111,11 +111,6 @@ config S3C64XX_DEV_SPI0
Compile in platform device definitions for S3C64XX's type
SPI controller 0
config SAMSUNG_DEV_KEYPAD
bool
help
Compile in platform device definitions for keypad
config SAMSUNG_DEV_PWM
bool
help
-7
View File
@@ -81,11 +81,6 @@ config S3C64XX_SETUP_FB_24BPP
help
Common setup code for S3C64XX with an 24bpp RGB display helper.
config S3C64XX_SETUP_KEYPAD
bool
help
Common setup code for S3C64XX KEYPAD GPIO configurations
config S3C64XX_SETUP_SDHCI_GPIO
bool
help
@@ -113,7 +108,6 @@ config MACH_WLF_CRAGG_6410
select S3C64XX_DEV_SPI0
select S3C64XX_SETUP_FB_24BPP
select S3C64XX_SETUP_I2C1
select S3C64XX_SETUP_KEYPAD
select S3C64XX_SETUP_SDHCI
select S3C64XX_SETUP_SPI
select S3C64XX_SETUP_USB_PHY
@@ -124,7 +118,6 @@ config MACH_WLF_CRAGG_6410
select S3C_DEV_I2C1
select S3C_DEV_USB_HOST
select S3C_DEV_USB_HSOTG
select SAMSUNG_DEV_KEYPAD
select SAMSUNG_DEV_PWM
help
Machine support for the Wolfson Cragganmore S3C6410 variant.
-1
View File
@@ -32,7 +32,6 @@ obj-y += dev-audio-s3c64xx.o
obj-$(CONFIG_S3C64XX_SETUP_FB_24BPP) += setup-fb-24bpp-s3c64xx.o
obj-$(CONFIG_S3C64XX_SETUP_I2C0) += setup-i2c0-s3c64xx.o
obj-$(CONFIG_S3C64XX_SETUP_I2C1) += setup-i2c1-s3c64xx.o
obj-$(CONFIG_S3C64XX_SETUP_KEYPAD) += setup-keypad-s3c64xx.o
obj-$(CONFIG_S3C64XX_SETUP_SDHCI_GPIO) += setup-sdhci-gpio-s3c64xx.o
obj-$(CONFIG_S3C64XX_SETUP_SPI) += setup-spi-s3c64xx.o
obj-$(CONFIG_S3C64XX_SETUP_USB_PHY) += setup-usb-phy-s3c64xx.o
-27
View File
@@ -39,7 +39,6 @@
#include "devs.h"
#include "fb.h"
#include <linux/platform_data/i2c-s3c2410.h>
#include "keypad.h"
#include "pwm-core.h"
#include "sdhci.h"
#include "usb-phy.h"
@@ -265,32 +264,6 @@ void __init s3c_i2c1_set_platdata(struct s3c2410_platform_i2c *pd)
}
#endif /* CONFIG_S3C_DEV_I2C1 */
/* KEYPAD */
#ifdef CONFIG_SAMSUNG_DEV_KEYPAD
static struct resource samsung_keypad_resources[] = {
[0] = DEFINE_RES_MEM(SAMSUNG_PA_KEYPAD, SZ_32),
[1] = DEFINE_RES_IRQ(IRQ_KEYPAD),
};
struct platform_device samsung_device_keypad = {
.name = "samsung-keypad",
.id = -1,
.num_resources = ARRAY_SIZE(samsung_keypad_resources),
.resource = samsung_keypad_resources,
};
void __init samsung_keypad_set_platdata(struct samsung_keypad_platdata *pd)
{
struct samsung_keypad_platdata *npd;
npd = s3c_set_platdata(pd, sizeof(*npd), &samsung_device_keypad);
if (!npd->cfg_gpio)
npd->cfg_gpio = samsung_keypad_cfg_gpio;
}
#endif /* CONFIG_SAMSUNG_DEV_KEYPAD */
/* PWM Timer */
#ifdef CONFIG_SAMSUNG_DEV_PWM
-1
View File
@@ -39,7 +39,6 @@ extern struct platform_device s3c_device_i2c1;
extern struct platform_device s3c_device_ohci;
extern struct platform_device s3c_device_usb_hsotg;
extern struct platform_device samsung_device_keypad;
extern struct platform_device samsung_device_pwm;
/**
+3
View File
@@ -14,6 +14,8 @@
#include "gpio-samsung.h"
#include <linux/gpio/driver.h>
struct software_node;
#define GPIOCON_OFF (0x00)
#define GPIODAT_OFF (0x04)
@@ -66,6 +68,7 @@ struct samsung_gpio_cfg;
*/
struct samsung_gpio_chip {
struct gpio_chip chip;
const struct software_node *swnode;
struct samsung_gpio_cfg *config;
struct samsung_gpio_pm *pm;
void __iomem *base;
+5
View File
@@ -13,6 +13,8 @@
#ifdef CONFIG_GPIO_SAMSUNG
#include <linux/property.h>
/* GPIO bank sizes */
#define S3C64XX_GPIO_A_NR (8)
#define S3C64XX_GPIO_B_NR (7)
@@ -89,6 +91,9 @@ enum s3c_gpio_number {
/* define the number of gpios we need to the one after the GPQ() range */
#define GPIO_BOARD_START (S3C64XX_GPQ(S3C64XX_GPIO_Q_NR) + 1)
extern const struct software_node samsung_gpiochip_nodes[];
#define SAMSUNG_GPIO_NODE(node) (&samsung_gpiochip_nodes[(node) - 'A'])
#endif /* GPIO_SAMSUNG */
#endif /* GPIO_SAMSUNG_S3C64XX_H */
+55 -17
View File
@@ -37,6 +37,28 @@
#include "gpio-cfg-helpers.h"
#include "pm.h"
const struct software_node samsung_gpiochip_nodes[] = {
SOFTWARE_NODE("GPA", NULL, NULL),
SOFTWARE_NODE("GPB", NULL, NULL),
SOFTWARE_NODE("GPC", NULL, NULL),
SOFTWARE_NODE("GPD", NULL, NULL),
SOFTWARE_NODE("GPE", NULL, NULL),
SOFTWARE_NODE("GPF", NULL, NULL),
SOFTWARE_NODE("GPG", NULL, NULL),
SOFTWARE_NODE("GPH", NULL, NULL),
SOFTWARE_NODE("GPI", NULL, NULL),
SOFTWARE_NODE("GPJ", NULL, NULL),
SOFTWARE_NODE("GPK", NULL, NULL),
SOFTWARE_NODE("GPL", NULL, NULL),
SOFTWARE_NODE("GPM", NULL, NULL),
SOFTWARE_NODE("GPN", NULL, NULL),
SOFTWARE_NODE("GPO", NULL, NULL),
SOFTWARE_NODE("GPP", NULL, NULL),
SOFTWARE_NODE("GPQ", NULL, NULL),
};
#define NUM_SAMSUNG_GPIOCHIPS ARRAY_SIZE(samsung_gpiochip_nodes)
static int samsung_gpio_setpull_updown(struct samsung_gpio_chip *chip,
unsigned int off, samsung_gpio_pull_t pull)
{
@@ -491,6 +513,16 @@ static __init void s3c_gpiolib_track(struct samsung_gpio_chip *chip)
}
#endif /* CONFIG_S3C_GPIO_TRACK */
static void __init samsung_setup_gpiochip_nodes(void)
{
const struct software_node *group[NUM_SAMSUNG_GPIOCHIPS + 1] = { 0 };
for (unsigned int i = 0; i < NUM_SAMSUNG_GPIOCHIPS; i++)
group[i] = &samsung_gpiochip_nodes[i];
software_node_register_node_group(group);
}
/*
* samsung_gpiolib_add() - add the Samsung gpio_chip.
* @chip: The chip to register
@@ -506,12 +538,16 @@ static void __init samsung_gpiolib_add(struct samsung_gpio_chip *chip)
struct gpio_chip *gc = &chip->chip;
int ret;
gc->label = chip->swnode->name;
BUG_ON(!chip->base);
BUG_ON(!gc->label);
BUG_ON(!gc->ngpio);
spin_lock_init(&chip->lock);
gc->fwnode = software_node_fwnode(chip->swnode);
if (!gc->direction_input)
gc->direction_input = samsung_gpiolib_2bit_input;
if (!gc->direction_output)
@@ -659,49 +695,49 @@ static struct samsung_gpio_chip s3c64xx_gpios_4bit[] = {
.chip = {
.base = S3C64XX_GPA(0),
.ngpio = S3C64XX_GPIO_A_NR,
.label = "GPA",
},
.swnode = SAMSUNG_GPIO_NODE('A'),
}, {
.chip = {
.base = S3C64XX_GPB(0),
.ngpio = S3C64XX_GPIO_B_NR,
.label = "GPB",
},
.swnode = SAMSUNG_GPIO_NODE('B'),
}, {
.chip = {
.base = S3C64XX_GPC(0),
.ngpio = S3C64XX_GPIO_C_NR,
.label = "GPC",
},
.swnode = SAMSUNG_GPIO_NODE('C'),
}, {
.chip = {
.base = S3C64XX_GPD(0),
.ngpio = S3C64XX_GPIO_D_NR,
.label = "GPD",
},
.swnode = SAMSUNG_GPIO_NODE('D'),
}, {
.config = &samsung_gpio_cfgs[0],
.chip = {
.base = S3C64XX_GPE(0),
.ngpio = S3C64XX_GPIO_E_NR,
.label = "GPE",
},
.swnode = SAMSUNG_GPIO_NODE('E'),
}, {
.base = S3C64XX_GPG_BASE,
.chip = {
.base = S3C64XX_GPG(0),
.ngpio = S3C64XX_GPIO_G_NR,
.label = "GPG",
},
.swnode = SAMSUNG_GPIO_NODE('G'),
}, {
.base = S3C64XX_GPM_BASE,
.config = &samsung_gpio_cfgs[1],
.chip = {
.base = S3C64XX_GPM(0),
.ngpio = S3C64XX_GPIO_M_NR,
.label = "GPM",
.to_irq = s3c64xx_gpiolib_mbank_to_irq,
},
.swnode = SAMSUNG_GPIO_NODE('M'),
},
};
@@ -711,25 +747,25 @@ static struct samsung_gpio_chip s3c64xx_gpios_4bit2[] = {
.chip = {
.base = S3C64XX_GPH(0),
.ngpio = S3C64XX_GPIO_H_NR,
.label = "GPH",
},
.swnode = SAMSUNG_GPIO_NODE('H'),
}, {
.base = S3C64XX_GPK_BASE + 0x4,
.config = &samsung_gpio_cfgs[0],
.chip = {
.base = S3C64XX_GPK(0),
.ngpio = S3C64XX_GPIO_K_NR,
.label = "GPK",
},
.swnode = SAMSUNG_GPIO_NODE('K'),
}, {
.base = S3C64XX_GPL_BASE + 0x4,
.config = &samsung_gpio_cfgs[1],
.chip = {
.base = S3C64XX_GPL(0),
.ngpio = S3C64XX_GPIO_L_NR,
.label = "GPL",
.to_irq = s3c64xx_gpiolib_lbank_to_irq,
},
.swnode = SAMSUNG_GPIO_NODE('L'),
},
};
@@ -740,43 +776,43 @@ static struct samsung_gpio_chip s3c64xx_gpios_2bit[] = {
.chip = {
.base = S3C64XX_GPF(0),
.ngpio = S3C64XX_GPIO_F_NR,
.label = "GPF",
},
.swnode = SAMSUNG_GPIO_NODE('F'),
}, {
.config = &samsung_gpio_cfgs[7],
.chip = {
.base = S3C64XX_GPI(0),
.ngpio = S3C64XX_GPIO_I_NR,
.label = "GPI",
},
.swnode = SAMSUNG_GPIO_NODE('I'),
}, {
.config = &samsung_gpio_cfgs[7],
.chip = {
.base = S3C64XX_GPJ(0),
.ngpio = S3C64XX_GPIO_J_NR,
.label = "GPJ",
},
.swnode = SAMSUNG_GPIO_NODE('J'),
}, {
.config = &samsung_gpio_cfgs[6],
.chip = {
.base = S3C64XX_GPO(0),
.ngpio = S3C64XX_GPIO_O_NR,
.label = "GPO",
},
.swnode = SAMSUNG_GPIO_NODE('O'),
}, {
.config = &samsung_gpio_cfgs[6],
.chip = {
.base = S3C64XX_GPP(0),
.ngpio = S3C64XX_GPIO_P_NR,
.label = "GPP",
},
.swnode = SAMSUNG_GPIO_NODE('P'),
}, {
.config = &samsung_gpio_cfgs[6],
.chip = {
.base = S3C64XX_GPQ(0),
.ngpio = S3C64XX_GPIO_Q_NR,
.label = "GPQ",
},
.swnode = SAMSUNG_GPIO_NODE('Q'),
}, {
.base = S3C64XX_GPN_BASE,
.irq_base = IRQ_EINT(0),
@@ -784,9 +820,9 @@ static struct samsung_gpio_chip s3c64xx_gpios_2bit[] = {
.chip = {
.base = S3C64XX_GPN(0),
.ngpio = S3C64XX_GPIO_N_NR,
.label = "GPN",
.to_irq = samsung_gpiolib_to_irq,
},
.swnode = SAMSUNG_GPIO_NODE('N'),
},
};
@@ -803,6 +839,8 @@ static __init int samsung_gpiolib_init(void)
return 0;
if (soc_is_s3c64xx()) {
samsung_setup_gpiochip_nodes();
samsung_gpiolib_set_cfg(samsung_gpio_cfgs,
ARRAY_SIZE(samsung_gpio_cfgs));
samsung_gpiolib_add_2bit_chips(s3c64xx_gpios_2bit,
-27
View File
@@ -1,27 +0,0 @@
/* SPDX-License-Identifier: GPL-2.0+ */
/*
* Samsung Platform - Keypad platform data definitions
*
* Copyright (C) 2010 Samsung Electronics Co.Ltd
* Author: Joonyoung Shim <jy0922.shim@samsung.com>
*/
#ifndef __PLAT_SAMSUNG_KEYPAD_H
#define __PLAT_SAMSUNG_KEYPAD_H
#include <linux/input/samsung-keypad.h>
/**
* samsung_keypad_set_platdata - Set platform data for Samsung Keypad device.
* @pd: Platform data to register to device.
*
* Register the given platform data for use with Samsung Keypad device.
* The call will copy the platform data, so the board definitions can
* make the structure itself __initdata.
*/
extern void samsung_keypad_set_platdata(struct samsung_keypad_platdata *pd);
/* defined by architecture to configure gpio. */
extern void samsung_keypad_cfg_gpio(unsigned int rows, unsigned int cols);
#endif /* __PLAT_SAMSUNG_KEYPAD_H */
+100 -35
View File
@@ -15,13 +15,16 @@
#include <linux/io.h>
#include <linux/init.h>
#include <linux/input-event-codes.h>
#include <linux/input/matrix_keypad.h>
#include <linux/gpio/legacy.h>
#include <linux/gpio/machine.h>
#include <linux/gpio/property.h>
#include <linux/leds.h>
#include <linux/delay.h>
#include <linux/mmc/host.h>
#include <linux/regulator/machine.h>
#include <linux/regulator/fixed.h>
#include <linux/property.h>
#include <linux/pwm.h>
#include <linux/pwm_backlight.h>
#include <linux/dm9000.h>
@@ -53,7 +56,6 @@
#include "gpio-cfg.h"
#include <linux/platform_data/spi-s3c64xx.h>
#include "keypad.h"
#include "devs.h"
#include "cpu.h"
#include <linux/platform_data/i2c-s3c2410.h>
@@ -176,7 +178,7 @@ static struct s3c_fb_platdata crag6410_lcd_pdata = {
/* 2x6 keypad */
static uint32_t crag6410_keymap[] = {
static const u32 crag6410_keymap[] __initconst = {
/* KEY(row, col, keycode) */
KEY(0, 0, KEY_VOLUMEUP),
KEY(0, 1, KEY_HOME),
@@ -192,43 +194,103 @@ static uint32_t crag6410_keymap[] = {
KEY(1, 5, KEY_CAMERA),
};
static struct matrix_keymap_data crag6410_keymap_data = {
.keymap = crag6410_keymap,
.keymap_size = ARRAY_SIZE(crag6410_keymap),
static const struct property_entry crag6410_keypad_props[] __initconst = {
PROPERTY_ENTRY_U32("keypad,num-columns", 6),
PROPERTY_ENTRY_U32("keypad,num-rows", 2),
PROPERTY_ENTRY_U32_ARRAY("linux,keymap", crag6410_keymap),
{ }
};
static struct samsung_keypad_platdata crag6410_keypad_data = {
.keymap_data = &crag6410_keymap_data,
.rows = 2,
.cols = 6,
static const struct resource crag6410_keypad_resources[] __initconst = {
[0] = DEFINE_RES_MEM(SAMSUNG_PA_KEYPAD, SZ_32),
[1] = DEFINE_RES_IRQ(IRQ_KEYPAD),
};
static struct gpio_keys_button crag6410_gpio_keys[] = {
[0] = {
.code = KEY_SUSPEND,
.gpio = S3C64XX_GPL(10), /* EINT 18 */
.type = EV_KEY,
.wakeup = 1,
.active_low = 1,
},
[1] = {
.code = SW_FRONT_PROXIMITY,
.gpio = S3C64XX_GPN(11), /* EINT 11 */
.type = EV_SW,
},
static const struct platform_device_info crag6410_keypad_info __initconst = {
.name = "samsung-keypad",
.id = PLATFORM_DEVID_NONE,
.res = crag6410_keypad_resources,
.num_res = ARRAY_SIZE(crag6410_keypad_resources),
.properties = crag6410_keypad_props,
};
static struct gpio_keys_platform_data crag6410_gpio_keydata = {
.buttons = crag6410_gpio_keys,
.nbuttons = ARRAY_SIZE(crag6410_gpio_keys),
static void __init crag6410_setup_keypad(void)
{
struct platform_device *pd;
/* Set all the necessary GPK pins to special-function 3: KP_ROW[x] */
s3c_gpio_cfgrange_nopull(S3C64XX_GPK(8), 2, S3C_GPIO_SFN(3));
/* Set all the necessary GPL pins to special-function 3: KP_COL[x] */
s3c_gpio_cfgrange_nopull(S3C64XX_GPL(0), 6, S3C_GPIO_SFN(3));
pd = platform_device_register_full(&crag6410_keypad_info);
if (IS_ERR(pd))
pr_err("failed to instantiate keypad device\n");
}
static const struct software_node crag6410_gpio_keys_node = {
.name = "crag6410-gpio-keys",
};
static struct platform_device crag6410_gpio_keydev = {
.name = "gpio-keys",
.id = 0,
.dev.platform_data = &crag6410_gpio_keydata,
static const struct property_entry crag6410_suspend_key_props[] = {
PROPERTY_ENTRY_U32("linux,code", KEY_SUSPEND),
PROPERTY_ENTRY_GPIO("gpios",
SAMSUNG_GPIO_NODE('L'), 10, /* EINT 18 */
GPIO_ACTIVE_LOW),
PROPERTY_ENTRY_BOOL("wakeup-source"),
{ }
};
static const struct software_node crag6410_suspend_key_node = {
.parent = &crag6410_gpio_keys_node,
.properties = crag6410_suspend_key_props,
};
static const struct property_entry crag6410_prox_sw_props[] = {
PROPERTY_ENTRY_U32("linux,input-type", EV_SW),
PROPERTY_ENTRY_U32("linux,code", SW_FRONT_PROXIMITY),
PROPERTY_ENTRY_GPIO("gpios",
SAMSUNG_GPIO_NODE('N'), 11, /* EINT 11 */
GPIO_ACTIVE_HIGH),
{ }
};
static const struct software_node crag6410_prox_sw_node = {
.parent = &crag6410_gpio_keys_node,
.properties = crag6410_prox_sw_props,
};
static const struct software_node *crag6410_gpio_keys_swnodes[] = {
&crag6410_gpio_keys_node,
&crag6410_suspend_key_node,
&crag6410_prox_sw_node,
NULL
};
static void __init crag6410_setup_gpio_keys(void)
{
struct platform_device_info keys_info = {
.name = "gpio-keys",
.id = 0,
};
struct platform_device *pd;
int err;
err = software_node_register_node_group(crag6410_gpio_keys_swnodes);
if (err) {
pr_err("failed to register gpio-keys software nodes: %d\n", err);
return;
}
keys_info.fwnode = software_node_fwnode(&crag6410_gpio_keys_node);
pd = platform_device_register_full(&keys_info);
err = PTR_ERR_OR_ZERO(pd);
if (err)
pr_err("failed to create gpio-keys device: %d\n", err);
}
static struct resource crag6410_dm9k_resource[] = {
[0] = DEFINE_RES_MEM(S3C64XX_PA_XM0CSN5, 2),
[1] = DEFINE_RES_MEM(S3C64XX_PA_XM0CSN5 + (1 << 8), 2),
@@ -361,7 +423,7 @@ static struct platform_device wallvdd_device = {
},
};
static struct platform_device *crag6410_devices[] __initdata = {
static struct platform_device *crag6410_devs0[] __initdata = {
&s3c_device_hsmmc0,
&s3c_device_hsmmc2,
&s3c_device_i2c0,
@@ -372,8 +434,9 @@ static struct platform_device *crag6410_devices[] __initdata = {
&samsung_device_pwm,
&s3c64xx_device_iis0,
&s3c64xx_device_iis1,
&samsung_device_keypad,
&crag6410_gpio_keydev,
};
static struct platform_device *crag6410_devs1[] __initdata = {
&crag6410_dm9k_device,
&s3c64xx_device_spi0,
&crag6410_lcd_powerdev,
@@ -873,16 +936,18 @@ static void __init crag6410_machine_init(void)
gpiod_add_lookup_table(&crag_wm1250_ev1_gpiod_table);
i2c_register_board_info(1, i2c_devs1, ARRAY_SIZE(i2c_devs1));
samsung_keypad_set_platdata(&crag6410_keypad_data);
gpiod_add_lookup_table(&crag_spi0_gpiod_table);
s3c64xx_spi0_set_platdata(0, 2);
pwm_add_table(crag6410_pwm_lookup, ARRAY_SIZE(crag6410_pwm_lookup));
platform_add_devices(crag6410_devices, ARRAY_SIZE(crag6410_devices));
platform_add_devices(crag6410_devs0, ARRAY_SIZE(crag6410_devs0));
platform_device_register_full(&crag6410_mmgpio_devinfo);
gpiod_add_lookup_table(&crag_leds_table);
crag6410_setup_keypad();
crag6410_setup_gpio_keys();
platform_add_devices(crag6410_devs1, ARRAY_SIZE(crag6410_devs1));
gpio_led_register_device(-1, &gpio_leds_pdata);
regulator_has_full_constraints();
-20
View File
@@ -1,20 +0,0 @@
// SPDX-License-Identifier: GPL-2.0
//
// Copyright (c) 2010 Samsung Electronics Co., Ltd.
// http://www.samsung.com/
//
// GPIO configuration for S3C64XX KeyPad device
#include <linux/gpio/consumer.h>
#include "gpio-cfg.h"
#include "keypad.h"
#include "gpio-samsung.h"
void samsung_keypad_cfg_gpio(unsigned int rows, unsigned int cols)
{
/* Set all the necessary GPK pins to special-function 3: KP_ROW[x] */
s3c_gpio_cfgrange_nopull(S3C64XX_GPK(8), rows, S3C_GPIO_SFN(3));
/* Set all the necessary GPL pins to special-function 3: KP_COL[x] */
s3c_gpio_cfgrange_nopull(S3C64XX_GPL(0), cols, S3C_GPIO_SFN(3));
}
+1 -1
View File
@@ -48,7 +48,7 @@ ENTRY(tegra_disable_clean_inv_dcache)
blne v7_flush_dcache_louis
bleq v7_flush_dcache_all
/* Trun off coherency */
/* Turn off coherency */
exit_smp r4, r5
ldmfd sp!, {r0, r4-r5, r7, r9-r11, pc}
+2 -2
View File
@@ -61,8 +61,8 @@ static const struct of_device_id vexpress_smp_dt_scu_match[] __initconst = {
static void __init vexpress_smp_dt_prepare_cpus(unsigned int max_cpus)
{
struct device_node *scu = of_find_matching_node(NULL,
vexpress_smp_dt_scu_match);
struct device_node *scu __free(device_node) =
of_find_matching_node(NULL, vexpress_smp_dt_scu_match);
if (scu)
scu_enable(of_iomap(scu, 0));
+2 -2
View File
@@ -13,8 +13,8 @@ void vexpress_flags_set(u32 data)
static void __iomem *base;
if (!base) {
struct device_node *node = of_find_compatible_node(NULL, NULL,
"arm,vexpress-sysreg");
struct device_node *node __free(device_node) =
of_find_compatible_node(NULL, NULL, "arm,vexpress-sysreg");
base = of_iomap(node, 0);
}
+84 -116
View File
@@ -12,6 +12,7 @@
#include <linux/delay.h>
#include <linux/err.h>
#include <linux/input.h>
#include <linux/input/matrix_keypad.h>
#include <linux/interrupt.h>
#include <linux/io.h>
#include <linux/module.h>
@@ -21,7 +22,9 @@
#include <linux/slab.h>
#include <linux/of.h>
#include <linux/sched.h>
#include <linux/input/samsung-keypad.h>
#define SAMSUNG_MAX_ROWS 8
#define SAMSUNG_MAX_COLS 8
#define SAMSUNG_KEYIFCON 0x00
#define SAMSUNG_KEYIFSTSCLR 0x04
@@ -221,145 +224,92 @@ static void samsung_keypad_close(struct input_dev *input_dev)
samsung_keypad_stop(keypad);
}
#ifdef CONFIG_OF
static struct samsung_keypad_platdata *
samsung_keypad_parse_dt(struct device *dev)
static int samsung_parse_verbose_keymap(struct samsung_keypad *keypad)
{
struct samsung_keypad_platdata *pdata;
struct matrix_keymap_data *keymap_data;
uint32_t *keymap, num_rows = 0, num_cols = 0;
struct device_node *np = dev->of_node, *key_np;
unsigned int key_count;
struct matrix_keymap_data keymap_data = { 0 };
struct device *dev = &keypad->pdev->dev;
struct fwnode_handle *child;
unsigned int key_count = device_get_child_node_count(dev);
unsigned int i;
if (!np) {
dev_err(dev, "missing device tree data\n");
return ERR_PTR(-EINVAL);
}
u32 *keymap __free(kfree) = kcalloc(key_count, sizeof(*keymap), GFP_KERNEL);
if (!keymap)
return -ENOMEM;
pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);
if (!pdata) {
dev_err(dev, "could not allocate memory for platform data\n");
return ERR_PTR(-ENOMEM);
}
keymap_data.keymap_size = key_count;
keymap_data.keymap = keymap;
of_property_read_u32(np, "samsung,keypad-num-rows", &num_rows);
of_property_read_u32(np, "samsung,keypad-num-columns", &num_cols);
if (!num_rows || !num_cols) {
dev_err(dev, "number of keypad rows/columns not specified\n");
return ERR_PTR(-EINVAL);
}
pdata->rows = num_rows;
pdata->cols = num_cols;
keymap_data = devm_kzalloc(dev, sizeof(*keymap_data), GFP_KERNEL);
if (!keymap_data) {
dev_err(dev, "could not allocate memory for keymap data\n");
return ERR_PTR(-ENOMEM);
}
pdata->keymap_data = keymap_data;
key_count = of_get_child_count(np);
keymap_data->keymap_size = key_count;
keymap = devm_kcalloc(dev, key_count, sizeof(uint32_t), GFP_KERNEL);
if (!keymap) {
dev_err(dev, "could not allocate memory for keymap\n");
return ERR_PTR(-ENOMEM);
}
keymap_data->keymap = keymap;
for_each_child_of_node(np, key_np) {
i = 0;
device_for_each_child_node(dev, child) {
u32 row, col, key_code;
of_property_read_u32(key_np, "keypad,row", &row);
of_property_read_u32(key_np, "keypad,column", &col);
of_property_read_u32(key_np, "linux,code", &key_code);
*keymap++ = KEY(row, col, key_code);
fwnode_property_read_u32(child, "keypad,row", &row);
fwnode_property_read_u32(child, "keypad,column", &col);
fwnode_property_read_u32(child, "linux,code", &key_code);
keymap[i++] = KEY(row, col, key_code);
}
pdata->no_autorepeat = of_property_read_bool(np, "linux,input-no-autorepeat");
pdata->wakeup = of_property_read_bool(np, "wakeup-source") ||
/* legacy name */
of_property_read_bool(np, "linux,input-wakeup");
return pdata;
return matrix_keypad_build_keymap(&keymap_data, NULL,
keypad->rows, keypad->cols,
keypad->keycodes,
keypad->input_dev);
}
#else
static struct samsung_keypad_platdata *
samsung_keypad_parse_dt(struct device *dev)
static int samsung_keypad_parse_keymap(struct samsung_keypad *keypad)
{
dev_err(dev, "no platform data defined\n");
struct device *dev = &keypad->pdev->dev;
return ERR_PTR(-EINVAL);
if (device_property_present(dev, "linux,keymap"))
return matrix_keypad_build_keymap(NULL, NULL,
keypad->rows, keypad->cols,
keypad->keycodes,
keypad->input_dev);
return samsung_parse_verbose_keymap(keypad);
}
#endif
static int samsung_keypad_probe(struct platform_device *pdev)
{
const struct samsung_keypad_platdata *pdata;
const struct matrix_keymap_data *keymap_data;
const struct platform_device_id *id;
struct device *dev = &pdev->dev;
struct samsung_keypad *keypad;
struct resource *res;
struct input_dev *input_dev;
unsigned int row_shift;
u32 num_rows = 0, num_cols = 0;
bool wakeup;
int error;
pdata = dev_get_platdata(&pdev->dev);
if (!pdata) {
pdata = samsung_keypad_parse_dt(&pdev->dev);
if (IS_ERR(pdata))
return PTR_ERR(pdata);
if (device_property_present(dev, "linux,keymap")) {
error = matrix_keypad_parse_properties(dev, &num_rows, &num_cols);
if (error)
return error;
} else {
device_property_read_u32(dev, "samsung,keypad-num-rows", &num_rows);
device_property_read_u32(dev, "samsung,keypad-num-columns", &num_cols);
if (!num_rows || !num_cols) {
dev_err(dev, "number of keypad rows/columns not specified\n");
return -EINVAL;
}
}
keymap_data = pdata->keymap_data;
if (!keymap_data) {
dev_err(&pdev->dev, "no keymap data defined\n");
return -EINVAL;
}
if (!pdata->rows || pdata->rows > SAMSUNG_MAX_ROWS)
if (num_rows > SAMSUNG_MAX_ROWS || num_cols > SAMSUNG_MAX_COLS)
return -EINVAL;
if (!pdata->cols || pdata->cols > SAMSUNG_MAX_COLS)
return -EINVAL;
/* initialize the gpio */
if (pdata->cfg_gpio)
pdata->cfg_gpio(pdata->rows, pdata->cols);
row_shift = get_count_order(pdata->cols);
row_shift = get_count_order(num_cols);
keypad = devm_kzalloc(&pdev->dev,
struct_size(keypad, keycodes,
pdata->rows << row_shift),
num_rows << row_shift),
GFP_KERNEL);
if (!keypad)
return -ENOMEM;
input_dev = devm_input_allocate_device(&pdev->dev);
if (!input_dev)
return -ENOMEM;
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (!res)
return -ENODEV;
keypad->base = devm_ioremap(&pdev->dev, res->start, resource_size(res));
if (!keypad->base)
return -EBUSY;
keypad->clk = devm_clk_get_prepared(&pdev->dev, "keypad");
if (IS_ERR(keypad->clk)) {
dev_err(&pdev->dev, "failed to get keypad clk\n");
return PTR_ERR(keypad->clk);
}
keypad->input_dev = input_dev;
keypad->pdev = pdev;
keypad->row_shift = row_shift;
keypad->rows = pdata->rows;
keypad->cols = pdata->cols;
keypad->rows = num_rows;
keypad->cols = num_cols;
keypad->stopped = true;
init_waitqueue_head(&keypad->wait);
@@ -375,26 +325,45 @@ static int samsung_keypad_probe(struct platform_device *pdev)
return -EINVAL;
}
input_dev = devm_input_allocate_device(&pdev->dev);
if (!input_dev)
return -ENOMEM;
keypad->input_dev = input_dev;
input_dev->name = pdev->name;
input_dev->id.bustype = BUS_HOST;
input_dev->open = samsung_keypad_open;
input_dev->close = samsung_keypad_close;
error = matrix_keypad_build_keymap(keymap_data, NULL,
pdata->rows, pdata->cols,
keypad->keycodes, input_dev);
error = samsung_keypad_parse_keymap(keypad);
if (error) {
dev_err(&pdev->dev, "failed to build keymap\n");
return error;
}
input_set_capability(input_dev, EV_MSC, MSC_SCAN);
if (!pdata->no_autorepeat)
if (!device_property_read_bool(&pdev->dev, "linux,input-no-autorepeat"))
__set_bit(EV_REP, input_dev->evbit);
input_set_drvdata(input_dev, keypad);
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (!res)
return -ENODEV;
keypad->base = devm_ioremap(&pdev->dev, res->start, resource_size(res));
if (!keypad->base)
return -EBUSY;
keypad->clk = devm_clk_get_prepared(&pdev->dev, "keypad");
if (IS_ERR(keypad->clk)) {
dev_err(&pdev->dev, "failed to get keypad clk\n");
return PTR_ERR(keypad->clk);
}
keypad->irq = platform_get_irq(pdev, 0);
if (keypad->irq < 0) {
error = keypad->irq;
@@ -410,7 +379,11 @@ static int samsung_keypad_probe(struct platform_device *pdev)
return error;
}
device_init_wakeup(&pdev->dev, pdata->wakeup);
wakeup = device_property_read_bool(dev, "wakeup-source") ||
/* legacy name */
device_property_read_bool(dev, "linux,input-wakeup");
device_init_wakeup(&pdev->dev, wakeup);
platform_set_drvdata(pdev, keypad);
error = devm_pm_runtime_enable(&pdev->dev);
@@ -421,11 +394,6 @@ static int samsung_keypad_probe(struct platform_device *pdev)
if (error)
return error;
if (pdev->dev.of_node) {
devm_kfree(&pdev->dev, (void *)pdata->keymap_data->keymap);
devm_kfree(&pdev->dev, (void *)pdata->keymap_data);
devm_kfree(&pdev->dev, (void *)pdata);
}
return 0;
}
-39
View File
@@ -1,39 +0,0 @@
/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
* Samsung Keypad platform data definitions
*
* Copyright (C) 2010 Samsung Electronics Co.Ltd
* Author: Joonyoung Shim <jy0922.shim@samsung.com>
*/
#ifndef __SAMSUNG_KEYPAD_H
#define __SAMSUNG_KEYPAD_H
#include <linux/input/matrix_keypad.h>
#define SAMSUNG_MAX_ROWS 8
#define SAMSUNG_MAX_COLS 8
/**
* struct samsung_keypad_platdata - Platform device data for Samsung Keypad.
* @keymap_data: pointer to &matrix_keymap_data.
* @rows: number of keypad row supported.
* @cols: number of keypad col supported.
* @no_autorepeat: disable key autorepeat.
* @wakeup: controls whether the device should be set up as wakeup source.
* @cfg_gpio: configure the GPIO.
*
* Initialisation data specific to either the machine or the platform
* for the device driver to use or call-back when configuring gpio.
*/
struct samsung_keypad_platdata {
const struct matrix_keymap_data *keymap_data;
unsigned int rows;
unsigned int cols;
bool no_autorepeat;
bool wakeup;
void (*cfg_gpio)(unsigned int rows, unsigned int cols);
};
#endif /* __SAMSUNG_KEYPAD_H */
-5
View File
@@ -47,11 +47,6 @@
#define MICREL_PHY_FXEN BIT(1)
#define MICREL_KSZ8_P1_ERRATA BIT(2)
#define MICREL_KSZ9021_EXTREG_CTRL 0xB
#define MICREL_KSZ9021_EXTREG_DATA_WRITE 0xC
#define MICREL_KSZ9021_RGMII_CLK_CTRL_PAD_SCEW 0x104
#define MICREL_KSZ9021_RGMII_RX_DATA_PAD_SCEW 0x105
/* Device specific MII_BMCR (Reg 0) bits */
/* 1 = HP Auto MDI/MDI-X mode, 0 = Microchip Auto MDI/MDI-X mode */
#define KSZ886X_BMCR_HP_MDIX BIT(5)
+1 -1
View File
@@ -30,7 +30,7 @@
#define MXC_CPU_VF600 0x600
#define MXC_CPU_VF610 (MXC_CPU_VF600 | MXC_CPU_VFx10)
#ifndef __ASSEMBLY__
#ifndef __ASSEMBLER__
extern unsigned int __mxc_cpu_type;
#endif