Message ID | 20161026145756.21689-6-antoine.tenart@free-electrons.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On 10/26/2016 04:57 PM, Antoine Tenart wrote: > Signed-off-by: Antoine Tenart <antoine.tenart@free-electrons.com> > --- Please provide a commit message. > drivers/of/overlay-manager/Kconfig | 10 ++++++++++ > drivers/w1/slaves/w1_ds2431.c | 39 ++++++++++++++++++++++++++++++++++++++ > 2 files changed, 49 insertions(+) > > diff --git a/drivers/of/overlay-manager/Kconfig b/drivers/of/overlay-manager/Kconfig > index 1a36613c0c53..ad0a5b8e9e5e 100644 > --- a/drivers/of/overlay-manager/Kconfig > +++ b/drivers/of/overlay-manager/Kconfig > @@ -16,4 +16,14 @@ config OF_OVERLAY_MGR_FORMAT_CHIP > > endmenu > > +menu "Overlay Manager detectors" > + > +config OF_OVERLAY_MGR_DETECTOR_DS2431 > + bool "Dip header on a DS2431 EEPROM" > + depends on W1_SLAVE_DS2431 > + help > + Enable dip header DS2431 EEPROM support. > + > +endmenu > + > endif > diff --git a/drivers/w1/slaves/w1_ds2431.c b/drivers/w1/slaves/w1_ds2431.c > index 80572cb63ba8..760325f9a2bd 100644 > --- a/drivers/w1/slaves/w1_ds2431.c > +++ b/drivers/w1/slaves/w1_ds2431.c > @@ -15,6 +15,9 @@ > #include <linux/device.h> > #include <linux/types.h> > #include <linux/delay.h> > +#include <linux/slab.h> > + > +#include <linux/overlay-manager.h> > > #include "../w1.h" > #include "../w1_int.h" > @@ -280,7 +283,43 @@ static const struct attribute_group *w1_f2d_groups[] = { > NULL, > }; > > +#if IS_ENABLED(CONFIG_OF_OVERLAY_MGR_DETECTOR_DS2431) > +static int chip_dip_callback(struct w1_slave *sl) > +{ > + char **candidates = NULL; > + int i, n, err = 0; > + u8 *data; > + > + data = kzalloc(OVERLAY_MGR_DIP_MAX_SZ, GFP_KERNEL); > + if (!data) > + return -ENOMEM; > + > + /* sizeof(struct chip_header) is a mulitple of 8 */ > + for (i = 0; i < OVERLAY_MGR_DIP_MAX_SZ; i += 8) { > + if (w1_f2d_readblock(sl, i, 8, &data[i])) { > + err = -EIO; > + goto end; > + } > + } > + > + overlay_mgr_parse(&sl->dev, data, &candidates, &n); > + if (!n) { > + err = -EINVAL; > + goto end; > + } > + > + err = overlay_mgr_apply(&sl->dev, candidates, n); > + > +end: > + kfree(data); > + return err; > +} > +#endif > + > static struct w1_family_ops w1_f2d_fops = { > +#if IS_ENABLED(CONFIG_OF_OVERLAY_MGR_DETECTOR_DS2431) > + .callback = chip_dip_callback, > +#endif > .groups = w1_f2d_groups, > }; > >
On 10/26/2016 04:57 PM, Antoine Tenart wrote: > Signed-off-by: Antoine Tenart <antoine.tenart@free-electrons.com> > --- Please provide a commit message. Thanks, Matthias
Hello Matthias, On Thu, Oct 27, 2016 at 11:19:14AM +0200, Matthias Brugger wrote: > On 10/26/2016 04:57 PM, Antoine Tenart wrote: > > Signed-off-by: Antoine Tenart <antoine.tenart@free-electrons.com> > > --- > > Please provide a commit message. Sure. There are other modifications I'd like to do in the series if it happens to be an use case for people. This patch is given as an example of how we could implement this. Antoine
diff --git a/drivers/of/overlay-manager/Kconfig b/drivers/of/overlay-manager/Kconfig index 1a36613c0c53..ad0a5b8e9e5e 100644 --- a/drivers/of/overlay-manager/Kconfig +++ b/drivers/of/overlay-manager/Kconfig @@ -16,4 +16,14 @@ config OF_OVERLAY_MGR_FORMAT_CHIP endmenu +menu "Overlay Manager detectors" + +config OF_OVERLAY_MGR_DETECTOR_DS2431 + bool "Dip header on a DS2431 EEPROM" + depends on W1_SLAVE_DS2431 + help + Enable dip header DS2431 EEPROM support. + +endmenu + endif diff --git a/drivers/w1/slaves/w1_ds2431.c b/drivers/w1/slaves/w1_ds2431.c index 80572cb63ba8..760325f9a2bd 100644 --- a/drivers/w1/slaves/w1_ds2431.c +++ b/drivers/w1/slaves/w1_ds2431.c @@ -15,6 +15,9 @@ #include <linux/device.h> #include <linux/types.h> #include <linux/delay.h> +#include <linux/slab.h> + +#include <linux/overlay-manager.h> #include "../w1.h" #include "../w1_int.h" @@ -280,7 +283,43 @@ static const struct attribute_group *w1_f2d_groups[] = { NULL, }; +#if IS_ENABLED(CONFIG_OF_OVERLAY_MGR_DETECTOR_DS2431) +static int chip_dip_callback(struct w1_slave *sl) +{ + char **candidates = NULL; + int i, n, err = 0; + u8 *data; + + data = kzalloc(OVERLAY_MGR_DIP_MAX_SZ, GFP_KERNEL); + if (!data) + return -ENOMEM; + + /* sizeof(struct chip_header) is a mulitple of 8 */ + for (i = 0; i < OVERLAY_MGR_DIP_MAX_SZ; i += 8) { + if (w1_f2d_readblock(sl, i, 8, &data[i])) { + err = -EIO; + goto end; + } + } + + overlay_mgr_parse(&sl->dev, data, &candidates, &n); + if (!n) { + err = -EINVAL; + goto end; + } + + err = overlay_mgr_apply(&sl->dev, candidates, n); + +end: + kfree(data); + return err; +} +#endif + static struct w1_family_ops w1_f2d_fops = { +#if IS_ENABLED(CONFIG_OF_OVERLAY_MGR_DETECTOR_DS2431) + .callback = chip_dip_callback, +#endif .groups = w1_f2d_groups, };
Signed-off-by: Antoine Tenart <antoine.tenart@free-electrons.com> --- drivers/of/overlay-manager/Kconfig | 10 ++++++++++ drivers/w1/slaves/w1_ds2431.c | 39 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+)