mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-21 11:44:01 +08:00
Merge branch 'kirkwood/dt' into next/dt2
This was part of the for-next branch earlier but for some reasons a rebuild of the tree missed it, so I'm putting it back in now. Signed-off-by: Arnd Bergmann <arnd@arndb.de>
This commit is contained in:
commit
7d1206bc28
@ -1579,6 +1579,7 @@ config ARCH_NR_GPIO
|
||||
int
|
||||
default 1024 if ARCH_SHMOBILE || ARCH_TEGRA
|
||||
default 350 if ARCH_U8500
|
||||
default 264 if MACH_H4700
|
||||
default 0
|
||||
help
|
||||
Maximum number of GPIOs in the system.
|
||||
|
24
arch/arm/boot/dts/kirkwood-dreamplug.dts
Normal file
24
arch/arm/boot/dts/kirkwood-dreamplug.dts
Normal file
@ -0,0 +1,24 @@
|
||||
/dts-v1/;
|
||||
|
||||
/include/ "kirkwood.dtsi"
|
||||
|
||||
/ {
|
||||
model = "Globalscale Technologies Dreamplug";
|
||||
compatible = "globalscale,dreamplug-003-ds2001", "globalscale,dreamplug", "mrvl,kirkwood-88f6281", "mrvl,kirkwood";
|
||||
|
||||
memory {
|
||||
device_type = "memory";
|
||||
reg = <0x00000000 0x20000000>;
|
||||
};
|
||||
|
||||
chosen {
|
||||
bootargs = "console=ttyS0,115200n8 earlyprintk";
|
||||
};
|
||||
|
||||
ocp@f1000000 {
|
||||
serial@12000 {
|
||||
clock-frequency = <200000000>;
|
||||
status = "ok";
|
||||
};
|
||||
};
|
||||
};
|
36
arch/arm/boot/dts/kirkwood.dtsi
Normal file
36
arch/arm/boot/dts/kirkwood.dtsi
Normal file
@ -0,0 +1,36 @@
|
||||
/include/ "skeleton.dtsi"
|
||||
|
||||
/ {
|
||||
compatible = "mrvl,kirkwood";
|
||||
|
||||
ocp@f1000000 {
|
||||
compatible = "simple-bus";
|
||||
ranges = <0 0xf1000000 0x1000000>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
serial@12000 {
|
||||
compatible = "ns16550a";
|
||||
reg = <0x12000 0x100>;
|
||||
reg-shift = <2>;
|
||||
interrupts = <33>;
|
||||
/* set clock-frequency in board dts */
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
serial@12100 {
|
||||
compatible = "ns16550a";
|
||||
reg = <0x12100 0x100>;
|
||||
reg-shift = <2>;
|
||||
interrupts = <34>;
|
||||
/* set clock-frequency in board dts */
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
rtc@10300 {
|
||||
compatible = "mrvl,kirkwood-rtc", "mrvl,orion-rtc";
|
||||
reg = <0x10300 0x20>;
|
||||
interrupts = <53>;
|
||||
};
|
||||
};
|
||||
};
|
@ -42,6 +42,11 @@
|
||||
|
||||
i2c@7000d000 {
|
||||
clock-frequency = <400000>;
|
||||
|
||||
adt7461@4c {
|
||||
compatible = "adi,adt7461";
|
||||
reg = <0x4c>;
|
||||
};
|
||||
};
|
||||
|
||||
i2s@70002a00 {
|
||||
@ -105,4 +110,25 @@
|
||||
sdhci@c8000600 {
|
||||
support-8bit;
|
||||
};
|
||||
|
||||
gpio-keys {
|
||||
compatible = "gpio-keys";
|
||||
|
||||
power {
|
||||
label = "Power";
|
||||
gpios = <&gpio 79 1>; /* gpio PJ7, active low */
|
||||
linux,code = <116>; /* KEY_POWER */
|
||||
gpio-key,wakeup;
|
||||
};
|
||||
};
|
||||
|
||||
gpio-leds {
|
||||
compatible = "gpio-leds";
|
||||
|
||||
wifi {
|
||||
label = "wifi-led";
|
||||
gpios = <&gpio 24 0>;
|
||||
linux,default-trigger = "rfkill0";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
@ -183,7 +183,9 @@ config MACH_SMDKV310
|
||||
select S5P_DEV_FIMC1
|
||||
select S5P_DEV_FIMC2
|
||||
select S5P_DEV_FIMC3
|
||||
select S5P_DEV_G2D
|
||||
select S5P_DEV_I2C_HDMIPHY
|
||||
select S5P_DEV_JPEG
|
||||
select S5P_DEV_MFC
|
||||
select S5P_DEV_TV
|
||||
select S5P_DEV_USB_EHCI
|
||||
@ -230,7 +232,9 @@ config MACH_UNIVERSAL_C210
|
||||
select S5P_DEV_FIMC1
|
||||
select S5P_DEV_FIMC2
|
||||
select S5P_DEV_FIMC3
|
||||
select S5P_DEV_G2D
|
||||
select S5P_DEV_CSIS0
|
||||
select S5P_DEV_JPEG
|
||||
select S5P_DEV_FIMD0
|
||||
select S3C_DEV_HSMMC
|
||||
select S3C_DEV_HSMMC2
|
||||
@ -268,11 +272,14 @@ config MACH_NURI
|
||||
select S3C_DEV_I2C1
|
||||
select S3C_DEV_I2C3
|
||||
select S3C_DEV_I2C5
|
||||
select S3C_DEV_I2C6
|
||||
select S5P_DEV_CSIS0
|
||||
select S5P_DEV_JPEG
|
||||
select S5P_DEV_FIMC0
|
||||
select S5P_DEV_FIMC1
|
||||
select S5P_DEV_FIMC2
|
||||
select S5P_DEV_FIMC3
|
||||
select S5P_DEV_G2D
|
||||
select S5P_DEV_MFC
|
||||
select S5P_DEV_USB_EHCI
|
||||
select S5P_SETUP_MIPIPHY
|
||||
@ -283,6 +290,7 @@ config MACH_NURI
|
||||
select EXYNOS4_SETUP_I2C1
|
||||
select EXYNOS4_SETUP_I2C3
|
||||
select EXYNOS4_SETUP_I2C5
|
||||
select EXYNOS4_SETUP_I2C6
|
||||
select EXYNOS4_SETUP_SDHCI
|
||||
select EXYNOS4_SETUP_USB_PHY
|
||||
select S5P_SETUP_MIPIPHY
|
||||
@ -303,7 +311,9 @@ config MACH_ORIGEN
|
||||
select S5P_DEV_FIMC2
|
||||
select S5P_DEV_FIMC3
|
||||
select S5P_DEV_FIMD0
|
||||
select S5P_DEV_G2D
|
||||
select S5P_DEV_I2C_HDMIPHY
|
||||
select S5P_DEV_JPEG
|
||||
select S5P_DEV_MFC
|
||||
select S5P_DEV_TV
|
||||
select S5P_DEV_USB_EHCI
|
||||
|
@ -28,6 +28,7 @@
|
||||
|
||||
#include <video/platform_lcd.h>
|
||||
#include <media/m5mols.h>
|
||||
#include <media/s5k6aa.h>
|
||||
#include <media/s5p_fimc.h>
|
||||
#include <media/v4l2-mediabus.h>
|
||||
|
||||
@ -75,6 +76,7 @@ enum fixed_regulator_id {
|
||||
FIXED_REG_ID_MAX8903,
|
||||
FIXED_REG_ID_CAM_A28V,
|
||||
FIXED_REG_ID_CAM_12V,
|
||||
FIXED_REG_ID_CAM_VT_15V,
|
||||
};
|
||||
|
||||
static struct s3c2410_uartcfg nuri_uartcfgs[] __initdata = {
|
||||
@ -399,6 +401,9 @@ static struct regulator_consumer_supply __initdata max8997_ldo4_[] = {
|
||||
static struct regulator_consumer_supply __initdata max8997_ldo5_[] = {
|
||||
REGULATOR_SUPPLY("vhsic", "modemctl"), /* MODEM */
|
||||
};
|
||||
static struct regulator_consumer_supply nuri_max8997_ldo6_consumer[] = {
|
||||
REGULATOR_SUPPLY("vdd_reg", "6-003c"), /* S5K6AA camera */
|
||||
};
|
||||
static struct regulator_consumer_supply __initdata max8997_ldo7_[] = {
|
||||
REGULATOR_SUPPLY("dig_18", "0-001f"), /* HCD803 */
|
||||
};
|
||||
@ -431,7 +436,7 @@ static struct regulator_consumer_supply __initdata max8997_buck1_[] = {
|
||||
REGULATOR_SUPPLY("vdd_arm", NULL), /* CPUFREQ */
|
||||
};
|
||||
static struct regulator_consumer_supply __initdata max8997_buck2_[] = {
|
||||
REGULATOR_SUPPLY("vdd_int", NULL), /* CPUFREQ */
|
||||
REGULATOR_SUPPLY("vdd_int", "exynos4210-busfreq.0"), /* CPUFREQ */
|
||||
};
|
||||
static struct regulator_consumer_supply __initdata max8997_buck3_[] = {
|
||||
REGULATOR_SUPPLY("vdd", "mali_dev.0"), /* G3D of Exynos 4 */
|
||||
@ -546,6 +551,8 @@ static struct regulator_init_data __initdata max8997_ldo6_data = {
|
||||
.enabled = 1,
|
||||
},
|
||||
},
|
||||
.num_consumer_supplies = ARRAY_SIZE(nuri_max8997_ldo6_consumer),
|
||||
.consumer_supplies = nuri_max8997_ldo6_consumer,
|
||||
};
|
||||
|
||||
static struct regulator_init_data __initdata max8997_ldo7_data = {
|
||||
@ -742,7 +749,7 @@ static struct regulator_init_data __initdata max8997_buck2_data = {
|
||||
.constraints = {
|
||||
.name = "VINT_1.1V_C210",
|
||||
.min_uV = 900000,
|
||||
.max_uV = 1100000,
|
||||
.max_uV = 1200000,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE,
|
||||
.always_on = 1,
|
||||
.state_mem = {
|
||||
@ -957,7 +964,6 @@ static struct max8997_platform_data __initdata nuri_max8997_pdata = {
|
||||
.regulators = nuri_max8997_regulators,
|
||||
|
||||
.buck125_gpios = { EXYNOS4_GPX0(5), EXYNOS4_GPX0(6), EXYNOS4_GPL0(0) },
|
||||
.buck2_gpiodvs = true,
|
||||
|
||||
.buck1_voltage[0] = 1350000, /* 1.35V */
|
||||
.buck1_voltage[1] = 1300000, /* 1.3V */
|
||||
@ -1116,7 +1122,30 @@ static void __init nuri_ehci_init(void)
|
||||
}
|
||||
|
||||
/* CAMERA */
|
||||
static struct regulator_consumer_supply cam_vt_cam15_supply =
|
||||
REGULATOR_SUPPLY("vdd_core", "6-003c");
|
||||
|
||||
static struct regulator_init_data cam_vt_cam15_reg_init_data = {
|
||||
.constraints = { .valid_ops_mask = REGULATOR_CHANGE_STATUS },
|
||||
.num_consumer_supplies = 1,
|
||||
.consumer_supplies = &cam_vt_cam15_supply,
|
||||
};
|
||||
|
||||
static struct fixed_voltage_config cam_vt_cam15_fixed_voltage_cfg = {
|
||||
.supply_name = "VT_CAM_1.5V",
|
||||
.microvolts = 1500000,
|
||||
.gpio = EXYNOS4_GPE2(2), /* VT_CAM_1.5V_EN */
|
||||
.enable_high = 1,
|
||||
.init_data = &cam_vt_cam15_reg_init_data,
|
||||
};
|
||||
|
||||
static struct platform_device cam_vt_cam15_fixed_rdev = {
|
||||
.name = "reg-fixed-voltage", .id = FIXED_REG_ID_CAM_VT_15V,
|
||||
.dev = { .platform_data = &cam_vt_cam15_fixed_voltage_cfg },
|
||||
};
|
||||
|
||||
static struct regulator_consumer_supply cam_vdda_supply[] = {
|
||||
REGULATOR_SUPPLY("vdda", "6-003c"),
|
||||
REGULATOR_SUPPLY("a_sensor", "0-001f"),
|
||||
};
|
||||
|
||||
@ -1173,6 +1202,21 @@ static struct s5p_platform_mipi_csis mipi_csis_platdata = {
|
||||
|
||||
#define GPIO_CAM_MEGA_RST EXYNOS4_GPY3(7) /* ISP_RESET */
|
||||
#define GPIO_CAM_8M_ISP_INT EXYNOS4_GPL2(5)
|
||||
#define GPIO_CAM_VT_NSTBY EXYNOS4_GPL2(0)
|
||||
#define GPIO_CAM_VT_NRST EXYNOS4_GPL2(1)
|
||||
|
||||
static struct s5k6aa_platform_data s5k6aa_pldata = {
|
||||
.mclk_frequency = 24000000UL,
|
||||
.gpio_reset = { GPIO_CAM_VT_NRST, 0 },
|
||||
.gpio_stby = { GPIO_CAM_VT_NSTBY, 0 },
|
||||
.bus_type = V4L2_MBUS_PARALLEL,
|
||||
.horiz_flip = 1,
|
||||
};
|
||||
|
||||
static struct i2c_board_info s5k6aa_board_info = {
|
||||
I2C_BOARD_INFO("S5K6AA", 0x3c),
|
||||
.platform_data = &s5k6aa_pldata,
|
||||
};
|
||||
|
||||
static struct m5mols_platform_data m5mols_platdata = {
|
||||
.gpio_reset = GPIO_CAM_MEGA_RST,
|
||||
@ -1185,6 +1229,13 @@ static struct i2c_board_info m5mols_board_info = {
|
||||
|
||||
static struct s5p_fimc_isp_info nuri_camera_sensors[] = {
|
||||
{
|
||||
.flags = V4L2_MBUS_PCLK_SAMPLE_RISING |
|
||||
V4L2_MBUS_VSYNC_ACTIVE_LOW,
|
||||
.bus_type = FIMC_ITU_601,
|
||||
.board_info = &s5k6aa_board_info,
|
||||
.clk_frequency = 24000000UL,
|
||||
.i2c_bus_num = 6,
|
||||
}, {
|
||||
.flags = V4L2_MBUS_PCLK_SAMPLE_FALLING |
|
||||
V4L2_MBUS_VSYNC_ACTIVE_LOW,
|
||||
.bus_type = FIMC_MIPI_CSI2,
|
||||
@ -1200,11 +1251,13 @@ static struct s5p_platform_fimc fimc_md_platdata = {
|
||||
};
|
||||
|
||||
static struct gpio nuri_camera_gpios[] = {
|
||||
{ GPIO_CAM_VT_NSTBY, GPIOF_OUT_INIT_LOW, "CAM_VGA_NSTBY" },
|
||||
{ GPIO_CAM_VT_NRST, GPIOF_OUT_INIT_LOW, "CAM_VGA_NRST" },
|
||||
{ GPIO_CAM_8M_ISP_INT, GPIOF_IN, "8M_ISP_INT" },
|
||||
{ GPIO_CAM_MEGA_RST, GPIOF_OUT_INIT_LOW, "CAM_8M_NRST" },
|
||||
};
|
||||
|
||||
static void nuri_camera_init(void)
|
||||
static void __init nuri_camera_init(void)
|
||||
{
|
||||
s3c_set_platdata(&mipi_csis_platdata, sizeof(mipi_csis_platdata),
|
||||
&s5p_device_mipi_csis0);
|
||||
@ -1224,6 +1277,8 @@ static void nuri_camera_init(void)
|
||||
pr_err("%s: Failed to configure 8M_ISP_INT GPIO\n", __func__);
|
||||
|
||||
/* Free GPIOs controlled directly by the sensor drivers. */
|
||||
gpio_free(GPIO_CAM_VT_NRST);
|
||||
gpio_free(GPIO_CAM_VT_NSTBY);
|
||||
gpio_free(GPIO_CAM_MEGA_RST);
|
||||
|
||||
if (exynos4_fimc_setup_gpio(S5P_CAMPORT_A)) {
|
||||
@ -1234,15 +1289,27 @@ static void nuri_camera_init(void)
|
||||
s5p_gpio_set_drvstr(EXYNOS4_GPJ1(3), S5P_GPIO_DRVSTR_LV4);
|
||||
}
|
||||
|
||||
static struct s3c2410_platform_i2c nuri_i2c6_platdata __initdata = {
|
||||
.frequency = 400000U,
|
||||
.sda_delay = 200,
|
||||
.bus_num = 6,
|
||||
};
|
||||
|
||||
static struct s3c2410_platform_i2c nuri_i2c0_platdata __initdata = {
|
||||
.frequency = 400000U,
|
||||
.sda_delay = 200,
|
||||
};
|
||||
|
||||
/* DEVFREQ controlling memory/bus */
|
||||
static struct platform_device exynos4_bus_devfreq = {
|
||||
.name = "exynos4210-busfreq",
|
||||
};
|
||||
|
||||
static struct platform_device *nuri_devices[] __initdata = {
|
||||
/* Samsung Platform Devices */
|
||||
&s3c_device_i2c5, /* PMIC should initialize first */
|
||||
&s3c_device_i2c0,
|
||||
&s3c_device_i2c6,
|
||||
&emmc_fixed_voltage,
|
||||
&s5p_device_mipi_csis0,
|
||||
&s5p_device_fimc0,
|
||||
@ -1259,6 +1326,8 @@ static struct platform_device *nuri_devices[] __initdata = {
|
||||
&s3c_device_i2c3,
|
||||
&i2c9_gpio,
|
||||
&s3c_device_adc,
|
||||
&s5p_device_g2d,
|
||||
&s5p_device_jpeg,
|
||||
&s3c_device_rtc,
|
||||
&s5p_device_mfc,
|
||||
&s5p_device_mfc_l,
|
||||
@ -1274,8 +1343,10 @@ static struct platform_device *nuri_devices[] __initdata = {
|
||||
&nuri_backlight_device,
|
||||
&max8903_fixed_reg_dev,
|
||||
&nuri_max8903_device,
|
||||
&cam_vt_cam15_fixed_rdev,
|
||||
&cam_vdda_fixed_rdev,
|
||||
&cam_8m_12v_fixed_rdev,
|
||||
&exynos4_bus_devfreq,
|
||||
};
|
||||
|
||||
static void __init nuri_map_io(void)
|
||||
@ -1305,6 +1376,7 @@ static void __init nuri_machine_init(void)
|
||||
i2c_register_board_info(5, i2c5_devs, ARRAY_SIZE(i2c5_devs));
|
||||
i2c9_devs[I2C9_MAX17042].irq = gpio_to_irq(EXYNOS4_GPX2(3));
|
||||
i2c_register_board_info(9, i2c9_devs, ARRAY_SIZE(i2c9_devs));
|
||||
s3c_i2c6_set_platdata(&nuri_i2c6_platdata);
|
||||
|
||||
s5p_fimd0_set_platdata(&nuri_fb_pdata);
|
||||
|
||||
|
@ -20,6 +20,7 @@
|
||||
#include <linux/regulator/machine.h>
|
||||
#include <linux/mfd/max8997.h>
|
||||
#include <linux/lcd.h>
|
||||
#include <linux/rfkill-gpio.h>
|
||||
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/hardware/gic.h>
|
||||
@ -235,6 +236,7 @@ static struct regulator_init_data __initdata max8997_ldo9_data = {
|
||||
.min_uV = 2800000,
|
||||
.max_uV = 2800000,
|
||||
.apply_uV = 1,
|
||||
.always_on = 1,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_STATUS,
|
||||
.state_mem = {
|
||||
.disabled = 1,
|
||||
@ -278,6 +280,7 @@ static struct regulator_init_data __initdata max8997_ldo14_data = {
|
||||
.min_uV = 1800000,
|
||||
.max_uV = 1800000,
|
||||
.apply_uV = 1,
|
||||
.always_on = 1,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_STATUS,
|
||||
.state_mem = {
|
||||
.disabled = 1,
|
||||
@ -293,6 +296,7 @@ static struct regulator_init_data __initdata max8997_ldo17_data = {
|
||||
.min_uV = 3300000,
|
||||
.max_uV = 3300000,
|
||||
.apply_uV = 1,
|
||||
.always_on = 1,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_STATUS,
|
||||
.state_mem = {
|
||||
.disabled = 1,
|
||||
@ -602,6 +606,23 @@ static struct s3c_fb_platdata origen_lcd_pdata __initdata = {
|
||||
.setup_gpio = exynos4_fimd0_gpio_setup_24bpp,
|
||||
};
|
||||
|
||||
/* Bluetooth rfkill gpio platform data */
|
||||
struct rfkill_gpio_platform_data origen_bt_pdata = {
|
||||
.reset_gpio = EXYNOS4_GPX2(2),
|
||||
.shutdown_gpio = -1,
|
||||
.type = RFKILL_TYPE_BLUETOOTH,
|
||||
.name = "origen-bt",
|
||||
};
|
||||
|
||||
/* Bluetooth Platform device */
|
||||
static struct platform_device origen_device_bluetooth = {
|
||||
.name = "rfkill_gpio",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &origen_bt_pdata,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device *origen_devices[] __initdata = {
|
||||
&s3c_device_hsmmc2,
|
||||
&s3c_device_hsmmc0,
|
||||
@ -613,9 +634,12 @@ static struct platform_device *origen_devices[] __initdata = {
|
||||
&s5p_device_fimc1,
|
||||
&s5p_device_fimc2,
|
||||
&s5p_device_fimc3,
|
||||
&s5p_device_fimc_md,
|
||||
&s5p_device_fimd0,
|
||||
&s5p_device_g2d,
|
||||
&s5p_device_hdmi,
|
||||
&s5p_device_i2c_hdmiphy,
|
||||
&s5p_device_jpeg,
|
||||
&s5p_device_mfc,
|
||||
&s5p_device_mfc_l,
|
||||
&s5p_device_mfc_r,
|
||||
@ -630,6 +654,7 @@ static struct platform_device *origen_devices[] __initdata = {
|
||||
&exynos4_device_pd[PD_MFC],
|
||||
&origen_device_gpiokeys,
|
||||
&origen_lcd_hv070wsa,
|
||||
&origen_device_bluetooth,
|
||||
};
|
||||
|
||||
/* LCD Backlight data */
|
||||
@ -643,6 +668,16 @@ static struct platform_pwm_backlight_data origen_bl_data = {
|
||||
.pwm_period_ns = 1000,
|
||||
};
|
||||
|
||||
static void __init origen_bt_setup(void)
|
||||
{
|
||||
gpio_request(EXYNOS4_GPA0(0), "GPIO BT_UART");
|
||||
/* 4 UART Pins configuration */
|
||||
s3c_gpio_cfgrange_nopull(EXYNOS4_GPA0(0), 4, S3C_GPIO_SFN(2));
|
||||
/* Setup BT Reset, this gpio will be requesed by rfkill-gpio */
|
||||
s3c_gpio_cfgpin(EXYNOS4_GPX2(2), S3C_GPIO_OUTPUT);
|
||||
s3c_gpio_setpull(EXYNOS4_GPX2(2), S3C_GPIO_PULL_NONE);
|
||||
}
|
||||
|
||||
static void s5p_tv_setup(void)
|
||||
{
|
||||
/* Direct HPD to HDMI chip */
|
||||
@ -703,6 +738,8 @@ static void __init origen_machine_init(void)
|
||||
s5p_device_mfc.dev.parent = &exynos4_device_pd[PD_MFC].dev;
|
||||
|
||||
samsung_bl_set(&origen_bl_gpio_info, &origen_bl_data);
|
||||
|
||||
origen_bt_setup();
|
||||
}
|
||||
|
||||
MACHINE_START(ORIGEN, "ORIGEN")
|
||||
|
@ -270,6 +270,9 @@ static struct platform_device *smdkv310_devices[] __initdata = {
|
||||
&s5p_device_fimc1,
|
||||
&s5p_device_fimc2,
|
||||
&s5p_device_fimc3,
|
||||
&s5p_device_fimc_md,
|
||||
&s5p_device_g2d,
|
||||
&s5p_device_jpeg,
|
||||
&exynos4_device_ac97,
|
||||
&exynos4_device_i2s0,
|
||||
&exynos4_device_ohci,
|
||||
|
@ -47,6 +47,7 @@
|
||||
#include <media/v4l2-mediabus.h>
|
||||
#include <media/s5p_fimc.h>
|
||||
#include <media/m5mols.h>
|
||||
#include <media/s5k6aa.h>
|
||||
|
||||
#include "common.h"
|
||||
|
||||
@ -123,8 +124,10 @@ static struct regulator_consumer_supply lp3974_buck1_consumer =
|
||||
static struct regulator_consumer_supply lp3974_buck2_consumer =
|
||||
REGULATOR_SUPPLY("vddg3d", NULL);
|
||||
|
||||
static struct regulator_consumer_supply lp3974_buck3_consumer =
|
||||
REGULATOR_SUPPLY("vdet", "s5p-sdo");
|
||||
static struct regulator_consumer_supply lp3974_buck3_consumer[] = {
|
||||
REGULATOR_SUPPLY("vdet", "s5p-sdo"),
|
||||
REGULATOR_SUPPLY("vdd_reg", "0-003c"),
|
||||
};
|
||||
|
||||
static struct regulator_init_data lp3974_buck1_data = {
|
||||
.constraints = {
|
||||
@ -169,8 +172,8 @@ static struct regulator_init_data lp3974_buck3_data = {
|
||||
.enabled = 1,
|
||||
},
|
||||
},
|
||||
.num_consumer_supplies = 1,
|
||||
.consumer_supplies = &lp3974_buck3_consumer,
|
||||
.num_consumer_supplies = ARRAY_SIZE(lp3974_buck3_consumer),
|
||||
.consumer_supplies = lp3974_buck3_consumer,
|
||||
};
|
||||
|
||||
static struct regulator_init_data lp3974_buck4_data = {
|
||||
@ -303,6 +306,9 @@ static struct regulator_init_data lp3974_ldo8_data = {
|
||||
.consumer_supplies = lp3974_ldo8_consumer,
|
||||
};
|
||||
|
||||
static struct regulator_consumer_supply lp3974_ldo9_consumer =
|
||||
REGULATOR_SUPPLY("vddio", "0-003c");
|
||||
|
||||
static struct regulator_init_data lp3974_ldo9_data = {
|
||||
.constraints = {
|
||||
.name = "VCC_2.8V",
|
||||
@ -314,6 +320,8 @@ static struct regulator_init_data lp3974_ldo9_data = {
|
||||
.enabled = 1,
|
||||
},
|
||||
},
|
||||
.num_consumer_supplies = 1,
|
||||
.consumer_supplies = &lp3974_ldo9_consumer,
|
||||
};
|
||||
|
||||
static struct regulator_init_data lp3974_ldo10_data = {
|
||||
@ -412,6 +420,7 @@ static struct regulator_init_data lp3974_ldo15_data = {
|
||||
};
|
||||
|
||||
static struct regulator_consumer_supply lp3974_ldo16_consumer[] = {
|
||||
REGULATOR_SUPPLY("vdda", "0-003c"),
|
||||
REGULATOR_SUPPLY("a_sensor", "0-001f"),
|
||||
};
|
||||
|
||||
@ -819,6 +828,8 @@ static struct s3c_fb_pd_win universal_fb_win0 = {
|
||||
},
|
||||
.max_bpp = 32,
|
||||
.default_bpp = 16,
|
||||
.virtual_x = 480,
|
||||
.virtual_y = 2 * 800,
|
||||
};
|
||||
|
||||
static struct s3c_fb_platdata universal_lcd_pdata __initdata = {
|
||||
@ -830,6 +841,28 @@ static struct s3c_fb_platdata universal_lcd_pdata __initdata = {
|
||||
.setup_gpio = exynos4_fimd0_gpio_setup_24bpp,
|
||||
};
|
||||
|
||||
static struct regulator_consumer_supply cam_vt_dio_supply =
|
||||
REGULATOR_SUPPLY("vdd_core", "0-003c");
|
||||
|
||||
static struct regulator_init_data cam_vt_dio_reg_init_data = {
|
||||
.constraints = { .valid_ops_mask = REGULATOR_CHANGE_STATUS },
|
||||
.num_consumer_supplies = 1,
|
||||
.consumer_supplies = &cam_vt_dio_supply,
|
||||
};
|
||||
|
||||
static struct fixed_voltage_config cam_vt_dio_fixed_voltage_cfg = {
|
||||
.supply_name = "CAM_VT_D_IO",
|
||||
.microvolts = 2800000,
|
||||
.gpio = EXYNOS4_GPE2(1), /* CAM_PWR_EN2 */
|
||||
.enable_high = 1,
|
||||
.init_data = &cam_vt_dio_reg_init_data,
|
||||
};
|
||||
|
||||
static struct platform_device cam_vt_dio_fixed_reg_dev = {
|
||||
.name = "reg-fixed-voltage", .id = FIXED_REG_ID_CAM_VT_DIO,
|
||||
.dev = { .platform_data = &cam_vt_dio_fixed_voltage_cfg },
|
||||
};
|
||||
|
||||
static struct regulator_consumer_supply cam_i_core_supply =
|
||||
REGULATOR_SUPPLY("core", "0-001f");
|
||||
|
||||
@ -885,6 +918,28 @@ static struct s5p_platform_mipi_csis mipi_csis_platdata = {
|
||||
#define GPIO_CAM_LEVEL_EN(n) EXYNOS4_GPE4(n + 3)
|
||||
#define GPIO_CAM_8M_ISP_INT EXYNOS4_GPX1(5) /* XEINT_13 */
|
||||
#define GPIO_CAM_MEGA_nRST EXYNOS4_GPE2(5)
|
||||
#define GPIO_CAM_VGA_NRST EXYNOS4_GPE4(7)
|
||||
#define GPIO_CAM_VGA_NSTBY EXYNOS4_GPE4(6)
|
||||
|
||||
static int s5k6aa_set_power(int on)
|
||||
{
|
||||
gpio_set_value(GPIO_CAM_LEVEL_EN(2), !!on);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct s5k6aa_platform_data s5k6aa_platdata = {
|
||||
.mclk_frequency = 21600000UL,
|
||||
.gpio_reset = { GPIO_CAM_VGA_NRST, 0 },
|
||||
.gpio_stby = { GPIO_CAM_VGA_NSTBY, 0 },
|
||||
.bus_type = V4L2_MBUS_PARALLEL,
|
||||
.horiz_flip = 1,
|
||||
.set_power = s5k6aa_set_power,
|
||||
};
|
||||
|
||||
static struct i2c_board_info s5k6aa_board_info = {
|
||||
I2C_BOARD_INFO("S5K6AA", 0x3C),
|
||||
.platform_data = &s5k6aa_platdata,
|
||||
};
|
||||
|
||||
static int m5mols_set_power(struct device *dev, int on)
|
||||
{
|
||||
@ -906,6 +961,14 @@ static struct i2c_board_info m5mols_board_info = {
|
||||
|
||||
static struct s5p_fimc_isp_info universal_camera_sensors[] = {
|
||||
{
|
||||
.mux_id = 0,
|
||||
.flags = V4L2_MBUS_PCLK_SAMPLE_FALLING |
|
||||
V4L2_MBUS_VSYNC_ACTIVE_LOW,
|
||||
.bus_type = FIMC_ITU_601,
|
||||
.board_info = &s5k6aa_board_info,
|
||||
.i2c_bus_num = 0,
|
||||
.clk_frequency = 24000000UL,
|
||||
}, {
|
||||
.mux_id = 0,
|
||||
.flags = V4L2_MBUS_PCLK_SAMPLE_FALLING |
|
||||
V4L2_MBUS_VSYNC_ACTIVE_LOW,
|
||||
@ -927,9 +990,11 @@ static struct gpio universal_camera_gpios[] = {
|
||||
{ GPIO_CAM_LEVEL_EN(2), GPIOF_OUT_INIT_LOW, "CAM_LVL_EN2" },
|
||||
{ GPIO_CAM_8M_ISP_INT, GPIOF_IN, "8M_ISP_INT" },
|
||||
{ GPIO_CAM_MEGA_nRST, GPIOF_OUT_INIT_LOW, "CAM_8M_NRST" },
|
||||
{ GPIO_CAM_VGA_NRST, GPIOF_OUT_INIT_LOW, "CAM_VGA_NRST" },
|
||||
{ GPIO_CAM_VGA_NSTBY, GPIOF_OUT_INIT_LOW, "CAM_VGA_NSTBY" },
|
||||
};
|
||||
|
||||
static void universal_camera_init(void)
|
||||
static void __init universal_camera_init(void)
|
||||
{
|
||||
s3c_set_platdata(&mipi_csis_platdata, sizeof(mipi_csis_platdata),
|
||||
&s5p_device_mipi_csis0);
|
||||
@ -950,6 +1015,8 @@ static void universal_camera_init(void)
|
||||
/* Free GPIOs controlled directly by the sensor drivers. */
|
||||
gpio_free(GPIO_CAM_MEGA_nRST);
|
||||
gpio_free(GPIO_CAM_8M_ISP_INT);
|
||||
gpio_free(GPIO_CAM_VGA_NRST);
|
||||
gpio_free(GPIO_CAM_VGA_NSTBY);
|
||||
|
||||
if (exynos4_fimc_setup_gpio(S5P_CAMPORT_A))
|
||||
pr_err("Camera port A setup failed\n");
|
||||
@ -962,6 +1029,7 @@ static struct platform_device *universal_devices[] __initdata = {
|
||||
&s5p_device_fimc1,
|
||||
&s5p_device_fimc2,
|
||||
&s5p_device_fimc3,
|
||||
&s5p_device_g2d,
|
||||
&mmc0_fixed_voltage,
|
||||
&s3c_device_hsmmc0,
|
||||
&s3c_device_hsmmc2,
|
||||
@ -981,12 +1049,14 @@ static struct platform_device *universal_devices[] __initdata = {
|
||||
&universal_gpio_keys,
|
||||
&s5p_device_onenand,
|
||||
&s5p_device_fimd0,
|
||||
&s5p_device_jpeg,
|
||||
&s5p_device_mfc,
|
||||
&s5p_device_mfc_l,
|
||||
&s5p_device_mfc_r,
|
||||
&exynos4_device_pd[PD_MFC],
|
||||
&exynos4_device_pd[PD_LCD0],
|
||||
&exynos4_device_pd[PD_CAM],
|
||||
&cam_vt_dio_fixed_reg_dev,
|
||||
&cam_i_core_fixed_reg_dev,
|
||||
&cam_s_if_fixed_reg_dev,
|
||||
&s5p_device_fimc_md,
|
||||
|
@ -320,8 +320,10 @@ config MACH_IMX27_VISSTRIM_M10
|
||||
select IMX_HAVE_PLATFORM_IMX_I2C
|
||||
select IMX_HAVE_PLATFORM_IMX_SSI
|
||||
select IMX_HAVE_PLATFORM_IMX_UART
|
||||
select IMX_HAVE_PLATFORM_MXC_MMC
|
||||
select IMX_HAVE_PLATFORM_MX2_CAMERA
|
||||
select IMX_HAVE_PLATFORM_MXC_EHCI
|
||||
select IMX_HAVE_PLATFORM_MXC_MMC
|
||||
select LEDS_GPIO_REGISTER
|
||||
help
|
||||
Include support for Visstrim_m10 platform and its different variants.
|
||||
This includes specific configurations for the board and its
|
||||
@ -500,6 +502,7 @@ config MACH_MX31MOBOARD
|
||||
bool "Support mx31moboard platforms (EPFL Mobots group)"
|
||||
select SOC_IMX31
|
||||
select IMX_HAVE_PLATFORM_FSL_USB2_UDC
|
||||
select IMX_HAVE_PLATFORM_IMX2_WDT
|
||||
select IMX_HAVE_PLATFORM_IMX_I2C
|
||||
select IMX_HAVE_PLATFORM_IMX_UART
|
||||
select IMX_HAVE_PLATFORM_IPU_CORE
|
||||
|
@ -30,6 +30,10 @@
|
||||
#include <linux/input.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/leds.h>
|
||||
#include <linux/memblock.h>
|
||||
#include <media/soc_camera.h>
|
||||
#include <sound/tlv320aic32x4.h>
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/mach/arch.h>
|
||||
@ -39,6 +43,8 @@
|
||||
|
||||
#include "devices-imx27.h"
|
||||
|
||||
#define TVP5150_RSTN (GPIO_PORTC + 18)
|
||||
#define TVP5150_PWDN (GPIO_PORTC + 19)
|
||||
#define OTG_PHY_CS_GPIO (GPIO_PORTF + 17)
|
||||
#define SDHC1_IRQ IRQ_GPIOB(25)
|
||||
|
||||
@ -100,8 +106,99 @@ static const int visstrim_m10_pins[] __initconst = {
|
||||
PE1_PF_USBOTG_STP,
|
||||
PB23_PF_USB_PWR,
|
||||
PB24_PF_USB_OC,
|
||||
/* CSI */
|
||||
PB10_PF_CSI_D0,
|
||||
PB11_PF_CSI_D1,
|
||||
PB12_PF_CSI_D2,
|
||||
PB13_PF_CSI_D3,
|
||||
PB14_PF_CSI_D4,
|
||||
PB15_PF_CSI_MCLK,
|
||||
PB16_PF_CSI_PIXCLK,
|
||||
PB17_PF_CSI_D5,
|
||||
PB18_PF_CSI_D6,
|
||||
PB19_PF_CSI_D7,
|
||||
PB20_PF_CSI_VSYNC,
|
||||
PB21_PF_CSI_HSYNC,
|
||||
};
|
||||
|
||||
/* Camera */
|
||||
static int visstrim_camera_power(struct device *dev, int on)
|
||||
{
|
||||
gpio_set_value(TVP5150_PWDN, on);
|
||||
|
||||
return 0;
|
||||
};
|
||||
|
||||
static int visstrim_camera_reset(struct device *dev)
|
||||
{
|
||||
gpio_set_value(TVP5150_RSTN, 0);
|
||||
ndelay(500);
|
||||
gpio_set_value(TVP5150_RSTN, 1);
|
||||
|
||||
return 0;
|
||||
};
|
||||
|
||||
static struct i2c_board_info visstrim_i2c_camera = {
|
||||
I2C_BOARD_INFO("tvp5150", 0x5d),
|
||||
};
|
||||
|
||||
static struct soc_camera_link iclink_tvp5150 = {
|
||||
.bus_id = 0,
|
||||
.board_info = &visstrim_i2c_camera,
|
||||
.i2c_adapter_id = 0,
|
||||
.power = visstrim_camera_power,
|
||||
.reset = visstrim_camera_reset,
|
||||
};
|
||||
|
||||
static struct mx2_camera_platform_data visstrim_camera = {
|
||||
.flags = MX2_CAMERA_CCIR | MX2_CAMERA_CCIR_INTERLACE |
|
||||
MX2_CAMERA_SWAP16 | MX2_CAMERA_PCLK_SAMPLE_RISING,
|
||||
.clk = 100000,
|
||||
};
|
||||
|
||||
static phys_addr_t mx2_camera_base __initdata;
|
||||
#define MX2_CAMERA_BUF_SIZE SZ_8M
|
||||
|
||||
static void __init visstrim_camera_init(void)
|
||||
{
|
||||
struct platform_device *pdev;
|
||||
int dma;
|
||||
|
||||
/* Initialize tvp5150 gpios */
|
||||
mxc_gpio_mode(TVP5150_RSTN | GPIO_GPIO | GPIO_OUT);
|
||||
mxc_gpio_mode(TVP5150_PWDN | GPIO_GPIO | GPIO_OUT);
|
||||
gpio_set_value(TVP5150_RSTN, 1);
|
||||
gpio_set_value(TVP5150_PWDN, 0);
|
||||
ndelay(1);
|
||||
|
||||
gpio_set_value(TVP5150_PWDN, 1);
|
||||
ndelay(1);
|
||||
gpio_set_value(TVP5150_RSTN, 0);
|
||||
ndelay(500);
|
||||
gpio_set_value(TVP5150_RSTN, 1);
|
||||
ndelay(200000);
|
||||
|
||||
pdev = imx27_add_mx2_camera(&visstrim_camera);
|
||||
if (IS_ERR(pdev))
|
||||
return;
|
||||
|
||||
dma = dma_declare_coherent_memory(&pdev->dev,
|
||||
mx2_camera_base, mx2_camera_base,
|
||||
MX2_CAMERA_BUF_SIZE,
|
||||
DMA_MEMORY_MAP | DMA_MEMORY_EXCLUSIVE);
|
||||
if (!(dma & DMA_MEMORY_MAP))
|
||||
return;
|
||||
}
|
||||
|
||||
static void __init visstrim_reserve(void)
|
||||
{
|
||||
/* reserve 4 MiB for mx2-camera */
|
||||
mx2_camera_base = memblock_alloc(MX2_CAMERA_BUF_SIZE,
|
||||
MX2_CAMERA_BUF_SIZE);
|
||||
memblock_free(mx2_camera_base, MX2_CAMERA_BUF_SIZE);
|
||||
memblock_remove(mx2_camera_base, MX2_CAMERA_BUF_SIZE);
|
||||
}
|
||||
|
||||
/* GPIOs used as events for applications */
|
||||
static struct gpio_keys_button visstrim_gpio_keys[] = {
|
||||
{
|
||||
@ -136,6 +233,35 @@ static const struct gpio_keys_platform_data
|
||||
.nbuttons = ARRAY_SIZE(visstrim_gpio_keys),
|
||||
};
|
||||
|
||||
/* led */
|
||||
static const struct gpio_led visstrim_m10_leds[] __initconst = {
|
||||
{
|
||||
.name = "visstrim:ld0",
|
||||
.default_trigger = "nand-disk",
|
||||
.gpio = (GPIO_PORTC + 29),
|
||||
},
|
||||
{
|
||||
.name = "visstrim:ld1",
|
||||
.default_trigger = "nand-disk",
|
||||
.gpio = (GPIO_PORTC + 24),
|
||||
},
|
||||
{
|
||||
.name = "visstrim:ld2",
|
||||
.default_trigger = "nand-disk",
|
||||
.gpio = (GPIO_PORTC + 28),
|
||||
},
|
||||
{
|
||||
.name = "visstrim:ld3",
|
||||
.default_trigger = "nand-disk",
|
||||
.gpio = (GPIO_PORTC + 25),
|
||||
},
|
||||
};
|
||||
|
||||
static const struct gpio_led_platform_data visstrim_m10_led_data __initconst = {
|
||||
.leds = visstrim_m10_leds,
|
||||
.num_leds = ARRAY_SIZE(visstrim_m10_leds),
|
||||
};
|
||||
|
||||
/* Visstrim_SM10 has a microSD slot connected to sdhc1 */
|
||||
static int visstrim_m10_sdhc1_init(struct device *dev,
|
||||
irq_handler_t detect_irq, void *data)
|
||||
@ -216,6 +342,9 @@ static struct i2c_board_info visstrim_m10_i2c_devices[] = {
|
||||
{
|
||||
I2C_BOARD_INFO("tlv320aic32x4", 0x18),
|
||||
.platform_data = &visstrim_m10_aic32x4_pdata,
|
||||
},
|
||||
{
|
||||
I2C_BOARD_INFO("m41t00", 0x68),
|
||||
}
|
||||
};
|
||||
|
||||
@ -254,15 +383,20 @@ static void __init visstrim_m10_board_init(void)
|
||||
imx27_add_imx_ssi(0, &visstrim_m10_ssi_pdata);
|
||||
imx27_add_imx_uart0(&uart_pdata);
|
||||
|
||||
i2c_register_board_info(0, visstrim_m10_i2c_devices,
|
||||
ARRAY_SIZE(visstrim_m10_i2c_devices));
|
||||
imx27_add_imx_i2c(0, &visstrim_m10_i2c_data);
|
||||
imx27_add_imx_i2c(1, &visstrim_m10_i2c_data);
|
||||
i2c_register_board_info(0, visstrim_m10_i2c_devices,
|
||||
ARRAY_SIZE(visstrim_m10_i2c_devices));
|
||||
|
||||
imx27_add_mxc_mmc(0, &visstrim_m10_sdhc_pdata);
|
||||
imx27_add_mxc_ehci_otg(&visstrim_m10_usbotg_pdata);
|
||||
imx27_add_fec(NULL);
|
||||
imx_add_gpio_keys(&visstrim_gpio_keys_platform_data);
|
||||
platform_add_devices(platform_devices, ARRAY_SIZE(platform_devices));
|
||||
platform_device_register_resndata(NULL, "soc-camera-pdrv", 0, NULL, 0,
|
||||
&iclink_tvp5150, sizeof(iclink_tvp5150));
|
||||
gpio_led_register_device(0, &visstrim_m10_led_data);
|
||||
visstrim_camera_init();
|
||||
}
|
||||
|
||||
static void __init visstrim_m10_timer_init(void)
|
||||
@ -276,6 +410,7 @@ static struct sys_timer visstrim_m10_timer = {
|
||||
|
||||
MACHINE_START(IMX27_VISSTRIM_M10, "Vista Silicon Visstrim_M10")
|
||||
.atag_offset = 0x100,
|
||||
.reserve = visstrim_reserve,
|
||||
.map_io = mx27_map_io,
|
||||
.init_early = imx27_init_early,
|
||||
.init_irq = mx27_init_irq,
|
||||
|
@ -530,6 +530,8 @@ static void __init mx31moboard_init(void)
|
||||
platform_add_devices(devices, ARRAY_SIZE(devices));
|
||||
gpio_led_register_device(-1, &mx31moboard_led_pdata);
|
||||
|
||||
imx31_add_imx2_wdt(NULL);
|
||||
|
||||
imx31_add_imx_uart0(&uart0_pdata);
|
||||
imx31_add_imx_uart4(&uart4_pdata);
|
||||
|
||||
@ -590,7 +592,7 @@ static void __init mx31moboard_reserve(void)
|
||||
}
|
||||
|
||||
MACHINE_START(MX31MOBOARD, "EPFL Mobots mx31moboard")
|
||||
/* Maintainer: Valentin Longchamp, EPFL Mobots group */
|
||||
/* Maintainer: Philippe Retornaz, EPFL Mobots group */
|
||||
.atag_offset = 0x100,
|
||||
.reserve = mx31moboard_reserve,
|
||||
.map_io = mx31_map_io,
|
||||
|
@ -4,6 +4,11 @@
|
||||
*
|
||||
* Author: Fabio Estevam <fabio.estevam@freescale.com>
|
||||
*
|
||||
* Copyright (C) 2011 Meprolight, Ltd.
|
||||
* Alex Gershgorin <alexg@meprolight.com>
|
||||
*
|
||||
* Modified from i.MX31 3-Stack Development System
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
@ -34,15 +39,102 @@
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/time.h>
|
||||
#include <asm/mach/map.h>
|
||||
#include <asm/memblock.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/common.h>
|
||||
#include <mach/iomux-mx35.h>
|
||||
#include <mach/irqs.h>
|
||||
#include <mach/3ds_debugboard.h>
|
||||
#include <video/platform_lcd.h>
|
||||
|
||||
#include <media/soc_camera.h>
|
||||
|
||||
#include "devices-imx35.h"
|
||||
|
||||
#define GPIO_MC9S08DZ60_GPS_ENABLE 0
|
||||
#define GPIO_MC9S08DZ60_HDD_ENABLE 4
|
||||
#define GPIO_MC9S08DZ60_WIFI_ENABLE 5
|
||||
#define GPIO_MC9S08DZ60_LCD_ENABLE 6
|
||||
#define GPIO_MC9S08DZ60_SPEAKER_ENABLE 8
|
||||
|
||||
static const struct fb_videomode fb_modedb[] = {
|
||||
{
|
||||
/* 800x480 @ 55 Hz */
|
||||
.name = "Ceramate-CLAA070VC01",
|
||||
.refresh = 55,
|
||||
.xres = 800,
|
||||
.yres = 480,
|
||||
.pixclock = 40000,
|
||||
.left_margin = 40,
|
||||
.right_margin = 40,
|
||||
.upper_margin = 5,
|
||||
.lower_margin = 5,
|
||||
.hsync_len = 20,
|
||||
.vsync_len = 10,
|
||||
.sync = FB_SYNC_OE_ACT_HIGH,
|
||||
.vmode = FB_VMODE_NONINTERLACED,
|
||||
.flag = 0,
|
||||
},
|
||||
};
|
||||
|
||||
static const struct ipu_platform_data mx3_ipu_data __initconst = {
|
||||
.irq_base = MXC_IPU_IRQ_START,
|
||||
};
|
||||
|
||||
static struct mx3fb_platform_data mx3fb_pdata __initdata = {
|
||||
.name = "Ceramate-CLAA070VC01",
|
||||
.mode = fb_modedb,
|
||||
.num_modes = ARRAY_SIZE(fb_modedb),
|
||||
};
|
||||
|
||||
static struct i2c_board_info __initdata i2c_devices_3ds[] = {
|
||||
{
|
||||
I2C_BOARD_INFO("mc9s08dz60", 0x69),
|
||||
},
|
||||
};
|
||||
|
||||
static int lcd_power_gpio = -ENXIO;
|
||||
|
||||
static int mc9s08dz60_gpiochip_match(struct gpio_chip *chip,
|
||||
void *data)
|
||||
{
|
||||
return !strcmp(chip->label, data);
|
||||
}
|
||||
|
||||
static void mx35_3ds_lcd_set_power(
|
||||
struct plat_lcd_data *pd, unsigned int power)
|
||||
{
|
||||
struct gpio_chip *chip;
|
||||
|
||||
if (!gpio_is_valid(lcd_power_gpio)) {
|
||||
chip = gpiochip_find(
|
||||
"mc9s08dz60", mc9s08dz60_gpiochip_match);
|
||||
if (chip) {
|
||||
lcd_power_gpio =
|
||||
chip->base + GPIO_MC9S08DZ60_LCD_ENABLE;
|
||||
if (gpio_request(lcd_power_gpio, "lcd_power") < 0) {
|
||||
pr_err("error: gpio already requested!\n");
|
||||
lcd_power_gpio = -ENXIO;
|
||||
}
|
||||
} else {
|
||||
pr_err("error: didn't find mc9s08dz60 gpio chip\n");
|
||||
}
|
||||
}
|
||||
|
||||
if (gpio_is_valid(lcd_power_gpio))
|
||||
gpio_set_value_cansleep(lcd_power_gpio, power);
|
||||
}
|
||||
|
||||
static struct plat_lcd_data mx35_3ds_lcd_data = {
|
||||
.set_power = mx35_3ds_lcd_set_power,
|
||||
};
|
||||
|
||||
static struct platform_device mx35_3ds_lcd = {
|
||||
.name = "platform-lcd",
|
||||
.dev.platform_data = &mx35_3ds_lcd_data,
|
||||
};
|
||||
|
||||
#define EXPIO_PARENT_INT gpio_to_irq(IMX_GPIO_NR(1, 1))
|
||||
|
||||
static const struct imxuart_platform_data uart_pdata __initconst = {
|
||||
@ -120,6 +212,109 @@ static iomux_v3_cfg_t mx35pdk_pads[] = {
|
||||
/* I2C1 */
|
||||
MX35_PAD_I2C1_CLK__I2C1_SCL,
|
||||
MX35_PAD_I2C1_DAT__I2C1_SDA,
|
||||
/* Display */
|
||||
MX35_PAD_LD0__IPU_DISPB_DAT_0,
|
||||
MX35_PAD_LD1__IPU_DISPB_DAT_1,
|
||||
MX35_PAD_LD2__IPU_DISPB_DAT_2,
|
||||
MX35_PAD_LD3__IPU_DISPB_DAT_3,
|
||||
MX35_PAD_LD4__IPU_DISPB_DAT_4,
|
||||
MX35_PAD_LD5__IPU_DISPB_DAT_5,
|
||||
MX35_PAD_LD6__IPU_DISPB_DAT_6,
|
||||
MX35_PAD_LD7__IPU_DISPB_DAT_7,
|
||||
MX35_PAD_LD8__IPU_DISPB_DAT_8,
|
||||
MX35_PAD_LD9__IPU_DISPB_DAT_9,
|
||||
MX35_PAD_LD10__IPU_DISPB_DAT_10,
|
||||
MX35_PAD_LD11__IPU_DISPB_DAT_11,
|
||||
MX35_PAD_LD12__IPU_DISPB_DAT_12,
|
||||
MX35_PAD_LD13__IPU_DISPB_DAT_13,
|
||||
MX35_PAD_LD14__IPU_DISPB_DAT_14,
|
||||
MX35_PAD_LD15__IPU_DISPB_DAT_15,
|
||||
MX35_PAD_LD16__IPU_DISPB_DAT_16,
|
||||
MX35_PAD_LD17__IPU_DISPB_DAT_17,
|
||||
MX35_PAD_D3_HSYNC__IPU_DISPB_D3_HSYNC,
|
||||
MX35_PAD_D3_FPSHIFT__IPU_DISPB_D3_CLK,
|
||||
MX35_PAD_D3_DRDY__IPU_DISPB_D3_DRDY,
|
||||
MX35_PAD_CONTRAST__IPU_DISPB_CONTR,
|
||||
MX35_PAD_D3_VSYNC__IPU_DISPB_D3_VSYNC,
|
||||
MX35_PAD_D3_REV__IPU_DISPB_D3_REV,
|
||||
MX35_PAD_D3_CLS__IPU_DISPB_D3_CLS,
|
||||
/* CSI */
|
||||
MX35_PAD_TX1__IPU_CSI_D_6,
|
||||
MX35_PAD_TX0__IPU_CSI_D_7,
|
||||
MX35_PAD_CSI_D8__IPU_CSI_D_8,
|
||||
MX35_PAD_CSI_D9__IPU_CSI_D_9,
|
||||
MX35_PAD_CSI_D10__IPU_CSI_D_10,
|
||||
MX35_PAD_CSI_D11__IPU_CSI_D_11,
|
||||
MX35_PAD_CSI_D12__IPU_CSI_D_12,
|
||||
MX35_PAD_CSI_D13__IPU_CSI_D_13,
|
||||
MX35_PAD_CSI_D14__IPU_CSI_D_14,
|
||||
MX35_PAD_CSI_D15__IPU_CSI_D_15,
|
||||
MX35_PAD_CSI_HSYNC__IPU_CSI_HSYNC,
|
||||
MX35_PAD_CSI_MCLK__IPU_CSI_MCLK,
|
||||
MX35_PAD_CSI_PIXCLK__IPU_CSI_PIXCLK,
|
||||
MX35_PAD_CSI_VSYNC__IPU_CSI_VSYNC,
|
||||
};
|
||||
|
||||
/*
|
||||
* Camera support
|
||||
*/
|
||||
static phys_addr_t mx3_camera_base __initdata;
|
||||
#define MX35_3DS_CAMERA_BUF_SIZE SZ_8M
|
||||
|
||||
static const struct mx3_camera_pdata mx35_3ds_camera_pdata __initconst = {
|
||||
.flags = MX3_CAMERA_DATAWIDTH_8,
|
||||
.mclk_10khz = 2000,
|
||||
};
|
||||
|
||||
static int __init imx35_3ds_init_camera(void)
|
||||
{
|
||||
int dma, ret = -ENOMEM;
|
||||
struct platform_device *pdev =
|
||||
imx35_alloc_mx3_camera(&mx35_3ds_camera_pdata);
|
||||
|
||||
if (IS_ERR(pdev))
|
||||
return PTR_ERR(pdev);
|
||||
|
||||
if (!mx3_camera_base)
|
||||
goto err;
|
||||
|
||||
dma = dma_declare_coherent_memory(&pdev->dev,
|
||||
mx3_camera_base, mx3_camera_base,
|
||||
MX35_3DS_CAMERA_BUF_SIZE,
|
||||
DMA_MEMORY_MAP | DMA_MEMORY_EXCLUSIVE);
|
||||
|
||||
if (!(dma & DMA_MEMORY_MAP))
|
||||
goto err;
|
||||
|
||||
ret = platform_device_add(pdev);
|
||||
if (ret)
|
||||
err:
|
||||
platform_device_put(pdev);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const struct ipu_platform_data mx35_3ds_ipu_data __initconst = {
|
||||
.irq_base = MXC_IPU_IRQ_START,
|
||||
};
|
||||
|
||||
static struct i2c_board_info mx35_3ds_i2c_camera = {
|
||||
I2C_BOARD_INFO("ov2640", 0x30),
|
||||
};
|
||||
|
||||
static struct soc_camera_link iclink_ov2640 = {
|
||||
.bus_id = 0,
|
||||
.board_info = &mx35_3ds_i2c_camera,
|
||||
.i2c_adapter_id = 0,
|
||||
.power = NULL,
|
||||
};
|
||||
|
||||
static struct platform_device mx35_3ds_ov2640 = {
|
||||
.name = "soc-camera-pdrv",
|
||||
.id = 0,
|
||||
.dev = {
|
||||
.platform_data = &iclink_ov2640,
|
||||
},
|
||||
};
|
||||
|
||||
static int mx35_3ds_otg_init(struct platform_device *pdev)
|
||||
@ -179,6 +374,8 @@ static const struct imxi2c_platform_data mx35_3ds_i2c0_data __initconst = {
|
||||
*/
|
||||
static void __init mx35_3ds_init(void)
|
||||
{
|
||||
struct platform_device *imx35_fb_pdev;
|
||||
|
||||
imx35_soc_init();
|
||||
|
||||
mxc_iomux_v3_setup_multiple_pads(mx35pdk_pads, ARRAY_SIZE(mx35pdk_pads));
|
||||
@ -204,6 +401,17 @@ static void __init mx35_3ds_init(void)
|
||||
pr_warn("Init of the debugboard failed, all "
|
||||
"devices on the debugboard are unusable.\n");
|
||||
imx35_add_imx_i2c0(&mx35_3ds_i2c0_data);
|
||||
|
||||
i2c_register_board_info(
|
||||
0, i2c_devices_3ds, ARRAY_SIZE(i2c_devices_3ds));
|
||||
|
||||
imx35_add_ipu_core(&mx35_3ds_ipu_data);
|
||||
platform_device_register(&mx35_3ds_ov2640);
|
||||
imx35_3ds_init_camera();
|
||||
|
||||
imx35_fb_pdev = imx35_add_mx3_sdc_fb(&mx3fb_pdata);
|
||||
mx35_3ds_lcd.dev.parent = &imx35_fb_pdev->dev;
|
||||
platform_device_register(&mx35_3ds_lcd);
|
||||
}
|
||||
|
||||
static void __init mx35pdk_timer_init(void)
|
||||
@ -215,6 +423,13 @@ struct sys_timer mx35pdk_timer = {
|
||||
.init = mx35pdk_timer_init,
|
||||
};
|
||||
|
||||
static void __init mx35_3ds_reserve(void)
|
||||
{
|
||||
/* reserve MX35_3DS_CAMERA_BUF_SIZE bytes for mx3-camera */
|
||||
mx3_camera_base = arm_memblock_steal(MX35_3DS_CAMERA_BUF_SIZE,
|
||||
MX35_3DS_CAMERA_BUF_SIZE);
|
||||
}
|
||||
|
||||
MACHINE_START(MX35_3DS, "Freescale MX35PDK")
|
||||
/* Maintainer: Freescale Semiconductor, Inc */
|
||||
.atag_offset = 0x100,
|
||||
@ -224,5 +439,6 @@ MACHINE_START(MX35_3DS, "Freescale MX35PDK")
|
||||
.handle_irq = imx35_handle_irq,
|
||||
.timer = &mx35pdk_timer,
|
||||
.init_machine = mx35_3ds_init,
|
||||
.reserve = mx35_3ds_reserve,
|
||||
.restart = mxc_restart,
|
||||
MACHINE_END
|
||||
|
@ -44,6 +44,20 @@ config MACH_GURUPLUG
|
||||
Say 'Y' here if you want your kernel to support the
|
||||
Marvell GuruPlug Reference Board.
|
||||
|
||||
config ARCH_KIRKWOOD_DT
|
||||
bool "Marvell Kirkwood Flattened Device Tree"
|
||||
select USE_OF
|
||||
help
|
||||
Say 'Y' here if you want your kernel to support the
|
||||
Marvell Kirkwood using flattened device tree.
|
||||
|
||||
config MACH_DREAMPLUG_DT
|
||||
bool "Marvell DreamPlug (Flattened Device Tree)"
|
||||
select ARCH_KIRKWOOD_DT
|
||||
help
|
||||
Say 'Y' here if you want your kernel to support the
|
||||
Marvell DreamPlug (Flattened Device Tree).
|
||||
|
||||
config MACH_TS219
|
||||
bool "QNAP TS-110, TS-119, TS-119P+, TS-210, TS-219, TS-219P and TS-219P+ Turbo NAS"
|
||||
help
|
||||
|
@ -20,3 +20,5 @@ obj-$(CONFIG_MACH_NET5BIG_V2) += netxbig_v2-setup.o lacie_v2-common.o
|
||||
obj-$(CONFIG_MACH_T5325) += t5325-setup.o
|
||||
|
||||
obj-$(CONFIG_CPU_IDLE) += cpuidle.o
|
||||
obj-$(CONFIG_ARCH_KIRKWOOD_DT) += board-dt.o
|
||||
obj-$(CONFIG_MACH_DREAMPLUG_DT) += board-dreamplug.o
|
||||
|
@ -1,3 +1,5 @@
|
||||
zreladdr-y += 0x00008000
|
||||
params_phys-y := 0x00000100
|
||||
initrd_phys-y := 0x00800000
|
||||
|
||||
dtb-$(CONFIG_MACH_DREAMPLUG_DT) += kirkwood-dreamplug.dtb
|
||||
|
152
arch/arm/mach-kirkwood/board-dreamplug.c
Normal file
152
arch/arm/mach-kirkwood/board-dreamplug.c
Normal file
@ -0,0 +1,152 @@
|
||||
/*
|
||||
* Copyright 2012 (C), Jason Cooper <jason@lakedaemon.net>
|
||||
*
|
||||
* arch/arm/mach-kirkwood/board-dreamplug.c
|
||||
*
|
||||
* Marvell DreamPlug Reference Board Init for drivers not converted to
|
||||
* flattened device tree yet.
|
||||
*
|
||||
* This file is licensed under the terms of the GNU General Public
|
||||
* License version 2. This program is licensed "as is" without any
|
||||
* warranty of any kind, whether express or implied.
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
#include <linux/ata_platform.h>
|
||||
#include <linux/mv643xx_eth.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/of_fdt.h>
|
||||
#include <linux/of_irq.h>
|
||||
#include <linux/of_platform.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/leds.h>
|
||||
#include <linux/mtd/physmap.h>
|
||||
#include <linux/spi/flash.h>
|
||||
#include <linux/spi/spi.h>
|
||||
#include <linux/spi/orion_spi.h>
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/map.h>
|
||||
#include <mach/kirkwood.h>
|
||||
#include <mach/bridge-regs.h>
|
||||
#include <plat/mvsdio.h>
|
||||
#include "common.h"
|
||||
#include "mpp.h"
|
||||
|
||||
struct mtd_partition dreamplug_partitions[] = {
|
||||
{
|
||||
.name = "u-boot",
|
||||
.size = SZ_512K,
|
||||
.offset = 0,
|
||||
},
|
||||
{
|
||||
.name = "u-boot env",
|
||||
.size = SZ_64K,
|
||||
.offset = SZ_512K + SZ_512K,
|
||||
},
|
||||
{
|
||||
.name = "dtb",
|
||||
.size = SZ_64K,
|
||||
.offset = SZ_512K + SZ_512K + SZ_512K,
|
||||
},
|
||||
};
|
||||
|
||||
static const struct flash_platform_data dreamplug_spi_slave_data = {
|
||||
.type = "mx25l1606e",
|
||||
.name = "spi_flash",
|
||||
.parts = dreamplug_partitions,
|
||||
.nr_parts = ARRAY_SIZE(dreamplug_partitions),
|
||||
};
|
||||
|
||||
static struct spi_board_info __initdata dreamplug_spi_slave_info[] = {
|
||||
{
|
||||
.modalias = "m25p80",
|
||||
.platform_data = &dreamplug_spi_slave_data,
|
||||
.irq = -1,
|
||||
.max_speed_hz = 50000000,
|
||||
.bus_num = 0,
|
||||
.chip_select = 0,
|
||||
},
|
||||
};
|
||||
|
||||
static struct mv643xx_eth_platform_data dreamplug_ge00_data = {
|
||||
.phy_addr = MV643XX_ETH_PHY_ADDR(0),
|
||||
};
|
||||
|
||||
static struct mv643xx_eth_platform_data dreamplug_ge01_data = {
|
||||
.phy_addr = MV643XX_ETH_PHY_ADDR(1),
|
||||
};
|
||||
|
||||
static struct mv_sata_platform_data dreamplug_sata_data = {
|
||||
.n_ports = 1,
|
||||
};
|
||||
|
||||
static struct mvsdio_platform_data dreamplug_mvsdio_data = {
|
||||
/* unfortunately the CD signal has not been connected */
|
||||
};
|
||||
|
||||
static struct gpio_led dreamplug_led_pins[] = {
|
||||
{
|
||||
.name = "dreamplug:blue:bluetooth",
|
||||
.gpio = 47,
|
||||
.active_low = 1,
|
||||
},
|
||||
{
|
||||
.name = "dreamplug:green:wifi",
|
||||
.gpio = 48,
|
||||
.active_low = 1,
|
||||
},
|
||||
{
|
||||
.name = "dreamplug:green:wifi_ap",
|
||||
.gpio = 49,
|
||||
.active_low = 1,
|
||||
},
|
||||
};
|
||||
|
||||
static struct gpio_led_platform_data dreamplug_led_data = {
|
||||
.leds = dreamplug_led_pins,
|
||||
.num_leds = ARRAY_SIZE(dreamplug_led_pins),
|
||||
};
|
||||
|
||||
static struct platform_device dreamplug_leds = {
|
||||
.name = "leds-gpio",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &dreamplug_led_data,
|
||||
}
|
||||
};
|
||||
|
||||
static unsigned int dreamplug_mpp_config[] __initdata = {
|
||||
MPP0_SPI_SCn,
|
||||
MPP1_SPI_MOSI,
|
||||
MPP2_SPI_SCK,
|
||||
MPP3_SPI_MISO,
|
||||
MPP47_GPIO, /* Bluetooth LED */
|
||||
MPP48_GPIO, /* Wifi LED */
|
||||
MPP49_GPIO, /* Wifi AP LED */
|
||||
0
|
||||
};
|
||||
|
||||
void __init dreamplug_init(void)
|
||||
{
|
||||
/*
|
||||
* Basic setup. Needs to be called early.
|
||||
*/
|
||||
kirkwood_mpp_conf(dreamplug_mpp_config);
|
||||
|
||||
spi_register_board_info(dreamplug_spi_slave_info,
|
||||
ARRAY_SIZE(dreamplug_spi_slave_info));
|
||||
kirkwood_spi_init();
|
||||
|
||||
kirkwood_ehci_init();
|
||||
kirkwood_ge00_init(&dreamplug_ge00_data);
|
||||
kirkwood_ge01_init(&dreamplug_ge01_data);
|
||||
kirkwood_sata_init(&dreamplug_sata_data);
|
||||
kirkwood_sdio_init(&dreamplug_mvsdio_data);
|
||||
|
||||
platform_device_register(&dreamplug_leds);
|
||||
}
|
75
arch/arm/mach-kirkwood/board-dt.c
Normal file
75
arch/arm/mach-kirkwood/board-dt.c
Normal file
@ -0,0 +1,75 @@
|
||||
/*
|
||||
* Copyright 2012 (C), Jason Cooper <jason@lakedaemon.net>
|
||||
*
|
||||
* arch/arm/mach-kirkwood/board-dt.c
|
||||
*
|
||||
* Flattened Device Tree board initialization
|
||||
*
|
||||
* This file is licensed under the terms of the GNU General Public
|
||||
* License version 2. This program is licensed "as is" without any
|
||||
* warranty of any kind, whether express or implied.
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_platform.h>
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/map.h>
|
||||
#include <mach/bridge-regs.h>
|
||||
#include "common.h"
|
||||
|
||||
static struct of_device_id kirkwood_dt_match_table[] __initdata = {
|
||||
{ .compatible = "simple-bus", },
|
||||
{ }
|
||||
};
|
||||
|
||||
static void __init kirkwood_dt_init(void)
|
||||
{
|
||||
pr_info("Kirkwood: %s, TCLK=%d.\n", kirkwood_id(), kirkwood_tclk);
|
||||
|
||||
/*
|
||||
* Disable propagation of mbus errors to the CPU local bus,
|
||||
* as this causes mbus errors (which can occur for example
|
||||
* for PCI aborts) to throw CPU aborts, which we're not set
|
||||
* up to deal with.
|
||||
*/
|
||||
writel(readl(CPU_CONFIG) & ~CPU_CONFIG_ERROR_PROP, CPU_CONFIG);
|
||||
|
||||
kirkwood_setup_cpu_mbus();
|
||||
|
||||
#ifdef CONFIG_CACHE_FEROCEON_L2
|
||||
kirkwood_l2_init();
|
||||
#endif
|
||||
|
||||
/* internal devices that every board has */
|
||||
kirkwood_wdt_init();
|
||||
kirkwood_xor0_init();
|
||||
kirkwood_xor1_init();
|
||||
kirkwood_crypto_init();
|
||||
|
||||
#ifdef CONFIG_KEXEC
|
||||
kexec_reinit = kirkwood_enable_pcie;
|
||||
#endif
|
||||
|
||||
if (of_machine_is_compatible("globalscale,dreamplug"))
|
||||
dreamplug_init();
|
||||
|
||||
of_platform_populate(NULL, kirkwood_dt_match_table, NULL, NULL);
|
||||
}
|
||||
|
||||
static const char *kirkwood_dt_board_compat[] = {
|
||||
"globalscale,dreamplug",
|
||||
NULL
|
||||
};
|
||||
|
||||
DT_MACHINE_START(KIRKWOOD_DT, "Marvell Kirkwood (Flattened Device Tree)")
|
||||
/* Maintainer: Jason Cooper <jason@lakedaemon.net> */
|
||||
.map_io = kirkwood_map_io,
|
||||
.init_early = kirkwood_init_early,
|
||||
.init_irq = kirkwood_init_irq,
|
||||
.timer = &kirkwood_timer,
|
||||
.init_machine = kirkwood_dt_init,
|
||||
.restart = kirkwood_restart,
|
||||
.dt_compat = kirkwood_dt_board_compat,
|
||||
MACHINE_END
|
@ -279,7 +279,7 @@ void __init kirkwood_crypto_init(void)
|
||||
/*****************************************************************************
|
||||
* XOR0
|
||||
****************************************************************************/
|
||||
static void __init kirkwood_xor0_init(void)
|
||||
void __init kirkwood_xor0_init(void)
|
||||
{
|
||||
kirkwood_clk_ctrl |= CGC_XOR0;
|
||||
|
||||
@ -291,7 +291,7 @@ static void __init kirkwood_xor0_init(void)
|
||||
/*****************************************************************************
|
||||
* XOR1
|
||||
****************************************************************************/
|
||||
static void __init kirkwood_xor1_init(void)
|
||||
void __init kirkwood_xor1_init(void)
|
||||
{
|
||||
kirkwood_clk_ctrl |= CGC_XOR1;
|
||||
|
||||
@ -303,7 +303,7 @@ static void __init kirkwood_xor1_init(void)
|
||||
/*****************************************************************************
|
||||
* Watchdog
|
||||
****************************************************************************/
|
||||
static void __init kirkwood_wdt_init(void)
|
||||
void __init kirkwood_wdt_init(void)
|
||||
{
|
||||
orion_wdt_init(kirkwood_tclk);
|
||||
}
|
||||
@ -392,7 +392,7 @@ void __init kirkwood_audio_init(void)
|
||||
/*
|
||||
* Identify device ID and revision.
|
||||
*/
|
||||
static char * __init kirkwood_id(void)
|
||||
char * __init kirkwood_id(void)
|
||||
{
|
||||
u32 dev, rev;
|
||||
|
||||
@ -435,7 +435,7 @@ static char * __init kirkwood_id(void)
|
||||
}
|
||||
}
|
||||
|
||||
static void __init kirkwood_l2_init(void)
|
||||
void __init kirkwood_l2_init(void)
|
||||
{
|
||||
#ifdef CONFIG_CACHE_FEROCEON_L2_WRITETHROUGH
|
||||
writel(readl(L2_CONFIG_REG) | L2_WRITETHROUGH, L2_CONFIG_REG);
|
||||
@ -450,7 +450,6 @@ void __init kirkwood_init(void)
|
||||
{
|
||||
printk(KERN_INFO "Kirkwood: %s, TCLK=%d.\n",
|
||||
kirkwood_id(), kirkwood_tclk);
|
||||
kirkwood_i2s_data.tclk = kirkwood_tclk;
|
||||
|
||||
/*
|
||||
* Disable propagation of mbus errors to the CPU local bus,
|
||||
|
@ -51,6 +51,21 @@ void kirkwood_nand_init_rnb(struct mtd_partition *parts, int nr_parts, int (*dev
|
||||
void kirkwood_audio_init(void);
|
||||
void kirkwood_restart(char, const char *);
|
||||
|
||||
/* board init functions for boards not fully converted to fdt */
|
||||
#ifdef CONFIG_MACH_DREAMPLUG_DT
|
||||
void dreamplug_init(void);
|
||||
#else
|
||||
static inline void dreamplug_init(void) {};
|
||||
#endif
|
||||
|
||||
/* early init functions not converted to fdt yet */
|
||||
char *kirkwood_id(void);
|
||||
void kirkwood_l2_init(void);
|
||||
void kirkwood_wdt_init(void);
|
||||
void kirkwood_xor0_init(void);
|
||||
void kirkwood_xor1_init(void);
|
||||
void kirkwood_crypto_init(void);
|
||||
|
||||
extern int kirkwood_tclk;
|
||||
extern struct sys_timer kirkwood_timer;
|
||||
|
||||
|
@ -223,6 +223,7 @@ struct resource mmp2_resource_gpio[] = {
|
||||
}, {
|
||||
.start = IRQ_MMP2_GPIO,
|
||||
.end = IRQ_MMP2_GPIO,
|
||||
.name = "gpio_mux",
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
@ -168,6 +168,7 @@ struct resource pxa168_resource_gpio[] = {
|
||||
}, {
|
||||
.start = IRQ_PXA168_GPIOX,
|
||||
.end = IRQ_PXA168_GPIOX,
|
||||
.name = "gpio_mux",
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
@ -173,6 +173,7 @@ struct resource pxa910_resource_gpio[] = {
|
||||
}, {
|
||||
.start = IRQ_PXA910_AP_GPIO,
|
||||
.end = IRQ_PXA910_AP_GPIO,
|
||||
.name = "gpio_mux",
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
@ -83,6 +83,18 @@ config MODULE_M28
|
||||
select MXS_HAVE_PLATFORM_MXSFB
|
||||
select MXS_OCOTP
|
||||
|
||||
config MODULE_APX4
|
||||
bool
|
||||
select SOC_IMX28
|
||||
select LEDS_GPIO_REGISTER
|
||||
select MXS_HAVE_AMBA_DUART
|
||||
select MXS_HAVE_PLATFORM_AUART
|
||||
select MXS_HAVE_PLATFORM_FEC
|
||||
select MXS_HAVE_PLATFORM_MXS_I2C
|
||||
select MXS_HAVE_PLATFORM_MXS_MMC
|
||||
select MXS_HAVE_PLATFORM_MXS_SAIF
|
||||
select MXS_OCOTP
|
||||
|
||||
config MACH_TX28
|
||||
bool "Ka-Ro TX28 module"
|
||||
select MODULE_TX28
|
||||
@ -91,4 +103,8 @@ config MACH_M28EVK
|
||||
bool "Support DENX M28EVK Platform"
|
||||
select MODULE_M28
|
||||
|
||||
config MACH_APX4DEVKIT
|
||||
bool "Support Bluegiga APX4 Development Kit"
|
||||
select MODULE_APX4
|
||||
|
||||
endif
|
||||
|
@ -11,6 +11,7 @@ obj-$(CONFIG_MACH_STMP378X_DEVB) += mach-stmp378x_devb.o
|
||||
obj-$(CONFIG_MACH_MX23EVK) += mach-mx23evk.o
|
||||
obj-$(CONFIG_MACH_MX28EVK) += mach-mx28evk.o
|
||||
obj-$(CONFIG_MACH_M28EVK) += mach-m28evk.o
|
||||
obj-$(CONFIG_MACH_APX4DEVKIT) += mach-apx4devkit.o
|
||||
obj-$(CONFIG_MODULE_TX28) += module-tx28.o
|
||||
obj-$(CONFIG_MACH_TX28) += mach-tx28.o
|
||||
|
||||
|
@ -18,4 +18,5 @@
|
||||
#define HW_DIGCTL_CTRL 0x0
|
||||
#define BP_DIGCTL_CTRL_SAIF_CLKMUX 10
|
||||
#define BM_DIGCTL_CTRL_SAIF_CLKMUX (0x3 << 10)
|
||||
#define HW_DIGCTL_CHIPID 0x310
|
||||
#endif
|
||||
|
@ -23,21 +23,9 @@
|
||||
#include <linux/io.h>
|
||||
#endif
|
||||
#include <asm/mach-types.h>
|
||||
#include <mach/digctl.h>
|
||||
#include <mach/hardware.h>
|
||||
|
||||
/*
|
||||
* MXS CPU types
|
||||
*/
|
||||
#define cpu_is_mx23() ( \
|
||||
machine_is_mx23evk() || \
|
||||
machine_is_stmp378x() || \
|
||||
0)
|
||||
#define cpu_is_mx28() ( \
|
||||
machine_is_mx28evk() || \
|
||||
machine_is_m28evk() || \
|
||||
machine_is_tx28() || \
|
||||
0)
|
||||
|
||||
/*
|
||||
* IO addresses common to MXS-based
|
||||
*/
|
||||
@ -109,6 +97,21 @@ static inline void __mxs_togl(u32 mask, void __iomem *reg)
|
||||
{
|
||||
__raw_writel(mask, reg + MXS_TOG_ADDR);
|
||||
}
|
||||
|
||||
/*
|
||||
* MXS CPU types
|
||||
*/
|
||||
#define MXS_CHIPID (MXS_IO_ADDRESS(MXS_DIGCTL_BASE_ADDR) + HW_DIGCTL_CHIPID)
|
||||
|
||||
static inline int cpu_is_mx23(void)
|
||||
{
|
||||
return ((__raw_readl(MXS_CHIPID) >> 16) == 0x3780);
|
||||
}
|
||||
|
||||
static inline int cpu_is_mx28(void)
|
||||
{
|
||||
return ((__raw_readl(MXS_CHIPID) >> 16) == 0x2800);
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __MACH_MXS_H__ */
|
||||
|
@ -18,8 +18,6 @@
|
||||
#ifndef __MACH_MXS_UNCOMPRESS_H__
|
||||
#define __MACH_MXS_UNCOMPRESS_H__
|
||||
|
||||
#include <asm/mach-types.h>
|
||||
|
||||
unsigned long mxs_duart_base;
|
||||
|
||||
#define MXS_DUART(x) (*(volatile unsigned long *)(mxs_duart_base + (x)))
|
||||
@ -55,16 +53,17 @@ static inline void flush(void)
|
||||
|
||||
#define MX23_DUART_BASE_ADDR 0x80070000
|
||||
#define MX28_DUART_BASE_ADDR 0x80074000
|
||||
#define MXS_DIGCTL_CHIPID 0x8001c310
|
||||
|
||||
static inline void __arch_decomp_setup(unsigned long arch_id)
|
||||
{
|
||||
switch (arch_id) {
|
||||
case MACH_TYPE_MX23EVK:
|
||||
u16 chipid = (*(volatile unsigned long *) MXS_DIGCTL_CHIPID) >> 16;
|
||||
|
||||
switch (chipid) {
|
||||
case 0x3780:
|
||||
mxs_duart_base = MX23_DUART_BASE_ADDR;
|
||||
break;
|
||||
case MACH_TYPE_MX28EVK:
|
||||
case MACH_TYPE_M28EVK:
|
||||
case MACH_TYPE_TX28:
|
||||
case 0x2800:
|
||||
mxs_duart_base = MX28_DUART_BASE_ADDR;
|
||||
break;
|
||||
default:
|
||||
|
260
arch/arm/mach-mxs/mach-apx4devkit.c
Normal file
260
arch/arm/mach-mxs/mach-apx4devkit.c
Normal file
@ -0,0 +1,260 @@
|
||||
/*
|
||||
* Copyright (C) 2011-2012
|
||||
* Lauri Hintsala, Bluegiga, <lauri.hintsala@bluegiga.com>
|
||||
* Veli-Pekka Peltola, Bluegiga, <veli-pekka.peltola@bluegiga.com>
|
||||
*
|
||||
* based on: mach-mx28evk.c
|
||||
* Copyright 2010 Freescale Semiconductor, Inc. All Rights Reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#include <linux/delay.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/leds.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/regulator/machine.h>
|
||||
#include <linux/regulator/fixed.h>
|
||||
#include <linux/micrel_phy.h>
|
||||
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/time.h>
|
||||
|
||||
#include <mach/common.h>
|
||||
#include <mach/digctl.h>
|
||||
#include <mach/iomux-mx28.h>
|
||||
|
||||
#include "devices-mx28.h"
|
||||
|
||||
#define APX4DEVKIT_GPIO_USERLED MXS_GPIO_NR(3, 28)
|
||||
|
||||
static const iomux_cfg_t apx4devkit_pads[] __initconst = {
|
||||
/* duart */
|
||||
MX28_PAD_PWM0__DUART_RX | MXS_PAD_CTRL,
|
||||
MX28_PAD_PWM1__DUART_TX | MXS_PAD_CTRL,
|
||||
|
||||
/* auart0 */
|
||||
MX28_PAD_AUART0_RX__AUART0_RX | MXS_PAD_CTRL,
|
||||
MX28_PAD_AUART0_TX__AUART0_TX | MXS_PAD_CTRL,
|
||||
MX28_PAD_AUART0_CTS__AUART0_CTS | MXS_PAD_CTRL,
|
||||
MX28_PAD_AUART0_RTS__AUART0_RTS | MXS_PAD_CTRL,
|
||||
|
||||
/* auart1 */
|
||||
MX28_PAD_AUART1_RX__AUART1_RX | MXS_PAD_CTRL,
|
||||
MX28_PAD_AUART1_TX__AUART1_TX | MXS_PAD_CTRL,
|
||||
|
||||
/* auart2 */
|
||||
MX28_PAD_SSP2_SCK__AUART2_RX | MXS_PAD_CTRL,
|
||||
MX28_PAD_SSP2_MOSI__AUART2_TX | MXS_PAD_CTRL,
|
||||
|
||||
/* auart3 */
|
||||
MX28_PAD_SSP2_MISO__AUART3_RX | MXS_PAD_CTRL,
|
||||
MX28_PAD_SSP2_SS0__AUART3_TX | MXS_PAD_CTRL,
|
||||
|
||||
#define MXS_PAD_FEC (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP)
|
||||
/* fec0 */
|
||||
MX28_PAD_ENET0_MDC__ENET0_MDC | MXS_PAD_FEC,
|
||||
MX28_PAD_ENET0_MDIO__ENET0_MDIO | MXS_PAD_FEC,
|
||||
MX28_PAD_ENET0_RX_EN__ENET0_RX_EN | MXS_PAD_FEC,
|
||||
MX28_PAD_ENET0_RXD0__ENET0_RXD0 | MXS_PAD_FEC,
|
||||
MX28_PAD_ENET0_RXD1__ENET0_RXD1 | MXS_PAD_FEC,
|
||||
MX28_PAD_ENET0_TX_EN__ENET0_TX_EN | MXS_PAD_FEC,
|
||||
MX28_PAD_ENET0_TXD0__ENET0_TXD0 | MXS_PAD_FEC,
|
||||
MX28_PAD_ENET0_TXD1__ENET0_TXD1 | MXS_PAD_FEC,
|
||||
MX28_PAD_ENET_CLK__CLKCTRL_ENET | MXS_PAD_FEC,
|
||||
|
||||
/* i2c */
|
||||
MX28_PAD_I2C0_SCL__I2C0_SCL,
|
||||
MX28_PAD_I2C0_SDA__I2C0_SDA,
|
||||
|
||||
/* mmc0 */
|
||||
MX28_PAD_SSP0_DATA0__SSP0_D0 |
|
||||
(MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
|
||||
MX28_PAD_SSP0_DATA1__SSP0_D1 |
|
||||
(MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
|
||||
MX28_PAD_SSP0_DATA2__SSP0_D2 |
|
||||
(MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
|
||||
MX28_PAD_SSP0_DATA3__SSP0_D3 |
|
||||
(MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
|
||||
MX28_PAD_SSP0_DATA4__SSP0_D4 |
|
||||
(MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
|
||||
MX28_PAD_SSP0_DATA5__SSP0_D5 |
|
||||
(MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
|
||||
MX28_PAD_SSP0_DATA6__SSP0_D6 |
|
||||
(MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
|
||||
MX28_PAD_SSP0_DATA7__SSP0_D7 |
|
||||
(MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
|
||||
MX28_PAD_SSP0_CMD__SSP0_CMD |
|
||||
(MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
|
||||
MX28_PAD_SSP0_DETECT__SSP0_CARD_DETECT |
|
||||
(MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_NOPULL),
|
||||
MX28_PAD_SSP0_SCK__SSP0_SCK |
|
||||
(MXS_PAD_12MA | MXS_PAD_3V3 | MXS_PAD_NOPULL),
|
||||
|
||||
/* led */
|
||||
MX28_PAD_PWM3__GPIO_3_28 | MXS_PAD_CTRL,
|
||||
|
||||
/* saif0 & saif1 */
|
||||
MX28_PAD_SAIF0_MCLK__SAIF0_MCLK |
|
||||
(MXS_PAD_12MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
|
||||
MX28_PAD_SAIF0_LRCLK__SAIF0_LRCLK |
|
||||
(MXS_PAD_12MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
|
||||
MX28_PAD_SAIF0_BITCLK__SAIF0_BITCLK |
|
||||
(MXS_PAD_12MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
|
||||
MX28_PAD_SAIF0_SDATA0__SAIF0_SDATA0 |
|
||||
(MXS_PAD_12MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
|
||||
MX28_PAD_SAIF1_SDATA0__SAIF1_SDATA0 |
|
||||
(MXS_PAD_12MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
|
||||
};
|
||||
|
||||
/* led */
|
||||
static const struct gpio_led apx4devkit_leds[] __initconst = {
|
||||
{
|
||||
.name = "user-led",
|
||||
.default_trigger = "heartbeat",
|
||||
.gpio = APX4DEVKIT_GPIO_USERLED,
|
||||
},
|
||||
};
|
||||
|
||||
static const struct gpio_led_platform_data apx4devkit_led_data __initconst = {
|
||||
.leds = apx4devkit_leds,
|
||||
.num_leds = ARRAY_SIZE(apx4devkit_leds),
|
||||
};
|
||||
|
||||
static const struct fec_platform_data mx28_fec_pdata __initconst = {
|
||||
.phy = PHY_INTERFACE_MODE_RMII,
|
||||
};
|
||||
|
||||
static const struct mxs_mmc_platform_data apx4devkit_mmc_pdata __initconst = {
|
||||
.wp_gpio = -EINVAL,
|
||||
.flags = SLOTF_4_BIT_CAPABLE,
|
||||
};
|
||||
|
||||
static const struct i2c_board_info apx4devkit_i2c_boardinfo[] __initconst = {
|
||||
{ I2C_BOARD_INFO("sgtl5000", 0x0a) }, /* ASoC */
|
||||
{ I2C_BOARD_INFO("pcf8563", 0x51) }, /* RTC */
|
||||
};
|
||||
|
||||
#if defined(CONFIG_REGULATOR_FIXED_VOLTAGE) || \
|
||||
defined(CONFIG_REGULATOR_FIXED_VOLTAGE_MODULE)
|
||||
static struct regulator_consumer_supply apx4devkit_audio_consumer_supplies[] = {
|
||||
REGULATOR_SUPPLY("VDDA", "0-000a"),
|
||||
REGULATOR_SUPPLY("VDDIO", "0-000a"),
|
||||
};
|
||||
|
||||
static struct regulator_init_data apx4devkit_vdd_reg_init_data = {
|
||||
.constraints = {
|
||||
.name = "3V3",
|
||||
.always_on = 1,
|
||||
},
|
||||
.consumer_supplies = apx4devkit_audio_consumer_supplies,
|
||||
.num_consumer_supplies = ARRAY_SIZE(apx4devkit_audio_consumer_supplies),
|
||||
};
|
||||
|
||||
static struct fixed_voltage_config apx4devkit_vdd_pdata = {
|
||||
.supply_name = "board-3V3",
|
||||
.microvolts = 3300000,
|
||||
.gpio = -EINVAL,
|
||||
.enabled_at_boot = 1,
|
||||
.init_data = &apx4devkit_vdd_reg_init_data,
|
||||
};
|
||||
|
||||
static struct platform_device apx4devkit_voltage_regulator = {
|
||||
.name = "reg-fixed-voltage",
|
||||
.id = -1,
|
||||
.num_resources = 0,
|
||||
.dev = {
|
||||
.platform_data = &apx4devkit_vdd_pdata,
|
||||
},
|
||||
};
|
||||
|
||||
static void __init apx4devkit_add_regulators(void)
|
||||
{
|
||||
platform_device_register(&apx4devkit_voltage_regulator);
|
||||
}
|
||||
#else
|
||||
static void __init apx4devkit_add_regulators(void) {}
|
||||
#endif
|
||||
|
||||
static const struct mxs_saif_platform_data
|
||||
apx4devkit_mxs_saif_pdata[] __initconst = {
|
||||
/* working on EXTMSTR0 mode (saif0 master, saif1 slave) */
|
||||
{
|
||||
.master_mode = 1,
|
||||
.master_id = 0,
|
||||
}, {
|
||||
.master_mode = 0,
|
||||
.master_id = 0,
|
||||
},
|
||||
};
|
||||
|
||||
static int apx4devkit_phy_fixup(struct phy_device *phy)
|
||||
{
|
||||
phy->dev_flags |= MICREL_PHY_50MHZ_CLK;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void __init apx4devkit_init(void)
|
||||
{
|
||||
mxs_iomux_setup_multiple_pads(apx4devkit_pads,
|
||||
ARRAY_SIZE(apx4devkit_pads));
|
||||
|
||||
mx28_add_duart();
|
||||
mx28_add_auart0();
|
||||
mx28_add_auart1();
|
||||
mx28_add_auart2();
|
||||
mx28_add_auart3();
|
||||
|
||||
/*
|
||||
* Register fixup for the Micrel KS8031 PHY clock
|
||||
* (shares same ID with KS8051)
|
||||
*/
|
||||
phy_register_fixup_for_uid(PHY_ID_KS8051, MICREL_PHY_ID_MASK,
|
||||
apx4devkit_phy_fixup);
|
||||
|
||||
mx28_add_fec(0, &mx28_fec_pdata);
|
||||
|
||||
mx28_add_mxs_mmc(0, &apx4devkit_mmc_pdata);
|
||||
|
||||
gpio_led_register_device(0, &apx4devkit_led_data);
|
||||
|
||||
mxs_saif_clkmux_select(MXS_DIGCTL_SAIF_CLKMUX_EXTMSTR0);
|
||||
mx28_add_saif(0, &apx4devkit_mxs_saif_pdata[0]);
|
||||
mx28_add_saif(1, &apx4devkit_mxs_saif_pdata[1]);
|
||||
|
||||
apx4devkit_add_regulators();
|
||||
|
||||
mx28_add_mxs_i2c(0);
|
||||
i2c_register_board_info(0, apx4devkit_i2c_boardinfo,
|
||||
ARRAY_SIZE(apx4devkit_i2c_boardinfo));
|
||||
|
||||
mxs_add_platform_device("mxs-sgtl5000", 0, NULL, 0, NULL, 0);
|
||||
}
|
||||
|
||||
static void __init apx4devkit_timer_init(void)
|
||||
{
|
||||
mx28_clocks_init();
|
||||
}
|
||||
|
||||
static struct sys_timer apx4devkit_timer = {
|
||||
.init = apx4devkit_timer_init,
|
||||
};
|
||||
|
||||
MACHINE_START(APX4DEVKIT, "Bluegiga APX4 Development Kit")
|
||||
.map_io = mx28_map_io,
|
||||
.init_irq = mx28_init_irq,
|
||||
.timer = &apx4devkit_timer,
|
||||
.init_machine = apx4devkit_init,
|
||||
.restart = mxs_restart,
|
||||
MACHINE_END
|
@ -247,18 +247,15 @@ static int __init m28evk_fec_get_mac(void)
|
||||
u32 val;
|
||||
const u32 *ocotp = mxs_get_ocotp();
|
||||
|
||||
if (!ocotp) {
|
||||
pr_err("%s: timeout when reading fec mac from OCOTP\n",
|
||||
__func__);
|
||||
if (!ocotp)
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
|
||||
/*
|
||||
* OCOTP only stores the last 4 octets for each mac address,
|
||||
* so hard-code DENX OUI (C0:E5:4E) here.
|
||||
*/
|
||||
for (i = 0; i < 2; i++) {
|
||||
val = ocotp[i * 4];
|
||||
val = ocotp[i];
|
||||
mx28_fec_pdata[i].mac[0] = 0xC0;
|
||||
mx28_fec_pdata[i].mac[1] = 0xE5;
|
||||
mx28_fec_pdata[i].mac[2] = 0x4E;
|
||||
|
@ -223,7 +223,6 @@ static const struct gpio_led_platform_data mx28evk_led_data __initconst = {
|
||||
/* fec */
|
||||
static void __init mx28evk_fec_reset(void)
|
||||
{
|
||||
int ret;
|
||||
struct clk *clk;
|
||||
|
||||
/* Enable fec phy clock */
|
||||
@ -231,32 +230,7 @@ static void __init mx28evk_fec_reset(void)
|
||||
if (!IS_ERR(clk))
|
||||
clk_prepare_enable(clk);
|
||||
|
||||
/* Power up fec phy */
|
||||
ret = gpio_request(MX28EVK_FEC_PHY_POWER, "fec-phy-power");
|
||||
if (ret) {
|
||||
pr_err("Failed to request gpio fec-phy-%s: %d\n", "power", ret);
|
||||
return;
|
||||
}
|
||||
|
||||
ret = gpio_direction_output(MX28EVK_FEC_PHY_POWER, 0);
|
||||
if (ret) {
|
||||
pr_err("Failed to drive gpio fec-phy-%s: %d\n", "power", ret);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Reset fec phy */
|
||||
ret = gpio_request(MX28EVK_FEC_PHY_RESET, "fec-phy-reset");
|
||||
if (ret) {
|
||||
pr_err("Failed to request gpio fec-phy-%s: %d\n", "reset", ret);
|
||||
return;
|
||||
}
|
||||
|
||||
gpio_direction_output(MX28EVK_FEC_PHY_RESET, 0);
|
||||
if (ret) {
|
||||
pr_err("Failed to drive gpio fec-phy-%s: %d\n", "reset", ret);
|
||||
return;
|
||||
}
|
||||
|
||||
gpio_set_value(MX28EVK_FEC_PHY_RESET, 0);
|
||||
mdelay(1);
|
||||
gpio_set_value(MX28EVK_FEC_PHY_RESET, 1);
|
||||
}
|
||||
@ -278,14 +252,14 @@ static int __init mx28evk_fec_get_mac(void)
|
||||
const u32 *ocotp = mxs_get_ocotp();
|
||||
|
||||
if (!ocotp)
|
||||
goto error;
|
||||
return -ETIMEDOUT;
|
||||
|
||||
/*
|
||||
* OCOTP only stores the last 4 octets for each mac address,
|
||||
* so hard-code Freescale OUI (00:04:9f) here.
|
||||
*/
|
||||
for (i = 0; i < 2; i++) {
|
||||
val = ocotp[i * 4];
|
||||
val = ocotp[i];
|
||||
mx28_fec_pdata[i].mac[0] = 0x00;
|
||||
mx28_fec_pdata[i].mac[1] = 0x04;
|
||||
mx28_fec_pdata[i].mac[2] = 0x9f;
|
||||
@ -295,10 +269,6 @@ static int __init mx28evk_fec_get_mac(void)
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
error:
|
||||
pr_err("%s: timeout when reading fec mac from OCOTP\n", __func__);
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -417,9 +387,14 @@ static void __init mx28evk_add_regulators(void)
|
||||
static void __init mx28evk_add_regulators(void) {}
|
||||
#endif
|
||||
|
||||
static struct gpio mx28evk_lcd_gpios[] = {
|
||||
static const struct gpio mx28evk_gpios[] __initconst = {
|
||||
{ MX28EVK_LCD_ENABLE, GPIOF_OUT_INIT_HIGH, "lcd-enable" },
|
||||
{ MX28EVK_BL_ENABLE, GPIOF_OUT_INIT_HIGH, "bl-enable" },
|
||||
{ MX28EVK_FLEXCAN_SWITCH, GPIOF_DIR_OUT, "flexcan-switch" },
|
||||
{ MX28EVK_MMC0_SLOT_POWER, GPIOF_OUT_INIT_LOW, "mmc0-slot-power" },
|
||||
{ MX28EVK_MMC1_SLOT_POWER, GPIOF_OUT_INIT_LOW, "mmc1-slot-power" },
|
||||
{ MX28EVK_FEC_PHY_POWER, GPIOF_OUT_INIT_LOW, "fec-phy-power" },
|
||||
{ MX28EVK_FEC_PHY_RESET, GPIOF_DIR_OUT, "fec-phy-reset" },
|
||||
};
|
||||
|
||||
static const struct mxs_saif_platform_data
|
||||
@ -447,25 +422,18 @@ static void __init mx28evk_init(void)
|
||||
if (mx28evk_fec_get_mac())
|
||||
pr_warn("%s: failed on fec mac setup\n", __func__);
|
||||
|
||||
ret = gpio_request_array(mx28evk_gpios, ARRAY_SIZE(mx28evk_gpios));
|
||||
if (ret)
|
||||
pr_err("One or more GPIOs failed to be requested: %d\n", ret);
|
||||
|
||||
mx28evk_fec_reset();
|
||||
mx28_add_fec(0, &mx28_fec_pdata[0]);
|
||||
mx28_add_fec(1, &mx28_fec_pdata[1]);
|
||||
|
||||
ret = gpio_request_one(MX28EVK_FLEXCAN_SWITCH, GPIOF_DIR_OUT,
|
||||
"flexcan-switch");
|
||||
if (ret) {
|
||||
pr_err("failed to request gpio flexcan-switch: %d\n", ret);
|
||||
} else {
|
||||
mx28_add_flexcan(0, &mx28evk_flexcan_pdata[0]);
|
||||
mx28_add_flexcan(1, &mx28evk_flexcan_pdata[1]);
|
||||
}
|
||||
mx28_add_flexcan(0, &mx28evk_flexcan_pdata[0]);
|
||||
mx28_add_flexcan(1, &mx28evk_flexcan_pdata[1]);
|
||||
|
||||
ret = gpio_request_array(mx28evk_lcd_gpios,
|
||||
ARRAY_SIZE(mx28evk_lcd_gpios));
|
||||
if (ret)
|
||||
pr_warn("failed to request gpio pins for lcd: %d\n", ret);
|
||||
else
|
||||
mx28_add_mxsfb(&mx28evk_mxsfb_pdata);
|
||||
mx28_add_mxsfb(&mx28evk_mxsfb_pdata);
|
||||
|
||||
mxs_saif_clkmux_select(MXS_DIGCTL_SAIF_CLKMUX_EXTMSTR0);
|
||||
mx28_add_saif(0, &mx28evk_mxs_saif_pdata[0]);
|
||||
@ -480,20 +448,8 @@ static void __init mx28evk_init(void)
|
||||
mxs_add_platform_device("mxs-sgtl5000", 0, NULL, 0,
|
||||
NULL, 0);
|
||||
|
||||
/* power on mmc slot by writing 0 to the gpio */
|
||||
ret = gpio_request_one(MX28EVK_MMC0_SLOT_POWER, GPIOF_OUT_INIT_LOW,
|
||||
"mmc0-slot-power");
|
||||
if (ret)
|
||||
pr_warn("failed to request gpio mmc0-slot-power: %d\n", ret);
|
||||
else
|
||||
mx28_add_mxs_mmc(0, &mx28evk_mmc_pdata[0]);
|
||||
|
||||
ret = gpio_request_one(MX28EVK_MMC1_SLOT_POWER, GPIOF_OUT_INIT_LOW,
|
||||
"mmc1-slot-power");
|
||||
if (ret)
|
||||
pr_warn("failed to request gpio mmc1-slot-power: %d\n", ret);
|
||||
else
|
||||
mx28_add_mxs_mmc(1, &mx28evk_mmc_pdata[1]);
|
||||
mx28_add_mxs_mmc(0, &mx28evk_mmc_pdata[0]);
|
||||
mx28_add_mxs_mmc(1, &mx28evk_mmc_pdata[1]);
|
||||
|
||||
mx28_add_rtc_stmp3xxx();
|
||||
|
||||
|
@ -155,6 +155,10 @@ config MACH_AMS_DELTA
|
||||
bool "Amstrad E3 (Delta)"
|
||||
depends on ARCH_OMAP1 && ARCH_OMAP15XX
|
||||
select FIQ
|
||||
select GPIO_GENERIC_PLATFORM
|
||||
select LEDS_GPIO_REGISTER
|
||||
select REGULATOR
|
||||
select REGULATOR_FIXED_VOLTAGE
|
||||
help
|
||||
Support for the Amstrad E3 (codename Delta) videophone. Say Y here
|
||||
if you have such a device.
|
||||
|
@ -11,6 +11,7 @@
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
#include <linux/basic_mmio_gpio.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
@ -18,6 +19,9 @@
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/leds.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/regulator/consumer.h>
|
||||
#include <linux/regulator/fixed.h>
|
||||
#include <linux/regulator/machine.h>
|
||||
#include <linux/serial_8250.h>
|
||||
#include <linux/export.h>
|
||||
|
||||
@ -40,9 +44,6 @@
|
||||
|
||||
#include <mach/ams-delta-fiq.h>
|
||||
|
||||
static u8 ams_delta_latch1_reg;
|
||||
static u16 ams_delta_latch2_reg;
|
||||
|
||||
static const unsigned int ams_delta_keymap[] = {
|
||||
KEY(0, 0, KEY_F1), /* Advert */
|
||||
|
||||
@ -121,49 +122,42 @@ static const unsigned int ams_delta_keymap[] = {
|
||||
KEY(7, 3, KEY_LEFTCTRL), /* Vol down */
|
||||
};
|
||||
|
||||
void ams_delta_latch1_write(u8 mask, u8 value)
|
||||
{
|
||||
ams_delta_latch1_reg &= ~mask;
|
||||
ams_delta_latch1_reg |= value;
|
||||
*(volatile __u8 *) AMS_DELTA_LATCH1_VIRT = ams_delta_latch1_reg;
|
||||
}
|
||||
|
||||
void ams_delta_latch2_write(u16 mask, u16 value)
|
||||
{
|
||||
ams_delta_latch2_reg &= ~mask;
|
||||
ams_delta_latch2_reg |= value;
|
||||
*(volatile __u16 *) AMS_DELTA_LATCH2_VIRT = ams_delta_latch2_reg;
|
||||
}
|
||||
#define LATCH1_PHYS 0x01000000
|
||||
#define LATCH1_VIRT 0xEA000000
|
||||
#define MODEM_PHYS 0x04000000
|
||||
#define MODEM_VIRT 0xEB000000
|
||||
#define LATCH2_PHYS 0x08000000
|
||||
#define LATCH2_VIRT 0xEC000000
|
||||
|
||||
static struct map_desc ams_delta_io_desc[] __initdata = {
|
||||
/* AMS_DELTA_LATCH1 */
|
||||
{
|
||||
.virtual = AMS_DELTA_LATCH1_VIRT,
|
||||
.pfn = __phys_to_pfn(AMS_DELTA_LATCH1_PHYS),
|
||||
.virtual = LATCH1_VIRT,
|
||||
.pfn = __phys_to_pfn(LATCH1_PHYS),
|
||||
.length = 0x01000000,
|
||||
.type = MT_DEVICE
|
||||
},
|
||||
/* AMS_DELTA_LATCH2 */
|
||||
{
|
||||
.virtual = AMS_DELTA_LATCH2_VIRT,
|
||||
.pfn = __phys_to_pfn(AMS_DELTA_LATCH2_PHYS),
|
||||
.virtual = LATCH2_VIRT,
|
||||
.pfn = __phys_to_pfn(LATCH2_PHYS),
|
||||
.length = 0x01000000,
|
||||
.type = MT_DEVICE
|
||||
},
|
||||
/* AMS_DELTA_MODEM */
|
||||
{
|
||||
.virtual = AMS_DELTA_MODEM_VIRT,
|
||||
.pfn = __phys_to_pfn(AMS_DELTA_MODEM_PHYS),
|
||||
.virtual = MODEM_VIRT,
|
||||
.pfn = __phys_to_pfn(MODEM_PHYS),
|
||||
.length = 0x01000000,
|
||||
.type = MT_DEVICE
|
||||
}
|
||||
};
|
||||
|
||||
static struct omap_lcd_config ams_delta_lcd_config = {
|
||||
static struct omap_lcd_config ams_delta_lcd_config __initdata = {
|
||||
.ctrl_name = "internal",
|
||||
};
|
||||
|
||||
static struct omap_usb_config ams_delta_usb_config __initdata = {
|
||||
static struct omap_usb_config ams_delta_usb_config = {
|
||||
.register_host = 1,
|
||||
.hmc_mode = 16,
|
||||
.pins[0] = 2,
|
||||
@ -173,6 +167,147 @@ static struct omap_board_config_kernel ams_delta_config[] __initdata = {
|
||||
{ OMAP_TAG_LCD, &ams_delta_lcd_config },
|
||||
};
|
||||
|
||||
#define LATCH1_GPIO_BASE 232
|
||||
#define LATCH1_NGPIO 8
|
||||
|
||||
static struct resource latch1_resources[] = {
|
||||
[0] = {
|
||||
.name = "dat",
|
||||
.start = LATCH1_PHYS,
|
||||
.end = LATCH1_PHYS + (LATCH1_NGPIO - 1) / 8,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
};
|
||||
|
||||
static struct bgpio_pdata latch1_pdata = {
|
||||
.base = LATCH1_GPIO_BASE,
|
||||
.ngpio = LATCH1_NGPIO,
|
||||
};
|
||||
|
||||
static struct platform_device latch1_gpio_device = {
|
||||
.name = "basic-mmio-gpio",
|
||||
.id = 0,
|
||||
.resource = latch1_resources,
|
||||
.num_resources = ARRAY_SIZE(latch1_resources),
|
||||
.dev = {
|
||||
.platform_data = &latch1_pdata,
|
||||
},
|
||||
};
|
||||
|
||||
static struct resource latch2_resources[] = {
|
||||
[0] = {
|
||||
.name = "dat",
|
||||
.start = LATCH2_PHYS,
|
||||
.end = LATCH2_PHYS + (AMS_DELTA_LATCH2_NGPIO - 1) / 8,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
};
|
||||
|
||||
static struct bgpio_pdata latch2_pdata = {
|
||||
.base = AMS_DELTA_LATCH2_GPIO_BASE,
|
||||
.ngpio = AMS_DELTA_LATCH2_NGPIO,
|
||||
};
|
||||
|
||||
static struct platform_device latch2_gpio_device = {
|
||||
.name = "basic-mmio-gpio",
|
||||
.id = 1,
|
||||
.resource = latch2_resources,
|
||||
.num_resources = ARRAY_SIZE(latch2_resources),
|
||||
.dev = {
|
||||
.platform_data = &latch2_pdata,
|
||||
},
|
||||
};
|
||||
|
||||
static const struct gpio latch_gpios[] __initconst = {
|
||||
{
|
||||
.gpio = LATCH1_GPIO_BASE + 6,
|
||||
.flags = GPIOF_OUT_INIT_LOW,
|
||||
.label = "dockit1",
|
||||
},
|
||||
{
|
||||
.gpio = LATCH1_GPIO_BASE + 7,
|
||||
.flags = GPIOF_OUT_INIT_LOW,
|
||||
.label = "dockit2",
|
||||
},
|
||||
{
|
||||
.gpio = AMS_DELTA_GPIO_PIN_SCARD_RSTIN,
|
||||
.flags = GPIOF_OUT_INIT_LOW,
|
||||
.label = "scard_rstin",
|
||||
},
|
||||
{
|
||||
.gpio = AMS_DELTA_GPIO_PIN_SCARD_CMDVCC,
|
||||
.flags = GPIOF_OUT_INIT_LOW,
|
||||
.label = "scard_cmdvcc",
|
||||
},
|
||||
{
|
||||
.gpio = AMS_DELTA_GPIO_PIN_MODEM_CODEC,
|
||||
.flags = GPIOF_OUT_INIT_LOW,
|
||||
.label = "modem_codec",
|
||||
},
|
||||
{
|
||||
.gpio = AMS_DELTA_LATCH2_GPIO_BASE + 14,
|
||||
.flags = GPIOF_OUT_INIT_LOW,
|
||||
.label = "hookflash1",
|
||||
},
|
||||
{
|
||||
.gpio = AMS_DELTA_LATCH2_GPIO_BASE + 15,
|
||||
.flags = GPIOF_OUT_INIT_LOW,
|
||||
.label = "hookflash2",
|
||||
},
|
||||
};
|
||||
|
||||
static struct regulator_consumer_supply modem_nreset_consumers[] = {
|
||||
REGULATOR_SUPPLY("RESET#", "serial8250.1"),
|
||||
REGULATOR_SUPPLY("POR", "cx20442-codec"),
|
||||
};
|
||||
|
||||
static struct regulator_init_data modem_nreset_data = {
|
||||
.constraints = {
|
||||
.valid_ops_mask = REGULATOR_CHANGE_STATUS,
|
||||
.boot_on = 1,
|
||||
},
|
||||
.num_consumer_supplies = ARRAY_SIZE(modem_nreset_consumers),
|
||||
.consumer_supplies = modem_nreset_consumers,
|
||||
};
|
||||
|
||||
static struct fixed_voltage_config modem_nreset_config = {
|
||||
.supply_name = "modem_nreset",
|
||||
.microvolts = 3300000,
|
||||
.gpio = AMS_DELTA_GPIO_PIN_MODEM_NRESET,
|
||||
.startup_delay = 25000,
|
||||
.enable_high = 1,
|
||||
.enabled_at_boot = 1,
|
||||
.init_data = &modem_nreset_data,
|
||||
};
|
||||
|
||||
static struct platform_device modem_nreset_device = {
|
||||
.name = "reg-fixed-voltage",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &modem_nreset_config,
|
||||
},
|
||||
};
|
||||
|
||||
struct modem_private_data {
|
||||
struct regulator *regulator;
|
||||
};
|
||||
|
||||
static struct modem_private_data modem_priv;
|
||||
|
||||
void ams_delta_latch_write(int base, int ngpio, u16 mask, u16 value)
|
||||
{
|
||||
int bit = 0;
|
||||
u16 bitpos = 1 << bit;
|
||||
|
||||
for (; bit < ngpio; bit++, bitpos = bitpos << 1) {
|
||||
if (!(mask & bitpos))
|
||||
continue;
|
||||
else
|
||||
gpio_set_value(base + bit, (value & bitpos) != 0);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(ams_delta_latch_write);
|
||||
|
||||
static struct resource ams_delta_nand_resources[] = {
|
||||
[0] = {
|
||||
.start = OMAP1_MPUIO_BASE,
|
||||
@ -202,7 +337,7 @@ static const struct matrix_keymap_data ams_delta_keymap_data = {
|
||||
.keymap_size = ARRAY_SIZE(ams_delta_keymap),
|
||||
};
|
||||
|
||||
static struct omap_kp_platform_data ams_delta_kp_data __initdata = {
|
||||
static struct omap_kp_platform_data ams_delta_kp_data = {
|
||||
.rows = 8,
|
||||
.cols = 8,
|
||||
.keymap_data = &ams_delta_keymap_data,
|
||||
@ -224,9 +359,45 @@ static struct platform_device ams_delta_lcd_device = {
|
||||
.id = -1,
|
||||
};
|
||||
|
||||
static struct platform_device ams_delta_led_device = {
|
||||
.name = "ams-delta-led",
|
||||
.id = -1
|
||||
static const struct gpio_led gpio_leds[] __initconst = {
|
||||
{
|
||||
.name = "camera",
|
||||
.gpio = LATCH1_GPIO_BASE + 0,
|
||||
.default_state = LEDS_GPIO_DEFSTATE_OFF,
|
||||
#ifdef CONFIG_LEDS_TRIGGERS
|
||||
.default_trigger = "ams_delta_camera",
|
||||
#endif
|
||||
},
|
||||
{
|
||||
.name = "advert",
|
||||
.gpio = LATCH1_GPIO_BASE + 1,
|
||||
.default_state = LEDS_GPIO_DEFSTATE_OFF,
|
||||
},
|
||||
{
|
||||
.name = "email",
|
||||
.gpio = LATCH1_GPIO_BASE + 2,
|
||||
.default_state = LEDS_GPIO_DEFSTATE_OFF,
|
||||
},
|
||||
{
|
||||
.name = "handsfree",
|
||||
.gpio = LATCH1_GPIO_BASE + 3,
|
||||
.default_state = LEDS_GPIO_DEFSTATE_OFF,
|
||||
},
|
||||
{
|
||||
.name = "voicemail",
|
||||
.gpio = LATCH1_GPIO_BASE + 4,
|
||||
.default_state = LEDS_GPIO_DEFSTATE_OFF,
|
||||
},
|
||||
{
|
||||
.name = "voice",
|
||||
.gpio = LATCH1_GPIO_BASE + 5,
|
||||
.default_state = LEDS_GPIO_DEFSTATE_OFF,
|
||||
},
|
||||
};
|
||||
|
||||
static const struct gpio_led_platform_data leds_pdata __initconst = {
|
||||
.leds = gpio_leds,
|
||||
.num_leds = ARRAY_SIZE(gpio_leds),
|
||||
};
|
||||
|
||||
static struct i2c_board_info ams_delta_camera_board_info[] = {
|
||||
@ -275,13 +446,17 @@ static struct omap1_cam_platform_data ams_delta_camera_platform_data = {
|
||||
};
|
||||
|
||||
static struct platform_device *ams_delta_devices[] __initdata = {
|
||||
&ams_delta_nand_device,
|
||||
&latch1_gpio_device,
|
||||
&latch2_gpio_device,
|
||||
&ams_delta_kp_device,
|
||||
&ams_delta_lcd_device,
|
||||
&ams_delta_led_device,
|
||||
&ams_delta_camera_device,
|
||||
};
|
||||
|
||||
static struct platform_device *late_devices[] __initdata = {
|
||||
&ams_delta_nand_device,
|
||||
&ams_delta_lcd_device,
|
||||
};
|
||||
|
||||
static void __init ams_delta_init(void)
|
||||
{
|
||||
/* mux pins for uarts */
|
||||
@ -307,15 +482,13 @@ static void __init ams_delta_init(void)
|
||||
omap_serial_init();
|
||||
omap_register_i2c_bus(1, 100, NULL, 0);
|
||||
|
||||
/* Clear latch2 (NAND, LCD, modem enable) */
|
||||
ams_delta_latch2_write(~0, 0);
|
||||
|
||||
omap1_usb_init(&ams_delta_usb_config);
|
||||
omap1_set_camera_info(&ams_delta_camera_platform_data);
|
||||
#ifdef CONFIG_LEDS_TRIGGERS
|
||||
led_trigger_register_simple("ams_delta_camera",
|
||||
&ams_delta_camera_led_trigger);
|
||||
#endif
|
||||
gpio_led_register_device(-1, &leds_pdata);
|
||||
platform_add_devices(ams_delta_devices, ARRAY_SIZE(ams_delta_devices));
|
||||
|
||||
ams_delta_init_fiq();
|
||||
@ -323,16 +496,34 @@ static void __init ams_delta_init(void)
|
||||
omap_writew(omap_readw(ARM_RSTCT1) | 0x0004, ARM_RSTCT1);
|
||||
}
|
||||
|
||||
static void modem_pm(struct uart_port *port, unsigned int state, unsigned old)
|
||||
{
|
||||
struct modem_private_data *priv = port->private_data;
|
||||
|
||||
if (IS_ERR(priv->regulator))
|
||||
return;
|
||||
|
||||
if (state == old)
|
||||
return;
|
||||
|
||||
if (state == 0)
|
||||
regulator_enable(priv->regulator);
|
||||
else if (old == 0)
|
||||
regulator_disable(priv->regulator);
|
||||
}
|
||||
|
||||
static struct plat_serial8250_port ams_delta_modem_ports[] = {
|
||||
{
|
||||
.membase = IOMEM(AMS_DELTA_MODEM_VIRT),
|
||||
.mapbase = AMS_DELTA_MODEM_PHYS,
|
||||
.membase = IOMEM(MODEM_VIRT),
|
||||
.mapbase = MODEM_PHYS,
|
||||
.irq = -EINVAL, /* changed later */
|
||||
.flags = UPF_BOOT_AUTOCONF,
|
||||
.irqflags = IRQF_TRIGGER_RISING,
|
||||
.iotype = UPIO_MEM,
|
||||
.regshift = 1,
|
||||
.uartclk = BASE_BAUD * 16,
|
||||
.pm = modem_pm,
|
||||
.private_data = &modem_priv,
|
||||
},
|
||||
{ },
|
||||
};
|
||||
@ -345,13 +536,27 @@ static struct platform_device ams_delta_modem_device = {
|
||||
},
|
||||
};
|
||||
|
||||
static int __init ams_delta_modem_init(void)
|
||||
static int __init late_init(void)
|
||||
{
|
||||
int err;
|
||||
|
||||
if (!machine_is_ams_delta())
|
||||
return -ENODEV;
|
||||
|
||||
err = gpio_request_array(latch_gpios, ARRAY_SIZE(latch_gpios));
|
||||
if (err) {
|
||||
pr_err("Couldn't take over latch1/latch2 GPIO pins\n");
|
||||
return err;
|
||||
}
|
||||
|
||||
platform_add_devices(late_devices, ARRAY_SIZE(late_devices));
|
||||
|
||||
err = platform_device_register(&modem_nreset_device);
|
||||
if (err) {
|
||||
pr_err("Couldn't register the modem regulator device\n");
|
||||
return err;
|
||||
}
|
||||
|
||||
omap_cfg_reg(M14_1510_GPIO2);
|
||||
ams_delta_modem_ports[0].irq =
|
||||
gpio_to_irq(AMS_DELTA_GPIO_PIN_MODEM_IRQ);
|
||||
@ -363,13 +568,35 @@ static int __init ams_delta_modem_init(void)
|
||||
}
|
||||
gpio_direction_input(AMS_DELTA_GPIO_PIN_MODEM_IRQ);
|
||||
|
||||
ams_delta_latch2_write(
|
||||
AMS_DELTA_LATCH2_MODEM_NRESET | AMS_DELTA_LATCH2_MODEM_CODEC,
|
||||
AMS_DELTA_LATCH2_MODEM_NRESET | AMS_DELTA_LATCH2_MODEM_CODEC);
|
||||
/* Initialize the modem_nreset regulator consumer before use */
|
||||
modem_priv.regulator = ERR_PTR(-ENODEV);
|
||||
|
||||
return platform_device_register(&ams_delta_modem_device);
|
||||
ams_delta_latch2_write(AMS_DELTA_LATCH2_MODEM_CODEC,
|
||||
AMS_DELTA_LATCH2_MODEM_CODEC);
|
||||
|
||||
err = platform_device_register(&ams_delta_modem_device);
|
||||
if (err)
|
||||
goto gpio_free;
|
||||
|
||||
/*
|
||||
* Once the modem device is registered, the modem_nreset
|
||||
* regulator can be requested on behalf of that device.
|
||||
*/
|
||||
modem_priv.regulator = regulator_get(&ams_delta_modem_device.dev,
|
||||
"RESET#");
|
||||
if (IS_ERR(modem_priv.regulator)) {
|
||||
err = PTR_ERR(modem_priv.regulator);
|
||||
goto unregister;
|
||||
}
|
||||
return 0;
|
||||
|
||||
unregister:
|
||||
platform_device_unregister(&ams_delta_modem_device);
|
||||
gpio_free:
|
||||
gpio_free(AMS_DELTA_GPIO_PIN_MODEM_IRQ);
|
||||
return err;
|
||||
}
|
||||
arch_initcall(ams_delta_modem_init);
|
||||
late_initcall(late_init);
|
||||
|
||||
static void __init ams_delta_map_io(void)
|
||||
{
|
||||
@ -388,6 +615,3 @@ MACHINE_START(AMS_DELTA, "Amstrad E3 (Delta)")
|
||||
.timer = &omap1_timer,
|
||||
.restart = omap1_restart,
|
||||
MACHINE_END
|
||||
|
||||
EXPORT_SYMBOL(ams_delta_latch1_write);
|
||||
EXPORT_SYMBOL(ams_delta_latch2_write);
|
||||
|
@ -244,10 +244,11 @@ config MACH_NOKIA_N8X0
|
||||
select MACH_NOKIA_N810_WIMAX
|
||||
|
||||
config MACH_NOKIA_RM680
|
||||
bool "Nokia RM-680 board"
|
||||
bool "Nokia RM-680/696 board"
|
||||
depends on ARCH_OMAP3
|
||||
default y
|
||||
select OMAP_PACKAGE_CBB
|
||||
select MACH_NOKIA_RM696
|
||||
|
||||
config MACH_NOKIA_RX51
|
||||
bool "Nokia RX-51 board"
|
||||
|
@ -269,4 +269,7 @@ smsc911x-$(CONFIG_SMSC911X) := gpmc-smsc911x.o
|
||||
obj-y += $(smsc911x-m) $(smsc911x-y)
|
||||
obj-$(CONFIG_ARCH_OMAP4) += hwspinlock.o
|
||||
|
||||
emac-$(CONFIG_TI_DAVINCI_EMAC) := am35xx-emac.o
|
||||
obj-y += $(emac-m) $(emac-y)
|
||||
|
||||
obj-y += common-board-devices.o twl-common.o
|
||||
|
117
arch/arm/mach-omap2/am35xx-emac.c
Normal file
117
arch/arm/mach-omap2/am35xx-emac.c
Normal file
@ -0,0 +1,117 @@
|
||||
/*
|
||||
* Copyright (C) 2011 Ilya Yanok, Emcraft Systems
|
||||
*
|
||||
* Based on mach-omap2/board-am3517evm.c
|
||||
* Copyright (C) 2009 Texas Instruments Incorporated
|
||||
* Author: Ranjith Lohithakshan <ranjithl@ti.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed "as is" WITHOUT ANY WARRANTY of any kind,
|
||||
* whether express or implied; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*/
|
||||
|
||||
#include <linux/clk.h>
|
||||
#include <linux/davinci_emac.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <plat/irqs.h>
|
||||
#include <mach/am35xx.h>
|
||||
|
||||
#include "control.h"
|
||||
|
||||
static struct mdio_platform_data am35xx_emac_mdio_pdata;
|
||||
|
||||
static struct resource am35xx_emac_mdio_resources[] = {
|
||||
DEFINE_RES_MEM(AM35XX_IPSS_EMAC_BASE + AM35XX_EMAC_MDIO_OFFSET, SZ_4K),
|
||||
};
|
||||
|
||||
static struct platform_device am35xx_emac_mdio_device = {
|
||||
.name = "davinci_mdio",
|
||||
.id = 0,
|
||||
.num_resources = ARRAY_SIZE(am35xx_emac_mdio_resources),
|
||||
.resource = am35xx_emac_mdio_resources,
|
||||
.dev.platform_data = &am35xx_emac_mdio_pdata,
|
||||
};
|
||||
|
||||
static void am35xx_enable_emac_int(void)
|
||||
{
|
||||
u32 regval;
|
||||
|
||||
regval = omap_ctrl_readl(AM35XX_CONTROL_LVL_INTR_CLEAR);
|
||||
regval = (regval | AM35XX_CPGMAC_C0_RX_PULSE_CLR |
|
||||
AM35XX_CPGMAC_C0_TX_PULSE_CLR |
|
||||
AM35XX_CPGMAC_C0_MISC_PULSE_CLR |
|
||||
AM35XX_CPGMAC_C0_RX_THRESH_CLR);
|
||||
omap_ctrl_writel(regval, AM35XX_CONTROL_LVL_INTR_CLEAR);
|
||||
regval = omap_ctrl_readl(AM35XX_CONTROL_LVL_INTR_CLEAR);
|
||||
}
|
||||
|
||||
static void am35xx_disable_emac_int(void)
|
||||
{
|
||||
u32 regval;
|
||||
|
||||
regval = omap_ctrl_readl(AM35XX_CONTROL_LVL_INTR_CLEAR);
|
||||
regval = (regval | AM35XX_CPGMAC_C0_RX_PULSE_CLR |
|
||||
AM35XX_CPGMAC_C0_TX_PULSE_CLR);
|
||||
omap_ctrl_writel(regval, AM35XX_CONTROL_LVL_INTR_CLEAR);
|
||||
regval = omap_ctrl_readl(AM35XX_CONTROL_LVL_INTR_CLEAR);
|
||||
}
|
||||
|
||||
static struct emac_platform_data am35xx_emac_pdata = {
|
||||
.ctrl_reg_offset = AM35XX_EMAC_CNTRL_OFFSET,
|
||||
.ctrl_mod_reg_offset = AM35XX_EMAC_CNTRL_MOD_OFFSET,
|
||||
.ctrl_ram_offset = AM35XX_EMAC_CNTRL_RAM_OFFSET,
|
||||
.ctrl_ram_size = AM35XX_EMAC_CNTRL_RAM_SIZE,
|
||||
.hw_ram_addr = AM35XX_EMAC_HW_RAM_ADDR,
|
||||
.version = EMAC_VERSION_2,
|
||||
.interrupt_enable = am35xx_enable_emac_int,
|
||||
.interrupt_disable = am35xx_disable_emac_int,
|
||||
};
|
||||
|
||||
static struct resource am35xx_emac_resources[] = {
|
||||
DEFINE_RES_MEM(AM35XX_IPSS_EMAC_BASE, 0x30000),
|
||||
DEFINE_RES_IRQ(INT_35XX_EMAC_C0_RXTHRESH_IRQ),
|
||||
DEFINE_RES_IRQ(INT_35XX_EMAC_C0_RX_PULSE_IRQ),
|
||||
DEFINE_RES_IRQ(INT_35XX_EMAC_C0_TX_PULSE_IRQ),
|
||||
DEFINE_RES_IRQ(INT_35XX_EMAC_C0_MISC_PULSE_IRQ),
|
||||
};
|
||||
|
||||
static struct platform_device am35xx_emac_device = {
|
||||
.name = "davinci_emac",
|
||||
.id = -1,
|
||||
.num_resources = ARRAY_SIZE(am35xx_emac_resources),
|
||||
.resource = am35xx_emac_resources,
|
||||
.dev = {
|
||||
.platform_data = &am35xx_emac_pdata,
|
||||
},
|
||||
};
|
||||
|
||||
void __init am35xx_emac_init(unsigned long mdio_bus_freq, u8 rmii_en)
|
||||
{
|
||||
unsigned int regval;
|
||||
int err;
|
||||
|
||||
am35xx_emac_pdata.rmii_en = rmii_en;
|
||||
am35xx_emac_mdio_pdata.bus_freq = mdio_bus_freq;
|
||||
err = platform_device_register(&am35xx_emac_device);
|
||||
if (err) {
|
||||
pr_err("AM35x: failed registering EMAC device: %d\n", err);
|
||||
return;
|
||||
}
|
||||
|
||||
err = platform_device_register(&am35xx_emac_mdio_device);
|
||||
if (err) {
|
||||
pr_err("AM35x: failed registering EMAC MDIO device: %d\n", err);
|
||||
platform_device_unregister(&am35xx_emac_device);
|
||||
return;
|
||||
}
|
||||
|
||||
regval = omap_ctrl_readl(AM35XX_CONTROL_IP_SW_RESET);
|
||||
regval = regval & (~(AM35XX_CPGMACSS_SW_RST));
|
||||
omap_ctrl_writel(regval, AM35XX_CONTROL_IP_SW_RESET);
|
||||
regval = omap_ctrl_readl(AM35XX_CONTROL_IP_SW_RESET);
|
||||
}
|
15
arch/arm/mach-omap2/am35xx-emac.h
Normal file
15
arch/arm/mach-omap2/am35xx-emac.h
Normal file
@ -0,0 +1,15 @@
|
||||
/*
|
||||
* Copyright (C) 2011 Ilya Yanok, Emcraft Systems
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#define AM35XX_DEFAULT_MDIO_FREQUENCY 1000000
|
||||
|
||||
#if defined(CONFIG_TI_DAVINCI_EMAC) || defined(CONFIG_TI_DAVINCI_EMAC_MODULE)
|
||||
void am35xx_emac_init(unsigned long mdio_bus_freq, u8 rmii_en);
|
||||
#else
|
||||
static inline void am35xx_emac_init(unsigned long mdio_bus_freq, u8 rmii_en) {}
|
||||
#endif
|
@ -322,7 +322,10 @@ static struct spi_board_info sdp4430_spi_board_info[] __initdata = {
|
||||
.bus_num = 1,
|
||||
.chip_select = 0,
|
||||
.max_speed_hz = 24000000,
|
||||
.irq = ETH_KS8851_IRQ,
|
||||
/*
|
||||
* .irq is set to gpio_to_irq(ETH_KS8851_IRQ)
|
||||
* in omap_4430sdp_init
|
||||
*/
|
||||
},
|
||||
};
|
||||
|
||||
|
@ -39,124 +39,11 @@
|
||||
#include <video/omap-panel-generic-dpi.h>
|
||||
#include <video/omap-panel-dvi.h>
|
||||
|
||||
#include "am35xx-emac.h"
|
||||
#include "mux.h"
|
||||
#include "control.h"
|
||||
#include "hsmmc.h"
|
||||
|
||||
#define AM35XX_EVM_MDIO_FREQUENCY (1000000)
|
||||
|
||||
static struct mdio_platform_data am3517_evm_mdio_pdata = {
|
||||
.bus_freq = AM35XX_EVM_MDIO_FREQUENCY,
|
||||
};
|
||||
|
||||
static struct resource am3517_mdio_resources[] = {
|
||||
{
|
||||
.start = AM35XX_IPSS_EMAC_BASE + AM35XX_EMAC_MDIO_OFFSET,
|
||||
.end = AM35XX_IPSS_EMAC_BASE + AM35XX_EMAC_MDIO_OFFSET +
|
||||
SZ_4K - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device am3517_mdio_device = {
|
||||
.name = "davinci_mdio",
|
||||
.id = 0,
|
||||
.num_resources = ARRAY_SIZE(am3517_mdio_resources),
|
||||
.resource = am3517_mdio_resources,
|
||||
.dev.platform_data = &am3517_evm_mdio_pdata,
|
||||
};
|
||||
|
||||
static struct emac_platform_data am3517_evm_emac_pdata = {
|
||||
.rmii_en = 1,
|
||||
};
|
||||
|
||||
static struct resource am3517_emac_resources[] = {
|
||||
{
|
||||
.start = AM35XX_IPSS_EMAC_BASE,
|
||||
.end = AM35XX_IPSS_EMAC_BASE + 0x2FFFF,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
{
|
||||
.start = INT_35XX_EMAC_C0_RXTHRESH_IRQ,
|
||||
.end = INT_35XX_EMAC_C0_RXTHRESH_IRQ,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
{
|
||||
.start = INT_35XX_EMAC_C0_RX_PULSE_IRQ,
|
||||
.end = INT_35XX_EMAC_C0_RX_PULSE_IRQ,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
{
|
||||
.start = INT_35XX_EMAC_C0_TX_PULSE_IRQ,
|
||||
.end = INT_35XX_EMAC_C0_TX_PULSE_IRQ,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
{
|
||||
.start = INT_35XX_EMAC_C0_MISC_PULSE_IRQ,
|
||||
.end = INT_35XX_EMAC_C0_MISC_PULSE_IRQ,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device am3517_emac_device = {
|
||||
.name = "davinci_emac",
|
||||
.id = -1,
|
||||
.num_resources = ARRAY_SIZE(am3517_emac_resources),
|
||||
.resource = am3517_emac_resources,
|
||||
};
|
||||
|
||||
static void am3517_enable_ethernet_int(void)
|
||||
{
|
||||
u32 regval;
|
||||
|
||||
regval = omap_ctrl_readl(AM35XX_CONTROL_LVL_INTR_CLEAR);
|
||||
regval = (regval | AM35XX_CPGMAC_C0_RX_PULSE_CLR |
|
||||
AM35XX_CPGMAC_C0_TX_PULSE_CLR |
|
||||
AM35XX_CPGMAC_C0_MISC_PULSE_CLR |
|
||||
AM35XX_CPGMAC_C0_RX_THRESH_CLR);
|
||||
omap_ctrl_writel(regval, AM35XX_CONTROL_LVL_INTR_CLEAR);
|
||||
regval = omap_ctrl_readl(AM35XX_CONTROL_LVL_INTR_CLEAR);
|
||||
}
|
||||
|
||||
static void am3517_disable_ethernet_int(void)
|
||||
{
|
||||
u32 regval;
|
||||
|
||||
regval = omap_ctrl_readl(AM35XX_CONTROL_LVL_INTR_CLEAR);
|
||||
regval = (regval | AM35XX_CPGMAC_C0_RX_PULSE_CLR |
|
||||
AM35XX_CPGMAC_C0_TX_PULSE_CLR);
|
||||
omap_ctrl_writel(regval, AM35XX_CONTROL_LVL_INTR_CLEAR);
|
||||
regval = omap_ctrl_readl(AM35XX_CONTROL_LVL_INTR_CLEAR);
|
||||
}
|
||||
|
||||
static void am3517_evm_ethernet_init(struct emac_platform_data *pdata)
|
||||
{
|
||||
unsigned int regval;
|
||||
|
||||
pdata->ctrl_reg_offset = AM35XX_EMAC_CNTRL_OFFSET;
|
||||
pdata->ctrl_mod_reg_offset = AM35XX_EMAC_CNTRL_MOD_OFFSET;
|
||||
pdata->ctrl_ram_offset = AM35XX_EMAC_CNTRL_RAM_OFFSET;
|
||||
pdata->ctrl_ram_size = AM35XX_EMAC_CNTRL_RAM_SIZE;
|
||||
pdata->version = EMAC_VERSION_2;
|
||||
pdata->hw_ram_addr = AM35XX_EMAC_HW_RAM_ADDR;
|
||||
pdata->interrupt_enable = am3517_enable_ethernet_int;
|
||||
pdata->interrupt_disable = am3517_disable_ethernet_int;
|
||||
am3517_emac_device.dev.platform_data = pdata;
|
||||
platform_device_register(&am3517_emac_device);
|
||||
platform_device_register(&am3517_mdio_device);
|
||||
clk_add_alias(NULL, dev_name(&am3517_mdio_device.dev),
|
||||
NULL, &am3517_emac_device.dev);
|
||||
|
||||
regval = omap_ctrl_readl(AM35XX_CONTROL_IP_SW_RESET);
|
||||
regval = regval & (~(AM35XX_CPGMACSS_SW_RST));
|
||||
omap_ctrl_writel(regval, AM35XX_CONTROL_IP_SW_RESET);
|
||||
regval = omap_ctrl_readl(AM35XX_CONTROL_IP_SW_RESET);
|
||||
|
||||
return ;
|
||||
}
|
||||
|
||||
|
||||
|
||||
#define LCD_PANEL_PWR 176
|
||||
#define LCD_PANEL_BKLIGHT_PWR 182
|
||||
#define LCD_PANEL_PWM 181
|
||||
@ -498,7 +385,7 @@ static void __init am3517_evm_init(void)
|
||||
i2c_register_board_info(1, am3517evm_i2c1_boardinfo,
|
||||
ARRAY_SIZE(am3517evm_i2c1_boardinfo));
|
||||
/*Ethernet*/
|
||||
am3517_evm_ethernet_init(&am3517_evm_emac_pdata);
|
||||
am35xx_emac_init(AM35XX_DEFAULT_MDIO_FREQUENCY, 1);
|
||||
|
||||
/* MUSB */
|
||||
am3517_evm_musb_init();
|
||||
|
@ -49,6 +49,7 @@
|
||||
#include "mux.h"
|
||||
#include "control.h"
|
||||
#include "common-board-devices.h"
|
||||
#include "am35xx-emac.h"
|
||||
|
||||
#if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE)
|
||||
static struct gpio_led cm_t3517_leds[] = {
|
||||
@ -291,6 +292,7 @@ static void __init cm_t3517_init(void)
|
||||
cm_t3517_init_rtc();
|
||||
cm_t3517_init_usbh();
|
||||
cm_t3517_init_hecc();
|
||||
am35xx_emac_init(AM35XX_DEFAULT_MDIO_FREQUENCY, 1);
|
||||
}
|
||||
|
||||
MACHINE_START(CM_T3517, "Compulab CM-T3517")
|
||||
|
@ -205,6 +205,7 @@ static void __init omap3logic_init(void)
|
||||
|
||||
MACHINE_START(OMAP3_TORPEDO, "Logic OMAP3 Torpedo board")
|
||||
.atag_offset = 0x100,
|
||||
.reserve = omap_reserve,
|
||||
.map_io = omap3_map_io,
|
||||
.init_early = omap35xx_init_early,
|
||||
.init_irq = omap3_init_irq,
|
||||
@ -216,6 +217,7 @@ MACHINE_END
|
||||
|
||||
MACHINE_START(OMAP3530_LV_SOM, "OMAP Logic 3530 LV SOM board")
|
||||
.atag_offset = 0x100,
|
||||
.reserve = omap_reserve,
|
||||
.map_io = omap3_map_io,
|
||||
.init_early = omap35xx_init_early,
|
||||
.init_irq = omap3_init_irq,
|
||||
|
@ -121,6 +121,11 @@ static struct platform_device pandora_leds_gpio = {
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device pandora_backlight = {
|
||||
.name = "pandora-backlight",
|
||||
.id = -1,
|
||||
};
|
||||
|
||||
#define GPIO_BUTTON(gpio_num, ev_type, ev_code, act_low, descr) \
|
||||
{ \
|
||||
.gpio = gpio_num, \
|
||||
@ -476,6 +481,10 @@ static struct platform_device pandora_vwlan_device = {
|
||||
|
||||
static struct twl4030_bci_platform_data pandora_bci_data;
|
||||
|
||||
static struct twl4030_power_data pandora_power_data = {
|
||||
.use_poweroff = true,
|
||||
};
|
||||
|
||||
static struct twl4030_platform_data omap3pandora_twldata = {
|
||||
.gpio = &omap3pandora_gpio_data,
|
||||
.vmmc1 = &pandora_vmmc1,
|
||||
@ -486,6 +495,7 @@ static struct twl4030_platform_data omap3pandora_twldata = {
|
||||
.vsim = &pandora_vsim,
|
||||
.keypad = &pandora_kp_data,
|
||||
.bci = &pandora_bci_data,
|
||||
.power = &pandora_power_data,
|
||||
};
|
||||
|
||||
static struct i2c_board_info __initdata omap3pandora_i2c3_boardinfo[] = {
|
||||
@ -557,6 +567,7 @@ static struct platform_device *omap3pandora_devices[] __initdata = {
|
||||
&pandora_leds_gpio,
|
||||
&pandora_keys_gpio,
|
||||
&pandora_vwlan_device,
|
||||
&pandora_backlight,
|
||||
};
|
||||
|
||||
static const struct usbhs_omap_board_data usbhs_bdata __initconst = {
|
||||
|
@ -91,9 +91,15 @@ static struct platform_device leds_gpio = {
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device btwilink_device = {
|
||||
.name = "btwilink",
|
||||
.id = -1,
|
||||
};
|
||||
|
||||
static struct platform_device *panda_devices[] __initdata = {
|
||||
&leds_gpio,
|
||||
&wl1271_device,
|
||||
&btwilink_device,
|
||||
};
|
||||
|
||||
static const struct usbhs_omap_board_data usbhs_bdata __initconst = {
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Board support file for Nokia RM-680.
|
||||
* Board support file for Nokia RM-680/696.
|
||||
*
|
||||
* Copyright (C) 2010 Nokia
|
||||
*
|
||||
@ -154,3 +154,15 @@ MACHINE_START(NOKIA_RM680, "Nokia RM-680 board")
|
||||
.timer = &omap3_timer,
|
||||
.restart = omap_prcm_restart,
|
||||
MACHINE_END
|
||||
|
||||
MACHINE_START(NOKIA_RM696, "Nokia RM-696 board")
|
||||
.atag_offset = 0x100,
|
||||
.reserve = omap_reserve,
|
||||
.map_io = omap3_map_io,
|
||||
.init_early = omap3630_init_early,
|
||||
.init_irq = omap3_init_irq,
|
||||
.handle_irq = omap3_intc_handle_irq,
|
||||
.init_machine = rm680_init,
|
||||
.timer = &omap3_timer,
|
||||
.restart = omap_prcm_restart,
|
||||
MACHINE_END
|
||||
|
@ -1105,6 +1105,11 @@ static struct tsc2005_platform_data tsc2005_pdata = {
|
||||
.esd_timeout_ms = 8000,
|
||||
};
|
||||
|
||||
static struct gpio rx51_tsc2005_gpios[] __initdata = {
|
||||
{ RX51_TSC2005_IRQ_GPIO, GPIOF_IN, "tsc2005 IRQ" },
|
||||
{ RX51_TSC2005_RESET_GPIO, GPIOF_OUT_INIT_HIGH, "tsc2005 reset" },
|
||||
};
|
||||
|
||||
static void rx51_tsc2005_set_reset(bool enable)
|
||||
{
|
||||
gpio_set_value(RX51_TSC2005_RESET_GPIO, enable);
|
||||
@ -1114,20 +1119,18 @@ static void __init rx51_init_tsc2005(void)
|
||||
{
|
||||
int r;
|
||||
|
||||
r = gpio_request_one(RX51_TSC2005_IRQ_GPIO, GPIOF_IN, "tsc2005 IRQ");
|
||||
omap_mux_init_gpio(RX51_TSC2005_RESET_GPIO, OMAP_PIN_OUTPUT);
|
||||
omap_mux_init_gpio(RX51_TSC2005_IRQ_GPIO, OMAP_PIN_INPUT_PULLUP);
|
||||
|
||||
r = gpio_request_array(rx51_tsc2005_gpios,
|
||||
ARRAY_SIZE(rx51_tsc2005_gpios));
|
||||
if (r < 0) {
|
||||
printk(KERN_ERR "unable to get %s GPIO\n", "tsc2005 IRQ");
|
||||
rx51_peripherals_spi_board_info[RX51_SPI_TSC2005].irq = 0;
|
||||
printk(KERN_ERR "tsc2005 board initialization failed\n");
|
||||
tsc2005_pdata.esd_timeout_ms = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
r = gpio_request_one(RX51_TSC2005_RESET_GPIO, GPIOF_OUT_INIT_HIGH,
|
||||
"tsc2005 reset");
|
||||
if (r >= 0) {
|
||||
tsc2005_pdata.set_reset = rx51_tsc2005_set_reset;
|
||||
} else {
|
||||
printk(KERN_ERR "unable to get %s GPIO\n", "tsc2005 reset");
|
||||
tsc2005_pdata.esd_timeout_ms = 0;
|
||||
}
|
||||
tsc2005_pdata.set_reset = rx51_tsc2005_set_reset;
|
||||
}
|
||||
|
||||
void __init rx51_peripherals_init(void)
|
||||
|
@ -97,9 +97,9 @@ static unsigned long hx4700_pin_config[] __initdata = {
|
||||
|
||||
/* BTUART */
|
||||
GPIO42_BTUART_RXD,
|
||||
GPIO43_BTUART_TXD,
|
||||
GPIO43_BTUART_TXD_LPM_LOW,
|
||||
GPIO44_BTUART_CTS,
|
||||
GPIO45_BTUART_RTS,
|
||||
GPIO45_BTUART_RTS_LPM_LOW,
|
||||
|
||||
/* PWM 1 (Backlight) */
|
||||
GPIO17_PWM1_OUT,
|
||||
@ -245,6 +245,21 @@ static u16 asic3_gpio_config[] = {
|
||||
ASIC3_GPIOD15_nPIOW,
|
||||
};
|
||||
|
||||
static struct asic3_led asic3_leds[ASIC3_NUM_LEDS] = {
|
||||
[0] = {
|
||||
.name = "hx4700:amber",
|
||||
.default_trigger = "ds2760-battery.0-charging-blink-full-solid",
|
||||
},
|
||||
[1] = {
|
||||
.name = "hx4700:green",
|
||||
.default_trigger = "unused",
|
||||
},
|
||||
[2] = {
|
||||
.name = "hx4700:blue",
|
||||
.default_trigger = "hx4700-radio",
|
||||
},
|
||||
};
|
||||
|
||||
static struct resource asic3_resources[] = {
|
||||
/* GPIO part */
|
||||
[0] = {
|
||||
@ -275,6 +290,7 @@ static struct asic3_platform_data asic3_platform_data = {
|
||||
.gpio_config_num = ARRAY_SIZE(asic3_gpio_config),
|
||||
.irq_base = IRQ_BOARD_START,
|
||||
.gpio_base = HX4700_ASIC3_GPIO_BASE,
|
||||
.leds = asic3_leds,
|
||||
};
|
||||
|
||||
static struct platform_device asic3 = {
|
||||
@ -705,10 +721,9 @@ static void hx4700_set_vpp(struct platform_device *pdev, int vpp)
|
||||
gpio_set_value(GPIO91_HX4700_FLASH_VPEN, vpp);
|
||||
}
|
||||
|
||||
static struct resource strataflash_resource = {
|
||||
.start = PXA_CS0_PHYS,
|
||||
.end = PXA_CS0_PHYS + SZ_128M - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
static struct resource strataflash_resource[] = {
|
||||
[0] = DEFINE_RES_MEM(PXA_CS0_PHYS, SZ_64M),
|
||||
[1] = DEFINE_RES_MEM(PXA_CS0_PHYS + SZ_64M, SZ_64M),
|
||||
};
|
||||
|
||||
static struct physmap_flash_data strataflash_data = {
|
||||
@ -719,8 +734,8 @@ static struct physmap_flash_data strataflash_data = {
|
||||
static struct platform_device strataflash = {
|
||||
.name = "physmap-flash",
|
||||
.id = -1,
|
||||
.resource = &strataflash_resource,
|
||||
.num_resources = 1,
|
||||
.resource = strataflash_resource,
|
||||
.num_resources = ARRAY_SIZE(strataflash_resource),
|
||||
.dev = {
|
||||
.platform_data = &strataflash_data,
|
||||
},
|
||||
@ -787,17 +802,6 @@ static struct platform_device audio = {
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* PCMCIA
|
||||
*/
|
||||
|
||||
static struct platform_device pcmcia = {
|
||||
.name = "hx4700-pcmcia",
|
||||
.dev = {
|
||||
.parent = &asic3.dev,
|
||||
},
|
||||
};
|
||||
|
||||
/*
|
||||
* Platform devices
|
||||
*/
|
||||
@ -814,7 +818,6 @@ static struct platform_device *devices[] __initdata = {
|
||||
&power_supply,
|
||||
&strataflash,
|
||||
&audio,
|
||||
&pcmcia,
|
||||
};
|
||||
|
||||
static struct gpio global_gpios[] = {
|
||||
@ -830,7 +833,6 @@ static struct gpio global_gpios[] = {
|
||||
{ GPIO32_HX4700_RS232_ON, GPIOF_OUT_INIT_HIGH, "RS232_ON" },
|
||||
{ GPIO71_HX4700_ASIC3_nRESET, GPIOF_OUT_INIT_HIGH, "ASIC3_nRESET" },
|
||||
{ GPIO82_HX4700_EUART_RESET, GPIOF_OUT_INIT_HIGH, "EUART_RESET" },
|
||||
{ GPIO105_HX4700_nIR_ON, GPIOF_OUT_INIT_HIGH, "nIR_EN" },
|
||||
};
|
||||
|
||||
static void __init hx4700_init(void)
|
||||
|
@ -158,7 +158,9 @@
|
||||
#define GPIO44_BTUART_CTS MFP_CFG_IN(GPIO44, AF1)
|
||||
#define GPIO42_BTUART_RXD MFP_CFG_IN(GPIO42, AF1)
|
||||
#define GPIO45_BTUART_RTS MFP_CFG_OUT(GPIO45, AF2, DRIVE_HIGH)
|
||||
#define GPIO45_BTUART_RTS_LPM_LOW MFP_CFG_OUT(GPIO45, AF2, DRIVE_LOW)
|
||||
#define GPIO43_BTUART_TXD MFP_CFG_OUT(GPIO43, AF2, DRIVE_HIGH)
|
||||
#define GPIO43_BTUART_TXD_LPM_LOW MFP_CFG_OUT(GPIO43, AF2, DRIVE_LOW)
|
||||
|
||||
/* STUART */
|
||||
#define GPIO46_STUART_RXD MFP_CFG_IN(GPIO46, AF2)
|
||||
|
@ -296,5 +296,6 @@ config MACH_WLF_CRAGG_6410
|
||||
select S3C64XX_DEV_SPI0
|
||||
select SAMSUNG_GPIO_EXTRA128
|
||||
select I2C
|
||||
select LEDS_GPIO_REGISTER
|
||||
help
|
||||
Machine support for the Wolfson Cragganmore S3C6410 variant.
|
||||
|
@ -11,6 +11,7 @@
|
||||
#include <linux/export.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/spi/spi.h>
|
||||
|
||||
#include <linux/mfd/wm831x/irq.h>
|
||||
#include <linux/mfd/wm831x/gpio.h>
|
||||
@ -21,8 +22,25 @@
|
||||
#include <sound/wm8962.h>
|
||||
#include <sound/wm9081.h>
|
||||
|
||||
#include <plat/s3c64xx-spi.h>
|
||||
|
||||
#include <mach/crag6410.h>
|
||||
|
||||
static struct s3c64xx_spi_csinfo wm0010_spi_csinfo = {
|
||||
.set_level = gpio_set_value,
|
||||
.line = S3C64XX_GPC(3),
|
||||
};
|
||||
|
||||
static struct spi_board_info wm1253_devs[] = {
|
||||
[0] = {
|
||||
.modalias = "wm0010",
|
||||
.bus_num = 0,
|
||||
.chip_select = 0,
|
||||
.mode = SPI_MODE_0,
|
||||
.controller_data = &wm0010_spi_csinfo,
|
||||
},
|
||||
};
|
||||
|
||||
static struct wm5100_pdata wm5100_pdata = {
|
||||
.ldo_ena = S3C64XX_GPN(7),
|
||||
.irq_flags = IRQF_TRIGGER_HIGH,
|
||||
@ -158,14 +176,21 @@ static __devinitdata const struct {
|
||||
const char *name;
|
||||
const struct i2c_board_info *i2c_devs;
|
||||
int num_i2c_devs;
|
||||
const struct spi_board_info *spi_devs;
|
||||
int num_spi_devs;
|
||||
} gf_mods[] = {
|
||||
{ .id = 0x01, .name = "1250-EV1 Springbank" },
|
||||
{ .id = 0x02, .name = "1251-EV1 Jura" },
|
||||
{ .id = 0x03, .name = "1252-EV1 Glenlivet" },
|
||||
{ .id = 0x11, .name = "6249-EV2 Glenfarclas", },
|
||||
{ .id = 0x14, .name = "6271-EV1 Lochnagar" },
|
||||
{ .id = 0x15, .name = "XXXX-EV1 Bells" },
|
||||
{ .id = 0x21, .name = "1275-EV1 Mortlach" },
|
||||
{ .id = 0x25, .name = "1274-EV1 Glencadam" },
|
||||
{ .id = 0x31, .name = "1253-EV1 Tomatin", },
|
||||
{ .id = 0x31, .name = "1253-EV1 Tomatin",
|
||||
.spi_devs = wm1253_devs, .num_spi_devs = ARRAY_SIZE(wm1253_devs) },
|
||||
{ .id = 0x32, .name = "XXXX-EV1 Caol Illa" },
|
||||
{ .id = 0x33, .name = "XXXX-EV1 Oban" },
|
||||
{ .id = 0x39, .name = "1254-EV1 Dallas Dhu",
|
||||
.i2c_devs = wm1254_devs, .num_i2c_devs = ARRAY_SIZE(wm1254_devs) },
|
||||
{ .id = 0x3a, .name = "1259-EV1 Tobermory",
|
||||
@ -197,12 +222,16 @@ static __devinit int wlf_gf_module_probe(struct i2c_client *i2c,
|
||||
if (i < ARRAY_SIZE(gf_mods)) {
|
||||
dev_info(&i2c->dev, "%s revision %d\n",
|
||||
gf_mods[i].name, rev + 1);
|
||||
|
||||
for (j = 0; j < gf_mods[i].num_i2c_devs; j++) {
|
||||
if (!i2c_new_device(i2c->adapter,
|
||||
&(gf_mods[i].i2c_devs[j])))
|
||||
dev_err(&i2c->dev,
|
||||
"Failed to register dev: %d\n", ret);
|
||||
}
|
||||
|
||||
spi_register_board_info(gf_mods[i].spi_devs,
|
||||
gf_mods[i].num_spi_devs);
|
||||
} else {
|
||||
dev_warn(&i2c->dev, "Unknown module ID 0x%x revision %d\n",
|
||||
id, rev + 1);
|
||||
|
@ -19,7 +19,9 @@
|
||||
#include <linux/io.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/gpio.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/pwm_backlight.h>
|
||||
@ -298,6 +300,7 @@ static struct platform_device littlemill_device = {
|
||||
};
|
||||
|
||||
static struct regulator_consumer_supply wallvdd_consumers[] = {
|
||||
REGULATOR_SUPPLY("SPKVDD", "1-001a"),
|
||||
REGULATOR_SUPPLY("SPKVDD1", "1-001a"),
|
||||
REGULATOR_SUPPLY("SPKVDD2", "1-001a"),
|
||||
REGULATOR_SUPPLY("SPKVDDL", "1-001a"),
|
||||
@ -574,11 +577,19 @@ static struct s3c2410_platform_i2c i2c0_pdata = {
|
||||
.frequency = 400000,
|
||||
};
|
||||
|
||||
static struct regulator_consumer_supply pvdd_1v2_consumers[] __initdata = {
|
||||
REGULATOR_SUPPLY("DCVDD", "spi0.0"),
|
||||
REGULATOR_SUPPLY("AVDD", "spi0.0"),
|
||||
};
|
||||
|
||||
static struct regulator_init_data pvdd_1v2 __initdata = {
|
||||
.constraints = {
|
||||
.name = "PVDD_1V2",
|
||||
.always_on = 1,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
|
||||
.consumer_supplies = pvdd_1v2_consumers,
|
||||
.num_consumer_supplies = ARRAY_SIZE(pvdd_1v2_consumers),
|
||||
};
|
||||
|
||||
static struct regulator_consumer_supply pvdd_1v8_consumers[] __initdata = {
|
||||
@ -592,6 +603,7 @@ static struct regulator_consumer_supply pvdd_1v8_consumers[] __initdata = {
|
||||
REGULATOR_SUPPLY("AVDD2", "1-001a"),
|
||||
REGULATOR_SUPPLY("DCVDD", "1-001a"),
|
||||
REGULATOR_SUPPLY("AVDD", "1-001a"),
|
||||
REGULATOR_SUPPLY("DBVDD", "spi0.0"),
|
||||
};
|
||||
|
||||
static struct regulator_init_data pvdd_1v8 __initdata = {
|
||||
@ -681,6 +693,7 @@ static void __init crag6410_map_io(void)
|
||||
static struct s3c_sdhci_platdata crag6410_hsmmc2_pdata = {
|
||||
.max_width = 4,
|
||||
.cd_type = S3C_SDHCI_CD_PERMANENT,
|
||||
.host_caps = MMC_CAP_POWER_OFF_CARD,
|
||||
};
|
||||
|
||||
static void crag6410_cfg_sdhci0(struct platform_device *dev, int width)
|
||||
@ -696,6 +709,55 @@ static struct s3c_sdhci_platdata crag6410_hsmmc0_pdata = {
|
||||
.max_width = 4,
|
||||
.cd_type = S3C_SDHCI_CD_INTERNAL,
|
||||
.cfg_gpio = crag6410_cfg_sdhci0,
|
||||
.host_caps = MMC_CAP_POWER_OFF_CARD,
|
||||
};
|
||||
|
||||
static const struct gpio_led gpio_leds[] = {
|
||||
{
|
||||
.name = "d13:green:",
|
||||
.gpio = MMGPIO_GPIO_BASE + 0,
|
||||
.default_state = LEDS_GPIO_DEFSTATE_ON,
|
||||
},
|
||||
{
|
||||
.name = "d14:green:",
|
||||
.gpio = MMGPIO_GPIO_BASE + 1,
|
||||
.default_state = LEDS_GPIO_DEFSTATE_ON,
|
||||
},
|
||||
{
|
||||
.name = "d15:green:",
|
||||
.gpio = MMGPIO_GPIO_BASE + 2,
|
||||
.default_state = LEDS_GPIO_DEFSTATE_ON,
|
||||
},
|
||||
{
|
||||
.name = "d16:green:",
|
||||
.gpio = MMGPIO_GPIO_BASE + 3,
|
||||
.default_state = LEDS_GPIO_DEFSTATE_ON,
|
||||
},
|
||||
{
|
||||
.name = "d17:green:",
|
||||
.gpio = MMGPIO_GPIO_BASE + 4,
|
||||
.default_state = LEDS_GPIO_DEFSTATE_ON,
|
||||
},
|
||||
{
|
||||
.name = "d18:green:",
|
||||
.gpio = MMGPIO_GPIO_BASE + 5,
|
||||
.default_state = LEDS_GPIO_DEFSTATE_ON,
|
||||
},
|
||||
{
|
||||
.name = "d19:green:",
|
||||
.gpio = MMGPIO_GPIO_BASE + 6,
|
||||
.default_state = LEDS_GPIO_DEFSTATE_ON,
|
||||
},
|
||||
{
|
||||
.name = "d20:green:",
|
||||
.gpio = MMGPIO_GPIO_BASE + 7,
|
||||
.default_state = LEDS_GPIO_DEFSTATE_ON,
|
||||
},
|
||||
};
|
||||
|
||||
static const struct gpio_led_platform_data gpio_leds_pdata = {
|
||||
.leds = gpio_leds,
|
||||
.num_leds = ARRAY_SIZE(gpio_leds),
|
||||
};
|
||||
|
||||
static void __init crag6410_machine_init(void)
|
||||
@ -727,9 +789,12 @@ static void __init crag6410_machine_init(void)
|
||||
i2c_register_board_info(1, i2c_devs1, ARRAY_SIZE(i2c_devs1));
|
||||
|
||||
samsung_keypad_set_platdata(&crag6410_keypad_data);
|
||||
s3c64xx_spi0_set_platdata(&s3c64xx_spi0_pdata, 0, 1);
|
||||
|
||||
platform_add_devices(crag6410_devices, ARRAY_SIZE(crag6410_devices));
|
||||
|
||||
gpio_led_register_device(-1, &gpio_leds_pdata);
|
||||
|
||||
regulator_has_full_constraints();
|
||||
|
||||
s3c64xx_pm_init();
|
||||
|
@ -118,6 +118,10 @@ config MACH_SMDKC110
|
||||
select S3C_DEV_I2C2
|
||||
select S3C_DEV_RTC
|
||||
select S3C_DEV_WDT
|
||||
select S5P_DEV_FIMC0
|
||||
select S5P_DEV_FIMC1
|
||||
select S5P_DEV_FIMC2
|
||||
select S5P_DEV_MFC
|
||||
select SAMSUNG_DEV_IDE
|
||||
select S5PV210_SETUP_I2C1
|
||||
select S5PV210_SETUP_I2C2
|
||||
@ -142,6 +146,11 @@ config MACH_SMDKV210
|
||||
select S3C_DEV_I2C2
|
||||
select S3C_DEV_RTC
|
||||
select S3C_DEV_WDT
|
||||
select S5P_DEV_FIMC0
|
||||
select S5P_DEV_FIMC1
|
||||
select S5P_DEV_FIMC2
|
||||
select S5P_DEV_JPEG
|
||||
select S5P_DEV_MFC
|
||||
select SAMSUNG_DEV_ADC
|
||||
select SAMSUNG_DEV_BACKLIGHT
|
||||
select SAMSUNG_DEV_IDE
|
||||
|
@ -339,6 +339,11 @@ static struct clk init_clocks_off[] = {
|
||||
.parent = &clk_hclk_dsys.clk,
|
||||
.enable = s5pv210_clk_ip0_ctrl,
|
||||
.ctrlbit = (1 << 26),
|
||||
}, {
|
||||
.name = "jpeg",
|
||||
.parent = &clk_hclk_dsys.clk,
|
||||
.enable = s5pv210_clk_ip0_ctrl,
|
||||
.ctrlbit = (1 << 28),
|
||||
}, {
|
||||
.name = "mfc",
|
||||
.devname = "s5p-mfc",
|
||||
|
@ -90,6 +90,8 @@
|
||||
#define S5PV210_PA_FIMC1 0xFB300000
|
||||
#define S5PV210_PA_FIMC2 0xFB400000
|
||||
|
||||
#define S5PV210_PA_JPEG 0xFB600000
|
||||
|
||||
#define S5PV210_PA_SDO 0xF9000000
|
||||
#define S5PV210_PA_VP 0xF9100000
|
||||
#define S5PV210_PA_MIXER 0xF9200000
|
||||
@ -132,6 +134,8 @@
|
||||
#define S5P_PA_SYSCON S5PV210_PA_SYSCON
|
||||
#define S5P_PA_TIMER S5PV210_PA_TIMER
|
||||
|
||||
#define S5P_PA_JPEG S5PV210_PA_JPEG
|
||||
|
||||
#define SAMSUNG_PA_ADC S5PV210_PA_ADC
|
||||
#define SAMSUNG_PA_CFCON S5PV210_PA_CFCON
|
||||
#define SAMSUNG_PA_KEYPAD S5PV210_PA_KEYPAD
|
||||
|
@ -616,6 +616,7 @@ static struct platform_device *aquila_devices[] __initdata = {
|
||||
&s5p_device_fimc0,
|
||||
&s5p_device_fimc1,
|
||||
&s5p_device_fimc2,
|
||||
&s5p_device_fimc_md,
|
||||
&s5pv210_device_iis0,
|
||||
&wm8994_fixed_voltage0,
|
||||
&wm8994_fixed_voltage1,
|
||||
|
@ -31,6 +31,7 @@
|
||||
#include <plat/iic.h>
|
||||
#include <plat/pm.h>
|
||||
#include <plat/s5p-time.h>
|
||||
#include <plat/mfc.h>
|
||||
|
||||
#include "common.h"
|
||||
|
||||
@ -94,6 +95,13 @@ static struct platform_device *smdkc110_devices[] __initdata = {
|
||||
&s3c_device_i2c2,
|
||||
&s3c_device_rtc,
|
||||
&s3c_device_wdt,
|
||||
&s5p_device_fimc0,
|
||||
&s5p_device_fimc1,
|
||||
&s5p_device_fimc2,
|
||||
&s5p_device_fimc_md,
|
||||
&s5p_device_mfc,
|
||||
&s5p_device_mfc_l,
|
||||
&s5p_device_mfc_r,
|
||||
};
|
||||
|
||||
static struct i2c_board_info smdkc110_i2c_devs0[] __initdata = {
|
||||
@ -117,6 +125,11 @@ static void __init smdkc110_map_io(void)
|
||||
s5p_set_timer_source(S5P_PWM3, S5P_PWM4);
|
||||
}
|
||||
|
||||
static void __init smdkc110_reserve(void)
|
||||
{
|
||||
s5p_mfc_reserve_mem(0x43000000, 8 << 20, 0x51000000, 8 << 20);
|
||||
}
|
||||
|
||||
static void __init smdkc110_machine_init(void)
|
||||
{
|
||||
s3c_pm_init();
|
||||
@ -145,4 +158,5 @@ MACHINE_START(SMDKC110, "SMDKC110")
|
||||
.init_machine = smdkc110_machine_init,
|
||||
.timer = &s5p_timer,
|
||||
.restart = s5pv210_restart,
|
||||
.reserve = &smdkc110_reserve,
|
||||
MACHINE_END
|
||||
|
@ -46,6 +46,7 @@
|
||||
#include <plat/s5p-time.h>
|
||||
#include <plat/backlight.h>
|
||||
#include <plat/regs-fb-v4.h>
|
||||
#include <plat/mfc.h>
|
||||
|
||||
#include "common.h"
|
||||
|
||||
@ -223,6 +224,14 @@ static struct platform_device *smdkv210_devices[] __initdata = {
|
||||
&s3c_device_rtc,
|
||||
&s3c_device_ts,
|
||||
&s3c_device_wdt,
|
||||
&s5p_device_fimc0,
|
||||
&s5p_device_fimc1,
|
||||
&s5p_device_fimc2,
|
||||
&s5p_device_fimc_md,
|
||||
&s5p_device_jpeg,
|
||||
&s5p_device_mfc,
|
||||
&s5p_device_mfc_l,
|
||||
&s5p_device_mfc_r,
|
||||
&s5pv210_device_ac97,
|
||||
&s5pv210_device_iis0,
|
||||
&s5pv210_device_spdif,
|
||||
@ -282,6 +291,11 @@ static void __init smdkv210_map_io(void)
|
||||
s5p_set_timer_source(S5P_PWM2, S5P_PWM4);
|
||||
}
|
||||
|
||||
static void __init smdkv210_reserve(void)
|
||||
{
|
||||
s5p_mfc_reserve_mem(0x43000000, 8 << 20, 0x51000000, 8 << 20);
|
||||
}
|
||||
|
||||
static void __init smdkv210_machine_init(void)
|
||||
{
|
||||
s3c_pm_init();
|
||||
@ -319,4 +333,5 @@ MACHINE_START(SMDKV210, "SMDKV210")
|
||||
.init_machine = smdkv210_machine_init,
|
||||
.timer = &s5p_timer,
|
||||
.restart = s5pv210_restart,
|
||||
.reserve = &smdkv210_reserve,
|
||||
MACHINE_END
|
||||
|
@ -131,11 +131,7 @@ static void __init tegra_dt_init(void)
|
||||
}
|
||||
|
||||
static const char *tegra20_dt_board_compat[] = {
|
||||
"compulab,trimslice",
|
||||
"nvidia,harmony",
|
||||
"compal,paz00",
|
||||
"nvidia,seaboard",
|
||||
"nvidia,ventana",
|
||||
"nvidia,tegra20",
|
||||
NULL
|
||||
};
|
||||
|
||||
|
@ -47,7 +47,7 @@ static void __init tegra30_dt_init(void)
|
||||
}
|
||||
|
||||
static const char *tegra30_dt_board_compat[] = {
|
||||
"nvidia,cardhu",
|
||||
"nvidia,tegra30",
|
||||
NULL
|
||||
};
|
||||
|
||||
|
@ -36,13 +36,14 @@ static struct regulator_consumer_supply tps658621_ldo0_supply[] = {
|
||||
|
||||
static struct regulator_init_data ldo0_data = {
|
||||
.constraints = {
|
||||
.min_uV = 1250 * 1000,
|
||||
.min_uV = 3300 * 1000,
|
||||
.max_uV = 3300 * 1000,
|
||||
.valid_modes_mask = (REGULATOR_MODE_NORMAL |
|
||||
REGULATOR_MODE_STANDBY),
|
||||
.valid_ops_mask = (REGULATOR_CHANGE_MODE |
|
||||
REGULATOR_CHANGE_STATUS |
|
||||
REGULATOR_CHANGE_VOLTAGE),
|
||||
.apply_uV = 1,
|
||||
},
|
||||
.num_consumer_supplies = ARRAY_SIZE(tps658621_ldo0_supply),
|
||||
.consumer_supplies = tps658621_ldo0_supply,
|
||||
|
@ -28,33 +28,8 @@
|
||||
|
||||
#if defined (CONFIG_MACH_AMS_DELTA)
|
||||
|
||||
#define AMS_DELTA_LATCH1_PHYS 0x01000000
|
||||
#define AMS_DELTA_LATCH1_VIRT 0xEA000000
|
||||
#define AMS_DELTA_MODEM_PHYS 0x04000000
|
||||
#define AMS_DELTA_MODEM_VIRT 0xEB000000
|
||||
#define AMS_DELTA_LATCH2_PHYS 0x08000000
|
||||
#define AMS_DELTA_LATCH2_VIRT 0xEC000000
|
||||
|
||||
#define AMS_DELTA_LATCH1_LED_CAMERA 0x01
|
||||
#define AMS_DELTA_LATCH1_LED_ADVERT 0x02
|
||||
#define AMS_DELTA_LATCH1_LED_EMAIL 0x04
|
||||
#define AMS_DELTA_LATCH1_LED_HANDSFREE 0x08
|
||||
#define AMS_DELTA_LATCH1_LED_VOICEMAIL 0x10
|
||||
#define AMS_DELTA_LATCH1_LED_VOICE 0x20
|
||||
|
||||
#define AMS_DELTA_LATCH2_LCD_VBLEN 0x0001
|
||||
#define AMS_DELTA_LATCH2_LCD_NDISP 0x0002
|
||||
#define AMS_DELTA_LATCH2_NAND_NCE 0x0004
|
||||
#define AMS_DELTA_LATCH2_NAND_NRE 0x0008
|
||||
#define AMS_DELTA_LATCH2_NAND_NWP 0x0010
|
||||
#define AMS_DELTA_LATCH2_NAND_NWE 0x0020
|
||||
#define AMS_DELTA_LATCH2_NAND_ALE 0x0040
|
||||
#define AMS_DELTA_LATCH2_NAND_CLE 0x0080
|
||||
#define AMD_DELTA_LATCH2_KEYBRD_PWR 0x0100
|
||||
#define AMD_DELTA_LATCH2_KEYBRD_DATA 0x0200
|
||||
#define AMD_DELTA_LATCH2_SCARD_RSTIN 0x0400
|
||||
#define AMD_DELTA_LATCH2_SCARD_CMDVCC 0x0800
|
||||
#define AMS_DELTA_LATCH2_MODEM_NRESET 0x1000
|
||||
#define AMS_DELTA_LATCH2_MODEM_CODEC 0x2000
|
||||
|
||||
#define AMS_DELTA_GPIO_PIN_KEYBRD_DATA 0
|
||||
@ -66,9 +41,29 @@
|
||||
#define AMS_DELTA_GPIO_PIN_CONFIG 11
|
||||
#define AMS_DELTA_GPIO_PIN_NAND_RB 12
|
||||
|
||||
#define AMS_DELTA_GPIO_PIN_LCD_VBLEN 240
|
||||
#define AMS_DELTA_GPIO_PIN_LCD_NDISP 241
|
||||
#define AMS_DELTA_GPIO_PIN_NAND_NCE 242
|
||||
#define AMS_DELTA_GPIO_PIN_NAND_NRE 243
|
||||
#define AMS_DELTA_GPIO_PIN_NAND_NWP 244
|
||||
#define AMS_DELTA_GPIO_PIN_NAND_NWE 245
|
||||
#define AMS_DELTA_GPIO_PIN_NAND_ALE 246
|
||||
#define AMS_DELTA_GPIO_PIN_NAND_CLE 247
|
||||
#define AMS_DELTA_GPIO_PIN_KEYBRD_PWR 248
|
||||
#define AMS_DELTA_GPIO_PIN_KEYBRD_DATAOUT 249
|
||||
#define AMS_DELTA_GPIO_PIN_SCARD_RSTIN 250
|
||||
#define AMS_DELTA_GPIO_PIN_SCARD_CMDVCC 251
|
||||
#define AMS_DELTA_GPIO_PIN_MODEM_NRESET 252
|
||||
#define AMS_DELTA_GPIO_PIN_MODEM_CODEC 253
|
||||
|
||||
#define AMS_DELTA_LATCH2_GPIO_BASE AMS_DELTA_GPIO_PIN_LCD_VBLEN
|
||||
#define AMS_DELTA_LATCH2_NGPIO 16
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
void ams_delta_latch1_write(u8 mask, u8 value);
|
||||
void ams_delta_latch2_write(u16 mask, u16 value);
|
||||
void ams_delta_latch_write(int base, int ngpio, u16 mask, u16 value);
|
||||
#define ams_delta_latch2_write(mask, value) \
|
||||
ams_delta_latch_write(AMS_DELTA_LATCH2_GPIO_BASE, \
|
||||
AMS_DELTA_LATCH2_NGPIO, (mask), (value))
|
||||
#endif
|
||||
|
||||
#endif /* CONFIG_MACH_AMS_DELTA */
|
||||
|
@ -160,6 +160,7 @@ static inline void __arch_decomp_setup(unsigned long arch_id)
|
||||
DEBUG_LL_OMAP3(3, igep0020);
|
||||
DEBUG_LL_OMAP3(3, igep0030);
|
||||
DEBUG_LL_OMAP3(3, nokia_rm680);
|
||||
DEBUG_LL_OMAP3(3, nokia_rm696);
|
||||
DEBUG_LL_OMAP3(3, nokia_rx51);
|
||||
DEBUG_LL_OMAP3(3, omap3517evm);
|
||||
DEBUG_LL_OMAP3(3, omap3_beagle);
|
||||
|
@ -21,6 +21,7 @@
|
||||
#include <plat/orion_wdt.h>
|
||||
#include <plat/mv_xor.h>
|
||||
#include <plat/ehci-orion.h>
|
||||
#include <mach/bridge-regs.h>
|
||||
|
||||
/* Fill in the resources structure and link it into the platform
|
||||
device structure. There is always a memory region, and nearly
|
||||
@ -568,13 +569,17 @@ void __init orion_spi_1_init(unsigned long mapbase,
|
||||
****************************************************************************/
|
||||
static struct orion_wdt_platform_data orion_wdt_data;
|
||||
|
||||
static struct resource orion_wdt_resource =
|
||||
DEFINE_RES_MEM(TIMER_VIRT_BASE, 0x28);
|
||||
|
||||
static struct platform_device orion_wdt_device = {
|
||||
.name = "orion_wdt",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &orion_wdt_data,
|
||||
},
|
||||
.num_resources = 0,
|
||||
.resource = &orion_wdt_resource,
|
||||
.num_resources = 1,
|
||||
};
|
||||
|
||||
void __init orion_wdt_init(unsigned long tclk)
|
||||
|
@ -2,7 +2,6 @@
|
||||
#define __PLAT_AUDIO_H
|
||||
|
||||
struct kirkwood_asoc_platform_data {
|
||||
u32 tclk;
|
||||
int burst;
|
||||
};
|
||||
#endif
|
||||
|
@ -92,8 +92,7 @@ static irqreturn_t ams_delta_serio_interrupt(int irq, void *dev_id)
|
||||
static int ams_delta_serio_open(struct serio *serio)
|
||||
{
|
||||
/* enable keyboard */
|
||||
ams_delta_latch2_write(AMD_DELTA_LATCH2_KEYBRD_PWR,
|
||||
AMD_DELTA_LATCH2_KEYBRD_PWR);
|
||||
gpio_set_value(AMS_DELTA_GPIO_PIN_KEYBRD_PWR, 1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -101,9 +100,32 @@ static int ams_delta_serio_open(struct serio *serio)
|
||||
static void ams_delta_serio_close(struct serio *serio)
|
||||
{
|
||||
/* disable keyboard */
|
||||
ams_delta_latch2_write(AMD_DELTA_LATCH2_KEYBRD_PWR, 0);
|
||||
gpio_set_value(AMS_DELTA_GPIO_PIN_KEYBRD_PWR, 0);
|
||||
}
|
||||
|
||||
static const struct gpio ams_delta_gpios[] __initconst_or_module = {
|
||||
{
|
||||
.gpio = AMS_DELTA_GPIO_PIN_KEYBRD_DATA,
|
||||
.flags = GPIOF_DIR_IN,
|
||||
.label = "serio-data",
|
||||
},
|
||||
{
|
||||
.gpio = AMS_DELTA_GPIO_PIN_KEYBRD_CLK,
|
||||
.flags = GPIOF_DIR_IN,
|
||||
.label = "serio-clock",
|
||||
},
|
||||
{
|
||||
.gpio = AMS_DELTA_GPIO_PIN_KEYBRD_PWR,
|
||||
.flags = GPIOF_OUT_INIT_LOW,
|
||||
.label = "serio-power",
|
||||
},
|
||||
{
|
||||
.gpio = AMS_DELTA_GPIO_PIN_KEYBRD_DATAOUT,
|
||||
.flags = GPIOF_OUT_INIT_LOW,
|
||||
.label = "serio-dataout",
|
||||
},
|
||||
};
|
||||
|
||||
static int __init ams_delta_serio_init(void)
|
||||
{
|
||||
int err;
|
||||
@ -123,19 +145,12 @@ static int __init ams_delta_serio_init(void)
|
||||
strlcpy(ams_delta_serio->phys, "GPIO/serio0",
|
||||
sizeof(ams_delta_serio->phys));
|
||||
|
||||
err = gpio_request(AMS_DELTA_GPIO_PIN_KEYBRD_DATA, "serio-data");
|
||||
err = gpio_request_array(ams_delta_gpios,
|
||||
ARRAY_SIZE(ams_delta_gpios));
|
||||
if (err) {
|
||||
pr_err("ams_delta_serio: Couldn't request gpio pin for data\n");
|
||||
pr_err("ams_delta_serio: Couldn't request gpio pins\n");
|
||||
goto serio;
|
||||
}
|
||||
gpio_direction_input(AMS_DELTA_GPIO_PIN_KEYBRD_DATA);
|
||||
|
||||
err = gpio_request(AMS_DELTA_GPIO_PIN_KEYBRD_CLK, "serio-clock");
|
||||
if (err) {
|
||||
pr_err("ams_delta_serio: couldn't request gpio pin for clock\n");
|
||||
goto gpio_data;
|
||||
}
|
||||
gpio_direction_input(AMS_DELTA_GPIO_PIN_KEYBRD_CLK);
|
||||
|
||||
err = request_irq(gpio_to_irq(AMS_DELTA_GPIO_PIN_KEYBRD_CLK),
|
||||
ams_delta_serio_interrupt, IRQ_TYPE_EDGE_RISING,
|
||||
@ -143,7 +158,7 @@ static int __init ams_delta_serio_init(void)
|
||||
if (err < 0) {
|
||||
pr_err("ams_delta_serio: couldn't request gpio interrupt %d\n",
|
||||
gpio_to_irq(AMS_DELTA_GPIO_PIN_KEYBRD_CLK));
|
||||
goto gpio_clk;
|
||||
goto gpio;
|
||||
}
|
||||
/*
|
||||
* Since GPIO register handling for keyboard clock pin is performed
|
||||
@ -157,10 +172,9 @@ static int __init ams_delta_serio_init(void)
|
||||
dev_info(&ams_delta_serio->dev, "%s\n", ams_delta_serio->name);
|
||||
|
||||
return 0;
|
||||
gpio_clk:
|
||||
gpio_free(AMS_DELTA_GPIO_PIN_KEYBRD_CLK);
|
||||
gpio_data:
|
||||
gpio_free(AMS_DELTA_GPIO_PIN_KEYBRD_DATA);
|
||||
gpio:
|
||||
gpio_free_array(ams_delta_gpios,
|
||||
ARRAY_SIZE(ams_delta_gpios));
|
||||
serio:
|
||||
kfree(ams_delta_serio);
|
||||
return err;
|
||||
@ -171,7 +185,7 @@ static void __exit ams_delta_serio_exit(void)
|
||||
{
|
||||
serio_unregister_port(ams_delta_serio);
|
||||
free_irq(OMAP_GPIO_IRQ(AMS_DELTA_GPIO_PIN_KEYBRD_CLK), 0);
|
||||
gpio_free(AMS_DELTA_GPIO_PIN_KEYBRD_CLK);
|
||||
gpio_free(AMS_DELTA_GPIO_PIN_KEYBRD_DATA);
|
||||
gpio_free_array(ams_delta_gpios,
|
||||
ARRAY_SIZE(ams_delta_gpios));
|
||||
}
|
||||
module_exit(ams_delta_serio_exit);
|
||||
|
@ -74,13 +74,6 @@ config LEDS_S3C24XX
|
||||
This option enables support for LEDs connected to GPIO lines
|
||||
on Samsung S3C24XX series CPUs, such as the S3C2410 and S3C2440.
|
||||
|
||||
config LEDS_AMS_DELTA
|
||||
tristate "LED Support for the Amstrad Delta (E3)"
|
||||
depends on LEDS_CLASS
|
||||
depends on MACH_AMS_DELTA
|
||||
help
|
||||
This option enables support for the LEDs on Amstrad Delta (E3).
|
||||
|
||||
config LEDS_NET48XX
|
||||
tristate "LED Support for Soekris net48xx series Error LED"
|
||||
depends on LEDS_CLASS
|
||||
|
@ -12,7 +12,6 @@ obj-$(CONFIG_LEDS_LOCOMO) += leds-locomo.o
|
||||
obj-$(CONFIG_LEDS_LM3530) += leds-lm3530.o
|
||||
obj-$(CONFIG_LEDS_MIKROTIK_RB532) += leds-rb532.o
|
||||
obj-$(CONFIG_LEDS_S3C24XX) += leds-s3c24xx.o
|
||||
obj-$(CONFIG_LEDS_AMS_DELTA) += leds-ams-delta.o
|
||||
obj-$(CONFIG_LEDS_NET48XX) += leds-net48xx.o
|
||||
obj-$(CONFIG_LEDS_NET5501) += leds-net5501.o
|
||||
obj-$(CONFIG_LEDS_WRAP) += leds-wrap.o
|
||||
|
@ -1,126 +0,0 @@
|
||||
/*
|
||||
* LEDs driver for Amstrad Delta (E3)
|
||||
*
|
||||
* Copyright (C) 2006 Jonathan McDowell <noodles@earth.li>
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/leds.h>
|
||||
#include <plat/board-ams-delta.h>
|
||||
|
||||
/*
|
||||
* Our context
|
||||
*/
|
||||
struct ams_delta_led {
|
||||
struct led_classdev cdev;
|
||||
u8 bitmask;
|
||||
};
|
||||
|
||||
static void ams_delta_led_set(struct led_classdev *led_cdev,
|
||||
enum led_brightness value)
|
||||
{
|
||||
struct ams_delta_led *led_dev =
|
||||
container_of(led_cdev, struct ams_delta_led, cdev);
|
||||
|
||||
if (value)
|
||||
ams_delta_latch1_write(led_dev->bitmask, led_dev->bitmask);
|
||||
else
|
||||
ams_delta_latch1_write(led_dev->bitmask, 0);
|
||||
}
|
||||
|
||||
static struct ams_delta_led ams_delta_leds[] = {
|
||||
{
|
||||
.cdev = {
|
||||
.name = "ams-delta::camera",
|
||||
.brightness_set = ams_delta_led_set,
|
||||
},
|
||||
.bitmask = AMS_DELTA_LATCH1_LED_CAMERA,
|
||||
},
|
||||
{
|
||||
.cdev = {
|
||||
.name = "ams-delta::advert",
|
||||
.brightness_set = ams_delta_led_set,
|
||||
},
|
||||
.bitmask = AMS_DELTA_LATCH1_LED_ADVERT,
|
||||
},
|
||||
{
|
||||
.cdev = {
|
||||
.name = "ams-delta::email",
|
||||
.brightness_set = ams_delta_led_set,
|
||||
},
|
||||
.bitmask = AMS_DELTA_LATCH1_LED_EMAIL,
|
||||
},
|
||||
{
|
||||
.cdev = {
|
||||
.name = "ams-delta::handsfree",
|
||||
.brightness_set = ams_delta_led_set,
|
||||
},
|
||||
.bitmask = AMS_DELTA_LATCH1_LED_HANDSFREE,
|
||||
},
|
||||
{
|
||||
.cdev = {
|
||||
.name = "ams-delta::voicemail",
|
||||
.brightness_set = ams_delta_led_set,
|
||||
},
|
||||
.bitmask = AMS_DELTA_LATCH1_LED_VOICEMAIL,
|
||||
},
|
||||
{
|
||||
.cdev = {
|
||||
.name = "ams-delta::voice",
|
||||
.brightness_set = ams_delta_led_set,
|
||||
},
|
||||
.bitmask = AMS_DELTA_LATCH1_LED_VOICE,
|
||||
},
|
||||
};
|
||||
|
||||
static int ams_delta_led_probe(struct platform_device *pdev)
|
||||
{
|
||||
int i, ret;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(ams_delta_leds); i++) {
|
||||
ams_delta_leds[i].cdev.flags |= LED_CORE_SUSPENDRESUME;
|
||||
ret = led_classdev_register(&pdev->dev,
|
||||
&ams_delta_leds[i].cdev);
|
||||
if (ret < 0)
|
||||
goto fail;
|
||||
}
|
||||
|
||||
return 0;
|
||||
fail:
|
||||
while (--i >= 0)
|
||||
led_classdev_unregister(&ams_delta_leds[i].cdev);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int ams_delta_led_remove(struct platform_device *pdev)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(ams_delta_leds); i++)
|
||||
led_classdev_unregister(&ams_delta_leds[i].cdev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct platform_driver ams_delta_led_driver = {
|
||||
.probe = ams_delta_led_probe,
|
||||
.remove = ams_delta_led_remove,
|
||||
.driver = {
|
||||
.name = "ams-delta-led",
|
||||
.owner = THIS_MODULE,
|
||||
},
|
||||
};
|
||||
|
||||
module_platform_driver(ams_delta_led_driver);
|
||||
|
||||
MODULE_AUTHOR("Jonathan McDowell <noodles@earth.li>");
|
||||
MODULE_DESCRIPTION("Amstrad Delta LED driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_ALIAS("platform:ams-delta-led");
|
@ -26,7 +26,7 @@
|
||||
#include <asm/io.h>
|
||||
#include <mach/hardware.h>
|
||||
#include <asm/sizes.h>
|
||||
#include <asm/gpio.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <plat/board-ams-delta.h>
|
||||
|
||||
/*
|
||||
@ -34,8 +34,6 @@
|
||||
*/
|
||||
static struct mtd_info *ams_delta_mtd = NULL;
|
||||
|
||||
#define NAND_MASK (AMS_DELTA_LATCH2_NAND_NRE | AMS_DELTA_LATCH2_NAND_NWE | AMS_DELTA_LATCH2_NAND_CLE | AMS_DELTA_LATCH2_NAND_ALE | AMS_DELTA_LATCH2_NAND_NCE | AMS_DELTA_LATCH2_NAND_NWP)
|
||||
|
||||
/*
|
||||
* Define partitions for flash devices
|
||||
*/
|
||||
@ -68,10 +66,9 @@ static void ams_delta_write_byte(struct mtd_info *mtd, u_char byte)
|
||||
|
||||
writew(0, io_base + OMAP_MPUIO_IO_CNTL);
|
||||
writew(byte, this->IO_ADDR_W);
|
||||
ams_delta_latch2_write(AMS_DELTA_LATCH2_NAND_NWE, 0);
|
||||
gpio_set_value(AMS_DELTA_GPIO_PIN_NAND_NWE, 0);
|
||||
ndelay(40);
|
||||
ams_delta_latch2_write(AMS_DELTA_LATCH2_NAND_NWE,
|
||||
AMS_DELTA_LATCH2_NAND_NWE);
|
||||
gpio_set_value(AMS_DELTA_GPIO_PIN_NAND_NWE, 1);
|
||||
}
|
||||
|
||||
static u_char ams_delta_read_byte(struct mtd_info *mtd)
|
||||
@ -80,12 +77,11 @@ static u_char ams_delta_read_byte(struct mtd_info *mtd)
|
||||
struct nand_chip *this = mtd->priv;
|
||||
void __iomem *io_base = this->priv;
|
||||
|
||||
ams_delta_latch2_write(AMS_DELTA_LATCH2_NAND_NRE, 0);
|
||||
gpio_set_value(AMS_DELTA_GPIO_PIN_NAND_NRE, 0);
|
||||
ndelay(40);
|
||||
writew(~0, io_base + OMAP_MPUIO_IO_CNTL);
|
||||
res = readw(this->IO_ADDR_R);
|
||||
ams_delta_latch2_write(AMS_DELTA_LATCH2_NAND_NRE,
|
||||
AMS_DELTA_LATCH2_NAND_NRE);
|
||||
gpio_set_value(AMS_DELTA_GPIO_PIN_NAND_NRE, 1);
|
||||
|
||||
return res;
|
||||
}
|
||||
@ -132,15 +128,12 @@ static void ams_delta_hwcontrol(struct mtd_info *mtd, int cmd,
|
||||
{
|
||||
|
||||
if (ctrl & NAND_CTRL_CHANGE) {
|
||||
unsigned long bits;
|
||||
|
||||
bits = (~ctrl & NAND_NCE) ? AMS_DELTA_LATCH2_NAND_NCE : 0;
|
||||
bits |= (ctrl & NAND_CLE) ? AMS_DELTA_LATCH2_NAND_CLE : 0;
|
||||
bits |= (ctrl & NAND_ALE) ? AMS_DELTA_LATCH2_NAND_ALE : 0;
|
||||
|
||||
ams_delta_latch2_write(AMS_DELTA_LATCH2_NAND_CLE |
|
||||
AMS_DELTA_LATCH2_NAND_ALE |
|
||||
AMS_DELTA_LATCH2_NAND_NCE, bits);
|
||||
gpio_set_value(AMS_DELTA_GPIO_PIN_NAND_NCE,
|
||||
(ctrl & NAND_NCE) == 0);
|
||||
gpio_set_value(AMS_DELTA_GPIO_PIN_NAND_CLE,
|
||||
(ctrl & NAND_CLE) != 0);
|
||||
gpio_set_value(AMS_DELTA_GPIO_PIN_NAND_ALE,
|
||||
(ctrl & NAND_ALE) != 0);
|
||||
}
|
||||
|
||||
if (cmd != NAND_CMD_NONE)
|
||||
@ -152,6 +145,39 @@ static int ams_delta_nand_ready(struct mtd_info *mtd)
|
||||
return gpio_get_value(AMS_DELTA_GPIO_PIN_NAND_RB);
|
||||
}
|
||||
|
||||
static const struct gpio _mandatory_gpio[] = {
|
||||
{
|
||||
.gpio = AMS_DELTA_GPIO_PIN_NAND_NCE,
|
||||
.flags = GPIOF_OUT_INIT_HIGH,
|
||||
.label = "nand_nce",
|
||||
},
|
||||
{
|
||||
.gpio = AMS_DELTA_GPIO_PIN_NAND_NRE,
|
||||
.flags = GPIOF_OUT_INIT_HIGH,
|
||||
.label = "nand_nre",
|
||||
},
|
||||
{
|
||||
.gpio = AMS_DELTA_GPIO_PIN_NAND_NWP,
|
||||
.flags = GPIOF_OUT_INIT_HIGH,
|
||||
.label = "nand_nwp",
|
||||
},
|
||||
{
|
||||
.gpio = AMS_DELTA_GPIO_PIN_NAND_NWE,
|
||||
.flags = GPIOF_OUT_INIT_HIGH,
|
||||
.label = "nand_nwe",
|
||||
},
|
||||
{
|
||||
.gpio = AMS_DELTA_GPIO_PIN_NAND_ALE,
|
||||
.flags = GPIOF_OUT_INIT_LOW,
|
||||
.label = "nand_ale",
|
||||
},
|
||||
{
|
||||
.gpio = AMS_DELTA_GPIO_PIN_NAND_CLE,
|
||||
.flags = GPIOF_OUT_INIT_LOW,
|
||||
.label = "nand_cle",
|
||||
},
|
||||
};
|
||||
|
||||
/*
|
||||
* Main initialization routine
|
||||
*/
|
||||
@ -223,10 +249,9 @@ static int __devinit ams_delta_init(struct platform_device *pdev)
|
||||
platform_set_drvdata(pdev, io_base);
|
||||
|
||||
/* Set chip enabled, but */
|
||||
ams_delta_latch2_write(NAND_MASK, AMS_DELTA_LATCH2_NAND_NRE |
|
||||
AMS_DELTA_LATCH2_NAND_NWE |
|
||||
AMS_DELTA_LATCH2_NAND_NCE |
|
||||
AMS_DELTA_LATCH2_NAND_NWP);
|
||||
err = gpio_request_array(_mandatory_gpio, ARRAY_SIZE(_mandatory_gpio));
|
||||
if (err)
|
||||
goto out_gpio;
|
||||
|
||||
/* Scan to find existence of the device */
|
||||
if (nand_scan(ams_delta_mtd, 1)) {
|
||||
@ -241,7 +266,10 @@ static int __devinit ams_delta_init(struct platform_device *pdev)
|
||||
goto out;
|
||||
|
||||
out_mtd:
|
||||
gpio_free_array(_mandatory_gpio, ARRAY_SIZE(_mandatory_gpio));
|
||||
out_gpio:
|
||||
platform_set_drvdata(pdev, NULL);
|
||||
gpio_free(AMS_DELTA_GPIO_PIN_NAND_RB);
|
||||
iounmap(io_base);
|
||||
out_release_io:
|
||||
release_mem_region(res->start, resource_size(res));
|
||||
@ -262,6 +290,8 @@ static int __devexit ams_delta_cleanup(struct platform_device *pdev)
|
||||
/* Release resources, unregister device */
|
||||
nand_release(ams_delta_mtd);
|
||||
|
||||
gpio_free_array(_mandatory_gpio, ARRAY_SIZE(_mandatory_gpio));
|
||||
gpio_free(AMS_DELTA_GPIO_PIN_NAND_RB);
|
||||
iounmap(io_base);
|
||||
release_mem_region(res->start, resource_size(res));
|
||||
|
||||
|
@ -12,6 +12,7 @@
|
||||
#include <linux/bcd.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/gfp.h>
|
||||
#include <linux/module.h>
|
||||
@ -294,11 +295,19 @@ static int __exit mv_rtc_remove(struct platform_device *pdev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_OF
|
||||
static struct of_device_id rtc_mv_of_match_table[] = {
|
||||
{ .compatible = "mrvl,orion-rtc", },
|
||||
{}
|
||||
};
|
||||
#endif
|
||||
|
||||
static struct platform_driver mv_rtc_driver = {
|
||||
.remove = __exit_p(mv_rtc_remove),
|
||||
.driver = {
|
||||
.name = "rtc-mv",
|
||||
.owner = THIS_MODULE,
|
||||
.of_match_table = of_match_ptr(rtc_mv_of_match_table),
|
||||
},
|
||||
};
|
||||
|
||||
|
@ -359,11 +359,6 @@ static int orion_spi_setup(struct spi_device *spi)
|
||||
|
||||
orion_spi = spi_master_get_devdata(spi->master);
|
||||
|
||||
/* Fix ac timing if required. */
|
||||
if (orion_spi->spi_info->enable_clock_fix)
|
||||
orion_spi_setbits(orion_spi, ORION_SPI_IF_CONFIG_REG,
|
||||
(1 << 14));
|
||||
|
||||
if ((spi->max_speed_hz == 0)
|
||||
|| (spi->max_speed_hz > orion_spi->max_speed))
|
||||
spi->max_speed_hz = orion_spi->max_speed;
|
||||
|
@ -25,6 +25,7 @@
|
||||
#include <linux/io.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/lcd.h>
|
||||
#include <linux/gpio.h>
|
||||
|
||||
#include <plat/board-ams-delta.h>
|
||||
#include <mach/hardware.h>
|
||||
@ -98,29 +99,41 @@ static struct lcd_ops ams_delta_lcd_ops = {
|
||||
|
||||
/* omapfb panel section */
|
||||
|
||||
static const struct gpio _gpios[] = {
|
||||
{
|
||||
.gpio = AMS_DELTA_GPIO_PIN_LCD_VBLEN,
|
||||
.flags = GPIOF_OUT_INIT_LOW,
|
||||
.label = "lcd_vblen",
|
||||
},
|
||||
{
|
||||
.gpio = AMS_DELTA_GPIO_PIN_LCD_NDISP,
|
||||
.flags = GPIOF_OUT_INIT_LOW,
|
||||
.label = "lcd_ndisp",
|
||||
},
|
||||
};
|
||||
|
||||
static int ams_delta_panel_init(struct lcd_panel *panel,
|
||||
struct omapfb_device *fbdev)
|
||||
{
|
||||
return 0;
|
||||
return gpio_request_array(_gpios, ARRAY_SIZE(_gpios));
|
||||
}
|
||||
|
||||
static void ams_delta_panel_cleanup(struct lcd_panel *panel)
|
||||
{
|
||||
gpio_free_array(_gpios, ARRAY_SIZE(_gpios));
|
||||
}
|
||||
|
||||
static int ams_delta_panel_enable(struct lcd_panel *panel)
|
||||
{
|
||||
ams_delta_latch2_write(AMS_DELTA_LATCH2_LCD_NDISP,
|
||||
AMS_DELTA_LATCH2_LCD_NDISP);
|
||||
ams_delta_latch2_write(AMS_DELTA_LATCH2_LCD_VBLEN,
|
||||
AMS_DELTA_LATCH2_LCD_VBLEN);
|
||||
gpio_set_value(AMS_DELTA_GPIO_PIN_LCD_NDISP, 1);
|
||||
gpio_set_value(AMS_DELTA_GPIO_PIN_LCD_VBLEN, 1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void ams_delta_panel_disable(struct lcd_panel *panel)
|
||||
{
|
||||
ams_delta_latch2_write(AMS_DELTA_LATCH2_LCD_VBLEN, 0);
|
||||
ams_delta_latch2_write(AMS_DELTA_LATCH2_LCD_NDISP, 0);
|
||||
gpio_set_value(AMS_DELTA_GPIO_PIN_LCD_VBLEN, 0);
|
||||
gpio_set_value(AMS_DELTA_GPIO_PIN_LCD_NDISP, 0);
|
||||
}
|
||||
|
||||
static unsigned long ams_delta_panel_get_caps(struct lcd_panel *panel)
|
||||
|
@ -28,9 +28,9 @@
|
||||
/*
|
||||
* Watchdog timer block registers.
|
||||
*/
|
||||
#define TIMER_CTRL (TIMER_VIRT_BASE + 0x0000)
|
||||
#define TIMER_CTRL 0x0000
|
||||
#define WDT_EN 0x0010
|
||||
#define WDT_VAL (TIMER_VIRT_BASE + 0x0024)
|
||||
#define WDT_VAL 0x0024
|
||||
|
||||
#define WDT_MAX_CYCLE_COUNT 0xffffffff
|
||||
#define WDT_IN_USE 0
|
||||
@ -40,6 +40,7 @@ static int nowayout = WATCHDOG_NOWAYOUT;
|
||||
static int heartbeat = -1; /* module parameter (seconds) */
|
||||
static unsigned int wdt_max_duration; /* (seconds) */
|
||||
static unsigned int wdt_tclk;
|
||||
static void __iomem *wdt_reg;
|
||||
static unsigned long wdt_status;
|
||||
static DEFINE_SPINLOCK(wdt_lock);
|
||||
|
||||
@ -48,7 +49,7 @@ static void orion_wdt_ping(void)
|
||||
spin_lock(&wdt_lock);
|
||||
|
||||
/* Reload watchdog duration */
|
||||
writel(wdt_tclk * heartbeat, WDT_VAL);
|
||||
writel(wdt_tclk * heartbeat, wdt_reg + WDT_VAL);
|
||||
|
||||
spin_unlock(&wdt_lock);
|
||||
}
|
||||
@ -60,7 +61,7 @@ static void orion_wdt_enable(void)
|
||||
spin_lock(&wdt_lock);
|
||||
|
||||
/* Set watchdog duration */
|
||||
writel(wdt_tclk * heartbeat, WDT_VAL);
|
||||
writel(wdt_tclk * heartbeat, wdt_reg + WDT_VAL);
|
||||
|
||||
/* Clear watchdog timer interrupt */
|
||||
reg = readl(BRIDGE_CAUSE);
|
||||
@ -68,9 +69,9 @@ static void orion_wdt_enable(void)
|
||||
writel(reg, BRIDGE_CAUSE);
|
||||
|
||||
/* Enable watchdog timer */
|
||||
reg = readl(TIMER_CTRL);
|
||||
reg = readl(wdt_reg + TIMER_CTRL);
|
||||
reg |= WDT_EN;
|
||||
writel(reg, TIMER_CTRL);
|
||||
writel(reg, wdt_reg + TIMER_CTRL);
|
||||
|
||||
/* Enable reset on watchdog */
|
||||
reg = readl(RSTOUTn_MASK);
|
||||
@ -92,9 +93,9 @@ static void orion_wdt_disable(void)
|
||||
writel(reg, RSTOUTn_MASK);
|
||||
|
||||
/* Disable watchdog timer */
|
||||
reg = readl(TIMER_CTRL);
|
||||
reg = readl(wdt_reg + TIMER_CTRL);
|
||||
reg &= ~WDT_EN;
|
||||
writel(reg, TIMER_CTRL);
|
||||
writel(reg, wdt_reg + TIMER_CTRL);
|
||||
|
||||
spin_unlock(&wdt_lock);
|
||||
}
|
||||
@ -102,7 +103,7 @@ static void orion_wdt_disable(void)
|
||||
static int orion_wdt_get_timeleft(int *time_left)
|
||||
{
|
||||
spin_lock(&wdt_lock);
|
||||
*time_left = readl(WDT_VAL) / wdt_tclk;
|
||||
*time_left = readl(wdt_reg + WDT_VAL) / wdt_tclk;
|
||||
spin_unlock(&wdt_lock);
|
||||
return 0;
|
||||
}
|
||||
@ -236,6 +237,7 @@ static struct miscdevice orion_wdt_miscdev = {
|
||||
static int __devinit orion_wdt_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct orion_wdt_platform_data *pdata = pdev->dev.platform_data;
|
||||
struct resource *res;
|
||||
int ret;
|
||||
|
||||
if (pdata) {
|
||||
@ -245,6 +247,10 @@ static int __devinit orion_wdt_probe(struct platform_device *pdev)
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
|
||||
wdt_reg = ioremap(res->start, resource_size(res));
|
||||
|
||||
if (orion_wdt_miscdev.parent)
|
||||
return -EBUSY;
|
||||
orion_wdt_miscdev.parent = &pdev->dev;
|
||||
|
@ -11,7 +11,6 @@
|
||||
|
||||
struct orion_spi_info {
|
||||
u32 tclk; /* no <linux/clk.h> support yet */
|
||||
u32 enable_clock_fix;
|
||||
};
|
||||
|
||||
|
||||
|
@ -426,29 +426,6 @@ static struct snd_soc_ops ams_delta_ops = {
|
||||
};
|
||||
|
||||
|
||||
/* Board specific codec bias level control */
|
||||
static int ams_delta_set_bias_level(struct snd_soc_card *card,
|
||||
struct snd_soc_dapm_context *dapm,
|
||||
enum snd_soc_bias_level level)
|
||||
{
|
||||
switch (level) {
|
||||
case SND_SOC_BIAS_ON:
|
||||
case SND_SOC_BIAS_PREPARE:
|
||||
case SND_SOC_BIAS_STANDBY:
|
||||
if (card->dapm.bias_level == SND_SOC_BIAS_OFF)
|
||||
ams_delta_latch2_write(AMS_DELTA_LATCH2_MODEM_NRESET,
|
||||
AMS_DELTA_LATCH2_MODEM_NRESET);
|
||||
break;
|
||||
case SND_SOC_BIAS_OFF:
|
||||
if (card->dapm.bias_level != SND_SOC_BIAS_OFF)
|
||||
ams_delta_latch2_write(AMS_DELTA_LATCH2_MODEM_NRESET,
|
||||
0);
|
||||
}
|
||||
card->dapm.bias_level = level;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Digital mute implemented using modem/CPU multiplexer.
|
||||
* Shares hardware with codec config pulse generation */
|
||||
static bool ams_delta_muted = 1;
|
||||
@ -512,9 +489,6 @@ static int ams_delta_cx20442_init(struct snd_soc_pcm_runtime *rtd)
|
||||
ams_delta_ops.shutdown = ams_delta_shutdown;
|
||||
}
|
||||
|
||||
/* Set codec bias level */
|
||||
ams_delta_set_bias_level(card, dapm, SND_SOC_BIAS_STANDBY);
|
||||
|
||||
/* Add hook switch - can be used to control the codec from userspace
|
||||
* even if line discipline fails */
|
||||
ret = snd_soc_jack_new(rtd->codec, "hook_switch",
|
||||
@ -598,7 +572,6 @@ static struct snd_soc_card ams_delta_audio_card = {
|
||||
.owner = THIS_MODULE,
|
||||
.dai_link = &ams_delta_dai_link,
|
||||
.num_links = 1,
|
||||
.set_bias_level = ams_delta_set_bias_level,
|
||||
};
|
||||
|
||||
/* Module init/exit */
|
||||
@ -635,7 +608,7 @@ err:
|
||||
platform_device_put(ams_delta_audio_platform_device);
|
||||
return ret;
|
||||
}
|
||||
module_init(ams_delta_module_init);
|
||||
late_initcall(ams_delta_module_init);
|
||||
|
||||
static void __exit ams_delta_module_exit(void)
|
||||
{
|
||||
@ -647,11 +620,6 @@ static void __exit ams_delta_module_exit(void)
|
||||
ARRAY_SIZE(ams_delta_hook_switch_gpios),
|
||||
ams_delta_hook_switch_gpios);
|
||||
|
||||
/* Keep modem power on */
|
||||
ams_delta_set_bias_level(&ams_delta_audio_card,
|
||||
&ams_delta_audio_card.rtd[0].codec->dapm,
|
||||
SND_SOC_BIAS_STANDBY);
|
||||
|
||||
platform_device_unregister(cx20442_platform_device);
|
||||
platform_device_unregister(ams_delta_audio_platform_device);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user