RE: [PATCHv2 1/4] pwm: Add Freescale FTM PWM driver support

2013-09-03 Thread Xiubo Li-B47053
> Subject: Re: [PATCHv2 1/4] pwm: Add Freescale FTM PWM driver support
> 
> On Tue, Sep 03, 2013 at 04:17:09AM +, Xiubo Li-B47053 wrote:
> > > Subject: Re: [PATCHv2 1/4] pwm: Add Freescale FTM PWM driver support
> > >
> > > You simply don't need the available field. You don't need to track
> > > whether they are available. If a user enables a pwm which is not
> > > routed out of the SoC (disabled in the iomux) simply nothing will
> > > happen except for a slightly increased power consumption.
> > >
> > If the there is not need to explicitly specify the channels are
> > available or not, so there is no doubt that the 'available' field will
> > be dropt.  Why I added this here is because that the 4th and 5th
> > channels' pinctrls are used as UART TX and RX as I have mentioned
> > before, so here if you configure these two pinctrls, the UART TX and
> > RX will be polluted, there maybe some other cases like this.
> 
> If you misconfigure your iomux then usually unexptected things happen.
> That is not the problem of the PWM driver, but the problem of the one
> writing the devicetree. The kernel will print a message for conflicting
> iomux settings. That should be hint enough to fix it.
> 

That sounds good.
Actully there isn't any conflicting messages will be printed.

I will think it over.


--
Best Regards,
Xiubo 

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCHv2 1/4] pwm: Add Freescale FTM PWM driver support

2013-09-03 Thread Sascha Hauer
On Tue, Sep 03, 2013 at 04:17:09AM +, Xiubo Li-B47053 wrote:
> > Subject: Re: [PATCHv2 1/4] pwm: Add Freescale FTM PWM driver support
> > 
> > You simply don't need the available field. You don't need to track
> > whether they are available. If a user enables a pwm which is not routed
> > out of the SoC (disabled in the iomux) simply nothing will happen except
> > for a slightly increased power consumption.
> > 
> If the there is not need to explicitly specify the channels are
> available or not, so there is no doubt that the 'available' field will
> be dropt.  Why I added this here is because that the 4th and 5th
> channels' pinctrls are used as UART TX and RX as I have mentioned
> before, so here if you configure these two pinctrls, the UART TX and
> RX will be polluted, there maybe some other cases like this.

If you misconfigure your iomux then usually unexptected things happen.
That is not the problem of the PWM driver, but the problem of the one
writing the devicetree. The kernel will print a message for conflicting
iomux settings. That should be hint enough to fix it.

Sascha

-- 
Pengutronix e.K.   | |
Industrial Linux Solutions | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0|
Amtsgericht Hildesheim, HRA 2686   | Fax:   +49-5121-206917- |
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCHv2 1/4] pwm: Add Freescale FTM PWM driver support

2013-09-03 Thread Sascha Hauer
On Tue, Sep 03, 2013 at 04:17:09AM +, Xiubo Li-B47053 wrote:
  Subject: Re: [PATCHv2 1/4] pwm: Add Freescale FTM PWM driver support
  
  You simply don't need the available field. You don't need to track
  whether they are available. If a user enables a pwm which is not routed
  out of the SoC (disabled in the iomux) simply nothing will happen except
  for a slightly increased power consumption.
  
 If the there is not need to explicitly specify the channels are
 available or not, so there is no doubt that the 'available' field will
 be dropt.  Why I added this here is because that the 4th and 5th
 channels' pinctrls are used as UART TX and RX as I have mentioned
 before, so here if you configure these two pinctrls, the UART TX and
 RX will be polluted, there maybe some other cases like this.

If you misconfigure your iomux then usually unexptected things happen.
That is not the problem of the PWM driver, but the problem of the one
writing the devicetree. The kernel will print a message for conflicting
iomux settings. That should be hint enough to fix it.

Sascha

-- 
Pengutronix e.K.   | |
Industrial Linux Solutions | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0|
Amtsgericht Hildesheim, HRA 2686   | Fax:   +49-5121-206917- |
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


RE: [PATCHv2 1/4] pwm: Add Freescale FTM PWM driver support

2013-09-03 Thread Xiubo Li-B47053
 Subject: Re: [PATCHv2 1/4] pwm: Add Freescale FTM PWM driver support
 
 On Tue, Sep 03, 2013 at 04:17:09AM +, Xiubo Li-B47053 wrote:
   Subject: Re: [PATCHv2 1/4] pwm: Add Freescale FTM PWM driver support
  
   You simply don't need the available field. You don't need to track
   whether they are available. If a user enables a pwm which is not
   routed out of the SoC (disabled in the iomux) simply nothing will
   happen except for a slightly increased power consumption.
  
  If the there is not need to explicitly specify the channels are
  available or not, so there is no doubt that the 'available' field will
  be dropt.  Why I added this here is because that the 4th and 5th
  channels' pinctrls are used as UART TX and RX as I have mentioned
  before, so here if you configure these two pinctrls, the UART TX and
  RX will be polluted, there maybe some other cases like this.
 
 If you misconfigure your iomux then usually unexptected things happen.
 That is not the problem of the PWM driver, but the problem of the one
 writing the devicetree. The kernel will print a message for conflicting
 iomux settings. That should be hint enough to fix it.
 

That sounds good.
Actully there isn't any conflicting messages will be printed.

I will think it over.


--
Best Regards,
Xiubo 

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


RE: [PATCHv2 1/4] pwm: Add Freescale FTM PWM driver support

2013-09-02 Thread Xiubo Li-B47053
> Subject: Re: [PATCHv2 1/4] pwm: Add Freescale FTM PWM driver support
> 
> On Mon, Sep 02, 2013 at 03:33:37AM +, Xiubo Li-B47053 wrote:
> >
> > > > +static void fsl_pwm_free(struct pwm_chip *chip, struct pwm_device
> > > > +*pwm) {
> > > > +   struct fsl_pwm_chip *fpc;
> > > > +   struct fsl_pwm_data *pwm_data;
> > > > +
> > > > +   fpc = to_fsl_chip(chip);
> > > > +
> > > > +   pwm_data = pwm_get_chip_data(pwm);
> > > > +   if (!pwm_data)
> > > > +   return;
> > >
> > > THis check seems unnecessary.
> > >
> >
> > But if do not check it here, I must check it in the following code.
> >
> > > > +
> > > > +   if (pwm_data->available != FSL_AVAILABLE)
> > > > +   return;
> > > > +
> >
> > So the ' struct fsl_pwm_data' may be removed in the future.
> >
> > >
> > > > +
> > > > +
> > > > +   pwm_data->period_cycles = period_cycles;
> > > > +   pwm_data->duty_cycles = duty_cycles;
> > >
> > > These fields are set but never read. Please drop them.
> > >
> > > If you drop the 'available' field also the you can drop chip_data
> > > completely.
> > >
> >
> > I think I may move the 'available' field to the PWM driver data struct.
> 
> You simply don't need the available field. You don't need to track
> whether they are available. If a user enables a pwm which is not routed
> out of the SoC (disabled in the iomux) simply nothing will happen except
> for a slightly increased power consumption.
> 
If the there is not need to explicitly specify the channels are available or 
not, so there is no doubt that the 'available' field will be dropt.
Why I added this here is because that the 4th and 5th channels' pinctrls are 
used as UART TX and RX as I have mentioned before, so here if you configure 
these two pinctrls, the UART TX and RX will be polluted, there maybe some other 
cases like this.
So, if there is no need to worry about this in PWM driver, the customer should 
be aware of it and be responsible for the potential risk.
I will think it over and optimize it then.



Thanks very much.
--
Best Regards.
Xiubo





--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCHv2 1/4] pwm: Add Freescale FTM PWM driver support

2013-09-02 Thread Sascha Hauer
On Mon, Sep 02, 2013 at 03:33:37AM +, Xiubo Li-B47053 wrote:
> 
> > > +static void fsl_pwm_free(struct pwm_chip *chip, struct pwm_device
> > > +*pwm) {
> > > + struct fsl_pwm_chip *fpc;
> > > + struct fsl_pwm_data *pwm_data;
> > > +
> > > + fpc = to_fsl_chip(chip);
> > > +
> > > + pwm_data = pwm_get_chip_data(pwm);
> > > + if (!pwm_data)
> > > + return;
> > 
> > THis check seems unnecessary.
> > 
> 
> But if do not check it here, I must check it in the following code.
> 
> > > +
> > > + if (pwm_data->available != FSL_AVAILABLE)
> > > + return;
> > > +
> 
> So the ' struct fsl_pwm_data' may be removed in the future.
> 
> > 
> > > +
> > > +
> > > + pwm_data->period_cycles = period_cycles;
> > > + pwm_data->duty_cycles = duty_cycles;
> > 
> > These fields are set but never read. Please drop them.
> > 
> > If you drop the 'available' field also the you can drop chip_data
> > completely.
> > 
> 
> I think I may move the 'available' field to the PWM driver data struct.

You simply don't need the available field. You don't need to track
whether they are available. If a user enables a pwm which is not routed
out of the SoC (disabled in the iomux) simply nothing will happen except
for a slightly increased power consumption.

Sascha


-- 
Pengutronix e.K.   | |
Industrial Linux Solutions | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0|
Amtsgericht Hildesheim, HRA 2686   | Fax:   +49-5121-206917- |
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCHv2 1/4] pwm: Add Freescale FTM PWM driver support

2013-09-02 Thread Sascha Hauer
On Mon, Sep 02, 2013 at 03:33:37AM +, Xiubo Li-B47053 wrote:
 
   +static void fsl_pwm_free(struct pwm_chip *chip, struct pwm_device
   +*pwm) {
   + struct fsl_pwm_chip *fpc;
   + struct fsl_pwm_data *pwm_data;
   +
   + fpc = to_fsl_chip(chip);
   +
   + pwm_data = pwm_get_chip_data(pwm);
   + if (!pwm_data)
   + return;
  
  THis check seems unnecessary.
  
 
 But if do not check it here, I must check it in the following code.
 
   +
   + if (pwm_data-available != FSL_AVAILABLE)
   + return;
   +
 
 So the ' struct fsl_pwm_data' may be removed in the future.
 
  
   +
   +
   + pwm_data-period_cycles = period_cycles;
   + pwm_data-duty_cycles = duty_cycles;
  
  These fields are set but never read. Please drop them.
  
  If you drop the 'available' field also the you can drop chip_data
  completely.
  
 
 I think I may move the 'available' field to the PWM driver data struct.

You simply don't need the available field. You don't need to track
whether they are available. If a user enables a pwm which is not routed
out of the SoC (disabled in the iomux) simply nothing will happen except
for a slightly increased power consumption.

Sascha


-- 
Pengutronix e.K.   | |
Industrial Linux Solutions | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0|
Amtsgericht Hildesheim, HRA 2686   | Fax:   +49-5121-206917- |
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


RE: [PATCHv2 1/4] pwm: Add Freescale FTM PWM driver support

2013-09-02 Thread Xiubo Li-B47053
 Subject: Re: [PATCHv2 1/4] pwm: Add Freescale FTM PWM driver support
 
 On Mon, Sep 02, 2013 at 03:33:37AM +, Xiubo Li-B47053 wrote:
 
+static void fsl_pwm_free(struct pwm_chip *chip, struct pwm_device
+*pwm) {
+   struct fsl_pwm_chip *fpc;
+   struct fsl_pwm_data *pwm_data;
+
+   fpc = to_fsl_chip(chip);
+
+   pwm_data = pwm_get_chip_data(pwm);
+   if (!pwm_data)
+   return;
  
   THis check seems unnecessary.
  
 
  But if do not check it here, I must check it in the following code.
 
+
+   if (pwm_data-available != FSL_AVAILABLE)
+   return;
+
 
  So the ' struct fsl_pwm_data' may be removed in the future.
 
  
+
+
+   pwm_data-period_cycles = period_cycles;
+   pwm_data-duty_cycles = duty_cycles;
  
   These fields are set but never read. Please drop them.
  
   If you drop the 'available' field also the you can drop chip_data
   completely.
  
 
  I think I may move the 'available' field to the PWM driver data struct.
 
 You simply don't need the available field. You don't need to track
 whether they are available. If a user enables a pwm which is not routed
 out of the SoC (disabled in the iomux) simply nothing will happen except
 for a slightly increased power consumption.
 
If the there is not need to explicitly specify the channels are available or 
not, so there is no doubt that the 'available' field will be dropt.
Why I added this here is because that the 4th and 5th channels' pinctrls are 
used as UART TX and RX as I have mentioned before, so here if you configure 
these two pinctrls, the UART TX and RX will be polluted, there maybe some other 
cases like this.
So, if there is no need to worry about this in PWM driver, the customer should 
be aware of it and be responsible for the potential risk.
I will think it over and optimize it then.



Thanks very much.
--
Best Regards.
Xiubo





--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


RE: [PATCHv2 1/4] pwm: Add Freescale FTM PWM driver support

2013-09-01 Thread Xiubo Li-B47053

> > +static void fsl_pwm_free(struct pwm_chip *chip, struct pwm_device
> > +*pwm) {
> > +   struct fsl_pwm_chip *fpc;
> > +   struct fsl_pwm_data *pwm_data;
> > +
> > +   fpc = to_fsl_chip(chip);
> > +
> > +   pwm_data = pwm_get_chip_data(pwm);
> > +   if (!pwm_data)
> > +   return;
> 
> THis check seems unnecessary.
> 

But if do not check it here, I must check it in the following code.

> > +
> > +   if (pwm_data->available != FSL_AVAILABLE)
> > +   return;
> > +

So the ' struct fsl_pwm_data' may be removed in the future.

> 
> > +
> > +
> > +   pwm_data->period_cycles = period_cycles;
> > +   pwm_data->duty_cycles = duty_cycles;
> 
> These fields are set but never read. Please drop them.
> 
> If you drop the 'available' field also the you can drop chip_data
> completely.
> 

I think I may move the 'available' field to the PWM driver data struct.

> > +
> > +   writel(FTMCnSC_MSB | FTMCnSC_ELSB, fpc->base + FTM_CSC(pwm->hwpwm));
> > +
> > +   writel(0xF0, fpc->base + FTM_OUTMASK);
> > +   writel(0x0F, fpc->base + FTM_OUTINIT);
> > +   writel(FTM_CNTIN_VAL, fpc->base + FTM_CNTIN);
> > +
> > +   writel(period_cycles + cntin - 1, fpc->base + FTM_MOD);
> > +   writel(duty_cycles + cntin, fpc->base + FTM_CV(pwm->hwpwm));
> > +
> > +   return 0;
> > +}
> > +
> > +static int fsl_pwm_set_polarity(struct pwm_chip *chip, struct
> pwm_device *pwm,
> > +   enum pwm_polarity polarity)
> > +{
> > +   unsigned long reg;
> > +   struct fsl_pwm_data *pwm_data;
> > +   struct fsl_pwm_chip *fpc;
> > +
> > +   fpc = to_fsl_chip(chip);
> > +
> > +   pwm_data = pwm_get_chip_data(pwm);
> > +   if (!pwm_data)
> > +   return -EINVAL;
> > +
> > +   if (pwm_data->available != FSL_AVAILABLE)
> > +   return -EINVAL;
> > +
> > +   reg = readl(fpc->base + FTM_POL);
> > +   reg &= ~BIT(pwm->hwpwm);
> 
> Either drop this line...
> 

This is just for unmasking this bit field.
Here it's not needed, so I will revise it.

> > +   if (polarity == PWM_POLARITY_INVERSED)
> > +   reg |= BIT(pwm->hwpwm);
> > +   else
> > +   reg &= ~BIT(pwm->hwpwm);
> 
> ...or this one
> 

> > +static int fsl_pwm_enable(struct pwm_chip *chip, struct pwm_device
> > +*pwm) {
> > +   int ret;
> > +   struct fsl_pwm_chip *fpc;
> > +   struct pinctrl_state *pins_state;
> > +   struct fsl_pwm_data *pwm_data;
> > +   const char *statename;
> > +
> > +   fpc = to_fsl_chip(chip);
> > +
> > +   pwm_data = pwm_get_chip_data(pwm);
> > +   if (!pwm_data)
> > +   return -EINVAL;
> > +
> > +   if (pwm_data->available != FSL_AVAILABLE)
> > +   return -EINVAL;
> > +
> > +   statename = kasprintf(GFP_KERNEL, "ch%d-active", pwm->hwpwm);
> 
> You loose memory here and in fsl_pwm_disable aswell.
> 

Yes, I will revise it.

> > +   pins_state = pinctrl_lookup_state(fpc->pinctrl,
> > +   statename);
> > +   /* enable pins to be muxed in and configured */
> > +   if (!IS_ERR(pins_state)) {
> > +   ret = pinctrl_select_state(fpc->pinctrl, pins_state);
> > +   if (ret)
> > +   dev_warn(chip->dev, "could not set default pins\n");
> > +   } else
> > +   dev_warn(chip->dev, "could not get default pinstate\n");
> 
> Either it's ok to do without pinctrl or it's not ok, so either return an
> error or drop the warnings. Polluting the kernel log with such messages
> from a frequently called function is not a good idea.
> 

Well, I will just print out some error logs and return the error.

--
Best Regards.
Xiubo

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


RE: [PATCHv2 1/4] pwm: Add Freescale FTM PWM driver support

2013-09-01 Thread Xiubo Li-B47053

  +static void fsl_pwm_free(struct pwm_chip *chip, struct pwm_device
  +*pwm) {
  +   struct fsl_pwm_chip *fpc;
  +   struct fsl_pwm_data *pwm_data;
  +
  +   fpc = to_fsl_chip(chip);
  +
  +   pwm_data = pwm_get_chip_data(pwm);
  +   if (!pwm_data)
  +   return;
 
 THis check seems unnecessary.
 

But if do not check it here, I must check it in the following code.

  +
  +   if (pwm_data-available != FSL_AVAILABLE)
  +   return;
  +

So the ' struct fsl_pwm_data' may be removed in the future.

 
  +
  +
  +   pwm_data-period_cycles = period_cycles;
  +   pwm_data-duty_cycles = duty_cycles;
 
 These fields are set but never read. Please drop them.
 
 If you drop the 'available' field also the you can drop chip_data
 completely.
 

I think I may move the 'available' field to the PWM driver data struct.

  +
  +   writel(FTMCnSC_MSB | FTMCnSC_ELSB, fpc-base + FTM_CSC(pwm-hwpwm));
  +
  +   writel(0xF0, fpc-base + FTM_OUTMASK);
  +   writel(0x0F, fpc-base + FTM_OUTINIT);
  +   writel(FTM_CNTIN_VAL, fpc-base + FTM_CNTIN);
  +
  +   writel(period_cycles + cntin - 1, fpc-base + FTM_MOD);
  +   writel(duty_cycles + cntin, fpc-base + FTM_CV(pwm-hwpwm));
  +
  +   return 0;
  +}
  +
  +static int fsl_pwm_set_polarity(struct pwm_chip *chip, struct
 pwm_device *pwm,
  +   enum pwm_polarity polarity)
  +{
  +   unsigned long reg;
  +   struct fsl_pwm_data *pwm_data;
  +   struct fsl_pwm_chip *fpc;
  +
  +   fpc = to_fsl_chip(chip);
  +
  +   pwm_data = pwm_get_chip_data(pwm);
  +   if (!pwm_data)
  +   return -EINVAL;
  +
  +   if (pwm_data-available != FSL_AVAILABLE)
  +   return -EINVAL;
  +
  +   reg = readl(fpc-base + FTM_POL);
  +   reg = ~BIT(pwm-hwpwm);
 
 Either drop this line...
 

This is just for unmasking this bit field.
Here it's not needed, so I will revise it.

  +   if (polarity == PWM_POLARITY_INVERSED)
  +   reg |= BIT(pwm-hwpwm);
  +   else
  +   reg = ~BIT(pwm-hwpwm);
 
 ...or this one
 

  +static int fsl_pwm_enable(struct pwm_chip *chip, struct pwm_device
  +*pwm) {
  +   int ret;
  +   struct fsl_pwm_chip *fpc;
  +   struct pinctrl_state *pins_state;
  +   struct fsl_pwm_data *pwm_data;
  +   const char *statename;
  +
  +   fpc = to_fsl_chip(chip);
  +
  +   pwm_data = pwm_get_chip_data(pwm);
  +   if (!pwm_data)
  +   return -EINVAL;
  +
  +   if (pwm_data-available != FSL_AVAILABLE)
  +   return -EINVAL;
  +
  +   statename = kasprintf(GFP_KERNEL, ch%d-active, pwm-hwpwm);
 
 You loose memory here and in fsl_pwm_disable aswell.
 

Yes, I will revise it.

  +   pins_state = pinctrl_lookup_state(fpc-pinctrl,
  +   statename);
  +   /* enable pins to be muxed in and configured */
  +   if (!IS_ERR(pins_state)) {
  +   ret = pinctrl_select_state(fpc-pinctrl, pins_state);
  +   if (ret)
  +   dev_warn(chip-dev, could not set default pins\n);
  +   } else
  +   dev_warn(chip-dev, could not get default pinstate\n);
 
 Either it's ok to do without pinctrl or it's not ok, so either return an
 error or drop the warnings. Polluting the kernel log with such messages
 from a frequently called function is not a good idea.
 

Well, I will just print out some error logs and return the error.

--
Best Regards.
Xiubo

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCHv2 1/4] pwm: Add Freescale FTM PWM driver support

2013-08-30 Thread Sascha Hauer
On Fri, Aug 30, 2013 at 05:48:49PM +0800, Xiubo Li wrote:
> +
> +#define FTM_CSC_BASE0x0C
> +#define FTM_CSC(_channel) \
> + (FTM_CSC_BASE + ((_channel) * 8))

Put into a single line.

> +#define FTMCnSC_MSB BIT(5)
> +#define FTMCnSC_MSA BIT(4)
> +#define FTMCnSC_ELSBBIT(3)
> +#define FTMCnSC_ELSABIT(2)
> +
> +#define FTM_CV_BASE 0x10
> +#define FTM_CV(_channel) \
> + (FTM_CV_BASE + ((_channel) * 8))

ditto.

> +static int fsl_pwm_request(struct pwm_chip *chip, struct pwm_device *pwm)
> +{
> + int ret;
> + struct fsl_pwm_chip *fpc;
> + struct fsl_pwm_data *pwm_data;
> +
> + fpc = to_fsl_chip(chip);
> +
> + pwm_data = pwm_get_chip_data(pwm);
> + if (!pwm_data)
> + return -EINVAL;
> +
> + if (pwm_data->available != FSL_AVAILABLE)
> + return -EINVAL;
> +
> + ret = clk_enable(fpc->sys_clk);
> + if (ret)
> + return ret;

This is non atomic context. You can also prepare the clocks here instead
of doing it in probe().

> +
> + return 0;
> +}
> +
> +static void fsl_pwm_free(struct pwm_chip *chip, struct pwm_device *pwm)
> +{
> + struct fsl_pwm_chip *fpc;
> + struct fsl_pwm_data *pwm_data;
> +
> + fpc = to_fsl_chip(chip);
> +
> + pwm_data = pwm_get_chip_data(pwm);
> + if (!pwm_data)
> + return;

THis check seems unnecessary.

> +
> + if (pwm_data->available != FSL_AVAILABLE)
> + return;
> +
> + clk_disable(fpc->sys_clk);
> +}
> +

[...]

> +
> +
> + pwm_data->period_cycles = period_cycles;
> + pwm_data->duty_cycles = duty_cycles;

These fields are set but never read. Please drop them.

If you drop the 'available' field also the you can drop chip_data
completely.

> +
> + writel(FTMCnSC_MSB | FTMCnSC_ELSB, fpc->base + FTM_CSC(pwm->hwpwm));
> +
> + writel(0xF0, fpc->base + FTM_OUTMASK);
> + writel(0x0F, fpc->base + FTM_OUTINIT);
> + writel(FTM_CNTIN_VAL, fpc->base + FTM_CNTIN);
> +
> + writel(period_cycles + cntin - 1, fpc->base + FTM_MOD);
> + writel(duty_cycles + cntin, fpc->base + FTM_CV(pwm->hwpwm));
> +
> + return 0;
> +}
> +
> +static int fsl_pwm_set_polarity(struct pwm_chip *chip, struct pwm_device 
> *pwm,
> + enum pwm_polarity polarity)
> +{
> + unsigned long reg;
> + struct fsl_pwm_data *pwm_data;
> + struct fsl_pwm_chip *fpc;
> +
> + fpc = to_fsl_chip(chip);
> +
> + pwm_data = pwm_get_chip_data(pwm);
> + if (!pwm_data)
> + return -EINVAL;
> +
> + if (pwm_data->available != FSL_AVAILABLE)
> + return -EINVAL;
> +
> + reg = readl(fpc->base + FTM_POL);
> + reg &= ~BIT(pwm->hwpwm);

Either drop this line...

> + if (polarity == PWM_POLARITY_INVERSED)
> + reg |= BIT(pwm->hwpwm);
> + else
> + reg &= ~BIT(pwm->hwpwm);

...or this one

> +static int fsl_pwm_enable(struct pwm_chip *chip, struct pwm_device *pwm)
> +{
> + int ret;
> + struct fsl_pwm_chip *fpc;
> + struct pinctrl_state *pins_state;
> + struct fsl_pwm_data *pwm_data;
> + const char *statename;
> +
> + fpc = to_fsl_chip(chip);
> +
> + pwm_data = pwm_get_chip_data(pwm);
> + if (!pwm_data)
> + return -EINVAL;
> +
> + if (pwm_data->available != FSL_AVAILABLE)
> + return -EINVAL;
> +
> + statename = kasprintf(GFP_KERNEL, "ch%d-active", pwm->hwpwm);

You loose memory here and in fsl_pwm_disable aswell.

> + pins_state = pinctrl_lookup_state(fpc->pinctrl,
> + statename);
> + /* enable pins to be muxed in and configured */
> + if (!IS_ERR(pins_state)) {
> + ret = pinctrl_select_state(fpc->pinctrl, pins_state);
> + if (ret)
> + dev_warn(chip->dev, "could not set default pins\n");
> + } else
> + dev_warn(chip->dev, "could not get default pinstate\n");

Either it's ok to do without pinctrl or it's not ok, so either return
an error or drop the warnings. Polluting the kernel log with such
messages from a frequently called function is not a good idea.

Sascha

-- 
Pengutronix e.K.   | |
Industrial Linux Solutions | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0|
Amtsgericht Hildesheim, HRA 2686   | Fax:   +49-5121-206917- |
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCHv2 1/4] pwm: Add Freescale FTM PWM driver support

2013-08-30 Thread Sascha Hauer
On Fri, Aug 30, 2013 at 05:48:49PM +0800, Xiubo Li wrote:
 +
 +#define FTM_CSC_BASE0x0C
 +#define FTM_CSC(_channel) \
 + (FTM_CSC_BASE + ((_channel) * 8))

Put into a single line.

 +#define FTMCnSC_MSB BIT(5)
 +#define FTMCnSC_MSA BIT(4)
 +#define FTMCnSC_ELSBBIT(3)
 +#define FTMCnSC_ELSABIT(2)
 +
 +#define FTM_CV_BASE 0x10
 +#define FTM_CV(_channel) \
 + (FTM_CV_BASE + ((_channel) * 8))

ditto.

 +static int fsl_pwm_request(struct pwm_chip *chip, struct pwm_device *pwm)
 +{
 + int ret;
 + struct fsl_pwm_chip *fpc;
 + struct fsl_pwm_data *pwm_data;
 +
 + fpc = to_fsl_chip(chip);
 +
 + pwm_data = pwm_get_chip_data(pwm);
 + if (!pwm_data)
 + return -EINVAL;
 +
 + if (pwm_data-available != FSL_AVAILABLE)
 + return -EINVAL;
 +
 + ret = clk_enable(fpc-sys_clk);
 + if (ret)
 + return ret;

This is non atomic context. You can also prepare the clocks here instead
of doing it in probe().

 +
 + return 0;
 +}
 +
 +static void fsl_pwm_free(struct pwm_chip *chip, struct pwm_device *pwm)
 +{
 + struct fsl_pwm_chip *fpc;
 + struct fsl_pwm_data *pwm_data;
 +
 + fpc = to_fsl_chip(chip);
 +
 + pwm_data = pwm_get_chip_data(pwm);
 + if (!pwm_data)
 + return;

THis check seems unnecessary.

 +
 + if (pwm_data-available != FSL_AVAILABLE)
 + return;
 +
 + clk_disable(fpc-sys_clk);
 +}
 +

[...]

 +
 +
 + pwm_data-period_cycles = period_cycles;
 + pwm_data-duty_cycles = duty_cycles;

These fields are set but never read. Please drop them.

If you drop the 'available' field also the you can drop chip_data
completely.

 +
 + writel(FTMCnSC_MSB | FTMCnSC_ELSB, fpc-base + FTM_CSC(pwm-hwpwm));
 +
 + writel(0xF0, fpc-base + FTM_OUTMASK);
 + writel(0x0F, fpc-base + FTM_OUTINIT);
 + writel(FTM_CNTIN_VAL, fpc-base + FTM_CNTIN);
 +
 + writel(period_cycles + cntin - 1, fpc-base + FTM_MOD);
 + writel(duty_cycles + cntin, fpc-base + FTM_CV(pwm-hwpwm));
 +
 + return 0;
 +}
 +
 +static int fsl_pwm_set_polarity(struct pwm_chip *chip, struct pwm_device 
 *pwm,
 + enum pwm_polarity polarity)
 +{
 + unsigned long reg;
 + struct fsl_pwm_data *pwm_data;
 + struct fsl_pwm_chip *fpc;
 +
 + fpc = to_fsl_chip(chip);
 +
 + pwm_data = pwm_get_chip_data(pwm);
 + if (!pwm_data)
 + return -EINVAL;
 +
 + if (pwm_data-available != FSL_AVAILABLE)
 + return -EINVAL;
 +
 + reg = readl(fpc-base + FTM_POL);
 + reg = ~BIT(pwm-hwpwm);

Either drop this line...

 + if (polarity == PWM_POLARITY_INVERSED)
 + reg |= BIT(pwm-hwpwm);
 + else
 + reg = ~BIT(pwm-hwpwm);

...or this one

 +static int fsl_pwm_enable(struct pwm_chip *chip, struct pwm_device *pwm)
 +{
 + int ret;
 + struct fsl_pwm_chip *fpc;
 + struct pinctrl_state *pins_state;
 + struct fsl_pwm_data *pwm_data;
 + const char *statename;
 +
 + fpc = to_fsl_chip(chip);
 +
 + pwm_data = pwm_get_chip_data(pwm);
 + if (!pwm_data)
 + return -EINVAL;
 +
 + if (pwm_data-available != FSL_AVAILABLE)
 + return -EINVAL;
 +
 + statename = kasprintf(GFP_KERNEL, ch%d-active, pwm-hwpwm);

You loose memory here and in fsl_pwm_disable aswell.

 + pins_state = pinctrl_lookup_state(fpc-pinctrl,
 + statename);
 + /* enable pins to be muxed in and configured */
 + if (!IS_ERR(pins_state)) {
 + ret = pinctrl_select_state(fpc-pinctrl, pins_state);
 + if (ret)
 + dev_warn(chip-dev, could not set default pins\n);
 + } else
 + dev_warn(chip-dev, could not get default pinstate\n);

Either it's ok to do without pinctrl or it's not ok, so either return
an error or drop the warnings. Polluting the kernel log with such
messages from a frequently called function is not a good idea.

Sascha

-- 
Pengutronix e.K.   | |
Industrial Linux Solutions | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0|
Amtsgericht Hildesheim, HRA 2686   | Fax:   +49-5121-206917- |
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/