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.
20 #include <linux/gpio.h>
25 #include <linux/spi/spi.h>
26 #include <linux/spi/l4f00242t03.h>
29 struct spi_device *spi; member
36 static void l4f00242t03_reset(unsigned int gpio) in l4f00242t03_reset() argument
39 gpio_set_value(gpio, 1); in l4f00242t03_reset()
41 gpio_set_value(gpio, 0); in l4f00242t03_reset()
43 gpio_set_value(gpio, 1); in l4f00242t03_reset()
49 static void l4f00242t03_lcd_init(struct spi_device *spi) in l4f00242t03_lcd_init() argument
51 struct l4f00242t03_pdata *pdata = dev_get_platdata(&spi->dev); in l4f00242t03_lcd_init()
52 struct l4f00242t03_priv *priv = spi_get_drvdata(spi); in l4f00242t03_lcd_init()
56 dev_dbg(&spi->dev, "initializing LCD\n"); in l4f00242t03_lcd_init()
58 ret = regulator_set_voltage(priv->io_reg, 1800000, 1800000); in l4f00242t03_lcd_init()
60 dev_err(&spi->dev, "failed to set the IO regulator voltage.\n"); in l4f00242t03_lcd_init()
63 ret = regulator_enable(priv->io_reg); in l4f00242t03_lcd_init()
65 dev_err(&spi->dev, "failed to enable the IO regulator.\n"); in l4f00242t03_lcd_init()
69 ret = regulator_set_voltage(priv->core_reg, 2800000, 2800000); in l4f00242t03_lcd_init()
71 dev_err(&spi->dev, "failed to set the core regulator voltage.\n"); in l4f00242t03_lcd_init()
72 regulator_disable(priv->io_reg); in l4f00242t03_lcd_init()
75 ret = regulator_enable(priv->core_reg); in l4f00242t03_lcd_init()
77 dev_err(&spi->dev, "failed to enable the core regulator.\n"); in l4f00242t03_lcd_init()
78 regulator_disable(priv->io_reg); in l4f00242t03_lcd_init()
82 l4f00242t03_reset(pdata->reset_gpio); in l4f00242t03_lcd_init()
84 gpio_set_value(pdata->data_enable_gpio, 1); in l4f00242t03_lcd_init()
86 spi_write(spi, (const u8 *)cmd, ARRAY_SIZE(cmd) * sizeof(u16)); in l4f00242t03_lcd_init()
89 static void l4f00242t03_lcd_powerdown(struct spi_device *spi) in l4f00242t03_lcd_powerdown() argument
91 struct l4f00242t03_pdata *pdata = dev_get_platdata(&spi->dev); in l4f00242t03_lcd_powerdown()
92 struct l4f00242t03_priv *priv = spi_get_drvdata(spi); in l4f00242t03_lcd_powerdown()
94 dev_dbg(&spi->dev, "Powering down LCD\n"); in l4f00242t03_lcd_powerdown()
96 gpio_set_value(pdata->data_enable_gpio, 0); in l4f00242t03_lcd_powerdown()
98 regulator_disable(priv->io_reg); in l4f00242t03_lcd_powerdown()
99 regulator_disable(priv->core_reg); in l4f00242t03_lcd_powerdown()
106 return priv->lcd_state; in l4f00242t03_lcd_power_get()
112 struct spi_device *spi = priv->spi; in l4f00242t03_lcd_power_set() local
121 if (priv->lcd_state <= FB_BLANK_NORMAL) { in l4f00242t03_lcd_power_set()
123 } else if (priv->lcd_state < FB_BLANK_POWERDOWN) { in l4f00242t03_lcd_power_set()
124 dev_dbg(&spi->dev, "Resuming LCD\n"); in l4f00242t03_lcd_power_set()
126 spi_write(spi, (const u8 *)&slpout, sizeof(u16)); in l4f00242t03_lcd_power_set()
128 spi_write(spi, (const u8 *)&dison, sizeof(u16)); in l4f00242t03_lcd_power_set()
130 /* priv->lcd_state == FB_BLANK_POWERDOWN */ in l4f00242t03_lcd_power_set()
131 l4f00242t03_lcd_init(spi); in l4f00242t03_lcd_power_set()
132 priv->lcd_state = FB_BLANK_VSYNC_SUSPEND; in l4f00242t03_lcd_power_set()
133 l4f00242t03_lcd_power_set(priv->ld, power); in l4f00242t03_lcd_power_set()
136 if (priv->lcd_state <= FB_BLANK_NORMAL) { in l4f00242t03_lcd_power_set()
138 dev_dbg(&spi->dev, "Standby the LCD\n"); in l4f00242t03_lcd_power_set()
140 spi_write(spi, (const u8 *)&disoff, sizeof(u16)); in l4f00242t03_lcd_power_set()
142 spi_write(spi, (const u8 *)&slpin, sizeof(u16)); in l4f00242t03_lcd_power_set()
143 } else if (priv->lcd_state < FB_BLANK_POWERDOWN) { in l4f00242t03_lcd_power_set()
146 /* priv->lcd_state == FB_BLANK_POWERDOWN */ in l4f00242t03_lcd_power_set()
147 l4f00242t03_lcd_init(spi); in l4f00242t03_lcd_power_set()
148 priv->lcd_state = FB_BLANK_UNBLANK; in l4f00242t03_lcd_power_set()
153 if (priv->lcd_state != FB_BLANK_POWERDOWN) { in l4f00242t03_lcd_power_set()
155 spi_write(spi, (const u8 *)&disoff, sizeof(u16)); in l4f00242t03_lcd_power_set()
157 l4f00242t03_lcd_powerdown(spi); in l4f00242t03_lcd_power_set()
161 priv->lcd_state = power; in l4f00242t03_lcd_power_set()
171 static int l4f00242t03_probe(struct spi_device *spi) in l4f00242t03_probe() argument
174 struct l4f00242t03_pdata *pdata = dev_get_platdata(&spi->dev); in l4f00242t03_probe()
178 dev_err(&spi->dev, "Uninitialized platform data.\n"); in l4f00242t03_probe()
179 return -EINVAL; in l4f00242t03_probe()
182 priv = devm_kzalloc(&spi->dev, sizeof(struct l4f00242t03_priv), in l4f00242t03_probe()
185 return -ENOMEM; in l4f00242t03_probe()
187 spi_set_drvdata(spi, priv); in l4f00242t03_probe()
188 spi->bits_per_word = 9; in l4f00242t03_probe()
189 spi_setup(spi); in l4f00242t03_probe()
191 priv->spi = spi; in l4f00242t03_probe()
193 ret = devm_gpio_request_one(&spi->dev, pdata->reset_gpio, in l4f00242t03_probe()
196 dev_err(&spi->dev, in l4f00242t03_probe()
197 "Unable to get the lcd l4f00242t03 reset gpio.\n"); in l4f00242t03_probe()
201 ret = devm_gpio_request_one(&spi->dev, pdata->data_enable_gpio, in l4f00242t03_probe()
204 dev_err(&spi->dev, in l4f00242t03_probe()
205 "Unable to get the lcd l4f00242t03 data en gpio.\n"); in l4f00242t03_probe()
209 priv->io_reg = devm_regulator_get(&spi->dev, "vdd"); in l4f00242t03_probe()
210 if (IS_ERR(priv->io_reg)) { in l4f00242t03_probe()
211 dev_err(&spi->dev, "%s: Unable to get the IO regulator\n", in l4f00242t03_probe()
213 return PTR_ERR(priv->io_reg); in l4f00242t03_probe()
216 priv->core_reg = devm_regulator_get(&spi->dev, "vcore"); in l4f00242t03_probe()
217 if (IS_ERR(priv->core_reg)) { in l4f00242t03_probe()
218 dev_err(&spi->dev, "%s: Unable to get the core regulator\n", in l4f00242t03_probe()
220 return PTR_ERR(priv->core_reg); in l4f00242t03_probe()
223 priv->ld = devm_lcd_device_register(&spi->dev, "l4f00242t03", &spi->dev, in l4f00242t03_probe()
225 if (IS_ERR(priv->ld)) in l4f00242t03_probe()
226 return PTR_ERR(priv->ld); in l4f00242t03_probe()
229 l4f00242t03_lcd_init(spi); in l4f00242t03_probe()
230 priv->lcd_state = FB_BLANK_VSYNC_SUSPEND; in l4f00242t03_probe()
231 l4f00242t03_lcd_power_set(priv->ld, FB_BLANK_UNBLANK); in l4f00242t03_probe()
233 dev_info(&spi->dev, "Epson l4f00242t03 lcd probed.\n"); in l4f00242t03_probe()
238 static int l4f00242t03_remove(struct spi_device *spi) in l4f00242t03_remove() argument
240 struct l4f00242t03_priv *priv = spi_get_drvdata(spi); in l4f00242t03_remove()
242 l4f00242t03_lcd_power_set(priv->ld, FB_BLANK_POWERDOWN); in l4f00242t03_remove()
246 static void l4f00242t03_shutdown(struct spi_device *spi) in l4f00242t03_shutdown() argument
248 struct l4f00242t03_priv *priv = spi_get_drvdata(spi); in l4f00242t03_shutdown()
251 l4f00242t03_lcd_power_set(priv->ld, FB_BLANK_POWERDOWN); in l4f00242t03_shutdown()