162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci/* Analogue & Micro Adder MPC875 board support 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * Author: Scott Wood <scottwood@freescale.com> 562306a36Sopenharmony_ci * 662306a36Sopenharmony_ci * Copyright (c) 2007 Freescale Semiconductor, Inc. 762306a36Sopenharmony_ci */ 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include <linux/init.h> 1062306a36Sopenharmony_ci#include <linux/of_platform.h> 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci#include <asm/time.h> 1362306a36Sopenharmony_ci#include <asm/machdep.h> 1462306a36Sopenharmony_ci#include <asm/cpm1.h> 1562306a36Sopenharmony_ci#include <asm/8xx_immap.h> 1662306a36Sopenharmony_ci#include <asm/udbg.h> 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci#include "mpc8xx.h" 1962306a36Sopenharmony_ci#include "pic.h" 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_cistruct cpm_pin { 2262306a36Sopenharmony_ci int port, pin, flags; 2362306a36Sopenharmony_ci}; 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_cistatic __initdata struct cpm_pin adder875_pins[] = { 2662306a36Sopenharmony_ci /* SMC1 */ 2762306a36Sopenharmony_ci {CPM_PORTB, 24, CPM_PIN_INPUT}, /* RX */ 2862306a36Sopenharmony_ci {CPM_PORTB, 25, CPM_PIN_INPUT | CPM_PIN_SECONDARY}, /* TX */ 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ci /* MII1 */ 3162306a36Sopenharmony_ci {CPM_PORTA, 0, CPM_PIN_INPUT}, 3262306a36Sopenharmony_ci {CPM_PORTA, 1, CPM_PIN_INPUT}, 3362306a36Sopenharmony_ci {CPM_PORTA, 2, CPM_PIN_INPUT}, 3462306a36Sopenharmony_ci {CPM_PORTA, 3, CPM_PIN_INPUT}, 3562306a36Sopenharmony_ci {CPM_PORTA, 4, CPM_PIN_OUTPUT}, 3662306a36Sopenharmony_ci {CPM_PORTA, 10, CPM_PIN_OUTPUT}, 3762306a36Sopenharmony_ci {CPM_PORTA, 11, CPM_PIN_OUTPUT}, 3862306a36Sopenharmony_ci {CPM_PORTB, 19, CPM_PIN_INPUT}, 3962306a36Sopenharmony_ci {CPM_PORTB, 31, CPM_PIN_INPUT}, 4062306a36Sopenharmony_ci {CPM_PORTC, 12, CPM_PIN_INPUT}, 4162306a36Sopenharmony_ci {CPM_PORTC, 13, CPM_PIN_INPUT}, 4262306a36Sopenharmony_ci {CPM_PORTE, 30, CPM_PIN_OUTPUT}, 4362306a36Sopenharmony_ci {CPM_PORTE, 31, CPM_PIN_OUTPUT}, 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ci /* MII2 */ 4662306a36Sopenharmony_ci {CPM_PORTE, 14, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY}, 4762306a36Sopenharmony_ci {CPM_PORTE, 15, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY}, 4862306a36Sopenharmony_ci {CPM_PORTE, 16, CPM_PIN_OUTPUT}, 4962306a36Sopenharmony_ci {CPM_PORTE, 17, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY}, 5062306a36Sopenharmony_ci {CPM_PORTE, 18, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY}, 5162306a36Sopenharmony_ci {CPM_PORTE, 19, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY}, 5262306a36Sopenharmony_ci {CPM_PORTE, 20, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY}, 5362306a36Sopenharmony_ci {CPM_PORTE, 21, CPM_PIN_OUTPUT}, 5462306a36Sopenharmony_ci {CPM_PORTE, 22, CPM_PIN_OUTPUT}, 5562306a36Sopenharmony_ci {CPM_PORTE, 23, CPM_PIN_OUTPUT}, 5662306a36Sopenharmony_ci {CPM_PORTE, 24, CPM_PIN_OUTPUT}, 5762306a36Sopenharmony_ci {CPM_PORTE, 25, CPM_PIN_OUTPUT}, 5862306a36Sopenharmony_ci {CPM_PORTE, 26, CPM_PIN_OUTPUT}, 5962306a36Sopenharmony_ci {CPM_PORTE, 27, CPM_PIN_OUTPUT}, 6062306a36Sopenharmony_ci {CPM_PORTE, 28, CPM_PIN_OUTPUT}, 6162306a36Sopenharmony_ci {CPM_PORTE, 29, CPM_PIN_OUTPUT}, 6262306a36Sopenharmony_ci}; 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_cistatic void __init init_ioports(void) 6562306a36Sopenharmony_ci{ 6662306a36Sopenharmony_ci int i; 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(adder875_pins); i++) { 6962306a36Sopenharmony_ci const struct cpm_pin *pin = &adder875_pins[i]; 7062306a36Sopenharmony_ci cpm1_set_pin(pin->port, pin->pin, pin->flags); 7162306a36Sopenharmony_ci } 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_ci cpm1_clk_setup(CPM_CLK_SMC1, CPM_BRG1, CPM_CLK_RTX); 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_ci /* Set FEC1 and FEC2 to MII mode */ 7662306a36Sopenharmony_ci clrbits32(&mpc8xx_immr->im_cpm.cp_cptr, 0x00000180); 7762306a36Sopenharmony_ci} 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_cistatic void __init adder875_setup(void) 8062306a36Sopenharmony_ci{ 8162306a36Sopenharmony_ci cpm_reset(); 8262306a36Sopenharmony_ci init_ioports(); 8362306a36Sopenharmony_ci} 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_cistatic const struct of_device_id of_bus_ids[] __initconst = { 8662306a36Sopenharmony_ci { .compatible = "simple-bus", }, 8762306a36Sopenharmony_ci {}, 8862306a36Sopenharmony_ci}; 8962306a36Sopenharmony_ci 9062306a36Sopenharmony_cistatic int __init declare_of_platform_devices(void) 9162306a36Sopenharmony_ci{ 9262306a36Sopenharmony_ci of_platform_bus_probe(NULL, of_bus_ids, NULL); 9362306a36Sopenharmony_ci return 0; 9462306a36Sopenharmony_ci} 9562306a36Sopenharmony_cimachine_device_initcall(adder875, declare_of_platform_devices); 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_cidefine_machine(adder875) { 9862306a36Sopenharmony_ci .name = "Adder MPC875", 9962306a36Sopenharmony_ci .compatible = "analogue-and-micro,adder875", 10062306a36Sopenharmony_ci .setup_arch = adder875_setup, 10162306a36Sopenharmony_ci .init_IRQ = mpc8xx_pic_init, 10262306a36Sopenharmony_ci .get_irq = mpc8xx_get_irq, 10362306a36Sopenharmony_ci .restart = mpc8xx_restart, 10462306a36Sopenharmony_ci .progress = udbg_progress, 10562306a36Sopenharmony_ci}; 106