Hi Krzysztof, ? 09/03/2015 08:58 AM, Krzysztof Kozlowski ??: > On 01.09.2015 14:49, Yakir Yang wrote: >> Split the dp core driver from exynos directory to bridge >> directory, and rename the core driver to analogix_dp_*, >> leave the platform code to analogix_dp-exynos. >> >> Signed-off-by: Yakir Yang <ykk at rock-chips.com> >> --- >> Changes in v4: >> - Take Rob suggest, update "analogix,hpd-gpios" to "hpd-gpios" DT propery. >> - Take Jingoo suggest, rename "analogix_dp-exynos.c" file name to "exynos_dp.c" >> - Take Archit suggest, create a separate folder for analogix code in bridge/ >> >> Changes in v3: >> - Take Thierry Reding suggest, move exynos's video_timing code >> to analogix_dp-exynos platform driver, add get_modes method >> to struct analogix_dp_plat_data. >> - Take Heiko suggest, rename some "samsung*" dts propery to "analogix*". >> >> Changes in v2: >> - Take Jingoo Han suggest, remove new copyright >> - Fix compiled failed dut to analogix_dp_device misspell >> >> drivers/gpu/drm/bridge/Kconfig | 2 + >> drivers/gpu/drm/bridge/Makefile | 1 + >> drivers/gpu/drm/bridge/analogix/Kconfig | 4 + >> drivers/gpu/drm/bridge/analogix/Makefile | 1 + >> .../analogix/analogix_dp_core.c} | 817 ++++++------- >> drivers/gpu/drm/bridge/analogix/analogix_dp_core.h | 283 +++++ >> drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c | 1265 ++++++++++++++++++++ >> .../analogix/analogix_dp_reg.h} | 258 ++-- >> drivers/gpu/drm/exynos/Kconfig | 3 +- >> drivers/gpu/drm/exynos/Makefile | 2 +- >> drivers/gpu/drm/exynos/exynos_dp.c | 306 +++++ >> drivers/gpu/drm/exynos/exynos_dp_core.h | 282 ----- >> drivers/gpu/drm/exynos/exynos_dp_reg.c | 1259 ------------------- >> include/drm/bridge/analogix_dp.h | 24 + >> 14 files changed, 2357 insertions(+), 2150 deletions(-) >> create mode 100644 drivers/gpu/drm/bridge/analogix/Kconfig >> create mode 100644 drivers/gpu/drm/bridge/analogix/Makefile >> rename drivers/gpu/drm/{exynos/exynos_dp_core.c => bridge/analogix/analogix_dp_core.c} (50%) >> create mode 100644 drivers/gpu/drm/bridge/analogix/analogix_dp_core.h >> create mode 100644 drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c >> rename drivers/gpu/drm/{exynos/exynos_dp_reg.h => bridge/analogix/analogix_dp_reg.h} (64%) >> create mode 100644 drivers/gpu/drm/exynos/exynos_dp.c >> delete mode 100644 drivers/gpu/drm/exynos/exynos_dp_core.h >> delete mode 100644 drivers/gpu/drm/exynos/exynos_dp_reg.c >> create mode 100644 include/drm/bridge/analogix_dp.h >> >> diff --git a/drivers/gpu/drm/bridge/Kconfig b/drivers/gpu/drm/bridge/Kconfig >> index 2de52a5..7b5b77a 100644 >> --- a/drivers/gpu/drm/bridge/Kconfig >> +++ b/drivers/gpu/drm/bridge/Kconfig >> @@ -29,4 +29,6 @@ config DRM_PARADE_PS8622 >> ---help--- >> Parade eDP-LVDS bridge chip driver. >> >> +source "drivers/gpu/drm/bridge/analogix/Kconfig" >> + >> endmenu >> diff --git a/drivers/gpu/drm/bridge/Makefile b/drivers/gpu/drm/bridge/Makefile >> index e2eef1c..5366c6b 100644 >> --- a/drivers/gpu/drm/bridge/Makefile >> +++ b/drivers/gpu/drm/bridge/Makefile >> @@ -3,3 +3,4 @@ ccflags-y := -Iinclude/drm >> obj-$(CONFIG_DRM_DW_HDMI) += dw_hdmi.o >> obj-$(CONFIG_DRM_NXP_PTN3460) += nxp-ptn3460.o >> obj-$(CONFIG_DRM_PARADE_PS8622) += parade-ps8622.o >> +obj-$(CONFIG_DRM_ANALOGIX_DP) += analogix/ >> diff --git a/drivers/gpu/drm/bridge/analogix/Kconfig b/drivers/gpu/drm/bridge/analogix/Kconfig >> new file mode 100644 >> index 0000000..5ff6551 >> --- /dev/null >> +++ b/drivers/gpu/drm/bridge/analogix/Kconfig >> @@ -0,0 +1,4 @@ >> +config DRM_ANALOGIX_DP >> + tristate >> + depends on DRM >> + select DRM_KMS_HELPER >> diff --git a/drivers/gpu/drm/bridge/analogix/Makefile b/drivers/gpu/drm/bridge/analogix/Makefile >> new file mode 100644 >> index 0000000..9107b86 >> --- /dev/null >> +++ b/drivers/gpu/drm/bridge/analogix/Makefile >> @@ -0,0 +1 @@ >> +obj-$(CONFIG_DRM_ANALOGIX_DP) += analogix_dp_core.o analogix_dp_reg.o >> diff --git a/drivers/gpu/drm/exynos/exynos_dp_core.c b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c >> similarity index 50% >> rename from drivers/gpu/drm/exynos/exynos_dp_core.c >> rename to drivers/gpu/drm/bridge/analogix/analogix_dp_core.c >> index bed0252..7d62f22 100644 >> --- a/drivers/gpu/drm/exynos/exynos_dp_core.c >> +++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c >> @@ -1,14 +1,14 @@ >> /* >> - * Samsung SoC DP (Display Port) interface driver. >> - * >> - * Copyright (C) 2012 Samsung Electronics Co., Ltd. >> - * Author: Jingoo Han <jg1.han at samsung.com> >> - * >> - * This program is free software; you can redistribute it and/or modify it >> - * under the terms of the GNU General Public License as published by the >> - * Free Software Foundation; either version 2 of the License, or (at your >> - * option) any later version. >> - */ >> +* Analogix DP (Display Port) core interface driver. >> +* >> +* Copyright (C) 2012 Samsung Electronics Co., Ltd. >> +* Author: Jingoo Han <jg1.han at samsung.com> >> +* >> +* This program is free software; you can redistribute it and/or modify it >> +* under the terms of the GNU General Public License as published by the >> +* Free Software Foundation; either version 2 of the License, or (at your >> +* option) any later version. >> +*/ >> >> #include <linux/module.h> >> #include <linux/platform_device.h> >> @@ -18,12 +18,9 @@ >> #include <linux/interrupt.h> >> #include <linux/of.h> >> #include <linux/of_gpio.h> >> -#include <linux/of_graph.h> >> #include <linux/gpio.h> >> #include <linux/component.h> >> #include <linux/phy/phy.h> >> -#include <video/of_display_timing.h> >> -#include <video/of_videomode.h> >> >> #include <drm/drmP.h> >> #include <drm/drm_crtc.h> >> @@ -31,52 +28,42 @@ >> #include <drm/drm_atomic_helper.h> >> #include <drm/drm_panel.h> >> >> -#include "exynos_dp_core.h" >> -#include "exynos_drm_crtc.h" >> +#include <drm/bridge/analogix_dp.h> >> >> -#define ctx_from_connector(c) container_of(c, struct exynos_dp_device, \ >> - connector) >> +#include "analogix_dp_core.h" >> >> -static inline struct exynos_drm_crtc *dp_to_crtc(struct exynos_dp_device *dp) >> -{ >> - return to_exynos_crtc(dp->encoder.crtc); >> -} >> - >> -static inline struct exynos_dp_device *encoder_to_dp( >> - struct drm_encoder *e) >> -{ >> - return container_of(e, struct exynos_dp_device, encoder); >> -} >> +#define connector_to_dp(c) \ >> + container_of(c, struct analogix_dp_device, connector) >> >> struct bridge_init { >> struct i2c_client *client; >> struct device_node *node; >> }; >> >> -static void exynos_dp_init_dp(struct exynos_dp_device *dp) >> +static void analogix_dp_init_dp(struct analogix_dp_device *dp) >> { >> - exynos_dp_reset(dp); >> + analogix_dp_reset(dp); >> >> - exynos_dp_swreset(dp); >> + analogix_dp_swreset(dp); >> >> - exynos_dp_init_analog_param(dp); >> - exynos_dp_init_interrupt(dp); >> + analogix_dp_init_analog_param(dp); >> + analogix_dp_init_interrupt(dp); >> >> /* SW defined function Normal operation */ >> - exynos_dp_enable_sw_function(dp); >> + analogix_dp_enable_sw_function(dp); >> >> - exynos_dp_config_interrupt(dp); >> - exynos_dp_init_analog_func(dp); >> + analogix_dp_config_interrupt(dp); >> + analogix_dp_init_analog_func(dp); >> >> - exynos_dp_init_hpd(dp); >> - exynos_dp_init_aux(dp); >> + analogix_dp_init_hpd(dp); >> + analogix_dp_init_aux(dp); >> } >> >> -static int exynos_dp_detect_hpd(struct exynos_dp_device *dp) >> +static int analogix_dp_detect_hpd(struct analogix_dp_device *dp) >> { >> int timeout_loop = 0; >> >> - while (exynos_dp_get_plug_in_status(dp) != 0) { >> + while (analogix_dp_get_plug_in_status(dp) != 0) { >> timeout_loop++; >> if (DP_TIMEOUT_LOOP_COUNT < timeout_loop) { >> dev_err(dp->dev, "failed to get hpd plug status\n"); >> @@ -88,7 +75,7 @@ static int exynos_dp_detect_hpd(struct exynos_dp_device *dp) >> return 0; >> } >> >> -static unsigned char exynos_dp_calc_edid_check_sum(unsigned char *edid_data) >> +static unsigned char analogix_dp_calc_edid_check_sum(unsigned char *edid_data) >> { >> int i; >> unsigned char sum = 0; >> @@ -99,7 +86,7 @@ static unsigned char exynos_dp_calc_edid_check_sum(unsigned char *edid_data) >> return sum; >> } >> >> -static int exynos_dp_read_edid(struct exynos_dp_device *dp) >> +static int analogix_dp_read_edid(struct analogix_dp_device *dp) >> { >> unsigned char edid[EDID_BLOCK_LENGTH * 2]; >> unsigned int extend_block = 0; >> @@ -114,9 +101,9 @@ static int exynos_dp_read_edid(struct exynos_dp_device *dp) >> */ >> >> /* Read Extension Flag, Number of 128-byte EDID extension blocks */ >> - retval = exynos_dp_read_byte_from_i2c(dp, I2C_EDID_DEVICE_ADDR, >> - EDID_EXTENSION_FLAG, >> - &extend_block); >> + retval = analogix_dp_read_byte_from_i2c(dp, I2C_EDID_DEVICE_ADDR, >> + EDID_EXTENSION_FLAG, >> + &extend_block); > Hi, > > What was the point of patch 1 (checkpatch -f --subjective) if you > have to re-align the parameters again? It's meaningless. > > I could understand that idea if this patch touched only first > line - name of the function. This would result in small > and effective diff, like: > > - retval = exynos_dp_read_byte_from_i2c(dp, I2C_EDID_DEVICE_ADDR, > + retval = SAME_LEGNTH____byte_from_i2c(dp, I2C_EDID_DEVICE_ADDR, > EDID_EXTENSION_FLAG, > > But this is not the case. The reviewer have to look at 6 lines > of changes instead of two. You fixed the alignment just for two > patches and then you re-written it. It's meaningless. Yes, this is the place that crazy me too. After rename "exynos" to "analogix", there would bring some "over-80-char" problem :( > Nope. Please drop all changes from patch 1 which: > (all conditions apply): > 1. change alignment, > 2. are immediately changed in next patches (e.g. like here), > > and fix the alignment while renaming the function. > > This is actually another point for not accepting commits where > the reason is "checkpatch told me". Okay, so there would be two patches to fix the alignment, done. Thanks for your careful remind. > > >> if (retval) >> return retval; >> >> @@ -124,7 +111,7 @@ static int exynos_dp_read_edid(struct exynos_dp_device *dp) >> dev_dbg(dp->dev, "EDID data includes a single extension!\n"); >> >> /* Read EDID data */ >> - retval = exynos_dp_read_bytes_from_i2c( >> + retval = analogix_dp_read_bytes_from_i2c( >> dp, I2C_EDID_DEVICE_ADDR, >> EDID_HEADER_PATTERN, >> EDID_BLOCK_LENGTH, >> @@ -133,14 +120,14 @@ static int exynos_dp_read_edid(struct exynos_dp_device *dp) > (...) > >> @@ -871,218 +862,204 @@ static irqreturn_t exynos_dp_irq_handler(int irq, void *arg) >> return IRQ_HANDLED; >> } >> >> -static void exynos_dp_hotplug(struct work_struct *work) >> +static void analogix_dp_hotplug(struct work_struct *work) >> { >> - struct exynos_dp_device *dp; >> + struct analogix_dp_device *dp; >> >> - dp = container_of(work, struct exynos_dp_device, hotplug_work); >> + dp = container_of(work, struct analogix_dp_device, hotplug_work); >> >> if (dp->drm_dev) >> drm_helper_hpd_irq_event(dp->drm_dev); >> } >> >> -static void exynos_dp_commit(struct drm_encoder *encoder) >> +static void analogix_dp_commit(struct analogix_dp_device *dp) >> { >> - struct exynos_dp_device *dp = encoder_to_dp(encoder); >> int ret; >> >> /* Keep the panel disabled while we configure video */ >> - if (dp->panel) { >> - if (drm_panel_disable(dp->panel)) >> + if (dp->plat_data && dp->plat_data->panel) { >> + if (drm_panel_disable(dp->plat_data->panel)) >> DRM_ERROR("failed to disable the panel\n"); >> } >> >> - ret = exynos_dp_detect_hpd(dp); >> + ret = analogix_dp_detect_hpd(dp); >> if (ret) { >> /* Cable has been disconnected, we're done */ >> return; >> } >> >> - ret = exynos_dp_handle_edid(dp); >> + ret = analogix_dp_handle_edid(dp); >> if (ret) { >> dev_err(dp->dev, "unable to handle edid\n"); >> return; >> } >> >> - ret = exynos_dp_set_link_train(dp, dp->video_info->lane_count, >> - dp->video_info->link_rate); >> + ret = analogix_dp_set_link_train(dp, dp->video_info->lane_count, >> + dp->video_info->link_rate); >> if (ret) { >> dev_err(dp->dev, "unable to do link train\n"); >> return; >> } >> >> - exynos_dp_enable_scramble(dp, 1); >> - exynos_dp_enable_rx_to_enhanced_mode(dp, 1); >> - exynos_dp_enable_enhanced_mode(dp, 1); >> + analogix_dp_enable_scramble(dp, 1); >> + analogix_dp_enable_rx_to_enhanced_mode(dp, 1); >> + analogix_dp_enable_enhanced_mode(dp, 1); >> >> - exynos_dp_set_lane_count(dp, dp->video_info->lane_count); >> - exynos_dp_set_link_bandwidth(dp, dp->video_info->link_rate); >> + analogix_dp_set_lane_count(dp, dp->video_info->lane_count); >> + analogix_dp_set_link_bandwidth(dp, dp->video_info->link_rate); >> >> - exynos_dp_init_video(dp); >> - ret = exynos_dp_config_video(dp); >> + analogix_dp_init_video(dp); >> + ret = analogix_dp_config_video(dp); >> if (ret) >> dev_err(dp->dev, "unable to config video\n"); >> >> /* Safe to enable the panel now */ >> - if (dp->panel) { >> - if (drm_panel_enable(dp->panel)) >> + if (dp->plat_data && dp->plat_data->panel) { >> + if (drm_panel_enable(dp->plat_data->panel)) >> DRM_ERROR("failed to enable the panel\n"); >> } >> >> /* Enable video */ >> - exynos_dp_start_video(dp); >> + analogix_dp_start_video(dp); >> } >> >> static enum drm_connector_status >> -exynos_dp_detect(struct drm_connector *connector, bool force) >> +analogix_dp_detect(struct drm_connector *connector, bool force) >> { >> return connector_status_connected; >> } >> >> -static void exynos_dp_connector_destroy(struct drm_connector *connector) >> +static void analogix_dp_connector_destroy(struct drm_connector *connector) >> { >> drm_connector_unregister(connector); >> drm_connector_cleanup(connector); >> } >> >> -static struct drm_connector_funcs exynos_dp_connector_funcs = { >> +static struct drm_connector_funcs analogix_dp_connector_funcs = { >> .dpms = drm_atomic_helper_connector_dpms, >> .fill_modes = drm_helper_probe_single_connector_modes, >> - .detect = exynos_dp_detect, >> - .destroy = exynos_dp_connector_destroy, >> + .detect = analogix_dp_detect, >> + .destroy = analogix_dp_connector_destroy, >> .reset = drm_atomic_helper_connector_reset, >> .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state, >> .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, >> }; >> >> -static int exynos_dp_get_modes(struct drm_connector *connector) >> +static int analogix_dp_get_modes(struct drm_connector *connector) >> { >> - struct exynos_dp_device *dp = ctx_from_connector(connector); >> - struct drm_display_mode *mode; >> - >> - if (dp->panel) >> - return drm_panel_get_modes(dp->panel); >> + struct analogix_dp_device *dp = connector_to_dp(connector); >> + struct analogix_dp_plat_data *plat_data = dp->plat_data; >> + int num_modes = 0; >> >> - mode = drm_mode_create(connector->dev); >> - if (!mode) { >> - DRM_ERROR("failed to create a new display mode.\n"); >> - return 0; >> - } >> - >> - drm_display_mode_from_videomode(&dp->priv.vm, mode); >> - mode->width_mm = dp->priv.width_mm; >> - mode->height_mm = dp->priv.height_mm; >> - connector->display_info.width_mm = mode->width_mm; >> - connector->display_info.height_mm = mode->height_mm; >> + if (plat_data && plat_data->panel) >> + num_modes += drm_panel_get_modes(plat_data->panel); >> >> - mode->type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED; >> - drm_mode_set_name(mode); >> - drm_mode_probed_add(connector, mode); >> + if (plat_data && plat_data->get_modes) >> + num_modes += plat_data->get_modes(plat_data, connector); >> >> - return 1; >> + return num_modes; >> } >> >> static struct drm_encoder * >> -exynos_dp_best_encoder(struct drm_connector *connector) >> +analogix_dp_best_encoder(struct drm_connector *connector) >> { >> - struct exynos_dp_device *dp = ctx_from_connector(connector); >> + struct analogix_dp_device *dp = connector_to_dp(connector); >> >> - return &dp->encoder; >> + return dp->encoder; >> } >> >> -static struct drm_connector_helper_funcs exynos_dp_connector_helper_funcs = { >> - .get_modes = exynos_dp_get_modes, >> - .best_encoder = exynos_dp_best_encoder, >> +static struct drm_connector_helper_funcs analogix_dp_connector_helper_funcs = { >> + .get_modes = analogix_dp_get_modes, >> + .best_encoder = analogix_dp_best_encoder, >> }; >> >> -/* returns the number of bridges attached */ >> -static int exynos_drm_attach_lcd_bridge(struct exynos_dp_device *dp, >> - struct drm_encoder *encoder) >> -{ >> - int ret; >> - >> - encoder->bridge->next = dp->ptn_bridge; >> - dp->ptn_bridge->encoder = encoder; >> - ret = drm_bridge_attach(encoder->dev, dp->ptn_bridge); >> - if (ret) { >> - DRM_ERROR("Failed to attach bridge to drm\n"); >> - return ret; >> - } >> - >> - return 0; >> -} >> - >> -static int exynos_dp_bridge_attach(struct drm_bridge *bridge) >> +static int analogix_dp_bridge_attach(struct drm_bridge *bridge) >> { >> - struct exynos_dp_device *dp = bridge->driver_private; >> - struct drm_encoder *encoder = &dp->encoder; >> + struct analogix_dp_device *dp = bridge->driver_private; >> + struct drm_encoder *encoder = dp->encoder; >> struct drm_connector *connector = &dp->connector; >> int ret; >> >> - /* Pre-empt DP connector creation if there's a bridge */ >> - if (dp->ptn_bridge) { >> - ret = exynos_drm_attach_lcd_bridge(dp, encoder); >> - if (!ret) >> - return 0; >> + if (!bridge->encoder) { >> + DRM_ERROR("Parent encoder object not found"); >> + return -ENODEV; >> } >> >> + encoder->bridge = bridge; >> + >> connector->polled = DRM_CONNECTOR_POLL_HPD; >> >> ret = drm_connector_init(dp->drm_dev, connector, >> - &exynos_dp_connector_funcs, >> + &analogix_dp_connector_funcs, >> DRM_MODE_CONNECTOR_eDP); >> if (ret) { >> DRM_ERROR("Failed to initialize connector with drm\n"); >> return ret; >> } >> >> - drm_connector_helper_add(connector, &exynos_dp_connector_helper_funcs); >> + drm_connector_helper_add(connector, >> + &analogix_dp_connector_helper_funcs); >> drm_connector_register(connector); >> drm_mode_connector_attach_encoder(connector, encoder); >> >> - if (dp->panel) >> - ret = drm_panel_attach(dp->panel, &dp->connector); >> + if (dp->plat_data && dp->plat_data->panel) { >> + ret = drm_panel_attach(dp->plat_data->panel, &dp->connector); >> + if (ret) { >> + DRM_ERROR("Failed to attach panel\n"); >> + return ret; >> + } >> + } >> + >> + /* >> + * This should be the end of attach function, caused >> + * we should ensure dp bridge could attach first. >> + */ >> + if (dp->plat_data && dp->plat_data->attach) { >> + ret = dp->plat_data->attach(dp->plat_data, bridge); >> + if (ret) { >> + DRM_ERROR("Failed at platform attch func\n"); > Two new error paths appeared here and above. Don't you have to > cleanup something? I don't know, just wondering... Hmm... I think both panel & platform_attch need ERROR remind when it failed. But if it still need clean, I though it is tge platform attch error, this is not relate to DRM directly, just analogix driver logic, so code would like. - if (dp->panel) - ret = drm_panel_attach(dp->panel, &dp->connector); + if (dp->plat_data && dp->plat_data->panel) { + ret = drm_panel_attach(dp->plat_data->panel, &dp->connector); + if (ret) { + DRM_ERROR("Failed to attach panel\n"); + return ret; + } + } + /* + * This should be the end of attach function, caused + * we should ensure dp bridge could attach first. + */ + if (dp->plat_data && dp->plat_data->attach) { + ret = dp->plat_data->attach(dp->plat_data, bridge); return ret; > (...) > >> @@ -1345,22 +1286,9 @@ static int exynos_dp_bind(struct device *dev, struct device *master, void *data) >> disable_irq(dp->irq); >> >> dp->drm_dev = drm_dev; >> + dp->encoder = encoder; >> >> - pipe = exynos_drm_crtc_get_pipe_from_type(drm_dev, >> - EXYNOS_DISPLAY_TYPE_LCD); >> - if (pipe < 0) >> - return pipe; >> - >> - encoder->possible_crtcs = 1 << pipe; >> - >> - DRM_DEBUG_KMS("possible_crtcs = 0x%x\n", encoder->possible_crtcs); >> - >> - drm_encoder_init(drm_dev, encoder, &exynos_dp_encoder_funcs, >> - DRM_MODE_ENCODER_TMDS); >> - >> - drm_encoder_helper_add(encoder, &exynos_dp_encoder_helper_funcs); >> - >> - ret = exynos_dp_create_connector(encoder); >> + ret = analogix_dp_create_bridge(drm_dev, dp); >> if (ret) { >> DRM_ERROR("failed to create connector ret = %d\n", ret); >> drm_encoder_cleanup(encoder); >> @@ -1369,103 +1297,36 @@ static int exynos_dp_bind(struct device *dev, struct device *master, void *data) >> >> return 0; >> } >> +EXPORT_SYMBOL_GPL(analogix_dp_bind); > Ooo, a new export symbol. I suppose it is necessary for the split > but the commit message does not mention exporting > anything nor the reason for doing it. Could you extend the commit > message describing more tha changes here and rationale for it? Okay, got it. > (...) > >> diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c b/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c >> new file mode 100644 >> index 0000000..b879d8c >> --- /dev/null >> +++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c >> @@ -0,0 +1,1265 @@ >> +/* >> + * Analogix DP (Display port) core register interface driver. >> + * >> + * Copyright (C) 2012 Samsung Electronics Co., Ltd. >> + * Author: Jingoo Han <jg1.han at samsung.com> >> + * >> + * This program is free software; you can redistribute it and/or modify it >> + * under the terms of the GNU General Public License as published by the >> + * Free Software Foundation; either version 2 of the License, or (at your >> + * option) any later version. >> + */ >> + >> +#include <linux/device.h> >> +#include <linux/io.h> >> +#include <linux/delay.h> >> +#include <linux/gpio.h> >> + >> +#include "analogix_dp_core.h" >> +#include "analogix_dp_reg.h" >> + >> +#define COMMON_INT_MASK_1 0 >> +#define COMMON_INT_MASK_2 0 >> +#define COMMON_INT_MASK_3 0 >> +#define COMMON_INT_MASK_4 (HOTPLUG_CHG | HPD_LOST | PLUG) >> +#define INT_STA_MASK INT_HPD >> + >> +void analogix_dp_enable_video_mute(struct analogix_dp_device *dp, bool enable) >> +{ >> + u32 reg; >> + >> + if (enable) { >> + reg = readl(dp->reg_base + ANALOGIX_DP_VIDEO_CTL_1); >> + reg |= HDCP_VIDEO_MUTE; >> + writel(reg, dp->reg_base + ANALOGIX_DP_VIDEO_CTL_1); >> + } else { >> + reg = readl(dp->reg_base + ANALOGIX_DP_VIDEO_CTL_1); >> + reg &= ~HDCP_VIDEO_MUTE; >> + writel(reg, dp->reg_base + ANALOGIX_DP_VIDEO_CTL_1); >> + } >> +} >> + >> +void analogix_dp_stop_video(struct analogix_dp_device *dp) >> +{ >> + u32 reg; >> + >> + reg = readl(dp->reg_base + ANALOGIX_DP_VIDEO_CTL_1); >> + reg &= ~VIDEO_EN; >> + writel(reg, dp->reg_base + ANALOGIX_DP_VIDEO_CTL_1); >> +} >> + >> +void analogix_dp_lane_swap(struct analogix_dp_device *dp, bool enable) >> +{ >> + u32 reg; >> + >> + if (enable) >> + reg = LANE3_MAP_LOGIC_LANE_0 | LANE2_MAP_LOGIC_LANE_1 | >> + LANE1_MAP_LOGIC_LANE_2 | LANE0_MAP_LOGIC_LANE_3; >> + else >> + reg = LANE3_MAP_LOGIC_LANE_3 | LANE2_MAP_LOGIC_LANE_2 | >> + LANE1_MAP_LOGIC_LANE_1 | LANE0_MAP_LOGIC_LANE_0; > Here and in few other places with new code: no alignment? > > You spent some time fixing these in patch 1, so I would assume > that new code already comes after "checkpatch -f --subjective". > That's actually the only valid reason for using checkpatch - new code. > However my mail reader could corrupt the output so maybe this is aligned? This is another mistaken I make, and surprise by that checkpatch fine with this no-alignment style. Anyway I would just do rename change in this split patch, and move the style change to another separate patch (maybe I should adjust the order, correct style problem after this patch). > Code seems fine after looking at it but review was rather shallow. > I don't know the Exynos DP driver. I really appreciate for your careful review ;) - Yakir > Best regards, > Krzysztof > > > >