On Tue, 2020-06-30 at 07:57 +0300, Alexandru Ardelean wrote: > This change moves all iio_dev debugfs fields to the iio_dev_priv object. > It's not the biggest advantage yet (to the whole thing of > abstractization) > but it's a start. > > The iio_get_debugfs_dentry() function (which is moved in > industrialio-core.c) needs to also be guarded against the CONFIG_DEBUG_FS > symbol, when it isn't defined. We do want to keep the inline definition > in > the iio.h header, so that the compiler can better infer when to compile > out > debugfs code that is related to the IIO debugfs directory. > Well, pretty much only this patch changed since V3. I thought about maybe re-doing just this patch, then I thought maybe I'd get a minor complaint that I should re-send the series. Either way, I prefer a complaint on this V4 series-re-send than if I were to have re-sent just this patch. > Signed-off-by: Alexandru Ardelean <alexandru.ardelean@xxxxxxxxxx> > --- > drivers/iio/industrialio-core.c | 46 +++++++++++++++++++++++---------- > include/linux/iio/iio-opaque.h | 10 +++++++ > include/linux/iio/iio.h | 13 +--------- > 3 files changed, 44 insertions(+), 25 deletions(-) > > diff --git a/drivers/iio/industrialio-core.c b/drivers/iio/industrialio- > core.c > index 27005ba4d09c..64174052641a 100644 > --- a/drivers/iio/industrialio-core.c > +++ b/drivers/iio/industrialio-core.c > @@ -165,6 +165,19 @@ static const char * const iio_chan_info_postfix[] = > { > [IIO_CHAN_INFO_THERMOCOUPLE_TYPE] = "thermocouple_type", > }; > > +#if !defined(CONFIG_DEBUG_FS) > +/** > + * There's also a CONFIG_DEBUG_FS guard in include/linux/iio/iio.h for > + * iio_get_debugfs_dentry() to make it inline if CONFIG_DEBUG_FS is > undefined > + */ > +struct dentry *iio_get_debugfs_dentry(struct iio_dev *indio_dev) > +{ > + struct iio_dev_opaque *iio_dev_opaque = > to_iio_dev_opaque(indio_dev); > + return iio_dev_opaque->debugfs_dentry; > +} > +EXPORT_SYMBOL_GPL(iio_get_debugfs_dentry); > +#endif > + > /** > * iio_find_channel_from_si() - get channel from its scan index > * @indio_dev: device > @@ -308,35 +321,37 @@ static ssize_t iio_debugfs_read_reg(struct file > *file, char __user *userbuf, > size_t count, loff_t *ppos) > { > struct iio_dev *indio_dev = file->private_data; > + struct iio_dev_opaque *iio_dev_opaque = > to_iio_dev_opaque(indio_dev); > unsigned val = 0; > int ret; > > if (*ppos > 0) > return simple_read_from_buffer(userbuf, count, ppos, > - indio_dev->read_buf, > - indio_dev->read_buf_len); > + iio_dev_opaque->read_buf, > + iio_dev_opaque- > >read_buf_len); > > ret = indio_dev->info->debugfs_reg_access(indio_dev, > - indio_dev- > >cached_reg_addr, > + iio_dev_opaque- > >cached_reg_addr, > 0, &val); > if (ret) { > dev_err(indio_dev->dev.parent, "%s: read failed\n", > __func__); > return ret; > } > > - indio_dev->read_buf_len = snprintf(indio_dev->read_buf, > - sizeof(indio_dev->read_buf), > - "0x%X\n", val); > + iio_dev_opaque->read_buf_len = snprintf(iio_dev_opaque->read_buf, > + sizeof(iio_dev_opaque- > >read_buf), > + "0x%X\n", val); > > return simple_read_from_buffer(userbuf, count, ppos, > - indio_dev->read_buf, > - indio_dev->read_buf_len); > + iio_dev_opaque->read_buf, > + iio_dev_opaque->read_buf_len); > } > > static ssize_t iio_debugfs_write_reg(struct file *file, > const char __user *userbuf, size_t count, loff_t > *ppos) > { > struct iio_dev *indio_dev = file->private_data; > + struct iio_dev_opaque *iio_dev_opaque = > to_iio_dev_opaque(indio_dev); > unsigned reg, val; > char buf[80]; > int ret; > @@ -351,10 +366,10 @@ static ssize_t iio_debugfs_write_reg(struct file > *file, > > switch (ret) { > case 1: > - indio_dev->cached_reg_addr = reg; > + iio_dev_opaque->cached_reg_addr = reg; > break; > case 2: > - indio_dev->cached_reg_addr = reg; > + iio_dev_opaque->cached_reg_addr = reg; > ret = indio_dev->info->debugfs_reg_access(indio_dev, reg, > val, NULL); > if (ret) { > @@ -378,23 +393,28 @@ static const struct file_operations > iio_debugfs_reg_fops = { > > static void iio_device_unregister_debugfs(struct iio_dev *indio_dev) > { > - debugfs_remove_recursive(indio_dev->debugfs_dentry); > + struct iio_dev_opaque *iio_dev_opaque = > to_iio_dev_opaque(indio_dev); > + debugfs_remove_recursive(iio_dev_opaque->debugfs_dentry); > } > > static void iio_device_register_debugfs(struct iio_dev *indio_dev) > { > + struct iio_dev_opaque *iio_dev_opaque; > + > if (indio_dev->info->debugfs_reg_access == NULL) > return; > > if (!iio_debugfs_dentry) > return; > > - indio_dev->debugfs_dentry = > + iio_dev_opaque = to_iio_dev_opaque(indio_dev); > + > + iio_dev_opaque->debugfs_dentry = > debugfs_create_dir(dev_name(&indio_dev->dev), > iio_debugfs_dentry); > > debugfs_create_file("direct_reg_access", 0644, > - indio_dev->debugfs_dentry, indio_dev, > + iio_dev_opaque->debugfs_dentry, indio_dev, > &iio_debugfs_reg_fops); > } > #else > diff --git a/include/linux/iio/iio-opaque.h b/include/linux/iio/iio- > opaque.h > index 1375674f14cd..b3f234b4c1e9 100644 > --- a/include/linux/iio/iio-opaque.h > +++ b/include/linux/iio/iio-opaque.h > @@ -6,9 +6,19 @@ > /** > * struct iio_dev_opaque - industrial I/O device opaque information > * @indio_dev: public industrial I/O device > information > + * @debugfs_dentry: device specific debugfs dentry > + * @cached_reg_addr: cached register address for debugfs reads > + * @read_buf: read buffer to be used for the > initial reg read > + * @read_buf_len: data length in @read_buf > */ > struct iio_dev_opaque { > struct iio_dev indio_dev; > +#if defined(CONFIG_DEBUG_FS) > + struct dentry *debugfs_dentry; > + unsigned cached_reg_addr; > + char read_buf[20]; > + unsigned int read_buf_len; > +#endif > }; > > #define to_iio_dev_opaque(indio_dev) \ > diff --git a/include/linux/iio/iio.h b/include/linux/iio/iio.h > index 86112e35ae5f..bb0aae11a111 100644 > --- a/include/linux/iio/iio.h > +++ b/include/linux/iio/iio.h > @@ -520,8 +520,6 @@ struct iio_buffer_setup_ops { > * @groups: [INTERN] attribute groups > * @groupcounter: [INTERN] index of next attribute group > * @flags: [INTERN] file ops related flags including busy > flag. > - * @debugfs_dentry: [INTERN] device specific debugfs dentry. > - * @cached_reg_addr: [INTERN] cached register address for debugfs reads. > * @priv: [DRIVER] reference to driver's private information > * **MUST** be accessed **ONLY** via iio_priv() helper > */ > @@ -567,12 +565,6 @@ struct iio_dev { > int groupcounter; > > unsigned long flags; > -#if defined(CONFIG_DEBUG_FS) > - struct dentry *debugfs_dentry; > - unsigned cached_reg_addr; > - char read_buf[20]; > - unsigned int read_buf_len; > -#endif > void *priv; > }; > > @@ -727,10 +719,7 @@ static inline bool iio_buffer_enabled(struct iio_dev > *indio_dev) > * @indio_dev: IIO device structure for device > **/ > #if defined(CONFIG_DEBUG_FS) > -static inline struct dentry *iio_get_debugfs_dentry(struct iio_dev > *indio_dev) > -{ > - return indio_dev->debugfs_dentry; > -} > +struct dentry *iio_get_debugfs_dentry(struct iio_dev *indio_dev); > #else > static inline struct dentry *iio_get_debugfs_dentry(struct iio_dev > *indio_dev) > {