Lines Matching full:lcd

3  *  LCD/Backlight Driver for Sharp Zaurus Handhelds (various models)
10 * Converted to SPI device based LCD/Backlight device driver
20 #include <linux/lcd.h>
100 static int corgi_ssp_lcdtg_send(struct corgi_lcd *lcd, int reg, uint8_t val);
111 static void lcdtg_ssp_i2c_send(struct corgi_lcd *lcd, uint8_t data) in lcdtg_ssp_i2c_send() argument
113 corgi_ssp_lcdtg_send(lcd, POWERREG0_ADRS, data); in lcdtg_ssp_i2c_send()
117 static void lcdtg_i2c_send_bit(struct corgi_lcd *lcd, uint8_t data) in lcdtg_i2c_send_bit() argument
119 lcdtg_ssp_i2c_send(lcd, data); in lcdtg_i2c_send_bit()
120 lcdtg_ssp_i2c_send(lcd, data | POWER0_COM_DCLK); in lcdtg_i2c_send_bit()
121 lcdtg_ssp_i2c_send(lcd, data); in lcdtg_i2c_send_bit()
124 static void lcdtg_i2c_send_start(struct corgi_lcd *lcd, uint8_t base) in lcdtg_i2c_send_start() argument
126 lcdtg_ssp_i2c_send(lcd, base | POWER0_COM_DCLK | POWER0_COM_DOUT); in lcdtg_i2c_send_start()
127 lcdtg_ssp_i2c_send(lcd, base | POWER0_COM_DCLK); in lcdtg_i2c_send_start()
128 lcdtg_ssp_i2c_send(lcd, base); in lcdtg_i2c_send_start()
131 static void lcdtg_i2c_send_stop(struct corgi_lcd *lcd, uint8_t base) in lcdtg_i2c_send_stop() argument
133 lcdtg_ssp_i2c_send(lcd, base); in lcdtg_i2c_send_stop()
134 lcdtg_ssp_i2c_send(lcd, base | POWER0_COM_DCLK); in lcdtg_i2c_send_stop()
135 lcdtg_ssp_i2c_send(lcd, base | POWER0_COM_DCLK | POWER0_COM_DOUT); in lcdtg_i2c_send_stop()
138 static void lcdtg_i2c_send_byte(struct corgi_lcd *lcd, in lcdtg_i2c_send_byte() argument
145 lcdtg_i2c_send_bit(lcd, base | POWER0_COM_DOUT); in lcdtg_i2c_send_byte()
147 lcdtg_i2c_send_bit(lcd, base); in lcdtg_i2c_send_byte()
152 static void lcdtg_i2c_wait_ack(struct corgi_lcd *lcd, uint8_t base) in lcdtg_i2c_wait_ack() argument
154 lcdtg_i2c_send_bit(lcd, base); in lcdtg_i2c_wait_ack()
157 static void lcdtg_set_common_voltage(struct corgi_lcd *lcd, in lcdtg_set_common_voltage() argument
161 lcdtg_i2c_send_start(lcd, base_data); in lcdtg_set_common_voltage()
162 lcdtg_i2c_send_byte(lcd, base_data, 0x9c); in lcdtg_set_common_voltage()
163 lcdtg_i2c_wait_ack(lcd, base_data); in lcdtg_set_common_voltage()
164 lcdtg_i2c_send_byte(lcd, base_data, 0x00); in lcdtg_set_common_voltage()
165 lcdtg_i2c_wait_ack(lcd, base_data); in lcdtg_set_common_voltage()
166 lcdtg_i2c_send_byte(lcd, base_data, data); in lcdtg_set_common_voltage()
167 lcdtg_i2c_wait_ack(lcd, base_data); in lcdtg_set_common_voltage()
168 lcdtg_i2c_send_stop(lcd, base_data); in lcdtg_set_common_voltage()
171 static int corgi_ssp_lcdtg_send(struct corgi_lcd *lcd, int adrs, uint8_t data) in corgi_ssp_lcdtg_send() argument
177 .tx_buf = lcd->buf, in corgi_ssp_lcdtg_send()
180 lcd->buf[0] = ((adrs & 0x07) << 5) | (data & 0x1f); in corgi_ssp_lcdtg_send()
184 return spi_sync(lcd->spi_dev, &msg); in corgi_ssp_lcdtg_send()
188 static void lcdtg_set_phadadj(struct corgi_lcd *lcd, int mode) in lcdtg_set_phadadj() argument
206 corgi_ssp_lcdtg_send(lcd, PHACTRL_ADRS, adj); in lcdtg_set_phadadj()
209 static void corgi_lcd_power_on(struct corgi_lcd *lcd) in corgi_lcd_power_on() argument
214 corgi_ssp_lcdtg_send(lcd, PICTRL_ADRS, in corgi_lcd_power_on()
219 corgi_ssp_lcdtg_send(lcd, POWERREG0_ADRS, in corgi_lcd_power_on()
223 corgi_ssp_lcdtg_send(lcd, POWERREG1_ADRS, in corgi_lcd_power_on()
227 corgi_ssp_lcdtg_send(lcd, POWERREG1_ADRS, in corgi_lcd_power_on()
232 corgi_ssp_lcdtg_send(lcd, POWERREG0_ADRS, in corgi_lcd_power_on()
238 corgi_ssp_lcdtg_send(lcd, PICTRL_ADRS, in corgi_lcd_power_on()
246 lcdtg_set_common_voltage(lcd, POWER0_DAC_ON | POWER0_COM_OFF | in corgi_lcd_power_on()
250 corgi_ssp_lcdtg_send(lcd, POWERREG0_ADRS, in corgi_lcd_power_on()
255 corgi_ssp_lcdtg_send(lcd, POWERREG1_ADRS, in corgi_lcd_power_on()
260 corgi_ssp_lcdtg_send(lcd, PICTRL_ADRS, PICTRL_INIT_STATE); in corgi_lcd_power_on()
263 corgi_ssp_lcdtg_send(lcd, POWERREG0_ADRS, in corgi_lcd_power_on()
268 corgi_ssp_lcdtg_send(lcd, POWERREG1_ADRS, in corgi_lcd_power_on()
272 corgi_ssp_lcdtg_send(lcd, PICTRL_ADRS, 0); in corgi_lcd_power_on()
275 lcdtg_set_phadadj(lcd, lcd->mode); in corgi_lcd_power_on()
278 corgi_ssp_lcdtg_send(lcd, POLCTRL_ADRS, in corgi_lcd_power_on()
284 switch (lcd->mode) { in corgi_lcd_power_on()
286 corgi_ssp_lcdtg_send(lcd, RESCTL_ADRS, RESCTL_VGA); in corgi_lcd_power_on()
290 corgi_ssp_lcdtg_send(lcd, RESCTL_ADRS, RESCTL_QVGA); in corgi_lcd_power_on()
295 static void corgi_lcd_power_off(struct corgi_lcd *lcd) in corgi_lcd_power_off() argument
301 corgi_ssp_lcdtg_send(lcd, POWERREG1_ADRS, in corgi_lcd_power_off()
305 corgi_ssp_lcdtg_send(lcd, PICTRL_ADRS, PICTRL_COM_SIGNAL_OFF); in corgi_lcd_power_off()
306 corgi_ssp_lcdtg_send(lcd, POWERREG0_ADRS, in corgi_lcd_power_off()
310 lcdtg_set_common_voltage(lcd, POWER0_DAC_ON | POWER0_COM_OFF | in corgi_lcd_power_off()
314 corgi_ssp_lcdtg_send(lcd, POWERREG1_ADRS, in corgi_lcd_power_off()
318 corgi_ssp_lcdtg_send(lcd, POWERREG0_ADRS, in corgi_lcd_power_off()
322 corgi_ssp_lcdtg_send(lcd, PICTRL_ADRS, in corgi_lcd_power_off()
327 corgi_ssp_lcdtg_send(lcd, POWERREG0_ADRS, in corgi_lcd_power_off()
331 corgi_ssp_lcdtg_send(lcd, POWERREG1_ADRS, in corgi_lcd_power_off()
337 struct corgi_lcd *lcd = lcd_get_data(ld); in corgi_lcd_set_mode() local
343 if (lcd->mode == mode) in corgi_lcd_set_mode()
346 lcdtg_set_phadadj(lcd, mode); in corgi_lcd_set_mode()
350 corgi_ssp_lcdtg_send(lcd, RESCTL_ADRS, RESCTL_VGA); in corgi_lcd_set_mode()
354 corgi_ssp_lcdtg_send(lcd, RESCTL_ADRS, RESCTL_QVGA); in corgi_lcd_set_mode()
358 lcd->mode = mode; in corgi_lcd_set_mode()
364 struct corgi_lcd *lcd = lcd_get_data(ld); in corgi_lcd_set_power() local
366 if (POWER_IS_ON(power) && !POWER_IS_ON(lcd->power)) in corgi_lcd_set_power()
367 corgi_lcd_power_on(lcd); in corgi_lcd_set_power()
369 if (!POWER_IS_ON(power) && POWER_IS_ON(lcd->power)) in corgi_lcd_set_power()
370 corgi_lcd_power_off(lcd); in corgi_lcd_set_power()
372 lcd->power = power; in corgi_lcd_set_power()
378 struct corgi_lcd *lcd = lcd_get_data(ld); in corgi_lcd_get_power() local
380 return lcd->power; in corgi_lcd_get_power()
391 struct corgi_lcd *lcd = bl_get_data(bd); in corgi_bl_get_intensity() local
393 return lcd->intensity; in corgi_bl_get_intensity()
396 static int corgi_bl_set_intensity(struct corgi_lcd *lcd, int intensity) in corgi_bl_set_intensity() argument
403 corgi_ssp_lcdtg_send(lcd, DUTYCTRL_ADRS, intensity); in corgi_bl_set_intensity()
406 cont = !!(intensity & 0x20) ^ lcd->gpio_backlight_cont_inverted; in corgi_bl_set_intensity()
408 if (gpio_is_valid(lcd->gpio_backlight_cont)) in corgi_bl_set_intensity()
409 gpio_set_value_cansleep(lcd->gpio_backlight_cont, cont); in corgi_bl_set_intensity()
411 if (gpio_is_valid(lcd->gpio_backlight_on)) in corgi_bl_set_intensity()
412 gpio_set_value_cansleep(lcd->gpio_backlight_on, intensity); in corgi_bl_set_intensity()
414 if (lcd->kick_battery) in corgi_bl_set_intensity()
415 lcd->kick_battery(); in corgi_bl_set_intensity()
417 lcd->intensity = intensity; in corgi_bl_set_intensity()
423 struct corgi_lcd *lcd = bl_get_data(bd); in corgi_bl_update_status() local
435 if ((corgibl_flags & CORGIBL_BATTLOW) && intensity > lcd->limit_mask) in corgi_bl_update_status()
436 intensity = lcd->limit_mask; in corgi_bl_update_status()
438 return corgi_bl_set_intensity(lcd, intensity); in corgi_bl_update_status()
460 struct corgi_lcd *lcd = dev_get_drvdata(dev); in corgi_lcd_suspend() local
463 corgi_bl_set_intensity(lcd, 0); in corgi_lcd_suspend()
464 corgi_lcd_set_power(lcd->lcd_dev, FB_BLANK_POWERDOWN); in corgi_lcd_suspend()
470 struct corgi_lcd *lcd = dev_get_drvdata(dev); in corgi_lcd_resume() local
473 corgi_lcd_set_power(lcd->lcd_dev, FB_BLANK_UNBLANK); in corgi_lcd_resume()
474 backlight_update_status(lcd->bl_dev); in corgi_lcd_resume()
481 static int setup_gpio_backlight(struct corgi_lcd *lcd, in setup_gpio_backlight() argument
484 struct spi_device *spi = lcd->spi_dev; in setup_gpio_backlight()
487 lcd->gpio_backlight_on = -1; in setup_gpio_backlight()
488 lcd->gpio_backlight_cont = -1; in setup_gpio_backlight()
500 lcd->gpio_backlight_on = pdata->gpio_backlight_on; in setup_gpio_backlight()
501 gpio_direction_output(lcd->gpio_backlight_on, 0); in setup_gpio_backlight()
514 lcd->gpio_backlight_cont = pdata->gpio_backlight_cont; in setup_gpio_backlight()
519 if (gpio_is_valid(lcd->gpio_backlight_on)) { in setup_gpio_backlight()
520 lcd->gpio_backlight_cont_inverted = 1; in setup_gpio_backlight()
521 gpio_direction_output(lcd->gpio_backlight_cont, 1); in setup_gpio_backlight()
523 lcd->gpio_backlight_cont_inverted = 0; in setup_gpio_backlight()
524 gpio_direction_output(lcd->gpio_backlight_cont, 0); in setup_gpio_backlight()
534 struct corgi_lcd *lcd; in corgi_lcd_probe() local
542 lcd = devm_kzalloc(&spi->dev, sizeof(struct corgi_lcd), GFP_KERNEL); in corgi_lcd_probe()
543 if (!lcd) in corgi_lcd_probe()
546 lcd->spi_dev = spi; in corgi_lcd_probe()
548 lcd->lcd_dev = devm_lcd_device_register(&spi->dev, "corgi_lcd", in corgi_lcd_probe()
549 &spi->dev, lcd, &corgi_lcd_ops); in corgi_lcd_probe()
550 if (IS_ERR(lcd->lcd_dev)) in corgi_lcd_probe()
551 return PTR_ERR(lcd->lcd_dev); in corgi_lcd_probe()
553 lcd->power = FB_BLANK_POWERDOWN; in corgi_lcd_probe()
554 lcd->mode = (pdata) ? pdata->init_mode : CORGI_LCD_MODE_VGA; in corgi_lcd_probe()
559 lcd->bl_dev = devm_backlight_device_register(&spi->dev, "corgi_bl", in corgi_lcd_probe()
560 &spi->dev, lcd, &corgi_bl_ops, in corgi_lcd_probe()
562 if (IS_ERR(lcd->bl_dev)) in corgi_lcd_probe()
563 return PTR_ERR(lcd->bl_dev); in corgi_lcd_probe()
565 lcd->bl_dev->props.brightness = pdata->default_intensity; in corgi_lcd_probe()
566 lcd->bl_dev->props.power = FB_BLANK_UNBLANK; in corgi_lcd_probe()
568 ret = setup_gpio_backlight(lcd, pdata); in corgi_lcd_probe()
572 lcd->kick_battery = pdata->kick_battery; in corgi_lcd_probe()
574 spi_set_drvdata(spi, lcd); in corgi_lcd_probe()
575 corgi_lcd_set_power(lcd->lcd_dev, FB_BLANK_UNBLANK); in corgi_lcd_probe()
576 backlight_update_status(lcd->bl_dev); in corgi_lcd_probe()
578 lcd->limit_mask = pdata->limit_mask; in corgi_lcd_probe()
579 the_corgi_lcd = lcd; in corgi_lcd_probe()
585 struct corgi_lcd *lcd = spi_get_drvdata(spi); in corgi_lcd_remove() local
587 lcd->bl_dev->props.power = FB_BLANK_UNBLANK; in corgi_lcd_remove()
588 lcd->bl_dev->props.brightness = 0; in corgi_lcd_remove()
589 backlight_update_status(lcd->bl_dev); in corgi_lcd_remove()
590 corgi_lcd_set_power(lcd->lcd_dev, FB_BLANK_POWERDOWN); in corgi_lcd_remove()
596 .name = "corgi-lcd",
605 MODULE_DESCRIPTION("LCD and backlight driver for SHARP C7x0/Cxx00");
608 MODULE_ALIAS("spi:corgi-lcd");