sh updates for v7.4

- sh: Select BINFMT_FLAT_NO_DATA_START_OFFSET for !MMU
 - sh: maple: Use the matching IRQ cookie when invoking free_irq()
 - sh: sh7785lcr: Register the PCA9564 controller as I2C bus 0
 - sh: intc: Sort the prio and sense lists after filling them
 - sh: defconfig: Enable the current M66592 UDC symbol
 - sh: uaccess: Require offsettable operands for 64-bit user access
 - sh: Fix built-in DTB build with generic rule
 - sh: ecovec24: Use static device properties to describe the touchscreen
 - sh: mach-x3proto: Convert gpio-keys to software nodes
 - sh: mach-x3proto: Add software node for GPIO controller
 -----BEGIN PGP SIGNATURE-----
 
 iQIzBAABCAAdFiEEYv+KdYTgKVaVRgAGdCY7N/W1+RMFAmrdzCIACgkQdCY7N/W1
 +ROkZxAApukdmfWDHcpKukMCnWtD+6pRjGqeVnqASlFlvcKKo1sSAvArnviJmnv5
 gyXwIrbsCxSVqvKFWcPjRmxar/p11/UsJpqRgz+L3K4VDfUNVnRSluUdjCu08oVA
 zB0Y22guz+Zuufc4Jid869Joe5GAmXdQ6Y4ZxqhTzWeRf1D/MViHsSctAe/IgkYy
 OhdqknJFLBlS7nhoRGtu2e6FGtgeV6I/Xo7P9rWwZIfOkfLPg8oC8ypbv+Cw/0tj
 DNqOsHI74Pq44UmYaN3t/G6ez5L8qdZeqxdQ4WUie47y68ZyiQXPbI29xLIYB2zs
 qaUJhGXNtb+jTpdHZTRGTVmknMlukkbWZaKHpZsD+YRC/pX4+a2VkkjiRx/T+WhP
 4BYBKORFDek5a6q7VDHDAqZb7De+4llnxNbgHVqpgdGDhS2kR4aUfYCCgzAkoaJc
 9X+DPgaub9fUk2NfcSMWVOofphI6rTset77MDP8zbzZpgwWa6KxPEo3bet3wKoj6
 BFvu2D1PvzuCjWGYW6byiw6vr2oAxOQUzIv6dhrPC9tlMi6TdDlZnmo1QaarXtPp
 SQbwXXgFfZhxYcEq9SWvI5czl/beetTTCuam/nO8GfHQBLuIZ3988doVObeXPeaE
 ptFez7tFpL6AQHKpQ2PmpbHEK1U5nEcEZfCHdm/opld4pSjhzyw=
 =vcIw
 -----END PGP SIGNATURE-----

Merge tag 'sh-for-v7.4-tag1' of git://git.kernel.org/pub/scm/linux/kernel/git/glaubitz/sh-linux

Pull sh updates from John Paul Adrian Glaubitz:
 "Fixes and improvements for various boards as well as the generic sh
  kernel:

   - help the mach-x3proto and ecovec24 boards get rid off the use of
     the old platform data API in the kernel. For the former board,
     software nodes are being used for gpio-keys now while for the
     latter board, static device properties are used to describe the
     touchscreen (Dmitry Torokhov)

   - a build fix when CONFIG_BUILTIN_DTB is enabled, and fix an issue
     with __get_user_u64() and __put_user_u64() using wrong memory
     operands which could cause the kernel build to fail with "invalid
     'asm'" or an internal compiler error in GCC's change_address_1
     (Florian Fuchs)

   - update various default configuration files of several boards to
     replace the removed CONFIG_USB_GADGET_M66592 with the new
     CONFIG_USB_M66592 Kconfig option (Pengpeng Hou)

   - fix two issues with the SH-7785LCR evaluation board: fix a kernel
     memory leak which occurred as a result of the prio and sense lists
     being sorted too early in register_intc_controller(), and fix the
     the registration of the PCA9564 controller so that the RTC works
     properly again (Karl Mehltretter)

   - fix missing cookies when calling free_irq() in the maple bus driver
     which ensures that IRQ handlers can be properly unregistered and
     the kernel does not emit a WARN message (Runyu Xiao)

   - select BINFMT_FLAT_NO_DATA_START_OFFSET for !MMU configurations
     such that there is no gap at the end of text and init runs which
     causes the GOT register to point below the real GOT, so every GOT
     load reads the neighbouring slot and gets a wrong pointer (Waldemar
     Brodkorb)"

* tag 'sh-for-v7.4-tag1' of git://git.kernel.org/pub/scm/linux/kernel/git/glaubitz/sh-linux:
  sh: Select BINFMT_FLAT_NO_DATA_START_OFFSET for !MMU
  sh: maple: Use the matching IRQ cookie when invoking free_irq()
  sh: sh7785lcr: Register the PCA9564 controller as I2C bus 0
  sh: intc: Sort the prio and sense lists after filling them
  sh: defconfig: Enable the current M66592 UDC symbol
  sh: uaccess: Require offsettable operands for 64-bit user access
  sh: Fix built-in DTB build with generic rule
  sh: ecovec24: Use static device properties to describe the touchscreen
  sh: mach-x3proto: Convert gpio-keys to software nodes
  sh: mach-x3proto: Add software node for GPIO controller
This commit is contained in:
Linus Torvalds 2026-10-25 17:58:48 -10:00
commit 44dc57ed1e
13 changed files with 122 additions and 132 deletions

View File

@ -15,6 +15,7 @@ config SUPERH
select ARCH_MIGHT_HAVE_PC_PARPORT
select ARCH_WANT_IPC_PARSE_VERSION
select ARCH_NEED_CMPXCHG_1_EMU
select BINFMT_FLAT_NO_DATA_START_OFFSET if !MMU
select CPU_NO_EFFICIENT_FFS
select DMA_DECLARE_COHERENT
select GENERIC_ATOMIC64

View File

@ -256,7 +256,7 @@ static struct i2c_pca9564_pf_platform_data i2c_platform_data = {
static struct platform_device i2c_device = {
.name = "i2c-pca-platform",
.id = -1,
.id = 0,
.dev = {
.platform_data = &i2c_platform_data,
},

View File

@ -26,6 +26,7 @@
#include <linux/platform_data/tmio.h>
#include <linux/platform_data/tsc2007.h>
#include <linux/platform_device.h>
#include <linux/property.h>
#include <linux/regulator/fixed.h>
#include <linux/regulator/machine.h>
#include <linux/sh_eth.h>
@ -589,39 +590,21 @@ static struct platform_device keysc_device = {
/* TouchScreen */
#define IRQ0 evt2irq(0x600)
static int ts_get_pendown_state(struct device *dev)
{
int val = 0;
gpio_free(GPIO_FN_INTC_IRQ0);
gpio_request(GPIO_PTZ0, NULL);
gpio_direction_input(GPIO_PTZ0);
static const struct property_entry tsc2007_properties[] = {
PROPERTY_ENTRY_U32("ti,x-plate-ohms", 180),
{ }
};
val = gpio_get_value(GPIO_PTZ0);
gpio_free(GPIO_PTZ0);
gpio_request(GPIO_FN_INTC_IRQ0, NULL);
return val ? 0 : 1;
}
static int ts_init(void)
{
gpio_request(GPIO_FN_INTC_IRQ0, NULL);
return 0;
}
static struct tsc2007_platform_data tsc2007_info = {
.model = 2007,
.x_plate_ohms = 180,
.get_pendown_state = ts_get_pendown_state,
.init_platform_hw = ts_init,
static const struct software_node tsc2007_swnode = {
.name = "tsc2007",
.properties = tsc2007_properties,
};
static struct i2c_board_info ts_i2c_clients = {
I2C_BOARD_INFO("tsc2007", 0x48),
.type = "tsc2007",
.platform_data = &tsc2007_info,
.irq = IRQ0,
.swnode = &tsc2007_swnode,
};
static struct regulator_consumer_supply cn12_power_consumers[] =
@ -1242,8 +1225,9 @@ static int __init arch_setup(void)
gpio_direction_output(GPIO_PTF4, 1);
/* enable TouchScreen */
i2c_register_board_info(0, &ts_i2c_clients, 1);
gpio_request(GPIO_FN_INTC_IRQ0, NULL);
irq_set_irq_type(IRQ0, IRQ_TYPE_LEVEL_LOW);
i2c_register_board_info(0, &ts_i2c_clients, 1);
}
/* enable CEU0 */

View File

@ -18,6 +18,7 @@
#include <linux/io.h>
#include <mach/ilsel.h>
#include <mach/hardware.h>
#include <linux/property.h>
#define KEYCTLR 0xb81c0000
#define KEYOUTR 0xb81c0002
@ -73,6 +74,10 @@ static void x3proto_gpio_irq_handler(struct irq_desc *desc)
chip->irq_unmask(data);
}
const struct software_node x3proto_gpiochip_node = {
.name = "x3proto-gpio",
};
struct gpio_chip x3proto_gpio_chip = {
.label = "x3proto-gpio",
.direction_input = x3proto_gpio_direction_input,
@ -104,9 +109,15 @@ int __init x3proto_gpio_setup(void)
if (unlikely(ilsel < 0))
return ilsel;
ret = software_node_register(&x3proto_gpiochip_node);
if (ret)
goto err_gpio;
x3proto_gpio_chip.fwnode = software_node_fwnode(&x3proto_gpiochip_node);
ret = gpiochip_add_data(&x3proto_gpio_chip, NULL);
if (unlikely(ret))
goto err_gpio;
goto err_swnode;
x3proto_irq_domain = irq_domain_create_linear(NULL, NR_BASEBOARD_GPIOS,
&x3proto_gpio_irq_ops, NULL);
@ -127,6 +138,8 @@ int __init x3proto_gpio_setup(void)
err_irq:
gpiochip_remove(&x3proto_gpio_chip);
ret = 0;
err_swnode:
software_node_unregister(&x3proto_gpiochip_node);
err_gpio:
synchronize_irq(ilsel);

View File

@ -16,8 +16,8 @@
#include <linux/input.h>
#include <linux/usb/r8a66597.h>
#include <linux/usb/m66592.h>
#include <linux/gpio/driver.h>
#include <linux/gpio_keys.h>
#include <linux/gpio/machine.h>
#include <linux/gpio/property.h>
#include <mach/ilsel.h>
#include <mach/hardware.h>
#include <asm/smp-ops.h>
@ -123,87 +123,74 @@ static struct platform_device m66592_usb_peripheral_device = {
.resource = m66592_usb_peripheral_resources,
};
static struct gpio_keys_button baseboard_buttons[NR_BASEBOARD_GPIOS] = {
{
.desc = "key44",
.code = KEY_POWER,
.active_low = 1,
.wakeup = 1,
}, {
.desc = "key43",
.code = KEY_SUSPEND,
.active_low = 1,
.wakeup = 1,
}, {
.desc = "key42",
.code = KEY_KATAKANAHIRAGANA,
.active_low = 1,
}, {
.desc = "key41",
.code = KEY_SWITCHVIDEOMODE,
.active_low = 1,
}, {
.desc = "key34",
.code = KEY_F12,
.active_low = 1,
}, {
.desc = "key33",
.code = KEY_F11,
.active_low = 1,
}, {
.desc = "key32",
.code = KEY_F10,
.active_low = 1,
}, {
.desc = "key31",
.code = KEY_F9,
.active_low = 1,
}, {
.desc = "key24",
.code = KEY_F8,
.active_low = 1,
}, {
.desc = "key23",
.code = KEY_F7,
.active_low = 1,
}, {
.desc = "key22",
.code = KEY_F6,
.active_low = 1,
}, {
.desc = "key21",
.code = KEY_F5,
.active_low = 1,
}, {
.desc = "key14",
.code = KEY_F4,
.active_low = 1,
}, {
.desc = "key13",
.code = KEY_F3,
.active_low = 1,
}, {
.desc = "key12",
.code = KEY_F2,
.active_low = 1,
}, {
.desc = "key11",
.code = KEY_F1,
.active_low = 1,
},
static const struct software_node x3proto_gpio_keys_node = {
.name = "x3proto-gpio-keys",
};
static struct gpio_keys_platform_data baseboard_buttons_data = {
.buttons = baseboard_buttons,
.nbuttons = ARRAY_SIZE(baseboard_buttons),
#define __X3PROTO_KEY(_id, _code, _gpio, ...) \
static const struct property_entry x3proto_key##_id##_props[] = { \
PROPERTY_ENTRY_STRING("label", "key" #_id), \
PROPERTY_ENTRY_U32("linux,code", _code), \
PROPERTY_ENTRY_GPIO("gpios", &x3proto_gpiochip_node, \
_gpio, GPIO_ACTIVE_LOW), \
__VA_ARGS__ \
{ } \
}; \
static const struct software_node x3proto_key##_id##_node = { \
.parent = &x3proto_gpio_keys_node, \
.properties = x3proto_key##_id##_props, \
}
#define X3PROTO_KEY(_id, _code, _gpio) \
__X3PROTO_KEY(_id, _code, _gpio)
#define X3PROTO_KEY_WAKEUP(_id, _code, _gpio) \
__X3PROTO_KEY(_id, _code, _gpio, \
PROPERTY_ENTRY_BOOL("wakeup-source"), \
)
X3PROTO_KEY_WAKEUP(44, KEY_POWER, 0);
X3PROTO_KEY_WAKEUP(43, KEY_SUSPEND, 1);
X3PROTO_KEY(42, KEY_KATAKANAHIRAGANA, 2);
X3PROTO_KEY(41, KEY_SWITCHVIDEOMODE, 3);
X3PROTO_KEY(34, KEY_F12, 4);
X3PROTO_KEY(33, KEY_F11, 5);
X3PROTO_KEY(32, KEY_F10, 6);
X3PROTO_KEY(31, KEY_F9, 7);
X3PROTO_KEY(24, KEY_F8, 8);
X3PROTO_KEY(23, KEY_F7, 9);
X3PROTO_KEY(22, KEY_F6, 10);
X3PROTO_KEY(21, KEY_F5, 11);
X3PROTO_KEY(14, KEY_F4, 12);
X3PROTO_KEY(13, KEY_F3, 13);
X3PROTO_KEY(12, KEY_F2, 14);
X3PROTO_KEY(11, KEY_F1, 15);
static const struct software_node *const x3proto_swnodes[] __initconst = {
&x3proto_gpio_keys_node,
&x3proto_key44_node,
&x3proto_key43_node,
&x3proto_key42_node,
&x3proto_key41_node,
&x3proto_key34_node,
&x3proto_key33_node,
&x3proto_key32_node,
&x3proto_key31_node,
&x3proto_key24_node,
&x3proto_key23_node,
&x3proto_key22_node,
&x3proto_key21_node,
&x3proto_key14_node,
&x3proto_key13_node,
&x3proto_key12_node,
&x3proto_key11_node,
NULL
};
static struct platform_device baseboard_buttons_device = {
static const struct platform_device_info x3proto_gpio_keys_device_info __initconst = {
.name = "gpio-keys",
.id = -1,
.dev = {
.platform_data = &baseboard_buttons_data,
},
.id = PLATFORM_DEVID_NONE,
.swnode = &x3proto_gpio_keys_node,
};
static struct platform_device *x3proto_devices[] __initdata = {
@ -211,7 +198,6 @@ static struct platform_device *x3proto_devices[] __initdata = {
&smc91x_device,
&r8a66597_usb_host_device,
&m66592_usb_peripheral_device,
&baseboard_buttons_device,
};
static void __init x3proto_init_irq(void)
@ -224,7 +210,8 @@ static void __init x3proto_init_irq(void)
static int __init x3proto_devices_setup(void)
{
int ret, i;
struct platform_device *pd;
int ret;
/*
* IRLs are only needed for ILSEL mappings, so flip over the INTC
@ -239,11 +226,11 @@ static int __init x3proto_devices_setup(void)
if (unlikely(ret))
return ret;
/*
* Propagate dynamic GPIOs for the baseboard button device.
*/
for (i = 0; i < ARRAY_SIZE(baseboard_buttons); i++)
baseboard_buttons[i].gpio = x3proto_gpio_chip.base + i;
ret = software_node_register_node_group(x3proto_swnodes);
if (ret) {
pr_err("Failed to register software nodes: %d\n", ret);
return ret;
}
r8a66597_usb_host_resources[1].start =
r8a66597_usb_host_resources[1].end = ilsel_enable(ILSEL_USBH_I);
@ -254,8 +241,12 @@ static int __init x3proto_devices_setup(void)
smc91x_resources[1].start =
smc91x_resources[1].end = ilsel_enable(ILSEL_LAN);
return platform_add_devices(x3proto_devices,
ARRAY_SIZE(x3proto_devices));
ret = platform_add_devices(x3proto_devices, ARRAY_SIZE(x3proto_devices));
if (ret)
return ret;
pd = platform_device_register_full(&x3proto_gpio_keys_device_info);
return PTR_ERR_OR_ZERO(pd);
}
device_initcall(x3proto_devices_setup);

View File

@ -1,2 +1,2 @@
# SPDX-License-Identifier: GPL-2.0-only
obj-$(CONFIG_BUILTIN_DTB) += $(addsuffix .dtb.o, $(CONFIG_BUILTIN_DTB_NAME))
dtb-y += $(addsuffix .dtb, $(CONFIG_BUILTIN_DTB_NAME))

View File

@ -72,7 +72,7 @@ CONFIG_LOGO=y
# CONFIG_LOGO_LINUX_VGA16 is not set
# CONFIG_LOGO_LINUX_CLUT224 is not set
CONFIG_USB_GADGET=y
CONFIG_USB_GADGET_M66592=y
CONFIG_USB_M66592=y
CONFIG_USB_G_SERIAL=m
CONFIG_RTC_CLASS=y
CONFIG_RTC_DRV_RS5C372=y

View File

@ -147,7 +147,7 @@ CONFIG_USB_MON=y
CONFIG_USB_OHCI_HCD=y
CONFIG_USB_STORAGE=y
CONFIG_USB_GADGET=y
CONFIG_USB_GADGET_M66592=y
CONFIG_USB_M66592=y
CONFIG_RTC_CLASS=y
CONFIG_RTC_DRV_MAX6900=y
CONFIG_RTC_DRV_SH=y

View File

@ -79,7 +79,7 @@ CONFIG_USB=y
CONFIG_USB_MON=y
CONFIG_USB_R8A66597_HCD=m
CONFIG_USB_GADGET=y
CONFIG_USB_GADGET_M66592=y
CONFIG_USB_M66592=y
CONFIG_RTC_CLASS=y
CONFIG_RTC_DRV_SH=y
CONFIG_UIO=m

View File

@ -92,7 +92,7 @@ __asm__ __volatile__( \
".long 1b + 2, 3b\n\t" \
".previous" \
:"=&r" (err), "=&r" (x) \
:"m" (__m(addr)), "i" (-EFAULT), "0" (err)); })
:"o" (__m(addr)), "i" (-EFAULT), "0" (err)); })
#else
#define __get_user_u64(x, addr, err) \
({ \
@ -116,7 +116,7 @@ __asm__ __volatile__( \
".long 1b + 2, 3b\n\t" \
".previous" \
:"=&r" (err), "=&r" (x) \
:"m" (__m(addr)), "i" (-EFAULT), "0" (err)); })
:"o" (__m(addr)), "i" (-EFAULT), "0" (err)); })
#endif
#define __put_user_size(x,ptr,size,retval) \
@ -196,7 +196,7 @@ __asm__ __volatile__( \
".long 1b, 3b\n\t" \
".previous" \
: "=r" (retval) \
: "r" (val), "m" (__m(addr)), "i" (-EFAULT), "0" (retval) \
: "r" (val), "o" (__m(addr)), "i" (-EFAULT), "0" (retval) \
: "memory"); })
#else
#define __put_user_u64(val,addr,retval) \
@ -218,7 +218,7 @@ __asm__ __volatile__( \
".long 1b, 3b\n\t" \
".previous" \
: "=r" (retval) \
: "r" (val), "m" (__m(addr)), "i" (-EFAULT), "0" (retval) \
: "r" (val), "o" (__m(addr)), "i" (-EFAULT), "0" (retval) \
: "memory"); })
#endif

View File

@ -3,10 +3,12 @@
#define __MACH_X3PROTO_HARDWARE_H
struct gpio_chip;
struct software_node;
/* arch/sh/boards/mach-x3proto/gpio.c */
int x3proto_gpio_setup(void);
extern struct gpio_chip x3proto_gpio_chip;
extern const struct software_node x3proto_gpiochip_node;
#define NR_BASEBOARD_GPIOS 16

View File

@ -275,9 +275,6 @@ int __init register_intc_controller(struct intc_desc *desc)
k += save_reg(d, k, hw->prio_regs[i].set_reg, smp);
k += save_reg(d, k, hw->prio_regs[i].clr_reg, smp);
}
sort(d->prio, hw->nr_prio_regs, sizeof(*d->prio),
intc_handle_int_cmp, NULL);
}
if (hw->sense_regs) {
@ -287,9 +284,6 @@ int __init register_intc_controller(struct intc_desc *desc)
for (i = 0; i < hw->nr_sense_regs; i++)
k += save_reg(d, k, hw->sense_regs[i].reg, 0);
sort(d->sense, hw->nr_sense_regs, sizeof(*d->sense),
intc_handle_int_cmp, NULL);
}
if (hw->subgroups)
@ -357,6 +351,11 @@ int __init register_intc_controller(struct intc_desc *desc)
}
}
sort(d->prio, d->nr_prio, sizeof(*d->prio),
intc_handle_int_cmp, NULL);
sort(d->sense, d->nr_sense, sizeof(*d->sense),
intc_handle_int_cmp, NULL);
intc_subgroup_init(desc, d);
/* enable bits matching force_enable after registering irqs */

View File

@ -863,10 +863,10 @@ static int __init maple_bus_init(void)
kmem_cache_destroy(maple_queue_cache);
cleanup_bothirqs:
free_irq(HW_EVENT_VSYNC, 0);
free_irq(HW_EVENT_VSYNC, &maple_unsupported_device);
cleanup_irq:
free_irq(HW_EVENT_MAPLE_DMA, 0);
free_irq(HW_EVENT_MAPLE_DMA, &maple_unsupported_device);
cleanup_dma:
free_pages((unsigned long) maple_sendbuf, MAPLE_DMA_PAGES);