mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2024-12-28 16:52:18 +00:00
soc: arm platform updates for 6.11
The majority of the updates here are Dmitry Torokhov's cleanups for platform code in the pxa and tegra platforms, changing custom platform_data structures into DT-compatible software node declarations. The other updates are for the MAINTAINERS file, correcting some stale or missing entries. -----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEEiK/NIGsWEZVxh/FrYKtH/8kJUicFAmaVNvgACgkQYKtH/8kJ UiddAQ//QIfU7YJbB+nLLHURWDZsFqzmdwX9Shwb810TecwkYyeltbjkwYQw6/VD Pc1C5t08Brnjwgm9Z4jU8dKDeS4znMy1MzjyGoZqYLamNojhChXG4fonhGVYncg4 m3ruXgXZ/xsmqfMloclCtOSB6DWjXk9tVyUDNymXWgATmlwVsZl6saXf5nEo11bu WKi6kHhfM1s/JKGBaScd/GnxmXpBco4T7ub8cBZ/6Kn5RS6OodSb1ZCiTTI3KHdT oLzQ+B+MjAF5jlWvrqFuKrosjHB0RiKa/GKlfwsM4ho91Rfm979wsykEacR+iOy6 usbAdfV/AgKT0C6Hd471Kdtpt0mV5lcc4QdwQTAycslHI4CzjRmQW+yHWUJxxOEB ggEtzKimpVbInN4ygJTnA8dZIawZ/CdCZQ04hQtyEuZamx3MGYVPaNIowNq4CRlv r6NRgfvQVGeQfpJCOdUySwwxVXDsq+Q8dUvswf6qfDDRyHiAtNqnoNd/G4rsI9Uy ItsGaFHpaVi1ElAO7IyEb9JzQGRIwxryseET5cUyfhJEM5RFk4aBMYJVFtDgV4H5 KldgfIWpUZyMlM6IxdWziBDvKyrToAXb9NSX7nlcP2879IztNIwW2V+7y4rdX7Mu fTjLZxkypLdJkKvdcXNwS4toZ+CvpzcjeEJlGcPcVc1JY/Ua3Ck= =/EgX -----END PGP SIGNATURE----- Merge tag 'soc-arm-6.11' of git://git.kernel.org/pub/scm/linux/kernel/git/soc/soc Pull arm SoC platform updates from Arnd Bergmann: "The majority of the updates here are Dmitry Torokhov's cleanups for platform code in the pxa and tegra platforms, changing custom platform_data structures into DT-compatible software node declarations. The other updates are for the MAINTAINERS file, correcting some stale or missing entries" * tag 'soc-arm-6.11' of git://git.kernel.org/pub/scm/linux/kernel/git/soc/soc: ARM: pxa: fix build breakage on PXA3xx ti: omap: MAINTAINERS: move Benoît Cousson to CREDITS amazon: MAINTAINERS: change to odd fixes and Tsahee Zidenberg to CREDITS MAINTAINERS: thead: add git tree ARM: spitz: Use software nodes for the ADS7846 touchscreen ARM: spitz: Use software nodes to describe LED GPIOs ARM: spitz: Use software nodes to describe MMC GPIOs ARM: spitz: Use software nodes to describe LCD GPIOs ARM: spitz: Use software nodes to describe audio GPIOs ARM: spitz: Use software nodes to describe SPI CS lines ARM: spitz: Simplify instantiating SPI controller ARM: pxa/gumstix: convert vbus gpio to use software nodes ARM: pxa: consolidate GPIO chip platform data ARM: spitz: fix GPIO assignment for backlight ARM: tegra: paz00: Use software nodes to describe GPIOs for WiFi rfkill MAINTAINERS: ARM: airoha: add entry to cover Airoha SoC bus: vexpress-config: Add missing MODULE_DESCRIPTION() macro arm64: layerscape: remove redundant EDAC_SUPPORT selection dt-bindings: arm: Remove obsolete RTSM DCSCB binding arm: vexpress: Remove obsolete RTSM DCSCB support
This commit is contained in:
commit
a5db8e4544
9
CREDITS
9
CREDITS
@ -796,6 +796,11 @@ E: luisfcorreia@gmail.com
|
||||
D: Ralink rt2x00 WLAN driver
|
||||
S: Belas, Portugal
|
||||
|
||||
N: Benoît Cousson
|
||||
E: bcousson@baylibre.com
|
||||
D: TI OMAP Devicetree platforms
|
||||
D: TI OMAP HWMOD boards
|
||||
|
||||
N: Alan Cox
|
||||
W: http://www.linux.org.uk/diary/
|
||||
D: Linux Networking (0.99.10->2.0.29)
|
||||
@ -4368,6 +4373,10 @@ N: Haojian Zhuang
|
||||
E: haojian.zhuang@gmail.com
|
||||
D: MMP support
|
||||
|
||||
N: Tsahee Zidenberg
|
||||
E: tsahee@annapurnalabs.com
|
||||
D: Annapurna Labs Alpine Architecture
|
||||
|
||||
N: Richard Zidlicky
|
||||
E: rz@linux-m68k.org, rdzidlic@geocities.com
|
||||
W: http://www.geocities.com/rdzidlic
|
||||
|
@ -1,19 +0,0 @@
|
||||
ARM Dual Cluster System Configuration Block
|
||||
-------------------------------------------
|
||||
|
||||
The Dual Cluster System Configuration Block (DCSCB) provides basic
|
||||
functionality for controlling clocks, resets and configuration pins in
|
||||
the Dual Cluster System implemented by the Real-Time System Model (RTSM).
|
||||
|
||||
Required properties:
|
||||
|
||||
- compatible : should be "arm,rtsm,dcscb"
|
||||
|
||||
- reg : physical base address and the size of the registers window
|
||||
|
||||
Example:
|
||||
|
||||
dcscb@60000000 {
|
||||
compatible = "arm,rtsm,dcscb";
|
||||
reg = <0x60000000 0x1000>;
|
||||
};
|
16
MAINTAINERS
16
MAINTAINERS
@ -1887,6 +1887,15 @@ F: include/dt-bindings/reset/actions,*
|
||||
F: include/linux/soc/actions/
|
||||
N: owl
|
||||
|
||||
ARM/AIROHA SOC SUPPORT
|
||||
M: Matthias Brugger <matthias.bgg@gmail.com>
|
||||
M: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
|
||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||
L: linux-mediatek@lists.infradead.org (moderated for non-subscribers)
|
||||
S: Odd Fixes
|
||||
F: arch/arm/boot/dts/airoha/
|
||||
F: arch/arm64/boot/dts/airoha/
|
||||
|
||||
ARM/Allwinner SoC Clock Support
|
||||
M: Emilio López <emilio@elopez.com.ar>
|
||||
S: Maintained
|
||||
@ -1974,10 +1983,9 @@ F: drivers/soc/amlogic/
|
||||
N: meson
|
||||
|
||||
ARM/Annapurna Labs ALPINE ARCHITECTURE
|
||||
M: Tsahee Zidenberg <tsahee@annapurnalabs.com>
|
||||
M: Antoine Tenart <atenart@kernel.org>
|
||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||
S: Maintained
|
||||
S: Odd Fixes
|
||||
F: arch/arm/boot/dts/amazon/
|
||||
F: arch/arm/mach-alpine/
|
||||
F: arch/arm64/boot/dts/amazon/
|
||||
@ -16414,7 +16422,6 @@ S: Maintained
|
||||
F: arch/arm/*omap*/*clock*
|
||||
|
||||
OMAP DEVICE TREE SUPPORT
|
||||
M: Benoît Cousson <bcousson@baylibre.com>
|
||||
M: Tony Lindgren <tony@atomide.com>
|
||||
L: linux-omap@vger.kernel.org
|
||||
L: devicetree@vger.kernel.org
|
||||
@ -16469,7 +16476,6 @@ S: Maintained
|
||||
F: arch/arm/mach-omap2/omap_hwmod*data*
|
||||
|
||||
OMAP HWMOD SUPPORT
|
||||
M: Benoît Cousson <bcousson@baylibre.com>
|
||||
M: Paul Walmsley <paul@pwsan.com>
|
||||
L: linux-omap@vger.kernel.org
|
||||
S: Maintained
|
||||
@ -19416,6 +19422,7 @@ F: arch/riscv/boot/dts/
|
||||
X: arch/riscv/boot/dts/allwinner/
|
||||
X: arch/riscv/boot/dts/renesas/
|
||||
X: arch/riscv/boot/dts/sophgo/
|
||||
X: arch/riscv/boot/dts/thead/
|
||||
|
||||
RISC-V PMU DRIVERS
|
||||
M: Atish Patra <atishp@atishpatra.org>
|
||||
@ -19432,6 +19439,7 @@ M: Guo Ren <guoren@kernel.org>
|
||||
M: Fu Wei <wefu@redhat.com>
|
||||
L: linux-riscv@lists.infradead.org
|
||||
S: Maintained
|
||||
T: git https://github.com/pdp7/linux.git
|
||||
F: arch/riscv/boot/dts/thead/
|
||||
|
||||
RNBD BLOCK DRIVERS
|
||||
|
@ -14,7 +14,6 @@ CONFIG_CPUSETS=y
|
||||
CONFIG_BLK_DEV_INITRD=y
|
||||
CONFIG_PROFILING=y
|
||||
CONFIG_ARCH_VEXPRESS=y
|
||||
CONFIG_ARCH_VEXPRESS_DCSCB=y
|
||||
CONFIG_ARCH_VEXPRESS_TC2_PM=y
|
||||
CONFIG_SMP=y
|
||||
CONFIG_HAVE_ARM_ARCH_TIMER=y
|
||||
|
@ -7,6 +7,7 @@
|
||||
#include <linux/clk-provider.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/dmaengine.h>
|
||||
#include <linux/gpio-pxa.h>
|
||||
#include <linux/platform_data/i2c-pxa.h>
|
||||
#include <linux/soc/pxa/cpu.h>
|
||||
|
||||
@ -17,6 +18,7 @@
|
||||
#include <linux/platform_data/usb-ohci-pxa27x.h>
|
||||
#include <linux/platform_data/mmp_dma.h>
|
||||
|
||||
#include "mfp-pxa2xx.h"
|
||||
#include "regs-ost.h"
|
||||
#include "reset.h"
|
||||
#include "devices.h"
|
||||
@ -46,7 +48,7 @@ struct platform_device pxa_device_pmu = {
|
||||
.num_resources = 1,
|
||||
};
|
||||
|
||||
static struct resource pxamci_resources[] = {
|
||||
static const struct resource pxamci_resources[] = {
|
||||
[0] = {
|
||||
.start = 0x41100000,
|
||||
.end = 0x41100fff,
|
||||
@ -59,22 +61,26 @@ static struct resource pxamci_resources[] = {
|
||||
},
|
||||
};
|
||||
|
||||
static u64 pxamci_dmamask = 0xffffffffUL;
|
||||
|
||||
struct platform_device pxa_device_mci = {
|
||||
.name = "pxa2xx-mci",
|
||||
.id = 0,
|
||||
.dev = {
|
||||
.dma_mask = &pxamci_dmamask,
|
||||
.coherent_dma_mask = 0xffffffff,
|
||||
},
|
||||
.num_resources = ARRAY_SIZE(pxamci_resources),
|
||||
.resource = pxamci_resources,
|
||||
};
|
||||
|
||||
void __init pxa_set_mci_info(struct pxamci_platform_data *info)
|
||||
void __init pxa_set_mci_info(const struct pxamci_platform_data *info,
|
||||
const struct property_entry *props)
|
||||
{
|
||||
pxa_register_device(&pxa_device_mci, info);
|
||||
const struct platform_device_info mci_info = {
|
||||
.name = "pxa2xx-mci",
|
||||
.id = 0,
|
||||
.res = pxamci_resources,
|
||||
.num_res = ARRAY_SIZE(pxamci_resources),
|
||||
.data = info,
|
||||
.size_data = sizeof(*info),
|
||||
.dma_mask = 0xffffffffUL,
|
||||
.properties = props,
|
||||
};
|
||||
struct platform_device *mci_dev;
|
||||
int err;
|
||||
|
||||
mci_dev = platform_device_register_full(&mci_info);
|
||||
err = PTR_ERR_OR_ZERO(mci_dev);
|
||||
if (err)
|
||||
pr_err("Unable to create mci device: %d\n", err);
|
||||
}
|
||||
|
||||
static struct pxa2xx_udc_mach_info pxa_udc_info = {
|
||||
@ -627,6 +633,11 @@ struct platform_device pxa27x_device_pwm1 = {
|
||||
};
|
||||
#endif /* CONFIG_PXA27x || CONFIG_PXA3xx */
|
||||
|
||||
#if defined(CONFIG_PXA25x) || defined(CONFIG_PXA27x)
|
||||
const struct software_node pxa2xx_gpiochip_node = {
|
||||
.name = "gpio-pxa",
|
||||
};
|
||||
|
||||
struct resource pxa_resource_gpio[] = {
|
||||
{
|
||||
.start = 0x40e00000,
|
||||
@ -650,11 +661,19 @@ struct resource pxa_resource_gpio[] = {
|
||||
},
|
||||
};
|
||||
|
||||
static struct pxa_gpio_platform_data pxa2xx_gpio_info = {
|
||||
.irq_base = PXA_GPIO_TO_IRQ(0),
|
||||
.gpio_set_wake = gpio_set_wake,
|
||||
};
|
||||
|
||||
struct platform_device pxa25x_device_gpio = {
|
||||
.name = "pxa25x-gpio",
|
||||
.id = -1,
|
||||
.num_resources = ARRAY_SIZE(pxa_resource_gpio),
|
||||
.resource = pxa_resource_gpio,
|
||||
.dev = {
|
||||
.platform_data = &pxa2xx_gpio_info,
|
||||
},
|
||||
};
|
||||
|
||||
struct platform_device pxa27x_device_gpio = {
|
||||
@ -662,7 +681,11 @@ struct platform_device pxa27x_device_gpio = {
|
||||
.id = -1,
|
||||
.num_resources = ARRAY_SIZE(pxa_resource_gpio),
|
||||
.resource = pxa_resource_gpio,
|
||||
.dev = {
|
||||
.platform_data = &pxa2xx_gpio_info,
|
||||
},
|
||||
};
|
||||
#endif /* CONFIG_PXA25x || CONFIG_PXA27x */
|
||||
|
||||
static struct resource pxa_dma_resource[] = {
|
||||
[0] = {
|
||||
|
@ -4,7 +4,6 @@
|
||||
struct mmp_dma_platdata;
|
||||
|
||||
extern struct platform_device pxa_device_pmu;
|
||||
extern struct platform_device pxa_device_mci;
|
||||
extern struct platform_device pxa3xx_device_mci2;
|
||||
extern struct platform_device pxa3xx_device_mci3;
|
||||
extern struct platform_device pxa25x_device_udc;
|
||||
@ -53,8 +52,8 @@ extern struct platform_device pxa_device_asoc_ssp4;
|
||||
|
||||
extern struct platform_device pxa25x_device_gpio;
|
||||
extern struct platform_device pxa27x_device_gpio;
|
||||
extern struct platform_device pxa3xx_device_gpio;
|
||||
extern struct platform_device pxa93x_device_gpio;
|
||||
|
||||
extern const struct software_node pxa2xx_gpiochip_node;
|
||||
|
||||
void __init pxa_register_device(struct platform_device *dev, void *data);
|
||||
void __init pxa2xx_set_dmac_info(struct mmp_dma_platdata *dma_pdata);
|
||||
|
@ -90,7 +90,7 @@ static struct pxamci_platform_data gumstix_mci_platform_data = {
|
||||
|
||||
static void __init gumstix_mmc_init(void)
|
||||
{
|
||||
pxa_set_mci_info(&gumstix_mci_platform_data);
|
||||
pxa_set_mci_info(&gumstix_mci_platform_data, NULL);
|
||||
}
|
||||
#else
|
||||
static void __init gumstix_mmc_init(void)
|
||||
@ -100,26 +100,22 @@ static void __init gumstix_mmc_init(void)
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_USB_PXA25X
|
||||
static struct gpiod_lookup_table gumstix_gpio_vbus_gpiod_table = {
|
||||
.dev_id = "gpio-vbus",
|
||||
.table = {
|
||||
GPIO_LOOKUP("gpio-pxa", GPIO_GUMSTIX_USB_GPIOn,
|
||||
"vbus", GPIO_ACTIVE_HIGH),
|
||||
GPIO_LOOKUP("gpio-pxa", GPIO_GUMSTIX_USB_GPIOx,
|
||||
"pullup", GPIO_ACTIVE_HIGH),
|
||||
{ },
|
||||
},
|
||||
static const struct property_entry spitz_mci_props[] __initconst = {
|
||||
PROPERTY_ENTRY_GPIO("vbus-gpios", &pxa2xx_gpiochip_node,
|
||||
GPIO_GUMSTIX_USB_GPIOn, GPIO_ACTIVE_HIGH),
|
||||
PROPERTY_ENTRY_GPIO("pullup-gpios", &pxa2xx_gpiochip_node,
|
||||
GPIO_GUMSTIX_USB_GPIOx, GPIO_ACTIVE_HIGH),
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct platform_device gumstix_gpio_vbus = {
|
||||
static const struct platform_device_info gumstix_gpio_vbus_info __initconst = {
|
||||
.name = "gpio-vbus",
|
||||
.id = -1,
|
||||
.id = PLATFORM_DEVID_NONE,
|
||||
};
|
||||
|
||||
static void __init gumstix_udc_init(void)
|
||||
{
|
||||
gpiod_add_lookup_table(&gumstix_gpio_vbus_gpiod_table);
|
||||
platform_device_register(&gumstix_gpio_vbus);
|
||||
platform_device_register_full(&gumstix_gpio_vbus_info);
|
||||
}
|
||||
#else
|
||||
static void gumstix_udc_init(void)
|
||||
|
@ -178,12 +178,8 @@ void __init pxa25x_map_io(void)
|
||||
pxa25x_get_clk_frequency_khz(1);
|
||||
}
|
||||
|
||||
static struct pxa_gpio_platform_data pxa25x_gpio_info __initdata = {
|
||||
.irq_base = PXA_GPIO_TO_IRQ(0),
|
||||
.gpio_set_wake = gpio_set_wake,
|
||||
};
|
||||
|
||||
static struct platform_device *pxa25x_devices[] __initdata = {
|
||||
&pxa25x_device_gpio,
|
||||
&pxa25x_device_udc,
|
||||
&pxa_device_pmu,
|
||||
&pxa_device_i2s,
|
||||
@ -243,8 +239,8 @@ static int __init pxa25x_init(void)
|
||||
register_syscore_ops(&pxa2xx_mfp_syscore_ops);
|
||||
|
||||
if (!of_have_populated_dt()) {
|
||||
software_node_register(&pxa2xx_gpiochip_node);
|
||||
pxa2xx_set_dmac_info(&pxa25x_dma_pdata);
|
||||
pxa_register_device(&pxa25x_device_gpio, &pxa25x_gpio_info);
|
||||
ret = platform_add_devices(pxa25x_devices,
|
||||
ARRAY_SIZE(pxa25x_devices));
|
||||
}
|
||||
|
@ -276,12 +276,8 @@ void __init pxa27x_set_i2c_power_info(struct i2c_pxa_platform_data *info)
|
||||
pxa_register_device(&pxa27x_device_i2c_power, info);
|
||||
}
|
||||
|
||||
static struct pxa_gpio_platform_data pxa27x_gpio_info __initdata = {
|
||||
.irq_base = PXA_GPIO_TO_IRQ(0),
|
||||
.gpio_set_wake = gpio_set_wake,
|
||||
};
|
||||
|
||||
static struct platform_device *devices[] __initdata = {
|
||||
&pxa27x_device_gpio,
|
||||
&pxa27x_device_udc,
|
||||
&pxa_device_pmu,
|
||||
&pxa_device_i2s,
|
||||
@ -345,8 +341,7 @@ static int __init pxa27x_init(void)
|
||||
register_syscore_ops(&pxa2xx_mfp_syscore_ops);
|
||||
|
||||
if (!of_have_populated_dt()) {
|
||||
pxa_register_device(&pxa27x_device_gpio,
|
||||
&pxa27x_gpio_info);
|
||||
software_node_register(&pxa2xx_gpiochip_node);
|
||||
pxa2xx_set_dmac_info(&pxa27x_dma_pdata);
|
||||
ret = platform_add_devices(devices,
|
||||
ARRAY_SIZE(devices));
|
||||
|
@ -14,6 +14,7 @@
|
||||
#include <linux/gpio_keys.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/gpio/machine.h>
|
||||
#include <linux/gpio/property.h>
|
||||
#include <linux/leds.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/platform_data/i2c-pxa.h>
|
||||
@ -28,6 +29,7 @@
|
||||
#include <linux/input/matrix_keypad.h>
|
||||
#include <linux/regulator/machine.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/property.h>
|
||||
#include <linux/reboot.h>
|
||||
#include <linux/memblock.h>
|
||||
|
||||
@ -128,6 +130,19 @@ static unsigned long spitz_pin_config[] __initdata = {
|
||||
GPIO1_GPIO | WAKEUP_ON_EDGE_FALL, /* SPITZ_GPIO_RESET */
|
||||
};
|
||||
|
||||
static const struct software_node spitz_scoop_1_gpiochip_node = {
|
||||
.name = "sharp-scoop.0",
|
||||
};
|
||||
|
||||
/* Only on Spitz */
|
||||
static const struct software_node spitz_scoop_2_gpiochip_node = {
|
||||
.name = "sharp-scoop.1",
|
||||
};
|
||||
|
||||
/* Only on Akita */
|
||||
static const struct software_node akita_max7310_gpiochip_node = {
|
||||
.name = "i2c-max7310",
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
* Scoop GPIO expander
|
||||
@ -452,35 +467,64 @@ static inline void spitz_keys_init(void) {}
|
||||
* LEDs
|
||||
******************************************************************************/
|
||||
#if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE)
|
||||
static struct gpio_led spitz_gpio_leds[] = {
|
||||
{
|
||||
.name = "spitz:amber:charge",
|
||||
.default_trigger = "sharpsl-charge",
|
||||
.gpio = SPITZ_GPIO_LED_ORANGE,
|
||||
},
|
||||
{
|
||||
.name = "spitz:green:hddactivity",
|
||||
.default_trigger = "disk-activity",
|
||||
.gpio = SPITZ_GPIO_LED_GREEN,
|
||||
},
|
||||
static const struct software_node spitz_gpio_leds_node = {
|
||||
.name = "spitz-leds",
|
||||
};
|
||||
|
||||
static struct gpio_led_platform_data spitz_gpio_leds_info = {
|
||||
.leds = spitz_gpio_leds,
|
||||
.num_leds = ARRAY_SIZE(spitz_gpio_leds),
|
||||
static const struct property_entry spitz_orange_led_props[] = {
|
||||
PROPERTY_ENTRY_STRING("linux,default-trigger", "sharpsl-charge"),
|
||||
PROPERTY_ENTRY_GPIO("gpios",
|
||||
&spitz_scoop_1_gpiochip_node, 6, GPIO_ACTIVE_HIGH),
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct platform_device spitz_led_device = {
|
||||
.name = "leds-gpio",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &spitz_gpio_leds_info,
|
||||
},
|
||||
static const struct software_node spitz_orange_led_node = {
|
||||
.name = "spitz:amber:charge",
|
||||
.parent = &spitz_gpio_leds_node,
|
||||
.properties = spitz_orange_led_props,
|
||||
};
|
||||
|
||||
static const struct property_entry spitz_green_led_props[] = {
|
||||
PROPERTY_ENTRY_STRING("linux,default-trigger", "disk-activity"),
|
||||
PROPERTY_ENTRY_GPIO("gpios",
|
||||
&spitz_scoop_1_gpiochip_node, 0, GPIO_ACTIVE_HIGH),
|
||||
{ }
|
||||
};
|
||||
|
||||
static const struct software_node spitz_green_led_node = {
|
||||
.name = "spitz:green:hddactivity",
|
||||
.parent = &spitz_gpio_leds_node,
|
||||
.properties = spitz_green_led_props,
|
||||
};
|
||||
|
||||
static const struct software_node *spitz_gpio_leds_swnodes[] = {
|
||||
&spitz_gpio_leds_node,
|
||||
&spitz_orange_led_node,
|
||||
&spitz_green_led_node,
|
||||
NULL
|
||||
};
|
||||
|
||||
static void __init spitz_leds_init(void)
|
||||
{
|
||||
platform_device_register(&spitz_led_device);
|
||||
struct platform_device_info led_info = {
|
||||
.name = "leds-gpio",
|
||||
.id = PLATFORM_DEVID_NONE,
|
||||
};
|
||||
struct platform_device *led_dev;
|
||||
int err;
|
||||
|
||||
err = software_node_register_node_group(spitz_gpio_leds_swnodes);
|
||||
if (err) {
|
||||
pr_err("failed to register LED software nodes: %d\n", err);
|
||||
return;
|
||||
}
|
||||
|
||||
led_info.fwnode = software_node_fwnode(&spitz_gpio_leds_node);
|
||||
|
||||
led_dev = platform_device_register_full(&led_info);
|
||||
err = PTR_ERR_OR_ZERO(led_dev);
|
||||
if (err)
|
||||
pr_err("failed to create LED device: %d\n", err);
|
||||
}
|
||||
#else
|
||||
static inline void spitz_leds_init(void) {}
|
||||
@ -490,53 +534,43 @@ static inline void spitz_leds_init(void) {}
|
||||
* SSP Devices
|
||||
******************************************************************************/
|
||||
#if defined(CONFIG_SPI_PXA2XX) || defined(CONFIG_SPI_PXA2XX_MODULE)
|
||||
static void spitz_ads7846_wait_for_hsync(void)
|
||||
{
|
||||
while (gpio_get_value(SPITZ_GPIO_HSYNC))
|
||||
cpu_relax();
|
||||
|
||||
while (!gpio_get_value(SPITZ_GPIO_HSYNC))
|
||||
cpu_relax();
|
||||
}
|
||||
|
||||
static struct ads7846_platform_data spitz_ads7846_info = {
|
||||
.model = 7846,
|
||||
.vref_delay_usecs = 100,
|
||||
.x_plate_ohms = 419,
|
||||
.y_plate_ohms = 486,
|
||||
.pressure_max = 1024,
|
||||
.wait_for_sync = spitz_ads7846_wait_for_hsync,
|
||||
static const struct property_entry spitz_ads7846_props[] = {
|
||||
PROPERTY_ENTRY_STRING("compatible", "ti,ads7846"),
|
||||
PROPERTY_ENTRY_U32("touchscreen-max-pressure", 1024),
|
||||
PROPERTY_ENTRY_U16("ti,x-plate-ohms", 419),
|
||||
PROPERTY_ENTRY_U16("ti,y-plate-ohms", 486),
|
||||
PROPERTY_ENTRY_U16("ti,vref-delay-usecs", 100),
|
||||
PROPERTY_ENTRY_GPIO("pendown-gpios", &pxa2xx_gpiochip_node,
|
||||
SPITZ_GPIO_TP_INT, GPIO_ACTIVE_LOW),
|
||||
PROPERTY_ENTRY_GPIO("ti,hsync-gpios", &pxa2xx_gpiochip_node,
|
||||
SPITZ_GPIO_HSYNC, GPIO_ACTIVE_LOW),
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct gpiod_lookup_table spitz_ads7846_gpio_table = {
|
||||
.dev_id = "spi2.0",
|
||||
.table = {
|
||||
GPIO_LOOKUP("gpio-pxa", SPITZ_GPIO_TP_INT,
|
||||
"pendown", GPIO_ACTIVE_LOW),
|
||||
{ }
|
||||
},
|
||||
static const struct software_node spitz_ads7846_swnode = {
|
||||
.name = "ads7846",
|
||||
.properties = spitz_ads7846_props,
|
||||
};
|
||||
|
||||
static struct gpiod_lookup_table spitz_lcdcon_gpio_table = {
|
||||
.dev_id = "spi2.1",
|
||||
.table = {
|
||||
GPIO_LOOKUP("gpio-pxa", SPITZ_GPIO_BACKLIGHT_CONT,
|
||||
"BL_CONT", GPIO_ACTIVE_LOW),
|
||||
GPIO_LOOKUP("gpio-pxa", SPITZ_GPIO_BACKLIGHT_ON,
|
||||
"BL_ON", GPIO_ACTIVE_HIGH),
|
||||
{ },
|
||||
},
|
||||
static const struct property_entry spitz_lcdcon_props[] = {
|
||||
PROPERTY_ENTRY_GPIO("BL_CONT-gpios",
|
||||
&spitz_scoop_2_gpiochip_node, 6, GPIO_ACTIVE_LOW),
|
||||
PROPERTY_ENTRY_GPIO("BL_ON-gpios",
|
||||
&spitz_scoop_2_gpiochip_node, 7, GPIO_ACTIVE_HIGH),
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct gpiod_lookup_table akita_lcdcon_gpio_table = {
|
||||
.dev_id = "spi2.1",
|
||||
.table = {
|
||||
GPIO_LOOKUP("gpio-pxa", AKITA_GPIO_BACKLIGHT_CONT,
|
||||
"BL_CONT", GPIO_ACTIVE_LOW),
|
||||
GPIO_LOOKUP("gpio-pxa", AKITA_GPIO_BACKLIGHT_ON,
|
||||
"BL_ON", GPIO_ACTIVE_HIGH),
|
||||
{ },
|
||||
},
|
||||
static const struct property_entry akita_lcdcon_props[] = {
|
||||
PROPERTY_ENTRY_GPIO("BL_ON-gpios",
|
||||
&akita_max7310_gpiochip_node, 3, GPIO_ACTIVE_HIGH),
|
||||
PROPERTY_ENTRY_GPIO("BL_CONT-gpios",
|
||||
&akita_max7310_gpiochip_node, 4, GPIO_ACTIVE_LOW),
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct software_node spitz_lcdcon_node = {
|
||||
.name = "spitz-lcdcon",
|
||||
};
|
||||
|
||||
static struct corgi_lcd_platform_data spitz_lcdcon_info = {
|
||||
@ -553,7 +587,7 @@ static struct spi_board_info spitz_spi_devices[] = {
|
||||
.max_speed_hz = 1200000,
|
||||
.bus_num = 2,
|
||||
.chip_select = 0,
|
||||
.platform_data = &spitz_ads7846_info,
|
||||
.swnode = &spitz_ads7846_swnode,
|
||||
.irq = PXA_GPIO_TO_IRQ(SPITZ_GPIO_TP_INT),
|
||||
}, {
|
||||
.modalias = "corgi-lcd",
|
||||
@ -561,6 +595,7 @@ static struct spi_board_info spitz_spi_devices[] = {
|
||||
.bus_num = 2,
|
||||
.chip_select = 1,
|
||||
.platform_data = &spitz_lcdcon_info,
|
||||
.swnode = &spitz_lcdcon_node,
|
||||
}, {
|
||||
.modalias = "max1111",
|
||||
.max_speed_hz = 450000,
|
||||
@ -569,53 +604,40 @@ static struct spi_board_info spitz_spi_devices[] = {
|
||||
},
|
||||
};
|
||||
|
||||
static struct gpiod_lookup_table spitz_spi_gpio_table = {
|
||||
.dev_id = "spi2",
|
||||
.table = {
|
||||
GPIO_LOOKUP_IDX("gpio-pxa", SPITZ_GPIO_ADS7846_CS, "cs", 0, GPIO_ACTIVE_LOW),
|
||||
GPIO_LOOKUP_IDX("gpio-pxa", SPITZ_GPIO_LCDCON_CS, "cs", 1, GPIO_ACTIVE_LOW),
|
||||
GPIO_LOOKUP_IDX("gpio-pxa", SPITZ_GPIO_MAX1111_CS, "cs", 2, GPIO_ACTIVE_LOW),
|
||||
{ },
|
||||
},
|
||||
static const struct software_node_ref_args spitz_spi_gpio_refs[] = {
|
||||
SOFTWARE_NODE_REFERENCE(&pxa2xx_gpiochip_node, SPITZ_GPIO_ADS7846_CS,
|
||||
GPIO_ACTIVE_LOW),
|
||||
SOFTWARE_NODE_REFERENCE(&pxa2xx_gpiochip_node, SPITZ_GPIO_LCDCON_CS,
|
||||
GPIO_ACTIVE_LOW),
|
||||
SOFTWARE_NODE_REFERENCE(&pxa2xx_gpiochip_node, SPITZ_GPIO_MAX1111_CS,
|
||||
GPIO_ACTIVE_LOW),
|
||||
};
|
||||
|
||||
static const struct property_entry spitz_spi_properties[] = {
|
||||
PROPERTY_ENTRY_U32("num-cs", 3),
|
||||
PROPERTY_ENTRY_REF_ARRAY("gpios", spitz_spi_gpio_refs),
|
||||
{ }
|
||||
};
|
||||
|
||||
static const struct software_node spitz_spi_node = {
|
||||
static const struct platform_device_info spitz_spi_device_info = {
|
||||
.name = "pxa2xx-spi",
|
||||
/* pxa2xx-spi platform-device ID equals respective SSP platform-device ID + 1 */
|
||||
.id = 2,
|
||||
.properties = spitz_spi_properties,
|
||||
};
|
||||
|
||||
static void __init spitz_spi_init(void)
|
||||
{
|
||||
struct platform_device *pd;
|
||||
int id = 2;
|
||||
int err;
|
||||
|
||||
if (machine_is_akita())
|
||||
gpiod_add_lookup_table(&akita_lcdcon_gpio_table);
|
||||
else
|
||||
gpiod_add_lookup_table(&spitz_lcdcon_gpio_table);
|
||||
|
||||
gpiod_add_lookup_table(&spitz_ads7846_gpio_table);
|
||||
gpiod_add_lookup_table(&spitz_spi_gpio_table);
|
||||
|
||||
/* pxa2xx-spi platform-device ID equals respective SSP platform-device ID + 1 */
|
||||
pd = platform_device_alloc("pxa2xx-spi", id);
|
||||
if (pd == NULL) {
|
||||
pr_err("pxa2xx-spi: failed to allocate device id %d\n", id);
|
||||
} else {
|
||||
err = device_add_software_node(&pd->dev, &spitz_spi_node);
|
||||
if (err) {
|
||||
platform_device_put(pd);
|
||||
pr_err("pxa2xx-spi: failed to add software node\n");
|
||||
} else {
|
||||
platform_device_add(pd);
|
||||
}
|
||||
}
|
||||
pd = platform_device_register_full(&spitz_spi_device_info);
|
||||
err = PTR_ERR_OR_ZERO(pd);
|
||||
if (err)
|
||||
pr_err("pxa2xx-spi: failed to instantiate SPI controller: %d\n",
|
||||
err);
|
||||
|
||||
spitz_lcdcon_node.properties = machine_is_akita() ?
|
||||
akita_lcdcon_props : spitz_lcdcon_props;
|
||||
spi_register_board_info(ARRAY_AND_SIZE(spitz_spi_devices));
|
||||
}
|
||||
#else
|
||||
@ -648,21 +670,17 @@ static struct pxamci_platform_data spitz_mci_platform_data = {
|
||||
.setpower = spitz_mci_setpower,
|
||||
};
|
||||
|
||||
static struct gpiod_lookup_table spitz_mci_gpio_table = {
|
||||
.dev_id = "pxa2xx-mci.0",
|
||||
.table = {
|
||||
GPIO_LOOKUP("gpio-pxa", SPITZ_GPIO_nSD_DETECT,
|
||||
"cd", GPIO_ACTIVE_LOW),
|
||||
GPIO_LOOKUP("gpio-pxa", SPITZ_GPIO_nSD_WP,
|
||||
"wp", GPIO_ACTIVE_LOW),
|
||||
{ },
|
||||
},
|
||||
static const struct property_entry spitz_mci_props[] __initconst = {
|
||||
PROPERTY_ENTRY_GPIO("cd-gpios", &pxa2xx_gpiochip_node,
|
||||
SPITZ_GPIO_nSD_DETECT, GPIO_ACTIVE_LOW),
|
||||
PROPERTY_ENTRY_GPIO("wp-gpios", &pxa2xx_gpiochip_node,
|
||||
SPITZ_GPIO_nSD_WP, GPIO_ACTIVE_LOW),
|
||||
{ }
|
||||
};
|
||||
|
||||
static void __init spitz_mmc_init(void)
|
||||
{
|
||||
gpiod_add_lookup_table(&spitz_mci_gpio_table);
|
||||
pxa_set_mci_info(&spitz_mci_platform_data);
|
||||
pxa_set_mci_info(&spitz_mci_platform_data, spitz_mci_props);
|
||||
}
|
||||
#else
|
||||
static inline void spitz_mmc_init(void) {}
|
||||
@ -961,30 +979,24 @@ static void __init spitz_i2c_init(void)
|
||||
static inline void spitz_i2c_init(void) {}
|
||||
#endif
|
||||
|
||||
static struct gpiod_lookup_table spitz_audio_gpio_table = {
|
||||
.dev_id = "spitz-audio",
|
||||
.table = {
|
||||
GPIO_LOOKUP("sharp-scoop.0", SPITZ_GPIO_MUTE_L - SPITZ_SCP_GPIO_BASE,
|
||||
"mute-l", GPIO_ACTIVE_HIGH),
|
||||
GPIO_LOOKUP("sharp-scoop.0", SPITZ_GPIO_MUTE_R - SPITZ_SCP_GPIO_BASE,
|
||||
"mute-r", GPIO_ACTIVE_HIGH),
|
||||
GPIO_LOOKUP("sharp-scoop.1", SPITZ_GPIO_MIC_BIAS - SPITZ_SCP2_GPIO_BASE,
|
||||
"mic", GPIO_ACTIVE_HIGH),
|
||||
{ },
|
||||
},
|
||||
static const struct property_entry spitz_audio_props[] = {
|
||||
PROPERTY_ENTRY_GPIO("mute-l-gpios", &spitz_scoop_1_gpiochip_node, 3,
|
||||
GPIO_ACTIVE_HIGH),
|
||||
PROPERTY_ENTRY_GPIO("mute-r-gpios", &spitz_scoop_1_gpiochip_node, 4,
|
||||
GPIO_ACTIVE_HIGH),
|
||||
PROPERTY_ENTRY_GPIO("mic-gpios", &spitz_scoop_2_gpiochip_node, 8,
|
||||
GPIO_ACTIVE_HIGH),
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct gpiod_lookup_table akita_audio_gpio_table = {
|
||||
.dev_id = "spitz-audio",
|
||||
.table = {
|
||||
GPIO_LOOKUP("sharp-scoop.0", SPITZ_GPIO_MUTE_L - SPITZ_SCP_GPIO_BASE,
|
||||
"mute-l", GPIO_ACTIVE_HIGH),
|
||||
GPIO_LOOKUP("sharp-scoop.0", SPITZ_GPIO_MUTE_R - SPITZ_SCP_GPIO_BASE,
|
||||
"mute-r", GPIO_ACTIVE_HIGH),
|
||||
GPIO_LOOKUP("i2c-max7310", AKITA_GPIO_MIC_BIAS - AKITA_IOEXP_GPIO_BASE,
|
||||
"mic", GPIO_ACTIVE_HIGH),
|
||||
{ },
|
||||
},
|
||||
static const struct property_entry akita_audio_props[] = {
|
||||
PROPERTY_ENTRY_GPIO("mute-l-gpios", &spitz_scoop_1_gpiochip_node, 3,
|
||||
GPIO_ACTIVE_HIGH),
|
||||
PROPERTY_ENTRY_GPIO("mute-r-gpios", &spitz_scoop_1_gpiochip_node, 4,
|
||||
GPIO_ACTIVE_HIGH),
|
||||
PROPERTY_ENTRY_GPIO("mic-gpios", &akita_max7310_gpiochip_node, 2,
|
||||
GPIO_ACTIVE_HIGH),
|
||||
{ }
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
@ -992,12 +1004,14 @@ static struct gpiod_lookup_table akita_audio_gpio_table = {
|
||||
******************************************************************************/
|
||||
static inline void spitz_audio_init(void)
|
||||
{
|
||||
if (machine_is_akita())
|
||||
gpiod_add_lookup_table(&akita_audio_gpio_table);
|
||||
else
|
||||
gpiod_add_lookup_table(&spitz_audio_gpio_table);
|
||||
struct platform_device_info audio_info = {
|
||||
.name = "spitz-audio",
|
||||
.id = PLATFORM_DEVID_NONE,
|
||||
.properties = machine_is_akita() ?
|
||||
akita_audio_props : spitz_audio_props,
|
||||
};
|
||||
|
||||
platform_device_register_simple("spitz-audio", -1, NULL, 0);
|
||||
platform_device_register_full(&audio_info);
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
@ -1020,6 +1034,12 @@ static void spitz_restart(enum reboot_mode mode, const char *cmd)
|
||||
|
||||
static void __init spitz_init(void)
|
||||
{
|
||||
software_node_register(&spitz_scoop_1_gpiochip_node);
|
||||
if (machine_is_akita())
|
||||
software_node_register(&akita_max7310_gpiochip_node);
|
||||
else
|
||||
software_node_register(&spitz_scoop_2_gpiochip_node);
|
||||
|
||||
init_gpio_reset(SPITZ_GPIO_ON_RESET, 1, 0);
|
||||
pm_power_off = spitz_poweroff;
|
||||
|
||||
|
@ -8,35 +8,49 @@
|
||||
* Copyright (C) 2010 Google, Inc.
|
||||
*/
|
||||
|
||||
#include <linux/property.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/gpio/machine.h>
|
||||
#include <linux/gpio/property.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/printk.h>
|
||||
#include <linux/property.h>
|
||||
|
||||
#include "board.h"
|
||||
|
||||
static struct property_entry wifi_rfkill_prop[] __initdata = {
|
||||
static const struct software_node tegra_gpiochip_node = {
|
||||
.name = "tegra-gpio",
|
||||
};
|
||||
|
||||
static const struct property_entry wifi_rfkill_prop[] __initconst = {
|
||||
PROPERTY_ENTRY_STRING("name", "wifi_rfkill"),
|
||||
PROPERTY_ENTRY_STRING("type", "wlan"),
|
||||
{ },
|
||||
PROPERTY_ENTRY_GPIO("reset-gpios",
|
||||
&tegra_gpiochip_node, 25, GPIO_ACTIVE_HIGH),
|
||||
PROPERTY_ENTRY_GPIO("shutdown-gpios",
|
||||
&tegra_gpiochip_node, 85, GPIO_ACTIVE_HIGH),
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct platform_device wifi_rfkill_device = {
|
||||
.name = "rfkill_gpio",
|
||||
.id = -1,
|
||||
};
|
||||
|
||||
static struct gpiod_lookup_table wifi_gpio_lookup = {
|
||||
.dev_id = "rfkill_gpio",
|
||||
.table = {
|
||||
GPIO_LOOKUP("tegra-gpio", 25, "reset", 0),
|
||||
GPIO_LOOKUP("tegra-gpio", 85, "shutdown", 0),
|
||||
{ },
|
||||
},
|
||||
static const struct platform_device_info wifi_rfkill_info __initconst = {
|
||||
.name = "rfkill_gpio",
|
||||
.id = PLATFORM_DEVID_NONE,
|
||||
.properties = wifi_rfkill_prop,
|
||||
};
|
||||
|
||||
void __init tegra_paz00_wifikill_init(void)
|
||||
{
|
||||
device_create_managed_software_node(&wifi_rfkill_device.dev, wifi_rfkill_prop, NULL);
|
||||
gpiod_add_lookup_table(&wifi_gpio_lookup);
|
||||
platform_device_register(&wifi_rfkill_device);
|
||||
struct platform_device *pd;
|
||||
int err;
|
||||
|
||||
err = software_node_register(&tegra_gpiochip_node);
|
||||
if (err) {
|
||||
pr_err("failed to register %s node: %d\n",
|
||||
tegra_gpiochip_node.name, err);
|
||||
return;
|
||||
}
|
||||
|
||||
pd = platform_device_register_full(&wifi_rfkill_info);
|
||||
err = PTR_ERR_OR_ZERO(pd);
|
||||
if (err)
|
||||
pr_err("failed to register WiFi rfkill device: %d\n", err);
|
||||
}
|
||||
|
@ -278,15 +278,6 @@ config ARCH_VEXPRESS_CORTEX_A5_A9_ERRATA
|
||||
build a working kernel, you must also enable relevant core
|
||||
tile support or Flattened Device Tree based support options.
|
||||
|
||||
config ARCH_VEXPRESS_DCSCB
|
||||
bool "Dual Cluster System Control Block (DCSCB) support"
|
||||
depends on MCPM
|
||||
select ARM_CCI400_PORT_CTRL
|
||||
help
|
||||
Support for the Dual Cluster System Configuration Block (DCSCB).
|
||||
This is needed to provide CPU and cluster power management
|
||||
on RTSM implementing big.LITTLE.
|
||||
|
||||
config ARCH_VEXPRESS_SPC
|
||||
bool "Versatile Express Serial Power Controller (SPC)"
|
||||
select PM_OPP
|
||||
|
@ -16,9 +16,6 @@ obj-$(CONFIG_ARCH_REALVIEW) += realview.o
|
||||
|
||||
# vexpress
|
||||
obj-$(CONFIG_ARCH_VEXPRESS) := v2m.o
|
||||
obj-$(CONFIG_ARCH_VEXPRESS_DCSCB) += dcscb.o dcscb_setup.o
|
||||
CFLAGS_dcscb.o += -march=armv7-a
|
||||
CFLAGS_REMOVE_dcscb.o = -pg
|
||||
obj-$(CONFIG_ARCH_VEXPRESS_SPC) += spc.o
|
||||
CFLAGS_REMOVE_spc.o = -pg
|
||||
obj-$(CONFIG_ARCH_VEXPRESS_TC2_PM) += tc2_pm.o
|
||||
|
@ -1,173 +0,0 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* dcscb.c - Dual Cluster System Configuration Block
|
||||
*
|
||||
* Created by: Nicolas Pitre, May 2012
|
||||
* Copyright: (C) 2012-2013 Linaro Limited
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/vexpress.h>
|
||||
#include <linux/arm-cci.h>
|
||||
|
||||
#include <asm/mcpm.h>
|
||||
#include <asm/proc-fns.h>
|
||||
#include <asm/cacheflush.h>
|
||||
#include <asm/cputype.h>
|
||||
#include <asm/cp15.h>
|
||||
|
||||
#include "vexpress.h"
|
||||
|
||||
#define RST_HOLD0 0x0
|
||||
#define RST_HOLD1 0x4
|
||||
#define SYS_SWRESET 0x8
|
||||
#define RST_STAT0 0xc
|
||||
#define RST_STAT1 0x10
|
||||
#define EAG_CFG_R 0x20
|
||||
#define EAG_CFG_W 0x24
|
||||
#define KFC_CFG_R 0x28
|
||||
#define KFC_CFG_W 0x2c
|
||||
#define DCS_CFG_R 0x30
|
||||
|
||||
static void __iomem *dcscb_base;
|
||||
static int dcscb_allcpus_mask[2];
|
||||
|
||||
static int dcscb_cpu_powerup(unsigned int cpu, unsigned int cluster)
|
||||
{
|
||||
unsigned int rst_hold, cpumask = (1 << cpu);
|
||||
|
||||
pr_debug("%s: cpu %u cluster %u\n", __func__, cpu, cluster);
|
||||
if (cluster >= 2 || !(cpumask & dcscb_allcpus_mask[cluster]))
|
||||
return -EINVAL;
|
||||
|
||||
rst_hold = readl_relaxed(dcscb_base + RST_HOLD0 + cluster * 4);
|
||||
rst_hold &= ~(cpumask | (cpumask << 4));
|
||||
writel_relaxed(rst_hold, dcscb_base + RST_HOLD0 + cluster * 4);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int dcscb_cluster_powerup(unsigned int cluster)
|
||||
{
|
||||
unsigned int rst_hold;
|
||||
|
||||
pr_debug("%s: cluster %u\n", __func__, cluster);
|
||||
if (cluster >= 2)
|
||||
return -EINVAL;
|
||||
|
||||
/* remove cluster reset and add individual CPU's reset */
|
||||
rst_hold = readl_relaxed(dcscb_base + RST_HOLD0 + cluster * 4);
|
||||
rst_hold &= ~(1 << 8);
|
||||
rst_hold |= dcscb_allcpus_mask[cluster];
|
||||
writel_relaxed(rst_hold, dcscb_base + RST_HOLD0 + cluster * 4);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void dcscb_cpu_powerdown_prepare(unsigned int cpu, unsigned int cluster)
|
||||
{
|
||||
unsigned int rst_hold;
|
||||
|
||||
pr_debug("%s: cpu %u cluster %u\n", __func__, cpu, cluster);
|
||||
BUG_ON(cluster >= 2 || !((1 << cpu) & dcscb_allcpus_mask[cluster]));
|
||||
|
||||
rst_hold = readl_relaxed(dcscb_base + RST_HOLD0 + cluster * 4);
|
||||
rst_hold |= (1 << cpu);
|
||||
writel_relaxed(rst_hold, dcscb_base + RST_HOLD0 + cluster * 4);
|
||||
}
|
||||
|
||||
static void dcscb_cluster_powerdown_prepare(unsigned int cluster)
|
||||
{
|
||||
unsigned int rst_hold;
|
||||
|
||||
pr_debug("%s: cluster %u\n", __func__, cluster);
|
||||
BUG_ON(cluster >= 2);
|
||||
|
||||
rst_hold = readl_relaxed(dcscb_base + RST_HOLD0 + cluster * 4);
|
||||
rst_hold |= (1 << 8);
|
||||
writel_relaxed(rst_hold, dcscb_base + RST_HOLD0 + cluster * 4);
|
||||
}
|
||||
|
||||
static void dcscb_cpu_cache_disable(void)
|
||||
{
|
||||
/* Disable and flush the local CPU cache. */
|
||||
v7_exit_coherency_flush(louis);
|
||||
}
|
||||
|
||||
static void dcscb_cluster_cache_disable(void)
|
||||
{
|
||||
/* Flush all cache levels for this cluster. */
|
||||
v7_exit_coherency_flush(all);
|
||||
|
||||
/*
|
||||
* A full outer cache flush could be needed at this point
|
||||
* on platforms with such a cache, depending on where the
|
||||
* outer cache sits. In some cases the notion of a "last
|
||||
* cluster standing" would need to be implemented if the
|
||||
* outer cache is shared across clusters. In any case, when
|
||||
* the outer cache needs flushing, there is no concurrent
|
||||
* access to the cache controller to worry about and no
|
||||
* special locking besides what is already provided by the
|
||||
* MCPM state machinery is needed.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Disable cluster-level coherency by masking
|
||||
* incoming snoops and DVM messages:
|
||||
*/
|
||||
cci_disable_port_by_cpu(read_cpuid_mpidr());
|
||||
}
|
||||
|
||||
static const struct mcpm_platform_ops dcscb_power_ops = {
|
||||
.cpu_powerup = dcscb_cpu_powerup,
|
||||
.cluster_powerup = dcscb_cluster_powerup,
|
||||
.cpu_powerdown_prepare = dcscb_cpu_powerdown_prepare,
|
||||
.cluster_powerdown_prepare = dcscb_cluster_powerdown_prepare,
|
||||
.cpu_cache_disable = dcscb_cpu_cache_disable,
|
||||
.cluster_cache_disable = dcscb_cluster_cache_disable,
|
||||
};
|
||||
|
||||
extern void dcscb_power_up_setup(unsigned int affinity_level);
|
||||
|
||||
static int __init dcscb_init(void)
|
||||
{
|
||||
struct device_node *node;
|
||||
unsigned int cfg;
|
||||
int ret;
|
||||
|
||||
if (!cci_probed())
|
||||
return -ENODEV;
|
||||
|
||||
node = of_find_compatible_node(NULL, NULL, "arm,rtsm,dcscb");
|
||||
if (!node)
|
||||
return -ENODEV;
|
||||
dcscb_base = of_iomap(node, 0);
|
||||
of_node_put(node);
|
||||
if (!dcscb_base)
|
||||
return -EADDRNOTAVAIL;
|
||||
cfg = readl_relaxed(dcscb_base + DCS_CFG_R);
|
||||
dcscb_allcpus_mask[0] = (1 << (((cfg >> 16) >> (0 << 2)) & 0xf)) - 1;
|
||||
dcscb_allcpus_mask[1] = (1 << (((cfg >> 16) >> (1 << 2)) & 0xf)) - 1;
|
||||
|
||||
ret = mcpm_platform_register(&dcscb_power_ops);
|
||||
if (!ret)
|
||||
ret = mcpm_sync_init(dcscb_power_up_setup);
|
||||
if (ret) {
|
||||
iounmap(dcscb_base);
|
||||
return ret;
|
||||
}
|
||||
|
||||
pr_info("VExpress DCSCB support installed\n");
|
||||
|
||||
/*
|
||||
* Future entries into the kernel can now go
|
||||
* through the cluster entry vectors.
|
||||
*/
|
||||
vexpress_flags_set(__pa_symbol(mcpm_entry_point));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
early_initcall(dcscb_init);
|
@ -1,33 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*
|
||||
* Created by: Dave Martin, 2012-06-22
|
||||
* Copyright: (C) 2012-2013 Linaro Limited
|
||||
*/
|
||||
|
||||
#include <linux/linkage.h>
|
||||
|
||||
|
||||
ENTRY(dcscb_power_up_setup)
|
||||
|
||||
cmp r0, #0 @ check affinity level
|
||||
beq 2f
|
||||
|
||||
/*
|
||||
* Enable cluster-level coherency, in preparation for turning on the MMU.
|
||||
* The ACTLR SMP bit does not need to be set here, because cpu_resume()
|
||||
* already restores that.
|
||||
*
|
||||
* A15/A7 may not require explicit L2 invalidation on reset, dependent
|
||||
* on hardware integration decisions.
|
||||
* For now, this code assumes that L2 is either already invalidated,
|
||||
* or invalidation is not required.
|
||||
*/
|
||||
|
||||
b cci_enable_port_for_self
|
||||
|
||||
2: @ Implementation-specific local CPU setup operations should go here,
|
||||
@ if any. In this case, there is nothing to do.
|
||||
|
||||
bx lr
|
||||
|
||||
ENDPROC(dcscb_power_up_setup)
|
@ -207,7 +207,6 @@ if ARCH_NXP
|
||||
|
||||
config ARCH_LAYERSCAPE
|
||||
bool "Freescale Layerscape SoC family"
|
||||
select EDAC_SUPPORT
|
||||
help
|
||||
This enables support for the Freescale Layerscape SoC family.
|
||||
|
||||
|
@ -414,4 +414,5 @@ static struct platform_driver vexpress_syscfg_driver = {
|
||||
.probe = vexpress_syscfg_probe,
|
||||
};
|
||||
module_platform_driver(vexpress_syscfg_driver);
|
||||
MODULE_DESCRIPTION("Versatile Express configuration bus");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
@ -7,6 +7,7 @@
|
||||
|
||||
struct device;
|
||||
struct mmc_host;
|
||||
struct property_entry;
|
||||
|
||||
struct pxamci_platform_data {
|
||||
unsigned int ocr_mask; /* available voltages */
|
||||
@ -18,7 +19,8 @@ struct pxamci_platform_data {
|
||||
bool gpio_card_ro_invert; /* gpio ro is inverted */
|
||||
};
|
||||
|
||||
extern void pxa_set_mci_info(struct pxamci_platform_data *info);
|
||||
extern void pxa_set_mci_info(const struct pxamci_platform_data *info,
|
||||
const struct property_entry *props);
|
||||
extern void pxa3xx_set_mci2_info(struct pxamci_platform_data *info);
|
||||
extern void pxa3xx_set_mci3_info(struct pxamci_platform_data *info);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user