static int rad_panel_prepare(struct drm_panel *panel)
{
struct rad_panel *rad = to_rad_panel(panel);
- struct mipi_dsi_device *dsi = rad->dsi;
- struct device *dev = &dsi->dev;
- int color_format = color_format_from_dsi_format(dsi->format);
- int ret;
if (rad->prepared)
return 0;
- DRM_DEV_DEBUG_DRIVER(dev, "\n");
-
if (rad->reset != NULL) {
- gpiod_set_value(rad->reset, 1);
- usleep_range(10000, 15000);
gpiod_set_value(rad->reset, 0);
usleep_range(5000, 10000);
gpiod_set_value(rad->reset, 1);
usleep_range(20000, 25000);
}
+ rad->prepared = true;
+
+ return 0;
+}
+
+static int rad_panel_unprepare(struct drm_panel *panel)
+{
+ struct rad_panel *rad = to_rad_panel(panel);
+ struct device *dev = &rad->dsi->dev;
+
+ if (!rad->prepared)
+ return 0;
+
+ if (rad->enabled) {
+ DRM_DEV_ERROR(dev, "Panel still enabled!\n");
+ return -EPERM;
+ }
+
+ if (rad->reset != NULL) {
+ gpiod_set_value(rad->reset, 0);
+ usleep_range(10000, 15000);
+ }
+
+ rad->prepared = false;
+
+ return 0;
+}
+
+static int rad_panel_enable(struct drm_panel *panel)
+{
+ struct rad_panel *rad = to_rad_panel(panel);
+ struct mipi_dsi_device *dsi = rad->dsi;
+ struct device *dev = &dsi->dev;
+ int color_format = color_format_from_dsi_format(dsi->format);
+ int ret;
+
+ if (rad->enabled)
+ return 0;
+
+ if (!rad->prepared) {
+ DRM_DEV_ERROR(dev, "Panel not prepared!\n");
+ return -EPERM;
+ }
+
dsi->mode_flags |= MIPI_DSI_MODE_LPM;
ret = rad_panel_push_cmd_list(dsi);
goto fail;
}
- rad->prepared = true;
+ rad->backlight->props.power = FB_BLANK_UNBLANK;
+ backlight_update_status(rad->backlight);
+
+ rad->enabled = true;
return 0;
return ret;
}
-static int rad_panel_unprepare(struct drm_panel *panel)
+static int rad_panel_disable(struct drm_panel *panel)
{
struct rad_panel *rad = to_rad_panel(panel);
struct mipi_dsi_device *dsi = rad->dsi;
struct device *dev = &dsi->dev;
int ret;
- if (!rad->prepared)
+ if (!rad->enabled)
return 0;
- DRM_DEV_DEBUG_DRIVER(dev, "\n");
-
dsi->mode_flags |= MIPI_DSI_MODE_LPM;
ret = mipi_dsi_dcs_set_display_off(dsi);
- if (ret < 0)
+ if (ret < 0) {
DRM_DEV_ERROR(dev, "Failed to set display OFF (%d)\n", ret);
+ return ret;
+ }
usleep_range(5000, 10000);
ret = mipi_dsi_dcs_enter_sleep_mode(dsi);
- if (ret < 0)
+ if (ret < 0) {
DRM_DEV_ERROR(dev, "Failed to enter sleep mode (%d)\n", ret);
-
- usleep_range(10000, 15000);
-
- if (rad->reset != NULL) {
- gpiod_set_value(rad->reset, 0);
- usleep_range(10000, 15000);
+ return ret;
}
- rad->prepared = false;
-
- return 0;
-}
-
-static int rad_panel_enable(struct drm_panel *panel)
-{
- struct rad_panel *rad = to_rad_panel(panel);
- struct device *dev = &rad->dsi->dev;
-
- if (rad->enabled)
- return 0;
-
- DRM_DEV_DEBUG_DRIVER(dev, "\n");
-
- rad->backlight->props.power = FB_BLANK_UNBLANK;
- backlight_update_status(rad->backlight);
-
- rad->enabled = true;
-
- return 0;
-}
-
-static int rad_panel_disable(struct drm_panel *panel)
-{
- struct rad_panel *rad = to_rad_panel(panel);
- struct device *dev = &rad->dsi->dev;
-
- if (!rad->enabled)
- return 0;
-
- DRM_DEV_DEBUG_DRIVER(dev, "\n");
+ usleep_range(10000, 15000);
rad->backlight->props.power = FB_BLANK_POWERDOWN;
backlight_update_status(rad->backlight);
struct device *dev = &dsi->dev;
int ret;
- ret = rad_panel_unprepare(&rad->base);
- ret |= rad_panel_disable(&rad->base);
- if (ret < 0)
- DRM_DEV_ERROR(dev, "Failed to disable panel (%d)\n", ret);
-
ret = mipi_dsi_detach(dsi);
if (ret < 0)
DRM_DEV_ERROR(dev, "Failed to detach from host (%d)\n",
{
struct rad_panel *rad = mipi_dsi_get_drvdata(dsi);
- rad_panel_unprepare(&rad->base);
rad_panel_disable(&rad->base);
+ rad_panel_unprepare(&rad->base);
}
static const struct of_device_id rad_of_match[] = {