aboutsummaryrefslogtreecommitdiffstats
path: root/arch/sh/boards/mach-kfr2r09/setup.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/sh/boards/mach-kfr2r09/setup.c')
-rw-r--r--arch/sh/boards/mach-kfr2r09/setup.c185
1 files changed, 185 insertions, 0 deletions
diff --git a/arch/sh/boards/mach-kfr2r09/setup.c b/arch/sh/boards/mach-kfr2r09/setup.c
index c08d33fe2104..85fa8a3b7f73 100644
--- a/arch/sh/boards/mach-kfr2r09/setup.c
+++ b/arch/sh/boards/mach-kfr2r09/setup.c
@@ -18,7 +18,10 @@
18#include <linux/input.h> 18#include <linux/input.h>
19#include <linux/i2c.h> 19#include <linux/i2c.h>
20#include <linux/usb/r8a66597.h> 20#include <linux/usb/r8a66597.h>
21#include <media/soc_camera.h>
22#include <media/sh_mobile_ceu.h>
21#include <video/sh_mobile_lcdc.h> 23#include <video/sh_mobile_lcdc.h>
24#include <asm/suspend.h>
22#include <asm/clock.h> 25#include <asm/clock.h>
23#include <asm/machvec.h> 26#include <asm/machvec.h>
24#include <asm/io.h> 27#include <asm/io.h>
@@ -212,11 +215,154 @@ static struct platform_device kfr2r09_usb0_gadget_device = {
212 .resource = kfr2r09_usb0_gadget_resources, 215 .resource = kfr2r09_usb0_gadget_resources,
213}; 216};
214 217
218static struct sh_mobile_ceu_info sh_mobile_ceu_info = {
219 .flags = SH_CEU_FLAG_USE_8BIT_BUS,
220};
221
222static struct resource kfr2r09_ceu_resources[] = {
223 [0] = {
224 .name = "CEU",
225 .start = 0xfe910000,
226 .end = 0xfe91009f,
227 .flags = IORESOURCE_MEM,
228 },
229 [1] = {
230 .start = 52,
231 .end = 52,
232 .flags = IORESOURCE_IRQ,
233 },
234 [2] = {
235 /* place holder for contiguous memory */
236 },
237};
238
239static struct platform_device kfr2r09_ceu_device = {
240 .name = "sh_mobile_ceu",
241 .id = 0, /* "ceu0" clock */
242 .num_resources = ARRAY_SIZE(kfr2r09_ceu_resources),
243 .resource = kfr2r09_ceu_resources,
244 .dev = {
245 .platform_data = &sh_mobile_ceu_info,
246 },
247 .archdata = {
248 .hwblk_id = HWBLK_CEU0,
249 },
250};
251
252static struct i2c_board_info kfr2r09_i2c_camera = {
253 I2C_BOARD_INFO("rj54n1cb0c", 0x50),
254};
255
256static struct clk *camera_clk;
257
258#define DRVCRB 0xA405018C
259static int camera_power(struct device *dev, int mode)
260{
261 int ret;
262
263 if (mode) {
264 long rate;
265
266 camera_clk = clk_get(NULL, "video_clk");
267 if (IS_ERR(camera_clk))
268 return PTR_ERR(camera_clk);
269
270 /* set VIO_CKO clock to 25MHz */
271 rate = clk_round_rate(camera_clk, 25000000);
272 ret = clk_set_rate(camera_clk, rate);
273 if (ret < 0)
274 goto eclkrate;
275
276 /* set DRVCRB
277 *
278 * use 1.8 V for VccQ_VIO
279 * use 2.85V for VccQ_SR
280 */
281 ctrl_outw((ctrl_inw(DRVCRB) & ~0x0003) | 0x0001, DRVCRB);
282
283 /* reset clear */
284 ret = gpio_request(GPIO_PTB4, NULL);
285 if (ret < 0)
286 goto eptb4;
287 ret = gpio_request(GPIO_PTB7, NULL);
288 if (ret < 0)
289 goto eptb7;
290
291 ret = gpio_direction_output(GPIO_PTB4, 1);
292 if (!ret)
293 ret = gpio_direction_output(GPIO_PTB7, 1);
294 if (ret < 0)
295 goto egpioout;
296 msleep(1);
297
298 ret = clk_enable(camera_clk); /* start VIO_CKO */
299 if (ret < 0)
300 goto eclkon;
301
302 return 0;
303 }
304
305 ret = 0;
306
307 clk_disable(camera_clk);
308eclkon:
309 gpio_set_value(GPIO_PTB7, 0);
310egpioout:
311 gpio_set_value(GPIO_PTB4, 0);
312 gpio_free(GPIO_PTB7);
313eptb7:
314 gpio_free(GPIO_PTB4);
315eptb4:
316eclkrate:
317 clk_put(camera_clk);
318 return ret;
319}
320
321static struct soc_camera_link rj54n1_link = {
322 .power = camera_power,
323 .board_info = &kfr2r09_i2c_camera,
324 .i2c_adapter_id = 1,
325 .module_name = "rj54n1cb0c",
326};
327
328static struct platform_device kfr2r09_camera = {
329 .name = "soc-camera-pdrv",
330 .id = 0,
331 .dev = {
332 .platform_data = &rj54n1_link,
333 },
334};
335
336static struct resource kfr2r09_sh_sdhi0_resources[] = {
337 [0] = {
338 .name = "SDHI0",
339 .start = 0x04ce0000,
340 .end = 0x04ce01ff,
341 .flags = IORESOURCE_MEM,
342 },
343 [1] = {
344 .start = 101,
345 .flags = IORESOURCE_IRQ,
346 },
347};
348
349static struct platform_device kfr2r09_sh_sdhi0_device = {
350 .name = "sh_mobile_sdhi",
351 .num_resources = ARRAY_SIZE(kfr2r09_sh_sdhi0_resources),
352 .resource = kfr2r09_sh_sdhi0_resources,
353 .archdata = {
354 .hwblk_id = HWBLK_SDHI0,
355 },
356};
357
215static struct platform_device *kfr2r09_devices[] __initdata = { 358static struct platform_device *kfr2r09_devices[] __initdata = {
216 &kfr2r09_nor_flash_device, 359 &kfr2r09_nor_flash_device,
217 &kfr2r09_nand_flash_device, 360 &kfr2r09_nand_flash_device,
218 &kfr2r09_sh_keysc_device, 361 &kfr2r09_sh_keysc_device,
219 &kfr2r09_sh_lcdc_device, 362 &kfr2r09_sh_lcdc_device,
363 &kfr2r09_ceu_device,
364 &kfr2r09_camera,
365 &kfr2r09_sh_sdhi0_device,
220}; 366};
221 367
222#define BSC_CS0BCR 0xfec10004 368#define BSC_CS0BCR 0xfec10004
@@ -299,8 +445,21 @@ static int kfr2r09_usb0_gadget_setup(void)
299 return 0; 445 return 0;
300} 446}
301 447
448extern char kfr2r09_sdram_enter_start;
449extern char kfr2r09_sdram_enter_end;
450extern char kfr2r09_sdram_leave_start;
451extern char kfr2r09_sdram_leave_end;
452
302static int __init kfr2r09_devices_setup(void) 453static int __init kfr2r09_devices_setup(void)
303{ 454{
455 /* register board specific self-refresh code */
456 sh_mobile_register_self_refresh(SUSP_SH_STANDBY | SUSP_SH_SF |
457 SUSP_SH_RSTANDBY,
458 &kfr2r09_sdram_enter_start,
459 &kfr2r09_sdram_enter_end,
460 &kfr2r09_sdram_leave_start,
461 &kfr2r09_sdram_leave_end);
462
304 /* enable SCIF1 serial port for YC401 console support */ 463 /* enable SCIF1 serial port for YC401 console support */
305 gpio_request(GPIO_FN_SCIF1_RXD, NULL); 464 gpio_request(GPIO_FN_SCIF1_RXD, NULL);
306 gpio_request(GPIO_FN_SCIF1_TXD, NULL); 465 gpio_request(GPIO_FN_SCIF1_TXD, NULL);
@@ -361,6 +520,32 @@ static int __init kfr2r09_devices_setup(void)
361 if (kfr2r09_usb0_gadget_setup() == 0) 520 if (kfr2r09_usb0_gadget_setup() == 0)
362 platform_device_register(&kfr2r09_usb0_gadget_device); 521 platform_device_register(&kfr2r09_usb0_gadget_device);
363 522
523 /* CEU */
524 gpio_request(GPIO_FN_VIO_CKO, NULL);
525 gpio_request(GPIO_FN_VIO0_CLK, NULL);
526 gpio_request(GPIO_FN_VIO0_VD, NULL);
527 gpio_request(GPIO_FN_VIO0_HD, NULL);
528 gpio_request(GPIO_FN_VIO0_FLD, NULL);
529 gpio_request(GPIO_FN_VIO0_D7, NULL);
530 gpio_request(GPIO_FN_VIO0_D6, NULL);
531 gpio_request(GPIO_FN_VIO0_D5, NULL);
532 gpio_request(GPIO_FN_VIO0_D4, NULL);
533 gpio_request(GPIO_FN_VIO0_D3, NULL);
534 gpio_request(GPIO_FN_VIO0_D2, NULL);
535 gpio_request(GPIO_FN_VIO0_D1, NULL);
536 gpio_request(GPIO_FN_VIO0_D0, NULL);
537
538 platform_resource_setup_memory(&kfr2r09_ceu_device, "ceu", 4 << 20);
539
540 /* SDHI0 connected to yc304 */
541 gpio_request(GPIO_FN_SDHI0CD, NULL);
542 gpio_request(GPIO_FN_SDHI0D3, NULL);
543 gpio_request(GPIO_FN_SDHI0D2, NULL);
544 gpio_request(GPIO_FN_SDHI0D1, NULL);
545 gpio_request(GPIO_FN_SDHI0D0, NULL);
546 gpio_request(GPIO_FN_SDHI0CMD, NULL);
547 gpio_request(GPIO_FN_SDHI0CLK, NULL);
548
364 return platform_add_devices(kfr2r09_devices, 549 return platform_add_devices(kfr2r09_devices,
365 ARRAY_SIZE(kfr2r09_devices)); 550 ARRAY_SIZE(kfr2r09_devices));
366} 551}