162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (C) 2015-2017 Pengutronix, Uwe Kleine-König <kernel@pengutronix.de> 462306a36Sopenharmony_ci */ 562306a36Sopenharmony_ci#include <linux/kernel.h> 662306a36Sopenharmony_ci#include <linux/kthread.h> 762306a36Sopenharmony_ci#include <linux/siox.h> 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#define to_siox_master(_dev) container_of((_dev), struct siox_master, dev) 1062306a36Sopenharmony_cistruct siox_master { 1162306a36Sopenharmony_ci /* these fields should be initialized by the driver */ 1262306a36Sopenharmony_ci int busno; 1362306a36Sopenharmony_ci int (*pushpull)(struct siox_master *smaster, 1462306a36Sopenharmony_ci size_t setbuf_len, const u8 setbuf[], 1562306a36Sopenharmony_ci size_t getbuf_len, u8 getbuf[]); 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci /* might be initialized by the driver, if 0 it is set to HZ / 40 */ 1862306a36Sopenharmony_ci unsigned long poll_interval; /* in jiffies */ 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci /* framework private stuff */ 2162306a36Sopenharmony_ci struct mutex lock; 2262306a36Sopenharmony_ci bool active; 2362306a36Sopenharmony_ci struct module *owner; 2462306a36Sopenharmony_ci struct device dev; 2562306a36Sopenharmony_ci unsigned int num_devices; 2662306a36Sopenharmony_ci struct list_head devices; 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci size_t setbuf_len, getbuf_len; 2962306a36Sopenharmony_ci size_t buf_len; 3062306a36Sopenharmony_ci u8 *buf; 3162306a36Sopenharmony_ci u8 status; 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_ci unsigned long last_poll; 3462306a36Sopenharmony_ci struct task_struct *poll_thread; 3562306a36Sopenharmony_ci}; 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_cistatic inline void *siox_master_get_devdata(struct siox_master *smaster) 3862306a36Sopenharmony_ci{ 3962306a36Sopenharmony_ci return dev_get_drvdata(&smaster->dev); 4062306a36Sopenharmony_ci} 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_cistruct siox_master *siox_master_alloc(struct device *dev, size_t size); 4362306a36Sopenharmony_cistatic inline void siox_master_put(struct siox_master *smaster) 4462306a36Sopenharmony_ci{ 4562306a36Sopenharmony_ci put_device(&smaster->dev); 4662306a36Sopenharmony_ci} 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_ciint siox_master_register(struct siox_master *smaster); 4962306a36Sopenharmony_civoid siox_master_unregister(struct siox_master *smaster); 50