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

phy-mv-usb.c (20643B)


      1// SPDX-License-Identifier: GPL-2.0+
      2/*
      3 * Copyright (C) 2011 Marvell International Ltd. All rights reserved.
      4 * Author: Chao Xie <chao.xie@marvell.com>
      5 *	   Neil Zhang <zhangwm@marvell.com>
      6 */
      7
      8#include <linux/module.h>
      9#include <linux/kernel.h>
     10#include <linux/io.h>
     11#include <linux/iopoll.h>
     12#include <linux/uaccess.h>
     13#include <linux/device.h>
     14#include <linux/proc_fs.h>
     15#include <linux/clk.h>
     16#include <linux/workqueue.h>
     17#include <linux/platform_device.h>
     18
     19#include <linux/usb.h>
     20#include <linux/usb/ch9.h>
     21#include <linux/usb/otg.h>
     22#include <linux/usb/gadget.h>
     23#include <linux/usb/hcd.h>
     24#include <linux/platform_data/mv_usb.h>
     25
     26#include "phy-mv-usb.h"
     27
     28#define	DRIVER_DESC	"Marvell USB OTG transceiver driver"
     29
     30MODULE_DESCRIPTION(DRIVER_DESC);
     31MODULE_LICENSE("GPL");
     32
     33static const char driver_name[] = "mv-otg";
     34
     35static char *state_string[] = {
     36	"undefined",
     37	"b_idle",
     38	"b_srp_init",
     39	"b_peripheral",
     40	"b_wait_acon",
     41	"b_host",
     42	"a_idle",
     43	"a_wait_vrise",
     44	"a_wait_bcon",
     45	"a_host",
     46	"a_suspend",
     47	"a_peripheral",
     48	"a_wait_vfall",
     49	"a_vbus_err"
     50};
     51
     52static int mv_otg_set_vbus(struct usb_otg *otg, bool on)
     53{
     54	struct mv_otg *mvotg = container_of(otg->usb_phy, struct mv_otg, phy);
     55	if (mvotg->pdata->set_vbus == NULL)
     56		return -ENODEV;
     57
     58	return mvotg->pdata->set_vbus(on);
     59}
     60
     61static int mv_otg_set_host(struct usb_otg *otg,
     62			   struct usb_bus *host)
     63{
     64	otg->host = host;
     65
     66	return 0;
     67}
     68
     69static int mv_otg_set_peripheral(struct usb_otg *otg,
     70				 struct usb_gadget *gadget)
     71{
     72	otg->gadget = gadget;
     73
     74	return 0;
     75}
     76
     77static void mv_otg_run_state_machine(struct mv_otg *mvotg,
     78				     unsigned long delay)
     79{
     80	dev_dbg(&mvotg->pdev->dev, "transceiver is updated\n");
     81	if (!mvotg->qwork)
     82		return;
     83
     84	queue_delayed_work(mvotg->qwork, &mvotg->work, delay);
     85}
     86
     87static void mv_otg_timer_await_bcon(struct timer_list *t)
     88{
     89	struct mv_otg *mvotg = from_timer(mvotg, t,
     90					  otg_ctrl.timer[A_WAIT_BCON_TIMER]);
     91
     92	mvotg->otg_ctrl.a_wait_bcon_timeout = 1;
     93
     94	dev_info(&mvotg->pdev->dev, "B Device No Response!\n");
     95
     96	if (spin_trylock(&mvotg->wq_lock)) {
     97		mv_otg_run_state_machine(mvotg, 0);
     98		spin_unlock(&mvotg->wq_lock);
     99	}
    100}
    101
    102static int mv_otg_cancel_timer(struct mv_otg *mvotg, unsigned int id)
    103{
    104	struct timer_list *timer;
    105
    106	if (id >= OTG_TIMER_NUM)
    107		return -EINVAL;
    108
    109	timer = &mvotg->otg_ctrl.timer[id];
    110
    111	if (timer_pending(timer))
    112		del_timer(timer);
    113
    114	return 0;
    115}
    116
    117static int mv_otg_set_timer(struct mv_otg *mvotg, unsigned int id,
    118			    unsigned long interval)
    119{
    120	struct timer_list *timer;
    121
    122	if (id >= OTG_TIMER_NUM)
    123		return -EINVAL;
    124
    125	timer = &mvotg->otg_ctrl.timer[id];
    126	if (timer_pending(timer)) {
    127		dev_err(&mvotg->pdev->dev, "Timer%d is already running\n", id);
    128		return -EBUSY;
    129	}
    130
    131	timer->expires = jiffies + interval;
    132	add_timer(timer);
    133
    134	return 0;
    135}
    136
    137static int mv_otg_reset(struct mv_otg *mvotg)
    138{
    139	u32 tmp;
    140	int ret;
    141
    142	/* Stop the controller */
    143	tmp = readl(&mvotg->op_regs->usbcmd);
    144	tmp &= ~USBCMD_RUN_STOP;
    145	writel(tmp, &mvotg->op_regs->usbcmd);
    146
    147	/* Reset the controller to get default values */
    148	writel(USBCMD_CTRL_RESET, &mvotg->op_regs->usbcmd);
    149
    150	ret = readl_poll_timeout_atomic(&mvotg->op_regs->usbcmd, tmp,
    151				(tmp & USBCMD_CTRL_RESET), 10, 10000);
    152	if (ret < 0) {
    153		dev_err(&mvotg->pdev->dev,
    154			"Wait for RESET completed TIMEOUT\n");
    155		return ret;
    156	}
    157
    158	writel(0x0, &mvotg->op_regs->usbintr);
    159	tmp = readl(&mvotg->op_regs->usbsts);
    160	writel(tmp, &mvotg->op_regs->usbsts);
    161
    162	return 0;
    163}
    164
    165static void mv_otg_init_irq(struct mv_otg *mvotg)
    166{
    167	u32 otgsc;
    168
    169	mvotg->irq_en = OTGSC_INTR_A_SESSION_VALID
    170	    | OTGSC_INTR_A_VBUS_VALID;
    171	mvotg->irq_status = OTGSC_INTSTS_A_SESSION_VALID
    172	    | OTGSC_INTSTS_A_VBUS_VALID;
    173
    174	if (mvotg->pdata->vbus == NULL) {
    175		mvotg->irq_en |= OTGSC_INTR_B_SESSION_VALID
    176		    | OTGSC_INTR_B_SESSION_END;
    177		mvotg->irq_status |= OTGSC_INTSTS_B_SESSION_VALID
    178		    | OTGSC_INTSTS_B_SESSION_END;
    179	}
    180
    181	if (mvotg->pdata->id == NULL) {
    182		mvotg->irq_en |= OTGSC_INTR_USB_ID;
    183		mvotg->irq_status |= OTGSC_INTSTS_USB_ID;
    184	}
    185
    186	otgsc = readl(&mvotg->op_regs->otgsc);
    187	otgsc |= mvotg->irq_en;
    188	writel(otgsc, &mvotg->op_regs->otgsc);
    189}
    190
    191static void mv_otg_start_host(struct mv_otg *mvotg, int on)
    192{
    193#ifdef CONFIG_USB
    194	struct usb_otg *otg = mvotg->phy.otg;
    195	struct usb_hcd *hcd;
    196
    197	if (!otg->host)
    198		return;
    199
    200	dev_info(&mvotg->pdev->dev, "%s host\n", on ? "start" : "stop");
    201
    202	hcd = bus_to_hcd(otg->host);
    203
    204	if (on) {
    205		usb_add_hcd(hcd, hcd->irq, IRQF_SHARED);
    206		device_wakeup_enable(hcd->self.controller);
    207	} else {
    208		usb_remove_hcd(hcd);
    209	}
    210#endif /* CONFIG_USB */
    211}
    212
    213static void mv_otg_start_periphrals(struct mv_otg *mvotg, int on)
    214{
    215	struct usb_otg *otg = mvotg->phy.otg;
    216
    217	if (!otg->gadget)
    218		return;
    219
    220	dev_info(mvotg->phy.dev, "gadget %s\n", on ? "on" : "off");
    221
    222	if (on)
    223		usb_gadget_vbus_connect(otg->gadget);
    224	else
    225		usb_gadget_vbus_disconnect(otg->gadget);
    226}
    227
    228static void otg_clock_enable(struct mv_otg *mvotg)
    229{
    230	clk_prepare_enable(mvotg->clk);
    231}
    232
    233static void otg_clock_disable(struct mv_otg *mvotg)
    234{
    235	clk_disable_unprepare(mvotg->clk);
    236}
    237
    238static int mv_otg_enable_internal(struct mv_otg *mvotg)
    239{
    240	int retval = 0;
    241
    242	if (mvotg->active)
    243		return 0;
    244
    245	dev_dbg(&mvotg->pdev->dev, "otg enabled\n");
    246
    247	otg_clock_enable(mvotg);
    248	if (mvotg->pdata->phy_init) {
    249		retval = mvotg->pdata->phy_init(mvotg->phy_regs);
    250		if (retval) {
    251			dev_err(&mvotg->pdev->dev,
    252				"init phy error %d\n", retval);
    253			otg_clock_disable(mvotg);
    254			return retval;
    255		}
    256	}
    257	mvotg->active = 1;
    258
    259	return 0;
    260
    261}
    262
    263static int mv_otg_enable(struct mv_otg *mvotg)
    264{
    265	if (mvotg->clock_gating)
    266		return mv_otg_enable_internal(mvotg);
    267
    268	return 0;
    269}
    270
    271static void mv_otg_disable_internal(struct mv_otg *mvotg)
    272{
    273	if (mvotg->active) {
    274		dev_dbg(&mvotg->pdev->dev, "otg disabled\n");
    275		if (mvotg->pdata->phy_deinit)
    276			mvotg->pdata->phy_deinit(mvotg->phy_regs);
    277		otg_clock_disable(mvotg);
    278		mvotg->active = 0;
    279	}
    280}
    281
    282static void mv_otg_disable(struct mv_otg *mvotg)
    283{
    284	if (mvotg->clock_gating)
    285		mv_otg_disable_internal(mvotg);
    286}
    287
    288static void mv_otg_update_inputs(struct mv_otg *mvotg)
    289{
    290	struct mv_otg_ctrl *otg_ctrl = &mvotg->otg_ctrl;
    291	u32 otgsc;
    292
    293	otgsc = readl(&mvotg->op_regs->otgsc);
    294
    295	if (mvotg->pdata->vbus) {
    296		if (mvotg->pdata->vbus->poll() == VBUS_HIGH) {
    297			otg_ctrl->b_sess_vld = 1;
    298			otg_ctrl->b_sess_end = 0;
    299		} else {
    300			otg_ctrl->b_sess_vld = 0;
    301			otg_ctrl->b_sess_end = 1;
    302		}
    303	} else {
    304		otg_ctrl->b_sess_vld = !!(otgsc & OTGSC_STS_B_SESSION_VALID);
    305		otg_ctrl->b_sess_end = !!(otgsc & OTGSC_STS_B_SESSION_END);
    306	}
    307
    308	if (mvotg->pdata->id)
    309		otg_ctrl->id = !!mvotg->pdata->id->poll();
    310	else
    311		otg_ctrl->id = !!(otgsc & OTGSC_STS_USB_ID);
    312
    313	if (mvotg->pdata->otg_force_a_bus_req && !otg_ctrl->id)
    314		otg_ctrl->a_bus_req = 1;
    315
    316	otg_ctrl->a_sess_vld = !!(otgsc & OTGSC_STS_A_SESSION_VALID);
    317	otg_ctrl->a_vbus_vld = !!(otgsc & OTGSC_STS_A_VBUS_VALID);
    318
    319	dev_dbg(&mvotg->pdev->dev, "%s: ", __func__);
    320	dev_dbg(&mvotg->pdev->dev, "id %d\n", otg_ctrl->id);
    321	dev_dbg(&mvotg->pdev->dev, "b_sess_vld %d\n", otg_ctrl->b_sess_vld);
    322	dev_dbg(&mvotg->pdev->dev, "b_sess_end %d\n", otg_ctrl->b_sess_end);
    323	dev_dbg(&mvotg->pdev->dev, "a_vbus_vld %d\n", otg_ctrl->a_vbus_vld);
    324	dev_dbg(&mvotg->pdev->dev, "a_sess_vld %d\n", otg_ctrl->a_sess_vld);
    325}
    326
    327static void mv_otg_update_state(struct mv_otg *mvotg)
    328{
    329	struct mv_otg_ctrl *otg_ctrl = &mvotg->otg_ctrl;
    330	int old_state = mvotg->phy.otg->state;
    331
    332	switch (old_state) {
    333	case OTG_STATE_UNDEFINED:
    334		mvotg->phy.otg->state = OTG_STATE_B_IDLE;
    335		fallthrough;
    336	case OTG_STATE_B_IDLE:
    337		if (otg_ctrl->id == 0)
    338			mvotg->phy.otg->state = OTG_STATE_A_IDLE;
    339		else if (otg_ctrl->b_sess_vld)
    340			mvotg->phy.otg->state = OTG_STATE_B_PERIPHERAL;
    341		break;
    342	case OTG_STATE_B_PERIPHERAL:
    343		if (!otg_ctrl->b_sess_vld || otg_ctrl->id == 0)
    344			mvotg->phy.otg->state = OTG_STATE_B_IDLE;
    345		break;
    346	case OTG_STATE_A_IDLE:
    347		if (otg_ctrl->id)
    348			mvotg->phy.otg->state = OTG_STATE_B_IDLE;
    349		else if (!(otg_ctrl->a_bus_drop) &&
    350			 (otg_ctrl->a_bus_req || otg_ctrl->a_srp_det))
    351			mvotg->phy.otg->state = OTG_STATE_A_WAIT_VRISE;
    352		break;
    353	case OTG_STATE_A_WAIT_VRISE:
    354		if (otg_ctrl->a_vbus_vld)
    355			mvotg->phy.otg->state = OTG_STATE_A_WAIT_BCON;
    356		break;
    357	case OTG_STATE_A_WAIT_BCON:
    358		if (otg_ctrl->id || otg_ctrl->a_bus_drop
    359		    || otg_ctrl->a_wait_bcon_timeout) {
    360			mv_otg_cancel_timer(mvotg, A_WAIT_BCON_TIMER);
    361			mvotg->otg_ctrl.a_wait_bcon_timeout = 0;
    362			mvotg->phy.otg->state = OTG_STATE_A_WAIT_VFALL;
    363			otg_ctrl->a_bus_req = 0;
    364		} else if (!otg_ctrl->a_vbus_vld) {
    365			mv_otg_cancel_timer(mvotg, A_WAIT_BCON_TIMER);
    366			mvotg->otg_ctrl.a_wait_bcon_timeout = 0;
    367			mvotg->phy.otg->state = OTG_STATE_A_VBUS_ERR;
    368		} else if (otg_ctrl->b_conn) {
    369			mv_otg_cancel_timer(mvotg, A_WAIT_BCON_TIMER);
    370			mvotg->otg_ctrl.a_wait_bcon_timeout = 0;
    371			mvotg->phy.otg->state = OTG_STATE_A_HOST;
    372		}
    373		break;
    374	case OTG_STATE_A_HOST:
    375		if (otg_ctrl->id || !otg_ctrl->b_conn
    376		    || otg_ctrl->a_bus_drop)
    377			mvotg->phy.otg->state = OTG_STATE_A_WAIT_BCON;
    378		else if (!otg_ctrl->a_vbus_vld)
    379			mvotg->phy.otg->state = OTG_STATE_A_VBUS_ERR;
    380		break;
    381	case OTG_STATE_A_WAIT_VFALL:
    382		if (otg_ctrl->id
    383		    || (!otg_ctrl->b_conn && otg_ctrl->a_sess_vld)
    384		    || otg_ctrl->a_bus_req)
    385			mvotg->phy.otg->state = OTG_STATE_A_IDLE;
    386		break;
    387	case OTG_STATE_A_VBUS_ERR:
    388		if (otg_ctrl->id || otg_ctrl->a_clr_err
    389		    || otg_ctrl->a_bus_drop) {
    390			otg_ctrl->a_clr_err = 0;
    391			mvotg->phy.otg->state = OTG_STATE_A_WAIT_VFALL;
    392		}
    393		break;
    394	default:
    395		break;
    396	}
    397}
    398
    399static void mv_otg_work(struct work_struct *work)
    400{
    401	struct mv_otg *mvotg;
    402	struct usb_otg *otg;
    403	int old_state;
    404
    405	mvotg = container_of(to_delayed_work(work), struct mv_otg, work);
    406
    407run:
    408	/* work queue is single thread, or we need spin_lock to protect */
    409	otg = mvotg->phy.otg;
    410	old_state = otg->state;
    411
    412	if (!mvotg->active)
    413		return;
    414
    415	mv_otg_update_inputs(mvotg);
    416	mv_otg_update_state(mvotg);
    417
    418	if (old_state != mvotg->phy.otg->state) {
    419		dev_info(&mvotg->pdev->dev, "change from state %s to %s\n",
    420			 state_string[old_state],
    421			 state_string[mvotg->phy.otg->state]);
    422
    423		switch (mvotg->phy.otg->state) {
    424		case OTG_STATE_B_IDLE:
    425			otg->default_a = 0;
    426			if (old_state == OTG_STATE_B_PERIPHERAL)
    427				mv_otg_start_periphrals(mvotg, 0);
    428			mv_otg_reset(mvotg);
    429			mv_otg_disable(mvotg);
    430			usb_phy_set_event(&mvotg->phy, USB_EVENT_NONE);
    431			break;
    432		case OTG_STATE_B_PERIPHERAL:
    433			mv_otg_enable(mvotg);
    434			mv_otg_start_periphrals(mvotg, 1);
    435			usb_phy_set_event(&mvotg->phy, USB_EVENT_ENUMERATED);
    436			break;
    437		case OTG_STATE_A_IDLE:
    438			otg->default_a = 1;
    439			mv_otg_enable(mvotg);
    440			if (old_state == OTG_STATE_A_WAIT_VFALL)
    441				mv_otg_start_host(mvotg, 0);
    442			mv_otg_reset(mvotg);
    443			break;
    444		case OTG_STATE_A_WAIT_VRISE:
    445			mv_otg_set_vbus(otg, 1);
    446			break;
    447		case OTG_STATE_A_WAIT_BCON:
    448			if (old_state != OTG_STATE_A_HOST)
    449				mv_otg_start_host(mvotg, 1);
    450			mv_otg_set_timer(mvotg, A_WAIT_BCON_TIMER,
    451					 T_A_WAIT_BCON);
    452			/*
    453			 * Now, we directly enter A_HOST. So set b_conn = 1
    454			 * here. In fact, it need host driver to notify us.
    455			 */
    456			mvotg->otg_ctrl.b_conn = 1;
    457			break;
    458		case OTG_STATE_A_HOST:
    459			break;
    460		case OTG_STATE_A_WAIT_VFALL:
    461			/*
    462			 * Now, we has exited A_HOST. So set b_conn = 0
    463			 * here. In fact, it need host driver to notify us.
    464			 */
    465			mvotg->otg_ctrl.b_conn = 0;
    466			mv_otg_set_vbus(otg, 0);
    467			break;
    468		case OTG_STATE_A_VBUS_ERR:
    469			break;
    470		default:
    471			break;
    472		}
    473		goto run;
    474	}
    475}
    476
    477static irqreturn_t mv_otg_irq(int irq, void *dev)
    478{
    479	struct mv_otg *mvotg = dev;
    480	u32 otgsc;
    481
    482	otgsc = readl(&mvotg->op_regs->otgsc);
    483	writel(otgsc, &mvotg->op_regs->otgsc);
    484
    485	/*
    486	 * if we have vbus, then the vbus detection for B-device
    487	 * will be done by mv_otg_inputs_irq().
    488	 */
    489	if (mvotg->pdata->vbus)
    490		if ((otgsc & OTGSC_STS_USB_ID) &&
    491		    !(otgsc & OTGSC_INTSTS_USB_ID))
    492			return IRQ_NONE;
    493
    494	if ((otgsc & mvotg->irq_status) == 0)
    495		return IRQ_NONE;
    496
    497	mv_otg_run_state_machine(mvotg, 0);
    498
    499	return IRQ_HANDLED;
    500}
    501
    502static irqreturn_t mv_otg_inputs_irq(int irq, void *dev)
    503{
    504	struct mv_otg *mvotg = dev;
    505
    506	/* The clock may disabled at this time */
    507	if (!mvotg->active) {
    508		mv_otg_enable(mvotg);
    509		mv_otg_init_irq(mvotg);
    510	}
    511
    512	mv_otg_run_state_machine(mvotg, 0);
    513
    514	return IRQ_HANDLED;
    515}
    516
    517static ssize_t
    518a_bus_req_show(struct device *dev, struct device_attribute *attr, char *buf)
    519{
    520	struct mv_otg *mvotg = dev_get_drvdata(dev);
    521	return scnprintf(buf, PAGE_SIZE, "%d\n",
    522			 mvotg->otg_ctrl.a_bus_req);
    523}
    524
    525static ssize_t
    526a_bus_req_store(struct device *dev, struct device_attribute *attr,
    527	      const char *buf, size_t count)
    528{
    529	struct mv_otg *mvotg = dev_get_drvdata(dev);
    530
    531	if (count > 2)
    532		return -1;
    533
    534	/* We will use this interface to change to A device */
    535	if (mvotg->phy.otg->state != OTG_STATE_B_IDLE
    536	    && mvotg->phy.otg->state != OTG_STATE_A_IDLE)
    537		return -1;
    538
    539	/* The clock may disabled and we need to set irq for ID detected */
    540	mv_otg_enable(mvotg);
    541	mv_otg_init_irq(mvotg);
    542
    543	if (buf[0] == '1') {
    544		mvotg->otg_ctrl.a_bus_req = 1;
    545		mvotg->otg_ctrl.a_bus_drop = 0;
    546		dev_dbg(&mvotg->pdev->dev,
    547			"User request: a_bus_req = 1\n");
    548
    549		if (spin_trylock(&mvotg->wq_lock)) {
    550			mv_otg_run_state_machine(mvotg, 0);
    551			spin_unlock(&mvotg->wq_lock);
    552		}
    553	}
    554
    555	return count;
    556}
    557
    558static DEVICE_ATTR_RW(a_bus_req);
    559
    560static ssize_t
    561a_clr_err_store(struct device *dev, struct device_attribute *attr,
    562	      const char *buf, size_t count)
    563{
    564	struct mv_otg *mvotg = dev_get_drvdata(dev);
    565	if (!mvotg->phy.otg->default_a)
    566		return -1;
    567
    568	if (count > 2)
    569		return -1;
    570
    571	if (buf[0] == '1') {
    572		mvotg->otg_ctrl.a_clr_err = 1;
    573		dev_dbg(&mvotg->pdev->dev,
    574			"User request: a_clr_err = 1\n");
    575	}
    576
    577	if (spin_trylock(&mvotg->wq_lock)) {
    578		mv_otg_run_state_machine(mvotg, 0);
    579		spin_unlock(&mvotg->wq_lock);
    580	}
    581
    582	return count;
    583}
    584
    585static DEVICE_ATTR_WO(a_clr_err);
    586
    587static ssize_t
    588a_bus_drop_show(struct device *dev, struct device_attribute *attr,
    589	       char *buf)
    590{
    591	struct mv_otg *mvotg = dev_get_drvdata(dev);
    592	return scnprintf(buf, PAGE_SIZE, "%d\n",
    593			 mvotg->otg_ctrl.a_bus_drop);
    594}
    595
    596static ssize_t
    597a_bus_drop_store(struct device *dev, struct device_attribute *attr,
    598	       const char *buf, size_t count)
    599{
    600	struct mv_otg *mvotg = dev_get_drvdata(dev);
    601	if (!mvotg->phy.otg->default_a)
    602		return -1;
    603
    604	if (count > 2)
    605		return -1;
    606
    607	if (buf[0] == '0') {
    608		mvotg->otg_ctrl.a_bus_drop = 0;
    609		dev_dbg(&mvotg->pdev->dev,
    610			"User request: a_bus_drop = 0\n");
    611	} else if (buf[0] == '1') {
    612		mvotg->otg_ctrl.a_bus_drop = 1;
    613		mvotg->otg_ctrl.a_bus_req = 0;
    614		dev_dbg(&mvotg->pdev->dev,
    615			"User request: a_bus_drop = 1\n");
    616		dev_dbg(&mvotg->pdev->dev,
    617			"User request: and a_bus_req = 0\n");
    618	}
    619
    620	if (spin_trylock(&mvotg->wq_lock)) {
    621		mv_otg_run_state_machine(mvotg, 0);
    622		spin_unlock(&mvotg->wq_lock);
    623	}
    624
    625	return count;
    626}
    627
    628static DEVICE_ATTR_RW(a_bus_drop);
    629
    630static struct attribute *inputs_attrs[] = {
    631	&dev_attr_a_bus_req.attr,
    632	&dev_attr_a_clr_err.attr,
    633	&dev_attr_a_bus_drop.attr,
    634	NULL,
    635};
    636
    637static const struct attribute_group inputs_attr_group = {
    638	.name = "inputs",
    639	.attrs = inputs_attrs,
    640};
    641
    642static const struct attribute_group *mv_otg_groups[] = {
    643	&inputs_attr_group,
    644	NULL,
    645};
    646
    647static int mv_otg_remove(struct platform_device *pdev)
    648{
    649	struct mv_otg *mvotg = platform_get_drvdata(pdev);
    650
    651	if (mvotg->qwork)
    652		destroy_workqueue(mvotg->qwork);
    653
    654	mv_otg_disable(mvotg);
    655
    656	usb_remove_phy(&mvotg->phy);
    657
    658	return 0;
    659}
    660
    661static int mv_otg_probe(struct platform_device *pdev)
    662{
    663	struct mv_usb_platform_data *pdata = dev_get_platdata(&pdev->dev);
    664	struct mv_otg *mvotg;
    665	struct usb_otg *otg;
    666	struct resource *r;
    667	int retval = 0, i;
    668
    669	if (pdata == NULL) {
    670		dev_err(&pdev->dev, "failed to get platform data\n");
    671		return -ENODEV;
    672	}
    673
    674	mvotg = devm_kzalloc(&pdev->dev, sizeof(*mvotg), GFP_KERNEL);
    675	if (!mvotg)
    676		return -ENOMEM;
    677
    678	otg = devm_kzalloc(&pdev->dev, sizeof(*otg), GFP_KERNEL);
    679	if (!otg)
    680		return -ENOMEM;
    681
    682	platform_set_drvdata(pdev, mvotg);
    683
    684	mvotg->pdev = pdev;
    685	mvotg->pdata = pdata;
    686
    687	mvotg->clk = devm_clk_get(&pdev->dev, NULL);
    688	if (IS_ERR(mvotg->clk))
    689		return PTR_ERR(mvotg->clk);
    690
    691	mvotg->qwork = create_singlethread_workqueue("mv_otg_queue");
    692	if (!mvotg->qwork) {
    693		dev_dbg(&pdev->dev, "cannot create workqueue for OTG\n");
    694		return -ENOMEM;
    695	}
    696
    697	INIT_DELAYED_WORK(&mvotg->work, mv_otg_work);
    698
    699	/* OTG common part */
    700	mvotg->pdev = pdev;
    701	mvotg->phy.dev = &pdev->dev;
    702	mvotg->phy.otg = otg;
    703	mvotg->phy.label = driver_name;
    704
    705	otg->state = OTG_STATE_UNDEFINED;
    706	otg->usb_phy = &mvotg->phy;
    707	otg->set_host = mv_otg_set_host;
    708	otg->set_peripheral = mv_otg_set_peripheral;
    709	otg->set_vbus = mv_otg_set_vbus;
    710
    711	for (i = 0; i < OTG_TIMER_NUM; i++)
    712		timer_setup(&mvotg->otg_ctrl.timer[i],
    713			    mv_otg_timer_await_bcon, 0);
    714
    715	r = platform_get_resource_byname(mvotg->pdev,
    716					 IORESOURCE_MEM, "phyregs");
    717	if (r == NULL) {
    718		dev_err(&pdev->dev, "no phy I/O memory resource defined\n");
    719		retval = -ENODEV;
    720		goto err_destroy_workqueue;
    721	}
    722
    723	mvotg->phy_regs = devm_ioremap(&pdev->dev, r->start, resource_size(r));
    724	if (mvotg->phy_regs == NULL) {
    725		dev_err(&pdev->dev, "failed to map phy I/O memory\n");
    726		retval = -EFAULT;
    727		goto err_destroy_workqueue;
    728	}
    729
    730	r = platform_get_resource_byname(mvotg->pdev,
    731					 IORESOURCE_MEM, "capregs");
    732	if (r == NULL) {
    733		dev_err(&pdev->dev, "no I/O memory resource defined\n");
    734		retval = -ENODEV;
    735		goto err_destroy_workqueue;
    736	}
    737
    738	mvotg->cap_regs = devm_ioremap(&pdev->dev, r->start, resource_size(r));
    739	if (mvotg->cap_regs == NULL) {
    740		dev_err(&pdev->dev, "failed to map I/O memory\n");
    741		retval = -EFAULT;
    742		goto err_destroy_workqueue;
    743	}
    744
    745	/* we will acces controller register, so enable the udc controller */
    746	retval = mv_otg_enable_internal(mvotg);
    747	if (retval) {
    748		dev_err(&pdev->dev, "mv otg enable error %d\n", retval);
    749		goto err_destroy_workqueue;
    750	}
    751
    752	mvotg->op_regs =
    753		(struct mv_otg_regs __iomem *) ((unsigned long) mvotg->cap_regs
    754			+ (readl(mvotg->cap_regs) & CAPLENGTH_MASK));
    755
    756	if (pdata->id) {
    757		retval = devm_request_threaded_irq(&pdev->dev, pdata->id->irq,
    758						NULL, mv_otg_inputs_irq,
    759						IRQF_ONESHOT, "id", mvotg);
    760		if (retval) {
    761			dev_info(&pdev->dev,
    762				 "Failed to request irq for ID\n");
    763			pdata->id = NULL;
    764		}
    765	}
    766
    767	if (pdata->vbus) {
    768		mvotg->clock_gating = 1;
    769		retval = devm_request_threaded_irq(&pdev->dev, pdata->vbus->irq,
    770						NULL, mv_otg_inputs_irq,
    771						IRQF_ONESHOT, "vbus", mvotg);
    772		if (retval) {
    773			dev_info(&pdev->dev,
    774				 "Failed to request irq for VBUS, "
    775				 "disable clock gating\n");
    776			mvotg->clock_gating = 0;
    777			pdata->vbus = NULL;
    778		}
    779	}
    780
    781	if (pdata->disable_otg_clock_gating)
    782		mvotg->clock_gating = 0;
    783
    784	mv_otg_reset(mvotg);
    785	mv_otg_init_irq(mvotg);
    786
    787	r = platform_get_resource(mvotg->pdev, IORESOURCE_IRQ, 0);
    788	if (r == NULL) {
    789		dev_err(&pdev->dev, "no IRQ resource defined\n");
    790		retval = -ENODEV;
    791		goto err_disable_clk;
    792	}
    793
    794	mvotg->irq = r->start;
    795	if (devm_request_irq(&pdev->dev, mvotg->irq, mv_otg_irq, IRQF_SHARED,
    796			driver_name, mvotg)) {
    797		dev_err(&pdev->dev, "Request irq %d for OTG failed\n",
    798			mvotg->irq);
    799		mvotg->irq = 0;
    800		retval = -ENODEV;
    801		goto err_disable_clk;
    802	}
    803
    804	retval = usb_add_phy(&mvotg->phy, USB_PHY_TYPE_USB2);
    805	if (retval < 0) {
    806		dev_err(&pdev->dev, "can't register transceiver, %d\n",
    807			retval);
    808		goto err_disable_clk;
    809	}
    810
    811	spin_lock_init(&mvotg->wq_lock);
    812	if (spin_trylock(&mvotg->wq_lock)) {
    813		mv_otg_run_state_machine(mvotg, 2 * HZ);
    814		spin_unlock(&mvotg->wq_lock);
    815	}
    816
    817	dev_info(&pdev->dev,
    818		 "successful probe OTG device %s clock gating.\n",
    819		 mvotg->clock_gating ? "with" : "without");
    820
    821	return 0;
    822
    823err_disable_clk:
    824	mv_otg_disable_internal(mvotg);
    825err_destroy_workqueue:
    826	destroy_workqueue(mvotg->qwork);
    827
    828	return retval;
    829}
    830
    831#ifdef CONFIG_PM
    832static int mv_otg_suspend(struct platform_device *pdev, pm_message_t state)
    833{
    834	struct mv_otg *mvotg = platform_get_drvdata(pdev);
    835
    836	if (mvotg->phy.otg->state != OTG_STATE_B_IDLE) {
    837		dev_info(&pdev->dev,
    838			 "OTG state is not B_IDLE, it is %d!\n",
    839			 mvotg->phy.otg->state);
    840		return -EAGAIN;
    841	}
    842
    843	if (!mvotg->clock_gating)
    844		mv_otg_disable_internal(mvotg);
    845
    846	return 0;
    847}
    848
    849static int mv_otg_resume(struct platform_device *pdev)
    850{
    851	struct mv_otg *mvotg = platform_get_drvdata(pdev);
    852	u32 otgsc;
    853
    854	if (!mvotg->clock_gating) {
    855		mv_otg_enable_internal(mvotg);
    856
    857		otgsc = readl(&mvotg->op_regs->otgsc);
    858		otgsc |= mvotg->irq_en;
    859		writel(otgsc, &mvotg->op_regs->otgsc);
    860
    861		if (spin_trylock(&mvotg->wq_lock)) {
    862			mv_otg_run_state_machine(mvotg, 0);
    863			spin_unlock(&mvotg->wq_lock);
    864		}
    865	}
    866	return 0;
    867}
    868#endif
    869
    870static struct platform_driver mv_otg_driver = {
    871	.probe = mv_otg_probe,
    872	.remove = mv_otg_remove,
    873	.driver = {
    874		   .name = driver_name,
    875		   .dev_groups = mv_otg_groups,
    876		   },
    877#ifdef CONFIG_PM
    878	.suspend = mv_otg_suspend,
    879	.resume = mv_otg_resume,
    880#endif
    881};
    882module_platform_driver(mv_otg_driver);