Message ID | 20231018205929.3435110-3-Frank.Li@nxp.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | i3c: master: some improvment for i3c master | expand |
Hi Frank,
kernel test robot noticed the following build warnings:
[auto build test WARNING on linus/master]
[also build test WARNING on v6.6-rc6 next-20231018]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Frank-Li/i3c-master-add-enable-disable-hot-join-in-sys-entry/20231019-051444
base: linus/master
patch link: https://lore.kernel.org/r/20231018205929.3435110-3-Frank.Li%40nxp.com
patch subject: [PATCH v2 2/6] i3c: master: svc: add hot join support
config: m68k-allyesconfig (https://download.01.org/0day-ci/archive/20231019/202310190611.b14M4mH3-lkp@intel.com/config)
compiler: m68k-linux-gcc (GCC) 13.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20231019/202310190611.b14M4mH3-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <yujie.liu@intel.com>
| Closes: https://lore.kernel.org/r/202310190611.b14M4mH3-lkp@intel.com/
All warnings (new ones prefixed by >>):
drivers/i3c/master/svc-i3c-master.c:212: warning: Function parameter or member 'lock' not described in 'svc_i3c_master'
>> drivers/i3c/master/svc-i3c-master.c:212: warning: Function parameter or member 'enabled_events' not described in 'svc_i3c_master'
2 warnings as Errors
vim +212 drivers/i3c/master/svc-i3c-master.c
1c5ee2a77b1bac Clark Wang 2023-05-17 157
dd3c52846d5954 Miquel Raynal 2021-01-21 158 /**
dd3c52846d5954 Miquel Raynal 2021-01-21 159 * struct svc_i3c_master - Silvaco I3C Master structure
dd3c52846d5954 Miquel Raynal 2021-01-21 160 * @base: I3C master controller
dd3c52846d5954 Miquel Raynal 2021-01-21 161 * @dev: Corresponding device
dd3c52846d5954 Miquel Raynal 2021-01-21 162 * @regs: Memory mapping
5496eac6ad7428 Miquel Raynal 2023-08-17 163 * @saved_regs: Volatile values for PM operations
dd3c52846d5954 Miquel Raynal 2021-01-21 164 * @free_slots: Bit array of available slots
dd3c52846d5954 Miquel Raynal 2021-01-21 165 * @addrs: Array containing the dynamic addresses of each attached device
dd3c52846d5954 Miquel Raynal 2021-01-21 166 * @descs: Array of descriptors, one per attached device
dd3c52846d5954 Miquel Raynal 2021-01-21 167 * @hj_work: Hot-join work
dd3c52846d5954 Miquel Raynal 2021-01-21 168 * @ibi_work: IBI work
dd3c52846d5954 Miquel Raynal 2021-01-21 169 * @irq: Main interrupt
dd3c52846d5954 Miquel Raynal 2021-01-21 170 * @pclk: System clock
dd3c52846d5954 Miquel Raynal 2021-01-21 171 * @fclk: Fast clock (bus)
dd3c52846d5954 Miquel Raynal 2021-01-21 172 * @sclk: Slow clock (other events)
dd3c52846d5954 Miquel Raynal 2021-01-21 173 * @xferqueue: Transfer queue structure
dd3c52846d5954 Miquel Raynal 2021-01-21 174 * @xferqueue.list: List member
dd3c52846d5954 Miquel Raynal 2021-01-21 175 * @xferqueue.cur: Current ongoing transfer
dd3c52846d5954 Miquel Raynal 2021-01-21 176 * @xferqueue.lock: Queue lock
dd3c52846d5954 Miquel Raynal 2021-01-21 177 * @ibi: IBI structure
dd3c52846d5954 Miquel Raynal 2021-01-21 178 * @ibi.num_slots: Number of slots available in @ibi.slots
dd3c52846d5954 Miquel Raynal 2021-01-21 179 * @ibi.slots: Available IBI slots
dd3c52846d5954 Miquel Raynal 2021-01-21 180 * @ibi.tbq_slot: To be queued IBI slot
dd3c52846d5954 Miquel Raynal 2021-01-21 181 * @ibi.lock: IBI lock
* @lock: <description>
* @enabled_events: <description>
dd3c52846d5954 Miquel Raynal 2021-01-21 182 */
dd3c52846d5954 Miquel Raynal 2021-01-21 183 struct svc_i3c_master {
dd3c52846d5954 Miquel Raynal 2021-01-21 184 struct i3c_master_controller base;
dd3c52846d5954 Miquel Raynal 2021-01-21 185 struct device *dev;
dd3c52846d5954 Miquel Raynal 2021-01-21 186 void __iomem *regs;
1c5ee2a77b1bac Clark Wang 2023-05-17 187 struct svc_i3c_regs_save saved_regs;
dd3c52846d5954 Miquel Raynal 2021-01-21 188 u32 free_slots;
dd3c52846d5954 Miquel Raynal 2021-01-21 189 u8 addrs[SVC_I3C_MAX_DEVS];
dd3c52846d5954 Miquel Raynal 2021-01-21 190 struct i3c_dev_desc *descs[SVC_I3C_MAX_DEVS];
dd3c52846d5954 Miquel Raynal 2021-01-21 191 struct work_struct hj_work;
dd3c52846d5954 Miquel Raynal 2021-01-21 192 struct work_struct ibi_work;
dd3c52846d5954 Miquel Raynal 2021-01-21 193 int irq;
dd3c52846d5954 Miquel Raynal 2021-01-21 194 struct clk *pclk;
dd3c52846d5954 Miquel Raynal 2021-01-21 195 struct clk *fclk;
dd3c52846d5954 Miquel Raynal 2021-01-21 196 struct clk *sclk;
dd3c52846d5954 Miquel Raynal 2021-01-21 197 struct {
dd3c52846d5954 Miquel Raynal 2021-01-21 198 struct list_head list;
dd3c52846d5954 Miquel Raynal 2021-01-21 199 struct svc_i3c_xfer *cur;
dd3c52846d5954 Miquel Raynal 2021-01-21 200 /* Prevent races between transfers */
dd3c52846d5954 Miquel Raynal 2021-01-21 201 spinlock_t lock;
dd3c52846d5954 Miquel Raynal 2021-01-21 202 } xferqueue;
dd3c52846d5954 Miquel Raynal 2021-01-21 203 struct {
dd3c52846d5954 Miquel Raynal 2021-01-21 204 unsigned int num_slots;
dd3c52846d5954 Miquel Raynal 2021-01-21 205 struct i3c_dev_desc **slots;
dd3c52846d5954 Miquel Raynal 2021-01-21 206 struct i3c_ibi_slot *tbq_slot;
dd3c52846d5954 Miquel Raynal 2021-01-21 207 /* Prevent races within IBI handlers */
dd3c52846d5954 Miquel Raynal 2021-01-21 208 spinlock_t lock;
dd3c52846d5954 Miquel Raynal 2021-01-21 209 } ibi;
85bebb554b09b1 Frank Li 2023-10-16 210 struct mutex lock;
e00571e38f466c Frank Li 2023-10-18 211 int enabled_events;
dd3c52846d5954 Miquel Raynal 2021-01-21 @212 };
dd3c52846d5954 Miquel Raynal 2021-01-21 213
diff --git a/drivers/i3c/master/svc-i3c-master.c b/drivers/i3c/master/svc-i3c-master.c index fedb31e0076c4..d8467607602af 100644 --- a/drivers/i3c/master/svc-i3c-master.c +++ b/drivers/i3c/master/svc-i3c-master.c @@ -128,6 +128,9 @@ /* This parameter depends on the implementation and may be tuned */ #define SVC_I3C_FIFO_SIZE 16 +#define SVC_I3C_EVENT_IBI BIT(0) +#define SVC_I3C_EVENT_HOTJOIN BIT(1) + struct svc_i3c_cmd { u8 addr; bool rnw; @@ -205,6 +208,7 @@ struct svc_i3c_master { spinlock_t lock; } ibi; struct mutex lock; + int enabled_events; }; /** @@ -425,13 +429,16 @@ static void svc_i3c_master_ibi_work(struct work_struct *work) switch (ibitype) { case SVC_I3C_MSTATUS_IBITYPE_IBI: dev = svc_i3c_master_dev_from_addr(master, ibiaddr); - if (!dev) + if (!dev || !(master->enabled_events & SVC_I3C_EVENT_IBI)) svc_i3c_master_nack_ibi(master); else svc_i3c_master_handle_ibi(master, dev); break; case SVC_I3C_MSTATUS_IBITYPE_HOT_JOIN: - svc_i3c_master_ack_ibi(master, false); + if (master->enabled_events & SVC_I3C_EVENT_HOTJOIN) + svc_i3c_master_ack_ibi(master, false); + else + svc_i3c_master_nack_ibi(master); break; case SVC_I3C_MSTATUS_IBITYPE_MASTER_REQUEST: svc_i3c_master_nack_ibi(master); @@ -468,7 +475,9 @@ static void svc_i3c_master_ibi_work(struct work_struct *work) svc_i3c_master_emit_stop(master); break; case SVC_I3C_MSTATUS_IBITYPE_HOT_JOIN: - queue_work(master->base.wq, &master->hj_work); + svc_i3c_master_emit_stop(master); + if (master->enabled_events & SVC_I3C_EVENT_HOTJOIN) + queue_work(master->base.wq, &master->hj_work); break; case SVC_I3C_MSTATUS_IBITYPE_MASTER_REQUEST: default: @@ -1468,6 +1477,7 @@ static int svc_i3c_master_enable_ibi(struct i3c_dev_desc *dev) return ret; } + master->enabled_events |= SVC_I3C_EVENT_IBI; svc_i3c_master_enable_interrupts(master, SVC_I3C_MINT_SLVSTART); return i3c_master_enec_locked(m, dev->info.dyn_addr, I3C_CCC_EVENT_SIR); @@ -1479,7 +1489,9 @@ static int svc_i3c_master_disable_ibi(struct i3c_dev_desc *dev) struct svc_i3c_master *master = to_svc_i3c_master(m); int ret; - svc_i3c_master_disable_interrupts(master); + master->enabled_events &= ~SVC_I3C_EVENT_IBI; + if (!master->enabled_events) + svc_i3c_master_disable_interrupts(master); ret = i3c_master_disec_locked(m, dev->info.dyn_addr, I3C_CCC_EVENT_SIR); @@ -1489,6 +1501,39 @@ static int svc_i3c_master_disable_ibi(struct i3c_dev_desc *dev) return ret; } +static int svc_i3c_master_enable_hotjoin(struct i3c_master_controller *m) +{ + struct svc_i3c_master *master = to_svc_i3c_master(m); + int ret; + + ret = pm_runtime_resume_and_get(master->dev); + if (ret < 0) { + dev_err(master->dev, "<%s> Cannot get runtime PM.\n", __func__); + return ret; + } + + master->enabled_events |= SVC_I3C_EVENT_HOTJOIN; + + svc_i3c_master_enable_interrupts(master, SVC_I3C_MINT_SLVSTART); + + return 0; +} + +static int svc_i3c_master_disable_hotjoin(struct i3c_master_controller *m) +{ + struct svc_i3c_master *master = to_svc_i3c_master(m); + + master->enabled_events &= ~SVC_I3C_EVENT_HOTJOIN; + + if (!master->enabled_events) + svc_i3c_master_disable_interrupts(master); + + pm_runtime_mark_last_busy(master->dev); + pm_runtime_put_autosuspend(master->dev); + + return 0; +} + static void svc_i3c_master_recycle_ibi_slot(struct i3c_dev_desc *dev, struct i3c_ibi_slot *slot) { @@ -1515,6 +1560,8 @@ static const struct i3c_master_controller_ops svc_i3c_master_ops = { .recycle_ibi_slot = svc_i3c_master_recycle_ibi_slot, .enable_ibi = svc_i3c_master_enable_ibi, .disable_ibi = svc_i3c_master_disable_ibi, + .enable_hotjoin = svc_i3c_master_enable_hotjoin, + .disable_hotjoin = svc_i3c_master_disable_hotjoin, }; static int svc_i3c_master_prepare_clks(struct svc_i3c_master *master) @@ -1627,6 +1674,8 @@ static int svc_i3c_master_probe(struct platform_device *pdev) pm_runtime_mark_last_busy(&pdev->dev); pm_runtime_put_autosuspend(&pdev->dev); + i3c_master_enable_hotjoin(&master->base); + return 0; rpm_disable:
Add hot join support for svc master controller. Enable hot join defaultly. User can use sys entry to disable hot join. Signed-off-by: Frank Li <Frank.Li@nxp.com> --- drivers/i3c/master/svc-i3c-master.c | 57 +++++++++++++++++++++++++++-- 1 file changed, 53 insertions(+), 4 deletions(-)