From owner-svn-src-all@FreeBSD.ORG Sat May 26 09:05:46 2012 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 30E8A1065672; Sat, 26 May 2012 09:05:46 +0000 (UTC) (envelope-from marius@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 1B00B8FC0C; Sat, 26 May 2012 09:05:46 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q4Q95jgY064663; Sat, 26 May 2012 09:05:45 GMT (envelope-from marius@svn.freebsd.org) Received: (from marius@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q4Q95jBJ064653; Sat, 26 May 2012 09:05:45 GMT (envelope-from marius@svn.freebsd.org) Message-Id: <201205260905.q4Q95jBJ064653@svn.freebsd.org> From: Marius Strobl Date: Sat, 26 May 2012 09:05:45 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-9@freebsd.org X-SVN-Group: stable-9 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r236081 - stable/9/sys/arm/at91 X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 26 May 2012 09:05:46 -0000 Author: marius Date: Sat May 26 09:05:45 2012 New Revision: 236081 URL: http://svn.freebsd.org/changeset/base/236081 Log: MFC: r234291, r234292 Add support for the Atmel SAM9XE family of microcontrollers, which consist of a ARM926EJ-S processor core with up to 512 Kbytes of on-chip flash. Tested with SAM9XE512. Modified: stable/9/sys/arm/at91/at91_pit.c stable/9/sys/arm/at91/at91_pmc.c stable/9/sys/arm/at91/at91_rst.c stable/9/sys/arm/at91/at91_twireg.h stable/9/sys/arm/at91/at91_wdt.c stable/9/sys/arm/at91/at91reg.h stable/9/sys/arm/at91/at91sam9260.c stable/9/sys/arm/at91/at91var.h stable/9/sys/arm/at91/if_ate.c Directory Properties: stable/9/sys/ (props changed) stable/9/sys/amd64/include/xen/ (props changed) stable/9/sys/boot/ (props changed) stable/9/sys/boot/i386/efi/ (props changed) stable/9/sys/boot/ia64/efi/ (props changed) stable/9/sys/boot/ia64/ski/ (props changed) stable/9/sys/boot/powerpc/boot1.chrp/ (props changed) stable/9/sys/boot/powerpc/ofw/ (props changed) stable/9/sys/cddl/contrib/opensolaris/ (props changed) stable/9/sys/conf/ (props changed) stable/9/sys/contrib/dev/acpica/ (props changed) stable/9/sys/contrib/octeon-sdk/ (props changed) stable/9/sys/contrib/pf/ (props changed) stable/9/sys/contrib/x86emu/ (props changed) stable/9/sys/dev/ (props changed) stable/9/sys/dev/e1000/ (props changed) stable/9/sys/dev/ixgbe/ (props changed) stable/9/sys/fs/ (props changed) stable/9/sys/fs/ntfs/ (props changed) stable/9/sys/modules/ (props changed) Modified: stable/9/sys/arm/at91/at91_pit.c ============================================================================== --- stable/9/sys/arm/at91/at91_pit.c Sat May 26 09:03:14 2012 (r236080) +++ stable/9/sys/arm/at91/at91_pit.c Sat May 26 09:05:45 2012 (r236081) @@ -90,7 +90,7 @@ static int at91pit_probe(device_t dev) { - if (at91_is_sam9()) { + if (at91_is_sam9() || at91_is_sam9xe()) { device_set_desc(dev, "AT91SAM9 PIT"); return (0); } Modified: stable/9/sys/arm/at91/at91_pmc.c ============================================================================== --- stable/9/sys/arm/at91/at91_pmc.c Sat May 26 09:03:14 2012 (r236080) +++ stable/9/sys/arm/at91/at91_pmc.c Sat May 26 09:05:45 2012 (r236081) @@ -162,12 +162,14 @@ static const unsigned int at91_mainf_tbl static inline uint32_t RD4(struct at91_pmc_softc *sc, bus_size_t off) { + return (bus_read_4(sc->mem_res, off)); } static inline void WR4(struct at91_pmc_softc *sc, bus_size_t off, uint32_t val) { + bus_write_4(sc->mem_res, off, val); } @@ -225,7 +227,8 @@ at91_pmc_set_periph_mode(struct at91_pmc } struct at91_pmc_clock * -at91_pmc_clock_add(const char *name, uint32_t irq, struct at91_pmc_clock *parent) +at91_pmc_clock_add(const char *name, uint32_t irq, + struct at91_pmc_clock *parent) { struct at91_pmc_clock *clk; int i, buflen; @@ -299,11 +302,13 @@ at91_pmc_clock_ref(const char *name) void at91_pmc_clock_deref(struct at91_pmc_clock *clk) { + } void at91_pmc_clock_enable(struct at91_pmc_clock *clk) { + /* XXX LOCKING? XXX */ if (clk->parent) at91_pmc_clock_enable(clk->parent); @@ -314,6 +319,7 @@ at91_pmc_clock_enable(struct at91_pmc_cl void at91_pmc_clock_disable(struct at91_pmc_clock *clk) { + /* XXX LOCKING? XXX */ if (--clk->refcnt == 0 && clk->set_mode) clk->set_mode(clk, 0); @@ -342,7 +348,6 @@ at91_pmc_pll_rate(struct at91_pmc_clock freq = 0; clk->hz = freq; - return (freq); } @@ -402,7 +407,7 @@ at91_pmc_init_clock(struct at91_pmc_soft uint32_t mckr; uint32_t mdiv; - if (at91_is_sam9()) { + if (at91_is_sam9() || at91_is_sam9xe()) { uhpck.pmc_mask = PMC_SCER_UHP_SAM9; udpck.pmc_mask = PMC_SCER_UDP_SAM9; } @@ -446,7 +451,7 @@ at91_pmc_init_clock(struct at91_pmc_soft (1 << ((mckr & PMC_MCKR_PRES_MASK) >> 2)); mdiv = (mckr & PMC_MCKR_MDIV_MASK) >> 8; - if (at91_is_sam9()) { + if (at91_is_sam9() || at91_is_sam9xe()) { if (mdiv > 0) mck.hz /= mdiv * 2; } else @@ -486,7 +491,6 @@ at91_pmc_deactivate(device_t dev) bus_release_resource(dev, SYS_RES_IOPORT, rman_get_rid(sc->mem_res), sc->mem_res); sc->mem_res = 0; - return; } static int Modified: stable/9/sys/arm/at91/at91_rst.c ============================================================================== --- stable/9/sys/arm/at91/at91_rst.c Sat May 26 09:03:14 2012 (r236080) +++ stable/9/sys/arm/at91/at91_rst.c Sat May 26 09:05:45 2012 (r236081) @@ -71,7 +71,7 @@ static int at91_rst_probe(device_t dev) { - if (at91_is_sam9()) { + if (at91_is_sam9() || at91_is_sam9xe()) { device_set_desc(dev, "AT91SAM9 Reset Controller"); return (0); } Modified: stable/9/sys/arm/at91/at91_twireg.h ============================================================================== --- stable/9/sys/arm/at91/at91_twireg.h Sat May 26 09:03:14 2012 (r236080) +++ stable/9/sys/arm/at91/at91_twireg.h Sat May 26 09:05:45 2012 (r236081) @@ -64,7 +64,7 @@ #define TWI_CWGR_CHDIV(x) ((x) << 8) /* Clock High Divider */ #define TWI_CWGR_CLDIV(x) ((x) << 0) /* Clock Low Divider */ #define TWI_CWGR_DIV(rate) \ - (at91_is_sam9() ? \ + (at91_is_sam9() || at91_is_sam9xe() ? \ ((at91_master_clock / (4 * (rate))) - 3) : \ ((at91_master_clock / (4 * (rate))) - 2)) Modified: stable/9/sys/arm/at91/at91_wdt.c ============================================================================== --- stable/9/sys/arm/at91/at91_wdt.c Sat May 26 09:03:14 2012 (r236080) +++ stable/9/sys/arm/at91/at91_wdt.c Sat May 26 09:05:45 2012 (r236081) @@ -132,7 +132,7 @@ static int wdt_probe(device_t dev) { - if (at91_is_sam9()) { + if (at91_is_sam9() || at91_is_sam9xe()) { device_set_desc(dev, "WDT"); return (0); } Modified: stable/9/sys/arm/at91/at91reg.h ============================================================================== --- stable/9/sys/arm/at91/at91reg.h Sat May 26 09:03:14 2012 (r236080) +++ stable/9/sys/arm/at91/at91reg.h Sat May 26 09:05:45 2012 (r236081) @@ -61,6 +61,9 @@ #define AT91_CPU_SAM9G10 0x819903a0 #define AT91_CPU_SAM9G20 0x019905a0 #define AT91_CPU_SAM9G45 0x819b05a0 +#define AT91_CPU_SAM9XE128 0x329973a0 +#define AT91_CPU_SAM9XE256 0x329a93a0 +#define AT91_CPU_SAM9XE512 0x329aa3a0 #define AT91_ARCH(chipid) ((chipid >> 20) & 0xff) #define AT91_CPU(chipid) (chipid & ~AT91_CPU_VERSION_MASK) Modified: stable/9/sys/arm/at91/at91sam9260.c ============================================================================== --- stable/9/sys/arm/at91/at91sam9260.c Sat May 26 09:03:14 2012 (r236080) +++ stable/9/sys/arm/at91/at91sam9260.c Sat May 26 09:05:45 2012 (r236081) @@ -197,21 +197,40 @@ static void at91_identify(driver_t *drv, device_t parent) { - if (at91_cpu_is(AT91_CPU_SAM9260)) { + switch (AT91_CPU(at91_chip_id)) { + case AT91_CPU_SAM9260: + case AT91_CPU_SAM9XE128: + case AT91_CPU_SAM9XE256: + case AT91_CPU_SAM9XE512: at91_add_child(parent, 0, "at91sam9260", 0, 0, 0, -1, 0, 0); at91_cpu_add_builtin_children(parent); + break; } } static int at91_probe(device_t dev) { + const char *desc; - if (at91_cpu_is(AT91_CPU_SAM9260)) { - device_set_desc(dev, "AT91SAM9260"); - return (0); + switch (AT91_CPU(at91_chip_id)) { + case AT91_CPU_SAM9260: + desc = "AT91SAM9260"; + break; + case AT91_CPU_SAM9XE128: + desc = "AT91SAM9XE128"; + break; + case AT91_CPU_SAM9XE256: + desc = "AT91SAM9XE256"; + break; + case AT91_CPU_SAM9XE512: + desc = "AT91SAM9XE512"; + break; + default: + return (ENXIO); } - return (ENXIO); + device_set_desc(dev, desc); + return (0); } static int @@ -227,10 +246,6 @@ at91_attach(device_t dev) sc->sc_sh = at91sc->sc_sh; sc->dev = dev; - /* - * XXX These values work for the RM9200, SAM926[01], and SAM9260 - * will have to fix this when we want to support anything else. XXX - */ if (bus_space_subregion(sc->sc_st, sc->sc_sh, AT91SAM9260_SYS_BASE, AT91SAM9260_SYS_SIZE, &sc->sc_sys_sh) != 0) panic("Enable to map system registers"); Modified: stable/9/sys/arm/at91/at91var.h ============================================================================== --- stable/9/sys/arm/at91/at91var.h Sat May 26 09:03:14 2012 (r236080) +++ stable/9/sys/arm/at91/at91var.h Sat May 26 09:05:45 2012 (r236081) @@ -63,6 +63,7 @@ extern uint32_t at91_chip_id; static inline int at91_is_rm92(void); static inline int at91_is_sam9(void); +static inline int at91_is_sam9xe(void); static inline int at91_cpu_is(u_int cpu); static inline int @@ -80,6 +81,13 @@ at91_is_sam9(void) } static inline int +at91_is_sam9xe(void) +{ + + return (AT91_ARCH(at91_chip_id) == AT91_ARCH_SAM9XE); +} + +static inline int at91_cpu_is(u_int cpu) { Modified: stable/9/sys/arm/at91/if_ate.c ============================================================================== --- stable/9/sys/arm/at91/if_ate.c Sat May 26 09:03:14 2012 (r236080) +++ stable/9/sys/arm/at91/if_ate.c Sat May 26 09:05:45 2012 (r236081) @@ -266,7 +266,7 @@ ate_attach(device_t dev) } /* New or old version, chooses buffer size. */ - sc->is_emacb = at91_is_sam9(); + sc->is_emacb = at91_is_sam9() || at91_is_sam9xe(); sc->rx_buf_size = RX_BUF_SIZE(sc); err = ate_activate(dev);