Linux Audio

Check our new training course

Loading...
v4.17
  1/*
  2 * Copyright (C) 2009 Valentin Longchamp, EPFL Mobots group
  3 *
  4 * This program is free software; you can redistribute it and/or modify
  5 * it under the terms of the GNU General Public License as published by
  6 * the Free Software Foundation; either version 2 of the License, or
  7 * (at your option) any later version.
  8 *
  9 * This program is distributed in the hope that it will be useful,
 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 12 * GNU General Public License for more details.
 13 */
 14
 15#include <linux/delay.h>
 16#include <linux/gpio.h>
 17#include <linux/init.h>
 18#include <linux/interrupt.h>
 19#include <linux/i2c.h>
 20#include <linux/platform_device.h>
 21#include <linux/types.h>
 22
 23#include <linux/usb/otg.h>
 24#include <linux/usb/ulpi.h>
 25
 
 
 26#include "board-mx31moboard.h"
 27#include "common.h"
 28#include "devices-imx31.h"
 29#include "ehci.h"
 30#include "hardware.h"
 31#include "iomux-mx3.h"
 32#include "ulpi.h"
 33
 34static unsigned int smartbot_pins[] = {
 35	/* UART1 */
 36	MX31_PIN_CTS2__CTS2, MX31_PIN_RTS2__RTS2,
 37	MX31_PIN_TXD2__TXD2, MX31_PIN_RXD2__RXD2,
 
 
 
 
 
 
 
 
 
 
 38	/* ENABLES */
 39	MX31_PIN_DTR_DCE1__GPIO2_8, MX31_PIN_DSR_DCE1__GPIO2_9,
 40	MX31_PIN_RI_DCE1__GPIO2_10, MX31_PIN_DCD_DCE1__GPIO2_11,
 41};
 42
 43static const struct imxuart_platform_data uart_pdata __initconst = {
 44	.flags = IMXUART_HAVE_RTSCTS,
 45};
 46
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 47static const struct fsl_usb2_platform_data usb_pdata __initconst = {
 48	.operating_mode	= FSL_USB2_DR_DEVICE,
 49	.phy_mode	= FSL_USB2_PHY_ULPI,
 50};
 51
 52#if defined(CONFIG_USB_ULPI)
 53
 54static int smartbot_otg_init(struct platform_device *pdev)
 55{
 56	return mx31_initialize_usb_hw(pdev->id, MXC_EHCI_POWER_PINS_ENABLED);
 57}
 58
 59static struct mxc_usbh_platform_data otg_host_pdata __initdata = {
 60	.init	= smartbot_otg_init,
 61	.portsc = MXC_EHCI_MODE_ULPI | MXC_EHCI_UTMI_8BIT,
 62};
 63
 64static int __init smartbot_otg_host_init(void)
 65{
 66	struct platform_device *pdev;
 67
 68	otg_host_pdata.otg = imx_otg_ulpi_create(ULPI_OTG_DRVVBUS |
 69		ULPI_OTG_DRVVBUS_EXT);
 70	if (!otg_host_pdata.otg)
 71		return -ENODEV;
 72
 73	pdev = imx31_add_mxc_ehci_otg(&otg_host_pdata);
 
 
 74
 75	return PTR_ERR_OR_ZERO(pdev);
 76}
 77#else
 78static inline int smartbot_otg_host_init(void) { return 0; }
 79#endif
 80
 81#define POWER_EN IOMUX_TO_GPIO(MX31_PIN_DTR_DCE1)
 82#define DSPIC_RST_B IOMUX_TO_GPIO(MX31_PIN_DSR_DCE1)
 83#define TRSLAT_RST_B IOMUX_TO_GPIO(MX31_PIN_RI_DCE1)
 84#define TRSLAT_SRC_CHOICE IOMUX_TO_GPIO(MX31_PIN_DCD_DCE1)
 85
 86static void smartbot_resets_init(void)
 87{
 88	if (!gpio_request(POWER_EN, "power-enable")) {
 89		gpio_direction_output(POWER_EN, 0);
 90		gpio_export(POWER_EN, false);
 91	}
 92
 93	if (!gpio_request(DSPIC_RST_B, "dspic-rst")) {
 94		gpio_direction_output(DSPIC_RST_B, 0);
 95		gpio_export(DSPIC_RST_B, false);
 96	}
 97
 98	if (!gpio_request(TRSLAT_RST_B, "translator-rst")) {
 99		gpio_direction_output(TRSLAT_RST_B, 0);
100		gpio_export(TRSLAT_RST_B, false);
101	}
102
103	if (!gpio_request(TRSLAT_SRC_CHOICE, "translator-src-choice")) {
104		gpio_direction_output(TRSLAT_SRC_CHOICE, 0);
105		gpio_export(TRSLAT_SRC_CHOICE, false);
106	}
107}
108/*
109 * system init for baseboard usage. Will be called by mx31moboard init.
110 */
111void __init mx31moboard_smartbot_init(int board)
112{
113	printk(KERN_INFO "Initializing mx31smartbot peripherals\n");
114
115	mxc_iomux_setup_multiple_pins(smartbot_pins, ARRAY_SIZE(smartbot_pins),
116		"smartbot");
117
118	imx31_add_imx_uart1(&uart_pdata);
119
120	switch (board) {
121	case MX31SMARTBOT:
122		imx31_add_fsl_usb2_udc(&usb_pdata);
123		break;
124	case MX31EYEBOT:
125		smartbot_otg_host_init();
126		break;
127	default:
128		printk(KERN_WARNING "Unknown board %d, USB OTG not initialized",
129			board);
130	}
131
132	smartbot_resets_init();
 
 
 
133}
v3.15
  1/*
  2 * Copyright (C) 2009 Valentin Longchamp, EPFL Mobots group
  3 *
  4 * This program is free software; you can redistribute it and/or modify
  5 * it under the terms of the GNU General Public License as published by
  6 * the Free Software Foundation; either version 2 of the License, or
  7 * (at your option) any later version.
  8 *
  9 * This program is distributed in the hope that it will be useful,
 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 12 * GNU General Public License for more details.
 13 */
 14
 15#include <linux/delay.h>
 16#include <linux/gpio.h>
 17#include <linux/init.h>
 18#include <linux/interrupt.h>
 19#include <linux/i2c.h>
 20#include <linux/platform_device.h>
 21#include <linux/types.h>
 22
 23#include <linux/usb/otg.h>
 24#include <linux/usb/ulpi.h>
 25
 26#include <media/soc_camera.h>
 27
 28#include "board-mx31moboard.h"
 29#include "common.h"
 30#include "devices-imx31.h"
 
 31#include "hardware.h"
 32#include "iomux-mx3.h"
 33#include "ulpi.h"
 34
 35static unsigned int smartbot_pins[] = {
 36	/* UART1 */
 37	MX31_PIN_CTS2__CTS2, MX31_PIN_RTS2__RTS2,
 38	MX31_PIN_TXD2__TXD2, MX31_PIN_RXD2__RXD2,
 39	/* CSI */
 40	MX31_PIN_CSI_D4__CSI_D4, MX31_PIN_CSI_D5__CSI_D5,
 41	MX31_PIN_CSI_D6__CSI_D6, MX31_PIN_CSI_D7__CSI_D7,
 42	MX31_PIN_CSI_D8__CSI_D8, MX31_PIN_CSI_D9__CSI_D9,
 43	MX31_PIN_CSI_D10__CSI_D10, MX31_PIN_CSI_D11__CSI_D11,
 44	MX31_PIN_CSI_D12__CSI_D12, MX31_PIN_CSI_D13__CSI_D13,
 45	MX31_PIN_CSI_D14__CSI_D14, MX31_PIN_CSI_D15__CSI_D15,
 46	MX31_PIN_CSI_HSYNC__CSI_HSYNC, MX31_PIN_CSI_MCLK__CSI_MCLK,
 47	MX31_PIN_CSI_PIXCLK__CSI_PIXCLK, MX31_PIN_CSI_VSYNC__CSI_VSYNC,
 48	MX31_PIN_GPIO3_0__GPIO3_0, MX31_PIN_GPIO3_1__GPIO3_1,
 49	/* ENABLES */
 50	MX31_PIN_DTR_DCE1__GPIO2_8, MX31_PIN_DSR_DCE1__GPIO2_9,
 51	MX31_PIN_RI_DCE1__GPIO2_10, MX31_PIN_DCD_DCE1__GPIO2_11,
 52};
 53
 54static const struct imxuart_platform_data uart_pdata __initconst = {
 55	.flags = IMXUART_HAVE_RTSCTS,
 56};
 57
 58#define CAM_POWER	IOMUX_TO_GPIO(MX31_PIN_GPIO3_1)
 59#define CAM_RST_B	IOMUX_TO_GPIO(MX31_PIN_GPIO3_0)
 60
 61static int smartbot_cam_power(struct device *dev, int on)
 62{
 63	gpio_set_value(CAM_POWER, !on);
 64	return 0;
 65}
 66
 67static int smartbot_cam_reset(struct device *dev)
 68{
 69	gpio_set_value(CAM_RST_B, 0);
 70	udelay(100);
 71	gpio_set_value(CAM_RST_B, 1);
 72	return 0;
 73}
 74
 75static struct i2c_board_info smartbot_i2c_devices[] = {
 76	{
 77		I2C_BOARD_INFO("mt9t031", 0x5d),
 78	},
 79};
 80
 81static struct soc_camera_link base_iclink = {
 82	.bus_id		= 0,		/* Must match with the camera ID */
 83	.power		= smartbot_cam_power,
 84	.reset		= smartbot_cam_reset,
 85	.board_info	= &smartbot_i2c_devices[0],
 86	.i2c_adapter_id	= 0,
 87};
 88
 89static struct platform_device smartbot_camera[] = {
 90	{
 91		.name	= "soc-camera-pdrv",
 92		.id	= 0,
 93		.dev	= {
 94			.platform_data = &base_iclink,
 95		},
 96	},
 97};
 98
 99static struct platform_device *smartbot_cameras[] __initdata = {
100	&smartbot_camera[0],
101};
102
103static int __init smartbot_cam_init(void)
104{
105	int ret = gpio_request(CAM_RST_B, "cam-reset");
106	if (ret)
107		return ret;
108	gpio_direction_output(CAM_RST_B, 1);
109	ret = gpio_request(CAM_POWER, "cam-standby");
110	if (ret)
111		return ret;
112	gpio_direction_output(CAM_POWER, 0);
113
114	return 0;
115}
116
117static const struct fsl_usb2_platform_data usb_pdata __initconst = {
118	.operating_mode	= FSL_USB2_DR_DEVICE,
119	.phy_mode	= FSL_USB2_PHY_ULPI,
120};
121
122#if defined(CONFIG_USB_ULPI)
123
124static int smartbot_otg_init(struct platform_device *pdev)
125{
126	return mx31_initialize_usb_hw(pdev->id, MXC_EHCI_POWER_PINS_ENABLED);
127}
128
129static struct mxc_usbh_platform_data otg_host_pdata __initdata = {
130	.init	= smartbot_otg_init,
131	.portsc = MXC_EHCI_MODE_ULPI | MXC_EHCI_UTMI_8BIT,
132};
133
134static int __init smartbot_otg_host_init(void)
135{
136	struct platform_device *pdev;
137
138	otg_host_pdata.otg = imx_otg_ulpi_create(ULPI_OTG_DRVVBUS |
139		ULPI_OTG_DRVVBUS_EXT);
140	if (!otg_host_pdata.otg)
141		return -ENODEV;
142
143	pdev = imx31_add_mxc_ehci_otg(&otg_host_pdata);
144	if (IS_ERR(pdev))
145		return PTR_ERR(pdev);
146
147	return 0;
148}
149#else
150static inline int smartbot_otg_host_init(void) { return 0; }
151#endif
152
153#define POWER_EN IOMUX_TO_GPIO(MX31_PIN_DTR_DCE1)
154#define DSPIC_RST_B IOMUX_TO_GPIO(MX31_PIN_DSR_DCE1)
155#define TRSLAT_RST_B IOMUX_TO_GPIO(MX31_PIN_RI_DCE1)
156#define TRSLAT_SRC_CHOICE IOMUX_TO_GPIO(MX31_PIN_DCD_DCE1)
157
158static void smartbot_resets_init(void)
159{
160	if (!gpio_request(POWER_EN, "power-enable")) {
161		gpio_direction_output(POWER_EN, 0);
162		gpio_export(POWER_EN, false);
163	}
164
165	if (!gpio_request(DSPIC_RST_B, "dspic-rst")) {
166		gpio_direction_output(DSPIC_RST_B, 0);
167		gpio_export(DSPIC_RST_B, false);
168	}
169
170	if (!gpio_request(TRSLAT_RST_B, "translator-rst")) {
171		gpio_direction_output(TRSLAT_RST_B, 0);
172		gpio_export(TRSLAT_RST_B, false);
173	}
174
175	if (!gpio_request(TRSLAT_SRC_CHOICE, "translator-src-choice")) {
176		gpio_direction_output(TRSLAT_SRC_CHOICE, 0);
177		gpio_export(TRSLAT_SRC_CHOICE, false);
178	}
179}
180/*
181 * system init for baseboard usage. Will be called by mx31moboard init.
182 */
183void __init mx31moboard_smartbot_init(int board)
184{
185	printk(KERN_INFO "Initializing mx31smartbot peripherals\n");
186
187	mxc_iomux_setup_multiple_pins(smartbot_pins, ARRAY_SIZE(smartbot_pins),
188		"smartbot");
189
190	imx31_add_imx_uart1(&uart_pdata);
191
192	switch (board) {
193	case MX31SMARTBOT:
194		imx31_add_fsl_usb2_udc(&usb_pdata);
195		break;
196	case MX31EYEBOT:
197		smartbot_otg_host_init();
198		break;
199	default:
200		printk(KERN_WARNING "Unknown board %d, USB OTG not initialized",
201			board);
202	}
203
204	smartbot_resets_init();
205
206	smartbot_cam_init();
207	platform_add_devices(smartbot_cameras, ARRAY_SIZE(smartbot_cameras));
208}