On Wed, Jan 01, 2014 at 07:43:41AM +0400, Alexander Shiyan wrote: > Add a new driver for the PWM controllers on the CLPS711X platform > based on the PWM framework.
I think you can drop the last part ("based on the PWM framework") of
that sentence. Perhaps a good idea would be to mention some of the
peculiarities of this controller (supports two channels, only 4 bits
specifying the duty-cycle, fixed period, ...).
> diff --git a/Documentation/devicetree/bindings/pwm/cirrus-clps711x-pwm.txt
> b/Documentation/devicetree/bindings/pwm/cirrus-clps711x-pwm.txt
> new file mode 100644
> index 0000000..4caf819
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/pwm/cirrus-clps711x-pwm.txt
> @@ -0,0 +1,16 @@
> +* Cirris Logic CLPS711X PWM controller
> +
> +Required properties:
> +- compatible: Should be "cirrus,clps711x-pwm".
> +- reg: Physical base address and length of the controller's registers.
> +- clocks: Phandle to the PWM source clock.
"phandle"
> +- #pwm-cells: Should be 1. See pwm.txt in this directory for a description of
> + the cells format.
Perhaps in this case it would be easier to simply mention that the cell
specifies the index of the channel. pwm.txt isn't explicit about what a
specifier of size 1 looks like (although it is sort of implied).
> diff --git a/drivers/pwm/pwm-clps711x.c b/drivers/pwm/pwm-clps711x.c
[...]
> +struct clps711x_chip {
> + struct pwm_chip chip;
> + struct clk *clk;
> + void __iomem *pmpcon;
> + spinlock_t lock;
> +};
I'd prefer this to not use this artificial alignment using tabs. Simply
a single space after the type is good enough.
> +static int clps711x_pwm_request(struct pwm_chip *chip, struct pwm_device
> *pwm)
> +{
> + struct clps711x_chip *priv =
> + container_of(chip, struct clps711x_chip, chip);
This should be wrapped into a static inline function to make it shorter:
static inline to_clps711x(struct pwm_chip *chip)
{
return container_of(chip, struct clps711x_chip, chip);
}
> + unsigned int period, freq = clk_get_rate(priv->clk);
> +
> + if (!freq)
> + return -EINVAL;
> +
> + /* Calculate and store constant period value */
> + period = DIV_ROUND_CLOSEST(NSEC_PER_SEC, freq);
> + pwm_set_period(pwm, period);
> + pwm_set_chip_data(pwm, (void *)(uintptr_t)period);
Why store this in chip data again if it can be retrieved directly from
the PWM device using pwm_get_period()?
> +static int clps711x_pwm_enable(struct pwm_chip *chip, struct pwm_device *pwm)
> +{
> + /* Do nothing */
> + return 0;
> +}
> +
> +static void clps711x_pwm_disable(struct pwm_chip *chip, struct pwm_device
> *pwm)
> +{
> + /* Do nothing */
> +}
I think it would be better if this would set the duty field to 0 to stop
any potential toggling of the PWM signal. .enable() can later restore
the proper value.
The reason for this is that pwm_disable() is supposed to stop the PWM
output from toggling and if you simply ignore it you don't conform to
the API specification.
> +static const struct pwm_ops clps711x_pwm_ops = {
> + .request = clps711x_pwm_request,
> + .config = clps711x_pwm_config,
> + .enable = clps711x_pwm_enable,
> + .disable = clps711x_pwm_disable,
> + .owner = THIS_MODULE,
> +};
Please drop the alignment here as well.
> +static const struct of_device_id __maybe_unused clps711x_pwm_dt_ids[] = {
I don't think there's concensus on the proper placement, but I prefer
__maybe_unused to be at the very end of the declaration.
> +static struct platform_driver clps711x_pwm_driver = {
> + .driver = {
> + .name = "clps711x-pwm",
> + .owner = THIS_MODULE,
> + .of_match_table = of_match_ptr(clps711x_pwm_dt_ids),
> + },
> + .probe = clps711x_pwm_probe,
> + .remove = clps711x_pwm_remove,
> +};
> +module_platform_driver(clps711x_pwm_driver);
And again, no alignment of the fields here, please.
Thierry
pgpn2aXUzRLKM.pgp
Description: PGP signature
