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 <riverful....@samsung.com> > Signed-off-by: Sylwester Nawrocki <s.nawro...@samsung.com> > Signed-off-by: Kyungmin Park <kyungmin.p...@samsung.com> > --- > 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 majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html