cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

icontrol.c (5275B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * linux/arch/arm/mach-pxa/icontrol.c
      4 *
      5 * Support for the iControl and SafeTcam platforms from TMT Services
      6 * using the Embedian MXM-8x10 Computer on Module
      7 *
      8 * Copyright (C) 2009 TMT Services & Supplies (Pty) Ltd.
      9 *
     10 * 2010-01-21 Hennie van der Merve <hvdmerwe@tmtservies.co.za>
     11 */
     12
     13#include <linux/irq.h>
     14#include <linux/platform_device.h>
     15#include <linux/property.h>
     16#include <linux/gpio/machine.h>
     17
     18#include <asm/mach-types.h>
     19#include <asm/mach/arch.h>
     20
     21#include "pxa320.h"
     22#include "mxm8x10.h"
     23
     24#include <linux/spi/spi.h>
     25#include <linux/spi/pxa2xx_spi.h>
     26#include <linux/regulator/machine.h>
     27
     28#include "generic.h"
     29
     30#define ICONTROL_MCP251x_nCS1	(15)
     31#define ICONTROL_MCP251x_nCS2	(16)
     32#define ICONTROL_MCP251x_nCS3	(17)
     33#define ICONTROL_MCP251x_nCS4	(24)
     34
     35#define ICONTROL_MCP251x_nIRQ1	(74)
     36#define ICONTROL_MCP251x_nIRQ2	(75)
     37#define ICONTROL_MCP251x_nIRQ3	(76)
     38#define ICONTROL_MCP251x_nIRQ4	(77)
     39
     40static struct pxa2xx_spi_chip mcp251x_chip_info1 = {
     41	.tx_threshold   = 8,
     42	.rx_threshold   = 128,
     43	.dma_burst_size = 8,
     44	.timeout        = 235,
     45};
     46
     47static struct pxa2xx_spi_chip mcp251x_chip_info2 = {
     48	.tx_threshold   = 8,
     49	.rx_threshold   = 128,
     50	.dma_burst_size = 8,
     51	.timeout        = 235,
     52};
     53
     54static struct pxa2xx_spi_chip mcp251x_chip_info3 = {
     55	.tx_threshold   = 8,
     56	.rx_threshold   = 128,
     57	.dma_burst_size = 8,
     58	.timeout        = 235,
     59};
     60
     61static struct pxa2xx_spi_chip mcp251x_chip_info4 = {
     62	.tx_threshold   = 8,
     63	.rx_threshold   = 128,
     64	.dma_burst_size = 8,
     65	.timeout        = 235,
     66};
     67
     68static const struct property_entry mcp251x_properties[] = {
     69	PROPERTY_ENTRY_U32("clock-frequency", 16000000),
     70	{}
     71};
     72
     73static const struct software_node mcp251x_node = {
     74	.properties = mcp251x_properties,
     75};
     76
     77static struct spi_board_info mcp251x_board_info[] = {
     78	{
     79		.modalias        = "mcp2515",
     80		.max_speed_hz    = 6500000,
     81		.bus_num         = 3,
     82		.chip_select     = 0,
     83		.swnode		 = &mcp251x_node,
     84		.controller_data = &mcp251x_chip_info1,
     85		.irq             = PXA_GPIO_TO_IRQ(ICONTROL_MCP251x_nIRQ1)
     86	},
     87	{
     88		.modalias        = "mcp2515",
     89		.max_speed_hz    = 6500000,
     90		.bus_num         = 3,
     91		.chip_select     = 1,
     92		.swnode		 = &mcp251x_node,
     93		.controller_data = &mcp251x_chip_info2,
     94		.irq             = PXA_GPIO_TO_IRQ(ICONTROL_MCP251x_nIRQ2)
     95	},
     96	{
     97		.modalias        = "mcp2515",
     98		.max_speed_hz    = 6500000,
     99		.bus_num         = 4,
    100		.chip_select     = 0,
    101		.swnode		 = &mcp251x_node,
    102		.controller_data = &mcp251x_chip_info3,
    103		.irq             = PXA_GPIO_TO_IRQ(ICONTROL_MCP251x_nIRQ3)
    104	},
    105	{
    106		.modalias        = "mcp2515",
    107		.max_speed_hz    = 6500000,
    108		.bus_num         = 4,
    109		.chip_select     = 1,
    110		.swnode		 = &mcp251x_node,
    111		.controller_data = &mcp251x_chip_info4,
    112		.irq             = PXA_GPIO_TO_IRQ(ICONTROL_MCP251x_nIRQ4)
    113	}
    114};
    115
    116static struct pxa2xx_spi_controller pxa_ssp3_spi_master_info = {
    117	.num_chipselect = 2,
    118	.enable_dma     = 1
    119};
    120
    121static struct pxa2xx_spi_controller pxa_ssp4_spi_master_info = {
    122	.num_chipselect = 2,
    123	.enable_dma     = 1
    124};
    125
    126struct platform_device pxa_spi_ssp3 = {
    127	.name          = "pxa2xx-spi",
    128	.id            = 3,
    129	.dev           = {
    130		.platform_data = &pxa_ssp3_spi_master_info,
    131	}
    132};
    133
    134struct platform_device pxa_spi_ssp4 = {
    135	.name          = "pxa2xx-spi",
    136	.id            = 4,
    137	.dev           = {
    138		.platform_data = &pxa_ssp4_spi_master_info,
    139	}
    140};
    141
    142static struct gpiod_lookup_table pxa_ssp3_gpio_table = {
    143	.dev_id = "pxa2xx-spi.3",
    144	.table = {
    145		GPIO_LOOKUP_IDX("gpio-pxa", ICONTROL_MCP251x_nCS1, "cs", 0, GPIO_ACTIVE_LOW),
    146		GPIO_LOOKUP_IDX("gpio-pxa", ICONTROL_MCP251x_nCS2, "cs", 1, GPIO_ACTIVE_LOW),
    147		{ },
    148	},
    149};
    150
    151static struct gpiod_lookup_table pxa_ssp4_gpio_table = {
    152	.dev_id = "pxa2xx-spi.4",
    153	.table = {
    154		GPIO_LOOKUP_IDX("gpio-pxa", ICONTROL_MCP251x_nCS3, "cs", 0, GPIO_ACTIVE_LOW),
    155		GPIO_LOOKUP_IDX("gpio-pxa", ICONTROL_MCP251x_nCS4, "cs", 1, GPIO_ACTIVE_LOW),
    156		{ },
    157	},
    158};
    159
    160static struct platform_device *icontrol_spi_devices[] __initdata = {
    161	&pxa_spi_ssp3,
    162	&pxa_spi_ssp4,
    163};
    164
    165static mfp_cfg_t mfp_can_cfg[] __initdata = {
    166	/* CAN CS lines */
    167	GPIO15_GPIO,
    168	GPIO16_GPIO,
    169	GPIO17_GPIO,
    170	GPIO24_GPIO,
    171
    172	/* SPI (SSP3) lines */
    173	GPIO89_SSP3_SCLK,
    174	GPIO91_SSP3_TXD,
    175	GPIO92_SSP3_RXD,
    176
    177	/* SPI (SSP4) lines */
    178	GPIO93_SSP4_SCLK,
    179	GPIO95_SSP4_TXD,
    180	GPIO96_SSP4_RXD,
    181
    182	/* CAN nIRQ lines */
    183	GPIO74_GPIO | MFP_LPM_EDGE_RISE,
    184	GPIO75_GPIO | MFP_LPM_EDGE_RISE,
    185	GPIO76_GPIO | MFP_LPM_EDGE_RISE,
    186	GPIO77_GPIO | MFP_LPM_EDGE_RISE
    187};
    188
    189static void __init icontrol_can_init(void)
    190{
    191	pxa3xx_mfp_config(ARRAY_AND_SIZE(mfp_can_cfg));
    192	gpiod_add_lookup_table(&pxa_ssp3_gpio_table);
    193	gpiod_add_lookup_table(&pxa_ssp4_gpio_table);
    194	platform_add_devices(ARRAY_AND_SIZE(icontrol_spi_devices));
    195	spi_register_board_info(ARRAY_AND_SIZE(mcp251x_board_info));
    196}
    197
    198static void __init icontrol_init(void)
    199{
    200	mxm_8x10_barebones_init();
    201	mxm_8x10_usb_host_init();
    202	mxm_8x10_mmc_init();
    203
    204	icontrol_can_init();
    205
    206	regulator_has_full_constraints();
    207}
    208
    209MACHINE_START(ICONTROL, "iControl/SafeTcam boards using Embedian MXM-8x10 CoM")
    210	.atag_offset	= 0x100,
    211	.map_io		= pxa3xx_map_io,
    212	.nr_irqs	= PXA_NR_IRQS,
    213	.init_irq	= pxa3xx_init_irq,
    214	.handle_irq	= pxa3xx_handle_irq,
    215	.init_time	= pxa_timer_init,
    216	.init_machine	= icontrol_init,
    217	.restart	= pxa_restart,
    218MACHINE_END