From 366514a4be24da723cb9dc506b0000166b5ba2fc Mon Sep 17 00:00:00 2001 From: Thomas Makin Date: Sat, 12 Sep 2026 01:04:02 -0500 Subject: [PATCH] bm92t --- drivers/usb/typec/bm92txx.c | 38 +++++++++++++++++++++++++++---------- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/drivers/usb/typec/bm92txx.c b/drivers/usb/typec/bm92txx.c index c9464f6507e2..fb7331ed2458 100644 --- a/drivers/usb/typec/bm92txx.c +++ b/drivers/usb/typec/bm92txx.c @@ -1,5 +1,7 @@ // SPDX-License-Identifier: GPL-2.0-only +#define DEBUG 1 + /* * Driver for Rohm BM92TXX USB Type-C and Power Delivery controller * @@ -29,6 +31,7 @@ #include #include #include +#include #include #include #include @@ -394,23 +397,23 @@ enum bm92t_state_type { DOCK_CONFIG_HANDLED }; -struct __packed pd_object { +struct pd_object { unsigned int amp:10; unsigned int volt:10; unsigned int info:10; unsigned int type:2; -}; +} __packed; -struct __packed rd_object { +struct rd_object { unsigned int max_amp:10; unsigned int op_amp:10; unsigned int info:6; unsigned int usb_comms:1; unsigned int mismatch:1; unsigned int obj_no:4; -}; +} __packed; -struct __packed vd_object { +struct vd_object { unsigned int vid:16; unsigned int rsvd:10; unsigned int modal:1; @@ -465,6 +468,7 @@ struct bm92t_info { struct extcon_dev *edev; struct delayed_work oneshot_work; struct delayed_work power_work; + struct mutex lock; #ifdef CONFIG_DEBUG_FS struct dentry *debugfs_root; @@ -1053,7 +1057,7 @@ static void bm92t_extcon_cable_set_init_state(struct work_struct *work) struct bm92t_info *info = container_of(to_delayed_work(work), struct bm92t_info, oneshot_work); - disable_irq(info->i2c_client->irq); + mutex_lock(&info->lock); bm92t_set_vbus_enable(info, false); @@ -1078,7 +1082,10 @@ static void bm92t_extcon_cable_set_init_state(struct work_struct *work) "extcon cable is set to init state\n"); msleep(100); /* Wait a bit */ - queue_work(info->event_wq, &info->work); + //queue_work(info->event_wq, &info->work); + enable_irq(info->i2c_client->irq); + + mutex_unlock(&info->lock); } static bool bm92t_check_pdo(struct bm92t_info *info) @@ -1330,6 +1337,8 @@ static void bm92t_event_handler(struct work_struct *work) info = container_of(work, struct bm92t_info, work); dev = &info->i2c_client->dev; + mutex_lock(&info->lock); + /* Read status registers at 02h, 03h and 04h */ err = bm92t_read_reg(info, ALERT_STATUS_REG, (unsigned char *) &alert_data, @@ -1929,6 +1938,7 @@ init_contract_out: ret: enable_irq(info->i2c_client->irq); + mutex_unlock(&info->lock); } static irqreturn_t bm92t_interrupt_handler(int irq, void *handle) @@ -2177,7 +2187,7 @@ static ssize_t bm92t_cmd_write(struct file *file, ret = kstrtouint(buf, 0, &val); - if (ret == 1) { + if (!ret) { cmd = val; bm92t_send_cmd(info, &cmd); } else { @@ -2209,7 +2219,7 @@ static ssize_t bm92t_usbhub_dp_sleep_write(struct file *file, ret = kstrtouint(buf, 0, &val); - if (ret == 1) { + if (!ret) { bm92t_usbhub_dp_sleep(info, val ? true : false); } else { dev_err(&info->i2c_client->dev, "Syntax is: 0 or number\n"); @@ -2489,6 +2499,8 @@ static int bm92t_probe(struct i2c_client *client) /* Disable Source mode at boot */ bm92t_set_source_mode(info, SPDSRC12_OFF); + mutex_init(&info->lock); + INIT_WORK(&info->work, bm92t_event_handler); INIT_DELAYED_WORK(&info->oneshot_work, bm92t_extcon_cable_set_init_state); @@ -2506,7 +2518,7 @@ static int bm92t_probe(struct i2c_client *client) */ if (request_threaded_irq(client->irq, NULL, bm92t_interrupt_handler, - IRQF_TRIGGER_LOW | IRQF_ONESHOT, "bm92t", + IRQF_TRIGGER_LOW | IRQF_ONESHOT | IRQF_NO_AUTOEN, "bm92t", info)) { dev_err(&client->dev, "Request irq failed\n"); destroy_workqueue(info->event_wq); @@ -2535,6 +2547,8 @@ static int bm92t_probe(struct i2c_client *client) schedule_delayed_work(&info->oneshot_work, msecs_to_jiffies(100)); + // enable_irq(client->irq); + dev_info(&client->dev, "init done\n"); return 0; @@ -2595,6 +2609,8 @@ static int bm92t_pm_resume(struct device *dev) disable_irq_wake(client->irq); } + mutex_lock(&info->lock); + /* * Toggle DP signal * Do a toggle on resume instead of disable in suspend @@ -2610,6 +2626,8 @@ static int bm92t_pm_resume(struct device *dev) if (enable_led) bm92t_usbhub_led_cfg_wait(info, 128, 0, 0, 64); + mutex_unlock(&info->lock); + return 0; }