drm/ast: Move DDC code to ast_ddc.{c,h}
authorThomas Zimmermann <tzimmermann@suse.de>
Mon, 25 Mar 2024 20:06:50 +0000 (21:06 +0100)
committerThomas Zimmermann <tzimmermann@suse.de>
Tue, 2 Apr 2024 08:40:46 +0000 (10:40 +0200)
Rename ast_i2c.c to ast_ddc.c and move its interface into the
new header ast_ddc.h. Update all include statements as necessary
and change the adapter name to 'AST DDC bus'.

This avoids including I2C headers in the driver's main header file,
which doesn't need them. Renaming files to _ddc indicates that the
code is about the DDC. I2C is really just the underlying bus here.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: Sui Jingfeng <sui.jingfeng@linux.dev>
Reviewed-by: Jocelyn Falempe <jfalempe@redhat.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240325200855.21150-6-tzimmermann@suse.de
drivers/gpu/drm/ast/Makefile
drivers/gpu/drm/ast/ast_ddc.c [new file with mode: 0644]
drivers/gpu/drm/ast/ast_ddc.h [new file with mode: 0644]
drivers/gpu/drm/ast/ast_drv.h
drivers/gpu/drm/ast/ast_i2c.c [deleted file]
drivers/gpu/drm/ast/ast_mode.c

index 5a53ce51fb2490c2ccb0ed6992ece9001d159bc9..d794c076bc24241ebad3fc7c1314f4cd5f929428 100644 (file)
@@ -3,6 +3,14 @@
 # Makefile for the drm device driver.  This driver provides support for the
 # Direct Rendering Infrastructure (DRI) in XFree86 4.1.0 and higher.
 
-ast-y := ast_drv.o ast_i2c.o ast_main.o ast_mm.o ast_mode.o ast_post.o ast_dp501.o ast_dp.o
+ast-y := \
+       ast_ddc.o \
+       ast_dp501.o \
+       ast_dp.o \
+       ast_drv.o \
+       ast_main.o \
+       ast_mm.o \
+       ast_mode.o \
+       ast_post.o
 
 obj-$(CONFIG_DRM_AST) := ast.o
diff --git a/drivers/gpu/drm/ast/ast_ddc.c b/drivers/gpu/drm/ast/ast_ddc.c
new file mode 100644 (file)
index 0000000..df604b4
--- /dev/null
@@ -0,0 +1,147 @@
+// SPDX-License-Identifier: MIT
+/*
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sub license, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ * USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ */
+
+#include <drm/drm_managed.h>
+#include <drm/drm_print.h>
+
+#include "ast_ddc.h"
+#include "ast_drv.h"
+
+static void ast_i2c_setsda(void *i2c_priv, int data)
+{
+       struct ast_i2c_chan *i2c = i2c_priv;
+       struct ast_device *ast = to_ast_device(i2c->dev);
+       int i;
+       u8 ujcrb7, jtemp;
+
+       for (i = 0; i < 0x10000; i++) {
+               ujcrb7 = ((data & 0x01) ? 0 : 1) << 2;
+               ast_set_index_reg_mask(ast, AST_IO_VGACRI, 0xb7, 0xf1, ujcrb7);
+               jtemp = ast_get_index_reg_mask(ast, AST_IO_VGACRI, 0xb7, 0x04);
+               if (ujcrb7 == jtemp)
+                       break;
+       }
+}
+
+static void ast_i2c_setscl(void *i2c_priv, int clock)
+{
+       struct ast_i2c_chan *i2c = i2c_priv;
+       struct ast_device *ast = to_ast_device(i2c->dev);
+       int i;
+       u8 ujcrb7, jtemp;
+
+       for (i = 0; i < 0x10000; i++) {
+               ujcrb7 = ((clock & 0x01) ? 0 : 1);
+               ast_set_index_reg_mask(ast, AST_IO_VGACRI, 0xb7, 0xf4, ujcrb7);
+               jtemp = ast_get_index_reg_mask(ast, AST_IO_VGACRI, 0xb7, 0x01);
+               if (ujcrb7 == jtemp)
+                       break;
+       }
+}
+
+static int ast_i2c_getsda(void *i2c_priv)
+{
+       struct ast_i2c_chan *i2c = i2c_priv;
+       struct ast_device *ast = to_ast_device(i2c->dev);
+       uint32_t val, val2, count, pass;
+
+       count = 0;
+       pass = 0;
+       val = (ast_get_index_reg_mask(ast, AST_IO_VGACRI, 0xb7, 0x20) >> 5) & 0x01;
+       do {
+               val2 = (ast_get_index_reg_mask(ast, AST_IO_VGACRI, 0xb7, 0x20) >> 5) & 0x01;
+               if (val == val2) {
+                       pass++;
+               } else {
+                       pass = 0;
+                       val = (ast_get_index_reg_mask(ast, AST_IO_VGACRI, 0xb7, 0x20) >> 5) & 0x01;
+               }
+       } while ((pass < 5) && (count++ < 0x10000));
+
+       return val & 1 ? 1 : 0;
+}
+
+static int ast_i2c_getscl(void *i2c_priv)
+{
+       struct ast_i2c_chan *i2c = i2c_priv;
+       struct ast_device *ast = to_ast_device(i2c->dev);
+       uint32_t val, val2, count, pass;
+
+       count = 0;
+       pass = 0;
+       val = (ast_get_index_reg_mask(ast, AST_IO_VGACRI, 0xb7, 0x10) >> 4) & 0x01;
+       do {
+               val2 = (ast_get_index_reg_mask(ast, AST_IO_VGACRI, 0xb7, 0x10) >> 4) & 0x01;
+               if (val == val2) {
+                       pass++;
+               } else {
+                       pass = 0;
+                       val = (ast_get_index_reg_mask(ast, AST_IO_VGACRI, 0xb7, 0x10) >> 4) & 0x01;
+               }
+       } while ((pass < 5) && (count++ < 0x10000));
+
+       return val & 1 ? 1 : 0;
+}
+
+static void ast_i2c_release(struct drm_device *dev, void *res)
+{
+       struct ast_i2c_chan *i2c = res;
+
+       i2c_del_adapter(&i2c->adapter);
+}
+
+struct ast_i2c_chan *ast_i2c_create(struct drm_device *dev)
+{
+       struct ast_i2c_chan *i2c;
+       int ret;
+
+       i2c = drmm_kzalloc(dev->dev, sizeof(*i2c), GFP_KERNEL);
+       if (!i2c)
+               return ERR_PTR(-ENOMEM);
+
+       i2c->adapter.owner = THIS_MODULE;
+       i2c->adapter.dev.parent = dev->dev;
+       i2c->dev = dev;
+       i2c_set_adapdata(&i2c->adapter, i2c);
+       snprintf(i2c->adapter.name, sizeof(i2c->adapter.name), "AST DDC bus");
+       i2c->adapter.algo_data = &i2c->bit;
+
+       i2c->bit.udelay = 20;
+       i2c->bit.timeout = 2;
+       i2c->bit.data = i2c;
+       i2c->bit.setsda = ast_i2c_setsda;
+       i2c->bit.setscl = ast_i2c_setscl;
+       i2c->bit.getsda = ast_i2c_getsda;
+       i2c->bit.getscl = ast_i2c_getscl;
+       ret = i2c_bit_add_bus(&i2c->adapter);
+       if (ret) {
+               drm_err(dev, "Failed to register bit i2c\n");
+               return ERR_PTR(ret);
+       }
+
+       ret = drmm_add_action_or_reset(dev, ast_i2c_release, i2c);
+       if (ret)
+               return ERR_PTR(ret);
+
+       return i2c;
+}
diff --git a/drivers/gpu/drm/ast/ast_ddc.h b/drivers/gpu/drm/ast/ast_ddc.h
new file mode 100644 (file)
index 0000000..244666f
--- /dev/null
@@ -0,0 +1,19 @@
+/* SPDX-License-Identifier: MIT */
+
+#ifndef __AST_DDC_H__
+#define __AST_DDC_H__
+
+#include <linux/i2c.h>
+#include <linux/i2c-algo-bit.h>
+
+struct drm_device;
+
+struct ast_i2c_chan {
+       struct i2c_adapter adapter;
+       struct drm_device *dev;
+       struct i2c_algo_bit_data bit;
+};
+
+struct ast_i2c_chan *ast_i2c_create(struct drm_device *dev);
+
+#endif
index 12ad1c0fe151beddbdd4b0feb9b8b14bde922004..ba3d86973995fd0444f1b9934e4cc26fd5e769fb 100644 (file)
@@ -28,8 +28,6 @@
 #ifndef __AST_DRV_H__
 #define __AST_DRV_H__
 
-#include <linux/i2c.h>
-#include <linux/i2c-algo-bit.h>
 #include <linux/io.h>
 #include <linux/types.h>
 
@@ -149,15 +147,9 @@ static inline struct ast_plane *to_ast_plane(struct drm_plane *plane)
 }
 
 /*
- * Connector with i2c channel
+ * BMC
  */
 
-struct ast_i2c_chan {
-       struct i2c_adapter adapter;
-       struct drm_device *dev;
-       struct i2c_algo_bit_data bit;
-};
-
 struct ast_bmc_connector {
        struct drm_connector base;
        struct drm_connector *physical_connector;
@@ -476,9 +468,6 @@ bool ast_dp501_read_edid(struct drm_device *dev, u8 *ediddata);
 u8 ast_get_dp501_max_clk(struct drm_device *dev);
 void ast_init_3rdtx(struct drm_device *dev);
 
-/* ast_i2c.c */
-struct ast_i2c_chan *ast_i2c_create(struct drm_device *dev);
-
 /* aspeed DP */
 bool ast_astdp_is_connected(struct ast_device *ast);
 int ast_astdp_read_edid(struct drm_device *dev, u8 *ediddata);
diff --git a/drivers/gpu/drm/ast/ast_i2c.c b/drivers/gpu/drm/ast/ast_i2c.c
deleted file mode 100644 (file)
index dc28a5c..0000000
+++ /dev/null
@@ -1,147 +0,0 @@
-// SPDX-License-Identifier: MIT
-/*
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sub license, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
- * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
- * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
- * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
- * USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- */
-
-#include <drm/drm_managed.h>
-#include <drm/drm_print.h>
-
-#include "ast_drv.h"
-
-static void ast_i2c_setsda(void *i2c_priv, int data)
-{
-       struct ast_i2c_chan *i2c = i2c_priv;
-       struct ast_device *ast = to_ast_device(i2c->dev);
-       int i;
-       u8 ujcrb7, jtemp;
-
-       for (i = 0; i < 0x10000; i++) {
-               ujcrb7 = ((data & 0x01) ? 0 : 1) << 2;
-               ast_set_index_reg_mask(ast, AST_IO_VGACRI, 0xb7, 0xf1, ujcrb7);
-               jtemp = ast_get_index_reg_mask(ast, AST_IO_VGACRI, 0xb7, 0x04);
-               if (ujcrb7 == jtemp)
-                       break;
-       }
-}
-
-static void ast_i2c_setscl(void *i2c_priv, int clock)
-{
-       struct ast_i2c_chan *i2c = i2c_priv;
-       struct ast_device *ast = to_ast_device(i2c->dev);
-       int i;
-       u8 ujcrb7, jtemp;
-
-       for (i = 0; i < 0x10000; i++) {
-               ujcrb7 = ((clock & 0x01) ? 0 : 1);
-               ast_set_index_reg_mask(ast, AST_IO_VGACRI, 0xb7, 0xf4, ujcrb7);
-               jtemp = ast_get_index_reg_mask(ast, AST_IO_VGACRI, 0xb7, 0x01);
-               if (ujcrb7 == jtemp)
-                       break;
-       }
-}
-
-static int ast_i2c_getsda(void *i2c_priv)
-{
-       struct ast_i2c_chan *i2c = i2c_priv;
-       struct ast_device *ast = to_ast_device(i2c->dev);
-       uint32_t val, val2, count, pass;
-
-       count = 0;
-       pass = 0;
-       val = (ast_get_index_reg_mask(ast, AST_IO_VGACRI, 0xb7, 0x20) >> 5) & 0x01;
-       do {
-               val2 = (ast_get_index_reg_mask(ast, AST_IO_VGACRI, 0xb7, 0x20) >> 5) & 0x01;
-               if (val == val2) {
-                       pass++;
-               } else {
-                       pass = 0;
-                       val = (ast_get_index_reg_mask(ast, AST_IO_VGACRI, 0xb7, 0x20) >> 5) & 0x01;
-               }
-       } while ((pass < 5) && (count++ < 0x10000));
-
-       return val & 1 ? 1 : 0;
-}
-
-static int ast_i2c_getscl(void *i2c_priv)
-{
-       struct ast_i2c_chan *i2c = i2c_priv;
-       struct ast_device *ast = to_ast_device(i2c->dev);
-       uint32_t val, val2, count, pass;
-
-       count = 0;
-       pass = 0;
-       val = (ast_get_index_reg_mask(ast, AST_IO_VGACRI, 0xb7, 0x10) >> 4) & 0x01;
-       do {
-               val2 = (ast_get_index_reg_mask(ast, AST_IO_VGACRI, 0xb7, 0x10) >> 4) & 0x01;
-               if (val == val2) {
-                       pass++;
-               } else {
-                       pass = 0;
-                       val = (ast_get_index_reg_mask(ast, AST_IO_VGACRI, 0xb7, 0x10) >> 4) & 0x01;
-               }
-       } while ((pass < 5) && (count++ < 0x10000));
-
-       return val & 1 ? 1 : 0;
-}
-
-static void ast_i2c_release(struct drm_device *dev, void *res)
-{
-       struct ast_i2c_chan *i2c = res;
-
-       i2c_del_adapter(&i2c->adapter);
-}
-
-struct ast_i2c_chan *ast_i2c_create(struct drm_device *dev)
-{
-       struct ast_i2c_chan *i2c;
-       int ret;
-
-       i2c = drmm_kzalloc(dev->dev, sizeof(*i2c), GFP_KERNEL);
-       if (!i2c)
-               return ERR_PTR(-ENOMEM);
-
-       i2c->adapter.owner = THIS_MODULE;
-       i2c->adapter.dev.parent = dev->dev;
-       i2c->dev = dev;
-       i2c_set_adapdata(&i2c->adapter, i2c);
-       snprintf(i2c->adapter.name, sizeof(i2c->adapter.name),
-                "AST i2c bit bus");
-       i2c->adapter.algo_data = &i2c->bit;
-
-       i2c->bit.udelay = 20;
-       i2c->bit.timeout = 2;
-       i2c->bit.data = i2c;
-       i2c->bit.setsda = ast_i2c_setsda;
-       i2c->bit.setscl = ast_i2c_setscl;
-       i2c->bit.getsda = ast_i2c_getsda;
-       i2c->bit.getscl = ast_i2c_getscl;
-       ret = i2c_bit_add_bus(&i2c->adapter);
-       if (ret) {
-               drm_err(dev, "Failed to register bit i2c\n");
-               return ERR_PTR(ret);
-       }
-
-       ret = drmm_add_action_or_reset(dev, ast_i2c_release, i2c);
-       if (ret)
-               return ERR_PTR(ret);
-
-       return i2c;
-}
index cbda04fca71072061784a8e0fdc9d5e8a952d6a1..bdef2160726e6e4fd099cb995538927223d5276a 100644 (file)
@@ -46,6 +46,7 @@
 #include <drm/drm_probe_helper.h>
 #include <drm/drm_simple_kms_helper.h>
 
+#include "ast_ddc.h"
 #include "ast_drv.h"
 #include "ast_tables.h"