[v6.8,1/2] nvmem: layouts: refactor .add_cells() callback arguments
Commit Message
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>
---
Those changes complete layouts refactoring process so I'd very much like
them to go with the rest of refactoring stuff to v6.8.
It's difficult to add Fixes tag due to the nature of refactoring.
Callback .add_cells() existed even before refactoring so I'm not sure
what commit would be fair to blame.
Srini, Greg: could you see if this could still make it into v6.8?
drivers/nvmem/core.c | 2 +-
drivers/nvmem/layouts/onie-tlv.c | 4 +++-
drivers/nvmem/layouts/sl28vpd.c | 4 +++-
include/linux/nvmem-provider.h | 2 +-
4 files changed, 8 insertions(+), 4 deletions(-)
Comments
> 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
@@ -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;
@@ -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;
@@ -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;
@@ -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 {