Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1256285 > unrolled thread
| Started by | Olliver Schinagl <o.schinagl@ultimaker.com> |
|---|---|
| First post | 2015-10-26 22:40 +0100 |
| Last post | 2015-10-27 00:10 +0100 |
| Articles | 5 — 2 participants |
Back to article view | Back to linux.kernel
This discussion starts older than the indexed window; earlier articles aren't shown. The article labeled Started by
below is the oldest one visible, not the original post.
[PATCH 08/10] pwm: core: add pulse feature to the PWM framework Olliver Schinagl <o.schinagl@ultimaker.com> - 2015-10-26 22:40 +0100
Re: [PATCH 08/10] pwm: core: add pulse feature to the PWM framework kbuild test robot <lkp@intel.com> - 2015-10-26 23:10 +0100
Re: [PATCH 08/10] pwm: core: add pulse feature to the PWM framework kbuild test robot <lkp@intel.com> - 2015-10-26 23:20 +0100
Re: [PATCH 08/10] pwm: core: add pulse feature to the PWM framework kbuild test robot <lkp@intel.com> - 2015-10-26 23:20 +0100
Re: [PATCH 08/10] pwm: core: add pulse feature to the PWM framework kbuild test robot <lkp@intel.com> - 2015-10-27 00:10 +0100
| From | Olliver Schinagl <o.schinagl@ultimaker.com> |
|---|---|
| Date | 2015-10-26 22:40 +0100 |
| Subject | [PATCH 08/10] pwm: core: add pulse feature to the PWM framework |
| Message-ID | <qnXEJ-4YZ-13@gated-at.bofh.it> |
From: Olliver Schinagl <oliver@schinagl.nl>
Some hardware PWM's have the possibility to only send out one (or more)
pulses. This can be quite a useful feature in case one wants or needs
only a single pulse, but at the exact width.
Additionally, if multiple pulses are possible, outputting a fixed amount
of pulses can be useful for various timing specific purposes.
A few new functions have been expanded or added for this new behavior.
* pwm_config() now takes an additional parameter to setup the number of
pulses to output. The driver may force this to 0 or 1
for if example if this feature is not or only partially
supported
* pwm_[sg]et_pulse_count() get or set the number of pulses the pwm
framework is configured for
* pwm_get_pulse_count_max() get the maximum number of pulses the pwm
driver supports
* pwm_pulse() Tell the PWM to emit a pre-configured number of pulses
* pwm_pulse_done() an internal function for drivers to call when
they have completed their pre-configured number
of pulses
* pwm_is_pulsing() tells the callers if the pwm is busy pulsing,
yielding a little more information than just
pwm_is_enabled()
Signed-off-by: Olliver Schinagl <oliver@schinagl.nl>
---
drivers/pwm/core.c | 30 +++++++++++++++++++----
drivers/pwm/pwm-gpio.c | 3 ++-
drivers/pwm/pwm-sun4i.c | 3 ++-
drivers/pwm/sysfs.c | 58 ++++++++++++++++++++++++++++++++++++++++++--
include/linux/pwm.h | 64 ++++++++++++++++++++++++++++++++++++++++++++++---
5 files changed, 147 insertions(+), 11 deletions(-)
diff --git a/drivers/pwm/core.c b/drivers/pwm/core.c
index 3f9df3e..e2c1c0a 100644
--- a/drivers/pwm/core.c
+++ b/drivers/pwm/core.c
@@ -432,22 +432,29 @@ EXPORT_SYMBOL_GPL(pwm_free);
* @pwm: PWM device
* @duty_ns: "on" time (in nanoseconds)
* @period_ns: duration (in nanoseconds) of one cycle
+ * @pulse_count: number of pulses (periods) to output on pwm_pulse
*
* Returns: 0 on success or a negative error code on failure.
*/
-int pwm_config(struct pwm_device *pwm, int duty_ns, int period_ns)
+int pwm_config(struct pwm_device *pwm, int duty_ns, int period_ns,
+ unsigned int pulse_count)
{
int err;
if (!pwm || duty_ns < 0 || period_ns <= 0 || duty_ns > period_ns)
return -EINVAL;
- err = pwm->chip->ops->config(pwm->chip, pwm, duty_ns, period_ns);
+ if (pulse_count > pwm->pulse_count_max)
+ return -EINVAL;
+
+ err = pwm->chip->ops->config(pwm->chip, pwm, duty_ns,
+ period_ns, pulse_count);
if (err)
return err;
pwm->duty_cycle = duty_ns;
pwm->period = period_ns;
+ pwm->pulse_count = pulse_count;
return 0;
}
@@ -487,6 +494,18 @@ int pwm_set_polarity(struct pwm_device *pwm, enum pwm_polarity polarity)
EXPORT_SYMBOL_GPL(pwm_set_polarity);
/**
+ * pwm_pulse_done() - notify the PWM framework that pulse_count pulses are done
+ * @pwm: PWM device
+ */
+void pwm_pulse_done(struct pwm_device *pwm)
+{
+ if (pwm && !test_and_clear_bit(PWMF_ENABLED | PWMF_PULSING,
+ &pwm->flags))
+ return pwm->chip->ops->disable(pwm->chip, pwm);
+}
+EXPORT_SYMBOL_GPL(pwm_pulse_done);
+
+/**
* pwm_enable() - start a PWM output toggling
* @pwm: PWM device
*
@@ -494,7 +513,9 @@ EXPORT_SYMBOL_GPL(pwm_set_polarity);
*/
int pwm_enable(struct pwm_device *pwm)
{
- if (pwm && !test_and_set_bit(PWMF_ENABLED, &pwm->flags))
+ if (pwm && !test_and_set_bit(
+ PWMF_ENABLED | !pwm->pulse_count ? : PWMF_PULSING,
+ &pwm->flags))
return pwm->chip->ops->enable(pwm->chip, pwm);
return pwm ? 0 : -EINVAL;
@@ -507,7 +528,8 @@ EXPORT_SYMBOL_GPL(pwm_enable);
*/
void pwm_disable(struct pwm_device *pwm)
{
- if (pwm && test_and_clear_bit(PWMF_ENABLED, &pwm->flags))
+ if (pwm && test_and_clear_bit(PWMF_ENABLED | PWMF_PULSING,
+ &pwm->flags))
pwm->chip->ops->disable(pwm->chip, pwm);
}
EXPORT_SYMBOL_GPL(pwm_disable);
diff --git a/drivers/pwm/pwm-gpio.c b/drivers/pwm/pwm-gpio.c
index 8b588fb..cf4b170 100644
--- a/drivers/pwm/pwm-gpio.c
+++ b/drivers/pwm/pwm-gpio.c
@@ -84,7 +84,7 @@ enum hrtimer_restart gpio_pwm_timer(struct hrtimer *timer)
}
static int gpio_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm,
- int duty_ns, int period_ns)
+ int duty_ns, int period_ns, unsigned int count)
{
struct gpio_pwm_data *gpio_data = pwm_get_chip_data(pwm);
@@ -202,6 +202,7 @@ static int gpio_pwm_probe(struct platform_device *pdev)
hrtimer++;
pwm_set_chip_data(&gpio_chip->chip.pwms[i], gpio_data);
+ pwm_set_pulse_count_max(&gpio_chip->chip.pwms[i], UINT_MAX);
}
if (!hrtimer)
dev_warn(&pdev->dev, "unable to use High-Resolution timer,");
diff --git a/drivers/pwm/pwm-sun4i.c b/drivers/pwm/pwm-sun4i.c
index 4d84d9d..6347ca8 100644
--- a/drivers/pwm/pwm-sun4i.c
+++ b/drivers/pwm/pwm-sun4i.c
@@ -97,7 +97,8 @@ static inline void sun4i_pwm_writel(struct sun4i_pwm_chip *chip,
}
static int sun4i_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm,
- int duty_ns, int period_ns)
+ int duty_ns, int period_ns,
+ unsigned int pulse_count)
{
struct sun4i_pwm_chip *sun4i_pwm = to_sun4i_pwm_chip(chip);
u32 prd, dty, val, clk_gate;
diff --git a/drivers/pwm/sysfs.c b/drivers/pwm/sysfs.c
index 9c90886..9b7413c 100644
--- a/drivers/pwm/sysfs.c
+++ b/drivers/pwm/sysfs.c
@@ -61,7 +61,8 @@ static ssize_t period_store(struct device *child,
if (ret)
return ret;
- ret = pwm_config(pwm, pwm_get_duty_cycle(pwm), val);
+ ret = pwm_config(pwm, pwm_get_duty_cycle(pwm),
+ val, pwm_get_pulse_count(pwm));
return ret ? : size;
}
@@ -87,7 +88,8 @@ static ssize_t duty_cycle_store(struct device *child,
if (ret)
return ret;
- ret = pwm_config(pwm, val, pwm_get_period(pwm));
+ ret = pwm_config(pwm, val, pwm_get_period(pwm),
+ pwm_get_pulse_count(pwm));
return ret ? : size;
}
@@ -167,16 +169,68 @@ static ssize_t polarity_store(struct device *child,
return ret ? : size;
}
+static ssize_t pulse_count_show(struct device *child,
+ struct device_attribute *attr,
+ char *buf)
+{
+ const struct pwm_device *pwm = child_to_pwm_device(child);
+
+ return sprintf(buf, "%u\n", pwm_get_pulse_count(pwm));
+}
+
+static ssize_t pulse_count_store(struct device *child,
+ struct device_attribute *attr,
+ const char *buf, size_t size)
+{
+ struct pwm_device *pwm = child_to_pwm_device(child);
+ unsigned int val;
+ int ret;
+
+ ret = kstrtouint(buf, 0, &val);
+ if (ret)
+ return ret;
+
+ ret = pwm_config(pwm, pwm_get_duty_cycle(pwm),
+ pwm_get_period(pwm), val);
+
+ return ret ? : size;
+
+}
+
+static ssize_t pulse_count_max_show(struct device *child,
+ struct device_attribute *attr,
+ char *buf)
+{
+ const struct pwm_device *pwm = child_to_pwm_device(child);
+
+ return sprintf(buf, "%u\n", pwm_get_pulse_count_max(pwm));
+}
+
+static ssize_t pulsing_show(struct device *child,
+ struct device_attribute *attr,
+ char *buf)
+{
+ const struct pwm_device *pwm = child_to_pwm_device(child);
+
+ return sprintf(buf, "%d\n", pwm_is_pulsing(pwm));
+}
+
static DEVICE_ATTR_RW(period);
static DEVICE_ATTR_RW(duty_cycle);
static DEVICE_ATTR_RW(enable);
static DEVICE_ATTR_RW(polarity);
+static DEVICE_ATTR_RW(pulse_count);
+static DEVICE_ATTR_RO(pulse_count_max);
+static DEVICE_ATTR_RO(pulsing);
static struct attribute *pwm_attrs[] = {
&dev_attr_period.attr,
&dev_attr_duty_cycle.attr,
&dev_attr_enable.attr,
&dev_attr_polarity.attr,
+ &dev_attr_pulse_count.attr,
+ &dev_attr_pulse_count_max.attr,
+ &dev_attr_pulsing.attr,
NULL
};
ATTRIBUTE_GROUPS(pwm);
diff --git a/include/linux/pwm.h b/include/linux/pwm.h
index 29315ad..c6042cf 100644
--- a/include/linux/pwm.h
+++ b/include/linux/pwm.h
@@ -22,7 +22,13 @@ void pwm_free(struct pwm_device *pwm);
/*
* pwm_config - change a PWM device configuration
*/
-int pwm_config(struct pwm_device *pwm, int duty_ns, int period_ns);
+int pwm_config(struct pwm_device *pwm, int duty_ns,
+ int period_ns, unsigned int pulse_count);
+
+/*
+ * pwm_pulse_done - notify the PWM framework that pulse_count pulses are done
+ */
+void pwm_pulse_done(struct pwm_device *pwm);
/*
* pwm_enable - start a PWM output toggling
@@ -43,7 +49,8 @@ static inline void pwm_free(struct pwm_device *pwm)
{
}
-static inline int pwm_config(struct pwm_device *pwm, int duty_ns, int period_ns)
+static inline int pwm_config(struct pwm_device *pwm, int duty_ns,
+ int period_ns, unsigned int pulse_count)
{
return -EINVAL;
}
@@ -53,6 +60,11 @@ static inline int pwm_enable(struct pwm_device *pwm)
return -EINVAL;
}
+static inline int pwm_pulse_done(struct pwm_device *pwm)
+{
+ return -EINVAL;
+}
+
static inline void pwm_disable(struct pwm_device *pwm)
{
}
@@ -78,6 +90,7 @@ enum {
PWMF_REQUESTED = BIT(0),
PWMF_ENABLED = BIT(1),
PWMF_EXPORTED = BIT(2),
+ PWMF_PULSING = BIT(3),
};
/**
@@ -91,6 +104,8 @@ enum {
* @period: period of the PWM signal (in nanoseconds)
* @duty_cycle: duty cycle of the PWM signal (in nanoseconds)
* @polarity: polarity of the PWM signal
+ * @pulse_count: number of PWM pulses to toggle
+ * @pulse_count_max: maximum number of pulses that can be set to pulse
*/
struct pwm_device {
const char *label;
@@ -103,6 +118,8 @@ struct pwm_device {
unsigned int period;
unsigned int duty_cycle;
enum pwm_polarity polarity;
+ unsigned int pulse_count;
+ unsigned int pulse_count_max;
};
static inline bool pwm_is_enabled(const struct pwm_device *pwm)
@@ -110,6 +127,11 @@ static inline bool pwm_is_enabled(const struct pwm_device *pwm)
return test_bit(PWMF_ENABLED, &pwm->flags);
}
+static inline bool pwm_is_pulsing(const struct pwm_device *pwm)
+{
+ return test_bit(PWMF_ENABLED | PWMF_PULSING, &pwm->flags);
+}
+
static inline void pwm_set_period(struct pwm_device *pwm, unsigned int period)
{
if (pwm)
@@ -142,6 +164,42 @@ static inline enum pwm_polarity pwm_get_polarity(const struct pwm_device *pwm)
return pwm ? pwm->polarity : PWM_POLARITY_NORMAL;
}
+/*
+ * pwm_set_pulse_count - configure the number of pulses of a pwm_pulse
+ */
+static inline void pwm_set_pulse_count(struct pwm_device *pwm,
+ unsigned int pulse_count)
+{
+ if (pwm)
+ pwm->pulse_count = 0;
+}
+
+/*
+ * pwm_get_pulse_count - retrieve the number of pules to pulse of a pwm_pulse
+ */
+static inline unsigned int pwm_get_pulse_count(const struct pwm_device *pwm)
+{
+ return pwm ? pwm->pulse_count : 0;
+}
+
+/*
+ * pwm_get_pulse_count_max - retrieve the maximum number of pulses
+ */
+static inline unsigned int pwm_get_pulse_count_max(const struct pwm_device *pwm)
+{
+ return pwm ? pwm->pulse_count_max : 0;
+}
+
+/*
+ * pwm_set_pulse_count_max - set the maximum number of pulses
+ */
+static inline void pwm_set_pulse_count_max(struct pwm_device *pwm,
+ unsigned int pulse_count_max)
+{
+ if (pwm)
+ pwm->pulse_count_max = pulse_count_max;
+}
+
/**
* struct pwm_ops - PWM controller operations
* @request: optional hook for requesting a PWM
@@ -157,7 +215,7 @@ struct pwm_ops {
int (*request)(struct pwm_chip *chip, struct pwm_device *pwm);
void (*free)(struct pwm_chip *chip, struct pwm_device *pwm);
int (*config)(struct pwm_chip *chip, struct pwm_device *pwm,
- int duty_ns, int period_ns);
+ int duty_ns, int period_ns, unsigned int pulse_count);
int (*set_polarity)(struct pwm_chip *chip, struct pwm_device *pwm,
enum pwm_polarity polarity);
int (*enable)(struct pwm_chip *chip, struct pwm_device *pwm);
--
2.6.1
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [next] | [standalone]
| From | kbuild test robot <lkp@intel.com> |
|---|---|
| Date | 2015-10-26 23:10 +0100 |
| Message-ID | <qnY7L-5o3-1@gated-at.bofh.it> |
| In reply to | #1256285 |
[Multipart message — attachments visible in raw view] — view raw
Hi Olliver,
[auto build test WARNING on pwm/for-next -- if it's inappropriate base, please suggest rules for selecting the more suitable base]
url: https://github.com/0day-ci/linux/commits/Olliver-Schinagl/pwm-lpc18xx_pwm-use-pwm_set_chip_data/20151027-053853
config: avr32-atstk1006_defconfig (attached as .config)
reproduce:
wget https://git.kernel.org/cgit/linux/kernel/git/wfg/lkp-tests.git/plain/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# save the attached .config to linux build tree
make.cross ARCH=avr32
All warnings (new ones prefixed by >>):
>> drivers/pwm/pwm-atmel.c:278: warning: initialization from incompatible pointer type
vim +278 drivers/pwm/pwm-atmel.c
472ac3dc Alexandre Belloni 2015-05-25 262 mutex_lock(&atmel_pwm->isr_lock);
472ac3dc Alexandre Belloni 2015-05-25 263 atmel_pwm->updated_pwms |= atmel_pwm_readl(atmel_pwm, PWM_ISR);
472ac3dc Alexandre Belloni 2015-05-25 264
472ac3dc Alexandre Belloni 2015-05-25 265 while (!(atmel_pwm->updated_pwms & (1 << pwm->hwpwm)) &&
472ac3dc Alexandre Belloni 2015-05-25 266 time_before(jiffies, timeout)) {
472ac3dc Alexandre Belloni 2015-05-25 267 usleep_range(10, 100);
472ac3dc Alexandre Belloni 2015-05-25 268 atmel_pwm->updated_pwms |= atmel_pwm_readl(atmel_pwm, PWM_ISR);
472ac3dc Alexandre Belloni 2015-05-25 269 }
32b16d46 Bo Shen 2013-12-13 270
472ac3dc Alexandre Belloni 2015-05-25 271 mutex_unlock(&atmel_pwm->isr_lock);
32b16d46 Bo Shen 2013-12-13 272 atmel_pwm_writel(atmel_pwm, PWM_DIS, 1 << pwm->hwpwm);
32b16d46 Bo Shen 2013-12-13 273
32b16d46 Bo Shen 2013-12-13 274 clk_disable(atmel_pwm->clk);
32b16d46 Bo Shen 2013-12-13 275 }
32b16d46 Bo Shen 2013-12-13 276
32b16d46 Bo Shen 2013-12-13 277 static const struct pwm_ops atmel_pwm_ops = {
32b16d46 Bo Shen 2013-12-13 @278 .config = atmel_pwm_config,
32b16d46 Bo Shen 2013-12-13 279 .set_polarity = atmel_pwm_set_polarity,
32b16d46 Bo Shen 2013-12-13 280 .enable = atmel_pwm_enable,
32b16d46 Bo Shen 2013-12-13 281 .disable = atmel_pwm_disable,
32b16d46 Bo Shen 2013-12-13 282 .owner = THIS_MODULE,
32b16d46 Bo Shen 2013-12-13 283 };
32b16d46 Bo Shen 2013-12-13 284
32b16d46 Bo Shen 2013-12-13 285 struct atmel_pwm_data {
32b16d46 Bo Shen 2013-12-13 286 void (*config)(struct pwm_chip *chip, struct pwm_device *pwm,
:::::: The code at line 278 was first introduced by commit
:::::: 32b16d46e4154d6f9d9c1d5dd35f64cdf08b7aea pwm: atmel-pwm: Add Atmel PWM controller driver
:::::: TO: Bo Shen <voice.shen@atmel.com>
:::::: CC: Thierry Reding <thierry.reding@gmail.com>
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
[toc] | [prev] | [next] | [standalone]
| From | kbuild test robot <lkp@intel.com> |
|---|---|
| Date | 2015-10-26 23:20 +0100 |
| Message-ID | <qnYhr-5rl-19@gated-at.bofh.it> |
| In reply to | #1256285 |
[Multipart message — attachments visible in raw view] — view raw
Hi Olliver,
[auto build test ERROR on pwm/for-next -- if it's inappropriate base, please suggest rules for selecting the more suitable base]
url: https://github.com/0day-ci/linux/commits/Olliver-Schinagl/pwm-lpc18xx_pwm-use-pwm_set_chip_data/20151027-053853
config: i386-randconfig-s1-201543 (attached as .config)
reproduce:
# save the attached .config to linux build tree
make ARCH=i386
All errors (new ones prefixed by >>):
drivers/input/misc/max77693-haptic.c: In function 'max77693_haptic_set_duty_cycle':
>> drivers/input/misc/max77693-haptic.c:76:10: error: too few arguments to function 'pwm_config'
error = pwm_config(haptic->pwm_dev, delta, haptic->pwm_dev->period);
^
In file included from drivers/input/misc/max77693-haptic.c:23:0:
include/linux/pwm.h:25:5: note: declared here
int pwm_config(struct pwm_device *pwm, int duty_ns,
^
--
drivers/input/misc/max8997_haptic.c: In function 'max8997_haptic_set_duty_cycle':
>> drivers/input/misc/max8997_haptic.c:76:9: error: too few arguments to function 'pwm_config'
ret = pwm_config(chip->pwm, duty, chip->pwm_period);
^
In file included from drivers/input/misc/max8997_haptic.c:29:0:
include/linux/pwm.h:25:5: note: declared here
int pwm_config(struct pwm_device *pwm, int duty_ns,
^
vim +/pwm_config +76 drivers/input/misc/max77693-haptic.c
a3b3ca75 Jaewon Kim 2014-09-11 70
a3b3ca75 Jaewon Kim 2014-09-11 71 static int max77693_haptic_set_duty_cycle(struct max77693_haptic *haptic)
a3b3ca75 Jaewon Kim 2014-09-11 72 {
a3b3ca75 Jaewon Kim 2014-09-11 73 int delta = (haptic->pwm_dev->period + haptic->pwm_duty) / 2;
a3b3ca75 Jaewon Kim 2014-09-11 74 int error;
a3b3ca75 Jaewon Kim 2014-09-11 75
a3b3ca75 Jaewon Kim 2014-09-11 @76 error = pwm_config(haptic->pwm_dev, delta, haptic->pwm_dev->period);
a3b3ca75 Jaewon Kim 2014-09-11 77 if (error) {
a3b3ca75 Jaewon Kim 2014-09-11 78 dev_err(haptic->dev, "failed to configure pwm: %d\n", error);
a3b3ca75 Jaewon Kim 2014-09-11 79 return error;
:::::: The code at line 76 was first introduced by commit
:::::: a3b3ca753cdc92c7d5f57404afed3115b3b79cc6 Input: add haptic driver on max77693
:::::: TO: Jaewon Kim <jaewon02.kim@samsung.com>
:::::: CC: Dmitry Torokhov <dmitry.torokhov@gmail.com>
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
[toc] | [prev] | [next] | [standalone]
| From | kbuild test robot <lkp@intel.com> |
|---|---|
| Date | 2015-10-26 23:20 +0100 |
| Message-ID | <qnYhr-5rl-17@gated-at.bofh.it> |
| In reply to | #1256285 |
[Multipart message — attachments visible in raw view] — view raw
Hi Olliver,
[auto build test WARNING on pwm/for-next -- if it's inappropriate base, please suggest rules for selecting the more suitable base]
url: https://github.com/0day-ci/linux/commits/Olliver-Schinagl/pwm-lpc18xx_pwm-use-pwm_set_chip_data/20151027-053853
config: arm-at91_dt_defconfig (attached as .config)
reproduce:
wget https://git.kernel.org/cgit/linux/kernel/git/wfg/lkp-tests.git/plain/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# save the attached .config to linux build tree
make.cross ARCH=arm
All warnings (new ones prefixed by >>):
>> drivers/pwm/pwm-atmel-tcb.c:359:2: warning: initialization from incompatible pointer type
.config = atmel_tcb_pwm_config,
^
drivers/pwm/pwm-atmel-tcb.c:359:2: warning: (near initialization for 'atmel_tcb_pwm_ops.config')
vim +359 drivers/pwm/pwm-atmel-tcb.c
9421bade Boris BREZILLON 2013-01-08 343 }
9421bade Boris BREZILLON 2013-01-08 344
9421bade Boris BREZILLON 2013-01-08 345 tcbpwm->period = period;
9421bade Boris BREZILLON 2013-01-08 346 tcbpwm->div = i;
9421bade Boris BREZILLON 2013-01-08 347 tcbpwm->duty = duty;
9421bade Boris BREZILLON 2013-01-08 348
9421bade Boris BREZILLON 2013-01-08 349 /* If the PWM is enabled, call enable to apply the new conf */
5c31252c Boris Brezillon 2015-07-01 350 if (pwm_is_enabled(pwm))
9421bade Boris BREZILLON 2013-01-08 351 atmel_tcb_pwm_enable(chip, pwm);
9421bade Boris BREZILLON 2013-01-08 352
9421bade Boris BREZILLON 2013-01-08 353 return 0;
9421bade Boris BREZILLON 2013-01-08 354 }
9421bade Boris BREZILLON 2013-01-08 355
9421bade Boris BREZILLON 2013-01-08 356 static const struct pwm_ops atmel_tcb_pwm_ops = {
9421bade Boris BREZILLON 2013-01-08 357 .request = atmel_tcb_pwm_request,
9421bade Boris BREZILLON 2013-01-08 358 .free = atmel_tcb_pwm_free,
9421bade Boris BREZILLON 2013-01-08 @359 .config = atmel_tcb_pwm_config,
9421bade Boris BREZILLON 2013-01-08 360 .set_polarity = atmel_tcb_pwm_set_polarity,
9421bade Boris BREZILLON 2013-01-08 361 .enable = atmel_tcb_pwm_enable,
9421bade Boris BREZILLON 2013-01-08 362 .disable = atmel_tcb_pwm_disable,
83c80dc5 Axel Lin 2013-03-31 363 .owner = THIS_MODULE,
9421bade Boris BREZILLON 2013-01-08 364 };
9421bade Boris BREZILLON 2013-01-08 365
9421bade Boris BREZILLON 2013-01-08 366 static int atmel_tcb_pwm_probe(struct platform_device *pdev)
9421bade Boris BREZILLON 2013-01-08 367 {
:::::: The code at line 359 was first introduced by commit
:::::: 9421bade0765d8ffb86b8a99213b611278a3542a pwm: atmel: add Timer Counter Block PWM driver
:::::: TO: Boris BREZILLON <linux-arm@overkiz.com>
:::::: CC: Thierry Reding <thierry.reding@avionic-design.de>
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
[toc] | [prev] | [next] | [standalone]
| From | kbuild test robot <lkp@intel.com> |
|---|---|
| Date | 2015-10-27 00:10 +0100 |
| Message-ID | <qnZ3P-5X7-13@gated-at.bofh.it> |
| In reply to | #1256285 |
Hi Olliver,
[auto build test WARNING on pwm/for-next -- if it's inappropriate base, please suggest rules for selecting the more suitable base]
url: https://github.com/0day-ci/linux/commits/Olliver-Schinagl/pwm-lpc18xx_pwm-use-pwm_set_chip_data/20151027-053853
reproduce:
# apt-get install sparse
make ARCH=x86_64 allmodconfig
make C=1 CF=-D__CHECK_ENDIAN__
sparse warnings: (new ones prefixed by >>)
>> drivers/clk/clk-pwm.c:89:25: sparse: not enough arguments for function pwm_config
drivers/clk/clk-pwm.c: In function 'clk_pwm_probe':
drivers/clk/clk-pwm.c:89:8: error: too few arguments to function 'pwm_config'
ret = pwm_config(pwm, (pwm->period + 1) >> 1, pwm->period);
^
In file included from drivers/clk/clk-pwm.c:15:0:
include/linux/pwm.h:25:5: note: declared here
int pwm_config(struct pwm_device *pwm, int duty_ns,
^
--
>> drivers/gpu/drm/i915/intel_panel.c:652:19: sparse: not enough arguments for function pwm_config
drivers/gpu/drm/i915/intel_panel.c:797:19: sparse: not enough arguments for function pwm_config
drivers/gpu/drm/i915/intel_panel.c:1442:28: sparse: not enough arguments for function pwm_config
drivers/gpu/drm/i915/intel_panel.c: In function 'pwm_set_backlight':
drivers/gpu/drm/i915/intel_panel.c:652:2: error: too few arguments to function 'pwm_config'
pwm_config(panel->backlight.pwm, duty_ns, CRC_PMIC_PWM_PERIOD_NS);
^
In file included from drivers/gpu/drm/i915/intel_panel.c:35:0:
include/linux/pwm.h:25:5: note: declared here
int pwm_config(struct pwm_device *pwm, int duty_ns,
^
drivers/gpu/drm/i915/intel_panel.c: In function 'pwm_disable_backlight':
drivers/gpu/drm/i915/intel_panel.c:797:2: error: too few arguments to function 'pwm_config'
pwm_config(panel->backlight.pwm, 0, CRC_PMIC_PWM_PERIOD_NS);
^
In file included from drivers/gpu/drm/i915/intel_panel.c:35:0:
include/linux/pwm.h:25:5: note: declared here
int pwm_config(struct pwm_device *pwm, int duty_ns,
^
drivers/gpu/drm/i915/intel_panel.c: In function 'pwm_setup_backlight':
drivers/gpu/drm/i915/intel_panel.c:1442:11: error: too few arguments to function 'pwm_config'
retval = pwm_config(panel->backlight.pwm, CRC_PMIC_PWM_PERIOD_NS,
^
In file included from drivers/gpu/drm/i915/intel_panel.c:35:0:
include/linux/pwm.h:25:5: note: declared here
int pwm_config(struct pwm_device *pwm, int duty_ns,
^
--
>> drivers/hwmon/pwm-fan.c:51:25: sparse: not enough arguments for function pwm_config
drivers/hwmon/pwm-fan.c:240:25: sparse: not enough arguments for function pwm_config
drivers/hwmon/pwm-fan.c:313:25: sparse: not enough arguments for function pwm_config
drivers/hwmon/pwm-fan.c: In function '__set_pwm':
drivers/hwmon/pwm-fan.c:51:8: error: too few arguments to function 'pwm_config'
ret = pwm_config(ctx->pwm, duty, ctx->pwm->period);
^
In file included from drivers/hwmon/pwm-fan.c:25:0:
include/linux/pwm.h:25:5: note: declared here
int pwm_config(struct pwm_device *pwm, int duty_ns,
^
drivers/hwmon/pwm-fan.c: In function 'pwm_fan_probe':
drivers/hwmon/pwm-fan.c:240:8: error: too few arguments to function 'pwm_config'
ret = pwm_config(ctx->pwm, duty_cycle, ctx->pwm->period);
^
In file included from drivers/hwmon/pwm-fan.c:25:0:
include/linux/pwm.h:25:5: note: declared here
int pwm_config(struct pwm_device *pwm, int duty_ns,
^
drivers/hwmon/pwm-fan.c: In function 'pwm_fan_resume':
drivers/hwmon/pwm-fan.c:313:8: error: too few arguments to function 'pwm_config'
ret = pwm_config(ctx->pwm, duty, ctx->pwm->period);
^
In file included from drivers/hwmon/pwm-fan.c:25:0:
include/linux/pwm.h:25:5: note: declared here
int pwm_config(struct pwm_device *pwm, int duty_ns,
^
--
>> drivers/input/misc/pwm-beeper.c:56:33: sparse: not enough arguments for function pwm_config
drivers/input/misc/pwm-beeper.c:161:27: sparse: not enough arguments for function pwm_config
drivers/input/misc/pwm-beeper.c: In function 'pwm_beeper_event':
drivers/input/misc/pwm-beeper.c:56:9: error: too few arguments to function 'pwm_config'
ret = pwm_config(beeper->pwm, period / 2, period);
^
In file included from drivers/input/misc/pwm-beeper.c:21:0:
include/linux/pwm.h:25:5: note: declared here
int pwm_config(struct pwm_device *pwm, int duty_ns,
^
drivers/input/misc/pwm-beeper.c: In function 'pwm_beeper_resume':
drivers/input/misc/pwm-beeper.c:161:3: error: too few arguments to function 'pwm_config'
pwm_config(beeper->pwm, beeper->period / 2, beeper->period);
^
In file included from drivers/input/misc/pwm-beeper.c:21:0:
include/linux/pwm.h:25:5: note: declared here
int pwm_config(struct pwm_device *pwm, int duty_ns,
^
--
>> drivers/leds/leds-pwm.c:46:19: sparse: not enough arguments for function pwm_config
drivers/leds/leds-pwm.c: In function '__led_pwm_set':
drivers/leds/leds-pwm.c:46:2: error: too few arguments to function 'pwm_config'
pwm_config(led_dat->pwm, new_duty, led_dat->period);
^
In file included from drivers/leds/leds-pwm.c:22:0:
include/linux/pwm.h:25:5: note: declared here
int pwm_config(struct pwm_device *pwm, int duty_ns,
^
--
>> drivers/regulator/pwm-regulator.c:64:25: sparse: not enough arguments for function pwm_config
drivers/regulator/pwm-regulator.c:123:25: sparse: not enough arguments for function pwm_config
drivers/regulator/pwm-regulator.c: In function 'pwm_regulator_set_voltage_sel':
drivers/regulator/pwm-regulator.c:64:8: error: too few arguments to function 'pwm_config'
ret = pwm_config(drvdata->pwm, dutycycle, pwm_reg_period);
^
In file included from drivers/regulator/pwm-regulator.c:22:0:
include/linux/pwm.h:25:5: note: declared here
int pwm_config(struct pwm_device *pwm, int duty_ns,
^
drivers/regulator/pwm-regulator.c: In function 'pwm_regulator_set_voltage':
drivers/regulator/pwm-regulator.c:123:8: error: too few arguments to function 'pwm_config'
ret = pwm_config(drvdata->pwm, (period / 100) * duty_cycle, period);
^
In file included from drivers/regulator/pwm-regulator.c:22:0:
include/linux/pwm.h:25:5: note: declared here
int pwm_config(struct pwm_device *pwm, int duty_ns,
^
--
>> drivers/video/backlight/lm3630a_bl.c:168:19: sparse: not enough arguments for function pwm_config
drivers/video/backlight/lm3630a_bl.c: In function 'lm3630a_pwm_ctrl':
drivers/video/backlight/lm3630a_bl.c:168:2: error: too few arguments to function 'pwm_config'
pwm_config(pchip->pwmd, duty, period);
^
In file included from drivers/video/backlight/lm3630a_bl.c:19:0:
include/linux/pwm.h:25:5: note: declared here
int pwm_config(struct pwm_device *pwm, int duty_ns,
^
--
>> drivers/video/backlight/lp855x_bl.c:251:19: sparse: not enough arguments for function pwm_config
drivers/video/backlight/lp855x_bl.c: In function 'lp855x_pwm_ctrl':
drivers/video/backlight/lp855x_bl.c:251:2: error: too few arguments to function 'pwm_config'
pwm_config(lp->pwm, duty, period);
^
In file included from drivers/video/backlight/lp855x_bl.c:19:0:
include/linux/pwm.h:25:5: note: declared here
int pwm_config(struct pwm_device *pwm, int duty_ns,
^
--
>> drivers/video/backlight/pwm_bl.c:69:19: sparse: not enough arguments for function pwm_config
drivers/video/backlight/pwm_bl.c:108:27: sparse: not enough arguments for function pwm_config
drivers/video/backlight/pwm_bl.c: In function 'pwm_backlight_power_off':
drivers/video/backlight/pwm_bl.c:69:2: error: too few arguments to function 'pwm_config'
pwm_config(pb->pwm, 0, pb->period);
^
In file included from drivers/video/backlight/pwm_bl.c:22:0:
include/linux/pwm.h:25:5: note: declared here
int pwm_config(struct pwm_device *pwm, int duty_ns,
^
drivers/video/backlight/pwm_bl.c: In function 'pwm_backlight_update_status':
drivers/video/backlight/pwm_bl.c:108:3: error: too few arguments to function 'pwm_config'
pwm_config(pb->pwm, duty_cycle, pb->period);
^
In file included from drivers/video/backlight/pwm_bl.c:22:0:
include/linux/pwm.h:25:5: note: declared here
int pwm_config(struct pwm_device *pwm, int duty_ns,
^
--
drivers/video/fbdev/ssd1307fb.c:150:29: sparse: incorrect type in initializer (different address spaces)
drivers/video/fbdev/ssd1307fb.c:150:29: expected unsigned char [usertype] *vmem
drivers/video/fbdev/ssd1307fb.c:150:29: got char [noderef] <asn:2>*screen_base
drivers/video/fbdev/ssd1307fb.c:226:13: sparse: incorrect type in assignment (different address spaces)
drivers/video/fbdev/ssd1307fb.c:226:13: expected unsigned char [noderef] [usertype] <asn:2>*dst
drivers/video/fbdev/ssd1307fb.c:226:13: got void *<noident>
drivers/video/fbdev/ssd1307fb.c:228:28: sparse: incorrect type in argument 1 (different address spaces)
drivers/video/fbdev/ssd1307fb.c:228:28: expected void *to
drivers/video/fbdev/ssd1307fb.c:228:28: got unsigned char [noderef] [usertype] <asn:2>*dst
>> drivers/video/fbdev/ssd1307fb.c:299:27: sparse: not enough arguments for function pwm_config
drivers/video/fbdev/ssd1307fb.c: In function 'ssd1307fb_init':
drivers/video/fbdev/ssd1307fb.c:299:3: error: too few arguments to function 'pwm_config'
pwm_config(par->pwm, par->pwm_period / 2, par->pwm_period);
^
In file included from drivers/video/fbdev/ssd1307fb.c:17:0:
include/linux/pwm.h:25:5: note: declared here
int pwm_config(struct pwm_device *pwm, int duty_ns,
^
vim +89 drivers/clk/clk-pwm.c
9a74ccdb Philipp Zabel 2015-02-13 73
9a74ccdb Philipp Zabel 2015-02-13 74 if (!pwm->period) {
9a74ccdb Philipp Zabel 2015-02-13 75 dev_err(&pdev->dev, "invalid PWM period\n");
9a74ccdb Philipp Zabel 2015-02-13 76 return -EINVAL;
9a74ccdb Philipp Zabel 2015-02-13 77 }
9a74ccdb Philipp Zabel 2015-02-13 78
9a74ccdb Philipp Zabel 2015-02-13 79 if (of_property_read_u32(node, "clock-frequency", &clk_pwm->fixed_rate))
9a74ccdb Philipp Zabel 2015-02-13 80 clk_pwm->fixed_rate = NSEC_PER_SEC / pwm->period;
9a74ccdb Philipp Zabel 2015-02-13 81
9a74ccdb Philipp Zabel 2015-02-13 82 if (pwm->period != NSEC_PER_SEC / clk_pwm->fixed_rate &&
9a74ccdb Philipp Zabel 2015-02-13 83 pwm->period != DIV_ROUND_UP(NSEC_PER_SEC, clk_pwm->fixed_rate)) {
9a74ccdb Philipp Zabel 2015-02-13 84 dev_err(&pdev->dev,
9a74ccdb Philipp Zabel 2015-02-13 85 "clock-frequency does not match PWM period\n");
9a74ccdb Philipp Zabel 2015-02-13 86 return -EINVAL;
9a74ccdb Philipp Zabel 2015-02-13 87 }
9a74ccdb Philipp Zabel 2015-02-13 88
9a74ccdb Philipp Zabel 2015-02-13 @89 ret = pwm_config(pwm, (pwm->period + 1) >> 1, pwm->period);
9a74ccdb Philipp Zabel 2015-02-13 90 if (ret < 0)
9a74ccdb Philipp Zabel 2015-02-13 91 return ret;
9a74ccdb Philipp Zabel 2015-02-13 92
9a74ccdb Philipp Zabel 2015-02-13 93 clk_name = node->name;
9a74ccdb Philipp Zabel 2015-02-13 94 of_property_read_string(node, "clock-output-names", &clk_name);
9a74ccdb Philipp Zabel 2015-02-13 95
9a74ccdb Philipp Zabel 2015-02-13 96 init.name = clk_name;
9a74ccdb Philipp Zabel 2015-02-13 97 init.ops = &clk_pwm_ops;
:::::: The code at line 89 was first introduced by commit
:::::: 9a74ccdbbb8fa6302ae1ba606f2ef0c03d3242ab clk: Add PWM clock driver
:::::: TO: Philipp Zabel <p.zabel@pengutronix.de>
:::::: CC: Michael Turquette <mturquette@linaro.org>
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web