On Jun 10, 2014, at 9:31 AM, Srinivas Kandagatla <srinivas.kandagatla@xxxxxxxxxx> wrote: > The use case here is when we have a bootconsole which is printing the > characters on serial console and gsbi driver comes up after some time. > As gsbi driver disables the clock in probe the bootconsole locks up. > > This patch fixes the problem by disabling the clock in platform remove > rather than in probe. > > Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@xxxxxxxxxx> > --- > drivers/soc/qcom/qcom_gsbi.c | 46 +++++++++++++++++++++++++++++++------------- > 1 file changed, 33 insertions(+), 13 deletions(-) It seems like we shouldn’t need this change. Adding Stephen to see if there is a reason we don’t have the clk’s enable_count adjusted for how the bootloader setup clks. - k > > diff --git a/drivers/soc/qcom/qcom_gsbi.c b/drivers/soc/qcom/qcom_gsbi.c > index ab7b441..64fb298 100644 > --- a/drivers/soc/qcom/qcom_gsbi.c > +++ b/drivers/soc/qcom/qcom_gsbi.c > @@ -22,44 +22,63 @@ > #define GSBI_CTRL_REG 0x0000 > #define GSBI_PROTOCOL_SHIFT 4 > > +struct gsbi_info { > + struct clk *hclk; > + u32 mode; > + u32 crci; > +}; > + > static int gsbi_probe(struct platform_device *pdev) > { > struct device_node *node = pdev->dev.of_node; > struct resource *res; > void __iomem *base; > - struct clk *hclk; > - u32 mode, crci = 0; > + struct gsbi_info *gsbi; > + > + gsbi = devm_kzalloc(&pdev->dev, sizeof(*gsbi), GFP_KERNEL); > + > + if (!gsbi) > + return -ENOMEM; > > res = platform_get_resource(pdev, IORESOURCE_MEM, 0); > base = devm_ioremap_resource(&pdev->dev, res); > if (IS_ERR(base)) > return PTR_ERR(base); > > - if (of_property_read_u32(node, "qcom,mode", &mode)) { > + if (of_property_read_u32(node, "qcom,mode", &gsbi->mode)) { > dev_err(&pdev->dev, "missing mode configuration\n"); > return -EINVAL; > } > > /* not required, so default to 0 if not present */ > - of_property_read_u32(node, "qcom,crci", &crci); > + of_property_read_u32(node, "qcom,crci", &gsbi->crci); > > - dev_info(&pdev->dev, "GSBI port protocol: %d crci: %d\n", mode, crci); > + dev_info(&pdev->dev, "GSBI port protocol: %d crci: %d\n", > + gsbi->mode, gsbi->crci); > + gsbi->hclk = devm_clk_get(&pdev->dev, "iface"); > + if (IS_ERR(gsbi->hclk)) > + return PTR_ERR(gsbi->hclk); > > - hclk = devm_clk_get(&pdev->dev, "iface"); > - if (IS_ERR(hclk)) > - return PTR_ERR(hclk); > + clk_prepare_enable(gsbi->hclk); > > - clk_prepare_enable(hclk); > - > - writel_relaxed((mode << GSBI_PROTOCOL_SHIFT) | crci, > + writel_relaxed((gsbi->mode << GSBI_PROTOCOL_SHIFT) | gsbi->crci, > base + GSBI_CTRL_REG); > > /* make sure the gsbi control write is not reordered */ > wmb(); > > - clk_disable_unprepare(hclk); > + platform_set_drvdata(pdev, gsbi); > + > + return of_platform_populate(node, NULL, NULL, &pdev->dev); > +} > + > +static int gsbi_remove(struct platform_device *pdev) > +{ > + struct gsbi_info *gsbi = platform_get_drvdata(pdev); > + > + clk_disable_unprepare(gsbi->hclk); > > - return of_platform_populate(pdev->dev.of_node, NULL, NULL, &pdev->dev); > + return 0; > } > > static const struct of_device_id gsbi_dt_match[] = { > @@ -76,6 +95,7 @@ static struct platform_driver gsbi_driver = { > .of_match_table = gsbi_dt_match, > }, > .probe = gsbi_probe, > + .remove = gsbi_remove, > }; > > module_platform_driver(gsbi_driver); > -- > 1.9.1 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-arm-msm" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html -- Employee of Qualcomm Innovation Center, Inc. Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by The Linux Foundation -- To unsubscribe from this list: send the line "unsubscribe linux-arm-msm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html