Hi Sylwester,
On Wednesday 06 July 2011 19:13:39 Sylwester Nawrocki wrote:
> On the SoCs this driver is intended to support the are three
> separate pins to supply the MIPI-CSIS subsystem: 1.1V or 1.2V,
> 1.8V and power supply for an internal PLL.
> This patch adds support for two separate voltage supplies
> to cover properly board configurations where PMIC requires
> to configure independently each external supply of the MIPI-CSI
> device. The 1.8V and PLL supply are assigned a single "vdd18"
> regulator supply as it seems more reasonable than creating
> separate regulator supplies for them.
>
> Reported-by: HeungJun Kim <[email protected]>
> Signed-off-by: Sylwester Nawrocki <[email protected]>
> Signed-off-by: Kyungmin Park <[email protected]>
> ---
> drivers/media/video/s5p-fimc/mipi-csis.c | 42
> +++++++++++++++++------------ 1 files changed, 25 insertions(+), 17
> deletions(-)
>
> diff --git a/drivers/media/video/s5p-fimc/mipi-csis.c
> b/drivers/media/video/s5p-fimc/mipi-csis.c index ef056d6..4a529b4 100644
> --- a/drivers/media/video/s5p-fimc/mipi-csis.c
> +++ b/drivers/media/video/s5p-fimc/mipi-csis.c
> @@ -81,6 +81,12 @@ static char *csi_clock_name[] = {
> };
> #define NUM_CSIS_CLOCKS ARRAY_SIZE(csi_clock_name)
>
> +static const char * const csis_supply_name[] = {
> + "vdd11", /* 1.1V or 1.2V (s5pc100) MIPI CSI suppply */
> + "vdd18", /* VDD 1.8V and MIPI CSI PLL supply */
> +};
> +#define CSIS_NUM_SUPPLIES ARRAY_SIZE(csis_supply_name)
> +
> enum {
> ST_POWERED = 1,
> ST_STREAMING = 2,
> @@ -109,9 +115,9 @@ struct csis_state {
> struct platform_device *pdev;
> struct resource *regs_res;
> void __iomem *regs;
> + struct regulator_bulk_data supply[CSIS_NUM_SUPPLIES];
I would have called this supplies, but that's nitpicking. Otherwise the patch
looks good to me.
> struct clk *clock[NUM_CSIS_CLOCKS];
> int irq;
> - struct regulator *supply;
> u32 flags;
> const struct csis_pix_format *csis_fmt;
> struct v4l2_mbus_framefmt format;
> @@ -460,6 +466,7 @@ static int __devinit s5pcsis_probe(struct
> platform_device *pdev) struct resource *regs_res;
> struct csis_state *state;
> int ret = -ENOMEM;
> + int i;
>
> state = kzalloc(sizeof(*state), GFP_KERNEL);
> if (!state)
> @@ -519,13 +526,14 @@ static int __devinit s5pcsis_probe(struct
> platform_device *pdev) goto e_clkput;
> }
>
> + for (i = 0; i < CSIS_NUM_SUPPLIES; i++)
> + state->supply[i].supply = csis_supply_name[i];
> +
> if (!pdata->fixed_phy_vdd) {
> - state->supply = regulator_get(&pdev->dev, "vdd");
> - if (IS_ERR(state->supply)) {
> - ret = PTR_ERR(state->supply);
> - state->supply = NULL;
> + ret = regulator_bulk_get(&pdev->dev, CSIS_NUM_SUPPLIES,
> + state->supply);
> + if (ret)
> goto e_clkput;
> - }
> }
>
> ret = request_irq(state->irq, s5pcsis_irq_handler, 0,
> @@ -561,8 +569,7 @@ static int __devinit s5pcsis_probe(struct
> platform_device *pdev) e_irqfree:
> free_irq(state->irq, state);
> e_regput:
> - if (state->supply)
> - regulator_put(state->supply);
> + regulator_bulk_free(CSIS_NUM_SUPPLIES, state->supply);
> e_clkput:
> clk_disable(state->clock[CSIS_CLK_MUX]);
> s5pcsis_clk_put(state);
> @@ -592,8 +599,9 @@ static int s5pcsis_suspend(struct device *dev)
> ret = pdata->phy_enable(state->pdev, false);
> if (ret)
> goto unlock;
> - if (state->supply) {
> - ret = regulator_disable(state->supply);
> + if (!pdata->fixed_phy_vdd) {
> + ret = regulator_bulk_disable(CSIS_NUM_SUPPLIES,
> + state->supply);
> if (ret)
> goto unlock;
> }
> @@ -622,16 +630,17 @@ static int s5pcsis_resume(struct device *dev)
> goto unlock;
>
> if (!(state->flags & ST_POWERED)) {
> - if (state->supply)
> - ret = regulator_enable(state->supply);
> + if (!pdata->fixed_phy_vdd)
> + ret = regulator_bulk_enable(CSIS_NUM_SUPPLIES,
> + state->supply);
> if (ret)
> goto unlock;
> -
> ret = pdata->phy_enable(state->pdev, true);
> if (!ret) {
> state->flags |= ST_POWERED;
> - } else if (state->supply) {
> - regulator_disable(state->supply);
> + } else if (!pdata->fixed_phy_vdd) {
> + regulator_bulk_disable(CSIS_NUM_SUPPLIES,
> + state->supply);
> goto unlock;
> }
> clk_enable(state->clock[CSIS_CLK_GATE]);
> @@ -679,8 +688,7 @@ static int __devexit s5pcsis_remove(struct
> platform_device *pdev) pm_runtime_set_suspended(&pdev->dev);
>
> s5pcsis_clk_put(state);
> - if (state->supply)
> - regulator_put(state->supply);
> + regulator_bulk_free(CSIS_NUM_SUPPLIES, state->supply);
>
> media_entity_cleanup(&state->sd.entity);
> free_irq(state->irq, state);
--
Regards,
Laurent Pinchart
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html