[PATCH] usb: phy: phy-msm-usb: Fix usage of devm_regulator_bulk_get()
The regulator_bulk_data pointer passed to devm_regulator_bulk_get() is used to store the client handles for the regulators, which is later used by devm_regulator_bulk_release() to free the regulators. Passing a local array as is done here means the memory used to store the handles is freed causing the handles to be corrupted, resulting in a crash when devm_regulator_bulk_release() tries to free them. Fix this my moving the array inside of the msm_otg structure. Signed-off-by: Rajendra Nayak <rna...@codeaurora.org> --- drivers/usb/phy/phy-msm-usb.c | 17 + 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/drivers/usb/phy/phy-msm-usb.c b/drivers/usb/phy/phy-msm-usb.c index 8fb86a5..3d0dd2f 100644 --- a/drivers/usb/phy/phy-msm-usb.c +++ b/drivers/usb/phy/phy-msm-usb.c @@ -197,6 +197,7 @@ struct msm_otg { struct regulator *v3p3; struct regulator *v1p8; struct regulator *vddcx; + struct regulator_bulk_data supplies[3]; struct reset_control *phy_rst; struct reset_control *link_rst; @@ -1731,7 +1732,6 @@ static int msm_otg_reboot_notify(struct notifier_block *this, static int msm_otg_probe(struct platform_device *pdev) { - struct regulator_bulk_data regs[3]; int ret = 0; struct device_node *np = pdev->dev.of_node; struct msm_otg_platform_data *pdata; @@ -1817,17 +1817,18 @@ static int msm_otg_probe(struct platform_device *pdev) return motg->irq; } - regs[0].supply = "vddcx"; - regs[1].supply = "v3p3"; - regs[2].supply = "v1p8"; + motg->supplies[0].supply = "vddcx"; + motg->supplies[1].supply = "v3p3"; + motg->supplies[2].supply = "v1p8"; - ret = devm_regulator_bulk_get(motg->phy.dev, ARRAY_SIZE(regs), regs); + ret = devm_regulator_bulk_get(motg->phy.dev, ARRAY_SIZE(motg->supplies), + motg->supplies); if (ret) return ret; - motg->vddcx = regs[0].consumer; - motg->v3p3 = regs[1].consumer; - motg->v1p8 = regs[2].consumer; + motg->vddcx = motg->supplies[0].consumer; + motg->v3p3 = motg->supplies[1].consumer; + motg->v1p8 = motg->supplies[2].consumer; clk_set_rate(motg->clk, 6000); -- QUALCOMM INDIA, on behalf of 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-usb" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH v3 5/7] ARM: DRA7: hwmod: Add SYSCONFIG for usb_otg_ss
On Wednesday 18 June 2014 04:40 PM, Roger Quadros wrote: + Nishant and Rajendra for review. On 05/05/2014 12:54 PM, Roger Quadros wrote: Add the sysconfig class bits for the Super Speed USB controllers CC: Paul Walmsley p...@pwsan.com Signed-off-by: Roger Quadros rog...@ti.com verified against TRM version vP, looks good to me. Reviewed-by: Rajendra Nayak rna...@ti.com --- arch/arm/mach-omap2/omap_hwmod_7xx_data.c | 12 1 file changed, 12 insertions(+) diff --git a/arch/arm/mach-omap2/omap_hwmod_7xx_data.c b/arch/arm/mach-omap2/omap_hwmod_7xx_data.c index 810c205..067d322 100644 --- a/arch/arm/mach-omap2/omap_hwmod_7xx_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_7xx_data.c @@ -1731,8 +1731,20 @@ static struct omap_hwmod dra7xx_uart6_hwmod = { * */ +static struct omap_hwmod_class_sysconfig dra7xx_usb_otg_ss_sysc = { +.rev_offs = 0x, +.sysc_offs = 0x0010, +.sysc_flags = (SYSC_HAS_DMADISABLE | SYSC_HAS_MIDLEMODE | + SYSC_HAS_SIDLEMODE), +.idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART | + SIDLE_SMART_WKUP | MSTANDBY_FORCE | MSTANDBY_NO | + MSTANDBY_SMART | MSTANDBY_SMART_WKUP), +.sysc_fields= omap_hwmod_sysc_type2, +}; + static struct omap_hwmod_class dra7xx_usb_otg_ss_hwmod_class = { .name = usb_otg_ss, +.sysc = dra7xx_usb_otg_ss_sysc, }; /* usb_otg_ss1 */ -- To unsubscribe from this list: send the line unsubscribe linux-usb in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [RFC][PATCH 1/2] ARM: OMAP4: clock: Add device tree support for AUXCLKs
Hi Tony, On Thursday 04 April 2013 05:12 AM, Tony Lindgren wrote: Hi, [].. @@ -1663,6 +1664,40 @@ static struct omap_clk omap44xx_clks[] = { CLK(NULL, cpufreq_ck, dpll_mpu_ck, CK_443X), }; +static struct clk *scrm_clks[] = { +auxclk0_ck, +auxclk1_ck, +auxclk2_ck, +auxclk3_ck, +auxclk4_ck, +auxclk5_ck, +}; Hmm I don't like the idea of specifying the auxclk both in the cclock44xx_data.c and in DT.. +static struct clk_onecell_data scrm_data; + +#ifdef CONFIG_OF +int __init omap4_clk_init_dt(void) +{ +struct device_node *np; + +np = of_find_compatible_node(NULL, NULL, ti,omap4-scrm); +if (np) { +scrm_data.clks = scrm_clks; +scrm_data.clk_num = ARRAY_SIZE(scrm_clks); +of_clk_add_provider(np, of_clk_src_onecell_get, scrm_data); +} + +return 0; +} + +#else + +int __init omap4_clk_init_dt(void) +{ +return 0; +} +#endif /* CONFIG_OF */ + int __init omap4xxx_clk_init(void) { u32 cpu_clkflg; .. and I'm not too keen on adding driver specific stuff to this file. How about just add a minimal drivers/clk/omap/clk-xyz.c that takes the configuration from DT and is based on the binding we already have in Documentation/devicetree/bindings/clock/clock-bindings.txt? Then as we add new bindings there we can drop them from current cclock44xx_data.c, no? That is after omap4 is DT only.. The patch just provides an alternative for clkdev mapping in case of DT. Are you suggesting we move all *clock data* related to auxclks (and eventually all clocks) into DT? We have discussed this multiple times in the past, and moving 250 clock nodes with each needing multiple register offsets, masks, shifts etc into DT makes it completely un-readable. For me, having a way for devices to reference a clock that they use for a device using DT makes sense, but not moving all clock data into dts files. regards, Rajendra Regards, Tony -- To unsubscribe from this list: send the line unsubscribe linux-usb in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [RFC][PATCH 1/2] ARM: OMAP4: clock: Add device tree support for AUXCLKs
[].. diff --git a/arch/arm/mach-omap2/board-generic.c b/arch/arm/mach-omap2/board-generic.c index 0274ff7..23f2064 100644 --- a/arch/arm/mach-omap2/board-generic.c +++ b/arch/arm/mach-omap2/board-generic.c @@ -158,7 +158,7 @@ DT_MACHINE_START(OMAP4_DT, Generic OMAP4 (Flattened Device Tree)) .init_irq = omap_gic_of_init, .init_machine = omap_generic_init, .init_late = omap4430_init_late, - .init_time = omap4_local_timer_init, + .init_time = omap4_init_time, .dt_compat = omap4_boards_compat, .restart= omap44xx_restart, MACHINE_END [].. +#ifdef CONFIG_OF +int __init omap4_clk_init_dt(void) +{ + struct device_node *np; + + np = of_find_compatible_node(NULL, NULL, ti,omap4-scrm); + if (np) { + scrm_data.clks = scrm_clks; + scrm_data.clk_num = ARRAY_SIZE(scrm_clks); + of_clk_add_provider(np, of_clk_src_onecell_get, scrm_data); + } + + return 0; +} [].. + +void __init omap4_init_time(void) +{ + omap4_clk_init_dt(); + omap4_local_timer_init(); +} I guess you did all this because of_clk_add_provider() needs slab to be initialized. With the below patch[1], now clk inits happen within .init_timer already, so none of this would be needed. [1] http://www.spinics.net/lists/arm-kernel/msg231288.html -- To unsubscribe from this list: send the line unsubscribe linux-usb in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [RFC][PATCH 1/2] ARM: OMAP4: clock: Add device tree support for AUXCLKs
On Thursday 21 March 2013 07:24 PM, Roger Quadros wrote: On 03/21/2013 03:08 PM, Rajendra Nayak wrote: [].. diff --git a/arch/arm/mach-omap2/board-generic.c b/arch/arm/mach-omap2/board-generic.c index 0274ff7..23f2064 100644 --- a/arch/arm/mach-omap2/board-generic.c +++ b/arch/arm/mach-omap2/board-generic.c @@ -158,7 +158,7 @@ DT_MACHINE_START(OMAP4_DT, Generic OMAP4 (Flattened Device Tree)) .init_irq = omap_gic_of_init, .init_machine = omap_generic_init, .init_late = omap4430_init_late, - .init_time = omap4_local_timer_init, + .init_time = omap4_init_time, .dt_compat = omap4_boards_compat, .restart= omap44xx_restart, MACHINE_END [].. +#ifdef CONFIG_OF +int __init omap4_clk_init_dt(void) +{ + struct device_node *np; + + np = of_find_compatible_node(NULL, NULL, ti,omap4-scrm); + if (np) { + scrm_data.clks = scrm_clks; + scrm_data.clk_num = ARRAY_SIZE(scrm_clks); + of_clk_add_provider(np, of_clk_src_onecell_get, scrm_data); + } + + return 0; +} [].. + +void __init omap4_init_time(void) +{ + omap4_clk_init_dt(); + omap4_local_timer_init(); +} I guess you did all this because of_clk_add_provider() needs slab to be initialized. With the below patch[1], now clk inits happen within .init_timer already, so none of this would be needed. [1] http://www.spinics.net/lists/arm-kernel/msg231288.html Right. I can then call omap4_clk_init_dt() from within omap4xxx_clk_init(). Any comments about the main subject? Does the approach look fine? It looks fine, except for the fact that I was wondering if the clock provider needs to restrict itself to SCRM. Nishant Menon brought up a need for specifying the mpu clock source from within DT, to be able to use a generic cpufreq driver. It could be a provider (not specific to scrm, but having only scrm clocks for now) which we could add clocks as and when we see a need for them to be specified from DT. Btw, you need to copy Paul Walmsley for any clock related patches as he is the OMAP clock maintainer. cheers, -roger -- To unsubscribe from this list: send the line unsubscribe linux-usb in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: how to specify an OMAP clock in device tree?
On Tuesday 05 February 2013 08:22 PM, Roger Quadros wrote: Doesn't look very elegant to me, but I wouldn't mind if there is no better option. Even then, we can't rely on the device name as its index can change based on where it is Well, thats what I said in the first mail, that *if* you are able to fix the device name, *then* we could use clkdev the way its used in non-DT case. But then you came back saying 'Fixing the device name doesn't really solve the problem.' :) located in the dts file. e.g. in the beginning it may be named phy.8, and if a device node is added before it, it will get changed to phy.9 If you provide a phandle to the PHY node in the board node, for which you need to add the clk alias, you can always extract the device (using of_find_device_by_node() ) and hence its name, so it doesn't matter if its phy.8 or phy.9. -- To unsubscribe from this list: send the line unsubscribe linux-usb in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH 3/8] ARM: dts: omap: Add usb_otg and glue data
[]... diff --git a/Documentation/devicetree/bindings/usb/omap-usb.txt b/Documentation/devicetree/bindings/usb/omap-usb.txt index 29a043e..4688265 100644 --- a/Documentation/devicetree/bindings/usb/omap-usb.txt +++ b/Documentation/devicetree/bindings/usb/omap-usb.txt @@ -15,6 +15,7 @@ OMAP MUSB GLUE represents PERIPHERAL. - power : Should be 50. This signifies the controller can supply upto 100mA when operating in host mode. + - usb-phy : the phandle for the PHY device SOC specific device node entry usb_otg_hs: usb_otg_hs@4a0ab000 { diff --git a/arch/arm/boot/dts/omap3-beagle-xm.dts b/arch/arm/boot/dts/omap3-beagle-xm.dts index 3705a81..cb07583 100644 --- a/arch/arm/boot/dts/omap3-beagle-xm.dts +++ b/arch/arm/boot/dts/omap3-beagle-xm.dts @@ -107,3 +107,9 @@ */ ti,pulldowns = 0x03a1c4; }; + +usb_otg_hs { + interface_type = 0; + mode = 3; + power = 50; +}; diff --git a/arch/arm/boot/dts/omap3-evm.dts b/arch/arm/boot/dts/omap3-evm.dts index e8ba1c2..afb9ba9 100644 --- a/arch/arm/boot/dts/omap3-evm.dts +++ b/arch/arm/boot/dts/omap3-evm.dts @@ -59,3 +59,9 @@ twl_gpio { ti,use-leds; }; + +usb_otg_hs { + interface_type = 0; + mode = 3; + power = 50; +}; diff --git a/arch/arm/boot/dts/omap3-overo.dtsi b/arch/arm/boot/dts/omap3-overo.dtsi index 89808ce..4b3d157 100644 --- a/arch/arm/boot/dts/omap3-overo.dtsi +++ b/arch/arm/boot/dts/omap3-overo.dtsi @@ -55,3 +55,9 @@ twl_gpio { ti,use-leds; }; + +usb_otg_hs { + interface_type = 0; + mode = 3; + power = 50; +}; diff --git a/arch/arm/boot/dts/omap3.dtsi b/arch/arm/boot/dts/omap3.dtsi index 1acc261..b6472f7 100644 --- a/arch/arm/boot/dts/omap3.dtsi +++ b/arch/arm/boot/dts/omap3.dtsi @@ -397,5 +397,17 @@ ti,timer-alwon; ti,timer-secure; }; + + usb_otg_hs: usb_otg_hs@480ab000 { + compatible = ti,omap3-musb; + reg = 0x480ab000 0x1000; + interrupts = 0 92 0x4, 0 93 0x4; + interrupt-names = mc, dma; + ti,hwmods = usb_otg_hs; + usb-phy = usb2_phy; + multipoint = 1; + num_eps = 16; + ram_bits = 12; Where are these bindings documented? The general convention is to use a '-' for property names and not '_' + }; }; }; diff --git a/arch/arm/boot/dts/omap4-panda.dts b/arch/arm/boot/dts/omap4-panda.dts index 4122efe..612c9bb 100644 --- a/arch/arm/boot/dts/omap4-panda.dts +++ b/arch/arm/boot/dts/omap4-panda.dts @@ -206,3 +206,9 @@ twl_usb_comparator { usb-supply = vusb; }; + +usb_otg_hs { + interface_type = 1; + mode = 3; + power = 50; +}; diff --git a/arch/arm/boot/dts/omap4-sdp.dts b/arch/arm/boot/dts/omap4-sdp.dts index 43e5258..582d7ee 100644 --- a/arch/arm/boot/dts/omap4-sdp.dts +++ b/arch/arm/boot/dts/omap4-sdp.dts @@ -428,3 +428,9 @@ twl_usb_comparator { usb-supply = vusb; }; + +usb_otg_hs { + interface_type = 1; + mode = 3; + power = 50; +}; diff --git a/arch/arm/boot/dts/omap4.dtsi b/arch/arm/boot/dts/omap4.dtsi index c829d7e..5171739 100644 --- a/arch/arm/boot/dts/omap4.dtsi +++ b/arch/arm/boot/dts/omap4.dtsi @@ -542,5 +542,18 @@ reg-names = control_dev_conf, otghs_control; ti,type = 1; }; + + usb_otg_hs: usb_otg_hs@4a0ab000 { + compatible = ti,omap4-musb; + reg = 0x4a0ab000 0x7ff; + interrupts = 0 92 0x4, 0 93 0x4; + interrupt-names = mc, dma; + ti,hwmods = usb_otg_hs; + usb-phy = usb2_phy; + multipoint = 1; + num_eps = 16; + ram_bits = 12; + ti,has-mailbox; + }; }; }; diff --git a/arch/arm/boot/dts/twl4030.dtsi b/arch/arm/boot/dts/twl4030.dtsi index ed0bc95..398d2c3 100644 --- a/arch/arm/boot/dts/twl4030.dtsi +++ b/arch/arm/boot/dts/twl4030.dtsi @@ -67,7 +67,7 @@ #interrupt-cells = 1; }; - twl4030-usb { + usb2_phy: twl4030-usb { compatible = ti,twl4030-usb; interrupts = 10, 4; usb1v5-supply = vusb1v5; -- To unsubscribe from this list: send the line unsubscribe linux-usb in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: how to specify an OMAP clock in device tree?
On Tuesday 05 February 2013 03:04 PM, Roger Quadros wrote: Hi Rajendra, On 02/04/2013 05:58 PM, Roger Quadros wrote: Provide the RESET and Power regulators for the USB PHY, the USB Host port mode and the PHY device. Also provide pin multiplexer information for the USB host pins. Signed-off-by: Roger Quadros rog...@ti.com --- arch/arm/boot/dts/omap4-panda.dts | 55 + 1 files changed, 55 insertions(+), 0 deletions(-) diff --git a/arch/arm/boot/dts/omap4-panda.dts b/arch/arm/boot/dts/omap4-panda.dts index 4122efe..fe2d3d4 100644 --- a/arch/arm/boot/dts/omap4-panda.dts +++ b/arch/arm/boot/dts/omap4-panda.dts @@ -57,6 +57,35 @@ AFML, Line In, AFMR, Line In; }; + + /* HS USB Port 1 RESET */ + hsusb1_reset: hsusb1_reset_reg { + compatible = regulator-fixed; + regulator-name = hsusb1_reset; + regulator-min-microvolt = 330; + regulator-max-microvolt = 330; + gpio = gpio2 30 0; /* gpio_62 */ + startup-delay-us = 7; + enable-active-high; + }; + + /* HS USB Port 1 Power */ + hsusb1_power: hsusb1_power_reg { + compatible = regulator-fixed; + regulator-name = hsusb1_vbus; + regulator-min-microvolt = 330; + regulator-max-microvolt = 330; + gpio = gpio1 1 0; /* gpio_1 */ + startup-delay-us = 7; + enable-active-high; + }; + + /* HS USB Host PHY on PORT 1 */ + hsusb1_phy: hsusb1_phy { + compatible = usb-nop-xceiv; + reset-supply = hsusb1_reset; + vcc-supply = hsusb1_power; + }; This is the patch I was discussing with you about before. Let me explain the problem again. The Pandaboard has a USB PHY whose reference clock is provided by FREF_CLK3 pin which is a clock generated by the OMAP. The PHY driver expects a reference to this clock in the PHY device node. Well, the driver just does a clk_get(dev, main_clk); and clk_get() is then able to either pick the reference from the PHY dt node or from a clkdev entry. The problem here seems to be that you are not able to add a clkdev entry because the device name wouldn't be fixed, since you have a node in the form of 'node: node {'. All other onchip OMAP devices don't have this issue because they have an entry in the form of 'node: node@addr' and hence have a fixed device name and hence can add a clkdev entry for the clocks they want to control. I don't know if there is any good way to define the DT node for the on board PHY in such a way that the device name is always fixed, in which case you can then add a clkdev entry for 'dev, main_clk' mapping to the onchip clock that provides the clock, but if there is one, then that should fix your problem. See the above node hsusb1_phy. we would need something like hsusb1_phy { ... clocks = fref_clk3; clock-names = main_clk; ... }; Currently on OMAP, there is no way to provide a phandle to this clock. Is it practical to provide device tree based implementation of at least the externally accessible OMAP clocks? cheers, -roger }; omap4_pmx_core { @@ -67,6 +96,7 @@ mcbsp1_pins dss_hdmi_pins tpd12s015_pins + hsusbb1_pins ; twl6040_pins: pinmux_twl6040_pins { @@ -110,6 +140,23 @@ 0x58 0x10b /* hdmi_hpd.gpio_63 INPUT PULLDOWN | MODE3 */ ; }; -- To unsubscribe from this list: send the line unsubscribe linux-usb in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH 00/13] Device tree support for OMAP HS USB Host
On Monday 04 February 2013 09:28 PM, Roger Quadros wrote: This patchset adds device tree support for OMAP's High Speed USB Host subsystem. Board adaptation for Panda and Beagleboard is also provided. Tested on Beagleboard. Will only work with Panda if we provide a reference to the PHY clock But there is no reference provided even for Beagle. Does it work because the default clk speed is 192Mhz? generator in the device tree in PATCH 11. I do not know how to do that as there is no way to provide a phandle to any of the OMAP generated clocks in the device tree. Suggestions welcome:). -- To unsubscribe from this list: send the line unsubscribe linux-usb in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: how to specify an OMAP clock in device tree?
On Tuesday 05 February 2013 07:16 PM, Roger Quadros wrote: Fixing the device name doesn't really solve the problem. Not all OMAP boards will use the same clock for the external device. Are you saying different OMAP boards will use different Internal clocks? Or different OMAP boards will use a single Internal clock or an external one. -- To unsubscribe from this list: send the line unsubscribe linux-usb in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: how to specify an OMAP clock in device tree?
On Tuesday 05 February 2013 07:48 PM, Roger Quadros wrote: On 02/05/2013 04:13 PM, Rajendra Nayak wrote: On Tuesday 05 February 2013 07:16 PM, Roger Quadros wrote: Fixing the device name doesn't really solve the problem. Not all OMAP boards will use the same clock for the external device. Are you saying different OMAP boards will use different Internal clocks? Or different OMAP boards will use a single Internal clock or an external one. All I was saying is that one board can use for example auxclk1 whereas another one can use auxclk3, both generated by OMAP for the same PHY configuration. Ok, so lets keep DT aside for a while. How would something like this work in a non-DT world? Would the driver then be able to do a clk_get(dev, main_clk); and get say auxclk1 on one board and auxclk3 on another? cheers, -roger -- To unsubscribe from this list: send the line unsubscribe linux-usb in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: how to specify an OMAP clock in device tree?
On Tuesday 05 February 2013 07:59 PM, Roger Quadros wrote: On 02/05/2013 04:21 PM, Rajendra Nayak wrote: On Tuesday 05 February 2013 07:48 PM, Roger Quadros wrote: On 02/05/2013 04:13 PM, Rajendra Nayak wrote: On Tuesday 05 February 2013 07:16 PM, Roger Quadros wrote: Fixing the device name doesn't really solve the problem. Not all OMAP boards will use the same clock for the external device. Are you saying different OMAP boards will use different Internal clocks? Or different OMAP boards will use a single Internal clock or an external one. All I was saying is that one board can use for example auxclk1 whereas another one can use auxclk3, both generated by OMAP for the same PHY configuration. Ok, so lets keep DT aside for a while. How would something like this work in a non-DT world? Would the driver then be able to do a clk_get(dev, main_clk); and get say auxclk1 on one board and auxclk3 on another? Yes, all you need to do is specify an alias to the clock in the board file. Can we then create a special board specific node for panda and do similar things from DT? See a similar discussion below on how to handle the gpio_request() we had as part of board files http://www.spinics.net/lists/linux-omap/msg85248.html e.g. in board 1 file clk_add_alias(main_clk, phy.1, auxclk1_ck, NULL); in board 2 file clk_add_alias(main_clk, phy.1, auxclk3_ck, NULL); cheers, -roger -- To unsubscribe from this list: send the line unsubscribe linux-usb in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH v4 23/23] mfd: omap-usb-host: Don't spam console on clk_set_parent failure
On Monday 10 December 2012 03:50 PM, Roger Quadros wrote: clk_set_parent is expected to fail on OMAP3 platforms. We don't consider that as fatal so don't spam console. And what if it fails on a non-OMAP3 platform? Signed-off-by: Roger Quadros rog...@ti.com --- drivers/mfd/omap-usb-host.c | 18 +- 1 files changed, 9 insertions(+), 9 deletions(-) diff --git a/drivers/mfd/omap-usb-host.c b/drivers/mfd/omap-usb-host.c index 0bb54393..344ce09 100644 --- a/drivers/mfd/omap-usb-host.c +++ b/drivers/mfd/omap-usb-host.c @@ -657,32 +657,32 @@ static int __devinit usbhs_omap_probe(struct platform_device *pdev) } if (is_ehci_phy_mode(pdata-port_mode[0])) { - /* for OMAP3 , the clk set paretn fails */ + /* for OMAP3, clk_set_parent fails */ ret = clk_set_parent(omap-utmi_clk[0], omap-xclk60mhsp1_ck); if (ret != 0) - dev_err(dev, xclk60mhsp1_ck set parent - failed error:%d\n, ret); + dev_dbg(dev, xclk60mhsp1_ck set parent failed: %d\n, + ret); } else if (is_ehci_tll_mode(pdata-port_mode[0])) { ret = clk_set_parent(omap-utmi_clk[0], omap-init_60m_fclk); if (ret != 0) - dev_err(dev, init_60m_fclk set parent - failed error:%d\n, ret); + dev_dbg(dev, P0 init_60m_fclk set parent failed: %d\n, + ret); } if (is_ehci_phy_mode(pdata-port_mode[1])) { ret = clk_set_parent(omap-utmi_clk[1], omap-xclk60mhsp2_ck); if (ret != 0) - dev_err(dev, xclk60mhsp2_ck set parent - failed error:%d\n, ret); + dev_dbg(dev, xclk60mhsp2_ck set parent failed: %d\n, + ret); } else if (is_ehci_tll_mode(pdata-port_mode[1])) { ret = clk_set_parent(omap-utmi_clk[1], omap-init_60m_fclk); if (ret != 0) - dev_err(dev, init_60m_fclk set parent - failed error:%d\n, ret); + dev_dbg(dev, P1 init_60m_fclk set parent failed: %d\n, + ret); } omap_usbhs_init(dev); -- To unsubscribe from this list: send the line unsubscribe linux-usb in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH v1 08/11] arm/dts: Add twl4030-usb data
On Thursday 28 June 2012 05:21 PM, Kishon Vijay Abraham I wrote: Add twl4030-usb data node in twl4030 device tree file. Signed-off-by: Kishon Vijay Abraham Ikis...@ti.com --- arch/arm/boot/dts/twl4030.dtsi | 21 + 1 files changed, 21 insertions(+), 0 deletions(-) diff --git a/arch/arm/boot/dts/twl4030.dtsi b/arch/arm/boot/dts/twl4030.dtsi index 22f4d13..66534a3 100644 --- a/arch/arm/boot/dts/twl4030.dtsi +++ b/arch/arm/boot/dts/twl4030.dtsi @@ -37,6 +37,18 @@ regulator-max-microvolt =315; }; + vusb1v5: regulator@3 { + compatible = ti,twl4030-vusb1v5; + }; These @3, @4 are actually wrong since the node do not have a 'reg' property in it. This was commented on by David Brown on my original series which added this but it somehow slipped through the cracks. I understand that you would have looked up what existed in the file and extended, but what already exists in the file needs to be fixed up too. I'll send in a patch to fix those up. regards, Rajendra + + vusb1v8: regulator@4 { + compatible = ti,twl4030-vusb1v8; + }; + + vusb3v1: regulator@5 { + compatible = ti,twl4030-vusb3v1; + }; + twl_gpio: gpio { compatible = ti,twl4030-gpio; gpio-controller; @@ -44,4 +56,13 @@ interrupt-controller; #interrupt-cells =1; }; + + twl4030-usb { + compatible = ti,twl4030-usb; + interrupts = 10 4; + usb1v5-supply =vusb1v5; + usb1v8-supply =vusb1v8; + usb3v1-supply =vusb3v1; + usb_mode =1; + }; }; -- To unsubscribe from this list: send the line unsubscribe linux-usb in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH v1 10/11] arm/dts: omap: Add usb_otg and glue data
On Thursday 28 June 2012 05:21 PM, Kishon Vijay Abraham I wrote: Add usb otg data node in omap4/omap3 device tree file. Also update the node with board specific setting in omapx-board.dts file. Signed-off-by: Kishon Vijay Abraham Ikis...@ti.com --- arch/arm/boot/dts/omap3-beagle.dts |6 ++ arch/arm/boot/dts/omap3-evm.dts|6 ++ arch/arm/boot/dts/omap3.dtsi |8 arch/arm/boot/dts/omap4-panda.dts |6 ++ arch/arm/boot/dts/omap4-sdp.dts|6 ++ arch/arm/boot/dts/omap4.dtsi |8 6 files changed, 40 insertions(+), 0 deletions(-) diff --git a/arch/arm/boot/dts/omap3-beagle.dts b/arch/arm/boot/dts/omap3-beagle.dts index 5b4506c..f3d7076 100644 --- a/arch/arm/boot/dts/omap3-beagle.dts +++ b/arch/arm/boot/dts/omap3-beagle.dts @@ -67,3 +67,9 @@ mmc3 { status = disable; }; + +usb_otg_hs { + interface_type =0; + mode =3; + power =50; +}; diff --git a/arch/arm/boot/dts/omap3-evm.dts b/arch/arm/boot/dts/omap3-evm.dts index 2eee16e..8963b3d 100644 --- a/arch/arm/boot/dts/omap3-evm.dts +++ b/arch/arm/boot/dts/omap3-evm.dts @@ -18,3 +18,9 @@ reg =0x8000 0x1000; /* 256 MB */ }; }; + +usb_otg_hs { + interface_type =0; + mode =3; + power =50; +}; diff --git a/arch/arm/boot/dts/omap3.dtsi b/arch/arm/boot/dts/omap3.dtsi index 99474fa..2f565d6 100644 --- a/arch/arm/boot/dts/omap3.dtsi +++ b/arch/arm/boot/dts/omap3.dtsi @@ -215,5 +215,13 @@ compatible = ti,omap3-hsmmc; ti,hwmods = mmc3; }; + + usb_otg_hs: usb_otg_hs@4a0ab000 { + compatible = ti,musb-omap2430; this compatible doesn't seem right in omap3.dtsi. Same with the below entry in omap4.dtsi. See other IP blocks which are reused across OMAP2/3/4 on how the compatible for those are handled. + ti,hwmods = usb_otg_hs; + multipoint =1; + num_eps =16; + ram_bits =12; + }; }; }; diff --git a/arch/arm/boot/dts/omap4-panda.dts b/arch/arm/boot/dts/omap4-panda.dts index 1efe0c5..0825fa7 100644 --- a/arch/arm/boot/dts/omap4-panda.dts +++ b/arch/arm/boot/dts/omap4-panda.dts @@ -89,3 +89,9 @@ ti,non-removable; bus-width =4; }; + +usb_otg_hs { + interface_type =1; + mode =3; + power =50; +}; diff --git a/arch/arm/boot/dts/omap4-sdp.dts b/arch/arm/boot/dts/omap4-sdp.dts index d08c4d1..5244d51 100644 --- a/arch/arm/boot/dts/omap4-sdp.dts +++ b/arch/arm/boot/dts/omap4-sdp.dts @@ -158,3 +158,9 @@ bus-width =4; ti,non-removable; }; + +usb_otg_hs { + interface_type =1; + mode =3; + power =50; +}; diff --git a/arch/arm/boot/dts/omap4.dtsi b/arch/arm/boot/dts/omap4.dtsi index 4d2dcc1..bc7b3c3 100644 --- a/arch/arm/boot/dts/omap4.dtsi +++ b/arch/arm/boot/dts/omap4.dtsi @@ -285,5 +285,13 @@ 0x4a002300 0x1; }; }; + + usb_otg_hs: usb_otg_hs@4a0ab000 { + compatible = ti,musb-omap2430; + ti,hwmods = usb_otg_hs; + multipoint =1; + num_eps =16; + ram_bits =12; + }; }; }; -- To unsubscribe from this list: send the line unsubscribe linux-usb in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH v1 11/11] arm: omap: phy: remove unused functions from omap-phy-internal.c
On Thursday 28 June 2012 05:21 PM, Kishon Vijay Abraham I wrote: All the unnessary functions in omap-phy-internal is removed. These functionality are now handled by omap-usb2 phy driver. Cc: Felipe Balbiba...@ti.com Signed-off-by: Kishon Vijay Abraham Ikis...@ti.com Acked-by: Tony Lindgrent...@atomide.com --- arch/arm/mach-omap2/omap_phy_internal.c | 138 --- arch/arm/mach-omap2/twl-common.c|5 - arch/arm/mach-omap2/usb-musb.c |3 - 3 files changed, 0 insertions(+), 146 deletions(-) diff --git a/arch/arm/mach-omap2/omap_phy_internal.c b/arch/arm/mach-omap2/omap_phy_internal.c index 4c90477..0c610b4 100644 --- a/arch/arm/mach-omap2/omap_phy_internal.c +++ b/arch/arm/mach-omap2/omap_phy_internal.c @@ -31,144 +31,6 @@ #includeplat/usb.h #include control.h -/* OMAP control module register for UTMI PHY */ -#define CONTROL_DEV_CONF 0x300 -#define PHY_PD 0x1 - -#define USBOTGHS_CONTROL 0x33c -#defineAVALID BIT(0) -#defineBVALID BIT(1) -#defineVBUSVALID BIT(2) -#defineSESSEND BIT(3) -#defineIDDIG BIT(4) - -static struct clk *phyclk, *clk48m, *clk32k; -static void __iomem *ctrl_base; -static int usbotghs_control; - -int omap4430_phy_init(struct device *dev) -{ - ctrl_base = ioremap(OMAP443X_SCM_BASE, SZ_1K); - if (!ctrl_base) { - pr_err(control module ioremap failed\n); - return -ENOMEM; - } - /* Power down the phy */ - __raw_writel(PHY_PD, ctrl_base + CONTROL_DEV_CONF); Just checking, but I hope your new driver handles this too. You might not see any issues with it now, but not doing this could gate OMAP hitting low power in idle. regards, Rajendra - - if (!dev) { - iounmap(ctrl_base); - return 0; - } - - phyclk = clk_get(dev, ocp2scp_usb_phy_ick); - if (IS_ERR(phyclk)) { - dev_err(dev, cannot clk_get ocp2scp_usb_phy_ick\n); - iounmap(ctrl_base); - return PTR_ERR(phyclk); - } - - clk48m = clk_get(dev, ocp2scp_usb_phy_phy_48m); - if (IS_ERR(clk48m)) { - dev_err(dev, cannot clk_get ocp2scp_usb_phy_phy_48m\n); - clk_put(phyclk); - iounmap(ctrl_base); - return PTR_ERR(clk48m); - } - - clk32k = clk_get(dev, usb_phy_cm_clk32k); - if (IS_ERR(clk32k)) { - dev_err(dev, cannot clk_get usb_phy_cm_clk32k\n); - clk_put(phyclk); - clk_put(clk48m); - iounmap(ctrl_base); - return PTR_ERR(clk32k); - } - return 0; -} - -int omap4430_phy_set_clk(struct device *dev, int on) -{ - static int state; - - if (on !state) { - /* Enable the phy clocks */ - clk_enable(phyclk); - clk_enable(clk48m); - clk_enable(clk32k); - state = 1; - } else if (state) { - /* Disable the phy clocks */ - clk_disable(phyclk); - clk_disable(clk48m); - clk_disable(clk32k); - state = 0; - } - return 0; -} - -int omap4430_phy_power(struct device *dev, int ID, int on) -{ - if (on) { - if (ID) - /* enable VBUS valid, IDDIG groung */ - __raw_writel(AVALID | VBUSVALID, ctrl_base + - USBOTGHS_CONTROL); - else - /* -* Enable VBUS Valid, AValid and IDDIG -* high impedance -*/ - __raw_writel(IDDIG | AVALID | VBUSVALID, - ctrl_base + USBOTGHS_CONTROL); - } else { - /* Enable session END and IDIG to high impedance. */ - __raw_writel(SESSEND | IDDIG, ctrl_base + - USBOTGHS_CONTROL); - } - return 0; -} - -int omap4430_phy_suspend(struct device *dev, int suspend) -{ - if (suspend) { - /* Disable the clocks */ - omap4430_phy_set_clk(dev, 0); - /* Power down the phy */ - __raw_writel(PHY_PD, ctrl_base + CONTROL_DEV_CONF); - - /* save the context */ - usbotghs_control = __raw_readl(ctrl_base + USBOTGHS_CONTROL); - } else { - /* Enable the internel phy clcoks */ - omap4430_phy_set_clk(dev, 1); - /* power on the phy */ - if (__raw_readl(ctrl_base + CONTROL_DEV_CONF) PHY_PD) { - __raw_writel(~PHY_PD, ctrl_base + CONTROL_DEV_CONF); - mdelay(200); -
Re: [PATCH v1 05/11] drivers: usb: twl6030: Add dt support for twl6030 usb
On Tuesday 10 July 2012 11:58 AM, ABRAHAM, KISHON VIJAY wrote: Hi, On Tue, Jul 10, 2012 at 11:28 AM, Rajendra Nayakrna...@ti.com wrote: On Thursday 28 June 2012 05:21 PM, Kishon Vijay Abraham I wrote: Add device tree support for twl6030 usb driver. Update the Documentation with device tree binding information. Signed-off-by: Kishon Vijay Abraham Ikis...@ti.com --- .../devicetree/bindings/usb/twl-usb.txt| 18 drivers/usb/otg/twl6030-usb.c | 45 ++-- 2 files changed, 50 insertions(+), 13 deletions(-) create mode 100644 Documentation/devicetree/bindings/usb/twl-usb.txt diff --git a/Documentation/devicetree/bindings/usb/twl-usb.txt b/Documentation/devicetree/bindings/usb/twl-usb.txt new file mode 100644 index 000..f293271 --- /dev/null +++ b/Documentation/devicetree/bindings/usb/twl-usb.txt @@ -0,0 +1,18 @@ +USB COMPARATOR OF TWL CHIPS + +TWL6030 USB COMPARATOR + - compatible : Should be ti,twl6030-usb + - interrupts : Two interrupt numbers to the cpu should be specified. First + interrupt number is the otg interrupt number that raises ID interrupts when + the controller has to act as host and the second interrupt number is the + usb interrupt number that raises VBUS interrupts when the controller has to + act as device + - regulator :supply-name can be vusb or ldousb + -supply-name-supply : phandle to the regulator device tree node + +twl6030-usb { + compatible = ti,twl6030-usb; + interrupts = 4 10; + regulator = vusb; + vusb-supply =vusb; This doesn't seem right. Why do you ned a 'regulator' string along with the phandle? The original code was something like if (twl-features TWL6025_SUBCLASS) regulator_name = ldousb; else regulator_name = vusb; I wasn't sure how to handle this *TWL6025_SUBCLASS* stuff. +}; diff --git a/drivers/usb/otg/twl6030-usb.c b/drivers/usb/otg/twl6030-usb.c index 6a361d2..20b7abe 100644 --- a/drivers/usb/otg/twl6030-usb.c +++ b/drivers/usb/otg/twl6030-usb.c @@ -105,7 +105,7 @@ struct twl6030_usb { u8 asleep; boolirq_enabled; boolvbus_enable; - unsigned long features; + const char *regulator; }; #define comparator_to_twl(x) container_of((x), struct twl6030_usb, comparator) @@ -153,13 +153,6 @@ static int twl6030_start_srp(struct phy_companion *comparator) static int twl6030_usb_ldo_init(struct twl6030_usb *twl) { - char *regulator_name; - - if (twl-features TWL6025_SUBCLASS) - regulator_name = ldousb; - else - regulator_name = vusb; - /* Set to OTG_REV 1.3 and turn on the ID_WAKEUP_COMP */ twl6030_writeb(twl, TWL6030_MODULE_ID0 , 0x1, TWL6030_BACKUP_REG); @@ -169,7 +162,7 @@ static int twl6030_usb_ldo_init(struct twl6030_usb *twl) /* Program MISC2 register and set bit VUSB_IN_VBAT */ twl6030_writeb(twl, TWL6030_MODULE_ID0 , 0x10, TWL6030_MISC2); - twl-usb3v3 = regulator_get(twl-dev, regulator_name); + twl-usb3v3 = regulator_get(twl-dev, twl-regulator); if (IS_ERR(twl-usb3v3)) return -ENODEV; @@ -324,9 +317,9 @@ static int __devinit twl6030_usb_probe(struct platform_device *pdev) { struct twl6030_usb *twl; int status, err; - struct twl4030_usb_data *pdata; - struct device *dev =pdev-dev; - pdata = dev-platform_data; + struct device_node *np = pdev-dev.of_node; + struct device *dev =pdev-dev; + struct twl4030_usb_data *pdata = dev-platform_data; twl = devm_kzalloc(dev, sizeof *twl, GFP_KERNEL); if (!twl) @@ -335,13 +328,28 @@ static int __devinit twl6030_usb_probe(struct platform_device *pdev) twl-dev=pdev-dev; twl-irq1 = platform_get_irq(pdev, 0); twl-irq2 = platform_get_irq(pdev, 1); - twl-features = pdata-features; twl-linkstat = OMAP_MUSB_UNKNOWN; twl-comparator.set_vbus= twl6030_set_vbus; twl-comparator.start_srp = twl6030_start_srp; omap_usb2_set_comparator(twl-comparator); + if (np) { + err = of_property_read_string(np, regulator,twl-regulator); + if (err 0) { + dev_err(pdev-dev, unable to get regulator\n); + return err; + } Isn't there a better way for the driver to know which supply to use instead of DT passing the supply name? The problem I see is this same driver is used for twl6030 and twl6025 and the regulator used is different for these two chips (And I think hmm, so based on what chip is used on a board, shouldn't the board dts file just map the right
Re: [PATCH v1 01/11] drivers: usb: otg: add a new driver for omap usb2 phy
+ +static int __devinit omap_usb2_probe(struct platform_device *pdev) +{ + struct omap_usb *phy; + struct usb_otg *otg; + struct resource *res; + + phy = devm_kzalloc(pdev-dev, sizeof(*phy), GFP_KERNEL); + if (!phy) { + dev_err(pdev-dev, unable to allocate memory for USB2 PHY\n); + return -ENOMEM; + } + + otg = devm_kzalloc(pdev-dev, sizeof(*otg), GFP_KERNEL); + if (!otg) { + dev_err(pdev-dev, unable to allocate memory for USB OTG\n); + return -ENOMEM; + } + + phy-dev=pdev-dev; + + phy-phy.dev= phy-dev; + phy-phy.label = omap-usb2; + phy-phy.set_suspend= omap_usb2_suspend; + phy-phy.otg= otg; + + res = platform_get_resource(pdev, IORESOURCE_MEM, 1); + + phy-control_dev_conf = devm_request_and_ioremap(pdev-dev, res); + if (phy-control_dev_conf == NULL) { + dev_err(pdev-dev, Failed to obtain io memory\n); + return -ENXIO; + } + + phy-is_suspended = 1; + omap_usb_phy_power(phy, 0); + + otg-set_host = omap_usb_set_host; + otg-set_peripheral = omap_usb_set_peripheral; + otg-set_vbus = omap_usb_set_vbus; + otg-start_srp = omap_usb_start_srp; + otg-phy=phy-phy; + + phy-wkupclk = devm_clk_get(phy-dev, usb_phy_cm_clk32k); Why not just use clk_get()? What does devm_clk_get() do? It just associates the clk with the device. So whenever the the driver gets detached, the devres will take care to do a clk_put() of the clock. ok, makes sense. + if (IS_ERR(phy-wkupclk)) { + dev_err(pdev-dev, unable to get usb_phy_cm_clk32k\n); + return PTR_ERR(phy-wkupclk); + } + clk_prepare(phy-wkupclk); Ideally clk_prepare() is an extension of clk_enable() and is expected to be used that way. Not to be clubbed with clk_get(). Same with clk_unprepare(). Do you do a clk_enable()/_disable() in interrupt/ atomic context? Currently it is called from a work queue. But Felipe wanted to remove those work_queue from omap2430 glue. Then this would be called from atomic context. A query for you here. If pm_runtime_get_sync() is called in interrupt context, will runtime resume of that device will also be called in the same context? Yes, it would. You also need to then tell the runtime pm framework about it by calling a pm_runtime_irq_safe() api I guess. regards, Rajendra + + usb_add_phy(phy-phy, USB_PHY_TYPE_USB2); + + platform_set_drvdata(pdev, phy); + + pm_runtime_enable(phy-dev); + + return 0; +} + +static int __devexit omap_usb2_remove(struct platform_device *pdev) +{ + struct omap_usb *phy = platform_get_drvdata(pdev); + + clk_unprepare(phy-wkupclk); + usb_remove_phy(phy-phy); + platform_set_drvdata(pdev, NULL); + + return 0; +} + +#ifdef CONFIG_PM + +static int omap_usb2_runtime_suspend(struct device *dev) +{ + struct platform_device *pdev = to_platform_device(dev); + struct omap_usb *phy = platform_get_drvdata(pdev); + + clk_disable(phy-wkupclk); + + return 0; +} + +static int omap_usb2_runtime_resume(struct device *dev) +{ + struct platform_device *pdev = to_platform_device(dev); + struct omap_usb *phy = platform_get_drvdata(pdev); + + clk_enable(phy-wkupclk); + + return 0; +} + +static const struct dev_pm_ops omap_usb2_pm_ops = { + SET_RUNTIME_PM_OPS(omap_usb2_runtime_suspend, omap_usb2_runtime_resume, + NULL) +}; + +#define DEV_PM_OPS (omap_usb2_pm_ops) +#else +#define DEV_PM_OPS NULL +#endif + +#ifdef CONFIG_OF +static const struct of_device_id omap_usb2_id_table[] = { + { .compatible = ti,omap-usb2 }, + {} +}; +MODULE_DEVICE_TABLE(of, omap_usb2_id_table); +#else +#define omap_usb2_id_table NULL; +#endif + +static struct platform_driver omap_usb2_driver = { + .probe = omap_usb2_probe, + .remove = __devexit_p(omap_usb2_remove), + .driver = { + .name = omap-usb2, + .owner = THIS_MODULE, + .pm = DEV_PM_OPS, + .of_match_table = omap_usb2_id_table, Use of_match_ptr() instead. Ok. And I'll remove #define omap_usb2_id_table NULL;. Thanks Kishon -- To unsubscribe from this list: send the line unsubscribe linux-usb in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH v1 07/11] drivers: usb: twl4030: Add device tree support for twl4030 usb
On Tuesday 10 July 2012 12:22 PM, ABRAHAM, KISHON VIJAY wrote: +TWL4030 USB PHY AND COMPARATOR + - compatible : Should be ti,twl4030-usb + - interrupts : The interrupt numbers to the cpu should be specified. First + interrupt number is the otg interrupt number that raises ID interrupts + and VBUS interrupts. The second interrupt number is optional. + -supply-name-supply : phandle to the regulator device tree node. +supply-name should be vusb1v5, vusb1v8 and vusb3v1 + - usb_mode : The mode used by the phy to connect to the controller. 1 + specifies ULPI mode and 2 specifies CEA2011_3PIN mode. Are these standard usb phy modes or something specific to the twl4030 usb phy? These are standard modes used to connect the phy to the controller. I think it's used by other chips other than twl4030 (Something in am35xx??). So would it make sense to document these bindings independent of a given phy and a given controller, so it could be reused and not duplicated in various forms for various different controllers. -- To unsubscribe from this list: send the line unsubscribe linux-usb in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH v1 01/11] drivers: usb: otg: add a new driver for omap usb2 phy
On Tuesday 10 July 2012 12:18 PM, ABRAHAM, KISHON VIJAY wrote: Hi, On Tue, Jul 10, 2012 at 11:33 AM, Venu Byravarasu vbyravar...@nvidia.com wrote: + +#ifdef CONFIG_PM Should it not be CONFIG_PM_SLEEP instead of just CONFIG_PM? Why? I think we should have CONFIG_PM_SLEEP only when we have *suspend*, *resume* hooks. But this driver has only *runtime_suspend* and *runtime_resume* hooks. CONFIG_PM_RUNTIME maybe then? -- To unsubscribe from this list: send the line unsubscribe linux-usb in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH v1 10/11] arm/dts: omap: Add usb_otg and glue data
On Tuesday 10 July 2012 01:43 PM, ABRAHAM, KISHON VIJAY wrote: Hi, On Tue, Jul 10, 2012 at 11:57 AM, Rajendra Nayakrna...@ti.com wrote: On Thursday 28 June 2012 05:21 PM, Kishon Vijay Abraham I wrote: Add usb otg data node in omap4/omap3 device tree file. Also update the node with board specific setting in omapx-board.dts file. Signed-off-by: Kishon Vijay Abraham Ikis...@ti.com --- arch/arm/boot/dts/omap3-beagle.dts |6 ++ arch/arm/boot/dts/omap3-evm.dts|6 ++ arch/arm/boot/dts/omap3.dtsi |8 arch/arm/boot/dts/omap4-panda.dts |6 ++ arch/arm/boot/dts/omap4-sdp.dts|6 ++ arch/arm/boot/dts/omap4.dtsi |8 6 files changed, 40 insertions(+), 0 deletions(-) diff --git a/arch/arm/boot/dts/omap3-beagle.dts b/arch/arm/boot/dts/omap3-beagle.dts index 5b4506c..f3d7076 100644 --- a/arch/arm/boot/dts/omap3-beagle.dts +++ b/arch/arm/boot/dts/omap3-beagle.dts @@ -67,3 +67,9 @@ mmc3 { status = disable; }; + +usb_otg_hs { + interface_type =0; + mode =3; + power =50; +}; diff --git a/arch/arm/boot/dts/omap3-evm.dts b/arch/arm/boot/dts/omap3-evm.dts index 2eee16e..8963b3d 100644 --- a/arch/arm/boot/dts/omap3-evm.dts +++ b/arch/arm/boot/dts/omap3-evm.dts @@ -18,3 +18,9 @@ reg =0x8000 0x1000; /* 256 MB */ }; }; + +usb_otg_hs { + interface_type =0; + mode =3; + power =50; +}; diff --git a/arch/arm/boot/dts/omap3.dtsi b/arch/arm/boot/dts/omap3.dtsi index 99474fa..2f565d6 100644 --- a/arch/arm/boot/dts/omap3.dtsi +++ b/arch/arm/boot/dts/omap3.dtsi @@ -215,5 +215,13 @@ compatible = ti,omap3-hsmmc; ti,hwmods = mmc3; }; + + usb_otg_hs: usb_otg_hs@4a0ab000 { + compatible = ti,musb-omap2430; this compatible doesn't seem right in omap3.dtsi. Same with the below entry in omap4.dtsi. See other IP blocks which are reused across OMAP2/3/4 on how the compatible for those are handled. Ok. So it should be like *ti,omap4-musb*, *ti,omap3-musb*? Yes, that would be more appropriate. Thanks Kishon -- To unsubscribe from this list: send the line unsubscribe linux-usb in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH v1 11/11] arm: omap: phy: remove unused functions from omap-phy-internal.c
On Tuesday 10 July 2012 01:46 PM, ABRAHAM, KISHON VIJAY wrote: Hi, On Tue, Jul 10, 2012 at 11:59 AM, Rajendra Nayakrna...@ti.com wrote: On Thursday 28 June 2012 05:21 PM, Kishon Vijay Abraham I wrote: All the unnessary functions in omap-phy-internal is removed. These functionality are now handled by omap-usb2 phy driver. Cc: Felipe Balbiba...@ti.com Signed-off-by: Kishon Vijay Abraham Ikis...@ti.com Acked-by: Tony Lindgrent...@atomide.com --- arch/arm/mach-omap2/omap_phy_internal.c | 138 --- arch/arm/mach-omap2/twl-common.c|5 - arch/arm/mach-omap2/usb-musb.c |3 - 3 files changed, 0 insertions(+), 146 deletions(-) diff --git a/arch/arm/mach-omap2/omap_phy_internal.c b/arch/arm/mach-omap2/omap_phy_internal.c index 4c90477..0c610b4 100644 --- a/arch/arm/mach-omap2/omap_phy_internal.c +++ b/arch/arm/mach-omap2/omap_phy_internal.c @@ -31,144 +31,6 @@ #includeplat/usb.h #include control.h -/* OMAP control module register for UTMI PHY */ -#define CONTROL_DEV_CONF 0x300 -#define PHY_PD 0x1 - -#define USBOTGHS_CONTROL 0x33c -#defineAVALID BIT(0) -#defineBVALID BIT(1) -#defineVBUSVALID BIT(2) -#defineSESSEND BIT(3) -#defineIDDIG BIT(4) - -static struct clk *phyclk, *clk48m, *clk32k; -static void __iomem *ctrl_base; -static int usbotghs_control; - -int omap4430_phy_init(struct device *dev) -{ - ctrl_base = ioremap(OMAP443X_SCM_BASE, SZ_1K); - if (!ctrl_base) { - pr_err(control module ioremap failed\n); - return -ENOMEM; - } - /* Power down the phy */ - __raw_writel(PHY_PD, ctrl_base + CONTROL_DEV_CONF); Just checking, but I hope your new driver handles this too. You might not see any issues with it now, but not doing this could gate OMAP hitting low power in idle. I power down the phy during probe in omap-usb2 phy driver. ok, thanks, good to know. Thanks Kishon -- To unsubscribe from this list: send the line unsubscribe linux-usb in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH v1 01/11] drivers: usb: otg: add a new driver for omap usb2 phy
diff --git a/Documentation/devicetree/bindings/usb/omap-usb.txt b/Documentation/devicetree/bindings/usb/omap-usb.txt new file mode 100644 index 000..80a28c9 --- /dev/null +++ b/Documentation/devicetree/bindings/usb/omap-usb.txt @@ -0,0 +1,16 @@ +OMAP USB PHY + +OMAP USB2 PHY + +Required properties: + - compatible: Should be ti,omap-usb2 + - reg : Address and length of the register set for the device. Also +add the address of control module dev conf register until a driver for +control module is added + +This is usually a subnode of ocp2scp to which it is connected. + +usb2phy@0x4a0ad080 { + compatible = ti,omap-usb2; + reg =0x4a0ad080 0x58; Don;t you need a 'ti,hwmods' entry for this one? --- /dev/null +++ b/drivers/usb/otg/omap-usb2.c @@ -0,0 +1,273 @@ +/* + * omap-usb2.c - USB PHY, talking to musb controller in OMAP. + * + * Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com Copyright (C) 2012? Same for the couple of headers below. + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Author: Kishon Vijay Abraham Ikis...@ti.com + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + + +static int __devinit omap_usb2_probe(struct platform_device *pdev) +{ + struct omap_usb *phy; + struct usb_otg *otg; + struct resource *res; + + phy = devm_kzalloc(pdev-dev, sizeof(*phy), GFP_KERNEL); + if (!phy) { + dev_err(pdev-dev, unable to allocate memory for USB2 PHY\n); + return -ENOMEM; + } + + otg = devm_kzalloc(pdev-dev, sizeof(*otg), GFP_KERNEL); + if (!otg) { + dev_err(pdev-dev, unable to allocate memory for USB OTG\n); + return -ENOMEM; + } + + phy-dev =pdev-dev; + + phy-phy.dev = phy-dev; + phy-phy.label = omap-usb2; + phy-phy.set_suspend = omap_usb2_suspend; + phy-phy.otg = otg; + + res = platform_get_resource(pdev, IORESOURCE_MEM, 1); + + phy-control_dev_conf = devm_request_and_ioremap(pdev-dev, res); + if (phy-control_dev_conf == NULL) { + dev_err(pdev-dev, Failed to obtain io memory\n); + return -ENXIO; + } + + phy-is_suspended= 1; + omap_usb_phy_power(phy, 0); + + otg-set_host= omap_usb_set_host; + otg-set_peripheral = omap_usb_set_peripheral; + otg-set_vbus= omap_usb_set_vbus; + otg-start_srp = omap_usb_start_srp; + otg-phy =phy-phy; + + phy-wkupclk = devm_clk_get(phy-dev, usb_phy_cm_clk32k); Why not just use clk_get()? What does devm_clk_get() do? + if (IS_ERR(phy-wkupclk)) { + dev_err(pdev-dev, unable to get usb_phy_cm_clk32k\n); + return PTR_ERR(phy-wkupclk); + } + clk_prepare(phy-wkupclk); Ideally clk_prepare() is an extension of clk_enable() and is expected to be used that way. Not to be clubbed with clk_get(). Same with clk_unprepare(). Do you do a clk_enable()/_disable() in interrupt/ atomic context? + + usb_add_phy(phy-phy, USB_PHY_TYPE_USB2); + + platform_set_drvdata(pdev, phy); + + pm_runtime_enable(phy-dev); + + return 0; +} + +static int __devexit omap_usb2_remove(struct platform_device *pdev) +{ + struct omap_usb *phy = platform_get_drvdata(pdev); + + clk_unprepare(phy-wkupclk); + usb_remove_phy(phy-phy); + platform_set_drvdata(pdev, NULL); + + return 0; +} + +#ifdef CONFIG_PM + +static int omap_usb2_runtime_suspend(struct device *dev) +{ + struct platform_device *pdev = to_platform_device(dev); + struct omap_usb *phy = platform_get_drvdata(pdev); + + clk_disable(phy-wkupclk); + + return 0; +} + +static int omap_usb2_runtime_resume(struct device *dev) +{ + struct platform_device *pdev = to_platform_device(dev); + struct omap_usb *phy = platform_get_drvdata(pdev); + + clk_enable(phy-wkupclk); + + return 0; +} + +static const struct dev_pm_ops omap_usb2_pm_ops = { + SET_RUNTIME_PM_OPS(omap_usb2_runtime_suspend, omap_usb2_runtime_resume, + NULL) +}; + +#define DEV_PM_OPS (omap_usb2_pm_ops) +#else +#define DEV_PM_OPS NULL +#endif + +#ifdef CONFIG_OF +static const struct of_device_id omap_usb2_id_table[] = { + { .compatible = ti,omap-usb2 }, + {} +}; +MODULE_DEVICE_TABLE(of, omap_usb2_id_table); +#else +#define omap_usb2_id_table NULL; +#endif + +static
Re: [PATCH v1 05/11] drivers: usb: twl6030: Add dt support for twl6030 usb
On Thursday 28 June 2012 05:21 PM, Kishon Vijay Abraham I wrote: Add device tree support for twl6030 usb driver. Update the Documentation with device tree binding information. Signed-off-by: Kishon Vijay Abraham Ikis...@ti.com --- .../devicetree/bindings/usb/twl-usb.txt| 18 drivers/usb/otg/twl6030-usb.c | 45 ++-- 2 files changed, 50 insertions(+), 13 deletions(-) create mode 100644 Documentation/devicetree/bindings/usb/twl-usb.txt diff --git a/Documentation/devicetree/bindings/usb/twl-usb.txt b/Documentation/devicetree/bindings/usb/twl-usb.txt new file mode 100644 index 000..f293271 --- /dev/null +++ b/Documentation/devicetree/bindings/usb/twl-usb.txt @@ -0,0 +1,18 @@ +USB COMPARATOR OF TWL CHIPS + +TWL6030 USB COMPARATOR + - compatible : Should be ti,twl6030-usb + - interrupts : Two interrupt numbers to the cpu should be specified. First + interrupt number is the otg interrupt number that raises ID interrupts when + the controller has to act as host and the second interrupt number is the + usb interrupt number that raises VBUS interrupts when the controller has to + act as device + - regulator :supply-name can be vusb or ldousb + -supply-name-supply : phandle to the regulator device tree node + +twl6030-usb { + compatible = ti,twl6030-usb; + interrupts = 4 10; + regulator = vusb; + vusb-supply =vusb; This doesn't seem right. Why do you ned a 'regulator' string along with the phandle? +}; diff --git a/drivers/usb/otg/twl6030-usb.c b/drivers/usb/otg/twl6030-usb.c index 6a361d2..20b7abe 100644 --- a/drivers/usb/otg/twl6030-usb.c +++ b/drivers/usb/otg/twl6030-usb.c @@ -105,7 +105,7 @@ struct twl6030_usb { u8 asleep; boolirq_enabled; boolvbus_enable; - unsigned long features; + const char *regulator; }; #define comparator_to_twl(x) container_of((x), struct twl6030_usb, comparator) @@ -153,13 +153,6 @@ static int twl6030_start_srp(struct phy_companion *comparator) static int twl6030_usb_ldo_init(struct twl6030_usb *twl) { - char *regulator_name; - - if (twl-features TWL6025_SUBCLASS) - regulator_name = ldousb; - else - regulator_name = vusb; - /* Set to OTG_REV 1.3 and turn on the ID_WAKEUP_COMP */ twl6030_writeb(twl, TWL6030_MODULE_ID0 , 0x1, TWL6030_BACKUP_REG); @@ -169,7 +162,7 @@ static int twl6030_usb_ldo_init(struct twl6030_usb *twl) /* Program MISC2 register and set bit VUSB_IN_VBAT */ twl6030_writeb(twl, TWL6030_MODULE_ID0 , 0x10, TWL6030_MISC2); - twl-usb3v3 = regulator_get(twl-dev, regulator_name); + twl-usb3v3 = regulator_get(twl-dev, twl-regulator); if (IS_ERR(twl-usb3v3)) return -ENODEV; @@ -324,9 +317,9 @@ static int __devinit twl6030_usb_probe(struct platform_device *pdev) { struct twl6030_usb *twl; int status, err; - struct twl4030_usb_data *pdata; - struct device *dev =pdev-dev; - pdata = dev-platform_data; + struct device_node *np = pdev-dev.of_node; + struct device *dev =pdev-dev; + struct twl4030_usb_data *pdata = dev-platform_data; twl = devm_kzalloc(dev, sizeof *twl, GFP_KERNEL); if (!twl) @@ -335,13 +328,28 @@ static int __devinit twl6030_usb_probe(struct platform_device *pdev) twl-dev =pdev-dev; twl-irq1= platform_get_irq(pdev, 0); twl-irq2= platform_get_irq(pdev, 1); - twl-features= pdata-features; twl-linkstat= OMAP_MUSB_UNKNOWN; twl-comparator.set_vbus = twl6030_set_vbus; twl-comparator.start_srp= twl6030_start_srp; omap_usb2_set_comparator(twl-comparator); + if (np) { + err = of_property_read_string(np, regulator,twl-regulator); + if (err 0) { + dev_err(pdev-dev, unable to get regulator\n); + return err; + } Isn't there a better way for the driver to know which supply to use instead of DT passing the supply name? regards, Rajendra + } else if (pdata) { + if (pdata-features TWL6025_SUBCLASS) + twl-regulator = ldousb; + else + twl-regulator = vusb; + } else { + dev_err(pdev-dev, twl6030 initialized without pdata\n); + return -EINVAL; + } + /* init spinlock for workqueue */ spin_lock_init(twl-lock); @@ -403,12 +411,23 @@ static int __exit twl6030_usb_remove(struct platform_device *pdev) return 0; } +#ifdef CONFIG_OF +static const struct of_device_id twl6030_usb_id_table[] = { + { .compatible =