Hi!

> > This will probably fail.
> > 
> >             rval = omap3isp_csi2_reset(phy->csi2);
> >             if (rval < 0)
> >                             goto done;
> 
> Could you try to two patches I've applied on the ccp2 branch (I'll remove
> them if there are issues).
> 
> That's compile tested for now only.

They help a lot. Now I can use similar code paths...

Not yet a mergeable patch, but already better than it was.

Thanks and best regards,
                                                                        Pavel


diff --git a/drivers/media/platform/omap3isp/ispccp2.c 
b/drivers/media/platform/omap3isp/ispccp2.c
index 24a9fc5..79838bd 100644
--- a/drivers/media/platform/omap3isp/ispccp2.c
+++ b/drivers/media/platform/omap3isp/ispccp2.c
@@ -21,6 +23,7 @@
 #include <linux/mutex.h>
 #include <linux/uaccess.h>
 #include <linux/regulator/consumer.h>
+#include <linux/regmap.h>
 
 #include "isp.h"
 #include "ispreg.h"
@@ -1149,6 +1170,7 @@ int omap3isp_ccp2_init(struct isp_device *isp)
                                "Could not get regulator vdds_csib\n");
                        ccp2->vdds_csib = NULL;
                }
+               ccp2->phy = &isp->isp_csiphy2;
        } else if (isp->revision == ISP_REVISION_15_0) {
                ccp2->phy = &isp->isp_csiphy1;
        }
diff --git a/drivers/media/platform/omap3isp/ispcsiphy.c 
b/drivers/media/platform/omap3isp/ispcsiphy.c
index 50c0f64..94461df 100644
--- a/drivers/media/platform/omap3isp/ispcsiphy.c
+++ b/drivers/media/platform/omap3isp/ispcsiphy.c
@@ -68,8 +68,8 @@ static void csiphy_routing_cfg_3630(struct isp_csiphy *phy,
        regmap_write(phy->isp->syscon, phy->isp->syscon_offset, reg);
 }
 
-static void csiphy_routing_cfg_3430(struct isp_csiphy *phy, u32 iface, bool on,
-                                   bool ccp2_strobe)
+void csiphy_routing_cfg_3430(struct isp_csiphy *phy, u32 iface, bool on,
+                            bool ccp2_strobe, bool strobe_clk_pol)
 {
        u32 csirxfe = OMAP343X_CONTROL_CSIRXFE_PWRDNZ
                | OMAP343X_CONTROL_CSIRXFE_RESET;
@@ -85,6 +85,9 @@ static void csiphy_routing_cfg_3430(struct isp_csiphy *phy, 
u32 iface, bool on,
 
        if (ccp2_strobe)
                csirxfe |= OMAP343X_CONTROL_CSIRXFE_SELFORM;
+       
+       if (strobe_clk_pol)
+               csirxfe |= OMAP343X_CONTROL_CSIRXFE_CSIB_INV;
 
        regmap_write(phy->isp->syscon, phy->isp->syscon_offset, csirxfe);
 }
@@ -108,7 +111,7 @@ static void csiphy_routing_cfg(struct isp_csiphy *phy,
        if (phy->isp->phy_type == ISP_PHY_TYPE_3630 && on)
                return csiphy_routing_cfg_3630(phy, iface, ccp2_strobe);
        if (phy->isp->phy_type == ISP_PHY_TYPE_3430)
-               return csiphy_routing_cfg_3430(phy, iface, on, ccp2_strobe);
+               return csiphy_routing_cfg_3430(phy, iface, on, ccp2_strobe, 
false);
 }
 
 /*
@@ -197,27 +200,40 @@ static int omap3isp_csiphy_config(struct isp_csiphy *phy)
        }
 
        if (buscfg->interface == ISP_INTERFACE_CCP2B_PHY1
-           || buscfg->interface == ISP_INTERFACE_CCP2B_PHY2)
+           || buscfg->interface == ISP_INTERFACE_CCP2B_PHY2) {
                lanes = &buscfg->bus.ccp2.lanecfg;
-       else
+               phy->num_data_lanes = 1;
+       } else
                lanes = &buscfg->bus.csi2.lanecfg;
 
+       printk("lane verification... %d\n", phy->num_data_lanes);
+
        /* Clock and data lanes verification */
        for (i = 0; i < phy->num_data_lanes; i++) {
-               if (lanes->data[i].pol > 1 || lanes->data[i].pos > 3)
-                       return -EINVAL;
+               if (lanes->data[i].pol > 1 || lanes->data[i].pos > 3) {
+                       printk("Bad cfg\n");
+                       //return -EINVAL;
+               }
 
-               if (used_lanes & (1 << lanes->data[i].pos))
-                       return -EINVAL;
+               if (used_lanes & (1 << lanes->data[i].pos)) {
+                       printk("Already used\n");
+                       //return -EINVAL;
+               }
 
                used_lanes |= 1 << lanes->data[i].pos;
        }
 
-       if (lanes->clk.pol > 1 || lanes->clk.pos > 3)
-               return -EINVAL;
+       printk("used lanes... %d\n", used_lanes);       
 
-       if (lanes->clk.pos == 0 || used_lanes & (1 << lanes->clk.pos))
-               return -EINVAL;
+       if (lanes->clk.pol > 1 || lanes->clk.pos > 3) {
+               printk("Bad clock\n");
+               //return -EINVAL;
+       }
+
+       if (lanes->clk.pos == 0 || used_lanes & (1 << lanes->clk.pos)) {
+               printk("Reused clock\n");
+               //return -EINVAL;
+       }
 
        /*
         * The PHY configuration is lost in off mode, that's not an
@@ -302,13 +318,16 @@ int omap3isp_csiphy_acquire(struct isp_csiphy *phy)
        if (rval < 0)
                goto done;
 
-       rval = csiphy_set_power(phy, ISPCSI2_PHY_CFG_PWR_CMD_ON);
-       if (rval) {
-               regulator_disable(phy->vdd);
-               goto done;
+       if (phy->isp->revision == ISP_REVISION_15_0) {
+               rval = csiphy_set_power(phy, ISPCSI2_PHY_CFG_PWR_CMD_ON);
+               if (rval) {
+                       regulator_disable(phy->vdd);
+                       goto done;
+               }
+               
+               csiphy_power_autoswitch_enable(phy, true);              
        }
 
-       csiphy_power_autoswitch_enable(phy, true);
        phy->phy_in_use = 1;
 
 done:

-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) 
http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html

Attachment: signature.asc
Description: Digital signature

Reply via email to