diff options
Diffstat (limited to 'arch/sh/boards/mach-ap325rxa/setup.c')
| -rw-r--r-- | arch/sh/boards/mach-ap325rxa/setup.c | 158 | 
1 files changed, 93 insertions, 65 deletions
diff --git a/arch/sh/boards/mach-ap325rxa/setup.c b/arch/sh/boards/mach-ap325rxa/setup.c index 07ea908c510..5620e33c18a 100644 --- a/arch/sh/boards/mach-ap325rxa/setup.c +++ b/arch/sh/boards/mach-ap325rxa/setup.c @@ -14,12 +14,18 @@  #include <linux/device.h>  #include <linux/interrupt.h>  #include <linux/platform_device.h> +#include <linux/mmc/host.h> +#include <linux/mmc/sh_mobile_sdhi.h>  #include <linux/mtd/physmap.h>  #include <linux/mtd/sh_flctl.h>  #include <linux/delay.h>  #include <linux/i2c.h> +#include <linux/regulator/fixed.h> +#include <linux/regulator/machine.h>  #include <linux/smsc911x.h>  #include <linux/gpio.h> +#include <linux/videodev2.h> +#include <linux/sh_intc.h>  #include <media/ov772x.h>  #include <media/soc_camera.h>  #include <media/soc_camera_platform.h> @@ -30,6 +36,12 @@  #include <asm/suspend.h>  #include <cpu/sh7723.h> +/* Dummy supplies, where voltage doesn't matter */ +static struct regulator_consumer_supply dummy_supplies[] = { +	REGULATOR_SUPPLY("vddvario", "smsc911x"), +	REGULATOR_SUPPLY("vdd33a", "smsc911x"), +}; +  static struct smsc911x_platform_config smsc911x_config = {  	.phy_interface	= PHY_INTERFACE_MODE_MII,  	.irq_polarity	= SMSC911X_IRQ_POLARITY_ACTIVE_LOW, @@ -44,8 +56,8 @@ static struct resource smsc9118_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= 35, -		.end	= 35, +		.start	= evt2irq(0x660), +		.end	= evt2irq(0x660),  		.flags	= IORESOURCE_IRQ,  	}  }; @@ -154,29 +166,34 @@ static struct platform_device nand_flash_device = {  #define PORT_DRVCRA	0xA405018A  #define PORT_DRVCRB	0xA405018C -static void ap320_wvga_power_on(void *board_data, struct fb_info *info) +static int ap320_wvga_set_brightness(int brightness) +{ +	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); +	} + +	return 0; +} + +static void ap320_wvga_power_on(void)  {  	msleep(100);  	/* ASD AP-320/325 LCD ON */  	__raw_writew(FPGA_LCDREG_VAL, FPGA_LCDREG); - -	/* backlight */ -	gpio_set_value(GPIO_PTS3, 0); -	__raw_writew(0x100, FPGA_BKLREG);  } -static void ap320_wvga_power_off(void *board_data) +static void ap320_wvga_power_off(void)  { -	/* backlight */ -	__raw_writew(0, FPGA_BKLREG); -	gpio_set_value(GPIO_PTS3, 1); -  	/* ASD AP-320/325 LCD OFF */  	__raw_writew(0, FPGA_LCDREG);  } -const static struct fb_videomode ap325rxa_lcdc_modes[] = { +static const struct fb_videomode ap325rxa_lcdc_modes[] = {  	{  		.name = "LB070WV1",  		.xres = 800, @@ -195,19 +212,22 @@ static struct sh_mobile_lcdc_info lcdc_info = {  	.clock_source = LCDC_CLK_EXTERNAL,  	.ch[0] = {  		.chan = LCDC_CHAN_MAINLCD, -		.bpp = 16, +		.fourcc = V4L2_PIX_FMT_RGB565,  		.interface_type = RGB18,  		.clock_divider = 1, -		.lcd_cfg = ap325rxa_lcdc_modes, -		.num_cfg = ARRAY_SIZE(ap325rxa_lcdc_modes), -		.lcd_size_cfg = { /* 7.0 inch */ -			.width = 152, +		.lcd_modes = ap325rxa_lcdc_modes, +		.num_modes = ARRAY_SIZE(ap325rxa_lcdc_modes), +		.panel_cfg = { +			.width = 152,	/* 7.0 inch */  			.height = 91, -		}, -		.board_cfg = {  			.display_on = ap320_wvga_power_on,  			.display_off = ap320_wvga_power_off,  		}, +		.bl_info = { +			.name = "sh_mobile_lcdc_bl", +			.max_brightness = 1, +			.set_brightness = ap320_wvga_set_brightness, +		},  	}  }; @@ -219,7 +239,7 @@ static struct resource lcdc_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= 28, +		.start	= evt2irq(0x580),  		.flags	= IORESOURCE_IRQ,  	},  }; @@ -231,9 +251,6 @@ static struct platform_device lcdc_device = {  	.dev		= {  		.platform_data	= &lcdc_info,  	}, -	.archdata = { -		.hwblk_id = HWBLK_LCDC, -	},  };  static void camera_power(int val) @@ -314,8 +331,8 @@ static int camera_set_capture(struct soc_camera_platform_info *info,  	return ret;  } -static int ap325rxa_camera_add(struct soc_camera_link *icl, struct device *dev); -static void ap325rxa_camera_del(struct soc_camera_link *icl); +static int ap325rxa_camera_add(struct soc_camera_device *icd); +static void ap325rxa_camera_del(struct soc_camera_device *icd);  static struct soc_camera_platform_info camera_info = {  	.format_name = "UYVY", @@ -327,9 +344,10 @@ static struct soc_camera_platform_info camera_info = {  		.width = 640,  		.height = 480,  	}, -	.bus_param = SOCAM_PCLK_SAMPLE_RISING | SOCAM_HSYNC_ACTIVE_HIGH | -	SOCAM_VSYNC_ACTIVE_HIGH | SOCAM_MASTER | SOCAM_DATAWIDTH_8 | -	SOCAM_DATA_ACTIVE_HIGH, +	.mbus_param = V4L2_MBUS_PCLK_SAMPLE_RISING | V4L2_MBUS_MASTER | +	V4L2_MBUS_VSYNC_ACTIVE_HIGH | V4L2_MBUS_HSYNC_ACTIVE_HIGH | +	V4L2_MBUS_DATA_ACTIVE_HIGH, +	.mbus_type = V4L2_MBUS_PARALLEL,  	.set_capture = camera_set_capture,  }; @@ -341,37 +359,30 @@ static struct soc_camera_link camera_link = {  	.priv		= &camera_info,  }; -static void dummy_release(struct device *dev) +static struct platform_device *camera_device; + +static void ap325rxa_camera_release(struct device *dev)  { +	soc_camera_platform_release(&camera_device);  } -static struct platform_device camera_device = { -	.name		= "soc_camera_platform", -	.dev		= { -		.platform_data	= &camera_info, -		.release	= dummy_release, -	}, -}; - -static int ap325rxa_camera_add(struct soc_camera_link *icl, -			       struct device *dev) +static int ap325rxa_camera_add(struct soc_camera_device *icd)  { -	if (icl != &camera_link || camera_probe() <= 0) -		return -ENODEV; +	int ret = soc_camera_platform_add(icd, &camera_device, &camera_link, +					  ap325rxa_camera_release, 0); +	if (ret < 0) +		return ret; -	camera_info.dev = dev; +	ret = camera_probe(); +	if (ret < 0) +		soc_camera_platform_del(icd, camera_device, &camera_link); -	return platform_device_register(&camera_device); +	return ret;  } -static void ap325rxa_camera_del(struct soc_camera_link *icl) +static void ap325rxa_camera_del(struct soc_camera_device *icd)  { -	if (icl != &camera_link) -		return; - -	platform_device_unregister(&camera_device); -	memset(&camera_device.dev.kobj, 0, -	       sizeof(camera_device.dev.kobj)); +	soc_camera_platform_del(icd, camera_device, &camera_link);  }  #endif /* CONFIG_I2C */ @@ -396,7 +407,7 @@ static struct resource ceu_resources[] = {  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start  = 52, +		.start  = evt2irq(0x880),  		.flags  = IORESOURCE_IRQ,  	},  	[2] = { @@ -412,31 +423,41 @@ static struct platform_device ceu_device = {  	.dev		= {  		.platform_data	= &sh_mobile_ceu_info,  	}, -	.archdata = { -		.hwblk_id = HWBLK_CEU, -	}, +}; + +/* 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"),  };  static struct resource sdhi0_cn3_resources[] = {  	[0] = {  		.name	= "SDHI0",  		.start	= 0x04ce0000, -		.end	= 0x04ce01ff, +		.end	= 0x04ce00ff,  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= 100, +		.start	= evt2irq(0xe80),  		.flags  = IORESOURCE_IRQ,  	},  }; +static struct sh_mobile_sdhi_info sdhi0_cn3_data = { +	.tmio_caps      = MMC_CAP_SDIO_IRQ, +}; +  static struct platform_device sdhi0_cn3_device = {  	.name		= "sh_mobile_sdhi",  	.id             = 0, /* "sdhi0" clock */  	.num_resources	= ARRAY_SIZE(sdhi0_cn3_resources),  	.resource	= sdhi0_cn3_resources, -	.archdata = { -		.hwblk_id = HWBLK_SDHI0, +	.dev = { +		.platform_data = &sdhi0_cn3_data,  	},  }; @@ -444,22 +465,26 @@ static struct resource sdhi1_cn7_resources[] = {  	[0] = {  		.name	= "SDHI1",  		.start	= 0x04cf0000, -		.end	= 0x04cf01ff, +		.end	= 0x04cf00ff,  		.flags	= IORESOURCE_MEM,  	},  	[1] = { -		.start	= 23, +		.start	= evt2irq(0x4e0),  		.flags  = IORESOURCE_IRQ,  	},  }; +static struct sh_mobile_sdhi_info sdhi1_cn7_data = { +	.tmio_caps      = MMC_CAP_SDIO_IRQ, +}; +  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, -	.archdata = { -		.hwblk_id = HWBLK_SDHI1, +	.dev = { +		.platform_data = &sdhi1_cn7_data,  	},  }; @@ -476,8 +501,7 @@ static struct i2c_board_info ap325rxa_i2c_camera[] = {  };  static struct ov772x_camera_info ov7725_info = { -	.flags		= OV772X_FLAG_VFLIP | OV772X_FLAG_HFLIP | \ -			  OV772X_FLAG_8BIT, +	.flags		= OV772X_FLAG_VFLIP | OV772X_FLAG_HFLIP,  	.edgectrl	= OV772X_AUTO_EDGECTRL(0xf, 0),  }; @@ -531,6 +555,10 @@ static int __init ap325rxa_devices_setup(void)  					&ap325rxa_sdram_leave_start,  					&ap325rxa_sdram_leave_end); +	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)); +  	/* LD3 and LD4 LEDs */  	gpio_request(GPIO_PTX5, NULL); /* RUN */  	gpio_direction_output(GPIO_PTX5, 1);  | 
