Merge branch 'nomadik-for-arm-soc' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-nomadik into next/soc
* 'nomadik-for-arm-soc' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-nomadik: ARM: nomadik: bump all IRQ numbers by one ARM: nomadik: register the MMC/SD device ARM: nomadik: register the I2C devices ARM: nomadik: register all three I2C busses ARM: nomadik: convert to generic clock ARM: nomadik: register PL031 RTC ARM: nomadik: register AMBA devices dynamically ARM: nomadik: register GPIOs dynamically
This commit is contained in:
commit
51a1ec0164
@ -911,7 +911,7 @@ config ARCH_NOMADIK
|
||||
select ARM_AMBA
|
||||
select ARM_VIC
|
||||
select CPU_ARM926T
|
||||
select CLKDEV_LOOKUP
|
||||
select COMMON_CLK
|
||||
select GENERIC_CLOCKEVENTS
|
||||
select PINCTRL
|
||||
select MIGHT_HAVE_CACHE_L2X0
|
||||
|
@ -7,8 +7,6 @@
|
||||
|
||||
# Object file lists.
|
||||
|
||||
obj-y += clock.o
|
||||
|
||||
# Cpu revision
|
||||
obj-$(CONFIG_NOMADIK_8815) += cpu-8815.o
|
||||
|
||||
|
@ -14,12 +14,14 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/amba/bus.h>
|
||||
#include <linux/amba/mmci.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/nand.h>
|
||||
#include <linux/mtd/onenand.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/io.h>
|
||||
#include <asm/hardware/vic.h>
|
||||
#include <asm/sizes.h>
|
||||
@ -185,17 +187,29 @@ static void __init nhk8815_onenand_init(void)
|
||||
#endif
|
||||
}
|
||||
|
||||
static AMBA_APB_DEVICE(uart0, "uart0", 0, NOMADIK_UART0_BASE,
|
||||
{ IRQ_UART0 }, NULL);
|
||||
|
||||
static AMBA_APB_DEVICE(uart1, "uart1", 0, NOMADIK_UART1_BASE,
|
||||
{ IRQ_UART1 }, NULL);
|
||||
|
||||
static struct amba_device *amba_devs[] __initdata = {
|
||||
&uart0_device,
|
||||
&uart1_device,
|
||||
static struct mmci_platform_data mmcsd_plat_data = {
|
||||
.ocr_mask = MMC_VDD_29_30,
|
||||
.f_max = 48000000,
|
||||
.gpio_wp = -1,
|
||||
.gpio_cd = 111,
|
||||
.cd_invert = true,
|
||||
.capabilities = MMC_CAP_MMC_HIGHSPEED |
|
||||
MMC_CAP_SD_HIGHSPEED | MMC_CAP_4_BIT_DATA,
|
||||
};
|
||||
|
||||
static int __init nhk8815_mmcsd_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = gpio_request(112, "card detect bias");
|
||||
if (ret)
|
||||
return ret;
|
||||
gpio_direction_output(112, 0);
|
||||
amba_apb_device_add(NULL, "mmci", NOMADIK_SDI_BASE, SZ_4K, IRQ_SDMMC, 0, &mmcsd_plat_data, 0x10180180);
|
||||
return 0;
|
||||
}
|
||||
module_init(nhk8815_mmcsd_init);
|
||||
|
||||
static struct resource nhk8815_eth_resources[] = {
|
||||
{
|
||||
.name = "smc91x-regs",
|
||||
@ -253,17 +267,46 @@ static struct sys_timer nomadik_timer = {
|
||||
.init = nomadik_timer_init,
|
||||
};
|
||||
|
||||
static struct i2c_board_info __initdata nhk8815_i2c0_devices[] = {
|
||||
{
|
||||
I2C_BOARD_INFO("stw4811", 0x2d),
|
||||
},
|
||||
};
|
||||
|
||||
static struct i2c_board_info __initdata nhk8815_i2c1_devices[] = {
|
||||
{
|
||||
I2C_BOARD_INFO("camera", 0x10),
|
||||
},
|
||||
{
|
||||
I2C_BOARD_INFO("stw5095", 0x1a),
|
||||
},
|
||||
{
|
||||
I2C_BOARD_INFO("lis3lv02dl", 0x1d),
|
||||
},
|
||||
};
|
||||
|
||||
static struct i2c_board_info __initdata nhk8815_i2c2_devices[] = {
|
||||
{
|
||||
I2C_BOARD_INFO("stw4811-usb", 0x2d),
|
||||
},
|
||||
};
|
||||
|
||||
static void __init nhk8815_platform_init(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
cpu8815_platform_init();
|
||||
nhk8815_onenand_init();
|
||||
platform_add_devices(nhk8815_platform_devices,
|
||||
ARRAY_SIZE(nhk8815_platform_devices));
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(amba_devs); i++)
|
||||
amba_device_register(amba_devs[i], &iomem_resource);
|
||||
amba_apb_device_add(NULL, "uart0", NOMADIK_UART0_BASE, SZ_4K, IRQ_UART0, 0, NULL, 0);
|
||||
amba_apb_device_add(NULL, "uart1", NOMADIK_UART1_BASE, SZ_4K, IRQ_UART1, 0, NULL, 0);
|
||||
|
||||
i2c_register_board_info(0, nhk8815_i2c0_devices,
|
||||
ARRAY_SIZE(nhk8815_i2c0_devices));
|
||||
i2c_register_board_info(1, nhk8815_i2c1_devices,
|
||||
ARRAY_SIZE(nhk8815_i2c1_devices));
|
||||
i2c_register_board_info(2, nhk8815_i2c2_devices,
|
||||
ARRAY_SIZE(nhk8815_i2c2_devices));
|
||||
}
|
||||
|
||||
MACHINE_START(NOMADIK, "NHK8815")
|
||||
|
@ -1,75 +0,0 @@
|
||||
/*
|
||||
* linux/arch/arm/mach-nomadik/clock.c
|
||||
*
|
||||
* Copyright (C) 2009 Alessandro Rubini
|
||||
*/
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/clkdev.h>
|
||||
#include "clock.h"
|
||||
|
||||
/*
|
||||
* The nomadik board uses generic clocks, but the serial pl011 file
|
||||
* calls clk_enable(), clk_disable(), clk_get_rate(), so we provide them
|
||||
*/
|
||||
unsigned long clk_get_rate(struct clk *clk)
|
||||
{
|
||||
return clk->rate;
|
||||
}
|
||||
EXPORT_SYMBOL(clk_get_rate);
|
||||
|
||||
/* enable and disable do nothing */
|
||||
int clk_enable(struct clk *clk)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(clk_enable);
|
||||
|
||||
void clk_disable(struct clk *clk)
|
||||
{
|
||||
}
|
||||
EXPORT_SYMBOL(clk_disable);
|
||||
|
||||
static struct clk clk_24 = {
|
||||
.rate = 2400000,
|
||||
};
|
||||
|
||||
static struct clk clk_48 = {
|
||||
.rate = 48 * 1000 * 1000,
|
||||
};
|
||||
|
||||
/*
|
||||
* Catch-all default clock to satisfy drivers using the clk API. We don't
|
||||
* model the actual hardware clocks yet.
|
||||
*/
|
||||
static struct clk clk_default;
|
||||
|
||||
#define CLK(_clk, dev) \
|
||||
{ \
|
||||
.clk = _clk, \
|
||||
.dev_id = dev, \
|
||||
}
|
||||
|
||||
static struct clk_lookup lookups[] = {
|
||||
{
|
||||
.con_id = "apb_pclk",
|
||||
.clk = &clk_default,
|
||||
},
|
||||
CLK(&clk_24, "mtu0"),
|
||||
CLK(&clk_24, "mtu1"),
|
||||
CLK(&clk_48, "uart0"),
|
||||
CLK(&clk_48, "uart1"),
|
||||
CLK(&clk_default, "gpio.0"),
|
||||
CLK(&clk_default, "gpio.1"),
|
||||
CLK(&clk_default, "gpio.2"),
|
||||
CLK(&clk_default, "gpio.3"),
|
||||
CLK(&clk_default, "rng"),
|
||||
};
|
||||
|
||||
int __init clk_init(void)
|
||||
{
|
||||
clkdev_add_table(lookups, ARRAY_SIZE(lookups));
|
||||
return 0;
|
||||
}
|
@ -1,15 +0,0 @@
|
||||
|
||||
/*
|
||||
* linux/arch/arm/mach-nomadik/clock.h
|
||||
*
|
||||
* Copyright (C) 2009 Alessandro Rubini
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
struct clk {
|
||||
unsigned long rate;
|
||||
};
|
||||
|
||||
int __init clk_init(void);
|
@ -22,6 +22,10 @@
|
||||
#include <linux/amba/bus.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/platform_data/clk-nomadik.h>
|
||||
|
||||
#include <plat/gpio-nomadik.h>
|
||||
#include <mach/hardware.h>
|
||||
@ -32,91 +36,63 @@
|
||||
#include <asm/cacheflush.h>
|
||||
#include <asm/hardware/cache-l2x0.h>
|
||||
|
||||
#include "clock.h"
|
||||
#include "cpu-8815.h"
|
||||
|
||||
#define __MEM_4K_RESOURCE(x) \
|
||||
.res = {.start = (x), .end = (x) + SZ_4K - 1, .flags = IORESOURCE_MEM}
|
||||
|
||||
/* The 8815 has 4 GPIO blocks, let's register them immediately */
|
||||
static resource_size_t __initdata cpu8815_gpio_base[] = {
|
||||
NOMADIK_GPIO0_BASE,
|
||||
NOMADIK_GPIO1_BASE,
|
||||
NOMADIK_GPIO2_BASE,
|
||||
NOMADIK_GPIO3_BASE,
|
||||
};
|
||||
|
||||
#define GPIO_RESOURCE(block) \
|
||||
{ \
|
||||
.start = NOMADIK_GPIO##block##_BASE, \
|
||||
.end = NOMADIK_GPIO##block##_BASE + SZ_4K - 1, \
|
||||
.flags = IORESOURCE_MEM, \
|
||||
}, \
|
||||
{ \
|
||||
.start = IRQ_GPIO##block, \
|
||||
.end = IRQ_GPIO##block, \
|
||||
.flags = IORESOURCE_IRQ, \
|
||||
static struct platform_device *
|
||||
cpu8815_add_gpio(int id, resource_size_t addr, int irq,
|
||||
struct nmk_gpio_platform_data *pdata)
|
||||
{
|
||||
struct resource resources[] = {
|
||||
{
|
||||
.start = addr,
|
||||
.end = addr + 127,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
{
|
||||
.start = irq,
|
||||
.end = irq,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
}
|
||||
};
|
||||
|
||||
return platform_device_register_resndata(NULL, "gpio", id,
|
||||
resources, ARRAY_SIZE(resources),
|
||||
pdata, sizeof(*pdata));
|
||||
}
|
||||
|
||||
void cpu8815_add_gpios(resource_size_t *base, int num, int irq,
|
||||
struct nmk_gpio_platform_data *pdata)
|
||||
{
|
||||
int first = 0;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < num; i++, first += 32, irq++) {
|
||||
pdata->first_gpio = first;
|
||||
pdata->first_irq = NOMADIK_GPIO_TO_IRQ(first);
|
||||
pdata->num_gpio = 32;
|
||||
|
||||
cpu8815_add_gpio(i, base[i], irq, pdata);
|
||||
}
|
||||
|
||||
#define GPIO_DEVICE(block) \
|
||||
{ \
|
||||
.name = "gpio", \
|
||||
.id = block, \
|
||||
.num_resources = 2, \
|
||||
.resource = &cpu8815_gpio_resources[block * 2], \
|
||||
.dev = { \
|
||||
.platform_data = &cpu8815_gpio[block], \
|
||||
}, \
|
||||
}
|
||||
|
||||
static struct nmk_gpio_platform_data cpu8815_gpio[] = {
|
||||
{
|
||||
.name = "GPIO-0-31",
|
||||
.first_gpio = 0,
|
||||
.first_irq = NOMADIK_GPIO_TO_IRQ(0),
|
||||
}, {
|
||||
.name = "GPIO-32-63",
|
||||
.first_gpio = 32,
|
||||
.first_irq = NOMADIK_GPIO_TO_IRQ(32),
|
||||
}, {
|
||||
.name = "GPIO-64-95",
|
||||
.first_gpio = 64,
|
||||
.first_irq = NOMADIK_GPIO_TO_IRQ(64),
|
||||
}, {
|
||||
.name = "GPIO-96-127", /* 124..127 not routed to pin */
|
||||
.first_gpio = 96,
|
||||
.first_irq = NOMADIK_GPIO_TO_IRQ(96),
|
||||
}
|
||||
};
|
||||
|
||||
static struct resource cpu8815_gpio_resources[] = {
|
||||
GPIO_RESOURCE(0),
|
||||
GPIO_RESOURCE(1),
|
||||
GPIO_RESOURCE(2),
|
||||
GPIO_RESOURCE(3),
|
||||
};
|
||||
|
||||
static struct platform_device cpu8815_platform_gpio[] = {
|
||||
GPIO_DEVICE(0),
|
||||
GPIO_DEVICE(1),
|
||||
GPIO_DEVICE(2),
|
||||
GPIO_DEVICE(3),
|
||||
};
|
||||
|
||||
static AMBA_APB_DEVICE(cpu8815_amba_rng, "rng", 0, NOMADIK_RNG_BASE, { }, NULL);
|
||||
|
||||
static struct platform_device *platform_devs[] __initdata = {
|
||||
cpu8815_platform_gpio + 0,
|
||||
cpu8815_platform_gpio + 1,
|
||||
cpu8815_platform_gpio + 2,
|
||||
cpu8815_platform_gpio + 3,
|
||||
};
|
||||
|
||||
static struct amba_device *amba_devs[] __initdata = {
|
||||
&cpu8815_amba_rng_device
|
||||
};
|
||||
}
|
||||
|
||||
static int __init cpu8815_init(void)
|
||||
{
|
||||
int i;
|
||||
struct nmk_gpio_platform_data pdata = {
|
||||
/* No custom data yet */
|
||||
};
|
||||
|
||||
platform_add_devices(platform_devs, ARRAY_SIZE(platform_devs));
|
||||
for (i = 0; i < ARRAY_SIZE(amba_devs); i++)
|
||||
amba_device_register(amba_devs[i], &iomem_resource);
|
||||
cpu8815_add_gpios(cpu8815_gpio_base, ARRAY_SIZE(cpu8815_gpio_base),
|
||||
IRQ_GPIO0, &pdata);
|
||||
amba_apb_device_add(NULL, "rng", NOMADIK_RNG_BASE, SZ_4K, 0, 0, NULL, 0);
|
||||
amba_apb_device_add(NULL, "rtc-pl031", NOMADIK_RTC_BASE, SZ_4K, IRQ_RTC_RTT, 0, NULL, 0);
|
||||
return 0;
|
||||
}
|
||||
arch_initcall(cpu8815_init);
|
||||
@ -147,7 +123,7 @@ void __init cpu8815_init_irq(void)
|
||||
* Init clocks here so that they are available for system timer
|
||||
* initialization.
|
||||
*/
|
||||
clk_init();
|
||||
nomadik_clk_init();
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -5,6 +5,7 @@
|
||||
#include <linux/i2c-gpio.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <plat/gpio-nomadik.h>
|
||||
#include <plat/pincfg.h>
|
||||
|
||||
/*
|
||||
* There are two busses in the 8815NHK.
|
||||
@ -12,19 +13,27 @@
|
||||
* use bit-bang through GPIO by now, to keep things simple
|
||||
*/
|
||||
|
||||
/* I2C0 connected to the STw4811 power management chip */
|
||||
static struct i2c_gpio_platform_data nhk8815_i2c_data0 = {
|
||||
/* keep defaults for timeouts; pins are push-pull bidirectional */
|
||||
.scl_pin = 62,
|
||||
.sda_pin = 63,
|
||||
};
|
||||
|
||||
/* I2C1 connected to various sensors */
|
||||
static struct i2c_gpio_platform_data nhk8815_i2c_data1 = {
|
||||
/* keep defaults for timeouts; pins are push-pull bidirectional */
|
||||
.scl_pin = 53,
|
||||
.sda_pin = 54,
|
||||
};
|
||||
|
||||
/* first bus: GPIO XX and YY */
|
||||
/* I2C2 connected to the USB portions of the STw4811 only */
|
||||
static struct i2c_gpio_platform_data nhk8815_i2c_data2 = {
|
||||
/* keep defaults for timeouts; pins are push-pull bidirectional */
|
||||
.scl_pin = 73,
|
||||
.sda_pin = 74,
|
||||
};
|
||||
|
||||
static struct platform_device nhk8815_i2c_dev0 = {
|
||||
.name = "i2c-gpio",
|
||||
.id = 0,
|
||||
@ -32,7 +41,7 @@ static struct platform_device nhk8815_i2c_dev0 = {
|
||||
.platform_data = &nhk8815_i2c_data0,
|
||||
},
|
||||
};
|
||||
/* second bus: GPIO XX and YY */
|
||||
|
||||
static struct platform_device nhk8815_i2c_dev1 = {
|
||||
.name = "i2c-gpio",
|
||||
.id = 1,
|
||||
@ -41,15 +50,29 @@ static struct platform_device nhk8815_i2c_dev1 = {
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device nhk8815_i2c_dev2 = {
|
||||
.name = "i2c-gpio",
|
||||
.id = 2,
|
||||
.dev = {
|
||||
.platform_data = &nhk8815_i2c_data2,
|
||||
},
|
||||
};
|
||||
|
||||
static pin_cfg_t cpu8815_pins_i2c[] = {
|
||||
PIN_CFG_INPUT(62, GPIO, PULLUP),
|
||||
PIN_CFG_INPUT(63, GPIO, PULLUP),
|
||||
PIN_CFG_INPUT(53, GPIO, PULLUP),
|
||||
PIN_CFG_INPUT(54, GPIO, PULLUP),
|
||||
PIN_CFG_INPUT(73, GPIO, PULLUP),
|
||||
PIN_CFG_INPUT(74, GPIO, PULLUP),
|
||||
};
|
||||
|
||||
static int __init nhk8815_i2c_init(void)
|
||||
{
|
||||
nmk_gpio_set_mode(nhk8815_i2c_data0.scl_pin, NMK_GPIO_ALT_GPIO);
|
||||
nmk_gpio_set_mode(nhk8815_i2c_data0.sda_pin, NMK_GPIO_ALT_GPIO);
|
||||
nmk_config_pins(cpu8815_pins_i2c, ARRAY_SIZE(cpu8815_pins_i2c));
|
||||
platform_device_register(&nhk8815_i2c_dev0);
|
||||
|
||||
nmk_gpio_set_mode(nhk8815_i2c_data1.scl_pin, NMK_GPIO_ALT_GPIO);
|
||||
nmk_gpio_set_mode(nhk8815_i2c_data1.sda_pin, NMK_GPIO_ALT_GPIO);
|
||||
platform_device_register(&nhk8815_i2c_dev1);
|
||||
platform_device_register(&nhk8815_i2c_dev2);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -58,6 +81,7 @@ static void __exit nhk8815_i2c_exit(void)
|
||||
{
|
||||
platform_device_unregister(&nhk8815_i2c_dev0);
|
||||
platform_device_unregister(&nhk8815_i2c_dev1);
|
||||
platform_device_unregister(&nhk8815_i2c_dev2);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -22,56 +22,56 @@
|
||||
|
||||
#include <mach/hardware.h>
|
||||
|
||||
#define IRQ_VIC_START 0 /* first VIC interrupt is 0 */
|
||||
#define IRQ_VIC_START 1 /* first VIC interrupt is 1 */
|
||||
|
||||
/*
|
||||
* Interrupt numbers generic for all Nomadik Chip cuts
|
||||
*/
|
||||
#define IRQ_WATCHDOG 0
|
||||
#define IRQ_SOFTINT 1
|
||||
#define IRQ_CRYPTO 2
|
||||
#define IRQ_OWM 3
|
||||
#define IRQ_MTU0 4
|
||||
#define IRQ_MTU1 5
|
||||
#define IRQ_GPIO0 6
|
||||
#define IRQ_GPIO1 7
|
||||
#define IRQ_GPIO2 8
|
||||
#define IRQ_GPIO3 9
|
||||
#define IRQ_RTC_RTT 10
|
||||
#define IRQ_SSP 11
|
||||
#define IRQ_UART0 12
|
||||
#define IRQ_DMA1 13
|
||||
#define IRQ_CLCD_MDIF 14
|
||||
#define IRQ_DMA0 15
|
||||
#define IRQ_PWRFAIL 16
|
||||
#define IRQ_UART1 17
|
||||
#define IRQ_FIRDA 18
|
||||
#define IRQ_MSP0 19
|
||||
#define IRQ_I2C0 20
|
||||
#define IRQ_I2C1 21
|
||||
#define IRQ_SDMMC 22
|
||||
#define IRQ_USBOTG 23
|
||||
#define IRQ_SVA_IT0 24
|
||||
#define IRQ_SVA_IT1 25
|
||||
#define IRQ_SAA_IT0 26
|
||||
#define IRQ_SAA_IT1 27
|
||||
#define IRQ_UART2 28
|
||||
#define IRQ_MSP2 31
|
||||
#define IRQ_L2CC 48
|
||||
#define IRQ_HPI 49
|
||||
#define IRQ_SKE 50
|
||||
#define IRQ_KP 51
|
||||
#define IRQ_MEMST 54
|
||||
#define IRQ_SGA_IT 58
|
||||
#define IRQ_USBM 60
|
||||
#define IRQ_MSP1 62
|
||||
#define IRQ_WATCHDOG 1
|
||||
#define IRQ_SOFTINT 2
|
||||
#define IRQ_CRYPTO 3
|
||||
#define IRQ_OWM 4
|
||||
#define IRQ_MTU0 5
|
||||
#define IRQ_MTU1 6
|
||||
#define IRQ_GPIO0 7
|
||||
#define IRQ_GPIO1 8
|
||||
#define IRQ_GPIO2 9
|
||||
#define IRQ_GPIO3 10
|
||||
#define IRQ_RTC_RTT 11
|
||||
#define IRQ_SSP 12
|
||||
#define IRQ_UART0 13
|
||||
#define IRQ_DMA1 14
|
||||
#define IRQ_CLCD_MDIF 15
|
||||
#define IRQ_DMA0 16
|
||||
#define IRQ_PWRFAIL 17
|
||||
#define IRQ_UART1 18
|
||||
#define IRQ_FIRDA 19
|
||||
#define IRQ_MSP0 20
|
||||
#define IRQ_I2C0 21
|
||||
#define IRQ_I2C1 22
|
||||
#define IRQ_SDMMC 23
|
||||
#define IRQ_USBOTG 24
|
||||
#define IRQ_SVA_IT0 25
|
||||
#define IRQ_SVA_IT1 26
|
||||
#define IRQ_SAA_IT0 27
|
||||
#define IRQ_SAA_IT1 28
|
||||
#define IRQ_UART2 29
|
||||
#define IRQ_MSP2 30
|
||||
#define IRQ_L2CC 49
|
||||
#define IRQ_HPI 50
|
||||
#define IRQ_SKE 51
|
||||
#define IRQ_KP 52
|
||||
#define IRQ_MEMST 55
|
||||
#define IRQ_SGA_IT 59
|
||||
#define IRQ_USBM 61
|
||||
#define IRQ_MSP1 63
|
||||
|
||||
#define NOMADIK_SOC_NR_IRQS 64
|
||||
#define NOMADIK_GPIO_OFFSET (IRQ_VIC_START+64)
|
||||
|
||||
/* After chip-specific IRQ numbers we have the GPIO ones */
|
||||
#define NOMADIK_NR_GPIO 128 /* last 4 not wired to pins */
|
||||
#define NOMADIK_GPIO_TO_IRQ(gpio) ((gpio) + NOMADIK_SOC_NR_IRQS)
|
||||
#define NOMADIK_IRQ_TO_GPIO(irq) ((irq) - NOMADIK_SOC_NR_IRQS)
|
||||
#define NOMADIK_GPIO_TO_IRQ(gpio) ((gpio) + NOMADIK_GPIO_OFFSET)
|
||||
#define NOMADIK_IRQ_TO_GPIO(irq) ((irq) - NOMADIK_GPIO_OFFSET)
|
||||
#define NR_IRQS NOMADIK_GPIO_TO_IRQ(NOMADIK_NR_GPIO)
|
||||
|
||||
/* Following two are used by entry_macro.S, to access our dual-vic */
|
||||
@ -79,4 +79,3 @@
|
||||
#define VIC_REG_IRQSR1 0x20
|
||||
|
||||
#endif /* __ASM_ARCH_IRQS_H */
|
||||
|
||||
|
@ -3,5 +3,6 @@ obj-$(CONFIG_CLKDEV_LOOKUP) += clkdev.o
|
||||
obj-$(CONFIG_COMMON_CLK) += clk.o clk-fixed-rate.o clk-gate.o \
|
||||
clk-mux.o clk-divider.o clk-fixed-factor.o
|
||||
# SoCs specific
|
||||
obj-$(CONFIG_ARCH_NOMADIK) += clk-nomadik.o
|
||||
obj-$(CONFIG_ARCH_MXS) += mxs/
|
||||
obj-$(CONFIG_PLAT_SPEAR) += spear/
|
||||
|
47
drivers/clk/clk-nomadik.c
Normal file
47
drivers/clk/clk-nomadik.c
Normal file
@ -0,0 +1,47 @@
|
||||
#include <linux/clk.h>
|
||||
#include <linux/clkdev.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/clk-provider.h>
|
||||
|
||||
/*
|
||||
* The Nomadik clock tree is described in the STN8815A12 DB V4.2
|
||||
* reference manual for the chip, page 94 ff.
|
||||
*/
|
||||
|
||||
void __init nomadik_clk_init(void)
|
||||
{
|
||||
struct clk *clk;
|
||||
|
||||
clk = clk_register_fixed_rate(NULL, "apb_pclk", NULL, CLK_IS_ROOT, 0);
|
||||
clk_register_clkdev(clk, "apb_pclk", NULL);
|
||||
clk_register_clkdev(clk, NULL, "gpio.0");
|
||||
clk_register_clkdev(clk, NULL, "gpio.1");
|
||||
clk_register_clkdev(clk, NULL, "gpio.2");
|
||||
clk_register_clkdev(clk, NULL, "gpio.3");
|
||||
clk_register_clkdev(clk, NULL, "rng");
|
||||
|
||||
/*
|
||||
* The 2.4 MHz TIMCLK reference clock is active at boot time, this is
|
||||
* actually the MXTALCLK @19.2 MHz divided by 8. This clock is used
|
||||
* by the timers and watchdog. See page 105 ff.
|
||||
*/
|
||||
clk = clk_register_fixed_rate(NULL, "TIMCLK", NULL, CLK_IS_ROOT,
|
||||
2400000);
|
||||
clk_register_clkdev(clk, NULL, "mtu0");
|
||||
clk_register_clkdev(clk, NULL, "mtu1");
|
||||
|
||||
/*
|
||||
* At boot time, PLL2 is set to generate a set of fixed clocks,
|
||||
* one of them is CLK48, the 48 MHz clock, routed to the UART, MMC/SD
|
||||
* I2C, IrDA, USB and SSP blocks.
|
||||
*/
|
||||
clk = clk_register_fixed_rate(NULL, "CLK48", NULL, CLK_IS_ROOT,
|
||||
48000000);
|
||||
clk_register_clkdev(clk, NULL, "uart0");
|
||||
clk_register_clkdev(clk, NULL, "uart1");
|
||||
clk_register_clkdev(clk, NULL, "mmci");
|
||||
clk_register_clkdev(clk, NULL, "ssp");
|
||||
clk_register_clkdev(clk, NULL, "nmk-i2c.0");
|
||||
clk_register_clkdev(clk, NULL, "nmk-i2c.1");
|
||||
}
|
2
include/linux/platform_data/clk-nomadik.h
Normal file
2
include/linux/platform_data/clk-nomadik.h
Normal file
@ -0,0 +1,2 @@
|
||||
/* Minimal platform data header */
|
||||
void nomadik_clk_init(void);
|
Loading…
x
Reference in New Issue
Block a user