162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (C) 2009 Wolfram Sang, Pengutronix 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Check max730x.c for further details. 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#include <linux/module.h> 962306a36Sopenharmony_ci#include <linux/init.h> 1062306a36Sopenharmony_ci#include <linux/platform_device.h> 1162306a36Sopenharmony_ci#include <linux/mutex.h> 1262306a36Sopenharmony_ci#include <linux/i2c.h> 1362306a36Sopenharmony_ci#include <linux/spi/max7301.h> 1462306a36Sopenharmony_ci#include <linux/slab.h> 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_cistatic int max7300_i2c_write(struct device *dev, unsigned int reg, 1762306a36Sopenharmony_ci unsigned int val) 1862306a36Sopenharmony_ci{ 1962306a36Sopenharmony_ci struct i2c_client *client = to_i2c_client(dev); 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ci return i2c_smbus_write_byte_data(client, reg, val); 2262306a36Sopenharmony_ci} 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_cistatic int max7300_i2c_read(struct device *dev, unsigned int reg) 2562306a36Sopenharmony_ci{ 2662306a36Sopenharmony_ci struct i2c_client *client = to_i2c_client(dev); 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci return i2c_smbus_read_byte_data(client, reg); 2962306a36Sopenharmony_ci} 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_cistatic int max7300_probe(struct i2c_client *client) 3262306a36Sopenharmony_ci{ 3362306a36Sopenharmony_ci struct max7301 *ts; 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci if (!i2c_check_functionality(client->adapter, 3662306a36Sopenharmony_ci I2C_FUNC_SMBUS_BYTE_DATA)) 3762306a36Sopenharmony_ci return -EIO; 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci ts = devm_kzalloc(&client->dev, sizeof(struct max7301), GFP_KERNEL); 4062306a36Sopenharmony_ci if (!ts) 4162306a36Sopenharmony_ci return -ENOMEM; 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ci ts->read = max7300_i2c_read; 4462306a36Sopenharmony_ci ts->write = max7300_i2c_write; 4562306a36Sopenharmony_ci ts->dev = &client->dev; 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_ci return __max730x_probe(ts); 4862306a36Sopenharmony_ci} 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_cistatic void max7300_remove(struct i2c_client *client) 5162306a36Sopenharmony_ci{ 5262306a36Sopenharmony_ci __max730x_remove(&client->dev); 5362306a36Sopenharmony_ci} 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_cistatic const struct i2c_device_id max7300_id[] = { 5662306a36Sopenharmony_ci { "max7300", 0 }, 5762306a36Sopenharmony_ci { } 5862306a36Sopenharmony_ci}; 5962306a36Sopenharmony_ciMODULE_DEVICE_TABLE(i2c, max7300_id); 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_cistatic struct i2c_driver max7300_driver = { 6262306a36Sopenharmony_ci .driver = { 6362306a36Sopenharmony_ci .name = "max7300", 6462306a36Sopenharmony_ci }, 6562306a36Sopenharmony_ci .probe = max7300_probe, 6662306a36Sopenharmony_ci .remove = max7300_remove, 6762306a36Sopenharmony_ci .id_table = max7300_id, 6862306a36Sopenharmony_ci}; 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_cistatic int __init max7300_init(void) 7162306a36Sopenharmony_ci{ 7262306a36Sopenharmony_ci return i2c_add_driver(&max7300_driver); 7362306a36Sopenharmony_ci} 7462306a36Sopenharmony_cisubsys_initcall(max7300_init); 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_cistatic void __exit max7300_exit(void) 7762306a36Sopenharmony_ci{ 7862306a36Sopenharmony_ci i2c_del_driver(&max7300_driver); 7962306a36Sopenharmony_ci} 8062306a36Sopenharmony_cimodule_exit(max7300_exit); 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_ciMODULE_AUTHOR("Wolfram Sang"); 8362306a36Sopenharmony_ciMODULE_LICENSE("GPL v2"); 8462306a36Sopenharmony_ciMODULE_DESCRIPTION("MAX7300 GPIO-Expander"); 85