1 // SPDX-License-Identifier: GPL-2.0-or-later 2 /* 3 * Allegro A8293 SEC driver 4 * 5 * Copyright (C) 2011 Antti Palosaari <crope@iki.fi> 6 */ 7 8 #include "a8293.h" 9 10 struct a8293_dev { 11 struct i2c_client *client; 12 u8 reg[2]; 13 }; 14 15 static int a8293_set_voltage(struct dvb_frontend *fe, 16 enum fe_sec_voltage fe_sec_voltage) 17 { 18 struct a8293_dev *dev = fe->sec_priv; 19 struct i2c_client *client = dev->client; 20 int ret; 21 u8 reg0, reg1; 22 23 dev_dbg(&client->dev, "fe_sec_voltage=%d\n", fe_sec_voltage); 24 25 switch (fe_sec_voltage) { 26 case SEC_VOLTAGE_OFF: 27 /* ENB=0 */ 28 reg0 = 0x10; 29 break; 30 case SEC_VOLTAGE_13: 31 /* VSEL0=1, VSEL1=0, VSEL2=0, VSEL3=0, ENB=1*/ 32 reg0 = 0x31; 33 break; 34 case SEC_VOLTAGE_18: 35 /* VSEL0=0, VSEL1=0, VSEL2=0, VSEL3=1, ENB=1*/ 36 reg0 = 0x38; 37 break; 38 default: 39 ret = -EINVAL; 40 goto err; 41 } 42 if (reg0 != dev->reg[0]) { 43 ret = i2c_master_send(client, ®0, 1); 44 if (ret < 0) 45 goto err; 46 dev->reg[0] = reg0; 47 } 48 49 /* TMODE=0, TGATE=1 */ 50 reg1 = 0x82; 51 if (reg1 != dev->reg[1]) { 52 ret = i2c_master_send(client, ®1, 1); 53 if (ret < 0) 54 goto err; 55 dev->reg[1] = reg1; 56 } 57 58 usleep_range(1500, 50000); 59 return 0; 60 err: 61 dev_dbg(&client->dev, "failed=%d\n", ret); 62 return ret; 63 } 64 65 static int a8293_probe(struct i2c_client *client) 66 { 67 struct a8293_dev *dev; 68 struct a8293_platform_data *pdata = client->dev.platform_data; 69 struct dvb_frontend *fe = pdata->dvb_frontend; 70 int ret; 71 u8 buf[2]; 72 73 dev = kzalloc(sizeof(*dev), GFP_KERNEL); 74 if (!dev) { 75 ret = -ENOMEM; 76 goto err; 77 } 78 79 dev->client = client; 80 81 /* check if the SEC is there */ 82 ret = i2c_master_recv(client, buf, 2); 83 if (ret < 0) 84 goto err_kfree; 85 86 /* override frontend ops */ 87 fe->ops.set_voltage = a8293_set_voltage; 88 fe->sec_priv = dev; 89 i2c_set_clientdata(client, dev); 90 91 dev_info(&client->dev, "Allegro A8293 SEC successfully attached\n"); 92 return 0; 93 err_kfree: 94 kfree(dev); 95 err: 96 dev_dbg(&client->dev, "failed=%d\n", ret); 97 return ret; 98 } 99 100 static void a8293_remove(struct i2c_client *client) 101 { 102 struct a8293_dev *dev = i2c_get_clientdata(client); 103 104 dev_dbg(&client->dev, "\n"); 105 106 kfree(dev); 107 } 108 109 static const struct i2c_device_id a8293_id_table[] = { 110 {"a8293", 0}, 111 {} 112 }; 113 MODULE_DEVICE_TABLE(i2c, a8293_id_table); 114 115 static struct i2c_driver a8293_driver = { 116 .driver = { 117 .name = "a8293", 118 .suppress_bind_attrs = true, 119 }, 120 .probe_new = a8293_probe, 121 .remove = a8293_remove, 122 .id_table = a8293_id_table, 123 }; 124 125 module_i2c_driver(a8293_driver); 126 127 MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>"); 128 MODULE_DESCRIPTION("Allegro A8293 SEC driver"); 129 MODULE_LICENSE("GPL"); 130