Hi, Le 24/04/2012 10:22, Jonathan Cameron a écrit : > On 4/19/2012 5:05 PM, Maxime Ripard wrote: > > The irony here is that I was going to suggest we droped this driver > entirely > as I didn't think anyone was using it! Guess they are given you've gone > to the effort of cleaning it up. > > One trivial change inline. Otherwise looks good. Well, actually, you still can. I picked a random driver that implemented the frequency stuff to see what I needed and what I thought was a good driver API. I could have been any other driver doing this :) >> Signed-off-by: Maxime Ripard<maxime.ripard@xxxxxxxxxxxxxxxxxx> >> --- >> .../staging/iio/trigger/iio-trig-periodic-rtc.c | 50 >> ++++---------------- >> 1 files changed, 10 insertions(+), 40 deletions(-) >> >> diff --git a/drivers/staging/iio/trigger/iio-trig-periodic-rtc.c >> b/drivers/staging/iio/trigger/iio-trig-periodic-rtc.c >> index a80cf67..ffabf80 100644 >> --- a/drivers/staging/iio/trigger/iio-trig-periodic-rtc.c >> +++ b/drivers/staging/iio/trigger/iio-trig-periodic-rtc.c >> @@ -24,7 +24,6 @@ static DEFINE_MUTEX(iio_prtc_trigger_list_lock); >> >> struct iio_prtc_trigger_info { >> struct rtc_device *rtc; >> - int frequency; >> struct rtc_task task; >> }; >> >> @@ -37,50 +36,19 @@ static int iio_trig_periodic_rtc_set_state(struct >> iio_trigger *trig, bool state) >> return rtc_irq_set_state(trig_info->rtc,&trig_info->task, state); >> } >> >> -static ssize_t iio_trig_periodic_read_freq(struct device *dev, >> - struct device_attribute *attr, >> - char *buf) >> +static int update_infos(struct iio_trigger *trig, const unsigned long >> mask) >> { >> - struct iio_trigger *trig = dev_get_drvdata(dev); >> struct iio_prtc_trigger_info *trig_info = trig->private_data; >> - return sprintf(buf, "%u\n", trig_info->frequency); >> -} >> - >> -static ssize_t iio_trig_periodic_write_freq(struct device *dev, >> - struct device_attribute *attr, >> - const char *buf, >> - size_t len) >> -{ >> - struct iio_trigger *trig = dev_get_drvdata(dev); >> - struct iio_prtc_trigger_info *trig_info = trig->private_data; >> - unsigned long val; >> - int ret; >> - >> - ret = strict_strtoul(buf, 10,&val); >> - if (ret) >> - goto error_ret; >> - >> - ret = rtc_irq_set_freq(trig_info->rtc,&trig_info->task, val); >> - if (ret) >> - goto error_ret; >> - >> - trig_info->frequency = val; >> >> - return len; >> - >> -error_ret: >> - return ret; >> + switch (mask) { >> + case IIO_TRIGGER_INFO_FREQUENCY: >> + return rtc_irq_set_freq(trig_info->rtc,&trig_info->task, >> + trig->frequency); >> + default: > return -EINVAL. Any other write is an error, not a clean return. Of course > it can't happen, but still best to be clear we aren't happy if it does! >> + return 0; >> + } >> } >> >> -static DEVICE_ATTR(frequency, S_IRUGO | S_IWUSR, >> - iio_trig_periodic_read_freq, >> - iio_trig_periodic_write_freq); >> - >> -static struct attribute *iio_trig_prtc_attrs[] = { >> - &dev_attr_frequency.attr, >> - NULL, >> -}; >> - >> static const struct attribute_group iio_trig_prtc_attr_group = { >> .attrs = iio_trig_prtc_attrs, >> }; >> @@ -99,6 +67,7 @@ static void iio_prtc_trigger_poll(void *private_data) >> static const struct iio_trigger_ops iio_prtc_trigger_ops = { >> .owner = THIS_MODULE, >> .set_trigger_state =&iio_trig_periodic_rtc_set_state, >> + .update_infos =&iio_trig_periodic_rtc_update_infos, >> }; >> >> static int iio_trig_periodic_rtc_probe(struct platform_device *dev) >> @@ -124,6 +93,7 @@ static int iio_trig_periodic_rtc_probe(struct >> platform_device *dev) >> ret = -ENOMEM; >> goto error_put_trigger_and_remove_from_list; >> } >> + trig->info_mask = IIO_TRIGGER_INFO_FREQUENCY; >> trig->private_data = trig_info; >> trig->ops =&iio_prtc_trigger_ops; >> /* RTC access */ > -- Maxime Ripard, Free Electrons Kernel, drivers, real-time and embedded Linux development, consulting, training and support. http://free-electrons.com -- To unsubscribe from this list: send the line "unsubscribe linux-iio" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html