Lines Matching +full:regulator +full:- +full:poweroff

1 // SPDX-License-Identifier: GPL-2.0-only
15 #include <linux/regulator/consumer.h>
45 struct regulator *supply;
46 struct regulator *ddi_supply;
62 unsigned int refresh = drm_mode_vrefresh(jdi->mode); in jdi_wait_frames()
74 backlight_disable(jdi->backlight); in jdi_panel_disable()
86 ret = mipi_dsi_dcs_set_display_off(jdi->link1); in jdi_panel_unprepare()
88 dev_err(panel->dev, "failed to set display off: %d\n", ret); in jdi_panel_unprepare()
90 ret = mipi_dsi_dcs_set_display_off(jdi->link2); in jdi_panel_unprepare()
92 dev_err(panel->dev, "failed to set display off: %d\n", ret); in jdi_panel_unprepare()
97 ret = mipi_dsi_dcs_enter_sleep_mode(jdi->link1); in jdi_panel_unprepare()
99 dev_err(panel->dev, "failed to enter sleep mode: %d\n", ret); in jdi_panel_unprepare()
100 ret = mipi_dsi_dcs_enter_sleep_mode(jdi->link2); in jdi_panel_unprepare()
102 dev_err(panel->dev, "failed to enter sleep mode: %d\n", ret); in jdi_panel_unprepare()
107 gpiod_set_value(jdi->reset_gpio, 1); in jdi_panel_unprepare()
112 gpiod_set_value(jdi->enable_gpio, 0); in jdi_panel_unprepare()
117 regulator_disable(jdi->ddi_supply); in jdi_panel_unprepare()
122 regulator_disable(jdi->supply); in jdi_panel_unprepare()
135 err = mipi_dsi_dcs_set_column_address(left, 0, mode->hdisplay / 2 - 1); in jdi_setup_symmetrical_split()
137 dev_err(&left->dev, "failed to set column address: %d\n", err); in jdi_setup_symmetrical_split()
141 err = mipi_dsi_dcs_set_column_address(right, 0, mode->hdisplay / 2 - 1); in jdi_setup_symmetrical_split()
143 dev_err(&right->dev, "failed to set column address: %d\n", err); in jdi_setup_symmetrical_split()
147 err = mipi_dsi_dcs_set_page_address(left, 0, mode->vdisplay - 1); in jdi_setup_symmetrical_split()
149 dev_err(&left->dev, "failed to set page address: %d\n", err); in jdi_setup_symmetrical_split()
153 err = mipi_dsi_dcs_set_page_address(right, 0, mode->vdisplay - 1); in jdi_setup_symmetrical_split()
155 dev_err(&right->dev, "failed to set page address: %d\n", err); in jdi_setup_symmetrical_split()
165 mipi_dsi_generic_write_seq(jdi->link1, MCS_CMD_ACS_PROT, in jdi_write_dcdc_registers()
167 mipi_dsi_generic_write_seq(jdi->link2, MCS_CMD_ACS_PROT, in jdi_write_dcdc_registers()
174 mipi_dsi_generic_write_seq(jdi->link1, MCS_PWR_CTRL_FUNC, in jdi_write_dcdc_registers()
180 mipi_dsi_generic_write_seq(jdi->link2, MCS_PWR_CTRL_FUNC, in jdi_write_dcdc_registers()
197 backlight_disable(jdi->backlight); in jdi_panel_prepare()
200 jdi->link1->mode_flags |= MIPI_DSI_MODE_LPM; in jdi_panel_prepare()
201 jdi->link2->mode_flags |= MIPI_DSI_MODE_LPM; in jdi_panel_prepare()
203 err = regulator_enable(jdi->supply); in jdi_panel_prepare()
205 dev_err(panel->dev, "failed to enable supply: %d\n", err); in jdi_panel_prepare()
211 err = regulator_enable(jdi->ddi_supply); in jdi_panel_prepare()
213 dev_err(panel->dev, "failed to enable ddi_supply: %d\n", err); in jdi_panel_prepare()
219 gpiod_set_value(jdi->enable_gpio, 1); in jdi_panel_prepare()
223 gpiod_set_value(jdi->reset_gpio, 0); in jdi_panel_prepare()
228 * TODO: The device supports both left-right and even-odd split in jdi_panel_prepare()
229 * configurations, but this driver currently supports only the left- in jdi_panel_prepare()
234 err = jdi_setup_symmetrical_split(jdi->link1, jdi->link2, in jdi_panel_prepare()
235 jdi->mode); in jdi_panel_prepare()
237 dev_err(panel->dev, "failed to set up symmetrical split: %d\n", in jdi_panel_prepare()
239 goto poweroff; in jdi_panel_prepare()
242 err = mipi_dsi_dcs_set_tear_scanline(jdi->link1, in jdi_panel_prepare()
243 jdi->mode->vdisplay - 16); in jdi_panel_prepare()
245 dev_err(panel->dev, "failed to set tear scanline: %d\n", err); in jdi_panel_prepare()
246 goto poweroff; in jdi_panel_prepare()
249 err = mipi_dsi_dcs_set_tear_scanline(jdi->link2, in jdi_panel_prepare()
250 jdi->mode->vdisplay - 16); in jdi_panel_prepare()
252 dev_err(panel->dev, "failed to set tear scanline: %d\n", err); in jdi_panel_prepare()
253 goto poweroff; in jdi_panel_prepare()
256 err = mipi_dsi_dcs_set_tear_on(jdi->link1, in jdi_panel_prepare()
259 dev_err(panel->dev, "failed to set tear on: %d\n", err); in jdi_panel_prepare()
260 goto poweroff; in jdi_panel_prepare()
263 err = mipi_dsi_dcs_set_tear_on(jdi->link2, in jdi_panel_prepare()
266 dev_err(panel->dev, "failed to set tear on: %d\n", err); in jdi_panel_prepare()
267 goto poweroff; in jdi_panel_prepare()
270 err = mipi_dsi_dcs_set_pixel_format(jdi->link1, MIPI_DCS_PIXEL_FMT_24BIT); in jdi_panel_prepare()
272 dev_err(panel->dev, "failed to set pixel format: %d\n", err); in jdi_panel_prepare()
273 goto poweroff; in jdi_panel_prepare()
276 err = mipi_dsi_dcs_set_pixel_format(jdi->link2, MIPI_DCS_PIXEL_FMT_24BIT); in jdi_panel_prepare()
278 dev_err(panel->dev, "failed to set pixel format: %d\n", err); in jdi_panel_prepare()
279 goto poweroff; in jdi_panel_prepare()
282 err = mipi_dsi_dcs_exit_sleep_mode(jdi->link1); in jdi_panel_prepare()
284 dev_err(panel->dev, "failed to exit sleep mode: %d\n", err); in jdi_panel_prepare()
285 goto poweroff; in jdi_panel_prepare()
288 err = mipi_dsi_dcs_exit_sleep_mode(jdi->link2); in jdi_panel_prepare()
290 dev_err(panel->dev, "failed to exit sleep mode: %d\n", err); in jdi_panel_prepare()
291 goto poweroff; in jdi_panel_prepare()
296 dev_err(panel->dev, "failed to write dcdc registers: %d\n", err); in jdi_panel_prepare()
297 goto poweroff; in jdi_panel_prepare()
305 err = mipi_dsi_dcs_set_display_on(jdi->link1); in jdi_panel_prepare()
307 dev_err(panel->dev, "failed to set display on: %d\n", err); in jdi_panel_prepare()
308 goto poweroff; in jdi_panel_prepare()
311 err = mipi_dsi_dcs_set_display_on(jdi->link2); in jdi_panel_prepare()
313 dev_err(panel->dev, "failed to set display on: %d\n", err); in jdi_panel_prepare()
314 goto poweroff; in jdi_panel_prepare()
317 jdi->link1->mode_flags &= ~MIPI_DSI_MODE_LPM; in jdi_panel_prepare()
318 jdi->link2->mode_flags &= ~MIPI_DSI_MODE_LPM; in jdi_panel_prepare()
322 poweroff: in jdi_panel_prepare()
323 regulator_disable(jdi->ddi_supply); in jdi_panel_prepare()
328 regulator_disable(jdi->supply); in jdi_panel_prepare()
345 backlight_enable(jdi->backlight); in jdi_panel_enable()
368 struct device *dev = &jdi->link1->dev; in jdi_panel_get_modes()
370 mode = drm_mode_duplicate(connector->dev, &default_mode); in jdi_panel_get_modes()
375 return -ENOMEM; in jdi_panel_get_modes()
382 connector->display_info.width_mm = 211; in jdi_panel_get_modes()
383 connector->display_info.height_mm = 148; in jdi_panel_get_modes()
384 connector->display_info.bpc = 8; in jdi_panel_get_modes()
405 struct device *dev = &jdi->link1->dev; in jdi_panel_add()
407 jdi->mode = &default_mode; in jdi_panel_add()
409 jdi->supply = devm_regulator_get(dev, "power"); in jdi_panel_add()
410 if (IS_ERR(jdi->supply)) in jdi_panel_add()
411 return dev_err_probe(dev, PTR_ERR(jdi->supply), in jdi_panel_add()
412 "failed to get power regulator\n"); in jdi_panel_add()
414 jdi->ddi_supply = devm_regulator_get(dev, "ddi"); in jdi_panel_add()
415 if (IS_ERR(jdi->ddi_supply)) in jdi_panel_add()
416 return dev_err_probe(dev, PTR_ERR(jdi->ddi_supply), in jdi_panel_add()
417 "failed to get ddi regulator\n"); in jdi_panel_add()
419 jdi->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_HIGH); in jdi_panel_add()
420 if (IS_ERR(jdi->reset_gpio)) in jdi_panel_add()
421 return dev_err_probe(dev, PTR_ERR(jdi->reset_gpio), in jdi_panel_add()
426 jdi->enable_gpio = devm_gpiod_get(dev, "enable", GPIOD_OUT_LOW); in jdi_panel_add()
427 if (IS_ERR(jdi->enable_gpio)) in jdi_panel_add()
428 return dev_err_probe(dev, PTR_ERR(jdi->enable_gpio), in jdi_panel_add()
433 jdi->backlight = devm_of_find_backlight(dev); in jdi_panel_add()
434 if (IS_ERR(jdi->backlight)) in jdi_panel_add()
435 return dev_err_probe(dev, PTR_ERR(jdi->backlight), in jdi_panel_add()
438 drm_panel_init(&jdi->base, &jdi->link1->dev, &jdi_panel_funcs, in jdi_panel_add()
441 drm_panel_add(&jdi->base); in jdi_panel_add()
448 if (jdi->base.dev) in jdi_panel_del()
449 drm_panel_remove(&jdi->base); in jdi_panel_del()
451 if (jdi->link2) in jdi_panel_del()
452 put_device(&jdi->link2->dev); in jdi_panel_del()
462 dsi->lanes = 4; in jdi_panel_dsi_probe()
463 dsi->format = MIPI_DSI_FMT_RGB888; in jdi_panel_dsi_probe()
464 dsi->mode_flags = 0; in jdi_panel_dsi_probe()
466 /* Find DSI-LINK1 */ in jdi_panel_dsi_probe()
467 np = of_parse_phandle(dsi->dev.of_node, "link2", 0); in jdi_panel_dsi_probe()
473 return -EPROBE_DEFER; in jdi_panel_dsi_probe()
476 /* register a panel for only the DSI-LINK1 interface */ in jdi_panel_dsi_probe()
478 jdi = devm_kzalloc(&dsi->dev, sizeof(*jdi), GFP_KERNEL); in jdi_panel_dsi_probe()
480 put_device(&secondary->dev); in jdi_panel_dsi_probe()
481 return -ENOMEM; in jdi_panel_dsi_probe()
486 jdi->link1 = dsi; in jdi_panel_dsi_probe()
487 jdi->link2 = secondary; in jdi_panel_dsi_probe()
491 put_device(&secondary->dev); in jdi_panel_dsi_probe()
512 /* only detach from host for the DSI-LINK2 interface */ in jdi_panel_dsi_remove()
516 err = jdi_panel_disable(&jdi->base); in jdi_panel_dsi_remove()
518 dev_err(&dsi->dev, "failed to disable panel: %d\n", err); in jdi_panel_dsi_remove()
522 dev_err(&dsi->dev, "failed to detach from DSI host: %d\n", err); in jdi_panel_dsi_remove()
534 jdi_panel_disable(&jdi->base); in jdi_panel_dsi_shutdown()
539 .name = "panel-jdi-lpm102a188a",