Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

rtc: sd3078: drop needless struct sd3078

The memory pointed to by the ::rtc member is managed via devres, and
no code in this driver uses it past _probe().

We can drop it from the structure and just use a local temporary
variable, reducing runtime memory consumption by a few bytes.

Since this now means that the structure has just one member only left,
there is no need anymore to allocate data for it and pass that around
via the various callbacks, just to extract that one member.

Instead, we can just pass that one member and avoid the extra memory
allocation for the containing struct, reducing runtime memory
consumption.

Signed-off-by: André Draszik <andre.draszik@linaro.org>
Link: https://lore.kernel.org/r/20250304-rtc-cleanups-v2-14-d4689a71668c@linaro.org
Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>

authored by

André Draszik and committed by
Alexandre Belloni
6158c6b8 d94bc2bb

+28 -43
+28 -43
drivers/rtc/rtc-sd3078.c
··· 36 36 */ 37 37 #define WRITE_PROTECT_EN 0 38 38 39 - struct sd3078 { 40 - struct rtc_device *rtc; 41 - struct regmap *regmap; 42 - }; 43 - 44 39 /* 45 40 * In order to prevent arbitrary modification of the time register, 46 41 * when modification of the register, ··· 44 49 * 2. set WRITE2 bit 45 50 * 3. set WRITE3 bit 46 51 */ 47 - static void sd3078_enable_reg_write(struct sd3078 *sd3078) 52 + static void sd3078_enable_reg_write(struct regmap *regmap) 48 53 { 49 - regmap_update_bits(sd3078->regmap, SD3078_REG_CTRL2, 50 - KEY_WRITE1, KEY_WRITE1); 51 - regmap_update_bits(sd3078->regmap, SD3078_REG_CTRL1, 52 - KEY_WRITE2, KEY_WRITE2); 53 - regmap_update_bits(sd3078->regmap, SD3078_REG_CTRL1, 54 - KEY_WRITE3, KEY_WRITE3); 54 + regmap_update_bits(regmap, SD3078_REG_CTRL2, KEY_WRITE1, KEY_WRITE1); 55 + regmap_update_bits(regmap, SD3078_REG_CTRL1, KEY_WRITE2, KEY_WRITE2); 56 + regmap_update_bits(regmap, SD3078_REG_CTRL1, KEY_WRITE3, KEY_WRITE3); 55 57 } 56 58 57 59 #if WRITE_PROTECT_EN ··· 61 69 * 2. clear WRITE3 bit 62 70 * 3. clear WRITE1 bit 63 71 */ 64 - static void sd3078_disable_reg_write(struct sd3078 *sd3078) 72 + static void sd3078_disable_reg_write(struct regmap *regmap) 65 73 { 66 - regmap_update_bits(sd3078->regmap, SD3078_REG_CTRL1, 67 - KEY_WRITE2, 0); 68 - regmap_update_bits(sd3078->regmap, SD3078_REG_CTRL1, 69 - KEY_WRITE3, 0); 70 - regmap_update_bits(sd3078->regmap, SD3078_REG_CTRL2, 71 - KEY_WRITE1, 0); 74 + regmap_update_bits(regmap, SD3078_REG_CTRL1, KEY_WRITE2, 0); 75 + regmap_update_bits(regmap, SD3078_REG_CTRL1, KEY_WRITE3, 0); 76 + regmap_update_bits(regmap, SD3078_REG_CTRL2, KEY_WRITE1, 0); 72 77 } 73 78 #endif 74 79 ··· 74 85 unsigned char hour; 75 86 unsigned char rtc_data[NUM_TIME_REGS] = {0}; 76 87 struct i2c_client *client = to_i2c_client(dev); 77 - struct sd3078 *sd3078 = i2c_get_clientdata(client); 88 + struct regmap *regmap = i2c_get_clientdata(client); 78 89 int ret; 79 90 80 - ret = regmap_bulk_read(sd3078->regmap, SD3078_REG_SC, rtc_data, 81 - NUM_TIME_REGS); 91 + ret = regmap_bulk_read(regmap, SD3078_REG_SC, rtc_data, NUM_TIME_REGS); 82 92 if (ret < 0) { 83 93 dev_err(dev, "reading from RTC failed with err:%d\n", ret); 84 94 return ret; ··· 111 123 { 112 124 unsigned char rtc_data[NUM_TIME_REGS]; 113 125 struct i2c_client *client = to_i2c_client(dev); 114 - struct sd3078 *sd3078 = i2c_get_clientdata(client); 126 + struct regmap *regmap = i2c_get_clientdata(client); 115 127 int ret; 116 128 117 129 rtc_data[SD3078_REG_SC] = bin2bcd(tm->tm_sec); ··· 123 135 rtc_data[SD3078_REG_YR] = bin2bcd(tm->tm_year - 100); 124 136 125 137 #if WRITE_PROTECT_EN 126 - sd3078_enable_reg_write(sd3078); 138 + sd3078_enable_reg_write(regmap); 127 139 #endif 128 140 129 - ret = regmap_bulk_write(sd3078->regmap, SD3078_REG_SC, rtc_data, 141 + ret = regmap_bulk_write(regmap, SD3078_REG_SC, rtc_data, 130 142 NUM_TIME_REGS); 131 143 if (ret < 0) { 132 144 dev_err(dev, "writing to RTC failed with err:%d\n", ret); ··· 134 146 } 135 147 136 148 #if WRITE_PROTECT_EN 137 - sd3078_disable_reg_write(sd3078); 149 + sd3078_disable_reg_write(regmap); 138 150 #endif 139 151 140 152 return 0; ··· 154 166 static int sd3078_probe(struct i2c_client *client) 155 167 { 156 168 int ret; 157 - struct sd3078 *sd3078; 169 + struct regmap *regmap; 170 + struct rtc_device *rtc; 158 171 159 172 if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) 160 173 return -ENODEV; 161 174 162 - sd3078 = devm_kzalloc(&client->dev, sizeof(*sd3078), GFP_KERNEL); 163 - if (!sd3078) 164 - return -ENOMEM; 165 - 166 - sd3078->regmap = devm_regmap_init_i2c(client, &regmap_config); 167 - if (IS_ERR(sd3078->regmap)) { 175 + regmap = devm_regmap_init_i2c(client, &regmap_config); 176 + if (IS_ERR(regmap)) { 168 177 dev_err(&client->dev, "regmap allocation failed\n"); 169 - return PTR_ERR(sd3078->regmap); 178 + return PTR_ERR(regmap); 170 179 } 171 180 172 - i2c_set_clientdata(client, sd3078); 181 + i2c_set_clientdata(client, regmap); 173 182 174 - sd3078->rtc = devm_rtc_allocate_device(&client->dev); 175 - if (IS_ERR(sd3078->rtc)) 176 - return PTR_ERR(sd3078->rtc); 183 + rtc = devm_rtc_allocate_device(&client->dev); 184 + if (IS_ERR(rtc)) 185 + return PTR_ERR(rtc); 177 186 178 - sd3078->rtc->ops = &sd3078_rtc_ops; 179 - sd3078->rtc->range_min = RTC_TIMESTAMP_BEGIN_2000; 180 - sd3078->rtc->range_max = RTC_TIMESTAMP_END_2099; 187 + rtc->ops = &sd3078_rtc_ops; 188 + rtc->range_min = RTC_TIMESTAMP_BEGIN_2000; 189 + rtc->range_max = RTC_TIMESTAMP_END_2099; 181 190 182 - ret = devm_rtc_register_device(sd3078->rtc); 191 + ret = devm_rtc_register_device(rtc); 183 192 if (ret) 184 193 return ret; 185 194 186 - sd3078_enable_reg_write(sd3078); 195 + sd3078_enable_reg_write(regmap); 187 196 188 197 return 0; 189 198 }