Re: [PATCH 3/3] adp1653: Add driver for LED flash controller

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Sakari,

On Tuesday 17 May 2011 07:38:38 Sakari Ailus wrote:
> Laurent Pinchart wrote:
> > On Monday 16 May 2011 15:00:39 Sakari Ailus wrote:
> >> This patch adds the driver for the adp1653 LED flash controller. This
> >> controller supports a high power led in flash and torch modes and an
> >> indicator light, sometimes also called privacy light.
> >> 
> >> The adp1653 is used on the Nokia N900.
> >> 
> >> Signed-off-by: Sakari Ailus <sakari.ailus@xxxxxxxxxxxxxxxxxxxxxxxxxx>
> >> Signed-off-by: Tuukka Toivonen <tuukkat76@xxxxxxxxx>
> >> Signed-off-by: Laurent Pinchart <laurent.pinchart@xxxxxxxxxxxxxxxx>
> >> Signed-off-by: David Cohen <dacohen@xxxxxxxxx>
> > 
> > [snip]
> > 
> >> diff --git a/drivers/media/video/adp1653.c
> >> b/drivers/media/video/adp1653.c new file mode 100644
> >> index 0000000..92ea38b
> >> --- /dev/null
> >> +++ b/drivers/media/video/adp1653.c
> > 
> > [snip]
> > 
> >> +/* Write values into ADP1653 registers. */
> >> +static int adp1653_update_hw(struct adp1653_flash *flash)
> >> +{
> >> +	struct i2c_client *client = v4l2_get_subdevdata(&flash->subdev);
> >> +	u8 out_sel;
> >> +	u8 config = 0;
> >> +	int rval;
> >> +
> >> +	out_sel = flash->indicator_intensity->val
> >> +		<< ADP1653_REG_OUT_SEL_ILED_SHIFT;
> >> +
> >> +	switch (flash->led_mode->val) {
> >> +	case V4L2_FLASH_LED_MODE_NONE:
> >> +		break;
> >> +	case V4L2_FLASH_LED_MODE_FLASH:
> >> +		/* Flash mode, light on with strobe, duration from timer */
> >> +		config = ADP1653_REG_CONFIG_TMR_CFG;
> >> +		config |= TIMEOUT_US_TO_CODE(flash->flash_timeout->val)
> >> +			  << ADP1653_REG_CONFIG_TMR_SET_SHIFT;
> >> +		break;
> >> +	case V4L2_FLASH_LED_MODE_TORCH:
> >> +		/* Torch mode, light immediately on, duration indefinite */
> >> +		out_sel |= flash->torch_intensity->val
> >> +			   << ADP1653_REG_OUT_SEL_HPLED_SHIFT;
> >> +		break;
> >> +	}
> >> +
> >> +	rval = i2c_smbus_write_byte_data(client, ADP1653_REG_OUT_SEL,
> >> out_sel);
> > 
> > out_sel can be used uninitialized here.
> 
> I don't think so. It's assigned a value in the beginning of the function.

My bad, I missed that. Sorry.

> >> +	if (rval < 0)
> >> +		return rval;
> >> +
> >> +	rval = i2c_smbus_write_byte_data(client, ADP1653_REG_CONFIG, config);
> >> +	if (rval < 0)
> >> +		return rval;
> >> +
> >> +	return 0;
> >> +}
> > 
> > [snip]
> > 
> >> +static int adp1653_get_ctrl(struct v4l2_ctrl *ctrl)
> >> +{
> >> +	struct adp1653_flash *flash =
> >> +		container_of(ctrl->handler, struct adp1653_flash, ctrls);
> >> +	struct i2c_client *client = v4l2_get_subdevdata(&flash->subdev);
> >> +	int fault;
> >> +	int rval;
> >> +
> >> +	fault = i2c_smbus_read_byte_data(client, ADP1653_REG_FAULT);
> >> +	if (IS_ERR_VALUE(fault))
> >> +		return fault;
> >> +
> >> +	/* Clear faults. */
> >> +	rval = i2c_smbus_write_byte_data(client, ADP1653_REG_OUT_SEL, 0);
> >> +	if (IS_ERR_VALUE(rval))
> >> +		return rval;
> > 
> > If several applications read controls, only one of them will be notified
> > of faults. Shouldn't clearing the fault be handled explicitly by writing
> > to a control ? I know this changes the API :-)
> 
> This is true.
> 
> Although I can't imagine right now why two separate processes should be
> so interested in the faults but it is still entirely possible that
> someone does that since it's permitted by the interface.
> 
> Having to write zero to faults to clear them isn't good either since it
> might mean missing faults that are triggered between reading and writing
> this control.
> 
> Perhaps this would make sense as a file handle specific control?

Good question. Control events will help I guess, maybe that's the solution.

> The control documentation says that the faults are cleared when the
> register is read, but the adp1653 also clears the faults whenever
> writing zero to out_sel which happens also in other circumstances, for
> example when changing mode from flash to torch when the torch intensity
> is zero, or when indicator intensity is zero in other modes.
> 
> >> +	/* Restore configuration. */
> >> +	rval = adp1653_update_hw(flash);
> >> +	if (IS_ERR_VALUE(rval))
> >> +		return rval;
> > 
> > Will that produce expected results ? For instance, if a fault was
> > detected during flash strobe, won't it try to re-strobe the flash ?
> > Shouldn't the user
> 
> No. Flash is strobed using adp1653_strobe().
> 
> > be required to explicitly re-strobe the flash or turn the torch (or
> > indicator) on after a fault ? Once again this should be clarified in the
> > API :-)
> 
> The mode won't be changed from the flash but to strobe again, the user
> has to push V4L2_CID_FLASH_STROBE again.
> 
> The adp1653 doesn't have any torch (as such) or indicator faults; some
> other chips do have indicator faults at least. Using the torch mode
> might trigger faults, too, since it's the same LED; just the power isn't
> that high.

When an over-current fault is detected, shouldn't the mode be set back to none 
? If we just clear the fault and reprogram the registers, the torch will be 
turned back on, and the fault will likely happen again.

-- 
Regards,

Laurent Pinchart
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux