提交 69cb1ec4 编写于 作者: E Eric Bénard 提交者: Greg Kroah-Hartman

mxc_udc: add workaround for ENGcm09152 for i.MX35

this patch gives the possibility to workaround bug ENGcm09152
on i.MX35 when the hardware workaround is also implemented on
the board.
It covers the workaround described on page 25 of the following Errata :
http://cache.freescale.com/files/dsp/doc/errata/IMX35CE.pdfSigned-off-by: NEric Bénard <eric@eukrea.com>
Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
上级 0f266abd
...@@ -155,6 +155,7 @@ static struct mxc_usbh_platform_data usbh1_pdata = { ...@@ -155,6 +155,7 @@ static struct mxc_usbh_platform_data usbh1_pdata = {
static struct fsl_usb2_platform_data otg_device_pdata = { static struct fsl_usb2_platform_data otg_device_pdata = {
.operating_mode = FSL_USB2_DR_DEVICE, .operating_mode = FSL_USB2_DR_DEVICE,
.phy_mode = FSL_USB2_PHY_UTMI, .phy_mode = FSL_USB2_PHY_UTMI,
.workaround = FLS_USB2_WORKAROUND_ENGCM09152,
}; };
static int otg_mode_host; static int otg_mode_host;
......
...@@ -22,6 +22,10 @@ ...@@ -22,6 +22,10 @@
static struct clk *mxc_ahb_clk; static struct clk *mxc_ahb_clk;
static struct clk *mxc_usb_clk; static struct clk *mxc_usb_clk;
/* workaround ENGcm09152 for i.MX35 */
#define USBPHYCTRL_OTGBASE_OFFSET 0x608
#define USBPHYCTRL_EVDO (1 << 23)
int fsl_udc_clk_init(struct platform_device *pdev) int fsl_udc_clk_init(struct platform_device *pdev)
{ {
struct fsl_usb2_platform_data *pdata; struct fsl_usb2_platform_data *pdata;
...@@ -84,6 +88,17 @@ int fsl_udc_clk_init(struct platform_device *pdev) ...@@ -84,6 +88,17 @@ int fsl_udc_clk_init(struct platform_device *pdev)
void fsl_udc_clk_finalize(struct platform_device *pdev) void fsl_udc_clk_finalize(struct platform_device *pdev)
{ {
struct fsl_usb2_platform_data *pdata = pdev->dev.platform_data; struct fsl_usb2_platform_data *pdata = pdev->dev.platform_data;
#if defined(CONFIG_ARCH_MX35)
unsigned int v;
/* workaround ENGcm09152 for i.MX35 */
if (pdata->workaround & FLS_USB2_WORKAROUND_ENGCM09152) {
v = readl(MX35_IO_ADDRESS(MX35_OTG_BASE_ADDR +
USBPHYCTRL_OTGBASE_OFFSET));
writel(v | USBPHYCTRL_EVDO, MX35_IO_ADDRESS(MX35_OTG_BASE_ADDR +
USBPHYCTRL_OTGBASE_OFFSET));
}
#endif
/* ULPI transceivers don't need usbpll */ /* ULPI transceivers don't need usbpll */
if (pdata->phy_mode == FSL_USB2_PHY_ULPI) { if (pdata->phy_mode == FSL_USB2_PHY_ULPI) {
......
...@@ -66,6 +66,7 @@ struct fsl_usb2_platform_data { ...@@ -66,6 +66,7 @@ struct fsl_usb2_platform_data {
enum fsl_usb2_operating_modes operating_mode; enum fsl_usb2_operating_modes operating_mode;
enum fsl_usb2_phy_modes phy_mode; enum fsl_usb2_phy_modes phy_mode;
unsigned int port_enables; unsigned int port_enables;
unsigned int workaround;
int (*init)(struct platform_device *); int (*init)(struct platform_device *);
void (*exit)(struct platform_device *); void (*exit)(struct platform_device *);
...@@ -84,6 +85,8 @@ struct fsl_usb2_platform_data { ...@@ -84,6 +85,8 @@ struct fsl_usb2_platform_data {
#define FSL_USB2_PORT0_ENABLED 0x00000001 #define FSL_USB2_PORT0_ENABLED 0x00000001
#define FSL_USB2_PORT1_ENABLED 0x00000002 #define FSL_USB2_PORT1_ENABLED 0x00000002
#define FLS_USB2_WORKAROUND_ENGCM09152 (1 << 0)
struct spi_device; struct spi_device;
struct fsl_spi_platform_data { struct fsl_spi_platform_data {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册