dm: Add support for RAM drivers

Add support for a driver which sets up DRAM and can return information about
the amount of RAM available. This is a first step towards moving RAM init
to driver model.

Signed-off-by: Simon Glass <sjg@chromium.org>
master
Simon Glass 10 years ago
parent 10f5f5a90e
commit 6c51df6859
  1. 2
      drivers/Kconfig
  2. 1
      drivers/Makefile
  3. 18
      drivers/ram/Kconfig
  4. 7
      drivers/ram/Makefile
  5. 28
      drivers/ram/ram-uclass.c
  6. 1
      include/dm/uclass-id.h
  7. 38
      include/ram.h
  8. 1
      scripts/Makefile.spl

@ -34,6 +34,8 @@ source "drivers/gpio/Kconfig"
source "drivers/power/Kconfig"
source "drivers/ram/Kconfig"
source "drivers/hwmon/Kconfig"
source "drivers/watchdog/Kconfig"

@ -11,6 +11,7 @@ obj-$(CONFIG_LED) += led/
obj-y += misc/
obj-y += pcmcia/
obj-y += dfu/
obj-$(CONFIG_RAM) += ram/
obj-y += rtc/
obj-y += sound/
obj-y += tpm/

@ -0,0 +1,18 @@
config RAM
bool "Enable RAM drivers using Driver Model"
depends on DM
help
This allows drivers to be provided for SDRAM and other RAM
controllers and their type to be specified in the board's device
tree. Generally some parameters are required to set up the RAM and
the RAM size can either be statically defined or dynamically
detected.
config SPL_RAM_SUPPORT
bool "Enable RAM support in SPL"
depends on RAM
help
The RAM subsystem adds a small amount of overhead to the image.
If this is acceptable and you have a need to use RAM drivers in
SPL, enable this option. It might provide a cleaner interface to
setting up RAM (e.g. SDRAM / DDR) within SPL.

@ -0,0 +1,7 @@
#
# Copyright (c) 2015 Google, Inc
# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
#
# SPDX-License-Identifier: GPL-2.0+
#
obj-$(CONFIG_RAM) += ram-uclass.o

@ -0,0 +1,28 @@
/*
* Copyright (C) 2015 Google, Inc
* Written by Simon Glass <sjg@chromium.org>
*
* SPDX-License-Identifier: GPL-2.0+
*/
#include <common.h>
#include <ram.h>
#include <dm.h>
#include <errno.h>
#include <dm/lists.h>
#include <dm/root.h>
int ram_get_info(struct udevice *dev, struct ram_info *info)
{
struct ram_ops *ops = ram_get_ops(dev);
if (!ops->get_info)
return -ENOSYS;
return ops->get_info(dev, info);
}
UCLASS_DRIVER(ram) = {
.id = UCLASS_RAM,
.name = "ram",
};

@ -28,6 +28,7 @@ enum uclass_id {
UCLASS_CPU, /* CPU, typically part of an SoC */
UCLASS_CROS_EC, /* Chrome OS EC */
UCLASS_DISPLAY_PORT, /* Display port video */
UCLASS_RAM, /* RAM controller */
UCLASS_ETH, /* Ethernet device */
UCLASS_GPIO, /* Bank of general-purpose I/O pins */
UCLASS_I2C, /* I2C bus */

@ -0,0 +1,38 @@
/*
* Copyright (c) 2015 Google, Inc
* Written by Simon Glass <sjg@chromium.org>
*
* SPDX-License-Identifier: GPL-2.0+
*/
#ifndef __RAM_H
#define __RAM_H
struct ram_info {
phys_addr_t base;
size_t size;
};
struct ram_ops {
/**
* get_info() - Get basic memory info
*
* @dev: Device to check (UCLASS_RAM)
* @info: Place to put info
* @return 0 if OK, -ve on error
*/
int (*get_info)(struct udevice *dev, struct ram_info *info);
};
#define ram_get_ops(dev) ((struct ram_ops *)(dev)->driver->ops)
/**
* ram_get_info() - Get information about a RAM device
*
* @dev: Device to check (UCLASS_RAM)
* @info: Returns RAM info
* @return 0 if OK, -ve on error
*/
int ram_get_info(struct udevice *dev, struct ram_info *info);
#endif

@ -78,6 +78,7 @@ libs-$(CONFIG_SPL_NET_SUPPORT) += net/
libs-$(CONFIG_SPL_ETH_SUPPORT) += drivers/net/
libs-$(CONFIG_SPL_ETH_SUPPORT) += drivers/net/phy/
libs-$(CONFIG_SPL_USBETH_SUPPORT) += drivers/net/phy/
libs-$(CONFIG_SPL_RAM_SUPPORT) += drivers/ram/
libs-$(CONFIG_SPL_MUSB_NEW_SUPPORT) += drivers/usb/musb-new/
libs-$(CONFIG_SPL_USBETH_SUPPORT) += drivers/usb/gadget/
libs-$(CONFIG_SPL_WATCHDOG_SUPPORT) += drivers/watchdog/

Loading…
Cancel
Save