18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * DBAu1300 init and platform device setup. 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * (c) 2009 Manuel Lauss <manuel.lauss@googlemail.com> 68c2ecf20Sopenharmony_ci */ 78c2ecf20Sopenharmony_ci 88c2ecf20Sopenharmony_ci#include <linux/clk.h> 98c2ecf20Sopenharmony_ci#include <linux/dma-mapping.h> 108c2ecf20Sopenharmony_ci#include <linux/gpio.h> 118c2ecf20Sopenharmony_ci#include <linux/gpio_keys.h> 128c2ecf20Sopenharmony_ci#include <linux/init.h> 138c2ecf20Sopenharmony_ci#include <linux/input.h> /* KEY_* codes */ 148c2ecf20Sopenharmony_ci#include <linux/i2c.h> 158c2ecf20Sopenharmony_ci#include <linux/io.h> 168c2ecf20Sopenharmony_ci#include <linux/leds.h> 178c2ecf20Sopenharmony_ci#include <linux/interrupt.h> 188c2ecf20Sopenharmony_ci#include <linux/ata_platform.h> 198c2ecf20Sopenharmony_ci#include <linux/mmc/host.h> 208c2ecf20Sopenharmony_ci#include <linux/mtd/mtd.h> 218c2ecf20Sopenharmony_ci#include <linux/mtd/platnand.h> 228c2ecf20Sopenharmony_ci#include <linux/platform_device.h> 238c2ecf20Sopenharmony_ci#include <linux/smsc911x.h> 248c2ecf20Sopenharmony_ci#include <linux/wm97xx.h> 258c2ecf20Sopenharmony_ci 268c2ecf20Sopenharmony_ci#include <asm/mach-au1x00/au1000.h> 278c2ecf20Sopenharmony_ci#include <asm/mach-au1x00/gpio-au1300.h> 288c2ecf20Sopenharmony_ci#include <asm/mach-au1x00/au1100_mmc.h> 298c2ecf20Sopenharmony_ci#include <asm/mach-au1x00/au1200fb.h> 308c2ecf20Sopenharmony_ci#include <asm/mach-au1x00/au1xxx_dbdma.h> 318c2ecf20Sopenharmony_ci#include <asm/mach-au1x00/au1xxx_psc.h> 328c2ecf20Sopenharmony_ci#include <asm/mach-db1x00/bcsr.h> 338c2ecf20Sopenharmony_ci#include <asm/mach-au1x00/prom.h> 348c2ecf20Sopenharmony_ci 358c2ecf20Sopenharmony_ci#include "platform.h" 368c2ecf20Sopenharmony_ci 378c2ecf20Sopenharmony_ci/* FPGA (external mux) interrupt sources */ 388c2ecf20Sopenharmony_ci#define DB1300_FIRST_INT (ALCHEMY_GPIC_INT_LAST + 1) 398c2ecf20Sopenharmony_ci#define DB1300_IDE_INT (DB1300_FIRST_INT + 0) 408c2ecf20Sopenharmony_ci#define DB1300_ETH_INT (DB1300_FIRST_INT + 1) 418c2ecf20Sopenharmony_ci#define DB1300_CF_INT (DB1300_FIRST_INT + 2) 428c2ecf20Sopenharmony_ci#define DB1300_VIDEO_INT (DB1300_FIRST_INT + 4) 438c2ecf20Sopenharmony_ci#define DB1300_HDMI_INT (DB1300_FIRST_INT + 5) 448c2ecf20Sopenharmony_ci#define DB1300_DC_INT (DB1300_FIRST_INT + 6) 458c2ecf20Sopenharmony_ci#define DB1300_FLASH_INT (DB1300_FIRST_INT + 7) 468c2ecf20Sopenharmony_ci#define DB1300_CF_INSERT_INT (DB1300_FIRST_INT + 8) 478c2ecf20Sopenharmony_ci#define DB1300_CF_EJECT_INT (DB1300_FIRST_INT + 9) 488c2ecf20Sopenharmony_ci#define DB1300_AC97_INT (DB1300_FIRST_INT + 10) 498c2ecf20Sopenharmony_ci#define DB1300_AC97_PEN_INT (DB1300_FIRST_INT + 11) 508c2ecf20Sopenharmony_ci#define DB1300_SD1_INSERT_INT (DB1300_FIRST_INT + 12) 518c2ecf20Sopenharmony_ci#define DB1300_SD1_EJECT_INT (DB1300_FIRST_INT + 13) 528c2ecf20Sopenharmony_ci#define DB1300_OTG_VBUS_OC_INT (DB1300_FIRST_INT + 14) 538c2ecf20Sopenharmony_ci#define DB1300_HOST_VBUS_OC_INT (DB1300_FIRST_INT + 15) 548c2ecf20Sopenharmony_ci#define DB1300_LAST_INT (DB1300_FIRST_INT + 15) 558c2ecf20Sopenharmony_ci 568c2ecf20Sopenharmony_ci/* SMSC9210 CS */ 578c2ecf20Sopenharmony_ci#define DB1300_ETH_PHYS_ADDR 0x19000000 588c2ecf20Sopenharmony_ci#define DB1300_ETH_PHYS_END 0x197fffff 598c2ecf20Sopenharmony_ci 608c2ecf20Sopenharmony_ci/* ATA CS */ 618c2ecf20Sopenharmony_ci#define DB1300_IDE_PHYS_ADDR 0x18800000 628c2ecf20Sopenharmony_ci#define DB1300_IDE_REG_SHIFT 5 638c2ecf20Sopenharmony_ci#define DB1300_IDE_PHYS_LEN (16 << DB1300_IDE_REG_SHIFT) 648c2ecf20Sopenharmony_ci 658c2ecf20Sopenharmony_ci/* NAND CS */ 668c2ecf20Sopenharmony_ci#define DB1300_NAND_PHYS_ADDR 0x20000000 678c2ecf20Sopenharmony_ci#define DB1300_NAND_PHYS_END 0x20000fff 688c2ecf20Sopenharmony_ci 698c2ecf20Sopenharmony_ci 708c2ecf20Sopenharmony_cistatic struct i2c_board_info db1300_i2c_devs[] __initdata = { 718c2ecf20Sopenharmony_ci { I2C_BOARD_INFO("wm8731", 0x1b), }, /* I2S audio codec */ 728c2ecf20Sopenharmony_ci { I2C_BOARD_INFO("ne1619", 0x2d), }, /* adm1025-compat hwmon */ 738c2ecf20Sopenharmony_ci}; 748c2ecf20Sopenharmony_ci 758c2ecf20Sopenharmony_ci/* multifunction pins to assign to GPIO controller */ 768c2ecf20Sopenharmony_cistatic int db1300_gpio_pins[] __initdata = { 778c2ecf20Sopenharmony_ci AU1300_PIN_LCDPWM0, AU1300_PIN_PSC2SYNC1, AU1300_PIN_WAKE1, 788c2ecf20Sopenharmony_ci AU1300_PIN_WAKE2, AU1300_PIN_WAKE3, AU1300_PIN_FG3AUX, 798c2ecf20Sopenharmony_ci AU1300_PIN_EXTCLK1, 808c2ecf20Sopenharmony_ci -1, /* terminator */ 818c2ecf20Sopenharmony_ci}; 828c2ecf20Sopenharmony_ci 838c2ecf20Sopenharmony_ci/* multifunction pins to assign to device functions */ 848c2ecf20Sopenharmony_cistatic int db1300_dev_pins[] __initdata = { 858c2ecf20Sopenharmony_ci /* wake-from-str pins 0-3 */ 868c2ecf20Sopenharmony_ci AU1300_PIN_WAKE0, 878c2ecf20Sopenharmony_ci /* external clock sources for PSC0 */ 888c2ecf20Sopenharmony_ci AU1300_PIN_EXTCLK0, 898c2ecf20Sopenharmony_ci /* 8bit MMC interface on SD0: 6-9 */ 908c2ecf20Sopenharmony_ci AU1300_PIN_SD0DAT4, AU1300_PIN_SD0DAT5, AU1300_PIN_SD0DAT6, 918c2ecf20Sopenharmony_ci AU1300_PIN_SD0DAT7, 928c2ecf20Sopenharmony_ci /* UART1 pins: 11-18 */ 938c2ecf20Sopenharmony_ci AU1300_PIN_U1RI, AU1300_PIN_U1DCD, AU1300_PIN_U1DSR, 948c2ecf20Sopenharmony_ci AU1300_PIN_U1CTS, AU1300_PIN_U1RTS, AU1300_PIN_U1DTR, 958c2ecf20Sopenharmony_ci AU1300_PIN_U1RX, AU1300_PIN_U1TX, 968c2ecf20Sopenharmony_ci /* UART0 pins: 19-24 */ 978c2ecf20Sopenharmony_ci AU1300_PIN_U0RI, AU1300_PIN_U0DCD, AU1300_PIN_U0DSR, 988c2ecf20Sopenharmony_ci AU1300_PIN_U0CTS, AU1300_PIN_U0RTS, AU1300_PIN_U0DTR, 998c2ecf20Sopenharmony_ci /* UART2: 25-26 */ 1008c2ecf20Sopenharmony_ci AU1300_PIN_U2RX, AU1300_PIN_U2TX, 1018c2ecf20Sopenharmony_ci /* UART3: 27-28 */ 1028c2ecf20Sopenharmony_ci AU1300_PIN_U3RX, AU1300_PIN_U3TX, 1038c2ecf20Sopenharmony_ci /* LCD controller PWMs, ext pixclock: 30-31 */ 1048c2ecf20Sopenharmony_ci AU1300_PIN_LCDPWM1, AU1300_PIN_LCDCLKIN, 1058c2ecf20Sopenharmony_ci /* SD1 interface: 32-37 */ 1068c2ecf20Sopenharmony_ci AU1300_PIN_SD1DAT0, AU1300_PIN_SD1DAT1, AU1300_PIN_SD1DAT2, 1078c2ecf20Sopenharmony_ci AU1300_PIN_SD1DAT3, AU1300_PIN_SD1CMD, AU1300_PIN_SD1CLK, 1088c2ecf20Sopenharmony_ci /* SD2 interface: 38-43 */ 1098c2ecf20Sopenharmony_ci AU1300_PIN_SD2DAT0, AU1300_PIN_SD2DAT1, AU1300_PIN_SD2DAT2, 1108c2ecf20Sopenharmony_ci AU1300_PIN_SD2DAT3, AU1300_PIN_SD2CMD, AU1300_PIN_SD2CLK, 1118c2ecf20Sopenharmony_ci /* PSC0/1 clocks: 44-45 */ 1128c2ecf20Sopenharmony_ci AU1300_PIN_PSC0CLK, AU1300_PIN_PSC1CLK, 1138c2ecf20Sopenharmony_ci /* PSCs: 46-49/50-53/54-57/58-61 */ 1148c2ecf20Sopenharmony_ci AU1300_PIN_PSC0SYNC0, AU1300_PIN_PSC0SYNC1, AU1300_PIN_PSC0D0, 1158c2ecf20Sopenharmony_ci AU1300_PIN_PSC0D1, 1168c2ecf20Sopenharmony_ci AU1300_PIN_PSC1SYNC0, AU1300_PIN_PSC1SYNC1, AU1300_PIN_PSC1D0, 1178c2ecf20Sopenharmony_ci AU1300_PIN_PSC1D1, 1188c2ecf20Sopenharmony_ci AU1300_PIN_PSC2SYNC0, AU1300_PIN_PSC2D0, 1198c2ecf20Sopenharmony_ci AU1300_PIN_PSC2D1, 1208c2ecf20Sopenharmony_ci AU1300_PIN_PSC3SYNC0, AU1300_PIN_PSC3SYNC1, AU1300_PIN_PSC3D0, 1218c2ecf20Sopenharmony_ci AU1300_PIN_PSC3D1, 1228c2ecf20Sopenharmony_ci /* PCMCIA interface: 62-70 */ 1238c2ecf20Sopenharmony_ci AU1300_PIN_PCE2, AU1300_PIN_PCE1, AU1300_PIN_PIOS16, 1248c2ecf20Sopenharmony_ci AU1300_PIN_PIOR, AU1300_PIN_PWE, AU1300_PIN_PWAIT, 1258c2ecf20Sopenharmony_ci AU1300_PIN_PREG, AU1300_PIN_POE, AU1300_PIN_PIOW, 1268c2ecf20Sopenharmony_ci /* camera interface H/V sync inputs: 71-72 */ 1278c2ecf20Sopenharmony_ci AU1300_PIN_CIMLS, AU1300_PIN_CIMFS, 1288c2ecf20Sopenharmony_ci /* PSC2/3 clocks: 73-74 */ 1298c2ecf20Sopenharmony_ci AU1300_PIN_PSC2CLK, AU1300_PIN_PSC3CLK, 1308c2ecf20Sopenharmony_ci -1, /* terminator */ 1318c2ecf20Sopenharmony_ci}; 1328c2ecf20Sopenharmony_ci 1338c2ecf20Sopenharmony_cistatic void __init db1300_gpio_config(void) 1348c2ecf20Sopenharmony_ci{ 1358c2ecf20Sopenharmony_ci int *i; 1368c2ecf20Sopenharmony_ci 1378c2ecf20Sopenharmony_ci i = &db1300_dev_pins[0]; 1388c2ecf20Sopenharmony_ci while (*i != -1) 1398c2ecf20Sopenharmony_ci au1300_pinfunc_to_dev(*i++); 1408c2ecf20Sopenharmony_ci 1418c2ecf20Sopenharmony_ci i = &db1300_gpio_pins[0]; 1428c2ecf20Sopenharmony_ci while (*i != -1) 1438c2ecf20Sopenharmony_ci au1300_gpio_direction_input(*i++);/* implies pin_to_gpio */ 1448c2ecf20Sopenharmony_ci 1458c2ecf20Sopenharmony_ci au1300_set_dbdma_gpio(1, AU1300_PIN_FG3AUX); 1468c2ecf20Sopenharmony_ci} 1478c2ecf20Sopenharmony_ci 1488c2ecf20Sopenharmony_ci/**********************************************************************/ 1498c2ecf20Sopenharmony_ci 1508c2ecf20Sopenharmony_cistatic u64 au1300_all_dmamask = DMA_BIT_MASK(32); 1518c2ecf20Sopenharmony_ci 1528c2ecf20Sopenharmony_cistatic void au1300_nand_cmd_ctrl(struct nand_chip *this, int cmd, 1538c2ecf20Sopenharmony_ci unsigned int ctrl) 1548c2ecf20Sopenharmony_ci{ 1558c2ecf20Sopenharmony_ci unsigned long ioaddr = (unsigned long)this->legacy.IO_ADDR_W; 1568c2ecf20Sopenharmony_ci 1578c2ecf20Sopenharmony_ci ioaddr &= 0xffffff00; 1588c2ecf20Sopenharmony_ci 1598c2ecf20Sopenharmony_ci if (ctrl & NAND_CLE) { 1608c2ecf20Sopenharmony_ci ioaddr += MEM_STNAND_CMD; 1618c2ecf20Sopenharmony_ci } else if (ctrl & NAND_ALE) { 1628c2ecf20Sopenharmony_ci ioaddr += MEM_STNAND_ADDR; 1638c2ecf20Sopenharmony_ci } else { 1648c2ecf20Sopenharmony_ci /* assume we want to r/w real data by default */ 1658c2ecf20Sopenharmony_ci ioaddr += MEM_STNAND_DATA; 1668c2ecf20Sopenharmony_ci } 1678c2ecf20Sopenharmony_ci this->legacy.IO_ADDR_R = this->legacy.IO_ADDR_W = (void __iomem *)ioaddr; 1688c2ecf20Sopenharmony_ci if (cmd != NAND_CMD_NONE) { 1698c2ecf20Sopenharmony_ci __raw_writeb(cmd, this->legacy.IO_ADDR_W); 1708c2ecf20Sopenharmony_ci wmb(); 1718c2ecf20Sopenharmony_ci } 1728c2ecf20Sopenharmony_ci} 1738c2ecf20Sopenharmony_ci 1748c2ecf20Sopenharmony_cistatic int au1300_nand_device_ready(struct nand_chip *this) 1758c2ecf20Sopenharmony_ci{ 1768c2ecf20Sopenharmony_ci return alchemy_rdsmem(AU1000_MEM_STSTAT) & 1; 1778c2ecf20Sopenharmony_ci} 1788c2ecf20Sopenharmony_ci 1798c2ecf20Sopenharmony_cistatic struct mtd_partition db1300_nand_parts[] = { 1808c2ecf20Sopenharmony_ci { 1818c2ecf20Sopenharmony_ci .name = "NAND FS 0", 1828c2ecf20Sopenharmony_ci .offset = 0, 1838c2ecf20Sopenharmony_ci .size = 8 * 1024 * 1024, 1848c2ecf20Sopenharmony_ci }, 1858c2ecf20Sopenharmony_ci { 1868c2ecf20Sopenharmony_ci .name = "NAND FS 1", 1878c2ecf20Sopenharmony_ci .offset = MTDPART_OFS_APPEND, 1888c2ecf20Sopenharmony_ci .size = MTDPART_SIZ_FULL 1898c2ecf20Sopenharmony_ci }, 1908c2ecf20Sopenharmony_ci}; 1918c2ecf20Sopenharmony_ci 1928c2ecf20Sopenharmony_cistruct platform_nand_data db1300_nand_platdata = { 1938c2ecf20Sopenharmony_ci .chip = { 1948c2ecf20Sopenharmony_ci .nr_chips = 1, 1958c2ecf20Sopenharmony_ci .chip_offset = 0, 1968c2ecf20Sopenharmony_ci .nr_partitions = ARRAY_SIZE(db1300_nand_parts), 1978c2ecf20Sopenharmony_ci .partitions = db1300_nand_parts, 1988c2ecf20Sopenharmony_ci .chip_delay = 20, 1998c2ecf20Sopenharmony_ci }, 2008c2ecf20Sopenharmony_ci .ctrl = { 2018c2ecf20Sopenharmony_ci .dev_ready = au1300_nand_device_ready, 2028c2ecf20Sopenharmony_ci .cmd_ctrl = au1300_nand_cmd_ctrl, 2038c2ecf20Sopenharmony_ci }, 2048c2ecf20Sopenharmony_ci}; 2058c2ecf20Sopenharmony_ci 2068c2ecf20Sopenharmony_cistatic struct resource db1300_nand_res[] = { 2078c2ecf20Sopenharmony_ci [0] = { 2088c2ecf20Sopenharmony_ci .start = DB1300_NAND_PHYS_ADDR, 2098c2ecf20Sopenharmony_ci .end = DB1300_NAND_PHYS_ADDR + 0xff, 2108c2ecf20Sopenharmony_ci .flags = IORESOURCE_MEM, 2118c2ecf20Sopenharmony_ci }, 2128c2ecf20Sopenharmony_ci}; 2138c2ecf20Sopenharmony_ci 2148c2ecf20Sopenharmony_cistatic struct platform_device db1300_nand_dev = { 2158c2ecf20Sopenharmony_ci .name = "gen_nand", 2168c2ecf20Sopenharmony_ci .num_resources = ARRAY_SIZE(db1300_nand_res), 2178c2ecf20Sopenharmony_ci .resource = db1300_nand_res, 2188c2ecf20Sopenharmony_ci .id = -1, 2198c2ecf20Sopenharmony_ci .dev = { 2208c2ecf20Sopenharmony_ci .platform_data = &db1300_nand_platdata, 2218c2ecf20Sopenharmony_ci } 2228c2ecf20Sopenharmony_ci}; 2238c2ecf20Sopenharmony_ci 2248c2ecf20Sopenharmony_ci/**********************************************************************/ 2258c2ecf20Sopenharmony_ci 2268c2ecf20Sopenharmony_cistatic struct resource db1300_eth_res[] = { 2278c2ecf20Sopenharmony_ci [0] = { 2288c2ecf20Sopenharmony_ci .start = DB1300_ETH_PHYS_ADDR, 2298c2ecf20Sopenharmony_ci .end = DB1300_ETH_PHYS_END, 2308c2ecf20Sopenharmony_ci .flags = IORESOURCE_MEM, 2318c2ecf20Sopenharmony_ci }, 2328c2ecf20Sopenharmony_ci [1] = { 2338c2ecf20Sopenharmony_ci .start = DB1300_ETH_INT, 2348c2ecf20Sopenharmony_ci .end = DB1300_ETH_INT, 2358c2ecf20Sopenharmony_ci .flags = IORESOURCE_IRQ, 2368c2ecf20Sopenharmony_ci }, 2378c2ecf20Sopenharmony_ci}; 2388c2ecf20Sopenharmony_ci 2398c2ecf20Sopenharmony_cistatic struct smsc911x_platform_config db1300_eth_config = { 2408c2ecf20Sopenharmony_ci .phy_interface = PHY_INTERFACE_MODE_MII, 2418c2ecf20Sopenharmony_ci .irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_LOW, 2428c2ecf20Sopenharmony_ci .irq_type = SMSC911X_IRQ_TYPE_PUSH_PULL, 2438c2ecf20Sopenharmony_ci .flags = SMSC911X_USE_32BIT, 2448c2ecf20Sopenharmony_ci}; 2458c2ecf20Sopenharmony_ci 2468c2ecf20Sopenharmony_cistatic struct platform_device db1300_eth_dev = { 2478c2ecf20Sopenharmony_ci .name = "smsc911x", 2488c2ecf20Sopenharmony_ci .id = -1, 2498c2ecf20Sopenharmony_ci .num_resources = ARRAY_SIZE(db1300_eth_res), 2508c2ecf20Sopenharmony_ci .resource = db1300_eth_res, 2518c2ecf20Sopenharmony_ci .dev = { 2528c2ecf20Sopenharmony_ci .platform_data = &db1300_eth_config, 2538c2ecf20Sopenharmony_ci }, 2548c2ecf20Sopenharmony_ci}; 2558c2ecf20Sopenharmony_ci 2568c2ecf20Sopenharmony_ci/**********************************************************************/ 2578c2ecf20Sopenharmony_ci 2588c2ecf20Sopenharmony_cistatic struct resource au1300_psc1_res[] = { 2598c2ecf20Sopenharmony_ci [0] = { 2608c2ecf20Sopenharmony_ci .start = AU1300_PSC1_PHYS_ADDR, 2618c2ecf20Sopenharmony_ci .end = AU1300_PSC1_PHYS_ADDR + 0x0fff, 2628c2ecf20Sopenharmony_ci .flags = IORESOURCE_MEM, 2638c2ecf20Sopenharmony_ci }, 2648c2ecf20Sopenharmony_ci [1] = { 2658c2ecf20Sopenharmony_ci .start = AU1300_PSC1_INT, 2668c2ecf20Sopenharmony_ci .end = AU1300_PSC1_INT, 2678c2ecf20Sopenharmony_ci .flags = IORESOURCE_IRQ, 2688c2ecf20Sopenharmony_ci }, 2698c2ecf20Sopenharmony_ci [2] = { 2708c2ecf20Sopenharmony_ci .start = AU1300_DSCR_CMD0_PSC1_TX, 2718c2ecf20Sopenharmony_ci .end = AU1300_DSCR_CMD0_PSC1_TX, 2728c2ecf20Sopenharmony_ci .flags = IORESOURCE_DMA, 2738c2ecf20Sopenharmony_ci }, 2748c2ecf20Sopenharmony_ci [3] = { 2758c2ecf20Sopenharmony_ci .start = AU1300_DSCR_CMD0_PSC1_RX, 2768c2ecf20Sopenharmony_ci .end = AU1300_DSCR_CMD0_PSC1_RX, 2778c2ecf20Sopenharmony_ci .flags = IORESOURCE_DMA, 2788c2ecf20Sopenharmony_ci }, 2798c2ecf20Sopenharmony_ci}; 2808c2ecf20Sopenharmony_ci 2818c2ecf20Sopenharmony_cistatic struct platform_device db1300_ac97_dev = { 2828c2ecf20Sopenharmony_ci .name = "au1xpsc_ac97", 2838c2ecf20Sopenharmony_ci .id = 1, /* PSC ID. match with AC97 codec ID! */ 2848c2ecf20Sopenharmony_ci .num_resources = ARRAY_SIZE(au1300_psc1_res), 2858c2ecf20Sopenharmony_ci .resource = au1300_psc1_res, 2868c2ecf20Sopenharmony_ci}; 2878c2ecf20Sopenharmony_ci 2888c2ecf20Sopenharmony_ci/**********************************************************************/ 2898c2ecf20Sopenharmony_ci 2908c2ecf20Sopenharmony_cistatic struct resource au1300_psc2_res[] = { 2918c2ecf20Sopenharmony_ci [0] = { 2928c2ecf20Sopenharmony_ci .start = AU1300_PSC2_PHYS_ADDR, 2938c2ecf20Sopenharmony_ci .end = AU1300_PSC2_PHYS_ADDR + 0x0fff, 2948c2ecf20Sopenharmony_ci .flags = IORESOURCE_MEM, 2958c2ecf20Sopenharmony_ci }, 2968c2ecf20Sopenharmony_ci [1] = { 2978c2ecf20Sopenharmony_ci .start = AU1300_PSC2_INT, 2988c2ecf20Sopenharmony_ci .end = AU1300_PSC2_INT, 2998c2ecf20Sopenharmony_ci .flags = IORESOURCE_IRQ, 3008c2ecf20Sopenharmony_ci }, 3018c2ecf20Sopenharmony_ci [2] = { 3028c2ecf20Sopenharmony_ci .start = AU1300_DSCR_CMD0_PSC2_TX, 3038c2ecf20Sopenharmony_ci .end = AU1300_DSCR_CMD0_PSC2_TX, 3048c2ecf20Sopenharmony_ci .flags = IORESOURCE_DMA, 3058c2ecf20Sopenharmony_ci }, 3068c2ecf20Sopenharmony_ci [3] = { 3078c2ecf20Sopenharmony_ci .start = AU1300_DSCR_CMD0_PSC2_RX, 3088c2ecf20Sopenharmony_ci .end = AU1300_DSCR_CMD0_PSC2_RX, 3098c2ecf20Sopenharmony_ci .flags = IORESOURCE_DMA, 3108c2ecf20Sopenharmony_ci }, 3118c2ecf20Sopenharmony_ci}; 3128c2ecf20Sopenharmony_ci 3138c2ecf20Sopenharmony_cistatic struct platform_device db1300_i2s_dev = { 3148c2ecf20Sopenharmony_ci .name = "au1xpsc_i2s", 3158c2ecf20Sopenharmony_ci .id = 2, /* PSC ID */ 3168c2ecf20Sopenharmony_ci .num_resources = ARRAY_SIZE(au1300_psc2_res), 3178c2ecf20Sopenharmony_ci .resource = au1300_psc2_res, 3188c2ecf20Sopenharmony_ci}; 3198c2ecf20Sopenharmony_ci 3208c2ecf20Sopenharmony_ci/**********************************************************************/ 3218c2ecf20Sopenharmony_ci 3228c2ecf20Sopenharmony_cistatic struct resource au1300_psc3_res[] = { 3238c2ecf20Sopenharmony_ci [0] = { 3248c2ecf20Sopenharmony_ci .start = AU1300_PSC3_PHYS_ADDR, 3258c2ecf20Sopenharmony_ci .end = AU1300_PSC3_PHYS_ADDR + 0x0fff, 3268c2ecf20Sopenharmony_ci .flags = IORESOURCE_MEM, 3278c2ecf20Sopenharmony_ci }, 3288c2ecf20Sopenharmony_ci [1] = { 3298c2ecf20Sopenharmony_ci .start = AU1300_PSC3_INT, 3308c2ecf20Sopenharmony_ci .end = AU1300_PSC3_INT, 3318c2ecf20Sopenharmony_ci .flags = IORESOURCE_IRQ, 3328c2ecf20Sopenharmony_ci }, 3338c2ecf20Sopenharmony_ci [2] = { 3348c2ecf20Sopenharmony_ci .start = AU1300_DSCR_CMD0_PSC3_TX, 3358c2ecf20Sopenharmony_ci .end = AU1300_DSCR_CMD0_PSC3_TX, 3368c2ecf20Sopenharmony_ci .flags = IORESOURCE_DMA, 3378c2ecf20Sopenharmony_ci }, 3388c2ecf20Sopenharmony_ci [3] = { 3398c2ecf20Sopenharmony_ci .start = AU1300_DSCR_CMD0_PSC3_RX, 3408c2ecf20Sopenharmony_ci .end = AU1300_DSCR_CMD0_PSC3_RX, 3418c2ecf20Sopenharmony_ci .flags = IORESOURCE_DMA, 3428c2ecf20Sopenharmony_ci }, 3438c2ecf20Sopenharmony_ci}; 3448c2ecf20Sopenharmony_ci 3458c2ecf20Sopenharmony_cistatic struct platform_device db1300_i2c_dev = { 3468c2ecf20Sopenharmony_ci .name = "au1xpsc_smbus", 3478c2ecf20Sopenharmony_ci .id = 0, /* bus number */ 3488c2ecf20Sopenharmony_ci .num_resources = ARRAY_SIZE(au1300_psc3_res), 3498c2ecf20Sopenharmony_ci .resource = au1300_psc3_res, 3508c2ecf20Sopenharmony_ci}; 3518c2ecf20Sopenharmony_ci 3528c2ecf20Sopenharmony_ci/**********************************************************************/ 3538c2ecf20Sopenharmony_ci 3548c2ecf20Sopenharmony_ci/* proper key assignments when facing the LCD panel. For key assignments 3558c2ecf20Sopenharmony_ci * according to the schematics swap up with down and left with right. 3568c2ecf20Sopenharmony_ci * I chose to use it to emulate the arrow keys of a keyboard. 3578c2ecf20Sopenharmony_ci */ 3588c2ecf20Sopenharmony_cistatic struct gpio_keys_button db1300_5waysw_arrowkeys[] = { 3598c2ecf20Sopenharmony_ci { 3608c2ecf20Sopenharmony_ci .code = KEY_DOWN, 3618c2ecf20Sopenharmony_ci .gpio = AU1300_PIN_LCDPWM0, 3628c2ecf20Sopenharmony_ci .type = EV_KEY, 3638c2ecf20Sopenharmony_ci .debounce_interval = 1, 3648c2ecf20Sopenharmony_ci .active_low = 1, 3658c2ecf20Sopenharmony_ci .desc = "5waysw-down", 3668c2ecf20Sopenharmony_ci }, 3678c2ecf20Sopenharmony_ci { 3688c2ecf20Sopenharmony_ci .code = KEY_UP, 3698c2ecf20Sopenharmony_ci .gpio = AU1300_PIN_PSC2SYNC1, 3708c2ecf20Sopenharmony_ci .type = EV_KEY, 3718c2ecf20Sopenharmony_ci .debounce_interval = 1, 3728c2ecf20Sopenharmony_ci .active_low = 1, 3738c2ecf20Sopenharmony_ci .desc = "5waysw-up", 3748c2ecf20Sopenharmony_ci }, 3758c2ecf20Sopenharmony_ci { 3768c2ecf20Sopenharmony_ci .code = KEY_RIGHT, 3778c2ecf20Sopenharmony_ci .gpio = AU1300_PIN_WAKE3, 3788c2ecf20Sopenharmony_ci .type = EV_KEY, 3798c2ecf20Sopenharmony_ci .debounce_interval = 1, 3808c2ecf20Sopenharmony_ci .active_low = 1, 3818c2ecf20Sopenharmony_ci .desc = "5waysw-right", 3828c2ecf20Sopenharmony_ci }, 3838c2ecf20Sopenharmony_ci { 3848c2ecf20Sopenharmony_ci .code = KEY_LEFT, 3858c2ecf20Sopenharmony_ci .gpio = AU1300_PIN_WAKE2, 3868c2ecf20Sopenharmony_ci .type = EV_KEY, 3878c2ecf20Sopenharmony_ci .debounce_interval = 1, 3888c2ecf20Sopenharmony_ci .active_low = 1, 3898c2ecf20Sopenharmony_ci .desc = "5waysw-left", 3908c2ecf20Sopenharmony_ci }, 3918c2ecf20Sopenharmony_ci { 3928c2ecf20Sopenharmony_ci .code = KEY_ENTER, 3938c2ecf20Sopenharmony_ci .gpio = AU1300_PIN_WAKE1, 3948c2ecf20Sopenharmony_ci .type = EV_KEY, 3958c2ecf20Sopenharmony_ci .debounce_interval = 1, 3968c2ecf20Sopenharmony_ci .active_low = 1, 3978c2ecf20Sopenharmony_ci .desc = "5waysw-push", 3988c2ecf20Sopenharmony_ci }, 3998c2ecf20Sopenharmony_ci}; 4008c2ecf20Sopenharmony_ci 4018c2ecf20Sopenharmony_cistatic struct gpio_keys_platform_data db1300_5waysw_data = { 4028c2ecf20Sopenharmony_ci .buttons = db1300_5waysw_arrowkeys, 4038c2ecf20Sopenharmony_ci .nbuttons = ARRAY_SIZE(db1300_5waysw_arrowkeys), 4048c2ecf20Sopenharmony_ci .rep = 1, 4058c2ecf20Sopenharmony_ci .name = "db1300-5wayswitch", 4068c2ecf20Sopenharmony_ci}; 4078c2ecf20Sopenharmony_ci 4088c2ecf20Sopenharmony_cistatic struct platform_device db1300_5waysw_dev = { 4098c2ecf20Sopenharmony_ci .name = "gpio-keys", 4108c2ecf20Sopenharmony_ci .dev = { 4118c2ecf20Sopenharmony_ci .platform_data = &db1300_5waysw_data, 4128c2ecf20Sopenharmony_ci }, 4138c2ecf20Sopenharmony_ci}; 4148c2ecf20Sopenharmony_ci 4158c2ecf20Sopenharmony_ci/**********************************************************************/ 4168c2ecf20Sopenharmony_ci 4178c2ecf20Sopenharmony_cistatic struct pata_platform_info db1300_ide_info = { 4188c2ecf20Sopenharmony_ci .ioport_shift = DB1300_IDE_REG_SHIFT, 4198c2ecf20Sopenharmony_ci}; 4208c2ecf20Sopenharmony_ci 4218c2ecf20Sopenharmony_ci#define IDE_ALT_START (14 << DB1300_IDE_REG_SHIFT) 4228c2ecf20Sopenharmony_cistatic struct resource db1300_ide_res[] = { 4238c2ecf20Sopenharmony_ci [0] = { 4248c2ecf20Sopenharmony_ci .start = DB1300_IDE_PHYS_ADDR, 4258c2ecf20Sopenharmony_ci .end = DB1300_IDE_PHYS_ADDR + IDE_ALT_START - 1, 4268c2ecf20Sopenharmony_ci .flags = IORESOURCE_MEM, 4278c2ecf20Sopenharmony_ci }, 4288c2ecf20Sopenharmony_ci [1] = { 4298c2ecf20Sopenharmony_ci .start = DB1300_IDE_PHYS_ADDR + IDE_ALT_START, 4308c2ecf20Sopenharmony_ci .end = DB1300_IDE_PHYS_ADDR + DB1300_IDE_PHYS_LEN - 1, 4318c2ecf20Sopenharmony_ci .flags = IORESOURCE_MEM, 4328c2ecf20Sopenharmony_ci }, 4338c2ecf20Sopenharmony_ci [2] = { 4348c2ecf20Sopenharmony_ci .start = DB1300_IDE_INT, 4358c2ecf20Sopenharmony_ci .end = DB1300_IDE_INT, 4368c2ecf20Sopenharmony_ci .flags = IORESOURCE_IRQ, 4378c2ecf20Sopenharmony_ci }, 4388c2ecf20Sopenharmony_ci}; 4398c2ecf20Sopenharmony_ci 4408c2ecf20Sopenharmony_cistatic struct platform_device db1300_ide_dev = { 4418c2ecf20Sopenharmony_ci .dev = { 4428c2ecf20Sopenharmony_ci .dma_mask = &au1300_all_dmamask, 4438c2ecf20Sopenharmony_ci .coherent_dma_mask = DMA_BIT_MASK(32), 4448c2ecf20Sopenharmony_ci .platform_data = &db1300_ide_info, 4458c2ecf20Sopenharmony_ci }, 4468c2ecf20Sopenharmony_ci .name = "pata_platform", 4478c2ecf20Sopenharmony_ci .resource = db1300_ide_res, 4488c2ecf20Sopenharmony_ci .num_resources = ARRAY_SIZE(db1300_ide_res), 4498c2ecf20Sopenharmony_ci}; 4508c2ecf20Sopenharmony_ci 4518c2ecf20Sopenharmony_ci/**********************************************************************/ 4528c2ecf20Sopenharmony_ci 4538c2ecf20Sopenharmony_ci#ifdef CONFIG_MMC_AU1X 4548c2ecf20Sopenharmony_cistatic irqreturn_t db1300_mmc_cd(int irq, void *ptr) 4558c2ecf20Sopenharmony_ci{ 4568c2ecf20Sopenharmony_ci disable_irq_nosync(irq); 4578c2ecf20Sopenharmony_ci return IRQ_WAKE_THREAD; 4588c2ecf20Sopenharmony_ci} 4598c2ecf20Sopenharmony_ci 4608c2ecf20Sopenharmony_cistatic irqreturn_t db1300_mmc_cdfn(int irq, void *ptr) 4618c2ecf20Sopenharmony_ci{ 4628c2ecf20Sopenharmony_ci mmc_detect_change(ptr, msecs_to_jiffies(200)); 4638c2ecf20Sopenharmony_ci 4648c2ecf20Sopenharmony_ci msleep(100); /* debounce */ 4658c2ecf20Sopenharmony_ci if (irq == DB1300_SD1_INSERT_INT) 4668c2ecf20Sopenharmony_ci enable_irq(DB1300_SD1_EJECT_INT); 4678c2ecf20Sopenharmony_ci else 4688c2ecf20Sopenharmony_ci enable_irq(DB1300_SD1_INSERT_INT); 4698c2ecf20Sopenharmony_ci 4708c2ecf20Sopenharmony_ci return IRQ_HANDLED; 4718c2ecf20Sopenharmony_ci} 4728c2ecf20Sopenharmony_ci 4738c2ecf20Sopenharmony_cistatic int db1300_mmc_card_readonly(void *mmc_host) 4748c2ecf20Sopenharmony_ci{ 4758c2ecf20Sopenharmony_ci /* it uses SD1 interface, but the DB1200's SD0 bit in the CPLD */ 4768c2ecf20Sopenharmony_ci return bcsr_read(BCSR_STATUS) & BCSR_STATUS_SD0WP; 4778c2ecf20Sopenharmony_ci} 4788c2ecf20Sopenharmony_ci 4798c2ecf20Sopenharmony_cistatic int db1300_mmc_card_inserted(void *mmc_host) 4808c2ecf20Sopenharmony_ci{ 4818c2ecf20Sopenharmony_ci return bcsr_read(BCSR_SIGSTAT) & (1 << 12); /* insertion irq signal */ 4828c2ecf20Sopenharmony_ci} 4838c2ecf20Sopenharmony_ci 4848c2ecf20Sopenharmony_cistatic int db1300_mmc_cd_setup(void *mmc_host, int en) 4858c2ecf20Sopenharmony_ci{ 4868c2ecf20Sopenharmony_ci int ret; 4878c2ecf20Sopenharmony_ci 4888c2ecf20Sopenharmony_ci if (en) { 4898c2ecf20Sopenharmony_ci ret = request_threaded_irq(DB1300_SD1_INSERT_INT, db1300_mmc_cd, 4908c2ecf20Sopenharmony_ci db1300_mmc_cdfn, 0, "sd_insert", mmc_host); 4918c2ecf20Sopenharmony_ci if (ret) 4928c2ecf20Sopenharmony_ci goto out; 4938c2ecf20Sopenharmony_ci 4948c2ecf20Sopenharmony_ci ret = request_threaded_irq(DB1300_SD1_EJECT_INT, db1300_mmc_cd, 4958c2ecf20Sopenharmony_ci db1300_mmc_cdfn, 0, "sd_eject", mmc_host); 4968c2ecf20Sopenharmony_ci if (ret) { 4978c2ecf20Sopenharmony_ci free_irq(DB1300_SD1_INSERT_INT, mmc_host); 4988c2ecf20Sopenharmony_ci goto out; 4998c2ecf20Sopenharmony_ci } 5008c2ecf20Sopenharmony_ci 5018c2ecf20Sopenharmony_ci if (db1300_mmc_card_inserted(mmc_host)) 5028c2ecf20Sopenharmony_ci enable_irq(DB1300_SD1_EJECT_INT); 5038c2ecf20Sopenharmony_ci else 5048c2ecf20Sopenharmony_ci enable_irq(DB1300_SD1_INSERT_INT); 5058c2ecf20Sopenharmony_ci 5068c2ecf20Sopenharmony_ci } else { 5078c2ecf20Sopenharmony_ci free_irq(DB1300_SD1_INSERT_INT, mmc_host); 5088c2ecf20Sopenharmony_ci free_irq(DB1300_SD1_EJECT_INT, mmc_host); 5098c2ecf20Sopenharmony_ci } 5108c2ecf20Sopenharmony_ci ret = 0; 5118c2ecf20Sopenharmony_ciout: 5128c2ecf20Sopenharmony_ci return ret; 5138c2ecf20Sopenharmony_ci} 5148c2ecf20Sopenharmony_ci 5158c2ecf20Sopenharmony_cistatic void db1300_mmcled_set(struct led_classdev *led, 5168c2ecf20Sopenharmony_ci enum led_brightness brightness) 5178c2ecf20Sopenharmony_ci{ 5188c2ecf20Sopenharmony_ci if (brightness != LED_OFF) 5198c2ecf20Sopenharmony_ci bcsr_mod(BCSR_LEDS, BCSR_LEDS_LED0, 0); 5208c2ecf20Sopenharmony_ci else 5218c2ecf20Sopenharmony_ci bcsr_mod(BCSR_LEDS, 0, BCSR_LEDS_LED0); 5228c2ecf20Sopenharmony_ci} 5238c2ecf20Sopenharmony_ci 5248c2ecf20Sopenharmony_cistatic struct led_classdev db1300_mmc_led = { 5258c2ecf20Sopenharmony_ci .brightness_set = db1300_mmcled_set, 5268c2ecf20Sopenharmony_ci}; 5278c2ecf20Sopenharmony_ci 5288c2ecf20Sopenharmony_cistruct au1xmmc_platform_data db1300_sd1_platdata = { 5298c2ecf20Sopenharmony_ci .cd_setup = db1300_mmc_cd_setup, 5308c2ecf20Sopenharmony_ci .card_inserted = db1300_mmc_card_inserted, 5318c2ecf20Sopenharmony_ci .card_readonly = db1300_mmc_card_readonly, 5328c2ecf20Sopenharmony_ci .led = &db1300_mmc_led, 5338c2ecf20Sopenharmony_ci}; 5348c2ecf20Sopenharmony_ci 5358c2ecf20Sopenharmony_cistatic struct resource au1300_sd1_res[] = { 5368c2ecf20Sopenharmony_ci [0] = { 5378c2ecf20Sopenharmony_ci .start = AU1300_SD1_PHYS_ADDR, 5388c2ecf20Sopenharmony_ci .end = AU1300_SD1_PHYS_ADDR, 5398c2ecf20Sopenharmony_ci .flags = IORESOURCE_MEM, 5408c2ecf20Sopenharmony_ci }, 5418c2ecf20Sopenharmony_ci [1] = { 5428c2ecf20Sopenharmony_ci .start = AU1300_SD1_INT, 5438c2ecf20Sopenharmony_ci .end = AU1300_SD1_INT, 5448c2ecf20Sopenharmony_ci .flags = IORESOURCE_IRQ, 5458c2ecf20Sopenharmony_ci }, 5468c2ecf20Sopenharmony_ci [2] = { 5478c2ecf20Sopenharmony_ci .start = AU1300_DSCR_CMD0_SDMS_TX1, 5488c2ecf20Sopenharmony_ci .end = AU1300_DSCR_CMD0_SDMS_TX1, 5498c2ecf20Sopenharmony_ci .flags = IORESOURCE_DMA, 5508c2ecf20Sopenharmony_ci }, 5518c2ecf20Sopenharmony_ci [3] = { 5528c2ecf20Sopenharmony_ci .start = AU1300_DSCR_CMD0_SDMS_RX1, 5538c2ecf20Sopenharmony_ci .end = AU1300_DSCR_CMD0_SDMS_RX1, 5548c2ecf20Sopenharmony_ci .flags = IORESOURCE_DMA, 5558c2ecf20Sopenharmony_ci }, 5568c2ecf20Sopenharmony_ci}; 5578c2ecf20Sopenharmony_ci 5588c2ecf20Sopenharmony_cistatic struct platform_device db1300_sd1_dev = { 5598c2ecf20Sopenharmony_ci .dev = { 5608c2ecf20Sopenharmony_ci .dma_mask = &au1300_all_dmamask, 5618c2ecf20Sopenharmony_ci .coherent_dma_mask = DMA_BIT_MASK(32), 5628c2ecf20Sopenharmony_ci .platform_data = &db1300_sd1_platdata, 5638c2ecf20Sopenharmony_ci }, 5648c2ecf20Sopenharmony_ci .name = "au1xxx-mmc", 5658c2ecf20Sopenharmony_ci .id = 1, 5668c2ecf20Sopenharmony_ci .resource = au1300_sd1_res, 5678c2ecf20Sopenharmony_ci .num_resources = ARRAY_SIZE(au1300_sd1_res), 5688c2ecf20Sopenharmony_ci}; 5698c2ecf20Sopenharmony_ci 5708c2ecf20Sopenharmony_ci/**********************************************************************/ 5718c2ecf20Sopenharmony_ci 5728c2ecf20Sopenharmony_cistatic int db1300_movinand_inserted(void *mmc_host) 5738c2ecf20Sopenharmony_ci{ 5748c2ecf20Sopenharmony_ci return 0; /* disable for now, it doesn't work yet */ 5758c2ecf20Sopenharmony_ci} 5768c2ecf20Sopenharmony_ci 5778c2ecf20Sopenharmony_cistatic int db1300_movinand_readonly(void *mmc_host) 5788c2ecf20Sopenharmony_ci{ 5798c2ecf20Sopenharmony_ci return 0; 5808c2ecf20Sopenharmony_ci} 5818c2ecf20Sopenharmony_ci 5828c2ecf20Sopenharmony_cistatic void db1300_movinand_led_set(struct led_classdev *led, 5838c2ecf20Sopenharmony_ci enum led_brightness brightness) 5848c2ecf20Sopenharmony_ci{ 5858c2ecf20Sopenharmony_ci if (brightness != LED_OFF) 5868c2ecf20Sopenharmony_ci bcsr_mod(BCSR_LEDS, BCSR_LEDS_LED1, 0); 5878c2ecf20Sopenharmony_ci else 5888c2ecf20Sopenharmony_ci bcsr_mod(BCSR_LEDS, 0, BCSR_LEDS_LED1); 5898c2ecf20Sopenharmony_ci} 5908c2ecf20Sopenharmony_ci 5918c2ecf20Sopenharmony_cistatic struct led_classdev db1300_movinand_led = { 5928c2ecf20Sopenharmony_ci .brightness_set = db1300_movinand_led_set, 5938c2ecf20Sopenharmony_ci}; 5948c2ecf20Sopenharmony_ci 5958c2ecf20Sopenharmony_cistruct au1xmmc_platform_data db1300_sd0_platdata = { 5968c2ecf20Sopenharmony_ci .card_inserted = db1300_movinand_inserted, 5978c2ecf20Sopenharmony_ci .card_readonly = db1300_movinand_readonly, 5988c2ecf20Sopenharmony_ci .led = &db1300_movinand_led, 5998c2ecf20Sopenharmony_ci .mask_host_caps = MMC_CAP_NEEDS_POLL, 6008c2ecf20Sopenharmony_ci}; 6018c2ecf20Sopenharmony_ci 6028c2ecf20Sopenharmony_cistatic struct resource au1300_sd0_res[] = { 6038c2ecf20Sopenharmony_ci [0] = { 6048c2ecf20Sopenharmony_ci .start = AU1100_SD0_PHYS_ADDR, 6058c2ecf20Sopenharmony_ci .end = AU1100_SD0_PHYS_ADDR, 6068c2ecf20Sopenharmony_ci .flags = IORESOURCE_MEM, 6078c2ecf20Sopenharmony_ci }, 6088c2ecf20Sopenharmony_ci [1] = { 6098c2ecf20Sopenharmony_ci .start = AU1300_SD0_INT, 6108c2ecf20Sopenharmony_ci .end = AU1300_SD0_INT, 6118c2ecf20Sopenharmony_ci .flags = IORESOURCE_IRQ, 6128c2ecf20Sopenharmony_ci }, 6138c2ecf20Sopenharmony_ci [2] = { 6148c2ecf20Sopenharmony_ci .start = AU1300_DSCR_CMD0_SDMS_TX0, 6158c2ecf20Sopenharmony_ci .end = AU1300_DSCR_CMD0_SDMS_TX0, 6168c2ecf20Sopenharmony_ci .flags = IORESOURCE_DMA, 6178c2ecf20Sopenharmony_ci }, 6188c2ecf20Sopenharmony_ci [3] = { 6198c2ecf20Sopenharmony_ci .start = AU1300_DSCR_CMD0_SDMS_RX0, 6208c2ecf20Sopenharmony_ci .end = AU1300_DSCR_CMD0_SDMS_RX0, 6218c2ecf20Sopenharmony_ci .flags = IORESOURCE_DMA, 6228c2ecf20Sopenharmony_ci }, 6238c2ecf20Sopenharmony_ci}; 6248c2ecf20Sopenharmony_ci 6258c2ecf20Sopenharmony_cistatic struct platform_device db1300_sd0_dev = { 6268c2ecf20Sopenharmony_ci .dev = { 6278c2ecf20Sopenharmony_ci .dma_mask = &au1300_all_dmamask, 6288c2ecf20Sopenharmony_ci .coherent_dma_mask = DMA_BIT_MASK(32), 6298c2ecf20Sopenharmony_ci .platform_data = &db1300_sd0_platdata, 6308c2ecf20Sopenharmony_ci }, 6318c2ecf20Sopenharmony_ci .name = "au1xxx-mmc", 6328c2ecf20Sopenharmony_ci .id = 0, 6338c2ecf20Sopenharmony_ci .resource = au1300_sd0_res, 6348c2ecf20Sopenharmony_ci .num_resources = ARRAY_SIZE(au1300_sd0_res), 6358c2ecf20Sopenharmony_ci}; 6368c2ecf20Sopenharmony_ci#endif /* CONFIG_MMC_AU1X */ 6378c2ecf20Sopenharmony_ci 6388c2ecf20Sopenharmony_ci/**********************************************************************/ 6398c2ecf20Sopenharmony_ci 6408c2ecf20Sopenharmony_cistatic struct platform_device db1300_wm9715_dev = { 6418c2ecf20Sopenharmony_ci .name = "wm9712-codec", 6428c2ecf20Sopenharmony_ci .id = 1, /* ID of PSC for AC97 audio, see asoc glue! */ 6438c2ecf20Sopenharmony_ci}; 6448c2ecf20Sopenharmony_ci 6458c2ecf20Sopenharmony_cistatic struct platform_device db1300_ac97dma_dev = { 6468c2ecf20Sopenharmony_ci .name = "au1xpsc-pcm", 6478c2ecf20Sopenharmony_ci .id = 1, /* PSC ID */ 6488c2ecf20Sopenharmony_ci}; 6498c2ecf20Sopenharmony_ci 6508c2ecf20Sopenharmony_cistatic struct platform_device db1300_i2sdma_dev = { 6518c2ecf20Sopenharmony_ci .name = "au1xpsc-pcm", 6528c2ecf20Sopenharmony_ci .id = 2, /* PSC ID */ 6538c2ecf20Sopenharmony_ci}; 6548c2ecf20Sopenharmony_ci 6558c2ecf20Sopenharmony_cistatic struct platform_device db1300_sndac97_dev = { 6568c2ecf20Sopenharmony_ci .name = "db1300-ac97", 6578c2ecf20Sopenharmony_ci .dev = { 6588c2ecf20Sopenharmony_ci .dma_mask = &au1300_all_dmamask, 6598c2ecf20Sopenharmony_ci .coherent_dma_mask = DMA_BIT_MASK(32), 6608c2ecf20Sopenharmony_ci }, 6618c2ecf20Sopenharmony_ci}; 6628c2ecf20Sopenharmony_ci 6638c2ecf20Sopenharmony_cistatic struct platform_device db1300_sndi2s_dev = { 6648c2ecf20Sopenharmony_ci .name = "db1300-i2s", 6658c2ecf20Sopenharmony_ci .dev = { 6668c2ecf20Sopenharmony_ci .dma_mask = &au1300_all_dmamask, 6678c2ecf20Sopenharmony_ci .coherent_dma_mask = DMA_BIT_MASK(32), 6688c2ecf20Sopenharmony_ci }, 6698c2ecf20Sopenharmony_ci}; 6708c2ecf20Sopenharmony_ci 6718c2ecf20Sopenharmony_ci/**********************************************************************/ 6728c2ecf20Sopenharmony_ci 6738c2ecf20Sopenharmony_cistatic int db1300fb_panel_index(void) 6748c2ecf20Sopenharmony_ci{ 6758c2ecf20Sopenharmony_ci return 9; /* DB1300_800x480 */ 6768c2ecf20Sopenharmony_ci} 6778c2ecf20Sopenharmony_ci 6788c2ecf20Sopenharmony_cistatic int db1300fb_panel_init(void) 6798c2ecf20Sopenharmony_ci{ 6808c2ecf20Sopenharmony_ci /* Apply power (Vee/Vdd logic is inverted on Panel DB1300_800x480) */ 6818c2ecf20Sopenharmony_ci bcsr_mod(BCSR_BOARD, BCSR_BOARD_LCDVEE | BCSR_BOARD_LCDVDD, 6828c2ecf20Sopenharmony_ci BCSR_BOARD_LCDBL); 6838c2ecf20Sopenharmony_ci return 0; 6848c2ecf20Sopenharmony_ci} 6858c2ecf20Sopenharmony_ci 6868c2ecf20Sopenharmony_cistatic int db1300fb_panel_shutdown(void) 6878c2ecf20Sopenharmony_ci{ 6888c2ecf20Sopenharmony_ci /* Remove power (Vee/Vdd logic is inverted on Panel DB1300_800x480) */ 6898c2ecf20Sopenharmony_ci bcsr_mod(BCSR_BOARD, BCSR_BOARD_LCDBL, 6908c2ecf20Sopenharmony_ci BCSR_BOARD_LCDVEE | BCSR_BOARD_LCDVDD); 6918c2ecf20Sopenharmony_ci return 0; 6928c2ecf20Sopenharmony_ci} 6938c2ecf20Sopenharmony_ci 6948c2ecf20Sopenharmony_cistatic struct au1200fb_platdata db1300fb_pd = { 6958c2ecf20Sopenharmony_ci .panel_index = db1300fb_panel_index, 6968c2ecf20Sopenharmony_ci .panel_init = db1300fb_panel_init, 6978c2ecf20Sopenharmony_ci .panel_shutdown = db1300fb_panel_shutdown, 6988c2ecf20Sopenharmony_ci}; 6998c2ecf20Sopenharmony_ci 7008c2ecf20Sopenharmony_cistatic struct resource au1300_lcd_res[] = { 7018c2ecf20Sopenharmony_ci [0] = { 7028c2ecf20Sopenharmony_ci .start = AU1200_LCD_PHYS_ADDR, 7038c2ecf20Sopenharmony_ci .end = AU1200_LCD_PHYS_ADDR + 0x800 - 1, 7048c2ecf20Sopenharmony_ci .flags = IORESOURCE_MEM, 7058c2ecf20Sopenharmony_ci }, 7068c2ecf20Sopenharmony_ci [1] = { 7078c2ecf20Sopenharmony_ci .start = AU1300_LCD_INT, 7088c2ecf20Sopenharmony_ci .end = AU1300_LCD_INT, 7098c2ecf20Sopenharmony_ci .flags = IORESOURCE_IRQ, 7108c2ecf20Sopenharmony_ci } 7118c2ecf20Sopenharmony_ci}; 7128c2ecf20Sopenharmony_ci 7138c2ecf20Sopenharmony_ci 7148c2ecf20Sopenharmony_cistatic struct platform_device db1300_lcd_dev = { 7158c2ecf20Sopenharmony_ci .name = "au1200-lcd", 7168c2ecf20Sopenharmony_ci .id = 0, 7178c2ecf20Sopenharmony_ci .dev = { 7188c2ecf20Sopenharmony_ci .dma_mask = &au1300_all_dmamask, 7198c2ecf20Sopenharmony_ci .coherent_dma_mask = DMA_BIT_MASK(32), 7208c2ecf20Sopenharmony_ci .platform_data = &db1300fb_pd, 7218c2ecf20Sopenharmony_ci }, 7228c2ecf20Sopenharmony_ci .num_resources = ARRAY_SIZE(au1300_lcd_res), 7238c2ecf20Sopenharmony_ci .resource = au1300_lcd_res, 7248c2ecf20Sopenharmony_ci}; 7258c2ecf20Sopenharmony_ci 7268c2ecf20Sopenharmony_ci/**********************************************************************/ 7278c2ecf20Sopenharmony_ci 7288c2ecf20Sopenharmony_ci#if IS_ENABLED(CONFIG_TOUCHSCREEN_WM97XX) 7298c2ecf20Sopenharmony_cistatic void db1300_wm97xx_irqen(struct wm97xx *wm, int enable) 7308c2ecf20Sopenharmony_ci{ 7318c2ecf20Sopenharmony_ci if (enable) 7328c2ecf20Sopenharmony_ci enable_irq(DB1300_AC97_PEN_INT); 7338c2ecf20Sopenharmony_ci else 7348c2ecf20Sopenharmony_ci disable_irq_nosync(DB1300_AC97_PEN_INT); 7358c2ecf20Sopenharmony_ci} 7368c2ecf20Sopenharmony_ci 7378c2ecf20Sopenharmony_cistatic struct wm97xx_mach_ops db1300_wm97xx_ops = { 7388c2ecf20Sopenharmony_ci .irq_enable = db1300_wm97xx_irqen, 7398c2ecf20Sopenharmony_ci .irq_gpio = WM97XX_GPIO_3, 7408c2ecf20Sopenharmony_ci}; 7418c2ecf20Sopenharmony_ci 7428c2ecf20Sopenharmony_cistatic int db1300_wm97xx_probe(struct platform_device *pdev) 7438c2ecf20Sopenharmony_ci{ 7448c2ecf20Sopenharmony_ci struct wm97xx *wm = platform_get_drvdata(pdev); 7458c2ecf20Sopenharmony_ci 7468c2ecf20Sopenharmony_ci /* external pendown indicator */ 7478c2ecf20Sopenharmony_ci wm97xx_config_gpio(wm, WM97XX_GPIO_13, WM97XX_GPIO_IN, 7488c2ecf20Sopenharmony_ci WM97XX_GPIO_POL_LOW, WM97XX_GPIO_STICKY, 7498c2ecf20Sopenharmony_ci WM97XX_GPIO_WAKE); 7508c2ecf20Sopenharmony_ci 7518c2ecf20Sopenharmony_ci /* internal "virtual" pendown gpio */ 7528c2ecf20Sopenharmony_ci wm97xx_config_gpio(wm, WM97XX_GPIO_3, WM97XX_GPIO_OUT, 7538c2ecf20Sopenharmony_ci WM97XX_GPIO_POL_LOW, WM97XX_GPIO_NOTSTICKY, 7548c2ecf20Sopenharmony_ci WM97XX_GPIO_NOWAKE); 7558c2ecf20Sopenharmony_ci 7568c2ecf20Sopenharmony_ci wm->pen_irq = DB1300_AC97_PEN_INT; 7578c2ecf20Sopenharmony_ci 7588c2ecf20Sopenharmony_ci return wm97xx_register_mach_ops(wm, &db1300_wm97xx_ops); 7598c2ecf20Sopenharmony_ci} 7608c2ecf20Sopenharmony_ci#else 7618c2ecf20Sopenharmony_cistatic int db1300_wm97xx_probe(struct platform_device *pdev) 7628c2ecf20Sopenharmony_ci{ 7638c2ecf20Sopenharmony_ci return -ENODEV; 7648c2ecf20Sopenharmony_ci} 7658c2ecf20Sopenharmony_ci#endif 7668c2ecf20Sopenharmony_ci 7678c2ecf20Sopenharmony_cistatic struct platform_driver db1300_wm97xx_driver = { 7688c2ecf20Sopenharmony_ci .driver.name = "wm97xx-touch", 7698c2ecf20Sopenharmony_ci .driver.owner = THIS_MODULE, 7708c2ecf20Sopenharmony_ci .probe = db1300_wm97xx_probe, 7718c2ecf20Sopenharmony_ci}; 7728c2ecf20Sopenharmony_ci 7738c2ecf20Sopenharmony_ci/**********************************************************************/ 7748c2ecf20Sopenharmony_ci 7758c2ecf20Sopenharmony_cistatic struct platform_device *db1300_dev[] __initdata = { 7768c2ecf20Sopenharmony_ci &db1300_eth_dev, 7778c2ecf20Sopenharmony_ci &db1300_i2c_dev, 7788c2ecf20Sopenharmony_ci &db1300_5waysw_dev, 7798c2ecf20Sopenharmony_ci &db1300_nand_dev, 7808c2ecf20Sopenharmony_ci &db1300_ide_dev, 7818c2ecf20Sopenharmony_ci#ifdef CONFIG_MMC_AU1X 7828c2ecf20Sopenharmony_ci &db1300_sd0_dev, 7838c2ecf20Sopenharmony_ci &db1300_sd1_dev, 7848c2ecf20Sopenharmony_ci#endif 7858c2ecf20Sopenharmony_ci &db1300_lcd_dev, 7868c2ecf20Sopenharmony_ci &db1300_ac97_dev, 7878c2ecf20Sopenharmony_ci &db1300_i2s_dev, 7888c2ecf20Sopenharmony_ci &db1300_wm9715_dev, 7898c2ecf20Sopenharmony_ci &db1300_ac97dma_dev, 7908c2ecf20Sopenharmony_ci &db1300_i2sdma_dev, 7918c2ecf20Sopenharmony_ci &db1300_sndac97_dev, 7928c2ecf20Sopenharmony_ci &db1300_sndi2s_dev, 7938c2ecf20Sopenharmony_ci}; 7948c2ecf20Sopenharmony_ci 7958c2ecf20Sopenharmony_ciint __init db1300_dev_setup(void) 7968c2ecf20Sopenharmony_ci{ 7978c2ecf20Sopenharmony_ci int swapped, cpldirq; 7988c2ecf20Sopenharmony_ci struct clk *c; 7998c2ecf20Sopenharmony_ci 8008c2ecf20Sopenharmony_ci /* setup CPLD IRQ muxer */ 8018c2ecf20Sopenharmony_ci cpldirq = au1300_gpio_to_irq(AU1300_PIN_EXTCLK1); 8028c2ecf20Sopenharmony_ci irq_set_irq_type(cpldirq, IRQ_TYPE_LEVEL_HIGH); 8038c2ecf20Sopenharmony_ci bcsr_init_irq(DB1300_FIRST_INT, DB1300_LAST_INT, cpldirq); 8048c2ecf20Sopenharmony_ci 8058c2ecf20Sopenharmony_ci /* insert/eject IRQs: one always triggers so don't enable them 8068c2ecf20Sopenharmony_ci * when doing request_irq() on them. DB1200 has this bug too. 8078c2ecf20Sopenharmony_ci */ 8088c2ecf20Sopenharmony_ci irq_set_status_flags(DB1300_SD1_INSERT_INT, IRQ_NOAUTOEN); 8098c2ecf20Sopenharmony_ci irq_set_status_flags(DB1300_SD1_EJECT_INT, IRQ_NOAUTOEN); 8108c2ecf20Sopenharmony_ci irq_set_status_flags(DB1300_CF_INSERT_INT, IRQ_NOAUTOEN); 8118c2ecf20Sopenharmony_ci irq_set_status_flags(DB1300_CF_EJECT_INT, IRQ_NOAUTOEN); 8128c2ecf20Sopenharmony_ci 8138c2ecf20Sopenharmony_ci /* 8148c2ecf20Sopenharmony_ci * setup board 8158c2ecf20Sopenharmony_ci */ 8168c2ecf20Sopenharmony_ci prom_get_ethernet_addr(&db1300_eth_config.mac[0]); 8178c2ecf20Sopenharmony_ci 8188c2ecf20Sopenharmony_ci i2c_register_board_info(0, db1300_i2c_devs, 8198c2ecf20Sopenharmony_ci ARRAY_SIZE(db1300_i2c_devs)); 8208c2ecf20Sopenharmony_ci 8218c2ecf20Sopenharmony_ci if (platform_driver_register(&db1300_wm97xx_driver)) 8228c2ecf20Sopenharmony_ci pr_warn("DB1300: failed to init touch pen irq support!\n"); 8238c2ecf20Sopenharmony_ci 8248c2ecf20Sopenharmony_ci /* Audio PSC clock is supplied by codecs (PSC1, 2) */ 8258c2ecf20Sopenharmony_ci __raw_writel(PSC_SEL_CLK_SERCLK, 8268c2ecf20Sopenharmony_ci (void __iomem *)KSEG1ADDR(AU1300_PSC1_PHYS_ADDR) + PSC_SEL_OFFSET); 8278c2ecf20Sopenharmony_ci wmb(); 8288c2ecf20Sopenharmony_ci __raw_writel(PSC_SEL_CLK_SERCLK, 8298c2ecf20Sopenharmony_ci (void __iomem *)KSEG1ADDR(AU1300_PSC2_PHYS_ADDR) + PSC_SEL_OFFSET); 8308c2ecf20Sopenharmony_ci wmb(); 8318c2ecf20Sopenharmony_ci /* I2C driver wants 50MHz, get as close as possible */ 8328c2ecf20Sopenharmony_ci c = clk_get(NULL, "psc3_intclk"); 8338c2ecf20Sopenharmony_ci if (!IS_ERR(c)) { 8348c2ecf20Sopenharmony_ci clk_set_rate(c, 50000000); 8358c2ecf20Sopenharmony_ci clk_prepare_enable(c); 8368c2ecf20Sopenharmony_ci clk_put(c); 8378c2ecf20Sopenharmony_ci } 8388c2ecf20Sopenharmony_ci __raw_writel(PSC_SEL_CLK_INTCLK, 8398c2ecf20Sopenharmony_ci (void __iomem *)KSEG1ADDR(AU1300_PSC3_PHYS_ADDR) + PSC_SEL_OFFSET); 8408c2ecf20Sopenharmony_ci wmb(); 8418c2ecf20Sopenharmony_ci 8428c2ecf20Sopenharmony_ci /* enable power to USB ports */ 8438c2ecf20Sopenharmony_ci bcsr_mod(BCSR_RESETS, 0, BCSR_RESETS_USBHPWR | BCSR_RESETS_OTGPWR); 8448c2ecf20Sopenharmony_ci 8458c2ecf20Sopenharmony_ci /* although it is socket #0, it uses the CPLD bits which previous boards 8468c2ecf20Sopenharmony_ci * have used for socket #1. 8478c2ecf20Sopenharmony_ci */ 8488c2ecf20Sopenharmony_ci db1x_register_pcmcia_socket( 8498c2ecf20Sopenharmony_ci AU1000_PCMCIA_ATTR_PHYS_ADDR, 8508c2ecf20Sopenharmony_ci AU1000_PCMCIA_ATTR_PHYS_ADDR + 0x00400000 - 1, 8518c2ecf20Sopenharmony_ci AU1000_PCMCIA_MEM_PHYS_ADDR, 8528c2ecf20Sopenharmony_ci AU1000_PCMCIA_MEM_PHYS_ADDR + 0x00400000 - 1, 8538c2ecf20Sopenharmony_ci AU1000_PCMCIA_IO_PHYS_ADDR, 8548c2ecf20Sopenharmony_ci AU1000_PCMCIA_IO_PHYS_ADDR + 0x00010000 - 1, 8558c2ecf20Sopenharmony_ci DB1300_CF_INT, DB1300_CF_INSERT_INT, 0, DB1300_CF_EJECT_INT, 1); 8568c2ecf20Sopenharmony_ci 8578c2ecf20Sopenharmony_ci swapped = bcsr_read(BCSR_STATUS) & BCSR_STATUS_DB1200_SWAPBOOT; 8588c2ecf20Sopenharmony_ci db1x_register_norflash(64 << 20, 2, swapped); 8598c2ecf20Sopenharmony_ci 8608c2ecf20Sopenharmony_ci return platform_add_devices(db1300_dev, ARRAY_SIZE(db1300_dev)); 8618c2ecf20Sopenharmony_ci} 8628c2ecf20Sopenharmony_ci 8638c2ecf20Sopenharmony_ci 8648c2ecf20Sopenharmony_ciint __init db1300_board_setup(void) 8658c2ecf20Sopenharmony_ci{ 8668c2ecf20Sopenharmony_ci unsigned short whoami; 8678c2ecf20Sopenharmony_ci 8688c2ecf20Sopenharmony_ci bcsr_init(DB1300_BCSR_PHYS_ADDR, 8698c2ecf20Sopenharmony_ci DB1300_BCSR_PHYS_ADDR + DB1300_BCSR_HEXLED_OFS); 8708c2ecf20Sopenharmony_ci 8718c2ecf20Sopenharmony_ci whoami = bcsr_read(BCSR_WHOAMI); 8728c2ecf20Sopenharmony_ci if (BCSR_WHOAMI_BOARD(whoami) != BCSR_WHOAMI_DB1300) 8738c2ecf20Sopenharmony_ci return -ENODEV; 8748c2ecf20Sopenharmony_ci 8758c2ecf20Sopenharmony_ci db1300_gpio_config(); 8768c2ecf20Sopenharmony_ci 8778c2ecf20Sopenharmony_ci printk(KERN_INFO "NetLogic DBAu1300 Development Platform.\n\t" 8788c2ecf20Sopenharmony_ci "BoardID %d CPLD Rev %d DaughtercardID %d\n", 8798c2ecf20Sopenharmony_ci BCSR_WHOAMI_BOARD(whoami), BCSR_WHOAMI_CPLD(whoami), 8808c2ecf20Sopenharmony_ci BCSR_WHOAMI_DCID(whoami)); 8818c2ecf20Sopenharmony_ci 8828c2ecf20Sopenharmony_ci /* enable UARTs, YAMON only enables #2 */ 8838c2ecf20Sopenharmony_ci alchemy_uart_enable(AU1300_UART0_PHYS_ADDR); 8848c2ecf20Sopenharmony_ci alchemy_uart_enable(AU1300_UART1_PHYS_ADDR); 8858c2ecf20Sopenharmony_ci alchemy_uart_enable(AU1300_UART3_PHYS_ADDR); 8868c2ecf20Sopenharmony_ci 8878c2ecf20Sopenharmony_ci return 0; 8888c2ecf20Sopenharmony_ci} 889