Path: blob/master/arch/mips/alchemy/devboards/pb1200/platform.c
10820 views
/*1* Pb1200/DBAu1200 board platform device registration2*3* Copyright (C) 2008 MontaVista Software Inc. <[email protected]>4*5* This program is free software; you can redistribute it and/or modify6* it under the terms of the GNU General Public License as published by7* the Free Software Foundation; either version 2 of the License, or8* (at your option) any later version.9*10* This program is distributed in the hope that it will be useful,11* but WITHOUT ANY WARRANTY; without even the implied warranty of12* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the13* GNU General Public License for more details.14*15* You should have received a copy of the GNU General Public License16* along with this program; if not, write to the Free Software17* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA18*/1920#include <linux/dma-mapping.h>21#include <linux/init.h>22#include <linux/leds.h>23#include <linux/platform_device.h>24#include <linux/smc91x.h>2526#include <asm/mach-au1x00/au1xxx.h>27#include <asm/mach-au1x00/au1100_mmc.h>28#include <asm/mach-db1x00/bcsr.h>2930#include "../platform.h"3132static int mmc_activity;3334static void pb1200mmc0_set_power(void *mmc_host, int state)35{36if (state)37bcsr_mod(BCSR_BOARD, 0, BCSR_BOARD_SD0PWR);38else39bcsr_mod(BCSR_BOARD, BCSR_BOARD_SD0PWR, 0);4041msleep(1);42}4344static int pb1200mmc0_card_readonly(void *mmc_host)45{46return (bcsr_read(BCSR_STATUS) & BCSR_STATUS_SD0WP) ? 1 : 0;47}4849static int pb1200mmc0_card_inserted(void *mmc_host)50{51return (bcsr_read(BCSR_SIGSTAT) & BCSR_INT_SD0INSERT) ? 1 : 0;52}5354static void pb1200_mmcled_set(struct led_classdev *led,55enum led_brightness brightness)56{57if (brightness != LED_OFF) {58if (++mmc_activity == 1)59bcsr_mod(BCSR_LEDS, BCSR_LEDS_LED0, 0);60} else {61if (--mmc_activity == 0)62bcsr_mod(BCSR_LEDS, 0, BCSR_LEDS_LED0);63}64}6566static struct led_classdev pb1200mmc_led = {67.brightness_set = pb1200_mmcled_set,68};6970static void pb1200mmc1_set_power(void *mmc_host, int state)71{72if (state)73bcsr_mod(BCSR_BOARD, 0, BCSR_BOARD_SD1PWR);74else75bcsr_mod(BCSR_BOARD, BCSR_BOARD_SD1PWR, 0);7677msleep(1);78}7980static int pb1200mmc1_card_readonly(void *mmc_host)81{82return (bcsr_read(BCSR_STATUS) & BCSR_STATUS_SD1WP) ? 1 : 0;83}8485static int pb1200mmc1_card_inserted(void *mmc_host)86{87return (bcsr_read(BCSR_SIGSTAT) & BCSR_INT_SD1INSERT) ? 1 : 0;88}8990const struct au1xmmc_platform_data au1xmmc_platdata[2] = {91[0] = {92.set_power = pb1200mmc0_set_power,93.card_inserted = pb1200mmc0_card_inserted,94.card_readonly = pb1200mmc0_card_readonly,95.cd_setup = NULL, /* use poll-timer in driver */96.led = &pb1200mmc_led,97},98[1] = {99.set_power = pb1200mmc1_set_power,100.card_inserted = pb1200mmc1_card_inserted,101.card_readonly = pb1200mmc1_card_readonly,102.cd_setup = NULL, /* use poll-timer in driver */103.led = &pb1200mmc_led,104},105};106107static struct resource ide_resources[] = {108[0] = {109.start = IDE_PHYS_ADDR,110.end = IDE_PHYS_ADDR + IDE_PHYS_LEN - 1,111.flags = IORESOURCE_MEM112},113[1] = {114.start = IDE_INT,115.end = IDE_INT,116.flags = IORESOURCE_IRQ117}118};119120static u64 ide_dmamask = DMA_BIT_MASK(32);121122static struct platform_device ide_device = {123.name = "au1200-ide",124.id = 0,125.dev = {126.dma_mask = &ide_dmamask,127.coherent_dma_mask = DMA_BIT_MASK(32),128},129.num_resources = ARRAY_SIZE(ide_resources),130.resource = ide_resources131};132133static struct smc91x_platdata smc_data = {134.flags = SMC91X_NOWAIT | SMC91X_USE_16BIT,135.leda = RPC_LED_100_10,136.ledb = RPC_LED_TX_RX,137};138139static struct resource smc91c111_resources[] = {140[0] = {141.name = "smc91x-regs",142.start = SMC91C111_PHYS_ADDR,143.end = SMC91C111_PHYS_ADDR + 0xf,144.flags = IORESOURCE_MEM145},146[1] = {147.start = SMC91C111_INT,148.end = SMC91C111_INT,149.flags = IORESOURCE_IRQ150},151};152153static struct platform_device smc91c111_device = {154.dev = {155.platform_data = &smc_data,156},157.name = "smc91x",158.id = -1,159.num_resources = ARRAY_SIZE(smc91c111_resources),160.resource = smc91c111_resources161};162163static struct platform_device *board_platform_devices[] __initdata = {164&ide_device,165&smc91c111_device166};167168static int __init board_register_devices(void)169{170int swapped;171172db1x_register_pcmcia_socket(PCMCIA_ATTR_PHYS_ADDR,173PCMCIA_ATTR_PHYS_ADDR + 0x000400000 - 1,174PCMCIA_MEM_PHYS_ADDR,175PCMCIA_MEM_PHYS_ADDR + 0x000400000 - 1,176PCMCIA_IO_PHYS_ADDR,177PCMCIA_IO_PHYS_ADDR + 0x000010000 - 1,178PB1200_PC0_INT,179PB1200_PC0_INSERT_INT,180/*PB1200_PC0_STSCHG_INT*/0,181PB1200_PC0_EJECT_INT,1820);183184db1x_register_pcmcia_socket(PCMCIA_ATTR_PHYS_ADDR + 0x008000000,185PCMCIA_ATTR_PHYS_ADDR + 0x008400000 - 1,186PCMCIA_MEM_PHYS_ADDR + 0x008000000,187PCMCIA_MEM_PHYS_ADDR + 0x008400000 - 1,188PCMCIA_IO_PHYS_ADDR + 0x008000000,189PCMCIA_IO_PHYS_ADDR + 0x008010000 - 1,190PB1200_PC1_INT,191PB1200_PC1_INSERT_INT,192/*PB1200_PC1_STSCHG_INT*/0,193PB1200_PC1_EJECT_INT,1941);195196swapped = bcsr_read(BCSR_STATUS) & BCSR_STATUS_DB1200_SWAPBOOT;197db1x_register_norflash(128 * 1024 * 1024, 2, swapped);198199return platform_add_devices(board_platform_devices,200ARRAY_SIZE(board_platform_devices));201}202device_initcall(board_register_devices);203204205