| Yusuke Goda | 04e917b | 2008-06-06 17:03:23 +0900 | [diff] [blame] | 1 | /* | 
 | 2 |  * Renesas - AP-325RXA | 
 | 3 |  * (Compatible with Algo System ., LTD. - AP-320A) | 
 | 4 |  * | 
 | 5 |  * Copyright (C) 2008 Renesas Solutions Corp. | 
 | 6 |  * Author : Yusuke Goda <goda.yuske@renesas.com> | 
 | 7 |  * | 
 | 8 |  * This file is subject to the terms and conditions of the GNU General Public | 
 | 9 |  * License.  See the file "COPYING" in the main directory of this archive | 
 | 10 |  * for more details. | 
 | 11 |  */ | 
 | 12 |  | 
 | 13 | #include <linux/init.h> | 
 | 14 | #include <linux/device.h> | 
| Magnus Damm | 4875ea2 | 2008-07-28 19:11:07 +0900 | [diff] [blame] | 15 | #include <linux/interrupt.h> | 
| Yusuke Goda | 04e917b | 2008-06-06 17:03:23 +0900 | [diff] [blame] | 16 | #include <linux/platform_device.h> | 
| Arnd Hannemann | 365e108 | 2010-12-28 22:22:36 +0000 | [diff] [blame] | 17 | #include <linux/mmc/host.h> | 
| Guennadi Liakhovetski | 960b9e7 | 2011-03-09 11:29:48 +0100 | [diff] [blame] | 18 | #include <linux/mmc/sh_mobile_sdhi.h> | 
| Yusuke Goda | 04e917b | 2008-06-06 17:03:23 +0900 | [diff] [blame] | 19 | #include <linux/mtd/physmap.h> | 
| Yoshihiro Shimoda | 908978a | 2008-09-09 17:17:42 +0900 | [diff] [blame] | 20 | #include <linux/mtd/sh_flctl.h> | 
| Yusuke Goda | 04e917b | 2008-06-06 17:03:23 +0900 | [diff] [blame] | 21 | #include <linux/delay.h> | 
| Magnus Damm | 026953d | 2008-07-05 12:32:44 +0900 | [diff] [blame] | 22 | #include <linux/i2c.h> | 
| Steve Glendinning | 90b7649 | 2009-01-07 17:20:07 +0900 | [diff] [blame] | 23 | #include <linux/smsc911x.h> | 
| Magnus Damm | 16587c4 | 2008-10-08 20:42:20 +0900 | [diff] [blame] | 24 | #include <linux/gpio.h> | 
| Guennadi Liakhovetski | a1ad803 | 2012-01-25 22:07:05 +0100 | [diff] [blame] | 25 | #include <linux/videodev2.h> | 
| Paul Mundt | 9c23c51 | 2012-05-18 15:45:09 +0900 | [diff] [blame] | 26 | #include <linux/sh_intc.h> | 
| Kuninori Morimoto | 4713125 | 2009-01-22 00:38:31 +0000 | [diff] [blame] | 27 | #include <media/ov772x.h> | 
| Nobuhiro Iwamatsu | ba087e6 | 2009-03-06 02:51:14 +0000 | [diff] [blame] | 28 | #include <media/soc_camera.h> | 
| Magnus Damm | 8b2224d | 2008-07-28 19:14:35 +0900 | [diff] [blame] | 29 | #include <media/soc_camera_platform.h> | 
 | 30 | #include <media/sh_mobile_ceu.h> | 
| Paul Mundt | 225c9a8 | 2008-10-01 16:24:32 +0900 | [diff] [blame] | 31 | #include <video/sh_mobile_lcdc.h> | 
| Yusuke Goda | 04e917b | 2008-06-06 17:03:23 +0900 | [diff] [blame] | 32 | #include <asm/io.h> | 
| Magnus Damm | 6968980 | 2008-07-28 19:07:04 +0900 | [diff] [blame] | 33 | #include <asm/clock.h> | 
| Magnus Damm | 86c7d03 | 2009-10-30 04:23:51 +0000 | [diff] [blame] | 34 | #include <asm/suspend.h> | 
| Paul Mundt | f727565 | 2008-10-20 12:04:53 +0900 | [diff] [blame] | 35 | #include <cpu/sh7723.h> | 
| Yusuke Goda | 04e917b | 2008-06-06 17:03:23 +0900 | [diff] [blame] | 36 |  | 
| Steve Glendinning | 90b7649 | 2009-01-07 17:20:07 +0900 | [diff] [blame] | 37 | static struct smsc911x_platform_config smsc911x_config = { | 
 | 38 | 	.phy_interface	= PHY_INTERFACE_MODE_MII, | 
 | 39 | 	.irq_polarity	= SMSC911X_IRQ_POLARITY_ACTIVE_LOW, | 
 | 40 | 	.irq_type	= SMSC911X_IRQ_TYPE_OPEN_DRAIN, | 
 | 41 | 	.flags		= SMSC911X_USE_32BIT, | 
| Magnus Damm | 4875ea2 | 2008-07-28 19:11:07 +0900 | [diff] [blame] | 42 | }; | 
 | 43 |  | 
| Steve Glendinning | 90b7649 | 2009-01-07 17:20:07 +0900 | [diff] [blame] | 44 | static struct resource smsc9118_resources[] = { | 
| Yusuke Goda | 04e917b | 2008-06-06 17:03:23 +0900 | [diff] [blame] | 45 | 	[0] = { | 
 | 46 | 		.start	= 0xb6080000, | 
 | 47 | 		.end	= 0xb60fffff, | 
 | 48 | 		.flags	= IORESOURCE_MEM, | 
 | 49 | 	}, | 
 | 50 | 	[1] = { | 
| Paul Mundt | 9c23c51 | 2012-05-18 15:45:09 +0900 | [diff] [blame] | 51 | 		.start	= evt2irq(0x660), | 
 | 52 | 		.end	= evt2irq(0x660), | 
| Yusuke Goda | 04e917b | 2008-06-06 17:03:23 +0900 | [diff] [blame] | 53 | 		.flags	= IORESOURCE_IRQ, | 
 | 54 | 	} | 
 | 55 | }; | 
 | 56 |  | 
| Steve Glendinning | 90b7649 | 2009-01-07 17:20:07 +0900 | [diff] [blame] | 57 | static struct platform_device smsc9118_device = { | 
 | 58 | 	.name		= "smsc911x", | 
| Yusuke Goda | 04e917b | 2008-06-06 17:03:23 +0900 | [diff] [blame] | 59 | 	.id		= -1, | 
| Steve Glendinning | 90b7649 | 2009-01-07 17:20:07 +0900 | [diff] [blame] | 60 | 	.num_resources	= ARRAY_SIZE(smsc9118_resources), | 
 | 61 | 	.resource	= smsc9118_resources, | 
| Magnus Damm | 4875ea2 | 2008-07-28 19:11:07 +0900 | [diff] [blame] | 62 | 	.dev		= { | 
| Steve Glendinning | 90b7649 | 2009-01-07 17:20:07 +0900 | [diff] [blame] | 63 | 		.platform_data = &smsc911x_config, | 
| Magnus Damm | 4875ea2 | 2008-07-28 19:11:07 +0900 | [diff] [blame] | 64 | 	}, | 
| Yusuke Goda | 04e917b | 2008-06-06 17:03:23 +0900 | [diff] [blame] | 65 | }; | 
 | 66 |  | 
| Nobuhiro Iwamatsu | aa88f16 | 2008-09-24 11:46:48 +0900 | [diff] [blame] | 67 | /* | 
 | 68 |  * AP320 and AP325RXA has CPLD data in NOR Flash(0xA80000-0xABFFFF). | 
 | 69 |  * If this area erased, this board can not boot. | 
 | 70 |  */ | 
| Yusuke Goda | 04e917b | 2008-06-06 17:03:23 +0900 | [diff] [blame] | 71 | static struct mtd_partition ap325rxa_nor_flash_partitions[] = { | 
 | 72 | 	{ | 
| Nobuhiro Iwamatsu | aa88f16 | 2008-09-24 11:46:48 +0900 | [diff] [blame] | 73 | 		.name = "uboot", | 
 | 74 | 		.offset = 0, | 
 | 75 | 		.size = (1 * 1024 * 1024), | 
 | 76 | 		.mask_flags = MTD_WRITEABLE,	/* Read-only */ | 
| Yusuke Goda | 04e917b | 2008-06-06 17:03:23 +0900 | [diff] [blame] | 77 | 	}, { | 
| Nobuhiro Iwamatsu | aa88f16 | 2008-09-24 11:46:48 +0900 | [diff] [blame] | 78 | 		.name = "kernel", | 
 | 79 | 		.offset = MTDPART_OFS_APPEND, | 
 | 80 | 		.size = (2 * 1024 * 1024), | 
| Yusuke Goda | 04e917b | 2008-06-06 17:03:23 +0900 | [diff] [blame] | 81 | 	}, { | 
| Nobuhiro Iwamatsu | aa88f16 | 2008-09-24 11:46:48 +0900 | [diff] [blame] | 82 | 		.name = "free-area0", | 
 | 83 | 		.offset = MTDPART_OFS_APPEND, | 
 | 84 | 		.size = ((7 * 1024 * 1024) + (512 * 1024)), | 
 | 85 | 	}, { | 
 | 86 | 		.name = "CPLD-Data", | 
 | 87 | 		.offset = MTDPART_OFS_APPEND, | 
 | 88 | 		.mask_flags = MTD_WRITEABLE,	/* Read-only */ | 
 | 89 | 		.size = (1024 * 128 * 2), | 
 | 90 | 	}, { | 
 | 91 | 		.name = "free-area1", | 
 | 92 | 		.offset = MTDPART_OFS_APPEND, | 
 | 93 | 		.size = MTDPART_SIZ_FULL, | 
| Yusuke Goda | 04e917b | 2008-06-06 17:03:23 +0900 | [diff] [blame] | 94 | 	}, | 
 | 95 | }; | 
 | 96 |  | 
 | 97 | static struct physmap_flash_data ap325rxa_nor_flash_data = { | 
 | 98 | 	.width		= 2, | 
 | 99 | 	.parts		= ap325rxa_nor_flash_partitions, | 
 | 100 | 	.nr_parts	= ARRAY_SIZE(ap325rxa_nor_flash_partitions), | 
 | 101 | }; | 
 | 102 |  | 
 | 103 | static struct resource ap325rxa_nor_flash_resources[] = { | 
 | 104 | 	[0] = { | 
 | 105 | 		.name	= "NOR Flash", | 
 | 106 | 		.start	= 0x00000000, | 
 | 107 | 		.end	= 0x00ffffff, | 
 | 108 | 		.flags	= IORESOURCE_MEM, | 
 | 109 | 	} | 
 | 110 | }; | 
 | 111 |  | 
 | 112 | static struct platform_device ap325rxa_nor_flash_device = { | 
 | 113 | 	.name		= "physmap-flash", | 
 | 114 | 	.resource	= ap325rxa_nor_flash_resources, | 
 | 115 | 	.num_resources	= ARRAY_SIZE(ap325rxa_nor_flash_resources), | 
 | 116 | 	.dev		= { | 
 | 117 | 		.platform_data = &ap325rxa_nor_flash_data, | 
 | 118 | 	}, | 
 | 119 | }; | 
 | 120 |  | 
| Yoshihiro Shimoda | 908978a | 2008-09-09 17:17:42 +0900 | [diff] [blame] | 121 | static struct mtd_partition nand_partition_info[] = { | 
 | 122 | 	{ | 
 | 123 | 		.name	= "nand_data", | 
 | 124 | 		.offset	= 0, | 
 | 125 | 		.size	= MTDPART_SIZ_FULL, | 
 | 126 | 	}, | 
 | 127 | }; | 
 | 128 |  | 
 | 129 | static struct resource nand_flash_resources[] = { | 
 | 130 | 	[0] = { | 
 | 131 | 		.start	= 0xa4530000, | 
 | 132 | 		.end	= 0xa45300ff, | 
 | 133 | 		.flags	= IORESOURCE_MEM, | 
 | 134 | 	} | 
 | 135 | }; | 
 | 136 |  | 
 | 137 | static struct sh_flctl_platform_data nand_flash_data = { | 
 | 138 | 	.parts		= nand_partition_info, | 
 | 139 | 	.nr_parts	= ARRAY_SIZE(nand_partition_info), | 
 | 140 | 	.flcmncr_val	= FCKSEL_E | TYPESEL_SET | NANWF_E, | 
 | 141 | 	.has_hwecc	= 1, | 
 | 142 | }; | 
 | 143 |  | 
 | 144 | static struct platform_device nand_flash_device = { | 
 | 145 | 	.name		= "sh_flctl", | 
 | 146 | 	.resource	= nand_flash_resources, | 
 | 147 | 	.num_resources	= ARRAY_SIZE(nand_flash_resources), | 
 | 148 | 	.dev		= { | 
 | 149 | 		.platform_data = &nand_flash_data, | 
 | 150 | 	}, | 
 | 151 | }; | 
 | 152 |  | 
| Magnus Damm | 6968980 | 2008-07-28 19:07:04 +0900 | [diff] [blame] | 153 | #define FPGA_LCDREG	0xB4100180 | 
 | 154 | #define FPGA_BKLREG	0xB4100212 | 
 | 155 | #define FPGA_LCDREG_VAL	0x0018 | 
| Magnus Damm | 8b2224d | 2008-07-28 19:14:35 +0900 | [diff] [blame] | 156 | #define PORT_MSELCRB	0xA4050182 | 
| Yoshihiro Shimoda | 908978a | 2008-09-09 17:17:42 +0900 | [diff] [blame] | 157 | #define PORT_HIZCRC	0xA405015C | 
 | 158 | #define PORT_DRVCRA	0xA405018A | 
 | 159 | #define PORT_DRVCRB	0xA405018C | 
| Magnus Damm | 6968980 | 2008-07-28 19:07:04 +0900 | [diff] [blame] | 160 |  | 
| Laurent Pinchart | 018882a | 2011-09-11 22:59:04 +0200 | [diff] [blame] | 161 | static int ap320_wvga_set_brightness(int brightness) | 
| Alexandre Courbot | bacbe55 | 2011-02-16 03:49:03 +0000 | [diff] [blame] | 162 | { | 
 | 163 | 	if (brightness) { | 
 | 164 | 		gpio_set_value(GPIO_PTS3, 0); | 
 | 165 | 		__raw_writew(0x100, FPGA_BKLREG); | 
 | 166 | 	} else { | 
 | 167 | 		__raw_writew(0, FPGA_BKLREG); | 
 | 168 | 		gpio_set_value(GPIO_PTS3, 1); | 
 | 169 | 	} | 
| Paul Mundt | 9c23c51 | 2012-05-18 15:45:09 +0900 | [diff] [blame] | 170 |  | 
| Alexandre Courbot | bacbe55 | 2011-02-16 03:49:03 +0000 | [diff] [blame] | 171 | 	return 0; | 
 | 172 | } | 
 | 173 |  | 
| Laurent Pinchart | 018882a | 2011-09-11 22:59:04 +0200 | [diff] [blame] | 174 | static int ap320_wvga_get_brightness(void) | 
| Alexandre Courbot | bacbe55 | 2011-02-16 03:49:03 +0000 | [diff] [blame] | 175 | { | 
 | 176 | 	return gpio_get_value(GPIO_PTS3); | 
 | 177 | } | 
 | 178 |  | 
| Laurent Pinchart | 018882a | 2011-09-11 22:59:04 +0200 | [diff] [blame] | 179 | static void ap320_wvga_power_on(void) | 
| Magnus Damm | 6968980 | 2008-07-28 19:07:04 +0900 | [diff] [blame] | 180 | { | 
 | 181 | 	msleep(100); | 
 | 182 |  | 
 | 183 | 	/* ASD AP-320/325 LCD ON */ | 
| Paul Mundt | 9d56dd3 | 2010-01-26 12:58:40 +0900 | [diff] [blame] | 184 | 	__raw_writew(FPGA_LCDREG_VAL, FPGA_LCDREG); | 
| Magnus Damm | 6968980 | 2008-07-28 19:07:04 +0900 | [diff] [blame] | 185 | } | 
 | 186 |  | 
| Laurent Pinchart | 018882a | 2011-09-11 22:59:04 +0200 | [diff] [blame] | 187 | static void ap320_wvga_power_off(void) | 
| Magnus Damm | 93356d0 | 2009-03-13 15:27:14 +0000 | [diff] [blame] | 188 | { | 
| Magnus Damm | 93356d0 | 2009-03-13 15:27:14 +0000 | [diff] [blame] | 189 | 	/* ASD AP-320/325 LCD OFF */ | 
| Paul Mundt | 9d56dd3 | 2010-01-26 12:58:40 +0900 | [diff] [blame] | 190 | 	__raw_writew(0, FPGA_LCDREG); | 
| Magnus Damm | 93356d0 | 2009-03-13 15:27:14 +0000 | [diff] [blame] | 191 | } | 
 | 192 |  | 
| Jesper Juhl | e04008e | 2011-07-09 23:16:22 +0200 | [diff] [blame] | 193 | static const struct fb_videomode ap325rxa_lcdc_modes[] = { | 
| Guennadi Liakhovetski | 4443240 | 2010-09-03 07:20:04 +0000 | [diff] [blame] | 194 | 	{ | 
 | 195 | 		.name = "LB070WV1", | 
 | 196 | 		.xres = 800, | 
 | 197 | 		.yres = 480, | 
 | 198 | 		.left_margin = 32, | 
 | 199 | 		.right_margin = 160, | 
 | 200 | 		.hsync_len = 8, | 
 | 201 | 		.upper_margin = 63, | 
 | 202 | 		.lower_margin = 80, | 
 | 203 | 		.vsync_len = 1, | 
 | 204 | 		.sync = 0, /* hsync and vsync are active low */ | 
 | 205 | 	}, | 
 | 206 | }; | 
 | 207 |  | 
| Magnus Damm | 6968980 | 2008-07-28 19:07:04 +0900 | [diff] [blame] | 208 | static struct sh_mobile_lcdc_info lcdc_info = { | 
 | 209 | 	.clock_source = LCDC_CLK_EXTERNAL, | 
 | 210 | 	.ch[0] = { | 
 | 211 | 		.chan = LCDC_CHAN_MAINLCD, | 
| Laurent Pinchart | edd153a | 2011-12-13 14:02:28 +0100 | [diff] [blame] | 212 | 		.fourcc = V4L2_PIX_FMT_RGB565, | 
| Magnus Damm | 6968980 | 2008-07-28 19:07:04 +0900 | [diff] [blame] | 213 | 		.interface_type = RGB18, | 
 | 214 | 		.clock_divider = 1, | 
| Laurent Pinchart | 93ff259 | 2011-11-29 14:33:41 +0100 | [diff] [blame] | 215 | 		.lcd_modes = ap325rxa_lcdc_modes, | 
 | 216 | 		.num_modes = ARRAY_SIZE(ap325rxa_lcdc_modes), | 
| Laurent Pinchart | afaad83 | 2011-09-11 22:59:04 +0200 | [diff] [blame] | 217 | 		.panel_cfg = { | 
 | 218 | 			.width = 152,	/* 7.0 inch */ | 
| Magnus Damm | ce9c008 | 2008-08-11 15:26:00 +0900 | [diff] [blame] | 219 | 			.height = 91, | 
| Magnus Damm | 6968980 | 2008-07-28 19:07:04 +0900 | [diff] [blame] | 220 | 			.display_on = ap320_wvga_power_on, | 
| Magnus Damm | 93356d0 | 2009-03-13 15:27:14 +0000 | [diff] [blame] | 221 | 			.display_off = ap320_wvga_power_off, | 
| Alexandre Courbot | bacbe55 | 2011-02-16 03:49:03 +0000 | [diff] [blame] | 222 | 		}, | 
 | 223 | 		.bl_info = { | 
 | 224 | 			.name = "sh_mobile_lcdc_bl", | 
 | 225 | 			.max_brightness = 1, | 
| Laurent Pinchart | 43059b0 | 2011-09-11 22:59:04 +0200 | [diff] [blame] | 226 | 			.set_brightness = ap320_wvga_set_brightness, | 
 | 227 | 			.get_brightness = ap320_wvga_get_brightness, | 
| Magnus Damm | 6968980 | 2008-07-28 19:07:04 +0900 | [diff] [blame] | 228 | 		}, | 
 | 229 | 	} | 
 | 230 | }; | 
 | 231 |  | 
 | 232 | static struct resource lcdc_resources[] = { | 
 | 233 | 	[0] = { | 
 | 234 | 		.name	= "LCDC", | 
 | 235 | 		.start	= 0xfe940000, /* P4-only space */ | 
| Phil Edworthy | a6f15ad | 2009-09-15 12:00:30 +0000 | [diff] [blame] | 236 | 		.end	= 0xfe942fff, | 
| Magnus Damm | 6968980 | 2008-07-28 19:07:04 +0900 | [diff] [blame] | 237 | 		.flags	= IORESOURCE_MEM, | 
 | 238 | 	}, | 
| Magnus Damm | 0790555 | 2008-12-19 12:02:16 +0900 | [diff] [blame] | 239 | 	[1] = { | 
| Paul Mundt | 9c23c51 | 2012-05-18 15:45:09 +0900 | [diff] [blame] | 240 | 		.start	= evt2irq(0x580), | 
| Magnus Damm | 0790555 | 2008-12-19 12:02:16 +0900 | [diff] [blame] | 241 | 		.flags	= IORESOURCE_IRQ, | 
 | 242 | 	}, | 
| Magnus Damm | 6968980 | 2008-07-28 19:07:04 +0900 | [diff] [blame] | 243 | }; | 
 | 244 |  | 
 | 245 | static struct platform_device lcdc_device = { | 
 | 246 | 	.name		= "sh_mobile_lcdc_fb", | 
 | 247 | 	.num_resources	= ARRAY_SIZE(lcdc_resources), | 
 | 248 | 	.resource	= lcdc_resources, | 
 | 249 | 	.dev		= { | 
 | 250 | 		.platform_data	= &lcdc_info, | 
 | 251 | 	}, | 
 | 252 | }; | 
 | 253 |  | 
| Kuninori Morimoto | 8674628 | 2009-01-22 00:33:21 +0000 | [diff] [blame] | 254 | static void camera_power(int val) | 
 | 255 | { | 
 | 256 | 	gpio_set_value(GPIO_PTZ5, val); /* RST_CAM/RSTB */ | 
 | 257 | 	mdelay(10); | 
 | 258 | } | 
 | 259 |  | 
| Magnus Damm | e565b51 | 2008-07-29 20:57:38 +0900 | [diff] [blame] | 260 | #ifdef CONFIG_I2C | 
| Kuninori Morimoto | 4713125 | 2009-01-22 00:38:31 +0000 | [diff] [blame] | 261 | /* support for the old ncm03j camera */ | 
| Magnus Damm | 8b2224d | 2008-07-28 19:14:35 +0900 | [diff] [blame] | 262 | static unsigned char camera_ncm03j_magic[] = | 
 | 263 | { | 
 | 264 | 	0x87, 0x00, 0x88, 0x08, 0x89, 0x01, 0x8A, 0xE8, | 
 | 265 | 	0x1D, 0x00, 0x1E, 0x8A, 0x21, 0x00, 0x33, 0x36, | 
 | 266 | 	0x36, 0x60, 0x37, 0x08, 0x3B, 0x31, 0x44, 0x0F, | 
 | 267 | 	0x46, 0xF0, 0x4B, 0x28, 0x4C, 0x21, 0x4D, 0x55, | 
 | 268 | 	0x4E, 0x1B, 0x4F, 0xC7, 0x50, 0xFC, 0x51, 0x12, | 
 | 269 | 	0x58, 0x02, 0x66, 0xC0, 0x67, 0x46, 0x6B, 0xA0, | 
 | 270 | 	0x6C, 0x34, 0x7E, 0x25, 0x7F, 0x25, 0x8D, 0x0F, | 
 | 271 | 	0x92, 0x40, 0x93, 0x04, 0x94, 0x26, 0x95, 0x0A, | 
 | 272 | 	0x99, 0x03, 0x9A, 0xF0, 0x9B, 0x14, 0x9D, 0x7A, | 
 | 273 | 	0xC5, 0x02, 0xD6, 0x07, 0x59, 0x00, 0x5A, 0x1A, | 
 | 274 | 	0x5B, 0x2A, 0x5C, 0x37, 0x5D, 0x42, 0x5E, 0x56, | 
 | 275 | 	0xC8, 0x00, 0xC9, 0x1A, 0xCA, 0x2A, 0xCB, 0x37, | 
 | 276 | 	0xCC, 0x42, 0xCD, 0x56, 0xCE, 0x00, 0xCF, 0x1A, | 
 | 277 | 	0xD0, 0x2A, 0xD1, 0x37, 0xD2, 0x42, 0xD3, 0x56, | 
 | 278 | 	0x5F, 0x68, 0x60, 0x87, 0x61, 0xA3, 0x62, 0xBC, | 
 | 279 | 	0x63, 0xD4, 0x64, 0xEA, 0xD6, 0x0F, | 
 | 280 | }; | 
 | 281 |  | 
| Kuninori Morimoto | 4713125 | 2009-01-22 00:38:31 +0000 | [diff] [blame] | 282 | static int camera_probe(void) | 
 | 283 | { | 
 | 284 | 	struct i2c_adapter *a = i2c_get_adapter(0); | 
 | 285 | 	struct i2c_msg msg; | 
 | 286 | 	int ret; | 
 | 287 |  | 
| Magnus Damm | 37869fa | 2009-05-20 14:30:06 +0000 | [diff] [blame] | 288 | 	if (!a) | 
 | 289 | 		return -ENODEV; | 
 | 290 |  | 
| Kuninori Morimoto | 4713125 | 2009-01-22 00:38:31 +0000 | [diff] [blame] | 291 | 	camera_power(1); | 
 | 292 | 	msg.addr = 0x6e; | 
 | 293 | 	msg.buf = camera_ncm03j_magic; | 
 | 294 | 	msg.len = 2; | 
 | 295 | 	msg.flags = 0; | 
 | 296 | 	ret = i2c_transfer(a, &msg, 1); | 
 | 297 | 	camera_power(0); | 
 | 298 |  | 
 | 299 | 	return ret; | 
 | 300 | } | 
 | 301 |  | 
| Magnus Damm | 8b2224d | 2008-07-28 19:14:35 +0900 | [diff] [blame] | 302 | static int camera_set_capture(struct soc_camera_platform_info *info, | 
 | 303 | 			      int enable) | 
 | 304 | { | 
 | 305 | 	struct i2c_adapter *a = i2c_get_adapter(0); | 
 | 306 | 	struct i2c_msg msg; | 
 | 307 | 	int ret = 0; | 
 | 308 | 	int i; | 
 | 309 |  | 
| Kuninori Morimoto | 8674628 | 2009-01-22 00:33:21 +0000 | [diff] [blame] | 310 | 	camera_power(0); | 
| Magnus Damm | 8b2224d | 2008-07-28 19:14:35 +0900 | [diff] [blame] | 311 | 	if (!enable) | 
 | 312 | 		return 0; /* no disable for now */ | 
 | 313 |  | 
| Kuninori Morimoto | 8674628 | 2009-01-22 00:33:21 +0000 | [diff] [blame] | 314 | 	camera_power(1); | 
| Magnus Damm | 8b2224d | 2008-07-28 19:14:35 +0900 | [diff] [blame] | 315 | 	for (i = 0; i < ARRAY_SIZE(camera_ncm03j_magic); i += 2) { | 
 | 316 | 		u_int8_t buf[8]; | 
 | 317 |  | 
 | 318 | 		msg.addr = 0x6e; | 
 | 319 | 		msg.buf = buf; | 
 | 320 | 		msg.len = 2; | 
 | 321 | 		msg.flags = 0; | 
 | 322 |  | 
 | 323 | 		buf[0] = camera_ncm03j_magic[i]; | 
 | 324 | 		buf[1] = camera_ncm03j_magic[i + 1]; | 
 | 325 |  | 
 | 326 | 		ret = (ret < 0) ? ret : i2c_transfer(a, &msg, 1); | 
 | 327 | 	} | 
 | 328 |  | 
 | 329 | 	return ret; | 
 | 330 | } | 
 | 331 |  | 
| Guennadi Liakhovetski | 7dfff95 | 2011-07-15 20:03:38 -0300 | [diff] [blame] | 332 | static int ap325rxa_camera_add(struct soc_camera_device *icd); | 
 | 333 | static void ap325rxa_camera_del(struct soc_camera_device *icd); | 
| Guennadi Liakhovetski | c41deba | 2009-08-25 11:06:21 -0300 | [diff] [blame] | 334 |  | 
| Magnus Damm | 8b2224d | 2008-07-28 19:14:35 +0900 | [diff] [blame] | 335 | static struct soc_camera_platform_info camera_info = { | 
| Magnus Damm | 8b2224d | 2008-07-28 19:14:35 +0900 | [diff] [blame] | 336 | 	.format_name = "UYVY", | 
 | 337 | 	.format_depth = 16, | 
 | 338 | 	.format = { | 
| Guennadi Liakhovetski | ace6e97 | 2010-07-22 16:52:51 -0300 | [diff] [blame] | 339 | 		.code = V4L2_MBUS_FMT_UYVY8_2X8, | 
| Magnus Damm | 8b2224d | 2008-07-28 19:14:35 +0900 | [diff] [blame] | 340 | 		.colorspace = V4L2_COLORSPACE_SMPTE170M, | 
| Guennadi Liakhovetski | 760697b | 2009-12-11 11:46:49 -0300 | [diff] [blame] | 341 | 		.field = V4L2_FIELD_NONE, | 
| Magnus Damm | 8b2224d | 2008-07-28 19:14:35 +0900 | [diff] [blame] | 342 | 		.width = 640, | 
 | 343 | 		.height = 480, | 
 | 344 | 	}, | 
| Guennadi Liakhovetski | 7e5cf0a | 2011-07-27 10:52:36 -0300 | [diff] [blame] | 345 | 	.mbus_param = V4L2_MBUS_PCLK_SAMPLE_RISING | V4L2_MBUS_MASTER | | 
 | 346 | 	V4L2_MBUS_VSYNC_ACTIVE_HIGH | V4L2_MBUS_HSYNC_ACTIVE_HIGH | | 
 | 347 | 	V4L2_MBUS_DATA_ACTIVE_HIGH, | 
 | 348 | 	.mbus_type = V4L2_MBUS_PARALLEL, | 
| Magnus Damm | 8b2224d | 2008-07-28 19:14:35 +0900 | [diff] [blame] | 349 | 	.set_capture = camera_set_capture, | 
| Guennadi Liakhovetski | 0f44829 | 2009-12-11 11:31:35 -0300 | [diff] [blame] | 350 | }; | 
 | 351 |  | 
| Kuninori Morimoto | f4cdd75 | 2010-06-02 00:27:26 +0000 | [diff] [blame] | 352 | static struct soc_camera_link camera_link = { | 
| Guennadi Liakhovetski | 0f44829 | 2009-12-11 11:31:35 -0300 | [diff] [blame] | 353 | 	.bus_id		= 0, | 
 | 354 | 	.add_device	= ap325rxa_camera_add, | 
 | 355 | 	.del_device	= ap325rxa_camera_del, | 
 | 356 | 	.module_name	= "soc_camera_platform", | 
 | 357 | 	.priv		= &camera_info, | 
| Magnus Damm | 8b2224d | 2008-07-28 19:14:35 +0900 | [diff] [blame] | 358 | }; | 
 | 359 |  | 
| Guennadi Liakhovetski | a3793a0 | 2011-02-22 09:57:44 +0000 | [diff] [blame] | 360 | static struct platform_device *camera_device; | 
| Guennadi Liakhovetski | 0bab829 | 2009-08-25 11:34:18 -0300 | [diff] [blame] | 361 |  | 
| Guennadi Liakhovetski | a3793a0 | 2011-02-22 09:57:44 +0000 | [diff] [blame] | 362 | static void ap325rxa_camera_release(struct device *dev) | 
 | 363 | { | 
 | 364 | 	soc_camera_platform_release(&camera_device); | 
 | 365 | } | 
| Kuninori Morimoto | 4713125 | 2009-01-22 00:38:31 +0000 | [diff] [blame] | 366 |  | 
| Guennadi Liakhovetski | 7dfff95 | 2011-07-15 20:03:38 -0300 | [diff] [blame] | 367 | static int ap325rxa_camera_add(struct soc_camera_device *icd) | 
| Kuninori Morimoto | 4713125 | 2009-01-22 00:38:31 +0000 | [diff] [blame] | 368 | { | 
| Guennadi Liakhovetski | 7dfff95 | 2011-07-15 20:03:38 -0300 | [diff] [blame] | 369 | 	int ret = soc_camera_platform_add(icd, &camera_device, &camera_link, | 
| Guennadi Liakhovetski | a3793a0 | 2011-02-22 09:57:44 +0000 | [diff] [blame] | 370 | 					  ap325rxa_camera_release, 0); | 
 | 371 | 	if (ret < 0) | 
 | 372 | 		return ret; | 
| Kuninori Morimoto | 4713125 | 2009-01-22 00:38:31 +0000 | [diff] [blame] | 373 |  | 
| Guennadi Liakhovetski | a3793a0 | 2011-02-22 09:57:44 +0000 | [diff] [blame] | 374 | 	ret = camera_probe(); | 
 | 375 | 	if (ret < 0) | 
| Guennadi Liakhovetski | 7dfff95 | 2011-07-15 20:03:38 -0300 | [diff] [blame] | 376 | 		soc_camera_platform_del(icd, camera_device, &camera_link); | 
| Guennadi Liakhovetski | bc1937b | 2009-08-25 11:06:22 -0300 | [diff] [blame] | 377 |  | 
| Guennadi Liakhovetski | a3793a0 | 2011-02-22 09:57:44 +0000 | [diff] [blame] | 378 | 	return ret; | 
| Kuninori Morimoto | 4713125 | 2009-01-22 00:38:31 +0000 | [diff] [blame] | 379 | } | 
| Kuninori Morimoto | 4713125 | 2009-01-22 00:38:31 +0000 | [diff] [blame] | 380 |  | 
| Guennadi Liakhovetski | 7dfff95 | 2011-07-15 20:03:38 -0300 | [diff] [blame] | 381 | static void ap325rxa_camera_del(struct soc_camera_device *icd) | 
| Guennadi Liakhovetski | c41deba | 2009-08-25 11:06:21 -0300 | [diff] [blame] | 382 | { | 
| Guennadi Liakhovetski | 7dfff95 | 2011-07-15 20:03:38 -0300 | [diff] [blame] | 383 | 	soc_camera_platform_del(icd, camera_device, &camera_link); | 
| Guennadi Liakhovetski | c41deba | 2009-08-25 11:06:21 -0300 | [diff] [blame] | 384 | } | 
| Magnus Damm | e565b51 | 2008-07-29 20:57:38 +0900 | [diff] [blame] | 385 | #endif /* CONFIG_I2C */ | 
| Magnus Damm | 8b2224d | 2008-07-28 19:14:35 +0900 | [diff] [blame] | 386 |  | 
| Kuninori Morimoto | 4713125 | 2009-01-22 00:38:31 +0000 | [diff] [blame] | 387 | static int ov7725_power(struct device *dev, int mode) | 
 | 388 | { | 
 | 389 | 	camera_power(0); | 
 | 390 | 	if (mode) | 
 | 391 | 		camera_power(1); | 
 | 392 |  | 
 | 393 | 	return 0; | 
 | 394 | } | 
 | 395 |  | 
| Magnus Damm | 8b2224d | 2008-07-28 19:14:35 +0900 | [diff] [blame] | 396 | static struct sh_mobile_ceu_info sh_mobile_ceu_info = { | 
| Kuninori Morimoto | 46368fa | 2009-03-11 07:20:32 +0000 | [diff] [blame] | 397 | 	.flags = SH_CEU_FLAG_USE_8BIT_BUS, | 
| Magnus Damm | 8b2224d | 2008-07-28 19:14:35 +0900 | [diff] [blame] | 398 | }; | 
 | 399 |  | 
 | 400 | static struct resource ceu_resources[] = { | 
 | 401 | 	[0] = { | 
 | 402 | 		.name	= "CEU", | 
 | 403 | 		.start	= 0xfe910000, | 
 | 404 | 		.end	= 0xfe91009f, | 
 | 405 | 		.flags	= IORESOURCE_MEM, | 
 | 406 | 	}, | 
 | 407 | 	[1] = { | 
| Paul Mundt | 9c23c51 | 2012-05-18 15:45:09 +0900 | [diff] [blame] | 408 | 		.start  = evt2irq(0x880), | 
| Magnus Damm | 8b2224d | 2008-07-28 19:14:35 +0900 | [diff] [blame] | 409 | 		.flags  = IORESOURCE_IRQ, | 
 | 410 | 	}, | 
 | 411 | 	[2] = { | 
 | 412 | 		/* place holder for contiguous memory */ | 
 | 413 | 	}, | 
 | 414 | }; | 
 | 415 |  | 
 | 416 | static struct platform_device ceu_device = { | 
 | 417 | 	.name		= "sh_mobile_ceu", | 
| Magnus Damm | a42b6dd | 2008-10-31 20:21:44 +0900 | [diff] [blame] | 418 | 	.id             = 0, /* "ceu0" clock */ | 
| Magnus Damm | 8b2224d | 2008-07-28 19:14:35 +0900 | [diff] [blame] | 419 | 	.num_resources	= ARRAY_SIZE(ceu_resources), | 
 | 420 | 	.resource	= ceu_resources, | 
 | 421 | 	.dev		= { | 
 | 422 | 		.platform_data	= &sh_mobile_ceu_info, | 
 | 423 | 	}, | 
 | 424 | }; | 
 | 425 |  | 
| Magnus Damm | 17f8147 | 2009-10-02 02:22:56 +0000 | [diff] [blame] | 426 | static struct resource sdhi0_cn3_resources[] = { | 
 | 427 | 	[0] = { | 
 | 428 | 		.name	= "SDHI0", | 
 | 429 | 		.start	= 0x04ce0000, | 
| Guennadi Liakhovetski | d80e922 | 2011-03-09 13:42:42 +0100 | [diff] [blame] | 430 | 		.end	= 0x04ce00ff, | 
| Magnus Damm | 17f8147 | 2009-10-02 02:22:56 +0000 | [diff] [blame] | 431 | 		.flags	= IORESOURCE_MEM, | 
 | 432 | 	}, | 
 | 433 | 	[1] = { | 
| Paul Mundt | 9c23c51 | 2012-05-18 15:45:09 +0900 | [diff] [blame] | 434 | 		.start	= evt2irq(0xe80), | 
| Magnus Damm | 17f8147 | 2009-10-02 02:22:56 +0000 | [diff] [blame] | 435 | 		.flags  = IORESOURCE_IRQ, | 
 | 436 | 	}, | 
| Magnus Damm | fbdd9a7 | 2009-01-07 20:35:21 +0900 | [diff] [blame] | 437 | }; | 
 | 438 |  | 
| Arnd Hannemann | 365e108 | 2010-12-28 22:22:36 +0000 | [diff] [blame] | 439 | static struct sh_mobile_sdhi_info sdhi0_cn3_data = { | 
 | 440 | 	.tmio_caps      = MMC_CAP_SDIO_IRQ, | 
 | 441 | }; | 
 | 442 |  | 
| Magnus Damm | 17f8147 | 2009-10-02 02:22:56 +0000 | [diff] [blame] | 443 | static struct platform_device sdhi0_cn3_device = { | 
 | 444 | 	.name		= "sh_mobile_sdhi", | 
| Magnus Damm | 8b431a7 | 2009-10-30 06:22:03 +0000 | [diff] [blame] | 445 | 	.id             = 0, /* "sdhi0" clock */ | 
| Magnus Damm | 17f8147 | 2009-10-02 02:22:56 +0000 | [diff] [blame] | 446 | 	.num_resources	= ARRAY_SIZE(sdhi0_cn3_resources), | 
 | 447 | 	.resource	= sdhi0_cn3_resources, | 
| Arnd Hannemann | 365e108 | 2010-12-28 22:22:36 +0000 | [diff] [blame] | 448 | 	.dev = { | 
 | 449 | 		.platform_data = &sdhi0_cn3_data, | 
 | 450 | 	}, | 
| Magnus Damm | fbdd9a7 | 2009-01-07 20:35:21 +0900 | [diff] [blame] | 451 | }; | 
 | 452 |  | 
| Magnus Damm | 8b431a7 | 2009-10-30 06:22:03 +0000 | [diff] [blame] | 453 | static struct resource sdhi1_cn7_resources[] = { | 
 | 454 | 	[0] = { | 
 | 455 | 		.name	= "SDHI1", | 
 | 456 | 		.start	= 0x04cf0000, | 
| Guennadi Liakhovetski | d80e922 | 2011-03-09 13:42:42 +0100 | [diff] [blame] | 457 | 		.end	= 0x04cf00ff, | 
| Magnus Damm | 8b431a7 | 2009-10-30 06:22:03 +0000 | [diff] [blame] | 458 | 		.flags	= IORESOURCE_MEM, | 
 | 459 | 	}, | 
 | 460 | 	[1] = { | 
| Paul Mundt | 9c23c51 | 2012-05-18 15:45:09 +0900 | [diff] [blame] | 461 | 		.start	= evt2irq(0x4e0), | 
| Magnus Damm | 8b431a7 | 2009-10-30 06:22:03 +0000 | [diff] [blame] | 462 | 		.flags  = IORESOURCE_IRQ, | 
 | 463 | 	}, | 
 | 464 | }; | 
 | 465 |  | 
| Arnd Hannemann | 365e108 | 2010-12-28 22:22:36 +0000 | [diff] [blame] | 466 | static struct sh_mobile_sdhi_info sdhi1_cn7_data = { | 
 | 467 | 	.tmio_caps      = MMC_CAP_SDIO_IRQ, | 
 | 468 | }; | 
 | 469 |  | 
| Magnus Damm | 8b431a7 | 2009-10-30 06:22:03 +0000 | [diff] [blame] | 470 | static struct platform_device sdhi1_cn7_device = { | 
 | 471 | 	.name		= "sh_mobile_sdhi", | 
 | 472 | 	.id             = 1, /* "sdhi1" clock */ | 
 | 473 | 	.num_resources	= ARRAY_SIZE(sdhi1_cn7_resources), | 
 | 474 | 	.resource	= sdhi1_cn7_resources, | 
| Arnd Hannemann | 365e108 | 2010-12-28 22:22:36 +0000 | [diff] [blame] | 475 | 	.dev = { | 
 | 476 | 		.platform_data = &sdhi1_cn7_data, | 
 | 477 | 	}, | 
| Magnus Damm | 8b431a7 | 2009-10-30 06:22:03 +0000 | [diff] [blame] | 478 | }; | 
 | 479 |  | 
| Guennadi Liakhovetski | 194a173 | 2009-05-12 15:13:36 +0000 | [diff] [blame] | 480 | static struct i2c_board_info __initdata ap325rxa_i2c_devices[] = { | 
 | 481 | 	{ | 
 | 482 | 		I2C_BOARD_INFO("pcf8563", 0x51), | 
 | 483 | 	}, | 
 | 484 | }; | 
 | 485 |  | 
 | 486 | static struct i2c_board_info ap325rxa_i2c_camera[] = { | 
 | 487 | 	{ | 
 | 488 | 		I2C_BOARD_INFO("ov772x", 0x21), | 
 | 489 | 	}, | 
 | 490 | }; | 
 | 491 |  | 
 | 492 | static struct ov772x_camera_info ov7725_info = { | 
| Guennadi Liakhovetski | 284f28e | 2011-07-28 18:24:25 -0300 | [diff] [blame] | 493 | 	.flags		= OV772X_FLAG_VFLIP | OV772X_FLAG_HFLIP, | 
| Guennadi Liakhovetski | 194a173 | 2009-05-12 15:13:36 +0000 | [diff] [blame] | 494 | 	.edgectrl	= OV772X_AUTO_EDGECTRL(0xf, 0), | 
| Guennadi Liakhovetski | 0f44829 | 2009-12-11 11:31:35 -0300 | [diff] [blame] | 495 | }; | 
 | 496 |  | 
 | 497 | static struct soc_camera_link ov7725_link = { | 
 | 498 | 	.bus_id		= 0, | 
 | 499 | 	.power		= ov7725_power, | 
 | 500 | 	.board_info	= &ap325rxa_i2c_camera[0], | 
 | 501 | 	.i2c_adapter_id	= 0, | 
| Guennadi Liakhovetski | 0f44829 | 2009-12-11 11:31:35 -0300 | [diff] [blame] | 502 | 	.priv		= &ov7725_info, | 
| Guennadi Liakhovetski | 194a173 | 2009-05-12 15:13:36 +0000 | [diff] [blame] | 503 | }; | 
 | 504 |  | 
| Guennadi Liakhovetski | c41deba | 2009-08-25 11:06:21 -0300 | [diff] [blame] | 505 | static struct platform_device ap325rxa_camera[] = { | 
 | 506 | 	{ | 
 | 507 | 		.name	= "soc-camera-pdrv", | 
 | 508 | 		.id	= 0, | 
 | 509 | 		.dev	= { | 
| Guennadi Liakhovetski | 0f44829 | 2009-12-11 11:31:35 -0300 | [diff] [blame] | 510 | 			.platform_data = &ov7725_link, | 
| Guennadi Liakhovetski | c41deba | 2009-08-25 11:06:21 -0300 | [diff] [blame] | 511 | 		}, | 
 | 512 | 	}, { | 
 | 513 | 		.name	= "soc-camera-pdrv", | 
 | 514 | 		.id	= 1, | 
 | 515 | 		.dev	= { | 
| Guennadi Liakhovetski | 0f44829 | 2009-12-11 11:31:35 -0300 | [diff] [blame] | 516 | 			.platform_data = &camera_link, | 
| Guennadi Liakhovetski | c41deba | 2009-08-25 11:06:21 -0300 | [diff] [blame] | 517 | 		}, | 
| Guennadi Liakhovetski | 194a173 | 2009-05-12 15:13:36 +0000 | [diff] [blame] | 518 | 	}, | 
 | 519 | }; | 
 | 520 |  | 
| Yusuke Goda | 04e917b | 2008-06-06 17:03:23 +0900 | [diff] [blame] | 521 | static struct platform_device *ap325rxa_devices[] __initdata = { | 
| Steve Glendinning | 90b7649 | 2009-01-07 17:20:07 +0900 | [diff] [blame] | 522 | 	&smsc9118_device, | 
| Magnus Damm | 6968980 | 2008-07-28 19:07:04 +0900 | [diff] [blame] | 523 | 	&ap325rxa_nor_flash_device, | 
 | 524 | 	&lcdc_device, | 
| Magnus Damm | 8b2224d | 2008-07-28 19:14:35 +0900 | [diff] [blame] | 525 | 	&ceu_device, | 
| Yoshihiro Shimoda | 908978a | 2008-09-09 17:17:42 +0900 | [diff] [blame] | 526 | 	&nand_flash_device, | 
| Magnus Damm | 17f8147 | 2009-10-02 02:22:56 +0000 | [diff] [blame] | 527 | 	&sdhi0_cn3_device, | 
| Magnus Damm | 8b431a7 | 2009-10-30 06:22:03 +0000 | [diff] [blame] | 528 | 	&sdhi1_cn7_device, | 
| Guennadi Liakhovetski | c41deba | 2009-08-25 11:06:21 -0300 | [diff] [blame] | 529 | 	&ap325rxa_camera[0], | 
 | 530 | 	&ap325rxa_camera[1], | 
| Magnus Damm | 026953d | 2008-07-05 12:32:44 +0900 | [diff] [blame] | 531 | }; | 
 | 532 |  | 
| Magnus Damm | 86c7d03 | 2009-10-30 04:23:51 +0000 | [diff] [blame] | 533 | extern char ap325rxa_sdram_enter_start; | 
 | 534 | extern char ap325rxa_sdram_enter_end; | 
 | 535 | extern char ap325rxa_sdram_leave_start; | 
 | 536 | extern char ap325rxa_sdram_leave_end; | 
 | 537 |  | 
| Yusuke Goda | 04e917b | 2008-06-06 17:03:23 +0900 | [diff] [blame] | 538 | static int __init ap325rxa_devices_setup(void) | 
 | 539 | { | 
| Magnus Damm | 86c7d03 | 2009-10-30 04:23:51 +0000 | [diff] [blame] | 540 | 	/* register board specific self-refresh code */ | 
 | 541 | 	sh_mobile_register_self_refresh(SUSP_SH_STANDBY | SUSP_SH_SF, | 
 | 542 | 					&ap325rxa_sdram_enter_start, | 
 | 543 | 					&ap325rxa_sdram_enter_end, | 
 | 544 | 					&ap325rxa_sdram_leave_start, | 
 | 545 | 					&ap325rxa_sdram_leave_end); | 
 | 546 |  | 
| Magnus Damm | 16587c4 | 2008-10-08 20:42:20 +0900 | [diff] [blame] | 547 | 	/* LD3 and LD4 LEDs */ | 
 | 548 | 	gpio_request(GPIO_PTX5, NULL); /* RUN */ | 
 | 549 | 	gpio_direction_output(GPIO_PTX5, 1); | 
 | 550 | 	gpio_export(GPIO_PTX5, 0); | 
 | 551 |  | 
 | 552 | 	gpio_request(GPIO_PTX4, NULL); /* INDICATOR */ | 
 | 553 | 	gpio_direction_output(GPIO_PTX4, 0); | 
 | 554 | 	gpio_export(GPIO_PTX4, 0); | 
 | 555 |  | 
 | 556 | 	/* SW1 input */ | 
 | 557 | 	gpio_request(GPIO_PTF7, NULL); /* MODE */ | 
 | 558 | 	gpio_direction_input(GPIO_PTF7); | 
 | 559 | 	gpio_export(GPIO_PTF7, 0); | 
 | 560 |  | 
 | 561 | 	/* LCDC */ | 
| Magnus Damm | 16587c4 | 2008-10-08 20:42:20 +0900 | [diff] [blame] | 562 | 	gpio_request(GPIO_FN_LCDD15, NULL); | 
 | 563 | 	gpio_request(GPIO_FN_LCDD14, NULL); | 
 | 564 | 	gpio_request(GPIO_FN_LCDD13, NULL); | 
 | 565 | 	gpio_request(GPIO_FN_LCDD12, NULL); | 
 | 566 | 	gpio_request(GPIO_FN_LCDD11, NULL); | 
 | 567 | 	gpio_request(GPIO_FN_LCDD10, NULL); | 
 | 568 | 	gpio_request(GPIO_FN_LCDD9, NULL); | 
 | 569 | 	gpio_request(GPIO_FN_LCDD8, NULL); | 
 | 570 | 	gpio_request(GPIO_FN_LCDD7, NULL); | 
 | 571 | 	gpio_request(GPIO_FN_LCDD6, NULL); | 
 | 572 | 	gpio_request(GPIO_FN_LCDD5, NULL); | 
 | 573 | 	gpio_request(GPIO_FN_LCDD4, NULL); | 
 | 574 | 	gpio_request(GPIO_FN_LCDD3, NULL); | 
 | 575 | 	gpio_request(GPIO_FN_LCDD2, NULL); | 
 | 576 | 	gpio_request(GPIO_FN_LCDD1, NULL); | 
 | 577 | 	gpio_request(GPIO_FN_LCDD0, NULL); | 
 | 578 | 	gpio_request(GPIO_FN_LCDLCLK_PTR, NULL); | 
 | 579 | 	gpio_request(GPIO_FN_LCDDCK, NULL); | 
 | 580 | 	gpio_request(GPIO_FN_LCDVEPWC, NULL); | 
 | 581 | 	gpio_request(GPIO_FN_LCDVCPWC, NULL); | 
 | 582 | 	gpio_request(GPIO_FN_LCDVSYN, NULL); | 
 | 583 | 	gpio_request(GPIO_FN_LCDHSYN, NULL); | 
 | 584 | 	gpio_request(GPIO_FN_LCDDISP, NULL); | 
 | 585 | 	gpio_request(GPIO_FN_LCDDON, NULL); | 
 | 586 |  | 
 | 587 | 	/* LCD backlight */ | 
 | 588 | 	gpio_request(GPIO_PTS3, NULL); | 
 | 589 | 	gpio_direction_output(GPIO_PTS3, 1); | 
 | 590 |  | 
 | 591 | 	/* CEU */ | 
| Magnus Damm | 16587c4 | 2008-10-08 20:42:20 +0900 | [diff] [blame] | 592 | 	gpio_request(GPIO_FN_VIO_CLK2, NULL); | 
 | 593 | 	gpio_request(GPIO_FN_VIO_VD2, NULL); | 
 | 594 | 	gpio_request(GPIO_FN_VIO_HD2, NULL); | 
 | 595 | 	gpio_request(GPIO_FN_VIO_FLD, NULL); | 
 | 596 | 	gpio_request(GPIO_FN_VIO_CKO, NULL); | 
 | 597 | 	gpio_request(GPIO_FN_VIO_D15, NULL); | 
 | 598 | 	gpio_request(GPIO_FN_VIO_D14, NULL); | 
 | 599 | 	gpio_request(GPIO_FN_VIO_D13, NULL); | 
 | 600 | 	gpio_request(GPIO_FN_VIO_D12, NULL); | 
 | 601 | 	gpio_request(GPIO_FN_VIO_D11, NULL); | 
 | 602 | 	gpio_request(GPIO_FN_VIO_D10, NULL); | 
 | 603 | 	gpio_request(GPIO_FN_VIO_D9, NULL); | 
 | 604 | 	gpio_request(GPIO_FN_VIO_D8, NULL); | 
 | 605 |  | 
 | 606 | 	gpio_request(GPIO_PTZ7, NULL); | 
 | 607 | 	gpio_direction_output(GPIO_PTZ7, 0); /* OE_CAM */ | 
 | 608 | 	gpio_request(GPIO_PTZ6, NULL); | 
 | 609 | 	gpio_direction_output(GPIO_PTZ6, 0); /* STBY_CAM */ | 
 | 610 | 	gpio_request(GPIO_PTZ5, NULL); | 
| Kuninori Morimoto | 8674628 | 2009-01-22 00:33:21 +0000 | [diff] [blame] | 611 | 	gpio_direction_output(GPIO_PTZ5, 0); /* RST_CAM */ | 
| Magnus Damm | 16587c4 | 2008-10-08 20:42:20 +0900 | [diff] [blame] | 612 | 	gpio_request(GPIO_PTZ4, NULL); | 
 | 613 | 	gpio_direction_output(GPIO_PTZ4, 0); /* SADDR */ | 
 | 614 |  | 
| Paul Mundt | 9d56dd3 | 2010-01-26 12:58:40 +0900 | [diff] [blame] | 615 | 	__raw_writew(__raw_readw(PORT_MSELCRB) & ~0x0001, PORT_MSELCRB); | 
| Magnus Damm | 8b2224d | 2008-07-28 19:14:35 +0900 | [diff] [blame] | 616 |  | 
| Yoshihiro Shimoda | 908978a | 2008-09-09 17:17:42 +0900 | [diff] [blame] | 617 | 	/* FLCTL */ | 
| Paul Mundt | dd0e20e | 2008-10-21 18:08:10 +0900 | [diff] [blame] | 618 | 	gpio_request(GPIO_FN_FCE, NULL); | 
 | 619 | 	gpio_request(GPIO_FN_NAF7, NULL); | 
 | 620 | 	gpio_request(GPIO_FN_NAF6, NULL); | 
 | 621 | 	gpio_request(GPIO_FN_NAF5, NULL); | 
 | 622 | 	gpio_request(GPIO_FN_NAF4, NULL); | 
 | 623 | 	gpio_request(GPIO_FN_NAF3, NULL); | 
 | 624 | 	gpio_request(GPIO_FN_NAF2, NULL); | 
 | 625 | 	gpio_request(GPIO_FN_NAF1, NULL); | 
 | 626 | 	gpio_request(GPIO_FN_NAF0, NULL); | 
 | 627 | 	gpio_request(GPIO_FN_FCDE, NULL); | 
 | 628 | 	gpio_request(GPIO_FN_FOE, NULL); | 
 | 629 | 	gpio_request(GPIO_FN_FSC, NULL); | 
 | 630 | 	gpio_request(GPIO_FN_FWE, NULL); | 
 | 631 | 	gpio_request(GPIO_FN_FRB, NULL); | 
| Yoshihiro Shimoda | 908978a | 2008-09-09 17:17:42 +0900 | [diff] [blame] | 632 |  | 
| Paul Mundt | 9d56dd3 | 2010-01-26 12:58:40 +0900 | [diff] [blame] | 633 | 	__raw_writew(0, PORT_HIZCRC); | 
 | 634 | 	__raw_writew(0xFFFF, PORT_DRVCRA); | 
 | 635 | 	__raw_writew(0xFFFF, PORT_DRVCRB); | 
| Yoshihiro Shimoda | 908978a | 2008-09-09 17:17:42 +0900 | [diff] [blame] | 636 |  | 
| Magnus Damm | 8b2224d | 2008-07-28 19:14:35 +0900 | [diff] [blame] | 637 | 	platform_resource_setup_memory(&ceu_device, "ceu", 4 << 20); | 
| Magnus Damm | 6968980 | 2008-07-28 19:07:04 +0900 | [diff] [blame] | 638 |  | 
| Magnus Damm | 8b431a7 | 2009-10-30 06:22:03 +0000 | [diff] [blame] | 639 | 	/* SDHI0 - CN3 - SD CARD */ | 
| Magnus Damm | 17f8147 | 2009-10-02 02:22:56 +0000 | [diff] [blame] | 640 | 	gpio_request(GPIO_FN_SDHI0CD_PTD, NULL); | 
 | 641 | 	gpio_request(GPIO_FN_SDHI0WP_PTD, NULL); | 
 | 642 | 	gpio_request(GPIO_FN_SDHI0D3_PTD, NULL); | 
 | 643 | 	gpio_request(GPIO_FN_SDHI0D2_PTD, NULL); | 
 | 644 | 	gpio_request(GPIO_FN_SDHI0D1_PTD, NULL); | 
 | 645 | 	gpio_request(GPIO_FN_SDHI0D0_PTD, NULL); | 
 | 646 | 	gpio_request(GPIO_FN_SDHI0CMD_PTD, NULL); | 
 | 647 | 	gpio_request(GPIO_FN_SDHI0CLK_PTD, NULL); | 
 | 648 |  | 
| Magnus Damm | 8b431a7 | 2009-10-30 06:22:03 +0000 | [diff] [blame] | 649 | 	/* SDHI1 - CN7 - MICRO SD CARD */ | 
 | 650 | 	gpio_request(GPIO_FN_SDHI1CD, NULL); | 
 | 651 | 	gpio_request(GPIO_FN_SDHI1D3, NULL); | 
 | 652 | 	gpio_request(GPIO_FN_SDHI1D2, NULL); | 
 | 653 | 	gpio_request(GPIO_FN_SDHI1D1, NULL); | 
 | 654 | 	gpio_request(GPIO_FN_SDHI1D0, NULL); | 
 | 655 | 	gpio_request(GPIO_FN_SDHI1CMD, NULL); | 
 | 656 | 	gpio_request(GPIO_FN_SDHI1CLK, NULL); | 
 | 657 |  | 
| Magnus Damm | 026953d | 2008-07-05 12:32:44 +0900 | [diff] [blame] | 658 | 	i2c_register_board_info(0, ap325rxa_i2c_devices, | 
 | 659 | 				ARRAY_SIZE(ap325rxa_i2c_devices)); | 
| Yoshihiro Shimoda | 908978a | 2008-09-09 17:17:42 +0900 | [diff] [blame] | 660 |  | 
| Yusuke Goda | 04e917b | 2008-06-06 17:03:23 +0900 | [diff] [blame] | 661 | 	return platform_add_devices(ap325rxa_devices, | 
 | 662 | 				ARRAY_SIZE(ap325rxa_devices)); | 
 | 663 | } | 
| Magnus Damm | dbefd60 | 2009-08-07 03:52:18 +0000 | [diff] [blame] | 664 | arch_initcall(ap325rxa_devices_setup); | 
| Yusuke Goda | 04e917b | 2008-06-06 17:03:23 +0900 | [diff] [blame] | 665 |  | 
| Magnus Damm | c01641b | 2009-06-03 08:26:40 +0000 | [diff] [blame] | 666 | /* Return the board specific boot mode pin configuration */ | 
 | 667 | static int ap325rxa_mode_pins(void) | 
 | 668 | { | 
 | 669 | 	/* MD0=0, MD1=0, MD2=0: Clock Mode 0 | 
 | 670 | 	 * MD3=0: 16-bit Area0 Bus Width | 
 | 671 | 	 * MD5=1: Little Endian | 
 | 672 | 	 * TSTMD=1, MD8=1: Test Mode Disabled | 
 | 673 | 	 */ | 
 | 674 | 	return MODE_PIN5 | MODE_PIN8; | 
 | 675 | } | 
 | 676 |  | 
| Yusuke Goda | 04e917b | 2008-06-06 17:03:23 +0900 | [diff] [blame] | 677 | static struct sh_machine_vector mv_ap325rxa __initmv = { | 
 | 678 | 	.mv_name = "AP-325RXA", | 
| Magnus Damm | c01641b | 2009-06-03 08:26:40 +0000 | [diff] [blame] | 679 | 	.mv_mode_pins = ap325rxa_mode_pins, | 
| Yusuke Goda | 04e917b | 2008-06-06 17:03:23 +0900 | [diff] [blame] | 680 | }; |