/* * Platform device support for Au1x00 SoCs. * * Copyright 2004, Matt Porter <mporter@kernel.crashing.org> * * (C) Copyright Embedded Alley Solutions, Inc 2005 * Author: Pantelis Antoniou <pantelis@embeddedalley.com> * * This file is licensed under the terms of the GNU General Public * License version 2. This program is licensed "as is" without any * warranty of any kind, whether express or implied.
*/
staticvoid __init alchemy_setup_uarts(int ctype)
{ long uartclk; int s = sizeof(struct plat_serial8250_port); int c = alchemy_get_uarts(ctype); struct plat_serial8250_port *ports; struct clk *clk = clk_get(NULL, ALCHEMY_PERIPH_CLK);
if (IS_ERR(clk)) return; if (clk_prepare_enable(clk)) {
clk_put(clk); return;
}
uartclk = clk_get_rate(clk);
clk_put(clk);
ports = kcalloc(s, (c + 1), GFP_KERNEL); if (!ports) {
printk(KERN_INFO "Alchemy: no memory for UART data\n"); return;
}
memcpy(ports, au1x00_uart_data[ctype], s * c);
au1xx0_uart_device.dev.platform_data = ports;
/* Fill up uartclk. */ for (s = 0; s < c; s++) {
ports[s].uartclk = uartclk; if (au_platform_setup(&ports[s]) < 0) {
kfree(ports);
printk(KERN_INFO "Alchemy: missing support for UARTs\n"); return;
}
} if (platform_device_register(&au1xx0_uart_device))
printk(KERN_INFO "Alchemy: failed to register UARTs\n");
}
/* Power on callback for the ehci platform driver */ staticint alchemy_ehci_power_on(struct platform_device *pdev)
{ return alchemy_usb_control(ALCHEMY_USB_EHCI0, 1);
}
/* Power off/suspend callback for the ehci platform driver */ staticvoid alchemy_ehci_power_off(struct platform_device *pdev)
{
alchemy_usb_control(ALCHEMY_USB_EHCI0, 0);
}
/* Handle 1st MAC */ if (alchemy_get_macs(ctype) < 1) return;
macres = kmemdup_array(au1xxx_eth0_resources[ctype], MAC_RES_COUNT, sizeof(*macres), GFP_KERNEL); if (!macres) {
printk(KERN_INFO "Alchemy: no memory for MAC0 resources\n"); return;
}
au1xxx_eth0_device.resource = macres;
i = prom_get_ethernet_addr(ethaddr); if (!i && !is_valid_ether_addr(au1xxx_eth0_platform_data.mac))
memcpy(au1xxx_eth0_platform_data.mac, ethaddr, 6);
ret = platform_device_register(&au1xxx_eth0_device); if (ret)
printk(KERN_INFO "Alchemy: failed to register MAC0\n");
/* Handle 2nd MAC */ if (alchemy_get_macs(ctype) < 2) return;
macres = kmemdup_array(au1xxx_eth1_resources[ctype], MAC_RES_COUNT, sizeof(*macres), GFP_KERNEL); if (!macres) {
printk(KERN_INFO "Alchemy: no memory for MAC1 resources\n"); return;
}
au1xxx_eth1_device.resource = macres;
ethaddr[5] += 1; /* next addr for 2nd MAC */ if (!i && !is_valid_ether_addr(au1xxx_eth1_platform_data.mac))
memcpy(au1xxx_eth1_platform_data.mac, ethaddr, 6);
/* Register second MAC if enabled in pinfunc */ if (!(alchemy_rdsys(AU1000_SYS_PINFUNC) & SYS_PF_NI2)) {
ret = platform_device_register(&au1xxx_eth1_device); if (ret)
printk(KERN_INFO "Alchemy: failed to register MAC1\n");
}
}
staticint __init au1xxx_platform_init(void)
{ int ctype = alchemy_get_cputype();
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.