diff options
Diffstat (limited to 'arch/arm/mach-imx/mach-mx27ads.c')
| -rw-r--r-- | arch/arm/mach-imx/mach-mx27ads.c | 56 | 
1 files changed, 51 insertions, 5 deletions
diff --git a/arch/arm/mach-imx/mach-mx27ads.c b/arch/arm/mach-imx/mach-mx27ads.c index 9821b824dca..2f834ce8f39 100644 --- a/arch/arm/mach-imx/mach-mx27ads.c +++ b/arch/arm/mach-imx/mach-mx27ads.c @@ -21,6 +21,10 @@  #include <linux/mtd/physmap.h>  #include <linux/i2c.h>  #include <linux/irq.h> + +#include <linux/regulator/fixed.h> +#include <linux/regulator/machine.h> +  #include <asm/mach-types.h>  #include <asm/mach/arch.h>  #include <asm/mach/time.h> @@ -195,14 +199,58 @@ static const struct imxi2c_platform_data mx27ads_i2c1_data __initconst = {  static struct i2c_board_info mx27ads_i2c_devices[] = {  }; -void lcd_power(int on) +static void vgpio_set(struct gpio_chip *chip, unsigned offset, int value)  { -	if (on) +	if (value)  		__raw_writew(PBC_BCTRL1_LCDON, PBC_BCTRL1_SET_REG);  	else  		__raw_writew(PBC_BCTRL1_LCDON, PBC_BCTRL1_CLEAR_REG);  } +static int vgpio_dir_out(struct gpio_chip *chip, unsigned offset, int value) +{ +	return 0; +} + +#define MX27ADS_LCD_GPIO	(6 * 32) + +static struct regulator_consumer_supply mx27ads_lcd_regulator_consumer = +	REGULATOR_SUPPLY("lcd", "imx-fb.0"); + +static struct regulator_init_data mx27ads_lcd_regulator_init_data = { +	.constraints	= { +		.valid_ops_mask	= REGULATOR_CHANGE_STATUS, +}, +	.consumer_supplies	= &mx27ads_lcd_regulator_consumer, +	.num_consumer_supplies	= 1, +}; + +static struct fixed_voltage_config mx27ads_lcd_regulator_pdata = { +	.supply_name	= "LCD", +	.microvolts	= 3300000, +	.gpio		= MX27ADS_LCD_GPIO, +	.init_data	= &mx27ads_lcd_regulator_init_data, +}; + +static void __init mx27ads_regulator_init(void) +{ +	struct gpio_chip *vchip; + +	vchip = kzalloc(sizeof(*vchip), GFP_KERNEL); +	vchip->owner		= THIS_MODULE; +	vchip->label		= "LCD"; +	vchip->base		= MX27ADS_LCD_GPIO; +	vchip->ngpio		= 1; +	vchip->direction_output	= vgpio_dir_out; +	vchip->set		= vgpio_set; +	gpiochip_add(vchip); + +	platform_device_register_data(&platform_bus, "reg-fixed-voltage", +				      PLATFORM_DEVID_AUTO, +				      &mx27ads_lcd_regulator_pdata, +				      sizeof(mx27ads_lcd_regulator_pdata)); +} +  static struct imx_fb_videomode mx27ads_modes[] = {  	{  		.mode = { @@ -239,8 +287,6 @@ static const struct imx_fb_platform_data mx27ads_fb_data __initconst = {  	.pwmr		= 0x00A903FF,  	.lscr1		= 0x00120300,  	.dmacr		= 0x00020010, - -	.lcd_power	= lcd_power,  };  static int mx27ads_sdhc1_init(struct device *dev, irq_handler_t detect_irq, @@ -304,6 +350,7 @@ static void __init mx27ads_board_init(void)  	i2c_register_board_info(1, mx27ads_i2c_devices,  				ARRAY_SIZE(mx27ads_i2c_devices));  	imx27_add_imx_i2c(1, &mx27ads_i2c1_data); +	mx27ads_regulator_init();  	imx27_add_imx_fb(&mx27ads_fb_data);  	imx27_add_mxc_mmc(0, &sdhc1_pdata);  	imx27_add_mxc_mmc(1, &sdhc2_pdata); @@ -344,7 +391,6 @@ MACHINE_START(MX27ADS, "Freescale i.MX27ADS")  	.map_io = mx27ads_map_io,  	.init_early = imx27_init_early,  	.init_irq = mx27_init_irq, -	.handle_irq = imx27_handle_irq,  	.init_time	= mx27ads_timer_init,  	.init_machine = mx27ads_board_init,  	.restart	= mxc_restart,  | 
