[PATCH 7/8] [POWERPC] qe_lib: add support for QE USB

Kumar Gala galak at kernel.crashing.org
Tue Apr 15 06:29:47 EST 2008


On Mar 11, 2008, at 12:24 PM, Anton Vorontsov wrote:
> I believe QE USB clocks routing is qe_lib authority, so usb.c
> created. Also, now cmxgcr needs its own lock.

why? (I'm asking to be more descriptive in the commit message)

> This patch also fixes QE_USB_RESTART_TX command definition.

Patch look ok, but can you be a bit more descriptive about why we are  
adding this.

- k

>
>
> Signed-off-by: Anton Vorontsov <avorontsov at ru.mvista.com>
> ---
> arch/powerpc/sysdev/qe_lib/Kconfig  |    6 ++++
> arch/powerpc/sysdev/qe_lib/Makefile |    1 +
> arch/powerpc/sysdev/qe_lib/ucc.c    |    7 ++--
> arch/powerpc/sysdev/qe_lib/usb.c    |   57 ++++++++++++++++++++++++++ 
> +++++++++
> include/asm-powerpc/qe.h            |   18 ++++++++++-
> 5 files changed, 85 insertions(+), 4 deletions(-)
> create mode 100644 arch/powerpc/sysdev/qe_lib/usb.c
>
> diff --git a/arch/powerpc/sysdev/qe_lib/Kconfig b/arch/powerpc/ 
> sysdev/qe_lib/Kconfig
> index c1f2849..f09dae4 100644
> --- a/arch/powerpc/sysdev/qe_lib/Kconfig
> +++ b/arch/powerpc/sysdev/qe_lib/Kconfig
> @@ -25,3 +25,9 @@ config QE_GTM
> 	default y if FSL_GTM
> 	help
> 	  QE General-purpose Timers Module support
> +
> +config QE_USB
> +	bool
> +	default y if USB_FHCI_HCD
> +	help
> +	  QE USB Host Controller support
> diff --git a/arch/powerpc/sysdev/qe_lib/Makefile b/arch/powerpc/ 
> sysdev/qe_lib/Makefile
> index 3297a52..c666a59 100644
> --- a/arch/powerpc/sysdev/qe_lib/Makefile
> +++ b/arch/powerpc/sysdev/qe_lib/Makefile
> @@ -7,3 +7,4 @@ obj-$(CONFIG_UCC)	+= ucc.o
> obj-$(CONFIG_UCC_SLOW)	+= ucc_slow.o
> obj-$(CONFIG_UCC_FAST)	+= ucc_fast.o
> obj-$(CONFIG_QE_GTM)	+= gtm.o
> +obj-$(CONFIG_QE_USB)	+= usb.o
> diff --git a/arch/powerpc/sysdev/qe_lib/ucc.c b/arch/powerpc/sysdev/ 
> qe_lib/ucc.c
> index 0e348d9..d3c7f5a 100644
> --- a/arch/powerpc/sysdev/qe_lib/ucc.c
> +++ b/arch/powerpc/sysdev/qe_lib/ucc.c
> @@ -26,7 +26,8 @@
> #include <asm/qe.h>
> #include <asm/ucc.h>
>
> -static DEFINE_SPINLOCK(ucc_lock);
> +DEFINE_SPINLOCK(cmxgcr_lock);
> +EXPORT_SYMBOL(cmxgcr_lock);
>
> int ucc_set_qe_mux_mii_mng(unsigned int ucc_num)
> {
> @@ -35,10 +36,10 @@ int ucc_set_qe_mux_mii_mng(unsigned int ucc_num)
> 	if (ucc_num > UCC_MAX_NUM - 1)
> 		return -EINVAL;
>
> -	spin_lock_irqsave(&ucc_lock, flags);
> +	spin_lock_irqsave(&cmxgcr_lock, flags);
> 	clrsetbits_be32(&qe_immr->qmx.cmxgcr, QE_CMXGCR_MII_ENET_MNG,
> 		ucc_num << QE_CMXGCR_MII_ENET_MNG_SHIFT);
> -	spin_unlock_irqrestore(&ucc_lock, flags);
> +	spin_unlock_irqrestore(&cmxgcr_lock, flags);
>
> 	return 0;
> }
> diff --git a/arch/powerpc/sysdev/qe_lib/usb.c b/arch/powerpc/sysdev/ 
> qe_lib/usb.c
> new file mode 100644
> index 0000000..60ce676
> --- /dev/null
> +++ b/arch/powerpc/sysdev/qe_lib/usb.c
> @@ -0,0 +1,57 @@
> +/*
> + * QE USB routines
> + *
> + * Copyright (c) Freescale Semicondutor, Inc. 2006.
> + *               Shlomi Gridish <gridish at freescale.com>
> + *               Jerry Huang <Chang-Ming.Huang at freescale.com>
> + * Copyright (c) MontaVista Software, Inc. 2008.
> + *               Anton Vorontsov <avorontsov at ru.mvista.com>
> + *
> + * 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.
> + */
> +
> +#include <linux/kernel.h>
> +#include <linux/errno.h>
> +#include <linux/io.h>
> +#include <linux/of.h>
> +#include <asm/immap_qe.h>
> +#include <asm/qe.h>
> +
> +int qe_usb_clock_set(enum qe_clock clk, int rate)
> +{
> +	struct qe_mux __iomem *mux = &qe_immr->qmx;
> +	unsigned long flags;
> +	const bool is_brg = clk < QE_CLK1;
> +	u32 val;
> +
> +	switch (clk) {
> +	case QE_CLK3:  val = QE_CMXGCR_USBCS_CLK3;  break;
> +	case QE_CLK5:  val = QE_CMXGCR_USBCS_CLK5;  break;
> +	case QE_CLK7:  val = QE_CMXGCR_USBCS_CLK7;  break;
> +	case QE_CLK9:  val = QE_CMXGCR_USBCS_CLK9;  break;
> +	case QE_CLK13: val = QE_CMXGCR_USBCS_CLK13; break;
> +	case QE_CLK17: val = QE_CMXGCR_USBCS_CLK17; break;
> +	case QE_CLK19: val = QE_CMXGCR_USBCS_CLK19; break;
> +	case QE_CLK21: val = QE_CMXGCR_USBCS_CLK21; break;
> +	case QE_BRG9:  val = QE_CMXGCR_USBCS_BRG9;  break;
> +	case QE_BRG10: val = QE_CMXGCR_USBCS_BRG10; break;
> +	default:
> +		pr_err("%s: requested unknown clock %d\n", __func__, clk);
> +		return -EINVAL;
> +	}
> +
> +	if (is_brg)
> +		qe_setbrg(clk, rate, 1);
> +
> +	spin_lock_irqsave(&cmxgcr_lock, flags);
> +
> +	clrsetbits_be32(&mux->cmxgcr, QE_CMXGCR_USBCS, val);
> +
> +	spin_unlock_irqrestore(&cmxgcr_lock, flags);
> +
> +	return 0;
> +}
> +EXPORT_SYMBOL(qe_usb_clock_set);
> diff --git a/include/asm-powerpc/qe.h b/include/asm-powerpc/qe.h
> index c3be6e2..3276b06 100644
> --- a/include/asm-powerpc/qe.h
> +++ b/include/asm-powerpc/qe.h
> @@ -16,6 +16,7 @@
> #define _ASM_POWERPC_QE_H
> #ifdef __KERNEL__
>
> +#include <linux/spinlock.h>
> #include <asm/immap_qe.h>
>
> #define QE_NUM_OF_SNUM	28
> @@ -74,6 +75,8 @@ enum qe_clock {
> 	QE_CLK_DUMMY
> };
>
> +extern spinlock_t cmxgcr_lock;
> +
> /* Export QE common operations */
> extern void qe_reset(void);
> extern int par_io_init(struct device_node *np);
> @@ -156,6 +159,9 @@ int qe_upload_firmware(const struct qe_firmware  
> *firmware);
> /* Obtain information on the uploaded firmware */
> struct qe_firmware_info *qe_get_firmware_info(void);
>
> +/* QE USB */
> +int qe_usb_clock_set(enum qe_clock clk, int rate);
> +
> /* Buffer descriptors */
> struct qe_bd {
> 	__be16 status;
> @@ -254,6 +260,16 @@ enum comm_dir {
> #define QE_CMXGCR_MII_ENET_MNG		0x00007000
> #define QE_CMXGCR_MII_ENET_MNG_SHIFT	12
> #define QE_CMXGCR_USBCS			0x0000000f
> +#define QE_CMXGCR_USBCS_CLK3		0x1
> +#define QE_CMXGCR_USBCS_CLK5		0x2
> +#define QE_CMXGCR_USBCS_CLK7		0x3
> +#define QE_CMXGCR_USBCS_CLK9		0x4
> +#define QE_CMXGCR_USBCS_CLK13		0x5
> +#define QE_CMXGCR_USBCS_CLK17		0x6
> +#define QE_CMXGCR_USBCS_CLK19		0x7
> +#define QE_CMXGCR_USBCS_CLK21		0x8
> +#define QE_CMXGCR_USBCS_BRG9		0x9
> +#define QE_CMXGCR_USBCS_BRG10		0xa
>
> /* QE CECR Commands.
> */
> @@ -283,7 +299,7 @@ enum comm_dir {
> #define QE_HPAC_START_TX		0x0000060b
> #define QE_HPAC_START_RX		0x0000070b
> #define QE_USB_STOP_TX			0x0000000a
> -#define QE_USB_RESTART_TX		0x0000000b
> +#define QE_USB_RESTART_TX		0x0000000c
> #define QE_QMC_STOP_TX			0x0000000c
> #define QE_QMC_STOP_RX			0x0000000d
> #define QE_SS7_SU_FIL_RESET		0x0000000e
> -- 
> 1.5.2.2
>
> _______________________________________________
> Linuxppc-dev mailing list
> Linuxppc-dev at ozlabs.org
> https://ozlabs.org/mailman/listinfo/linuxppc-dev




More information about the Linuxppc-dev mailing list