SH: add support for the RJ54N1CB0C camera for the kfr2r09 platform
Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de> Signed-off-by: Paul Mundt <lethal@linux-sh.org>
This commit is contained in:
parent
bd381934bf
commit
a469f627c1
@ -18,6 +18,8 @@
|
|||||||
#include <linux/input.h>
|
#include <linux/input.h>
|
||||||
#include <linux/i2c.h>
|
#include <linux/i2c.h>
|
||||||
#include <linux/usb/r8a66597.h>
|
#include <linux/usb/r8a66597.h>
|
||||||
|
#include <media/soc_camera.h>
|
||||||
|
#include <media/sh_mobile_ceu.h>
|
||||||
#include <video/sh_mobile_lcdc.h>
|
#include <video/sh_mobile_lcdc.h>
|
||||||
#include <asm/clock.h>
|
#include <asm/clock.h>
|
||||||
#include <asm/machvec.h>
|
#include <asm/machvec.h>
|
||||||
@ -212,11 +214,131 @@ static struct platform_device kfr2r09_usb0_gadget_device = {
|
|||||||
.resource = kfr2r09_usb0_gadget_resources,
|
.resource = kfr2r09_usb0_gadget_resources,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct sh_mobile_ceu_info sh_mobile_ceu_info = {
|
||||||
|
.flags = SH_CEU_FLAG_USE_8BIT_BUS,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct resource kfr2r09_ceu_resources[] = {
|
||||||
|
[0] = {
|
||||||
|
.name = "CEU",
|
||||||
|
.start = 0xfe910000,
|
||||||
|
.end = 0xfe91009f,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
},
|
||||||
|
[1] = {
|
||||||
|
.start = 52,
|
||||||
|
.end = 52,
|
||||||
|
.flags = IORESOURCE_IRQ,
|
||||||
|
},
|
||||||
|
[2] = {
|
||||||
|
/* place holder for contiguous memory */
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device kfr2r09_ceu_device = {
|
||||||
|
.name = "sh_mobile_ceu",
|
||||||
|
.id = 0, /* "ceu0" clock */
|
||||||
|
.num_resources = ARRAY_SIZE(kfr2r09_ceu_resources),
|
||||||
|
.resource = kfr2r09_ceu_resources,
|
||||||
|
.dev = {
|
||||||
|
.platform_data = &sh_mobile_ceu_info,
|
||||||
|
},
|
||||||
|
.archdata = {
|
||||||
|
.hwblk_id = HWBLK_CEU0,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct i2c_board_info kfr2r09_i2c_camera = {
|
||||||
|
I2C_BOARD_INFO("rj54n1cb0c", 0x50),
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk *camera_clk;
|
||||||
|
|
||||||
|
#define DRVCRB 0xA405018C
|
||||||
|
static int camera_power(struct device *dev, int mode)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if (mode) {
|
||||||
|
long rate;
|
||||||
|
|
||||||
|
camera_clk = clk_get(NULL, "video_clk");
|
||||||
|
if (IS_ERR(camera_clk))
|
||||||
|
return PTR_ERR(camera_clk);
|
||||||
|
|
||||||
|
/* set VIO_CKO clock to 25MHz */
|
||||||
|
rate = clk_round_rate(camera_clk, 25000000);
|
||||||
|
ret = clk_set_rate(camera_clk, rate);
|
||||||
|
if (ret < 0)
|
||||||
|
goto eclkrate;
|
||||||
|
|
||||||
|
/* set DRVCRB
|
||||||
|
*
|
||||||
|
* use 1.8 V for VccQ_VIO
|
||||||
|
* use 2.85V for VccQ_SR
|
||||||
|
*/
|
||||||
|
ctrl_outw((ctrl_inw(DRVCRB) & ~0x0003) | 0x0001, DRVCRB);
|
||||||
|
|
||||||
|
/* reset clear */
|
||||||
|
ret = gpio_request(GPIO_PTB4, NULL);
|
||||||
|
if (ret < 0)
|
||||||
|
goto eptb4;
|
||||||
|
ret = gpio_request(GPIO_PTB7, NULL);
|
||||||
|
if (ret < 0)
|
||||||
|
goto eptb7;
|
||||||
|
|
||||||
|
ret = gpio_direction_output(GPIO_PTB4, 1);
|
||||||
|
if (!ret)
|
||||||
|
ret = gpio_direction_output(GPIO_PTB7, 1);
|
||||||
|
if (ret < 0)
|
||||||
|
goto egpioout;
|
||||||
|
msleep(1);
|
||||||
|
|
||||||
|
ret = clk_enable(camera_clk); /* start VIO_CKO */
|
||||||
|
if (ret < 0)
|
||||||
|
goto eclkon;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = 0;
|
||||||
|
|
||||||
|
clk_disable(camera_clk);
|
||||||
|
eclkon:
|
||||||
|
gpio_set_value(GPIO_PTB7, 0);
|
||||||
|
egpioout:
|
||||||
|
gpio_set_value(GPIO_PTB4, 0);
|
||||||
|
gpio_free(GPIO_PTB7);
|
||||||
|
eptb7:
|
||||||
|
gpio_free(GPIO_PTB4);
|
||||||
|
eptb4:
|
||||||
|
eclkrate:
|
||||||
|
clk_put(camera_clk);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct soc_camera_link rj54n1_link = {
|
||||||
|
.power = camera_power,
|
||||||
|
.board_info = &kfr2r09_i2c_camera,
|
||||||
|
.i2c_adapter_id = 1,
|
||||||
|
.module_name = "rj54n1cb0c",
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device kfr2r09_camera = {
|
||||||
|
.name = "soc-camera-pdrv",
|
||||||
|
.id = 0,
|
||||||
|
.dev = {
|
||||||
|
.platform_data = &rj54n1_link,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
static struct platform_device *kfr2r09_devices[] __initdata = {
|
static struct platform_device *kfr2r09_devices[] __initdata = {
|
||||||
&kfr2r09_nor_flash_device,
|
&kfr2r09_nor_flash_device,
|
||||||
&kfr2r09_nand_flash_device,
|
&kfr2r09_nand_flash_device,
|
||||||
&kfr2r09_sh_keysc_device,
|
&kfr2r09_sh_keysc_device,
|
||||||
&kfr2r09_sh_lcdc_device,
|
&kfr2r09_sh_lcdc_device,
|
||||||
|
&kfr2r09_ceu_device,
|
||||||
|
&kfr2r09_camera,
|
||||||
};
|
};
|
||||||
|
|
||||||
#define BSC_CS0BCR 0xfec10004
|
#define BSC_CS0BCR 0xfec10004
|
||||||
@ -361,6 +483,23 @@ static int __init kfr2r09_devices_setup(void)
|
|||||||
if (kfr2r09_usb0_gadget_setup() == 0)
|
if (kfr2r09_usb0_gadget_setup() == 0)
|
||||||
platform_device_register(&kfr2r09_usb0_gadget_device);
|
platform_device_register(&kfr2r09_usb0_gadget_device);
|
||||||
|
|
||||||
|
/* CEU */
|
||||||
|
gpio_request(GPIO_FN_VIO_CKO, NULL);
|
||||||
|
gpio_request(GPIO_FN_VIO0_CLK, NULL);
|
||||||
|
gpio_request(GPIO_FN_VIO0_VD, NULL);
|
||||||
|
gpio_request(GPIO_FN_VIO0_HD, NULL);
|
||||||
|
gpio_request(GPIO_FN_VIO0_FLD, NULL);
|
||||||
|
gpio_request(GPIO_FN_VIO0_D7, NULL);
|
||||||
|
gpio_request(GPIO_FN_VIO0_D6, NULL);
|
||||||
|
gpio_request(GPIO_FN_VIO0_D5, NULL);
|
||||||
|
gpio_request(GPIO_FN_VIO0_D4, NULL);
|
||||||
|
gpio_request(GPIO_FN_VIO0_D3, NULL);
|
||||||
|
gpio_request(GPIO_FN_VIO0_D2, NULL);
|
||||||
|
gpio_request(GPIO_FN_VIO0_D1, NULL);
|
||||||
|
gpio_request(GPIO_FN_VIO0_D0, NULL);
|
||||||
|
|
||||||
|
platform_resource_setup_memory(&kfr2r09_ceu_device, "ceu", 4 << 20);
|
||||||
|
|
||||||
return platform_add_devices(kfr2r09_devices,
|
return platform_add_devices(kfr2r09_devices,
|
||||||
ARRAY_SIZE(kfr2r09_devices));
|
ARRAY_SIZE(kfr2r09_devices));
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user