Message ID | 20161026145756.21689-5-antoine.tenart@free-electrons.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On 26 October 2016 at 08:57, Antoine Tenart <antoine.tenart@free-electrons.com> wrote: > This patch adds the possibility for slave drivers to register a > callback, to be called whenever a new device matching the slave ID > is connected. > > Signed-off-by: Antoine Tenart <antoine.tenart@free-electrons.com> > --- > drivers/w1/w1.c | 10 ++++++++++ > drivers/w1/w1_family.h | 2 ++ > 2 files changed, 12 insertions(+) > > diff --git a/drivers/w1/w1.c b/drivers/w1/w1.c > index 80d0cc4e6e7f..7010ffd1ea93 100644 > --- a/drivers/w1/w1.c > +++ b/drivers/w1/w1.c > @@ -659,6 +659,16 @@ static int w1_family_notify(unsigned long action, struct w1_slave *sl) > return err; > } > } > + if (fops->callback) { > + err = fops->callback(sl); > + /* > + * Do not return an error as the slave driver correctly > + * probed. > + */ I don't get this part. What's the point of calling a callback if a failure is not important - maybe I'm just missing something. > + if (err) > + dev_err(&sl->dev, > + "callback call failed. err=%d\n", err); > + } > > break; > case BUS_NOTIFY_DEL_DEVICE: > diff --git a/drivers/w1/w1_family.h b/drivers/w1/w1_family.h > index 10a7a0767187..5e165babc6f3 100644 > --- a/drivers/w1/w1_family.h > +++ b/drivers/w1/w1_family.h > @@ -55,11 +55,13 @@ struct w1_slave; > * @add_slave: add_slave > * @remove_slave: remove_slave > * @groups: sysfs group > + * @callback: called when a new device is discovered > */ > struct w1_family_ops > { > int (* add_slave)(struct w1_slave *); > void (* remove_slave)(struct w1_slave *); > + int (* callback)(struct w1_slave *); > const struct attribute_group **groups; > }; > > -- > 2.10.1 >
Hello Mathieu, On Wed, Oct 26, 2016 at 10:42:28AM -0600, Mathieu Poirier wrote: > On 26 October 2016 at 08:57, Antoine Tenart > <antoine.tenart@free-electrons.com> wrote: > > } > > + if (fops->callback) { > > + err = fops->callback(sl); > > + /* > > + * Do not return an error as the slave driver correctly > > + * probed. > > + */ > > I don't get this part. What's the point of calling a callback if a > failure is not important - maybe I'm just missing something. > > > + if (err) > > + dev_err(&sl->dev, > > + "callback call failed. err=%d\n", err); > > + } In our case it can be not that important: if we fail to apply an overlay, we can still use the w1 interfaces to access the eeprom. Anyway, all those errors weren't taken into account by the w1 framework before (see my other patch). Also, the w1 patches are given for the example and could be improved. Part of the reason is the w1 framework itself :-) Antoine
diff --git a/drivers/w1/w1.c b/drivers/w1/w1.c index 80d0cc4e6e7f..7010ffd1ea93 100644 --- a/drivers/w1/w1.c +++ b/drivers/w1/w1.c @@ -659,6 +659,16 @@ static int w1_family_notify(unsigned long action, struct w1_slave *sl) return err; } } + if (fops->callback) { + err = fops->callback(sl); + /* + * Do not return an error as the slave driver correctly + * probed. + */ + if (err) + dev_err(&sl->dev, + "callback call failed. err=%d\n", err); + } break; case BUS_NOTIFY_DEL_DEVICE: diff --git a/drivers/w1/w1_family.h b/drivers/w1/w1_family.h index 10a7a0767187..5e165babc6f3 100644 --- a/drivers/w1/w1_family.h +++ b/drivers/w1/w1_family.h @@ -55,11 +55,13 @@ struct w1_slave; * @add_slave: add_slave * @remove_slave: remove_slave * @groups: sysfs group + * @callback: called when a new device is discovered */ struct w1_family_ops { int (* add_slave)(struct w1_slave *); void (* remove_slave)(struct w1_slave *); + int (* callback)(struct w1_slave *); const struct attribute_group **groups; };
This patch adds the possibility for slave drivers to register a callback, to be called whenever a new device matching the slave ID is connected. Signed-off-by: Antoine Tenart <antoine.tenart@free-electrons.com> --- drivers/w1/w1.c | 10 ++++++++++ drivers/w1/w1_family.h | 2 ++ 2 files changed, 12 insertions(+)