Lines Matching +full:lcd +full:- +full:supply
1 // SPDX-License-Identifier: GPL-2.0+
3 * LCD-OLinuXino support for panel driver
72 struct regulator *supply; member
85 struct lcd_olinuxino *lcd = to_lcd_olinuxino(panel); in lcd_olinuxino_disable() local
87 if (!lcd->enabled) in lcd_olinuxino_disable()
90 backlight_disable(lcd->backlight); in lcd_olinuxino_disable()
92 lcd->enabled = false; in lcd_olinuxino_disable()
99 struct lcd_olinuxino *lcd = to_lcd_olinuxino(panel); in lcd_olinuxino_unprepare() local
101 if (!lcd->prepared) in lcd_olinuxino_unprepare()
104 gpiod_set_value_cansleep(lcd->enable_gpio, 0); in lcd_olinuxino_unprepare()
105 regulator_disable(lcd->supply); in lcd_olinuxino_unprepare()
107 lcd->prepared = false; in lcd_olinuxino_unprepare()
114 struct lcd_olinuxino *lcd = to_lcd_olinuxino(panel); in lcd_olinuxino_prepare() local
117 if (lcd->prepared) in lcd_olinuxino_prepare()
120 ret = regulator_enable(lcd->supply); in lcd_olinuxino_prepare()
124 gpiod_set_value_cansleep(lcd->enable_gpio, 1); in lcd_olinuxino_prepare()
125 lcd->prepared = true; in lcd_olinuxino_prepare()
132 struct lcd_olinuxino *lcd = to_lcd_olinuxino(panel); in lcd_olinuxino_enable() local
134 if (lcd->enabled) in lcd_olinuxino_enable()
137 backlight_enable(lcd->backlight); in lcd_olinuxino_enable()
139 lcd->enabled = true; in lcd_olinuxino_enable()
146 struct lcd_olinuxino *lcd = to_lcd_olinuxino(panel); in lcd_olinuxino_get_modes() local
147 struct drm_connector *connector = lcd->panel.connector; in lcd_olinuxino_get_modes()
148 struct lcd_olinuxino_info *lcd_info = &lcd->eeprom.info; in lcd_olinuxino_get_modes()
149 struct drm_device *drm = lcd->panel.drm; in lcd_olinuxino_get_modes()
154 for (i = 0; i < lcd->eeprom.num_modes; i++) { in lcd_olinuxino_get_modes()
156 &lcd->eeprom.reserved[i * sizeof(*lcd_mode)]; in lcd_olinuxino_get_modes()
160 dev_err(drm->dev, "failed to add mode %ux%u@%u\n", in lcd_olinuxino_get_modes()
161 lcd_mode->hactive, in lcd_olinuxino_get_modes()
162 lcd_mode->vactive, in lcd_olinuxino_get_modes()
163 lcd_mode->refresh); in lcd_olinuxino_get_modes()
167 mode->clock = lcd_mode->pixelclock; in lcd_olinuxino_get_modes()
168 mode->hdisplay = lcd_mode->hactive; in lcd_olinuxino_get_modes()
169 mode->hsync_start = lcd_mode->hactive + lcd_mode->hfp; in lcd_olinuxino_get_modes()
170 mode->hsync_end = lcd_mode->hactive + lcd_mode->hfp + in lcd_olinuxino_get_modes()
171 lcd_mode->hpw; in lcd_olinuxino_get_modes()
172 mode->htotal = lcd_mode->hactive + lcd_mode->hfp + in lcd_olinuxino_get_modes()
173 lcd_mode->hpw + lcd_mode->hbp; in lcd_olinuxino_get_modes()
174 mode->vdisplay = lcd_mode->vactive; in lcd_olinuxino_get_modes()
175 mode->vsync_start = lcd_mode->vactive + lcd_mode->vfp; in lcd_olinuxino_get_modes()
176 mode->vsync_end = lcd_mode->vactive + lcd_mode->vfp + in lcd_olinuxino_get_modes()
177 lcd_mode->vpw; in lcd_olinuxino_get_modes()
178 mode->vtotal = lcd_mode->vactive + lcd_mode->vfp + in lcd_olinuxino_get_modes()
179 lcd_mode->vpw + lcd_mode->vbp; in lcd_olinuxino_get_modes()
180 mode->vrefresh = lcd_mode->refresh; in lcd_olinuxino_get_modes()
184 mode->type |= DRM_MODE_TYPE_PREFERRED; in lcd_olinuxino_get_modes()
185 mode->type |= DRM_MODE_TYPE_DRIVER; in lcd_olinuxino_get_modes()
193 connector->display_info.width_mm = lcd_info->width_mm; in lcd_olinuxino_get_modes()
194 connector->display_info.height_mm = lcd_info->height_mm; in lcd_olinuxino_get_modes()
195 connector->display_info.bpc = lcd_info->bpc; in lcd_olinuxino_get_modes()
197 if (lcd_info->bus_format) in lcd_olinuxino_get_modes()
198 drm_display_info_set_bus_formats(&connector->display_info, in lcd_olinuxino_get_modes()
199 &lcd_info->bus_format, 1); in lcd_olinuxino_get_modes()
200 connector->display_info.bus_flags = lcd_info->bus_flag; in lcd_olinuxino_get_modes()
216 struct device *dev = &client->dev; in lcd_olinuxino_probe()
217 struct lcd_olinuxino *lcd; in lcd_olinuxino_probe() local
221 if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C | in lcd_olinuxino_probe()
223 return -ENODEV; in lcd_olinuxino_probe()
225 lcd = devm_kzalloc(dev, sizeof(*lcd), GFP_KERNEL); in lcd_olinuxino_probe()
226 if (!lcd) in lcd_olinuxino_probe()
227 return -ENOMEM; in lcd_olinuxino_probe()
229 i2c_set_clientdata(client, lcd); in lcd_olinuxino_probe()
230 lcd->dev = dev; in lcd_olinuxino_probe()
231 lcd->client = client; in lcd_olinuxino_probe()
233 mutex_init(&lcd->mutex); in lcd_olinuxino_probe()
237 mutex_lock(&lcd->mutex); in lcd_olinuxino_probe()
241 (u8 *)&lcd->eeprom + i); in lcd_olinuxino_probe()
242 mutex_unlock(&lcd->mutex); in lcd_olinuxino_probe()
250 checksum = ~crc32(~0, (u8 *)&lcd->eeprom, 252); in lcd_olinuxino_probe()
251 if (checksum != lcd->eeprom.checksum) { in lcd_olinuxino_probe()
253 return -EINVAL; in lcd_olinuxino_probe()
257 if (lcd->eeprom.header != LCD_OLINUXINO_HEADER_MAGIC) { in lcd_olinuxino_probe()
259 return -EINVAL; in lcd_olinuxino_probe()
263 lcd->eeprom.info.name, in lcd_olinuxino_probe()
264 lcd->eeprom.revision, in lcd_olinuxino_probe()
265 lcd->eeprom.serial); in lcd_olinuxino_probe()
271 if (lcd->eeprom.num_modes > 4) { in lcd_olinuxino_probe()
273 lcd->eeprom.num_modes = 4; in lcd_olinuxino_probe()
276 lcd->enabled = false; in lcd_olinuxino_probe()
277 lcd->prepared = false; in lcd_olinuxino_probe()
279 lcd->supply = devm_regulator_get(dev, "power"); in lcd_olinuxino_probe()
280 if (IS_ERR(lcd->supply)) in lcd_olinuxino_probe()
281 return PTR_ERR(lcd->supply); in lcd_olinuxino_probe()
283 lcd->enable_gpio = devm_gpiod_get(dev, "enable", GPIOD_OUT_LOW); in lcd_olinuxino_probe()
284 if (IS_ERR(lcd->enable_gpio)) in lcd_olinuxino_probe()
285 return PTR_ERR(lcd->enable_gpio); in lcd_olinuxino_probe()
287 lcd->backlight = devm_of_find_backlight(dev); in lcd_olinuxino_probe()
288 if (IS_ERR(lcd->backlight)) in lcd_olinuxino_probe()
289 return PTR_ERR(lcd->backlight); in lcd_olinuxino_probe()
291 drm_panel_init(&lcd->panel); in lcd_olinuxino_probe()
292 lcd->panel.dev = dev; in lcd_olinuxino_probe()
293 lcd->panel.funcs = &lcd_olinuxino_funcs; in lcd_olinuxino_probe()
295 return drm_panel_add(&lcd->panel); in lcd_olinuxino_probe()
302 drm_panel_remove(&panel->panel); in lcd_olinuxino_remove()
304 lcd_olinuxino_disable(&panel->panel); in lcd_olinuxino_remove()
305 lcd_olinuxino_unprepare(&panel->panel); in lcd_olinuxino_remove()
311 { .compatible = "olimex,lcd-olinuxino" },
328 MODULE_DESCRIPTION("LCD-OLinuXino driver");