int ili9320_probe_spi(struct spi_device *spi, struct ili9320_client *client) { struct ili9320_platdata *cfg = dev_get_platdata(&spi->dev); struct device *dev = &spi->dev; struct ili9320 *ili; struct lcd_device *lcd; int ret = 0; /* verify we where given some information */ if (cfg == NULL) { dev_err(dev, "no platform data supplied\n"); return -EINVAL; } if (cfg->hsize <= 0 || cfg->vsize <= 0 || cfg->reset == NULL) { dev_err(dev, "invalid platform data supplied\n"); return -EINVAL; } /* allocate and initialse our state */ ili = devm_kzalloc(&spi->dev, sizeof(struct ili9320), GFP_KERNEL); if (ili == NULL) { dev_err(dev, "no memory for device\n"); return -ENOMEM; } ili->access.spi.id = ILI9320_SPI_IDCODE | ILI9320_SPI_ID(1); ili->dev = dev; ili->client = client; ili->power = FB_BLANK_POWERDOWN; ili->platdata = cfg; spi_set_drvdata(spi, ili); ili9320_setup_spi(ili, spi); lcd = devm_lcd_device_register(&spi->dev, "ili9320", dev, ili, &ili9320_ops); if (IS_ERR(lcd)) { dev_err(dev, "failed to register lcd device\n"); return PTR_ERR(lcd); } ili->lcd = lcd; dev_info(dev, "initialising %s\n", client->name); ret = ili9320_power(ili, FB_BLANK_UNBLANK); if (ret != 0) { dev_err(dev, "failed to set lcd power state\n"); return ret; } return 0; }
int ili9320_resume(struct ili9320 *lcd) { dev_info(lcd->dev, "resuming from power state %d\n", lcd->power); if (lcd->platdata->suspend == ILI9320_SUSPEND_DEEP) ili9320_write(lcd, ILI9320_POWER1, 0x00); return ili9320_power(lcd, FB_BLANK_UNBLANK); }
int __devexit ili9320_remove(struct ili9320 *ili) { ili9320_power(ili, FB_BLANK_POWERDOWN); lcd_device_unregister(ili->lcd); kfree(ili); return 0; }
int ili9320_suspend(struct ili9320 *lcd) { int ret; ret = ili9320_power(lcd, FB_BLANK_POWERDOWN); if (lcd->platdata->suspend == ILI9320_SUSPEND_DEEP) { ili9320_write(lcd, ILI9320_POWER1, lcd->power1 | ILI9320_POWER1_SLP | ILI9320_POWER1_DSTB); lcd->initialised = 0; } return ret; }
int ili9320_suspend(struct ili9320 *lcd, pm_message_t state) { int ret; dev_dbg(lcd->dev, "%s: event %d\n", __func__, state.event); if (state.event == PM_EVENT_SUSPEND) { ret = ili9320_power(lcd, FB_BLANK_POWERDOWN); if (lcd->platdata->suspend == ILI9320_SUSPEND_DEEP) { ili9320_write(lcd, ILI9320_POWER1, lcd->power1 | ILI9320_POWER1_SLP | ILI9320_POWER1_DSTB); lcd->initialised = 0; } return ret; } return 0; }
/* Power down all displays on reboot, poweroff or halt */ void ili9320_shutdown(struct ili9320 *lcd) { ili9320_power(lcd, FB_BLANK_POWERDOWN); }
int ili9320_remove(struct ili9320 *ili) { ili9320_power(ili, FB_BLANK_POWERDOWN); return 0; }
static int ili9320_set_power(struct lcd_device *ld, int power) { struct ili9320 *lcd = to_our_lcd(ld); return ili9320_power(lcd, power); }