Skip to content

Commit baf6e57

Browse files
committed
Compatibility with Linux 6.2/6.3
Closes torvalds#32 Based on !12 by @Iam_Tj
1 parent adf0ee1 commit baf6e57

File tree

2 files changed

+21
-6
lines changed

2 files changed

+21
-6
lines changed

Diff for: ddcci/ddcci.c

+14-5
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ static unsigned int delay = 60;
3636
static unsigned short autoprobe_addrs[127] = {0xF0, 0xF2, 0xF4, 0xF6, 0xF8};
3737
static int autoprobe_addr_count = 5;
3838

39+
static bool module_initialized = false;
3940
static dev_t ddcci_cdev_first;
4041
static dev_t ddcci_cdev_next;
4142
static dev_t ddcci_cdev_end;
@@ -931,7 +932,7 @@ ATTRIBUTE_GROUPS(ddcci_char_device);
931932

932933
/* DDC/CI bus */
933934

934-
static int ddcci_device_uevent(struct device *dev, struct kobj_uevent_env *env)
935+
static int ddcci_device_uevent(CSTRUCT device *dev, struct kobj_uevent_env *env)
935936
{
936937
struct ddcci_device *device = to_ddcci_device(dev);
937938
char model[ARRAY_SIZE(device->model)];
@@ -1011,7 +1012,7 @@ static void ddcci_device_release(struct device *dev)
10111012
kfree(device);
10121013
}
10131014

1014-
static char *ddcci_devnode(struct device *dev,
1015+
static char *ddcci_devnode(CSTRUCT device *dev,
10151016
umode_t *mode, kuid_t *uid, kgid_t *gid)
10161017
{
10171018
struct ddcci_device *device;
@@ -1021,7 +1022,7 @@ static char *ddcci_devnode(struct device *dev,
10211022
device->i2c_client->adapter->nr);
10221023
}
10231024

1024-
static char *ddcci_dependent_devnode(struct device *dev,
1025+
static char *ddcci_dependent_devnode(CSTRUCT device *dev,
10251026
umode_t *mode, kuid_t *uid, kgid_t *gid)
10261027
{
10271028
struct ddcci_device *device;
@@ -1065,7 +1066,7 @@ static struct device_type ddcci_dependent_type = {
10651066
* ddcci_verify_device - return parameter as ddcci_device, or NULL
10661067
* @dev: device, probably from some driver model iterator
10671068
*/
1068-
struct ddcci_device *ddcci_verify_device(struct device *dev)
1069+
struct ddcci_device *ddcci_verify_device(CSTRUCT device *dev)
10691070
{
10701071
if (unlikely(!dev))
10711072
return NULL;
@@ -1100,7 +1101,7 @@ int ddcci_register_driver(struct module *owner, struct ddcci_driver *driver)
11001101
int ret;
11011102

11021103
/* Can't register until after driver model init */
1103-
if (unlikely(WARN_ON(!ddcci_bus_type.p)))
1104+
if (unlikely(WARN_ON(!smp_load_acquire(&module_initialized))))
11041105
return -EAGAIN;
11051106

11061107
pr_debug("registering driver [%s]\n", driver->driver.name);
@@ -1672,8 +1673,14 @@ static int ddcci_detect(struct i2c_client *client, struct i2c_board_info *info)
16721673
}
16731674

16741675
/* I2C probe function */
1676+
#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 3, 0)
1677+
static int ddcci_probe(struct i2c_client *client)
1678+
{
1679+
const struct i2c_device_id *id = i2c_client_get_device_id(client);
1680+
#else
16751681
static int ddcci_probe(struct i2c_client *client, const struct i2c_device_id *id)
16761682
{
1683+
#endif
16771684
int i, ret = -ENODEV, tmp;
16781685
unsigned char main_addr, addr;
16791686
struct ddcci_bus_drv_data *drv_data;
@@ -1858,6 +1865,7 @@ static int __init ddcci_module_init(void)
18581865
}
18591866

18601867
pr_debug("ddcci driver initialized\n");
1868+
smp_store_release(&module_initialized, true);
18611869

18621870
return 0;
18631871

@@ -1875,6 +1883,7 @@ static int __init ddcci_module_init(void)
18751883
static void __exit ddcci_module_exit(void)
18761884
{
18771885
struct device *dev;
1886+
smp_store_release(&module_initialized, false);
18781887

18791888
while (1) {
18801889
dev = bus_find_device(&ddcci_bus_type, NULL, NULL, ddcci_remove_helper);

Diff for: include/linux/ddcci.h

+7-1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,12 @@
1717
#include <linux/mod_devicetable.h>
1818
#include <linux/device.h>
1919
#include <linux/cdev.h>
20+
#include <linux/version.h>
21+
#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 2, 0)
22+
#define CSTRUCT const struct
23+
#else
24+
#define CSTRUCT struct
25+
#endif
2026

2127
#define DDCCI_MODULE_PREFIX "ddcci:"
2228

@@ -132,7 +138,7 @@ int ddcci_register_driver(struct module *owner, struct ddcci_driver *driver);
132138
ddcci_register_driver(THIS_MODULE, driver)
133139
void ddcci_del_driver(struct ddcci_driver *driver);
134140

135-
struct ddcci_device *ddcci_verify_device(struct device *dev);
141+
struct ddcci_device *ddcci_verify_device(CSTRUCT device *dev);
136142

137143
#define module_ddcci_driver(__ddcci_driver) \
138144
module_driver(__ddcci_driver, ddcci_add_driver, \

0 commit comments

Comments
 (0)