Message ID | 20231219120104.3422-1-zajec5@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [v6.8,1/2] nvmem: layouts: refactor .add_cells() callback arguments | expand |
> From: Rafał Miłecki <rafal@milecki.pl> > > Simply pass whole "struct nvmem_layout" instead of single variables. > There is nothing in "struct nvmem_layout" that we have to hide from > layout drivers. They also access it during .probe() and .remove(). > > Thanks to this change: > > 1. API gets more consistent > All layouts drivers callbacks get the same argument > > 2. Layouts get correct device > Before this change NVMEM core code was passing NVMEM device instead > of layout device. That resulted in: > * Confusing prints > * Calling devm_*() helpers on wrong device > * Helpers like of_device_get_match_data() dereferencing NULLs > > 3. It gets possible to get match data > First of all nvmem_layout_get_match_data() requires passing "struct > nvmem_layout" which .add_cells() callback didn't have before this. > It > doesn't matter much as it's rather useless now anyway (and will be > dropped). > What's more important however is that of_device_get_match_data() can > be used now thanks to owning a proper device pointer. > > Signed-off-by: Rafał Miłecki <rafal@milecki.pl> LGTM, Reviewed-by: Michael Walle <michael@walle.cc>
Hi Rafał, zajec5@gmail.com wrote on Tue, 19 Dec 2023 13:01:03 +0100: > From: Rafał Miłecki <rafal@milecki.pl> > > Simply pass whole "struct nvmem_layout" instead of single variables. > There is nothing in "struct nvmem_layout" that we have to hide from > layout drivers. They also access it during .probe() and .remove(). > > Thanks to this change: > > 1. API gets more consistent > All layouts drivers callbacks get the same argument > > 2. Layouts get correct device > Before this change NVMEM core code was passing NVMEM device instead > of layout device. That resulted in: > * Confusing prints > * Calling devm_*() helpers on wrong device > * Helpers like of_device_get_match_data() dereferencing NULLs > > 3. It gets possible to get match data > First of all nvmem_layout_get_match_data() requires passing "struct > nvmem_layout" which .add_cells() callback didn't have before this. It > doesn't matter much as it's rather useless now anyway (and will be > dropped). > What's more important however is that of_device_get_match_data() can > be used now thanks to owning a proper device pointer. > > Signed-off-by: Rafał Miłecki <rafal@milecki.pl> Reviewed-by: Miquel Raynal <miquel.raynal@bootlin.com> Thanks, Miquèl
diff --git a/drivers/nvmem/core.c b/drivers/nvmem/core.c index ba559e81f77f..441d132ebb61 100644 --- a/drivers/nvmem/core.c +++ b/drivers/nvmem/core.c @@ -854,7 +854,7 @@ int nvmem_layout_register(struct nvmem_layout *layout) return -EINVAL; /* Populate the cells */ - ret = layout->add_cells(&layout->nvmem->dev, layout->nvmem); + ret = layout->add_cells(layout); if (ret) return ret; diff --git a/drivers/nvmem/layouts/onie-tlv.c b/drivers/nvmem/layouts/onie-tlv.c index b24cc5dcc6ee..9d2ad5f2dc10 100644 --- a/drivers/nvmem/layouts/onie-tlv.c +++ b/drivers/nvmem/layouts/onie-tlv.c @@ -182,8 +182,10 @@ static bool onie_tlv_crc_is_valid(struct device *dev, size_t table_len, u8 *tabl return true; } -static int onie_tlv_parse_table(struct device *dev, struct nvmem_device *nvmem) +static int onie_tlv_parse_table(struct nvmem_layout *layout) { + struct nvmem_device *nvmem = layout->nvmem; + struct device *dev = &layout->dev; struct onie_tlv_hdr hdr; size_t table_len, data_len, hdr_len; u8 *table, *data; diff --git a/drivers/nvmem/layouts/sl28vpd.c b/drivers/nvmem/layouts/sl28vpd.c index b8ffae646cc2..53fa50f17dca 100644 --- a/drivers/nvmem/layouts/sl28vpd.c +++ b/drivers/nvmem/layouts/sl28vpd.c @@ -80,8 +80,10 @@ static int sl28vpd_v1_check_crc(struct device *dev, struct nvmem_device *nvmem) return 0; } -static int sl28vpd_add_cells(struct device *dev, struct nvmem_device *nvmem) +static int sl28vpd_add_cells(struct nvmem_layout *layout) { + struct nvmem_device *nvmem = layout->nvmem; + struct device *dev = &layout->dev; const struct nvmem_cell_info *pinfo; struct nvmem_cell_info info = {0}; struct device_node *layout_np; diff --git a/include/linux/nvmem-provider.h b/include/linux/nvmem-provider.h index 6fe65b35ea97..81a67642ac55 100644 --- a/include/linux/nvmem-provider.h +++ b/include/linux/nvmem-provider.h @@ -173,7 +173,7 @@ struct nvmem_cell_table { struct nvmem_layout { struct device dev; struct nvmem_device *nvmem; - int (*add_cells)(struct device *dev, struct nvmem_device *nvmem); + int (*add_cells)(struct nvmem_layout *layout); }; struct nvmem_layout_driver {