2018-05-28 12:37:11 -04:00
// SPDX-License-Identifier: GPL-2.0
2008-06-06 17:03:23 +09:00
/*
* Renesas - AP - 325 RXA
* ( Compatible with Algo System . , LTD . - AP - 320 A )
*
* Copyright ( C ) 2008 Renesas Solutions Corp .
* Author : Yusuke Goda < goda . yuske @ renesas . com >
*/
2018-05-28 12:37:11 -04:00
# include <asm/clock.h>
# include <asm/io.h>
# include <asm/suspend.h>
# include <cpu/sh7723.h>
2020-09-22 15:31:03 +02:00
# include <linux/dma-map-ops.h>
2018-05-28 12:37:11 -04:00
# include <linux/clkdev.h>
# include <linux/delay.h>
2008-06-06 17:03:23 +09:00
# include <linux/device.h>
2018-05-28 12:37:11 -04:00
# include <linux/gpio.h>
2023-02-07 16:29:45 +02:00
# include <linux/gpio/consumer.h>
2018-05-28 12:37:11 -04:00
# include <linux/gpio/machine.h>
# include <linux/i2c.h>
# include <linux/init.h>
2008-07-28 19:11:07 +09:00
# include <linux/interrupt.h>
2018-05-28 12:37:11 -04:00
# include <linux/memblock.h>
# include <linux/mfd/tmio.h>
2010-12-28 22:22:36 +00:00
# include <linux/mmc/host.h>
2008-06-06 17:03:23 +09:00
# include <linux/mtd/physmap.h>
2008-09-09 17:17:42 +09:00
# include <linux/mtd/sh_flctl.h>
2018-05-28 12:37:11 -04:00
# include <linux/platform_device.h>
2012-06-27 00:50:04 +02:00
# include <linux/regulator/fixed.h>
# include <linux/regulator/machine.h>
2018-05-28 12:37:11 -04:00
# include <linux/sh_intc.h>
2009-01-07 17:20:07 +09:00
# include <linux/smsc911x.h>
2012-01-25 22:07:05 +01:00
# include <linux/videodev2.h>
2018-05-28 12:37:11 -04:00
# include <media/drv-intf/renesas-ceu.h>
2015-11-10 12:01:44 -02:00
# include <media/i2c/ov772x.h>
2018-05-28 12:37:11 -04:00
2008-10-01 16:24:32 +09:00
# include <video/sh_mobile_lcdc.h>
2018-05-28 12:37:11 -04:00
# define CEU_BUFFER_MEMORY_SIZE (4 << 20)
static phys_addr_t ceu_dma_membase ;
2008-06-06 17:03:23 +09:00
2012-06-27 00:50:04 +02:00
/* Dummy supplies, where voltage doesn't matter */
static struct regulator_consumer_supply dummy_supplies [ ] = {
REGULATOR_SUPPLY ( " vddvario " , " smsc911x " ) ,
REGULATOR_SUPPLY ( " vdd33a " , " smsc911x " ) ,
} ;
2009-01-07 17:20:07 +09:00
static struct smsc911x_platform_config smsc911x_config = {
. phy_interface = PHY_INTERFACE_MODE_MII ,
. irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_LOW ,
. irq_type = SMSC911X_IRQ_TYPE_OPEN_DRAIN ,
. flags = SMSC911X_USE_32BIT ,
2008-07-28 19:11:07 +09:00
} ;
2009-01-07 17:20:07 +09:00
static struct resource smsc9118_resources [ ] = {
2008-06-06 17:03:23 +09:00
[ 0 ] = {
. start = 0xb6080000 ,
. end = 0xb60fffff ,
. flags = IORESOURCE_MEM ,
} ,
[ 1 ] = {
2012-05-18 15:45:09 +09:00
. start = evt2irq ( 0x660 ) ,
. end = evt2irq ( 0x660 ) ,
2008-06-06 17:03:23 +09:00
. flags = IORESOURCE_IRQ ,
}
} ;
2009-01-07 17:20:07 +09:00
static struct platform_device smsc9118_device = {
. name = " smsc911x " ,
2008-06-06 17:03:23 +09:00
. id = - 1 ,
2009-01-07 17:20:07 +09:00
. num_resources = ARRAY_SIZE ( smsc9118_resources ) ,
. resource = smsc9118_resources ,
2008-07-28 19:11:07 +09:00
. dev = {
2009-01-07 17:20:07 +09:00
. platform_data = & smsc911x_config ,
2008-07-28 19:11:07 +09:00
} ,
2008-06-06 17:03:23 +09:00
} ;
2008-09-24 11:46:48 +09:00
/*
* AP320 and AP325RXA has CPLD data in NOR Flash ( 0xA80000 - 0xABFFFF ) .
* If this area erased , this board can not boot .
*/
2008-06-06 17:03:23 +09:00
static struct mtd_partition ap325rxa_nor_flash_partitions [ ] = {
{
2008-09-24 11:46:48 +09:00
. name = " uboot " ,
. offset = 0 ,
. size = ( 1 * 1024 * 1024 ) ,
. mask_flags = MTD_WRITEABLE , /* Read-only */
} , {
. name = " kernel " ,
. offset = MTDPART_OFS_APPEND ,
. size = ( 2 * 1024 * 1024 ) ,
} , {
. name = " free-area0 " ,
. offset = MTDPART_OFS_APPEND ,
. size = ( ( 7 * 1024 * 1024 ) + ( 512 * 1024 ) ) ,
2008-06-06 17:03:23 +09:00
} , {
2008-09-24 11:46:48 +09:00
. name = " CPLD-Data " ,
. offset = MTDPART_OFS_APPEND ,
. mask_flags = MTD_WRITEABLE , /* Read-only */
. size = ( 1024 * 128 * 2 ) ,
2008-06-06 17:03:23 +09:00
} , {
2008-09-24 11:46:48 +09:00
. name = " free-area1 " ,
. offset = MTDPART_OFS_APPEND ,
. size = MTDPART_SIZ_FULL ,
2008-06-06 17:03:23 +09:00
} ,
} ;
static struct physmap_flash_data ap325rxa_nor_flash_data = {
. width = 2 ,
. parts = ap325rxa_nor_flash_partitions ,
. nr_parts = ARRAY_SIZE ( ap325rxa_nor_flash_partitions ) ,
} ;
static struct resource ap325rxa_nor_flash_resources [ ] = {
[ 0 ] = {
. name = " NOR Flash " ,
. start = 0x00000000 ,
. end = 0x00ffffff ,
. flags = IORESOURCE_MEM ,
}
} ;
static struct platform_device ap325rxa_nor_flash_device = {
. name = " physmap-flash " ,
. resource = ap325rxa_nor_flash_resources ,
. num_resources = ARRAY_SIZE ( ap325rxa_nor_flash_resources ) ,
. dev = {
. platform_data = & ap325rxa_nor_flash_data ,
} ,
} ;
2008-09-09 17:17:42 +09:00
static struct mtd_partition nand_partition_info [ ] = {
{
. name = " nand_data " ,
. offset = 0 ,
. size = MTDPART_SIZ_FULL ,
} ,
} ;
static struct resource nand_flash_resources [ ] = {
[ 0 ] = {
. start = 0xa4530000 ,
. end = 0xa45300ff ,
. flags = IORESOURCE_MEM ,
}
} ;
static struct sh_flctl_platform_data nand_flash_data = {
. parts = nand_partition_info ,
. nr_parts = ARRAY_SIZE ( nand_partition_info ) ,
. flcmncr_val = FCKSEL_E | TYPESEL_SET | NANWF_E ,
. has_hwecc = 1 ,
} ;
static struct platform_device nand_flash_device = {
. name = " sh_flctl " ,
. resource = nand_flash_resources ,
. num_resources = ARRAY_SIZE ( nand_flash_resources ) ,
. dev = {
. platform_data = & nand_flash_data ,
} ,
} ;
2008-07-28 19:07:04 +09:00
# define FPGA_LCDREG 0xB4100180
# define FPGA_BKLREG 0xB4100212
# define FPGA_LCDREG_VAL 0x0018
2008-07-28 19:14:35 +09:00
# define PORT_MSELCRB 0xA4050182
2008-09-09 17:17:42 +09:00
# define PORT_HIZCRC 0xA405015C
# define PORT_DRVCRA 0xA405018A
# define PORT_DRVCRB 0xA405018C
2008-07-28 19:07:04 +09:00
2011-09-11 22:59:04 +02:00
static int ap320_wvga_set_brightness ( int brightness )
2011-02-16 03:49:03 +00:00
{
if ( brightness ) {
gpio_set_value ( GPIO_PTS3 , 0 ) ;
__raw_writew ( 0x100 , FPGA_BKLREG ) ;
} else {
__raw_writew ( 0 , FPGA_BKLREG ) ;
gpio_set_value ( GPIO_PTS3 , 1 ) ;
}
2012-05-18 15:45:09 +09:00
2011-02-16 03:49:03 +00:00
return 0 ;
}
2011-09-11 22:59:04 +02:00
static void ap320_wvga_power_on ( void )
2008-07-28 19:07:04 +09:00
{
msleep ( 100 ) ;
/* ASD AP-320/325 LCD ON */
2010-01-26 12:58:40 +09:00
__raw_writew ( FPGA_LCDREG_VAL , FPGA_LCDREG ) ;
2008-07-28 19:07:04 +09:00
}
2011-09-11 22:59:04 +02:00
static void ap320_wvga_power_off ( void )
2009-03-13 15:27:14 +00:00
{
/* ASD AP-320/325 LCD OFF */
2010-01-26 12:58:40 +09:00
__raw_writew ( 0 , FPGA_LCDREG ) ;
2009-03-13 15:27:14 +00:00
}
2011-07-09 23:16:22 +02:00
static const struct fb_videomode ap325rxa_lcdc_modes [ ] = {
2010-09-03 07:20:04 +00:00
{
. name = " LB070WV1 " ,
. xres = 800 ,
. yres = 480 ,
. left_margin = 32 ,
. right_margin = 160 ,
. hsync_len = 8 ,
. upper_margin = 63 ,
. lower_margin = 80 ,
. vsync_len = 1 ,
. sync = 0 , /* hsync and vsync are active low */
} ,
} ;
2008-07-28 19:07:04 +09:00
static struct sh_mobile_lcdc_info lcdc_info = {
. clock_source = LCDC_CLK_EXTERNAL ,
. ch [ 0 ] = {
. chan = LCDC_CHAN_MAINLCD ,
2011-12-13 14:02:28 +01:00
. fourcc = V4L2_PIX_FMT_RGB565 ,
2008-07-28 19:07:04 +09:00
. interface_type = RGB18 ,
. clock_divider = 1 ,
2011-11-29 14:33:41 +01:00
. lcd_modes = ap325rxa_lcdc_modes ,
. num_modes = ARRAY_SIZE ( ap325rxa_lcdc_modes ) ,
2011-09-11 22:59:04 +02:00
. panel_cfg = {
. width = 152 , /* 7.0 inch */
2008-08-11 15:26:00 +09:00
. height = 91 ,
2008-07-28 19:07:04 +09:00
. display_on = ap320_wvga_power_on ,
2009-03-13 15:27:14 +00:00
. display_off = ap320_wvga_power_off ,
2011-02-16 03:49:03 +00:00
} ,
. bl_info = {
. name = " sh_mobile_lcdc_bl " ,
. max_brightness = 1 ,
2011-09-11 22:59:04 +02:00
. set_brightness = ap320_wvga_set_brightness ,
2008-07-28 19:07:04 +09:00
} ,
}
} ;
static struct resource lcdc_resources [ ] = {
[ 0 ] = {
. name = " LCDC " ,
. start = 0xfe940000 , /* P4-only space */
2009-09-15 12:00:30 +00:00
. end = 0xfe942fff ,
2008-07-28 19:07:04 +09:00
. flags = IORESOURCE_MEM ,
} ,
2008-12-19 12:02:16 +09:00
[ 1 ] = {
2012-05-18 15:45:09 +09:00
. start = evt2irq ( 0x580 ) ,
2008-12-19 12:02:16 +09:00
. flags = IORESOURCE_IRQ ,
} ,
2008-07-28 19:07:04 +09:00
} ;
static struct platform_device lcdc_device = {
. name = " sh_mobile_lcdc_fb " ,
. num_resources = ARRAY_SIZE ( lcdc_resources ) ,
. resource = lcdc_resources ,
. dev = {
. platform_data = & lcdc_info ,
} ,
} ;
2018-05-28 12:37:11 -04:00
/* Powerdown/reset gpios for CEU image sensors */
static struct gpiod_lookup_table ov7725_gpios = {
. dev_id = " 0-0021 " ,
. table = {
GPIO_LOOKUP ( " sh7723_pfc " , GPIO_PTZ5 , " reset " , GPIO_ACTIVE_LOW ) ,
2008-07-28 19:14:35 +09:00
} ,
} ;
2018-05-28 12:37:11 -04:00
static struct ceu_platform_data ceu0_pdata = {
. num_subdevs = 1 ,
. subdevs = {
{ /* [0] = ov7725 */
. flags = 0 ,
. bus_width = 8 ,
. bus_shift = 0 ,
. i2c_adapter_id = 0 ,
. i2c_address = 0x21 ,
} ,
} ,
2008-07-28 19:14:35 +09:00
} ;
static struct resource ceu_resources [ ] = {
[ 0 ] = {
. name = " CEU " ,
. start = 0xfe910000 ,
. end = 0xfe91009f ,
. flags = IORESOURCE_MEM ,
} ,
[ 1 ] = {
2012-05-18 15:45:09 +09:00
. start = evt2irq ( 0x880 ) ,
2008-07-28 19:14:35 +09:00
. flags = IORESOURCE_IRQ ,
} ,
} ;
2018-05-28 12:37:11 -04:00
static struct platform_device ap325rxa_ceu_device = {
. name = " renesas-ceu " ,
. id = 0 , /* "ceu.0" clock */
2008-07-28 19:14:35 +09:00
. num_resources = ARRAY_SIZE ( ceu_resources ) ,
. resource = ceu_resources ,
. dev = {
2018-05-28 12:37:11 -04:00
. platform_data = & ceu0_pdata ,
2008-07-28 19:14:35 +09:00
} ,
} ;
2012-06-27 00:50:04 +02:00
/* Fixed 3.3V regulators to be used by SDHI0, SDHI1 */
static struct regulator_consumer_supply fixed3v3_power_consumers [ ] =
{
REGULATOR_SUPPLY ( " vmmc " , " sh_mobile_sdhi.0 " ) ,
REGULATOR_SUPPLY ( " vqmmc " , " sh_mobile_sdhi.0 " ) ,
REGULATOR_SUPPLY ( " vmmc " , " sh_mobile_sdhi.1 " ) ,
REGULATOR_SUPPLY ( " vqmmc " , " sh_mobile_sdhi.1 " ) ,
} ;
2009-10-02 02:22:56 +00:00
static struct resource sdhi0_cn3_resources [ ] = {
[ 0 ] = {
. name = " SDHI0 " ,
. start = 0x04ce0000 ,
2011-03-09 13:42:42 +01:00
. end = 0x04ce00ff ,
2009-10-02 02:22:56 +00:00
. flags = IORESOURCE_MEM ,
} ,
[ 1 ] = {
2012-05-18 15:45:09 +09:00
. start = evt2irq ( 0xe80 ) ,
2009-10-02 02:22:56 +00:00
. flags = IORESOURCE_IRQ ,
} ,
2009-01-07 20:35:21 +09:00
} ;
2015-02-24 02:07:07 +00:00
static struct tmio_mmc_data sdhi0_cn3_data = {
. capabilities = MMC_CAP_SDIO_IRQ ,
2010-12-28 22:22:36 +00:00
} ;
2009-10-02 02:22:56 +00:00
static struct platform_device sdhi0_cn3_device = {
. name = " sh_mobile_sdhi " ,
2009-10-30 06:22:03 +00:00
. id = 0 , /* "sdhi0" clock */
2009-10-02 02:22:56 +00:00
. num_resources = ARRAY_SIZE ( sdhi0_cn3_resources ) ,
. resource = sdhi0_cn3_resources ,
2010-12-28 22:22:36 +00:00
. dev = {
. platform_data = & sdhi0_cn3_data ,
} ,
2009-01-07 20:35:21 +09:00
} ;
2009-10-30 06:22:03 +00:00
static struct resource sdhi1_cn7_resources [ ] = {
[ 0 ] = {
. name = " SDHI1 " ,
. start = 0x04cf0000 ,
2011-03-09 13:42:42 +01:00
. end = 0x04cf00ff ,
2009-10-30 06:22:03 +00:00
. flags = IORESOURCE_MEM ,
} ,
[ 1 ] = {
2012-05-18 15:45:09 +09:00
. start = evt2irq ( 0x4e0 ) ,
2009-10-30 06:22:03 +00:00
. flags = IORESOURCE_IRQ ,
} ,
} ;
2015-02-24 02:07:07 +00:00
static struct tmio_mmc_data sdhi1_cn7_data = {
. capabilities = MMC_CAP_SDIO_IRQ ,
2010-12-28 22:22:36 +00:00
} ;
2009-10-30 06:22:03 +00:00
static struct platform_device sdhi1_cn7_device = {
. name = " sh_mobile_sdhi " ,
. id = 1 , /* "sdhi1" clock */
. num_resources = ARRAY_SIZE ( sdhi1_cn7_resources ) ,
. resource = sdhi1_cn7_resources ,
2010-12-28 22:22:36 +00:00
. dev = {
. platform_data = & sdhi1_cn7_data ,
} ,
2009-10-30 06:22:03 +00:00
} ;
2009-05-12 15:13:36 +00:00
static struct ov772x_camera_info ov7725_info = {
2011-07-28 18:24:25 -03:00
. flags = OV772X_FLAG_VFLIP | OV772X_FLAG_HFLIP ,
2009-05-12 15:13:36 +00:00
. edgectrl = OV772X_AUTO_EDGECTRL ( 0xf , 0 ) ,
2009-12-11 11:31:35 -03:00
} ;
2018-05-28 12:37:11 -04:00
static struct i2c_board_info ap325rxa_i2c_devices [ ] __initdata = {
2009-08-25 11:06:21 -03:00
{
2018-05-28 12:37:11 -04:00
I2C_BOARD_INFO ( " pcf8563 " , 0x51 ) ,
} ,
{
I2C_BOARD_INFO ( " ov772x " , 0x21 ) ,
. platform_data = & ov7725_info ,
2009-01-22 00:38:31 +00:00
} ,
2008-07-05 12:32:44 +09:00
} ;
2009-05-12 15:13:36 +00:00
static struct platform_device * ap325rxa_devices [ ] __initdata = {
& smsc9118_device ,
& ap325rxa_nor_flash_device ,
& lcdc_device ,
& nand_flash_device ,
2009-10-02 02:22:56 +00:00
& sdhi0_cn3_device ,
2009-10-30 06:22:03 +00:00
& sdhi1_cn7_device ,
2009-05-12 15:13:36 +00:00
} ;
2009-10-30 04:23:51 +00:00
extern char ap325rxa_sdram_enter_start ;
extern char ap325rxa_sdram_enter_end ;
extern char ap325rxa_sdram_leave_start ;
extern char ap325rxa_sdram_leave_end ;
2008-06-06 17:03:23 +09:00
static int __init ap325rxa_devices_setup ( void )
{
2009-10-30 04:23:51 +00:00
/* register board specific self-refresh code */
sh_mobile_register_self_refresh ( SUSP_SH_STANDBY | SUSP_SH_SF ,
& ap325rxa_sdram_enter_start ,
& ap325rxa_sdram_enter_end ,
& ap325rxa_sdram_leave_start ,
& ap325rxa_sdram_leave_end ) ;
2012-06-27 00:50:04 +02:00
regulator_register_always_on ( 0 , " fixed-3.3V " , fixed3v3_power_consumers ,
ARRAY_SIZE ( fixed3v3_power_consumers ) , 3300000 ) ;
regulator_register_fixed ( 1 , dummy_supplies , ARRAY_SIZE ( dummy_supplies ) ) ;
2008-10-08 20:42:20 +09:00
/* LD3 and LD4 LEDs */
gpio_request ( GPIO_PTX5 , NULL ) ; /* RUN */
gpio_direction_output ( GPIO_PTX5 , 1 ) ;
2023-02-07 16:29:45 +02:00
gpiod_export ( gpio_to_desc ( GPIO_PTX5 ) , 0 ) ;
2008-10-08 20:42:20 +09:00
gpio_request ( GPIO_PTX4 , NULL ) ; /* INDICATOR */
gpio_direction_output ( GPIO_PTX4 , 0 ) ;
2023-02-07 16:29:45 +02:00
gpiod_export ( gpio_to_desc ( GPIO_PTX4 ) , 0 ) ;
2008-10-08 20:42:20 +09:00
/* SW1 input */
gpio_request ( GPIO_PTF7 , NULL ) ; /* MODE */
gpio_direction_input ( GPIO_PTF7 ) ;
2023-02-07 16:29:45 +02:00
gpiod_export ( gpio_to_desc ( GPIO_PTF7 ) , 0 ) ;
2008-10-08 20:42:20 +09:00
/* LCDC */
gpio_request ( GPIO_FN_LCDD15 , NULL ) ;
gpio_request ( GPIO_FN_LCDD14 , NULL ) ;
gpio_request ( GPIO_FN_LCDD13 , NULL ) ;
gpio_request ( GPIO_FN_LCDD12 , NULL ) ;
gpio_request ( GPIO_FN_LCDD11 , NULL ) ;
gpio_request ( GPIO_FN_LCDD10 , NULL ) ;
gpio_request ( GPIO_FN_LCDD9 , NULL ) ;
gpio_request ( GPIO_FN_LCDD8 , NULL ) ;
gpio_request ( GPIO_FN_LCDD7 , NULL ) ;
gpio_request ( GPIO_FN_LCDD6 , NULL ) ;
gpio_request ( GPIO_FN_LCDD5 , NULL ) ;
gpio_request ( GPIO_FN_LCDD4 , NULL ) ;
gpio_request ( GPIO_FN_LCDD3 , NULL ) ;
gpio_request ( GPIO_FN_LCDD2 , NULL ) ;
gpio_request ( GPIO_FN_LCDD1 , NULL ) ;
gpio_request ( GPIO_FN_LCDD0 , NULL ) ;
gpio_request ( GPIO_FN_LCDLCLK_PTR , NULL ) ;
gpio_request ( GPIO_FN_LCDDCK , NULL ) ;
gpio_request ( GPIO_FN_LCDVEPWC , NULL ) ;
gpio_request ( GPIO_FN_LCDVCPWC , NULL ) ;
gpio_request ( GPIO_FN_LCDVSYN , NULL ) ;
gpio_request ( GPIO_FN_LCDHSYN , NULL ) ;
gpio_request ( GPIO_FN_LCDDISP , NULL ) ;
gpio_request ( GPIO_FN_LCDDON , NULL ) ;
/* LCD backlight */
gpio_request ( GPIO_PTS3 , NULL ) ;
gpio_direction_output ( GPIO_PTS3 , 1 ) ;
/* CEU */
gpio_request ( GPIO_FN_VIO_CLK2 , NULL ) ;
gpio_request ( GPIO_FN_VIO_VD2 , NULL ) ;
gpio_request ( GPIO_FN_VIO_HD2 , NULL ) ;
gpio_request ( GPIO_FN_VIO_FLD , NULL ) ;
gpio_request ( GPIO_FN_VIO_CKO , NULL ) ;
gpio_request ( GPIO_FN_VIO_D15 , NULL ) ;
gpio_request ( GPIO_FN_VIO_D14 , NULL ) ;
gpio_request ( GPIO_FN_VIO_D13 , NULL ) ;
gpio_request ( GPIO_FN_VIO_D12 , NULL ) ;
gpio_request ( GPIO_FN_VIO_D11 , NULL ) ;
gpio_request ( GPIO_FN_VIO_D10 , NULL ) ;
gpio_request ( GPIO_FN_VIO_D9 , NULL ) ;
gpio_request ( GPIO_FN_VIO_D8 , NULL ) ;
gpio_request ( GPIO_PTZ7 , NULL ) ;
gpio_direction_output ( GPIO_PTZ7 , 0 ) ; /* OE_CAM */
gpio_request ( GPIO_PTZ6 , NULL ) ;
gpio_direction_output ( GPIO_PTZ6 , 0 ) ; /* STBY_CAM */
gpio_request ( GPIO_PTZ5 , NULL ) ;
2009-01-22 00:33:21 +00:00
gpio_direction_output ( GPIO_PTZ5 , 0 ) ; /* RST_CAM */
2008-10-08 20:42:20 +09:00
gpio_request ( GPIO_PTZ4 , NULL ) ;
gpio_direction_output ( GPIO_PTZ4 , 0 ) ; /* SADDR */
2010-01-26 12:58:40 +09:00
__raw_writew ( __raw_readw ( PORT_MSELCRB ) & ~ 0x0001 , PORT_MSELCRB ) ;
2008-07-28 19:14:35 +09:00
2008-09-09 17:17:42 +09:00
/* FLCTL */
2008-10-21 18:08:10 +09:00
gpio_request ( GPIO_FN_FCE , NULL ) ;
gpio_request ( GPIO_FN_NAF7 , NULL ) ;
gpio_request ( GPIO_FN_NAF6 , NULL ) ;
gpio_request ( GPIO_FN_NAF5 , NULL ) ;
gpio_request ( GPIO_FN_NAF4 , NULL ) ;
gpio_request ( GPIO_FN_NAF3 , NULL ) ;
gpio_request ( GPIO_FN_NAF2 , NULL ) ;
gpio_request ( GPIO_FN_NAF1 , NULL ) ;
gpio_request ( GPIO_FN_NAF0 , NULL ) ;
gpio_request ( GPIO_FN_FCDE , NULL ) ;
gpio_request ( GPIO_FN_FOE , NULL ) ;
gpio_request ( GPIO_FN_FSC , NULL ) ;
gpio_request ( GPIO_FN_FWE , NULL ) ;
gpio_request ( GPIO_FN_FRB , NULL ) ;
2008-09-09 17:17:42 +09:00
2010-01-26 12:58:40 +09:00
__raw_writew ( 0 , PORT_HIZCRC ) ;
__raw_writew ( 0xFFFF , PORT_DRVCRA ) ;
__raw_writew ( 0xFFFF , PORT_DRVCRB ) ;
2008-09-09 17:17:42 +09:00
2009-10-30 06:22:03 +00:00
/* SDHI0 - CN3 - SD CARD */
2009-10-02 02:22:56 +00:00
gpio_request ( GPIO_FN_SDHI0CD_PTD , NULL ) ;
gpio_request ( GPIO_FN_SDHI0WP_PTD , NULL ) ;
gpio_request ( GPIO_FN_SDHI0D3_PTD , NULL ) ;
gpio_request ( GPIO_FN_SDHI0D2_PTD , NULL ) ;
gpio_request ( GPIO_FN_SDHI0D1_PTD , NULL ) ;
gpio_request ( GPIO_FN_SDHI0D0_PTD , NULL ) ;
gpio_request ( GPIO_FN_SDHI0CMD_PTD , NULL ) ;
gpio_request ( GPIO_FN_SDHI0CLK_PTD , NULL ) ;
2009-10-30 06:22:03 +00:00
/* SDHI1 - CN7 - MICRO SD CARD */
gpio_request ( GPIO_FN_SDHI1CD , NULL ) ;
gpio_request ( GPIO_FN_SDHI1D3 , NULL ) ;
gpio_request ( GPIO_FN_SDHI1D2 , NULL ) ;
gpio_request ( GPIO_FN_SDHI1D1 , NULL ) ;
gpio_request ( GPIO_FN_SDHI1D0 , NULL ) ;
gpio_request ( GPIO_FN_SDHI1CMD , NULL ) ;
gpio_request ( GPIO_FN_SDHI1CLK , NULL ) ;
2018-05-28 12:37:11 -04:00
/* Add a clock alias for ov7725 xclk source. */
clk_add_alias ( NULL , " 0-0021 " , " video_clk " , NULL ) ;
/* Register RSTB gpio for ov7725 camera sensor. */
gpiod_add_lookup_table ( & ov7725_gpios ) ;
2008-07-05 12:32:44 +09:00
i2c_register_board_info ( 0 , ap325rxa_i2c_devices ,
ARRAY_SIZE ( ap325rxa_i2c_devices ) ) ;
2008-09-09 17:17:42 +09:00
2018-05-28 12:37:11 -04:00
/* Initialize CEU platform device separately to map memory first */
device_initialize ( & ap325rxa_ceu_device . dev ) ;
dma_declare_coherent_memory ( & ap325rxa_ceu_device . dev ,
2018-12-25 13:29:54 +01:00
ceu_dma_membase , ceu_dma_membase ,
2023-07-24 14:07:42 +02:00
CEU_BUFFER_MEMORY_SIZE ) ;
2018-05-28 12:37:11 -04:00
platform_device_add ( & ap325rxa_ceu_device ) ;
2008-06-06 17:03:23 +09:00
return platform_add_devices ( ap325rxa_devices ,
ARRAY_SIZE ( ap325rxa_devices ) ) ;
}
2009-08-07 03:52:18 +00:00
arch_initcall ( ap325rxa_devices_setup ) ;
2008-06-06 17:03:23 +09:00
2009-06-03 08:26:40 +00:00
/* Return the board specific boot mode pin configuration */
static int ap325rxa_mode_pins ( void )
{
/* MD0=0, MD1=0, MD2=0: Clock Mode 0
* MD3 = 0 : 16 - bit Area0 Bus Width
* MD5 = 1 : Little Endian
* TSTMD = 1 , MD8 = 1 : Test Mode Disabled
*/
return MODE_PIN5 | MODE_PIN8 ;
}
2018-05-28 12:37:11 -04:00
/* Reserve a portion of memory for CEU buffers */
static void __init ap325rxa_mv_mem_reserve ( void )
{
phys_addr_t phys ;
phys_addr_t size = CEU_BUFFER_MEMORY_SIZE ;
2019-03-11 23:29:06 -07:00
phys = memblock_phys_alloc ( size , PAGE_SIZE ) ;
2019-03-11 23:29:26 -07:00
if ( ! phys )
panic ( " Failed to allocate CEU memory \n " ) ;
2021-11-05 13:43:19 -07:00
memblock_phys_free ( phys , size ) ;
2018-05-28 12:37:11 -04:00
memblock_remove ( phys , size ) ;
ceu_dma_membase = phys ;
}
2008-06-06 17:03:23 +09:00
static struct sh_machine_vector mv_ap325rxa __initmv = {
. mv_name = " AP-325RXA " ,
2009-06-03 08:26:40 +00:00
. mv_mode_pins = ap325rxa_mode_pins ,
2018-05-28 12:37:11 -04:00
. mv_mem_reserve = ap325rxa_mv_mem_reserve ,
2008-06-06 17:03:23 +09:00
} ;