linux/arch/arm/mach-pxa/colibri-pxa3xx.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 *  arch/arm/mach-pxa/colibri-pxa3xx.c
   4 *
   5 *  Common functions for all Toradex PXA3xx modules
   6 *
   7 *  Daniel Mack <daniel@caiaq.de>
   8 */
   9
  10#include <linux/init.h>
  11#include <linux/kernel.h>
  12#include <linux/platform_device.h>
  13#include <linux/gpio.h>
  14#include <linux/etherdevice.h>
  15#include <asm/mach-types.h>
  16#include <mach/hardware.h>
  17#include <linux/sizes.h>
  18#include <asm/system_info.h>
  19#include <asm/mach/arch.h>
  20#include <asm/mach/irq.h>
  21#include <mach/pxa3xx-regs.h>
  22#include "mfp-pxa300.h"
  23#include "colibri.h"
  24#include <linux/platform_data/mmc-pxamci.h>
  25#include <linux/platform_data/video-pxafb.h>
  26#include <linux/platform_data/mtd-nand-pxa3xx.h>
  27
  28#include "generic.h"
  29#include "devices.h"
  30
  31#if defined(CONFIG_AX88796)
  32#define ETHER_ADDR_LEN 6
  33static u8 ether_mac_addr[ETHER_ADDR_LEN];
  34
  35void __init colibri_pxa3xx_init_eth(struct ax_plat_data *plat_data)
  36{
  37        int i;
  38        u64 serial = ((u64) system_serial_high << 32) | system_serial_low;
  39
  40        /*
  41         * If the bootloader passed in a serial boot tag, which contains a
  42         * valid ethernet MAC, pass it to the interface. Toradex ships the
  43         * modules with their own bootloader which provides a valid MAC
  44         * this way.
  45         */
  46
  47        for (i = 0; i < ETHER_ADDR_LEN; i++) {
  48                ether_mac_addr[i] = serial & 0xff;
  49                serial >>= 8;
  50        }
  51
  52        if (is_valid_ether_addr(ether_mac_addr)) {
  53                plat_data->flags |= AXFLG_MAC_FROMPLATFORM;
  54                plat_data->mac_addr = ether_mac_addr;
  55                printk(KERN_INFO "%s(): taking MAC from serial boot tag\n",
  56                        __func__);
  57        } else {
  58                plat_data->flags |= AXFLG_MAC_FROMDEV;
  59                printk(KERN_INFO "%s(): no valid serial boot tag found, "
  60                        "taking MAC from device\n", __func__);
  61        }
  62}
  63#endif
  64
  65#if defined(CONFIG_FB_PXA) || defined(CONFIG_FB_PXA_MODULE)
  66static int lcd_bl_pin;
  67
  68/*
  69 * LCD panel (Sharp LQ043T3DX02)
  70 */
  71static void colibri_lcd_backlight(int on)
  72{
  73        gpio_set_value(lcd_bl_pin, !!on);
  74}
  75
  76static struct pxafb_mode_info sharp_lq43_mode = {
  77        .pixclock       = 101936,
  78        .xres           = 480,
  79        .yres           = 272,
  80        .bpp            = 32,
  81        .depth          = 18,
  82        .hsync_len      = 41,
  83        .left_margin    = 2,
  84        .right_margin   = 2,
  85        .vsync_len      = 10,
  86        .upper_margin   = 2,
  87        .lower_margin   = 2,
  88        .sync           = 0,
  89        .cmap_greyscale = 0,
  90};
  91
  92static struct pxafb_mach_info sharp_lq43_info = {
  93        .modes          = &sharp_lq43_mode,
  94        .num_modes      = 1,
  95        .cmap_inverse   = 0,
  96        .cmap_static    = 0,
  97        .lcd_conn       = LCD_COLOR_TFT_18BPP,
  98        .pxafb_backlight_power = colibri_lcd_backlight,
  99};
 100
 101void __init colibri_pxa3xx_init_lcd(int bl_pin)
 102{
 103        lcd_bl_pin = bl_pin;
 104        gpio_request(bl_pin, "lcd backlight");
 105        gpio_direction_output(bl_pin, 0);
 106        pxa_set_fb_info(NULL, &sharp_lq43_info);
 107}
 108#endif
 109
 110#if IS_ENABLED(CONFIG_MTD_NAND_MARVELL)
 111static struct mtd_partition colibri_nand_partitions[] = {
 112        {
 113                .name        = "bootloader",
 114                .offset      = 0,
 115                .size        = SZ_512K,
 116                .mask_flags  = MTD_WRITEABLE, /* force read-only */
 117        },
 118        {
 119                .name        = "kernel",
 120                .offset      = MTDPART_OFS_APPEND,
 121                .size        = SZ_4M,
 122                .mask_flags  = MTD_WRITEABLE, /* force read-only */
 123        },
 124        {
 125                .name        = "reserved",
 126                .offset      = MTDPART_OFS_APPEND,
 127                .size        = SZ_1M,
 128                .mask_flags  = MTD_WRITEABLE, /* force read-only */
 129        },
 130        {
 131                .name        = "fs",
 132                .offset      = MTDPART_OFS_APPEND,
 133                .size        = MTDPART_SIZ_FULL,
 134        },
 135};
 136
 137static struct pxa3xx_nand_platform_data colibri_nand_info = {
 138        .keep_config    = 1,
 139        .parts          = colibri_nand_partitions,
 140        .nr_parts       = ARRAY_SIZE(colibri_nand_partitions),
 141};
 142
 143void __init colibri_pxa3xx_init_nand(void)
 144{
 145        pxa3xx_set_nand_info(&colibri_nand_info);
 146}
 147#endif
 148
 149