cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

fhci-hcd.c (19304B)


      1// SPDX-License-Identifier: GPL-2.0+
      2/*
      3 * Freescale QUICC Engine USB Host Controller Driver
      4 *
      5 * Copyright (c) Freescale Semicondutor, Inc. 2006.
      6 *               Shlomi Gridish <gridish@freescale.com>
      7 *               Jerry Huang <Chang-Ming.Huang@freescale.com>
      8 * Copyright (c) Logic Product Development, Inc. 2007
      9 *               Peter Barada <peterb@logicpd.com>
     10 * Copyright (c) MontaVista Software, Inc. 2008.
     11 *               Anton Vorontsov <avorontsov@ru.mvista.com>
     12 */
     13
     14#include <linux/module.h>
     15#include <linux/types.h>
     16#include <linux/spinlock.h>
     17#include <linux/kernel.h>
     18#include <linux/delay.h>
     19#include <linux/errno.h>
     20#include <linux/list.h>
     21#include <linux/interrupt.h>
     22#include <linux/io.h>
     23#include <linux/usb.h>
     24#include <linux/usb/hcd.h>
     25#include <linux/of_address.h>
     26#include <linux/of_irq.h>
     27#include <linux/of_platform.h>
     28#include <linux/of_gpio.h>
     29#include <linux/slab.h>
     30#include <soc/fsl/qe/qe.h>
     31#include <asm/fsl_gtm.h>
     32#include "fhci.h"
     33
     34void fhci_start_sof_timer(struct fhci_hcd *fhci)
     35{
     36	fhci_dbg(fhci, "-> %s\n", __func__);
     37
     38	/* clear frame_n */
     39	out_be16(&fhci->pram->frame_num, 0);
     40
     41	out_be16(&fhci->regs->usb_ussft, 0);
     42	setbits8(&fhci->regs->usb_usmod, USB_MODE_SFTE);
     43
     44	fhci_dbg(fhci, "<- %s\n", __func__);
     45}
     46
     47void fhci_stop_sof_timer(struct fhci_hcd *fhci)
     48{
     49	fhci_dbg(fhci, "-> %s\n", __func__);
     50
     51	clrbits8(&fhci->regs->usb_usmod, USB_MODE_SFTE);
     52	gtm_stop_timer16(fhci->timer);
     53
     54	fhci_dbg(fhci, "<- %s\n", __func__);
     55}
     56
     57u16 fhci_get_sof_timer_count(struct fhci_usb *usb)
     58{
     59	return be16_to_cpu(in_be16(&usb->fhci->regs->usb_ussft) / 12);
     60}
     61
     62/* initialize the endpoint zero */
     63static u32 endpoint_zero_init(struct fhci_usb *usb,
     64			      enum fhci_mem_alloc data_mem,
     65			      u32 ring_len)
     66{
     67	u32 rc;
     68
     69	rc = fhci_create_ep(usb, data_mem, ring_len);
     70	if (rc)
     71		return rc;
     72
     73	/* inilialize endpoint registers */
     74	fhci_init_ep_registers(usb, usb->ep0, data_mem);
     75
     76	return 0;
     77}
     78
     79/* enable the USB interrupts */
     80void fhci_usb_enable_interrupt(struct fhci_usb *usb)
     81{
     82	struct fhci_hcd *fhci = usb->fhci;
     83
     84	if (usb->intr_nesting_cnt == 1) {
     85		/* initialize the USB interrupt */
     86		enable_irq(fhci_to_hcd(fhci)->irq);
     87
     88		/* initialize the event register and mask register */
     89		out_be16(&usb->fhci->regs->usb_usber, 0xffff);
     90		out_be16(&usb->fhci->regs->usb_usbmr, usb->saved_msk);
     91
     92		/* enable the timer interrupts */
     93		enable_irq(fhci->timer->irq);
     94	} else if (usb->intr_nesting_cnt > 1)
     95		fhci_info(fhci, "unbalanced USB interrupts nesting\n");
     96	usb->intr_nesting_cnt--;
     97}
     98
     99/* disable the usb interrupt */
    100void fhci_usb_disable_interrupt(struct fhci_usb *usb)
    101{
    102	struct fhci_hcd *fhci = usb->fhci;
    103
    104	if (usb->intr_nesting_cnt == 0) {
    105		/* disable the timer interrupt */
    106		disable_irq_nosync(fhci->timer->irq);
    107
    108		/* disable the usb interrupt */
    109		disable_irq_nosync(fhci_to_hcd(fhci)->irq);
    110		out_be16(&usb->fhci->regs->usb_usbmr, 0);
    111	}
    112	usb->intr_nesting_cnt++;
    113}
    114
    115/* enable the USB controller */
    116static u32 fhci_usb_enable(struct fhci_hcd *fhci)
    117{
    118	struct fhci_usb *usb = fhci->usb_lld;
    119
    120	out_be16(&usb->fhci->regs->usb_usber, 0xffff);
    121	out_be16(&usb->fhci->regs->usb_usbmr, usb->saved_msk);
    122	setbits8(&usb->fhci->regs->usb_usmod, USB_MODE_EN);
    123
    124	mdelay(100);
    125
    126	return 0;
    127}
    128
    129/* disable the USB controller */
    130static u32 fhci_usb_disable(struct fhci_hcd *fhci)
    131{
    132	struct fhci_usb *usb = fhci->usb_lld;
    133
    134	fhci_usb_disable_interrupt(usb);
    135	fhci_port_disable(fhci);
    136
    137	/* disable the usb controller */
    138	if (usb->port_status == FHCI_PORT_FULL ||
    139			usb->port_status == FHCI_PORT_LOW)
    140		fhci_device_disconnected_interrupt(fhci);
    141
    142	clrbits8(&usb->fhci->regs->usb_usmod, USB_MODE_EN);
    143
    144	return 0;
    145}
    146
    147/* check the bus state by polling the QE bit on the IO ports */
    148int fhci_ioports_check_bus_state(struct fhci_hcd *fhci)
    149{
    150	u8 bits = 0;
    151
    152	/* check USBOE,if transmitting,exit */
    153	if (!gpio_get_value(fhci->gpios[GPIO_USBOE]))
    154		return -1;
    155
    156	/* check USBRP */
    157	if (gpio_get_value(fhci->gpios[GPIO_USBRP]))
    158		bits |= 0x2;
    159
    160	/* check USBRN */
    161	if (gpio_get_value(fhci->gpios[GPIO_USBRN]))
    162		bits |= 0x1;
    163
    164	return bits;
    165}
    166
    167static void fhci_mem_free(struct fhci_hcd *fhci)
    168{
    169	struct ed *ed;
    170	struct ed *next_ed;
    171	struct td *td;
    172	struct td *next_td;
    173
    174	list_for_each_entry_safe(ed, next_ed, &fhci->empty_eds, node) {
    175		list_del(&ed->node);
    176		kfree(ed);
    177	}
    178
    179	list_for_each_entry_safe(td, next_td, &fhci->empty_tds, node) {
    180		list_del(&td->node);
    181		kfree(td);
    182	}
    183
    184	kfree(fhci->vroot_hub);
    185	fhci->vroot_hub = NULL;
    186
    187	kfree(fhci->hc_list);
    188	fhci->hc_list = NULL;
    189}
    190
    191static int fhci_mem_init(struct fhci_hcd *fhci)
    192{
    193	int i;
    194
    195	fhci->hc_list = kzalloc(sizeof(*fhci->hc_list), GFP_KERNEL);
    196	if (!fhci->hc_list)
    197		goto err;
    198
    199	INIT_LIST_HEAD(&fhci->hc_list->ctrl_list);
    200	INIT_LIST_HEAD(&fhci->hc_list->bulk_list);
    201	INIT_LIST_HEAD(&fhci->hc_list->iso_list);
    202	INIT_LIST_HEAD(&fhci->hc_list->intr_list);
    203	INIT_LIST_HEAD(&fhci->hc_list->done_list);
    204
    205	fhci->vroot_hub = kzalloc(sizeof(*fhci->vroot_hub), GFP_KERNEL);
    206	if (!fhci->vroot_hub)
    207		goto err;
    208
    209	INIT_LIST_HEAD(&fhci->empty_eds);
    210	INIT_LIST_HEAD(&fhci->empty_tds);
    211
    212	/* initialize work queue to handle done list */
    213	fhci_tasklet.data = (unsigned long)fhci;
    214	fhci->process_done_task = &fhci_tasklet;
    215
    216	for (i = 0; i < MAX_TDS; i++) {
    217		struct td *td;
    218
    219		td = kmalloc(sizeof(*td), GFP_KERNEL);
    220		if (!td)
    221			goto err;
    222		fhci_recycle_empty_td(fhci, td);
    223	}
    224	for (i = 0; i < MAX_EDS; i++) {
    225		struct ed *ed;
    226
    227		ed = kmalloc(sizeof(*ed), GFP_KERNEL);
    228		if (!ed)
    229			goto err;
    230		fhci_recycle_empty_ed(fhci, ed);
    231	}
    232
    233	fhci->active_urbs = 0;
    234	return 0;
    235err:
    236	fhci_mem_free(fhci);
    237	return -ENOMEM;
    238}
    239
    240/* destroy the fhci_usb structure */
    241static void fhci_usb_free(void *lld)
    242{
    243	struct fhci_usb *usb = lld;
    244	struct fhci_hcd *fhci;
    245
    246	if (usb) {
    247		fhci = usb->fhci;
    248		fhci_config_transceiver(fhci, FHCI_PORT_POWER_OFF);
    249		fhci_ep0_free(usb);
    250		kfree(usb->actual_frame);
    251		kfree(usb);
    252	}
    253}
    254
    255/* initialize the USB */
    256static int fhci_usb_init(struct fhci_hcd *fhci)
    257{
    258	struct fhci_usb *usb = fhci->usb_lld;
    259
    260	memset_io(usb->fhci->pram, 0, FHCI_PRAM_SIZE);
    261
    262	usb->port_status = FHCI_PORT_DISABLED;
    263	usb->max_frame_usage = FRAME_TIME_USAGE;
    264	usb->sw_transaction_time = SW_FIX_TIME_BETWEEN_TRANSACTION;
    265
    266	usb->actual_frame = kzalloc(sizeof(*usb->actual_frame), GFP_KERNEL);
    267	if (!usb->actual_frame) {
    268		fhci_usb_free(usb);
    269		return -ENOMEM;
    270	}
    271
    272	INIT_LIST_HEAD(&usb->actual_frame->tds_list);
    273
    274	/* initializing registers on chip, clear frame number */
    275	out_be16(&fhci->pram->frame_num, 0);
    276
    277	/* clear rx state */
    278	out_be32(&fhci->pram->rx_state, 0);
    279
    280	/* set mask register */
    281	usb->saved_msk = (USB_E_TXB_MASK |
    282			  USB_E_TXE1_MASK |
    283			  USB_E_IDLE_MASK |
    284			  USB_E_RESET_MASK | USB_E_SFT_MASK | USB_E_MSF_MASK);
    285
    286	out_8(&usb->fhci->regs->usb_usmod, USB_MODE_HOST | USB_MODE_EN);
    287
    288	/* clearing the mask register */
    289	out_be16(&usb->fhci->regs->usb_usbmr, 0);
    290
    291	/* initialing the event register */
    292	out_be16(&usb->fhci->regs->usb_usber, 0xffff);
    293
    294	if (endpoint_zero_init(usb, DEFAULT_DATA_MEM, DEFAULT_RING_LEN) != 0) {
    295		fhci_usb_free(usb);
    296		return -EINVAL;
    297	}
    298
    299	return 0;
    300}
    301
    302/* initialize the fhci_usb struct and the corresponding data staruct */
    303static struct fhci_usb *fhci_create_lld(struct fhci_hcd *fhci)
    304{
    305	struct fhci_usb *usb;
    306
    307	/* allocate memory for SCC data structure */
    308	usb = kzalloc(sizeof(*usb), GFP_KERNEL);
    309	if (!usb)
    310		return NULL;
    311
    312	usb->fhci = fhci;
    313	usb->hc_list = fhci->hc_list;
    314	usb->vroot_hub = fhci->vroot_hub;
    315
    316	usb->transfer_confirm = fhci_transfer_confirm_callback;
    317
    318	return usb;
    319}
    320
    321static int fhci_start(struct usb_hcd *hcd)
    322{
    323	int ret;
    324	struct fhci_hcd *fhci = hcd_to_fhci(hcd);
    325
    326	ret = fhci_mem_init(fhci);
    327	if (ret) {
    328		fhci_err(fhci, "failed to allocate memory\n");
    329		goto err;
    330	}
    331
    332	fhci->usb_lld = fhci_create_lld(fhci);
    333	if (!fhci->usb_lld) {
    334		fhci_err(fhci, "low level driver config failed\n");
    335		ret = -ENOMEM;
    336		goto err;
    337	}
    338
    339	ret = fhci_usb_init(fhci);
    340	if (ret) {
    341		fhci_err(fhci, "low level driver initialize failed\n");
    342		goto err;
    343	}
    344
    345	spin_lock_init(&fhci->lock);
    346
    347	/* connect the virtual root hub */
    348	fhci->vroot_hub->dev_num = 1;	/* this field may be needed to fix */
    349	fhci->vroot_hub->hub.wHubStatus = 0;
    350	fhci->vroot_hub->hub.wHubChange = 0;
    351	fhci->vroot_hub->port.wPortStatus = 0;
    352	fhci->vroot_hub->port.wPortChange = 0;
    353
    354	hcd->state = HC_STATE_RUNNING;
    355
    356	/*
    357	 * From here on, hub_wq concurrently accesses the root
    358	 * hub; drivers will be talking to enumerated devices.
    359	 * (On restart paths, hub_wq already knows about the root
    360	 * hub and could find work as soon as we wrote FLAG_CF.)
    361	 *
    362	 * Before this point the HC was idle/ready.  After, hub_wq
    363	 * and device drivers may start it running.
    364	 */
    365	fhci_usb_enable(fhci);
    366	return 0;
    367err:
    368	fhci_mem_free(fhci);
    369	return ret;
    370}
    371
    372static void fhci_stop(struct usb_hcd *hcd)
    373{
    374	struct fhci_hcd *fhci = hcd_to_fhci(hcd);
    375
    376	fhci_usb_disable_interrupt(fhci->usb_lld);
    377	fhci_usb_disable(fhci);
    378
    379	fhci_usb_free(fhci->usb_lld);
    380	fhci->usb_lld = NULL;
    381	fhci_mem_free(fhci);
    382}
    383
    384static int fhci_urb_enqueue(struct usb_hcd *hcd, struct urb *urb,
    385			    gfp_t mem_flags)
    386{
    387	struct fhci_hcd *fhci = hcd_to_fhci(hcd);
    388	u32 pipe = urb->pipe;
    389	int ret;
    390	int i;
    391	int size = 0;
    392	struct urb_priv *urb_priv;
    393	unsigned long flags;
    394
    395	switch (usb_pipetype(pipe)) {
    396	case PIPE_CONTROL:
    397		/* 1 td fro setup,1 for ack */
    398		size = 2;
    399		fallthrough;
    400	case PIPE_BULK:
    401		/* one td for every 4096 bytes(can be up to 8k) */
    402		size += urb->transfer_buffer_length / 4096;
    403		/* ...add for any remaining bytes... */
    404		if ((urb->transfer_buffer_length % 4096) != 0)
    405			size++;
    406		/* ..and maybe a zero length packet to wrap it up */
    407		if (size == 0)
    408			size++;
    409		else if ((urb->transfer_flags & URB_ZERO_PACKET) != 0
    410			 && (urb->transfer_buffer_length
    411			     % usb_maxpacket(urb->dev, pipe)) != 0)
    412			size++;
    413		break;
    414	case PIPE_ISOCHRONOUS:
    415		size = urb->number_of_packets;
    416		if (size <= 0)
    417			return -EINVAL;
    418		for (i = 0; i < urb->number_of_packets; i++) {
    419			urb->iso_frame_desc[i].actual_length = 0;
    420			urb->iso_frame_desc[i].status = (u32) (-EXDEV);
    421		}
    422		break;
    423	case PIPE_INTERRUPT:
    424		size = 1;
    425	}
    426
    427	/* allocate the private part of the URB */
    428	urb_priv = kzalloc(sizeof(*urb_priv), mem_flags);
    429	if (!urb_priv)
    430		return -ENOMEM;
    431
    432	/* allocate the private part of the URB */
    433	urb_priv->tds = kcalloc(size, sizeof(*urb_priv->tds), mem_flags);
    434	if (!urb_priv->tds) {
    435		kfree(urb_priv);
    436		return -ENOMEM;
    437	}
    438
    439	spin_lock_irqsave(&fhci->lock, flags);
    440
    441	ret = usb_hcd_link_urb_to_ep(hcd, urb);
    442	if (ret)
    443		goto err;
    444
    445	/* fill the private part of the URB */
    446	urb_priv->num_of_tds = size;
    447
    448	urb->status = -EINPROGRESS;
    449	urb->actual_length = 0;
    450	urb->error_count = 0;
    451	urb->hcpriv = urb_priv;
    452
    453	fhci_queue_urb(fhci, urb);
    454err:
    455	if (ret) {
    456		kfree(urb_priv->tds);
    457		kfree(urb_priv);
    458	}
    459	spin_unlock_irqrestore(&fhci->lock, flags);
    460	return ret;
    461}
    462
    463/* dequeue FHCI URB */
    464static int fhci_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status)
    465{
    466	struct fhci_hcd *fhci = hcd_to_fhci(hcd);
    467	struct fhci_usb *usb = fhci->usb_lld;
    468	int ret = -EINVAL;
    469	unsigned long flags;
    470
    471	if (!urb || !urb->dev || !urb->dev->bus)
    472		goto out;
    473
    474	spin_lock_irqsave(&fhci->lock, flags);
    475
    476	ret = usb_hcd_check_unlink_urb(hcd, urb, status);
    477	if (ret)
    478		goto out2;
    479
    480	if (usb->port_status != FHCI_PORT_DISABLED) {
    481		struct urb_priv *urb_priv;
    482
    483		/*
    484		 * flag the urb's data for deletion in some upcoming
    485		 * SF interrupt's delete list processing
    486		 */
    487		urb_priv = urb->hcpriv;
    488
    489		if (!urb_priv || (urb_priv->state == URB_DEL))
    490			goto out2;
    491
    492		urb_priv->state = URB_DEL;
    493
    494		/* already pending? */
    495		urb_priv->ed->state = FHCI_ED_URB_DEL;
    496	} else {
    497		fhci_urb_complete_free(fhci, urb);
    498	}
    499
    500out2:
    501	spin_unlock_irqrestore(&fhci->lock, flags);
    502out:
    503	return ret;
    504}
    505
    506static void fhci_endpoint_disable(struct usb_hcd *hcd,
    507				  struct usb_host_endpoint *ep)
    508{
    509	struct fhci_hcd *fhci;
    510	struct ed *ed;
    511	unsigned long flags;
    512
    513	fhci = hcd_to_fhci(hcd);
    514	spin_lock_irqsave(&fhci->lock, flags);
    515	ed = ep->hcpriv;
    516	if (ed) {
    517		while (ed->td_head != NULL) {
    518			struct td *td = fhci_remove_td_from_ed(ed);
    519			fhci_urb_complete_free(fhci, td->urb);
    520		}
    521		fhci_recycle_empty_ed(fhci, ed);
    522		ep->hcpriv = NULL;
    523	}
    524	spin_unlock_irqrestore(&fhci->lock, flags);
    525}
    526
    527static int fhci_get_frame_number(struct usb_hcd *hcd)
    528{
    529	struct fhci_hcd *fhci = hcd_to_fhci(hcd);
    530
    531	return get_frame_num(fhci);
    532}
    533
    534static const struct hc_driver fhci_driver = {
    535	.description = "fsl,usb-fhci",
    536	.product_desc = "FHCI HOST Controller",
    537	.hcd_priv_size = sizeof(struct fhci_hcd),
    538
    539	/* generic hardware linkage */
    540	.irq = fhci_irq,
    541	.flags = HCD_DMA | HCD_USB11 | HCD_MEMORY,
    542
    543	/* basic lifecycle operation */
    544	.start = fhci_start,
    545	.stop = fhci_stop,
    546
    547	/* managing i/o requests and associated device resources */
    548	.urb_enqueue = fhci_urb_enqueue,
    549	.urb_dequeue = fhci_urb_dequeue,
    550	.endpoint_disable = fhci_endpoint_disable,
    551
    552	/* scheduling support */
    553	.get_frame_number = fhci_get_frame_number,
    554
    555	/* root hub support */
    556	.hub_status_data = fhci_hub_status_data,
    557	.hub_control = fhci_hub_control,
    558};
    559
    560static int of_fhci_probe(struct platform_device *ofdev)
    561{
    562	struct device *dev = &ofdev->dev;
    563	struct device_node *node = dev->of_node;
    564	struct usb_hcd *hcd;
    565	struct fhci_hcd *fhci;
    566	struct resource usb_regs;
    567	unsigned long pram_addr;
    568	unsigned int usb_irq;
    569	const char *sprop;
    570	const u32 *iprop;
    571	int size;
    572	int ret;
    573	int i;
    574	int j;
    575
    576	if (usb_disabled())
    577		return -ENODEV;
    578
    579	sprop = of_get_property(node, "mode", NULL);
    580	if (sprop && strcmp(sprop, "host"))
    581		return -ENODEV;
    582
    583	hcd = usb_create_hcd(&fhci_driver, dev, dev_name(dev));
    584	if (!hcd) {
    585		dev_err(dev, "could not create hcd\n");
    586		return -ENOMEM;
    587	}
    588
    589	fhci = hcd_to_fhci(hcd);
    590	hcd->self.controller = dev;
    591	dev_set_drvdata(dev, hcd);
    592
    593	iprop = of_get_property(node, "hub-power-budget", &size);
    594	if (iprop && size == sizeof(*iprop))
    595		hcd->power_budget = *iprop;
    596
    597	/* FHCI registers. */
    598	ret = of_address_to_resource(node, 0, &usb_regs);
    599	if (ret) {
    600		dev_err(dev, "could not get regs\n");
    601		goto err_regs;
    602	}
    603
    604	hcd->regs = ioremap(usb_regs.start, resource_size(&usb_regs));
    605	if (!hcd->regs) {
    606		dev_err(dev, "could not ioremap regs\n");
    607		ret = -ENOMEM;
    608		goto err_regs;
    609	}
    610	fhci->regs = hcd->regs;
    611
    612	/* Parameter RAM. */
    613	iprop = of_get_property(node, "reg", &size);
    614	if (!iprop || size < sizeof(*iprop) * 4) {
    615		dev_err(dev, "can't get pram offset\n");
    616		ret = -EINVAL;
    617		goto err_pram;
    618	}
    619
    620	pram_addr = cpm_muram_alloc(FHCI_PRAM_SIZE, 64);
    621	if (IS_ERR_VALUE(pram_addr)) {
    622		dev_err(dev, "failed to allocate usb pram\n");
    623		ret = -ENOMEM;
    624		goto err_pram;
    625	}
    626
    627	qe_issue_cmd(QE_ASSIGN_PAGE_TO_DEVICE, QE_CR_SUBBLOCK_USB,
    628		     QE_CR_PROTOCOL_UNSPECIFIED, pram_addr);
    629	fhci->pram = cpm_muram_addr(pram_addr);
    630
    631	/* GPIOs and pins */
    632	for (i = 0; i < NUM_GPIOS; i++) {
    633		int gpio;
    634		enum of_gpio_flags flags;
    635
    636		gpio = of_get_gpio_flags(node, i, &flags);
    637		fhci->gpios[i] = gpio;
    638		fhci->alow_gpios[i] = flags & OF_GPIO_ACTIVE_LOW;
    639
    640		if (!gpio_is_valid(gpio)) {
    641			if (i < GPIO_SPEED) {
    642				dev_err(dev, "incorrect GPIO%d: %d\n",
    643					i, gpio);
    644				goto err_gpios;
    645			} else {
    646				dev_info(dev, "assuming board doesn't have "
    647					"%s gpio\n", i == GPIO_SPEED ?
    648					"speed" : "power");
    649				continue;
    650			}
    651		}
    652
    653		ret = gpio_request(gpio, dev_name(dev));
    654		if (ret) {
    655			dev_err(dev, "failed to request gpio %d", i);
    656			goto err_gpios;
    657		}
    658
    659		if (i >= GPIO_SPEED) {
    660			ret = gpio_direction_output(gpio, 0);
    661			if (ret) {
    662				dev_err(dev, "failed to set gpio %d as "
    663					"an output\n", i);
    664				i++;
    665				goto err_gpios;
    666			}
    667		}
    668	}
    669
    670	for (j = 0; j < NUM_PINS; j++) {
    671		fhci->pins[j] = qe_pin_request(node, j);
    672		if (IS_ERR(fhci->pins[j])) {
    673			ret = PTR_ERR(fhci->pins[j]);
    674			dev_err(dev, "can't get pin %d: %d\n", j, ret);
    675			goto err_pins;
    676		}
    677	}
    678
    679	/* Frame limit timer and its interrupt. */
    680	fhci->timer = gtm_get_timer16();
    681	if (IS_ERR(fhci->timer)) {
    682		ret = PTR_ERR(fhci->timer);
    683		dev_err(dev, "failed to request qe timer: %i", ret);
    684		goto err_get_timer;
    685	}
    686
    687	ret = request_irq(fhci->timer->irq, fhci_frame_limit_timer_irq,
    688			  0, "qe timer (usb)", hcd);
    689	if (ret) {
    690		dev_err(dev, "failed to request timer irq");
    691		goto err_timer_irq;
    692	}
    693
    694	/* USB Host interrupt. */
    695	usb_irq = irq_of_parse_and_map(node, 0);
    696	if (usb_irq == NO_IRQ) {
    697		dev_err(dev, "could not get usb irq\n");
    698		ret = -EINVAL;
    699		goto err_usb_irq;
    700	}
    701
    702	/* Clocks. */
    703	sprop = of_get_property(node, "fsl,fullspeed-clock", NULL);
    704	if (sprop) {
    705		fhci->fullspeed_clk = qe_clock_source(sprop);
    706		if (fhci->fullspeed_clk == QE_CLK_DUMMY) {
    707			dev_err(dev, "wrong fullspeed-clock\n");
    708			ret = -EINVAL;
    709			goto err_clocks;
    710		}
    711	}
    712
    713	sprop = of_get_property(node, "fsl,lowspeed-clock", NULL);
    714	if (sprop) {
    715		fhci->lowspeed_clk = qe_clock_source(sprop);
    716		if (fhci->lowspeed_clk == QE_CLK_DUMMY) {
    717			dev_err(dev, "wrong lowspeed-clock\n");
    718			ret = -EINVAL;
    719			goto err_clocks;
    720		}
    721	}
    722
    723	if (fhci->fullspeed_clk == QE_CLK_NONE &&
    724			fhci->lowspeed_clk == QE_CLK_NONE) {
    725		dev_err(dev, "no clocks specified\n");
    726		ret = -EINVAL;
    727		goto err_clocks;
    728	}
    729
    730	dev_info(dev, "at 0x%p, irq %d\n", hcd->regs, usb_irq);
    731
    732	fhci_config_transceiver(fhci, FHCI_PORT_POWER_OFF);
    733
    734	/* Start with full-speed, if possible. */
    735	if (fhci->fullspeed_clk != QE_CLK_NONE) {
    736		fhci_config_transceiver(fhci, FHCI_PORT_FULL);
    737		qe_usb_clock_set(fhci->fullspeed_clk, USB_CLOCK);
    738	} else {
    739		fhci_config_transceiver(fhci, FHCI_PORT_LOW);
    740		qe_usb_clock_set(fhci->lowspeed_clk, USB_CLOCK >> 3);
    741	}
    742
    743	/* Clear and disable any pending interrupts. */
    744	out_be16(&fhci->regs->usb_usber, 0xffff);
    745	out_be16(&fhci->regs->usb_usbmr, 0);
    746
    747	ret = usb_add_hcd(hcd, usb_irq, 0);
    748	if (ret < 0)
    749		goto err_add_hcd;
    750
    751	device_wakeup_enable(hcd->self.controller);
    752
    753	fhci_dfs_create(fhci);
    754
    755	return 0;
    756
    757err_add_hcd:
    758err_clocks:
    759	irq_dispose_mapping(usb_irq);
    760err_usb_irq:
    761	free_irq(fhci->timer->irq, hcd);
    762err_timer_irq:
    763	gtm_put_timer16(fhci->timer);
    764err_get_timer:
    765err_pins:
    766	while (--j >= 0)
    767		qe_pin_free(fhci->pins[j]);
    768err_gpios:
    769	while (--i >= 0) {
    770		if (gpio_is_valid(fhci->gpios[i]))
    771			gpio_free(fhci->gpios[i]);
    772	}
    773	cpm_muram_free(pram_addr);
    774err_pram:
    775	iounmap(hcd->regs);
    776err_regs:
    777	usb_put_hcd(hcd);
    778	return ret;
    779}
    780
    781static int fhci_remove(struct device *dev)
    782{
    783	struct usb_hcd *hcd = dev_get_drvdata(dev);
    784	struct fhci_hcd *fhci = hcd_to_fhci(hcd);
    785	int i;
    786	int j;
    787
    788	usb_remove_hcd(hcd);
    789	free_irq(fhci->timer->irq, hcd);
    790	gtm_put_timer16(fhci->timer);
    791	cpm_muram_free(cpm_muram_offset(fhci->pram));
    792	for (i = 0; i < NUM_GPIOS; i++) {
    793		if (!gpio_is_valid(fhci->gpios[i]))
    794			continue;
    795		gpio_free(fhci->gpios[i]);
    796	}
    797	for (j = 0; j < NUM_PINS; j++)
    798		qe_pin_free(fhci->pins[j]);
    799	fhci_dfs_destroy(fhci);
    800	usb_put_hcd(hcd);
    801	return 0;
    802}
    803
    804static int of_fhci_remove(struct platform_device *ofdev)
    805{
    806	return fhci_remove(&ofdev->dev);
    807}
    808
    809static const struct of_device_id of_fhci_match[] = {
    810	{ .compatible = "fsl,mpc8323-qe-usb", },
    811	{},
    812};
    813MODULE_DEVICE_TABLE(of, of_fhci_match);
    814
    815static struct platform_driver of_fhci_driver = {
    816	.driver = {
    817		.name = "fsl,usb-fhci",
    818		.of_match_table = of_fhci_match,
    819	},
    820	.probe		= of_fhci_probe,
    821	.remove		= of_fhci_remove,
    822};
    823
    824module_platform_driver(of_fhci_driver);
    825
    826MODULE_DESCRIPTION("USB Freescale Host Controller Interface Driver");
    827MODULE_AUTHOR("Shlomi Gridish <gridish@freescale.com>, "
    828	      "Jerry Huang <Chang-Ming.Huang@freescale.com>, "
    829	      "Anton Vorontsov <avorontsov@ru.mvista.com>");
    830MODULE_LICENSE("GPL");