Linux Audio

Check our new training course

Loading...
Note: File does not exist in v6.13.7.
  1// SPDX-License-Identifier: GPL-2.0-only
  2/*
  3 *  linux/arch/arm/mach-mmp/ttc_dkb.c
  4 *
  5 *  Support for the Marvell PXA910-based TTC_DKB Development Platform.
  6 */
  7
  8#include <linux/init.h>
  9#include <linux/kernel.h>
 10#include <linux/platform_device.h>
 11#include <linux/mtd/mtd.h>
 12#include <linux/mtd/partitions.h>
 13#include <linux/mtd/onenand.h>
 14#include <linux/interrupt.h>
 15#include <linux/platform_data/pca953x.h>
 16#include <linux/gpio.h>
 17#include <linux/gpio-pxa.h>
 18#include <linux/mfd/88pm860x.h>
 19#include <linux/platform_data/mv_usb.h>
 20#include <linux/spi/spi.h>
 21#include <linux/delay.h>
 22
 23#include <asm/mach-types.h>
 24#include <asm/mach/arch.h>
 25#include <asm/mach/flash.h>
 26#include "addr-map.h"
 27#include "mfp-pxa910.h"
 28#include "pxa910.h"
 29#include "irqs.h"
 30#include "regs-usb.h"
 31
 32#include "common.h"
 33
 34#define TTCDKB_GPIO_EXT0(x)	(MMP_NR_BUILTIN_GPIO + ((x < 0) ? 0 :	\
 35				((x < 16) ? x : 15)))
 36#define TTCDKB_GPIO_EXT1(x)	(MMP_NR_BUILTIN_GPIO + 16 + ((x < 0) ? 0 : \
 37				((x < 16) ? x : 15)))
 38
 39/*
 40 * 16 board interrupts -- MAX7312 GPIO expander
 41 * 16 board interrupts -- PCA9575 GPIO expander
 42 * 24 board interrupts -- 88PM860x PMIC
 43 */
 44#define TTCDKB_NR_IRQS		(MMP_NR_IRQS + 16 + 16 + 24)
 45
 46static unsigned long ttc_dkb_pin_config[] __initdata = {
 47	/* UART2 */
 48	GPIO47_UART2_RXD,
 49	GPIO48_UART2_TXD,
 50
 51	/* DFI */
 52	DF_IO0_ND_IO0,
 53	DF_IO1_ND_IO1,
 54	DF_IO2_ND_IO2,
 55	DF_IO3_ND_IO3,
 56	DF_IO4_ND_IO4,
 57	DF_IO5_ND_IO5,
 58	DF_IO6_ND_IO6,
 59	DF_IO7_ND_IO7,
 60	DF_IO8_ND_IO8,
 61	DF_IO9_ND_IO9,
 62	DF_IO10_ND_IO10,
 63	DF_IO11_ND_IO11,
 64	DF_IO12_ND_IO12,
 65	DF_IO13_ND_IO13,
 66	DF_IO14_ND_IO14,
 67	DF_IO15_ND_IO15,
 68	DF_nCS0_SM_nCS2_nCS0,
 69	DF_ALE_SM_WEn_ND_ALE,
 70	DF_CLE_SM_OEn_ND_CLE,
 71	DF_WEn_DF_WEn,
 72	DF_REn_DF_REn,
 73	DF_RDY0_DF_RDY0,
 74};
 75
 76static struct pxa_gpio_platform_data pxa910_gpio_pdata = {
 77	.irq_base	= MMP_GPIO_TO_IRQ(0),
 78};
 79
 80static struct mtd_partition ttc_dkb_onenand_partitions[] = {
 81	{
 82		.name		= "bootloader",
 83		.offset		= 0,
 84		.size		= SZ_1M,
 85		.mask_flags	= MTD_WRITEABLE,
 86	}, {
 87		.name		= "reserved",
 88		.offset		= MTDPART_OFS_APPEND,
 89		.size		= SZ_128K,
 90		.mask_flags	= MTD_WRITEABLE,
 91	}, {
 92		.name		= "reserved",
 93		.offset		= MTDPART_OFS_APPEND,
 94		.size		= SZ_8M,
 95		.mask_flags	= MTD_WRITEABLE,
 96	}, {
 97		.name		= "kernel",
 98		.offset		= MTDPART_OFS_APPEND,
 99		.size		= (SZ_2M + SZ_1M),
100		.mask_flags	= 0,
101	}, {
102		.name		= "filesystem",
103		.offset		= MTDPART_OFS_APPEND,
104		.size		= SZ_32M + SZ_16M,
105		.mask_flags	= 0,
106	}
107};
108
109static struct onenand_platform_data ttc_dkb_onenand_info = {
110	.parts		= ttc_dkb_onenand_partitions,
111	.nr_parts	= ARRAY_SIZE(ttc_dkb_onenand_partitions),
112};
113
114static struct resource ttc_dkb_resource_onenand[] = {
115	[0] = {
116		.start	= SMC_CS0_PHYS_BASE,
117		.end	= SMC_CS0_PHYS_BASE + SZ_1M,
118		.flags	= IORESOURCE_MEM,
119	},
120};
121
122static struct platform_device ttc_dkb_device_onenand = {
123	.name		= "onenand-flash",
124	.id		= -1,
125	.resource	= ttc_dkb_resource_onenand,
126	.num_resources	= ARRAY_SIZE(ttc_dkb_resource_onenand),
127	.dev		= {
128		.platform_data	= &ttc_dkb_onenand_info,
129	},
130};
131
132static struct platform_device *ttc_dkb_devices[] = {
133	&pxa910_device_gpio,
134	&pxa910_device_rtc,
135	&ttc_dkb_device_onenand,
136};
137
138static struct pca953x_platform_data max7312_data[] = {
139	{
140		.gpio_base	= TTCDKB_GPIO_EXT0(0),
141		.irq_base	= MMP_NR_IRQS,
142	},
143};
144
145static struct pm860x_platform_data ttc_dkb_pm8607_info = {
146	.irq_base       = IRQ_BOARD_START,
147};
148
149static struct i2c_board_info ttc_dkb_i2c_info[] = {
150	{
151		.type           = "88PM860x",
152		.addr           = 0x34,
153		.platform_data  = &ttc_dkb_pm8607_info,
154		.irq            = IRQ_PXA910_PMIC_INT,
155	},
156	{
157		.type		= "max7312",
158		.addr		= 0x23,
159		.irq		= MMP_GPIO_TO_IRQ(80),
160		.platform_data	= &max7312_data,
161	},
162};
163
164#if IS_ENABLED(CONFIG_USB_SUPPORT)
165#if IS_ENABLED(CONFIG_USB_MV_UDC) || IS_ENABLED(CONFIG_USB_EHCI_MV_U2O)
166
167static struct mv_usb_platform_data ttc_usb_pdata = {
168	.vbus		= NULL,
169	.mode		= MV_USB_MODE_OTG,
170	.otg_force_a_bus_req = 1,
171	.phy_init	= pxa_usb_phy_init,
172	.phy_deinit	= pxa_usb_phy_deinit,
173	.set_vbus	= NULL,
174};
175#endif
176#endif
177
178#if IS_ENABLED(CONFIG_MTD_NAND_MARVELL)
179static struct pxa3xx_nand_platform_data dkb_nand_info = {};
180#endif
181
182#if IS_ENABLED(CONFIG_MMP_DISP)
183/* path config */
184#define CFG_IOPADMODE(iopad)   (iopad)  /* 0x0 ~ 0xd */
185#define SCLK_SOURCE_SELECT(x)  (x << 30) /* 0x0 ~ 0x3 */
186/* link config */
187#define CFG_DUMBMODE(mode)     (mode << 28) /* 0x0 ~ 0x6*/
188static struct mmp_mach_path_config dkb_disp_config[] = {
189	[0] = {
190		.name = "mmp-parallel",
191		.overlay_num = 2,
192		.output_type = PATH_OUT_PARALLEL,
193		.path_config = CFG_IOPADMODE(0x1)
194			| SCLK_SOURCE_SELECT(0x1),
195		.link_config = CFG_DUMBMODE(0x2),
196	},
197};
198
199static struct mmp_mach_plat_info dkb_disp_info = {
200	.name = "mmp-disp",
201	.clk_name = "disp0",
202	.path_num = 1,
203	.paths = dkb_disp_config,
204};
205
206static struct mmp_buffer_driver_mach_info dkb_fb_info = {
207	.name = "mmp-fb",
208	.path_name = "mmp-parallel",
209	.overlay_id = 0,
210	.dmafetch_id = 1,
211	.default_pixfmt = PIXFMT_RGB565,
212};
213
214static void dkb_tpo_panel_power(int on)
215{
216	int err;
217	u32 spi_reset = mfp_to_gpio(MFP_PIN_GPIO106);
218
219	if (on) {
220		err = gpio_request(spi_reset, "TPO_LCD_SPI_RESET");
221		if (err) {
222			pr_err("failed to request GPIO for TPO LCD RESET\n");
223			return;
224		}
225		gpio_direction_output(spi_reset, 0);
226		udelay(100);
227		gpio_set_value(spi_reset, 1);
228		gpio_free(spi_reset);
229	} else {
230		err = gpio_request(spi_reset, "TPO_LCD_SPI_RESET");
231		if (err) {
232			pr_err("failed to request LCD RESET gpio\n");
233			return;
234		}
235		gpio_set_value(spi_reset, 0);
236		gpio_free(spi_reset);
237	}
238}
239
240static struct mmp_mach_panel_info dkb_tpo_panel_info = {
241	.name = "tpo-hvga",
242	.plat_path_name = "mmp-parallel",
243	.plat_set_onoff = dkb_tpo_panel_power,
244};
245
246static struct spi_board_info spi_board_info[] __initdata = {
247	{
248		.modalias       = "tpo-hvga",
249		.platform_data  = &dkb_tpo_panel_info,
250		.bus_num        = 5,
251	}
252};
253
254static void __init add_disp(void)
255{
256	pxa_register_device(&pxa910_device_disp,
257		&dkb_disp_info, sizeof(dkb_disp_info));
258	spi_register_board_info(spi_board_info, ARRAY_SIZE(spi_board_info));
259	pxa_register_device(&pxa910_device_fb,
260		&dkb_fb_info, sizeof(dkb_fb_info));
261	pxa_register_device(&pxa910_device_panel,
262		&dkb_tpo_panel_info, sizeof(dkb_tpo_panel_info));
263}
264#endif
265
266static void __init ttc_dkb_init(void)
267{
268	mfp_config(ARRAY_AND_SIZE(ttc_dkb_pin_config));
269
270	/* on-chip devices */
271	pxa910_add_uart(1);
272#if IS_ENABLED(CONFIG_MTD_NAND_MARVELL)
273	pxa910_add_nand(&dkb_nand_info);
274#endif
275
276	/* off-chip devices */
277	pxa910_add_twsi(0, NULL, ARRAY_AND_SIZE(ttc_dkb_i2c_info));
278	platform_device_add_data(&pxa910_device_gpio, &pxa910_gpio_pdata,
279				 sizeof(struct pxa_gpio_platform_data));
280	platform_add_devices(ARRAY_AND_SIZE(ttc_dkb_devices));
281
282#if IS_ENABLED(CONFIG_USB_SUPPORT)
283#if IS_ENABLED(CONFIG_PHY_PXA_USB)
284	platform_device_register(&pxa168_device_usb_phy);
285#endif
286
287#if IS_ENABLED(CONFIG_USB_MV_UDC)
288	pxa168_device_u2o.dev.platform_data = &ttc_usb_pdata;
289	platform_device_register(&pxa168_device_u2o);
290#endif
291
292#if IS_ENABLED(CONFIG_USB_EHCI_MV_U2O)
293	pxa168_device_u2oehci.dev.platform_data = &ttc_usb_pdata;
294	platform_device_register(&pxa168_device_u2oehci);
295#endif
296
297#if IS_ENABLED(CONFIG_USB_MV_OTG)
298	pxa168_device_u2ootg.dev.platform_data = &ttc_usb_pdata;
299	platform_device_register(&pxa168_device_u2ootg);
300#endif
301#endif
302
303#if IS_ENABLED(CONFIG_MMP_DISP)
304	add_disp();
305#endif
306}
307
308MACHINE_START(TTC_DKB, "PXA910-based TTC_DKB Development Platform")
309	.map_io		= mmp_map_io,
310	.nr_irqs	= TTCDKB_NR_IRQS,
311	.init_irq       = pxa910_init_irq,
312	.init_time	= pxa910_timer_init,
313	.init_machine   = ttc_dkb_init,
314	.restart	= mmp_restart,
315MACHINE_END