static int tpo_td043_power_on(struct panel_drv_data *ddata) { int r; if (ddata->powered_on) return 0; r = regulator_enable(ddata->vcc_reg); if (r != 0) return r; /* wait for panel to stabilize */ msleep(160); if (gpio_is_valid(ddata->nreset_gpio)) gpio_set_value(ddata->nreset_gpio, 1); tpo_td043_write(ddata->spi, 2, TPO_R02_MODE(ddata->mode) | TPO_R02_NCLK_RISING); tpo_td043_write(ddata->spi, 3, TPO_R03_VAL_NORMAL); tpo_td043_write(ddata->spi, 0x20, 0xf0); tpo_td043_write(ddata->spi, 0x21, 0xf0); tpo_td043_write_mirror(ddata->spi, ddata->hmirror, ddata->vmirror); tpo_td043_write_gamma(ddata->spi, ddata->gamma); ddata->powered_on = 1; return 0; }
static int tpo_td043_power_on(struct omap_dss_device *dssdev) { struct tpo_td043_device *tpo_td043 = dev_get_drvdata(&dssdev->dev); int nreset_gpio = dssdev->reset_gpio; int r; if (dssdev->state == OMAP_DSS_DISPLAY_ACTIVE) return 0; r = omapdss_dpi_display_enable(dssdev); if (r) goto err0; if (dssdev->platform_enable) { r = dssdev->platform_enable(dssdev); if (r) goto err1; } regulator_enable(tpo_td043->vcc_reg); /* wait for power up */ msleep(160); if (gpio_is_valid(nreset_gpio)) gpio_set_value(nreset_gpio, 1); tpo_td043_write(tpo_td043->spi, 2, TPO_R02_MODE(tpo_td043->mode) | TPO_R02_NCLK_RISING); tpo_td043_write(tpo_td043->spi, 3, TPO_R03_VAL_NORMAL); tpo_td043_write(tpo_td043->spi, 0x20, 0xf0); tpo_td043_write(tpo_td043->spi, 0x21, 0xf0); tpo_td043_write_mirror(tpo_td043->spi, tpo_td043->hmirror, tpo_td043->vmirror); tpo_td043_write_gamma(tpo_td043->spi, tpo_td043->gamma); return 0; err1: omapdss_dpi_display_disable(dssdev); err0: return r; }
static int tpo_td043_write_mirror(struct spi_device *spi, bool h, bool v) { u8 reg4 = TPO_R04_NFLIP_H | TPO_R04_NFLIP_V | \ TPO_R04_CP_CLK_FREQ_1H | TPO_R04_VGL_FREQ_1H; if (h) reg4 &= ~TPO_R04_NFLIP_H; if (v) reg4 &= ~TPO_R04_NFLIP_V; return tpo_td043_write(spi, 4, reg4); }
static void tpo_td043_power_off(struct panel_drv_data *ddata) { if (!ddata->powered_on) return; tpo_td043_write(ddata->spi, 3, TPO_R03_VAL_STANDBY | TPO_R03_EN_PWM); if (gpio_is_valid(ddata->nreset_gpio)) gpio_set_value(ddata->nreset_gpio, 0); /* wait for at least 2 vsyncs before cutting off power */ msleep(50); tpo_td043_write(ddata->spi, 3, TPO_R03_VAL_STANDBY); regulator_disable(ddata->vcc_reg); ddata->powered_on = 0; }
static void tpo_td043_write_gamma(struct spi_device *spi, u16 gamma[12]) { u8 i, val; /* gamma bits [9:8] */ for (val = i = 0; i < 4; i++) val |= (gamma[i] & 0x300) >> ((i + 1) * 2); tpo_td043_write(spi, 0x11, val); for (val = i = 0; i < 4; i++) val |= (gamma[i+4] & 0x300) >> ((i + 1) * 2); tpo_td043_write(spi, 0x12, val); for (val = i = 0; i < 4; i++) val |= (gamma[i+8] & 0x300) >> ((i + 1) * 2); tpo_td043_write(spi, 0x13, val); /* gamma bits [7:0] */ for (val = i = 0; i < 12; i++) tpo_td043_write(spi, 0x14 + i, gamma[i] & 0xff); }
static void tpo_td043_power_off(struct tpo_td043_device *tpo_td043) { int nreset_gpio = tpo_td043->nreset_gpio; if (!tpo_td043->powered_on) return; tpo_td043_write(tpo_td043->spi, 3, TPO_R03_VAL_STANDBY | TPO_R03_EN_PWM); if (gpio_is_valid(nreset_gpio)) gpio_set_value(nreset_gpio, 0); /* wait for at least 2 vsyncs before cutting off power */ msleep(50); tpo_td043_write(tpo_td043->spi, 3, TPO_R03_VAL_STANDBY); regulator_disable(tpo_td043->vcc_reg); tpo_td043->powered_on = 0; }
static ssize_t tpo_td043_mode_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct tpo_td043_device *tpo_td043 = dev_get_drvdata(dev); long val; int ret; ret = kstrtol(buf, 0, &val); if (ret != 0 || val & ~7) return -EINVAL; tpo_td043->mode = val; val |= TPO_R02_NCLK_RISING; tpo_td043_write(tpo_td043->spi, 2, val); return count; }