11.3Shkenken/* $NetBSD: imx51_spi.c,v 1.3 2019/09/27 02:59:21 hkenken Exp $ */ 21.1Shkenken 31.1Shkenken/*- 41.1Shkenken * Copyright (c) 2014 Genetec Corporation. All rights reserved. 51.1Shkenken * Written by Hashimoto Kenichi for Genetec Corporation. 61.1Shkenken * 71.1Shkenken * Redistribution and use in source and binary forms, with or without 81.1Shkenken * modification, are permitted provided that the following conditions 91.1Shkenken * are met: 101.1Shkenken * 1. Redistributions of source code must retain the above copyright 111.1Shkenken * notice, this list of conditions and the following disclaimer. 121.1Shkenken * 2. Redistributions in binary form must reproduce the above copyright 131.1Shkenken * notice, this list of conditions and the following disclaimer in the 141.1Shkenken * documentation and/or other materials provided with the distribution. 151.1Shkenken * 161.1Shkenken * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 171.1Shkenken * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 181.1Shkenken * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 191.1Shkenken * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 201.1Shkenken * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 211.1Shkenken * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 221.1Shkenken * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 231.1Shkenken * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 241.1Shkenken * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 251.1Shkenken * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 261.1Shkenken * SUCH DAMAGE. 271.1Shkenken */ 281.1Shkenken 291.1Shkenken#include <sys/cdefs.h> 301.3Shkenken__KERNEL_RCSID(0, "$NetBSD: imx51_spi.c,v 1.3 2019/09/27 02:59:21 hkenken Exp $"); 311.1Shkenken 321.1Shkenken#include "locators.h" 331.1Shkenken#include "opt_imx.h" 341.1Shkenken#include "opt_imxspi.h" 351.1Shkenken 361.1Shkenken#include <sys/param.h> 371.1Shkenken#include <sys/bus.h> 381.1Shkenken#include <sys/device.h> 391.1Shkenken 401.1Shkenken#include <arm/imx/imxspivar.h> 411.1Shkenken#include <arm/imx/imx51reg.h> 421.1Shkenken#include <arm/imx/imx51var.h> 431.1Shkenken#include <arm/imx/imx51_ccmvar.h> 441.1Shkenken 451.1Shkenkenstruct imx51spi_softc { 461.2Shkenken struct imxspi_softc sc_spi; /* Must be first */ 471.2Shkenken 481.1Shkenken struct spi_chipset_tag sc_tag; 491.1Shkenken}; 501.1Shkenken 511.1ShkenkenCFATTACH_DECL_NEW(imx51_spi, sizeof(struct imx51spi_softc), 521.1Shkenken imxspi_match, imxspi_attach, NULL, NULL); 531.1Shkenken 541.1Shkenkenstatic int 551.1Shkenkenimxspi_cs_enable(void *arg, int slave) 561.1Shkenken{ 571.1Shkenken return 0; 581.1Shkenken} 591.1Shkenken 601.1Shkenkenstatic int 611.1Shkenkenimxspi_cs_disable(void *arg, int slave) 621.1Shkenken{ 631.1Shkenken return 0; 641.1Shkenken} 651.1Shkenken 661.1Shkenkenint 671.1Shkenkenimxspi_match(device_t parent, cfdata_t cf, void *aux) 681.1Shkenken{ 691.1Shkenken if (strcmp(cf->cf_name, "imxspi") == 0) 701.1Shkenken return 1; 711.1Shkenken 721.1Shkenken return 0; 731.1Shkenken} 741.1Shkenken 751.1Shkenkenvoid 761.1Shkenkenimxspi_attach(device_t parent, device_t self, void *aux) 771.1Shkenken{ 781.2Shkenken struct imx51spi_softc *isc = device_private(self); 791.2Shkenken struct imxspi_softc *sc = &isc->sc_spi; 801.1Shkenken struct axi_attach_args *aa = aux; 811.1Shkenken struct imxspi_attach_args saa; 821.1Shkenken int cf_flags = device_cfdata(self)->cf_flags; 831.2Shkenken bus_addr_t addr; 841.2Shkenken bus_size_t size; 851.2Shkenken int error; 861.2Shkenken 871.2Shkenken addr = aa->aa_addr; 881.2Shkenken size = aa->aa_size; 891.2Shkenken if (size <= 0) 901.2Shkenken size = SPI_SIZE; 911.1Shkenken 921.1Shkenken sc->sc_tag.cookie = sc; 931.1Shkenken sc->sc_tag.spi_cs_enable = imxspi_cs_enable; 941.1Shkenken sc->sc_tag.spi_cs_disable = imxspi_cs_disable; 951.1Shkenken 961.2Shkenken sc->sc_iot = aa->aa_iot; 971.2Shkenken sc->sc_enhanced = cf_flags; 981.3Shkenken if (sc->sc_enhanced) 991.3Shkenken sc->sc_type = IMX51_ECSPI; 1001.3Shkenken else 1011.3Shkenken sc->sc_type = IMX35_CSPI; 1021.1Shkenken 1031.2Shkenken sc->sc_nslaves = IMXSPINSLAVES; 1041.2Shkenken sc->sc_freq = imx51_get_clock(IMX51CLK_CSPI_CLK_ROOT); 1051.2Shkenken sc->sc_tag = &sc->sc_tag; 1061.2Shkenken 1071.2Shkenken if (bus_space_map(sc->sc_iot, addr, size, 0, &sc->sc_ioh)) { 1081.2Shkenken aprint_error_dev(sc->sc_dev, "couldn't map registers\n"); 1091.2Shkenken return; 1101.2Shkenken } 1111.2Shkenken 1121.2Shkenken /* enable device interrupts */ 1131.2Shkenken sc->sc_ih = intr_establish(aa->aa_irq, IPL_BIO, IST_LEVEL, 1141.2Shkenken imxspi_intr, sc); 1151.1Shkenken 1161.2Shkenken imxspi_attach_common(self); 1171.1Shkenken} 118