mirror of
				https://github.com/smaeul/u-boot.git
				synced 2025-11-04 14:00:19 +00:00 
			
		
		
		
	With of-platdata, the devicetree is supposed to specify all the devices in the system. So far this hasn't really mattered since of-platdata still works correctly. However, new of-platdata features rely on numbering the devices in a particular order so that they can be referenced by a single integer. It is tricky to implement this efficiently when other devices are present in the build. To address this, disable use of U_BOOT_DEVICE() when of-platdata is enabled. This seems acceptable as it is not supposed to be used at all, except in SPL/TPL, where of-platdata is the recommended approach. This breaks one non-compliant boards at present: mx6cuboxi Signed-off-by: Simon Glass <sjg@chromium.org> (disable CONFIG_IMX_THERMAL for mx6cuboxi to avoid a build error)
		
			
				
	
	
		
			102 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			102 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* SPDX-License-Identifier: GPL-2.0+ */
 | 
						|
/*
 | 
						|
 * Copyright (c) 2013 Google, Inc
 | 
						|
 *
 | 
						|
 * (C) Copyright 2012
 | 
						|
 * Pavel Herrmann <morpheus.ibis@gmail.com>
 | 
						|
 * Marek Vasut <marex@denx.de>
 | 
						|
 */
 | 
						|
 | 
						|
#ifndef _DM_PLATDATA_H
 | 
						|
#define _DM_PLATDATA_H
 | 
						|
 | 
						|
#include <linker_lists.h>
 | 
						|
 | 
						|
/**
 | 
						|
 * struct driver_info - Information required to instantiate a device
 | 
						|
 *
 | 
						|
 * NOTE: Avoid using this except in extreme circumstances, where device tree
 | 
						|
 * is not feasible (e.g. serial driver in SPL where <8KB of SRAM is
 | 
						|
 * available). U-Boot's driver model uses device tree for configuration.
 | 
						|
 *
 | 
						|
 * @name:	Driver name
 | 
						|
 * @platdata:	Driver-specific platform data
 | 
						|
 * @platdata_size: Size of platform data structure
 | 
						|
 * @parent_idx:	Index of the parent driver_info structure
 | 
						|
 */
 | 
						|
struct driver_info {
 | 
						|
	const char *name;
 | 
						|
	const void *platdata;
 | 
						|
#if CONFIG_IS_ENABLED(OF_PLATDATA)
 | 
						|
	unsigned short platdata_size;
 | 
						|
	short parent_idx;
 | 
						|
#endif
 | 
						|
};
 | 
						|
 | 
						|
#if CONFIG_IS_ENABLED(OF_PLATDATA)
 | 
						|
#define driver_info_parent_id(driver_info)	driver_info->parent_idx
 | 
						|
#else
 | 
						|
#define driver_info_parent_id(driver_info)	(-1)
 | 
						|
#endif
 | 
						|
 | 
						|
/**
 | 
						|
 * driver_rt - runtime information set up by U-Boot
 | 
						|
 *
 | 
						|
 * There is one of these for every driver_info in the linker list, indexed by
 | 
						|
 * the driver_info idx value.
 | 
						|
 *
 | 
						|
 * @dev: Device created from this idx
 | 
						|
 */
 | 
						|
struct driver_rt {
 | 
						|
	struct udevice *dev;
 | 
						|
};
 | 
						|
 | 
						|
/**
 | 
						|
 * NOTE: Avoid using these except in extreme circumstances, where device tree
 | 
						|
 * is not feasible (e.g. serial driver in SPL where <8KB of SRAM is
 | 
						|
 * available). U-Boot's driver model uses device tree for configuration.
 | 
						|
 *
 | 
						|
 * When of-platdata is in use, U_BOOT_DEVICE() cannot be used outside of the
 | 
						|
 * dt-platdata.c file created by dtoc
 | 
						|
 */
 | 
						|
#if CONFIG_IS_ENABLED(OF_PLATDATA) && !defined(DT_PLATDATA_C)
 | 
						|
#define U_BOOT_DEVICE(__name)	_Static_assert(false, \
 | 
						|
	"Cannot use U_BOOT_DEVICE with of-platdata. Please use devicetree instead")
 | 
						|
#else
 | 
						|
#define U_BOOT_DEVICE(__name)						\
 | 
						|
	ll_entry_declare(struct driver_info, __name, driver_info)
 | 
						|
#endif
 | 
						|
 | 
						|
/* Declare a list of devices. The argument is a driver_info[] array */
 | 
						|
#define U_BOOT_DEVICES(__name)						\
 | 
						|
	ll_entry_declare_list(struct driver_info, __name, driver_info)
 | 
						|
 | 
						|
/**
 | 
						|
 * Get a pointer to a given device info given its name
 | 
						|
 *
 | 
						|
 * With the declaration U_BOOT_DEVICE(name), DM_GET_DEVICE(name) will return a
 | 
						|
 * pointer to the struct driver_info created by that declaration.
 | 
						|
 *
 | 
						|
 * if OF_PLATDATA is enabled, from this it is possible to use the @dev member of
 | 
						|
 * struct driver_info to find the device pointer itself.
 | 
						|
 *
 | 
						|
 * TODO(sjg@chromium.org): U_BOOT_DEVICE() tells U-Boot to create a device, so
 | 
						|
 * the naming seems sensible, but DM_GET_DEVICE() is a bit of misnomer, since it
 | 
						|
 * finds the driver_info record, not the device.
 | 
						|
 *
 | 
						|
 * @__name: Driver name (C identifier, not a string. E.g. gpio7_at_ff7e0000)
 | 
						|
 * @return struct driver_info * to the driver that created the device
 | 
						|
 */
 | 
						|
#define DM_GET_DEVICE(__name)						\
 | 
						|
	ll_entry_get(struct driver_info, __name, driver_info)
 | 
						|
 | 
						|
/**
 | 
						|
 * dm_populate_phandle_data() - Populates phandle data in platda
 | 
						|
 *
 | 
						|
 * This populates phandle data with an U_BOOT_DEVICE entry get by
 | 
						|
 * DM_GET_DEVICE. The implementation of this function will be done
 | 
						|
 * by dtoc when parsing dtb.
 | 
						|
 */
 | 
						|
void dm_populate_phandle_data(void);
 | 
						|
#endif
 |