* Re: [PATCH v3 1/3] ARM: imx6q: add clocks for gpmi-nand
2012-07-02 3:38 ` Huang Shijie
@ 2012-07-02 2:10 ` Shawn Guo
-1 siblings, 0 replies; 19+ messages in thread
From: Shawn Guo @ 2012-07-02 2:10 UTC (permalink / raw)
To: Huang Shijie; +Cc: dong.aisheng, linux-mtd, linux-arm-kernel, dedekind1
On Sun, Jul 01, 2012 at 11:38:45PM -0400, Huang Shijie wrote:
> Add clocks for gpmi-nand.
>
> Signed-off-by: Huang Shijie <shijie8@gmail.com>
> ---
> arch/arm/mach-imx/clk-imx6q.c | 8 +++++++-
> 1 files changed, 7 insertions(+), 1 deletions(-)
>
> diff --git a/arch/arm/mach-imx/clk-imx6q.c b/arch/arm/mach-imx/clk-imx6q.c
> index 12d9040..a837528 100644
> --- a/arch/arm/mach-imx/clk-imx6q.c
> +++ b/arch/arm/mach-imx/clk-imx6q.c
> @@ -151,7 +151,7 @@ enum mx6q_clks {
> esai, gpt_ipg, gpt_ipg_per, gpu2d_core, gpu3d_core, hdmi_iahb,
> hdmi_isfr, i2c1, i2c2, i2c3, iim, enfc, ipu1, ipu1_di0, ipu1_di1, ipu2,
> ipu2_di0, ldb_di0, ldb_di1, ipu2_di1, hsi_tx, mlb, mmdc_ch0_axi,
> - mmdc_ch1_axi, ocram, openvg_axi, pcie_axi, pwm1, pwm2, pwm3, pwm4,
> + mmdc_ch1_axi, ocram, openvg_axi, pcie_axi, pwm1, pwm2, pwm3, pwm4, per1_bch,
> gpmi_bch_apb, gpmi_bch, gpmi_io, gpmi_apb, sata, sdma, spba, ssi1,
> ssi2, ssi3, uart_ipg, uart_serial, usboh3, usdhc1, usdhc2, usdhc3,
> usdhc4, vdo_axi, vpu_axi, cko1, pll1_sys, pll2_bus, pll3_usb_otg,
> @@ -357,6 +357,7 @@ int __init mx6q_clocks_init(void)
> clk[ocram] = imx_clk_gate2("ocram", "ahb", base + 0x74, 28);
> clk[openvg_axi] = imx_clk_gate2("openvg_axi", "axi", base + 0x74, 30);
> clk[pcie_axi] = imx_clk_gate2("pcie_axi", "pcie_axi_sel", base + 0x78, 0);
> + clk[per1_bch] = imx_clk_gate2("per1_bch", "usdhc3", base + 0x78, 12);
> clk[pwm1] = imx_clk_gate2("pwm1", "ipg_per", base + 0x78, 16);
> clk[pwm2] = imx_clk_gate2("pwm2", "ipg_per", base + 0x78, 18);
> clk[pwm3] = imx_clk_gate2("pwm3", "ipg_per", base + 0x78, 20);
> @@ -394,6 +395,11 @@ int __init mx6q_clocks_init(void)
> clk_register_clkdev(clk[twd], NULL, "smp_twd");
> clk_register_clkdev(clk[usboh3], NULL, "usboh3");
> clk_register_clkdev(clk[apbh_dma], NULL, "110000.dma-apbh");
> + clk_register_clkdev(clk[per1_bch], "per1_bch", "112000.gpmi-nand");
> + clk_register_clkdev(clk[gpmi_bch_apb], "gpmi_bch_apb", "112000.gpmi-nand");
> + clk_register_clkdev(clk[gpmi_bch], "gpmi_bch", "112000.gpmi-nand");
> + clk_register_clkdev(clk[gpmi_apb], "gpmi_apb", "112000.gpmi-nand");
> + clk_register_clkdev(clk[gpmi_io], NULL, "112000.gpmi-nand");
It's a little bit strange to me that this clock still gets NULL con_id
while all other gpmi-nand clocks have proper con_id assigned.
> clk_register_clkdev(clk[uart_serial], "per", "2020000.serial");
> clk_register_clkdev(clk[uart_ipg], "ipg", "2020000.serial");
> clk_register_clkdev(clk[uart_serial], "per", "21e8000.serial");
> --
> 1.7.4.4
>
--
Regards,
Shawn
^ permalink raw reply [flat|nested] 19+ messages in thread
* [PATCH v3 1/3] ARM: imx6q: add clocks for gpmi-nand
@ 2012-07-02 2:10 ` Shawn Guo
0 siblings, 0 replies; 19+ messages in thread
From: Shawn Guo @ 2012-07-02 2:10 UTC (permalink / raw)
To: linux-arm-kernel
On Sun, Jul 01, 2012 at 11:38:45PM -0400, Huang Shijie wrote:
> Add clocks for gpmi-nand.
>
> Signed-off-by: Huang Shijie <shijie8@gmail.com>
> ---
> arch/arm/mach-imx/clk-imx6q.c | 8 +++++++-
> 1 files changed, 7 insertions(+), 1 deletions(-)
>
> diff --git a/arch/arm/mach-imx/clk-imx6q.c b/arch/arm/mach-imx/clk-imx6q.c
> index 12d9040..a837528 100644
> --- a/arch/arm/mach-imx/clk-imx6q.c
> +++ b/arch/arm/mach-imx/clk-imx6q.c
> @@ -151,7 +151,7 @@ enum mx6q_clks {
> esai, gpt_ipg, gpt_ipg_per, gpu2d_core, gpu3d_core, hdmi_iahb,
> hdmi_isfr, i2c1, i2c2, i2c3, iim, enfc, ipu1, ipu1_di0, ipu1_di1, ipu2,
> ipu2_di0, ldb_di0, ldb_di1, ipu2_di1, hsi_tx, mlb, mmdc_ch0_axi,
> - mmdc_ch1_axi, ocram, openvg_axi, pcie_axi, pwm1, pwm2, pwm3, pwm4,
> + mmdc_ch1_axi, ocram, openvg_axi, pcie_axi, pwm1, pwm2, pwm3, pwm4, per1_bch,
> gpmi_bch_apb, gpmi_bch, gpmi_io, gpmi_apb, sata, sdma, spba, ssi1,
> ssi2, ssi3, uart_ipg, uart_serial, usboh3, usdhc1, usdhc2, usdhc3,
> usdhc4, vdo_axi, vpu_axi, cko1, pll1_sys, pll2_bus, pll3_usb_otg,
> @@ -357,6 +357,7 @@ int __init mx6q_clocks_init(void)
> clk[ocram] = imx_clk_gate2("ocram", "ahb", base + 0x74, 28);
> clk[openvg_axi] = imx_clk_gate2("openvg_axi", "axi", base + 0x74, 30);
> clk[pcie_axi] = imx_clk_gate2("pcie_axi", "pcie_axi_sel", base + 0x78, 0);
> + clk[per1_bch] = imx_clk_gate2("per1_bch", "usdhc3", base + 0x78, 12);
> clk[pwm1] = imx_clk_gate2("pwm1", "ipg_per", base + 0x78, 16);
> clk[pwm2] = imx_clk_gate2("pwm2", "ipg_per", base + 0x78, 18);
> clk[pwm3] = imx_clk_gate2("pwm3", "ipg_per", base + 0x78, 20);
> @@ -394,6 +395,11 @@ int __init mx6q_clocks_init(void)
> clk_register_clkdev(clk[twd], NULL, "smp_twd");
> clk_register_clkdev(clk[usboh3], NULL, "usboh3");
> clk_register_clkdev(clk[apbh_dma], NULL, "110000.dma-apbh");
> + clk_register_clkdev(clk[per1_bch], "per1_bch", "112000.gpmi-nand");
> + clk_register_clkdev(clk[gpmi_bch_apb], "gpmi_bch_apb", "112000.gpmi-nand");
> + clk_register_clkdev(clk[gpmi_bch], "gpmi_bch", "112000.gpmi-nand");
> + clk_register_clkdev(clk[gpmi_apb], "gpmi_apb", "112000.gpmi-nand");
> + clk_register_clkdev(clk[gpmi_io], NULL, "112000.gpmi-nand");
It's a little bit strange to me that this clock still gets NULL con_id
while all other gpmi-nand clocks have proper con_id assigned.
> clk_register_clkdev(clk[uart_serial], "per", "2020000.serial");
> clk_register_clkdev(clk[uart_ipg], "ipg", "2020000.serial");
> clk_register_clkdev(clk[uart_serial], "per", "21e8000.serial");
> --
> 1.7.4.4
>
--
Regards,
Shawn
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH v3 2/3] ARM: imx6q: add DT node for gpmi nand
2012-07-02 3:38 ` Huang Shijie
@ 2012-07-02 2:24 ` Shawn Guo
-1 siblings, 0 replies; 19+ messages in thread
From: Shawn Guo @ 2012-07-02 2:24 UTC (permalink / raw)
To: Huang Shijie; +Cc: dong.aisheng, linux-mtd, linux-arm-kernel, dedekind1
On Sun, Jul 01, 2012 at 11:38:46PM -0400, Huang Shijie wrote:
> Add the DT node for gpmi nand.
> Add the pinmux support for gpmi nand.
>
> The gpmi nand may conflicts with other modules, such as MMC.
> So we do not enable the gpmi nand for mx6q-arm2 board, just add the
> node for the board.
>
> Acked-by: Dong Aisheng <dong.aisheng@linaro.org>
> Signed-off-by: Huang Shijie <shijie8@gmail.com>
Applied, thanks.
--
Regards,
Shawn
^ permalink raw reply [flat|nested] 19+ messages in thread
* [PATCH v3 2/3] ARM: imx6q: add DT node for gpmi nand
@ 2012-07-02 2:24 ` Shawn Guo
0 siblings, 0 replies; 19+ messages in thread
From: Shawn Guo @ 2012-07-02 2:24 UTC (permalink / raw)
To: linux-arm-kernel
On Sun, Jul 01, 2012 at 11:38:46PM -0400, Huang Shijie wrote:
> Add the DT node for gpmi nand.
> Add the pinmux support for gpmi nand.
>
> The gpmi nand may conflicts with other modules, such as MMC.
> So we do not enable the gpmi nand for mx6q-arm2 board, just add the
> node for the board.
>
> Acked-by: Dong Aisheng <dong.aisheng@linaro.org>
> Signed-off-by: Huang Shijie <shijie8@gmail.com>
Applied, thanks.
--
Regards,
Shawn
^ permalink raw reply [flat|nested] 19+ messages in thread
* [PATCH v3 1/3] ARM: imx6q: add clocks for gpmi-nand
2012-07-02 2:10 ` Shawn Guo
(?)
@ 2012-07-02 2:36 ` Huang Shijie
-1 siblings, 0 replies; 19+ messages in thread
From: Huang Shijie @ 2012-07-02 2:36 UTC (permalink / raw)
To: linux-arm-kernel
? 2012?07?02? 10:10, Shawn Guo ??:
> It's a little bit strange to me that this clock still gets NULL con_id
> while all other gpmi-nand clocks have proper con_id assigned.
>
I will fix it in the next version.
thanks
Huang Shijie
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH v3 3/3] mtd: gpmi: change the code for clocks
2012-07-02 3:38 ` Huang Shijie
@ 2012-07-02 2:48 ` Huang Shijie
-1 siblings, 0 replies; 19+ messages in thread
From: Huang Shijie @ 2012-07-02 2:48 UTC (permalink / raw)
To: Huang Shijie
Cc: shawn.guo, linux-mtd, linux-arm-kernel, dong.aisheng, dedekind1
于 2012年07月02日 11:38, Huang Shijie 写道:
> - status = "disabled"; /* gpmi nand conflicts with SD */
> + status = "okay"; /* gpmi nand conflicts with SD */
> };
sorry, this is my mistake.
I will fix it in the next version.
But you can give your comments about other code of this patch.
thanks.
Huang Shijie
^ permalink raw reply [flat|nested] 19+ messages in thread
* [PATCH v3 3/3] mtd: gpmi: change the code for clocks
@ 2012-07-02 2:48 ` Huang Shijie
0 siblings, 0 replies; 19+ messages in thread
From: Huang Shijie @ 2012-07-02 2:48 UTC (permalink / raw)
To: linux-arm-kernel
? 2012?07?02? 11:38, Huang Shijie ??:
> - status = "disabled"; /* gpmi nand conflicts with SD */
> + status = "okay"; /* gpmi nand conflicts with SD */
> };
sorry, this is my mistake.
I will fix it in the next version.
But you can give your comments about other code of this patch.
thanks.
Huang Shijie
^ permalink raw reply [flat|nested] 19+ messages in thread
* [PATCH v3 0/3] add gpmi support for imx6q
@ 2012-07-02 3:38 ` Huang Shijie
0 siblings, 0 replies; 19+ messages in thread
From: Huang Shijie @ 2012-07-02 3:38 UTC (permalink / raw)
To: shawn.guo
Cc: Huang Shijie, dong.aisheng, linux-mtd, linux-arm-kernel, dedekind1
This patch set adds the gpmi-nand support for imx6q.
I prefer to add the clocks in the gpmi-nand driver.
Yes, it will change the gpmi nand driver, but we have to do so.
The reason is :
We will support the ONFI nand in mx6q in the future. If the ONFI nand is
set to Sync mode, we have to __change__ the clocks explicitly.
Test this patch set on imx6q-arm2 board.
v2 --> v3:
[1] fix a bug the clocks.
v1 --> v2:
[1] add dev_id for the gpmi-nand's clocks.
[2] set the default values for these clocks.
Huang Shijie (3):
ARM: imx6q: add clocks for gpmi-nand
ARM: imx6q: add DT node for gpmi nand
mtd: gpmi: change the code for clocks
arch/arm/boot/dts/imx6q-arm2.dts | 6 ++
arch/arm/boot/dts/imx6q.dtsi | 36 ++++++++++++++
arch/arm/mach-imx/clk-imx6q.c | 8 +++-
drivers/mtd/nand/gpmi-nand/gpmi-lib.c | 43 ++++++++++++++---
drivers/mtd/nand/gpmi-nand/gpmi-nand.c | 82 ++++++++++++++++++++++++++++----
drivers/mtd/nand/gpmi-nand/gpmi-nand.h | 3 +-
6 files changed, 159 insertions(+), 19 deletions(-)
--
1.7.4.4
^ permalink raw reply [flat|nested] 19+ messages in thread
* [PATCH v3 0/3] add gpmi support for imx6q
@ 2012-07-02 3:38 ` Huang Shijie
0 siblings, 0 replies; 19+ messages in thread
From: Huang Shijie @ 2012-07-02 3:38 UTC (permalink / raw)
To: linux-arm-kernel
This patch set adds the gpmi-nand support for imx6q.
I prefer to add the clocks in the gpmi-nand driver.
Yes, it will change the gpmi nand driver, but we have to do so.
The reason is :
We will support the ONFI nand in mx6q in the future. If the ONFI nand is
set to Sync mode, we have to __change__ the clocks explicitly.
Test this patch set on imx6q-arm2 board.
v2 --> v3:
[1] fix a bug the clocks.
v1 --> v2:
[1] add dev_id for the gpmi-nand's clocks.
[2] set the default values for these clocks.
Huang Shijie (3):
ARM: imx6q: add clocks for gpmi-nand
ARM: imx6q: add DT node for gpmi nand
mtd: gpmi: change the code for clocks
arch/arm/boot/dts/imx6q-arm2.dts | 6 ++
arch/arm/boot/dts/imx6q.dtsi | 36 ++++++++++++++
arch/arm/mach-imx/clk-imx6q.c | 8 +++-
drivers/mtd/nand/gpmi-nand/gpmi-lib.c | 43 ++++++++++++++---
drivers/mtd/nand/gpmi-nand/gpmi-nand.c | 82 ++++++++++++++++++++++++++++----
drivers/mtd/nand/gpmi-nand/gpmi-nand.h | 3 +-
6 files changed, 159 insertions(+), 19 deletions(-)
--
1.7.4.4
^ permalink raw reply [flat|nested] 19+ messages in thread
* [PATCH v3 1/3] ARM: imx6q: add clocks for gpmi-nand
2012-07-02 3:38 ` Huang Shijie
@ 2012-07-02 3:38 ` Huang Shijie
-1 siblings, 0 replies; 19+ messages in thread
From: Huang Shijie @ 2012-07-02 3:38 UTC (permalink / raw)
To: shawn.guo
Cc: Huang Shijie, dong.aisheng, linux-mtd, linux-arm-kernel, dedekind1
Add clocks for gpmi-nand.
Signed-off-by: Huang Shijie <shijie8@gmail.com>
---
arch/arm/mach-imx/clk-imx6q.c | 8 +++++++-
1 files changed, 7 insertions(+), 1 deletions(-)
diff --git a/arch/arm/mach-imx/clk-imx6q.c b/arch/arm/mach-imx/clk-imx6q.c
index 12d9040..a837528 100644
--- a/arch/arm/mach-imx/clk-imx6q.c
+++ b/arch/arm/mach-imx/clk-imx6q.c
@@ -151,7 +151,7 @@ enum mx6q_clks {
esai, gpt_ipg, gpt_ipg_per, gpu2d_core, gpu3d_core, hdmi_iahb,
hdmi_isfr, i2c1, i2c2, i2c3, iim, enfc, ipu1, ipu1_di0, ipu1_di1, ipu2,
ipu2_di0, ldb_di0, ldb_di1, ipu2_di1, hsi_tx, mlb, mmdc_ch0_axi,
- mmdc_ch1_axi, ocram, openvg_axi, pcie_axi, pwm1, pwm2, pwm3, pwm4,
+ mmdc_ch1_axi, ocram, openvg_axi, pcie_axi, pwm1, pwm2, pwm3, pwm4, per1_bch,
gpmi_bch_apb, gpmi_bch, gpmi_io, gpmi_apb, sata, sdma, spba, ssi1,
ssi2, ssi3, uart_ipg, uart_serial, usboh3, usdhc1, usdhc2, usdhc3,
usdhc4, vdo_axi, vpu_axi, cko1, pll1_sys, pll2_bus, pll3_usb_otg,
@@ -357,6 +357,7 @@ int __init mx6q_clocks_init(void)
clk[ocram] = imx_clk_gate2("ocram", "ahb", base + 0x74, 28);
clk[openvg_axi] = imx_clk_gate2("openvg_axi", "axi", base + 0x74, 30);
clk[pcie_axi] = imx_clk_gate2("pcie_axi", "pcie_axi_sel", base + 0x78, 0);
+ clk[per1_bch] = imx_clk_gate2("per1_bch", "usdhc3", base + 0x78, 12);
clk[pwm1] = imx_clk_gate2("pwm1", "ipg_per", base + 0x78, 16);
clk[pwm2] = imx_clk_gate2("pwm2", "ipg_per", base + 0x78, 18);
clk[pwm3] = imx_clk_gate2("pwm3", "ipg_per", base + 0x78, 20);
@@ -394,6 +395,11 @@ int __init mx6q_clocks_init(void)
clk_register_clkdev(clk[twd], NULL, "smp_twd");
clk_register_clkdev(clk[usboh3], NULL, "usboh3");
clk_register_clkdev(clk[apbh_dma], NULL, "110000.dma-apbh");
+ clk_register_clkdev(clk[per1_bch], "per1_bch", "112000.gpmi-nand");
+ clk_register_clkdev(clk[gpmi_bch_apb], "gpmi_bch_apb", "112000.gpmi-nand");
+ clk_register_clkdev(clk[gpmi_bch], "gpmi_bch", "112000.gpmi-nand");
+ clk_register_clkdev(clk[gpmi_apb], "gpmi_apb", "112000.gpmi-nand");
+ clk_register_clkdev(clk[gpmi_io], NULL, "112000.gpmi-nand");
clk_register_clkdev(clk[uart_serial], "per", "2020000.serial");
clk_register_clkdev(clk[uart_ipg], "ipg", "2020000.serial");
clk_register_clkdev(clk[uart_serial], "per", "21e8000.serial");
--
1.7.4.4
^ permalink raw reply related [flat|nested] 19+ messages in thread
* [PATCH v3 1/3] ARM: imx6q: add clocks for gpmi-nand
@ 2012-07-02 3:38 ` Huang Shijie
0 siblings, 0 replies; 19+ messages in thread
From: Huang Shijie @ 2012-07-02 3:38 UTC (permalink / raw)
To: linux-arm-kernel
Add clocks for gpmi-nand.
Signed-off-by: Huang Shijie <shijie8@gmail.com>
---
arch/arm/mach-imx/clk-imx6q.c | 8 +++++++-
1 files changed, 7 insertions(+), 1 deletions(-)
diff --git a/arch/arm/mach-imx/clk-imx6q.c b/arch/arm/mach-imx/clk-imx6q.c
index 12d9040..a837528 100644
--- a/arch/arm/mach-imx/clk-imx6q.c
+++ b/arch/arm/mach-imx/clk-imx6q.c
@@ -151,7 +151,7 @@ enum mx6q_clks {
esai, gpt_ipg, gpt_ipg_per, gpu2d_core, gpu3d_core, hdmi_iahb,
hdmi_isfr, i2c1, i2c2, i2c3, iim, enfc, ipu1, ipu1_di0, ipu1_di1, ipu2,
ipu2_di0, ldb_di0, ldb_di1, ipu2_di1, hsi_tx, mlb, mmdc_ch0_axi,
- mmdc_ch1_axi, ocram, openvg_axi, pcie_axi, pwm1, pwm2, pwm3, pwm4,
+ mmdc_ch1_axi, ocram, openvg_axi, pcie_axi, pwm1, pwm2, pwm3, pwm4, per1_bch,
gpmi_bch_apb, gpmi_bch, gpmi_io, gpmi_apb, sata, sdma, spba, ssi1,
ssi2, ssi3, uart_ipg, uart_serial, usboh3, usdhc1, usdhc2, usdhc3,
usdhc4, vdo_axi, vpu_axi, cko1, pll1_sys, pll2_bus, pll3_usb_otg,
@@ -357,6 +357,7 @@ int __init mx6q_clocks_init(void)
clk[ocram] = imx_clk_gate2("ocram", "ahb", base + 0x74, 28);
clk[openvg_axi] = imx_clk_gate2("openvg_axi", "axi", base + 0x74, 30);
clk[pcie_axi] = imx_clk_gate2("pcie_axi", "pcie_axi_sel", base + 0x78, 0);
+ clk[per1_bch] = imx_clk_gate2("per1_bch", "usdhc3", base + 0x78, 12);
clk[pwm1] = imx_clk_gate2("pwm1", "ipg_per", base + 0x78, 16);
clk[pwm2] = imx_clk_gate2("pwm2", "ipg_per", base + 0x78, 18);
clk[pwm3] = imx_clk_gate2("pwm3", "ipg_per", base + 0x78, 20);
@@ -394,6 +395,11 @@ int __init mx6q_clocks_init(void)
clk_register_clkdev(clk[twd], NULL, "smp_twd");
clk_register_clkdev(clk[usboh3], NULL, "usboh3");
clk_register_clkdev(clk[apbh_dma], NULL, "110000.dma-apbh");
+ clk_register_clkdev(clk[per1_bch], "per1_bch", "112000.gpmi-nand");
+ clk_register_clkdev(clk[gpmi_bch_apb], "gpmi_bch_apb", "112000.gpmi-nand");
+ clk_register_clkdev(clk[gpmi_bch], "gpmi_bch", "112000.gpmi-nand");
+ clk_register_clkdev(clk[gpmi_apb], "gpmi_apb", "112000.gpmi-nand");
+ clk_register_clkdev(clk[gpmi_io], NULL, "112000.gpmi-nand");
clk_register_clkdev(clk[uart_serial], "per", "2020000.serial");
clk_register_clkdev(clk[uart_ipg], "ipg", "2020000.serial");
clk_register_clkdev(clk[uart_serial], "per", "21e8000.serial");
--
1.7.4.4
^ permalink raw reply related [flat|nested] 19+ messages in thread
* [PATCH v3 2/3] ARM: imx6q: add DT node for gpmi nand
2012-07-02 3:38 ` Huang Shijie
@ 2012-07-02 3:38 ` Huang Shijie
-1 siblings, 0 replies; 19+ messages in thread
From: Huang Shijie @ 2012-07-02 3:38 UTC (permalink / raw)
To: shawn.guo
Cc: Huang Shijie, dong.aisheng, linux-mtd, linux-arm-kernel, dedekind1
Add the DT node for gpmi nand.
Add the pinmux support for gpmi nand.
The gpmi nand may conflicts with other modules, such as MMC.
So we do not enable the gpmi nand for mx6q-arm2 board, just add the
node for the board.
Acked-by: Dong Aisheng <dong.aisheng@linaro.org>
Signed-off-by: Huang Shijie <shijie8@gmail.com>
---
arch/arm/boot/dts/imx6q-arm2.dts | 6 ++++++
arch/arm/boot/dts/imx6q.dtsi | 36 ++++++++++++++++++++++++++++++++++++
2 files changed, 42 insertions(+), 0 deletions(-)
diff --git a/arch/arm/boot/dts/imx6q-arm2.dts b/arch/arm/boot/dts/imx6q-arm2.dts
index bdab44c..14e72e2 100644
--- a/arch/arm/boot/dts/imx6q-arm2.dts
+++ b/arch/arm/boot/dts/imx6q-arm2.dts
@@ -22,6 +22,12 @@
};
soc {
+ gpmi-nand@00112000 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_gpmi_nand_1>;
+ status = "disabled"; /* gpmi nand conflicts with SD */
+ };
+
aips-bus@02100000 { /* AIPS2 */
ethernet@02188000 {
phy-mode = "rgmii";
diff --git a/arch/arm/boot/dts/imx6q.dtsi b/arch/arm/boot/dts/imx6q.dtsi
index 3197744..16a3884 100644
--- a/arch/arm/boot/dts/imx6q.dtsi
+++ b/arch/arm/boot/dts/imx6q.dtsi
@@ -92,6 +92,18 @@
reg = <0x00110000 0x2000>;
};
+ gpmi-nand@00112000 {
+ compatible = "fsl,imx6q-gpmi-nand";
+ #address-cells = <1>;
+ #size-cells = <1>;
+ reg = <0x00112000 0x2000>, <0x00114000 0x2000>;
+ reg-names = "gpmi-nand", "bch";
+ interrupts = <0 13 0x04>, <0 15 0x04>;
+ interrupt-names = "gpmi-dma", "bch";
+ fsl,gpmi-dma-channel = <0>;
+ status = "disabled";
+ };
+
timer@00a00600 {
compatible = "arm,cortex-a9-twd-timer";
reg = <0x00a00600 0x20>;
@@ -500,6 +512,30 @@
};
};
+ gpmi-nand {
+ pinctrl_gpmi_nand_1: gpmi-nand-1 {
+ fsl,pins = <1328 0xb0b1 /* MX6Q_PAD_NANDF_CLE__RAWNAND_CLE */
+ 1336 0xb0b1 /* MX6Q_PAD_NANDF_ALE__RAWNAND_ALE */
+ 1344 0xb0b1 /* MX6Q_PAD_NANDF_WP_B__RAWNAND_RESETN */
+ 1352 0xb000 /* MX6Q_PAD_NANDF_RB0__RAWNAND_READY0 */
+ 1360 0xb0b1 /* MX6Q_PAD_NANDF_CS0__RAWNAND_CE0N */
+ 1365 0xb0b1 /* MX6Q_PAD_NANDF_CS1__RAWNAND_CE1N */
+ 1371 0xb0b1 /* MX6Q_PAD_NANDF_CS2__RAWNAND_CE2N */
+ 1378 0xb0b1 /* MX6Q_PAD_NANDF_CS3__RAWNAND_CE3N */
+ 1387 0xb0b1 /* MX6Q_PAD_SD4_CMD__RAWNAND_RDN */
+ 1393 0xb0b1 /* MX6Q_PAD_SD4_CLK__RAWNAND_WRN */
+ 1397 0xb0b1 /* MX6Q_PAD_NANDF_D0__RAWNAND_D0 */
+ 1405 0xb0b1 /* MX6Q_PAD_NANDF_D1__RAWNAND_D1 */
+ 1413 0xb0b1 /* MX6Q_PAD_NANDF_D2__RAWNAND_D2 */
+ 1421 0xb0b1 /* MX6Q_PAD_NANDF_D3__RAWNAND_D3 */
+ 1429 0xb0b1 /* MX6Q_PAD_NANDF_D4__RAWNAND_D4 */
+ 1437 0xb0b1 /* MX6Q_PAD_NANDF_D5__RAWNAND_D5 */
+ 1445 0xb0b1 /* MX6Q_PAD_NANDF_D6__RAWNAND_D6 */
+ 1453 0xb0b1 /* MX6Q_PAD_NANDF_D7__RAWNAND_D7 */
+ 1463 0x00b1>; /* MX6Q_PAD_SD4_DAT0__RAWNAND_DQS */
+ };
+ };
+
i2c1 {
pinctrl_i2c1_1: i2c1grp-1 {
fsl,pins = <137 0x4001b8b1 /* MX6Q_PAD_EIM_D21__I2C1_SCL */
--
1.7.4.4
^ permalink raw reply related [flat|nested] 19+ messages in thread
* [PATCH v3 2/3] ARM: imx6q: add DT node for gpmi nand
@ 2012-07-02 3:38 ` Huang Shijie
0 siblings, 0 replies; 19+ messages in thread
From: Huang Shijie @ 2012-07-02 3:38 UTC (permalink / raw)
To: linux-arm-kernel
Add the DT node for gpmi nand.
Add the pinmux support for gpmi nand.
The gpmi nand may conflicts with other modules, such as MMC.
So we do not enable the gpmi nand for mx6q-arm2 board, just add the
node for the board.
Acked-by: Dong Aisheng <dong.aisheng@linaro.org>
Signed-off-by: Huang Shijie <shijie8@gmail.com>
---
arch/arm/boot/dts/imx6q-arm2.dts | 6 ++++++
arch/arm/boot/dts/imx6q.dtsi | 36 ++++++++++++++++++++++++++++++++++++
2 files changed, 42 insertions(+), 0 deletions(-)
diff --git a/arch/arm/boot/dts/imx6q-arm2.dts b/arch/arm/boot/dts/imx6q-arm2.dts
index bdab44c..14e72e2 100644
--- a/arch/arm/boot/dts/imx6q-arm2.dts
+++ b/arch/arm/boot/dts/imx6q-arm2.dts
@@ -22,6 +22,12 @@
};
soc {
+ gpmi-nand at 00112000 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_gpmi_nand_1>;
+ status = "disabled"; /* gpmi nand conflicts with SD */
+ };
+
aips-bus at 02100000 { /* AIPS2 */
ethernet at 02188000 {
phy-mode = "rgmii";
diff --git a/arch/arm/boot/dts/imx6q.dtsi b/arch/arm/boot/dts/imx6q.dtsi
index 3197744..16a3884 100644
--- a/arch/arm/boot/dts/imx6q.dtsi
+++ b/arch/arm/boot/dts/imx6q.dtsi
@@ -92,6 +92,18 @@
reg = <0x00110000 0x2000>;
};
+ gpmi-nand at 00112000 {
+ compatible = "fsl,imx6q-gpmi-nand";
+ #address-cells = <1>;
+ #size-cells = <1>;
+ reg = <0x00112000 0x2000>, <0x00114000 0x2000>;
+ reg-names = "gpmi-nand", "bch";
+ interrupts = <0 13 0x04>, <0 15 0x04>;
+ interrupt-names = "gpmi-dma", "bch";
+ fsl,gpmi-dma-channel = <0>;
+ status = "disabled";
+ };
+
timer at 00a00600 {
compatible = "arm,cortex-a9-twd-timer";
reg = <0x00a00600 0x20>;
@@ -500,6 +512,30 @@
};
};
+ gpmi-nand {
+ pinctrl_gpmi_nand_1: gpmi-nand-1 {
+ fsl,pins = <1328 0xb0b1 /* MX6Q_PAD_NANDF_CLE__RAWNAND_CLE */
+ 1336 0xb0b1 /* MX6Q_PAD_NANDF_ALE__RAWNAND_ALE */
+ 1344 0xb0b1 /* MX6Q_PAD_NANDF_WP_B__RAWNAND_RESETN */
+ 1352 0xb000 /* MX6Q_PAD_NANDF_RB0__RAWNAND_READY0 */
+ 1360 0xb0b1 /* MX6Q_PAD_NANDF_CS0__RAWNAND_CE0N */
+ 1365 0xb0b1 /* MX6Q_PAD_NANDF_CS1__RAWNAND_CE1N */
+ 1371 0xb0b1 /* MX6Q_PAD_NANDF_CS2__RAWNAND_CE2N */
+ 1378 0xb0b1 /* MX6Q_PAD_NANDF_CS3__RAWNAND_CE3N */
+ 1387 0xb0b1 /* MX6Q_PAD_SD4_CMD__RAWNAND_RDN */
+ 1393 0xb0b1 /* MX6Q_PAD_SD4_CLK__RAWNAND_WRN */
+ 1397 0xb0b1 /* MX6Q_PAD_NANDF_D0__RAWNAND_D0 */
+ 1405 0xb0b1 /* MX6Q_PAD_NANDF_D1__RAWNAND_D1 */
+ 1413 0xb0b1 /* MX6Q_PAD_NANDF_D2__RAWNAND_D2 */
+ 1421 0xb0b1 /* MX6Q_PAD_NANDF_D3__RAWNAND_D3 */
+ 1429 0xb0b1 /* MX6Q_PAD_NANDF_D4__RAWNAND_D4 */
+ 1437 0xb0b1 /* MX6Q_PAD_NANDF_D5__RAWNAND_D5 */
+ 1445 0xb0b1 /* MX6Q_PAD_NANDF_D6__RAWNAND_D6 */
+ 1453 0xb0b1 /* MX6Q_PAD_NANDF_D7__RAWNAND_D7 */
+ 1463 0x00b1>; /* MX6Q_PAD_SD4_DAT0__RAWNAND_DQS */
+ };
+ };
+
i2c1 {
pinctrl_i2c1_1: i2c1grp-1 {
fsl,pins = <137 0x4001b8b1 /* MX6Q_PAD_EIM_D21__I2C1_SCL */
--
1.7.4.4
^ permalink raw reply related [flat|nested] 19+ messages in thread
* [PATCH v3 3/3] mtd: gpmi: change the code for clocks
2012-07-02 3:38 ` Huang Shijie
@ 2012-07-02 3:38 ` Huang Shijie
-1 siblings, 0 replies; 19+ messages in thread
From: Huang Shijie @ 2012-07-02 3:38 UTC (permalink / raw)
To: shawn.guo
Cc: Huang Shijie, dong.aisheng, linux-mtd, linux-arm-kernel, dedekind1
The gpmi nand driver may needs several clocks(MX6Q needs five clocks).
In the old clock framework, all these clocks are chained together,
all you need is to manipulate the first clock.
But the kernel uses the common clk framework now, which forces us to
get the clocks one by one. When we use them, we have to enable them
one by one too.
Signed-off-by: Huang Shijie <shijie8@gmail.com>
---
arch/arm/boot/dts/imx6q-arm2.dts | 2 +-
drivers/mtd/nand/gpmi-nand/gpmi-lib.c | 43 ++++++++++++++---
drivers/mtd/nand/gpmi-nand/gpmi-nand.c | 82 ++++++++++++++++++++++++++++----
drivers/mtd/nand/gpmi-nand/gpmi-nand.h | 3 +-
4 files changed, 111 insertions(+), 19 deletions(-)
diff --git a/arch/arm/boot/dts/imx6q-arm2.dts b/arch/arm/boot/dts/imx6q-arm2.dts
index 14e72e2..027a2f8 100644
--- a/arch/arm/boot/dts/imx6q-arm2.dts
+++ b/arch/arm/boot/dts/imx6q-arm2.dts
@@ -25,7 +25,7 @@
gpmi-nand@00112000 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_gpmi_nand_1>;
- status = "disabled"; /* gpmi nand conflicts with SD */
+ status = "okay"; /* gpmi nand conflicts with SD */
};
aips-bus@02100000 { /* AIPS2 */
diff --git a/drivers/mtd/nand/gpmi-nand/gpmi-lib.c b/drivers/mtd/nand/gpmi-nand/gpmi-lib.c
index a1f4332..c3778c0 100644
--- a/drivers/mtd/nand/gpmi-nand/gpmi-lib.c
+++ b/drivers/mtd/nand/gpmi-nand/gpmi-lib.c
@@ -124,12 +124,40 @@ error:
return -ETIMEDOUT;
}
+static int __gpmi_enable_clk(struct gpmi_nand_data *this, bool v)
+{
+ struct clk *clk;
+ int ret;
+ int i;
+
+ for (i = 0; i < GPMI_CLK_MAX; i++) {
+ clk = this->resources.clock[i];
+ if (!clk)
+ break;
+
+ if (v) {
+ ret = clk_prepare_enable(clk);
+ if (ret)
+ goto err_clk;
+ } else {
+ clk_disable_unprepare(clk);
+ }
+ }
+ return 0;
+
+err_clk:
+ return ret;
+}
+
+#define gpmi_enable_clk(x) __gpmi_enable_clk(x, true)
+#define gpmi_disable_clk(x) __gpmi_enable_clk(x, false)
+
int gpmi_init(struct gpmi_nand_data *this)
{
struct resources *r = &this->resources;
int ret;
- ret = clk_prepare_enable(r->clock);
+ ret = gpmi_enable_clk(this);
if (ret)
goto err_out;
ret = gpmi_reset_block(r->gpmi_regs, false);
@@ -149,7 +177,7 @@ int gpmi_init(struct gpmi_nand_data *this)
/* Select BCH ECC. */
writel(BM_GPMI_CTRL1_BCH_MODE, r->gpmi_regs + HW_GPMI_CTRL1_SET);
- clk_disable_unprepare(r->clock);
+ gpmi_disable_clk(this);
return 0;
err_out:
return ret;
@@ -205,7 +233,7 @@ int bch_set_geometry(struct gpmi_nand_data *this)
ecc_strength = bch_geo->ecc_strength >> 1;
page_size = bch_geo->page_size;
- ret = clk_prepare_enable(r->clock);
+ ret = gpmi_enable_clk(this);
if (ret)
goto err_out;
@@ -240,7 +268,7 @@ int bch_set_geometry(struct gpmi_nand_data *this)
writel(BM_BCH_CTRL_COMPLETE_IRQ_EN,
r->bch_regs + HW_BCH_CTRL_SET);
- clk_disable_unprepare(r->clock);
+ gpmi_disable_clk(this);
return 0;
err_out:
return ret;
@@ -716,7 +744,7 @@ void gpmi_begin(struct gpmi_nand_data *this)
int ret;
/* Enable the clock. */
- ret = clk_prepare_enable(r->clock);
+ ret = gpmi_enable_clk(this);
if (ret) {
pr_err("We failed in enable the clk\n");
goto err_out;
@@ -727,7 +755,7 @@ void gpmi_begin(struct gpmi_nand_data *this)
gpmi_regs + HW_GPMI_TIMING1);
/* Get the timing information we need. */
- nfc->clock_frequency_in_hz = clk_get_rate(r->clock);
+ nfc->clock_frequency_in_hz = clk_get_rate(r->clock[0]);
clock_period_in_ns = 1000000000 / nfc->clock_frequency_in_hz;
gpmi_nfc_compute_hardware_timing(this, &hw);
@@ -784,8 +812,7 @@ err_out:
void gpmi_end(struct gpmi_nand_data *this)
{
- struct resources *r = &this->resources;
- clk_disable_unprepare(r->clock);
+ gpmi_disable_clk(this);
}
/* Clears a BCH interrupt. */
diff --git a/drivers/mtd/nand/gpmi-nand/gpmi-nand.c b/drivers/mtd/nand/gpmi-nand/gpmi-nand.c
index 941cfb7..b8bd3d2 100644
--- a/drivers/mtd/nand/gpmi-nand/gpmi-nand.c
+++ b/drivers/mtd/nand/gpmi-nand/gpmi-nand.c
@@ -464,9 +464,78 @@ acquire_err:
return -EINVAL;
}
+static void gpmi_put_clks(struct gpmi_nand_data *this)
+{
+ struct resources *r = &this->resources;
+ struct clk *clk;
+ int i;
+
+ for (i = 0; i < GPMI_CLK_MAX; i++) {
+ clk = r->clock[i];
+ if (clk) {
+ clk_put(clk);
+ r->clock[i] = NULL;
+ }
+ }
+}
+
+static char *extra_clks_for_mx6q[GPMI_CLK_MAX] = {
+ "gpmi_apb", "gpmi_bch", "gpmi_bch_apb", "per1_bch",
+};
+
+static int __devinit gpmi_get_clks(struct gpmi_nand_data *this)
+{
+ struct resources *r = &this->resources;
+ char **extra_clks = NULL;
+ struct clk *clk;
+ int i;
+
+ /* The main clock is stored in the first. */
+ r->clock[0] = clk_get(this->dev, NULL);
+ if (IS_ERR(r->clock[0]))
+ goto err_clock;
+
+ /* Get extra clocks */
+ if (GPMI_IS_MX6Q(this))
+ extra_clks = extra_clks_for_mx6q;
+ if (!extra_clks)
+ return 0;
+
+ for (i = 1; i < GPMI_CLK_MAX; i++) {
+ if (extra_clks[i - 1] == NULL)
+ break;
+
+ clk = clk_get(this->dev, extra_clks[i - 1]);
+ if (IS_ERR(clk))
+ goto err_clock;
+
+ r->clock[i] = clk;
+ }
+
+ if (GPMI_IS_MX6Q(this)) {
+ /*
+ * Set the default values for the clocks in mx6q:
+ * The main clock(enfc) : 22MHz
+ * The others : 44.5MHz
+ *
+ * These are just the default values. If you want to use
+ * the ONFI nand which is in the Synchronous Mode, you should
+ * change the clocks's frequencies as you need.
+ */
+ clk_set_rate(r->clock[0], 22000000);
+ for (i = 1; i < GPMI_CLK_MAX && r->clock[i]; i++)
+ clk_set_rate(r->clock[i], 44500000);
+ }
+ return 0;
+
+err_clock:
+ dev_dbg(this->dev, "failed in finding the clocks.\n");
+ gpmi_put_clks(this);
+ return -ENOMEM;
+}
+
static int __devinit acquire_resources(struct gpmi_nand_data *this)
{
- struct resources *res = &this->resources;
struct pinctrl *pinctrl;
int ret;
@@ -492,12 +561,9 @@ static int __devinit acquire_resources(struct gpmi_nand_data *this)
goto exit_pin;
}
- res->clock = clk_get(&this->pdev->dev, NULL);
- if (IS_ERR(res->clock)) {
- pr_err("can not get the clock\n");
- ret = -ENOENT;
+ ret = gpmi_get_clks(this);
+ if (ret)
goto exit_clock;
- }
return 0;
exit_clock:
@@ -512,9 +578,7 @@ exit_regs:
static void release_resources(struct gpmi_nand_data *this)
{
- struct resources *r = &this->resources;
-
- clk_put(r->clock);
+ gpmi_put_clks(this);
release_register_block(this);
release_bch_irq(this);
release_dma_channels(this);
diff --git a/drivers/mtd/nand/gpmi-nand/gpmi-nand.h b/drivers/mtd/nand/gpmi-nand/gpmi-nand.h
index ce5daa1..1547a60 100644
--- a/drivers/mtd/nand/gpmi-nand/gpmi-nand.h
+++ b/drivers/mtd/nand/gpmi-nand/gpmi-nand.h
@@ -22,6 +22,7 @@
#include <linux/dma-mapping.h>
#include <linux/fsl/mxs-dma.h>
+#define GPMI_CLK_MAX 5 /* MX6Q needs five clocks */
struct resources {
void *gpmi_regs;
void *bch_regs;
@@ -29,7 +30,7 @@ struct resources {
unsigned int bch_high_interrupt;
unsigned int dma_low_channel;
unsigned int dma_high_channel;
- struct clk *clock;
+ struct clk *clock[GPMI_CLK_MAX];
};
/**
--
1.7.4.4
^ permalink raw reply related [flat|nested] 19+ messages in thread
* [PATCH v3 3/3] mtd: gpmi: change the code for clocks
@ 2012-07-02 3:38 ` Huang Shijie
0 siblings, 0 replies; 19+ messages in thread
From: Huang Shijie @ 2012-07-02 3:38 UTC (permalink / raw)
To: linux-arm-kernel
The gpmi nand driver may needs several clocks(MX6Q needs five clocks).
In the old clock framework, all these clocks are chained together,
all you need is to manipulate the first clock.
But the kernel uses the common clk framework now, which forces us to
get the clocks one by one. When we use them, we have to enable them
one by one too.
Signed-off-by: Huang Shijie <shijie8@gmail.com>
---
arch/arm/boot/dts/imx6q-arm2.dts | 2 +-
drivers/mtd/nand/gpmi-nand/gpmi-lib.c | 43 ++++++++++++++---
drivers/mtd/nand/gpmi-nand/gpmi-nand.c | 82 ++++++++++++++++++++++++++++----
drivers/mtd/nand/gpmi-nand/gpmi-nand.h | 3 +-
4 files changed, 111 insertions(+), 19 deletions(-)
diff --git a/arch/arm/boot/dts/imx6q-arm2.dts b/arch/arm/boot/dts/imx6q-arm2.dts
index 14e72e2..027a2f8 100644
--- a/arch/arm/boot/dts/imx6q-arm2.dts
+++ b/arch/arm/boot/dts/imx6q-arm2.dts
@@ -25,7 +25,7 @@
gpmi-nand at 00112000 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_gpmi_nand_1>;
- status = "disabled"; /* gpmi nand conflicts with SD */
+ status = "okay"; /* gpmi nand conflicts with SD */
};
aips-bus at 02100000 { /* AIPS2 */
diff --git a/drivers/mtd/nand/gpmi-nand/gpmi-lib.c b/drivers/mtd/nand/gpmi-nand/gpmi-lib.c
index a1f4332..c3778c0 100644
--- a/drivers/mtd/nand/gpmi-nand/gpmi-lib.c
+++ b/drivers/mtd/nand/gpmi-nand/gpmi-lib.c
@@ -124,12 +124,40 @@ error:
return -ETIMEDOUT;
}
+static int __gpmi_enable_clk(struct gpmi_nand_data *this, bool v)
+{
+ struct clk *clk;
+ int ret;
+ int i;
+
+ for (i = 0; i < GPMI_CLK_MAX; i++) {
+ clk = this->resources.clock[i];
+ if (!clk)
+ break;
+
+ if (v) {
+ ret = clk_prepare_enable(clk);
+ if (ret)
+ goto err_clk;
+ } else {
+ clk_disable_unprepare(clk);
+ }
+ }
+ return 0;
+
+err_clk:
+ return ret;
+}
+
+#define gpmi_enable_clk(x) __gpmi_enable_clk(x, true)
+#define gpmi_disable_clk(x) __gpmi_enable_clk(x, false)
+
int gpmi_init(struct gpmi_nand_data *this)
{
struct resources *r = &this->resources;
int ret;
- ret = clk_prepare_enable(r->clock);
+ ret = gpmi_enable_clk(this);
if (ret)
goto err_out;
ret = gpmi_reset_block(r->gpmi_regs, false);
@@ -149,7 +177,7 @@ int gpmi_init(struct gpmi_nand_data *this)
/* Select BCH ECC. */
writel(BM_GPMI_CTRL1_BCH_MODE, r->gpmi_regs + HW_GPMI_CTRL1_SET);
- clk_disable_unprepare(r->clock);
+ gpmi_disable_clk(this);
return 0;
err_out:
return ret;
@@ -205,7 +233,7 @@ int bch_set_geometry(struct gpmi_nand_data *this)
ecc_strength = bch_geo->ecc_strength >> 1;
page_size = bch_geo->page_size;
- ret = clk_prepare_enable(r->clock);
+ ret = gpmi_enable_clk(this);
if (ret)
goto err_out;
@@ -240,7 +268,7 @@ int bch_set_geometry(struct gpmi_nand_data *this)
writel(BM_BCH_CTRL_COMPLETE_IRQ_EN,
r->bch_regs + HW_BCH_CTRL_SET);
- clk_disable_unprepare(r->clock);
+ gpmi_disable_clk(this);
return 0;
err_out:
return ret;
@@ -716,7 +744,7 @@ void gpmi_begin(struct gpmi_nand_data *this)
int ret;
/* Enable the clock. */
- ret = clk_prepare_enable(r->clock);
+ ret = gpmi_enable_clk(this);
if (ret) {
pr_err("We failed in enable the clk\n");
goto err_out;
@@ -727,7 +755,7 @@ void gpmi_begin(struct gpmi_nand_data *this)
gpmi_regs + HW_GPMI_TIMING1);
/* Get the timing information we need. */
- nfc->clock_frequency_in_hz = clk_get_rate(r->clock);
+ nfc->clock_frequency_in_hz = clk_get_rate(r->clock[0]);
clock_period_in_ns = 1000000000 / nfc->clock_frequency_in_hz;
gpmi_nfc_compute_hardware_timing(this, &hw);
@@ -784,8 +812,7 @@ err_out:
void gpmi_end(struct gpmi_nand_data *this)
{
- struct resources *r = &this->resources;
- clk_disable_unprepare(r->clock);
+ gpmi_disable_clk(this);
}
/* Clears a BCH interrupt. */
diff --git a/drivers/mtd/nand/gpmi-nand/gpmi-nand.c b/drivers/mtd/nand/gpmi-nand/gpmi-nand.c
index 941cfb7..b8bd3d2 100644
--- a/drivers/mtd/nand/gpmi-nand/gpmi-nand.c
+++ b/drivers/mtd/nand/gpmi-nand/gpmi-nand.c
@@ -464,9 +464,78 @@ acquire_err:
return -EINVAL;
}
+static void gpmi_put_clks(struct gpmi_nand_data *this)
+{
+ struct resources *r = &this->resources;
+ struct clk *clk;
+ int i;
+
+ for (i = 0; i < GPMI_CLK_MAX; i++) {
+ clk = r->clock[i];
+ if (clk) {
+ clk_put(clk);
+ r->clock[i] = NULL;
+ }
+ }
+}
+
+static char *extra_clks_for_mx6q[GPMI_CLK_MAX] = {
+ "gpmi_apb", "gpmi_bch", "gpmi_bch_apb", "per1_bch",
+};
+
+static int __devinit gpmi_get_clks(struct gpmi_nand_data *this)
+{
+ struct resources *r = &this->resources;
+ char **extra_clks = NULL;
+ struct clk *clk;
+ int i;
+
+ /* The main clock is stored in the first. */
+ r->clock[0] = clk_get(this->dev, NULL);
+ if (IS_ERR(r->clock[0]))
+ goto err_clock;
+
+ /* Get extra clocks */
+ if (GPMI_IS_MX6Q(this))
+ extra_clks = extra_clks_for_mx6q;
+ if (!extra_clks)
+ return 0;
+
+ for (i = 1; i < GPMI_CLK_MAX; i++) {
+ if (extra_clks[i - 1] == NULL)
+ break;
+
+ clk = clk_get(this->dev, extra_clks[i - 1]);
+ if (IS_ERR(clk))
+ goto err_clock;
+
+ r->clock[i] = clk;
+ }
+
+ if (GPMI_IS_MX6Q(this)) {
+ /*
+ * Set the default values for the clocks in mx6q:
+ * The main clock(enfc) : 22MHz
+ * The others : 44.5MHz
+ *
+ * These are just the default values. If you want to use
+ * the ONFI nand which is in the Synchronous Mode, you should
+ * change the clocks's frequencies as you need.
+ */
+ clk_set_rate(r->clock[0], 22000000);
+ for (i = 1; i < GPMI_CLK_MAX && r->clock[i]; i++)
+ clk_set_rate(r->clock[i], 44500000);
+ }
+ return 0;
+
+err_clock:
+ dev_dbg(this->dev, "failed in finding the clocks.\n");
+ gpmi_put_clks(this);
+ return -ENOMEM;
+}
+
static int __devinit acquire_resources(struct gpmi_nand_data *this)
{
- struct resources *res = &this->resources;
struct pinctrl *pinctrl;
int ret;
@@ -492,12 +561,9 @@ static int __devinit acquire_resources(struct gpmi_nand_data *this)
goto exit_pin;
}
- res->clock = clk_get(&this->pdev->dev, NULL);
- if (IS_ERR(res->clock)) {
- pr_err("can not get the clock\n");
- ret = -ENOENT;
+ ret = gpmi_get_clks(this);
+ if (ret)
goto exit_clock;
- }
return 0;
exit_clock:
@@ -512,9 +578,7 @@ exit_regs:
static void release_resources(struct gpmi_nand_data *this)
{
- struct resources *r = &this->resources;
-
- clk_put(r->clock);
+ gpmi_put_clks(this);
release_register_block(this);
release_bch_irq(this);
release_dma_channels(this);
diff --git a/drivers/mtd/nand/gpmi-nand/gpmi-nand.h b/drivers/mtd/nand/gpmi-nand/gpmi-nand.h
index ce5daa1..1547a60 100644
--- a/drivers/mtd/nand/gpmi-nand/gpmi-nand.h
+++ b/drivers/mtd/nand/gpmi-nand/gpmi-nand.h
@@ -22,6 +22,7 @@
#include <linux/dma-mapping.h>
#include <linux/fsl/mxs-dma.h>
+#define GPMI_CLK_MAX 5 /* MX6Q needs five clocks */
struct resources {
void *gpmi_regs;
void *bch_regs;
@@ -29,7 +30,7 @@ struct resources {
unsigned int bch_high_interrupt;
unsigned int dma_low_channel;
unsigned int dma_high_channel;
- struct clk *clock;
+ struct clk *clock[GPMI_CLK_MAX];
};
/**
--
1.7.4.4
^ permalink raw reply related [flat|nested] 19+ messages in thread
* Re: [PATCH v3 3/3] mtd: gpmi: change the code for clocks
2012-07-02 3:38 ` Huang Shijie
@ 2012-07-02 5:39 ` Hui Wang
-1 siblings, 0 replies; 19+ messages in thread
From: Hui Wang @ 2012-07-02 5:39 UTC (permalink / raw)
To: Huang Shijie
Cc: shawn.guo, linux-mtd, linux-arm-kernel, dong.aisheng, dedekind1
Huang Shijie wrote:
> The gpmi nand driver may needs several clocks(MX6Q needs five clocks).
>
> In the old clock framework, all these clocks are chained together,
> all you need is to manipulate the first clock.
>
> But the kernel uses the common clk framework now, which forces us to
> get the clocks one by one. When we use them, we have to enable them
> one by one too.
>
> Signed-off-by: Huang Shijie <shijie8@gmail.com>
> ---
> arch/arm/boot/dts/imx6q-arm2.dts | 2 +-
> drivers/mtd/nand/gpmi-nand/gpmi-lib.c | 43 ++++++++++++++---
> drivers/mtd/nand/gpmi-nand/gpmi-nand.c | 82 ++++++++++++++++++++++++++++----
> drivers/mtd/nand/gpmi-nand/gpmi-nand.h | 3 +-
> 4 files changed, 111 insertions(+), 19 deletions(-)
>
> diff --git a/arch/arm/boot/dts/imx6q-arm2.dts b/arch/arm/boot/dts/imx6q-arm2.dts
> index 14e72e2..027a2f8 100644
> --- a/arch/arm/boot/dts/imx6q-arm2.dts
> +++ b/arch/arm/boot/dts/imx6q-arm2.dts
> @@ -25,7 +25,7 @@
> gpmi-nand@00112000 {
> pinctrl-names = "default";
> pinctrl-0 = <&pinctrl_gpmi_nand_1>;
> - status = "disabled"; /* gpmi nand conflicts with SD */
> + status = "okay"; /* gpmi nand conflicts with SD */
> };
>
> aips-bus@02100000 { /* AIPS2 */
> diff --git a/drivers/mtd/nand/gpmi-nand/gpmi-lib.c b/drivers/mtd/nand/gpmi-nand/gpmi-lib.c
> index a1f4332..c3778c0 100644
> --- a/drivers/mtd/nand/gpmi-nand/gpmi-lib.c
> +++ b/drivers/mtd/nand/gpmi-nand/gpmi-lib.c
> @@ -124,12 +124,40 @@ error:
> return -ETIMEDOUT;
> }
>
> +static int __gpmi_enable_clk(struct gpmi_nand_data *this, bool v)
> +{
> + struct clk *clk;
> + int ret;
> + int i;
> +
> + for (i = 0; i < GPMI_CLK_MAX; i++) {
> + clk = this->resources.clock[i];
> + if (!clk)
> + break;
> +
> + if (v) {
> + ret = clk_prepare_enable(clk);
> + if (ret)
> + goto err_clk;
> + } else {
> + clk_disable_unprepare(clk);
> + }
> + }
> + return 0;
> +
> +err_clk:
>
Doesn't this design introduce clk_enalbe/disable un-balance problems?
Suppose you successfully enabled 1st and 2nd clocks, and failed at the
third clock, this function will return, then the caller function will
check the return value and call
__gpmi_enable_clk(this, 0), in this function, it will unconditionally disable all five clocks.
Regards,
Hui.
> + return ret;
> +}
> +
>
^ permalink raw reply [flat|nested] 19+ messages in thread
* [PATCH v3 3/3] mtd: gpmi: change the code for clocks
@ 2012-07-02 5:39 ` Hui Wang
0 siblings, 0 replies; 19+ messages in thread
From: Hui Wang @ 2012-07-02 5:39 UTC (permalink / raw)
To: linux-arm-kernel
Huang Shijie wrote:
> The gpmi nand driver may needs several clocks(MX6Q needs five clocks).
>
> In the old clock framework, all these clocks are chained together,
> all you need is to manipulate the first clock.
>
> But the kernel uses the common clk framework now, which forces us to
> get the clocks one by one. When we use them, we have to enable them
> one by one too.
>
> Signed-off-by: Huang Shijie <shijie8@gmail.com>
> ---
> arch/arm/boot/dts/imx6q-arm2.dts | 2 +-
> drivers/mtd/nand/gpmi-nand/gpmi-lib.c | 43 ++++++++++++++---
> drivers/mtd/nand/gpmi-nand/gpmi-nand.c | 82 ++++++++++++++++++++++++++++----
> drivers/mtd/nand/gpmi-nand/gpmi-nand.h | 3 +-
> 4 files changed, 111 insertions(+), 19 deletions(-)
>
> diff --git a/arch/arm/boot/dts/imx6q-arm2.dts b/arch/arm/boot/dts/imx6q-arm2.dts
> index 14e72e2..027a2f8 100644
> --- a/arch/arm/boot/dts/imx6q-arm2.dts
> +++ b/arch/arm/boot/dts/imx6q-arm2.dts
> @@ -25,7 +25,7 @@
> gpmi-nand at 00112000 {
> pinctrl-names = "default";
> pinctrl-0 = <&pinctrl_gpmi_nand_1>;
> - status = "disabled"; /* gpmi nand conflicts with SD */
> + status = "okay"; /* gpmi nand conflicts with SD */
> };
>
> aips-bus at 02100000 { /* AIPS2 */
> diff --git a/drivers/mtd/nand/gpmi-nand/gpmi-lib.c b/drivers/mtd/nand/gpmi-nand/gpmi-lib.c
> index a1f4332..c3778c0 100644
> --- a/drivers/mtd/nand/gpmi-nand/gpmi-lib.c
> +++ b/drivers/mtd/nand/gpmi-nand/gpmi-lib.c
> @@ -124,12 +124,40 @@ error:
> return -ETIMEDOUT;
> }
>
> +static int __gpmi_enable_clk(struct gpmi_nand_data *this, bool v)
> +{
> + struct clk *clk;
> + int ret;
> + int i;
> +
> + for (i = 0; i < GPMI_CLK_MAX; i++) {
> + clk = this->resources.clock[i];
> + if (!clk)
> + break;
> +
> + if (v) {
> + ret = clk_prepare_enable(clk);
> + if (ret)
> + goto err_clk;
> + } else {
> + clk_disable_unprepare(clk);
> + }
> + }
> + return 0;
> +
> +err_clk:
>
Doesn't this design introduce clk_enalbe/disable un-balance problems?
Suppose you successfully enabled 1st and 2nd clocks, and failed at the
third clock, this function will return, then the caller function will
check the return value and call
__gpmi_enable_clk(this, 0), in this function, it will unconditionally disable all five clocks.
Regards,
Hui.
> + return ret;
> +}
> +
>
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH v3 3/3] mtd: gpmi: change the code for clocks
2012-07-02 5:39 ` Hui Wang
@ 2012-07-02 6:00 ` Huang Shijie
-1 siblings, 0 replies; 19+ messages in thread
From: Huang Shijie @ 2012-07-02 6:00 UTC (permalink / raw)
To: Hui Wang
Cc: shawn.guo, dedekind1, linux-mtd, dong.aisheng, Huang Shijie,
linux-arm-kernel
于 2012年07月02日 13:39, Hui Wang 写道:
> Huang Shijie wrote:
>> The gpmi nand driver may needs several clocks(MX6Q needs five clocks).
>>
>> In the old clock framework, all these clocks are chained together,
>> all you need is to manipulate the first clock.
>>
>> But the kernel uses the common clk framework now, which forces us to
>> get the clocks one by one. When we use them, we have to enable them
>> one by one too.
>>
>> Signed-off-by: Huang Shijie <shijie8@gmail.com>
>> ---
>> arch/arm/boot/dts/imx6q-arm2.dts | 2 +-
>> drivers/mtd/nand/gpmi-nand/gpmi-lib.c | 43 ++++++++++++++---
>> drivers/mtd/nand/gpmi-nand/gpmi-nand.c | 82
>> ++++++++++++++++++++++++++++----
>> drivers/mtd/nand/gpmi-nand/gpmi-nand.h | 3 +-
>> 4 files changed, 111 insertions(+), 19 deletions(-)
>>
>> diff --git a/arch/arm/boot/dts/imx6q-arm2.dts
>> b/arch/arm/boot/dts/imx6q-arm2.dts
>> index 14e72e2..027a2f8 100644
>> --- a/arch/arm/boot/dts/imx6q-arm2.dts
>> +++ b/arch/arm/boot/dts/imx6q-arm2.dts
>> @@ -25,7 +25,7 @@
>> gpmi-nand@00112000 {
>> pinctrl-names = "default";
>> pinctrl-0 = <&pinctrl_gpmi_nand_1>;
>> - status = "disabled"; /* gpmi nand conflicts with SD */
>> + status = "okay"; /* gpmi nand conflicts with SD */
>> };
>>
>> aips-bus@02100000 { /* AIPS2 */
>> diff --git a/drivers/mtd/nand/gpmi-nand/gpmi-lib.c
>> b/drivers/mtd/nand/gpmi-nand/gpmi-lib.c
>> index a1f4332..c3778c0 100644
>> --- a/drivers/mtd/nand/gpmi-nand/gpmi-lib.c
>> +++ b/drivers/mtd/nand/gpmi-nand/gpmi-lib.c
>> @@ -124,12 +124,40 @@ error:
>> return -ETIMEDOUT;
>> }
>>
>> +static int __gpmi_enable_clk(struct gpmi_nand_data *this, bool v)
>> +{
>> + struct clk *clk;
>> + int ret;
>> + int i;
>> +
>> + for (i = 0; i < GPMI_CLK_MAX; i++) {
>> + clk = this->resources.clock[i];
>> + if (!clk)
>> + break;
>> +
>> + if (v) {
>> + ret = clk_prepare_enable(clk);
>> + if (ret)
>> + goto err_clk;
>> + } else {
>> + clk_disable_unprepare(clk);
>> + }
>> + }
>> + return 0;
>> +
>> +err_clk:
> Doesn't this design introduce clk_enalbe/disable un-balance problems?
>
> Suppose you successfully enabled 1st and 2nd clocks, and failed at the
> third clock, this function will return, then the caller function will
> check the return value and call
>
> __gpmi_enable_clk(this, 0), in this function, it will unconditionally
> disable all five clocks.
thanks, fix it in next version.
Huang Shijie
>
>
> Regards,
> Hui.
>
>> + return ret;
>> +}
>> +
>
>
> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-kernel@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
>
^ permalink raw reply [flat|nested] 19+ messages in thread
* [PATCH v3 3/3] mtd: gpmi: change the code for clocks
@ 2012-07-02 6:00 ` Huang Shijie
0 siblings, 0 replies; 19+ messages in thread
From: Huang Shijie @ 2012-07-02 6:00 UTC (permalink / raw)
To: linux-arm-kernel
? 2012?07?02? 13:39, Hui Wang ??:
> Huang Shijie wrote:
>> The gpmi nand driver may needs several clocks(MX6Q needs five clocks).
>>
>> In the old clock framework, all these clocks are chained together,
>> all you need is to manipulate the first clock.
>>
>> But the kernel uses the common clk framework now, which forces us to
>> get the clocks one by one. When we use them, we have to enable them
>> one by one too.
>>
>> Signed-off-by: Huang Shijie <shijie8@gmail.com>
>> ---
>> arch/arm/boot/dts/imx6q-arm2.dts | 2 +-
>> drivers/mtd/nand/gpmi-nand/gpmi-lib.c | 43 ++++++++++++++---
>> drivers/mtd/nand/gpmi-nand/gpmi-nand.c | 82
>> ++++++++++++++++++++++++++++----
>> drivers/mtd/nand/gpmi-nand/gpmi-nand.h | 3 +-
>> 4 files changed, 111 insertions(+), 19 deletions(-)
>>
>> diff --git a/arch/arm/boot/dts/imx6q-arm2.dts
>> b/arch/arm/boot/dts/imx6q-arm2.dts
>> index 14e72e2..027a2f8 100644
>> --- a/arch/arm/boot/dts/imx6q-arm2.dts
>> +++ b/arch/arm/boot/dts/imx6q-arm2.dts
>> @@ -25,7 +25,7 @@
>> gpmi-nand at 00112000 {
>> pinctrl-names = "default";
>> pinctrl-0 = <&pinctrl_gpmi_nand_1>;
>> - status = "disabled"; /* gpmi nand conflicts with SD */
>> + status = "okay"; /* gpmi nand conflicts with SD */
>> };
>>
>> aips-bus at 02100000 { /* AIPS2 */
>> diff --git a/drivers/mtd/nand/gpmi-nand/gpmi-lib.c
>> b/drivers/mtd/nand/gpmi-nand/gpmi-lib.c
>> index a1f4332..c3778c0 100644
>> --- a/drivers/mtd/nand/gpmi-nand/gpmi-lib.c
>> +++ b/drivers/mtd/nand/gpmi-nand/gpmi-lib.c
>> @@ -124,12 +124,40 @@ error:
>> return -ETIMEDOUT;
>> }
>>
>> +static int __gpmi_enable_clk(struct gpmi_nand_data *this, bool v)
>> +{
>> + struct clk *clk;
>> + int ret;
>> + int i;
>> +
>> + for (i = 0; i < GPMI_CLK_MAX; i++) {
>> + clk = this->resources.clock[i];
>> + if (!clk)
>> + break;
>> +
>> + if (v) {
>> + ret = clk_prepare_enable(clk);
>> + if (ret)
>> + goto err_clk;
>> + } else {
>> + clk_disable_unprepare(clk);
>> + }
>> + }
>> + return 0;
>> +
>> +err_clk:
> Doesn't this design introduce clk_enalbe/disable un-balance problems?
>
> Suppose you successfully enabled 1st and 2nd clocks, and failed at the
> third clock, this function will return, then the caller function will
> check the return value and call
>
> __gpmi_enable_clk(this, 0), in this function, it will unconditionally
> disable all five clocks.
thanks, fix it in next version.
Huang Shijie
>
>
> Regards,
> Hui.
>
>> + return ret;
>> +}
>> +
>
>
> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-kernel at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
>
^ permalink raw reply [flat|nested] 19+ messages in thread
end of thread, other threads:[~2012-07-02 6:00 UTC | newest]
Thread overview: 19+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-07-02 3:38 [PATCH v3 0/3] add gpmi support for imx6q Huang Shijie
2012-07-02 3:38 ` Huang Shijie
2012-07-02 3:38 ` [PATCH v3 1/3] ARM: imx6q: add clocks for gpmi-nand Huang Shijie
2012-07-02 3:38 ` Huang Shijie
2012-07-02 2:10 ` Shawn Guo
2012-07-02 2:10 ` Shawn Guo
2012-07-02 2:36 ` Huang Shijie
2012-07-02 3:38 ` [PATCH v3 2/3] ARM: imx6q: add DT node for gpmi nand Huang Shijie
2012-07-02 3:38 ` Huang Shijie
2012-07-02 2:24 ` Shawn Guo
2012-07-02 2:24 ` Shawn Guo
2012-07-02 3:38 ` [PATCH v3 3/3] mtd: gpmi: change the code for clocks Huang Shijie
2012-07-02 3:38 ` Huang Shijie
2012-07-02 2:48 ` Huang Shijie
2012-07-02 2:48 ` Huang Shijie
2012-07-02 5:39 ` Hui Wang
2012-07-02 5:39 ` Hui Wang
2012-07-02 6:00 ` Huang Shijie
2012-07-02 6:00 ` Huang Shijie
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.