0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
0012
0013 #include <linux/device.h>
0014 #include <linux/kernel.h>
0015 #include <linux/delay.h>
0016 #include <linux/module.h>
0017 #include <linux/gpio/consumer.h>
0018 #include <linux/lcd.h>
0019 #include <linux/slab.h>
0020 #include <linux/regulator/consumer.h>
0021 #include <linux/spi/spi.h>
0022
0023 struct l4f00242t03_priv {
0024 struct spi_device *spi;
0025 struct lcd_device *ld;
0026 int lcd_state;
0027 struct regulator *io_reg;
0028 struct regulator *core_reg;
0029 struct gpio_desc *reset;
0030 struct gpio_desc *enable;
0031 };
0032
0033 static void l4f00242t03_reset(struct gpio_desc *gpiod)
0034 {
0035 pr_debug("l4f00242t03_reset.\n");
0036 gpiod_set_value(gpiod, 1);
0037 mdelay(100);
0038 gpiod_set_value(gpiod, 0);
0039 mdelay(10);
0040 gpiod_set_value(gpiod, 1);
0041 mdelay(20);
0042 }
0043
0044 #define param(x) ((x) | 0x100)
0045
0046 static void l4f00242t03_lcd_init(struct spi_device *spi)
0047 {
0048 struct l4f00242t03_priv *priv = spi_get_drvdata(spi);
0049 const u16 cmd[] = { 0x36, param(0), 0x3A, param(0x60) };
0050 int ret;
0051
0052 dev_dbg(&spi->dev, "initializing LCD\n");
0053
0054 ret = regulator_set_voltage(priv->io_reg, 1800000, 1800000);
0055 if (ret) {
0056 dev_err(&spi->dev, "failed to set the IO regulator voltage.\n");
0057 return;
0058 }
0059 ret = regulator_enable(priv->io_reg);
0060 if (ret) {
0061 dev_err(&spi->dev, "failed to enable the IO regulator.\n");
0062 return;
0063 }
0064
0065 ret = regulator_set_voltage(priv->core_reg, 2800000, 2800000);
0066 if (ret) {
0067 dev_err(&spi->dev, "failed to set the core regulator voltage.\n");
0068 regulator_disable(priv->io_reg);
0069 return;
0070 }
0071 ret = regulator_enable(priv->core_reg);
0072 if (ret) {
0073 dev_err(&spi->dev, "failed to enable the core regulator.\n");
0074 regulator_disable(priv->io_reg);
0075 return;
0076 }
0077
0078 l4f00242t03_reset(priv->reset);
0079
0080 gpiod_set_value(priv->enable, 1);
0081 msleep(60);
0082 spi_write(spi, (const u8 *)cmd, ARRAY_SIZE(cmd) * sizeof(u16));
0083 }
0084
0085 static void l4f00242t03_lcd_powerdown(struct spi_device *spi)
0086 {
0087 struct l4f00242t03_priv *priv = spi_get_drvdata(spi);
0088
0089 dev_dbg(&spi->dev, "Powering down LCD\n");
0090
0091 gpiod_set_value(priv->enable, 0);
0092
0093 regulator_disable(priv->io_reg);
0094 regulator_disable(priv->core_reg);
0095 }
0096
0097 static int l4f00242t03_lcd_power_get(struct lcd_device *ld)
0098 {
0099 struct l4f00242t03_priv *priv = lcd_get_data(ld);
0100
0101 return priv->lcd_state;
0102 }
0103
0104 static int l4f00242t03_lcd_power_set(struct lcd_device *ld, int power)
0105 {
0106 struct l4f00242t03_priv *priv = lcd_get_data(ld);
0107 struct spi_device *spi = priv->spi;
0108
0109 const u16 slpout = 0x11;
0110 const u16 dison = 0x29;
0111
0112 const u16 slpin = 0x10;
0113 const u16 disoff = 0x28;
0114
0115 if (power <= FB_BLANK_NORMAL) {
0116 if (priv->lcd_state <= FB_BLANK_NORMAL) {
0117
0118 } else if (priv->lcd_state < FB_BLANK_POWERDOWN) {
0119 dev_dbg(&spi->dev, "Resuming LCD\n");
0120
0121 spi_write(spi, (const u8 *)&slpout, sizeof(u16));
0122 msleep(60);
0123 spi_write(spi, (const u8 *)&dison, sizeof(u16));
0124 } else {
0125
0126 l4f00242t03_lcd_init(spi);
0127 priv->lcd_state = FB_BLANK_VSYNC_SUSPEND;
0128 l4f00242t03_lcd_power_set(priv->ld, power);
0129 }
0130 } else if (power < FB_BLANK_POWERDOWN) {
0131 if (priv->lcd_state <= FB_BLANK_NORMAL) {
0132
0133 dev_dbg(&spi->dev, "Standby the LCD\n");
0134
0135 spi_write(spi, (const u8 *)&disoff, sizeof(u16));
0136 msleep(60);
0137 spi_write(spi, (const u8 *)&slpin, sizeof(u16));
0138 } else if (priv->lcd_state < FB_BLANK_POWERDOWN) {
0139
0140 } else {
0141
0142 l4f00242t03_lcd_init(spi);
0143 priv->lcd_state = FB_BLANK_UNBLANK;
0144 l4f00242t03_lcd_power_set(ld, power);
0145 }
0146 } else {
0147
0148 if (priv->lcd_state != FB_BLANK_POWERDOWN) {
0149
0150 spi_write(spi, (const u8 *)&disoff, sizeof(u16));
0151 msleep(60);
0152 l4f00242t03_lcd_powerdown(spi);
0153 }
0154 }
0155
0156 priv->lcd_state = power;
0157
0158 return 0;
0159 }
0160
0161 static struct lcd_ops l4f_ops = {
0162 .set_power = l4f00242t03_lcd_power_set,
0163 .get_power = l4f00242t03_lcd_power_get,
0164 };
0165
0166 static int l4f00242t03_probe(struct spi_device *spi)
0167 {
0168 struct l4f00242t03_priv *priv;
0169
0170 priv = devm_kzalloc(&spi->dev, sizeof(struct l4f00242t03_priv),
0171 GFP_KERNEL);
0172 if (priv == NULL)
0173 return -ENOMEM;
0174
0175 spi_set_drvdata(spi, priv);
0176 spi->bits_per_word = 9;
0177 spi_setup(spi);
0178
0179 priv->spi = spi;
0180
0181 priv->reset = devm_gpiod_get(&spi->dev, "reset", GPIOD_OUT_HIGH);
0182 if (IS_ERR(priv->reset)) {
0183 dev_err(&spi->dev,
0184 "Unable to get the lcd l4f00242t03 reset gpio.\n");
0185 return PTR_ERR(priv->reset);
0186 }
0187 gpiod_set_consumer_name(priv->reset, "lcd l4f00242t03 reset");
0188
0189 priv->enable = devm_gpiod_get(&spi->dev, "enable", GPIOD_OUT_LOW);
0190 if (IS_ERR(priv->enable)) {
0191 dev_err(&spi->dev,
0192 "Unable to get the lcd l4f00242t03 data en gpio.\n");
0193 return PTR_ERR(priv->enable);
0194 }
0195 gpiod_set_consumer_name(priv->enable, "lcd l4f00242t03 data enable");
0196
0197 priv->io_reg = devm_regulator_get(&spi->dev, "vdd");
0198 if (IS_ERR(priv->io_reg)) {
0199 dev_err(&spi->dev, "%s: Unable to get the IO regulator\n",
0200 __func__);
0201 return PTR_ERR(priv->io_reg);
0202 }
0203
0204 priv->core_reg = devm_regulator_get(&spi->dev, "vcore");
0205 if (IS_ERR(priv->core_reg)) {
0206 dev_err(&spi->dev, "%s: Unable to get the core regulator\n",
0207 __func__);
0208 return PTR_ERR(priv->core_reg);
0209 }
0210
0211 priv->ld = devm_lcd_device_register(&spi->dev, "l4f00242t03", &spi->dev,
0212 priv, &l4f_ops);
0213 if (IS_ERR(priv->ld))
0214 return PTR_ERR(priv->ld);
0215
0216
0217 l4f00242t03_lcd_init(spi);
0218 priv->lcd_state = FB_BLANK_VSYNC_SUSPEND;
0219 l4f00242t03_lcd_power_set(priv->ld, FB_BLANK_UNBLANK);
0220
0221 dev_info(&spi->dev, "Epson l4f00242t03 lcd probed.\n");
0222
0223 return 0;
0224 }
0225
0226 static void l4f00242t03_remove(struct spi_device *spi)
0227 {
0228 struct l4f00242t03_priv *priv = spi_get_drvdata(spi);
0229
0230 l4f00242t03_lcd_power_set(priv->ld, FB_BLANK_POWERDOWN);
0231 }
0232
0233 static void l4f00242t03_shutdown(struct spi_device *spi)
0234 {
0235 struct l4f00242t03_priv *priv = spi_get_drvdata(spi);
0236
0237 if (priv)
0238 l4f00242t03_lcd_power_set(priv->ld, FB_BLANK_POWERDOWN);
0239
0240 }
0241
0242 static struct spi_driver l4f00242t03_driver = {
0243 .driver = {
0244 .name = "l4f00242t03",
0245 },
0246 .probe = l4f00242t03_probe,
0247 .remove = l4f00242t03_remove,
0248 .shutdown = l4f00242t03_shutdown,
0249 };
0250
0251 module_spi_driver(l4f00242t03_driver);
0252
0253 MODULE_AUTHOR("Alberto Panizzo <maramaopercheseimorto@gmail.com>");
0254 MODULE_DESCRIPTION("EPSON L4F00242T03 LCD");
0255 MODULE_LICENSE("GPL v2");