1aa4f886fSSudeep Holla // SPDX-License-Identifier: GPL-2.0 2aa4f886fSSudeep Holla /* 3aa4f886fSSudeep Holla * SCMI Message Protocol driver header 4aa4f886fSSudeep Holla * 5aa4f886fSSudeep Holla * Copyright (C) 2018 ARM Ltd. 6aa4f886fSSudeep Holla */ 7*933c5044SSudeep Holla #include <linux/device.h> 8aa4f886fSSudeep Holla #include <linux/types.h> 9aa4f886fSSudeep Holla 10b6f20ff8SSudeep Holla #define SCMI_MAX_STR_SIZE 16 11b6f20ff8SSudeep Holla 12b6f20ff8SSudeep Holla /** 13b6f20ff8SSudeep Holla * struct scmi_revision_info - version information structure 14b6f20ff8SSudeep Holla * 15b6f20ff8SSudeep Holla * @major_ver: Major ABI version. Change here implies risk of backward 16b6f20ff8SSudeep Holla * compatibility break. 17b6f20ff8SSudeep Holla * @minor_ver: Minor ABI version. Change here implies new feature addition, 18b6f20ff8SSudeep Holla * or compatible change in ABI. 19b6f20ff8SSudeep Holla * @num_protocols: Number of protocols that are implemented, excluding the 20b6f20ff8SSudeep Holla * base protocol. 21b6f20ff8SSudeep Holla * @num_agents: Number of agents in the system. 22b6f20ff8SSudeep Holla * @impl_ver: A vendor-specific implementation version. 23b6f20ff8SSudeep Holla * @vendor_id: A vendor identifier(Null terminated ASCII string) 24b6f20ff8SSudeep Holla * @sub_vendor_id: A sub-vendor identifier(Null terminated ASCII string) 25b6f20ff8SSudeep Holla */ 26b6f20ff8SSudeep Holla struct scmi_revision_info { 27b6f20ff8SSudeep Holla u16 major_ver; 28b6f20ff8SSudeep Holla u16 minor_ver; 29b6f20ff8SSudeep Holla u8 num_protocols; 30b6f20ff8SSudeep Holla u8 num_agents; 31b6f20ff8SSudeep Holla u32 impl_ver; 32b6f20ff8SSudeep Holla char vendor_id[SCMI_MAX_STR_SIZE]; 33b6f20ff8SSudeep Holla char sub_vendor_id[SCMI_MAX_STR_SIZE]; 34b6f20ff8SSudeep Holla }; 35b6f20ff8SSudeep Holla 36aa4f886fSSudeep Holla /** 37aa4f886fSSudeep Holla * struct scmi_handle - Handle returned to ARM SCMI clients for usage. 38aa4f886fSSudeep Holla * 39aa4f886fSSudeep Holla * @dev: pointer to the SCMI device 40b6f20ff8SSudeep Holla * @version: pointer to the structure containing SCMI version information 41aa4f886fSSudeep Holla */ 42aa4f886fSSudeep Holla struct scmi_handle { 43aa4f886fSSudeep Holla struct device *dev; 44b6f20ff8SSudeep Holla struct scmi_revision_info *version; 45b6f20ff8SSudeep Holla }; 46b6f20ff8SSudeep Holla 47b6f20ff8SSudeep Holla enum scmi_std_protocol { 48b6f20ff8SSudeep Holla SCMI_PROTOCOL_BASE = 0x10, 49b6f20ff8SSudeep Holla SCMI_PROTOCOL_POWER = 0x11, 50b6f20ff8SSudeep Holla SCMI_PROTOCOL_SYSTEM = 0x12, 51b6f20ff8SSudeep Holla SCMI_PROTOCOL_PERF = 0x13, 52b6f20ff8SSudeep Holla SCMI_PROTOCOL_CLOCK = 0x14, 53b6f20ff8SSudeep Holla SCMI_PROTOCOL_SENSOR = 0x15, 54aa4f886fSSudeep Holla }; 55*933c5044SSudeep Holla 56*933c5044SSudeep Holla struct scmi_device { 57*933c5044SSudeep Holla u32 id; 58*933c5044SSudeep Holla u8 protocol_id; 59*933c5044SSudeep Holla struct device dev; 60*933c5044SSudeep Holla struct scmi_handle *handle; 61*933c5044SSudeep Holla }; 62*933c5044SSudeep Holla 63*933c5044SSudeep Holla #define to_scmi_dev(d) container_of(d, struct scmi_device, dev) 64*933c5044SSudeep Holla 65*933c5044SSudeep Holla struct scmi_device * 66*933c5044SSudeep Holla scmi_device_create(struct device_node *np, struct device *parent, int protocol); 67*933c5044SSudeep Holla void scmi_device_destroy(struct scmi_device *scmi_dev); 68*933c5044SSudeep Holla 69*933c5044SSudeep Holla struct scmi_device_id { 70*933c5044SSudeep Holla u8 protocol_id; 71*933c5044SSudeep Holla }; 72*933c5044SSudeep Holla 73*933c5044SSudeep Holla struct scmi_driver { 74*933c5044SSudeep Holla const char *name; 75*933c5044SSudeep Holla int (*probe)(struct scmi_device *sdev); 76*933c5044SSudeep Holla void (*remove)(struct scmi_device *sdev); 77*933c5044SSudeep Holla const struct scmi_device_id *id_table; 78*933c5044SSudeep Holla 79*933c5044SSudeep Holla struct device_driver driver; 80*933c5044SSudeep Holla }; 81*933c5044SSudeep Holla 82*933c5044SSudeep Holla #define to_scmi_driver(d) container_of(d, struct scmi_driver, driver) 83*933c5044SSudeep Holla 84*933c5044SSudeep Holla #ifdef CONFIG_ARM_SCMI_PROTOCOL 85*933c5044SSudeep Holla int scmi_driver_register(struct scmi_driver *driver, 86*933c5044SSudeep Holla struct module *owner, const char *mod_name); 87*933c5044SSudeep Holla void scmi_driver_unregister(struct scmi_driver *driver); 88*933c5044SSudeep Holla #else 89*933c5044SSudeep Holla static inline int 90*933c5044SSudeep Holla scmi_driver_register(struct scmi_driver *driver, struct module *owner, 91*933c5044SSudeep Holla const char *mod_name) 92*933c5044SSudeep Holla { 93*933c5044SSudeep Holla return -EINVAL; 94*933c5044SSudeep Holla } 95*933c5044SSudeep Holla 96*933c5044SSudeep Holla static inline void scmi_driver_unregister(struct scmi_driver *driver) {} 97*933c5044SSudeep Holla #endif /* CONFIG_ARM_SCMI_PROTOCOL */ 98*933c5044SSudeep Holla 99*933c5044SSudeep Holla #define scmi_register(driver) \ 100*933c5044SSudeep Holla scmi_driver_register(driver, THIS_MODULE, KBUILD_MODNAME) 101*933c5044SSudeep Holla #define scmi_unregister(driver) \ 102*933c5044SSudeep Holla scmi_driver_unregister(driver) 103*933c5044SSudeep Holla 104*933c5044SSudeep Holla /** 105*933c5044SSudeep Holla * module_scmi_driver() - Helper macro for registering a scmi driver 106*933c5044SSudeep Holla * @__scmi_driver: scmi_driver structure 107*933c5044SSudeep Holla * 108*933c5044SSudeep Holla * Helper macro for scmi drivers to set up proper module init / exit 109*933c5044SSudeep Holla * functions. Replaces module_init() and module_exit() and keeps people from 110*933c5044SSudeep Holla * printing pointless things to the kernel log when their driver is loaded. 111*933c5044SSudeep Holla */ 112*933c5044SSudeep Holla #define module_scmi_driver(__scmi_driver) \ 113*933c5044SSudeep Holla module_driver(__scmi_driver, scmi_register, scmi_unregister) 114*933c5044SSudeep Holla 115*933c5044SSudeep Holla typedef int (*scmi_prot_init_fn_t)(struct scmi_handle *); 116*933c5044SSudeep Holla int scmi_protocol_register(int protocol_id, scmi_prot_init_fn_t fn); 117*933c5044SSudeep Holla void scmi_protocol_unregister(int protocol_id); 118