From 8b9bca54ec03fb80834eb8d15dd599293af6d971 Mon Sep 17 00:00:00 2001 From: Jae Hyun Yoo Date: Fri, 29 Jun 2018 11:00:02 -0700 Subject: [PATCH] Add dump debug code into I2C drivers This commit enables dump debug of master and slave I2C drivers. This is only for downstream debug purpose so it shouldn't go to the upstream. Usage (in case of bus 5 for an example): echo 5 > /sys/module/i2c_aspeed/parameters/dump_debug_bus_id echo 1 > /sys/module/i2c_aspeed/parameters/dump_debug echo 5 > /sys/module/i2c_slave_mqueue/parameters/dump_debug_bus_id echo 1 > /sys/module/i2c_slave_mqueue/parameters/dump_debug Signed-off-by: Jae Hyun Yoo --- drivers/i2c/busses/i2c-aspeed.c | 26 ++++++++++++++++++++++++++ drivers/i2c/i2c-slave-mqueue.c | 24 ++++++++++++++++++++++++ 2 files changed, 50 insertions(+) diff --git a/drivers/i2c/busses/i2c-aspeed.c b/drivers/i2c/busses/i2c-aspeed.c index c2a6e5a27314..e1719b1f2020 100644 --- a/drivers/i2c/busses/i2c-aspeed.c +++ b/drivers/i2c/busses/i2c-aspeed.c @@ -163,6 +163,21 @@ struct aspeed_i2c_bus { #endif /* CONFIG_I2C_SLAVE */ }; +static bool dump_debug __read_mostly; +static int dump_debug_bus_id __read_mostly; + +#define I2C_HEX_DUMP(bus, addr, flags, buf, len) \ + do { \ + if (dump_debug && (bus)->adap.nr == dump_debug_bus_id) { \ + char dump_info[100] = {0,}; \ + snprintf(dump_info, sizeof(dump_info), \ + "bus_id:%d, addr:0x%02x, flags:0x%02x: ", \ + (bus)->adap.nr, addr, flags); \ + print_hex_dump(KERN_ERR, dump_info, DUMP_PREFIX_NONE, \ + 16, 1, buf, len, true); \ + } \ + } while (0) + static int aspeed_i2c_reset(struct aspeed_i2c_bus *bus); static int aspeed_i2c_recover_bus(struct aspeed_i2c_bus *bus) @@ -652,6 +667,7 @@ static int aspeed_i2c_master_xfer(struct i2c_adapter *adap, { struct aspeed_i2c_bus *bus = i2c_get_adapdata(adap); unsigned long time_left, flags; + int i; spin_lock_irqsave(&bus->lock, flags); bus->cmd_err = 0; @@ -694,6 +710,11 @@ static int aspeed_i2c_master_xfer(struct i2c_adapter *adap, return -ETIMEDOUT; } + for (i = 0; i < num; i++) { + I2C_HEX_DUMP(bus, msgs[i].addr, msgs[i].flags, + msgs[i].buf, msgs[i].len); + } + return bus->master_xfer_result; } @@ -1065,6 +1086,11 @@ static struct platform_driver aspeed_i2c_bus_driver = { }; module_platform_driver(aspeed_i2c_bus_driver); +module_param_named(dump_debug, dump_debug, bool, 0644); +MODULE_PARM_DESC(dump_debug, "debug flag for dump printing"); +module_param_named(dump_debug_bus_id, dump_debug_bus_id, int, 0644); +MODULE_PARM_DESC(dump_debug_bus_id, "bus id for dump debug printing"); + MODULE_AUTHOR("Brendan Higgins "); MODULE_DESCRIPTION("Aspeed I2C Bus Driver"); MODULE_LICENSE("GPL v2"); diff --git a/drivers/i2c/i2c-slave-mqueue.c b/drivers/i2c/i2c-slave-mqueue.c index 6014bca0ff2a..2c7a6038409c 100644 --- a/drivers/i2c/i2c-slave-mqueue.c +++ b/drivers/i2c/i2c-slave-mqueue.c @@ -21,6 +21,7 @@ struct mq_msg { struct mq_queue { struct bin_attribute bin; struct kernfs_node *kn; + struct i2c_client *client; spinlock_t lock; /* spinlock for queue index handling */ int in; @@ -31,6 +32,21 @@ struct mq_queue { struct mq_msg *queue; }; +static bool dump_debug __read_mostly; +static int dump_debug_bus_id __read_mostly; + +#define I2C_HEX_DUMP(client, buf, len) \ + do { \ + if (dump_debug && \ + (client)->adapter->nr == dump_debug_bus_id) { \ + char dump_info[100] = {0,}; \ + snprintf(dump_info, sizeof(dump_info), \ + "bus_id:%d: ", (client)->adapter->nr); \ + print_hex_dump(KERN_ERR, dump_info, DUMP_PREFIX_NONE, \ + 16, 1, buf, len, true); \ + } \ + } while (0) + static int i2c_slave_mqueue_callback(struct i2c_client *client, enum i2c_slave_event event, u8 *val) { @@ -101,6 +117,7 @@ static ssize_t i2c_slave_mqueue_bin_read(struct file *filp, if (msg->len <= count) { ret = msg->len; memcpy(buf, msg->buf, ret); + I2C_HEX_DUMP(mq->client, buf, ret); } else { ret = -EOVERFLOW; /* Drop this HUGE one. */ } @@ -131,6 +148,8 @@ static int i2c_slave_mqueue_probe(struct i2c_client *client, BUILD_BUG_ON(!is_power_of_2(MQ_QUEUE_SIZE)); + mq->client = client; + buf = devm_kmalloc_array(dev, MQ_QUEUE_SIZE, MQ_MSGBUF_SIZE, GFP_KERNEL); if (!buf) @@ -212,6 +231,11 @@ static struct i2c_driver i2c_slave_mqueue_driver = { }; module_i2c_driver(i2c_slave_mqueue_driver); +module_param_named(dump_debug, dump_debug, bool, 0644); +MODULE_PARM_DESC(dump_debug, "debug flag for dump printing"); +module_param_named(dump_debug_bus_id, dump_debug_bus_id, int, 0644); +MODULE_PARM_DESC(dump_debug_bus_id, "bus id for dump debug printing"); + MODULE_LICENSE("GPL v2"); MODULE_AUTHOR("Haiyue Wang "); MODULE_DESCRIPTION("I2C slave mode for receiving and queuing messages"); -- 2.7.4