Lines Matching +full:spi +full:- +full:gpio
2 * l4f00242t03.c -- support for Epson L4F00242T03 LCD
4 * Copyright 2007-2009 Freescale Semiconductor, Inc. All Rights Reserved.
18 #include <linux/gpio.h>
23 #include <linux/spi/spi.h>
24 #include <linux/spi/l4f00242t03.h>
27 struct spi_device *spi; member
35 static void l4f00242t03_reset(unsigned int gpio) in l4f00242t03_reset() argument
38 gpio_set_value(gpio, 1); in l4f00242t03_reset()
40 gpio_set_value(gpio, 0); in l4f00242t03_reset()
42 gpio_set_value(gpio, 1); in l4f00242t03_reset()
48 static void l4f00242t03_lcd_init(struct spi_device *spi) in l4f00242t03_lcd_init() argument
50 struct l4f00242t03_pdata *pdata = spi->dev.platform_data; in l4f00242t03_lcd_init()
51 struct l4f00242t03_priv *priv = dev_get_drvdata(&spi->dev); in l4f00242t03_lcd_init()
54 dev_dbg(&spi->dev, "initializing LCD\n"); in l4f00242t03_lcd_init()
56 regulator_set_voltage(priv->io_reg, 1800000, 1800000); in l4f00242t03_lcd_init()
57 regulator_enable(priv->io_reg); in l4f00242t03_lcd_init()
59 regulator_set_voltage(priv->core_reg, 2800000, 2800000); in l4f00242t03_lcd_init()
60 regulator_enable(priv->core_reg); in l4f00242t03_lcd_init()
62 l4f00242t03_reset(pdata->reset_gpio); in l4f00242t03_lcd_init()
64 gpio_set_value(pdata->data_enable_gpio, 1); in l4f00242t03_lcd_init()
66 spi_write(spi, (const u8 *)cmd, ARRAY_SIZE(cmd) * sizeof(u16)); in l4f00242t03_lcd_init()
69 static void l4f00242t03_lcd_powerdown(struct spi_device *spi) in l4f00242t03_lcd_powerdown() argument
71 struct l4f00242t03_pdata *pdata = spi->dev.platform_data; in l4f00242t03_lcd_powerdown()
72 struct l4f00242t03_priv *priv = dev_get_drvdata(&spi->dev); in l4f00242t03_lcd_powerdown()
74 dev_dbg(&spi->dev, "Powering down LCD\n"); in l4f00242t03_lcd_powerdown()
76 gpio_set_value(pdata->data_enable_gpio, 0); in l4f00242t03_lcd_powerdown()
78 regulator_disable(priv->io_reg); in l4f00242t03_lcd_powerdown()
79 regulator_disable(priv->core_reg); in l4f00242t03_lcd_powerdown()
86 return priv->lcd_state; in l4f00242t03_lcd_power_get()
92 struct spi_device *spi = priv->spi; in l4f00242t03_lcd_power_set() local
101 if (priv->lcd_state <= FB_BLANK_NORMAL) { in l4f00242t03_lcd_power_set()
103 } else if (priv->lcd_state < FB_BLANK_POWERDOWN) { in l4f00242t03_lcd_power_set()
104 dev_dbg(&spi->dev, "Resuming LCD\n"); in l4f00242t03_lcd_power_set()
106 spi_write(spi, (const u8 *)&slpout, sizeof(u16)); in l4f00242t03_lcd_power_set()
108 spi_write(spi, (const u8 *)&dison, sizeof(u16)); in l4f00242t03_lcd_power_set()
110 /* priv->lcd_state == FB_BLANK_POWERDOWN */ in l4f00242t03_lcd_power_set()
111 l4f00242t03_lcd_init(spi); in l4f00242t03_lcd_power_set()
112 priv->lcd_state = FB_BLANK_VSYNC_SUSPEND; in l4f00242t03_lcd_power_set()
113 l4f00242t03_lcd_power_set(priv->ld, power); in l4f00242t03_lcd_power_set()
116 if (priv->lcd_state <= FB_BLANK_NORMAL) { in l4f00242t03_lcd_power_set()
118 dev_dbg(&spi->dev, "Standby the LCD\n"); in l4f00242t03_lcd_power_set()
120 spi_write(spi, (const u8 *)&disoff, sizeof(u16)); in l4f00242t03_lcd_power_set()
122 spi_write(spi, (const u8 *)&slpin, sizeof(u16)); in l4f00242t03_lcd_power_set()
123 } else if (priv->lcd_state < FB_BLANK_POWERDOWN) { in l4f00242t03_lcd_power_set()
126 /* priv->lcd_state == FB_BLANK_POWERDOWN */ in l4f00242t03_lcd_power_set()
127 l4f00242t03_lcd_init(spi); in l4f00242t03_lcd_power_set()
128 priv->lcd_state = FB_BLANK_UNBLANK; in l4f00242t03_lcd_power_set()
133 if (priv->lcd_state != FB_BLANK_POWERDOWN) { in l4f00242t03_lcd_power_set()
135 spi_write(spi, (const u8 *)&disoff, sizeof(u16)); in l4f00242t03_lcd_power_set()
137 l4f00242t03_lcd_powerdown(spi); in l4f00242t03_lcd_power_set()
141 priv->lcd_state = power; in l4f00242t03_lcd_power_set()
151 static int __devinit l4f00242t03_probe(struct spi_device *spi) in l4f00242t03_probe() argument
154 struct l4f00242t03_pdata *pdata = spi->dev.platform_data; in l4f00242t03_probe()
158 dev_err(&spi->dev, "Uninitialized platform data.\n"); in l4f00242t03_probe()
159 return -EINVAL; in l4f00242t03_probe()
165 dev_err(&spi->dev, "No memory for this device.\n"); in l4f00242t03_probe()
166 return -ENOMEM; in l4f00242t03_probe()
169 dev_set_drvdata(&spi->dev, priv); in l4f00242t03_probe()
170 spi->bits_per_word = 9; in l4f00242t03_probe()
171 spi_setup(spi); in l4f00242t03_probe()
173 priv->spi = spi; in l4f00242t03_probe()
175 ret = gpio_request_one(pdata->reset_gpio, GPIOF_OUT_INIT_HIGH, in l4f00242t03_probe()
178 dev_err(&spi->dev, in l4f00242t03_probe()
179 "Unable to get the lcd l4f00242t03 reset gpio.\n"); in l4f00242t03_probe()
183 ret = gpio_request_one(pdata->data_enable_gpio, GPIOF_OUT_INIT_LOW, in l4f00242t03_probe()
186 dev_err(&spi->dev, in l4f00242t03_probe()
187 "Unable to get the lcd l4f00242t03 data en gpio.\n"); in l4f00242t03_probe()
191 priv->io_reg = regulator_get(&spi->dev, "vdd"); in l4f00242t03_probe()
192 if (IS_ERR(priv->io_reg)) { in l4f00242t03_probe()
193 ret = PTR_ERR(priv->io_reg); in l4f00242t03_probe()
194 dev_err(&spi->dev, "%s: Unable to get the IO regulator\n", in l4f00242t03_probe()
199 priv->core_reg = regulator_get(&spi->dev, "vcore"); in l4f00242t03_probe()
200 if (IS_ERR(priv->core_reg)) { in l4f00242t03_probe()
201 ret = PTR_ERR(priv->core_reg); in l4f00242t03_probe()
202 dev_err(&spi->dev, "%s: Unable to get the core regulator\n", in l4f00242t03_probe()
207 priv->ld = lcd_device_register("l4f00242t03", in l4f00242t03_probe()
208 &spi->dev, priv, &l4f_ops); in l4f00242t03_probe()
209 if (IS_ERR(priv->ld)) { in l4f00242t03_probe()
210 ret = PTR_ERR(priv->ld); in l4f00242t03_probe()
215 l4f00242t03_lcd_init(spi); in l4f00242t03_probe()
216 priv->lcd_state = FB_BLANK_VSYNC_SUSPEND; in l4f00242t03_probe()
217 l4f00242t03_lcd_power_set(priv->ld, FB_BLANK_UNBLANK); in l4f00242t03_probe()
219 dev_info(&spi->dev, "Epson l4f00242t03 lcd probed.\n"); in l4f00242t03_probe()
224 regulator_put(priv->core_reg); in l4f00242t03_probe()
226 regulator_put(priv->io_reg); in l4f00242t03_probe()
228 gpio_free(pdata->data_enable_gpio); in l4f00242t03_probe()
230 gpio_free(pdata->reset_gpio); in l4f00242t03_probe()
237 static int __devexit l4f00242t03_remove(struct spi_device *spi) in l4f00242t03_remove() argument
239 struct l4f00242t03_priv *priv = dev_get_drvdata(&spi->dev); in l4f00242t03_remove()
240 struct l4f00242t03_pdata *pdata = priv->spi->dev.platform_data; in l4f00242t03_remove()
242 l4f00242t03_lcd_power_set(priv->ld, FB_BLANK_POWERDOWN); in l4f00242t03_remove()
243 lcd_device_unregister(priv->ld); in l4f00242t03_remove()
245 dev_set_drvdata(&spi->dev, NULL); in l4f00242t03_remove()
247 gpio_free(pdata->data_enable_gpio); in l4f00242t03_remove()
248 gpio_free(pdata->reset_gpio); in l4f00242t03_remove()
250 regulator_put(priv->io_reg); in l4f00242t03_remove()
251 regulator_put(priv->core_reg); in l4f00242t03_remove()
258 static void l4f00242t03_shutdown(struct spi_device *spi) in l4f00242t03_shutdown() argument
260 struct l4f00242t03_priv *priv = dev_get_drvdata(&spi->dev); in l4f00242t03_shutdown()
263 l4f00242t03_lcd_power_set(priv->ld, FB_BLANK_POWERDOWN); in l4f00242t03_shutdown()